3

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

4

6 回答 6

11

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

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", "");
于 2008-11-07T15:47:20.123 回答
4

您可以阅读此 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();
        }
    }
}
于 2008-11-07T16:22:00.397 回答
3

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 块或检查返回值。

于 2008-11-07T15:47:22.777 回答
1

检查 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

于 2008-11-07T15:46:34.930 回答
0

我在 .NET 中找不到可以获取信息的方法或属性,但我找到了一个技术说明,它告诉哪些注册表项包含信息:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization

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

于 2008-11-07T15:49:41.057 回答
-1

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

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

于 2008-11-07T16:35:50.557 回答