作为本地系统或本地服务运行的C#Windows服务是否可能假冒其他用户而不需要该用户的密码?Windows服务可能在没有密码的情况下冒充用户吗?
这将如何完成?
注意:我的动机是能够在服务中运行用户特定的WMI查询。我所做的WMI调用(对于OfflineFiles WMI API)是用户敏感的,并且只有当我将我的服务作为其数据要查询的用户运行时才能工作。我不希望用户在安装服务时输入他们的用户名和密码,所以我想仅以本地系统或其他方式运行该服务,并模拟我关心的用户。
作为本地系统或本地服务运行的C#Windows服务是否可能假冒其他用户而不需要该用户的密码?Windows服务可能在没有密码的情况下冒充用户吗?
这将如何完成?
注意:我的动机是能够在服务中运行用户特定的WMI查询。我所做的WMI调用(对于OfflineFiles WMI API)是用户敏感的,并且只有当我将我的服务作为其数据要查询的用户运行时才能工作。我不希望用户在安装服务时输入他们的用户名和密码,所以我想仅以本地系统或其他方式运行该服务,并模拟我关心的用户。
假设你而相关用户登录时只需要启动模拟,你可以:
一旦令牌被复制,用户是否登录 - 服务中的模拟仍然存在并不重要。
显然,API无证ZwCreateToken WINAPI功能虽然也能达到这一点,但我从来没有使用它,并在任何时候在将来可能会断裂。
for#1,也可以使用'Process.GetProcesses()' –
事实上,有一种使用S4U(服务用户)的技术: https://blogs.msdn.microsoft.com/winsdk/2015/08/28 /以用户身份登录不需要密码/ https://msdn.microsoft.com/en-us/library/windows/desktop/aa378128(v=vs.85).aspx –
据我所知,由于明显的安全原因无法完成。您必须拥有密码才能调用LogonUser,然后调用WindowsIdentity.Impersonate。
有一个例外:如果您有通过远程调用传递给服务的现有WindowsIdentity,那么您可以模拟该服务中的WindowsIdentity,但不能以这种方式运行应用程序。
安全原因并不明显 - 如果您是使用本地系统帐户运行的服务,那么您确实无法做到这一点。 – EFraim
我怀疑你将有更好的运气,如果你要解释你的服务做一旦它模拟的用户是什么。据我所知,你问的也不是没有可能积攒凭证(这意味着在某些时候输入密码的用户) –
@ChrisShain,如你所说我已经更新的问题。 – Eric
检查出这个问题的答案:http://stackoverflow.com/questions/559719/windows-impersonation-from-c-sharp –