Invoke-command and msiexec



我正在尝试使用Invoke-Command CMDLET在远程计算机上删除应用程序,但它不起作用。

这是我的脚本:

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

在这种情况下是否有可靠的,有效的替代方案?

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

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

如果您有几台计算机可以使用,则可以将其放入foreach循环中。如果您具有WMI中列出的名称,识别名称和版本,则可以在以下上下文中更快(使用AT& t Connect参与者应用程序v9.0.82):

$App="IdentifyingNumber=`"`{1F3A6960-8470-4C84-820C-EBFFAF4DA580`}`",Name=`"AT&T Connect Participant Application v9.0.82`",version=`"9.0.82`""
([WMI]\ComputerNamerootcimv2: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

也可以与名称一起使用,甚至可以通过将过滤器更改为``{'%at& t connect%'}之类的东西,或者您可以查询WMI以列出所有通过其离开的应用程序 - 滤波器完全关闭,尽管您可能想将其置于格式化桌子以使其可读。我用过:

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

可以在此链接

找到有关此信息的更多信息,其中包含更多信息。

这是我提出的解决方案

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

最新更新