使用Inno Setup Exec()运行netsh

时间:2015-08-12 16:05:06

标签: inno-setup

我尝试在安装过程中创建Windows防火墙规则,但我无法理解我的命令格式错误。 ResultCode中返回的错误是"错误的函数"

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;

1 个答案:

答案 0 :(得分:2)

首先,仅当public void WriteCookiesToDisk(string file, CookieContainer cookieJar) { using (Stream stream = File.Create(file)) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, cookieJar); } } public CookieContainer ReadCookiesFromDisk(string file) { try { using (Stream stream = File.Open(file, FileMode.Open)) { BinaryFormatter formatter = new BinaryFormatter(); return (CookieContainer)formatter.Deserialize(stream); } } catch (Exception e) { return new CookieContainer(); } } 返回ResultCode(表示无法启动进程)时,Exec才会包含系统错误。如果False成功启动该过程,则Exec包含该过程的退出代码。你的情况可能是什么。您无法将退出代码传递给ResultCode

引用Exec documentation

  

如果返回True并且Wait为ewWaitUntilTerminated,则ResultCode返回进程的退出代码。如果返回False,则ResultCode指定发生的错误。使用SysErrorMessage(ResultCode)获取错误的描述。

实际问题是SysErrorMessage的语法。

您在netsh之后缺少firewall个关键字。

advfirewall

请参阅Netsh AdvFirewall Firewall Commands

您是否还想先从命令行测试命令?

附注:

  • 检查netsh advfirewall firewall add rule ...
  • 的返回值
  • 无需通过Exec
  • 启动netsh.exe
  • 其他Windows版本呢?