【问题标题】:Check username and password of Windows account检查 Windows 帐户的用户名和密码
【发布时间】:2008-10-20 20:52:56
【问题描述】:

我有一个安装包,用于安装我创建的服务进程。我想提示用户输入服务进程应在其下运行的帐户的用户名/密码。我想在继续安装之前验证用户名/密码组合是否有效。我有一个用于特殊安装行为的 C DLL,但我不知道如何使用 Windows API 来验证帐户的凭据。我希望能够支持服务控制管理器使用的相同帐户名称语法。

【问题讨论】:

    标签: winapi


    【解决方案1】:

    您要使用的函数是LogonUser。您甚至可以非常酷,并指定 LOGON32_LOGON_SERVICE 标志,该标志会检查以确保用户具有运行服务的适当权限。

    【讨论】:

    • 请注意,在较旧的操作系统版本(Win2K 及之前)上,LogonUser() API 需要高权限(“作为操作系统的一部分”)。
    【解决方案2】:

    LogonUser 是执行此操作的规范方法,尽管微软有点 discourages it

    【讨论】:

      【解决方案3】:

      我已经使用你们提到的 LogonUser 功能实现了这个(顺便说一下,这个服务需要 WinXP SP2 或更高版本,所以我不担心权限问题)。但是,这并不像我希望的那样工作。如果我调用 QueryServiceConfig,lpServiceStartName 的格式为“.\accountname”。如果我将此字符串按原样传递给 LogonUser,它将失败。我假设'\'之前的部分代表用户所属的机器?

      另外,如果我调用 ChangeServiceConfig 并分别为 lpServiceStartName 和 lpPassword 参数指定“LocalSystem”和“”,这可以正常工作。但是,使用这些参数调用 LogonUser 不起作用。

      我真的很想使用 SCM 用于帐户名称的相同语法。

      【讨论】:

      • 您需要从用户名中拆分域。这 '。'将作为 LogonUser 的域(它映射到本地系统命名空间),但您需要拆分完全限定的用户名。
      • 另外,您不能使用 API 以 LocalSystem 身份显式登录(据我所知)。您必须对这个帐户和其他几个内置帐户(在 NT_AUTHORITY 命名空间中)进行特殊处理。
      猜你喜欢
      • 1970-01-01
      • 2017-11-29
      • 2016-01-28
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多