Как процесс администратора может открыть приложение вошедшего в систему пользователя?

The Process

exe / dll скомпилированы в C ++ для запуска

сценарий

  1. Войдите (win 7) в стандартную учетную запись пользователя (без администратора)
  2. бежать The Process как админ
  3. The Process открывает приложение (exe), используя ShellExecute

проблема

Приложение открывается в сфера действия администратора

Ожидая

Приложение открывается в сфера действия обычного пользователя


1. CreateProcessAsUser

использование CreateProcessAsUser (Предполагая, что мне удалось получить hToken правильно что должен был решить вопрос).

Тем не менее, я получаю вызов сбой с кодом ошибки 1314 — ERROR_PRIVILEGE_NOT_HELD. Возвращение к документации говорит мне:

Если эта функция завершается с ошибкой ERROR_PRIVILEGE_NOT_HELD (1314), используйте
Вместо этого создайте функцию CreateProcessWithLogonW

Так что я покопался и нашел это Ошибка CreateProcessAsUser 1314 что было не очень полезно.

2. ImpersonateLoggedOnUser

с помощью ImpersonateLoggedOnUser генерируется тот же код ошибки: 1314 — ERROR_PRIVILEGE_NOT_HELD.

3. CreateProcessWithLogonW

CreateProcessWithLogonW требует lpPassword что естественно у меня нет


Как процесс администратора может открыть приложение вошедшего в систему пользователя?

2

Решение

Вы пытались использовать CreateProcessWithTokenW который упоминается в CreateProcessWithLogonW документация? Кажется, требуется гораздо более слабая привилегия, чем CreateProcessAsUser, тот, которым ты должен обладать (SE_IMPERSONATE_NAME скорее, чем SE_ASSIGNPRIMARYTOKEN_NAME).

Вы сказали, что у вас уже есть токен для интерактивного пользователя, поэтому я не буду вдаваться в подробности.

(Примечание: со всем этим сообщалось о странных ошибках, включая CreateProcessWithTokenW, Не сдавайся с первой попытки. Ошибка и исправление, например: почему CreateProcessWithTokenW завершается ошибкой с ERROR_ACCESS_DENIED )


hToken не «правильно». Это знак. Ошибка говорит о том, что вам не хватает привилегия.

Владение привилегией не является фундаментальным правом! Некоторые привилегии предоставляются определенным пользователям по умолчанию. Другие должны быть предоставлены через Политика локальной безопасности (в узле «Назначение прав пользователя» в оснастке MMC или с LsaAddAccountRights — все что задокументировано на странице Назначение привилегий учетной записи).

Помимо этого вам иногда приходится включить использование привилегий AdjustTokenPrivileges. Это задокументировано на странице родного брата Изменение привилегий в токене.

Некоторые API включают их, если вы их держите. Другие этого не делают и требуют от вас сами. Очевидный путь — включить привилегию перед вызовом и задокументированный API, который требует ее.

Возможно, ссылки на MS Forum не было, но сообщение об ошибке совершенно ясно. MSDN говорит о функции:

Как правило, процесс, который вызывает CreateProcessAsUser
функция должна иметь SE_INCREASE_QUOTA_NAME привилегия
и может потребовать SE_ASSIGNPRIMARYTOKEN_NAME привилегия
если токен не может быть назначен

и ошибка (со страницы, на которую вы ссылаетесь!):

ERROR_PRIVILEGE_NOT_HELD
  1314 (0x522)
  Требуемая привилегия не удерживается клиентом.

1

Другие решения

Это на самом деле очень сложная задача, которую вы хотите выполнить. Существуют очень строгие политики безопасности, которые делают его очень сложным.

Насколько я знаю, вы можете сделать это с PsExec. Он имеет переключатель командной строки, который обеспечивает взаимодействие с пользователем, но запускает процесс от имени администратора. Я думаю, что ваша команда должна выглядеть следующим образом:

psexec \\target-computer -i -s [your command]

Другой способ сделать это — использовать WMI. Но для этого вам нужно изменить параметры безопасности целевой машины (возможно, с помощью объектов групповой политики). Вам необходимо подключиться к целевой машине, используя уровень олицетворения deletgate увидеть Вот. Кроме того, как уже было сказано, вам нужно изменить настройки безопасности. Увидеть Вот

0