![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск программы из сервиса с правами администратора
Almaz © (2012-02-19 02:42:00)Добрый день, уважаемые.
Имеется сервис, который общается с пользователем посредством программы-сателлита. Сателлит запускается в контексте каждого пользователя непосредственно сервисом. Сателлит, запущенный под аккаунтом администратора может управлять настройками сервиса, которые хранятся в реестре в HKLM. Все было замечательно, пока не настала Vista с ее UAC. При включенном UAC сателлит запускается под админом, но прав на изменение HKLM естественно не имеет.
Вопрос - можно ли (и если да, то как) запустить из сервиса сателлит с "высоким обязательным уровнем" ?
Eraser (2012-02-20 01:22:00) [21]> [5] DVM © (19.02.12 14:38)
цифровая подпись ни на что не влияет, кроме цвета предупреждения в окне UAC.
Eraser (2012-02-20 01:21:00) [22]> [0] Almaz © (19.02.12 02:42)
а устраивает запуск сателита от имени системы (а не админа), но в контексте текущего терминального юзера?
Almaz (2012-02-19 15:50:00) [23]
> На каком десктопе?
На дефолтном.
Almaz (2012-02-19 15:48:00) [24]
> Rouse_ © (19.02.12 10:39) [2]
Увы, тот же эффект, но за код спасибо :)
DVM (2012-02-19 15:43:00) [25]
> Almaz © (19.02.12 15:24) [6]
> Задача точно имеет решение - планировщик заданий умеет
> запускать ПО от имени админа.
На каком десктопе?
Almaz (2012-02-19 15:24:00) [26]
> Rouse_ © (19.02.12 10:39) [2]
Сейчас попробую, спасибо.
> sniknik © (19.02.12 11:45) [3]
Как и сказал Rouse_ - не стартует вообще тогда. Цифровая подпись от VeriSign не помогает.
p.s. Задача точно имеет решение - планировщик заданий умеет запускать ПО от имени админа.
DVM (2012-02-19 14:38:00) [27]Сдается мне, что тот экзешник, что запускают с правами админа, даже если внедрить туда манифест соответствующий, потребует еще цифровой подписи.
Rouse_ (2012-02-19 12:19:00) [28]Тогда, если я правильно помню, нельзя будет стартануть. Ошибка что-то там с ELEVATE будет связано.
sniknik (2012-02-19 11:45:00) [29]> запускается под админом, но прав на изменение HKLM естественно не имеет.
а если в манифесте этого сателлита прописать права админа, реального админа. не поможет?
Rouse_ (2012-02-19 10:39:00) [30]Попробуй вот этот пример, там немного по другому запускается.
http://rouse.drkb.ru/winapi.php#servicenotifyer
Almaz (2012-02-19 02:44:00) [31]Код запуска сателлита:
function RunAs(Token: THandle; CommandLine: String): BOOL;
var
Desktop: HDESK;
WindowStation, WindowStationSave: THandle;
LogonSID: PSID;
PI: PROCESS_INFORMATION;
SI: STARTUPINFO;
begin
try
WindowStationSave := OSErrorCheck(GetProcessWindowStation());
WindowStation := OSErrorCheck(OpenWindowStation('winsta0', FALSE, READ_CONTROL or WRITE_DAC));
try
OSErrorCheck(SetProcessWindowStation(WindowStation));
try
Desktop := OSErrorCheck(OpenDesktop('default', 0, FALSE,
READ_CONTROL or WRITE_DAC or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS));
try
OSErrorCheck(SetProcessWindowStation(WindowStationSave));
WindowStationSave := 0;
OSErrorCheck(GetLogonSID(Token, LogonSID));
try
OSErrorCheck(AddAceToWindowStation(WindowStation, LogonSID));
OSErrorCheck(AddAceToDesktop(Desktop, LogonSID));
OSErrorCheck(ImpersonateLoggedOnUser(Token));
try
ZeroMemory(@SI, SizeOf(STARTUPINFO));
SI.cb := sizeof(STARTUPINFO);
SI.lpDesktop := 'winsta0\default';
Result := CreateProcessAsUser(Token, PChar(CommandLine), nil, nil, nil,
FALSE, NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE, nil, nil, SI, PI);
finally
RevertToSelf();
end;
if Result then
begin
if PI.hProcess <> INVALID_HANDLE_VALUE then
CloseHandle(PI.hProcess);
if PI.hThread <> INVALID_HANDLE_VALUE then
CloseHandle(pi.hThread);
end;
finally
FreeLogonSID(LogonSID);
end;
finally
CloseDesktop(Desktop);
end;
finally
if WindowStationSave <> 0 then
SetProcessWindowStation(WindowStationSave);
end;
finally
CloseHandle(WindowStation);
end;
except
Result := False;
end;
end;