Запрошенный доступ к реестру не разрешен

Я пишу утилиту настройки, которая модифицирует некоторые клавиши в HKEY_CLASSES_ROOT.

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

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

Ответ 1

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>

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Registry.OpenSubKey("KeyName", true);

Невозможно записать ключ реестра, получив UnauthorizedAccessException

Ответ 6

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