Показать сообщение отдельно
Старый 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 вне форума