Inno Setup检测Windows防火墙状态

时间:2015-08-16 21:08:30

标签: windows security inno-setup windows-firewall

我需要检测Windows防火墙状态(即是否已启用),以便显示一条消息,警告可能需要配置防火墙规则以在启用防火墙时允许特定端口上的入站连接,但是不是什么时候不是。见下面的代码示例:

[Code]
//Check if Windows Firewall is enabled
function IsWindowsFirewallEnabled(): Boolean;
begin
//Method required here
  Result := True;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
//Display a warning message on a Server install if Windows Firewall is enabled
  if CurPageID = wpSelectComponents and IsComponentSelected('Server') and IsWindowsFirewallEnabled then
    begin
      MsgBox('Windows Firewall is currently enabled.' + #13#10 + #13#10 +
        'You may need to enable inbound connections on ports 2638, 445 and 7.'
        mbInformation, MB_OK);
      Result := True;
    end;
end;

我需要的是IsWindowsFirewallEnabled函数的方法。我已经阅读过的一种方式,具有讽刺意味的是,现在或多或少地提出了下面我正在使用这些信息更新问题的过程中,似乎是从注册表中读取EnableFirewall值:

//Check if Windows Firewall is enabled
function IsWindowsFirewallEnabled(): Boolean;
var
  crdFirewallState: Cardinal;
begin
  RegQueryDwordValue(HKLM, 'SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile',
    'EnableFirewall', crdFirewallState);
  if crdFirewallState = 1 then
    Result := True;
end;

但是,我不相信这种方法,因为我的工作PC上显示所有配置文件的注册表值已启用,但在控制面板中查看域配置文件显示已禁用(我认为这与组策略有关)。 / p>

请注意,这需要适用于Windows XP和Server 2003,以及Windows Vista和Server 2008及更高版本。

因此,最可靠或推荐的方法是什么?

1 个答案:

答案 0 :(得分:1)

您需要确定注册表项,然后使用Innosetup的注册表查询功能以类似的方式查询它。

var
  Country: String;
begin
  if RegQueryStringValue(HKEY_CURRENT_USER, 'Control Panel\International',
     'sCountry', Country) then
  begin
    // Successfully read the value
    MsgBox('Your country: ' + Country, mbInformation, MB_OK);
  end;
end;

http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_regquerystringvalue

据称这是注册表项的信息:​​

路径:HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ WindowsFirewall \ DomainProfile 位置:本地机器 值名称:EnableFirewall 数据类型:DWORD(DWORD值) 启用值:0 禁用值:1