Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > проблема с сохранением раздела реестра


Автор: amt2001 13.7.2011, 14:35
Использую класс TRegistry для работы с реестром. Сохраняю нужный раздел с помощью savekey, файл экспорта hive создается.
Проблема в том, что при сохранении одного и того же  раздела реестра файлы отличаются, о чем говорят контрольные суммы и сравнения данных файлов. Разница в принципе не значительная и, подозреваю, для функций класса tregistry импорт данных файлов пройдет без проблем, но для меня это критично.
Пробовал работать с regsavekey с различными форматами, результат тот же.

Во вложении два файла выгрузки одного и того же реестра где видно (с помощью утилиты comp), что некоторыей байты отличаются. 

Кто-нибудь сталкивался с таким?

Автор: borisbn 13.7.2011, 15:38
Цитата(amt2001 @  13.7.2011,  14:35 Найти цитируемый пост)
Во вложении два файла выгрузки одного и того же реестра где видно (с помощью утилиты comp), что некоторыей байты отличаются. 

ихде ?

Цитата(amt2001 @  13.7.2011,  14:35 Найти цитируемый пост)
Кто-нибудь сталкивался с таким?

да, сталкивался. В реестре хранится дата/время последнего изменения, поэтому и отличается. Поэтому и не сильно smile

Автор: amt2001 13.7.2011, 17:06
Цитата

ихде ?


вроде прикрепил.

 
Цитата

да, сталкивался. В реестре хранится дата/время последнего изменения, поэтому и отличается. Поэтому и не сильно


Так раздел то не меняется... производится только его чтение.
А можно ли не сохранять время?

Автор: borisbn 13.7.2011, 17:16
Цитата(amt2001 @  13.7.2011,  17:06 Найти цитируемый пост)
А можно ли не сохранять время?

От тебя это не зависит. Внутрь функций работы с реестром встроено протоколирование всех действий.
По-моему в этих функциях нет такого флажка "не протоколировать действия" или что-либо подобное...

Цитата(amt2001 @  13.7.2011,  14:35 Найти цитируемый пост)
подозреваю, для функций класса tregistry импорт данных файлов пройдет без проблем

 smile 

Автор: amt2001 13.7.2011, 18:43


 Вижу две альтернативы:
1. Использовать другие классы или компоненты. Кстати, какие есть? (winapi не предлагать)
2. Самому рекурсивно перебирать ветки на.

Автор: borisbn 13.7.2011, 18:52
Цитата(amt2001 @  13.7.2011,  18:43 Найти цитируемый пост)
1. Использовать другие классы или компоненты. Кстати, какие есть? (winapi не предлагать)

никакие не помогут, т.к. протоколирование действий заложено на самом низком уровне, а все компоненты - всего-лишь обёртка над winAPI

Цитата(amt2001 @  13.7.2011,  18:43 Найти цитируемый пост)
2. Самому рекурсивно перебирать ветки на.

Понятия не имею, правильный ли это выход, т.к. ты ни слова не сказал о задаче  smile 

Автор: amt2001 13.7.2011, 20:39
задача осуществить контроль целостности веток реестра... для этого выгружаю ветку в файл, считаю контрольную сумму и ожидаю очередной проверки...
Есть еще один вариант - вызывать для экспорта regedit, но мне это вариант не нравится.

Цитата

никакие не помогут, т.к. протоколирование действий заложено на самом низком уровне, а все компоненты - всего-лишь обёртка над winAPI

 Почему не помогут? можно выгружать в тектовом виде (reg-файл)... там уж точно никакое время не проставляется...

Автор: borisbn 13.7.2011, 22:23
Цитата(amt2001 @  13.7.2011,  20:39 Найти цитируемый пост)
Почему не помогут? можно выгружать в тектовом виде (reg-файл)... там уж точно никакое время не проставляется...

теперь, когда задача понятна, то ессно, можно и выгружать в текстовом виде и проверять каждый раз всю ветку "вручную", но может стОит посмотреть http://msdn.microsoft.com/en-us/library/ms724892(VS.85).aspx ?

Автор: amt2001 13.7.2011, 23:15
Данные функции не подойдут, поскольку имеют смысл только на протяжении времени работы приложения. А я хочу посчитать контрольную сумму с возможностью ее проверки, например, через сутки, неделю и т.д. когда невозможно производить отслеживание событий.
Надо посмотреть в сторону hive файла. Может попробовать в нем время менять или еще что-нибудь.
 

Автор: artsb 13.7.2011, 23:27
Цитата(amt2001 @  13.7.2011,  23:15 Найти цитируемый пост)
Надо посмотреть в сторону hive файла.

А зачем, вообще, хранить целый файл (hive или reg)? Можно же сохранить reg-файл во временную папку, затем подсчитать MD5 или CRC32 или ещё что, и затем сохранить одну только строку.

Автор: borisbn 14.7.2011, 00:28
Цитата(amt2001 @  13.7.2011,  20:39 Найти цитируемый пост)
Есть еще один вариант - вызывать для экспорта regedit, но мне это вариант не нравится

чем ?
Цитата

regedit /E c:\hklm_run.reg "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run"

потом сравниваешь файл "эталона" с полученным побайтно...

Добавлено через 10 минут и 59 секунд
кста, можно вообще обойтись cmd-шником. Нужно только найти команду сравнения двух файлов. Получится как-то так
Код

regedit /E c:\temp\now.reg "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" <--- сюда вписать нужную ветку
compare c:\temp\now.reg c:\temp\was.reg <--- was.reg - эталон, compare -какая-то утилита сравнения
if errorlevel 1 goto changed
goto ok
:changed
echo Изменён
goto end
:ok
echo OK
:end

Автор: amt2001 14.7.2011, 08:12
Цитата

А зачем, вообще, хранить целый файл (hive или reg)? Можно же сохранить reg-файл во временную папку, затем подсчитать MD5 или CRC32 или ещё что, и затем сохранить одну только строку.

Именно так я сейчас и пытаюсь сделать, но поскольку при каждом экспорте в файл сохраняется время, то контрольные суммы постоянно разные.

Сейчас сравниваю hive, поскольку сохранять в *.reg умеет только regedit, winapi-шные функции и wrapper-ы этого не умеют. 

Цитата

чем ?

ShellExecute

Цитата

кста, можно вообще обойтись cmd-шником. Нужно только найти команду сравнения двух файлов. Получится как-то так

cmd не подойдет как и внешний вызов regedit - не хочу привязываться к внешним приложениям.

Автор: artsb 14.7.2011, 09:33
Цитата(amt2001 @  14.7.2011,  08:12 Найти цитируемый пост)
Сейчас сравниваю hive, поскольку сохранять в *.reg умеет только regedit, winapi-шные функции и wrapper-ы этого не умеют. 

Структура файла предельно проста. Можете самостоятельно формировать такой файл. Ну или как советовал borisbn, через командную строку.

Автор: amt2001 15.7.2011, 22:27
Решил проблему так - удаляю заголовок hive файла (первые 512 байт), где хранится внутренний hash и прочее барахло, не имеющее отношения к ключам и значениям реестра. Далее рассчитываю hash файла. Пока полет нормальный 

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