2010-05-04 2 views
4

J'ai recherché un moyen propre de désinstaller une mise à jour de sécurité MSOffice sur un grand nombre de postes de travail. J'ai trouvé des solutions maladroites, mais rien de plus propre ou général comme l'utilisation de PowerShell et get-wmiobject avec Win32_QuickFixEngineering et la méthode .Uninstall sur l'objet résultant.PowerShell: Comment rechercher et désinstaller une mise à jour MS Office

[Apparemment, Win32_QuickFixEngineering se réfère uniquement aux correctifs Windows. Voir: http://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/93cc0731-5a99-4698-b1d4-8476b3140aa3]

Question 1: Est-il impossible d'utiliser get-wmiobject pour trouver les mises à jour MSOffice? Il y a tellement de classes et d'espaces de noms que je me demande.

Cette particualar mise à jour Office (KB978382) se trouvent dans le registre ici (pour Office Ultimate):

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

qui montre bien vouloir la commande de désinstallation de:

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

et le dernier GUID semble constant entre les différentes versions d'Office.

J'ai également trouvé la mise à jour comme celui-ci:
$wu = new-object -com "Microsoft.Update.Searcher"
$wu.QueryHistory(0,$wu.GetTotalHistoryCount()) | where {$_.Title -match "KB978382"}

J'aime cette recherche, car il ne nécessite pas de farfouillé dans le registre, mais:

Question 2: Si je l'ai trouvé comme ça, que puis-je faire avec les informations trouvées pour faciliter la désinstallation?

Merci

Répondre

4

L'expansion de votre deuxième approche (en utilisant Microsoft.Update.Searcher), cette solution devrait vous permettre de rechercher une mise à jour par titre puis désinstaller:

$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 
     } 
    } 
+0

'CreateUpdateInstaller()' doit être appelé d'un processus élevé. Par conséquent, il ne peut pas être utilisé par l'intermédiaire de 'invoke-command'. – mbrownnyc

Questions connexes