Delphi FAQ

Jak zamknąć, zresetować, wylogować się z systemu

Adam Boduch
Win32Check(ExitWindows(0, 0));
// Zaloguj się jako nowy użytkownik
 
Win32Check(ExitWindowsEx(EWX_REBOOT, 0));
//Uruchom ponownie komputer
 
Win32Check(ExitWindowsEx(EWX_SHUTDOWN, 0));
// Wyłącz komputer

albo (win 2000/xp)

WinExec('shutdown -p -t xx', sw_hide);

gdzie p to parametr, który może wynosić :
-l : wylogowanie
-r : restart
-s : wyłączenie,
zaś xx to liczba sekund po której komputer zostanie wyłączony/zrestartowany.
Można także miedzy parametr a -t dodać -f, przez które windows nie zaczeka na zamknięcie programów

FAQ

9 komentarzy

Oto prawidlowy sposób

//włączenie przywilejów

var hToken: THandle;
tkp: TTokenPrivileges;
Dummy: Cardinal;

Dummy:=0;
if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then
begin
LookupPrivilegeValue(nil,SE_SHUTDOWN_NAME,tkp.Privileges[0].Luid);
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, False,tkp,0,PTokenPrivileges(nil)^,dummy);
if GetLastError=ERROR_SUCCESS then
begin
//od tej chwili działa standardowa funkcja, jak niżej
ExitWindowsEx(EWX_SHUTDOWN,0);
end;
end;

tak pod kazdym winde z cmd sie odpali

Kompilator rzuca mi sie do linijki LookupPrivilegeValue(nil,SE_SHUTDOWN_NAME,tkp.Privileges[0].Luid);
Undeclared identifier: 'SE_SHUTDOWN_NAME'
o co chodzi? Trzeba coś dodać może w sekcji uses?

Polecenie zamykania i resetowania pod XP nie dziala - pisze ze nie ma odpowiednich uprawnien chociaz jestem adminem

a ja mam pytanie: jak to zrobić w Win2000, wygrzbałem z SDK, że trzeba zrobić
SE_PRIVILIGE_ENABLED dla SE_SHUTDOWN_NAME w AdjustTokenPiviliges ale niebardzo wiem jak zbudować składnię...

  • Win32Check(ExitWindowsEx(EWX_SHUTDOWN, 0));
    // w Win2000 powoduje błąd 1314 "klient nie ma wymaganego przywileju" czyli właśnie Shutdown_Name jak sądzę...

jak ktoś wie to proszę o pomoc

u mnie dziala tylko wyloguj

A jak to zrobić w Windows'ie XP?
Tak:

WinExec('shutdown.exe -s -f -t 0', SW_HIDE);