PowerShell, SQL и WSUS

Сегодня переписал свой скрипт для извлечения обновлений из кеша WSUS в нормальный вид. Теперь подключение к SQL происходит непосредственно через .Net без всяких утилит. Ну и вообще расчесал чтоб было попонятнее непосвященным🙂
Разжевывать устройство скрипта не буду, при желании разобраться можно, но если что-то непонятно — спрашивайте.
getwsus.ps1

Использование…

Итак… Запускаем файл getwsus.ps1 в контексте текущего шелла, он добавит функцию Get-WSUS

PS D:\PowerShell> . getwsus.ps1

Так как скорость работы скрипта не велика (я не нашел как в базе WSUS определяется закачано ли обновление, и приходится каждый путь проверять с помощью Test-Path) мы сразу загрузим результат выполнения в переменную $updates и работать будем уже с нею. Так как я работаю удаленно, я указываю имя сервера и сетевой путь к папке кэша обновлений. Если скрипт выполняется локально — делать этого ненужно — будет подставлен сервер Localhost, а путь к обновлениям взят из базы.

PS D:\PowerShell> $Updates = Get-WSUS -ServerName myServer -CacheLocation "\\myServer\f$\WSUS\WsusContent\"

Процесс не быстрый (во всяком случае по сети) у меня он занимает около 5 минут.

Сверим количество полученных записей с количеством реально находящихся в папке .exe файлов:

PS D:\PowerShell> $updates.Count
380
PS D:\PowerShell> (dir "\\myServer\f$\WSUS\WsusContent" -Recurse -Include *.exe).count
380

Скрипт отработал правильно🙂 Что же мы вообще получили?

PS D:\PowerShell> $updates

Name                                           Path                                           Modified
----                                           ----                                           --------
Windows2000-KB823559-x86-ENU.exe               \\myServer\f$\WSUS\WsusContent\6D\8AF191C04C2... 01.07.2003 10:47:22
msjavwu.exe                                    \\myServer\f$\WSUS\WsusContent\57\A47BFCDDD91... 27.05.2004 20:48:22
Windows-KB870669-x86-ENU.exe                   \\myServer\f$\WSUS\WsusContent\96\E3BAB5AB395... 02.07.2004 9:39:50
WSS2003SP1-KB841876-FullFile-ENG-(SFXCAB).exe  \\myServer\f$\WSUS\WsusContent\B4\A7E23A4AA5B... 04.08.2004 13:33:37
WindowsXP-KB842773-v2-x86-enu.exe              \\myServer\f$\WSUS\WsusContent\B3\1D3D2BC417B... 10.08.2004 13:54:33
...

С путём всё нормально, он просто не поместился при выводе на консоль — у неё ограниченная ширина🙂 Но на самом деле это обьекты, ничего не потерялось, так что ничего страшного — путь мы сейчас вернём, секономив место за счёт даты изменения:

PS D:\PowerShell> $updates[0..20] | Format-Table name,path -AutoSize

Name                                          Path
----                                          ----
Windows2000-KB823559-x86-ENU.exe              \\myServer\f$\WSUS\WsusContent\6D\8AF191C04C299392C8D905C6A2DEF310D4CDEF6D.exe
msjavwu.exe                                   \\myServer\f$\WSUS\WsusContent\57\A47BFCDDD919D509C45B3BF0355AB98107AA0157.exe
Windows-KB870669-x86-ENU.exe                  \\myServer\f$\WSUS\WsusContent\96\E3BAB5AB3953B33DD4FD28B64C6F670AAC446996.exe
WSS2003SP1-KB841876-FullFile-ENG-(SFXCAB).exe \\myServer\f$\WSUS\WsusContent\B4\A7E23A4AA5B5D0430D275C53B571E04365CE5EB4.exe
WindowsXP-KB842773-v2-x86-enu.exe             \\myServer\f$\WSUS\WsusContent\B3\1D3D2BC417BF9D881206ED238AD6A4A9C189CFB3.exe
...

Но это просто вывод на экран, нам нужно не совсем это. Создадим папку для экспорта обновлений:

PS D:\PowerShell> cd f:
PS F:\> md localrep



    Directory: Microsoft.PowerShell.Core\FileSystem::F:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        25.12.2006     16:03            localrep

PS F:\> cd localrep

Теперь выберем обновления в названии которых встречается «WindowsXP», скопируем в эту папку, создадим update.cmd в который добавим имена всех файлов с ключами для тихой установки. Ну и по ходу дела выводя названия обновлений на экран, что бы было видно что скрипт что то делает (использовать Write-Progress тут меня заломало🙂 Можно посмотреть на него в самом скрипте — это та самая синяя штука показывающая сколько обновлений обработано :))

PS F:\localrep> $updates | where {$_ -match "WindowsXP"} | 
foreach { copy -path $_.path -destination $_.name; write-host $_.name; $_.name+" /z /u /n"} | Set-Content update.cmd

WindowsXP-KB842773-v2-x86-enu.exe
WindowsXP-KB885884-x86-ENU.exe
WindowsXP-KB885523-x86-enu.exe
WindowsXP-KB873339-x86-ENU.exe
WindowsXP-KB886185-x86-enu.exe
...

На самом деле это одна строка, я сократил чтобы не разъезжалась лента.

Посмотрим…

PS F:\localrep> ls


    Directory: Microsoft.PowerShell.Core\FileSystem::F:\localrep

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        21.09.2006      4:15     821584 IE6.0sp1-KB925486-WindowsXP-x86-ENU.exe
-a---        25.12.2006     16:18       4614 update.cmd
-a---        08.12.2005     20:47     568048 WindowsXP-KB835409-x86-ENU.exe
-a---        25.08.2004      3:50     652008 WindowsXP-KB842773-v2-x86-enu.exe
-a---        08.02.2005      0:43    1776872 WindowsXP-KB873333-x86-enu.exe
...

Получилось🙂

Ну и напоследок можно сделать всё за одну команду🙂

Если у кого нибудь будет возможность, засеките пожалуйста время выполнения скрипта локально на компьютере с WSUS и по сети. Сделать это можно с помощью Measure-Command, например так:

PS F:\localrep> Measure-Command { $updates = Get-WSUS "myServer" "\\myServer\f$\WSUS\WsusContent\" }

Days              : 0
Hours             : 0
Minutes           : 4
Seconds           : 34
Milliseconds      : 728
Ticks             : 2747285139
TotalDays         : 0,00317972817013889
TotalHours        : 0,0763134760833333
TotalMinutes      : 4,578808565
TotalSeconds      : 274,7285139
TotalMilliseconds : 274728,5139
Опубликовано в PowerShell. 3 комментария »

комментария 3 to “PowerShell, SQL и WSUS”

  1. Vladimir Says:

    Не могу скачать скрипт.

  2. Xaegr Says:

    Переезд страшное дело😦 Перезалил сюда — http://windowspowershell.ru/public/Get-WSUSUpdates.Ps1.txt

  3. Vladimir Says:

    Спс


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

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