天天看点

穿透Session 0 隔离(二) WTSSendMessage 函数 CreateProcessAsUser 函数参考资料代码下载

     对于简单的交互,服务可以通过WTSSendMessage 函数,在用户Session 上显示消息窗口。对于一些复杂的UI 交互,必须调用CreateProcessAsUser或其他方法(WCF、.NET远程处理等)进行跨Session 通信,在桌面用户上创建一个应用程序界面。

     在ShowMessageBox 函数中调用了WTSSendMessage 来发送信息窗口,这样我们就可以在Service 的OnStart 函数中使用,打开Service1.cs 加入下面代码:

<a href="http://11011.net/software/vspaste"></a>

     编译程序后在服务管理器中重新启动AlertService 服务,从下图中可以看到消息窗口是在当前用户桌面显示的,而不是Session 0 中。

     如果想通过服务向桌面用户Session 创建一个复杂UI 程序界面,则需要使用CreateProcessAsUser 函数为用户创建一个新进程用来运行相应的程序。打开Interop 类继续添加下面代码:

     在CreateProcess 函数中同时也涉及到DuplicateTokenEx、WTSQueryUserToken、CreateEnvironmentBlock 函数的使用,有兴趣的朋友可通过MSDN 进行学习。完成CreateProcess 函数创建后,就可以真正的通过它来调用应用程序了,回到Service1.cs 修改一下OnStart 我们来打开一个CMD 窗口。如下代码:

     重新编译程序,启动AlertService 服务便可看到下图界面。至此,我们已经可以通过一些简单的方法对Session 0 隔离问题进行解决。大家也可以通过WCF 等技术完成一些更复杂的跨Session 通信方式,实现在Windows 7 及Vista 系统中服务与桌面用户的交互操作。

1. WTSSendMessage Function 

<a href="http://msdn.microsoft.com/en-us/library/aa383842(VS.85).aspx">http://msdn.microsoft.com/en-us/library/aa383842(VS.85).aspx</a>

2. CreateProcessAsUser Function 

<a href="http://msdn.microsoft.com/en-us/library/ms682429(v=VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms682429(v=VS.85).aspx</a>

3. WTSSendMessage (wtsapi32) 

<a href="http://www.pinvoke.net/default.aspx/wtsapi32/WTSSendMessage.html">http://www.pinvoke.net/default.aspx/wtsapi32/WTSSendMessage.html</a>

4. WTSQueryUserToken Function 

<a href="http://msdn.microsoft.com/en-us/library/aa383840(VS.85).aspx">http://msdn.microsoft.com/en-us/library/aa383840(VS.85).aspx</a>

本文转自Gnie博客园博客,原文链接:http://www.cnblogs.com/gnielee/archive/2010/04/08/session0-isolation-part2.html,如需转载请自行联系原作者

继续阅读