imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 23.05.2005, 14:32     # 1
SapeR
::VIP::
 
Регистрация: 17.12.2002
Адрес: Q-ata, Israel
Сообщения: 310

SapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царстве
Question Управление фаерволлом из кода

Рыщется: как наладить через код включение / выключение фаерволлом на локальном компе. Операционка Win2000 или WinXP , стенки - встроенные от винды - Internet Connection Firewall или от второго сервиспака. Если найдётся способ хотя бы мониторить наличие и статус иных фаерволлов - тоже круто. API какая-нибудь ...
SapeR вне форума  
Старый 23.05.2005, 14:47     # 2
Merlin Cori
Moderator
 
Аватар для Merlin Cori
 
Регистрация: 29.04.2002
Адрес: Moscow
Пол: Male
Сообщения: 2 980

Merlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБог
Merlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБогMerlin Cori СуперБог
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
__________________
Есть две бесконечные вещи, Вселенная и глупость.
Впрочем, на счет Вселенной, я не уверен



Вклад IMHO.WS в медицину и науку
Присоединяйтесь!!!!!
Merlin Cori вне форума  
Старый 23.05.2005, 17:16     # 3
SapeR
::VIP::
 
Регистрация: 17.12.2002
Адрес: Q-ata, Israel
Сообщения: 310

SapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царствеSapeR Луч света в тёмном царстве
Спасибо, но сервиса мало

То есть понять какой сервис есть какой фаерволл я сумел быстро, и даже врубать / вырубать сервис по требованию, только чтобы были права администратора.
Код:
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;
}
Но задачу не выполнил. Вот пару примеров чего происходит:
* Виндовсовская стенка - сервис убил а "птичка" о том что стенка работает - осталась. Сервис поднял - а порты которые он должен был закрывать - открыты.
* БлэкАЙС - сервис убил - вроде молчит, сервис поднял - крэш эксэпшн
* Аутпост - сервис убил - а стенка живёт сервис на свою остановку вызывает апликацию которая делает повторный запуск сервиса, стирать её что ли ?

Есть ещё идеи ?
SapeR вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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