Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )

Ответить
Настройки темы
Delphi - [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )

Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Изменения
Автор: Painkiller
Дата: 26-02-2016
Привет всем ! Столкнулся с такой проблемой . Нужно удалить ключ реестра со всеми подключами.
Код: Выделить весь код
HKEY_LOCAL_MACHINE\Software\Microsoft\WIMMount
Проблема на x64 системе , а у меня x32 приложения . Соответственно моя программа ищет этот в ключе Wow6432Node. Решения я нашёл не используя библиотеку JEDI так:
Скрытый текст

Код: Выделить весь код
procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create();
if IsWindows64=true then begin
Reg.Access := $100 or KEY_ALL_ACCESS;
end;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.KeyExists('\Software\Microsoft\WIMMount') then
Reg.DeleteKey('Software\Microsoft\WIMMount');
finally
Reg.Free;
end;end;

Всё работает и удаляется . Но хотелось бы обойтись средствами библиотеки JEDI
Скрытый текст

Набросал код :
Код: Выделить весь код
procedure TForm1.Button2Click(Sender: TObject);
var
RootKey: HKEY;
PathKEY:String;
 begin
if IsWindows64=true then begin
RegSetWOW64AccessMode(ra64Key);
end;
RootKey := HKEY_LOCAL_MACHINE;
PathKEY:='Software\Microsoft\WIMMount';
if not RegKeyExists (RootKey,PathKEY) then begin
Memo1.Lines.Add('- [ Ошибка ] Ключ не найден')
end else begin
Memo1.Lines.Add('[ ОК ] Ключ найден');
if not RegDeleteKeyTree (RootKey,PathKEY)then   begin
Memo1.Lines.Add('[ Ошибка ] Ключ не удалён')
end else begin
Memo1.Lines.Add('[ ОК ] Ключ удалён');
end;
end;
end;
end.

Ключ находит, но не удаляет =((( Что нужно ещё добавить ??? Помогите, плиз!

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Отправлено: 23:47, 24-02-2016

 

Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Может так

Код: Выделить весь код
1. TForm1.FormCreate(....);
...
RegSetWOW64AccessMode(raNative);

и запросить привилегии, если программа исполняется в Виста и выше

if (CheckWin32Version(6, 0)) then
begin
   if not IsPrivilegeEnabled('SeBackupPrivilege') then
      EnableProcessPrivilege(True, 'SeBackupPrivilege');
   if not IsPrivilegeEnabled('SeRestorePrivilege') then
      EnableProcessPrivilege(True, 'SeRestorePrivilege');
end;
....

а по завершению программы, восстановить привилегии 

if (CheckWin32Version(6, 0)) then
begin
   if IsPrivilegeEnabled('SeBackupPrivilege') then
      EnableProcessPrivilege(False, 'SeBackupPrivilege');
   if IsPrivilegeEnabled('SeRestorePrivilege') then
      EnableProcessPrivilege(False, 'SeRestorePrivilege');
end;

2. Нужно ли выводить все операциям с ключами в Memo, может просто поднимать исключение?

if (RegKeyExists(RootKey, PathKEY)) then
begin
   if not(RegDeleteKeyTree(RootKey, PathKEY)) then
   begin
      RaiseLastOSError;
      exit;
   end
end;

а если Memo служит для последующего сохранения log-файла, то тогда можно добавить код ошибки (дата, время и т.д.)
... Lines.Add('Сообщение.... '+ SysErrorMessage ( GetLastError )));

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:53, 26-02-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


opel431, добавил ваш код :
Скрытый текст

Код: Выделить весь код
uses
JclSecurity,JclRegistry,....
..........................
procedure TForm1.Button2Click(Sender: TObject);
var
RootKey: HKEY;
PathKEY:String;
 begin
RegSetWOW64AccessMode(raNative);
RootKey := HKEY_LOCAL_MACHINE;
PathKEY:='Software\Microsoft\WIMMount\Mounted Images';
if not RegKeyExists (RootKey,PathKEY) then begin
RaiseLastOSError;
Memo1.Lines.Add('[ Ошибка [ '+ SysErrorMessage ( GetLastError )+' ] Ключ не найден') ;
exit
end else begin
Memo1.Lines.Add('[ ОК ] Ключ найден');
if not RegDeleteKeyTree (RootKey,PathKEY)then   begin
RaiseLastOSError;
Memo1.Lines.Add('[ Ошибка [ '+ SysErrorMessage ( GetLastError )+' ] Ключ не удалён');
exit
end else begin
Memo1.Lines.Add('[ ОК ] Ключ удалён');
end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (CheckWin32Version(6, 0)) then
begin
   if IsPrivilegeEnabled('SeBackupPrivilege') then
      EnableProcessPrivilege(False, 'SeBackupPrivilege');
   if IsPrivilegeEnabled('SeRestorePrivilege') then
      EnableProcessPrivilege(False, 'SeRestorePrivilege');
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if (CheckWin32Version(6, 0)) then
begin
   if not IsPrivilegeEnabled('SeBackupPrivilege') then
      EnableProcessPrivilege(True, 'SeBackupPrivilege');
   if not IsPrivilegeEnabled('SeRestorePrivilege') then
      EnableProcessPrivilege(True, 'SeRestorePrivilege');
end;
end;
end.


При нажатии кнопки Button2 выскакивает ошибка
Скрытый текст



Windows 7 Максимальная x64 установлена
Убрал RaiseLastOSError ошибка ушла , ключ находит, но ключ не удаляет =((. Хочу заметить то что если я делаю x64 приложения , то ключ удаляется

Пробовал использовать manifest
Скрытый текст

Код: Выделить весь код
 с <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Результат не дал =(

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Последний раз редактировалось Painkiller, 26-02-2016 в 09:28.


Отправлено: 08:29, 26-02-2016 | #3


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


В целом, сообщение "A call to an OS function failed" вызывается из SysUtils, когда Win32Check или RaiseLastOSError не находит соответствующее сообщение об ошибке в модуле.
Пояснение

Цитата Painkiller:
При нажатии кнопки Button2 выскакивает ошибка »
И как это понимать? Я ведь написал Вам два варианта:
1. Вызывать исключение
RaiseLastOSError; // выводит сообщение об исключительной ситуации, но не для RegKeyExists(....), а для RegDeleteKeyTree(...)
Exit(); // выйти из процедуры

2. Выводить сообщение с кодом ошибки
memo1.Lines.Add('[ Ошибка [ ' + SysErrorMessage(GetLastError) + ' ] Ключ не найден');
// это сообщение будет такого вида Ошибка [Операция успешно завершена]Ключ не найден !!!! Зачем такой вид?? Не проще
memo1.Lines.Add('[ Сообщение - ( ' + SysErrorMessage(GetLastError)+')')

А Вы все в одну кучу!

3. Для чего Вы RegSetWOW64AccessMode(raNative) поместили в событие кнопки? Оно должно вызываться один раз, при создании или инициализации формы.

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 26-02-2016 в 09:56.


Отправлено: 09:38, 26-02-2016 | #4


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


opel431, извиняюсь, поправил код.
Код: Выделить весь код
procedure TForm1.Button2Click(Sender: TObject);
var
RootKey: HKEY;
PathKEY:String;
 begin
RegSetWOW64AccessMode(raNative);
RootKey := HKEY_LOCAL_MACHINE;
PathKEY:='Software\Microsoft\WIMMount';
if not RegKeyExists (RootKey,PathKEY) then begin
Memo1.Lines.Add('[ '+ SysErrorMessage ( GetLastError )+' ] Ключ не найден') ;
exit
end else begin
Memo1.Lines.Add('[ '+ SysErrorMessage ( GetLastError )+' ] Ключ найден') ;
if not RegDeleteKeyTree (RootKey,PathKEY)then   begin
Memo1.Lines.Add('['+ SysErrorMessage ( GetLastError )+' ] Ключ не удалён');
exit
end else begin
Memo1.Lines.Add('['+ SysErrorMessage ( GetLastError )+' ] Ключ удалён');
end;
end;
end;
Операции выполняются успешно , но ключ всё равно не удаляется
Скрытый текст


-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Последний раз редактировалось Painkiller, 26-02-2016 в 10:55.


Отправлено: 09:48, 26-02-2016 | #5


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Смотря, что Вам нужно!
RegDeleteKeyTree - удаляет подключи, для сбора всех ='RegKeyName' нужно будет формировать список и удалять по списку (RegGetKeyNames)
RegDeleteEntry - удаляет ключ

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Отправлено: 10:07, 26-02-2016 | #6


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Цитата opel431:
Смотря, что Вам нужно!
RegDeleteKeyTree - удаляет подключи, для сбора всех ='RegKeyName' нужно будет формировать список и удалять по списку (RegGetKeyNames)
RegDeleteEntry - удаляет ключ »
Нужно удалить ключ реестра со всеми подключами. RegDeleteKeyTree удаляет ключ с подключами и не нужно удалять по списку. Я же писал что при компиляции x64 приложения , всё удаляется с подключами без проблем, проблема только с x32 приложением
Разницы нет где располагать RegSetWOW64AccessMode(raNative). Так как без его ключ вообще не видит. Значит RegSetWOW64AccessMode(raNative) работает и в кнопке.

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Отправлено: 10:54, 26-02-2016 | #7


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Цитата Painkiller:
RegDeleteKeyTree удаляет ключ с подключами и не нужно удалять по списку. »
Значит я не совсем Вас понял и предположил, что Вам еще нужно найти в ветке n-ключей, а затем их удалить с под ключами.
Манифест, с параметром level="requireAdministrator" + получение прав, нужны обязательно!

Цитата Painkiller:
Так как без его ключ вообще не видит. »
Фактически, это переключатель и режим переключения (по условию) Вы задаете сами
Код: Выделить весь код
OS/Application   32bit/32bit   64bit/32bit   64bit/64bit
raDefault        Software      Wow6432Node   Software
raNative         Software      Software      Software
ra32Key          Software      Wow6432Node   Wow6432Node
ra64Key          Software      Software      Software
Delphi, ставлю когда мне это необходимо, потому даю совет исходя из справки и исходников JCL.
Вы можете еще добавить в процедуры работы с привилегиями еще пару "вездесущих" привилегий: SeDebugPrivilege и SeManageVolumePrivilege.
Да, после изменений в реестре нужно известить систему - SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(PChar(Ветка реестра)));

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 26-02-2016 в 16:50.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:42, 26-02-2016 | #8


Аватара для Painkiller

Ветеран


Автор проектов


Сообщения: 1158
Благодарности: 382

Профиль | Отправить PM | Цитировать


Цитата opel431:
Фактически, это переключатель и режим переключения (по условию) Вы задаете сами »
Я знаю, модуль я курил искав решения .
Цитата opel431:
получение прав, нужны обязательно! »
Этот ключ с подключами удаляется легко через рег файл , через батник. Разве нужны права ?
Цитата opel431:
после изменений в реестре нужно известить систему - SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(PChar(Ветка реестра))); »
А вот этого не знал . Спасибо. Попробую

Всё равно не работает. =( Объясните мне тогда почему мой код не используя библиотеку JEDI работает без манифеста, привилегий.
Код: Выделить весь код
procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create();
if IsWindows64=true then begin
Reg.Access := $100 or KEY_ALL_ACCESS;
end;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.KeyExists('\Software\Microsoft\WIMMount') then
Reg.DeleteKey('Software\Microsoft\WIMMount');
finally
Reg.Free;
end;end;
А с JEDI не работает = ( Ладно , буду использовать свой код раз с JEDI не получается .

-------
http://wiki.oszone.net/images/0/03/UserbarAAA4.gif


UpdatePack 7 для интеграции обновлений в образ Windows 7 SP1 [X86\64]

UpdatePack 8.1 для интеграции обновлений в образ Windows 8.1 [X86\64]

UpdatePack 10 для интеграции обновлений в образ Windows 10 [X86\64]


Последний раз редактировалось Painkiller, 26-02-2016 в 17:18.


Отправлено: 17:04, 26-02-2016 | #9


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Цитата Painkiller:
Объясните мне тогда почему мой код не используя библиотеку JEDI работает без манифеста, привилегий »
1. Ваш код, удаляет ключ! А функция RegDeleteKeyTree, удаляет подключи!

2. Права доступа к реестру необходимы и они присутствуют в обоих вариантах. См KEY_ALL_ACCESS у Вас и в исходнике
RegDeleteKeyTree
Код: Выделить весь код
function RegDeleteKeyTree(const RootKey: DelphiHKEY; const Key: string): Boolean;
var
  RegKey: HKEY;
  I: DWORD;
  Size: DWORD;
  NumSubKeys: DWORD;
  MaxSubKeyLen: DWORD;
  KeyName: string;
begin
  RegKey := 0;
  Result := InternalRegOpenKeyEx(RootKey, RelativeKey(RootKey, PChar(Key)), 0, KEY_ALL_ACCESS, RegKey) = ERROR_SUCCESS;
  if Result then
  begin
    RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, @MaxSubKeyLen, nil, nil, nil, nil, nil, nil);
    if NumSubKeys <> 0 then
      for I := NumSubKeys - 1 downto 0 do
      begin
        Size := MaxSubKeyLen+1;
        SetLength(KeyName, Size);
        RegEnumKeyEx(RegKey, I, PChar(KeyName), Size, nil, nil, nil, nil);
        SetLength(KeyName, StrLen(PChar(KeyName)));
        Result := RegDeleteKeyTree(RootKey, Key + RegKeyDelimiter + KeyName);
        if not Result then
          Break;
      end;
    RegCloseKey(RegKey);
    if Result then
      Result := {$IFDEF HAS_UNITSCOPE}Winapi.{$ENDIF}Windows.RegDeleteKey(RootKey, RelativeKey(RootKey, PChar(Key))) = ERROR_SUCCESS;
  end
  else
    WriteError(RootKey, Key);
end;

3. Вы работаете в системе с отключенным UAC?

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Отправлено: 17:56, 26-02-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Вопрос по библиотеке JEDI (модуль JclRegistry )

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2008 - Вопрос по программе для открытия рисунков по умолчанию flower Windows Server 2008/2008 R2 4 18-10-2010 17:22
Прочее - вопрос по загрузке образов cd/dvd дисков по сети andi_filon Общий по Linux 4 21-08-2009 14:48
Вопрос по платформам обработки данных и еще по всяким непонятным словам :) koresaram Хочу все знать 8 19-02-2009 18:26
Jedi Concentrate (Концентрируемся на окнах) yurfed Программное обеспечение Windows 0 22-12-2007 10:05
Star Wars: Jedi Knight 2 Mihan Игры 8 03-11-2003 11:50




 
Переход