通过服务删除 Windows 登录屏幕
Posted
技术标签:
【中文标题】通过服务删除 Windows 登录屏幕【英文标题】:Removing Windows Logon screen through a service 【发布时间】:2010-11-03 21:45:48 【问题描述】:我正在尝试从服务启动的可执行文件中删除 Windows 登录屏幕 (winlogon)。该服务将自动启动 windows 并等待来自另一台计算机的命令。当它接收到命令时,它会启动一个 exe,该 exe 将以特定的用户名启动 cmd.exe。
服务已经存在。我有编写这个可执行文件的工作。目前,我已经编写了可执行文件 (CmdLogin),它通过调用 LogonUserW、ImpersonateUser 和 CreateProcessWithLogonW 在不同的用户下启动 cmd.exe。我将 lpDesktop 指定为“WinSta0\Default”。唯一的问题是该服务必须在管理员帐户下运行(但这是一个不同的问题)。
当从命令提示符调用时(即使在 Windows 7 上),它工作得非常好。当用户登录并查看他的桌面时从服务调用时,这也有效(就像我在同一台机器上调试时所做的那样)。但是,就像我上面所说的,我真正的要求是即使在显示 Windows 登录屏幕时也能正常工作。目前,exe 给出了正确的退出代码,但没有出现该窗口。但是,当用户登录时,他会在桌面上看到 cmd 窗口。
我发现的一个解决方案是对 lpDesktop 使用“WinSta0\WinLogon”而不是 Default。我还没有尝试这个。但是,这看起来会在登录屏幕上显示 cmd 窗口。我真正需要的是实际模拟用户登录到 winlogon 并显示他的实际桌面(和 cmd 窗口)。
我环顾四周,发现了 GINA 和 Winlogon 通知包。他们似乎有点过头了,我不确定这是否能解决这里的目的。此外,这些在 Windows Vista 中已被弃用,这让我认为有更好、更简洁的方法来解决这个问题。
关于我应该使用什么来实现这一点有什么建议吗?作为记录,可执行文件在 C# 中,使用 P/Invoke 进行 API 调用。我也愿意使用可以从此 C# 应用程序调用的 C dll。
谢谢你, 侯赛因
【问题讨论】:
嗯,这样做的原因是我的客户需要一个应用程序,他可以在其中向人们提供不同的用户名和密码来访问 Windows 工作站,而无需提供实际的用户名和密码。工作站上运行的服务将为用户远程登录,用户将通过 VNC 客户端继续在工作站上工作。这对我来说似乎有点奇怪,因为它与授予 Windows 用户访问权限(几乎)一样好。然而,这正是我的客户想要的。GINA 在 Vista/2008 中已被凭据提供程序取代(在托管代码中不可用)。
我不知道如何做你需要的,但也许这是一个线索,可以让你走得更远。
郑重声明,这似乎是解决问题的错误方法。我只是看不出您需要如何在自动登录下运行命令提示符...为什么不编写一个服务来完成您的任务,并让它在一组特定于服务的凭据下运行?
我不知道你的问题的背景,但是这个描述让我不寒而栗。 :-)
[更新] 嗯,回应你的评论。我会说为
您可以针对他的凭据存储提供自定义身份验证,然后根据需要允许或拒绝登录。
【讨论】:
以上是关于通过服务删除 Windows 登录屏幕的主要内容,如果未能解决你的问题,请参考以下文章
Windows Server 2008 R2 如何删除用户登陆记录(登陆用户名、IP等)
在 Windows XP 中使用 C# 在登录屏幕上显示窗口