Как изменить дату и время моего компьютера через консольное приложение c # [duplicate]

Если у вас есть это, утилита lam (ламинат) может сделать это, например:

$ lam filename -s "string after each line"

42
задан Paul Roub 14 December 2015 в 21:35
поделиться

7 ответов

Вот где я нашел ответ.

Я перепробовал его здесь, чтобы улучшить ясность.

Определите эту структуру:

[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;
}

Добавьте в свой класс следующий метод extern:

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

Затем вызовите метод с экземпляром вашей структуры следующим образом:

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.
66
ответ дан Andrew Hare 15 August 2018 в 18:44
поделиться
  • 1
    написание пользовательской C ++ / CLI-оболочки и интрокация другой сборки проще, чем создание структуры с 9 строками? – Lucas 16 March 2009 в 18:50
  • 2
    Пространство имен Microsoft.VisualStudio.Shell.Interop содержит определенный элемент структуры SYSTEMTIME; см. msdn.microsoft.com/en-us/library/… – Ðаn 16 March 2009 в 22:56
  • 3
    Только не позволяйте Марку Гравелю видеть вашу структуру! ;-) – si618 16 March 2009 в 23:33
  • 4
    Мое редактирование ответа было отклонено по какой-то причине, но, по крайней мере, для Win 7, я обнаружил, что мне нужно запустить программу как администратор, чтобы она работала. См. stackoverflow.com/questions/2818179/… – Dan W 30 January 2015 в 14:39
  • 5
    Хорошо бы сказать, что этот метод устанавливает время UTC. Поэтому, если вы займете свое местное время Datetime.Now, тогда он установит неправильное время. Я столкнулся с этим и не мог понять, что не так долго ... – Denis Koreyba 8 December 2016 в 15:19

Поскольку я упомянул об этом в комментарии, вот оболочка C ++ / CLI:

#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);
        }
    };
}

Клиентский код C # теперь очень прост:

JDanielSmith.Utilities.SetSystemTime(DateTime.Now);
4
ответ дан Ðаn 15 August 2018 в 18:44
поделиться
  1. PInvoke для вызова Win32 API SetSystemTime, ( example )
  2. . Классы System.Management с классом WMI Win32_OperatingSystem и вызовом SetDateTime в этом классе.

Оба требуют, чтобы вызывающему было предоставлено SeSystemTimePrivilege и эта привилегия включена.

7
ответ дан Avram 15 August 2018 в 18:44
поделиться

Множество замечательных точек зрения и подходов уже здесь, но вот некоторые спецификации, которые в настоящее время не учтены, и что я чувствую, что могут разобраться и смутить некоторых людей.

  1. В Windows Vista, 7, 8 OS это требует запроса UAC, чтобы получить необходимые административные права для успешного выполнения функции SetSystemTime. Причина в том, что вызывающему процессу нужна привилегия SE_SYSTEMTIME_NAME.
  2. Функция SetSystemTime ожидает структуру SYSTEMTIME в скоординированном универсальном времени (UTC). В противном случае он не будет работать по-другому.

В зависимости от того, где / как вы получаете свои значения DateTime, лучше всего безопасно играть и использовать ToUniversalTime() перед установкой соответствующих значений в структуре SYSTEMTIME.

Пример кода:

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); 
9
ответ дан Derek W 15 August 2018 в 18:44
поделиться
  • 1
    Я не могу изменить время системы, используя это – Hiren Raiyani 13 April 2015 в 12:54
  • 2
    Я успешно использовал этот код для нескольких проектов. Вы используете исполняемый файл как администратор? В противном случае этот код, безусловно, не сработает. – Derek W 13 April 2015 в 13:46
  • 3
    Вау, это решило мою проблему. Проблема в том, что часовой пояс для вашего местного времени мешает получить правильное время, поэтому строка «DateTime dateTime = tempDateTime.ToUniversalTime (); & quot; решил все это. – Daren Delima 13 June 2017 в 11:23

Используйте эту функцию для изменения времени системы (проверено в окне 8)

 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();
        }
    }

Пример: вызов метода загрузки формы setDate («5-6-92»); setTime ("2: 4: 5 AM");

5
ответ дан Jørgen R 15 August 2018 в 18:44
поделиться

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

Эта функция работы:

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();
    }
}
-3
ответ дан Javad_Raouf 15 August 2018 в 18:44
поделиться

Вы можете использовать вызов для команды DOS, но вызов функции в dll windows - лучший способ сделать это.

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);
}  
14
ответ дан MarmouCorp 15 August 2018 в 18:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: