1

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

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

我被难住了。有没有办法让一个用户在 Win 7 中获得作为另一个用户运行的进程的窗口句柄?

提前感谢您的任何帮助。

4

1 回答 1

2

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

更多信息请点击这里:

严格来说,您首先使用 Windows 服务的目的是糟糕的设计。它不应该创建或启动任何用户模式进程,或以任何方式与用户交互。请记住,即使没有用户登录,服务也会运行!因此,他们不应该启动应用程序。

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

于 2011-04-18T04:50:13.600 回答