3

我需要模拟特定 Windows 服务的 LogOn 用户帐户。

我已经能够使用 WMI 获取用户名(遗憾的是,LogOn 用户身份似乎没有使用任何与 Windows 服务相关的常规 .NET 类公开)。但是,只有用户名(可以是本地帐户或域帐户)我如何获取该 Windows 身份的令牌?

可以提供令牌的 LogonUser WinAPI 调用需要密码作为参数,这显然是不可用的。用户输入不是一种选择。

任何见解将不胜感激。

4

2 回答 2

3

最终做了以下事情:

  1. 检查服务是否正在运行。如果没有启动服务。
  2. 使用 WMI 从服务名称获取 PID。
  3. 使用 .NET Process 类从 PID 获取进程句柄。
  4. 使用 OpenProcessHandle 获取进程令牌
  5. 使用 DuplicateToken 复制令牌,以验证足够的权限。
  6. 使用在步骤 4 中获得的令牌创建新的 WindowsIdentity。
  7. 模拟这个新的 WindowsIdentity,在模拟下进行操作,然后撤消模拟,使用 WindowsImpersonationContext。

希望这对需要模拟运行服务的用户帐户的其他人有用。

于 2013-03-25T23:16:31.267 回答
1

尽管 Microsoft 完全没有记录这一点,因为他们想假装服务登录在登录时不需要明文密码,但实际上确实需要,并且 services.exe 使用正确的密码调用 LogonUser。

密码被塞到注册表深处的某个地方,只有 SYSTEM 可以访问并加密以启动,但 SYSTEM 帐户可以获得机器密钥并解密密码。

http://www.computersecurityarticles.info/security/decrypting-lsa-secrets/

请注意,因为这是无证的,你不应该使用它。

于 2013-03-26T00:32:15.857 回答