2

Invoke-Commandコマンドレット を使用してリモート マシン上のアプリケーションを削除しようとしていますが、機能しません。

これが私のスクリプトです:

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

このコンテキストで、信頼できる有効な代替手段はありますか?

4

2 に答える 2

3

これは Invoke-Command や MSIExec を使用しませんが、WMI に登録されたもの (msiexec を介してインストールされたもの) に対して、WMI を使用してリモート マシン上のアプリケーションを削除するための機能的なアンインストール方法です。

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

さらに、複数のコンピューターで実行する場合は、ForEach ループに入れることができます。Name、IdentifyNumber、および Version が WMI にリストされている場合は、次のコンテキストを使用して大幅に高速化できます (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 が文字列を中かっこや二重引用符などでフォーマットする必要があるためです。これは、すべての情報を前もって取得し、キー文字列をフォーマットする必要があるため、1 回のアンインストールではまったく役に立ちません。ただし、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%'} のようなものに変更することで、名前または部分的な名前で使用することもできます。または、-Filter を完全にオフのままにすることで、WMI にクエリを実行して、登録されているすべてのアプリケーションを一覧表示することもできます。 、おそらくそれを Format-Table にパイプして読み取り可能にしたいでしょう。私が使用した:

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

これに関する詳細については、このリンクを参照してください。

于 2014-03-07T20:53:18.657 に答える
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
 }
}
于 2014-03-07T21:12:42.543 に答える