Один elevation, несколько процессов
От: ReadWriteOnly  
Дата: 03.01.13 14:15
Оценка:
Есть оболочка, которая должна последовательно запускать программы, причем, для каждой из них нужны админ права, хотя сама оболчка может быть запущена из-под user.
В принципе, можно вызывать каждый раз ShellExecuteEx c параметром runas, тогда система будет запрашивать разрешение для запуска с соответсвующими правами, но хотелось бы сделать так, чтобы запрос был только один.
Примерно :


// запускаем первое приложение

  SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };

  sei.fMask = SEE_MASK_NOCLOSEPROCESS;
  sei.lpVerb = _T("runas");
  sei.lpFile = m_target.c_str();
  sei.lpParameters = m_commandLine.c_str();

  bool successed = ShellExecuteEx(&sei);

// открываем токен процесса

   HANDLE hToken = NULL;
   HANDLE hDupHandle = NULL;

  if (OpenProcessToken(sei.hProcess, TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE, &hToken)) {
    SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES) };

    DuplicateTokenEx(hToken, TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE, &sa, SecurityIdentification, TokenPrimary, &hDupHandle);
    CloseHandle(hToken);
  }

// теперь хотим использовать открытый токен для создания других процессов

CreateProcessAsUser(hDupHandle, NULL, commandLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &procInfo)


В результате при попытке создания процесса от имени администратора, GetLastError возвращает error_privilege_not_held.
Как можно решить проблему?
winapi
Re: Один elevation, несколько процессов
От: okman Беларусь https://searchinform.ru/
Дата: 03.01.13 14:47
Оценка:
Здравствуйте, ReadWriteOnly, Вы писали:

RWO>Есть оболочка, которая должна последовательно запускать программы, причем, для каждой из них нужны админ права, хотя сама оболчка может быть запущена из-под user.

RWO>В принципе, можно вызывать каждый раз ShellExecuteEx c параметром runas, тогда система будет запрашивать разрешение для запуска с соответсвующими правами, но хотелось бы сделать так, чтобы запрос был только один.

RWO>Примерно :

RWO>...

RWO>В результате при попытке создания процесса от имени администратора, GetLastError возвращает error_privilege_not_held.


Если все было бы так просто, любой смог бы открывать системные процессы, облачаться в их
контекст безопасности и выполнять налево и направо произвольный код с максимальными правами.

RWO>Как можно решить проблему?


Запустить один процесс с повышенными правами и передавать ему команды на запуск нужных процессов.
Re: Один elevation, несколько процессов
От: okman Беларусь https://searchinform.ru/
Дата: 03.01.13 15:38
Оценка:
Здравствуйте, ReadWriteOnly.

Вообще, есть и другие способы. Например, написать COM Elevation Moniker.
Re: Один elevation, несколько процессов
От: Vain Россия google.ru
Дата: 04.01.13 07:49
Оценка:
Здравствуйте, ReadWriteOnly, Вы писали:


RWO>Есть оболочка, которая должна последовательно запускать программы, причем, для каждой из них нужны админ права, хотя сама оболчка может быть запущена из-под user.

RWO>В принципе, можно вызывать каждый раз ShellExecuteEx c параметром runas, тогда система будет запрашивать разрешение для запуска с соответсвующими правами, но хотелось бы сделать так, чтобы запрос был только один.
Пробовал создать batch скрипт и запустить его с повышенными правами так:
cmd /c script.bat
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Один elevation, несколько процессов
От: ReadWriteOnly  
Дата: 04.01.13 08:24
Оценка:
Можно ли как-нибудь через Impersonate-механизм?
Re[3]: Один elevation, несколько процессов
От: okman Беларусь https://searchinform.ru/
Дата: 04.01.13 10:17
Оценка:
Здравствуйте, ReadWriteOnly, Вы писали:

RWO>Можно ли как-нибудь через Impersonate-механизм?


Зачем ? Есть же командная строка, именованные каналы и т.п.
Но в общем случае так делать небезопасно, так как у elevated-процесса нет
стопроцентно надежного способа определить, из доверенного источника пришла
команда или нет.
Re[4]: Один elevation, несколько процессов
От: ReadWriteOnly  
Дата: 04.01.13 10:52
Оценка:
O>Зачем ? Есть же командная строка, именованные каналы и т.п.

Не совсем понимаю как здесь могут помочь именованые каналы.
Командная строке не подходит, т.к. в процессе выполнения процесса, оболочка должна иметь к нему доступ (нужна возможность приостанавливать выполнение, получать какую-либо информацию и т.п.).
Есть условие, чтобы оболочка не требовала админ прав до того момента, как они реально потребуются.
Re[5]: Один elevation, несколько процессов
От: okman Беларусь https://searchinform.ru/
Дата: 04.01.13 11:33
Оценка: 1 (1)
Здравствуйте, ReadWriteOnly, Вы писали:

RWO>Не совсем понимаю как здесь могут помочь именованые каналы.


Имелось в виду, что если требуется запустить группу процессов с повышенными правами,
причем так, чтобы запрос на повышение появлялся только один раз, то можно сначала с помощью
ShellExecute запустить промежуточный elevated-процесс, установить с ним связь (например, через
те же каналы), а затем передать ему команды на запуск других процессов.
Имперсонификация для этого не нужна.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.