#include "DisableAndStopService.h" #include BOOL DisableAndStopService(const char* serviceName) { SC_HANDLE hSCM = NULL; SC_HANDLE hService = NULL; SERVICE_STATUS_PROCESS sStatus; DWORD dwBytesNeeded; BOOL bResult = FALSE; // 1. 打开服务控制管理器 (SCM) hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { printf("[-] [%s] 打开服务管理器失败 (错误码: %d)。请右键选择“以管理员身份运行”!\n", serviceName, GetLastError()); return FALSE; } // 2. 打开目标服务 (需要修改配置、停止和查询状态的权限) hService = OpenService(hSCM, serviceName, SERVICE_CHANGE_CONFIG | SERVICE_STOP | SERVICE_QUERY_STATUS); if (hService == NULL) { DWORD err = GetLastError(); if (err == ERROR_SERVICE_DOES_NOT_EXIST) { printf("[*] [%s] 系统中不存在此服务,跳过。\n", serviceName); } else { printf("[-] [%s] 打开服务失败 (错误码: %d)。\n", serviceName, err); } CloseServiceHandle(hSCM); return FALSE; } // 3. 将启动类型修改为“禁用” (SERVICE_DISABLED) if (ChangeServiceConfig(hService, SERVICE_NO_CHANGE, SERVICE_DISABLED, SERVICE_NO_CHANGE, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) { printf("[+] [%s] 已成功设置为【禁用】。\n", serviceName); } else { printf("[-] [%s] 修改禁用配置失败 (错误码: %d)。\n", serviceName, GetLastError()); } // 4. 检查当前运行状态,如果正在运行则发送停止信号 if (QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&sStatus, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded)) { if (sStatus.dwCurrentState != SERVICE_STOPPED && sStatus.dwCurrentState != SERVICE_STOP_PENDING) { if (ControlService(hService, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&sStatus)) { printf("[+] [%s] 停止信号发送成功,服务正在关闭...\n", serviceName); bResult = TRUE; } else { printf("[-] [%s] 发送停止信号失败 (错误码: %d)。\n", serviceName, GetLastError()); } } else { printf("[*] [%s] 服务当前已经是停止状态。\n", serviceName); bResult = TRUE; } } // 5. 清理句柄 CloseServiceHandle(hService); CloseServiceHandle(hSCM); return bResult; }