通过服务删除Windows登录屏幕

时间:2009-06-18 06:11:33

标签: c# authentication windows-services windows-xp winlogon

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

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

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

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

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

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

谢谢你,
Husain的

1 个答案:

答案 0 :(得分:2)

GINA已被Credential Providers在Vista / 2008中取代(托管代码中没有)。

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

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

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

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

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