33

作为 LocalSystem 运行的 C# 程序如何临时冒充另一个用户的登录身份?粗略地说,我有一个 Windows 服务,我想作为 LocalSystem 运行,但有时会模拟用户 XYZ(使用 Windows 集成安全性连接到数据库时)。

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

注意:如果密码是强制性的,是否有安全存储密码的推荐策略(c# 和/或 vbscript)。

4

3 回答 3

19

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

于 2009-02-22T09:36:20.403 回答
13

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

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

于 2009-02-18T03:38:57.860 回答
5

对于密码存储部分,您可能想看看最近提出的这个问题。

这是我的回答:

您可以/应该使用DPAPI,即提供存储加密的数据保护 API 。
它只是针对这种类型的问题。

存储的加密基于:

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

有一个与 Karl Franklin 合作的 dnrTV 节目,准确地展示了实现此功能和其他加密功能所需的内容。
该节目的源代码也可在页面上找到。

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

于 2009-02-18T03:33:02.790 回答