如何使用C#从Windows读取“公司名称”?

某些程序会读取您在安装Windows时输入的公司名称并将其显示在程序中。 这是怎么做到的? 他们只是从注册表中读取名称吗?

如果您想要在注册表中输入注册的公司名称,您可以从以下位置获取:

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", ""); 

你可以阅读这个使用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);` 

或者是小福所建议的一个class轮。

但是,正确的方法是使用双反斜杠。 这是因为反斜杠是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 

http://support.microsoft.com/kb/310441

我不喜欢在我的业务代码中使用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(); 

它没什么特别的,只是处理经常检索的注册表值的一种更漂亮的方式。