PowerShell: как найти и удалить обновление MS Office - PullRequest
4 голосов
/ 04 мая 2010

Я искал чистый способ удаления обновления безопасности MSOffice на большом количестве рабочих станций. Я нашел несколько неуклюжих решений, но ничего более чистого или общего, например, использование PowerShell и get-wmiobject с Win32_QuickFixEngineering и методом .Uninstall для получающегося объекта.

[По-видимому, Win32_QuickFixEngineering относится только к исправлениям Windows. См .: http://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/93cc0731-5a99-4698-b1d4-8476b3140aa3]

Вопрос 1: Нет ли способа использовать get-wmiobject для поиска обновлений MSOffice? Мне так интересно узнать, сколько классов и пространств имен.

Это конкретное обновление Office (KB978382) можно найти в реестре здесь (для Office Ultimate):

HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\{91120000-002E-0000-0000-0000000FF1CE}_ULTIMATER_{6DE3DABF-0203-426B-B330-7287D1003E86}

, который любезно показывает команду удаления:

msiexec /package {91120000-002E-0000-0000-0000000FF1CE} /uninstall {6DE3DABF-0203-426B-B330-7287D1003E86}

и последний GUID кажется постоянным в разных версиях Office.

Я также нашел обновление, как это:
$wu = new-object -com "Microsoft.Update.Searcher"
$wu.QueryHistory(0,$wu.GetTotalHistoryCount()) | where {$_.Title -match "KB978382"}

Мне нравится этот поиск, потому что он не требует каких-либо возни в реестре, но:

Вопрос 2: Если я обнаружил, что это так, что я могу сделать с найденной информацией, чтобы облегчить удаление?

Спасибо

1 Ответ

4 голосов
/ 25 марта 2011

Расширяя ваш второй подход (используя Microsoft.Update.Searcher), это решение должно позволить вам искать обновление по названию, а затем удалять его:

$TitlePattern = 'KB978382'

$Session = New-Object -ComObject Microsoft.Update.Session

$Collection = New-Object -ComObject Microsoft.Update.UpdateColl
$Installer = $Session.CreateUpdateInstaller()
$Searcher = $Session.CreateUpdateSearcher()

$Searcher.QueryHistory(0, $Searcher.GetTotalHistoryCount()) | 
    Where-Object { $_.Title -match $TitlePattern } |
    ForEach-Object {
        Write-Verbose "Found update history entry $($_.Title)"
        $SearchResult = $Searcher.Search("UpdateID='$($_.UpdateIdentity.UpdateID)' and RevisionNumber=$($_.UpdateIdentity.RevisionNumber)")
        Write-Verbose "Found $($SearchResult.Updates.Count) update entries"
        if ($SearchResult.Updates.Count -gt 0) {
            $Installer.Updates = $SearchResult.Updates
            $Installer.Uninstall()
            $Installer | Select-Object -Property ResultCode, RebootRequired, Exception
            # result codes: http://technet.microsoft.com/en-us/library/cc720442(WS.10).aspx
        }
    }
...