POC – Private “Update for Business” – Inwentaryzacja poprawek
Spis treści projektu:
1. POC – Private “Update for Business” – Intro
2. POC – Private “Update for Business” – Komputery i Grupy
3. POC – Private “Update for Business” – Inwentaryzacja klientów
4. POC – Private “Update for Business” – Inwentaryzacja poprawek
5. POC – Private “Update for Business” – Automatyczna akceptacja poprawek
6. POC – Private “Update for Business” – Automatyczny Maintenance
Po zinwentaryzowaniu klientów WSUS’a pora na inwentaryzację poprawek. Można oczywiście wy-klikać i sprawdzać poszczególne poprawki w kontekście tego, czy są zaakceptowane, czy odrzucone oraz na której z utworzonych grup zostały zaakceptowane, a na której jeszcze nie… Można też użyć do tego celu Powershell’a – ale niestety działa on strasznie wolno w porównaniu z bazą WSUS’a i bezpośrednimi zapytaniami.
OK. Czego potrzebujemy (oprócz czasu 🙂 )? Zapytania SQL oraz skryptu Powershell’owego żeby wyciągnąć informacje o poprawkach i zapisać je w przyjaznej formie zbiorczego raportu w pliku csv. Zaczynamy od zapytania SQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
use susdb GO SET QUOTED_IDENTIFIER ON GO SELECT DISTINCT 'KB' + PUBLIC_VIEWS.vUpdate.Knowledgebasearticle as 'KB', PUBLIC_VIEWS.vUpdate.DefaultTitle as 'Title', PUBLIC_VIEWS.vUpdate.IsDeclined, (select creationDate from PUBLIC_VIEWS.vUpdateApproval where computertargetgroupid = '83F90CD5-5B65-XXXX-YYYY-60E0B54AE674' and action = 'Install' and PUBLIC_VIEWS.vUpdateApproval.updateID = PUBLIC_VIEWS.vUpdate.updateid) as 'Grupa_Testowa', (select creationDate from PUBLIC_VIEWS.vUpdateApproval where computertargetgroupid = '1C51B3C2-B0A5-XXXX-YYYY-3F38396A0195' and action = 'Install' and PUBLIC_VIEWS.vUpdateApproval.updateID = PUBLIC_VIEWS.vUpdate.updateid) as 'Grupa_Pilotazowa', (select creationDate from PUBLIC_VIEWS.vUpdateApproval where computertargetgroupid = '4D0B5A58-36A6-XXXX-YYYY-4255BFF6D22D' and action = 'Install' and PUBLIC_VIEWS.vUpdateApproval.updateID = PUBLIC_VIEWS.vUpdate.updateid) as 'Grupa_Produkcyjna', (select creationDate from PUBLIC_VIEWS.vUpdateApproval where computertargetgroupid = 'a0a08746-4dbe-4a37-9adf-9e7652c0b421' and action = 'Install' and PUBLIC_VIEWS.vUpdateApproval.updateID = PUBLIC_VIEWS.vUpdate.updateid) as 'All_Computers', PUBLIC_VIEWS.vUpdate.DefaultDescription as 'Description', PUBLIC_VIEWS.vUpdate.MSRCSeverity as 'Severity', PUBLIC_VIEWS.vUpdate.securityBulletin as 'ScurityBulletin', PUBLIC_VIEWS.vUpdate.CreationDate as 'CreationDate', PUBLIC_VIEWS.vUpdate.ArrivalDate as 'WSUSArrivalDate', PUBLIC_VIEWS.vUpdate.UpdateID as 'UpdateID' FROM PUBLIC_VIEWS.vUpdate left join PUBLIC_VIEWS.vUpdateApproval on PUBLIC_VIEWS.vUpdate.UpdateID = PUBLIC_VIEWS.vUpdateApproval.UpdateID |
W odpowiedzi na powyższe zapytanie dostaniemy informację o poprawkach na naszym serwerze WSUS w postaci wpisów:
KB | Title | IsDeclined | Grupa_testowa | Grupa_Pilotazowa | Grupa_Produkcyjna | All_Computers | Description | Severity | ScurityBulletin | CreationDate | WSUSArrivalDate | UpdateID |
KB3074219 | Security Update for Internet Explorer Flash Player for Windows 8.1 for x64-based Systems (KB3074219) | 0 | 2015-06-23 23:40:17.573 | 2015-06-29 16:00:09.070 | NULL | NULL | A security issue has been identified in a Microsoft software product that could affect your system. (…) | Unspecified | NULL | 2015-06-23 22:00:00.000 | 2015-06-23 23:40:17.370 | 5241D829-45B1-47E6-A769-5BD0C0FA7F47 |
Teraz możemy zapisać nasze zapytanie SQL’owe do pliku np: „C:\scripts\Updates_Info\All_Updates_and_groups.sql” i przystąpić do napisania skryptu powershell’owego, który będzie wykonywać dla nas cykliczne inwentaryzacje. Skrypt ma postać:
1 2 3 4 5 6 7 8 9 10 11 |
$localPath = "C:\scripts\Updates_Info" $name = "Stan_Poprawek_Users.csv" $tmp = "tmp_Info.csv" Remove-Item (Join-Path $localPath -ChildPath $name) -Force sqlcmd -E -S \\.\pipe\Microsoft##WID\tsql\query -i C:\scripts\Updates_Info\All_Updates_and_groups.sql -o C:\scripts\Updates_info\tmp_Info.csv -u -s ";" -W -R $info = Get-Content (Join-Path $localPath -ChildPath $tmp) $info | Select-String -Pattern "KB" | Set-Content (Join-Path $localPath -ChildPath $name) Remove-Item (Join-Path $localPath -ChildPath $tmp) -Force |
Oczywiście i tym razem podłączamy skrypt Powershell’owy do harmonogramu zadań żeby wykonywał automatycznie inwentaryzację poprawek. W tym przypadku częstotliwość powinna zależeć od tego jakie różnice czasu mają dzielić nasze prywatne „okręgi release’owe poprawek” 🙂 może to być tydzień, czy miesiąc a może być i 1 dzień – zależy od potrzeb wewnętrznych i szybkości testów.
Zbliżamy się już coraz bliżej do osiągnięcia założonego pierwotnie celu, czyli wykreowania naszego prywatnego Updates for Business – pozostały zasadniczo jeszcze tylko 2 zagadnienia: Automatyczne cykle akceptacji poprawek na poszczególne grupy oraz zadania maintenece’owe – ale o tym w kolejnych częściach. Zapraszam! 🙂