以LocalSystem身份运行的C#程序如何暂时模仿其他用户的login身份? 粗略地说,我有一个Windows服务,我想运行本地系统,但有时冒充用户XYZ(当连接到使用Windows集成安全分贝)。
最重要的是:有没有办法做到这一点,而不知道其他用户的密码?
注意:如果密码是强制性的,那么build议使用安全地存储密码的策略(c#和/或vbscript)。
这是可能的,但它需要你做很多代码。 请参阅NtCreateToken和CreateToken 。 你需要SeCreateTokenPrivilege,虽然这不会是一个问题,因为你在NT AUTHORITY \ SYSTEM下运行。 然后,您可以使用创建的令牌来模仿线程内部。
简短的回答:你不能没有用户密码或用户通过COM调用你的服务。
要在您的流程中模拟另一个用户,您必须调用ImpersonateLoggedOnUser
。 ImpersonateLoggedOnUser
需要一个令牌句柄。 有几种方法可以获得令牌句柄:
LogonUser
作为用户登录。 然而这要求你知道用户密码。 CreateRestrictedToken
, DuplicateToken
或DuplicateTokenEx
现有令牌。 OpenProcessToken
或OpenThreadToken
对于密码存储部分,您最好查看一下这个问题 。
这是我的答案:
您可以/应该使用DPAPI ,即提供存储加密的Data Protection API 。
这只是为了这种类型的问题。
存储的加密基于以下两种情况之一:
有一个与Karl Franklin合作的dnrTV节目,展示了实现这个功能需要什么,以及其他的加密功能。
显示的源代码也可以在页面上找到。
当然,还有很多关于这个主题的文章 。