Я пытаюсь получить время последней синхронизации групповой политики c из реестра в приложении C#. Я адаптировал следующий код из фрагмента PowerShell, который нашел: (https://gist.github.com/MyITGuy/79497012ab8fd3eb33f3d64a48394278)
Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry64);
Microsoft.Win32.RegistryKey key = hklm.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\State\\Machine\\Extension-List\\{00000000-0000-0000-0000-000000000000}");
object hi = key.GetValue("startTimeHi");
object lo = key.GetValue("startTimeLo");
if (hi != null && lo != null) {
System.UInt32 hi_time = System.Convert.ToUInt32(hi);
System.UInt32 lo_time = System.Convert.ToUInt32(lo);
System.UInt64 gpotime = ((hi_time << 32) | lo_time);
System.DateTime lastgpodt = System.DateTime.FromFileTime((long)gpotime);
}
На подмножестве машин это дает сбой. Значения в реестре:
startTimeLo REG_DWORD 0xbbed710c
startTimeHi REG_DWORD 0x1d62150
С этими значениями startTimeLo
анализируется неправильно:
hi: 30810448
lo: -1142066932
[-2146233066] Value was either too large or too small for a UInt32.
Все, что я прочитал, говорит, что DWORD должен быть 32-разрядное целое число без знака. Так что же дает? Я попытался прочитать в startTimeHi
и startTimeLo
как 64-разрядные целые числа (со знаком и без знака) и все еще получаю ту же ошибку.