#include <windows.h> int main(int argc, char* argv[]) { //获得服务管理器SCM的句柄 SC_HANDLE sc=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (sc == NULL) { return 0; } LPENUM_SERVICE_STATUS lst=NULL; DWORD dwCount=0; DWORD dwSize=0; //第一次调用来得到需要多大的内存区 BOOL bRet = EnumServicesStatus(sc,SERVICE_WIN32|SERVICE_DRIVER,SERVICE_STATE_ALL, lst,dwSize,&dwSize,&dwCount,NULL); if (!bRet && dwSize==0) { CloseServiceHandle(sc); return 0; } //申请需要的内存 lst=(LPENUM_SERVICE_STATUS)LocalAlloc(LPTR,dwSize); if (lst == NULL) { CloseServiceHandle(sc); return 0; } //第二次调用来得所有服务的信息 LPQUERY_SERVICE_CONFIG lpServiceInfo = NULL; bRet = EnumServicesStatus(sc,SERVICE_WIN32,SERVICE_STATE_ALL, lst,dwSize,&dwSize,&dwCount,NULL); if (!bRet && dwSize==0) { CloseServiceHandle(sc); LocalFree(lst); return 0; } printf("%-28s%-8s%-12s%s\n\n", "服务名", "状态", "启动类型", "关联程序"); SC_HANDLE hService = NULL; //开始打印枚举出的服务信息 for(DWORD i=0;idwStartType) { case SERVICE_BOOT_START:case SERVICE_SYSTEM_START:case SERVICE_AUTO_START: { printf("%-12s", "自启动"); } break; case SERVICE_DEMAND_START: { printf("%-12s", "手动启动"); } break; case SERVICE_DISABLED: { printf("%-12s", "已禁用"); } break; } if (lpServiceInfo->lpBinaryPathName != NULL) { printf("%s\n", lpServiceInfo->lpBinaryPathName); } CloseServiceHandle(hService); LocalFree(lpServiceInfo); } printf("共计 %d 个服务\n", dwCount); CloseServiceHandle(sc); LocalFree(lst); return 0; }