Запрашиваемый доступ к реестру не разрешен - PullRequest
42 голосов
/ 18 февраля 2009

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

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

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

Ответы [ 7 ]

56 голосов
/ 18 февраля 2009

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>
17 голосов
/ 18 февраля 2009

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

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

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

17 голосов
/ 18 февраля 2009

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

5 голосов
/ 18 февраля 2009

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

2 голосов
/ 27 июля 2012

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

Registry.OpenSubKey("KeyName", true);

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

1 голос
/ 17 октября 2011

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

0 голосов
/ 06 сентября 2018

Вы могли бы сделать тоже самое, что и абатищев, но без UAC

<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<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">
    </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>
...