我在一个服务项目中遇到了非常相似的情况。下面是一些过于简化的伪代码,让您了解我在做什么:
uint ConsoleSessionID = WTSGetActiveConsoleSessionId()
WTSQueryUserToken(ConsoleSessionID, out hToken)
IsUserInAdminGroup(hToken)
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, ref sa, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenPrimary, out IntPtr DuplicateToken)
WindowsIdentity.RunImpersonated(new SafeAccessTokenHandle(DuplicateToken), () =>
{
Process p = new Process();
p.StartInfo.FileName = ...
p.StartInfo.Arguments = ...
p.WorkingDirectory = ...
p.StartInfo.UseShellExecute = true;
p.StartInfo.Verb = "runas"; // Elevated!
p.Start();
}
当使用本地管理员帐户登录 Windows 时,这工作得非常好。
但是,如果我创建了一个属于管理员组成员的“Test_User”帐户,则会收到来自 Process.Start() 的 ACCESS DENIED 或 0xc0000142 异常。
Allow service to interact with desktop
选中“允许服务与桌面交互”后,现在无论我使用的是实际的本地管理员帐户,还是本地管理员组成员的任何其他帐户,我的服务现在都可以在登录用户。
当然,我返回并更新了安装服务的代码,以确保设置了 SERVICE_INTERACTIVE_PROCESS 标志,因此以编程方式设置了此选项。
希望这对某人有所帮助...