在线笔记
全部博文(596)
分类: Windows平台
2013-12-30 17:37:52
转载请标明是引用于 http://blog.csdn.net/chenyujing1234
欢迎大家拍砖
在我们编写远程控制软件的时候,我们会发现要想解锁server端我们就得发送这三个键的虚拟。
下面我说一下解决过程:
发现只能模拟ctrl+alt两个键的效果,然而其他的两个键的都可以模拟比如win+d。不知道是不是keybd_event()只能模拟两键还是因为
ctrl+alt+delete的特殊性,望高手告之,在此谢过。
但是在winNT以后的系统里我们还有很多事情要做,比如:OpenDesktop()、OpenInputDesktop()、 GetThreadDesktop()、SetThreadDesktop()、CloseDesktop()、 GetUserObjectInformation()
代码如下:
偶一开始试验了发现不成功,后来冰河大哥告诉我说OpenDesktop("Winlogon", ......)本身需要LocalSystem权限,
果然如此,把它注册成服务,然后效果实现。相信如何注册成服务不用我说了吧。ok,我们想要的功能实现了。
参考:
可能原因:
(1)windows7 安全要求高;
(2)我写测试代码检查了下发现:
WTSGetActiveConsoleSessionId返回值和ProcessIdToSessionId(GetCurrentProcessId(),&sessionid)后的sessionid值不相等,请问列林大神,我要怎么做呢?
(3)
可能解决方法:
(1)使用服务方式运行
关闭WIN7 UAC
(2)DuplicateToken,SetTokenInformation,把token的sessionid设置为WTSGetActiveConsoleSessionId,再使用CreateProcessAsUser创建进程
(3)XP下面服务session跟第一个用户在同一个,Win7中服务有自己独立的session 0,用户session从1开始
使用WinObj工具我们可以看到XP下只有会话0,而Win7下有两个会话0、1:
再具体一点,我们通过任务栏管理器,我们来看一下各进程运行的会话情况:
(使用任务栏管理器时先把会话ID勾起来:查看->选择列)
从下图可以看出winlogon.exe在XP下是运行在会话0中,且所有的进程都是在0中;(除非是用RDP登录的才是新的会话)
而在Win7下winlogon.exe却运行在会话1中。
总结:现在终于明白为什么在XP下可以模拟的组合键,在Win7下却没作用。
其实整个代码没有错,错在PostMessage消息的进程运行在会话0,而接收解锁序列ATL+CTRL+DEL的进程winlogon.exe运行在会话1。
而窗口消息是不能在不同的会话间传递的。
WIN7下服务程序与一般应用程序位于不用的会话层,以下那几种方式能实现他们直接的通信?
1.窗口消息(COPYDATA)
2.管道
3.SOCKET
4.内存映射
5.剪贴板
===========================================================================================================
以上方法中2、3、4是可行的。
在WIN7中虽然把发送窗口消息放到了winlogon.exe里,但还是没有效果,这是因为Win7下的Winlogon没有SAS窗口(参考看雪网文章《》),
后来经网友介绍去查看TightVNC服务端源码,找到了实现方法:
参考文章《VNC源码研究(十)XP、Win7实现模拟发送ATL+CTRL+DEL》
Dos下键盘的完全控制 ------- 一系列的BIOS级别的键盘控制函数!
http://dev.csdn.net/develop/article/7/7181.shtm
我没有试验,不知道可否,哪位大哥试验后告诉我一声
在此再次感谢黄鑫大哥!!