Re[4]: CreateProcessAsUser
От: _spin_ Россия  
Дата: 01.08.06 14:34
Оценка:
Здравствуйте, Slava Antonov, Вы писали:

SA>Для того чтобы тот код работал нужно иметь права системы, насколько я помню. Т.е. функция предназначена для сервисов.


работает и в GUI без всяких проблем. Алгоритм установки привилегий прост:

Взять привилегии текущего процесса,
Добавить/удалить необходимые привилегии
Запустить процесс AsUser.

Следующий код (взято из DelphiWorld, проверено, работает) выставляет
отладочные привилегии самому себе и имея эти привилегии рубит процесс по его PID`у, после чего удаляет отладочные привилегии.



function ProcessTerminate(dwPID:Cardinal):Boolean; 
var 
 hToken:THandle; 
 SeDebugNameValue:Int64; 
 tkp:TOKEN_PRIVILEGES; 
 ReturnLength:Cardinal; 
 hProcess:THandle; 
begin 
 Result:=false; 
 // Добавляем привилегию SeDebugPrivilege  
 // Для начала получаем токен нашего процесса 
 if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES 
  or TOKEN_QUERY, hToken ) then 
    exit; 

 // Получаем LUID привилегии 
 if not LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue )  
  then begin 
   CloseHandle(hToken); 
   exit;  
  end; 

 tkp.PrivilegeCount:= 1; 
 tkp.Privileges[0].Luid := SeDebugNameValue; 
 tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; 

 // Добавляем привилегию к нашему процессу 
 AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength); 
 if GetLastError()< > ERROR_SUCCESS  then exit; 

 // Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем 
 // завершить и системный процесс 
 // Получаем дескриптор процесса для его завершения 
 hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID); 
 if hProcess =0  then exit; 
  // Завершаем процесс 
   if not TerminateProcess(hProcess, DWORD(-1)) 
    then exit; 
 CloseHandle( hProcess ); 
  
 // Удаляем привилегию  
 tkp.Privileges[0].Attributes := 0;  
 AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength); 
 if GetLastError() < >  ERROR_SUCCESS 
  then exit; 
  
 Result:=true;  
end;
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Не восхрапи на работе, ибо храпом своим разбудишь начальника своего.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.