修改服务启动后失败重启设置
ChangeServiceConfig2
SERVICE_FAILURE_ACTIONS sdBuf={0};
BOOL bSuccess=TRUE;
if (argc!=2)
{
return 1;
}
// Open a handle to the service.
SC_HANDLE sch=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (sch==NULL)
{
return 1;
}
SC_HANDLE schService = OpenService(
sch, // SCManager database
argv[1], // name of service
SC_MANAGER_ALL_ACCESS); // need CHANGE access
if (schService == NULL)
{
printf("OpenService failed (%d)\n", GetLastError());
return FALSE;
}
sdBuf.lpRebootMsg=NULL;
sdBuf.dwResetPeriod=3600*24; //重新应用的事件间隔,1天
SC_ACTION action[3];
action[0].Delay=60*1000; //第一次失败后的等待时间,1分钟
action[0].Type=SC_ACTION_RESTART; //失败后重启
action[1].Delay=0;
action[1].Type=SC_ACTION_NONE; //失败后无动作
action[2].Delay=0;
action[2].Type=SC_ACTION_NONE;
sdBuf.cActions=3;
sdBuf.lpsaActions=action;
sdBuf.lpCommand=NULL;
if( !ChangeServiceConfig2(
schService,
SERVICE_CONFIG_FAILURE_ACTIONS,
&sdBuf) )
{
printf("%s ChangeServiceConfig2 failed\n",argv[1]);
bSuccess = FALSE;
}
else
printf("%s ChangeServiceConfig2 succeeded\n",argv[1]);
CloseServiceHandle(schService);
服务相关(非代码)
- 本机查看服务:services.msc /s 或 手动启动 计算机–>管理–>服务和应用程序–>服务
- 手动安装/卸载服务
安装:sc create 服务名 binpath=服务调用的进程全路径
卸载:sc delete 服务名 - 服务的界面。Interactive Services
最便捷的方式是使用 WTSSendMessage API 弹出一个对话框,无需任何额外工作。
如果是直接的 MessageBox API,或者是WinExec直接新启动一个GUI进程,需要在CreateService的时候Service类型参数带上SERVICE_WIN32_OWN_PROCESS | SERV