Измените системную дату программно

Я делал то же самое на GitHub: abl-profiler-converter

. Я получаю отчет, передавая выходные данные Cobertura xml в задача генератора отчетов, такая как эта: ReportGenerator

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

4 ответа

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

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

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

[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.
82
ответ дан Andrew Hare 7 November 2019 в 09:12
поделиться

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

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);
}  
15
ответ дан MarmouCorp 7 November 2019 в 09:12
поделиться
  1. PInvoke для вызова Win32 API SetSystemTime, ( пример )
  2. Система. Классы управления с классом Win32_OperatingSystem WMI и вызовом SetDateTime на том классе.

И потребовать, что вызывающей стороне предоставили SeSystemTimePrivilege и что это полномочие включено.

7
ответ дан Avram 7 November 2019 в 09:12
поделиться

Так как я упомянул это в комментарии, вот является 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);
3
ответ дан Ðаn 7 November 2019 в 09:12
поделиться
Другие вопросы по тегам:

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