我有一个在.NET中编写的应用程序。 它需要保持运行并访问UAC对话窗口打开的桌面,并使用键盘和鼠标事件与桌面交互。
这有点像VNC程序。 假设您正在运行一个VNC程序并popup一个UAC窗口,您希望您的VNC程序仍然能够通过其中的UAC窗口来控制桌面,以便用户可以移动鼠标并单击UAC对话框上的确定button。 任何人都可以告诉我如何去做呢?
谢谢
对多个类执行单个WMI查询,可能是?
我在哪里可以find在.NET中开发的Windows服务的生命周期的详细视图?
线程在被告知这样做的时候没有睡觉
什么是csilog文件?
创build一个应用程序钩子?
需要math库的序列/范围的操作
.NET窗口捕获
如何在.NET中提示Internet代理的默认Windows凭据对话框窗体?
针对.NET 4.5的WPF,但在应用程序运行时要求安装.NET 3.5的窗口
我建议你从阅读文档开始。 我想也许你可以打开窗口站,并附上你的过程,但我不是很熟悉Windows的这个领域。
编辑1:
在Windows XP中,当以SYstem身份运行时,我能够通过OpenDesktop访问安全桌面(“winlogon”); 安全桌面上的ACL只允许访问SYstem帐户。 打开后,我可以列举窗户,虽然只有少数。 也许你可以设置一个窗口钩子,并侦听特定对话框的创建。 我不确定Vista是否改变了这个模式,所以也许它不起作用。 我没有一台Vista机器在我面前进行测试。
编辑2:
好的,我得到了一些主要工作(在Windows 7上测试)。 首先你必须有一个服务作为SYstem运行。 从该服务中,您需要在用户会话中启动一个单独的应用程序。 为此,枚举所有查找winlogon.exe的进程,打开其令牌和CreateProcessAsUser。 为STARTUPINFO的lpDesktop参数指定“WinSta0 Winlogon”。 现在,您在“Winlogon”桌面上的用户会话中有一个以SYstem身份运行的进程。 在新的过程中,你可以做任何你想做的事情; 我用EnumDesktopWindows做了一个快速测试,并且能够获得各种与UAC相关的窗口(“$$$安全UAP背景窗口”,“$$$安全UAP背景虚拟客户端窗口”等)的窗口类和文本。 不过,我不确定如何确定何时显示UAC提示。 作为一个快速入侵,你可以运行一个循环每100毫秒寻找UAC窗口或东西。 如果有帮助,我可以粘贴一些代码。
编辑3:
好。 我写了一个Win32服务,它具有以下参数:
/安装 – 安装服务
/卸载 – 卸载服务
/服务 – 作为服务运行; 通过SCM调用
/客户端 – 作为客户端运行; 通过CreateProcessAsUser调用
唯一有趣的代码是在/服务和/客户端模式。
在/服务模式下,它通过EnumProcesses和GetmoduleeFileNameEx枚举正在运行的进程,查找“winlogon.exe”。 当它找到一个它打开它的令牌,并通过CreateProcessAsUser以/ client模式启动自己:
HANDLE hProcess = ...; // winlogon.exe runs as SYstem in user's session; we need to run the same way HANDLE hToken = NULL; if(OpenProcesstoken(hProcess,TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY,&hToken)) { TCHAR szCommandLine[MAX_PATH]; GetmoduleeFileName(NULL,szCommandLine,MAX_PATH); PathQuoteSpaces(szCommandLine); // run in /client mode _tcscat_s(szCommandLine,MAX_PATH,_T(" /client")); STARTUPINFO StartupInfo; ZeroMemory(&StartupInfo,sizeof(STARTUPINFO)); StartupInfo.cb = sizeof(STARTUPINFO); // run on the Winlogon desktop StartupInfo.lpDesktop = _T("WinSta0\Winlogon"); PROCESS_@R_22_4045@ION Process@R_22_4045@ion; ZeroMemory(&Process@R_22_4045@ion,sizeof(PROCESS_@R_22_4045@ION)); if(CreateProcessAsUser(hToken,NULL,FALSE,&StartupInfo,&Process@R_22_4045@ion)) { CloseHandle(Process@R_22_404[email protected]); Process@R_22_404[email protected] = NULL; CloseHandle(Process@R_22_404[email protected]); Process@R_22_404[email protected] = NULL; } CloseHandle(hToken); hToken = NULL; }
在/客户端模式下,它通过一堆FindWindow和findwindowex调用单击UAC提示符上的“是”按钮。 您可以使用Spy ++找出窗口层次结构。
HWND hWnd = ...; HWND hWndButton = findwindowex(hWnd,_T("Button"),NULL); if(hWndButton != NULL) { // see if this is the "Yes" button TCHAR szText[32]; if(GetwindowText(hWndButton,szText,32) && _tcsicmp(szText,_T("&Yes")) == 0) { // click it SendMessage(hWndButton,BM_CLICK,0); } }
我测试的方式是坚持一个睡眠(5000); 在/客户端代码中。 然后我启动服务,立即做一些触发UAC提示(即运行regedit)。 / 5秒钟后,客户端代码将被唤醒并找到并单击“是”按钮。 您可以在Winlogon桌面上运行其他进程; cmd.exe和spyxx.exe(Spy ++)是最有用的。 不幸的是,explorer.exe在Winlogon桌面上运行时会出现很多问题,并不是很有用。 要进入Winlogon桌面,您可以运行regedit,然后按Alt + Tab切换到其他应用程序。 如果您想要使用它,可以编写自己的桌面切换实用程序(使用SwitchDesktop功能),因此您不必触发UAC提示即可访问Winlogon桌面。 如果你想得到真正的幻想,你可以设置一个全局的窗口钩子监视窗口的创建; 当UAC对话框即将显示时,您可以准备点击“是”按钮。 不过,我没有那么做。
问题是UAC提示不能在当前的桌面上打开,而是在全新的安全桌面上打开,这会暂停当前打开的桌面。
这是故意的,因为程序不允许与这个对话框交互。
有一个例外:根据这个博客条目 ,“受信任的系统进程可以在安全桌面上运行”。
我想你可能需要作为一个Windows服务来运行,以允许在UAC处于活动状态时执行。
我相信在UAC提示期间,在屏幕上看到的所有内容都是屏幕截图(对话框本身除外)
你不能这样做。 默认情况下,当UAC提示符出现时,它实际上运行在与运行“普通”应用程序不同的独立WinStation上。 此WinStation是专门隔离的,以防止用户应用程序与UAC提示进行交互。 它看起来像你的桌面,因为该WinStation的背景实际上是一个桌面的静态位图图像,因为它就在显示UAC提示之前。
我怀疑这可能是您正在运行的VNC版本中的一个问题,因为我相当确定远程桌面提供了正确的行为,并允许用户仍然通过远程桌面客户端与UAC提示进行交互。 请记住,当运行任何类型的远程客户端(远程桌面,VNC等)时,客户端应该允许你做任何事情,如果你正在坐在键盘上,通常可以做的事情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。