standgale Ответов: 1

Дата установки Windows через WMI возвращает разные значения


Я использую WMI, чтобы получить дату установки windows вместе с другой информацией реестра, и в зависимости от того, как я ее запрашиваю, значение будет разным.
К сожалению, я не знаю, чем это отличается - все, что у меня есть, это CRC, и это другое.

В конечном счете я использую этот код:
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
foreach (ManagementObject wmi_Windows in searcher.Get())
{                   
  try
  {
    s = wmi_Windows["InstallDate"].ToString();
    DateTime dc = ToDateTime(s);
    WindowsInfo.InstallDate = dc.AddTicks(-TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).Ticks).ToLocalTime().ToString();
     break;
   }
   catch (Exception ex)
   {
     //stuff here
   }
 }


Допустим, этот код относится к классу А. Если я вызываю метод, содержащий этот код, через класс B, я получаю один результат, но если я использую класс C для вызова класса B для вызова класса A, результат будет другим. Правда, только для некоторых компьютеров. Конечно, компьютеры в офисе вообще не имеют этой проблемы.

Есть ли у кого-нибудь идеи относительно того, как я мог бы получить различные значения для даты установки? Другие вещи, такие как серийный номер windows, неизменно возвращаются одинаково. Кроме того, компьютеры, которые имеют эту проблему, не все возвращают одно и то же значение, поэтому значения-это не просто дата CRC по умолчанию.

Обновление:
Я пишу небольшое приложение для запуска на клиентском компьютере, которое печатает s, dc и WindowsInfo.InstallDate сверху, а также запустил systeminfo в run и запустил три вещи в PowerShell
(Get-WmiObject Win32_OperatingSystem).InstallDate
([WMI]'').ConvertToDateTime((Get-WmiObject Win32_OperatingSystem).InstallDate)
[timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($(get-itemproperty 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion').InstallDate))

И все получало одни и те же ответы
20110411090106.000000+120
11. april 2011 09:01:06
11.04.2011 09:01:06

Таким образом, проблема возникает только в приложении, когда выполняется один и тот же код из двух разных классов.

Zoltán Zörgő

То wmi_Windows["InstallDate"] ценность сама по себе различна, или WindowsInfo.InstallDate вы рассчитали? Вы получите тот же (несогласованных) результат действия или PowerShell? Смотрите это: http://blogs.sepago.de/helge/2009/09/24/how-to-determine-the-windows-installation-date-with-and-without-powershell/

standgale

Единственная информация, которую я имею от проблемных компьютеров, - это CRC, вычисленный по возвращаемому значению, которое является WindowsInfo.Установочная дата, которая вычисляется.
Но да, расчет может возвращать другое значение.
Два разных значения были возвращены с интервалом в 9 секунд в течение одного и того же запуска приложения.

Zoltán Zörgő

Вы должны выяснить, есть ли проблема с wmi или кодом. Вы можете удаленно WMI-запрос на конкретные машины? Какая ОС на них стоит?
В чем проблема с инструментами, предоставляемыми фреймворком для преобразования в UTC: http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime (v=против 100). aspx ?

1 Ответов

Рейтинг:
2

hooger2017

Это потому что

(Get-WmiObject Win32_OperatingSystem).InstallDate
хранится как WMI datetime тип данных, который действительно хранит формат Microsoft UTC (yyyymmddHHMMSS. xxxxxx±UUU), где принципиально xxxxxx-это миллисекунды, а ±UUU-количество минут, отличное от среднего времени по Гринвичу, как это сообщение под названием" Как получить наиболее точную дату установки Windows (с поправкой на часовой пояс) " полностью объясняет код.

По сути, вы должны добавить смещение часового пояса (TMZ) (±UUU) к вашим расчетам.
InstallDate = new DateTime(year, month, date, hour, mins, secs, msecs) + UTCoffset;