【问题标题】:Why does GetWindowThreadProcessId return 0 when called from w3wp.exe为什么从 w3wp.exe 调用 GetWindowThreadProcessId 返回 0
【发布时间】:2011-02-17 03:31:09
【问题描述】:

运行以下代码时,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 应用程序实例。为什么GetWindowThreadProcessId 在与同一用户在同一会话中从 w3wp.exe 调用时返回 0?以及如何让它返回正确的 pid?

Windows Server 2008 R2 标准版(64 位) IIS 7.5 .NET 框架 v4.0 Microsoft Office Professional Plus 2010(全新安装,设置为在 DCOM 设置中以特定用户身份启动,由 w3wp.exe 启动)

更新(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 身份运行,所以我仍然不明白为什么他们或他们的孩子会在相互访问时遇到问题。

【问题讨论】:

  • 鉴于您试图杀死的进程是无头的,我不明白为什么这会起作用。
  • 你能看到 appClassXls.Hwnd 是什么吗?
  • GetWindowThreadProcessId 是否返回有效的线程 ID?如果没有,也许 appClassXls.Hwnd 有问题
  • @OJ 为什么不能杀死一个无头进程?
  • @OJ、Winston 和 Ken:完全相同的代码适用于具有相同操作系统的其他机器,因此逻辑应该没问题。这更有可能是配置问题。

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


【解决方案1】:

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

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

【讨论】:

  • 是的,您正确地假设 w3wp 启动了 excel。但是,如果“每个会话都与自己的交互式窗口站相关联”(msdn.microsoft.com/en-us/library/ms687096%28v=vs.85%29.aspx) 并且 w3wp.exe 和 EXCEL.EXE 都在会话 0 中,则它们应该共享同一个窗口站。此外,w3wp.exe 不是服务,是吗?服务与我的问题有关吗?附言感谢您的建议,我知道从 Web 应用程序启动 excel 的风险并且 Microsoft 不支持它。不幸的是,这对我来说是目前最好的选择。虽然适当地注意到 =)
  • 您是否在系统上正确获取了窗口句柄?如果它在其他机器上工作,这可能是一个权限问题。
  • appClassXls.Hwnd 是 131802... 看起来有效。有什么想法吗?
  • 另外,启动用户是一个完全成熟的管理员,UAC 已关闭,所以我不知道权限问题可能是什么
  • w3wp 是否以同一用户身份运行(即您是否将应用程序池的网络服务中的用户更改为特定用户?)并且 excel.exe 是否设置为在“启动用户”?只要确保这些是有效的。如果这些都是正确的,您能否使用不同的方法(GetProcessByName)并查看是否得到不同的结果。如果您尝试过这些,我深表歉意。 :)
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 2011-07-01
相关资源
最近更新 更多