检查 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;
您可以使用 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);
根据程序的访问权限和操作系统配置,由于程序的访问权限不足,程序仍可能引发异常。