Bu makelemde windows updatelerinin powershell ile yönetiminden bahsediyor olacağım…
Öncesinde sunucumuzda lokal admin olduğumuzu powershelli “run as administrator” olarak başlattığımızı varsayıyoruz. Poweshell execution policy ninde C:\>set-executionpolicy remotesigned komutu ile ayarlanmış olması gerekiyor. Aksi takdirde güvenlik uyarıları ile karşılaşırsınız.
Modulün Kurulması;
İlk olarak powershell modülünü kurmakla işe başlayacağız. Bunun için iki tane yolumuz var birincisi manuel kurmak ikinciside komut satırından kurmak ben her ikisindende bahsediyor olacağım. Manuel yöntemde https://www.powershellgallery.com/ sitesinden PSWindowsUpdate modülünü indirmemiz sonrasında “PSWindowsUpdate” isminde bir klasör oluşturup %WINDIR%\System32\WindowsPowerShell\v1.0\Modules klasörünün altına ilgili sıkıştırılmış dosyayı açıyoruz. Artık PSWindowsUpdate modülümüzü sunucumua kurmuş oluyoruz.
https://www.powershellgallery.com/ sitesinden modülün bulunması

Manuel Download bölümüne geçip modülün download edilmesi

ikinci yöntem olarakta https://www.powershellgallery.com/ sitesinden ilgili komutları alıp kurulumu gerçekleştirebiliriz. Burda ilgili sıkıştırılmış dosyanın otomatik olarak download edilip windows klasöründe uygun module klasörünün altına otomatik olarak çıkartılması işlemi yapılıyor. Özetle manuel yaptığımız işlem komut satırından otomatik yapılıyor.

Komut satırından Install-Module -Name PSWindowsUpdate komutunu girdiğimizde kurulum gerçekleşecektir. Bu module zaten kurulu gibi bir hata alırsanız Install-Module -Name PSWindowsUpdate -Force komutu ile modülün yeni versiyonunun kurulmasını sağlayabilirsiniz.

Artık modulümüz kuruldu. Kullanıma hazır.
Modulün Keşfedilmesi;
“Get-Command –module PSWindowsUpdate” komutu bu modüldeki kullanılabilir komutları gösterir.

Şimdi makalemizin en can alıcı noktasına geliyoruz. Örnekte Wsus sunucusuna kurmuş olduğumus PSWindowsUpdate modülünün başka sunuculara bu sunucu üzerinden nasıl kurulabileceğini anlatıyor olacağım.
Aşağıdaki iki yöntemden biri ile OrnekSunucu da modülün yüklenmesini sağlamış oluruz.
- Yöntem
$Targets = "OrnekSunucu"
$cred=Get-Credential
Update-WUModule -ComputerName $Targets –Local -Credential $cred
2.Yöntem
Save-Module -Name PSWindowsUpdate –Path \OrnekSunucu\c$\Windows\System32\WindowsPowerShell\v1.0\Modules\
Artık OrnekSunucu dada ilgili modülün komutlarını kullanabiliyor olacaksınız. Komutları kullanmadan önce
Import-Module PSWindowsUpdate
Komutunu kullanmanızı öneririm. Bu komut aynı zamanda host üzerinde bulunan modullerin powershell oturumuna dahil edilmesini sağlar.
Aşağıdaki komutla modüldeki komutların neler olduğunu keşfedebiliriz.
get-command -module PSWindowsUpdate
En çok kullanılan komutları;
- Clear-WUJob –
- Download-WindowsUpdate
- Get-WUInstall, Install-WindowsUpdate
- Hide-WindowsUpdate
- Uninstall-WindowsUpdate
- Add-WUServiceManager
- Enable-WURemoting
- Get-WindowsUpdate
- Get-WUApiVersion
- Get-WUHistory
- Get-WUInstallerStatus
- Get-WUJob
- Get-WULastResults
- Get-WURebootStatus
- Get-WUServiceManager
- Get-WUSettings
- Invoke-WUJob
- Remove-WindowsUpdate
- Remove-WUServiceManager
- Set-PSWUSettings
- Set-WUSettings
- Update-WUModule
Örnek Kullanımlar;
Bir host için Windows updatelerini listeleme
Get-WindowsUpdate
veya Get-WUList
komutları ile bir host üzerindeki uygun updateleri listeleyebilirsiniz.

Uzaktaki bir bilgisayar için;
Get-WUList –ComputerName server001
Sunucunun updateservisini görmek için;
Get-WUServiceManager

Örnekteki ekran görüntüsünde ilgili sunucumuzun WSUS üzerinden update için ayarlandığını görüyoruz.
Eksik updatelerin taranması için;
Get-WUlist -WindowsUpdate #WSUS üzerinden updateleri tarar.
Get-WUlist -MicrosoftUpdate #Microsoft üzerinden updateleri tarar.
Örnek Çıktılar;

Get-WUlist -MicrosoftUpdate #komutunu kullandığınızda aşağıdaki hatayı alırsanız.
Get-WUlist : Service Windows Update was not found on computer. Use Get-WUServiceManager to get registered service.
Uygun service ID ile sunucuyu ayarlamanız gerekir.
Add-WUServiceManager -ServiceID “7971f918-a847-4430-9279-4a52d1efe18d” -AddServiceFlag 7
Sunucunun Windows update agent bilgisi için;
Get-WUApiVersion

Updateleri listelerken filtre uygulamak; Örneğin başlığı “Outlook” olmayan vb.
Get-WUlist -NotCategory "Drivers" -NotTitle "Outlook" -NotKBArticleID KB4999073
Powershell ile Windows Updatelerini yükleme
Aşağıdaki komut, updateleri microsofttan çekip otomatik olarak yükler. Gerekmesi durumunda sunucuyu reboot eder.
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -AutoReboot

Normalde update işlemleri Windowsupdate.log dosyasına yazılır. Bu logları başka bir pathede yazabilirsiniz. Bu size sadece yaptığınız işlemlerin logunu daha rahat inceleme fırsatı sunacaktır.
Install-WindowsUpdate -AcceptAll -Install -AutoReboot | Out-File "c:\logs\$(get-date -f yyyy-MM-dd)-WindowsUpdate.log" -force
Spesifik bir update i de aşağıdaki komutla yükleyebiliriz.
Get-WindowsUpdate -KBArticleID KB2267602, KB4533002 -Install
Bazı kategori ve KB lerin hariç tutulması için aşağıdaki komutu örnek alabiliriz.
Install-WindowsUpdate -NotCategory "Drivers" -NotTitle OneDrive -NotKBArticleID KB4877670 -AcceptAll -IgnoreReboot
Uzaktaki bir host için update yükleme
Genelde powershell komutlarının -computername parametresi tek bir host belirtilebildiği gibi “,” kullanmak şartı ile birden fazla host belirtilmesinede izin verir. Bu parametrenin string dizisi şeklinde tanımlanması ile mümkündür. Bunu öğrenmek için genelde komut get-help komutu ile detaylı incelenmelidir. Bir çok durumda çoklu host belirtilebiliyor. Ama tek bir host la sınırlı komutlarda mevcuttur.
-Computername server1, server2, server3
Remote komut çalıştırmadan önce, önceden winrm servisinin trustedhosts parametrelerine ilgili ip yada sunucu hostları girilmiş olmalıdır.
winrm set winrm/config/client ‘@{TrustedHosts="server1,server2,1.2.3.4,10.20.30.40…"}’
Öncelikle PSWindowsUpdate modulü uzak bilgisayara kurulur ve dllhost.exe prosesine RPC portlar aracılığı Firewall üzerinden erişim sağlanır.
Aşağıdaki komut kullanılabilir updateleri uzak bilgisayarlara geçer.
Invoke-WUInstall -ComputerName server1, server2, server3 -Script {ipmo PSWindowsUpdate; Get-WindowsUpdate -Install -AcceptAll -AutoReboot| Out-File C:\Windows\PSWindowsUpdate.log } -Confirm:$false -Verbose -SkipModuleTest –RunNow
PSWindowsUpdate 2.1 versiyonunda Invoke-WUInstall komutu yerine Invoke-WUJob komutu kullanılır. Bu komut sistemde bir tane scheduler task oluşturur.
Yeni versiyon PSWindowsUpdate modüle lerde , uzaktaki birden fazla hosta aşağıdaki komutla yükleme yapılır.
$ServerNames = "server1, server2, server3"
Invoke-WUJob -ComputerName $ServerNames -Script {ipmo PSWindowsUpdate; Install-WindowsUpdate -AcceptAll | Out-File C:\Windows\PSWindowsUpdate.log } -RunNow -Confirm:$false
Uzaktaki hosta update işlemi yaptıktan sonra sonuçlarının mail ile iletilmesi için aşağıdaki komutu kendimize göre özelleştirebiliriz.
Install-WindowsUpdate -ComputerName nysrv1 -MicrosoftUpdate -AcceptAll - IgnoreReboot -SendReport –PSWUSettings @{SmtpServer="smtp.abc.com";From="update_alert@abc.com";To="wsus_admin@abc.com";Port=25} -Verbose
Powershell ile windows update geçmişinin görüntülenmesi
Bunun için Get-WUHistory komutunu kullanıyoruz.
Bu komutu dahada özelleştirip specific sonuçlar alabiliriz. Örnekte title bilgisi “KB4433389” olanların format table formatında listelenmesi gibi..
Get-WUHistory| Where-Object {$_.Title -match "KB4433389"} | Select-Object *|ft
Örnekte uzaktaki iki bilgisayarda “KB4433389” update i varmı varsa format table formatında yani tablo formatında listele gibi..
"server1","server2" | Get-WUHistory| Where-Object {$_.Title -match "KB4433389"} | Select-Object *|ft
Windows Updatelerini kaldırma
Örnekte KB sini bildiğimiz bir patchin kaldırılması aşağıdaki komut dizilimi ile mümkündür. -norestart parametresi kaldırma sonrası hostun restart edilmeyeceği anlamına geliyor.
Remove-WindowsUpdate -KBArticleID KB4489873 -NoRestart
Windows Updatelerinin gizlenmesi
Bazı updatelerin hide edilmesini isteyebilirsiniz bu genelde driver updatelerinin görünmemesi için sık kullanılır. Aksi takdirde updateleri listelediğinizde uzunca bir liste ile karşılaşabilirsiniz.
Örneğimizde iki tane kb nin hide edilmesi sağlanıyor.
$HideList = "KB4411873", "KB4412243"
Get-WindowsUpdate -KBArticleID $HideList –Hide
Artık Get-WUInstall komutu ile updateleri listelediğimizde hide olanlar görünmeyecek.
Hide edilmiş updatelerinde görünmesi için;
Get-WindowsUpdate –IsHidden
Status kolonundaki “H” ilgili update in hide edildiğini gösterir.

Hide edilmiş olan bir kb yi görünür yani visible yapma;
Get-WindowsUpdate -KBArticleID $HideList -WithHidden -Hide:$false
veya
Show-WindowsUpdate -KBArticleID $HideList
Bir makalenin daha sonuna geldik. Komut dizilimlerindeki parameterlerin birçoğunu anlaşılır olması sebebi ile detaylandırmadım soru ve fikirleriniz için lütfen yorum yapmayı unutmayın.
Kürşat ARI / System Engineer & PowerShell Developer