Windows服务有没有可能在没有密码的情况下冒充用户?

本文关键字:情况下 冒充 用户 服务 有可能 Windows 密码 | 更新日期: 2023-09-27 18:15:56

作为本地系统或本地服务运行的c# Windows服务是否可能模拟另一个用户而不需要该用户的密码?

如何做到这一点?

注意:我这样做的动机是能够在服务中运行用户特定的WMI查询。我正在进行的WMI调用(对OfflineFiles WMI API)是用户敏感的,只有当我以想要查询其数据的用户的身份运行我的服务时,它们才工作。我不希望用户在安装服务时必须输入他们的用户名和密码,所以我只想以本地系统或其他方式运行服务,并冒充我关心的用户。

Windows服务有没有可能在没有密码的情况下冒充用户?

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

  1. 使用EnumProcesses(例如http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx)找到相关的用户会话[winapi]
  2. 在相关用户进程[winapi]上打开processtoken ()
  3. 具有模拟权限的DuplicateToken() [winapi]
  4. 使用DuplicateToken的结果创建一个新的WindowsIdentity()
  5. 调用。impersonate使用步骤4中的新身份

一旦复制了令牌,那么服务中模拟的用户日志是否保留就无关紧要了。

显然API未记录的ZwCreateToken winapi函数可以实现这一点,虽然也,但我从未使用过它,并可能在未来的任何时候打破。

据我所知,由于明显的安全原因,不能这样做。您必须有密码才能调用LogonUser,然后调用windowidentity . impersonate。

有一个例外:如果你有一个现有的WindowsIdentity通过远程调用传递给服务,那么你可以在服务中模拟那个WindowsIdentity,但不是所有的应用程序都这样操作。