| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
А зачем туда записывать без прав админа? Поставь себя на месте сисьадмина. Предствь, что какая-то левая непонятная программа начнёт писать в "системный" раздел реестра всякую ересь. Хорошо, если это ещё не вирус... Добавлено через 59 секунд Наверное, правильно было бы это назвать "поднятие прав". |
| Автор: 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\<Ветка моего приложения> Часть кода для примера:
Запуск вашего приложения с срабатыванием User Account Control: 1. Создать файл ApplicationExeName.manifest с следущим содержимым:
2. Создать файл ApplicationExeName.RC:
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 проверки. |