RSS
 

Элевация и автозапуск в Windows 7

01 Апр

Недавно заметил одну весьма неприятную особенность 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 думает, что запускает программу с урезанными правами, в то время как она коварно перезапускается с правами администратора :) .

 
Комментарии отключены

Posted in Программирование

 

Tags: ,

Comments are closed.