来自C#的Windows模拟

以LocalSystem身份运行的C#程序如何暂时模仿其他用户的login身份? 粗略地说,我有一个Windows服务,我想运行本地系统,但有时冒充用户XYZ(当连接到使用Windows集成安全分贝)。

最重要的是:有没有办法做到这一点,而不知道其他用户的密码?

注意:如果密码是强制性的,那么build议使用安全地存储密码的策略(c#和/或vbscript)。

这是可能的,但它需要你做很多代码。 请参阅NtCreateToken和CreateToken 。 你需要SeCreateTokenPrivilege,虽然这不会是一个问题,因为你在NT AUTHORITY \ SYSTEM下运行。 然后,您可以使用创建的令牌来模仿线程内部。

简短的回答:你不能没有用户密码或用户通过COM调用你的服务。

要在您的流程中模拟另一个用户,您必须调用ImpersonateLoggedOnUser ImpersonateLoggedOnUser需要一个令牌句柄。 有几种方法可以获得令牌句柄:

  • 通过LogonUser作为用户登录。 然而这要求你知道用户密码。
  • 通过使用CreateRestrictedTokenDuplicateTokenDuplicateTokenEx现有令牌。
  • 通过从另一个进程或线程打开已经作为用户登录的令牌,使用OpenProcessTokenOpenThreadToken

对于密码存储部分,您最好查看一下这个问题 。

这是我的答案:

您可以/应该使用DPAPI ,即提供存储加密的Data Protection API 。
这只是为了这种类型的问题。

存储的加密基于以下两种情况之一:

  • 用户帐户,所以只有登录的用户才能访问数据。 这使得数据可以通过完全相同的用户凭证转移到另一台PC。
  • 使机器只能在特定的机器设置上访问数据,不能传送到另一台PC。

有一个与Karl Franklin合作的dnrTV节目,展示了实现这个功能需要什么,以及其他的加密功能。
显示的源代码也可以在页面上找到。

当然,还有很多关于这个主题的文章 。