2

この 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 秒の間で異なります。

  • procmonHKLM\System\CurrentControlSet\Control\Session Manager\Environmentは、やなどのキーに対する一連のレジストリ読み取りを示していますHKCU\Volatile Environment、ネットワーク アクティビティはありません

  • ドメイン ワークステーション上のドメイン コントローラへのアクセスは、呼び出しの長さに違いがないように見えます。

  • perfmonCPU 使用率はほとんどまたはまったく示さず、最初と最後の I/O スパイクのみが表示されます。

    パフォーマンス グラフ

    この例のCreateEnvironmentBlock呼び出しには約 12 秒かかりました。

  • MSDN のドキュメントでは、 への呼び出しはユーザーのプロファイルを読み込まCreateEnvironmentBlockないと推測してます (また、ユーザーはすでにログインしているため、プロファイルを読み込む必要があります)。

    %USERPROFILE% などのユーザー固有の環境変数は、ユーザーのプロファイルが読み込まれるときにのみ設定されます。ユーザーのプロファイルを読み込むには、LoadUserProfile 関数を呼び出します。

4

1 に答える 1

0

別のユーザーの環境ブロックを作成するには、そのユーザーのプロファイルを読み込む必要があるためです。ドメイン制御されたマシンを使用している場合、ネットワーク上の Active Directory マシンと通信してプロファイルをダウンロードする必要があるため、これは 2 倍遅くなります。

于 2012-04-23T00:32:13.363 に答える