Laden...

Uhrzeit einstellen unter Vista

Erstellt von Starfight vor 17 Jahren Letzter Beitrag vor 16 Jahren 9.522 Views
S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren
Uhrzeit einstellen unter Vista

Mein Programm hat bisher immer die Atomzeit aus dem Netz geholt und mittels SetSystemTime dann die Rechnerzeit entsprechend gesetzt.
Leide rklappt das unter Vista nicht mehr, es fehlen die notwendigen Rechte.

Ich habe auch schon versucht, in den lokalen Sicherheitsrichtlinien->Lokale Richtlinien->Zuweisen von Benutzerrechten->Andern der Systemzeit den User JEDER entsprechende Rechte zu geben, aber das klappt auch nicht.

Gibt es den keine andere möglichkleit, sodas es auch unter Vista klappt. ?

B
1.529 Beiträge seit 2006
vor 17 Jahren

Das kann Windows doch auch allein, wenn du unter "Eigenschaften von Datum und Uhrzeit" unter Internetzeit als Server ptbtime1.ptb.de oder ptbtime2.ptb.de einträgst (Dialoge von XP, Vista sicherlich ähnlich).

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

Sorry, aber da shilft mir keinen Deut weiter.
Ich will es in einem eigenen Programm machen.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Such mal nach User Account Control (UAC).

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

Hab ich gemacht. 3 Treffer. Einer der Thread hier.
Die anderen beiden drehen sich nur um das AUSLESEN der Benutzergruppe, was mir hier aber ja absolut nichts weiter hilft.

Es geht doch eher darum, entweder
eine alternative zu SetSystemTime zu finden
dem Programm KURZFRISTIG die Rechte zu geben, die Systemzeit zu ändern.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Was gibt denn SetSystemTime sowie GetLastError zurück?

230 Beiträge seit 2007
vor 17 Jahren

Sorry, aber da shilft mir keinen Deut weiter. Ich will es in einem eigenen Programm machen.

Dann solltest du wenigstens die MSDN-Doku gelesen und verstanden haben!
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.

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

@Borg
GetLastError gibt zurück, das Rechte fehler.

@sarabande
Stell Dir vor. Habe ich gelesen.
Und ? Wie geht man dann weiter vor ?
Beispiele, wie man SE_SYSTEMTIME_NAME habe ich keine gefunden oder funktionieren bei mir nicht.

230 Beiträge seit 2007
vor 17 Jahren

Original von Starfight
Beispiele, wie man SE_SYSTEMTIME_NAME habe ich keine gefunden oder funktionieren bei mir nicht.

Her mit dem Code, der nicht funktioniert!

I
401 Beiträge seit 2006
vor 17 Jahren

Original von sarabande
Her mit dem Code, der nicht funktioniert!

Der Spruch ist zu geil.
Von dem Code kann ich dir ne Menge liefern. Warte ich hole nurmal eins meiner Projekte aus der Schublade 😁

zu geil der Spruch

Mfg

IamTheBug

230 Beiträge seit 2007
vor 17 Jahren

Original von IamTheBug
Von dem Code kann ich dir ne Menge liefern. Warte ich hole nurmal eins meiner Projekte aus der Schublade 😄

Mich interessiert nur das, was nicht funktioniert - im Kontext von "SetSystemTime"

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

http://msdn2.microsoft.com/en-us/library/aa375202.aspx

Grob gesagt, ich habe keinen blassen Schimmer, was die von mir wollen. 😦

Die Optionen, die bei "Running with Special Privileges." angeboten werden, sind Inakzeptabel. Weder will ich den User bitten, das Programm mti Admin Status zu starten, noch will ich mitten im Programm die Admin Datenabfragen.
Wenn mich ein Programm mitten drin nach dem Administratorpassword fragen würde, würde ich es gleich Löschen.

Ich sehe ja ein, das das verstellen der Systemzeit nich tvon jedem X-beliebigen Programm gemacht werden darf, aber warum bitte nich einfach ne Option:
Message Fenster auf: Darf das Programm die Systemezit ändern: Ja / Nein
und gut ist.
Aber ich weiß nicht, wie ich dem Programm nur für diesen kurzen Augenblick die entsprechenden Rechte geben könnte.
Außer eben mit AdjustTokenPrivileges, aber das ist ein wenig zu kompliziert für mich.

S
1.047 Beiträge seit 2005
vor 17 Jahren

ich finds gut das nicht jedes belibeige programm an meiner uhr rumschrauben kann.

kann man unter vista einem programm permanent bestimmte rechte geben? dann kannst du dir einen dialog ja selber bauen, wo du abfragst ob das programm zeit ändern darf und bei ja soll er adminpaßwort eingeben und dann setzt du die rechte halt... was anderes wird dir nicht übrig bleiben...

230 Beiträge seit 2007
vor 17 Jahren

_Original von Starfight_Außer eben mit AdjustTokenPrivileges, aber das ist ein wenig zu kompliziert für mich.

Damit warst du aber auf dem richtigen weg. Ich habe es erstmal mit C++ gebastelt. Es waren nur ein paar Zeilen. Die Uhr wird über die beiliegende Exe um eine Stunde zurückgesetzt. Anbei: *.cpp und *.h. Mit VS 2003 kannst du es an deine Anforderungen anpassen.

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

Ja sheitman. Antworten wie die deien sind es, die einen immer wieder Aufbauen.
Ich finde es auch gut, das nicht jedes x-beliebige Programm an meiner Systemuhr rumbastelt. Und ? Darf ich mir deswegen nicht trotzdem eines schreiben, was es trotzdem tut ?

Genau das ist es ja, was ich vermeiden will, das mein Programm, auch nur kurzfristig, Adminrechte bekommt. Nur weil man mal eben die Systemzeit ändern will muß man einem Programm doch nicht gleich vollzugriff auf alles im Computer geben. So blöd kann nicht mal Microsoft sein.
Obwohl, hmm, wenn ich mal so drüber Nachdenke. 🙂

@sarabande
Danke, ich werde mir das sofort mal ansehen und mal gucken, ob ich den Code nach C# portieren kann bzw. mir fehlende Informationen daraus ableiten kann.

230 Beiträge seit 2007
vor 17 Jahren

_Original von Starfight_Danke, ich werde mir das sofort mal ansehen und mal gucken, ob ich den Code nach C# portieren kann bzw. mir fehlende Informationen daraus ableiten kann.

Wenn es Probleme gibt, einfach melden!

[Lesenswerter Blog: Windows Vista for Developers]
http://weblogs.asp.net/kennykerr/archive/2006/07/12/Windows-Vista-for-Developers-1320-A-New-Series.aspx

Vorallem Part 3 und Part 4.

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

Ja, da gibt es erhebliche Probleme.
Ich habe zwar vor zig Jahren mal C gelernt, aber die Unterschiede zu C# sind doch erheblich.

AdjustTokenPrivileges
Sowas gibt es in C# gar nicht. Geht offensichtlich nur über DLL Aufrufe.
Und dann das umwandeln aller Variablen in C#.

TOKEN_PRIVILEGES tp;
Kennt C# auch net.

Gibts den keinen Beispielcode direkt für C# ?

230 Beiträge seit 2007
vor 17 Jahren

Original von Starfight
Gibts den keinen Beispielcode direkt für C# ?

Anbei die Portierung von C++ nach C#!

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

Puh, das hagelt Fehlermeldungen.
Das ist alles mögliche, aber kein lauffähiger C# Code.

Win32.OpenProcessToken
kennt er gar nicht.

LUID luid = new LUID();
Keine Ahnung, was LUID ist.

TOKEN_PRIVILEGES tp = new TOKEN_PRIVILEGES();
ebenfalls unbekannt.

LookupPrivilegeValue
Auch unbekannt.

Puh, ob ich daraus nochmal was lauffähiges bekomme.

230 Beiträge seit 2007
vor 17 Jahren

**:::

Original von Starfight
Puh, das hagelt Fehlermeldungen.
Das ist alles mögliche, aber kein lauffähiger C# Code. **Schade - irgendetwas machst du falsch! **Unten steht extra für dich die ConsoleApplication1.exe zum Download bereit. Die läuft in einer CLR. Die System Uhr wird hier auf Winterzeit umgestellt. Schau sie dir mal mit Refektor an! Entspricht exakt meinem Quellcode aus der Datei "Program.cs".

**:::

Original von Starfight
Puh, ob ich daraus nochmal was lauffähiges bekomme. Das schaffst Du schon!

230 Beiträge seit 2007
vor 17 Jahren

Original von Starfight
LUID luid = new LUID();
Keine Ahnung, was LUID ist.

[MSDN: LUID]
http://msdn2.microsoft.com/en-us/library/aa379261.aspx


LUID luid = new LUID();

[StructLayout(LayoutKind.Sequential)]
public struct LUID
{
    public int LowPart;
    public int HighPart;
}//end struct

Original von Starfight
Win32.OpenProcessToken
kennt er gar nicht.


class Win32
{
    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool OpenProcessToken(IntPtr hProcess, int tokenAccess, ref IntPtr token);
}//end class

Original von Starfight
TOKEN_PRIVILEGES tp = new TOKEN_PRIVILEGES();
ebenfalls unbekannt.


[StructLayout(LayoutKind.Sequential)]
public struct TOKEN_PRIVILEGES
{
    public LUID Luid;
    public int Attributes;
    public int PrivilegeCount;
}//end struct

quote]Original von Starfight
LookupPrivilegeValue
Auch unbekannt.


    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool LookupPrivilegeValue(IntPtr lpSystemName, string lpname, [MarshalAs(UnmanagedType.Struct)] ref LUID lpLuid);

I
1.739 Beiträge seit 2005
vor 17 Jahren

Tipp: Lass dein Programm als Service laufen. Installation erfordert natürlich Admin-Rechte(Was in dem Fall auch Selbstverständlich ist/sein sollte).
Dann gibts keine Probleme.
Soll eine GUI für "jeden" existieren ist das auch kein Problem(WCF hilft, oder gutes altes Remoting).
Ein Sytemservice hat jedenfalls keine Probleme(so er denn läuft) da er höhere Rechte als der Admin selbst hat(lokal).

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

@ikaros
Hast Du alle Nachrichten durchgelesen ?
Ich will nicht, das mein Programm Adinrechte bekommt bzw. erfordert.
Ich persönlich wäre bei einem Tool, was ich mir aus dem Internet runterlade und das nach Adminrechten schreit, auch sehr Vorsichtig bzw. würde es erst gar nicht nutzen.

@sarabande
Danke für deine Ausführliche Hilfe, aber ich bekomme nicht mal den original c++ Code bei mir ans laufen.
Ich hätte nicht gedacht, das es so kompliziert wird, nur mal eben die Systemuhr umzustellen.

S
1.047 Beiträge seit 2005
vor 17 Jahren

Ja sheitman. Antworten wie die deien sind es, die einen immer wieder Aufbauen.
Ich finde es auch gut, das nicht jedes x-beliebige Programm an meiner Systemuhr rumbastelt. Und ? Darf ich mir deswegen nicht trotzdem eines schreiben, was es trotzdem tut ?

Genau das ist es ja, was ich vermeiden will, das mein Programm, auch nur kurzfristig, Adminrechte bekommt. Nur weil man mal eben die Systemzeit ändern will muß man einem Programm doch nicht gleich vollzugriff auf alles im Computer geben. So blöd kann nicht mal Microsoft sein.
Obwohl, hmm, wenn ich mal so drüber Nachdenke. 🙂

für microsoft war es anscheinend etwsa nicht so triviales...
bei uns in der schule waren die schüleraccounts auch so eingestellt das die uhr nicht geändert werden konnte
das war dahingehend nervig, wenn man mal den dortigen kalender benutzen wollte...
aberletzen endes fummelst du am system rum
und die uhrzeit ist garnicht so unwichtig...

was mich ma interessiert: wenn du ganz normal über das systray die uhr ändern willst, kommt dan nauch eine admin abfrage?

interessant in dem zusammenhang wäre mal eine liste, was so alles administratorrechte erfordert... über kurz oder lang wirds da ja an einigen stellen knallen

deinen unmut kann ich verstehen zwecks adminrechte vergeben, aber momentan ist es doch so das viele selbst mit einem adminaccount angemeldet sind und die programme dadurch auch machen können was sie wollen...
von daher kann man jetzt wenigstens enscheiden ob man dem programm das erlaubt oder nicht, mit allen dazugehörigen konsequenzen

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

So, ich habe den Code nun mal soweit umgeschrieben, das zumindest der Compiler keine Fehlermeldungen merh ausspuckt.
Allerdings bekomme ich von der OpenProcessToken ein FALSE zurück und ich kann nicht nachvollziehen, warum.
Könntest Du dir das mal bitte ansehen sarabande ?

230 Beiträge seit 2007
vor 17 Jahren

_Original von Starfight_So, ich habe den Code nun mal soweit umgeschrieben, das zumindest der Compiler keine Fehlermeldungen merh ausspuckt. Poste bitte den relevanten Teil des Codes von @sarabande, der zu den Compilerfehlern führte! Vielen Dank!

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool OpenProcessToken(Process hProcess,
inttokenAccess, ref IntPtr token);

const int TOKEN_ADJUST_PRIVILEGES = 0x0020;
const int TOKEN_QUERY = 0x0008;
bool Res = false;
Process hProcess = Process.GetCurrentProcess();
IntPtr hToken = IntPtr.Zero;

Res = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref hToken);

Res hat danach FALSE.

230 Beiträge seit 2007
vor 17 Jahren

Original von Starfight
.
.
.
Res = OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref hToken);
Res hat danach FALSE. Mein lieber @StarFight: Das ist keine Compiler Fehlermeldung!

**Sondern - die boolsche Variable Res wird nach Abarbeitung der Funktion "OpenProcessToken" mit dem Wert "false" befüllt **

Damit dieser Thread nicht durch weitere Mißverständnisse ins uferlose ausartet, werde ich dich solange mit Fragen löchern, bis ich wenigstens das Gefühl habe, das wir nicht aneinader vorbei reden.

Frage: Tritt dieser Programmfehler sowohl bei Vista als auch auf XP auf?

//Edit001

Frage: Warum hast Du meine Win32 Klasse mit den DLLImports auseinander genommen?
Der Code ist in deiner Implementierung für einen Außenstehenden schlechter lesbar! Durch "Win32.OpenProcessToken(..." sieht er mit einem Blick, dass es keine managed Funktion ist!

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

Mein lieber sarabande.
Wo habe ich geschrieben, das es ein Compiler Fehler ist ?

Warum ich dein Win32 Class auseinander genommen habe ?
Weil es sonst nicht funktionierte.

230 Beiträge seit 2007
vor 17 Jahren

Original von Starfight
Mein lieber sarabande.
Wo habe ich geschrieben, das es ein Compiler Fehler ist ?

**Am 26.03.2007, 9:52 Uhr, Erste Zeile deines Postings! **Das war der Tag, wo Du den UpLoad deiner Version gemacht hast.

Original von Starfight
Warum ich dein Win32 Class auseinander genommen habe ?
Weil es sonst nicht funktionierte. Solange Du nicht die relevante Compiler Fehlermeldung postest, kann ich Dir leider nicht sagen, was Du falsch gemacht hast!

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 17 Jahren

Da irrst Du aber gewaltig. Ich habe keineswegs von einem Compilerfehler geredet. Schau Dir die entsprechende Nachricht nochmal genau an. Das genaue Gegenteil habe ich gesagt.
"So, ich habe den Code nun mal soweit umgeschrieben, das zumindest der Compiler keine Fehlermeldungen merh ausspuckt."

Der Code ist soweit, das es ohne Fehlermeldung kompiliert wird. Nur eben,das die angesprochene Funktion FALSE statt TRUE liefert.

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 16 Jahren

Ich habe den Code von sarabande mit hilfe einiger Beiträge aus dem Internet nun endlich so weit, das zumindest alle API Aufrufe ein TRUE zurück liefern.

Einzig die SetSystemTime liefert mir blöderweise nur ein FALSE und wenn ich mit
int apiError = Marshal.GetLastWin32Error();
abfrage warum, heißt es wieder nur, das ich keien Privileien hätte.

Könnte ich bitte nochmal jemand den Code ansehen und mir sagen, was ich da noch falsch mache.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.ComponentModel;
using System.Runtime.InteropServices;
using Microsoft.Win32;

namespace Systemzeit
{
    public partial class Form1 : Form
    {
        [StructLayout(LayoutKind.Sequential)]
        private struct SYSTEMTIME
        {
            public short uYear;
            public short uMonth;
            public short uDayOfWeek;
            public short uDay;
            public short uHour;
            public short uMinute;
            public short uSecond;
            public short uMilliseconds;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct LUID
        {
            public int LowPart;
            public int HighPart;
        }//end struct

        [StructLayout(LayoutKind.Sequential)]
        public struct TOKEN_PRIVILEGES
        {
            public LUID Luid;
            public int Attributes;
            public int PrivilegeCount;
        }//end struct


        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool OpenProcessToken(IntPtr hProcess, int tokenAccess, ref IntPtr token);

        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool LookupPrivilegeValue(IntPtr lpSystemName, string lpname, [MarshalAs(UnmanagedType.Struct)] ref LUID lpLuid);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool SetSystemTime(ref SYSTEMTIME lpSystemTime);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool GetSystemTime(ref SYSTEMTIME lpSystemTime);

        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, int BufferLength, IntPtr PreviousState, IntPtr ReturnLength);

        [DllImport("kernel32.dll", EntryPoint = "CloseHandle")]
        static extern bool CloseHandle(IntPtr handle);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            const int TOKEN_ADJUST_PRIVILEGES = 0x0020;
            const int TOKEN_QUERY = 0x0008;
            const int SE_PRIVILEGE_ENABLED = 0x0002;
            bool Res = false;
            //IntPtr hToken = IntPtr.Zero;
            SYSTEMTIME st = new SYSTEMTIME();
            
            GetSystemTime(ref st);

            //GetSystemTime hat keinen Res, ergo kein ProtocolMessage
            Process hProcess = Process.GetCurrentProcess();
            IntPtr hToken = IntPtr.Zero;
            
            //Res = OpenProcessToken(hProcess.Handle, TOKEN_ADJUST_PRIVILEGES, ref hToken);
            Res = OpenProcessToken(hProcess.Handle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref hToken);
            if (Res == false)
            {
                int apiError = Marshal.GetLastWin32Error();
                StringBuilder errorMessage = new StringBuilder(1024);
                throw new Exception(errorMessage.ToString());
            }

            LUID luid = new LUID();
            TOKEN_PRIVILEGES tp = new TOKEN_PRIVILEGES();
            tp.PrivilegeCount = 1;
            tp.Attributes = SE_PRIVILEGE_ENABLED;

            //Res = LookupPrivilegeValue(IntPtr.Zero, "SeSystemtimePrivilege", ref luid);
            Res = LookupPrivilegeValue(IntPtr.Zero, "SeSystemtimePrivilege", ref luid);

            tp.PrivilegeCount = 1;
            tp.Attributes = SE_PRIVILEGE_ENABLED;
            

            Res = AdjustTokenPrivileges(hToken, false, ref tp, 0, IntPtr.Zero,IntPtr.Zero);

            //Hier stelle ich die Uhr um
            st.uHour = Convert.ToInt16(st.uHour - 1);
            Res = SetSystemTime(ref st);
            if (Res == false)
            {
                int apiError = Marshal.GetLastWin32Error();
                StringBuilder errorMessage = new StringBuilder(1024);
                throw new Exception(errorMessage.ToString());
            }

            Res = CloseHandle(hToken);
        }
    }
}

//edit: c# code tags ergänzt!!!
(siehe Wie poste ich richtig? punkt 6)

S
8.746 Beiträge seit 2005
vor 16 Jahren

Vermutlich deswegen:

The AdjustTokenPrivileges function cannot add new privileges to the access token. It can only enable or disable the token's existing privileges. To determine the token's privileges, call the GetTokenInformation function.

Einfach mal gucken, ob das Prozess überhaupt das Privileg hat.

I
1.739 Beiträge seit 2005
vor 16 Jahren

@starfight:
Sicher, hab ichs gelesen. Die Adminrechte bezogen sich auf Installation nicht auf Ausführung. (Installation kann auch Remote erfolgen, ohne Zutun des Users(hauptsache mal Online im (Firmen)LAN)).
Das eventuelle GUI läuft im Useraccount...

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 16 Jahren

Hmmm, und was sollen mir die Adminrechte bei der Installation helfen ?
Nicht mal in der Entwicklungsumgebung klappt das mit SetSystemTime.

I
1.739 Beiträge seit 2005
vor 16 Jahren

Original von Starfight
Hmmm, und was sollen mir die Adminrechte bei der Installation helfen ?

Einfach eine Installation eines kritischen Programms(wegen Rechte).

Nicht mal in der Entwicklungsumgebung klappt das mit SetSystemTime

Als was bist du angemeldet? Hat dein Account das Recht zum Zeit setzen?
Falls ja: existiert ein(konkurrierender) Service zur Zeit-Synchronisation mit einer externen Uhr(Funkuhr o. so)?
Auf jedenfall muss man Entwicklungs- und Laufzeitumgebung trennen. Beide muss man kennen.

Edit: Markierungen für Quote angepasst.

S
Starfight Themenstarter:in
62 Beiträge seit 2005
vor 16 Jahren

Also gleich nochmal den Hinweis. Ich will mein Programm nicht mit Adminrechten Installieren, weil das eventuell auch mal an andere weitergegeben wird und wenn man denen sagt "Mußt Du mit Adminrechten Installieren" hinterläst das immer nen bitteren beigeschmack.

Zur Entwicklungsumgebung. Ja, ich bin als Admin angemeldet.
Ob der Account rechte zum Zeit setzen hat. Hmmm, sollte er wohl, sonst könnte ich auch nicht über die Uhrzeit im Tray die Uhrzeit verändern.

Nein, es läuft sonst eigentlich nichts, was auf die Systemuhr verändernd einwirkt, außer der Windows eigene Service.

B
1.529 Beiträge seit 2006
vor 16 Jahren

Eventuell musst du mittels Codesicherheit extra Rechte einfordern, um die Zeit innerhalb .NET ändern zu dürfen.