检查 Windows 名称 c#

本文关键字:名称 Windows 检查 | 更新日期: 2023-09-27 18:36:33

我将在c#中检查我的Windows操作系统名称(Windows 8 Pro),但它给出了一个错误,这是怎么回事?

    RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"HKLM'SOFTWARE'Microsoft'Windows NT'CurrentVersion", true);
    string currentKey;
    currentKey = reg.GetValue("ProductName", true).ToString();
    textBox1.Text = currentKey;

检查 Windows 名称 c#

您可以使用 Environment.OSVersion 来实现此目的。

编辑:获取操作系统名称在此处回答:堆栈溢出操作系统友好名称

我只引用MSDN:

Registry.GetValue()-Method

检索指定注册表项中与指定名称关联的值。如果在指定的键中找不到该名称,则返回您提供的默认值,如果指定的键不存在,则返回空引用(在 Visual Basic 中无任何内容)。

这意味着您尝试获取的值不可用。

编辑可能的解决方案:

来源:如何获取"友好"的操作系统版本名称?

private string GetOSName()
{
    var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>()
                select x.GetPropertyValue("Caption")).First();
    return name != null ? name.ToString() : "Unknown";
}

要检查操作系统是 32 位还是 64 位,请使用以下代码:

private string GetOSBitness()
{
    if (Environment.Is64BitOperatingSystem == true)
        return " x64";
    else
        return " x86";
}

上面的代码将返回(至少在我的系统上):

Microsoft视窗 7 专业版 x64

您可以通过查询 Windows Management Instrumentation 界面来获取操作系统的商业名称,包括 Service Pack 信息:

    public static string GetOSNameAndVersion()
    {
        string str = Environment.OSVersion.ToString();
        try
        {
            var obj2 = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
                        .Get()
                        .Cast<System.Management.ManagementObject>()
                        .First<System.Management.ManagementObject>();
            str = ((string)obj2["Caption"]).Trim();
            string spMaj = obj2["ServicePackMajorVersion"].ToString();
            string spMin = obj2["ServicePackMinorVersion"].ToString();
            string osVer = obj2["Version"].ToString();
            if (((spMaj != "") && (spMaj != "0")) || ((spMin != "") && (spMin != "0")))
            {
                str = str + " SP " + spMaj;
                if ((spMin != "") && (spMin != "0"))
                {
                    str = str + "." + spMin;
                }
            }
            if (Environment.Is64BitOperatingSystem)
            {
                str = str + " x64";
            }
            else
            {
                str = str + " x86";
            }
            str = str + " (" + osVer + ")";
        }
        catch
        {
            // TODO: Implement your own exception handling here
            // the way it is, the method will fall back on to the Environment.OSVersion
            //   if the query fails
        }
        if (str.StartsWith("Microsoft"))
        {
            str = str.Substring("Microsoft".Length + 1);
        }
        return str;
    }
黑客攻击

注册表可能是错误的解决方案。

但为什么会失败呢?由于您使用 Registry.LocalMachine,因此 HKLM 是错误的。移除 HKLM。这是一个明显的错误。

最重要的是,请注意注册表重定向。也许您的进程是 32 位,但您要查找的值在注册表的 64 位视图中。使用注册表视图枚举来访问 64 位视图。

您的程序受制于我认为是NullReferenceException,因为该程序找不到注册表子项,因为您提供的路径不正确。

无需在配置单元路径

中指定配置单元,因为相对路径已经是本地配置单元。从路径中排除配置单元,如下所示:

Registry.LocalMachine.OpenSubKey(
    @"SOFTWARE'Microsoft'Windows NT'CurrentVersion", true);

根据程序的访问权限和操作系统配置,由于程序的访问权限不足,程序仍可能引发异常。