작업 스케줄러에서 PowerShell 실행 정책 오류가 날 때: Bypass가 해결하는 범위
작업 스케줄러에서만 PowerShell 스크립트가 실행 정책 오류로 멈춘다면, 먼저 -ExecutionPolicy Bypass를 무작정 붙이기보다 그 옵션이 바꾸는 범위부터 확인하는 편이 낫습니다.
이 옵션은 해당 PowerShell 프로세스에만 적용됩니다. 컴퓨터 전체 정책을 바꾸지 않으며, 그룹 정책이 잡고 있으면 그것도 이기지 못합니다. 경로·권한·시작 위치 오류까지 해결해 주는 마법 주문도 아닙니다. 이름이 꽤 과장됐습니다.
먼저: 실행 정책이 정말 원인인지 확인
관리자 PowerShell이 아니라, 문제가 나는 계정의 일반 PowerShell에서 아래 명령을 실행합니다.
Get-ExecutionPolicy -List | Format-Table -AutoSize
MachinePolicy 또는 UserPolicy에 값이 있으면 조직의 그룹 정책이 우선입니다. 이 경우 작업의 인수에 -ExecutionPolicy Bypass를 더해도 정책을 바꾸지 못할 수 있습니다. 반대로 두 값이 Undefined이고 LocalMachine이나 CurrentUser만 영향을 준다면, 작업 하나에 한정한 프로세스 수준 옵션을 검토할 수 있습니다.
작업 하나에만 적용하는 가장 작은 설정
작업 스케줄러의 동작(Action)에서 프로그램과 인수를 분리합니다. .ps1 파일을 ‘프로그램/스크립트’ 칸에 직접 넣지 않는 것이 포인트입니다.
| 항목 | 값 예시 |
|---|---|
| 프로그램/스크립트 | C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe |
| 인수 추가 | -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\daily-report.ps1" |
| 시작 위치 | C:\Scripts |
-ExecutionPolicy Bypass는 위 실행 한 번에만 영향을 주고, Set-ExecutionPolicy처럼 레지스트리의 사용자·컴퓨터 범위 설정을 바꾸지 않습니다. 그래서 기존 정책을 전역으로 느슨하게 만드는 것보다 되돌리기 쉽습니다.
PowerShell 7을 쓴다면 실행 파일도 따로 지정
powershell.exe는 Windows PowerShell 5.1입니다. PowerShell 7 문법이나 모듈을 전제로 만든 스크립트라면 작업의 프로그램 칸에 설치된 pwsh.exe의 전체 경로를 넣어야 합니다. 같은 이름의 스크립트라도 어느 엔진으로 실행했는지가 결과를 바꿉니다.
# 점검용: 지금 콘솔의 각 범위 정책을 확인한다.
Get-ExecutionPolicy -List | Format-Table -AutoSize
# 작업 스케줄러 인수 예시(한 줄)
-NoProfile -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\daily-report.ps1"
붙였는데도 실패하면 이 순서로 봅니다
- 그룹 정책:
MachinePolicy·UserPolicy값부터 확인합니다. - 실행 파일: 5.1용
powershell.exe와 7용pwsh.exe를 섞지 않았는지 봅니다. - 시작 위치: 상대 경로를 쓴 스크립트라면 ‘시작 위치’를 지정하거나 스크립트 안에서 기준 경로를 명시합니다.
- 작업 계정 권한: 직접 실행할 때의 계정과 작업이 실행되는 계정은 다를 수 있습니다. 네트워크 드라이브 문자도 특히 다릅니다.
실행 정책 오류가 아니라 ‘파일을 찾을 수 없음’이나 ‘액세스 거부’라면 Bypass를 늘려도 아무 일도 일어나지 않습니다. 그때는 정책을 건드리지 말고 경로와 계정을 먼저 봐야 합니다.
정리
작업 하나가 실행 정책에 막힐 때는 전역 Set-ExecutionPolicy보다 해당 작업의 -ExecutionPolicy Bypass가 작고 되돌리기 쉬운 선택입니다. 다만 그룹 정책에는 우선순위가 있고, 작업 스케줄러 오류의 상당수는 실행 정책이 아니라 경로·시작 위치·계정 문제입니다. 여기부터 분리하면 로그가 조금 덜 난해해집니다.
참고: Microsoft Learn — about_Execution_Policies, Set-ExecutionPolicy, New-ScheduledTaskAction.
