Недавно заметил одну весьма неприятную особенность Windows 7: если программа тербует повышенных прав для запуска, её нельзя автоматически запускать при старте Windows. Причём, неважно каким образом установлено «требование» повышенных прав: через манифест, или в свойствах файла на закладке «Совместимасть». Учитывая тот факт, что для нормального функционирования моего проекта «Oculus» его управляющая программа должна быть запущена с правами администратора, такое положение дел меня совершенно не устраивало. Сегодня я реализовал небольшой «обходной манёвр», быть может, не очень элегантный, но работающий.
Суть метода заключается в том, что сначала программа запускается с обычными, «урезанными» правами. При запуске она проверяет наличие определённого аргумента, и, в случае его отсутствия, запускает сама себя с повышенными правами и с тем самым аргументом. В коде это выглядит примерно так:
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
SHELLEXECUTEINFO TempInfo = {0};
...
if (!Service.has_arg(_T("/admin")))
{
TempInfo.cbSize = sizeof(SHELLEXECUTEINFO);
TempInfo.fMask = 0;
TempInfo.hwnd = NULL;
TempInfo.lpVerb = _T("runas");
TempInfo.lpFile = Service.AppPath();
TempInfo.lpParameters = _T("/admin");
TempInfo.lpDirectory = Service.AppFolder();
TempInfo.nShow = SW_NORMAL;
ShellExecuteEx(&TempInfo);
return 0;
}
...
}
Здесь используется функция ShellExecuteEx с недокументированным параметром «runas», который и позволяет запустить программу с повышенными правами. Service — это мой «мини-фреймворк», содержащий несколько простых полезных функций.
В результате, Windows думает, что запускает программу с урезанными правами, в то время как она коварно перезапускается с правами администратора
.