Windows runterfahren
-
Ja, ich weiß, das steht in der FAQ.
Problem ist, das es auf manchen Rechnern nicht richtig funktioniert.
Ich habe mir ein Testprogramm geschrieben, mit dem ich alle möglichen Funktionen mit allen Parametern versuchen kann.
Ergebnis:
Nur die Methode, die in der FAQ für Win 2000 ist, scheint so zu funktionieren:
HANDLE hToken;
TOKEN_PRIVILEGES tkp;OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ;LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);if (GetLastError() != ERROR_SUCCESS);
ExitWindowsEx(EWX_SHUTDOWN, 0);
Das funktioniert auf allen Systemen (Win 98/NT/XP), obwohl nur für Win2000 gedacht.
Soweit so gut. Nur auf einem ME System, auf dem ich das getestet hatte, gibt´s beim nächsten Start die Fehlermeldung, das Windows nicht ordnungsgemäß heruntergefahren wurde usw, mit anschließendem Scandisk und Wiederherstellung des ActiveDesktops.
Keine Funktion hat es geschafft, diesen Rechner ordnungsgemäß herunterzufahren.
Bei den meisten Funktionen (z.B. einfaches ExitWindows(...) mit allen möglichen parametern) passierte nichts, oder es wurden nur alle Programme geschlossen, und ich musste mich erneut am Netz anmelden.
Ist das ein generelles ME-Problem, oder evtl. eine falsche Einstellung in der Hardware (ACPI?).
Bin für jeden Tip dankbar !!
-
Ich kann dir nur sagen wie ich es gemacht habe:
NT/2000/XP
BOOL CTestDlg::OnBUTTONntdown() { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS); if (!ExitWindowsEx(EWX_SHUTDOWN, 0)); }
95/98/ME
BOOL CTestDlg::OnMedown() { ExitWindowsEx(EWX_SHUTDOWN,0); }
-
Der erste Teil ist haargenau der gleiche Code, den auch ich verwendete, die Win 98/ME Methode funktioniert einfach auf dem System nicht.
Fraglich warum??
Hardware??
-
Das kann eigentlich kein Fehler von dir sein... aber Windows, und vorallem Win ME ist für seine Runterfahr-Probleme bekannt.. da gabs Hunderte von Patches für und irgendwelche Restfehler blieben immer. Auch Win XP hat übrigens in einigen Konfigurationen solche Probleme.
-
In das Thema würd ich mich gleich mal "reinhängen".
Wie bekommt man XP / 2000 eigentlich in den Ruhezustand? müsste ja anstelle des SHUTDOWN ja sowas wie HIBERNATE sein.
Wollte aber bei mir nicht klappen...Tschau
-
Ich habe mir dem gleichem Thema einmal angenommen und wollte das mein Rechner nachts nach diversen Wav2Mp3 Konvertierungen zu einer bestimmten Zeit runterfährt.. Das klappte unter NT gut, blos fukking ..ups..win9x is zu plöd dazu.. Vieleicht hilft der folgende Code jemanden dieses auch unter 9x umzustetzen, auf jendenfall ist es eine Anschauung...:
#include <iostream.h> #include <itime.hpp> #include <conio.h> #include <ithread.hpp> #include <windows.h> void SetShutdownPrivileges(void) { OSVERSIONINFO stVerInfo; stVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&stVerInfo); // falls NT/2000: if(stVerInfo.dwPlatformId==VER_PLATFORM_WIN32_NT) { HANDLE token; TOKEN_PRIVILEGES tokenpriv; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tokenpriv.Privileges[0].Luid); tokenpriv.PrivilegeCount=1; tokenpriv.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(token, false, &tokenpriv, 0, (PTOKEN_PRIVILEGES)NULL, 0); } } int main(int argc, char *argv[]) { cout << " ERRORSOFT SHUTDOWN WINDOOF!!" << endl << endl; cout << "usage...: shutdown HHMM" << endl; cout << "example.: 'shutdown 1430' will shutdown at 14:30:00" << endl << endl; if (argc == 1) { cout << "no time argument found" << endl; getch(); exit(0); } if (IString(argv[1]).length() != 4) { cout << "time argument must contain 4 chars" << endl; getch(); exit(0); } IString charAlhabet = IString("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); if (IString(argv[1]).lastIndexOfAnyOf(charAlhabet) > 0) { cout << "please only numeric" << endl; getch(); exit(0); } SetShutdownPrivileges(); IString para_hour = IString(argv[1]).subString(1,2); IString para_minute = IString(argv[1]).subString(3,2); cout << "shutdown at time: '" << para_hour << ":" << para_minute << "'" << endl; IString curr_hour; IString curr_minute; int i = 0; while(i==0) { if( ( ITime().hours() == para_hour.asInt() ) && ( ITime().minutes() == para_minute.asInt() ) ) { i= 1; cout << "SHUTDOWN !-)" << endl; ExitWindowsEx(EWX_POWEROFF | EWX_FORCE ,0); // ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0); } IThread::current().sleep(1000); } }
mfg ICH fahr das ding jetz runter