dumingqiao 发表于 2015-7-20 02:28:51

真正意义上的编程实现关闭Windows自动更新服务

昨天在群里看Ta分享了一个关闭Windows10的自动更新服务的方法,不过使用的是Reg文件加批处理,
虽然很简单很实用。但是作为我等小菜鸟,还是崇尚装逼,把该方法用高级语言写了一遍。
#include "stdafx.h"
#include <Windows.h>
#include <winsvc.h>
#include <stdio.h>
#include <conio.h>
BOOL Stop_Windows_UpdateData(HANDLE);
BOOL Disable_Windows_UpdateData(HANDLE);
int _tmain(int argc, _TCHAR* argv[])
{
        HANDLEhConsole;
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hConsole,0x0D);
        SetConsoleTitle(L"欢迎使用 Windows 10自动更新服务关闭工具 BY:伤城 请在管理员权限下运行!");
        printf("欢迎使用 Windows 10自动更新服务关闭工具 BY:伤城 请在管理员权限下运行!\n按任意键开始......\n");
        getch();
        if (Stop_Windows_UpdateData(hConsole) && Disable_Windows_UpdateData(hConsole))
        {
                SetConsoleTextAttribute(hConsole,FOREGROUND_GREEN);
                SetConsoleTitle(L"Windows 10自动更新服务已经成功关闭,感谢你的使用!");
                printf("\n\nWindows 10自动更新服务已经成功关闭,感谢你的使用!\n按任意键退出......\n");
                getch();
                return 0;
        }
        return 0;
}

BOOL Stop_Windows_UpdateData(HANDLE hConsole)
{
        SC_HANDLE hSCM;
        SC_HANDLE hSvc;
        BOOL bRet;
        SERVICE_STATUS status;
        hSCM = ::OpenSCManager(NULL, NULL,GENERIC_EXECUTE);
        if (!hSCM)
        {
                printf("打开服务管理器失败!错误号:%d\n按任意键退出......\n", GetLastError());
                getch();
                return FALSE;
        }
        hSvc = ::OpenService(hSCM, L"wuauserv", SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP);
        if (!hSvc)
        {
                printf("打开服务失败!错误号:%d\n按任意键退出......\n",GetLastError());
                getch();
                ::CloseServiceHandle(hSCM);
                return FALSE;
        }
        bRet = QueryServiceStatus(hSvc, &status);
        if (!bRet)
        {
                printf("查询服务状态失败!错误号:%d\n按任意键退出......\n", GetLastError());
                getch();
                ::CloseServiceHandle(hSvc);
                ::CloseServiceHandle(hSCM);
                return FALSE;
        }
        if (status.dwCurrentState == SERVICE_STOPPED)
        {
                SetConsoleTextAttribute(hConsole, 0x0B);//天蓝色
                printf("服务尚未启动无需禁用!\n");
                ::CloseServiceHandle(hSvc);
                ::CloseServiceHandle(hSCM);
                return TRUE;

        }
        bRet = ControlService(hSvc, SERVICE_CONTROL_STOP, &status);
        if (!bRet)
        {
                printf("停止服务失败!错误号:%d\n按任意键退出......\n", GetLastError());
                getch();
                ::CloseServiceHandle(hSvc);
                ::CloseServiceHandle(hSCM);
                return FALSE;
        }
        while (::QueryServiceStatus(hSvc, &status) == TRUE)
        {
                ::Sleep(status.dwWaitHint);
                if (status.dwCurrentState == SERVICE_STOPPED)
                {
                        SetConsoleTextAttribute(hConsole, 0x0B);//天蓝色
                        printf("服务停止成功!\n");
                        ::CloseServiceHandle(hSvc);
                        ::CloseServiceHandle(hSCM);
                        return TRUE;
                }
        }
       
}
BOOL Disable_Windows_UpdateData(HANDLE hConsole)
{
        HKEY hKey;
        DWORD BootType=4;
        LONG lRet;
        lRet = RegOpenKey(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\wuauserv\\", &hKey);
        if (ERROR_SUCCESS == lRet)
        {
                RegSetValueExA(hKey, "Start",0,REG_DWORD, (LPBYTE)&BootType, sizeof(DWORD));
                RegCloseKey(hKey);
                SetConsoleTextAttribute(hConsole, 0x0B);//天蓝色
                printf("服务禁用成功!\n");
                return TRUE;
        }
        else
        {
                printf("服务禁用失败!错误号:%d\n按任意键退出......\n", GetLastError());
                getch();
                return FALSE;
        }
}





0xAA55 发表于 2015-7-20 11:25:50

咸鱼你好,咸鱼再见。虎纹咸鱼。

Golden Blonde 发表于 2015-7-20 08:33:26

不错,不过我觉得在BAT/VBS/REG不能解决的时候,才需要编程。

顺带贴上REG+BAT的原版:http://www.vbasm.com/blog-4158-58.html

will大熊 发表于 2015-7-20 14:04:51

赞一个;P;P

0x01810 发表于 2015-7-20 17:13:25

赞一个++
页: [1]
查看完整版本: 真正意义上的编程实现关闭Windows自动更新服务