0

次のコードを実行すると、GetWindowThreadProcessId0 が返されます。 serviceで同じ問題が発生しているという記事を読みましたが、このコードは IIS のアプリケーション プール (つまり、w3wp.exe) として実行されています。また、w3wp.exe と、それが強制終了しようとしている EXCEL.EXE の両方が、同じセッション (セッション 0) で、同じユーザーとして実行されています。

if (appClassXls != null)
{
    IntPtr processId = default(IntPtr);
    GetWindowThreadProcessId(appClassXls.Hwnd, out processId);
    Process processXls = Process.GetProcessById(processId.ToInt32());
    if (processXls != null)
    {
        processXls.Kill();
    }
}

このコードは、強制終了しようとしている Excel アプリケーション インスタンスではなく、システム アイドル プロセスである pid 0 を強制終了しようとするため、明らかに失敗します。GetWindowThreadProcessId同じユーザーと同じセッションで w3wp.exe から呼び出されたときに 0が返されるのはなぜですか? そして、正しいpidを返すようにするにはどうすればよいですか?

Windows Server 2008 R2 Standard (64 ビット) IIS 7.5 .NET Framework v4.0 Microsoft Office Professional Plus 2010 (クリーン インストール、DCOM 設定で特定のユーザーとして起動するように設定、w3wp.exe で起動)

更新 (2011-02-17 08:33 UTC): w3wp.exe は、「World Wide Web Publishing Service」および「Windows Process Activation Service」に対応する「svchost.exe -k iissvcs」によって起動されることに気付きました。 EXCEL.EXE は、「DCOM Server Process Launcher」に対応する「svchost.exe -k DcomLaunch」によって起動されます。この 3 つすべてがサービスです。ただし、両方の svchost.exe はセッション 0 で SYSTEM として実行されているため、それらまたはその子が相互にアクセスできない理由はまだわかりません。

4

1 に答える 1