Как избежать подтверждающего сообщения при запуске файла .reg с помощью команды shellexecute

В своей программе я проверяю ключ реестра при запуске, и если он почему-то не существует, я запускаю reg-файл, расположенный в папке приложения, с помощью команды ShellExecute. Как я могу избежать получения подтверждающих сообщений при выполнении этой команды. Есть ли способ сделать это или по соображениям безопасности это невозможно?


person Mikayil Abdullayev    schedule 16.01.2012    source источник
comment
Не запускайте reg-файл. Используйте API реестра напрямую.   -  person Preet Sangha    schedule 16.01.2012
comment
Я уверен, что ваш совет ценен, но не могли бы вы объяснить, почему мне не следует так поступать? И еще одна вещь: файл реестра, который я хочу выполнить, содержит множество записей, которые были автоматически вставлены компонентами сетки, поддерживающими данные. Если я попытаюсь написать это вручную, не будет ли это пустой тратой времени?   -  person Mikayil Abdullayev    schedule 16.01.2012
comment
Например, как вы будете работать с перенаправителем реестра в 64-битных системах?   -  person David Heffernan    schedule 16.01.2012
comment
Я надеюсь, что этого регистрационного ключа нет в HKLM. В противном случае вы не сможете его импортировать.   -  person David Heffernan    schedule 16.01.2012
comment
Кроме того, вам потребуются права администратора для запуска Regedit в среде UAC. Диалоговое окно с предупреждением UAC обязательно появится с просьбой подтвердить действие.   -  person kobik    schedule 16.01.2012
comment
@kobik это еще одна причина предпочесть reg import   -  person David Heffernan    schedule 16.01.2012
comment
@DavidHeffernan, reg похоже на инструмент, предназначенный для этой задачи. но следует тестировать в ОС с включенным UAC.   -  person kobik    schedule 16.01.2012
comment
Похоже, ваше приложение устанавливает ключи и значения реестра, которые принадлежат установщику, а не запускаются из вашего приложения. Это также позволяет избежать проблем с UAC при вызове regedit.exe или reg.exe. Если вам действительно нужно это сделать, используйте API реестра, так как часто regedit / reg блокируются в корпоративных средах, и даже если это не так, у вас нет возможности проверить, удалось ли это, или выполнить обработку ошибок (для этого предназначены API) .   -  person Remko    schedule 14.05.2020


Ответы (4)


Используйте параметр командной строки / s. (см. http://support.microsoft.com/kb/82821)

person Stephane    schedule 16.01.2012
comment
А как мне это сделать в Delphi? Я все еще использую ShellExecute? Был бы признателен за пример - person Mikayil Abdullayev; 16.01.2012
comment
ShellExecute подойдет. Я бы использовал reg import, а не regedit. - person David Heffernan; 16.01.2012
comment
ссылка на MS не работает, как раньше - person Ivan Ferrer Villa; 23.04.2021

Возможно. Два метода:

  1. % windir% \ system32 \ regedit.exe / s file.reg
  2. % windir% \ system32 \ reg.exe импортировать file.reg

Либо автоматически импортирует файл .reg в реестр.

person drf    schedule 16.01.2012
comment
это сработало, за исключением того, что теперь вы должны быть с правами администратора, так же как и многие запросы. - person BoB3K; 10.02.2021

попробуйте это для импорта файла * .reg,

  procedure ImportRegistry;
       var
        strProgram :String ;
        strCommand :String ;
        fileOne   :String ;
      begin

fileOne:=ExtractFilePath(Application.ExeName)+  'my_Resources\Default.reg';
strProgram := 'REGEDIT' ;
strProgram := strProgram + #0 ;
strCommand := '/SC /C ' + ExtractShortPathName(fileOne) ;
strCommand := strCommand + #0 ;

if ShellExecute(0,nil,@strProgram[1],@strCommand[1],nil,SW_HIDE) <= 32 then
  begin
        ShowMessage(SysErrorMessage(GetLastError)) ; //if there is any error in importing
  end;


end;

Также вы можете попробовать эту ссылку unitEXRegistry.pas

Этот модуль unitEXRegistry.pas имеет очень полезные функции для экспорта файла реестра, а также для автоматического импорта экспортированного файла * .reg.

       procedure exportREgis;
        var
         texpr : TExRegistry;
        begin
         texpr:=TExRegistry.Create;
         texpr.RootKey:=HKEY_CURRENT_USER;
         texpr.OpenKeyReadOnly('\MyKey');
         texpr.ExportKey (ExtractFilePath(Application.ExeName)+'ExportedReg.reg');
         texpr.Free; 
       end;

Затем для импорта вы можете использовать (тихо)

     procedure TForm1.Button1Click(Sender: TObject);
        var
         texpr : TExRegistry;
        begin
          texpr:=TExRegistry.Create;
          texpr.ImportRegFile('c:\myReg.reg');
          texpr.Free;
       end;
person PresleyDias    schedule 17.01.2012

Видимо есть ошибка в REG IMPORT - он пишет сообщение об успешном завершении в STDERR вместо STDOUT.

Следующий код .bat решает проблему. Сообщение об успехе отбрасывается, но отображается сообщение об ошибке.

SET RegError=%TEMP%\RegError.txt
REG IMPORT "%Settings.reg%" 2>"%RegError%" && DEL /Q "%RegError%" || @(ECHO Error importing %Settings.reg%: & TYPE "%RegError%" & PAUSE)
SET RegError=
person user15261314    schedule 26.02.2021