4

C# で Windows os 名 (Windows 8 Pro) を確認しますが、エラーが発生します。何が問題なのですか?

    RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion", true);
    string currentKey;
    currentKey = reg.GetValue("ProductName", true).ToString();

    textBox1.Text = currentKey;
4

5 に答える 5

5

これには Environment.OSVersion を使用できます。

編集: OS名の取得はここで答えられます:Stackoverflow OS Friendly name

于 2013-10-23T20:03:39.777 に答える
3

MSDNを引用します:

Registry.GetValue()-メソッド

指定されたレジストリ キーで、指定された名前に関連付けられた値を取得します。指定したキーに名前が見つからない場合は、指定した既定値を返します。指定したキーが存在しない場合は、 null 参照(Visual Basic では Nothing) を返します。

これは、取得しようとしている値が利用できないことを意味します。

可能な解決策を編集:

出典: 「わかりやすい」OS バージョン名を取得するには?

private string GetOSName()
{
    var name = (from x in new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<ManagementObject>()
                select x.GetPropertyValue("Caption")).First();
    return name != null ? name.ToString() : "Unknown";
}

OS が 32 ビットか 64 ビットかを確認するには、次のコードを使用します。

private string GetOSBitness()
{
    if (Environment.Is64BitOperatingSystem == true)
        return " x64";
    else
        return " x86";
}

上記のコードは次のように返されます (少なくとも私のシステムでは):

Microsoft Windows 7 プロフェッショナル x64

于 2013-10-23T20:05:57.677 に答える
2

レジストリをハッキングするのは、おそらく間違った解決策です。

しかし、なぜ失敗するのでしょうか。Registry.LocalMachine を使用しているため、HKLM は間違っています。HKLM を削除します。それは明らかな誤りです。

その上で、レジストリのリダイレクトに注意してください。おそらく、プロセスは 32 ビットですが、探している値はレジストリの 64 ビット ビューにあります。RegistryView 列挙を使用して、64 ビット ビューにアクセスします。

于 2013-10-23T20:05:47.800 に答える
1

NullReferenceException指定したパスが正しくないため、プログラムがレジストリ サブキーを見つけられないため、あなたのプログラムは私が推測するものの影響を受けます。

相対パスは既にローカル ハイブであるため、ハイブ パスでハイブを指定する必要はありません。次のようにパスからハイブを除外します。

Registry.LocalMachine.OpenSubKey(
    @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", true);

プログラムのアクセス権限とオペレーティング システムの構成によっては、プログラムのアクセス許可が不十分なため、プログラムが例外をスローする場合があります。

于 2013-10-23T20:06:20.163 に答える