运行 使用 Inno Setup Exec() 的 netsh

Running netsh from using Inno Setup Exec()

我试图在安装过程中创建 Windows 防火墙规则,但我无法理解我的命令格式为何不正确。 ResultCode中返回的错误是"Incorrect Function"

procedure OpenFirewall;
var
  WindowsVersion: Integer;
  ResultCode: Integer;
  W7Command: String;
  WXPCommand: String;
begin
  WXPCommand := 'netsh firewall add portopening TCP 12345 "MyApp"'
  W7Command := 'netsh advfirewall add rule name="MyApp" dir=in action=allow protocol=TCP localport=12345';
  WindowsVersion := GetWindowsVersion();
  case WindowsVersion of
    5:
    begin
      Exec(ExpandConstant('{cmd}'), '/C ' + WXPCommand, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    end;
    6:
    begin
      Exec(ExpandConstant('{cmd}'), '/C ' + W7Command, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
      Log(SysErrorMessage(ResultCode));
    end;
  end;
end;

首先,ResultCode包含系统错误,仅当Exec returns False(表示启动进程失败)。如果 Exec 成功启动进程,则 ResultCode 包含进程的退出代码。你的情况可能是什么。您不能将退出代码传递给 SysErrorMessage.

引用 Exec documentation:

If True is returned and Wait is ewWaitUntilTerminated then ResultCode returns the exit code of the process. If False is returned then ResultCode specifies the error that occurred. Use SysErrorMessage(ResultCode) to get a description of the error.


真正的问题是你的 netsh.

语法

您在 advfirewall 之后缺少 firewall 关键字。

netsh advfirewall firewall add rule ...

参见 Netsh AdvFirewall Firewall Commands

你有没有先从命令行测试命令?


旁注:

  • 检查 Exec
  • 的 return 值
  • 无需通过 cmd.exe
  • 启动 netsh.exe
  • 其他 Windows 版本呢?