曾几何时,服务里面弹出一个窗口到桌面上不再是那么地容易了:以前只要把服务设置为允许和桌面交互就可以直接在服务启动的时候,把一个窗口弹给用户。但是现在在vista(其它的OS 下没有测试,未知)下要弹出这样的窗体,首先会弹出一个提示框提示是否接否一个服务弹出来的消息,点接受后,才会在一个全灰的桌面里面弹出这个窗口。不用想,这样的用户体验,肯定是会被直接PASS。原因很简单,因为不同的用户间的桌面是不一样的,服务用的是System的权限,在vista里面是Session0,而用户的帐户不是这个(肯定大于0)。
看来,想弹出一个窗体,需要另一个程序来作辅助了。解决方案有两种:
现在来看看第二种方案,要想用CreateProcessAsUser这个API ,有这样几个步骤:
1.取得用户的令牌(Token)
2.指定好虚拟桌面
3.调用API创建这个用户进程。
在取得用户令牌的时候,又有几个方法:
1.从用户的进程上去剥
2.先用WTSGetActiveConsoleSessionId得到用户会话ID,再用WTSQueryUserToken这个API去取。
不过在vista下面,服务里面的WTSGetActiveConsoleSessionId这个API得到的总是0,也就是Session0,用这个创建出来的进程,还是属于一个服务进程。(而且这个API是XP以及以后的系统才会提供的,在早点的系统上就会调用失败)所以我们只好从用户的进程上去找,用户登录的时候,一定会有的进程就是:explorer.exe,这样可以遍历所有的进程去找到这个(如果是多人同时登录这个系统里,我也不知道该怎么办了,不知道有没有高人指点一下)。
这样创建出来的用户进程,在进程列表里面可以看到是活动用户的。但是如果在这里面使用一下文件选择框,或是去取一些系统目录,比如说用户的桌面,用户的收藏夹等,都会得到空。这时候因为没有指定用户环境造成的。使用CreateEnvironmentBlock这个API就可以搞定了。
Other Posts:
>>每个分类取最新的几条的SQL实现
>>4月28日链接篇: ASP.NET, ASP.NET AJAX, ASP.NET MVC, Silverlight
>>Silverlight FlickR 示例
>>InfoQ 采访:框架设计工作室(Framework Design Studio)发布了
>>ASP.NET动态数据的更新发布了
>>在代码图库(Code Gallery)中访问热修复程序(Hotfix)
>>Mesh it Up!
>>我在奥兰多ASP.NET Connections大会上做的讲座的讲义
>>使用IronRuby定义asp.net mvc路由和视图
>>【编程游戏】划拳机器人比赛
>>帮助你开发全球化的应用程序
>>Visual C++ 2008功能包发布
Month Archives:
Top Tags:
Company & Product Profiles Google Internet Technology Search feature Business and Technology Web2.0 column analysis 服务介绍 application letter comment 业界信息 news Startups deal China2.0 Search Headlines 產業策進 未來趨勢 創投 Social Network widget 創業案例 news_in 业界动态 Google/SEO SEW Experts Web 2.0 News & Ideas
@2007 All rights Reserved |