Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C无法获取Windows InstallDate(f.e CIM_OperatingSystem)_C#_Date_Wmi - Fatal编程技术网

C# C无法获取Windows InstallDate(f.e CIM_OperatingSystem)

C# C无法获取Windows InstallDate(f.e CIM_OperatingSystem),c#,date,wmi,C#,Date,Wmi,我想从CIM_OperatingSystem获取Windows InstallDate。我尝试了很多变体,但都没有成功。我创建了DataTime Massible,但出现了一个错误。我成功了一次,数据是11111111或01.01.0001。谢谢你的帮助 这是代码: DateTime WindowsInstallDate; ManagementObjectSearcher windows = new ManagementObjectSearcher("root\\CIMV2"

我想从CIM_OperatingSystem获取Windows InstallDate。我尝试了很多变体,但都没有成功。我创建了DataTime Massible,但出现了一个错误。我成功了一次,数据是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;

提前谢谢。等待你的回答。我是初学者:

在代码中使用ManagementDateTimeConverter类将WMI日期转换为DateTime类

WindowsInstallDate = ManagementDateTimeConverter.ToDateTime(mo["InstallDate"].ToString());
值得注意的是,此WMI类正在从注册表项HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion和InstallDate的值中提取此数据。在Windows 10上,此值为您提供最新功能升级的安装日期。有一个名为HKEY\U LOCAL\U MACHINE\SYSTEM\Setup\Source OS UPDATE的键,它具有原始OS InstallDate值

该键是可变的,因为上面指定的是上次升级的日期。您将需要获取注册表项的名称,并将注册表数据从unix epoch time格式转换为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());

从根目录\\CIMV2上的CIM\U OperatingSystem中查询SELECT*会得到什么?我获取InstallDate并希望获取Windows安装日期对不起,当我使用获取datatime WindowsInstallDate=ManagementDateTimeConverter.ToDateTimemo[InstallDate].ToString;它工作,但是,当我使用Ram日期,Cpu日期,GPU日期,并使用此代码时,我有错误。System.NullReferenceException:对象引用未指向对象的实例。你知道如何解决这个问题吗?我想我缺少了一些背景知识。您从哪里获得Ram日期、CPU日期和GPU日期?win32_operatingsystem类没有这些属性。班级医生:对不起,这是我的错误。我无法获取cpu-Win32\U处理器、RAM-Win32\U物理内存、HDD-Win32\U磁盘驱动器和GPU-Win32\U视频控制器的安装日期信息。但我选择01.01.0001 01.01或error:对于这些类,InstallDate属性是可选的,在大多数情况下,我看到没有值。如果该属性不存在,如果查询它,它将返回null。尝试对null对象执行ToString函数将引发NullReferenceException错误。您可以使用if子句仅在属性不为null时获取日期,也可以使用null条件和合并来创建明显无效的DateTime对象,如DateTime WindowsInstallDate=System.Management.ManagementDateTimeConverter.ToDateTimemo[InstallDate]?.ToString??00010101000000.000000-300;非常感谢你!