この CodeProject ページProcessStarter
のC# クラスを使用して、Windows サービス内から対話型ユーザーとしてプロセスを開始しました。
(Win7 と XP の両方を実行している ~50 台の異なるコンピューターでコードをテストした後) CreateEnvironmentBlock
(Run
メソッド内で) への P/Invoke 呼び出しが返されるまでに最大 30 秒かかる場合があることに気付きました (高速な場合もあれば、そうでない場合もあります)。 .
他の誰かがこの問題を抱えているのを見ましたが、エラーが発生していました (私にとっては常に機能します)。
CreateEnvironmentBlock
通話に時間がかかるのはなぜですか?
P/Invoke 宣言:
[DllImport("userenv.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool CreateEnvironmentBlock(out IntPtr lpEnvironment, IntPtr hToken, bool bInherit);
CreateEnvironmentBlock
電話:
IntPtr lpEnvironment = IntPtr.Zero;
bool resultEnv = CreateEnvironmentBlock(out lpEnvironment, primaryToken, false);
編集:追加情報:
常に30 秒であるとは限りません。(コンピューターによって) 数秒から 30 秒の間で異なります。
procmon
HKLM\System\CurrentControlSet\Control\Session Manager\Environment
は、やなどのキーに対する一連のレジストリ読み取りを示していますHKCU\Volatile Environment
が、ネットワーク アクティビティはありません。ドメイン ワークステーション上のドメイン コントローラへのアクセスは、呼び出しの長さに違いがないように見えます。
perfmon
CPU 使用率はほとんどまたはまったく示さず、最初と最後の I/O スパイクのみが表示されます。この例の
CreateEnvironmentBlock
呼び出しには約 12 秒かかりました。MSDN のドキュメントでは、 への呼び出しはユーザーのプロファイルを読み込ま
CreateEnvironmentBlock
ないと推測しています (また、ユーザーはすでにログインしているため、プロファイルを読み込む必要があります)。%USERPROFILE% などのユーザー固有の環境変数は、ユーザーのプロファイルが読み込まれるときにのみ設定されます。ユーザーのプロファイルを読み込むには、LoadUserProfile 関数を呼び出します。