【发布时间】:2008-10-20 20:52:56
【问题描述】:
我有一个安装包,用于安装我创建的服务进程。我想提示用户输入服务进程应在其下运行的帐户的用户名/密码。我想在继续安装之前验证用户名/密码组合是否有效。我有一个用于特殊安装行为的 C DLL,但我不知道如何使用 Windows API 来验证帐户的凭据。我希望能够支持服务控制管理器使用的相同帐户名称语法。
【问题讨论】:
标签: winapi
我有一个安装包,用于安装我创建的服务进程。我想提示用户输入服务进程应在其下运行的帐户的用户名/密码。我想在继续安装之前验证用户名/密码组合是否有效。我有一个用于特殊安装行为的 C DLL,但我不知道如何使用 Windows API 来验证帐户的凭据。我希望能够支持服务控制管理器使用的相同帐户名称语法。
【问题讨论】:
标签: winapi
您要使用的函数是LogonUser。您甚至可以非常酷,并指定 LOGON32_LOGON_SERVICE 标志,该标志会检查以确保用户具有运行服务的适当权限。
【讨论】:
LogonUser 是执行此操作的规范方法,尽管微软有点 discourages it。
【讨论】:
我已经使用你们提到的 LogonUser 功能实现了这个(顺便说一下,这个服务需要 WinXP SP2 或更高版本,所以我不担心权限问题)。但是,这并不像我希望的那样工作。如果我调用 QueryServiceConfig,lpServiceStartName 的格式为“.\accountname”。如果我将此字符串按原样传递给 LogonUser,它将失败。我假设'\'之前的部分代表用户所属的机器?
另外,如果我调用 ChangeServiceConfig 并分别为 lpServiceStartName 和 lpPassword 参数指定“LocalSystem”和“”,这可以正常工作。但是,使用这些参数调用 LogonUser 不起作用。
我真的很想使用 SCM 用于帐户名称的相同语法。
【讨论】: