Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SetSystemTime unter Windows VISTA? (https://www.delphipraxis.net/125666-setsystemtime-unter-windows-vista.html)

Schucki 9. Dez 2008 21:30


SetSystemTime unter Windows VISTA?
 
Hallo,

ich setze in meinem Programm die Systemzeit. Das klappt unter Windows XP wie es sein soll.
Unter Windows VISTA geht der gleiche Aufruf in die Hose, obwohl ich dort auch Admin Rechte habe.

Wie kann man unter Windoes VISTA die Systemzeit ändern? Gibt es da einen anderen Weg als SetSystemTime?

Gruß und Danke! Frank

Mr_G 9. Dez 2008 22:40

Re: SetSystemTime unter Windows VISTA?
 
In der MSDN steht folgendes:
Zitat:

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.

Schucki 9. Dez 2008 23:27

Re: SetSystemTime unter Windows VISTA?
 
Vielen Dank!

Das habe ich noch nie gemacht, wie arbeitet man den mit "Special Privileges". :gruebel:
Kennt jemand ein Beispiel?

Gruß Frank

Mr_G 10. Dez 2008 00:02

Re: SetSystemTime unter Windows VISTA?
 
Hier gibt es ein Beispiel für ExitWindows. Das musst du nur auf SeSystemtimePrivilege umstellen...

Schucki 10. Dez 2008 01:17

Re: SetSystemTime unter Windows VISTA?
 
Super, es funktioniert!

Das es schon 2002 bekannt war ist mir neu. Ich dachte es sein ein spezieller VISTA Weg.
Nunja, auch das geschafft, Danke für die Hilfe!!

Gruß Frank

Schorschi5566 20. Jan 2010 08:39

Re: SetSystemTime unter Windows VISTA?
 
Hallo DP-Gemeinde,

ich habe das gleiche Problem und bei mir funktioniert die Lösung leider nicht unter Vista.

Folgenden Code habe ich hier gesucht ( :wink: ) und gefunden:

Delphi-Quellcode:
   
  // Special-Privilege für Setzen der Systemzeit holen...
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    tpResult := OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      TTokenHd);
    if tpResult then
    begin
      tpResult := LookupPrivilegeValue(nil,
                                       'SeSystemtimePrivilege',
                                       TTokenPvg.Privileges[0].Luid);
      TTokenPvg.PrivilegeCount := 1;
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      cbtpPrevious := SizeOf(rTTokenPvg);
      pcbtpPreviousRequired := 0;
      if tpResult then
      begin
        tpResult := Windows.AdjustTokenPrivileges(TTokenHd, False, TTokenPvg,cbtpPrevious,
                                      rTTokenPvg, pcbtpPreviousRequired);
        CloseHandle(TTokenHd);
        showmessage('Priv geändert: ' + BoolToStr(tpResult));
      end;
    end;
Danach ändere ich mit SetSystemTime die Zeit. Das Ganze funktioniert auf Win2k und XP ohne Probleme (klar, da braucht man das entsprechende Privileg ja nicht extra zu setzen).

showmessage('Priv geändert: ' + BoolToStr(tpResult)); wird bei allen Betriebssystemen erreicht. Trotzdem keine Änderung der Systemzeit bei Vista.

Hat jemand einen Tipp, was ich falsch mache?


Viele Grüße,
Uwe

hoika 20. Jan 2010 08:58

Re: SetSystemTime unter Windows VISTA?
 
Hallo,

1

Dort steht bei Return Values

Zitat:

If the function succeeds, the return value is nonzero.
To determine whether the function adjusted all of the specified privileges, call GetLastError, which returns one of the following values when the function succeeds
Ich würde also danach mit GetLastError prüfen.


Und ausserdem

Zitat:

The AdjustTokenPrivileges function cannot add new privileges to the access token. It can only enable or disable the token's existing privileges.
d.h. du musst das Recht zur System-Zeit schon vorher haben (z.B. als Admin).

Du hast nicht geschrieben, ob du das Programm als Admin gestartet hast.


Heiko

Schorschi5566 20. Jan 2010 09:18

Re: SetSystemTime unter Windows VISTA?
 
Hallo Heiko,

danke für die schnelle Antwort.

Der Rückgabewert ist ungleich 0.

Zitat:

showmessage('Priv geändert: ' + BoolToStr(tpResult)); wird bei allen Betriebssystemen erreicht.
GetLastError wird also "Alles Roger" zurückgeben.


Wenn ich das Programm mit "Als Administrator ausführen..." starte, funktioniert es ja (sogar unter Vista). Allerdings dann auch ohne den entsprechenden Codeblock.

Der Witz ist doch, dass es jeder User können soll oder habe ich da was falsch verstanden? :wink:

----------------------------

Nur noch zum Verständnis:
Wenn ich also das Recht "Systemzeit setzen" für alle betroffenen Benutzer einrichte, sollte es dann doch auch ohne den oben gezeigten Code funktionieren, da SetSystemTime ja das Privileg automatisch "enabled", oder?


Viele Grüße,
Uwe

Luckie 20. Jan 2010 09:26

Re: SetSystemTime unter Windows VISTA?
 
Zitat:

Zitat von Schorschi5566
Der Witz ist doch, dass es jeder User können soll oder habe ich da was falsch verstanden? :wink:

Nein der Witz ist der, dass nicht jeder Benutzer an der Systezeit rumspielen kann, wie es ihm lustig ist. Das Recht, die Systemzeit zu ändern, hat nun mal standardmäßig nur der Administrator. Du kannst natürlich dieses Recht bzw. Privileg auch anderen Benutzergruppen geben, nur ob dein Programm dann noch von anderen eingesetzt wird weiß ich nicht. Ich würde es nicht auf einem Rechner installieren, an dem mehrere Leute arbeiten oder in einer Firma.

Aber warum soll ein normaler Benutzer die Systemzeit ändern können? Ich sehe keinen Grund dafür.

Schorschi5566 20. Jan 2010 09:51

Re: SetSystemTime unter Windows VISTA?
 
Hi Luckie,

sorry, da habe ich mich wohl falsch ausgedrückt.

Natürlich soll das nicht jeder User können. Aber mein Progi soll es eben dürfen.

Ist mir schon bewußt, was passiert, wenn die User in einer AD-Domäne an der Uhrzeit "rumspielen". 8-)

Aber wenn man das Privileg hinterher wieder disabled, sollte doch alles "in Butter" sein, oder?


Danke soweit erstmal. Hat mir schon weiter geholfen...


Viele Grüße,
Uwe


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz