Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2018.05.13;
Скачать: [xml.tar.bz2];

Вниз

Переделал WindowsShutdown из KOL   Найти похожие ветки 

 
Ruzzz ©   (2010-02-22 05:12) [0]

Переделал WindowsShutdown из KOL.pas


// if fail Result = 0
function EnablePrivilege(const Machine, PrivilegesName: KOLString;
 var PreviousState: TTokenPrivileges): THandle;
var
 Ftkp: TTokenPrivileges;
 dwRetLen :DWORD;
begin
 if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
   or TOKEN_QUERY, Result) then
 begin
   Result := 0;
   Exit;
 end;

 if not LookupPrivilegeValue(PKOLChar(Machine), PKOLChar(PrivilegesName),
   Ftkp.Privileges[0].Luid) then
 begin
   CloseHandle(Result);
   Result := 0;
   Exit;
 end;

 Ftkp.PrivilegeCount := 1;
 Ftkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 // TODO: Корректно обрабатывать PreviousState, dwRetLen
 if (not AdjustTokenPrivileges(Result, FALSE, Ftkp, sizeof(Ftkp),
   PreviousState, dwRetLen)) or (GetLastError() = ERROR_NOT_ALL_ASSIGNED) then
 begin
   CloseHandle(Result);
   Result := 0;
   Exit;
 end;
end;

procedure RestorePrivilege(hToken: THandle; Previous: TTokenPrivileges);
var
 dummy: Cardinal;
begin
 AdjustTokenPrivileges(hToken, FALSE, Previous, sizeOf(Previous), nil, dummy);
 CloseHandle(hToken);
end;

function WindowsShutdown(const Machine: KOLString; Force, Reboot: Boolean): Boolean;
var
 hToken: THandle;
 tkp_prev: TTokenPrivileges;
 Flags: Integer;
 PrName: KOLString;
begin
 Result := False;
 if Integer( GetVersion ) < 0 then // Windows95/98/Me
 begin
   if Machine <> "" then Exit;
   Flags := EWX_SHUTDOWN;
   if Reboot then
     Flags := Flags or EWX_REBOOT;
   if Force then
     Flags := Flags or EWX_FORCE;
   Result := ExitWindowsEx( Flags, 0 );
   Exit;
 end;

 if Machine = "" then
   PrName := "SeShutdownPrivilege"
 else
   PrName := "SeRemoteShutdownPrivilege";
 hToken := EnablePrivilege(Machine, PrName, tkp_prev);
 if hToken = 0 then Exit;
 Result := InitiateSystemShutdown(PKOLChar(Machine), nil, 0, Force, Reboot);
 if not Result then RestorePrivilege(hToken, tkp_prev);
 // Иначе восстанавливать нет смысла
end;


В оригинале не закрывается hToken, не критично но все же :) Плюс лишний tkp_prev:=tkp; и зачем получать сразу обе привилегии "SeShutdownPrivilege" и "SeRemoteShutdownPrivilege"? Плюс код включения привелегий может еще кому-то пригодиться. Например вот:


function Suspend(Hibernate, Force: Boolean): Boolean;
var
 hToken: THandle;
 tkp_prev: TTokenPrivileges;
begin
 Result := False;
 if Integer( GetVersion ) < 0 then Exit; // Windows95/98/Me
 hToken := EnablePrivilege("", "SeShutdownPrivilege", tkp_prev);
 if hToken = 0 then Exit;
 Result := SetSystemPowerState(not Hibernate, Force); // or SetSuspendState
 RestorePrivilege(hToken, tkp_prev);
end;


Если ошибок нет, предлагаю заменить и добавить.


 
miek   (2010-02-23 13:27) [1]

По-моему, незачем корректно закрывать хендлы, если все равно следом выполняется перезагрузка.


 
Ruzzz ©   (2010-02-23 22:11) [2]

miek, в коде видно, что хендл закрывается лишь в случае ошибки, конечно же, врядли незакрытие сделает проблемы, но все же.

Основная идея это EnablePrivilege и RestorePrivilege которые могут пригодиться. Ну и исправления:
«лишний tkp_prev:=tkp; и зачем получать сразу обе привилегии "SeShutdownPrivilege" и "SeRemoteShutdownPrivilege"»



Страницы: 1 вся ветка

Форум: "KOL";
Текущий архив: 2018.05.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.001 c
15-1472310718
Кто б сомневался
2016-08-27 18:11
2018.05.13
Алгоритмы распознавания 2D изображений с фото


11-1261769000
RusSun
2009-12-25 22:23
2018.05.13
Не соответствие индексов.


11-1266887722
Ruzzz
2010-02-23 04:15
2018.05.13
Определение версии Windows в KOL


15-1472219693
Rouse_
2016-08-26 16:54
2018.05.13
Нужен небольшой тест


11-1266804761
Ruzzz
2010-02-22 05:12
2018.05.13
Переделал WindowsShutdown из KOL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский