Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблемы работы Delphi 6-7 с реестром Windows 7


Автор: goa_dreamer 15.1.2013, 10:56
Делюсь некоторым опытом решения задачи записи в реестр с помощью Delphi 6-7.

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

Происходит перенаправление и чтение/запись происходит по пути: HKEY_LOCAL_MACHINE --> HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE 
Под "высокими правами" подразумывается, что вы прошли запрос от UAC (User Account Control) в Windows Vista/Windows 7. Например запустите Regedit.exe, и вы получите запрос на выполнение.

Решением данного вопроса может быть добавление манифеста в ваше приложение. Пример добавления в следующей ссылке:
http://delphi.about.com/od/delphitips2009/qt/delphi-vista-registry-run-on-startup.htm

Запуск UAC запроса при необходимости:
http://stackoverflow.com/questions/923350/delphi-prompt-for-uac-elevation-when-needed

Автор: Akella 15.1.2013, 11:13
Цитата(goa_dreamer @  15.1.2013,  10:56 Найти цитируемый пост)
записывать в реальный ключ реестра HKEY_LOCAL_MACHINE. 


А зачем туда записывать без прав админа?

Поставь себя на месте сисьадмина. Предствь, что какая-то левая непонятная программа начнёт писать в "системный" раздел реестра всякую  ересь. Хорошо, если это ещё не вирус...

Добавлено через 59 секунд
Цитата(goa_dreamer @  15.1.2013,  10:56 Найти цитируемый пост)
Под "высокими правами" подразумывается, 


Наверное, правильно было бы это назвать "поднятие прав".

Автор: goa_dreamer 15.1.2013, 12:03
В чем была моя задача.
1. Запись расширения файлов моего приложения, например ".abc", должно произойти по-пути HKEY_CLASSES_ROOT\.abc
При попытке получения прав записи в данную ветку под windows 7 мое приложение вылетает с ошибкой о невозможности записи (установки) данных для данной ветки. С помощью монитора, вижу при попытке установить права Записи, получаю отказ. Тоесть HKEY_CLASSES_ROOT является защищенной.
2. Запись полученного сертификата пользователя с сервера в реестр должно происходить в HKEY_LOCAL_MACHINE, так чтобы все пользователи машины имели доступ к сертификату. На самом деле запись идет в HКEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE или HKEY_LOCAL_MACHINE\Software\Wow6432Node (в зависимости от 32-битной Windows или 64-битной Windows). С одной стороны права записи и чтения работают нормально, со стороны моего приложения реестр будет виден как HKEY_LOCAL_MACHINE. Но с обратной стороны, если мне нужно получить данные о Windows, или какой-то части реестра, смогу видеть только виртуальную сторону. Так же для этого существует флаг KEY_WOW64_64KEY, которое указывает что приложение на 64-битной Windows должно работать c 64-битным видом реестра. Этот флаг игнорируется 32-битной Windows.

Добавлено @ 12:09
Сделал тест, скомпилировал свое приложение Delphi без манифеста. Запуск без прав администратора дает запись в виртуальную ветку реестра. Перезапустил с правами администратора, запись произошла в HKEY_LOCAL_MACHINE\Software\<Ветка моего приложения>

Часть кода для примера:
Код

Const
  KEY_WOW64_64KEY = $0100;
  KEY_WOW64_32KEY = $0200;
Var
  Registry    : TRegistry;
Begin
  Registry := TRegistry.Create( KEY_ALL_ACCESS or KEY_WOW64_64KEY );


Запуск вашего приложения с срабатыванием User Account Control:
1. Создать файл ApplicationExeName.manifest с следущим содержимым:
Код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.1.1.1"
   processorArchitecture="X86"
   name="MyApp.exe"
   type="win32"/>
  <description>elevate execution level</description>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
  <security>
   <requestedPrivileges>
    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
   </requestedPrivileges>
  </security>
  </trustInfo>
 </assembly>


2. Создать файл ApplicationExeName.RC:
Код

 1 24 "TarotQuestioner.manifest"


3. Скомпилировать ApplicationExeName.REC с помощью:
Delphi\Bin\brcc32.exe ApplicationExeName.RC -fo ApplicationExeName.REC
Полученный файл скопировать в папку вашего проекта.
Добавить строку после {$R *.res} в вашем .dpr файл:
{$R ApplicationExeName.REC}

Во время попытки запуска приложения вы получите: Unable to create process: The Requested operation requires elevation. Тоесть вам нужно скомпилировать ваше приложение с помощью Delphi и запустить его с помощью Explorer'a Windows для запуска UAC проверки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)