2

わかりました、私はこれを理解しようとしましたが、インターウェブに尋ねる時が来たと考えました. これはバグなのか何なのか気になります。

複数のコンピューターに対してジョブを開始して、それらに存在するデータベース名を特定しようとしています。

私のコンピュータ 1 のシステム セットアップは次のとおりです。Powershell 2.0、Windows 2k3 Enterprise x64

Computer1 で次を実行できます。

Start-Job -scriptblock {gwmi -query "select * from win32_computersystem" -ComputerName "Computer2"}

そして、ジョブは永久に「実行中」の状態でスタックします。しかし、シェルのジョブのスクリプト ブロックの外で同じコマンドを実行した場合はそうではありません。

ここで、ローカル管理者の(対私のドメイン)資格情報を使用してこの正確なセットアップを試しましたが、同じ結果になりました。何らかの理由でうまくいきません。

gwmi を使用しないカスタム WMI dotnet オブジェクトを作成しようとしましたが、同じ結果が得られました。

-asjob パラメータ?: これは解決策ではありません。

  1. このパラメーターを使用すると、12 GB のシステムで約 2 GB のメモリを使用すると、powershell ウィンドウがクラッシュします。一方、start-job は 12GB まで問題なく使用できます。すべてのクエリをシリアルに実行することもできます。

  2. また、Gwmi で -Asjob パラメーターを使用するとメモリが再利用されないため、それ以上ジョブを続行できません。「remove-job * -force」または「[GC]::Collect()」を実行した後でも、powershell.exe のメモリ消費量は頑固に変わりません (これも start-job とは異なります)。

  3. SQL インスタンス名が異なるため、wmi クラス名も異なります。したがって、複数のクラスに対して複数のクエリ コマンドを実行する必要があります。技術的には実行可能ですが、より複雑で、上記のメモリ要件を考えると、2 GB に制限されます。誰かが start-job を本来のように機能させる方法を知っていることを願っています。

私が試していない唯一のことは、権限パラメーターを指定する必要があるのでしょうか?

4

1 に答える 1

0

これには Invoke-Command -asJob を使用します。

PS C:\> Invoke-Command -ComputerName "WM2008R2ENT" -ScriptBlock {gwmi -query "select * from win32_computesystem"} -AsJob

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
1               Job1            Running    True            wm2008r2ent          gwmi -query "select * ...


PS C:\> Get-Job

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
1               Job1            Completed  True            wm2008r2ent          gwmi -query "select * ...


PS C:\Développements> Receive-Job 1


Domain              : dom.fr
Manufacturer        : VMware, Inc.
Model               : VMware Virtual Platform
Name                : WM2008R2ENT
PrimaryOwnerName    : Utilisateur Windows
TotalPhysicalMemory : 683139072
PSComputerName      : wm2008r2ent

マシン名をマシンのリストに置き換えることができます。スクリプト ブロックで使用している CmdLets で '-Computername' を再度コーディングしないでください。


(編集済み)コマンドラインを試してみると、クライアントのWindows Seven(64ビット)からW2K3(32ビット)まで動作します

私のクライアントはサーバーのドメインに属しておらず、ドメイン管理者の資格情報を使用しています。

32 ビット Powershell または 64 ビット Powershell からテストを行いましたか?

リモート マシンで WMI サービスを停止し、WMI データベースをクリーンアップしようとしますか。これは、WMI サーバーで (たとえば、イベントを使用して) あまりにも多くのテストを行った場合に適しています。

于 2011-07-20T13:59:28.767 に答える