C# 来自C的Windows模拟#

C# 来自C的Windows模拟#,c#,windows,impersonation,C#,Windows,Impersonation,作为LocalSystem运行的C#程序如何临时模拟另一个用户的登录标识?粗略地说,我有一个Windows服务,我想作为LocalSystem运行,但有时会模拟用户XYZ(当使用Windows集成安全性连接到数据库时) 最重要的是:有没有一种方法可以在不知道其他用户密码的情况下执行此操作 注意:如果密码是强制性的,是否有安全存储密码的推荐策略(c#和/或vbscript)。对于密码存储部分,您可能需要查看最近的问题 我的回答是: 您可以/应该使用提供存储加密的。 它只是为了解决这类问题 存储的加

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

最重要的是:有没有一种方法可以在不知道其他用户密码的情况下执行此操作


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

对于密码存储部分,您可能需要查看最近的问题

我的回答是:

您可以/应该使用提供存储加密的。
它只是为了解决这类问题

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

  • 用户帐户,因此只有登录的用户才能访问数据。这使得数据可以传输到另一台具有完全相同用户凭据的PC
  • 机器,使数据只能在特定的机器设置上访问,而不能传输到另一台PC
有一个显示实现此功能和其他加密功能所需的确切信息的窗口。
该页面还提供了该节目的源代码


当然,在这个问题上有很多答案。

简短的回答:没有用户密码或用户通过COM调用您的服务,您就不能这样做

要在流程中模拟其他用户,必须调用
ImpersonalLoggedOnUser
需要令牌句柄。有几种方法可以获得令牌句柄:

  • 通过使用以用户身份登录。但是,这要求您知道用户密码
  • 通过使用或复制现有令牌
  • 通过从另一个进程或线程(该进程或线程已作为用户登录)打开令牌,或

    • 这是可能的,尽管它需要您编写大量代码。见和。您需要SeCreateTokenPrivilege,但这不会是问题,因为您是在NT AUTHORITY\SYSTEM下运行的。然后,您可以使用创建的令牌在线程内进行模拟。

      谢谢。虽然没有太多的代码示例:)请注意,不建议在LocalSystem下运行服务,系统管理员不赞成这种做法,我更喜欢做/回答问题。有关模拟代码,请参阅以下两篇代码项目文章:以及它们基于的Microsoft KB文章: