Inno setup Inno安装程序基于外部信息设置密码

Inno setup Inno安装程序基于外部信息设置密码,inno-setup,Inno Setup,我的安装程序下载一个ini文件并从中获取一个值。我想使用此值作为安装程序的密码 我可以获取文件和值,但我不知道如何设置密码。我试过了,但是pascal不知道“password”的变量 thispassword := getinistring('installer','key','George', expandconstant('{tmp}\' + inifilename) ); TPasswordEdit.password := thispassword; 实际上,无论如何,我认为TPas

我的安装程序下载一个ini文件并从中获取一个值。我想使用此值作为安装程序的密码

我可以获取文件和值,但我不知道如何设置密码。我试过了,但是pascal不知道“password”的变量

 thispassword := getinistring('installer','key','George', expandconstant('{tmp}\' + inifilename) );
 TPasswordEdit.password := thispassword;
实际上,无论如何,我认为
TPasswordEdit
只是编辑框控件。但是我也试过
TPasswordEdit.text
。(
password
无论如何都是布尔值)


我甚至可以通过密码更改密码吗?

我不会直接回答你的问题,因为听起来你确实需要其他东西。我得到了你的目标,因为你想下载一个文件与密码,让用户输入这样的密码继续安装。如果是这样,我会这样做(密码是
Hello
,区分大小写):


特拉马建议使用
CheckPassword
时给出了正确的答案。直到那时,我还以为这和使用密码向导页面是一样的。但这是我最后的工作代码

这里的想法是让安装程序只提供一次自动密码的机会

这允许使用不同的功能:

  • 首先,安装程序将下载一个文件并使用其中包含的密码
  • 如果文件无法保存,或者密码错误,用户可以随时提供
  • 最后,还有一个IT团队可以使用的主密码
  • 这是我的工作代码,以防有人来找我:

    [Code]
    var 
      initialpassword: string;
    
    procedure InitializeWizard;
    begin
      // initialize the downloader
      ITD_Init;
    
      itd_setoption('UI_AllowContinue', '1');
      itd_addfile('http://www.somesite/somefile.txt', expandconstant('{tmp}\myini.ini') );
      itd_downloadafter(wpWelcome);
    end;
    
    
    function CheckPassword(Password: String): Boolean;
    var
      returnvalue: boolean;
    begin  
      initialpassword := getinistring('installer','key','', expandconstant('{tmp}\myini.ini'));
      result := false;
      if(password = initialpassword)then result := true;
      if(password = 'MasterPassword')then result := true;
      if(password = '')then result := false;
    end;
    

    现在,我还没有为密码添加哈希,但我要添加。

    什么是
    TPasswordEdit
    ?这是您创建的
    TNewEdit
    控件还是其他控件?我在Inno安装文档中Pascal脚本的“支持类参考”中找到了
    TPasswordEdit
    。它似乎是TCustomEdit类的定义。不,我没有编造。对不起!是的,我指的是您在
    [setup]
    中定义的设置密码。不,我不想在编译时设置该值。我想在安装期间设置它…啊,我想我现在已经得到了。好吧,去设定那个pwd。编辑框您可以使用
    向导form.PasswordEdit.Text
    属性,但是否确实要使用从某个文件中以纯文本形式读取的值预先填充该密码编辑?您应该考虑使用<代码>校验密码< /C>事件,并将存储在文件中的SHA-1散列与传递的<代码>密码< /COD>参数值进行比较。如果这是出于某些部署测试的目的,那么肯定更喜欢使用
    /PASSWORD
    命令行参数。除了SHA-1之外,Inno Setup中还有获取MD5哈希字符串的函数,您可以将这些函数组合在一起,或者如果您想增加一点安全性,可以与一些强salt一起重复使用。只需注意,在本地机器上运行的所有东西都可以被分解,发送密码,甚至通过网络散列也永远不会是绝对安全的。但这就是你的要求,如果我没有弄错的话,当然,这是不可能的。散列密码是另一个问题(但谢谢你)。问题是我不想使用编译时设置的密码。我想“动态”生成密码,也就是说,通过使用下载的文件生成密码,该文件将包含安装程序工作所需的密码。你在对我的问题的评论中给我看的内容会设置项目符号,但不会设置实际密码。但是你说了,密码必须在编译时设置。因此,答案是创建自己的对话,而不是使用Innos密码窗口。是的,
    密码
    指令值必须在编译时已知。但这并不是显示和使用内置密码页面的唯一方法。另一个显示在这个答案中。它显示了如何下载密码,然后用户必须输入密码才能继续安装(下载密码函数是一个伪代码;实际上,您会在其中输入一个代码,返回下载的密码哈希字符串)。只需为
    CheckPassword
    编写一个处理程序,即可显示并覆盖内置密码页面及其验证机制(无需自定义页面)。欢迎使用!你可以看看一个类似的例子,它只使用标准的Windows WinHTTP库(不使用外部插件),没有用于exchange的文件(文件直接下载到字符串变量中)。是的,我个人更喜欢WinHTTP,而不是插件。但是很难说WinHTTP更好。WinHTTP是一个用于HTTP通信的Windows API,而downloader插件被包装在一个库中,该库自行构建和解析HTTP请求和响应,并通过较低级别的Winsock API进行通信。他们在最低级别上都做同样的事情。是的,我会这么说。运送一个外部库(itdownload.dll)并使用一些偏执病毒会带来更大的风险。但我相信这是众所周知的一段时间,所以它应该是好的。
    [Code]
    var 
      initialpassword: string;
    
    procedure InitializeWizard;
    begin
      // initialize the downloader
      ITD_Init;
    
      itd_setoption('UI_AllowContinue', '1');
      itd_addfile('http://www.somesite/somefile.txt', expandconstant('{tmp}\myini.ini') );
      itd_downloadafter(wpWelcome);
    end;
    
    
    function CheckPassword(Password: String): Boolean;
    var
      returnvalue: boolean;
    begin  
      initialpassword := getinistring('installer','key','', expandconstant('{tmp}\myini.ini'));
      result := false;
      if(password = initialpassword)then result := true;
      if(password = 'MasterPassword')then result := true;
      if(password = '')then result := false;
    end;