【Windows系统】windows服务

概述

Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。

服务安装与卸载

通过代码启动。

第一步、创建服务

BOOL Install()
{
    //打开服务控制管理器
    hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 
    //创建服务
    SC_HANDLE hService = ::CreateService(hSCM,
                                    szServiceName,
                                    szServiceName,
                                    SERVICE_ALL_ACCESS,
                                    SERVICE_WIN32_OWN_PROCESS,
                                    SERVICE_AUTO_START,
                                    SERVICE_ERROR_NORMAL,
                                    szFilePath,
                                    NULL,
                                    NULL,
                                    _T(""),
                                    NULL,
                                    NULL);
 
    ::CloseServiceHandle(hService);
    ::CloseServiceHandle(hSCM);
}

第二步、主函数ServiceMain()

调用 RegisterServiceCtrlHandler 来注册服务的控制函数, 这里要设置status.dwControlsAccepted 为 SERVICE_ACCEPT_STOP,否则你不能控制服务状态。

void WINAPI ServiceMain()
{
    // Register the control request handler
    status.dwCurrentState = SERVICE_START_PENDING;
    status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制
 
    //注册服务控制
    hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceCtrl);
 
    if (hServiceStatus == NULL)
    {
        LogEvent(_T("Handler not installed"));
        return;
    }
 
    SetServiceStatus(hServiceStatus, &status);
 
    status.dwWin32ExitCode = S_OK;
    status.dwCheckPoint = 0;
    status.dwWaitHint = 0;
    status.dwCurrentState = SERVICE_RUNNING;
 
    SetServiceStatus(hServiceStatus, &status);
 
    //主要业务
    Work();
 
    //
    status.dwCurrentState = SERVICE_STOPPED;
    SetServiceStatus(hServiceStatus, &status);
    LogEvent(_T("Service stopped"));
}

第三步、服务控制函数

服务调用RegisterServiceCtrlHandler或者RegisterServiceCtrlHandlerEx函数来注册它的服务控制函数ServiceCtrl()。

void WINAPI ServiceCtrl(DWORD dwControl)
{
    switch (dwControl)
    {
    case SERVICE_CONTROL_PAUSE:
        ServiceStatus.dwCurrentState = SERVICE_PAUSED;
        break;
 
    case SERVICE_CONTROL_CONTINUE:
        ServiceStatus.dwCurrentState = SERVICE_RUNNING;
        break;
 
    case SERVICE_CONTROL_STOP:
    case SERVICE_CONTROL_SHUTDOWN:
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        ServiceStatus.dwCheckPoint = 0;
        ServiceStatus.dwWaitHint = 0;
        SetServiceStatus(hStatus, &ServiceStatus);
        return;
 
     default:
        break;
    }
     
    // 重设服务状态
    SetServiceStatus(hStatus, &ServiceStatus);
    return;
}

第四步、卸载

BOOL Uninstall();
{
    //打开服务控制管理器
    SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
 
    //打开服务
    SC_HANDLE hService = OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);
 
    //停止服务
    ControlService(hService, SERVICE_CONTROL_STOP, &status);
 
    //删除服务
    DeleteService(hService);
 
    …
}

服务安装成功

1、输入services.msc,启动 服务。

【Windows系统】windows服务_第1张图片

2、任务管理器,查看进程信息。服务一般都是以SYSTEM权限运行。

【Windows系统】windows服务_第2张图片

3、服务安装成功后,注册表位置

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XxxService

【Windows系统】windows服务_第3张图片

参考

  通过sc指令创建和删除服务参考:

​​​​​​【Windows脚本】服务的创建和删除_sunriver2000的博客-CSDN博客

你可能感兴趣的:(Windows,系统,windows,windows服务,安装,卸载)