一部のプログラムは、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", "");
これは WMI を使用して読むことができます。私には、Win32_OperatingSystem クラスと、そのクラスの Organization 要素が会社名を保持しているように見えます。
以下のコードは、登録されたユーザーと組織を表示するコンソール アプリです。これを実行するには、System.Management.dll への参照をプロジェクトに追加する必要があります。管理オブジェクトは 1 つしかないため、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);`
または、 Xiaofuが提案するワンライナー。
ただし、正しい方法は、2 つのバックスラッシュを使用することです。これは、バックスラッシュが C# のエスケープ文字であるためです。つまり、\n を使用して改行文字を挿入したり、\t を使用してタブを挿入したりできるため、エスケープ文字ではなくプレーンなバックスラッシュが必要であることを C# に知らせるには、 2 つのバックスラッシュ (\) または (@"\somestring") のように文字列の前に @ を使用します。
string org = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\\Software\\Microsoft\\Windows NT\\CurrentVersion", "RegisteredOrganization", "");
注: RegisteredOrganization キーは、OS のインストール中に入力されていない可能性があるため、値が含まれているとは限りません。そのため、常に 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
ビジネス コードでテキスト形式のレジストリ呼び出しを行うのは好きではありません。また、ユーティリティ クラスも好きではないので、レジストリから会社名を取得する拡張メソッドを作成しました。
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();
これは特別なことではなく、頻繁に取得されるレジストリ値を処理するための優れた方法です。