Службы Nt
Подскажите, пожалуйста, как можно програмно останавливать и запускать службы WinNT, устанавливать тип запуска (Automatic/Manual/Disabled), а также узнавать их текущее состояние ?
Почитай про OpenSCManager и CreateService - это то что те нужно
Почитай про OpenSCManager и CreateService - это то что те нужно
CreateService нашел,
OpenSCManager - ????????
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");
Код:
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);