Есть оболочка, которая должна последовательно запускать программы, причем, для каждой из них нужны админ права, хотя сама оболчка может быть запущена из-под 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.
Как можно решить проблему?
Здравствуйте, ReadWriteOnly, Вы писали:
RWO>Есть оболочка, которая должна последовательно запускать программы, причем, для каждой из них нужны админ права, хотя сама оболчка может быть запущена из-под user. RWO>В принципе, можно вызывать каждый раз ShellExecuteEx c параметром runas, тогда система будет запрашивать разрешение для запуска с соответсвующими правами, но хотелось бы сделать так, чтобы запрос был только один.
RWO>Примерно : RWO>...
RWO>В результате при попытке создания процесса от имени администратора, GetLastError возвращает error_privilege_not_held.
Если все было бы так просто, любой смог бы открывать системные процессы, облачаться в их
контекст безопасности и выполнять налево и направо произвольный код с максимальными правами.
RWO>Как можно решить проблему?
Запустить один процесс с повышенными правами и передавать ему команды на запуск нужных процессов.
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.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, ReadWriteOnly, Вы писали:
RWO>Можно ли как-нибудь через Impersonate-механизм?
Зачем ? Есть же командная строка, именованные каналы и т.п.
Но в общем случае так делать небезопасно, так как у elevated-процесса нет
стопроцентно надежного способа определить, из доверенного источника пришла
команда или нет.
O>Зачем ? Есть же командная строка, именованные каналы и т.п.
Не совсем понимаю как здесь могут помочь именованые каналы.
Командная строке не подходит, т.к. в процессе выполнения процесса, оболочка должна иметь к нему доступ (нужна возможность приостанавливать выполнение, получать какую-либо информацию и т.п.).
Есть условие, чтобы оболочка не требовала админ прав до того момента, как они реально потребуются.
Здравствуйте, ReadWriteOnly, Вы писали:
RWO>Не совсем понимаю как здесь могут помочь именованые каналы.
Имелось в виду, что если требуется запустить группу процессов с повышенными правами,
причем так, чтобы запрос на повышение появлялся только один раз, то можно сначала с помощью
ShellExecute запустить промежуточный elevated-процесс, установить с ним связь (например, через
те же каналы), а затем передать ему команды на запуск других процессов.
Имперсонификация для этого не нужна.