2013-03-23 79 views
3

我需要模拟特定Windows服务的LogOn用户帐户。如何获取Windows服务的LogOn用户的安全令牌?

我已经能够使用WMI获取用户名(可惜LogOn用户身份似乎没有使用任何常规的Windows服务相关的.NET类暴露)。但是,只有用户名(可以是本地帐户或域帐户),我如何获得该窗口标识的标记?

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

任何洞察力将不胜感激。

+1

是否要模拟运行服务的帐户下的用户?如果是这样,你可以使用CreateRemoteThread – 2013-03-23 00:43:11

+0

让我直截了当地说,你想模仿服务运行的用户吗?或者完全不同的用户? – 2013-03-23 00:43:50

+0

@parapurarajkumar谢谢。将探索。我想到,也许我也可以使用OpenProcessToken。 – Manas 2013-03-23 00:46:36

回答

3

最终做以下几点:

  1. 检查服务正在运行。如果不启动服务。
  2. 使用WMI从服务名称获取PID。
  3. 使用.NET Process类从PID获取进程句柄。
  4. 使用OpenProcessHandle获取进程令牌
  5. 使用DuplicateToken来复制令牌以验证足够的权限。
  6. 使用步骤令牌获得4
  7. 模仿此新的WindowsIdentity创建新的WindowsIdentity,在模拟做了手术,然后撤消模拟,使用WindowsImpersonationContext。

希望这对任何需要冒充运行服务的用户帐户的人都很有用。

+0

请问您可以发布此代码吗? – user1438082 2014-05-08 20:58:26

+0

我害怕的代码是专有的。然而,我可以根据你需要澄清的步骤来指出...... – Manas 2014-05-12 21:37:59

1

尽管Microsoft完全没有提供这方面的文档,因为他们希望假设服务登录在登录时不需要明文密码,但事实上它和services.exe都使用正确的密码调用LogonUser。

密码被塞进注册表的某处,只有SYSTEM有权访问并加密才能启动,但SYSTEM帐户可以获取机器密钥并解密密码。

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

请注意,因为这是没有证件,你不应该使用它。

相关问题