Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запуск программы из сервиса с правами администратора


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо