Autor Beitrag
Scrat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 73



BeitragVerfasst: Mo 30.12.02 08:43 
Mein Quellcode mit dem ich das Datum und die Uhrzeit ändern möchte:

ausblenden 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?

_________________
Wenn ein Programm nutzlos ist, muß es dokumentiert werden.
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 30.12.02 09:16 
Was smiegel fragen wollte ist: "Unter welchen Betriebssystem arbeitest du?"
Scrat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 73



BeitragVerfasst: Mo 30.12.02 09:26 
Windows 2000 SP2

_________________
Wenn ein Programm nutzlos ist, muß es dokumentiert werden.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 73



BeitragVerfasst: 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?

_________________
Wenn ein Programm nutzlos ist, muß es dokumentiert werden.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden volle Höhe 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:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 73



BeitragVerfasst: 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)

ausblenden 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..

_________________
Wenn ein Programm nutzlos ist, muß es dokumentiert werden.