Windows服务是否可以在没有密码的情况下模拟用户?

时间:2011-11-29 00:46:37

标签: c# .net windows-services

作为本地系统或本地服务运行的C#Windows服务是否可以模拟其他用户而无需该用户的密码

如何做到这一点?

注意:我的动机是能够在服务中运行特定于用户的WMI查询。我正在进行的WMI调用(对于OfflineFiles WMI API)是用户敏感的,它们仅在我以我想要查询的数据的用户运行服务时才起作用。我不希望用户在安装服务时必须输入他们的用户名和密码,所以我想将服务作为本地系统或其他东西运行,并冒充我关心的用户。

2 个答案:

答案 0 :(得分:7)

假设您只需要在相关用户登录时启动模拟,您可以:

  1. 使用EnumProcesses找到相关的用户会话(例如http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx)[winapi]
  2. 相关用户进程[winapi]
  3. 上的OpenProcessToken()
  4. 具有模拟权限的DuplicateToken()[winapi]
  5. 使用DuplicateToken
  6. 的结果创建一个新的WindowsIdentity()
  7. 致电。从第4步开始对您的新身份进行审核
  8. 一旦令牌被复制,用户是否记录 - 服务中的假冒行为仍然无关紧要。

    显然,未记录的ZwCreateToken winapi函数的API也可以实现这一点,但是我从未使用它,并且可能在将来的任何时候中断。

答案 1 :(得分:0)

据我所知,出于明显的安全原因,无法做到这一点。您必须拥有密码才能调用LogonUser,然后调用WindowsIdentity.Impersonate。

一个例外:如果您通过远程调用将现有的WindowsIdentity传递给服务,那么您可以在服务中模拟WindowsIdentity,但不会以这种方式运行。