| imho.ws |
![]() |
|
|
|
# 1 |
|
::VIP::
Регистрация: 17.12.2002
Адрес: Q-ata, Israel
Сообщения: 310
![]() ![]() ![]() ![]() ![]() |
Рыщется: как наладить через код включение / выключение фаерволлом на локальном компе. Операционка Win2000 или WinXP , стенки - встроенные от винды - Internet Connection Firewall или от второго сервиспака. Если найдётся способ хотя бы мониторить наличие и статус иных фаерволлов - тоже круто. API какая-нибудь ...
|
|
|
|
|
# 2 | |
|
Moderator
Регистрация: 29.04.2002
Адрес: Moscow
Пол: Male
Сообщения: 2 980
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
1. firewall - это сервис, следовательно надо проверять запущен сервис или нет...
2. Если на дельфи - то вот пример, проверки состояния состояния сервиса Цитата:
__________________
Есть две бесконечные вещи, Вселенная и глупость. Впрочем, на счет Вселенной, я не уверен |
|
|
|
|
|
# 3 |
|
::VIP::
Регистрация: 17.12.2002
Адрес: Q-ata, Israel
Сообщения: 310
![]() ![]() ![]() ![]() ![]() |
Спасибо, но сервиса мало
![]() То есть понять какой сервис есть какой фаерволл я сумел быстро, и даже врубать / вырубать сервис по требованию, только чтобы были права администратора. Код:
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;
}
* Виндовсовская стенка - сервис убил а "птичка" о том что стенка работает - осталась. Сервис поднял - а порты которые он должен был закрывать - открыты. * БлэкАЙС - сервис убил - вроде молчит, сервис поднял - крэш эксэпшн * Аутпост - сервис убил - а стенка живёт сервис на свою остановку вызывает апликацию которая делает повторный запуск сервиса, стирать её что ли ?Есть ещё идеи ? |
|
|