来自C#的Windows模拟

时间:2009-02-18 03:24:12

标签: c# windows impersonation

作为LocalSystem运行的C#程序如何暂时模拟其他用户的登录标识?粗略地说,我有一个Windows服务,我想作为LocalSystem运行,但有时模仿用户XYZ(当使用Windows集成安全性连接到数据库时)。

最重要的是:有没有办法在不知道其他用户密码的情况下执行此操作?

注意:如果密码是强制性的,则建议安全地存储密码(c#和/或vbscript)。

3 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:11)

简答:您不能没有用户密码或用户通过COM呼叫您的服务。

要在您的流程中模仿其他用户,您必须致电ImpersonateLoggedOnUserImpersonateLoggedOnUser需要令牌句柄。有几种方法可以获得令牌句柄:

答案 2 :(得分:5)

对于密码存储部分,您可能希望查看最近询问的this question

这是我的回答:

您可以/应该使用提供存储加密的DPAPI Data Protection API 这就是针对这类问题的。

存储加密基于:

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

有一个dnrTV show with Karl Franklin显示了实现此功能所需的确切内容以及其他加密功能 该节目的源代码也可以在页面上找到。

当然,在这个主题上有很多other articles