Итак начнем. Уверен все знают что такое файервол и как он устроен в Windows. Если нет — читать здесь. За функции файервола отвечает сервис — SharedAccess — в списке сервисов он будет либо Internet Connection sharing или ICF (это название сервиса — не путайте с именем (Caption и Name)).
А за управление отвечает — небольшая незаметная библиотека — system32\hnetcfg.dll. В этой библиотеке находятся интерфейсы управления к UPnP, Internet Connection Sharing, и Firewall. Вот с нее то мы и начнем.
Нам понадобиться импортировать интерфейсы файервола:
tlibimp.exe -P+ -Pt+ -Ha+ -Ya+ -Yh+ "c:\WINDOWS\system32\hnetcfg.dll\3"
Эта команда создаст NetFwTypeLib_TLB.pas.
Далее — типичная работа с СOM сервером.
Я приведу несколько примеров:
1. Проверям запущен ли сервис файервола
function IsWindowsFirewallServicePresent:Boolean;
var
scm,svc:SC_HANDLE;
sz:DWORD;
pConfig:PQueryServiceConfig;
spPath:array[0..255] of Char;
ptr:Pchar;
begin
Result:=False;
if Win32Platform<>VER_PLATFORM_WIN32_NT then Exit;
scm:=winsvc.OpenSCManager(nil,nil,GENERIC_READ);
try
if scm>0 then
begin
svc:=winsvc.OpenService(scm,PChar('SharedAccess'),SERVICE_QUERY_CONFIG); // please don't change the name of the service.
if svc>0 then
begin
winsvc.QueryServiceConfig(svc,nil,0,sz);
if windows.GetLastError=ERROR_INSUFFICIENT_BUFFER then
begin
pConfig:=PQueryServiceConfig(GlobalAlloc(GMEM_FIXED,sz));
if Assigned(pConfig) then
begin
if winsvc.QueryServiceConfig(svc,pConfig,sz,sz) then Result:=(pConfig.dwStartType<SERVICE_DEMAND_START);
GlobalFree(HGLOBAL(pConfig));
end;
end;
end;
winsvc.CloseServiceHandle(svc);
end;
finally
winsvc.CloseServiceHandle(scm);
end;
if Result then // check if HNetCfg.dll is located somewhere on system
Result:=(windows.SearchPath(nil,PChar('hnetcfg.dll'),nil,255,spPath,ptr)>0) and (FileExists(StrPas(spPath)));
end;
2. Инициализация главного интерфейса
function ICFInitialize(out fwProfile:INetFwProfile):HRESULT;
var
fwMgr:INetFwMgr;
fwPolicy:INetFwPolicy;
hr:HRESULT;
begin
Result:=S_OK;
if Assigned(fwProfile) then Exit;
fwProfile:=nil;
hr:=CoCreateInstance(CLASS_NetFwMgr,nil,CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,INetFwMgr,fwMgr);
if (hr=S_OK) and Assigned(fwMgr) then
begin
fwPolicy:=fwMgr.LocalPolicy;
if Assigned(fwPolicy) then
begin
fwProfile:=fwPolicy.CurrentProfile;
if Assigned(fwProfile) then Result:=S_OK else Result:=GetLastError;
end;
fwPolicy:=nil;
end;
fwMgr:=nil; // cleanup
end;
Именно INetFwProfile отвечает на настройки файервола для текущего юзера. Вообще полный список комманд — на нашем любимом MSDN.
3. Включение и выключение
function IsWindowsFirewallOn(fwProfile:INetFwProfile):Boolean;
begin
Result:=False;
if Assigned(fwProfile) then Result:=fwProfile.FirewallEnabled;
end;
function WindowsFirewallTurnOn(fwProfile:INetFwProfile):Boolean;
begin
Result:=False;
if not Assigned(fwProfile) then Exit;
if IsWindowsFirewallOn(fwProfile) then Exit;
fwProfile.FirewallEnabled:=True;
Result:=fwProfile.FirewallEnabled=True;
end;
function WindowsFirewallTurnOff(fwProfile:INetFwProfile):Boolean;
begin
Result:=False;
if not Assigned(fwProfile) then Exit;
if not IsWindowsFirewallOn(fwProfile) then Exit;
fwProfile.FirewallEnabled:=False;
Result:=fwProfile.FirewallEnabled=False;
end;
Понятно, что параметр для этих функций мы берем из пункта 2.
Для тех кому лень — можно скачать исходный код с функциями ниже. Примера использования не привожу — там все очевидно, если есть вопросы — пишите.
C Уважением, Ваш док — http://prodelphi.nnm.ru