web-dev-qa-db-ja.com

C#アプリケーションでのレジストリへの書き込み

C#アプリを使用してレジストリに書き込もうとしています。

私はここで与えられた答えを使用しています: C#でレジストリに値を書き込む

ただし、何らかの理由でレジストリにキーが追加されません。

私は次のコードを使用しています:

string Timestamp = DateTime.Now.ToString("dd-MM-yyyy");

string key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\"+Application.ProductName+"\\"+Application.ProductVersion;
string valueName = "Trial Period";

Microsoft.Win32.Registry.SetValue(key, valueName, Timestamp, Microsoft.Win32.RegistryValueKind.String);

Application.nameおよびApplication.version「フォルダ」はまだ存在しません。

最初に作成する必要がありますか?

また、64b Winバージョンでテストしているので、追加されたキーのレジストリを確認したい場合は、C:\ Windows\SysWOW64\regedit.exeの32ビットレジストリを特に確認する必要があります。 ?

39
PeeHaa

まず、LocalMachineでキーを編集する場合、管理者権限でアプリケーションを実行する必要があります(CurrentUserを使用する方が安全です。または、インストーラーでキーを作成します)。新しいサブキーを追加するには、キーを編集モード(OpenSubKeyメソッド)でも開く必要があります。コードを確認しましたが、動作します。これがコードです。

RegistryKey key = Registry.LocalMachine.OpenSubKey("Software",true);

key.CreateSubKey("AppName");
key = key.OpenSubKey("AppName", true);


key.CreateSubKey("AppVersion");
key = key.OpenSubKey("AppVersion", true);

key.SetValue("yourkey", "yourvalue");
60
Silx

また、レジストリ呼び出しが仮想化されているかどうかを確認してください。詳細については、 here を参照してください。

アプリケーションが AC対応 ではなく、互換性の理由で発生する場合に発生する可能性があります。

Real path
HKEY_LOCAL_MACHINE\Software\FooKey

Virtual path
HKEY_USERS\<User SID>_Classes\VirtualStore\Machine\Software\FooKey
6
TheCodeKing

次のコードを使用して、必要なレジストリキーを作成して開くことができます。

RegistryKey SoftwareKey   = Registry.LocalMachine.OpenSubKey("Software",true);

RegistryKey AppNameKey    = SoftwareKey.CreateSubKey("AppName");
RegistryKey AppVersionKey = AppNameKey.CreateSubKey("AppVersion");

AppVersionKey.SetValue("yourkey", "yourvalue");

既に存在する場合は書き込みアクセス用のキーを開き、それ以外の場合は作成するため、基本的にすべてのアプリケーション設定にCreateSubKeyを使用できます。最初に作成してから開く必要はありません。 OpenSubKeyは、この場合のように「HKEY_LOCAL_MACHINE\SOFTWARE \」のように、キーがすでに存在することが確実である場合に便利です。

3
Wracky

開いてみてくださいHKLM\Software 最初。次に、プログラムのキーを作成してから、バージョンのキーを作成します。ただし、キーはHKLM\software\WOW6432Nodeに配置できます。これをチェックして。

2
Viktorianec

問題は、十分な権限がないことです。ここに私のために働く方法があります:

RegistryKey myKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
myKey = myKey.OpenSubKey(subkey, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);

if (myKey != null)
{
    myKey.SetValue("DefaultPrinterId", ldiPrinters[e.RowIndex].id, RegistryValueKind.String);
    myKey.Close();
}

RegistryKey.OpenBaseKeyを使用すると、正しいレジストリを開きます。これは、作成するレジストリのアクセス許可がない場合、別の場所で実行するためです。

1
Rey Cruz