如果生成windows的一个自启动服务,但是让他先不用自动启动?

时间:2021-08-09 15:40:40
用CreateService创建一个windows services,dwStartType设置为自动启动SERVICE_AUTO_START,可是好像创建完服务以后都会自动启动这个服务,能不能创建时设置这个服务为自动启动,但是创建完服务以后不要立即启动?第一次要靠手动启动或者重启机器启动服务?是不是CreateService做不到这一点,有其他API可以实现这一要求吗?

14 个解决方案

#2


想简单点就
system("net start \"Server Name\"");

把Server Name换成你的服务名称

麻烦点就是char szServiceName[]=_T("Server Name")
	SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hSCM == NULL)
{
MessageBox(_T("无法打开服务管理器"), szServiceName, MB_OK);
return;
}

SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);

if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox( _T("无法打开指定服务,请检查服务是否安装"), szServiceName, MB_OK);
return;
}
//SERVICE_STATUS status;
BOOL b=StartService(hService, 0, NULL );

//删除服务
//BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);

if (b)
{
MessageBox( _T("成功启动服务"), szServiceName, MB_OK);
return;
}

//LogEvent(_T("Service could not be deleted"));
MessageBox( _T("无法启动服务,请检查服务是否已经运行"), szServiceName, MB_OK);

#3


楼上很强大

#4


膜拜二楼。牛逼啊

#5


谢谢各位,可能我的问题问的不清楚,我再解释一下
首先,我要创建一个服务,这个服务属于自启动类型的服务
但是我发现用CreateService创建完这个服务后,服务立即会被自动启动起来,我不想调用完CreateService就立即自动起来,我希望至少要我自己调用类似StartService这样的命令的时候这个服务才能被启动或者重启机器或者事后手动启动,不知道怎么能能作到?

简单的说就是创建一个自启动类型的服务,当前的状态是没有启动的状态,而且在这期间压根就不要被启动

#6


  
  CreateService(); 这个函数的dwStartType参数指定为 
  SERVICE_DEMAND_START 或者 SERVICE_DISABLED
 
SERVICE_DEMAND_START //手动启动
SERVICE_DISABL       //禁用

#7


我本身希望这个服务就是自启动类型的,但是出于其他目的,我不想让它一被CreateService()创建,就立即启动,我希望第一次是我程序控制或者重启服务器,不是在CreateService()时候就已经被启动了

#8


CreateService仅仅是创建服务,不启动

#9


强大

#10


char szServiceName[]=_T("Server Name") ,szFilePath是服务程序路径.
char szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
BOOL CNTService::Install()
{
    // Open the Service Control Manager
    SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine
                                     NULL, // ServicesActive database
                                     SC_MANAGER_ALL_ACCESS); // full access
    if (!hSCM) return FALSE;

    // Get the executable file path
    char szFilePath[_MAX_PATH];
    ::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));

    // Create the service
    SC_HANDLE hService = ::CreateService(hSCM,
                                         m_szServiceName,
                                         m_szServiceName,
                                         SERVICE_ALL_ACCESS,
                                         SERVICE_WIN32_OWN_PROCESS,
                                         SERVICE_AUTO_START,        // start condition
                                         SERVICE_ERROR_NORMAL,
                                         szFilePath, //file path
                                         NULL,
                                         NULL,
                                         NULL,
                                         NULL,
                                         NULL);
    if (!hService) {
        ::CloseServiceHandle(hSCM);
        return FALSE;
    }
    // tidy up
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
    return TRUE;
}

#11


引用 7 楼 xzou 的回复:
我本身希望这个服务就是自启动类型的,但是出于其他目的,我不想让它一被CreateService()创建,就立即启动,我希望第一次是我程序控制或者重启服务器,不是在CreateService()时候就已经被启动了


你将CreateService()放到一个线程里, 创建完后就将这个线程睡眠, 然后再将这个
线程唤醒,只不过要设个标志位判断一下服务是否已经创建.
不知道这样行不行!  临时想的. 没试验过. LZ试试吧.

#12


to zyq5945:
你确认CreateService只创建服务不启动吗?我创建的SERVICE_AUTO_START类型的,创建后就自动启动了,没有调用其他的

#13


额,我用CreateService 仅仅是创建了服务,服务不会自己启动,需添加启动代码.
    SC_HANDLE hService = ::CreateService(hSCM,
                                         m_szServiceName,
                                         m_szServiceName,
                                         SERVICE_ALL_ACCESS,
                                         SERVICE_WIN32_OWN_PROCESS,
                                         SERVICE_AUTO_START,        // start condition
                                         SERVICE_ERROR_NORMAL,
                                         szFilePath, //file path
                                         NULL,
                                         NULL,
                                         NULL,
                                         NULL,
                                         NULL);

#14


强大

#1


#2


想简单点就
system("net start \"Server Name\"");

把Server Name换成你的服务名称

麻烦点就是char szServiceName[]=_T("Server Name")
	SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if (hSCM == NULL)
{
MessageBox(_T("无法打开服务管理器"), szServiceName, MB_OK);
return;
}

SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_ALL_ACCESS);

if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox( _T("无法打开指定服务,请检查服务是否安装"), szServiceName, MB_OK);
return;
}
//SERVICE_STATUS status;
BOOL b=StartService(hService, 0, NULL );

//删除服务
//BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);

if (b)
{
MessageBox( _T("成功启动服务"), szServiceName, MB_OK);
return;
}

//LogEvent(_T("Service could not be deleted"));
MessageBox( _T("无法启动服务,请检查服务是否已经运行"), szServiceName, MB_OK);

#3


楼上很强大

#4


膜拜二楼。牛逼啊

#5


谢谢各位,可能我的问题问的不清楚,我再解释一下
首先,我要创建一个服务,这个服务属于自启动类型的服务
但是我发现用CreateService创建完这个服务后,服务立即会被自动启动起来,我不想调用完CreateService就立即自动起来,我希望至少要我自己调用类似StartService这样的命令的时候这个服务才能被启动或者重启机器或者事后手动启动,不知道怎么能能作到?

简单的说就是创建一个自启动类型的服务,当前的状态是没有启动的状态,而且在这期间压根就不要被启动

#6


  
  CreateService(); 这个函数的dwStartType参数指定为 
  SERVICE_DEMAND_START 或者 SERVICE_DISABLED
 
SERVICE_DEMAND_START //手动启动
SERVICE_DISABL       //禁用

#7


我本身希望这个服务就是自启动类型的,但是出于其他目的,我不想让它一被CreateService()创建,就立即启动,我希望第一次是我程序控制或者重启服务器,不是在CreateService()时候就已经被启动了

#8


CreateService仅仅是创建服务,不启动

#9


强大

#10


char szServiceName[]=_T("Server Name") ,szFilePath是服务程序路径.
char szFilePath[_MAX_PATH];
::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
BOOL CNTService::Install()
{
    // Open the Service Control Manager
    SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine
                                     NULL, // ServicesActive database
                                     SC_MANAGER_ALL_ACCESS); // full access
    if (!hSCM) return FALSE;

    // Get the executable file path
    char szFilePath[_MAX_PATH];
    ::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));

    // Create the service
    SC_HANDLE hService = ::CreateService(hSCM,
                                         m_szServiceName,
                                         m_szServiceName,
                                         SERVICE_ALL_ACCESS,
                                         SERVICE_WIN32_OWN_PROCESS,
                                         SERVICE_AUTO_START,        // start condition
                                         SERVICE_ERROR_NORMAL,
                                         szFilePath, //file path
                                         NULL,
                                         NULL,
                                         NULL,
                                         NULL,
                                         NULL);
    if (!hService) {
        ::CloseServiceHandle(hSCM);
        return FALSE;
    }
    // tidy up
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
    return TRUE;
}

#11


引用 7 楼 xzou 的回复:
我本身希望这个服务就是自启动类型的,但是出于其他目的,我不想让它一被CreateService()创建,就立即启动,我希望第一次是我程序控制或者重启服务器,不是在CreateService()时候就已经被启动了


你将CreateService()放到一个线程里, 创建完后就将这个线程睡眠, 然后再将这个
线程唤醒,只不过要设个标志位判断一下服务是否已经创建.
不知道这样行不行!  临时想的. 没试验过. LZ试试吧.

#12


to zyq5945:
你确认CreateService只创建服务不启动吗?我创建的SERVICE_AUTO_START类型的,创建后就自动启动了,没有调用其他的

#13


额,我用CreateService 仅仅是创建了服务,服务不会自己启动,需添加启动代码.
    SC_HANDLE hService = ::CreateService(hSCM,
                                         m_szServiceName,
                                         m_szServiceName,
                                         SERVICE_ALL_ACCESS,
                                         SERVICE_WIN32_OWN_PROCESS,
                                         SERVICE_AUTO_START,        // start condition
                                         SERVICE_ERROR_NORMAL,
                                         szFilePath, //file path
                                         NULL,
                                         NULL,
                                         NULL,
                                         NULL,
                                         NULL);

#14


强大