C# UnauthorizedAccessException на RegistryKey CreateSubKey
Я получаю UnauthorizedAccessException каждый раз, когда пытаюсь вызвать CreateSubKey в моем коде.
const string regKeyPath = @"Software\Apps\jp2code.net\FTMaint";
private void BuildRegistry() {
string[] split = regKeyPath.Split('\\');
keyMaker(Registry.LocalMachine, split, 0);
}
private static void keyMaker(RegistryKey key, string[] path, int index) {
string keyValue = path[index++];
RegistryKey key2;
if (!String.IsNullOrEmpty(keyValue)) {
string subKey = null;
string[] subKeyNames = key.GetSubKeyNames();
foreach (var item in subKeyNames) {
if (keyValue == item) {
subKey = item;
}
}
if (String.IsNullOrEmpty(subKey)) {
key2 = key.CreateSubKey(keyValue);
} else {
key2 = key.OpenSubKey(subKey);
}
//key2 = key.OpenSubKey(keyValue, String.IsNullOrEmpty(subKey));
} else {
key2 = key;
}
if (index < path.Length) {
try {
keyMaker(key2, path, index + 1);
} finally {
key2.Close();
}
}
}
Я нашел сообщение, где у кого-то была похожая проблема >> ЗДЕСЬ <<;; в MSDN Social, но решение там (для использования перегруженного метода OpenSubKey) вернуло мне только NULL RegistryKey.
Это для эмулятора устройства Windows Mobile 5.
Кто-нибудь может увидеть, что я делаю не так?
Ошибка выдается в первый раз, когда код достигает ключа, который не существует, и пытается его создать.
Спасибо!
3 ответа
Все три из них прекрасно работают для меня в эмуляторе WinMo 6.
Создайте корневой ключ:
using (var swKey = Registry.LocalMachine.CreateSubKey("foo"))
{
using (var subkey = swKey.CreateSubKey("OpenNETCF"))
{
}
}
Создать подключ через путь
using (var swKey = Registry.LocalMachine.CreateSubKey("software\\foo"))
{
using (var subkey = swKey.CreateSubKey("OpenNETCF"))
{
}
}
Создайте подключ напрямую:
using (var swKey = Registry.LocalMachine.OpenSubKey("software", true))
{
using (var subkey = swKey.CreateSubKey("OpenNETCF"))
{
}
}
Я обнаружил при создании
RegistryKey
instance, через который он был доступен только для чтения. Чтобы я мог позвонить
GetValue
но когда я пришел, чтобы попытаться позвонить, я получил
UnauthorizedAccessException
. Хитрость в том, чтобы позвонить
Registry.CurrentUser.OpenSubKey
установив параметр для записи в значение true, затем вызывает
SetValue
были успешными.
Так что вместо:
key2 = key.OpenSubKey(subKey);
использовать:
key2 = key.OpenSubKey(subKey, writable: true);
то же самое, вероятно, относится к звонку
CreateSubKey
.
Первоначальный вопрос был задан в контексте Windows Mobile. Я не использовал Windows Mobile (не уверен, что кто-то использует в наши дни), но я ожидаю, что параметр writeable будет там.
Чтобы создать ключ в LocalMachine во время установки, сделайте что-то вроде этого:
[RunInstaller(true)]
public class InstallRegistry : Installer
{
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
using (RegistryKey key = Registry.LocalMachine.CreateSubKey(@"software\..."))
{
RegistrySecurity rs = new RegistrySecurity();
rs.AddAccessRule(new RegistryAccessRule(new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), RegistryRights.FullControl, InheritanceFlags.None, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
key.SetAccessControl(rs);
}
}
public override void Rollback(System.Collections.IDictionary savedState)
{
base.Rollback(savedState);
}
}
Надеюсь, что это поможет вам.