0

我打算在超级用户中问这个,但它与 C/C++ 和 Win32 编程有关,所以我会在这里问。我希望在用户登录和 Windows 7+ 的 Windows shell 之间添加一个步骤。这些是我研究和尝试但成功有限的事情:

  1. MSGINA存根,它似乎可以完美运行,但在 Windows Vista 中已停产,因此我无法使用它。
  2. 我看过自定义Windows Credential Providers,但我不完全确定这会做我想要的(在登录后和 windows shell 之前启动一个应用程序)。
  3. 一个(半)自定义外壳,它可以满足我的需要,然后启动普通的 Windows 外壳(explorer.exe)。

选项 3 让我最接近,但我的问题是,如果我创建了HKLM\...\Winlogon:Shell指向我的程序的注册表值,我无法将 explorer.exe 作为 shell 启动。我可以在退出并启动资源管理器之前创建Shell值,HKCU然后将其更改为,explorer.exe然后将值恢复到我的程序中。这会起作用,但不如使用HKLM. 在这种情况下,我什至无法使用HKLM,因为我的程序正在当前用户的上下文中执行,并且用户没有对该密钥的写入权限。

是否有任何创造性的方法可以做到这一点或我错过的任何其他可能性?上面的选项 2 似乎不可行,但如果我错了,请纠正我。

4

2 回答 2

2

我认为在 Windows 中的登录和资源管理器 shell 之间插入程序的最佳方法是在以下位置注册自己的应用程序HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinlogonUserinit

默认userinit.exe在 login 和 shell 之间运行,并且可以自定义:

例如,要在 Windows 资源管理器用户界面启动之前运行某个程序,请将该程序的名称替换为该条目的值中的 Userinit.exe,然后在该程序中包含启动 Userinit.exe 的说明。

于 2017-02-05T12:09:58.807 回答
2

我喜欢RbMm 的回答,但为了完整起见,另一个选择是Credential Manager

(注意:凭证管理器与凭证提供者不同。)

在以下任何情况下,使用凭据管理器可能比使用 userinit 更可取:

  • 您想以提升的权限运行代码。

  • 您的代码需要在登录的早期阶段运行,例如,在加载漫游配置文件之前。

  • 您需要用户的密码。

您可能不想使用凭据管理器的一些原因

  • 它在内部作为 DLL 运行,winlogon因此您需要特别注意您的代码是否正确。

  • 根据您正在执行的操作,登录顺序可能为时过早。:-)

  • 它不在用户的上下文中运行。(有一种方法可以解决这个问题,但它很hacky。)

于 2017-02-05T23:31:35.610 回答