This commit is contained in:
2026-09-15 00:06:14 +08:00
commit 902d29927e
6 changed files with 205 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
cmake_minimum_required(VERSION 3.15)
project(CloseWindowsService C)
file(GLOB SOURCES *.c)
list(FILTER SOURCES EXCLUDE REGEX \\.t\\.c)
list(FILTER SOURCES EXCLUDE REGEX main.c)
foreach (item IN LISTS SOURCES)
message(STATUS "[${PROJECT_NAME}] SOURCE: ${item}")
endforeach ()
if(MSVC)
add_compile_options(/utf-8)
endif()
if(MINGW)
# 检查项目根目录下是否存在 UAC.manifest 文件
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/UAC.manifest")
# 自动在 build 目录下生成一个临时的资源文件资源文件
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/uac_resource.rc" "1 24 \"${CMAKE_CURRENT_SOURCE_DIR}/UAC.manifest\"")
# 将生成的 .rc 文件作为一个源文件加入列表中
set(UAC_RESOURCE_SRC "${CMAKE_CURRENT_BINARY_DIR}/uac_resource.rc")
else()
message(FATAL_ERROR "未找到 UAC.manifest 文件,请确保它存在于项目根目录下!")
endif()
endif()
add_executable(${PROJECT_NAME} main.c ${SOURCES})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR} )
if(MSVC)
target_link_options(${PROJECT_NAME} PRIVATE "/MANIFESTUAC:level='requireAdministrator' uiAccess='false'")
endif()
+59
View File
@@ -0,0 +1,59 @@
#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;
}
+15
View File
@@ -0,0 +1,15 @@
#ifndef CLOSEWINDOWSSERVICE_DISABLEANDSTOPSERVICE_H
#define CLOSEWINDOWSSERVICE_DISABLEANDSTOPSERVICE_H
#ifndef INCLUDED_WINDOWS_H
#define INCLUDED_WINDOWS_H
#include <windows.h>
#endif
BOOL DisableAndStopService(const char* serviceName);
#endif //CLOSEWINDOWSSERVICE_DISABLEANDSTOPSERVICE_H
+20
View File
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<description>Windows Service Optimizer</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<!-- requireAdministrator 确保请求管理员权限 -->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<!-- 💡 关键部分:声明兼容 Windows 10/11,缺少这个在较新系统上极易引发并行配置错误 -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 和 Windows 11 共有 GUID -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>
+77
View File
@@ -0,0 +1,77 @@
#include <DisableAndStopService.h>
#include <shlobj.h> // 需要包含此头文件来使用 IsUserAnAdmin()
#include <stdio.h>
int main() {
SetConsoleOutputCP(65001);
// 1. 检查当前是否拥有管理员权限
if (!IsUserAnAdmin()) {
char szPath[MAX_PATH];
// 获取当前程序自身的绝对路径
GetModuleFileNameA(NULL, szPath, MAX_PATH);
// 使用 "runas" 参数重新启动自身,这会强制 Windows 弹出 UAC 提权提示
HINSTANCE hInst = ShellExecuteA(NULL, "runas", szPath, NULL, NULL, SW_SHOW);
// 如果返回值大于 32,说明用户在弹窗中点击了“是”,新进程已成功以管理员身份拉起
if ((INT_PTR)hInst > 32) {
return 0; // 关闭当前这个没有权限的旧进程
} else {
// 用户点击了“否”或者关闭了弹窗
printf("[-] 错误:此程序必须以管理员身份运行才能修改系统服务!\n");
system("pause");
return 1;
}
}
// 💡 在这个数组里填入你想批量关闭的服务名称 (必须是 Service Name,非 Display Name)
const char* servicesToClose[] = {
"DiagTrack", // 微软后台遥测/用户体验收集
"DPS", // 诊断策略服务
"WSearch", // Windows 本地搜索索引 (不用本地搜索可关)
"TabletInputService", // 触摸键盘和手写面板服务
"Spooler", // 打印机后台处理 (家里/公司没打印机可关)
"MapsBroker", // 下载地图管理器 (不下载离线地图可关)
"XblAuthManager", // Xbox Live 认证管理器 (不玩 Xbox 游戏可关)
"XblGameSave", // Xbox Live 游戏保存 (不玩 Xbox 游戏可关)
"dmwappushservice", // 路由设备管理中的 WAP 推送消息,本质上属于辅助遥测(隐私数据收集)的一部分
"WHESVC", // 这是 Windows 11 较新版本中加入的后台服务,用于监控 CPU 负载、温度、电源策略等,并在变卡时记录本地跟踪数据
"RemoteRegistry", // 允许远程用户修改本地电脑的注册表
"RemoteAccess", // 在局域网和广域网环境中提供路由、远程连接服务
"Fax", // 管理电脑收发传真
"EntAppMgmtSvc", // 企业级应用合规性管理
"WpcMonService", // 家长控制服务,用于限制儿童账户的使用时间和浏览内容
"WerSvc", // 微软错误报告生成 (卡顿元凶之一)
"WpnService", // 微软推送通知、小组件实时刷新
"Browser", // 局域网计算机浏览器列表
"lmhosts", // NetBIOS 局域网历史遗留解析
"Dosvc", // 传递优化 (后台偷偷 P2P 上传补丁吃带宽)
"WbioSrvc", // 生物识别 (无指纹/面部解锁的台式机可关)
"RetailDemo", // 线下实体店样机演示模式
// === 小众硬件与上古僵尸服务(无设备直接关) ===
"WalletService", // 微软钱包服务
"SCardSvr", // 智能卡读卡器服务
"ScDeviceEnum", // 智能卡设备枚举
//"StiSvc", // 扫描仪与照相机图像输入
"ALG", // 历史遗留的应用层网关
"AxInstSV", // 已经淘汰的 ActiveX 插件安装服务
};
// 计算数组中服务的总数量
int totalServices = sizeof(servicesToClose) / sizeof(servicesToClose[0]);
printf("==================================================\n");
printf(" Windows 11 服务批量优化脚本 (C语言版) \n");
printf("==================================================\n\n");
// 循环遍历数组,依次关闭服务
for (int i = 0; i < totalServices; i++) {
DisableAndStopService(servicesToClose[i]);
}
printf("\n所有指定服务处理完毕。\n");
system("pause");
return 0;
}
+1
View File
@@ -0,0 +1 @@
1 24 "UAC.manifest"