首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Invoke-command和msiexec

Invoke-command和msiexec
EN

Stack Overflow用户
提问于 2014-03-08 02:16:23
回答 2查看 6.2K关注 0票数 2

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

下面是我的脚本:

代码语言:javascript
复制
  Invoke-Command -ComputerName "Computername" -Verbose -ScriptBlock {
  msiexec.exe /x '{4ADBF5BE-7CAF-4193-A1F9-AM6820E68569}' /qn /passive
  }

在这种情况下,有没有什么可靠的、有效的替代方案?

EN

回答 2

Stack Overflow用户

发布于 2014-03-08 04:53:19

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

代码语言:javascript
复制
(Get-WmiObject -Class Win32_product -ComputerName ComputerName -Filter {IdentifyingNumber LIKE '{4ADBF5BE-7CAF-4193-A1F9-AM6820E68569}'}).uninstall()

此外,如果您有多台计算机可以执行此操作,则可以将其放入ForEach循环中。如果您在WMI中列出了名称、IdentifyingNumber和版本,则可以通过以下上下文(使用AT&T Connect Participant Application v9.0.82)使其更快:

代码语言:javascript
复制
$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()方法,就可以获得所有这些信息,所以……

代码语言:javascript
复制
Get-WmiObject -Class Win32_product -ComputerName RemoteComputer -Filter {IdentifyingNumber LIKE '{1F3A6960-8470-4C84-820C-EBFFAF4DA580}'}

将返回类似如下的内容:

代码语言:javascript
复制
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%'}的形式来与名称甚至部分名称一起使用,或者您可以通过完全关闭-Filter来查询WMI以列出所有注册到它的应用程序,尽管您可能希望通过管道将其传递到Format-Table以使其可读。我使用:

代码语言:javascript
复制
gwmi -class win32_product -computername RemoteComputer|ft IdentifyingNumber,Name,Version

有关这方面的更多信息,可以在此link上找到一篇很好的文章

票数 3
EN

Stack Overflow用户

发布于 2014-03-08 05:12:43

这是我想出的解决方案

代码语言:javascript
复制
$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
 }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22257663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档