如何从以本地系统运行的服务中获取以用户运行的Windows 7应用程序的MainWindowHandle?

| 我已经创建了一个以“本地系统”用户身份运行的服务。此服务使用本机互操作和CreateProcessAsUser()方法启动和监视Silverlight浏览器外应用程序(以当前登录用户(而不是本地系统)的身份运行它)。我可以在生成的Process上获取句柄,并执行类似Kill()的操作,但是,我知道该服务无法获取子应用程序主窗口的句柄,因为子应用程序以其他用户身份运行。我正在Windows 7上运行。 我的最终目标是对Process停止响应的时间做出正确响应(即Process.Responding == false),以便我可以终止该应用程序并重新启动它。但是,Process.Responding需要处理主窗口的句柄(确切地说是Process.MainWindowHandle),但是,在这种情况下,Process.MainWindowHandle始终返回0。 我被困在这里。在Win 7中,一个用户有什么方法可以获取以另一个用户身份运行的进程的窗口句柄? 在此先感谢您提供的所有帮助。     
已邀请:
不,那是不可能的。出于安全原因,Windows服务与用户模式应用程序完全隔离。如果您可以获取窗口的句柄,则可以操纵该窗口并与之交互,从而留下一个巨大的安全漏洞。 更多信息请点击这里: 引发Timer事件时,Windows Service如何启动进程? 如何使用C#从Windows服务运行EXE程序? Windows服务(允许与桌面交互的服务) 需要建议用不可见的WinForm应用程序替换Windows Service 严格来说,您最初使用Windows Service的目的是设计不良。它不应该创建或启动任何用户模式的进程,也不应该以任何方式与用户交互。请记住,即使没有用户登录,服务也会运行!因此,他们不应该启动应用程序。 更好的解决方案是一个简单的后台应用程序,该后台应用程序设置为在用户登录时自动启动。然后,该后台应用程序可以启动Silverlight应用程序,监视其状态并根据需要与之交互,因为这两个应用程序都将在以下情况下运行:相同的本地用户帐户。效果类似于服务,但没有隔离的任何缺点。在Visual Studio中执行此操作的最简单方法是创建一个WinForms应用程序(或者可能是WPF应用程序,我在该领域经验较少),该应用程序根本不显示任何窗体/窗口。     

要回复问题请先登录注册