通过服务删除 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 用户访问权限(几乎)一样好。然而,这正是我的客户想要的。 当你能做到的时候,永远不要让事情变得简单...... :-) 无论如何,你的客户想要通过 VNC 连接访问本地系统?太复杂了。应该有更简单的方法来限制用户。 也许你应该向你的客户解释这个设计的“怪异之处”(听起来有点像一个半技术经理,对他们读到的一些技术很着迷)。一个标准的 Windows 登录,设置了“下次登录时更改密码”,就是为这种事情设计的。该帐户还可以具有到期、受限工作站列表、受限文件系统权限等,然后只使用 RDP/VNC。容易。 【参考方案1】:

GINA 在 Vista/2008 中已被凭据提供程序取代(在托管代码中不可用)。

我不知道如何做你需要的,但也许这是一个线索,可以让你走得更远。

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

我不知道你的问题的背景,但是这个描述让我不寒而栗。 :-)

[更新] 嗯,回应你的评论。我会说为

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

【讨论】:

以上是关于通过服务删除 Windows 登录屏幕的主要内容,如果未能解决你的问题,请参考以下文章

Windows Server 2008 R2 如何删除用户登陆记录(登陆用户名、IP等)

在 Windows XP 中使用 C# 在登录屏幕上显示窗口

如何判断当前显示登录屏幕?

windows远程登录要登录到此远程计算机,您必须被授予通过终端服务登陆的权限

在Windows上通过putty远程登录CentOS

是否可以在 Windows 登录屏幕上显示我的窗口?