본문 바로가기

자동화

[202407] PC 최적화 및 유지보수 자동화 툴(다운로드)

반응형

dist_optimize_vm_v2.exe
11.37MB

 

 

Link Button 패스워드 페이지 이동

시스템 관리 도구: 서비스 상태 변경 및 유지보수 자동화

이번 포스트에서는 Python을 사용하여 시스템 서비스를 관리하고, 디스크 정리, OneDrive 제거 등의 유지보수 작업을 자동화하는 도구를 만들어보겠습니다. 이 도구는 GUI를 제공하여 사용자가 쉽게 사용할 수 있도록 설계되었습니다.

1. 주요 기능 *windows10

  • 웹 스크래핑을 통한 패스워드 검증: 특정 웹 페이지에서 패스워드를 스크랩하여 사용자가 입력한 패스워드와 비교합니다.
  • 서비스 상태 변경: 선택한 서비스의 시작 유형을 자동, 수동, 사용 안 함으로 변경합니다.
  • 디스크 정리: 디스크 정리 유틸리티를 실행하여 불필요한 파일을 제거합니다.
  • OneDrive 제거: OneDrive 프로세스를 중지하고 시스템에서 제거합니다.
  • 절전 모드 해제: 절전 모드를 해제하여 시스템 성능을 최적화합니다.

2. 전체 코드

import requests
from bs4 import BeautifulSoup
import tkinter as tk
from tkinter import simpledialog, messagebox
import win32service
import win32serviceutil
import win32api
import os
import subprocess

# 패스워드 스크랩
def pwd_scrap():
    url = "https://khc-developer.tistory.com/58"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    try:
        response = requests.get(url, headers=headers, verify=False)  # SSL 인증서 검증 무시
        response.raise_for_status()  # Raise an error for bad status codes

        soup = BeautifulSoup(response.text, 'html.parser')
        password_element = soup.select_one(".tt_article_useless_p_margin.contents_style p[data-ke-size='size16']")
        if password_element:
            return password_element.get_text().strip()
        else:
            raise ValueError("Password element not found on the webpage.")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to retrieve password from the web: {e}")
        return None

# 서비스 상태 변경
def change_service_start_type(service_name, start_type):
    scm_handle = None
    service_handle = None

    try:
        scm_handle = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS)
        if not scm_handle:
            raise Exception("Failed to open Service Control Manager.")

        service_handle = win32service.OpenService(scm_handle, service_name, win32service.SERVICE_ALL_ACCESS)
        if not service_handle:
            raise Exception(f"Failed to open service '{service_name}'. Error code: {win32api.GetLastError()}")

        SERVICE_NO_CHANGE = win32service.SERVICE_NO_CHANGE

        success = win32service.ChangeServiceConfig(
            service_handle,
            win32service.SERVICE_NO_CHANGE,  # Service type (no change)
            start_type,         # Start type
            win32service.SERVICE_NO_CHANGE,  # Error control (no change)
            None,               # Binary path (no change)
            None,               # Load order group (no change)
            False,              # Tag ID (no change)
            None,               # Dependencies (no change)
            None,               # Service start name (no change)
            None,               # Password (no change)
            None                # Display name (no change)
        )
        print(service_name + " : SUCCESS")

    except Exception as e:
        print("UNCHECK")

    finally:
        if service_handle:
            win32service.CloseServiceHandle(service_handle)
        if scm_handle:
            win32service.CloseServiceHandle(scm_handle)

# 관리자모드
def run_as_admin(command):
    """Run a command as an administrator."""
    powershell_command = f'Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command {command}" -Verb RunAs'
    completed_process = subprocess.run(
        ['powershell', '-Command', powershell_command],
        capture_output=True, text=True
    )
    if completed_process.returncode == 0:
        print(f"Command executed successfully: {command}")
    else:
        print(f"Failed to execute command: {command}")
        print(completed_process.stderr)

def run_disk_cleanup():
    try:
        # 디스크 정리 창 실행
        result = subprocess.run(['cleanmgr.exe', '/sagerun:1'], check=True)
        if result.returncode == 0:
            print("Disk cleanup completed successfully: success")
    except subprocess.CalledProcessError as e:
        print(f"Disk cleanup failed: {e}")

def remove_onedrive():
    # Kill OneDrive process if running
    run_as_admin('taskkill /f /im OneDrive.exe')

    if os.path.exists(os.path.join(os.environ['SystemRoot'], 'SysWOW64')):
        uninstall_command = r'%SystemRoot%\SysWOW64\OneDriveSetup.exe /uninstall'
    else:
        uninstall_command = r'%SystemRoot%\System32\OneDriveSetup.exe /uninstall'
    # uninstall
    run_as_admin(uninstall_command)

# 절전모드-균형
def disable_sleep_mode():
    run_as_admin('powercfg -setactive 381b4222-f694-41f0-9685-ff5bb260df2e')

def stop_service(service_name):
    try:
        win32serviceutil.StopService(service_name)
    except Exception as e:
        pass

def apply_to_all_services(service_list, start_type):
    for service_name in service_list:
        if service_name == "auto":
            change_service_start_type(service_name, start_type)
        else:
            stop_service(service_name)
            change_service_start_type(service_name, start_type)

def on_option_select(option, service_list, root):
    if option == "auto":
        start_type = win32service.SERVICE_AUTO_START
    elif option == "manual":
        start_type = win32service.SERVICE_DEMAND_START
    elif option == "disable":
        start_type = win32service.SERVICE_DISABLED

    apply_to_all_services(service_list, start_type)
    disable_sleep_mode()
    remove_onedrive()
    run_disk_cleanup()
    completion_label = tk.Label(root, text="완료, 5초 후 자동 종료", fg="green")
    completion_label.pack(pady=10)

    # 종료
    root.after(5000, root.destroy)

def show_option_buttons(root, service_list):
    for widget in root.winfo_children():
        # Remove existing widgets
        widget.destroy()

    tk.Button(root, text="자동", command=lambda: on_option_select("auto", service_list, root)).pack(fill=tk.X)
    tk.Button(root, text="수동", command=lambda: on_option_select("manual", service_list, root)).pack(fill=tk.X)
    tk.Button(root, text="사용 안함", command=lambda: on_option_select("disable", service_list, root)).pack(fill=tk.X)

def on_password_submit(root, service_list, entry):
    input_start_pwd = entry.get()
    start_pwd = pwd_scrap()
    if start_pwd == input_start_pwd:
        show_option_buttons(root, service_list)
    else:
        messagebox.showerror("Error", "패스워드가 잘못되었습니다.")

def main():
    root = tk.Tk()
    root.title("패스워드 입력")
    root.geometry("300x120")
    service_list = ["MapsBroker", "lfsvc", "iphlpsvc", "PhoneSvc", "SensorService", "SysMain", "WbioSrvc", "WSearch", "NaturalAuthentication", "DusmSvc", "Fax", "TabletInputService", "XboxGipSvc", "XblGameSave", "XboxNetApiSvc", "XblAuthManager"]

    tk.Label(root, text="Enter Password:").pack(pady=10)
    password_entry = tk.Entry(root, show='*', width=20)
    password_entry.pack(pady=10)

    submit_button = tk.Button(root, text="확인", command=lambda: on_password_submit(root, service_list, password_entry))
    submit_button.pack(pady=10)

    root.mainloop()

if __name__ == "__main__":
    main()

3. 코드 설명

pwd_scrap()

특정 URL에서 패스워드를 스크랩하여 반환합니다.

  • 설명: 특정 웹 페이지에서 패스워드를 스크랩하여 사용자가 입력한 패스워드와 비교하기 위해 사용됩니다.
  • 반환값:
    • str: 스크랩된 패스워드 문자열.
    • None: 패스워드를 스크랩하지 못한 경우.

서비스 시작 유형 변경

주어진 서비스의 시작 유형을 변경합니다.

  • 설명: Windows 서비스의 시작 유형을 변경하기 위해 사용됩니다. 서비스 제어 관리자(SCM)와 서비스 핸들을 열고 ChangeServiceConfig를 호출합니다.
  • 인수:
    • service_name (str): 변경할 서비스의 이름.
    • start_type (int): 서비스 시작 유형 (예: win32service.SERVICE_AUTO_START).
  • 예외: 서비스 제어 관리자(SCM) 또는 서비스 핸들을 열지 못한 경우 발생합니다.

관리자 권한으로 명령 실행

주어진 명령을 관리자 권한으로 실행합니다.

  • 설명: PowerShell을 사용하여 주어진 명령을 관리자 권한으로 실행합니다.
  • 인수:
    • command (str): 실행할 명령어.

디스크 정리

디스크 정리 유틸리티를 실행하여 불필요한 파일을 제거합니다.

  • 설명: Windows의 디스크 정리 유틸리티(cleanmgr.exe)를 실행하여 불필요한 파일을 제거합니다.

OneDrive 제거

OneDrive 프로세스를 중지하고 시스템에서 제거합니다.

  • 설명: OneDrive 프로세스를 중지하고 시스템에서 제거합니다. 프로세스를 중지한 후, 시스템 경로에 따라 적절한 제거 명령을 실행합니다.

절전 모드 해제

절전 모드를 해제합니다.

  • 설명: powercfg 명령어를 사용하여 절전 모드를 비활성화합니다.

서비스 중지

주어진 서비스를 중지합니다.

  • 설명: 지정된 서비스를 중지합니다.
  • 인수:
    • service_name (str): 중지할 서비스의 이름.

서비스 시작 유형 적용

서비스 목록의 모든 서비스에 대해 시작 유형을 적용합니다.

  • 설명: 서비스 목록의 각 서비스에 대해 지정된 시작 유형을 설정합니다. 필요한 경우 서비스를 중지한 후 시작 유형을 변경합니다.
  • 인수:
    • service_list (list): 서비스 이름이 포함된 리스트.
    • start_type (int): 서비스 시작 유형.

유지보수 작업 수행

옵션 선택에 따라 서비스를 설정하고 유지보수 작업을 수행합니다.

  • 설명: 사용자가 선택한 옵션에 따라 서비스 시작 유형을 변경하고, 기타 유지보수 작업(절전 모드 해제, OneDrive 제거, 디스크 정리)을 수행합니다.
  • 인수:
    • option (str): 선택된 옵션 (auto, manual, disable).
    • service_list (list): 서비스 이름이 포함된 리스트.
    • root (tk.Tk): Tkinter 루트 윈도우 객체.

옵션 선택 버튼 표시

옵션 선택 버튼을 표시합니다.

  • 설명: 사용자에게 서비스 시작 유형을 선택할 수 있는 버튼을 표시합니다.
  • 인수:
    • root (tk.Tk): Tkinter 루트 윈도우 객체.
    • service_list (list): 서비스 이름이 포함된 리스트.

패스워드 제출 처리

패스워드 제출을 처리합니다.

  • 설명: 사용자가 입력한 패스워드를 스크랩된 패스워드와 비교하여 올바른 경우 옵션 선택 버튼을 표시합니다.
  • 인수:
    • root (tk.Tk): Tkinter 루트 윈도우 객체.
    • service_list (list): 서비스 이름이 포함된 리스트.
    • entry (tk.Entry): 패스워드 입력란 객체.

메인 함수

메인 함수로, GUI를 초기화하고 실행합니다.

  • 설명: Tkinter를 사용하여 GUI를 초기화하고, 사용자로부터 패스워드를 입력받아 유지보수 작업을 수행할 수 있도록 합니다.
반응형