作为 LocalSystem 运行的 C# 程序如何临时冒充另一个用户的登录身份?粗略地说,我有一个 Windows 服务,我想作为 LocalSystem 运行,但有时会模拟用户 XYZ(使用 Windows 集成安全性连接到数据库时)。
最重要的是:有没有办法在不知道其他用户密码的情况下做到这一点?
注意:如果密码是强制性的,是否有安全存储密码的推荐策略(c# 和/或 vbscript)。
作为 LocalSystem 运行的 C# 程序如何临时冒充另一个用户的登录身份?粗略地说,我有一个 Windows 服务,我想作为 LocalSystem 运行,但有时会模拟用户 XYZ(使用 Windows 集成安全性连接到数据库时)。
最重要的是:有没有办法在不知道其他用户密码的情况下做到这一点?
注意:如果密码是强制性的,是否有安全存储密码的推荐策略(c# 和/或 vbscript)。
这是可能的,虽然它需要你做很多代码。请参阅NtCreateToken和CreateToken。您需要 SeCreateTokenPrivilege,尽管这不会成为问题,因为您是在 NT AUTHORITY\SYSTEM 下运行的。然后,您可以使用创建的令牌在线程内进行模拟。
简短的回答:你不能没有用户密码或用户通过 COM 调用你的服务。
要在您的流程中冒充另一个用户,您必须调用ImpersonateLoggedOnUser
. ImpersonateLoggedOnUser
需要令牌句柄。有几种方法可以获得令牌句柄:
LogonUser
。但是,这需要您知道用户密码。CreateRestrictedToken
通过使用、DuplicateToken
或复制现有标记DuplicateTokenEx
。OpenProcessToken
或OpenThreadToken
对于密码存储部分,您可能想看看最近提出的这个问题。
这是我的回答:
您可以/应该使用DPAPI,即提供存储加密的数据保护 API 。
它只是针对这种类型的问题。
存储的加密基于:
有一个与 Karl Franklin 合作的 dnrTV 节目,准确地展示了实现此功能和其他加密功能所需的内容。
该节目的源代码也可在页面上找到。
当然,还有很多关于这个主题的其他文章。