Не удается преобразовать DWORD в UInt32 - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь получить время последней синхронизации групповой политики 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-разрядные целые числа (со знаком и без знака) и все еще получаю ту же ошибку.

...