【发布时间】:2014-10-16 20:45:18
【问题描述】:
我有一个可以使用进程模拟运行的桌面应用程序(不是服务)。我通过使用一个单独的应用程序作为启动器来实现这一点,并使用 CreateProcessWithLogonW 在不同的用户下运行应用程序。在用户退出应用程序后,我需要弄清楚如何让应用程序在 Windows 会话用户的凭据下运行启动器进程而不提示输入密码。
我目前的策略是:
- 使用 ProcessIdToSessionId 从应用程序进程中获取会话 ID。
- 使用 WTSQueryUserToken 从会话 ID 中获取主用户令牌。
- 对我不太清楚的事情使用 DuplicateTokenEx。
- 使用 CreateProcessAsUser 运行进程。
目前,WTSQueryUserToken 失败,结果为 ERROR_PRIVILEGE_NOT_HELD (http://msdn.microsoft.com/en-us/library/aa383840(v=vs.85).aspx)。有没有其他方法可以获取该令牌?是否有另一种完全可以解决此问题的策略?
另外,我正在使用 C#,并且对 P/Invokes 还很陌生。谢谢
【问题讨论】:
-
哪个用户正在运行该应用程序以及谁被模拟?您如何识别要模拟的用户?
-
用户 A 已登录到 windows。应用程序启动器 exe 在用户 A 下运行,用户 B 键入凭据,然后在用户 B 下启动应用程序。然后应用程序需要在用户 A 下启动启动器进程,而无需密码提示。为了检测模拟,我通过 WTSQuerySessionInformation 获取 windows 会话用户的用户名,并将其与 Environment.UserName 属性进行比较。
标签: c# impersonation