通过服务删除Windows登录屏幕

我试图从服务启动的可执行文件中删除Windows登录屏幕(winlogon)。 该服务将自动启动Windows并等待来自另一台计算机的命令。 当它收到命令时,它将启动一个exe,它将在特定的用户名下启动cmd.exe。

该服务已经存在。 我有编写这个可执行文件的工作。 目前,我编写了可执行文件(CmdLogin),它通过调用LogonUserW,ImpersonateUser和CreateProcessWithLogonW在不同的用户下启动cmd.exe。 我将lpDesktop指定为“WinSta0 \ Default”。 唯一的问题是该服务必须在管理员帐户下运行(但这是一个不同的问题)。

从命令提示符调用时(即使在Windows 7上),这完全正常。 当用户登录并查看他的桌面时(例如我在同一台机器上进行调试时)从服务调用时,这也有效。 但是,正如我上面所说,我的真正要求是即使显示Windows登录屏幕也能正常工作。 目前,exe提供了正确的退出代码,但窗口没有出现。 但是,当用户登录时,他会在桌面上看到cmd窗口。

我找到的一个解决方案是使用“WinSta0 \ WinLogon”代替默认的lpDesktop。 我还没试过。 但是,这看起来会在登录屏幕上显示cmd窗口。 我真正需要的是实际模拟用户登录winlogon并显示他的实际桌面(以及cmd窗口)。

我环顾四周,发现了GINA和Winlogon通知包。 他们看起来像是一种矫枉过正,我不确定这是否能解决这里的目的。 此外,这些在Windows Vista中已被弃用,这使我认为有一种更好,更简洁的方法来解决这个问题。

有关我应该用什么来实现这一目标的任何建议? 为了记录,可执行文件在C#中,使用P / Invoke进行API调用。 我愿意使用我可以从这个C#应用程序调用的C dll。

谢谢,
侯赛因

GINA已被Credential Providers在Vista / 2008中取代(不在托管代码中提供)。

我不知道如何做你需要的东西,但也许这是进一步走下去的线索。

而对于记录来说,这似乎是解决问题的错误方法。 我只是看不出你需要在自动登录下运行命令提示符…为什么不写一个服务来完成你的任务,让它在一组特定于服务的凭据下运行?

我没有你的问题的背景,但这种描述让我不寒而栗。 🙂

[更新]嗯,回应你的评论。 我会说,为<= Windows 2003编写GINA替代品,或者为Vista / 2008 +编写自定义凭据提供程序看起来是您的最佳选择。

您可以针对其凭据存储提供自定义身份validation,然后根据需要允许或拒绝登录。