c# - 如何以编程方式与 winlogon 交互?

标签 c# winapi winlogon credential-providers

我有一个 Windows 服务,我想使用该服务以编程方式解锁工作站,使用帐户用户名和密码。

本文https://technet.microsoft.com/en-us/library/dn751047(v=ws.11).aspx下图解释了 Windows 上的登录身份验证工作流程: authentication workflow

如上所示,在第 5 步中,用户将凭据输入登录 UI。我想要实现的是让 Windows 服务输入凭据并让 winlogon 执行登录。

没有 winlogon API 可以实现这一点。正如在其他问题中看到的,使用 winapi 的 LogonUser 函数成功执行身份验证并返回 token ,但它不会切换到应用程序桌面,登录 UI 仍保留在屏幕上。

大多数文章和 SO 答案都暗示凭证提供者,但所有凭证提供者示例都需要用户与 登录界面。

更新:我看到一些用户没有完全理解这个问题,并提出了对我的案例没有用的解决方法。我要实现的工作流程如下:

  1. Windows 服务在 Windows 启动时启动(完成)。
  2. 相同的 Windows 服务具有网络服务并通过 API 接受 HTTP 请求(完成)。
  3. 用户通过来自另一台设备的 API 向服务提供凭据(完成)。
  4. 提供的凭据用于登录工作站。
    4.1 提供的凭据也用于在锁定时解锁工作站 (WinKey + L)。
  5. (可选)该服务通过 API 公开 Windows 帐户。
  6. (可选)用户可以向服务指定要用于登录的帐户。

目前,我有兴趣执行步骤 4 和 4.1。

最佳答案

只是在传递... 但是,在 Microsoft 的示例中,是否有一个采用异步输入的凭据提供程序?我当然写过一个登录用户,无论显示什么图 block ,该用户都可以扫描可接受的指纹。对我来说,这意味着与 LogonUI 的交互只需隐式,但也许我遗漏了一些东西。

但也许我不是。尽管我不怀疑其意图是异步输入将来自用户对硬件的操作,就像扫描手指一样,但我通常不记得这是规则。如果不是,那么您可能会以呈现凭据的形式拥有您的编程选项,就好像它们是异步收集的一样 - 不是来自显然连接到计算机的设备,而是来自您的 HTTP 侧 channel ,谁知道是什么。

那么,您能否让凭据提供者从您的服务中监听 RPC,以通知您的服务通过其侧 channel 收集的凭据?或者让您的服务从您的凭据提供者处监听 RPC 以询问哪些凭据可用?如果一个方向被关闭我可能不会感到惊讶 - 甚至是为了安全 - 但我认为可以让一个或另一个工作。

至于你是否应该做这些,我不想多说。

关于c# - 如何以编程方式与 winlogon 交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48038678/

相关文章:

c# - ASPNet MVC - 在 Controller 方法中,返回字符串列表或重定向到不同页面

c - 获取实际函数 LoadLibraryExW 的地址而不是 Stub LoadLibraryExWStub

windows - 添加新文本字段 pGina

c# - 在类库项目中统一依赖注入(inject)

c# - 为什么我的 List<string> 没有完全写在我的 .CSV 中?

c# - 如何使用数据绑定(bind)正确更改 WPF 中控件的状态?

c++ - Sample Grabber 过滤数据中奇怪的垃圾行

c# - PCWSTR 与 LPWSTR

azure - 从 WinLogon 获取 Azure token

c# - 如何使用 C# 解锁用户 PC