Вопрос по c#, access-denied, registry – Доступ запрещен при создании раздела реестра в C #

2

Я пытаюсь создать раздел реестра в следующем месте, но получаю сообщение об ошибке «Отказано в доступе»:

HKEY_LOCAL_MACHINE\SOFTWARE\MyCompany\MyProgram

Вот код:

<code>RegistryKey reg;
reg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\MyCompany\MyProgram");
</code>
@UweKeim Я вошел как администратор. Но когда я запускаю regedit, я получаю это сообщение от Windows "Хотите ли вы, чтобы программа вносила изменения в компьютер?" и когда я нажимаю Да только тогда, я могу получить доступ к реестру. И да, я могу создать ключ и подключ через редактор реестра. Ali
Возможно, пользователь, выполняющий ваш код, на самом деле не имеет прав для создания ключа. Если вы запускаете вручнуюregedit с тем же пользователем, вы можете создать подраздел в редакторе реестра? Uwe Keim

Ваш Ответ

3   ответа
1

Я попробовал ниже синтаксис:

SETX /S [Machine Name] [Variable] [Value] /M

Я не уверен, почему, но в Windows 7, если вы указываете имя компьютера, на котором вы добавляете системную переменную, даже для локального компьютера, тогда это работает.

5

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

@ Али, поэтому вы должны запускать свое приложение от имени администратора точно так же, как вы делаете это с regedit. Вы щелкаете правой кнопкой мыши по исполняемому файлу и выбираете «Запуск от имени администратора».
Я вошел в систему как администратор. Но когда я запускаю regedit, я получаю это сообщение от Windows "Хотите ли вы, чтобы программа вносила изменения в компьютер?" и когда я нажимаю Да только тогда, я могу получить доступ к реестру. Ali
@Ali - только потому, что вы вошли в систему как администратор, ваши приложения не запускаются на этом уровне привилегий автоматически, вы должны получить их для запроса повышенных привилегий.
Вы можете сделать это в C #, добавив файл манифеста приложения, а затем откомментируйте следующую строку: & lt; requiredExecutionLevel level = & quot; requireAdministrator & quot; UIAccess = & Quot; ложно & Quot; / & GT;
Вы не можете сделать это в C #. Пользователь, запустивший ваше приложение, должен запустить его от имени администратора. Все, что вы можете сделать, это включить манифест в ваше приложение, чтобы при запуске пользователь запрашивал повышение прав.
6

Вы, скорее всего, используетеКонтроль учетных записей (UAC), Это означает, что даже если вы являетесь администратором, ваш токен доступа не обладает необходимыми привилегиями для выполнения таких действий, как создание разделов реестра вHKEY_LOCAL_MACHINE.

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

Regedit включает в себяUAC манифест это вызовет запрос до того, как он будет выполнен, гарантируя, что он может выполнить действия, которые он должен уметь делать. Вы также можете щелкнуть правой кнопкой мыши исполняемый файл или ярлык и выбратьRun as administrator.

По сути, у вас есть три варианта:

  • Turn off UAC
  • Use Run as administrator
  • Include a UAC manifest in your executable

Первое решение является менее безопасным, а последнее решение является наиболее элегантным (но оно также требует определенных усилий).

@DanW: когда вы устанавливаете цель платформы наAny CPU на .NET 4.0 и запустите ваше приложение в 64-битной операционной системе, процесс будет 64-битным. Это означает, что ваше приложение видит & quot; реальное & quot; реестр. Если он выполняется в 32-битном процессе, процесс видит измененную версию реестра, и, вероятно, именно поэтому вы должны изменить целевую платформу.
Моим решением написать в HKLM было «Запуск от имени администратора». процесс выделения из того же исполняемого файла (передача аргумента, чтобы exe-файл делал что-то другое). Однако мне также пришлось установить целевое значение для платформы «Любой процессор». вместо "x86".

Похожие вопросы