Inno Setup 中的数据库密码复杂性验证

Database password complexity verification in Inno Setup

在我的设置中,我需要使用从 InputQueryPage 传递的 SA 密码安装 SQL 服务器。 我需要根据 Windows 密码复杂性限制密码输入。密码长度至少为 9 个字符,并且必须至少包含一个符号、一个大写字母、一个小写字母和一位数字。怎么做到的?

我有这个代码:

Page0 :=
  CreateInputQueryPage(
    pSelectTasks, 'SQL Server installation', '',
    'Specify SQL Server parameters , press Next to continue.');
       
Page0.Add('SQL Instance:', False);
Page0.Add('Sa Password:', True);
Page0.Values[0] := ('xxx');
Page0.Values[1] := ('xxxxxxx');

用这段代码解决了:

function passwordcomplexity(Pass : String) : Boolean;
var
  i : integer;
  Findchar : Boolean;
begin
    Result := false;
    Findchar:= false;
    begin
      if Length(Pass) < 9 then 
      begin
        Result := False;
      Exit;
    end;

    for i:=1 to length(Pass) do
    begin
        case Pass[i] of
          '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', '?', '\', '*', '#': // caratteri speciali 
          begin
            Findchar := true;
            break; 
          end;
        end;
     end;
  if Findchar = true then 
    begin
    Findchar:= false
    for i:=1 to length(Pass) do
     begin
        case Pass[i] of
        'A'..'Z': // maiuscole
          begin
            Findchar := true;
            break;
          end;
      end;
    end;
  if Findchar = true then 
    begin
    Findchar:= false
    for i:=1 to length(Pass) do
      begin
        case Pass[i] of
        'a'..'z': // minuscole
          begin
            Findchar := true;
            break;
          end;
      end;
    end;
  if Findchar = true then 
    begin
     Findchar:= false
    for i:=1 to length(Pass) do
     begin
        case Pass[i] of
        '0'..'9': // numeri
          begin
            Findchar := true;
            break;
          end;
        end;
      end;
     end;
    end;
   end;
  end;
Result := Findchar ;                                 
end;

查看此内容以了解如何将测试集成到 Inno Setup 中:

为了实际验证密码的复杂性,我将您的代码简化如下:

function PasswordComplexity(Pass: string): Boolean;
var
  I: Integer;
  AnySymbol, AnyUpper, AnyLower, AnyDigit: Boolean;
begin
  if Length(Pass) < 9 then
  begin
    Result := False;
  end
    else
  begin
    AnySymbol := False;
    AnyUpper := False;
    AnyLower := False;
    AnyDigit := False;

    for I := 1 to Length(Pass) do
    begin
      case Pass[I] of
        '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', '?', '\', '*', '#': 
          AnySymbol := True;
        'A'..'Z':
          AnyUpper := True;
        'a'..'z':
          AnyLower := True;
        '0'..'9':
          AnyDigit := True;
      end;
    end;
    Result := AnySymbol and AnyUpper and AnyLower and AnyDigit;
  end;
end;