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"))
    {
    }
}

Я обнаружил при создании RegistryKeyinstance, через который он был доступен только для чтения. Чтобы я мог позвонить 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);
    }
}

Надеюсь, что это поможет вам.

Другие вопросы по тегам