更改服务配置

【勇芳软件工作室】汉化HomePreviousNext

在以下示例中,服务配置程序使用ChangeServiceConfig功能更改已安装服务的配置参数。程序首先尝试锁定数据库,以防止SCM在重新配置时启动服务。如果成功锁定数据库,程序将打开一个服务对象的句柄,修改其配置,解锁数据库,然后关闭服务对象句柄。如果程序没有成功锁定数据库,它将使用QueryServiceLockStatus函数来检索有关该锁的信息。

VOID ReconfigureSampleService(BOOL fDisable)

{

SC_LOCK sclLock;

LPQUERY_SERVICE_LOCK_STATUS lpqslsBuf;

DWORD dwBytesNeeded, dwStartType;

//重新配置之前需要获取数据库锁。

sclLock = LockServiceDatabase(schSCManager);

//如果数据库无法锁定,请报告详细信息。

if (sclLock == NULL)

{

//如果数据库没有被其他进程锁定,则退出。

if (GetLastError() != ERROR_SERVICE_DATABASE_LOCKED)

MyErrorExit("LockServiceDatabase");

//分配缓冲区以获取有关锁的详细信息。

lpqslsBuf = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc(

LPTR, sizeof(QUERY_SERVICE_LOCK_STATUS)+256);

if (lpqslsBuf == NULL)

MyErrorExit("LocalAlloc");

//获取并打印锁定状态信息。

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);

其他

printf("No longer locked\n");

LocalFree(lpqslsBuf);

MyErrorExit("Could not lock database");

}

//数据库被锁定,所以进行更改是安全的。

//打开服务的句柄。

schService = OpenService(

schSCManager, // SCManager数据库

TEXT("Sample_Srv"), //服务名称

SERVICE_CHANGE_CONFIG); //需要CHANGE访问

if (schService == NULL)

MyErrorExit("OpenService");

dwStartType = (fDisable) ? SERVICE_DISABLED :

SERVICE_DEMAND_START;

if(!ChangeServiceConfig

schService, //处理服务

SERVICE_NO_CHANGE, //服务类型:不变

dwStartType, //更改服务启动类型

SERVICE_NO_CHANGE, //错误控制:没有变化

NULL, // binary path:no change

NULL, //加载订单组:不改变

NULL, // tag ID:no change

NULL, //依赖关系:没有变化

NULL, //帐号:没有变化

NULL) ) //密码:没有变化

{

MyErrorExit("ChangeServiceConfig");

}

其他

printf("ChangeServiceConfig SUCCESS\n");

//释放数据库锁。

UnlockServiceDatabase(sclLock);

//关闭服务的句柄。

CloseServiceHandle(schService);

}