Processクラスの問題

System.Diagnostics.Process[] ps;
ps = System.Diagnostics.Process.GetProcessesByName( "xxx" );

とコーディングし実行すると特定の環境で、以下のエラーが表示される場合があります。

                                                    • -
                                                    • -

System.InvalidOperationException: プロセス パフォーマンス カウンタは無効にされているため、要求された情報を実行できません。
at System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library)
at System.Diagnostics.NtProcessManager.GetProcessInfos(String machineName, Boolean isRemoteMachine)
at System.Diagnostics.ProcessManager.GetProcessInfos(String machineName)
at System.Diagnostics.Process.GetProcessesByName(String processName, String machineName)
at System.Diagnostics.Process.GetProcessesByName(String processName)
at cstest.Form1.buttonShow_Click(Object sender, EventArgs e) in d:\src\cstest\cstest\cstest\form1.cs:line 116

                                                    • -

OK

                                                    • -

原因としては特定のレジストリの記述があると上記の現象が発生します。


「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance」
レジストリキー内の「Disable Performance Counters」の値です。
この値が
1になっていると、パフォーマンスカウンタが無効になりエラーが発生するよう
です。
この値を0に修正すると問題が解決します。

とあります。

[このサイトを参考にしました]
・[PRB] パフォーマンス モニタにパフォーマンス オブジェクトが表示されない
http://support.microsoft.com/default.aspx?scid=kb;ja;248993
Service Pack 3 適用後、いくつかのカウンタでパフォーマンスデータの収集が出来なくなるhttp://support.microsoft.com/default.aspx?scid=kb;ja;JP436445

この問題はWindow2000Sp3以降。つまりXPでも発生します。
WindowsXPSp2でこの現象を確認しました。

解決策としては、このコーディングの直前にレジストリを編集する方法もありますが、コーディングの最中にレジストリを編集するというのもあまりよい方法ではありません。
基本的には別のコーディングで回避するようにしましょう。

多重起動のチェックであれば、mutexを使用して、プロセスIDの取得であれば、APIを使用して回避するのがベターです。

APIのクラスについては別途まとめる。