![]() |
TShutDown komponente
Liste der Anhänge anzeigen (Anzahl: 1)
Als mir mal wieder langweilig war, habe ich mir gedacht dass ich doch mal eine kompo
fürs runterfahren einens rechners schreiben könnte: Man kann mit ihr ganz einfach den rechner -Runterfahren -Ausschalten -Neustarten -In den StandBy-Mode versetzten -In den Ruhezustand verstezten -Und sich abmelden Bitte jedem fehler melden! Danke. |
DP-Maintenance
Dieses Thema wurde von "Chakotay1308" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Open-Source" verschoben.
Eine Komponente ist kein Eintrag für die CodeLibrary. ;) |
Re: TShutDown komponente
Mist, da stand grad noch Blödsinn. :lol:
Abmelden geht bei mir schonmal den Rest möchte ich gerade nicht testen. ;) |
Re: TShutDown komponente
Schon mal Gedanken über den leeren else-Block gemacht?
Delphi-Quellcode:
Ich komme nicht umhin zu glauben, dass du das irgendwo zusammenkopiert hast. Denn diesen Kommentar:
procedure GetPrivileges; //Rechte um runterzufahren holen.
var vi : TOSVersionInfo; hToken : THandle; tp : TTokenPrivileges; h : DWord; begin vi.dwOSVersionInfoSize := SizeOf(vi); GetVersionEx(vi); if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then // Windows NT begin // Achtung bei Delphi 2 muß @hToken stehen ... !!!! ????? OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken); LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid); tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; h := 0; AdjustTokenPrivileges(hToken, False, tp, 0, PTokenPrivileges(nil)^, h); CloseHandle(hToken); end else // Windows 95 begin end; end; Zitat:
Ich habe noch diesen Code auf der Paltte rumfliegen:
Delphi-Quellcode:
Den könnte man bestimmt auch noch verbessern.
function ExitWin(flag: word): Boolean;
var vi : TOSVersionInfo; hToken : THandle; tp : TTokenPrivileges; h : DWord; begin vi.dwOSVersionInfoSize := SizeOf(vi); GetVersionEx(vi); if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then // Windows NT begin OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken); LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid); tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; h := 0; AdjustTokenPrivileges(hToken, False, tp, 0, PTokenPrivileges(nil)^, h); CloseHandle(hToken); result := ExitWindowsEx(flag, 0); end else // Windows 95 begin Result := ExitWindowsEx(flag, 0); end; end; |
Re: TShutDown komponente
@Luckie: Dein Code ist aus der
![]() |
Re: TShutDown komponente
Zitat:
![]() Da wurden sogar meine Rechtschreibfehler mit kopiert und eingefügt. Nur am Sourcecode wurden ein paar kleine Änderung gemacht. |
Re: TShutDown komponente
Zitat:
|
Re: TShutDown komponente
[ot]Wenn dann wenigstens eine Meldung wie "95 ist blöd" gekommen wäre...[/ot]
|
Re: TShutDown komponente
[ot]oder eine meldung zeigen "was sie tun sich noch win9x noch an?" :mrgreen: und dann nach einem klick auf ok eine weitere meldung zeigen mit der bitte auf Start > Ausführen zu klicken und dannach IIRC "rundll32.exe user,ExitWindows" einzugeben und dann auf Ok klicken zum herunterfahren.[/ot] hehe :twisted:
|
Re: TShutDown komponente
Bitte kommt wieder zurück zum Thema.
|
Re: TShutDown komponente
Ja ihr habt vollkommen recht dass das eigektliich nur eine zusammenfassung von vielen Code-Sniplsenl ist. Aber der sinn ist einfach dass man nun leichter shutdownen kann.
zum Else-block ...ja habbich halt vergessen wegzumachen weil mir nicht engefalen ist was ich da rein machen sollte. :duck: |
Re: TShutDown komponente
Einfacher geht's so (Zusammenfassung):
Delphi-Quellcode:
type
TExit=(Reboot,Shutdown,Logoff,Hibernate,Standby);
Delphi-Quellcode:
procedure GetShutdownPrivileges;
//Urheber: Daniel B. var vi : TOSVersionInfo; hToken : THandle; tp : TTokenPrivileges; h : DWord; begin vi.dwOSVersionInfoSize:=SizeOf(vi); GetVersionEx(vi); if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then begin OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hToken); LookupPrivilegeValue(nil,'SeShutdownPrivilege',tp.Privileges[0].Luid); tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; h := 0; AdjustTokenPrivileges(hToken,False,tp,0,PTokenPrivileges(nil)^,h); CloseHandle(hToken); end; end;
Delphi-Quellcode:
greetz ...
procedure ExitWin(Exit:TExit;Force:boolean);
var Flags:integer; begin GetShutdownPrivileges; if Exit=Shutdown then ExitWindowsEx(EWX_ShutDown,0); if Exit=Hibernate then SetSystemPowerState(false,Force); if Exit=Standby then SetSystemPowerState(true,Force); if Exit=Logoff then begin Flags:=EWX_LOGoff; if Force then flags:=flags+EWX_FORCE; ExitWindowsEx(flags,0); end; if Exit=Reboot then begin flags:=EWX_REBOOT; if Force then flags:=flags+EWX_FORCE; ExitWindowsEx(flags,0); end; end; |
Re: TShutDown komponente
Warum ist GetShutdownPrivilege keine Funktion deren Rückgabewert man auswerten könnte? Was passiert, wenn es fehl schlägt? Dann rennst du muit dem restlichen Code in ein offenes Messer.
|
Re: TShutDown komponente
Ich kann mir keinen Grund vorstellen, warum GetShutdownPrivileges einen negativen Wert zurückgeben sollte.
|
Re: TShutDown komponente
Weil ein Benutzer das Privileg nicht hat und somit nicht aktiviert werden kann?
Zitat:
Waren übrigens die letzten Worte des Programmierers bevor der Bufferoverflow seinen Computer zum Absturz brachte. |
Re: TShutDown komponente
Entschuldige, wenn meine Programmierkünste und -erfahrungen nicht den deinigen entsprechen, Luckie. Deine Kritik kann trotzdem etwas freundlicher formuliert werden.
Wenn du etwas konstruktive Kritik abgeben willst, dann sag mir doch, wie es besser geht. |
Re: TShutDown komponente
Habe ich doch: Mach eine Funktion raus und überprüfe den Rückgabewert bevor du im Code fortfährst.
BTW bin ich der Meinung, dass meine Bemerkung emotional neutral und weder unfreundlich noch aggressiv oder gar beleidigend war. |
Re: TShutDown komponente
Welche Stelle soll denn fraglich sein, dass funktioniert, was ausgeführt wird? So wie ich das sehe, holt sich die Prozedur einfach die Rechte (wenn'n ein Win NT ist).
|
Re: TShutDown komponente
Achim,
wenn Microsoft für den Fall, dass etwas schief geht, diesen drei Funktionen
den Rückgabewert 0 gegeben hat, dann solltest du das als Programmierer der Sicherheit wegen doch einfach auch beachten und überprüfen. |
Re: TShutDown komponente
So habe ich es gemacht:
Delphi-Quellcode:
Es wird der Wert von GetLastError zurückgegeben den man auswerten kann. Man könnte das noch etwas verbessern, die Zuweisung von Result ist etwas umständlich.
function EnablePrivilege(const Privilege: string; fEnable: Boolean; out
PreviousState: Boolean): DWORD; var Token : THandle; NewState : TTokenPrivileges; Luid : TLargeInteger; PrevState : TTokenPrivileges; Return : DWORD; begin PreviousState := True; if (GetVersion() > $80000000) then // Win9x Result := ERROR_SUCCESS else begin // WinNT if not OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then Result := GetLastError() else try if not LookupPrivilegeValue(nil, PChar(Privilege), Luid) then Result := GetLastError() else begin NewState.PrivilegeCount := 1; NewState.Privileges[0].Luid := Luid; if fEnable then NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else NewState.Privileges[0].Attributes := 0; if not AdjustTokenPrivileges(Token, False, NewState, SizeOf(TTokenPrivileges), PrevState, Return) then Result := GetLastError() else begin Result := ERROR_SUCCESS; PreviousState := (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0); end; end; finally CloseHandle(Token); end; end; end; So ist es eventuell übersichtlicher:
Delphi-Quellcode:
function EnablePrivilege(const Privilege: string; fEnable: Boolean; out PreviousState: Boolean): DWORD;
var Token : THandle; NewState : TTokenPrivileges; Luid : TLargeInteger; PrevState : TTokenPrivileges; Return : DWORD; begin SetLastError(0); // Clear last system error state PreviousState := True; if (GetVersion() > $80000000) then // Win9x Result := ERROR_SUCCESS else // WinNT begin if OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, Token) then begin try if LookupPrivilegeValue(nil, PChar(Privilege), Luid) then begin NewState.PrivilegeCount := 1; NewState.Privileges[0].Luid := Luid; if fEnable then NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else NewState.Privileges[0].Attributes := 0; if AdjustTokenPrivileges(Token, False, NewState, SizeOf(TTokenPrivileges), PrevState, Return) then begin PreviousState := (PrevState.Privileges[0].Attributes and SE_PRIVILEGE_ENABLED <> 0); end; end; finally CloseHandle(Token); end; end; Result := GetLastError; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz