IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Управление фаерволлом из кода (http://www.imho.ws/showthread.php?t=86181)

SapeR 23.05.2005 14:32

Управление фаерволлом из кода
 
Рыщется: как наладить через код включение / выключение фаерволлом на локальном компе. Операционка Win2000 или WinXP , стенки - встроенные от винды - Internet Connection Firewall или от второго сервиспака. Если найдётся способ хотя бы мониторить наличие и статус иных фаерволлов - тоже круто. API какая-нибудь ... :idontnow:

Merlin Cori 23.05.2005 14:47

1. firewall - это сервис, следовательно надо проверять запущен сервис или нет...
2. Если на дельфи - то вот пример, проверки состояния состояния сервиса
Цитата:

uses
WinSvc;
function ServiceGetStatus(sMachine, sService: PChar): DWORD;
{******************************************}
{*** Parameters: ***}
{*** sService: specifies the name of the service to open
{*** sMachine: specifies the name of the target computer
{*** ***}
{*** Return Values: ***}
{*** -1 = Error opening service ***}
{*** 1 = SERVICE_STOPPED ***}
{*** 2 = SERVICE_START_PENDING ***}
{*** 3 = SERVICE_STOP_PENDING ***}
{*** 4 = SERVICE_RUNNING ***}
{*** 5 = SERVICE_CONTINUE_PENDING ***}
{*** 6 = SERVICE_PAUSE_PENDING ***}
{*** 7 = SERVICE_PAUSED ***}
{******************************************}
var
SCManHandle, SvcHandle: SC_Handle;
SS: TServiceStatus;
dwStat: DWORD;
begin
dwStat := 0;
// Open service manager handle.
SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT);
if (SCManHandle > 0) then
begin
SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS);
// if Service installed
if (SvcHandle > 0) then
begin
// SS structure holds the service status (TServiceStatus);
if (QueryServiceStatus(SvcHandle, SS)) then
dwStat := ss.dwCurrentState;
CloseServiceHandle(SvcHandle);
end;
CloseServiceHandle(SCManHandle);
end;
Result := dwStat;
end;

function ServiceRunning(sMachine, sService: PChar): Boolean;
begin
Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService);
end;

// Check if Eventlog Service is running
procedure TForm1.Button1Click(Sender: TObject);
begin
if ServiceRunning(nil, 'Eventlog') then
ShowMessage('Eventlog Service Running')
else
ShowMessage('Eventlog Service not Running')
end;

{
Windows 2000 and earlier: All processes are granted the SC_MANAGER_CONNECT,
SC_MANAGER_ENUMERATE_SERVICE, and SC_MANAGER_QUERY_LOCK_STATUS access rights.

Windows XP: Only authenticated users are granted the SC_MANAGER_CONNECT,
SC_MANAGER_ENUMERATE_SERVICE,
and SC_MANAGER_QUERY_LOCK_STATUS access rights.
}

{
Do not use the service display name (as displayed in the services
control panel applet.) You must use the real service name, as
referenced in the registry under
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services
}

Взято отсюда _http://delphiworld.narod.ru/base/is_service_running.html

SapeR 23.05.2005 17:16

Спасибо, но сервиса мало :(

То есть понять какой сервис есть какой фаерволл я сумел быстро, и даже врубать / вырубать сервис по требованию, только чтобы были права администратора.
Код:

CString CfgUtil::ServiceIsPresent(CString sServiceName)
{
    const int res_stopped = 0;
    const int res_started = 1;
    const int res_unavail = 2;

    SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
    if (schSCManager == NULL)
        {
//        return "res_unavail";
                return "unavailable";
        }
       
    SC_HANDLE schService = OpenService(schSCManager,sServiceName,SC_MANAGER_ENUMERATE_SERVICE);
    if (schService == NULL)
    {
        CloseServiceHandle(schSCManager);
//        return res_unavail;
                return "unavailable";
    }

    bool bServiceRunning = false;
        SERVICE_STATUS ServiceStatus;
        QueryServiceStatus(schService,&ServiceStatus);
        bServiceRunning = (ServiceStatus.dwCurrentState == SERVICE_RUNNING);

    CloseServiceHandle(schSCManager);
    CloseServiceHandle(schService);

//    return (bServiceRunning) ? res_started : res_stopped ;
        return (bServiceRunning) ? "started" : "stopped";
}

bool CfgUtil::ServiceStart(CString sServiceName)
{
    SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
        return false;
       
    SC_HANDLE schService = OpenService(schSCManager,sServiceName,SC_MANAGER_ALL_ACCESS);
    if (schService == NULL)
    {
        CloseServiceHandle(schService);
        return false;
    }

    bool bServiceRunning = false;
        SERVICE_STATUS ServiceStatus;
        QueryServiceStatus(schService,&ServiceStatus);
        bServiceRunning = (ServiceStatus.dwCurrentState == SERVICE_RUNNING);

    if (!bServiceRunning)
    {
        if (StartService(schService,0,NULL))
        {
            int count=0, max_count = 100; // TIME LIMIT for pending:
                                          // 100 times by 100 msec = 10,000 msec = 10 sec
            do
            {
                count++;
                Sleep(100);
                QueryServiceStatus(schService, &ServiceStatus);
                bServiceRunning = (ServiceStatus.dwCurrentState == SERVICE_RUNNING);
            }
            while (count<max_count && !bServiceRunning && ServiceStatus.dwCurrentState == SERVICE_START_PENDING);
        }
    }

    CloseServiceHandle(schSCManager);
    CloseServiceHandle(schService);

    return bServiceRunning;
}

bool CfgUtil::ServiceStop(CString sServiceName)
{
    SC_HANDLE schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
        return false;
       
    SC_HANDLE schService = OpenService(schSCManager,sServiceName,SC_MANAGER_ALL_ACCESS);
    if (schService == NULL)
    {
        CloseServiceHandle(schService);
        return false;
    }

    bool bServiceStopped = false;
        SERVICE_STATUS ServiceStatus;
        QueryServiceStatus(schService,&ServiceStatus);
        bServiceStopped = (ServiceStatus.dwCurrentState == SERVICE_STOPPED);

    if (!bServiceStopped)
    {
        if (ControlService(schService,SERVICE_CONTROL_STOP,&ServiceStatus))
        {
            int count=0, max_count = 100; // TIME LIMIT for pending:
                                          // 100 times by 100 msec = 10,000 msec = 10 sec
            do
            {
                count++;
                Sleep(100);
                QueryServiceStatus(schService, &ServiceStatus);
                bServiceStopped = (ServiceStatus.dwCurrentState == SERVICE_STOPPED);
            }
            while (count<max_count && !!bServiceStopped && ServiceStatus.dwCurrentState == SERVICE_START_PENDING);
        }
    }


    CloseServiceHandle(schSCManager);
    CloseServiceHandle(schService);

    return bServiceStopped;
}

Но задачу не выполнил. Вот пару примеров чего происходит:
* Виндовсовская стенка - сервис убил а "птичка" о том что стенка работает - осталась. Сервис поднял - а порты которые он должен был закрывать - открыты.
* БлэкАЙС - сервис убил - вроде молчит, сервис поднял - крэш эксэпшн
* Аутпост - сервис убил - а стенка живёт :) сервис на свою остановку вызывает апликацию которая делает повторный запуск сервиса, стирать её что ли ?

Есть ещё идеи ?


Часовой пояс GMT +4, время: 12:52.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.