|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Changing a Service Configuration
In the following example, a service configuration program uses the ChangeServiceConfig function to change the configuration parameters of an installed service. The program first tries to lock the database, to prevent the SCM from starting a service while it is being reconfigured. If it successfully locks the database, the program opens a handle to the service object, modifies its configuration, unlocks the database, and then closes the service object handle. If the program does not successfully in lock the database, it uses the QueryServiceLockStatus function to retrieve information about the lock.
VOID ReconfigureSampleService(BOOL fDisable) { SC_LOCK sclLock; LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf; DWORD dwBytesNeeded, dwStartType; // Need to acquire database lock before reconfiguring. sclLock = LockServiceDatabase(schSCManager); // If the database cannot be locked, report the details. if (sclLock == NULL) { // Exit if the database is not locked by another process. if (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED)
MyErrorExit("LockServiceDatabase"); // Allocate a buffer to get details about the lock. lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc( LPTR, sizeof(QUERY_SERVICE_LOCK_STATUS)+256); if (lpqslsBuf == NULL) MyErrorExit("LocalAlloc"); // Get and print the lock status information. if (!QueryServiceLockStatus( schSCManager, lpqslsBuf, sizeof(QUERY_SERVICE_LOCK_STATUS)+256,
&dwBytesNeeded) ) MyErrorExit("QueryServiceLockStatus"); if (lpqslsBuf->fIsLocked) printf("Locked by: %s, duration: %d seconds\n", lpqslsBuf->lpLockOwner, lpqslsBuf->dwLockDuration); else printf("No longer locked\n"); LocalFree(lpqslsBuf); MyErrorExit("Could not lock database"); } // The database is locked, so it is safe to make changes.
// Open a handle to the service. schService = OpenService( schSCManager, // SCManager database TEXT("Sample_Srv"), // name of service SERVICE_CHANGE_CONFIG); // need CHANGE access if (schService == NULL) MyErrorExit("OpenService"); dwStartType = (fDisable) ? SERVICE_DISABLED : SERVICE_DEMAND_START; if (! ChangeServiceConfig( schService, // handle of service
SERVICE_NO_CHANGE, // service type: no change dwStartType, // change service start type SERVICE_NO_CHANGE, // error control: no change NULL, // binary path: no change NULL, // load order group: no change NULL, // tag ID: no change NULL, // dependencies: no change NULL, // account name: no change NULL) ) // password: no change
{ MyErrorExit("ChangeServiceConfig"); } else printf("ChangeServiceConfig SUCCESS\n"); // Release the database lock. UnlockServiceDatabase(sclLock); // Close the handle to the service. CloseServiceHandle(schService); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Изменение Конфигурации Услуги
В следующем примере, программа конфигурации услуги использует функцию ChangeServiceConfig, чтобы изменять параметры конфигурации включенной услуги. Программа сначала пытается запирать базу данных, чтобы мешать SCM чтобы начинать с услуги тогда как она перестраивается. Если это успешно запирает базу данных, программа открывает ручку на объект услуги, модифицирует свою конфигурацию, деблокирует базу данных, и тогда закрывает объектную ручку услуги. Если программа не делает успешно в блокировке базой данных, это использует функцию QueryServiceLockStatus, чтобы извлекать информацию о блокировке.
ПУСТОТА ReconfigureSampleService(BOOL fDisable) { SC_LOCK sclLock; LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf; DWORD dwBytesNeeded, dwStartType; // Нужно приобретать базу данных блокировки перед перестраивать. sclLock = LockServiceDatabase(schSCManager); // Если база данных не может быть заперта, сообщите детали. если (sclLock == НЕДЕЙСТВИТЕЛЬНЫЙ) { // Выход если база данных не заперта другим процессом. если (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED)
MyErrorExit("LockServiceDatabase"); // Распределите буфер, чтобы получать детали о блокировке. lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc( LPTR, sizeof(QUERY_SERVICE_LOCK_STATUS)+256); если (lpqslsBuf == НЕДЕЙСТВИТЕЛЬНЫЙ) MyErrorExit("LocalAlloc"); // Получите и печатайте информацию статуса блокировки. если (!QueryServiceLockStatus( schSCManager, lpqslsBuf, sizeof(QUERY_SERVICE_LOCK_STATUS)+256,
&dwBytesNeeded) ) MyErrorExit("QueryServiceLockStatus"); если (lpqslsBuf->fIsLocked) printf("Locked: %s, длительность: %d seconds\n", lpqslsBuf->lpLockOwner, lpqslsBuf->dwLockDuration); еще printf("No более длинный locked\n"); LocalFree(lpqslsBuf); MyErrorExit("Could НЕ база данных блокировки"); } // База данных заперта, так что это безопасное, чтобы делать изменениями.
// Откройте ручку в услугу. schService = OpenService( schSCManager, // База данных ТЕКСТА SCManager("Sample_Srv"), // имя услуги SERVICE_CHANGE_CONFIG); // нужно доступ ИЗМЕНЕНИЯ если (schService == НЕДЕЙСТВИТЕЛЬНЫЙ) MyErrorExit("OpenService"); dwStartType = (fDisable)? SERVICE_DISABLED : SERVICE_DEMAND_START; если (! ChangeServiceConfig( schService, // РУЧКА услуги
SERVICE_NO_CHANGE, // тип услуги: никакое изменение dwStartType, // услуга изменения стартового типа SERVICE_NO_CHANGE, // управление ошибки: никакое изменение НЕДЕЙСТВИТЕЛЬНЫЙ, // двоичный путь: никакое изменение НЕДЕЙСТВИТЕЛЬНОЕ, // группа порядка загрузки: никакое изменение НЕДЕЙСТВИТЕЛЬНАЯ, // этикетка ID: никакое изменение НЕДЕЙСТВИТЕЛЬНАЯ, // зависимость: никакое изменение НЕДЕЙСТВИТЕЛЬНОЕ, // учетное имя: никакое изменение НЕДЕЙСТВИТЕЛЬНОЕ) ) // пароль: никакое изменение
{ MyErrorExit("ChangeServiceConfig"); } еще printf("ChangeServiceConfig SUCCESS\n"); // Версия база данных блокировки. UnlockServiceDatabase(sclLock); // Закройте ручку в услугу. CloseServiceHandle(schService); }
|
|
|
|
| |