Myung Digital Forensic Center

기밀 유출 조사 전문업체

30년 전통의 디지털 포렌식 名家 자세히보기

카테고리 없음

반드시 알아야 하는 PowerShell 7.x 변경사항

Myung_DFC 2022. 3. 23. 17:02

Thumbnail-Image

 

PowerShell 5.1 vs PowerShell 7.x 

 

 

xxx년 xx일 PowerShell 7.1 버전이 릴리즈 된 것으로 시작으로 현재 7.3 버전이 프리뷰(Preview) 단계에 올라 와 있다. PowerShell 7.x 버전은 PowerShell 5.1의 단순 업데이트 버전이 아니라 새로운 프로젝트로 설계되었으며, 이로 인해 기존의 5.1 버전을 사용하던 유저들이 7.x 버전으로 마이그레이션 할 경우 생기는 몇 가지 문제점이 야기되었다.

 

이 둘의 관계는 Python 2.7 과 Python 3.x 버전의 관계로 이해하면 편한데, Python 3.x 버전이 기존 버전을 대체하기 위해 개발 및 출시되었지만 Python 2.7 버전의 모든 것을 호환하지 않는 것처럼, PowerShell 5.1 에서 잘 사용하던 모듈 및 Cmdlet이 PowerShell 7.x 버전에서는 호환되지 않는 이슈가 있다. 따라서 아직까지는 PowerShell 7.x 버전으로 온전히 마이그레이션하는 것이 이를 수도 있기 때문에, 다수의 유저들이 PowerShell 5.1 버전과 병행하여 사용하고 있다. 

 

PowerShell 5.1 버전과 PowerShell 7.x 버전은 앞서 전술하였듯이 서로 다른 프로그램이기 때문에 두 개의 버전을 모두 사용하는 사용자들은 몇 가지 차이점 및 변경점들을 숙지하고 있어야 한다. 그렇지 않으면 열심히 작성한 스크립트가 동작하지 않는 근본적인 원인을 해결할 수 없기 때문에 다음의 사항들은 반드시 짚고 넘어가자.

 

 

1. 실행파일(.exe)의 이름이 다르다.
PowerShell 5.1 > powershell.exe
PowerShell 7.x > pwsh.exe

 

당연한 이야기이면서도 낯설게 들린다. 애초에 서로 다른 프로그램 이기 때문에 다른 이름을 가진 채로 실행되는 것은 당연하지만, 7.x 버전을 단순한 버전 업데이트로 생각하고 있다면 약간의 혼동이 올 수 있다. 분명히 해야 할 점은 명령 프롬프트(Cmd.exe)로 파워쉘을 실행시킬 때 PowerShell 5.1 버전은 "powershell" 명령어를 입력해야하고, PowerShell 7.x 버전은 "pwsh" 명령어를 입력해야 한다는 점이다. 물론 환경변수가 먼저 설정된 상태여야 하지만 이는 기본으로 설정되어 있으니 걱정하지 않아도 된다.

 

PowerShell 5.1 버전(powershell.exe) 실행 화면
PowerShell 7.2 버전(pwsh.exe) 실행 화면

 

실행파일의 이름이 변경되었다는 점을 모르고 있다면 내가 방금 실행시킨 파워쉘에서 cmdlet이 동작하지 않는 원인을 알아내기 어렵다. PowerShell 7.x 버전 설치 이후 이를 실행시키기 위해 "powershell" 명령어를 입력하는 실수는 지금까지면 충분하다. 

심지어 (당연하지만) 프로세스 이름도 다르다는 사실 또한 알아두자. 작업 관리자 창을 열어서 실행 중인 프로세스들의 이름을 보면 PowerShell 7.x 버전은 "pwsh" 이름으로, PowerShell 5.1 버전은 "Windows PowerShell" 이름으로 프로세스가 올라와 있다. 

 

PoweShell 5.1 및 7.x 버전의 프로세스

 

 

2. 실행파일(.exe)의 경로가 변경되었다. 
PowerShell 5.1 > %SystemRoot% \ WindowsPowerShell \ v1.0 \ powershell.exe
PowerShell 7.x > %UserProfile% \ PowerShell \ 7 \ pwsh.exe

 

파워쉘의 실행파일 경로는 대단히 중요하다. PowerShell 5.1 버전은 Windows 운영체제의 기본 파워쉘 버전이기 때문에 기본으로 환경변수가 등록되어 있을 뿐 아니라 Visual Studio Code 등 각종 코드 편집기에서도 자동으로 경로가 설정되어 있다. 하지만 PowerShell 7.x 버전은 새롭게 설치된 응용프로그램의 개념이라는 점에서 이 프로그램을 다른 곳에서 사용하기 위해서는 pwsh.exe 실행파일의 경로를 알아두어야 할 필요가 있다. 

 

파워쉘을 사용자들이 가장 애용하는 애뮬레이터 중 하나인 "Windows Termianl"을 그 예로 들어 볼 수 있다. Windows Terminal은 PowerShell 5.1 버전을 기본 파워쉘 프로필로 설정하고 있기 때문에, PowerShell 7.x 버전을 기본 프로필로 사용하고 싶다면 이 설정을 변경해 주어야 한다.

 

Windows Terminal 설정창

 

설정을 변경하지 않더라도 7.x 버전의 파워쉘을 사용할 수 없는 것은 당연히 전혀 아니다. 7.x 버전 설치 과정에서 자동으로 환경 변수가 설정되기 때문에 앞서 전술한 것처럼 "pwsh" 명령어로 호출하면 된다. 하지만 새로운 세션을 시작할 때마다 명령어를 호출해야 하기 때문에 7.x 버전을 주로 사용하고 싶다면 기본 프로필 설정을 변경하는 것이 정신건강에 좋다.

 

파워쉘 스크립트로써 가장 인기 있는 "Visual Studio Code" 또한 예외가 아니다. VS Code에 설정된 기본 파워쉘 프로필은 당연하게도 5.1 버전인데, 이를 변경해 주지 않으면 앞서 전술한 상황과 똑같은 상황에 처하게 된다. 따라서 VS Code의 Json 설정 파일에 다음의 명령을 입력하여 7.x 버전을 기본 프로필로 설정하자.

{
    // PowerShell Profile Path Setting
    "terminal.integrated.shell.windows": "C:\\Program Files\\WindowsPowerShell 7.x\\pwsh.exe",
    ...
}

VS Code에 설정된 PowerShell 7.2 버전(pwsh.exe) 프로필

 

 

3. $Profile 경로가 변경되었다.
PowerShell 5.1 > $UserProfile% \ Document \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1
PowerShell 7.x > $UserProfile% \ Document \ PowerShell \ Microsoft.PowerShell_profile.ps1

 

PowerShell은 세션을 시작할 때마다 $profile 경로의 스크립트 파일에 기록된 내용을 자동으로 세션에 가져온다. 이로 인해 $profile 경로의 스크립트 파일에 나만의 환경을 구성하기 위한 설정값을 적어 놓으면, 공통된 설정의 세션을 시작하는 것이 가능하다. 이러한 $profile 스크립트 파일의 경로가 PowerShell 5.1 버전과 7.x 버전에서 차이가 있다.

 

이 차이를 인지하지 못하고 있으면, "powershell.exe" 프로그램이 로드하는 환경설정이 "pswh.exe" 프로그램에 적용되지 않는다는 사실을 눈치채기 힘들다. 따라서 $Profile 경로의 변경 내용은 반드시 숙지해야 한다.

 

PowerShell 5.1 버전(powershell.exe)의 $Profile 경로

 

$Profile 파일은 자동으로 생성되지 않기 때문에 직접 생성해 줘야 한다. 아래의 코드를 사용해서 $Profile 파일이 있는지 검사하고 없으면 생성하도록 하자.

If (Test-Path -Path $Profile -PathType Leaf)
{
    "$Profile already exists"
}
else
{    New-Item -ItemType File -Path $Profile
}

 

 

4. $env:PSModulePath 경로가 변경되었다.
PowerShell 5.1 > %SystemRoot% \ WindowsPowerShell \ v1.0 \ Modules
PowerShell 7.x > %UserProfile% \ PowerShell \ 7 \ Modules 

 

PowerShell은 결국 cmdlet에서 시작해서 cmdlet으로 끝난다. 약간 과장일 수도 있지만, 기본으로 내장된 cmdlet과 다른 사람이 작성한 cmdlet을 사용해서 원하는 작업을 수행하는 것이 요점이다. 이 때, 다른 사람이 작성한 모듈을 내 작업 환경으로 가져오려면 "Install-Module"과 "Import-Module" 등의 cmdlet을 사용하는데, Install-Module 명령어로 설치한 모듈이 자동으로 저장되는 곳이 바로 $env:PSModulePath 경로이다. 

 

PowerShell은 $env:PSModulePath 환경 변수에 저장된 경로의 하위에 위치한 파일들을 탐색하여 ".psm1" 확장자를 가진파워쉘 모듈 파일을 찾아낸 뒤, 자동으로 호출(Import) 한다. 따라서 $env:PSModulePath에 지정된 경로가 잘못된 경우 모듈이 정상적으로 호출되지 않기 때문에, 제대로 지정되어 있는지 확인이 필요하다. 물론 7.x 버전 설치 시 자동으로 모듈 경로가 등록되기 때문에 일반적인 경우에는 크게 걱정할 필요는 없다.

 

 


 

지금까지 PowerShell 5.1 버전과 PowerShell 7.x 버전의 차이점 및 변경점에 대해서 알아보았다. 7.x 버전으로 마이그레이션을 결정한 5.1 버전 사용자들은 위와 같은 사항을 숙지하여 초기 설정 시 불필요한 시간이 소모되는 상황을 최소화해야 한다. 특히 두 버전을 혼용하여 사용할 계획이라면, $Profile 경로 및 $env:PSModulePath 의 차이점을 충분히 숙지하여 업무환경 설정에 잘 적용할 수 있도록 하자.