파워쉘 스크립트가 실행되지 않는 원인은 실행 정책의 기본값이 허용하지 않기 때문이다. Get-ExecutionPolicy -List로 정책 상태를 확인하고, Set-ExecutionPolicy Unrestricted -Scope Process 명령으로 스크립트 파일의 실행을 허용하는 방법을 알아본다.
실행되지 않는 파워쉘 스크립트 파일
열심히 삽질해 가면서 파워쉘 스크립트를 만들었거나, 엄청 대단한 스크립트 파일을 구했다고 치자. 이제 더 이상의 반복 작업과 노가다는 없다!라고 외치며 스크립트를 실행하려고 하면, 실행되지 않고 이런 에러를 내뱉을 때가 있다.
PS C:\EQMaker> .\엄청 대단한 스크립트.ps1
.\엄청 대단한 스크립트.ps1 : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\EQMaker\엄청 대단한 스크립트.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오.
위치 줄:1 문자:1
+ .\엄청 대단한 스크립트.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : 보안 오류: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
PS C:\EQMaker>
한마디로, 니가 뭔데 이걸 돌려? 택도 없는 소리 하지 마!라는 소리가 되겠다. 이 버르장머리 없는 컴퓨터 놈이 주인 얼굴도 못 알아보고 일 안 하겠다고 뻐팅기고 있는 거다. 어떻게 해야 이놈의 버르장머리를 고쳐 놓을 수 있을까?
정책과 권한의 차이
일단 스크립트가 실행되지 않는 이유는 간단하다. 별도의 실행 정책을 설정하지 않으면 Restricted 정책이 적용되어 스크립트 파일의 실행을 허용하지 않기 때문이다.
여기서 설정이라는 표현이 나오는데, 흔히 이런 경우에는 실행 권한이 없다라고 표현하곤 한다. 실행되지 않는다는 관점에서는 설정이나 권한이나 똑같은 결과지만, 이 둘은 분명히 다른 의미를 가진다.
윈도우에서 말하는 권한은 작업을 수행할 수 있는 허가를 뜻한다. 반면 실행 정책은 사용자의 권한과는 별개로 스크립트를 어떤 조건과 범위에서 실행할 수 있는지 통제한다. 한마디로 힘을 못 쓰는 것과 힘을 안 쓰는 것의 차이란 것이다.
파워쉘은 시스템의 내밀한 부분까지 스크립트로 한 번에 건드릴 수 있다. 잘 사용하면 편리하지만 까딱 잘못했다가는 시스템 말아먹기 딱 좋다. 이 때문에 어떤 조건에서 스크립트를 실행할 수 있는지 통제하는 실행 정책이 마련되어 있으며, 윈도우 클라이언트에서는 별도의 정책이 없으면 기본적으로 스크립트 실행을 허용하지 않는 상태가 된다.
Get-ExecutionPolicy: 파워쉘 스크립트 실행 정책 확인
실행 정책을 변경하기 전, 현재의 정책을 확인해 보기 위해 Get-ExecutionPolicy -List 명령을 실행해 본다.
PS C:\EQMaker> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
PS C:\EQMaker>
Scope: 정책의 적용 범위
Scope는 실행 정책이 적용되는 범위를 의미한다. 실행 정책의 저장 방식은 범위와 파워쉘 버전에 따라 다르다. Windows PowerShell 5.1은 주로 레지스트리에 저장하지만, PowerShell 7은 CurrentUser와 LocalMachine 정책을 powershell.config.json 파일에 저장한다. Windows PowerShell 5.1의 powershell.exe에서 변경한 정책은 PowerShell 7의 pwsh.exe에 적용되지 않으며, 그 반대도 마찬가지이다.
| Scope | 적용 범위 | Windows PowerShell 5.1 | PowerShell 7 |
|---|---|---|---|
MachinePolicy |
그룹 정책으로 지정된 컴퓨터의 모든 사용자 | HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell |
HKLM:\SOFTWARE\Policies\Microsoft\PowerShellCore |
UserPolicy |
그룹 정책으로 지정된 현재 사용자 | HKCU:\SOFTWARE\Policies\Microsoft\Windows\PowerShell |
HKCU:\SOFTWARE\Policies\Microsoft\PowerShellCore |
Process |
현재 열려 있는 파워쉘 세션 | $Env:PSExecutionPolicyPreference 환경 변수에 임시 저장 |
|
CurrentUser |
현재 사용자 | HKCU:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell |
사용자 구성 디렉토리의 powershell.config.json |
LocalMachine |
컴퓨터의 모든 사용자 | HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell |
$PSHOME\powershell.config.json |
ExecutionPolicy: 적용할 정책
각 범위에 현재 설정된 ExecutionPolicy가 표시되는데, 각 정책은 다음과 같이 동작한다.
AllSigned- 로컬에서 작성한 파일을 포함하여 신뢰할 수 있는 게시자의 서명이 있는 스크립트만 실행할 수 있다.
Bypass- 스크립트를 차단하지 않으며 경고나 확인 메시지도 표시하지 않는다.
Default- 사용 중인 파워쉘 버전과 윈도우 환경에 지정된 기본 실행 정책을 적용한다.
RemoteSigned- 로컬 컴퓨터에서 작성한 스크립트는 실행할 수 있으며, 외부에서 가져온 스크립트는 신뢰할 수 있는 게시자가 서명한 경우에 실행할 수 있다.
Restricted- 파워쉘의 개별 명령은 사용할 수 있지만 스크립트 파일은 실행할 수 없다.
Undefined- 해당 범위에 실행 정책이 정의되어 있지 않다. 다음 우선순위에 있는 범위의 정책을 따르며, 모든 범위가
Undefined이면 운영체제의 기본 유효 정책이 적용된다. Unrestricted- 서명되지 않은 스크립트를 포함하여 모든 스크립트를 실행할 수 있다.
즉, 위의 예처럼 모든 범위가 Undefined인 것은 어느 범위에도 실행 정책이 명시적으로 정의되어 있지 않다는 뜻이다. Windows 클라이언트에서는 이때 Restricted가 유효 실행 정책으로 적용되므로 스크립트 파일을 실행할 수 없다. 사용자 입장에서는 실행 권한이 없는 상태이지만, 정확하게는 권한이 정의되지 않은 것이 아니라 실행 정책이 스크립트 실행을 허용하지 않는 상태이다.
다만 Windows Server에서는 모든 범위가 Undefined일 때 RemoteSigned가 유효 실행 정책으로 적용된다.
Set-ExecutionPolicy: 파워쉘 스크립트 실행 정책 설정
실행 정책이 막혀 있는 것을 확인했으니, 이제는 정책을 풀어 주어야 한다. Get이 있다면 Set이 있다. 실행 정책을 변경하는 명령은 Set-ExecutionPolicy이다. 아래와 같이 입력해 보자.
현재 파워쉘 프로세스(Process)에 한하여 스크립트 실행 정책을 Unrestricted로 변경하겠다는 명령이다. 명령을 실행하면 아래와 같이 실제로 정책을 변경할 것인지 묻는 메시지가 표시된다. Y를 입력하면 해당 정책이 적용된다.
실행 규칙 변경 실행 정책은 신뢰하지 않는 스크립트로부터 사용자를 보호합니다. 실행 정책을 변경하면 about_Execution_Policies 도움말 항목(https://go.microsoft.com/fwlink/?LinkID=135170)에 설명된 보안 위험에 노출될 수 있습니다. 실행 정책을 변경하시겠습니까? [Y] 예(Y) [A] 모두 예(A) [N] 아니요(N) [L] 모두 아니요(L) [S] 일시 중단(S) [?] 도움말 (기본값은 "N"): Y PS C:\EQMaker>
이렇게 하면 현재 열려 있는 파워쉘 세션에서 스크립트를 실행할 수 있게 된다. 이제 컴퓨터의 버르장머리를 고쳐 놨으니, 스크립트를 사용해 열심히 일하도록 시켜 보자.
Process 범위에 적용한 정책은 레지스트리나 구성 파일에 저장되지 않는다. 현재 파워쉘 창을 닫으면 설정이 사라지고 기존 실행 정책으로 자동 복귀하므로, 작업이 끝난 뒤 정책을 별도로 되돌릴 필요도 없다.
단, MachinePolicy나 UserPolicy에 그룹 정책이 적용되어 있다면 해당 정책이 우선한다. 이 경우에는 Process 범위를 변경하더라도 스크립트 실행 제한이 풀리지 않을 수 있다.
끝으로
파워쉘 스크립트는 윈도우 시스템의 각종 설정과 작업을 한 번에 처리할 수 있는 막강한 기능을 가지고 있다. 이 때문에 파워쉘 스크립트의 실행 정책을 아무렇게나 풀어 놓았다가는 무슨 일을 어떻게 당할지 모른다. 보안의 기본은 필요한 것만 허용하는 것이다. 귀찮더라도 적절한 정책을 수립해서 사용하고, 꼭 필요한 범위와 시간 동안에만 스크립트 실행을 허용하는 것이 정신 건강에 여러모로 도움이 된다.
같은 이유로 본 필자는 Process 단위의 정책을 사용할 것을 권장하는 바이다. 이 정책은 일회성 정책으로 현재 열려 있는 파워쉘 세션에 한해서만 적용된다. 파워쉘 창을 닫으면 설정이 사라지고 기존 실행 정책이 다시 적용된다.
항상 스크립트를 실행해야 하는 상황이 아니라면 귀찮더라도 사용할 때마다 정책을 변경해 주는 것이 시스템을 지키는 데 도움이 된다. 매번 명령을 입력하는 수고가 조금 들더라도, 언제 바꿨는지 기억조차 나지 않는 실행 정책을 계속 열어 두는 것보다는 훨씬 낫다.
관련한 추가 정보는 마이크로소프트의 PowerShell 실행 정책 관련 문서를 참고하기 바란다.
FAQ
- 파워쉘에서 스크립트 파일을 실행할 수 없는 이유는?
- 현재 적용된 실행 정책이 스크립트 실행을 허용하지 않기 때문이다. Windows 클라이언트에서 모든 범위의 정책이
Undefined이면Restricted가 유효 정책으로 적용되어 개별 명령은 사용할 수 있지만 스크립트 파일은 실행할 수 없다. - 파워쉘의 실행 권한과 실행 정책은 어떻게 다른가?
- 실행 권한은 사용자가 어떤 작업을 수행할 수 있는 허가를 의미한다. 실행 정책은 사용자의 권한과 별개로 스크립트를 어떤 조건과 범위에서 실행할 수 있는지 통제하는 설정이다.
- 현재 파워쉘 실행 정책을 확인하는 방법은?
Get-ExecutionPolicy -List를 실행하면 모든 범위의 실행 정책을 우선순위에 따라 확인할 수 있다. 매개변수 없이Get-ExecutionPolicy만 실행하면 현재 세션에 최종적으로 적용된 유효 정책 하나만 표시된다.- 모든 실행 정책이
Undefined이면 스크립트를 실행할 수 있는가? - Windows 클라이언트에서는 실행할 수 없다. 모든 범위가
Undefined이면Restricted가 유효 정책으로 적용되기 때문이다. 다만 Windows Server에서는 이때RemoteSigned가 적용된다. - 현재 파워쉘 세션에서만 스크립트 실행을 허용하는 방법은?
Set-ExecutionPolicy Unrestricted -Scope Process를 실행한다. 이 설정은 현재 파워쉘 프로세스에만 적용되며, 파워쉘 창을 닫으면 사라진다.Process와CurrentUser범위의 차이는?Process는 현재 파워쉘 세션에만 적용되는 일회성 범위이다.CurrentUser는 현재 사용자에게 계속 적용되며, 다시 변경하거나 제거할 때까지 설정이 유지된다.- 실행 정책을 변경하려면 관리자 권한이 필요한가?
Process와CurrentUser범위는 일반적으로 관리자 권한 없이 변경할 수 있다. 컴퓨터의 모든 사용자에게 적용되는LocalMachine범위를 변경하려면 관리자 권한으로 파워쉘을 실행해야 한다.Set-ExecutionPolicy를 실행했는데도 정책이 바뀌지 않는 이유는?MachinePolicy나UserPolicy에 그룹 정책이 적용되어 있을 수 있다. 그룹 정책은Process,CurrentUser,LocalMachine범위보다 우선하므로 로컬에서 정책을 변경해도 유효 실행 정책은 바뀌지 않을 수 있다.- 파워쉘 창을 닫으면
Process실행 정책은 어떻게 되는가? Process범위의 실행 정책은 현재 세션의 환경 변수에만 임시 저장된다. 파워쉘 창을 닫으면 설정이 삭제되고 기존 범위에 설정된 실행 정책이 다시 적용된다.Unrestricted실행 정책을 계속 사용해도 되는가?- 꼭 필요한 경우에만 사용하는 것이 좋다. 출처와 내용을 확인하지 않은 스크립트를 실행하면 시스템 설정이나 파일이 손상될 수 있으므로, 본 글에서는 현재 세션에만 적용되는
Process범위에서 사용할 것을 권장한다.
갱신 내역
- — 최초 게시
- — 수정
- — 실행 정책 설명과 FAQ 개정