Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式与winlogon交互?_C#_Winapi_Winlogon_Credential Providers - Fatal编程技术网

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

C# 如何以编程方式与winlogon交互?,c#,winapi,winlogon,credential-providers,C#,Winapi,Winlogon,Credential Providers,我有一个Windows服务,我想使用该服务使用帐户用户名和密码以编程方式解锁工作站 本文在下图中解释了Windows上的登录身份验证工作流: 如上所述,在步骤5中,用户将凭证输入登录UI。我想要实现的是让Windows服务输入凭据并让winlogon执行登录 没有winlogon API来实现这一点。如其他问题所示,使用winapi的LogonUser函数成功执行身份验证并返回令牌,但它不会切换到应用程序桌面,登录UI仍在屏幕上 大多数文章和答案都提示凭据提供程序,但所有凭据提供程序示例都要求

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

本文在下图中解释了Windows上的登录身份验证工作流:

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

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

大多数文章和答案都提示凭据提供程序,但所有凭据提供程序示例都要求用户和 登录用户界面

更新:我发现一些用户还没有完全理解这个问题,并提出了一些对我的案例没有帮助的解决办法。我尝试实现的工作流程如下:

  • Windows服务在Windows启动时启动(完成)
  • 同一Windows服务具有web服务,并通过API接受HTTP请求(完成)
  • 用户通过API从另一个设备向服务提供凭据(完成)
  • 提供的凭据用于登录工作站。
    4.1提供的凭证也用于在锁定(WinKey+L)的情况下解锁工作站
  • (可选)该服务通过API公开Windows帐户
  • (可选)用户可以向服务指定要用于登录的帐户
    目前,我对第4步和第4.1步很感兴趣。

    从语法上讲,以用户的名义绕过/登录是网络安全方面的一个可怕问题

    我不知道您想做什么,但是为什么不在机器上部署一个运行任务,使用服务帐户来完成这项工作呢


    您可以将其配置为即使在用户未在指定时间/事件上登录时也运行。如果这对你不起作用,你能再描述一下你的情况吗

    我不是宽恕你这么做,而是给你一个解决问题的办法。而且它不是以编程方式与WinLogon进程交互。它正在以编程方式处理它

    使用Windows自动登录属性。并重新启动以更改为该用户。 注意:这确实涉及将密码以明文形式存储在注册表中

    专门设置这些注册表项

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogin HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword

    *编辑*

    帮助完成4。对4.1没有帮助。除非你想重新启动解锁,我怀疑


    另一个听起来很有希望\值得研究的替代方案是在一个老问题上提到的

    我已经为此编写了一个商业解决方案,称为SasLibEx。SasLibEx是一个面向开发人员的库,在本地支持c/c++和delphi

    SasLibEx可以:

    • 模拟Ctrl-Alt-Del(安全注意顺序)
    • 取消Ctrl-Alt-Del
    • 锁定工作站
    • 解锁工作站(无凭据)
    • 禁用Ctrl-Alt-Del
    • 再次启用Ctrl-Alt-Del
    • 取消挂起的UAC请求
    • 桌面被锁定了吗

    路过时请看

    。。。但是,在微软的示例中,不是有一个接受异步输入的凭证提供者吗?我当然写过一篇文章,它记录了一个用户,他扫描一个可接受的指纹,不管显示的是什么磁贴。对我来说,这意味着与LogonUI的交互只需要隐含,但也许我遗漏了一些东西

    但也许我不是。虽然我不怀疑异步输入的意图是来自于用户在硬件上的操作,就像扫描手指一样,但我不记得这是一个规则。如果不是,那么您可能会有一个编程选项,以异步方式呈现凭据—不是从明显连接到计算机的设备,而是从您的HTTP侧通道(谁知道是什么)获取凭据

    那么,您是否可以让凭证提供者从您的服务侦听RPC,以获取您的服务已通过其侧通道收集的凭证通知?或者让您的服务侦听来自凭据提供商的RPC,以询问哪些凭据可用?如果一个方向被关闭,我可能不会感到惊讶——甚至是出于安全考虑——但我认为其中一个方向可以正常工作


    不管你是否想做这些,我不想插手

    我对基于硒的框架的要求与我正在构建的框架几乎相同。长话短说,我需要在用户的windows工作站(WinSTA0)中运行应用程序,这意味着用户必须登录到VM

    我已经创建了一个具有凭据管理器的项目,并使用它实现了以下工作流:

    • 启动VM,使用Powershell复制组件
    • 安装CredManager,重新启动虚拟机
    • Cred manager创建一个随机用户,并将其保存在数据库中
    • 与该用户一起登录
    • 用户在应用程序的注册表中有autostart,应用程序启动一个Web服务器,可以联系该服务器来旋转selenium会话
    如果我正确理解了您的需求,您将需要创建一个凭据管理器,该管理器将向autologin公开一个服务器(http、命名管道等),以便使用凭据进行联系,而无需在UI上花费时间。使用
    ITestWindowsCredentialProvider
    实现下的
    Advice
    方法启动服务器,使用
    UnAdvice
    停止服务器

    我建议以下几点来帮助你获得t