经过近三周的研究,终于实现了windows桌面锁定后的自动登录。可以说实现这个功能还是挺复杂的,用到的主要技术包括windows服务启动程序,桌面的自动化技术、还有管道通信等等

代码主要用到三个模块,windows服务启动程序模块,自动登录程序模块,和主程序模块,主程序模块用于监视windows桌面的锁定状态,然后通过管道通信通知windows服务去启动自动登录程序,自动登录程序获取到windows登录desktop对象,然后利用uiautomation技术实现自动登录

这里面为什么要用windows服务去启动登录程序?主程序不直接启动登录程序?因为使用windows服务去启动进程,进程可以获取到system权限,system是最大的权限,进程只有获取到system权限才可以获取windows登录桌面对象。

现在贴上部分核心代码仅供参考

windows服务

   protected override void OnStart(string[] args){thread = new Thread(() =>{string currentUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;while (true){using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("autologonpipe", PipeDirection.InOut)){pipeServer.WaitForConnection();//等待连接,程序会阻塞在此处,直到有一个连接到达try{using (StreamReader sr = new StreamReader(pipeServer)){var codeExec = sr.ReadLine();Helper.RespawnInActiveTerminalSession(codeExec);}}catch (Exception ex){using (StreamWriter writer = new StreamWriter(logTxt, true)){writer.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + ex.Message);}}}}});thread.IsBackground = true;thread.Start();}

windows服务将通过管道监听命令,收到命令后启动自动登录程序。

 public static void RespawnInActiveTerminalSession(string exepath){IntPtr token = IntPtr.Zero;IntPtr newToken = IntPtr.Zero;try{UInt32 sessionId = GetActiveTerminalSessionId();if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, out token)){throw new WinApiException("OpenProcessToken");}if (!DuplicateTokenEx(token, MAXIMUM_ALLOWED, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, TOKEN_TYPE.TokenPrimary, out newToken)){throw new WinApiException("DuplicateTokenEx");}if (!SetTokenInformation(newToken, TOKEN_INFORMATION_CLASS.TokenSessionId, ref sessionId, (UInt32)Marshal.SizeOf(sessionId))){throw new WinApiException("SetTokenInformation");}STARTUPINFO startupInfo = new STARTUPINFO();startupInfo.cb = Marshal.SizeOf(startupInfo);startupInfo.dwFlags = STARTF_USESHOWWINDOW;startupInfo.wShowWindow = SW_SHOW;PROCESS_INFORMATION processInformation;if (!CreateProcessAsUser(newToken,exepath??System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName,IntPtr.Zero,IntPtr.Zero,IntPtr.Zero,false,0,IntPtr.Zero,IntPtr.Zero,ref startupInfo,out processInformation)){throw new WinApiException("CreateProcessAsUser");}}finally{if (token != IntPtr.Zero){CloseHandle(token);}if (newToken != IntPtr.Zero){CloseHandle(newToken);}}}

ui自动化 实现自动登录

    AutomationElement rootElement = AutomationElement.RootElement;AutomationElementCollection subChildren = rootElement.FindAll(System.Windows.Automation.TreeScope.Subtree, System.Windows.Automation.Condition.TrueCondition);foreach (AutomationElement element in subChildren){using (StreamWriter writer = new StreamWriter(logTxt, true)){writer.WriteLine(element.Current.Name + " " + element.Current.LocalizedControlType);}if (element.Current.IsPassword){object parttern;if (element.TryGetCurrentPattern(ValuePattern.Pattern, out parttern)){ValuePattern valuePattern = parttern as ValuePattern;valuePattern.SetValue("123456");using (StreamWriter writer = new StreamWriter(logTxt, true)){writer.WriteLine("set password");}}}if (!string.IsNullOrEmpty(element.Current.Name) && element.Current.Name.Contains("提交")){if (element.TryGetCurrentPattern(InvokePattern.Pattern, out object pattern)){try{InvokePattern invokePattern = pattern as InvokePattern;invokePattern.Invoke();using (StreamWriter writer = new StreamWriter(logTxt, true)){writer.WriteLine("执行操作 登录 提交");}}catch (Exception exp){}}break;}if (!string.IsNullOrEmpty(element.Current.Name) && element.Current.Name.Contains("确定")){if (element.TryGetCurrentPattern(InvokePattern.Pattern, out object pattern)){try{InvokePattern invokePattern = pattern as InvokePattern;invokePattern.Invoke();using (StreamWriter writer = new StreamWriter(logTxt, true)){writer.WriteLine("登录 提交");}}catch (Exception exp){}}break;}}

windows桌面锁定后实现自动登录相关推荐

  1. 「实用」微信扫码 - 关注公众号后网站自动登录

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 作者:destiny 链接:htt ...

  2. 清除windows文件资源管理器FTP自动登录状态

    在Windows的文件资源管理器登录FTP,设置保存密码自动登录,这样在下次登录就免去了输入密码的步骤,很方便. 但是想换另一个FTP账号登录,由于之前的保密了账号密码,会自动登录到之前的账号,不会出 ...

  3. keepass2android 远程,关于KeePass实现mstsc远程桌面(rdp协议)的自动登录

    本文的Keepass版本:KeePass Password Safe Version 2.45 首先介绍一下Keepass,引用官网的解释如下: KeePass is a free open sour ...

  4. 微信扫码:关注公众号后网站自动登录的实现原理

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:destiny 链接:segmentfault.com/a/1190000022188562 序言 常见方式 平常大家见到过最多的扫码 ...

  5. 实现微信扫码或关注公众号后网站自动登录

    常见方式 平常大家见到过最多的扫码登录应该是 开放平台网页登录 大概形式就是:点击微信登录后会出现一个黑页面,页面中有一个二维码,扫码后可以自动获取用户信息然后登录,但是这种方式需要申请开放平台比较麻 ...

  6. Windows 7 开机无需密码自动登录设置

    对于自己的电脑,每次开机启动需要输入密码着实麻烦,但是取消密码又太不安全(有的时候锁屏离开一会).所以就想找一种方法既能保持密码,又能在锁屏时需要密码解锁. 打开程序-运行(从开始菜单中找,或者直接组 ...

  7. 远程桌面连接后远程计算机注销,windows2003远程桌面退出后系统自动注销的问题...

    问题现象: 最近在windows2003 r2下设置了定时任务,需要一定时间把数据从一个目录拷贝到另外的目录.结果出现很奇怪的问题: 1.手动执行批处理无问题. 2.定时后,用户退出后的一定时间内,执 ...

  8. Ubuntu更换gnome桌面环境后不能root登录

    安装完Ubuntu后感觉界面有点丑陋,安装了gnome桌面环境试一下 sudo apt-get install gnome-shell sudo apt-get install ubuntu-gnom ...

  9. win10 windows update禁用后又自动开启

    前景: 使用win10系统后 禁用了自动更新系统,但是过不了多久又会提示提示需要更新系统,再打开一看 被设置为了手动 解决方案: 1.        win + R 输入 services.msc 打 ...

最新文章

  1. Python multiprocess 多进程模块
  2. 职场程序员如何高效自学
  3. 剑指 Offer 28. 对称的二叉树【无取巧,易于理解!】
  4. 在SAP CRM webclient ui右上角显示系统时间
  5. 【整体二分】区间第k小(金牌导航 整体二分-1)
  6. LeetCode MySQL 1204. 最后一个能进入电梯的人(累加/变量/窗口函数)
  7. c++ 0x8000ffff灾难性故障_电容器毁灭性故障,让PCB板直接报废!
  8. python 去掉文件后缀_python从zip中删除指定后缀文件(推荐)
  9. 阿里java面_我的后端Java面经、八面阿里,已拿offer!
  10. IDEA的Mybatis插件
  11. itunes gift card apple id 充值接口API秒冲接口收藏
  12. Vue 作者尤雨溪,引路中国程序开发
  13. cve-2018-1273复现思路及简单利用(避坑)
  14. pysot-toolkit--eval.py笔记(读取算法结果,根据评价指标计算结果并可视化)
  15. UIPickerView 用法
  16. 商软B v5.4.1的登录验证分析
  17. 小游戏类项目 —— 扫雷
  18. DOM进阶之CSS属性操作
  19. 青龙,XDD-plus,若兰,安装
  20. Ubuntu手动安装pymysql(含pymysql的.whl及.tar.gz下载地址)

热门文章

  1. 首篇:关于 996的一些看法
  2. 华为和OPPO哪一家品牌质量好?这几大点不得不提!
  3. 【LKH算法体验】Python调用LKH算法求TSP问题
  4. IoT黑板报:高通骁龙处理器改名
  5. 开放网络发展历史大事记
  6. iPhone/iTouch免99美刀真机调试
  7. 揭秘运维工程师职业生涯天花板 SRE (Site Reliability Engineering) 的工作职责
  8. 关于获取CPU温度的CSDN帖子
  9. html.dropdownlistfor 绑定,c# – @ Html.DropDownListFor基本用法
  10. FastText模型简解+THUCNews新闻快速分类实战