Files
CloseWindowsService/DisableAndStopService.c
T

59 lines
2.5 KiB
C
Raw Normal View History

2026-09-15 00:06:14 +08:00
#include "DisableAndStopService.h"
#include <stdio.h>
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;
}