[ IT 인프라 – 자동화 & 스크립트 ] 이벤트 뷰어에 사용자 지정 이벤트 ID 발생시키기 3부: 스크립트 EXE 파일 변환 가이드 (PS2EXE)

지난 2부에서는 PowerShell을 활용해 1000번 이벤트 ID 제한을 우회하고, 15004 같은 고유 로그를 자유롭게 기록하는 방법을 다루었습니다. 이번 마지막 3부에서는 완성된 .ps1 스크립트를 보안과 배포 편의성을 위해 독립적인 실행 파일(.exe)로 패키징하는 방법을 완벽하게 정리해 보겠습니다.

📝 핵심 내용 요약

  • PS2EXE 모듈을 사용하면 PowerShell 스크립트를 클릭 한 번으로 실행 가능한 .exe 파일로 쉽게 변환할 수 있습니다.
  • 관리자 권한 자동 요구(-requireAdmin), 콘솔 창 숨기기(-noConsole) 등 실무 배포에 필수적인 컴파일 옵션을 제공합니다.
  • [중요] 변환된 EXE 파일은 백신(Windows Defender 등)에서 오탐(False Positive)을 발생시킬 수 있는 태생적 한계가 있으므로 예외 처리 방안을 인지해야 합니다.

1. 왜 PowerShell 스크립트를 .exe로 변환해야 할까?

인프라 환경에서 완성된 모니터링 스크립트를 다른 담당자에게 전달하거나 서버에 배포할 때, 원시 파일(.ps1) 형태를 그대로 유지하면 다음과 같은 치명적인 실무적 문제가 발생합니다.

  1. 실행 정책(Execution Policy) 제한: 기본적으로 Windows Server는 보안상 스크립트 실행을 차단(Restricted)합니다. .exe로 변환하면 이러한 정책을 우회하여 더블클릭만으로 즉시 실행할 수 있습니다.
  2. 코드 훼손 및 휴먼 에러 방지: 관리자가 실수로 스크립트 내용을 수정하여 장애가 발생하는 것을 원천 차단합니다.
  3. UX 및 배포 편의성: 아이콘이 적용된 하나의 실행 파일로 패키징되므로, 작업 스케줄러 등록이나 타 부서 배포가 압도적으로 간편해집니다.

2. PS2EXE 모듈 설치 및 기본 옵션 분석

PowerShell 환경에서 스크립트를 EXE로 변환하는 가장 대중적이고 강력한 도구는 PS2EXE 모듈입니다. Microsoft의 공식 PowerShell 갤러리(PSGallery)에서 제공되므로 명령어 한 줄로 간단히 설치하고 관리할 수 있습니다.

(1) PS2EXE 모듈 설치 및 검증

관리자 권한으로 PowerShell을 실행한 뒤 아래 명령어를 입력하여 모듈을 설치합니다.

PowerShell

# PS2EXE 모듈 설치 (NuGet 제공자 설치 프롬프트가 뜨면 'Y' 입력)
Install-Module -Name ps2exe -Force

💡팁: 모듈 정상 설치 완벽 검증하기

설치 명령어를 입력했다고 끝이 아닙니다. 실무 엔지니어라면 다음 단계로 넘어가기 전, 시스템에 모듈이 정상적으로 로드되었는지 확인해야 합니다.

PowerShell

# 방법 A. 모듈 리스트 확인 (버전 및 경로 출력)
Get-Module -ListAvailable -Name ps2exe

# 방법 B. 실행 커맨드 활성화 확인

# 1. 시스템의 스크립트 실행 권한을 허용 (보안 차단 해제)
Set-ExecutionPolicy RemoteSigned -Force

# 2. 설치된 ps2exe 모듈을 현재 세션(창)으로 강제로 불러오기
Import-Module ps2exe

# 3. 명령어 정상 활성화 최종 검증
Get-Command Invoke-PS2EXE

명령어 입력 후 붉은색 에러 없이 버전 정보와 모듈 이름이 깔끔하게 출력된다면 컴파일 준비가 완벽히 끝난 것입니다.

(2) PS2EXE 모듈 삭제 (Clean-up)

테스트가 모두 끝났거나, 배포 서버를 초기화해야 할 때 기존에 설치한 모듈을 깔끔하게 지우고 싶다면 아래 명령어를 사용합니다.

PowerShell

# 시스템에 설치된 PS2EXE 모듈 제거
Uninstall-Module -Name ps2exe

⚠️ 주의사항 (삭제 모듈 충돌): 만약 해당 모듈을 현재 열려있는 PowerShell 창에서 이미 로드해서 사용 중이었다면 삭제가 거부될 수 있습니다. 이때는 열려있는 창을 모두 닫고, 새로운 관리자 권한 PowerShell 창을 띄워서 명령어를 입력하거나 -Force 옵션을 붙여 강제로 삭제해야 합니다. 삭제 후 다시 Get-Module 검증 명령어를 입력했을 때 아무것도 출력되지 않으면 완벽하게 제거된 것입니다.

(3) 컴파일 주요 파라미터 분석

모듈 준비가 완료되었다면, 스크립트를 입맛에 맞게 패키징하기 위한 주요 옵션들을 숙지해야 합니다.

파라미터기능 설명실무 활용 예시
-inputFile변환할 원본 .ps1 파일 경로 (필수)-inputFile .\CustomEvent.ps1
-outputFile생성될 결과물 .exe 파일 경로 (필수)-outputFile .\CustomEvent.exe
-noConsole실행 시 검은색 CMD/PowerShell 창 숨김백그라운드에서 조용히 로그만 남길 때 유용
-requireAdmin(중요) 실행 시 UAC(관리자 권한) 프롬프트 강제 호출이벤트 소스 등록 등 시스템 권한이 필요할 때 필수
-iconFile실행 파일에 적용할 .ico 아이콘 이미지 파일사내 공식 로고 등을 적용하여 신뢰도 향상

💡팁 (권한 상승 설정): 2부에서 이벤트 소스(New-EventLog)를 등록하려면 관리자 권한이 필수라고 강조했었죠? 따라서 이번 컴파일 과정에서는 -requireAdmin 옵션을 반드시 넣어주어야 합니다. 그래야 스크립트를 전달받은 다른 담당자가 귀찮게 우클릭하여 ‘관리자 권한으로 실행’을 누르지 않아도, 더블클릭 한 번에 자동으로 UAC(권한 상승) 창이 뜨면서 안전하게 실행됩니다.

3. 스크립트 EXE 변환 실전

이제 2부에서 작성했던 CustomEvent.ps1 파일을 실제 .exe로 변환해 보겠습니다.

스크립트가 있는 폴더로 이동한 뒤, 아래 명령어를 실행합니다.

PowerShell

# CustomEvent.ps1 스크립트를 관리자 권한을 요구하고 콘솔창이 숨겨진 EXE 파일로 변환
Invoke-ps2exe -inputFile .\CustomEvent.ps1 -outputFile .\CustomEvent.exe -requireAdmin -noConsole

명령어가 성공적으로 실행되면 터미널에 컴파일 성공 메시지가 출력되며, 해당 폴더에 깔끔한 CustomEvent.exe 파일이 생성됩니다. 이제 이 파일 하나만 대상 서버로 복사하면, 클릭 한 번으로 15004번 이벤트가 완벽하게 발생합니다!

4. ⚠️ 주의사항: PS2EXE 방식의 태생적 한계 및 예외 사항

스크립트 배포의 마법 같은 도구지만, 인프라 엔지니어라면 이 도구가 가진 구조적인 한계와 보안 예외 사항을 반드시 파악하고 대비해야 합니다.

  1. 백신(Windows Defender 등)의 오탐(False Positive): PS2EXE는 C++ 같은 언어로 코드를 완벽하게 기계어로 번역하는 컴파일러가 아닙니다. 내부에 C# 래퍼(Wrapper)를 두고 원본 스크립트를 Base64 등으로 인코딩하여 감싸놓은 형태입니다. 문제는 해커들이 악성 스크립트를 숨길 때 이 방식을 자주 사용하기 때문에, 상당수의 상용 백신과 Windows Defender가 정상적인 스크립트조차 악성코드(예: Trojan:Win32/Wacatac 등)로 오인하여 삭제해 버립니다.[해결책] 사내망 배포 시 백신 중앙 관리 콘솔(EPP/EDR)에서 해당 파일의 해시값이나 배포 경로를 검사 예외(Exclusion) 처리해 두어야 합니다.
  2. 완벽한 소스 코드 보호 불가 (역어셈블 위험):코드를 암호화하는 것이 아니기 때문에, ILSpy 같은 리버스 엔지니어링 툴을 사용하면 감춰진 .ps1 원본 코드를 그대로 추출할 수 있습니다. 따라서 스크립트 내부에 사내 주요 인프라의 관리자 암호나 중요 API Key를 평문(Hardcoding)으로 절대 기재해서는 안 됩니다.

[1] 백신의 오탐 방지를 위해 실시간 보호 기능을 끄고 작업을 하는게 좋습니다.

5. 마무리

지금까지 1부의 eventcreate 한계를 넘어, 2부의 강력한 PowerShell 스크립팅, 그리고 이번 3부의 .exe 패키징까지 시스템 운영 효율을 극대화하는 ‘사용자 지정 이벤트 발생 3부작 시리즈’를 모두 마무리했습니다.

이 연재 글이 모니터링 환경을 구축하고 트러블슈팅을 진행하는 수많은 엔지니어 분들의 실무에 든든한 무기가 되기를 바랍니다. 궁금한 점은 언제든 댓글로 남겨주세요. 감사합니다!

답글 남기기

Your email address will not be published. Required fields are marked *.

*
*