← 블로그 목록
윈도우작성 · 7분 읽기

'이 시스템에서 스크립트를 실행할 수 없으므로' PowerShell 오류 — 뜻과 안전하게 푸는 법 (윈도우 11 실측)

.ps1 파일을 더블클릭하면 메모장이 열리고, PowerShell 에서 실행하면 about_Execution_Policies 로 끝나는 빨간 글자가 나옵니다. 내 스크립트가 아니어도 PowerShell 에서 npm 을 치면 똑같이 막히기도 합니다. 원인은 PowerShell 의 실행 정책인데, 사람들이 섞어 쓰는 서로 다른 오류가 두 가지 있습니다. 윈도우 11·Windows PowerShell 5.1 에서 두 오류를 모두 재현하고, 해결법마다 실제로 무엇이 바뀌는지 확인했습니다. 안전 검사를 아예 꺼 버리지 않는 방법만 골랐습니다.

두 가지 오류, 문구 그대로

한 줄짜리 시험 스크립트 hello.ps1 을 만들어 윈도우 11 의 Windows PowerShell 5.1(빌드 26100.9711)에서 정책을 바꿔 가며 실행했습니다. 그 창의 정책을 Restricted 로 두자 다음과 같이 거부했습니다(종료 코드 1).

text
.\hello.ps1 : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\...\hello.ps1 파일을 로드할 수 없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오.
    + CategoryInfo          : 보안 오류: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

같은 스크립트를 복사해 브라우저가 내려받은 파일에 붙이는 Zone.Identifier 표시(ZoneId=3, 인터넷 영역)를 달고 RemoteSigned 에서 실행하자 문구가 달라졌습니다.

text
C:\...\downloaded.ps1 파일을 로드할 수 없습니다. C:\...\downloaded.ps1 파일이 디지털 서명되지 않았습니다. 현재 시스템에서 이 스크립트를 실행할 수 없습니다. 스크립트 실행 및 실행 정책 설정에 대한 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시오.
어떤 문구가 나왔는지 보면 무엇이 막았는지 알 수 있다
💡

영어 윈도우에서는 같은 오류가 'cannot be loaded because running scripts is disabled on this system' 으로 나옵니다. 영어 문구 속 주소는 실제로 https:/go.microsoft.com 처럼 빗금이 하나만 찍혀 나왔습니다 — 어느 쪽이든 마이크로소프트 about_Execution_Policies 문서로 가는 주소입니다.

실행 정책이란 (그리고 아닌 것)

마이크로소프트 about_Execution_Policies 문서는 실행 정책을 PowerShell 이 구성 파일을 로드하고 스크립트를 실행하는 조건을 제어하는 안전 기능이라고 설명합니다. 바꾸기 전에 알아 둘 내용은 두 가지입니다.

  • Restricted 는 윈도우 클라이언트 컴퓨터의 기본값, RemoteSigned 는 윈도우 서버의 기본값입니다. Restricted 는 명령 한 줄씩은 되지만 스크립트는 전부 막습니다.
  • 문서는 실행 정책이 '보안 경계가 아니라 심층 방어'이고, 사용자가 의도치 않게 스크립트를 실행하지 않게 돕는 장치라고 적습니다. 정책이 무엇이든 인터넷에서 받은 스크립트는 '이제 실행할 프로그램'으로 보고 내용을 먼저 확인하세요.

정책은 다섯 범위에 따로 둘 수 있고 더 좁은 쪽이 이깁니다 — 그룹 정책(MachinePolicy·UserPolicy), 그다음 Process(이 창만), CurrentUser, LocalMachine 순입니다. 전부 보려면 다음 명령을 씁니다.

powershell
Get-ExecutionPolicy -List

시험한 PC 는 LocalMachine RemoteSigned, 나머지는 모두 Undefined 였습니다. 출고 기본값(Restricted)이 아니라 예전에 무언가가 컴퓨터 전체를 RemoteSigned 로 바꿔 둔 상태였습니다. 그래서 이 PC 의 설정은 건드리지 않고, 시험할 때만 창마다 Restricted 를 지정했습니다.

방법 1: 이번 한 번만 실행 — 아무것도 안 바뀜

믿을 수 있는 스크립트를 지금 한 번만 돌리면 되는 경우, 그 파일만 다른 정책으로 실행합니다.

powershell
powershell -ExecutionPolicy Bypass -File .\파일.ps1

'인터넷에서 받음' 표시를 단 시험 스크립트도 이 방법으로 실행됐습니다. 그 뒤 새 PowerShell 창을 열어 보니 여전히 Process Undefined·LocalMachine RemoteSigned 로, 레지스트리에는 아무것도 쓰이지 않았습니다. 이미 연 창 안에서는 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force 가 그 창에만 같은 효과를 냅니다. 마이크로소프트 문서에 따르면 이 값은 $Env:PSExecutionPolicyPreference 환경 변수에만 저장되고 창을 닫으면 사라집니다.

⚠️

자식 프로세스에 그대로 넘어갑니다. 첫 시험을 Bypass 로 띄운 PowerShell 안에서 돌렸더니 '받은 파일' 스크립트가 아무 오류 없이 실행됐습니다 — 안에서 연 powershell.exe 가 부모의 Bypass 를 물려받은 것입니다. 어떤 창에선 되고 어떤 창에선 안 되면, 그 창을 무엇이 어떻게 띄웠는지 보세요.

방법 2: 내 스크립트는 계속 허용 — 내 계정만 RemoteSigned

스크립트를 자주 쓴다면 마이크로소프트 문서에 나오는 설정은 현재 사용자 범위의 RemoteSigned 입니다.

powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

같은 문서에 따르면 이 값은 HKCU(내 계정)에 저장되고 바로 적용되며, 관리자 권한이 필요한 건 LocalMachine 범위뿐입니다. RemoteSigned 에서는 내 PC 에서 만든 스크립트는 실행되고, 인터넷에서 받은 스크립트는 서명이 있어야 합니다(또는 차단 해제). 이 글을 쓰며 PC 의 설정 자체는 바꾸지 않았고, 위 RemoteSigned 동작은 PC 에 이미 있던 정책으로 확인한 것입니다.

피할 것 두 가지: Unrestricted·Bypass 를 영구로 두는 것(더 이상 아무것도 검사하지 않음), CurrentUser 로 충분한데 LocalMachine 을 바꾸는 것. 회사·학교 PC 처럼 그룹 정책이 정해 둔 경우 Get-ExecutionPolicy -List 의 MachinePolicy·UserPolicy 에 값이 보이고, 내가 바꿔도 적용되지 않습니다 — 관리자에게 물어야 합니다.

한 번만 Bypass 와 내 계정 RemoteSigned

방법 3: '디지털 서명되지 않았습니다' — 그 파일만 차단 해제

정책은 이미 RemoteSigned 인데 받은 스크립트만 막힌다면 정책을 바꿀 필요가 없습니다. 스크립트 내용을 먼저 읽어 본 뒤 '인터넷에서 받음' 표시만 지웁니다.

powershell
Unblock-File -Path .\파일.ps1

시험 파일에서 Get-Item .\downloaded.ps1 -Stream * 결과가 전에는 :$DATA·Zone.Identifier, 뒤에는 :$DATA 하나뿐이었고, 그다음 RemoteSigned 에서 종료 코드 0 으로 실행됐습니다. 마이크로소프트는 curl.exe·Invoke-WebRequest·Invoke-RestMethod 로 받은 파일엔 이 표시가 아예 안 붙을 수 있다고도 적습니다 — '실행됐다'가 '안전하다'는 뜻은 아닙니다.

npm 이 막힐 때: npm.ps1 파일을 로드할 수 없습니다

Node.js 는 C:\Program Files\nodejs 에 npm 실행 파일을 세 가지(npm·npm.cmd·npm.ps1) 둡니다. 이 PC(Node v24.13.0)의 PowerShell 에서 Get-Command npm 은 npm.ps1 을 가리켰고, 그래서 Restricted 에서 npm -v 가 'npm : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Program Files\nodejs\npm.ps1 파일을 로드할 수 없습니다'로 실패했습니다.

같은 Restricted 창에서 npm.cmd -v 는 11.6.2 를 출력했습니다. .cmd 는 PowerShell 스크립트가 아니기 때문입니다. 급하면 npm.cmd(npx.cmd)로 쓰고, 계속 쓸 거라면 방법 2처럼 내 계정을 RemoteSigned 로 두면 npm.ps1 도 실행됩니다.

같은 문제처럼 보이는 다른 경우

보이는 증상원인 (이 PC 에서 확인)할 일
.ps1 을 더블클릭하면 메모장이 열림.ps1 파일 형식이 메모장으로 열리게 연결돼 있음오른쪽 클릭 → Run with PowerShell(이 PC 에선 메뉴 이름이 영어), 또는 PowerShell 창에서 실행
'hello.ps1' 용어가 cmdlet … 으로 인식되지 않습니다앞에 .\ 없이 이름만 입력 — 현재 폴더의 스크립트는 이름만으로 실행되지 않음.\hello.ps1 로 입력
창이 잠깐 떴다가 바로 닫힘이 PC 의 Run with PowerShell 명령은 powershell.exe -file "%1" — -NoExit 가 없음열어 둔 PowerShell 창에서 실행해 출력 확인
어떤 창에선 되고 어떤 창에선 안 됨Process 범위 정책(부모 창에서 물려받음)이 다름두 창에서 Get-ExecutionPolicy -List 비교

이 빌드의 Run with PowerShell 명령에는 -ExecutionPolicy 가 붙어 있지 않아 다른 실행과 같은 정책을 따릅니다. PowerShell 7(pwsh)은 이 PC 에 설치돼 있지 않아 시험하지 않았습니다.

자주 묻는 질문

Q. Set-ExecutionPolicy Unrestricted 로 바꿔도 괜찮나요?

그 계정·컴퓨터의 모든 스크립트(받은 것 포함) 검사를 사실상 없앱니다(Unrestricted 는 경고만 함). 마이크로소프트 문서상 RemoteSigned 가 '내가 만든 건 실행, 받은 건 서명 필요'라 보통은 이걸로 충분합니다. 한 번만 필요하면 영구 변경 대신 Bypass 로 실행하세요.

Q. 관리자 권한으로 PowerShell 을 열어야 하나요?

-Scope CurrentUser 나 -Scope Process 는 필요 없습니다. 마이크로소프트 문서에 따르면 LocalMachine 범위를 바꿀 때만 관리자 권한이 필요합니다.

Q. 정책을 바꿨는데도 여전히 스크립트를 실행할 수 없다고 나옵니다.

Get-ExecutionPolicy -List 를 보세요. MachinePolicy·UserPolicy 에 값이 있으면 그룹 정책이 내 설정을 덮고, 그 창에 Process 값이 있으면 그것이 CurrentUser 보다 우선합니다.

Q. 명령 프롬프트에서는 npm 이 되는데 PowerShell 에서는 왜 안 되나요?

cmd 는 npm.cmd 를 실행하고 이건 실행 정책과 상관이 없습니다. PowerShell 은 npm.ps1 을 먼저 고르는데 이건 실행 정책을 따릅니다. 이 PC 에서 Restricted 상태에서도 PowerShell 에 npm.cmd 라고 치면 실행됐습니다.

댓글 0

아직 댓글이 없습니다. 첫 댓글을 남겨 주세요.

댓글은 회원만 쓸 수 있습니다.

광고·욕설·비방·개인정보·불법 내용이 담긴 댓글은 숨기거나 지웁니다. 광고·홍보 글이나 혐오·비방 글을 올린 회원은 강제 탈퇴되고 쓴 글이 모두 지워집니다. 댓글은 닉네임과 함께 공개됩니다. 개인정보처리방침

다른 글