2009-12-17 3 views
0

Я устанавливаю параметр реестра, и могу это сделать, если значение находится в [HKEY_CURRENT_USER], но если значение находится в [HKEY_CURRENT_USER \ Software \ Adobe \ Acrobat Reader \ 9.0 \ ethan], тогда я получаю следующее ошибка:C# Registry Setting

ех { "не удалось записать в раздел реестра."} {System.Exception System.UnauthorizedAccessException}

кто-нибудь знает, что может быть не так? Смотрите код ниже:

private string setRegKey(string machinename) 
    { 
     try 
     { 
      RegistryKey regKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machinename).OpenSubKey("Software").OpenSubKey("Adobe").OpenSubKey("Acrobat Reader").OpenSubKey("9.0").OpenSubKey("ethan"); 
      regKey.SetValue("Test", 1); 
      regKey.Close(); 
      return "Success"; 
     } 
     catch (Exception ex) 
     { 
      return "Error: " + ex.ToString(); 
     } 
    } 
+1

Win7 или Vista? Если это так, это может быть уровень безопасности работающего пользователя. – kenny

+1

Текущий пользователь на удаленной машине? Как это могло когда-либо работать? –

ответ

0

Запуск regedt32.exe из окна запуска будет открыть версию смерзаться, что позволяет просматривать разрешения, установленные на каждом ключе реестра. Вы можете использовать это, чтобы определить, какие разрешения необходимы для редактирования ключа. Следующим шагом будет обеспечение того, чтобы учетная запись, на которой выполняется приложение, имеет соответствующие разрешения. Если запуск приложения с включенным контролем доступа пользователя, возможно, потребуется запустить его, удерживая shift, щелкнув правой кнопкой мыши на exe и выбрав опцию «Запуск от имени администратора». (Это то, что имеется в виду при подъеме приложения)

1

Вы действительно пытаетесь изменить настройки на удаленной машине? Я полагаю, что может работать, если пользователь является пользователем домена.

В любом случае, нужно знать, что каждый раз, когда вы вызываете «OpenSubKey», вы получаете новый экземпляр объекта RegistyKey, и каждый из них должен быть удален. В противном случае вы начнете терять дескрипторы реестра из-за ошибки финализации в фреймворке (это может быть исправлено, но я выхожу).

Кроме того, нет необходимости открывать каждый узел ключа отдельно (если это не связано с удаленно открытыми ключами?). Я хотел бы предложить изменить код внутри блока попытаться следующее:

using (RegistryKey remoteUserKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machinename)) 
using (RegistryKey remoteKey = remoteUserKey.OpenSubKey(@"Software\Adobe\Acrobat Reader\9.0\ethan")) 
{ 
    remoteKey.SetValue("Test", 1); 
    return "Success"; 
} 

Если вам не нужно, чтобы изменить это удаленно, удалить первые две строки и использовать вместо этого:

using (RegistryKey key = Registry.LocalUser.OpenSubKey(@"Software\Adobe\Acrobat Reader\9.0\ethan"))