#include <tchar.h>
#include <wtypes.h>
#include <winsvc.h>
#include <AFXCOM_.H>
#include <vector>
#include <string>
// 设置连接器选项,不弹出控制台窗口
#pragma comment(linker, "/subsystem:windows /entry:mainCRTStartup")
// 枚举系统服务项状态信息
typedef struct _ENUM_SERVICE_INFO
{
std::string strServiceName;
std::string strDisplayName;
SERVICE_STATUS ServiceStatus;
}ENUM_SERVICE_INFO, *LPENUM_SERVICE_INFO;
//////////////////////////////////////////////////////////////////////////
// 系统服务管理助手
class CSystemServiceHelper
{
public:
CSystemServiceHelper();
~CSystemServiceHelper();
public:
// 通过服务名称取得服务的操作句柄
SC_HANDLE GetServiceHandle(LPCTSTR lpszServiceName);
// 启动服务
BOOL StartService(SC_HANDLE hscService);
// 停止服务
// 注:必须先停止服务的依赖服务项才能工程停止服务
BOOL StopService(SC_HANDLE hscService);
// 重启服务
BOOL RestartService(SC_HANDLE hscService);
// 获取依赖的所有服务项列表
BOOL GetDependentServices(SC_HANDLE hscService, std::vector<ENUM_SERVICE_INFO>& vecServiceStatus);
private:
// 系统服务控制管理器句柄
SC_HANDLE m_hscSCManager;
// 服务句柄
SC_HANDLE m_hscService;
};
CSystemServiceHelper::CSystemServiceHelper()
{
// 取得服务控制管理器的操作句柄
m_hscSCManager = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
// 初始化为空
m_hscService = NULL;
}
CSystemServiceHelper::~CSystemServiceHelper()
{
if ( m_hscSCManager)
{
::CloseServiceHandle(m_hscSCManager);
}
if ( m_hscService )
{
::CloseServiceHandle(m_hscService);
}
}
SC_HANDLE CSystemServiceHelper::GetServiceHandle(LPCTSTR lpszServiceName)
{
// 系统服务控制管理器句柄不能为空
if ( !m_hscSCManager )
{
return NULL;
}
// 关闭上次打开的服务
if ( m_hscService )
{
::CloseServiceHandle(m_hscService);
}
// 取得服务句柄并返回
return ::OpenService(m_hscSCManager, lpszServiceName, SERVICE_ALL_ACCESS);
}
// 调用形式:oServiceHelper.StartService(oServiceHelper.GetServiceHandle(lpszServiceName))
BOOL CSystemServiceHelper::StartService(SC_HANDLE hscService)
{
// 传入句柄为空,直接返回
if ( !hscService)
{
return FALSE;
}
// 查询服务的状态
SERVICE_STATUS ssStatus;
memset(&ssStatus, 0, sizeof(SERVICE_STATUS));
if ( !::QueryServiceStatus(hscService, &ssStatus) )
{
return FALSE;
}
// 开启服务
if ( SERVICE_RUNNING != ssStatus.dwCurrentState )
{
if ( !::StartService(hscService, 0, NULL) )
{
return FALSE;
}
}
return TRUE;
}
// 停止服务
BOOL CSystemServiceHelper::StopService(SC_HANDLE hscService)
{
if ( !hscService )
{
return FALSE;
}
// 获取当前服务的状态信息
SERVICE_STATUS ssStatus;
memset(&ssStatus, 0, sizeof(SERVICE_STATUS));
if ( !::QueryServiceStatus(hscService, &ssStatus) )
{
return FALSE;
}
// 如果服务已停止,则直接返回
if ( SERVICE_STOPPED == ssStatus.dwCurrentState )
{
return TRUE;
}
// 如果服务正在被停止,则等待服务停止结束并返回
while ( SERVICE_STOP_PENDING == ssStatus.dwCurrentState )
{
::Sleep(ssStatus.dwWaitHint);
// 循环检测停止状态
if ( !::QueryServiceStatus(hscService, &ssStatus) )
{
return FALSE;
}
if ( SERVICE_STOPPED == ssStatus.dwCurrentState )
{
// 主服务已停止,直接返回
return TRUE;
}
}
// 先停止所有依赖服务项
std::vector<ENUM_SERVICE_INFO> vecServiceStatus;
if ( !GetDependentServices(hscService, vecServiceStatus) )
{
return FALSE;
}
if ( !vecServiceStatus.empty() )
{
SERVICE_STATUS ssDepServiceStatus;
memset(&ssDepServiceStatus, 0, sizeof(SERVICE_STATUS));
std::vector<ENUM_SERVICE_INFO>::const_iterator iter = vecServiceStatus.begin();
for (SC_HANDLE hDepService = NULL; vecServiceStatus.end() != iter; ++iter)
{
// 停止依赖服务项
if ( !StopService(GetServiceHandle(iter->strServiceName.c_str())) )
{
return FALSE;
}
}
}
// 停止服务自身
if ( !::ControlService(hscService, SERVICE_CONTROL_STOP, &ssStatus) )
{
return FALSE;
}
// 循环检测服务的停止状态
while ( SERVICE_STOPPED != ssStatus.dwCurrentState )
{
::Sleep(ssStatus.dwWaitHint);
// 循环检测停止状态
if ( !::QueryServiceStatus(hscService, &ssStatus) )
{
return FALSE;
}
if ( SERVICE_STOPPED == ssStatus.dwCurrentState )
{
break;
}
}
return TRUE;
}
// 重启系统服务程序
BOOL CSystemServiceHelper::RestartService(SC_HANDLE hscService)
{
// 停止服务项
if ( !StopService(hscService) )
{
return FALSE;
}
// 启动服务项
if ( !StartService(hscService) )
{
return FALSE;
}
return TRUE;
}
BOOL CSystemServiceHelper::GetDependentServices(SC_HANDLE hscService, std::vector<ENUM_SERVICE_INFO>& vecServiceStatus)
{
if ( !hscService )
{
return FALSE;
}
// 清空依赖项列表
vecServiceStatus.clear();
// 依赖的服务列表
LPENUM_SERVICE_STATUS lpDependencies = NULL;
DWORD dwBytesNeeded = 0;
DWORD dwCount = 0;
// 首先传入错误参数,获取依赖项的数组长度,如果返回为真,说明依赖项为空
if ( ::EnumDependentServices(hscService, SERVICE_ACTIVE, NULL, 0, &dwBytesNeeded, &dwCount) )
{
// the Enum call succeed, there are no dependent services so do nothing
}
else
{
ASSERT(dwBytesNeeded > 0);
// 开辟内存缓冲区,用来保存所有依赖项数据
char* buffer = new char [dwBytesNeeded];
memset(buffer, 0, dwBytesNeeded);
lpDependencies = (LPENUM_SERVICE_STATUS)buffer;
// 枚举所有依赖项
if ( !EnumDependentServices(hscService, SERVICE_ACTIVE, lpDependencies,
dwBytesNeeded, &dwBytesNeeded, &dwCount ) )
{
delete[] buffer;
return FALSE;
}
// 将所有依赖项存入对象vecServiceStatus中
for (int i = 0; i < dwCount; ++i)
{
ENUM_SERVICE_INFO stServiceStatus;
stServiceStatus.strServiceName = lpDependencies[i].lpServiceName;
stServiceStatus.strDisplayName = lpDependencies[i].lpDisplayName;
stServiceStatus.ServiceStatus = lpDependencies[i].ServiceStatus;
vecServiceStatus.push_back(stServiceStatus);
}
// 释放缓冲区
delete[] buffer;
}
return TRUE;
}
int main(int argc, char* argv[])
{
// 定义系统服务帮助对象
CSystemServiceHelper oServiceHelper;
// 获取服务的依赖项
//std::vector<ENUM_SERVICE_INFO> vecServiceStatus;
//BOOL bResult = oServiceHelper.GetDependentServices(oServiceHelper.GetServiceHandle(_T("Themes")), vecServiceStatus);
// 重启服务项
BOOL bResult = oServiceHelper.RestartService(oServiceHelper.GetServiceHandle(_T("Themes")));
return 0;
}