Как узнать, когда Windows была запущена или выключена? - PullRequest
10 голосов
/ 13 сентября 2011

Мне нужно разработать программу на C #, чтобы узнать, когда Windows была запущена или выключена.

Есть ли файл журнала, который я могу прочитать, чтобы узнать время запуска и завершения работы Windows?Или у вас есть какие-либо идеи, как это сделать?

РЕДАКТИРОВАТЬ:

С помощью мистера Рида Копси, лучший ответ находится под этим вопрос .

Ответы [ 7 ]

15 голосов
/ 13 сентября 2011

Согласно этой статье вы можете использовать WMI для получения даты / времени последней загрузки .

// define a select query
SelectQuery query =
    new SelectQuery(@"SELECT LastBootUpTime FROM Win32_OperatingSystem
       WHERE Primary='true'");

// create a new management object searcher and pass it
// the select query
ManagementObjectSearcher searcher =
    new ManagementObjectSearcher(query);

// get the datetime value and set the local boot
// time variable to contain that value
foreach(ManagementObject mo in searcher.Get())
{
    dtBootTime =
        ManagementDateTimeConverter.ToDateTime(
            mo.Properties["LastBootUpTime"].Value.ToString());

    // display the start time and date
    txtDate.Text = dtBootTime.ToLongDateString();
    txtTime.Text = dtBootTime.ToLongTimeString();
}
4 голосов
/ 14 сентября 2011

Как указал Рид, вы можете получить доступ к журналам событий и посмотреть, когда они были созданы.На самом деле, нет никаких определенных записей о событиях для запуска / выключения системы, но вы можете искать службы, которые обычно запускаются / останавливаются с помощью Windows.Хотя использование этого подхода означает, что он не будет на 100% точным, скажем, если он выйдет из строя или будет запущен / остановлен / перезапущен вручную.Одним из событий, которое я считаю наиболее точным, является событие запуска / остановки службы EventLog.

if (EventLog.Exists("System"))
{
    var log = new EventLog("System", Environment.MachineName, "EventLog");

    var entries = new EventLogEntry[log.Entries.Count];
    log.Entries.CopyTo(entries, 0);

    var startupTimes = entries.Where(x => x.InstanceId == 2147489653).Select(x => x.TimeGenerated);
    var shutdownTimes = entries.Where(x => x.InstanceId == 2147489654).Select(x => x.TimeGenerated);
}

Редактировать

Оказывается, произошло событие отключения.Вы можете заменить Linq, чтобы получить его:

var shutdownEvents = entries.Where(x => x.InstanceId == 2147484722);
4 голосов
/ 13 сентября 2011

Вы можете использовать классы в System.Diagnostics.Eventing.Reader для доступа к системным журналам событий.

3 голосов
/ 09 мая 2013

Время последнего перезапуска можно узнать, используя этот фрагмент кода

static void Main(string[] args)
    {          
        TimeSpan t = TimeSpan.FromMilliseconds(System.Environment.TickCount);
        Console.WriteLine( DateTime.Now.Subtract(t));          
    }
3 голосов
/ 13 сентября 2011

Вы можете использовать счетчик производительности System Up Time, чтобы получить время начала Система:

 PerformanceCounter systemUpTime = new PerformanceCounter("System", "System Up Time");

 systemUpTime.NextValue();
 TimeSpan upTimeSpan = TimeSpan.FromSeconds(systemUpTime.NextValue());
 Console.Out.WriteLine(DateTime.Now.Subtract(upTimeSpan).ToShortTimeString());

Надеюсь, это поможет.

1 голос
0 голосов
/ 04 января 2014

System.Environment.TickCount имеет ограничение 24,8 дня.
Это связано с тем, что TickCount - это значение в миллисекундах, содержащееся в 32-битном значении со знаком.

Windows API предоставляет следующие две функции:
GetTickCount - возвращает 32-битное значение - доступно из Windows 2000
GetTickCount64 - возвращает 64-битное значение - доступно из Vista / Windows Server 2008

Вы можете использовать GetTickCount64 следующим образом:

using System.Runtime.InteropServices;  

[DllImport("Kernel32.dll")]  
static extern long GetTickCount64();  

DateTime osStartTime = DateTime.Now - new TimeSpan(10000 * GetTickCount64());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...