Entwickler-Ecke
Sonstiges (Delphi) - SETSYSTEMTIME.....wird nicht aufgerufen?
Scrat - Mo 30.12.02 08:43
Titel: SETSYSTEMTIME.....wird nicht aufgerufen?
Mein Quellcode mit dem ich das Datum und die Uhrzeit ändern möchte:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure setzen(jahr,monat,tag,stunde,minute,sekunde,msekunde:word); var neu:TSystemTime; begin neu.wyear:=jahr; neu.wmonth:=monat; neu.wday:=tag; neu.whour:=stunde; neu.wminute:=minute; neu.wsecond:=sekunde; neu.wmilliseconds:=msekunde; if SetSystemTime(neu) then //if-schleife wird nicht ausgeführt begin MessageDlg('Einstellungen an Kassen-PC übertragen !',mtInformation,[mbOk],0); end; end;
procedure TForm15.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = VK_F3 then begin Setzen (StrToInt (Edit6.Text), StrToInt (Edit5.Text), StrToInt (Edit1.text), StrToInt (Edit2.text), StrToInt (Edit3.text), StrToInt (Edit4.text), 00); end; |
Aus irgendeinem Grund wird der Befehl Setsystemtime nicht ausgeführt.
Warum nicht?
smiegel - Mo 30.12.02 08:49
Hallo,
auf den 1. Blick sieht alles ok aus. Folgend ein Auszug aus der Win-SDK:
| Zitat: |
Remarks
Windows NT: The SetSystemTime function fails if the calling process does not have the SE_SYSTEMTIME_NAME privilege. This privilege is disabled by default. Use the AdjustTokenPrivileges function to enable this privilege and again to disable it after the time has been set. For more information about security privileges, see Privileges.
Windows 95: Security privileges are not supported or required.
|
Delete - Mo 30.12.02 09:16
Was smiegel fragen wollte ist: "Unter welchen Betriebssystem arbeitest du?"
Scrat - Mo 30.12.02 09:26
Windows 2000 SP2
Delete - Mo 30.12.02 09:38
Na bitte, da haben wir's. Dazu brauchst du die entsprechenden Privilegien. Mehr dazu siehe Zitat aus dem PSDK von meinem Vorredner.
Scrat - Mo 30.12.02 11:20
Kann mir jemand genauer erklären wie ich das mit den "<PRIVILEGIEN>" mache. Davon hab ich gar keine Ahnung. Was ist das überhaupt?
Delete - Mo 30.12.02 14:27
@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:
Quelltext
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".
Scrat - Mo 30.12.02 16:17
Hey MathiasSimmack... deine Antwort muß ich noch ein paar mal lesen.
Aber ein Kollege hat die Antwort gefunden.....ihr werdet es doch sowieso nicht glauben.
Das war der Quellcode von dem Edit6.text (wo das Datums-Jahr drin steht)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Edit6:=TEdit.create(Form15); Edit6.parent:= Form15; Edit6.font.height:=14; Edit6.text:= FormatDateTime('yy',now); Edit6.left:=200; Edit6.top:=40; Edit6.Width:=20; Edit6.TabStop:=true; Edit6.TabOrder:=2; Edit6.MaxLength:=2; |
Nun kommts......anstatt "Edit6.text:= FormatDateTime('yy',now);" muß man "Edit6.text:= FormatDateTime('yyyy',now);" eingeben.
Das Jahr muß 4-Stellig sein.......
Aber deinen Text werde ich auf jeden Fall mal geneuer lesen, hört sich interessant an..
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!