Ga naar inhoud

[Delphi] Windows afsluiten


Aanbevolen berichten

Dit kan eenvoudig met de Windows API (gebruik ExitWindowsEx). Informatie over de Windows API functies is te vinden in Delphi Help. [quote:6b84b5da1c="Johan Stokking"]Hoe doe je dat? Ik heb wel iets gevonden voor Windows 98... Maar die werkt weer niet in Windows 2000/XP en omgekeerd. Weet iemand hoe dit moet?? Alvast bedankt, Johan[/quote:6b84b5da1c]
Link naar reactie
[quote:4a43358d05="Johan Stokking"]Hoe doe je dat? Ik heb wel iets gevonden voor Windows 98... Maar die werkt weer niet in Windows 2000/XP en omgekeerd. Weet iemand hoe dit moet?? [/quote:4a43358d05] [code:1:4a43358d05] function SetPrivilege(PrivilegeName: string; Enable: boolean): boolean; var tpPrev, tp: TTokenPrivileges; token: THandle; dwRetLen: DWord; OSVersionInfo: TOSVersionInfo; begin Assert(not (PrivilegeName = ''), 'Pre-conditie: PrivilegeName is niet ingevuld'); result := False; OSVersionInfo.dwOSVersionInfoSize := SizeOf(OsVersionInfo); if GetVersionEx(OSVersionInfo) then begin if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token) then try tp.PrivilegeCount := 1; if LookupPrivilegeValue(Nil, PChar(PrivilegeName), tp.Privileges[0].LUID) then begin if Enable then tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else tp.Privileges[0].Attributes := 0; dwRetLen := 0; result := AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen); end; finally CloseHandle(token); end; end else begin result := True; end; end; end; begin SetPrivilege('SeShutdownPrivilege', True); if (not ExitWindowsEx(EWX_POWEROFF,0)) then ExitWindowsEX(EWX_SHUTDOWN,0)); end; [/code:1:4a43358d05] Kan zijn dat deze code toch niet onder Windows 9x werkt, dan komt dit omdat de volgende functies alleen op NT+ systemen werken die geprobeerd worden om te laden door de Windows Program Loader. Het beste kun je deze dus dynamisch laden i.p.v. statisch zoals bovenstaand stukje code. Dit kun je doen met GetModuleHandle en GetProcAddress. OpenProcessToken (advapi32.dll) LookupPrivilegeValue (advapi32.dll) AdjustTokenPrivileges (advapi32.dll)
Link naar reactie
  • 2 weken later...
Wat ik zou doen, is gewoon onder Windows 9x het systeem afsluiten door RUNDLL USER.EXE,ExitWindows aan te roepen, en onder Windows XP het programma SHUTDOWN aan te roepen, bijv. SHUTDOWN -s -t 01 of iets dergelijks. Maar dan zou je dus eerst even een routine moeten maken die de Windows-versie bepaalt... Je kan dat op de officiele manier doen, je kan ook naar wat omgevingsvariabelen kijken, zoals OS en WINDIR (gebruikt onder NT) en WINBOOTDIR (gebruikt onder 9x). Ikzelf maak gebruik van een Class (VB6) om het besturingsysteem te achterhalen. Maargoed, ik ben dus VB programmeur en heb niet zoveel verstand van Delphi, misschien dat je hier toch iets aan hebt...
Link naar reactie
[quote:066efb2ba3="h4xX0r"][quote:066efb2ba3="Johan Stokking"]Hoe doe je dat? Ik heb wel iets gevonden voor Windows 98... Maar die werkt weer niet in Windows 2000/XP en omgekeerd. Weet iemand hoe dit moet?? [/quote:066efb2ba3] ... Kan zijn dat deze code toch niet onder Windows 9x werkt, dan komt dit omdat de volgende functies alleen op NT+ systemen werken die geprobeerd worden om te laden door de Windows Program Loader. Het beste kun je deze dus dynamisch laden i.p.v. statisch zoals bovenstaand stukje code. Dit kun je doen met GetModuleHandle en GetProcAddress. OpenProcessToken (advapi32.dll) LookupPrivilegeValue (advapi32.dll) AdjustTokenPrivileges (advapi32.dll)[/quote:066efb2ba3] Stop de volgende code in een aparte unit. [code:1:066efb2ba3] { ************************************************** } { Shutdown Code for Win9x/NT/2000/XP (c) 2002 h4xX0r } { ************************************************** } function FunctionDetect(LibName, FuncName: String; var LibPointer: Pointer): boolean; var LibHandle: THandle; begin Result := false; LibPointer := Nil; if (LoadLibrary(PChar(LibName)) = 0) then Exit; LibHandle := GetModuleHandle(PChar(LibName)); if (LibHandle <> 0) then begin LibPointer := GetProcAddress(LibHandle, PChar(FuncName)); if (LibPointer <> Nil) then Result := true; end; end; function SetPrivilege(const PrivilegeName: string; Enable: boolean): boolean; var tpPrev, tp: TTokenPrivileges; token: THandle; dwRetLen: DWord; OSVersionInfo: TOSVersionInfo; _OpenProcessToken: function ( ProcessHandle: THandle; DesiredAccess: Cardinal; var TokenHandle: Cardinal): LongBool; stdcall; _LookupPrivilegeValue: function ( lpSystemName: PChar; lpName: PChar; var lpLuid: Int64): LongBool; stdcall; _AdjustTokenPrivileges: function ( TokenHandle: Cardinal; DisableAllPrivileges: LongBool; const NewState: _TOKEN_PRIVILEGES; BufferLength: Cardinal; var PreviousSate: _TOKEN_PRIVILEGES; var ReturnLength: Cardinal): LongBool; stdcall; begin Assert(not (PrivilegeName = ''), 'Pre-conditie: PrivilegeName is niet ingevuld'); result := False; OSVersionInfo.dwOSVersionInfoSize := SizeOf(OsVersionInfo); if GetVersionEx(OSVersionInfo) then begin if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin if (FunctionDetect('ADVAPI32.DLL','OpenProcessToken',@_OpenProcessToken) and FunctionDetect('ADVAPI32.DLL','LookupPrivilegeValueA',@_LookupPrivilegeValue) and FunctionDetect('ADVAPI32.DLL','AdjustTokenPrivileges',@_AdjustTokenPrivileges)) then begin if _OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, token) then try tp.PrivilegeCount := 1; if _LookupPrivilegeValue(Nil, PChar(PrivilegeName), tp.Privileges[0].LUID) then begin if Enable then tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else tp.Privileges[0].Attributes := 0; dwRetLen := 0; result := _AdjustTokenPrivileges(token, False, tp, SizeOf(tpPrev), tpPrev, dwRetLen); end; finally CloseHandle(token); end else begin // ShowMessage(IntToStr(GetLastError)); end; end; end else begin result := True; end; end; end; procedure Shutdown; begin SetPrivilege('SeShutdownPrivilege', True); if (not ExitWindowsEx(EWX_POWEROFF,0)) then ExitWindowsEX(EWX_SHUTDOWN,0); end; [/code:1:066efb2ba3] Het is wel iets meer code dan alleen maar de functie ExitWindowsEx aanroepen, maar dit geeft je wel de garantie dat dit altijd gaat werken onder zowel Windows 9x,NT,2000,XP en hoger, mits je natuurlijk de juiste rechten hebt om het systeem te mogen afsluiten.
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...