如何获取 Windows 服务登录用户的安全令牌?

问题描述 投票:0回答:2

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

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

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

任何见解将不胜感激。

c# windows windows-services token impersonation
2个回答
3
投票

最后做了以下事情:

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

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


1
投票

虽然这完全没有被微软记录下来,因为他们想假装服务登录在登录时不需要明文密码,但实际上它需要并且 services.exe 使用正确的密码调用 LogonUser。

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

(已失效的来源)http://www.computersecurityarticles.info/security/decrypting-lsa-secrets/

(新来源)https://gist.github.com/jborean93/58bba8236fac313e3d4b3970b8213cb6

请注意,因为这没有记录,所以你不应该使用它。

© www.soinside.com 2019 - 2024. All rights reserved.