从w3wp.exe调用时,为什么GetWindowThreadProcessId返回0

时间:2011-02-17 03:31:09

标签: c# .net-4.0 iis-7.5 windows-server-2008-r2 excel-2010

运行以下代码时,GetWindowThreadProcessId返回0.我读过the same problem happening with a 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();
    }
}

显然这段代码失败了,因为它会尝试杀死pid 0,这是系统空闲进程而不是它试图杀死的Excel应用程序实例。在同一个用户的同一会话中从w3wp.exe调用时,为什么GetWindowThreadProcessId会返回0?如何让它返回正确的pid?

Windows Server 2008 R2 Standard(64位) IIS 7.5 .NET Framework v4.0 Microsoft Office Professional Plus 2010(全新安装,设置为在DCOM设置中作为特定用户启动,由w3wp.exe启动)

UPDATE(2011-02-17 08:33 UTC): 我刚刚意识到w3wp.exe是由“svchost.exe -k iissvcs”启动的,它对应于“万维网发布服务”和“Windows进程激活服务”,EXCEL.EXE由“svchost.exe -k”启动DcomLaunch“对应于”DCOM Server Process Launcher“,其中所有3个都是服务。两个svchost.exe都在会话0中作为SYSTEM运行,所以我仍然不明白为什么他们或他们的孩子在访问对方时会遇到麻烦。

1 个答案:

答案 0 :(得分:1)

请参阅此blog entry,其中介绍了Session 0隔离的工作原理。看起来服务和应用程序无法相互通信。我想弄清楚如何分配“会话0”。我相信分配给w3wp的窗口站与它启动的excel(我假设)不一样。

我建议避免从Web应用程序启动excel。您可以轻松地挂起服务器。我记得有几个问题是由于excel上的引用计数泄漏导致内存问题导致服务器终止。 :)