Ga naar inhoud

[Delpi] systeem afsluiten


Aanbevolen berichten

Hallo, Ik wil een programmaatje schrijven dat ik via Geplande Taken aan kan roepen dat, zodra je het aanroept het systeem Power-Off doet. In Windows zit een tool - shutdown.exe - die het systeem af kan sluiten, maar die ondersteunt Power-Off niet. Ik krijg dus een melding dat ik het systeem uit kan schakelen. Nu had ik wat in de Windows SDK help files zitten neuzen, en daar had ik iets gevonden over ExitWindowsEx. Maar veel wijzer wordt ik er niet van. Wie heeft hier verstand van?
Link naar reactie
Eerst zo je als je onder NT draait de recht goed moeten zetten. (ook onder 2000 en XP deze zijn ook NT). [code:1:d047681516] var hProc: Cardinal; hToken: Cardinal; pLUID: Int64; pPriv: TTokenPrivileges; pNewPriv: TTokenPrivileges; pSize: Cardinal; if Win32Platform = VER_PLATFORM_WIN32_NT then begin hProc := GetCurrentProcess(); OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken); LookupPrivilegeValue(nil, 'SeShutdownPrivilege', pLUID); pPriv.PrivilegeCount := 1; pPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; pPriv.Privileges[0].Luid := pLUID; pSize := SizeOf(pNewPriv); AdjustTokenPrivileges(hToken, False, pPriv, SizeOf(pPriv), pNewPriv, pSize); end;[/code:1:d047681516] Nu kan je de functie "ExitWindowsEx" aan roepen: [code:1:d047681516] ExitWindowsEx(EWX_SHUTDOWN,0); [/code:1:d047681516] De volgende optie kunnen worden mee gegeven: EWX_LOGOFF EWX_REBOOT EWX_FORCE EWX_POWEROFF EWX_SHUTDOWN Suc6
Link naar reactie
Windows kan je zo afsluiten : procedure TForm1.Button1Click(Sender: TObject); begin ExitWindowsEx(EWX_SHUTDOWN,$FF); { Flags: EWX_LOGOFF EWX_REBOOT EWX_FORCE EWX_POWEROFF EWX_SHUTDOWN $FF is simpelweg niet gebruikt, maar moet wel worden ingevuld ! } end; ik hoop dat het dat is dat je bedoeld! Groetjes, Wim.
Link naar reactie
[quote:2bf9531fb7="DJPeedee"] Ik wil een programmaatje schrijven dat ik via Geplande Taken aan kan roepen dat, zodra je het aanroept het systeem Power-Off doet. In Windows zit een tool - shutdown.exe - die het systeem af kan sluiten, maar die ondersteunt Power-Off niet. Ik krijg dus een melding dat ik het systeem uit kan schakelen. Nu had ik wat in de Windows SDK help files zitten neuzen, en daar had ik iets gevonden over ExitWindowsEx. Maar veel wijzer wordt ik er niet van. Wie heeft hier verstand van?[/quote:2bf9531fb7] [code:1:2bf9531fb7] ************************************************** * Shutdown PC code for Delphi (c) 2003 H4xX0r * * (Compatible code voor Win9x/ME/NT/2000/XP) * ************************************************** function FunctionDetect(const 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; function ShutdownMyPC: boolean; begin SetPrivilege('SeShutdownPrivilege', True); result := ExitWindowsEx(EWX_POWEROFF or EWX_SHUTDOWN,0) end; [/code:1:2bf9531fb7]
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

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...