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
http://4programmers.net/Delphi/Artyku%C5%82y/Zamykanie_systemu_w_Delphi
tak
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?
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;
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);