Setup检测Windows防火墙状态

Setup检测Windows防火墙状态

本文介绍了Inno Setup检测Windows防火墙状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要检测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及更高版本.

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

解决方案

您需要确定注册表项,然后使用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

I need to detect the Windows Firewall state (i.e. whether it is enabled or not) in order to display a message warning that a Firewall rule may need to be configured to allow inbound connections on specific ports when the Firewall is enabled, but not when it isn't. See below code example:

[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;

What I need is a method for the IsWindowsFirewallEnabled function. One way I have read about, and ironically has now more or less been suggested below whilst I was in the middle of updating the question with this information anyway, would appear to be reading the EnableFirewall value from the Registry:

//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;

However, I am not convinced by this method as the Registry values for all the profiles show enabled on my work PC, but looking in Control Panel the Domain profile shows disabled (I assume this is related to a Group Policy).

Note, that this needs to work for both Windows XP and Server 2003, and for Windows Vista and Server 2008 and above.

Therefore, what's the most reliable or recommended way to do this?

解决方案

You would need to determine the registry entry and then query it in a manner similar to this using Innosetup's registry query ability.

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

Allegedly this is the information for the registry key:

Path: HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\WindowsFirewall\DomainProfileLocation: Local MachineValue Name: EnableFirewallData Type: DWORD (DWORD Value)Enabled Value: 0Disabled Value: 1

这篇关于Inno Setup检测Windows防火墙状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-25 06:38