@smiegel, & Luckie: Schon interessant, wenn man die "olle" Win-SDK-Hilfe mal mit dem PSDK (August ´02) vergleicht. Dort heißt es nämlich:
| Zitat: |
| Windows NT/2000/XP: The SetSystemTime function enables the SE_SYSTEMTIME_NAME privilege before changing the system time. This privilege is disabled by default. For more information, see Running with Special Privileges. |
Das hört sich für mich so an, als würde sich die Funktion das Recht notfalls allein holen.
@Scrat: Ich rede zwar von XP, aber bei 2000 müsste es ahnlich sein; öffne mal die Verwaltung und suche die lokalen Sicherheitseinstellungen. In den lokalen Richtlinien findest du den Punkt "Ändern der Systemzeit", in dem standardmäßig Administratoren und Hauptbenutzer eingetragen sind. Wenn du dort deinen Benutzernamen hinzufügst, oder meinetwegen die Gruppe, der du angehörst, dann kannst du die Zeit ändern! Auch ohne Rechte holen.
Ausprobiert habe ich´s unter Win XP SP1. Könnt ihr selbst gern testen. Einfach die Sicherheitsrichtlinie erweitern; sich mit dem Benutzernamen anmelden und Scrats Quellcode-Auszug testen. Es geht auch ohne das Recht!
Oder anders gesagt: wenn man bzw. die Gruppe, der man angehört, nicht in der besagten Richtlinie steht, kann man unter XP das Recht holen, so lange und so oft man will ... die Zeit wird dennoch nicht geändert.
Und da im PSDK keine Einschränkung steht, würde ich mal behaupten, das gilt dann wohl auch für NT und 2000.
Zum Thema "Rechte holen":
in diversen Foren wird immer wieder gern gefragt
| Zitat: |
| Wie fahre ich Windows NT/2000/XP herunter? Das klappt irgendwie nicht. |
Des Rätsels Lösung ist ebenfalls ein Recht, das man sich erst mal besorgen muss. Ausgehend von Pits Vorlage für exakt dieses Problem habe ich hier mal fix folgende kleine Funktion zusammengebastelt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| function SetPrivilege(pszPrivilege: LPCSTR; bEnablePrivilege: boolean): boolean; var wv : TOSVersionInfo; Token : THandle; tkp : TTokenPrivileges; begin wv.dwOSVersionInfoSize := sizeof(TOSVersionInfo); GetVersionEx(wv);
// da unter 9x jeder alles darf, setzen wir das // Ergebnis in dem Fall auf TRUE Result := (wv.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS);
// jetzt der echte Code für NT-Plattformen if(wv.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin if(not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,Token)) then exit;
try if(not LookupPrivilegeValue(nil, pszPrivilege, tkp.Privileges[0].Luid)) then Exit;
tkp.PrivilegeCount := 1;
if(bEnablePrivilege) then tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else tkp.Privileges[0].Attributes := 0;
Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^); finally CloseHandle(Token); end; end; end; |
Ist nichts Weltbewegendes. Aufgerufen wird sie z.B. so:
Quelltext
1: 2: 3: 4: 5:
| const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
if(SetPrivilege(SE_SHUTDOWN_NAME,true)) then ExitWindowsEx(EWX_SHUTDOWN,0); |
oder eben die Zeit-Geschichte, auch wenn´s IMHO nicht erforderlich ist, das Recht extra zu holen:
Quelltext
1: 2: 3: 4: 5:
| const SE_SYSTEMTIME_NAME = 'SeSystemtimePrivilege';
if(SetPrivilege(SE_SYSTEMTIME_NAME,true)) then SetSystemTime(st); |
Mehr Rechte zum Herumspielen findet man im PSDK unter "Authorization Data Types and Constants".