热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vc获取服务列表、开始服务、停止服务

ServiceInfoCollect.h#pragmaonce#include服务状态信息typedefstructtagServiceInfo{charszDi

//ServiceInfoCollect.h

#pragma once#include //服务状态信息
typedef struct tagServiceInfo
{char szDisplayName[MAX_PATH]; //显示名称char szServiceName[MAX_PATH]; //服务名char szLoginUser[MAX_PATH]; //启动账户名DWORD dwCurrentState; //服务状态DWORD dwServiceType;char szBinaryPathName[MAX_PATH]; //进程路径char szDescription[1024]; //描述DWORD dwProcessId;
}ServiceInfo;class ServiceInfoCollect
{
public:ServiceInfoCollect();virtual ~ServiceInfoCollect();//枚举所有的服务BOOL GetAllService(std::list & lstServiceInfo);//启动一个服务BOOL StartOneService(char *pServiceName);//停止一个服务BOOL StopOneService(char *pServiceName);
};

//ServiceInfoCollect.cpp

#include "stdafx.h"
#include "ServiceInfoCollect.h"
#include #define MAX_SERVICE_COUNT 1024 //最大服务数//获取进程名称
BOOL GetProcessNameByProcessId(DWORD lProcessID, char *pProcessPathName)
{BOOL bRet &#61; FALSE;DWORD dwMajorVersion &#61; 0;DWORD dwMinorVersion &#61; 0;OSVERSIONINFOEX osver &#61; { 0 };osver.dwOSVersionInfoSize &#61; sizeof(osver);::GetVersionEx((OSVERSIONINFO*)&osver);dwMajorVersion &#61; osver.dwMajorVersion;dwMinorVersion &#61; osver.dwMinorVersion;//打开进程HANDLE hProcess &#61; OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,//访问权限false,//是否允许得到的进程句柄被后创建的子进程继承lProcessID);//进程IDif (hProcess){bRet &#61; TRUE;//获取进程名char szPathName[MAX_PATH] &#61; { 0 }; //进程名if (dwMajorVersion <5) //&#61; 6) //win7或win7以上{DWORD dwPathNameSize &#61; sizeof(szPathName);BOOL bSuccessProcess &#61; TRUE;bSuccessProcess &#61; QueryFullProcessImageName(hProcess, 0, szPathName, &dwPathNameSize);strcpy(pProcessPathName, szPathName);if (!bSuccessProcess){bRet &#61; FALSE;}}::CloseHandle(hProcess);}return bRet;
}ServiceInfoCollect::ServiceInfoCollect()
{
}ServiceInfoCollect::~ServiceInfoCollect()
{
}//枚举所有的服务
BOOL ServiceInfoCollect::GetAllService(std::list & lstServiceInfo)
{lstServiceInfo.clear();char *pBuf &#61; NULL; // 缓冲区指针DWORD dwBufSize &#61; 0; // 传入的缓冲长度DWORD dwBufNeed &#61; 0; // 需要的缓冲长度DWORD dwNumberOfService &#61; 0; // 返回的服务个数ENUM_SERVICE_STATUS_PROCESS *pServiceInfo &#61; NULL; // 服务信息BOOL bRet &#61; FALSE;ServiceInfo info &#61; { 0 };SC_HANDLE hSCM &#61; OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (hSCM &#61;&#61; NULL){hSCM &#61; OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);}if (hSCM &#61;&#61; NULL){return FALSE;}// 获取需要的缓冲区大小EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,NULL, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);// 多设置存放1个服务信息的长度dwBufSize &#61; dwBufNeed &#43; sizeof(ENUM_SERVICE_STATUS_PROCESS);pBuf &#61; (char *)malloc(dwBufSize);if (NULL &#61;&#61; pBuf){//printf("malloc error.\n");return FALSE;}memset(pBuf, 0, dwBufSize);// 获取服务信息bRet &#61; EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,(LPBYTE)pBuf, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);if (bRet &#61;&#61; FALSE){//printf("EnumServicesStatusEx error.\n");::CloseServiceHandle(hSCM);free(pBuf);return FALSE;}pServiceInfo &#61; (LPENUM_SERVICE_STATUS_PROCESS)pBuf;SC_HANDLE sh;char* szInfo[MAX_SERVICE_COUNT * 8] &#61; { 0 };DWORD dwSize &#61; MAX_SERVICE_COUNT * 8;for (unsigned int i &#61; 0; i lpDescription !&#61; NULL){if (strlen(((LPSERVICE_DESCRIPTION)szInfo)->lpDescription) >&#61; 1024){memcpy(info.szDescription, ((LPSERVICE_DESCRIPTION)szInfo)->lpDescription, 1023);}else{sprintf_s(info.szDescription, 1024 - 1, ((LPSERVICE_DESCRIPTION)szInfo)->lpDescription);}}//得到服务的启动账户名bRet &#61; QueryServiceConfig(sh, (LPQUERY_SERVICE_CONFIG)szInfo, dwSize, &dwSize);if (bRet){sprintf_s(info.szLoginUser, MAX_PATH - 1, ((LPQUERY_SERVICE_CONFIG)szInfo)->lpServiceStartName);sprintf_s(info.szBinaryPathName, MAX_PATH - 1, ((LPQUERY_SERVICE_CONFIG)szInfo)->lpBinaryPathName);}else{GetProcessNameByProcessId(info.dwProcessId, info.szBinaryPathName);}CloseServiceHandle(sh);}lstServiceInfo.push_back(info);}CloseServiceHandle(hSCM);free(pBuf);return TRUE;
}//启动一个服务
BOOL ServiceInfoCollect::StartOneService(char *pServiceName)
{SC_HANDLE hSCM &#61; OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (hSCM &#61;&#61; NULL){hSCM &#61; OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);}if (hSCM &#61;&#61; NULL){return FALSE;}SC_HANDLE sh &#61; OpenService(hSCM, pServiceName, SERVICE_ALL_ACCESS);if (sh &#61;&#61; NULL){sh &#61; OpenService(hSCM, pServiceName, SERVICE_START | SERVICE_STOP | SERVICE_QUERY_STATUS);}if (sh &#61;&#61; NULL){CloseServiceHandle(hSCM);return FALSE;}//启动服务SERVICE_STATUS status;BOOL bSuccess &#61; QueryServiceStatus(sh, &status);if (!bSuccess){CloseServiceHandle(sh);CloseServiceHandle(hSCM);return FALSE;}if (status.dwCurrentState !&#61; SERVICE_RUNNING){bSuccess &#61; StartService(sh, 0, NULL);if (!bSuccess){CloseServiceHandle(sh);CloseServiceHandle(hSCM);return FALSE;}}CloseServiceHandle(sh);CloseServiceHandle(hSCM);return TRUE;
}//停止一个服务
BOOL ServiceInfoCollect::StopOneService(char *pServiceName)
{SC_HANDLE hSCM &#61; OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (hSCM &#61;&#61; NULL){hSCM &#61; OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);}if (hSCM &#61;&#61; NULL){return FALSE;}SC_HANDLE sh &#61; OpenService(hSCM, pServiceName, SERVICE_ALL_ACCESS);if (sh &#61;&#61; NULL){sh &#61; OpenService(hSCM, pServiceName, SERVICE_START | SERVICE_STOP | SERVICE_QUERY_STATUS);}if (sh &#61;&#61; NULL){CloseServiceHandle(hSCM);return FALSE;}//启动服务SERVICE_STATUS status;BOOL bSuccess &#61; QueryServiceStatus(sh, &status);if (!bSuccess){CloseServiceHandle(sh);CloseServiceHandle(hSCM);return FALSE;}if (status.dwCurrentState !&#61; SERVICE_STOPPED){bSuccess &#61; ControlService(sh, SERVICE_STOPPED, &status);if (!bSuccess){CloseServiceHandle(sh);CloseServiceHandle(hSCM);return FALSE;}}CloseServiceHandle(sh);CloseServiceHandle(hSCM);return TRUE;
}

服务启动、停止等需要管理员权限&#xff0c;否则容易失败。
参考资料&#xff1a;
https://blog.csdn.net/lanuage/article/details/51902075
https://blog.csdn.net/dgyanyong/article/details/40209069


推荐阅读
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 本文介绍了如何在 PyCharm 中高效利用 Anaconda 管理项目环境配置。首先,确保已安装必要的软件。以 Windows 10 64位专业版为例,建议使用 PyCharm 2018.2 或更高版本。通过 Anaconda 创建和管理虚拟环境,可以显著提升开发效率,确保项目依赖的一致性和隔离性。文章详细阐述了从安装到配置的每一步操作,帮助开发者快速上手并充分利用这些工具的优势。 ... [详细]
  • 大数据应用实例:电视收视率分析企业项目实操第二篇
    本文继续探讨大数据在电视收视率分析中的应用,详细介绍了如何在CentOS系统中进行防火墙管理。针对CentOS 6.5及更早版本,提供了具体的命令操作步骤,包括停止防火墙服务和禁用防火墙启动。此外,还深入讨论了这些操作对数据传输和系统安全的影响,为实际项目实施提供了宝贵的技术参考。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
  • GoCD 创建管道时遇到 422 错误:权限不足问题分析与解决
    在 GoCD 创建管道时遇到 422 错误,通常是因为反向代理配置不正确,特别是缺少必要的头部信息。具体来说,需要确保在反向代理配置中添加 `proxy_set_header Host $host;` 和 `proxy_set_header X-Real-IP $remote_addr;` 等关键指令,以确保 GoCD 能够正确识别请求来源并进行权限验证。通过调整这些配置,可以有效解决权限不足的问题,确保管道创建过程顺利进行。 ... [详细]
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • 深入解析:RKHunter与AIDE在入侵检测中的应用与优势
    本文深入探讨了RKHunter与AIDE在入侵检测领域的应用及其独特优势。通过对比分析,详细阐述了这两种工具在系统完整性验证、恶意软件检测及日志文件监控等方面的技术特点和实际效果,为安全管理人员提供了有效的防护策略建议。 ... [详细]
  • POJ 1696: 空间蚂蚁算法优化与分析
    针对 POJ 1696 的空间蚂蚁算法进行了深入的优化与分析。本研究通过改进算法的时间复杂度和空间复杂度,显著提升了算法的效率。实验结果表明,优化后的算法在处理大规模数据时表现优异,能够有效减少计算时间和内存消耗。此外,我们还对算法的收敛性和稳定性进行了详细探讨,为实际应用提供了可靠的理论支持。 ... [详细]
author-avatar
mobiledu2502891987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有