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でいいようです。