Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Службы Nt

344
04 сентября 2005 года
Delpher
493 / / 14.08.2005
Подскажите, пожалуйста, как можно програмно останавливать и запускать службы WinNT, устанавливать тип запуска (Automatic/Manual/Disabled), а также узнавать их текущее состояние ?
406
04 сентября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Delpher
Подскажите, пожалуйста, как можно програмно останавливать и запускать службы WinNT, устанавливать тип запуска (Automatic/Manual/Disabled), а также узнавать их текущее состояние ?



Почитай про OpenSCManager и CreateService - это то что те нужно

344
04 сентября 2005 года
Delpher
493 / / 14.08.2005
Цитата:
Originally posted by vitaly2003s
Почитай про OpenSCManager и CreateService - это то что те нужно



CreateService нашел,

OpenSCManager - ????????

406
05 сентября 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by Delpher
CreateService нашел,

- ????????


OpenSCManager - возвращяет тебе хэндл который ты уже затем используеш в CreateService. Читай MSDN.

OpenSCManager

The OpenSCManager function establishes a connection to the service control manager on the specified computer and opens the specified service control manager database.


SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName,
LPCTSTR lpDatabaseName,
DWORD dwDesiredAccess
);

Parameters
lpMachineName
[in] Pointer to a null-terminated string that specifies the name of the target computer. If the pointer is NULL or points to an empty string, the function connects to the service control manager on the local computer.
lpDatabaseName
[in] Pointer to a null-terminated string that specifies the name of the service control manager database to open. This parameter should be set to SERVICES_ACTIVE_DATABASE. If it is NULL, the SERVICES_ACTIVE_DATABASE database is opened by default.
dwDesiredAccess
[in] Access to the service control manager. For a list of access rights, see Service Security and Access Rights.
Before granting the requested access rights, the system checks the access token of the calling process against the discretionary access-control list of the security descriptor associated with the service control manager.

The SC_MANAGER_CONNECT access right is implicitly specified by calling this function.

Return Values
If the function succeeds, the return value is a handle to the specified service control manager database.

If the function fails, the return value is NULL. To get extended error information, call GetLastError.

The following error codes can be set by the SCM. Other error codes can be set by the registry functions that are called by the SCM.


// Open a handle to the SC Manager database.

schSCManager = OpenSCManager(
NULL, // local machine
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights

if (schSCManager == NULL)
MyErrorExit("OpenSCManager");

344
06 сентября 2005 года
Delpher
493 / / 14.08.2005
прежде чем что-то делать, подключаемся к контроллеру служб (для этого должны быть админские права)
Код:

var
SvcMgr: Integer;
....
SvcMgr := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SvcMgr=0 then Error;


устанавливаем службу
Код:

var
svc: integer;
...
Svc := CreateService(SvcMgr,
'Внутреннее имя службы',
'Отображаемое имя службы',
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
PChar('Путь к исполняемому файлу'),
nil,
nil,
nil,
nil,
nil);
if Svc=0 then Error;
// если задача состояла только в установке службы, освобождаем хендл
CloseServiceHandle(Svc);


управляем службой

получаем хэндл службы
Код:

Svc := OpenService(SvcMgr, 'Внутреннее имя службы', SERVICE_ALL_ACCESS);
if Svc=0 then Error;


запускаем службу
Код:

var
ArgV: Pchar;
...
ArgV:=nil;
if not StartService(Svc,0,ArgV) then Error;


останавливаем службу
Код:

var
ss: _SERVICE_STATUS;
...
if not ControlService(Svc,SERVICE_CONTROL_STOP,ss) then Error;


удаляем службу
Код:

if not DeleteService(Svc) then Error;


когда все манипуляции закончили, не забываем соответствующие освободить хендлы!
Код:

if Svc<>0 then
CloseServiceHandle(Svc); // хендл службы


а затем
Код:

if SvcMgr<>0 then
CloseServiceHandle(SvcMgr); // хендл контроллера (диспетчера, менеджера, да как угодно) служб




получаем состояние службы
Код:
var
pSS: SERVICE_STATUS;
...
if not QueryServiceStatus(Svc, pSS) then exit;
// pSS.dwCurrentState содержит текущее состояние


изменяем конфигурацию службы

перед изменением конфигурации блокируем базу данных служб
Код:
var
SvcLock: SC_LOCK;
...
SvcLock:=LockServiceDatabase(SvcMgr);
if SvcLock=nil then Error;


выполняем изменение конфигурации
Код:
if not ChangeServiceConfig(
Svc, // хендл службы
SERVICE_NO_CHANGE, // без изменений
SERVICE_DEMAND_START, // изменяем тип запуска (Вручную)
SERVICE_NO_CHANGE, // без изменений
nil, // без изменений
nil, // без изменений
nil, // без изменений
nil, // без изменений
nil, // без изменений
nil) // без изменений
then Error;


не забываем разблокировать базу данных служб
Код:
UnlockServiceDatabase(SvcLock);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог