kkamegawa's weblog

Visual Studio,TFS,ALM関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

リモート起動のプロセスは資源が制限されている

strComputer = "atl-ws-01"
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
errReturn = objWMIService.Create _
    ("calc.exe", Null, Null, intProcessID)

Microsoft スクリプト センター | TechNetより
このコードでリモートから電卓が起動します(フォアグラウンドには表示されません)。ところが、WMI経由でのリモート起動ではQuotaがかかっており、無制限にプロセスを起動したり、大きなメモリを使うプロセスが起動できないという仕様になっています。WMIではこのクラス。
__ProviderHostQuotaConfiguration class (Windows)
これはWMIのroot名前空間に格納されています。x86でもx64でも変わらないようです(Windows Server 2003 R2 x64 Enterpriseで確認)。

メンバ 説明 上限
ThreadsPerHost プロセス単位のスレッド数上限 256
HandlesPerHost プロセス単位のハンドル数上限 4096
ProcessLimitAllHosts プロセス数上限 32
MemoryPerHost プロセス単位のメモリ上限 134217728
MemoryAllHosts 全体でのメモリ上限 1073741824

WMIなので、一応変更もできます。VBScriptでもできますが、wbemtestというツールがWindowsに付属しているので、それでやるのが楽でしょう。

  • コマンドプロンプトからwbemtestを起動
  • "root"名前空間に接続("root\default"ではない)
  • インスタンスを開く」を選択
  • 「オブジェクトパス」に"__ProviderHostQuotaConfiguration=@"と入力
  • 一覧に出ているけど、「ローカルのみ」のチェックを入れると上記のメンバだけ表示されます。
  • 「プロパティの編集」で値を変更したら好きな値に代えられます。ただし、小さくしすぎるとWMI自身が動かなくなるので気をつけましょう。もちろん大きくしすぎてもNG。
  • OSを再起動しましょう。

もちろん、やる前にはバックアップを忘れずに。WMI経由のリモートプロセス起動で「メモリ不足です」というエラーをWindowsが返してきたけど、ローカル起動できる場合、まずこれを疑ってみてください。ちなみにパフォーマンスモニタのprivate bytesでいいようです。