Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы работы Delphi 6-7 с реестром Windows 7 
:(
    Опции темы
goa_dreamer
Дата 15.1.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.1.2008

Репутация: нет
Всего: 1



Делюсь некоторым опытом решения задачи записи в реестр с помощью 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/...-on-startup.htm

Запуск UAC запроса при необходимости:
http://stackoverflow.com/questions/923350/...ion-when-needed
PM MAIL   Вверх
Akella
Дата 15.1.2013, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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


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

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

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


Наверное, правильно было бы это назвать "поднятие прав".
PM MAIL   Вверх
goa_dreamer
Дата 15.1.2013, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.1.2008

Репутация: нет
Всего: 1



В чем была моя задача.
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 проверки.

Это сообщение отредактировал(а) goa_dreamer - 15.1.2013, 12:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.