2009-02-18 9 views
37

Я пишу утилиту настройки, которая изменяет некоторые ключи под HKEY_CLASSES_ROOT.Запрошен доступ к реестру не разрешен

Все работает отлично под Windows XP и так далее. Но я получаю ошибку Requested registry access is not allowed под Windows 7. Vista и 2008, я тоже думаю.

Как мне изменить свой код, чтобы добавить поддержку UAC?

ответ

45

app.manifest должно быть так:

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app" /> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
      <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
</asmv1:assembly> 
+0

Где находится этот app.manifest? –

+3

@Gunner: Поместите его в корень проекта, например App.config. (Файл -> Добавить новый элемент -> Файл манифеста приложения) – abatishchev

+0

@abatishchev: Вышеупомянутый контент xml является общим и должен быть достаточным для любого приложения, не так ли? –

15

Вы не можете писать на HKCR (или HKLM) кусты в Vista и более поздних версиях Windows, если у вас нет административных прав. Таким образом, вам нужно либо войти в систему как администратор, прежде чем запускать свою утилиту, дать ей манифест, который говорит, что для него требуется уровень администратора (который будет запрашивать у пользователя информацию для входа в систему администратора) или прекратить изменение вещей в местах, - Администраторы не должны играть. :-)

+0

спасибо за ключевое слово 'манифеста' :) – abatishchev

+2

Добро пожаловать. :-) Извините, я не смог опубликовать соответствующий манифест, но у меня его не было на этой машине и подумал, нужно ли кому-то искать его, возможно, вы тоже.

4

Как временное решение, пользователи могут щелкните правой кнопкой мыши и выберите утилиту «Запуск от имени администратора».

17

Если вам не нужно администратора privs для всего приложения, или только в течение нескольких нечастых изменений вы можете сделать изменения в новом процессе и запустить его с помощью:

Process.StartInfo.UseShellExecute = true; 
Process.StartInfo.Verb = "runas"; 

, который будет работать процесс как администратор, чтобы делать все, что вам нужно, с реестром, но вернитесь в свое приложение с обычными привилегиями. Таким образом, он не запрашивает у пользователя диалог UAC при каждом запуске.

+0

Вы имеете в виду, что для его реализации требуется реализовать вилку, где одна часть кода запускает одно и то же приложение с параметром, чтобы выполнить другую часть кода? – abatishchev

+0

Это может быть одно и то же приложение с параметрами, или это может быть отдельное небольшое приложение без окон, которое пишет то, что ему нужно. – Davy8

1

Эта проблема связана с предоставлением необходимого разрешения учетной записи пользователя, на которой выполняется приложение. Чтобы прочитать подобную ситуацию и развернутый ответ для правильного решения, как задокументирован Microsoft, не стесняйтесь посетить этот пост: http://rambletech.wordpress.com/2011/10/17/requested-registry-access-is-not-allowed/

2

Я пытался в verb = "runas", но я все еще получаю UnauthorizedAccessException при попытке обновления значения реестра. Оказалось, что это произошло из-за того, что не был открыт подраздел с возможностью записи в true.

Registry.OpenSubKey("KeyName", true); 

Cannot write to Registry Key, getting UnauthorizedAccessException