我正在尝试使用Invoke-Command
cmdlet删除远程计算机上的应用程序,但它无法正常工作。
这是我的剧本:
Invoke-Command -ComputerName "Computername" -Verbose -ScriptBlock {
msiexec.exe /x '{4ADBF5BE-7CAF-4193-A1F9-AM6820E68569}' /qn /passive
}
在这种背景下是否有可靠的,可行的替代方案?
答案 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
}
}