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