ОК, я думаю, что понял.
Мне пришлось создать файл библиотеки типов файла hnetcfg.dll. Я сделал это, когда только начал, но с тех пор многое узнал об объектах брандмауэра. Это не сработало тогда, но работает сейчас. Вы можете создать свой собственный файл из Component | Import Component. А затем следуйте за волшебником.
Оберточный код использует исключения, которые я обычно не люблю делать, но я не знаю, как определить, действительно ли интерфейс, возвращающий интерфейс, возвращает данные, с которыми я могу работать было бы лучше, если бы кто-то мог указать мне правильное направление.
А теперь к коду, с благодарностью Джиму за его ответ.
constructor TFirewallUtility.Create;
begin
inherited Create;
CoInitialize(nil);
mxCurrentFirewallProfile := INetFwMgr(CreateOLEObject('HNetCfg.FwMgr')).LocalPolicy.CurrentProfile;
end;
function TFirewallUtility.IsPortInExceptionList(iPortNumber: integer): boolean;
begin
try
Result := mxCurrentFirewallProfile.GloballyOpenPorts.Item(iPortNumber, NET_FW_IP_PROTOCOL_TCP).Port = iPortNumber;
except
Result := False;
end;
end;
function TFirewallUtility.IsPortEnabled(iPortNumber: integer): boolean;
begin
try
Result := mxCurrentFirewallProfile.GloballyOpenPorts.Item(iPortNumber, NET_FW_IP_PROTOCOL_TCP).Enabled;
except
Result := False;
end;
end;
procedure TFirewallUtility.SetPortEnabled(iPortNumber: integer; sPortName: string; xProtocol: TFirewallPortProtocol);
begin
try
mxCurrentFirewallProfile.GloballyOpenPorts.Item(iPortNumber, CFirewallPortProtocalConsts[xProtocol]).Enabled := True;
except
HaltIf(True, 'xFirewallManager.TFirewallUtility.IsPortEnabled: Port not in exception list.');
end;
end;
procedure TFirewallUtility.AddPortToFirewall(sPortName: string; iPortNumber: Cardinal; xProtocol: TFirewallPortProtocol);
var
port: INetFwOpenPort;
begin
port := INetFwOpenPort(CreateOLEObject('HNetCfg.FWOpenPort'));
port.Name := sPortName;
port.Protocol := CFirewallPortProtocalConsts[xProtocol];
port.Port := iPortNumber;
port.Scope := NET_FW_SCOPE_ALL;
port.Enabled := true;
mxCurrentFirewallProfile.GloballyOpenPorts.Add(port);
end;