相關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(); //暫停
}