PowerShell ile Windows Updatelerin Yönetimi

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.

Commands in PSWindowsUpdate

Ş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.

  1. 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

Reklam

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s