我在一个服务项目中遇到了非常相似的情况。这是一些过于简化的伪代码,可以让您了解我在做什么:
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 异常。
允许服务与桌面交互
在选中“允许服务与桌面交互”之后,现在无论我使用实际的本地管理员帐户还是本地管理员组成员的任何其他帐户,我的服务现在都可以在登录的上下文中启动提升的应用程序 -在用户上。
当然,我回去更新了安装服务的代码,以确保设置了 SERVICE_INTERACTIVE_PROCESS 标志,所以这个选项是通过编程设置的。
希望这可以帮助某人...