Inno Setup - 抑制"设置命令行:"日志条目

时间:2014-10-29 11:57:34

标签: inno-setup

我们使用Inno Setup(版本5.4.2)作为生成安装程序的打包工具。我们将一些密码值作为命令行参数传递。在Inno Setup中,所有命令行参数都使用"安装命令行自动登录安装日志:"条目。是否有任何方法可以抑制"设置命令行"登录日志。

2 个答案:

答案 0 :(得分:1)

没有。您只能禁用整体日志记录。以下是source code的相关部分的摘录:

...
Log('Setup version: ' + SetupTitle + ' version ' + SetupVersion);
Log('Original Setup EXE: ' + SetupLdrOriginalFilename);
Log('Setup command line: ' + GetCmdTail);
LogWindowsVersion;
...

正如您所看到的,在Log过程调用命令行尾之前没有条件,并且Log过程本身不包含过滤掉某些日志消息的方法。因此,此时防止此潜在安全问题的唯一方法是禁用整体日志记录。

由于这可能是一个安全问题,我建议您提交功能请求报告。

答案 1 :(得分:0)

作为替代方案,您可以要求用户通过命令行提供INI文件:

的config.ini

[credentials]
username=foo
password=bar

命令行调用

setup.exe /CONFIGFILE=config.ini

PascalScript

请注意,其中一部分未经测试,请自行承担使用风险。

function CommandLineSwitchIsPresent(Param : String): Boolean;
var
  i: Integer;
begin
  Result := False;

  if not StartsWith('/', Param) then
  begin
    Param := '/' + Param;
  end;

  for i:= 0 to ParamCount do
  begin
    if (CompareText(Param, ParamStr(i)) = 0)
      or StartsWith(Param + '=', ParamStr(i)) then
    begin
      Result := True;
      break;
    end;
  end;
end;


function GetCommandlineParam(Param: String; var OutStr: String): Boolean;
var
  ParamNameAndValue: String;
  i: Integer;
  j: Integer;
begin
  Result := False;

  Param := Param + '=';

  if not StartsWith('/', Param) then
  begin
    Param := '/' + Param;
  end;

  for i := 0 to ParamCount do
  begin
    ParamNameAndValue := ParamStr(i);
    if StartsWith(AnsiUppercase(Param), AnsiUppercase(ParamNameAndValue)) then
    begin
      for j := 0 to Length(ParamNameAndValue) do
      begin
        if j > Length(Param) then
        begin
          OutStr := OutStr + ParamNameAndValue[j];
        end;
      end;
      Result := True;
      break;
    end;
  end;
end;


function GetConfig(Section: String; Key: String; ConfigFile: String): String;
begin
  if IniKeyExists('credentials', Key, ConfigFile) then
  begin
    Result := GetIniString('credentials', Key, '', ConfigFile);
  end
  else begin
    RaiseException(
      Format(
        '%s key not found in [%s] section in %s', [Key, Section, ConfigFile]
      );
  end;
end;


var
  _gConfigFile: String;


procedure DoStuffWithPassword();
var
  Username: String;
  Password: String;
  ShortPath: String;
  ExpandedPath: String;
begin
  if not GetCommandlineParam('CONFIGFILE', ShortPath) then
  begin
    RaiseException('CONFIGFILE parameter is required!');
  end;

  // Go from relative path to absolute
  ExpandedPath := ExpandFileName(ShortPath);

  if FileExists(ExpandedPath) then
  begin
    _gConfigFile := ExpandedPath;
  end
  else begin
    RaiseException('CONFIGFILE file ' + ShortPath + ' not found!');
  end;

  Username := GetConfig('credentials', 'username', _gConfigFile);
  Password := GetConfig('credentials', 'password', _gConfigFile);
end;