Windows Update Agent
Microsoft kendi içinde kullandığı teknolojilerin büyük kısmını uygulama geliştiricilerin kullanımınada sunuyor.. Windows Updatete bu teknolojilerden biri. Windows Update için bu işi istemci bazında otomotize eden çeşiktli ürünler / bileşenler sunmakla birlikte bu servisi sunacak uygulamalar geliştirilebilmesi için gereken tüm bileşenleri uygulama geliştiricilerin kullanımına sunmuş durumda. Bu makalede Windows Update servisini masaüstüne taşımak için kullanabileceğimiz altyapıyı tanıyor olacağız..
Makale içeriği;
1. Windows Update Agent Nesne Modeli
2. Kurulu WUA Sürümünün Belirlenmesi
3. WUA APIında Erişim Kısıtlanmıl Metod ve Özellikler
4. Güncellemelerin Aranması, Download Edilmesi ve Yüklenmesi
5. Spesifik bir Güncellemenin Aranması, Download Edilmesi ve Kurulması
1. Windows Update Agent Nesne Modeli
Visual C++, Visual Basic ve Visual Basic kullanıyorsanız Windows Update Agentı kullanabilmek için yapmanız gereken ilk şey wuapi.dlle referans vermeniz. Eğer C veya C++ dillerinden birini kullanıyorsanız wuapi.h ve wuapi.lib dosyalarına referans vermelisiniz.
Aşağıdaki tabloda ise yukarıdaki grafikte gördüğümüz nesneleri ve açıklamalarını görebilirsiniz:
| Nesne |
Bu nesne ile ne yapabilirsiniz |
| AutomaticUpdates |
Otomatik Güncellemeyi başlatabilir, bekletebilir, durdurabilirsiniz. |
| AutomaticUpdatesSettings |
Güncellemelerin yükleneceği tarih ve saat bilgisini belirlemek veya almak ve kullanıcıların otomatik güncellemeler ile ilgili nasıl uyarılacaklarını belirlemek için kullanabilirsiniz. |
| Category |
Güncellemenin kategorisi, adı, idsi, açıklaması, üreticisi ve ilgili ürünle ilgili bilgileri sağlar. Belirtilen kategoriye dahil güncellemeleri içeren bir kolleksiyon sağlar. Üst veya alt kategorileri içeren bir kolleksiyon sağlar. |
| CategoryCollection |
Kategorilerden oluşan bir kolleksiyon oluşturmanızı veya mevcut bir kolleksiyona erişmenizi sağlar. |
| DownloadResult |
Downloadın başarılı olup olmadığı ile ilgili bilgi verir. |
| InstallationResult |
Kurulumun veya uninstall işleminin başarısı ile ilgili bilgi verir. Aynı zamanda kurulum veya uninstall işlemi sonrasında bilgisayarı yeniden başlatmak gerekip gerekmediğini de öğrenebilirsiniz. |
| SearchResult |
Kategoriler veya güncellemeler ile ilgili bir arama işleminin başarısı ile ilgili bilgi verir. |
| SystemInformation |
Hedef bilgisayarın donanım ve yeniden başlatma gereksinimi bilgilerine erişmenizi sağlar. |
| Update |
Update, kaynak gereksinimleri, kimlik, açıklama, uninstall seçenekleri, download önceliği, boyutu ve deadline ile ilgili pek çok bilgi sağlar. |
| UpdateCollection |
Update nesnelerinden oluşan bir kolleksiyon sunar. |
| UpdateDownloader |
Belirtilen dosyaların senkron veya asenkron olarak download edilmesini başlatır. |
| UpdateDownloadResult |
Belirtilen updatein downloadı ile ilgili bilgi sağlar (başarılı/başarısız şeklinde) |
| UpdateException |
Update esnasında bir hata ile karşılaşıldığında oluşturulan exception ile ilgili bilgi sağlar. |
| UpdateExceptionCollection |
UpdateException nesnelerinden oluşan bir kolleksiyon sunar. |
| UpdateHistoryEntry |
Kurulan veya kaldırılan bir update ile ilgili, uygulama bilgilerini, tarih ve açıklama bilgilerinide içeren bilgi sağlar. |
| UpdateHistoryEntryCollection |
UpdateHistoryEntryCollection nesnelerinden oluşan bir kolleksiyon sunar. |
| UpdateInstallationResult |
Bir updatein kurulumunun başarılı veya başarısız olduğu bilgisini sağlar. |
| UpdateInstaller |
Bir updatein senkron veya asenkron kurulumunu başlatır. Kullanıcının güncellemeleri kurmasını sağlayacak bir arabirimin ve adımlarının başlatılmasını sağlar. |
| UpdateSearcher |
Sunucudaki güncellemeleri türüne, idsine veya kategorisine göre arar. |
| UpdateSession |
Bir uygulama için güncellemeleri aramak, download etmek, yüklemek ve kaldırmak için bir oturum başlatır. |
| WebProxy |
HTTP Proxy ayarlarını yapabilir veya alabilirsiniz. |
Yukarıdaki tabloda ne amaçla kullanılabileceklerini kısaca belirttiğimiz nesneleri ve kullanımlarını ilerleyen bölümlerde ele alıyor olacağız ancak önce uygulamamızın çalıştığı bilgisayardaki WUA sürümünü nasıl denetleyeceğimizi görelim..
2. Kurulu WUA Sürümünün Belirlenmesi
Windows Update Agnt(WUA) yı kullanırken yapmamız gereken ilk şey mevcut sürümü öğrenmektir. Bunu Windows çalışmakta olan Windows kurulumunun \system32 dizininde yer alan WUAUEND.DLLin sürümüne bakılarak öğrenebiliriz. Eğer sürüm numarası olarak 5.4.3790.1000 veya daha üstü bir değer dönüyorsa WUA kuruludur. Eğer 5.4.3790.1000 den daha düşük bir değer dönüyorsa SUS 1.0 kurulu demektir.
SUS 1.0a WUA APIını kullanarak bir çağrı yaptığınızda HRESULT, WU_E_AU_LEGACYSERVER döner.
3. WUA APIında Erişim Kısıtlanmıl Metod ve Özellikler
WUAda yer alan bazı interface, metod ve özelliklere erişim sadece Administrator, User ve Power Users gruplarındaki kullanıcıların erişebileceği şekilde kısıtlanmıştır.
Aşağıdaki interface ve metodlara sadece Administrator, User ve Power User gruplarından birine dahil kullanıcılar erişebilir.
- IAutomaticUpdates
- IAutomaticUpdatesSettings
- ISystemInformation
- IUpdateSearcher
- IUpdateSession
Aşağıdaki download interface ve metodlara sadece Administrators ve Power Users gruplarına dahil kullanıcılar erişebilir.
- IUpdateDownloader
- IUpdate::CopyFromCache
Aşağıdaki kurulum interface, metod ve özelliklerine sadece Administrators grubuna dahil kullanıcılar erişebilir.
- IUpdateInstaller
- IsHidden Property of IUpdate
Not: Administrators, Users ve Power Users gruplarına dahil kullanıcılar "IsHidden Property of IUpdate" değerlerini alabilirken sadece Administrators grubuna dahil kullanıcılar bu değerleri değiştirebilir.
IUpdate::AcceptEula
IAutomaticUpdatesSettings::Save
NotificationLevel Property of IAutomaticUpdatesSettings
Not: Administrators, Users ve Power Users gruplarına dahil kullanıcılar "NotificationLevel Property of IAutomaticUpdatesSettings" değerlerini alabilirken sadece Administrators grubuna dahil kullanıcılar bu değerleri değiştirebilir.
ScheduledInstallationDay Property of IAutomaticUpdatesSettings
Not: Administrators, Users ve Power Users gruplarına dahil kullanıcılar "ScheduledInstallationDay Property of IAutomaticUpdatesSettings" değerlerini alabilirken sadece Administrators grubuna dahil kullanıcılar bu değerleri değiştirebilir.
ScheduledInstallationTime Property of IAutomaticUpdatesSettings
Not: Administrators, Users ve Power Users gruplarına dahil kullanıcılar "ScheduledInstallationTime Property of IAutomaticUpdatesSettings" değerlerini alabilirken sadece Administrators grubuna dahil kullanıcılar bu değerleri değiştirebilir.
WUA çağrıyı yapanın ilgili interface, metod veya propertye erişim yetkisi olmadığını tespit ettiğinde HRESULT E_ACCESSDENIED döner.
4. Güncellemelerin Aranması, Download Edilmesi ve Yüklenmesi
Bu bölümdeki örnek scriptler size Windows Update Agentı güncellemeleri taramak, download etmek ve yüklemek için nasıl kullanabileceğinizi göstermeyi amaçlıyor.
Aşağıdaki örnek çalıştırıldığı sisteme uygun tüm güncellemeleri tarıyor ve listeliyor, download edilecek güncellemeleri içeren bir kolleksiyon oluşturuyor ve kolleksiyondaki güncellemeleri download ediyor daha sonra yüklenecek güncellemelerden oluşan bir kolleksiyon oluşturuyor ve kolleksiyondaki güncellemeleri sisteme yüklüyor. (güncelleme başlığını belirterek spesifik bir güncellemenin download edilmesini ve yüklenmesini 5. bölümde ele alıyor olacağız.
Aşağıdaki örneği çalıştırmadan önce aşağıdaki notları gözden geçirmeniz faydalı olacaktır;
- Windows Update Agent bilgisayarınızda (kodun çalıştırılacağı bilgisayarda) kurulu olmalıdır. (Kurulu WUA versiyonunu öğrenmek ile ilgili detaylar için 2. Bölüme bakınız.)
- Aşağıdaki örnek bir kullanıcı arabirimi sunmaz. Sadece yüklenen güncellemelerin bilgisayarın yeniden başlatılmasını gerektirmesi durumunda bir uyarı görüntüler.
- Bu örnek sadece WUA kullanarak güncelleme download edebilir. SUS 1.0 server kullanamaz.
- Bu örnek Windows Script Host gerektirir. Windows Script Host ile ilgili detaylı bilgi için msdn veya Platform SDKnın Windows Scripting Host bölümüne bakabilirsiniz.
Aşağıdaki örneği notepade aktarıp *.vbs uzantısı ile kaydederseniz, dosyayı çift tıklayarak ya da aşağıdaki komutu komut satırına yazarak kodu çalıştırabilirsiniz.
Örnek Kod;
Set updateSession = CreateObject("Microsoft.Update.Session") Set updateSearcher = updateSession.CreateupdateSearcher() Set searchResult = _ updateSearcher.Search("IsInstalled=0 and Type=Software")
WScript.Echo "Güncellemeler aranıyor..." & vbCRLF WScript.Echo "Bu bilgisayar için download edilebilecek güncellemeler:"
For I = 0 To searchResult.Updates.Count-1 Set update = searchResult.Updates.Item(I) WScript.Echo I + 1 & "> " & update.Title Next
If searchResult.Updates.Count = 0 Then WScript.Echo "Bu bilgisayar için download edilebilecek güncelleme şu anda yok." WScript.Quit End If
WScript.Echo vbCRLF & "Download edilecek güncellemeler belirleniyor (kolleksiyon oluşturuluyor):"
Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")
For I = 0 to searchResult.Updates.Count-1 Set update = searchResult.Updates.Item(I) WScript.Echo I + 1 & "> adding: " & update.Title updatesToDownload.Add(update) Next
WScript.Echo vbCRLF & "Güncellemeler download ediliyor..."
Set downloader = updateSession.CreateUpdateDownloader() downloader.Updates = updatesToDownload downloader.Download()
WScript.Echo vbCRLF & "Download edilen güncellemeler:"
For I = 0 To searchResult.Updates.Count-1 Set update = searchResult.Updates.Item(I) If update.IsDownloaded Then WScript.Echo I + 1 & "> " & update.Title End If Next
Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")
WScript.Echo vbCRLF & _ "Download edilen güncellemeler kurulum için hazırlanıyor (kolleksiyon oluşturuluyor):"
For I = 0 To searchResult.Updates.Count-1 set update = searchResult.Updates.Item(I) If update.IsDownloaded = true Then WScript.Echo I + 1 & "> adding: " & update.Title updatesToInstall.Add(update) End If Next
WScript.Echo vbCRLF & "Güncellemeleri şimdi yüklemek ister misiniz? (E/H)" strInput = WScript.StdIn.Readline WScript.Echo
If (strInput = "H" or strInput = "h") Then WScript.Quit ElseIf (strInput = "E" or strInput = "e") Then WScript.Echo "Güncellemeler kuruluyor..." Set installer = updateSession.CreateUpdateInstaller() installer.Updates = updatesToInstall Set installationResult = installer.Install()
kurulum sonuçlarını bildiriyoruz WScript.Echo "Kurulum raporu: " & _ installationResult.ResultCode WScript.Echo "Bilgisayarın yeniden başlatılması gerekiyor: " & _ installationResult.RebootRequired & vbCRLF WScript.Echo "Kurulan güncellemelerin listesi:"
For I = 0 to updatesToInstall.Count - 1 WScript.Echo I + 1 & "> " & _ updatesToInstall.Item(i).Title & _ ": " & installationResult.GetUpdateResult(i).ResultCode Next End If |
5. Spesifik bir Güncellemenin Aranması, Download Edilmesi ve Kurulması
Bu bölümde ise bir önceki bölümde yaptığımız örneği biraz geliştirerek spesifik bir güncellemeyi başlığına göre arayacağız. Bu örneği kendi gereksinimleriniz doğrultusunda geliştirerek ve özelleştirerek kritik bir güvenlik güncelleştirmesinin yüklenip yüklenmediğini tespit etmek için kullanabilirsiniz. Eğer güncelleme yüklenmemişse download edilmesini ve yüklenmesini sağlayabilirsiniz (kullanıcıya sorarak veya sormayarak).
Bu örnekte güncelleme, güncellemenin başlık bilgisine göre sorgulanıyor (Title Property of IUpdateHistoryEntry). Örnekte arayacağımız güncellemenin başlığı; "Update for Windows Rights Management client 1.0"
Bu örnek içinde 4. bölümde yer alan örnekte dikkat etmemiz gerektiğini söylediğim noktalara dikkat etmemiz gerekiyor;
- Windows Update Agent bilgisayarınızda (kodun çalıştırılacağı bilgisayarda) kurulu olmalıdır. (Kurulu WUA versiyonunu öğrenmek ile ilgili detaylar için 2. Bölüme bakınız.)
- Aşağıdaki örnek bir kullanıcı arabirimi sunmaz. Sadece yüklenen güncellemelerin bilgisayarın yeniden başlatılmasını gerektirmesi durumunda bir uyarı görüntüler.
- Bu örnek sadece WUA kullanarak güncelleme download edebilir. SUS 1.0 server kullanamaz.
- Bu örnek Windows Script Host gerektirir. Windows Script Host ile ilgili detaylı bilgi için msdn veya Platform SDKnın Windows Scripting Host bölümüne bakabilirsiniz.
Aşağıdaki örneği notepade aktarıp *.vbs uzantısı ile kaydederseniz, dosyayı çift tıklayarak ya da aşağıdaki komutu komut satırına yazarak kodu çalıştırabilirsiniz.
Örnek Kod;
Set updateSession = CreateObject("Microsoft.Update.Session")
aranacak güncellemenin başlığını alalım WScript.Echo "Aramak istediğiniz güncellemenin başlığı: " & _ "(örnek: Update for Windows Rights Management client 1.0)" updateTitle = WScript.StdIn.Readline
WScript.Echo vbCRLF & "Aranan güncelleme: " & updateTitle & "..."
Set updateSearcher = updateSession.CreateupdateSearcher()
Tüm yazılım güncelleştirmelerini tara, hem yüklenmiş olanları, hem yüklenmemiş olanları Set searchResult = _ updateSearcher.Search("Type=Software")
Set updateToInstall = CreateObject("Microsoft.Update.UpdateColl")
updateIsApplicable = False
Dönen sonuçlar arasında belirtilen başlığı ara For i = 0 To searchResult.Updates.Count-1 Set update = searchResult.Updates.Item(i) If UCase(update.Title) = UCase(updateTitle) Then güncelleme bulundu önceden kurulu olup olmadığını denetle If update.IsInstalled = False Then WScript.Echo vbCRLF & _ "Sonuç: Güncelleme bulundu, henüz yüklenmemiş." updateIsApplicable = True updateToInstall.Add(update) Else Güncelleme önceden yüklenmiş, kullanıcıyı uyar ve çık WScript.Echo vbCRLF & _ "Sonuç: Güncelleme bulundu ancak bu güncelleme daha önceden yüklenmiş." updateIsApplicable = True WScript.Quit End If End If Next
If updateIsApplicable = False Then WScript.Echo "Sonuç: Güncelleme bu bilgisayara yüklenemez." WScript.Quit End If
WScript.Echo vbCRLF & "Şimdi yüklemek istiyor musunuz? (E/H)" stdInput = WScript.StdIn.Readline
If (strInput = "H" or strInput = "h") Then WScript.Quit ElseIf (stdInput = "E" OR stdInput = "E") Then Download update Set downloader = updateSession.CreateUpdateDownloader() downloader.Updates = updateToInstall WScript.Echo vbCRLF & "Download ediliyor..." Set downloadResult = downloader.Download() WScript.Echo "Download sonucu: " & downloadResult.ResultCode
güncellemeyi kur Set installer = updateSession.CreateUpdateInstaller() WScript.Echo vbCRLF & "Kuruyor..." installer.Updates = updateToInstall Set installationResult = installer.Install()
kurulum sonucunu görüntüle WScript.Echo "Kurulum raporu: " & _ installationResult.ResultCode WScript.Echo "Bilgisayarın yeniden başlatılması gerekiyor: " & _ installationResult.RebootRequired
End If |
Bu makalede WindowsUpdatein programlanması ve özelleştirilmesi için kullanabileceğiniz Windows Update Agent arabiriminin nasıl kullanılabileceği ile ilgili temel bilgileri aktarmaya çalıştık. Özellikle tek tek kontrol edilemeyecek kadar çok istemcinin bulunduğu networklerde istemcilerimizin gerekli güvenlik güncellemelerini (yeri geldiğinde farkında olmadan) kurmalarını sağlamak için yardımcı olabilir.
Windows Update Agent ile ilgili çok fazla public dokuman yok ne yazık ki. MSDN, Technet veya Platform SDKdan bu makaleyede kaynak olan Windows Update Agent referansına erişebilirsiniz.