C++ windows服務操作
阿新 • • 發佈:2022-05-20
相關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(); //暫停
}