如何从作为本地系统运行的服务中获取作为用户<foo>运行的Windows 7应用程序的MainWindowHandle?</foo>

时间:2011-04-18 04:43:21

标签: c# windows windows-services pinvoke hwnd

我创建了一个以本地系统用户身份运行的服务。此服务使用本机互操作和CreateProcessAsUser()方法启动并监视Silverlight Out-of-browser应用程序(将其作为当前登录用户运行,而不是本地系统)。我能够处理生成的进程并执行像Kill()这样的操作,但是,我已经意识到该服务无法获取子应用程序主窗口的句柄,因为子应用程序是以不同的用户身份运行。我在Windows 7上运行。

我的最终目标是正确响应进程何时停止响应(即Process.Responding == false),以便我可以终止应用程序并重新启动它。但是,Process.Responding需要一个句柄来处理进程的主窗口(确切地说是Process.MainWindowHandle),但是,在这种情况下,Process.MainWindowHandle总是返回0.。

我在这里难过。有没有办法让一个用户获得一个窗口句柄来处理在Win 7中作为另一个用户运行的进程?

提前感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。出于安全原因,Windows服务完全与用户模式应用程序隔离。如果您可以获得窗口的句柄,您可以操纵并以其他方式与该窗口交互,从而留下巨大的安全漏洞。

更多信息请点击此处:

严格地说,您在第一个位置使用Windows服务的是糟糕的设计。它不应该创建或启动任何用户模式进程,或以任何方式与用户交互。请记住,即使没有用户登录,服务也会运行!因此,他们不应该开始申请。

更好的解决方案是一个简单的后台应用程序,设置为在用户登录时自动启动。然后,该后台应用程序可以启动Silverlight应用程序,监视其状态,并在必要时与其进行交互,因为两者都将在同一本地用户帐户的上下文。效果类似于服务,但没有任何隔离的缺点。在Visual Studio中执行此操作的最简单方法是创建一个WinForms应用程序(或者可能是WPF应用程序,我在该区域的经验较少),它不会显示任何窗体/窗口。