Invoke-command和msiexec

时间:2014-03-07 18:16:23

标签: powershell uninstall invoke-command

我正在尝试使用Invoke-Command cmdlet删除远程计算机上的应用程序,但它无法正常工作。

这是我的剧本:

  Invoke-Command -ComputerName "Computername" -Verbose -ScriptBlock {
  msiexec.exe /x '{4ADBF5BE-7CAF-4193-A1F9-AM6820E68569}' /qn /passive
  }

在这种背景下是否有可靠的,可行的替代方案?

2 个答案:

答案 0 :(得分:3)

这不使用Invoke-Command或MSIExec,但它是一种功能性卸载方法,用于在WMI注册的任何内容上使用WMI删除远程计算机上的应用程序(应该是通过msiexec安装的任何内容)。

(Get-WmiObject -Class Win32_product -ComputerName ComputerName -Filter {IdentifyingNumber LIKE '{4ADBF5BE-7CAF-4193-A1F9-AM6820E68569}'}).uninstall()

此外,如果您有多台计算机可以将其放入ForEach循环中。如果您具有WMI中列出的Name,IdentifyingNumber和Version,则可以使用以下上下文(使用AT& T Connect Participant Application v9.0.82)使其更快:

$App="IdentifyingNumber=`"`{1F3A6960-8470-4C84-820C-EBFFAF4DA580`}`",Name=`"AT&T Connect Participant Application v9.0.82`",version=`"9.0.82`""
([WMI]\\ComputerName\root\cimv2:Win32_Product.$App).Uninstall()

是的,$ App字符串是可怕的转义,但这是由于WMI要求字符串格式化大括号和双引号的方式,而不是。这对于单个卸载来说并不完全有用,因为它要求您预先获取所有信息并格式化键字符串。如果您打算从30台机器上删除一台软件,那就更好了。您可以通过从我的第一个命令中取消.Uninstall()方法来获取所有信息,所以......

Get-WmiObject -Class Win32_product -ComputerName RemoteComputer -Filter {IdentifyingNumber LIKE '{1F3A6960-8470-4C84-820C-EBFFAF4DA580}'}

会吐出类似的东西:

IdentifyingNumber : {1F3A6960-8470-4C84-820C-EBFFAF4DA580}
Name              : AT&T Connect Participant Application v9.0.82
Vendor            : AT&T Inc.
Version           : 9.0.82
Caption           : AT&T Connect Participant Application v9.0.82

也可以通过将过滤器更改为`{Name LIKE'%AT& T Connect%'}来使用名称甚至部分名称,或者您可以查询WMI以列出所有注册的应用程序-Filter完全关闭,尽管您可能希望将其传递给Format-Table以使其可读。我用过:

gwmi -class win32_product -computername RemoteComputer|ft IdentifyingNumber,Name,Version

有关此信息的详细信息,请参阅此link

答案 1 :(得分:0)

这是我提出的解决方案

$myses = New-PSSession -ComputerName "Computer" 
Invoke-Command -Session $myses -ScriptBlock {
#finds all instances of Java installed
$find_sep = gwmi win32_product -filter "Name LIKE '%Java%'" | select -ExpandProperty IdentifyingNumber
foreach($i in $find_sep){
msiexec.exe /x $i /qn /passive /l*v! c:\uninst.log
 }
}