作为本地系统或本地服务运行的C#Windows服务是否可以模拟其他用户而无需该用户的密码?
如何做到这一点?
注意:我的动机是能够在服务中运行特定于用户的WMI查询。我正在进行的WMI调用(对于OfflineFiles WMI API)是用户敏感的,它们仅在我以我想要查询的数据的用户运行服务时才起作用。我不希望用户在安装服务时必须输入他们的用户名和密码,所以我想将服务作为本地系统或其他东西运行,并冒充我关心的用户。
答案 0 :(得分:7)
假设您只需要在相关用户登录时启动模拟,您可以:
一旦令牌被复制,用户是否记录 - 服务中的假冒行为仍然无关紧要。
显然,未记录的ZwCreateToken winapi函数的API也可以实现这一点,但是我从未使用它,并且可能在将来的任何时候中断。
答案 1 :(得分:0)
据我所知,出于明显的安全原因,无法做到这一点。您必须拥有密码才能调用LogonUser,然后调用WindowsIdentity.Impersonate。
一个例外:如果您通过远程调用将现有的WindowsIdentity传递给服务,那么您可以在服务中模拟WindowsIdentity,但不会以这种方式运行。