枚举Windows系统服务,通过进程ID取服务名



//枚举Windows系统服务

//使用到的函数以及MSDN的说明如下:

//1、OpenSCManager说明

//http://msdn.microsoft.com/en-us/library/windows/desktop/ms684323(v=vs.85).aspx

//2、EnumServicesStatusEx说明

//http://msdn.microsoft.com/en-us/library/windows/desktop/ms682640(v=vs.85).aspx

//3、CloseServiceHandle说明

//http://msdn.microsoft.com/en-us/library/windows/desktop/ms682028(v=vs.85).aspx

// 测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
int main(int argc, char *argv[])
{
	LONG lRet = 0;
	BOOL bRet = FALSE;
	SC_HANDLE hSCM = NULL;              // 服务数据库句柄
	char *pBuf = NULL;                  // 缓冲区指针
	DWORD dwBufSize = 0;                // 传入的缓冲长度
	DWORD dwBufNeed = 0;                // 需要的缓冲长度
	DWORD dwNumberOfService = 0;        // 返回的服务个数
	ENUM_SERVICE_STATUS_PROCESS *pServiceInfo = NULL;   // 服务信息

	// 建立了一个到服务控制管理器的连接,并打开指定的数据库
	hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);
	if(NULL == hSCM)
	{
		printf("OpenSCManager error.\n");
		return -1;
	}

	// 获取需要的缓冲区大小
	EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,
		NULL, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);

	// 多设置存放1个服务信息的长度
	dwBufSize = dwBufNeed + sizeof(ENUM_SERVICE_STATUS_PROCESS);
	pBuf = (char *)malloc(dwBufSize);
	if(NULL == pBuf)
	{
		printf("malloc error.\n");
		return -1;
	}
	memset(pBuf, 0, dwBufSize);

	// 获取服务信息
	bRet = EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,
		(LPBYTE)pBuf, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);
	if(bRet == FALSE)
	{
		printf("EnumServicesStatusEx error.\n");
		::CloseServiceHandle(hSCM);
		free(pBuf);
		return -1;
	}
	// 关闭打开的服务句柄
	bRet = ::CloseServiceHandle(hSCM);
	if(bRet == FALSE)
	{
		printf("CloseServiceHandle error.\n");
	}
	printf("Service Num:%d\n", dwNumberOfService);

	pServiceInfo = (LPENUM_SERVICE_STATUS_PROCESS)pBuf;
	// 打印取得的服务信息
	for(unsigned int i = 0; i < dwNumberOfService; i++)
	{
		printf("----------%d----------\n", i);
		printf("DisplayName \t\t : %s \n", pServiceInfo[i].lpDisplayName);
		printf("ServiceName \t\t : %s \n", pServiceInfo[i].lpServiceName);
		printf("ServiceType \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwServiceType);
		printf("CurrentState \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwCurrentState);
		printf("ControlsAccepted \t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwControlsAccepted);
		printf("Win32ExitCode \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwWin32ExitCode);
		printf("ServiceSpecificExitCode  : %d \n", pServiceInfo[i].ServiceStatusProcess.dwServiceSpecificExitCode);
		printf("CheckPoint \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwCheckPoint);
		printf("WaitHint \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwWaitHint);
		printf("Process Id \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwProcessId);
		printf("ServiceFlags \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwServiceFlags);
	}
	free(pBuf);
	system("PAUSE");
	return 0;
}

// 既然能够获取到所有的服务信息,

// 那么根据进程ID查询该进程是否为服务,取得服务名等一系列的操作就可以按自己的需求来完成了

// 获取进程ID GetCurrentProcessId()

时间: 2024-10-12 14:43:24

枚举Windows系统服务,通过进程ID取服务名的相关文章

【API】枚举Windows系统所有进程

#include <Psapi.h> #pragma comment(lib,"Psapi.lib") DWORD dwProcesses[1024], dwRes; EnumProcesses(dwProcesses,sizeof(dwProcesses),&dwRes); for (int i = 0; i < dwRes / sizeof(DWORD); i++) { printf("%d %d\r\n",i,dwProcesses[

Windows 系统服务管理

/* 介绍:对Windows系统服务的状态获取,服务暂停,开启,停止操作代码 */ void CStartServiceDlg::OnBnClickedButton1() { // 打开服务管理对象 SC_HANDLE hSC = ::OpenSCManager( NULL, NULL, GENERIC_EXECUTE); if( hSC == NULL) { TRACE( "open SCManager error"); return; } // 打开服务. SC_HANDLE hS

windows 批量杀进程 类似pkill

轉:http://blog.sina.com.cn/s/blog_55fb522f0100whki.html 1.开始-运行(或win+R),输入cmd,打开命令行模式: 2.输入tasklist,可以查看所有进程 3.输入tasklist /fi "imagename eq nginx.EXE",可以查看名字为 nginx.EXE的所有进程,此处的nginx.EXE可以修改为你想查找的进程名 4.输入taskkill /fi "imagename eq nginx.EXE&

根据进程名称获取进程id

# -*- conding:utf-8-*- import subprocess def getpid_windows(process_name):    """利用cmd_str = tasklist|find /i "xdict.exe" 来查找windows平台的进程id"""    cmd_line = 'tasklist|find /i "%s"' %process_name    pp = su

Windows/Linux环境下查看Java进程ID方法

如果启动多个Java程序,因所有Java程序都在JVM中运行,进程管理器会出现多个java.exe,但如何确定某个Java程序与进程中java.exe是对应的呢? 可以使用Java自带的VisualVM工具实现,在Windows的CMD控制台或者Linux终端下执行"jvisualvm"命令进入Java VisualVM工作台. 鼠标双击左侧树形进程列表中某一进程(PID即为进程ID),在弹出窗口右下方点击"系统属性"选项卡,向下拖动滚动条到底部,查看"u

Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止

就这段时间,很多人在抱怨为什么自己的MySQL又打不开问题. 就“Windows(7)上不能启动MySQL服务(位于本地计算机上)错误1067 :进程意外终止”这个问题,我想到了几种方案解决: 一.首先在windows的服务中确定mysql服务是否开启, 如果你在windows的服务中找不到mysql的服务,这时你需要安装mysql服务. 安装过程可以使用命令行的形式,输入下面的命令,5.1之后的版本的命令:>> mysqld.exe -install(这里我在path设置的MySQL安装文件

Windows Minifilter驱动 - 获取进程ID, 进程名字和线程ID (5)

在minifilter里面可能有好几种获取调用进程id,名字和线程的办法.我这里有一种: 使用 PsSetCreateProcessNotifyRoutine 和 PsSetLoadImageNotifyRoutine 这是两个API,我们可以借助它们获取进程信息.具体看:http://msdn.microsoft.com/en-us/library/windows/hardware/ff559951(v=vs.85).aspx PsSetLoadImageNotifyRoutine 可以使用这

如何快速的查找服务所在的进程id?

执行 pgrep -l 服务名称 这里以查找redis所在的进程id为例 执行 pgrep -l redis 从图中可知进程id 为30058 原文地址:https://www.cnblogs.com/xmnote/p/11287006.html

windows下根据tcp端口查询对应的进程id

如下: 查询监听LISTENING的端口1027 netstat -navo|find /i "listen"|find /i ":1027" 结果如下(最后一列是进程id): C:\Users\Administrator>netstat -navo|find /i "listen"|find /i ":1027" TCP 0.0.0.0:1027 0.0.0.0:0 LISTENING 888 TCP [::]:102