#c# #date #wmi
#c# #Дата #wmi
Вопрос:
Я хочу получить дату установки Windows из CIM_OperatingSystem
. Я перепробовал множество вариантов, но безуспешно. Я создал массив данных, но появилась ошибка. Однажды мне это удалось, и данные были 11111111 или 01.01.0001. Я был бы признателен за вашу помощь.
Это код:
DateTime WindowsInstallDate;
ManagementObjectSearcher windows = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM CIM_OperatingSystem");
foreach (ManagementObject mo in windows.Get())
{
WindowsInstallDate= DateTime.Parse(mo["InstallDate"].ToString());
}
label1.Text = WindowsInstallDate;
Заранее спасибо. Жду вашего ответа. Я новичок: (
Комментарии:
1. что вы получите за запрос
SELECT * FROM CIM_OperatingSystem
в «root \ CIMV2»?2. я получаю InstallDate и хочу использовать дату установки Windows
Ответ №1:
Используйте класс ManagementDateTimeConverter в своем коде для преобразования дат WMI в классы DateTime.
WindowsInstallDate = ManagementDateTimeConverter.ToDateTime(mo["InstallDate"].ToString());
Стоит отметить, что этот класс WMI извлекает эти данные из раздела реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion
и значения для InstallDate
. В Windows 10 это значение дает вам дату установки самого последнего обновления компонентов. Существует вызываемый ключ HKEY_LOCAL_MACHINESYSTEMSetupSource OS (Updated on <DATE>)
, который имеет исходное значение даты установки ОС.
Этот ключ является переменным, поскольку <DATE>
указанное выше значение является датой последнего обновления. Вам нужно будет получить имя ключа и преобразовать данные реестра из времени unix (epoch) в формат DateTime, что-то вроде этого будет работать. Извините за грубость некоторого кода, при необходимости можно добавить дополнительную обработку ошибок. Это всего лишь краткий пример.
//Open Registry Key, search for subkey that starts with "Source OS" then open that key to get InstallDate data
RegistryKey SetupKey = Registry.LocalMachine.OpenSubKey("SYSTEM\Setup");
string SourceOSKeyName = SetupKey?.GetSubKeyNames().Where(x => x.StartsWith("Source OS")).FirstOrDefault();
//Initialize new DateTime object with January 1st 1970 as its date (the start of unix time)
DateTime InstallDate = new DateTime(1970, 1, 1);
if (!string.IsNullOrEmpty(SourceOSKeyName))
{
int InstallDateValue = (int)SetupKey.OpenSubKey(SourceOSKeyName)?.GetValue("InstallDate");
InstallDate = InstallDate.AddSeconds(InstallDateValue);
}
//If the key is not found the datetime value will be Jan 1st 1970.
Console.WriteLine(InstallDate.ToString());
Комментарии:
1. Извините, когда я использую для получения данных WindowsInstallDate = ManagementDateTimeConverter WindowsInstallDate = ManagementDateTimeConverter. Текущее время (mo[«InstallDate»]. toString()); это работает, но, когда я использую to Ram date, Cpu date, GPU date и использую этот код, у меня возникает ошибка. Исключение System.NullReferenceException: «Ссылка на объект не указывает на экземпляр объекта» . . Вы знаете, как решить эту проблему?
2. Я думаю, что я упускаю какой-то контекст. Откуда вы получаете дату ОЗУ, дату процессора и дату графического процессора? класс win32_operatingsystem не обладает этими свойствами. Документы класса: learn.microsoft.com/en-us/windows/win32/cimwin32prov /…
3. Извините, это моя ошибка. я не могу получить информацию о дате установки для cpu — Win32_Processor, для RAM Win32_PhysicalMemory, HDD — Win32_DiskDrive и GPU — Win32_VideoController. Но я принимаю 01.01.0001 01.01 ИЛИ ошибку: (
4. Для этих классов свойство InstallDate является необязательным, и в большинстве случаев, которые я видел, значения нет. Если свойство не существует, оно возвращает null при запросе к нему. Попытка выполнить функцию toString() для нулевого объекта вызовет ошибку NullReferenceException. Вы можете либо использовать предложение if, чтобы получить дату, только если свойство не равно null, либо использовать условие null и объединение, чтобы создать явно недопустимый объект DateTime, например
DateTime WindowsInstallDate = System.Management.ManagementDateTimeConverter.ToDateTime(mo["InstallDate"]?.ToString() ?? "00010101000000.000000-300");
5. Большое вам спасибо!