有些程序会读取您在安装 Windows 时输入的公司名称,并将其显示在程序中。这是怎么做到的?他们只是从注册表中读取名称吗?
6 回答
如果您想要在注册表中输入的注册公司名称,您可以从以下位置获取:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization
使用 Registry 类,您可以执行以下操作:
string org = (string)Microsoft.Win32.Registry.GetValue(@"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization", "");
您可以阅读此 Using WMI,在我看来,您在 Win32_OperatingSystem 类之后,并且该类的 Organization 元素包含公司名称。
下面的代码是一个控制台应用程序,它显示了注册用户和组织。要让它运行,您需要向项目添加对 System.Management.dll 的引用。应该只有一个管理对象,因此 foreach 可能是多余的,不太确定最佳实践是什么:
using System;
using System.Management;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ManagementClass c = new ManagementClass("Win32_OperatingSystem");
foreach (ManagementObject o in c.GetInstances())
{
Console.WriteLine("Registered User: {0}, Organization: {1}", o["RegisteredUser"], o["Organization"]);
}
Console.WriteLine("Finis!");
Console.ReadKey();
}
}
}
Windows 将注册的公司名称存储在注册表中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization
导入以下内容:
using Microsoft.Win32;
读取所需注册表项的值,如下所示:
RegistryKey hklm = Registry.LocalMachine;
hklm = hklm.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
Object obp = hklm.GetValue("RegisteredOrganization");`
Console.WriteLine("RegisteredOrganization :{0}",obp);`
或者,正如小福所建议的那样。
但是,正确的方法是使用双反斜杠。这是因为反斜杠是 C# 转义字符 - 也就是说,您可以使用 \n 插入换行符,或者使用 \t 插入制表符,因此要让 C# 知道我们想要一个普通的反斜杠而不是一些转义字符,我们必须使用两个反斜杠 (\) 或在字符串前面使用 @,例如 (@"\somestring") :
string org = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\\Software\\Microsoft\\Windows NT\\CurrentVersion", "RegisteredOrganization", "");
注意: RegisteredOrganization 键不保证包含值,因为它可能在操作系统安装过程中未填写。所以总是使用 try/catch 块或检查返回值。
检查 API SystemParametersInfo 和名为 SPI_GETOEMINFO 的常量
int details = SystemParametersInfo(SPI_GETOEMINFO, OEMInfo.Capacity, OEMInfo, 0);
if (details != 0)
{
MessageBox.Show(OEMInfo.ToString());
}
这将返回 OEM 的公司名称。我认为您在安装 Windows 时不必输入公司名称,只需输入计算机名称(我可能在这里错了)
您可以在此处查看所有常量和示例:http:
//pinvoke.net/default.aspx/Enums.SystemMetric
我在 .NET 中找不到可以获取信息的方法或属性,但我找到了一个技术说明,它告诉哪些注册表项包含信息:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization
我不喜欢在我的业务代码中调用 text-y 注册表,而且我不喜欢实用程序类,因此我编写了一个从注册表中获取公司名称的扩展方法。
using Microsoft.Win32;
namespace Extensions
{
public static class MyExtensions
{
public static string CompanyName(this RegistryKey key)
{
// this string goes in my resources file usually
return (string)key.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion").GetValue("RegisteredOrganization");
}
}
}
然后我可以很容易地得到这个值:
RegistryKey key = Registry.LocalMachine;
return key.CompanyName();
这没什么花哨的,只是处理经常检索的注册表值的一种更漂亮的方式。