我有一个简单的问题让我发疯。
我有一个用 C# 编写的 Windows 服务,它应该在 XP、Vista 和 7 上运行,并且能够枚举当前用户桌面的窗口(如果有)以进行监控。
So far :
我用过EnumDesktopWindows
通过IntPtr.Zero
as the hdesktop
参数,因为我没有用户桌面的句柄,这只会导致枚举分配给服务的特殊桌面中存在的少数窗口(Session0\Winsta0)
I tried EnumWindows
,结果与上面相同!
我尝试使用获取已知进程的桌面GetThreadDesktop
API,传递了 explorer.exe 线程之一的 id,但它返回 0,所以我无法获取它的桌面或任何其他桌面。
我尝试使用输入桌面OpenInputDesktop
这显然返回 session0 内的桌面而不是用户的桌面。
我能做些什么?!
如果您好奇,我正在编写一个信息亭应用程序,它需要监视所有窗口并防止危险的窗口,例如任务管理器、Internet 选项、Cmd 以及一般用户不应打开的任何内容。
欢迎任何建议。 :)
无一例外,您不能枚举另一个会话中的窗口。另一方面,如果您具有“充当操作系统的一部分”(SeTcbPrivilege
) 特权。
See 从服务在用户会话中启动进程 https://stackoverflow.com/questions/3128017/possible-to-launch-a-process-in-a-users-session-from-a-service如何做到这一点。
您最终可能会得到两个进程,一个作为 NT 服务运行的控制器,一个在用户会话中运行的代理。这两个进程可以通过命名管道进行通信,如果被用户终止,控制器将重新启动代理。
但是,您还应该使用组策略或其他配置来锁定客户端,以防止其他窗口打开。具体来说,软件限制策略 http://technet.microsoft.com/en-us/library/cc786941%28v=ws.10%29.aspx将允许您阻止非白名单可执行文件运行。
如果您使用的是Windows 8.1,还可以使用新推出的信息亭模式 http://blogs.msdn.com/b/hyperyash/archive/2013/10/25/enable-kiosk-mode-in-windows-8-1.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)