2013-11-15 101 views
0

我正在尋找一個腳本,它可以幫助我卸載網絡中幾個客戶端上的某個軟件。使用powershell卸載遠程客戶端上的軟件

現在我正在瀏覽列表,遠程訪問客戶端,使用我的管理員帳戶登錄並在註銷並重復此過程之前卸載軟件。所有這些都是手動的,所以我想你的幫助寫一個powershell腳本,爲我做這些事情。

可能發生的一些問題: 我無法遠程登錄,因爲我無法建立與客戶端的連接。 另一個用戶可能已經在客戶端上登錄。 在我不知情的情況下,要卸載的軟件實際上已經被卸載。

它在900個客戶端的某個地方,所以一個腳本真的會有所幫助。

另外,如果在腳本結束後可以獲得卸載軟件的客戶端列表以及哪些客戶端不是很好。

回答

1

寫成這樣的問題很可能引發「你嘗試過什麼」型反應......

我會建議使用Windows安裝PowerShell的模塊Uninstall-MSIProduct

我已經描述瞭如何在本文中遠程使用此模塊:remote PCs using get-msiproductinfo,本例使用Get-MSIProductInfo,但可以很容易地更新爲使用Uninstall-MSIProduct

我有一個快速去改變這個使用Uninstall-MSIProduct,但尚未測試它。

[cmdletbinding()] 
param 
(
    [parameter(Mandatory=$true,ValueFromPipeLine=$true,ValueFromPipelineByPropertyName=$true)] 
    [string] 
    $computerName, 
    [string] 
    $productCode 
) 

begin 
{ 
    write-verbose "Starting: $($MyInvocation.MyCommand)" 

    $scriptFolder = Split-Path -Parent $MyInvocation.MyCommand.Path 
    $moduleName  = "MSI" 
    $modulePath  = Join-Path -Path $scriptFolder -ChildPath $moduleName 

    $remoteScript = { 
     param($targetPath,$productCode) 

     Import-Module $targetPath 
     uninstall-msiproduct -ProductCode $productCode 
    } 

    $delayedDelete = { 
     param($path) 
     Remove-Item -Path $path -Force -Recurse 
    } 
} 
process 
{ 
    $remotePath = "\\$computerName\c$\temp\$moduleName" 

    write-verbose "Copying module to $remotePath" 
    Copy-Item -Path $modulePath -Destination $remotePath -Recurse -Container -Force 

    write-verbose "Getting installed products" 
    Invoke-Command -ComputerName $computerName -ScriptBlock $remoteScript -ArgumentList "c:\temp\$moduleName", $productCode 

    write-verbose "Starting job to delete $remotePath" 
    Start-Job -ScriptBlock $delayedDelete -ArgumentList $remotePath | Out-Null 
} 

end 
{ 
    write-verbose "Complete: $($MyInvocation.MyCommand)" 
}