인턴 기록

[인턴] 인턴 4,5일차 "레지스트리 업데이트 코드" - 버전 변경하기

5353 2024. 9. 6. 15:20
반응형

배우는 입장이라 정확하지 않을수 있습니다. 댓글로 지적 해주세요. 확인하는대로 업데이트 할게요 :)

2024.09.05 ~ 2024.09.05 (인턴 5일만에 반차 쓰기~~)

코드를 보고 특정 레지스트리를 업데이트 하는 과제를 받았다.

1일 차에 말씀 하셨듯이 현재 버전을 확인하고 버전이 맞지 않으면 새로운 버전으로 업데이트하는 부분을 구현해야한다고 하셨으니 , 아마 이 부분을 수행 해야하는 것 같다.(아닐수도 있음!!)

우선 레지스트리 편집기를 켜서 변경하고자하는 경로를 찾는다. 본인의 경우 5개의 루트 키 중 LOCAL_MACHINE을 변경해야하기 때문에 그 지점에 찾았다.

 

 

레지스트리 란?

운영체제단에서 저장하는 환경변수? 데이터 베이스 같은거라고 보면 된다. 

예를 들어 이 파일이 어디서 설치 되어왔고, 어디에 위치하고 어느 버전인지 등등....

 

레지스트리는 크게 다섯 가지 주요 루트 키로 구성되는 데, 각각

HKEY_CLASSES_ROOT (HKCR): 파일 확장자와 관련된 정보 및 파일 형식과 프로그램 간의 연결 정보 저장
HKEY_CURRENT_USER (HKCU): 현재 로그인한 사용자에 대한 설정과 정보 저장
HKEY_LOCAL_MACHINE (HKLM): 모든 사용자에게 공통적으로 적용되는 하드웨어, 소프트웨어 및 시스템 정보
HKEY_USERS (HKU): 사용자 계정에 대한 정보
HKEY_CURRENT_CONFIG (HKCC): 현재 하드웨어에 대한 정보 저장

이 중에서 나는 HKLM 레지스터리 키를 업데이트하는 과제이다. HKLM은 업데이트 시 관리자 권한을 요구하기 때문에 주의를 요한다

 


레지스트리를 편집하는 기초적인 코드는 아래와 같다.

import winreg
winreg.ConnectRegistry(computer_name, winreg.루트 키)
#로컬 컴퓨터 또는 네트워크를 통해 원격 컴퓨터의 레지스트리에 연결할 때 사용

# 레지스트리 키를 읽기 전용으로 열기
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\.. 접근할 레지스터리 경로")

## 어떠한 작업들

winreg.CloseKey(key)# 레지스터리 키 닫기.

이제 어떠한 작업들 부분에 대해서 좀더 알아보자

import winreg
winreg.ConnectRegistry(computer_name, winreg.로컬루트 키)
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\.. 접근할 레지스터리 경로")

## 어떠한 작업들
msg, reg_type = winreg.QueryValueEx(key, "ProgramFilesDir")


## 
winreg.CloseKey(key)

 


헷갈리는 함수

winreg.OpenKey() VS winreg.ConnectRegistry() 

winreg.ConnectRegistry()
로컬 또는 원격 컴퓨터의 루트 레지스트리에 연결하기 위해 사용
주로 원격 컴퓨터의 레지스트리에 접근하려고 할 때 ,또는 로컬 레지스트리에도 연결 가능
로컬 시스템 또는 네트워크  통해 원격 컴퓨터의 레지스트리에 접근할 때.

winreg.OpenKey()
이미 열려 있는 레지스트리의 루트 키 또는 서브 키에서 하위 키를 열기 위해 사용
로컬 시스템 내에서 레지스트리 키를 열어 해당 키에 접근하고 값 조회, 수정

따라서 주로 Connect(원격과 연)  후에 Open(열어) 해야함

 

이렇게 코드를 짜면..!!

 

업데이트 실패가뜬다... UAC프롬프트로 권한을 상승 시키는 방법과 HKLM 대신 HKCU를 이용해 권한을 변경하여 받는 방법이 있는 데 전자를 선택해 파일 전체 수정후 current_user 을 사용하기로 함.

프롬프트에서 권한 인증 받는 것은 이슈가 있을수 있다고 들었음

 

반응형