Опять Get-WsusUpdates.ps1

Я когда то уже постил этот скрипт, но после переездов и прочих катастроф ссылка на файл побилась🙂 Да и скрипт за это время немного изменился. Вкратце напомню:

Скрипт делает запрос в базу WSUS (работает как на 2.0 так и на 3.0), определяет пути под которыми хранятся обновления в папке WsusContent, и проверяет скачаны ли они уже с помощью Test-Path (к сожалению я не знаю как это определить в базе😦 ) Кроме всего прочего, скрипт показывает текущее действие и общий прогресс с помощью Write-Progress

wsus_q

Если не указывать параметр сервер, то будет использоватся локальный компьютер, если не указывать путь к кешу обновлений, то скрипт запросит его из базы SQL. Так как я использую его со своего клиентского компьютера я просто указываю сетевой путь через административную шару. Последний параметр — фильтр использующийся в запросе SQL для того чтобы выбрать файлы только с нужными именами. Можно было бы использовать и Where-Object, но лучше проводить выборку на стороне сервера. Да и SQL в любом случае пошустрее повершелла будет.

Итак, скрипт:

Get-WsusUpdates.ps1
param ([string]$ServerName="LocalHost", [string]$CacheLocation="", [string]$SqlFilter="%.exe") $Total=0; $Cached=0; $SQLConnection = new-object System.Data.SqlClient.SqlConnection("Initial Catalog=SUSDB;Data Source=$ServerName;Integrated Security=SSPI") Write-Progress -Activity "Retrieving WSUS updates:" -Status "Connecting to $ServerName\SUSDB" $SQLConnection.Open() if ($CacheLocation -eq "") { Write-Progress -Activity "Retrieving WSUS updates:" -Status "Retrieving WSUS content cache path" $SQLCommand = New-Object System.Data.SqlClient.SqlCommand("SELECT LocalContentCacheLocation FROM tbConfigurationB", $SQLConnection) $CacheLocation = $SQLCommand.ExecuteScalar() } if (!(Test-Path $CacheLocation)) { write-error "Directory $CacheLocation does not exists." break; } if (!$CacheLocation.endswith("\")){$CacheLocation+="\"} $SQLCommand = New-Object System.Data.SqlClient.SqlCommand("SELECT FileDigest,FileName,Modified FROM tbFile WHERE FileName LIKE '$SqlFilter' ORDER BY Modified", $SQLConnection) Write-Progress -Activity "Retrieving WSUS updates:" -Status "Querying database" $SQLReader = $SQLCommand.ExecuteReader() Write-Progress -Activity "Retrieving WSUS updates:" -Status "Processing updates" while($SQLReader.Read()) { $Total++ [byte[]]$bytes=@(1..20) [void]$SQLReader.GetBytes(0,0,$bytes,0,20) $path = ("$CacheLocation{0:X2}" -f $bytes[19])+"\"+([string]::Join("",($bytes|%{"{0:X2}" -f $_})))+".*" #write-host $path -f green if (get-childitem $path -erroraction 0) { $Cached++ $item = new-object PSObject $item | add-Member -MemberType noteProperty -Name "Name" -Value $SQLReader.GetString(1) $item | add-Member -MemberType noteProperty -Name "Path" -Value (get-childitem $path) $item | add-Member -MemberType noteProperty -Name "Modified" -Value $SQLReader.GetDateTime(2) $item } if ($total%10 -eq 0) { Write-Progress -Activity "Retrieving WSUS updates:" -Status "$Cached updates cached from $total in database" } } Write-Progress -Activity "Retrieving WSUS updates:" -Status "Closing connection" $SQLConnection.Close()

Использовать например так:

# Лучше сначала получать список в переменную, потом шустрее работать🙂 $Updates = .\Get-WSUSUpdates.Ps1 -Server MyServer -Cache \\MyServer\f$\WsusContent -filter "%x86%.exe" #Ну и делаем что хотим🙂 $Updates | Format-Table -Auto

PS: Если планируется активная работа с SQL (и не только) то рекомендую поставить PowerShell Community Extensions. Там есть такой командлет как Invoke-SQL который сильно упростит работу🙂

Опубликовано в Uncategorized. 10 комментариев »

комментариев 10 to “Опять Get-WsusUpdates.ps1”

  1. Serg_IV Says:

    Что-то я не нашел в PowerShell Community Extensions, командлет Invoke-SQL или я че-то не понимаю

  2. Xaegr Says:

    Да, что то я соврал сильно🙂 Это из PowerGadgets команда… Надо будет попробовать написать аналогичный скрипт.

  3. Каспирович Евгений Says:

    Можно-ли при помощи wmi, powerShell получить данные с windows 2003 sp2 о том , есть ли в системе загруженные обновления которые требуют установки ну и желательно , нужна ли перезагрузка после установки обновления? Без wsus, только windows update.

  4. Xaegr Says:

    2 Каспирович Евгений: Можно, правда не с помощью WMI, а через COM, но для PowerShell разница невелика🙂 — https://xaegr.wordpress.com/2007/11/26/autoupdate-2/

  5. Каспирович Евгений Says:

    Спасибо, то что доктор прописал)

  6. Денис Says:

    А у меня WSUS использует SQL-2005-adv-express. ну и постоянно вылетает Ошибка при подключении к серверу. Я пробовал в скрипте менять пораметр подключения: Initial Catalog=WSUSDB или Initial Catalog=MSSQL$WSUSDB не подключается. Как исправить?

  7. Xaegr Says:

    2 Денис: А какая ошибка возникает при попытке подключения?
    Впрочем думаю что дело скорее всего в необходимости разрешить подключения к SQL от других программ, если не ошибаюсь это делается в Connection Manager или как то так.

  8. Денис Says:

    Ошибка при подключении к серверу. При подключении к SQL Server 2005 эта ошибка может быть вызвана тем, что стандартные параметры SQL Server не разрешают удаленные подключения. (provider: Поставщик именованных каналов, error: 40 — Не удалось открыть подключение к SQL Server) (Microsoft SQL Server, Error: 2)

    Вот постоянно эта ошибка. Смысел понятен. В Management Studio Express — Server Propites — Connections — Allow Remote Connections to this server галка стоит, протокалы Shared Memory, Named pipes, TCP включены. Сервер использует смешанную авторизацию.

  9. Денис Says:

    Нашёл таки решение: http://support.microsoft.com/kb/914277/ru.
    Теперь работаю со скриптом!

  10. zorion Says:

    Жаль не подходит для внутренней базы wsus


Обсуждение закрыто.

%d такие блоггеры, как: