Frage

Wie kann ich das lokale System Datum und Uhrzeit ändern programmatisch mit C #?

War es hilfreich?

Lösung

Hier ist, wo ich die Antwort gefunden.

Ich habe es hier reposted Klarheit zu verbessern.

Definieren Sie diese Struktur:

[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
    public short wYear;
    public short wMonth;
    public short wDayOfWeek;
    public short wDay;
    public short wHour;
    public short wMinute;
    public short wSecond;
    public short wMilliseconds;
}

Fügen Sie die folgende extern Methode Ihre Klasse:

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

Dann mit einer Instanz Ihrer Struktur wie dies die Methode aufrufen:

SYSTEMTIME st = new SYSTEMTIME();
st.wYear = 2009; // must be short
st.wMonth = 1;
st.wDay = 1;
st.wHour = 0;
st.wMinute = 0;
st.wSecond = 0;

SetSystemTime(ref st); // invoke this method.

Andere Tipps

Sie können einen Anruf an einen DOS-Befehl verwenden, aber die Geltendmachung von der Funktion in der Windows-DLL ein besserer Weg, es zu tun.

public struct SystemTime
{
    public ushort Year;
    public ushort Month;
    public ushort DayOfWeek;
    public ushort Day;
    public ushort Hour;
    public ushort Minute;
    public ushort Second;
    public ushort Millisecond;
};

[DllImport("kernel32.dll", EntryPoint = "GetSystemTime", SetLastError = true)]
public extern static void Win32GetSystemTime(ref SystemTime sysTime);

[DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
public extern static bool Win32SetSystemTime(ref SystemTime sysTime);

private void button1_Click(object sender, EventArgs e)
{
    // Set system date and time
    SystemTime updatedTime = new SystemTime();
    updatedTime.Year = (ushort)2009;
    updatedTime.Month = (ushort)3;
    updatedTime.Day = (ushort)16;
    updatedTime.Hour = (ushort)10;
    updatedTime.Minute = (ushort)0;
    updatedTime.Second = (ushort)0;
    // Call the unmanaged function that sets the new date and time instantly
    Win32SetSystemTime(ref updatedTime);
}  

Viele große Sichtweisen und Ansätze sind schon hier, aber hier sind einige Spezifikationen, die zur Zeit gelassen werden und dass ich vielleicht das Gefühl, einige Leute und verwirren auslösen.

  1. Ein Windows Vista, 7, 8 OS das wird erfordert ein UAC Prompt, um die erforderlichen Administratorrechte zu erhalten, um erfolgreich die SetSystemTime Funktion auszuführen. Der Grund ist, dass der Prozess Aufruf muss das SE_SYSTEMTIME_NAME Privileg.
  2. Die SetSystemTime Funktion eine SYSTEMTIME Struktur in Coordinated Universal Time erwartet (UTC) . Es wird nicht anders wie gewünscht funktionieren.

Je nachdem, wo / wie Sie Ihre DateTime Werte bekommen, ist es am besten sein könnte es sicher und verwenden zu spielen ToUniversalTime() , bevor die entsprechenden Werte in der SYSTEMTIME Struktur zu setzen.

Code-Beispiel:

DateTime tempDateTime = GetDateTimeFromSomeService();
DateTime dateTime = tempDateTime.ToUniversalTime();

SYSTEMTIME st = new SYSTEMTIME();
// All of these must be short
st.wYear = (short)dateTime.Year;
st.wMonth = (short)dateTime.Month;
st.wDay = (short)dateTime.Day;
st.wHour = (short)dateTime.Hour;
st.wMinute = (short)dateTime.Minute;
st.wSecond = (short)dateTime.Second;

// invoke the SetSystemTime method now
SetSystemTime(ref st); 
  1. PInvoke Win32 API SetSystemTime zu nennen, ( Beispiel )
  2. System.Management Klassen mit WMI-Klasse Win32_OperatingSystem und rufen SetDateTime auf dieser Klasse.

Beide erfordern, dass der Anrufer SeSystemTimePrivilege erteilt wurde und dass dieses Privileg aktiviert ist.

In dieser Funktion wird die Zeit des Systems (getestet in Fenster 8)

ändern
 void setDate(string dateInYourSystemFormat)
    {
        var proc = new System.Diagnostics.ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = @"C:\Windows\System32";
        proc.CreateNoWindow = true;
        proc.FileName = @"C:\Windows\System32\cmd.exe";
        proc.Verb = "runas";
        proc.Arguments = "/C date " + dateInYourSystemFormat;
        try
        {
            System.Diagnostics.Process.Start(proc);
        }
        catch
        {
            MessageBox.Show("Error to change time of your system");
            Application.ExitThread();
        }
    }
void setTime(string timeInYourSystemFormat)
    {
        var proc = new System.Diagnostics.ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = @"C:\Windows\System32";
        proc.CreateNoWindow = true;
        proc.FileName = @"C:\Windows\System32\cmd.exe";
        proc.Verb = "runas";
        proc.Arguments = "/C time " + timeInYourSystemFormat;
        try
        {
            System.Diagnostics.Process.Start(proc);
        }
        catch
        {
            MessageBox.Show("Error to change time of your system");
            Application.ExitThread();
        }
    }

Beispiel: Anruflastmethode Form setDate ( "5-6-92"); setTime ( "2: 4: 05.00");

Da ich es in einem Kommentar erwähnt, hier ist ein C ++ / CLI-Wrapper:

#include <windows.h>
namespace JDanielSmith
{
    public ref class Utilities abstract sealed /* abstract sealed = static */
    {
    public:
        CA_SUPPRESS_MESSAGE("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands")
        static void SetSystemTime(System::DateTime dateTime) {
            LARGE_INTEGER largeInteger;
            largeInteger.QuadPart = dateTime.ToFileTimeUtc(); // "If your compiler has built-in support for 64-bit integers, use the QuadPart member to store the 64-bit integer."


            FILETIME fileTime; // "...copy the LowPart and HighPart members [of LARGE_INTEGER] into the FILETIME structure."
            fileTime.dwHighDateTime = largeInteger.HighPart;
            fileTime.dwLowDateTime = largeInteger.LowPart;


            SYSTEMTIME systemTime;
            if (FileTimeToSystemTime(&fileTime, &systemTime))
            {
                if (::SetSystemTime(&systemTime))
                    return;
            }


            HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
            throw System::Runtime::InteropServices::Marshal::GetExceptionForHR(hr);
        }
    };
}

Der C # Client-Code ist jetzt sehr einfach:

JDanielSmith.Utilities.SetSystemTime(DateTime.Now);

Seien Sie vorsichtig !. Wenn Sie nicht genutzte Objekt aus der Struktur löschen, setzt sich die Zeit falsch. Ich habe 1 Tag verloren, weil dieser. Ich denke, um die Struktur wichtig ist.

Das ist richtig Struktur:

public struct SystemTime
        {
            public ushort Year;
            public ushort Month;
            public ushort DayOfWeek;
            public ushort Day;
            public ushort Hour;
            public ushort Minute;
            public ushort Second;
            public ushort Millisecond;

        };

Wenn Sie die SetSystemTime () laufen, es funktioniert wie erwartet. Für Test habe ich die Zeit, wie unten;

SystemTime st = new SystemTime();
st.Year = 2019;
st.Month = 10;
st.Day = 15;
st.Hour = 10;
st.Minute = 20;
st.Second = 30;

SetSystemTime(ref st);

Die eingestellte Zeit: 2019.10.15 10.20, es ist ok

.

Aber ich DayOfWeek Eigenschaft löschen, die nicht verwendet werden;

public struct SystemTime
            {
                public ushort Year;
                public ushort Month;
                public ushort Day;
                public ushort Hour;
                public ushort Minute;
                public ushort Second;
                public ushort Millisecond;

            };

SystemTime st = new SystemTime();
    st.Year = 2019;
    st.Month = 10;
    st.Day = 15;
    st.Hour = 10;
    st.Minute = 20;
    st.Second = 30;

    SetSystemTime(ref st);

Ausführen gleicher Code aber die Zeit auf: 2019.10.10 20.30

Bitte seien Sie vorsichtig, um und alle Bereiche der Systemtime-Struktur. Yusuf

  

proc.Arguments = "/ C Datum:" + dateInYourSystemFormat;

Das ist Arbeit Funktion:

void setDate(string dateInYourSystemFormat)
{
    var proc = new System.Diagnostics.ProcessStartInfo();
    proc.UseShellExecute = true;
    proc.WorkingDirectory = @"C:\Windows\System32";
    proc.CreateNoWindow = true;
    proc.FileName = @"C:\Windows\System32\cmd.exe";
    proc.Verb = "runas";
    proc.Arguments = "/C Date:" + dateInYourSystemFormat;
    try
    {
        System.Diagnostics.Process.Start(proc);
    }
    catch
    {
        MessageBox.Show("Error to change time of your system");
        Application.ExitThread();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top