Winapi 如何安装可以在安全桌面上运行的utility manager应用程序?

Winapi 如何安装可以在安全桌面上运行的utility manager应用程序?,winapi,accessibility,Winapi,Accessibility,我试图编写一个实用工具管理器应用程序,并试图在WinXP SP3上对其进行测试。 我将它添加到了HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Utility Manager,当我登录时加载Utility Manager时,它运行良好 但是,当我尝试在登录前从Utility Manager(通过Windows+U)或锁定屏幕加载它时,会出现一条错误消息,说(大约,因为它是WinXP

我试图编写一个实用工具管理器应用程序,并试图在WinXP SP3上对其进行测试。 我将它添加到了
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Utility Manager
,当我登录时加载Utility Manager时,它运行良好

但是,当我尝试在登录前从Utility Manager(通过Windows+U)或锁定屏幕加载它时,会出现一条错误消息,说(大约,因为它是WinXP的德语版本)“无法在安全桌面上执行此应用程序。请与您的系统管理员联系以获得所需的权限”

为了在安全桌面上工作,我必须采取哪些不同的措施

[b] 编辑:[/b] 我听从了David Pope的建议,尝试调试utilman.exe(因为我更习惯于使用它,而不是使用新的调试器…,并要求它在创建进程时中断)。似乎我的应用程序根本没有启动。由于OllyDebug似乎禁用了一些函数(比如API调用中断)(可能是因为该进程以不同的用户身份运行),因此我使用Sysinternals process Monitor对其进行了双重检查。启动屏幕键盘时,会出现“进程创建”事件;启动我的工具时,不会显示任何事件

另一个旁注:当我将osk.exe(屏幕键盘)放入我的新注册表项时,它工作正常(我基本上在菜单中有两个屏幕键盘条目),但如果我将osk.exe复制到osk2.exe并将osk2.exe作为可执行文件,屏幕键盘的副本只会在不安全的桌面上启动。所以在调用可执行文件之前,必须进行某种验证(针对文件名+内容)?用我的工具(或osk.exe)替换magnize.exe将使该工具在下次重新启动(当utilman重新启动时)后无法工作

换句话说:只有当文件名为osk.exe且为屏幕键盘或文件名为magnize.exe且为放大镜时,它才会工作


这也不会在事件日志中创建任何信息。

我不确定该消息的来源,但我知道有一个名为Winlogon的桌面对象,它是安全的CTRL+ALT+DELETE桌面。您可以在GUI线程中创建任何窗口之前使用和,这将使您的窗口显示在那里。在较新版本的Windows中,使用辅助功能API可能还有另一种方法。

我不确定该消息的来源,但我知道有一个名为Winlogon的桌面对象,它是安全的CTRL+ALT+DELETE桌面。您可以在GUI线程中创建任何窗口之前使用和,这将使您的窗口显示在那里。在较新版本的Windows中,可能还有另一种使用辅助功能API的方法。

您是否遵循了上的所有说明?它似乎涵盖了比您描述的更多的注册表设置

编辑:正如您所指出的,该页面似乎是针对Vista的。MSFT如何剔除遗留信息,并使其完全难以找到,这令人恼火

需要检查的一件事是事件日志——可能它们包含了线索。可以提高审核级别以查看更多与安全相关的数据

我没有你的代码,所以我自己无法调试它,但我能够将调试器挂接到utilman.exe,并在它在安全桌面上启动实用程序时获得控制。也许如果你这样做,你可以找出安全违规

  • 在目标计算机上:
    • 安装Windows调试工具
    • 启用RDP访问
    • 锁定屏幕
    • 按Win-U调出实用程序管理器并使其保持运行
    • 确保您的符号和源代码在目标上与在开发人员机器上编译的路径相同
  • 在另一台机器上:
    • 以具有调试/管理权限的用户身份将RDP导入目标计算机
  • 在RDP会话中:
    • 运行WinDBG并连接到utilman进程(F6键)
    • 如果它没有进入调试器,请按ctrl-break
    • 执行
      .childdbg 1
      ,以确保实用程序在启动时加载到此调试器实例中
    • 执行
      g
      继续运行
  • 返回目标计算机控制台(登录屏幕):
    • 从实用程序管理器启动您的实用程序。调试器(在RDP会话中)应该在新进程内部中断,您应该能够从那里进行调试
  • (我在尝试此功能的机器上没有Visual Studio;如果目标机器上有VStudio,您可能可以使用它而不是WinDBG。)

    如果您的实用程序甚至没有加载,那么Windows在调用CreateProcess之前正在进行某种验证。安全日志可能会对您有所帮助

    编辑2我尝试使用该实用程序查找生成对话框的程序,但我使用的是英文WinXP,因此没有实际的字符串。我还查找了硬编码的“osk.exe”等,但运气不好


    如果您能够找出EXE正在显示该对话框的内容(可能是utilman,可能是winlogon…),那么您应该能够使用调试器连接到该对话框,并返回堆栈以查找检查错误。一旦检查失败,您应该能够在代码路径的前面设置一个断点,该断点应该在下次尝试启动时进入调试器。您应该能够从那里逐步通过失败的检查。对于所有这些,确保你有可用的,因为它应该使“路标”更容易阅读。我不知道您的调试器是否支持symbol server。

    是否遵循了上的所有说明?它似乎涵盖了比您描述的更多的注册表设置

    编辑:正如你所指出的
    * ..\Program Files\ (and subfolders)
    * ..\Program Files (x86)\ (and subfolders, in 64-bit versions of Windows only)
    * ..\Windows\System32\