我正在尝试以编程方式(C#)更改注册表中的某些值,但是我一直在遇到Unauthorized-Access-Exceptions。
我要修改的注册表项是由驱动程序安装程序为USB音频设备创建的。该设备(LogiLink USB音箱7.1)有时会“忘记”其设置,我正在寻找一种快速自动重设设置的方法。
使用通常的Microsoft.Win32.Registry方法读取值没问题,但是尝试覆盖某些值似乎很困难。
但是,手动进行更改(使用regedit)没有问题。我确实具有作为用户的管理员权限,并且正在启动所有C#程序,这些程序应修改“以管理员身份”的值,但无济于事。
以下是我尝试过的一些事情:
-在app.manifest中授予我的应用程序管理员权限。
-尝试使用可写= true的Microsoft.Win32方法打开密钥。在这里,我得到一个System.UnauthorizedAccessException。
RegistryKey key =
RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
RegistryView.Registry64);
key = key.OpenSubKey(regPath,true);
-使用reg将密钥导出到* .reg文件中。 (始终有效)
String strCmdText = "/C REG EXPORT <KeyPath> <ExportPath> /reg:64";
System.Diagnostics.Process.Start("CMD.exe", strCmdText);
然后,我可以修改结果文件并尝试使用各种方法将其导入。
String strCmdText = "/C REG IMPORT <PathToReg> /reg:64";
System.Diagnostics.Process.Start("CMD.exe", strCmdText);
或
String strCmdText = <PathToReg>;
System.Diagnostics.Process.Start("REGEDIT.exe", strCmdText);
我在注册表的其他地方尝试了这些方法,它们可以正常工作,但是如果我想将它们应用于USB音频设备的键,它们将失败。进程始终以返回码0结尾。
手动导入已导出和修改的* .reg文件始终有效,并且可以按预期更改设备设置。甚至手动使用CMD-Console也会产生所需的结果。但是,如果我尝试在C#中执行完全相同的操作,则不会发生任何更改(即使具有管理员权限)。
如果有人对此有想法,我将感到非常高兴。谢谢。