PC팁

윈도우11 자동 로그인 - Python app으로 구현하기

joeyRun 2023. 7. 15. 09:07
반응형

지난 번 포스트에 윈도우 11 자동 로그인 방법을 알려드렸습니다…만,

2023.06.21 - [PC팁] - 윈도우11 자동 로그인

 

한 번에 해결할 방법은 없을지 고민을 좀 해봤습니다.

 

1. 레지스트리 세팅 변경으로 윈도우 자동 로그인

아래와 같이 Microsoft Learn site에는 레지스트리 세팅 변경으로 윈도우 자동 로그인할 수 있는 방법을 제공합니다.

https://learn.microsoft.com/en-us/troubleshoot/windows-server/user-profiles-and-logon/turn-on-automatic-logon

 

Configure Windows to automate logon - Windows Server

This article describes how to turn on the automatic logon feature in Windows by editing the registry.

learn.microsoft.com

요약하면 아래와 같네요.

 

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 에

① AutoAdminLogon 키값을 String으로 "1" (키가 없다면 생성)

② DefaultUserName 키값을 Login ID (키가 없다면 생성)

③ DefaultPassword 키값을 Login Password (키가 없다면 생성)

 

위 3가지 작업을 Python으로 구현해보겠습니다.

 

2. 레지스트리 세팅 변경을 Python으로 구현

Registry edit을 이용해 수작업으로 변경하는 작업을 Python으로 구현해봅니다.

Python의 winreg 라이브러리를 이용할꺼고, Registry를 읽어오는 get 함수와, 는 set 함수를 만들어봤습니다.

(단, set 함수는 관리자 모드로 실행해야만 동작합니다.)

 

Login ID는 현재 로그인해 있는 ID를 받아서 입력하고,

Login password는 사용자 입력을 받아서 입력합니다.

import winreg
import os
from getpass import getpass

def setRegistry(winregRoot: int, regPath: str, name: str, value: any) -> bool:
    try:
        winreg.CreateKey(winregRoot, regPath)
        registryKey = winreg.OpenKey(winregRoot, regPath, 0, 
                                       winreg.KEY_WRITE)
        # winreg.OpenKeyEx()
        winreg.SetValueEx(registryKey, name, 0, winreg.REG_SZ, value)
        winreg.CloseKey(registryKey)
        return True
    except WindowsError:
        return False

def getRegistry(winregRoot: int, regPath: str, name: str) -> any:
    try:
        registryKey = winreg.OpenKey(winregRoot, regPath, 0,
                                       winreg.KEY_READ)
        value, regtype = winreg.QueryValueEx(registryKey, name)
        winreg.CloseKey(registryKey)
        return value
    except WindowsError:
        return None

if __name__ == '__main__':
    password = getpass(prompt='Enter your log-in password:')
    setRegistry(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'AutoAdminLogon', '1')
    setRegistry(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'DefaultUserName', os.getlogin())
    setRegistry(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'DefaultPassword', password)

VS code, pyCharm 등 Python을 Edit/실행하는 편집기를 관리자 모드로 실행시키면,

password를 묻는 prompt가 나오고, 현재 로그인해있는 사용자의 password를 정확히 입력하면 정상적으로 윈도우 자동 로그인이 됩니다.

 

3. 실행 파일 만들기

최종적으로는 배포 가능한 실행파일 형태의 App을 만들 목적이니 python 파일을 실행파일로 변환해보겠습니다.

실행 파일을 만들기 전에…

 

실행파일로 변환시에는 console창에서 input을 받는 것보다, 간단한 dialog창으로 password 입력을 받을 수 있게 하는 것이 사용성이 좋습니다. 아래처럼요.

간단하게 tkinter 를 이용해서 위와 같은 dialog창으로 password 입력을 받도록 코드를 수정해봤습니다.

(만약 Cancel 버튼으로 취소하면 Registry를 적지 않습니다.)

import winreg
import os
from getpass import getpass
import tkinter as tk
from tkinter import simpledialog

def setRegistry(winregRoot: int, regPath: str, name: str, value: any) -> bool:
    try:
        winreg.CreateKey(winregRoot, regPath)
        registryKey = winreg.OpenKey(winregRoot, regPath, 0, 
                                       winreg.KEY_WRITE)
        # winreg.OpenKeyEx()
        winreg.SetValueEx(registryKey, name, 0, winreg.REG_SZ, value)
        winreg.CloseKey(registryKey)
        return True
    except WindowsError:
        return False

def getRegistry(winregRoot: int, regPath: str, name: str) -> any:
    try:
        registryKey = winreg.OpenKey(winregRoot, regPath, 0,
                                       winreg.KEY_READ)
        value, regtype = winreg.QueryValueEx(registryKey, name)
        winreg.CloseKey(registryKey)
        return value
    except WindowsError:
        return None

def getPassword() -> str:
    root = tk.Tk()
    root.withdraw()
    return simpledialog.askstring(title='Windows Auto Login', prompt='Enter your Windows Log-in password\t\t', show='*')

if __name__ == '__main__':
    password = getPassword()
    if password is not None:
        setRegistry(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'AutoAdminLogon', '1')
        setRegistry(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'DefaultUserName', os.getlogin())
        setRegistry(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'DefaultPassword', password)

자! 이제 위 코드를 실행파일로 변경합니다. 먼저 실행 코드를 main.py로 저장해주시고, command prompt에 아래와 같이 입력하면됩니다. main.py가 싫으시면 편한데로 하시고, 아래 명령줄에서 main.py를 저장한 파일명으로 하면됩니다.

pyinstaller --windowed --onefile --uac-admin main.py

--windowed : command prompt 창을 띄우지않습니다.

--onefile : exe 파일 하나로 생성합니다.

--uac-admin : 관리자 권한으로 실행되도록 설정합니다.

 

만약 pyinstaller command가 동작하지않으면, pyinstaller를 설치해주세요.

command prompt에 아래와 같이 입력하면됩니다.

pip install pyinstaller

 

4. 최종 실행 파일

pyinstaller가 정상적으로 잘 동작하면, dist 폴더에 main.exe라는 파일이 생성됩니다. 제 경우에는 잘 동작했구요.

아래에 첨부합니다.

main.exe
10.22MB

 

여기까지입니다. 즐거운 하루 되세요~

 

   

반응형