运行 使用 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
.
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 版本呢?
我试图在安装过程中创建 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
.
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
启动 - 其他 Windows 版本呢?
netsh.exe