如何使用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
我不喜欢在我的业务代码中使用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();
它没什么特别的,只是处理经常检索的注册表值的一种更漂亮的方式。