59 lines
2.5 KiB
C
59 lines
2.5 KiB
C
#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;
|
|
} |