![]() |
Rechner per Software ausschalten
In einem Delphiprogramm kann man mit der Anweisung
ExitWindowsEx(EWX_SHUTDOWN + EWX_POWEROFF, 0); den PC runterfahren und ausschalten. Funktioniert hier mit WinXP (und im Büro mit Win2k SP4) problemlos. Bei meinem Win2k SP4 hier wird mein Rechner aber stets neu hochgefahren, auch wenn ich ExitWindowsEx(EWX_SHUTDOWN, 0); oder ExitWindowsEx(EWX_POWEROFF, 0); benutze. Diverse Tools aus dem Internet zeigen auf meinem PC leider den gleichen Effekt: Unter Win2k wird immer neu hochgefahren statt ausgeschaltet, unter WinXP wird korrekt ausgeschaltet. Es liegt wohl an irgendeiner Einstellung meines Win2k, vermute ich mal? Hat vielleicht jemand von Euch eine Idee, an welcher Einstellung? Vielen Dank im Voraus! |
Re: Rechner per Software ausschalten
Hallo,
du könntest evtl. versuchen den Ruhezustand zu deaktivieren, falls dieser aktiviert sein sollte. Oder du hast vielleicht eingestellt, dass beim Herunterfahren autom. die Auslagerungs-datei gelöscht wird. Ist nur geraten. |
Re: Rechner per Software ausschalten
Zitat:
M.Mn.n. muss es sich um eine sehr gut versteckte Eintragung in der Registry handeln, die die Kiste unter Win2k zum Neustarten zwingt :-( Vielen Dank und mfg |
Re: Rechner per Software ausschalten
Ich habe ein Programm, bei dem das Herunterfahren sowohl bei Win2000 als auch bei WinXP funktioniert.
Da ich aber z.Z. privat kein INet habe, muss ich dich auf morgen vertrösten. Dann kann ich Dir die Funktion geben... |
Re: Rechner per Software ausschalten
Bei meinem WIN2003 Server gibt es da ein Häkchen:
Systemeigenschaften | Erweitert | Starten und Wiederherstellen | Einstellungen | System-Fehler | Automatisch Neustart durchführen Grüße vom marabu |
Re: Rechner per Software ausschalten
@marabu: Das ist eigentlich nur für BlueScreens (Bugchecks) gedacht. Hat nix mit EWX zu tun.
Rechtsklick auf den Desktop -> Bildschirmschoner -> Energierverwaltung oder alternativ Windows + R -> "control powercfg.cpl" Dort gibt es bei älteren PCs sowas wie "APM aktivieren". Habe leider keinen solchen PC hier, erinnere mich aber daran dieses Problem selbst gehabt zu haben. Aber Gegenfrage: Wie sieht es aus, wenn du beim Startmenü auswählst, daß der Rechner runterfahren soll? Geht's dann? Es gibt nämlich 3 Varianten: 1. Der Rechner wird abgeschaltet 2. Der Rechner fährt runter und zeigt an, daß er abgeschaltet werden darf 3. Der Rechner bootet neu (bei fehlerhafter Konfiguration!!!) |
Re: Rechner per Software ausschalten
Hi Olli,
jetzt weiss ich noch besser, warum ich meinen Server administrieren lasse... Kontemplative Grüße vom marabu |
Re: Rechner per Software ausschalten
Zitat:
|
Re: Rechner per Software ausschalten
hallo orabimus,
funktioniert es denn wenn du den rechner über start -> Computer ausschalten -> Ausschalten herunterfährst? ich denke dass das fast das gleiche ist wie ExitWindowsEx(). gruss urbanbruhin |
Re: Rechner per Software ausschalten
Zitat:
marabu |
Re: Rechner per Software ausschalten
Zitat:
|
Re: Rechner per Software ausschalten
Zitat:
@dahead: Ruhezustand ist deaktiviert, beim Runterfahren wird nichts gelöscht. @olli: 2. trifft bei mir zu. Vielen Dank für die Tipps bisher. mfg |
Re: Rechner per Software ausschalten
Es ist auch ein ATX Board drinne oder? :gruebel:
|
Re: Rechner per Software ausschalten
So hier mal eine Prozedur, die Windows herunterfährt bzw. neu startet.
Sie ist so geschrieben, dass sie sowohl mit Win9x als auch mit Win2000/XP funktioniert.
Delphi-Quellcode:
Sollte es aus irgendeinem Grund nicht möglich sein, den Neustart auszuführen, dann wird auch gleich die Fehlermeldung ausgegeben.
procedure BeendeWindows(Restart: Boolean);
var vi : TOSVersionInfo; hToken : THandle; tp : TTokenPrivileges; h : DWORD; i : Boolean; buffer : PChar; o : Integer; 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; if restart then i := ExitWindowsEx(EWX_REBOOT, 0) else i := ExitWindowsEx(EWX_POWEROFF, 0); h := GetLastError; GetMem(buffer, 1024); o := FORMAT_MESSAGE_FROM_HMODULE; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, @o, h, 0, buffer, 1023, nil); FreeMem(Buffer); end; |
Re: Rechner per Software ausschalten
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
@DevilsCamp: Ich denke du hast die Frage nicht durchgelesen :roll: ... und außerdem kompiliert deine tolle Funktion nicht, wie kann das sein? -> Types of actual and formal var parameters must be identical ... in folgender Zeile:
Delphi-Quellcode:
Mal sehen wie gut du deine Funktion kennst.
AdjustTokenPrivileges(hToken, false, tp, 0, PTokenPrivileges(nil), h);
|
Re: Rechner per Software ausschalten
Doch hab ich.
Aber ich denke, dass es evtl. an seinem Quellcode liegen könnte. Daher habe ich eine Prozedur gepostet, mit der es unter Win2000 KEINEN Neustart, sondern den gewünschten Shutdown gibt. Es Versuch ist es jedenfalls wert... Und bei mir wird diese Funktion sowohl unter Delphi 7 als auch unter Delphi 2005 ohne Fehler kompiliert (ich habe sogar den kompletten QuellCode von hier gepastet [edit] Auszug aus der Delphi-Win32-Hilfe:
Code:
Ich zähle hier 6 Parameter. In meinem Code übergebe ich der Funktion ebenfalls 6 Parameter, wo also soll die Anzahl NICHT übereinstimmen?
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token that contains privileges BOOL DisableAllPrivileges, // flag for disabling all privileges PTOKEN_PRIVILEGES NewState, // pointer to new privilege information DWORD BufferLength, // size, in bytes, of the PreviousState buffer PTOKEN_PRIVILEGES PreviousState, // receives original state of changed privileges PDWORD ReturnLength // receives required size of the PreviousState buffer ); |
Re: Rechner per Software ausschalten
Zitat:
Zitat:
Delphi-Quellcode:
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
const NewState: TTokenPrivileges; BufferLength: DWORD; var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall; Zitat:
|
Re: Rechner per Software ausschalten
Da ich erstens Delphi4 übersprungen habe und zweitens beruflich nur mit Delphi7 arbeite, kann es durchaus sein, dass es mit Delphi4 nicht geht ;)
Und wegen APM: Auf einem Rechner ohne ACPI (bzw. ausgeschaltetem) haben EWX_POWEROFF und EWX_SHUTDOWN die selbe Funktion: Herunterfahren von Windows mit manuellem Ausschalten. @orabimus Welche Version besitzt Du eigentlich? Haben bei dir EWX_POWEROFF bzw. EWX_SHUTDOWN vllt. zufälligerweise den gleichen Wert wie EWX_REBOOT (aus welchen Gründen auch immer)? [edit] @Olli: hier meine Deklaration:
Delphi-Quellcode:
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL;
const NewState: TTokenPrivileges; BufferLength: DWORD; var PreviousState: TTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall; overload; {$EXTERNALSYM AdjustTokenPrivileges} function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; const NewState: TTokenPrivileges; BufferLength: DWORD; PreviousState: PTokenPrivileges; var ReturnLength: DWORD): BOOL; stdcall; overload; {$EXTERNALSYM AdjustTokenPrivileges} [/edit] |
Re: Rechner per Software ausschalten
Zitat:
Delphi-Quellcode:
Das wird auch bei manch anderer Deklaration gebraucht, wenn ursprünglich ein Pointertyp übergeben wurde, dies aber als var ohne Pointertyp übersetzt wurde (Thema: Headerkonvertierung).
AdjustTokenPrivileges(hToken, false, tp, 0, PTokenPrivileges(nil)^, h);
ACPI ist sehr spezifisch. Mit ACPI hat es nicht viel zu tun. APM ist nicht ACPI - und es geht dennoch ;) ... dann wären noch APIC und andere Varianten vorhanden. Siehe deine verfügbaren HALs. |
Re: Rechner per Software ausschalten
Zitat:
@DevilsCamp: Delphi 5, falls Du das mit der Version meintest. Wie schon geschrieben, zeigen bei mir alle (Fremd-) Tools unter Win2k den gleichen Effekt, der Rechner wird statt herunterzufahren immer neu gestartet. mfg |
Re: Rechner per Software ausschalten
Zitat:
Eine Sache kannst du noch versuchen: - Lies mal unter ![]() - Entweder im aktuellsten SP oder schon auf deiner Platte sind die HALs (jeweils 1 Zeile hinzufügen) - Ändere die boot.ini so, daß du jeden der anderen HALs mal austesten kannst (ACPI wäre mein heißer Tip!) - Wenn einer der HALs geht, benutzt du ab dann diesen für immer. Welcher HAL es ist erkennst du bei den Versionsinformationen unter Dateieigenschaften. Es gibt bestimmte Voraussetzungen unter denen der HAL bei der Installation nicht korrekt erkannt wird. ACHTUNG: Keinesfalls in der boot.ini die ursprüngliche Zeile sofort ersetzen. Erstmal weitere Hinzufügen und über's Bootmenü testen. Denn so hast du immernoch die Option zu einer funktionierenden Konfiguration zurückzukehren. |
Re: Rechner per Software ausschalten
@Olli: Werde mir übers Wochenende ein Backup der Festplatte machen und dann mal rumtesten. Danke für den Tipp.
Schönes Wochenende :-D mfg |
Re: Rechner per Software ausschalten
Viel Erfolg! :thumb:
Auch dir ein schönes Wochenende, |
Re: Rechner per Software ausschalten
@Olli:
Backup von Win2k gemacht und auf DVD gebrannt. Kiste mit WinXP hochgefahren und in den Ordnern von Win2k HAL.DLL umbenannt, andere hal*.dll nach system23 kopiert und zu HAL.DLL unbenannt bzw. die Eintragungen in der BOOT.INI für Win2k angepasst oder geändert. Resultat: Beim Hochfahren von Win2k Blackscreens auf DOS-Ebene oder Einfrieren des Rechners (Cursor blinkte ganz links oben). Problemloses Restore des Backups von Win2k :-D Versuch eines Chiptreibersatz-Updates: Habe mittels Aida32 (...aida32.hu?) den Chipsatz meiner Kiste ermitteln lassen: ================================================== ========== Chipsatz Eigenschaften Motherboard Chipsatz VIA VT8367 Apollo KT333CF Chipsatzhersteller Firmenname VIA Technologies, Inc. Produktinformation ![]() Treiberdownload ![]() ================================================== ========== Habe anschließend den neuesten VIA-Treiber heruntergeladen und installiert. Hat nix gebracht :pale: Unter WinXP kann mein PC sich ausschalten ("PowerOff"), unter Win2k kann er es nicht :wall: Im Büro können sich alle PCs (unter Win2k), selbst wenn sie älter als meine Kiste sind, ausschalten ("PowerOff"). Es muß hier bei meiner Kiste an irgendeinem Eintrag in der Registry liegen. Welcher Dienst ist für das "PowerOff" eigentlich zuständig? mfg (das "f" steht diesmal für "frustrierten") :) |
Re: Rechner per Software ausschalten
Zitat:
Einzige Sache die noch sein könnte, daß es im BIOS deaktiviert wurde. Aber das ist sehr spezifisch und da müßtest du dein BIOS-Handbuch konsultieren ;) Zitat:
Zitat:
Also sorry, nachdem das alles durchgetestet wurde, wüßte ich auch erstmal nicht weiter :( |
Re: Rechner per Software ausschalten
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mir gerade ein zweites Win2k SP4 zusätzlich neu installiert (mit Grafikkarten- und Chipsatztreiber, sonst nix) und gemeinerweise funktioniert das PowerOff per Software so, wie es soll (der Rechner schaltet sich ab), obwohl der zusätzliche Reiter nicht vorhanden ist.
Unter dem "alten" Win2k SP4 stehen einige Energieoptionen überhaupt nicht zur Verfügung (siehe angehängten Screenshot des "neuen" Win2k, das rot Durchgestrichene fehlt beim "alten" Win2k). Vermutlich ist im "alten" Win2k irgend ein Dienst abgeschaltet oder was in der Registry verstellt. Wird noch eine spannende Tüftelei werden :shock: Vielen Dank für die bisher geposteten Tipps von Euch/Olli. Hat noch jemand eine Idee? mfg |
Re: Rechner per Software ausschalten
Habe inzwischen alle ein-/ausgechalteten Dienste vom "neuen" ins "alte" Win2k übernommen und getestet.
Daran lag's leider nicht! Das Tüffteln geht also weiter :shock: mfg |
Re: Rechner per Software ausschalten
Habe inzwischen alle möglichen Registry-Einträge des "neuen" Win2k in die des "alten" Win2k sinngemäß übernommen und getestet.
@Olli: Auch die HAL.DLLs. Daran lag's leider auch nicht! Das Tüffteln neigt sich dem Ende zu: Ein komplettes Neuinstallieren von Win2k inklusive aller Software/Daten scheint mir inzwischen leichter zu sein als die Suche nach dem "Knackpunkt" in den/der Energieoptionen... mfg |
Re: Rechner per Software ausschalten
Code:
tja, windoofs ist eben kompliziert. Also:
exec("shutdown -h now");
wofür gibt es denn die OpenSource-Abteilung der DP ![]() |
Re: Rechner per Software ausschalten
@yankee: Nix für ungut, aber lies dir doch erstmal das komplette Thema durch, bevor du hier mit sowas kommst :|
|
Re: Rechner per Software ausschalten
Zitat:
|
Re: Rechner per Software ausschalten
Zitat:
|
Re: Rechner per Software ausschalten
Zitat:
|
Re: Rechner per Software ausschalten
Zitat:
|
Re: Rechner per Software ausschalten
@yankee: Olli hat recht. Das Problem liegt an den Einstellungen des OS.
Den Befehl "shutdown -h now" kapiert Win2k sowieso nicht, wohl aber das "eklige" WinXP, da es über ein shutdown.exe verfügt :stupid: Mit dem shutdown.exe von WinXP kann Win2k natürlich nicht viel anfangen... mfg Edit: Tippfehler korrigiert, shutdown.exe getestet und Smileys geändert. |
Re: Rechner per Software ausschalten
Ein ähnliches Problem hatte ich mal unter Win98:
Neues Board & Gehäuse (ATX, vorher AT), alte Festplatte -> Standby ging nicht. Ich hab auch die Registry durchforstet, aber nichts gefunden. Erst eine Neuinstallation von Windows hat den Standby dann ermöglicht. Fazit: Wenn die ACPI-Funktionen bei der Installation nicht verfügbar waren, will sie Win später auch nicht mehr... :stupid: |
Re: Rechner per Software ausschalten
Zitat:
@orabimus: Wenn es geht, daß du eine Parallelinstallation (frisch!) von WinXP machst, könntest du nachschauen welchen HAL und welche NTOSKRNL.EXE WinXP nimmt. Danach benutzt du die gleiche auf Windows 2000 (natürlich die 2000er-Versionen aus dem SP). |
Re: Rechner per Software ausschalten
@Olli: Habe ich leider schon alles durchprobiert.
ManuMF scheint leider Recht zu haben, schluchtz :pale: Das Installationsprogramm von Win2k nimmt bei einer Neuinstallation hier die halAPIC.DLL (vom SP4). Alles andere schmiert ab... Microsoft happens :-( Danke! Bin künftig eine HeulSuse oder ein DeppenJan :zwinker: mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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