Как это сделано? - Управляем Windows Firewall

Как это сделано? - Управляем Windows Firewall

Тема сегодняшнего выпуска — управление windows firewall в Windows 2000-xp-2003. Будет много кода и умных слов — не программисты — смотрим следующую новость.

----------------------<cut>----------------------

Итак начнем. Уверен все знают что такое файервол и как он устроен в 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

Комментарии

    Нет комментариев
комментарии
^ Наверх