1. 程式人生 > 其它 >C++ windows服務操作

C++ windows服務操作

相關API

OpenSCManager():開啟服務控制管理器。

CreateService():建立系統服務。

OpenService():開啟服務。

StartService():啟動服務。

ControlService():控制服務。

SetServiceStatus():設定服務狀態。

遍歷服務 EnumServicesStatus


#include <iostream>
#include<Windows.h>
using namespace std;
#define MAX_SERVICE_SIZE (1024 * 64)
#define MAX_QUERY_SIZE (1024 * 8)
int main()
{
    cout << "開始獲取" << endl;
    ::setlocale(LC_ALL, ""); //支援中文顯示控制檯
    do
    {
        SC_HANDLE schandle = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); //開啟服務管理
        if (schandle == NULL)
        {
            cout << "開啟服務管理失敗" << endl;
            break; //跳出
        }
        LPENUM_SERVICE_STATUS service_staus;
        DWORD cbBytesNeeded = 0;
        DWORD serviceReturned = 0;
        DWORD resumeHandle = 0;
        DWORD len = sizeof(ENUM_SERVICE_STATUSW);
        service_staus = (LPENUM_SERVICE_STATUS)LocalAlloc(LPTR, MAX_SERVICE_SIZE);
        if (service_staus == nullptr)
        {
            cout << "申請記憶體失敗" << endl;
            break;
        }
        BOOL ess = ::EnumServicesStatus(
            schandle, //控制代碼
            SERVICE_WIN32, //服務型別 SERVICE_DRIVER驅動 SERVICE_TYPE_ALL所有
            SERVICE_STATE_ALL, //服務的狀態
            service_staus, //輸出引數,系統服務的結構
            MAX_SERVICE_SIZE, //結構的大小
            &cbBytesNeeded, //輸出引數,接收返回所需的服務
            &serviceReturned, //輸出引數,接收返回服務的數量
            &resumeHandle); //輸入輸出引數,第一次呼叫必須為0,返回0代表成功
        if (!ess)
        {
            cout << "列舉失敗" << endl;
            break;
        }
        for (int i = 0; i < serviceReturned; i++)
        {
            ENUM_SERVICE_STATUS service = service_staus[i];
            LPWSTR displayName = service.lpDisplayName;
            LPWSTR serviceName = service.lpServiceName;

            switch (service.ServiceStatus.dwCurrentState) //服務狀態
            {
            case       SERVICE_STOPPED:
                break;
            case       SERVICE_START_PENDING:
                break;
            case       SERVICE_STOP_PENDING:
                break;
            case       SERVICE_RUNNING:
                break;
            case      SERVICE_CONTINUE_PENDING:
                break;
            case     SERVICE_PAUSE_PENDING:
                break;
            case     SERVICE_PAUSED:
                break;
            default:
                cout << "未知狀態" << endl;
                break;
            }
            LPQUERY_SERVICE_CONFIG lpServiceConfig = nullptr; //服務詳細資訊結構
            SC_HANDLE service_current = nullptr; //當前的服務控制代碼
            service_current = ::OpenService(schandle, service.lpServiceName, SERVICE_QUERY_CONFIG); //開啟當前服務
            if (service_current == nullptr)
            {
                cout << "當前服務開啟失敗" << endl;
                break;
            }
            lpServiceConfig = (LPQUERY_SERVICE_CONFIG)::LocalAlloc(LPTR, MAX_QUERY_SIZE); //分配記憶體,最大為8KB
            if (lpServiceConfig == nullptr)
            {
                cout << "申請LPQUERY_SERVICE_CONFIG記憶體失敗" << endl;
                break;
            }
            if (!::QueryServiceConfig(service_current, lpServiceConfig, MAX_QUERY_SIZE, &resumeHandle))
            {
                cout << "查詢服務失敗" << endl;
                break;
            }
            wcout << L"服務顯示名稱:" << displayName << L" 服務名稱:" << serviceName  << L"路徑:" << lpServiceConfig->lpBinaryPathName << endl;
            ::CloseServiceHandle(service_current);// 關閉當前服務
        }
        ::CloseServiceHandle(schandle); //關閉服務
    } while (0);
    ::getchar(); //暫停
}

停止服務 ControlService


#include <iostream>
#include<Windows.h>
using namespace std;
#define MAX_SERVICE_SIZE (1024 * 64)
#define MAX_QUERY_SIZE (1024 * 8)
int main()
{
    cout << "開始獲取" << endl;
    ::setlocale(LC_ALL, ""); //支援中文顯示控制檯
    SC_HANDLE schandle = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); //開啟服務管理
    SC_HANDLE cur = ::OpenService(schandle, L"RuijieSCMS", SERVICE_ALL_ACCESS);
    SERVICE_STATUS status = { 0 };
    ::ControlService(cur, SERVICE_CONTROL_STOP, &status); //控制服務停止
    ::CloseServiceHandle(cur); //關閉
    ::CloseServiceHandle(schandle);//關閉
    ::getchar(); //暫停
}

啟動服務 StartService


#include <iostream>
#include<Windows.h>
using namespace std;
#define MAX_SERVICE_SIZE (1024 * 64)
#define MAX_QUERY_SIZE (1024 * 8)
int main()
{
    cout << "開始獲取" << endl;
    ::setlocale(LC_ALL, ""); //支援中文顯示控制檯
    SC_HANDLE schandle = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); //開啟服務管理
    SC_HANDLE cur = ::OpenService(schandle, L"RuijieSCMS", SERVICE_ALL_ACCESS);
    SERVICE_STATUS status = { 0 };
    ::StartService(cur, 0, nullptr); //啟動服務
   
    ::CloseServiceHandle(cur); //關閉
    ::CloseServiceHandle(schandle);//關閉
    ::getchar(); //暫停
}

建立服務 CreateService


#include <iostream>
#include<Windows.h>
using namespace std;
#define MAX_SERVICE_SIZE (1024 * 64)
#define MAX_QUERY_SIZE (1024 * 8)
int main()
{
    cout << "開始獲取" << endl;
    ::setlocale(LC_ALL, ""); //支援中文顯示控制檯
    SC_HANDLE schandle = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); //開啟服務管理
    SC_HANDLE h = ::CreateService(schandle, 
        L"women", //服務名
        L"我們", //顯示用的服務名
        SERVICE_ALL_ACCESS, //所有訪問許可權
        SERVICE_WIN32_OWN_PROCESS,  //私有型別
        SERVICE_AUTO_START, //自啟動型別
        SERVICE_ERROR_NORMAL, //忽略錯誤處理
        L"sfsf.exe", //應用程式路徑
        nullptr, nullptr, nullptr, nullptr, nullptr);
   
    ::CloseServiceHandle(h); //關閉
    ::CloseServiceHandle(schandle);//關閉
    ::getchar(); //暫停
}