Не может работать от имени пользователя, не являющегося администратором - доступ запрещен - PullRequest
1 голос
/ 21 сентября 2010

Я выполняю олицетворение учетной записи пользователя, не являющегося администратором, в приложении, работающем от имени администратора (используя функции LogonUser(), DuplicateToken() и WindowsIdentity.Impersonate()). Поскольку эта учетная запись пользователя временная, мне также необходимо загрузить профиль пользователя (используя LoadUserProfile() встроенную функцию). Все методы выполняются успешно (последняя ошибка не указана), и текущая идентификация является ожидающим пользователем без прав администратора. Однако, когда я пытаюсь запустить новый процесс с System.Diagnostics.Process.Start(), я получаю сообщение об ошибке:

Доступ запрещен.

Когда я пытаюсь вручную выполнить тот же сценарий с помощью runas / profile / user: mynonadmin user, все работает нормально.

Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

У меня была очень похожая ситуация с сервисным проектом. Вот несколько упрощенный псевдокод, чтобы дать вам представление о том, что я делал:

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 был установлен, поэтому эта опция была установлена ​​программно.

Надеюсь, это кому-нибудь поможет ...

0 голосов
/ 24 марта 2015

Наткнулся на это некоторое время назад.

Олицетворенный пользователь не имел доступа к CWD, установленному для объекта Process.Создайте объект ProcessStartInfo и установите для рабочего каталога местоположение, к которому у олицетворенного пользователя есть доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...