У меня была очень похожая ситуация с сервисным проектом. Вот несколько упрощенный псевдокод, чтобы дать вам представление о том, что я делал:
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», которая была членом группы администраторов, я получал ACCESS DENIED ИЛИ исключение 0xc0000142 из Process.Start ().
Разрешить сервису взаимодействовать с рабочим столом
После проверки «Разрешить службе взаимодействовать с рабочим столом», теперь независимо от того, использовал ли я действительную локальную учетную запись администратора или любую другую учетную запись, которая является членом локальной группы администраторов, моя служба теперь может запускать приложение с повышенными правами в контексте вошедший в систему пользователь.
Конечно, я вернулся и обновил свой код для установки службы, чтобы убедиться, что флаг SERVICE_INTERACTIVE_PROCESS был установлен, поэтому эта опция была установлена программно.
Надеюсь, это кому-нибудь поможет ...