VBScript 폐지에 대비하는 VBA·사내 도구 점검 가이드
· 小村 豪 · VBScript, VBA, Excel, PowerShell, Office, Windows, 기존 자산 활용
요약
2026년 4월 시점에서 Microsoft는 VBScript를 단계적으로 폐지하는 방침을 공개했으며, Windows 11 버전 24H2에서는 먼저 Feature on Demand로 기본 활성화되고, 다음 단계에서는 기본 비활성화되며, 최종 단계에서는 향후 Windows 릴리스에서 삭제할 계획을 밝히고 있습니다. 즉, 지금 정말로 해야 할 일은 ‘전면 재작성’보다 먼저 ‘어디가 VBScript에 의존하고 있는지 가시화하는 것’입니다.
VBA·Excel 매크로의 현실적인 논점은 크게 두 가지입니다. 하나는 .vbs를 외부에서 실행하는 경우이고, 다른 하나는 VBScript.RegExp 같은 VBScript형 라이브러리 참조입니다. 후자에 대해서는 Office 버전 2508(Build 19127.20154) 이후 RegExp 클래스가 VBE에 표준으로 탑재되어, 적어도 RegExp 의존의 일부는 이행하기 쉬워졌습니다. 한편, 예전 Office 클라이언트가 남아 있는 혼재 환경에서는 같은 VBA라도 동작하는 단말과 동작하지 않는 단말이 발생하기 쉬워집니다.
이행을 어렵게 만드는 것은 VBScript 자체보다 ‘주변 운용’입니다. 예를 들어 Excel에서 powershell.exe를 실행하도록 치환해도, 공격 표면 축소 규칙인 ‘Office 앱의 하위 프로세스 생성 차단’이나 ‘Office 매크로의 Win32 API 호출 차단’, AppLocker, App Control for Business, PowerShell 실행 정책, 서명 운용, MOTW가 붙은 파일의 매크로 제어에 걸리면 운영 환경에서는 동작하지 않습니다. 이행 계획은 코드 변환뿐 아니라 정책과 서명, 로그 감사까지 포함해 설계해야 합니다.
가장 빠른 경로는 재고 조사 → 정적 검출 → 실행 로그 수집 → 대체 기술 선정 → 테스트 → 단계적 전개입니다. 이 글에서는 그 순서로 실무 관점에서 정리합니다.
또한 이 글에 등장하는 코드는 실행·테스트할 수 있는 샘플 세트(PowerShell 감사 스크립트, 치환 샘플, VBA·Office Scripts 참조용 코드, Pester 테스트)로 GitHub에 공개하고 있습니다.
vbscript-deprecation-vba-excel-macro-internal-tools-audit-guide - komurasoft-blog-samples (GitHub)
무엇이 바뀌는지 정리
먼저 짚어야 할 것은, 이번 논점이 ‘VBA가 폐지된다’는 이야기가 아니라는 점입니다. Microsoft가 공개한 것은 어디까지나 VBScript의 단계적 폐지이며, VBA 프로젝트에 대한 영향은 주로 외부 .vbs 실행과 VBScript 계열 라이브러리 참조에 집중됩니다. Microsoft 365 Developer Blog에서도 VBA에서의 .vbs 실행과 VBScript.RegExp 이용이 대표적인 영향 지점으로 정리되어 있습니다.
실무상의 우선순위는 다음 표로 생각하면 판단하기 쉬워집니다.
| 의존 패턴 | 무엇이 일어나는가 | 우선도 |
|---|---|---|
VBA/Excel에서 .vbs를 직접 실행 |
Phase 2 이후에는 단말 구성에 따라 실패, Phase 3에서는 원칙적으로 정지 | 높음 |
VBScript.RegExp 참조 |
Office 2508 미만이 남아 있는 혼재 환경에서 결함이 되기 쉽다 | 높음 |
WScript.Shell / Shell에 의한 외부 프로세스 실행 |
치환 후에도 ASR나 AppLocker에서 막힐 수 있다 | 높음 |
| GPO 로그온/시작/종료 스크립트, Scheduled Task, Intune 배포 스크립트 | OS 업데이트나 정책 전환 시 일제 장애가 되기 쉽다 | 높음 |
| MSI의 VBScript Custom Action | 설치·복구·제거 중 갑자기 실패한다 | 높음 |
이 우선순위는 Windows 측의 VBScript 폐지 계획, 공식 검출 전략, ASR/AppLocker/App Control의 사양을 바탕으로 한 실무적 판단입니다.
RegExp만은 사정이 조금 다릅니다. Office 버전 2508 이후에는 VBE 쪽에 RegExp 클래스가 표준으로 포함되기 때문에, RegExp 용도에 한해서는 ‘VBScript 의존의 일부를 Office 업데이트로 해소할 수 있게’ 되었습니다. 다만 이것이 예전 Office나 업데이트 채널이 느린 환경, 혼재 환경, 오래된 단말 이미지가 남아 있는 조직에서 자동으로 해결되는 이야기는 아닙니다. ‘Office 업데이트’와 ‘Windows의 단계적 전환’ 양쪽을 모두 대장에 넣는 것이 중요합니다.
재고 조사 진행 방법
재고 조사는 파일명 검색만으로는 부족합니다. 최소한 다음 10가지 관점을 사안 단위·도구 단위·업무 단위로 열(칼럼)로 갖추기를 권장합니다.
- ① VBScript 의존 위치의 검출 방법 파일 검색, 코드 분석, 로그 분석을 나누어 기록한다.
- ② VBA 내에서의
CreateObject/GetObject/Execute/ExecuteGlobal등의 이용 의존 대상이 문자열 안에 숨어 있어 정적 검색 누락이 발생하기 쉽다. - ③ Excel 매크로에서의 외부 스크립트 호출
WScript.Shell,Shell함수,wscript.exe/cscript.exe,.vbs/.js/.ps1을 각각 별도로 관리한다. - ④ 사내 배치·도구의 스크립트 의존 Scheduled Task, GPO, Intune, 공유 폴더상의 운용 스크립트, 설치 프로그램을 포함한다.
- ⑤ 보안·권한·서명·정책 AppLocker, App Control for Business, ASR, PowerShell 실행 정책, 디지털 서명, 관리자 권한 필요 여부.
- ⑥ 대체 기술과 이행 비용 비교 VBA 네이티브, PowerShell, .NET/VSTO, Office Scripts, Power Automate로 비교한다.
- ⑦ 테스트 계획 단위, 통합, 사용자 인수, 정책 적용 후 재시험을 나눈다.
- ⑧ 운용 절차와 롤백 무엇을 되돌리면 복구되는지, 어디까지 자동화할지를 명시한다.
- ⑨ 호환성과 성능 Office 버전 차이, 32/64bit, 단말 성능, 로그 수집 부담, 클라우드 플로우의 타임아웃.
- ⑩ 샘플 이행 케이스 스터디 현장 설명에 쓸 수 있는 대표 사례를 하나 만들어 둔다.
이 10개 항목 중에서도 특히 GPO, Scheduled Task, Intune 배포 스크립트, MSI Custom Action, Sysmon/AppLocker/App Control에 의한 탐지는 Microsoft의 공식 가이드에서도 중점 영역으로 명시되어 있습니다.
이행 전체의 흐름은 다음 그림처럼 생각하면 방향을 잃지 않습니다.
flowchart TD
A[자산 재고 조사] --> B{의존 유형}
B -->|외부 .vbs 실행| C[PowerShell 또는 VBA 네이티브로 치환]
B -->|VBScript.RegExp| D[Office 2508+ 내장 RegExp로 정리]
B -->|GPO / 태스크 / MSI| E[중앙 관리 설정과 배포물 수정]
B -->|불명·숨은 의존| F[Sysmon / AppLocker / App Control로 실행 로그 수집]
C --> G[단위 테스트]
D --> G
E --> H[통합 테스트]
F --> H
H --> I[감사 모드로 파일럿 전개]
I --> J[VBScript FOD의 단계적 비활성화]
이 순서를 지키면 ‘일단 재작성했는데 나중에 GPO나 ASR에서 막혔다’는 전형적인 재작업을 상당히 줄일 수 있습니다.
실전 검출과 코드 예시
파일 검색과 구성 정보 파악
Microsoft의 검출 가이드에서는 C:\Users, C:\ProgramData, C:\Scripts 등 용도가 명확한 경로를 우선해서 .vbs를 재귀적으로 검색하고, GPO, Scheduled Task, Intune 배포 스크립트, MSI 패키지도 별도 계통으로 확인하는 것을 권장하고 있습니다. Sysmon의 vbscript.dll 모니터링은 유효하지만, Image Load 모니터링은 로그량과 운용 부담이 크기 때문에 먼저 소규모 파일럿으로 검증해야 합니다.
# 단말·공유 폴더의 스크립트 의존을 대략적으로 훑어본다
$paths = @("C:\Users", "C:\ProgramData", "C:\Scripts")
$patterns = @(
'wscript\.exe',
'cscript\.exe',
'\.vbs(\s|$)',
'VBScript\.RegExp',
'WScript\.Shell',
'CreateObject\("VBScript\.RegExp"\)',
'ExecuteGlobal'
)
$hits = foreach ($path in $paths) {
if (Test-Path $path) {
Get-ChildItem -Path $path -Recurse -File `
-Include *.vbs,*.ps1,*.bat,*.cmd,*.wsf,*.hta,*.txt `
-ErrorAction SilentlyContinue |
Select-String -Pattern $patterns -AllMatches |
Select-Object Path, LineNumber, Line
}
}
$hits | Export-Csv .\vbscript-dependency-hits.csv -NoTypeInformation -Encoding UTF8
다음으로 태스크 스케줄러를 훑어봅니다. 사내 도구는 파일보다 태스크 정의 안에 wscript.exe / cscript.exe / .vbs가 숨어 있는 경우가 많기 때문입니다.
# Scheduled Task에서 VBScript 호출을 추출
Get-ScheduledTask | ForEach-Object {
foreach ($a in $_.Actions) {
if ($a.Execute -match 'wscript|cscript|mshta' -or $a.Arguments -match '\.vbs\b') {
[pscustomobject]@{
TaskName = $_.TaskName
TaskPath = $_.TaskPath
Execute = $a.Execute
Arguments = $a.Arguments
}
}
}
} | Export-Csv .\task-vbscript-dependencies.csv -NoTypeInformation -Encoding UTF8
VBA 코드 분석
VBA 쪽은 참조 설정만 봐서는 불충분합니다. CreateObject나 GetObject는 문자열로 COM을 실행할 수 있으므로, 참조 설정에 아무것도 나타나지 않아도 의존하고 있을 수 있습니다. Microsoft의 VBA/Office 문서에서도 CreateObject는 COM 객체 생성의 기본 수단으로 설명되어 있으며, FileSystemObject나 Scripting.Dictionary도 그 형태로 사용됩니다. 또한 VBA 프로젝트를 프로그램에서 읽으려면 ‘트러스트 센터’의 ‘VBA 프로젝트 개체 모델에 대한 액세스 허용’이 필요합니다.
' 전제:
' - [트러스트 센터]의 "VBA 프로젝트 개체 모델에 대한 액세스 허용"을 활성화
' - 보호된 프로젝트는 별도로 소스 내보내기나 담당자 확인이 필요
Sub ScanProjectForVbScriptRisks()
Dim comp As Object
Dim cm As Object
Dim ws As Worksheet
Dim nextRow As Long
Dim patterns As Variant
Dim p As Variant
Dim i As Long
Dim lineText As String
patterns = Array( _
"CreateObject(""VBScript.RegExp"")", _
"VBScript.RegExp", _
"WScript.Shell", _
"Shell(", _
".vbs", _
"wscript.exe", _
"cscript.exe", _
"ExecuteGlobal", _
"Execute(" _
)
Set ws = ThisWorkbook.Worksheets.Add
ws.Range("A1:D1").Value = Array("Module", "Line", "Pattern", "Code")
nextRow = 2
For Each comp In ThisWorkbook.VBProject.VBComponents
Set cm = comp.CodeModule
For i = 1 To cm.CountOfLines
lineText = cm.Lines(i, 1)
For Each p In patterns
If InStr(1, lineText, CStr(p), vbTextCompare) > 0 Then
ws.Cells(nextRow, 1).Value = comp.Name
ws.Cells(nextRow, 2).Value = i
ws.Cells(nextRow, 3).Value = p
ws.Cells(nextRow, 4).Value = lineText
nextRow = nextRow + 1
End If
Next p
Next i
Next comp
ws.Columns.AutoFit
MsgBox "Scan finished: " & (nextRow - 2) & " hits"
End Sub
이 스캔에서는 CreateObject("VBScript.RegExp"), WScript.Shell, Shell(, .vbs, ExecuteGlobal을 최소한으로 잡아냅니다. 특히 Execute / ExecuteGlobal 같은 문자열 실행은 의존 대상이나 실행 코드가 동적으로 조립되기 때문에 재고 조사 누락의 온상입니다.
로그 분석
실행 로그를 보는 단계에서는 Sysmon + AppLocker/App Control의 조합이 강력합니다. Sysmon에서는 vbscript.dll의 로드를 Event ID 7로 추적할 수 있고, AppLocker는 스크립트/MSI에 대한 허용·감사 이벤트를 이벤트 뷰어에서 확인할 수 있습니다. App Control for Business를 감사 모드로 실행하면, 스크립트와 MSI는 AppLocker\MSI and Script 로그에 기록됩니다.
# Sysmon: vbscript.dll을 로드한 프로세스를 확인
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 2000 |
Where-Object { $_.Id -eq 7 -and $_.Message -match 'vbscript\.dll' } |
Select-Object TimeCreated, MachineName, Message
# AppLocker / App Control: 스크립트·MSI 관련 감사 로그를 확인
Get-WinEvent -LogName "Microsoft-Windows-AppLocker/MSI and Script" -MaxEvents 2000 |
Where-Object { $_.Id -in 8005, 8006 } |
Select-Object TimeCreated, Id, Message
여기서 중요한 것은 ‘동작하고 있다’는 로그뿐 아니라 ‘감사라면 막혔을 것’이라는 로그도 함께 수집하는 것입니다. AppLocker의 감사 이벤트와 App Control의 감사 모드는 운영 환경에서 차단하기 전에 안전을 확인하는 데 적합합니다.
최소 치환 샘플
외부 .vbs를 호출해서 CSV를 출력하는 정도의 처리라면, 먼저 VBA 네이티브로 치환하는 것이 가장 빠릅니다.
Sub ExportCsvNativeVba()
Dim f As Integer
Dim outPath As String
outPath = ThisWorkbook.Path & "\out.csv"
f = FreeFile
Open outPath For Output As #f
Print #f, "Code,Name"
Print #f, "1001,Tokyo"
Print #f, "1002,Osaka"
Close #f
MsgBox "CSV exported: " & outPath
End Sub
Excel에서 외부 처리를 호출해야 하고 OS, 공유 폴더, AD, 설치 프로그램, 로그 수집까지 포함한다면, PowerShell로 옮기는 쪽이 현실적입니다. Microsoft는 VBScript의 대체로 PowerShell을 권장하고 있으며, PowerShell 쪽에는 실행 정책, 서명, Authenticode 검증의 공식 운용 수단이 있습니다. 다만 VBA의 Shell은 기본적으로 비동기이므로, 순서 제어가 필요한 처리는 별도의 흐름 설계나 대기 처리를 생각해야 합니다.
Sub RunModernPs()
Dim cmd As String
cmd = "powershell.exe -NoProfile -File """ & ThisWorkbook.Path & "\Normalize.ps1""" & _
" -InputFile """ & ThisWorkbook.Path & "\in.csv""" & _
" -OutputFile """ & ThisWorkbook.Path & "\out.csv"""
Shell cmd, vbNormalFocus
End Sub
param(
[string]$InputFile,
[string]$OutputFile
)
Import-Csv $InputFile |
Sort-Object Code |
Export-Csv $OutputFile -NoTypeInformation -Encoding UTF8
# 서명 부여와 확인
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert | Select-Object -First 1
Set-AuthenticodeSignature -FilePath .\Normalize.ps1 -Certificate $cert
Get-AuthenticodeSignature -FilePath .\Normalize.ps1
Excel의 처리가 워크북 내부의 정리·집계·변환만으로 완결된다면, Office Scripts도 유력한 선택지입니다. Office Scripts는 Excel용으로, 클라우드 기반·크로스 플랫폼·Power Automate 연계에 적합합니다.
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
const used = sheet.getUsedRange();
used.getFormat().autofitColumns();
const tables = workbook.getTables();
if (tables.length > 0) {
tables[0].getSort().apply([{ key: 0, ascending: true }], true);
}
}
대체 기술 선정
대체 기술은 ‘무엇으로 작성할 수 있는가’가 아니라 어디까지의 책임을 맡길 것인가로 선택해야 합니다. PowerShell은 Windows·파일·태스크·설치 프로그램 쪽, VBA 네이티브는 Office 내부 쪽, Office Scripts는 Excel 워크북 처리 쪽, VSTO/.NET은 두터운 데스크톱 통합 쪽, Power Automate는 오케스트레이션 쪽에 적합합니다. 아래 표는 공식적으로 공개된 각 방식의 특성을 바탕으로 한 실무적인 추정입니다. 공수는 필자의 대략적인 기준입니다.
| 대체 방안 | 적합한 처리 | 주요 장점 | 주요 제약 | 예상 공수 | 우선도 |
|---|---|---|---|---|---|
| VBA 네이티브 | 셀 조작, 문서 출력, 간단한 파일 출력, 기존 매크로의 경미한 수정 | 기존 자산을 활용하기 쉽고 사용자 교육 비용이 낮다 | OS 조작이나 서명·배포 통제는 약하고 외부 프로세스 의존이 남기 쉽다 | 낮음 | 높음 |
| PowerShell | 파일 조작, 공유 폴더, AD, 태스크, 설치 프로그램, 운용 자동화 | Microsoft 권장 치환 대상, 서명과 실행 정책 운용이 가능 | 실행 정책, 서명, ASR, AppLocker 조정이 필요 | 중간 | 높음 |
| .NET / VSTO | 복잡한 업무 로직, 장기 운용되는 사내 애드인, 무거운 UI 통합 | Office 통합이 두텁고 애플리케이션 단위로 기능을 제공할 수 있다 | Windows 전제, VSTO 런타임이나 배포 설계가 필요 | 높음 | 중간 |
| Office Scripts | Excel 워크북 내의 정형 정리, 클라우드 실행, Power Automate 연계 | 크로스 플랫폼, 공유하기 쉬움, Excel 중심이면 정리하기 쉽다 | Excel 전용, 외부 OS 처리에는 부적합, 대용량 데이터는 제한 있음 | 중간 | 중간 |
| Power Automate | 예약 실행, 승인, 파일 도착 기점, 다른 서비스 연계 | 흐름 전체를 시각화하기 쉽고 PowerShell/.NET도 결합할 수 있다 | 데스크톱/클라우드로 운용 설계가 나뉜다, 권한 설계가 필요 | 중~높음 | 중간 |
선정 기준을 조금 더 직관적으로 그리면 다음과 같습니다.
flowchart TD
A[발견된 VBScript 의존] --> B{Excel 워크북 내에서 완결되는가}
B -->|예| C[VBA 네이티브]
B -->|예 이면서 공유/클라우드 중시| D[Office Scripts]
B -->|아니오| E{OS·파일·태스크·AD를 다루는가}
E -->|예| F[PowerShell]
E -->|아니오| G{두터운 UI 통합이나 장기 운용 애드인인가}
G -->|예| H[.NET / VSTO]
G -->|흐름 기점이나 승인 중심| I[Power Automate]
RegExp에 대해서만 덧붙이면, Office 버전 2508 이후만 갖춰진 환경이라면 Dim re As RegExp / Set re = New RegExp로 정리하는 것이 꽤 효과적입니다. 다만 예전 Office가 한 대라도 남아 있다면 그 코드는 컴파일 호환성 문제에 부딪힙니다. 혼재 환경에서는 이행 방침을 ‘신구문’, ‘구구문’, ‘분기 래퍼’ 중 무엇으로 할지를 먼저 정해야 합니다.
테스트와 운용
테스트 계획
VBScript 이행은 단위 테스트만으로는 부족합니다. 보안 정책이 유효한 운영 환경에 준하는 조건에서 다시 테스트하지 않으면, 치환한 PowerShell이나 .NET 스크립트가 다른 이유로 멈춥니다. Microsoft의 자료에서도 PowerShell 실행 정책, AppLocker, App Control 감사 모드, ASR, MOTW가 붙은 매크로 제어를 각각 별개의 규칙으로 다루고 있습니다.
| 레벨 | 확인할 점 | 합격 조건 예시 |
|---|---|---|
| 단위 테스트 | 입출력, 예외 처리, 문자 코드, 정규식 결과 | 기존 처리와 같은 결과를 반환한다 |
| 통합 테스트 | Excel⇔PowerShell, 공유 폴더, 태스크, AD, 문서 출력 | 배치 전체가 오류 없이 완료된다 |
| 보안 테스트 | 서명, 실행 정책, AppLocker, App Control, ASR, MOTW | 정책 적용 후에도 예상대로 실행/감사된다 |
| 인수 테스트 | 작업 절차, 소요 시간, 오류 시 메시지 | 현장 절차가 단순해지거나 유지된다 |
| 호환성·성능 테스트 | Office 버전 차이, 대용량 데이터, 로그 수집 부담 | 혼재 단말에서도 허용 가능한 성능 내에서 안정적이다 |
특히 놓치기 쉬운 부분은 다음과 같습니다.
- Excel에서 PowerShell을 실행하는 치환은 ASR의 ‘Office 앱의 하위 프로세스 생성 차단’에 걸릴 수 있다.
- VBA의 선언이나 API 호출을 남겨두면 ASR의 ‘Office 매크로의 Win32 API 호출 차단’에 걸릴 수 있다.
- 다운로드 파일이나 메일 첨부로 배포한 테스트용
.xlsm/.ps1은 MOTW나 서명 상태에 따라 동작이 달라진다. - Office Scripts와 Power Automate의 조합은 편리하지만, 큰 CSV나 대량의 셀에서는 타임아웃이나 데이터 전송 제한을 의식해야 한다.
- Sysmon의 Image Load 모니터링은 편리한 반면, 전사적으로 무분별하게 확대하면 로그량이 늘어나기 쉽다.
이행 절차 체크리스트
.vbs,wscript.exe,cscript.exe,VBScript.RegExp,WScript.Shell,Shell(,ExecuteGlobal을 정적으로 검색했다- GPO, Scheduled Task, Intune, 공유 폴더 운용, MSI를 별도 계통으로 재고 조사했다
- Office 버전과 업데이트 채널을 대장화하여 2508 미만의 잔존 현황을 파악했다
- 치환 대상을 ‘VBA 네이티브 / PowerShell / .NET / Office Scripts / Power Automate’ 중에서 결정했다
- 서명 방침과 인증서 배포 방침을 결정했다
- AppLocker / App Control / ASR / 실행 정책의 영향을 테스트했다
- 파일럿 부서에서 감사 로그를 수집했다
- 롤백 절차를 문서화했다
- VBScript FOD를 비활성화하기 전에 ‘미사용’의 근거를 남겼다
리스크와 대책
| 리스크 | 전형적인 증상 | 대책 |
|---|---|---|
| 숨은 의존이 남는다 | 일부 부서만 월초 처리가 실패한다 | 정적 검색에 더해 Sysmon/AppLocker/App Control 감사를 함께 사용한다 |
| 보안 정책 때문에 치환 후에도 멈춘다 | PowerShell화했는데도 Excel 기점에서는 동작하지 않는다 | ASR, AppLocker, App Control을 테스트 환경에서 먼저 감사 모드로 설정한다 |
| 서명 미비로 운영 환경에서만 실패한다 | 개발자 PC에서는 동작하지만 사용자 PC에서는 거부된다 | Set-AuthenticodeSignature와 Get-AuthenticodeSignature로 서명 운용을 고정화한다 |
| 혼재 Office에서 RegExp가 깨진다 | 일부 단말에서 컴파일 오류 | 2508 미만의 잔존을 대장화하고 래퍼나 업데이트를 먼저 진행한다 |
| Office Scripts / Flow가 무겁다 | 큰 CSV에서 타임아웃이 발생한다 | 파일 분할, 배치화, 동기화 지점 설계를 진행한다 |
이 표의 대책은 Microsoft의 공식 자료에 있는 설계상의 제약을 사내 운용에 적용한 것입니다.
롤백은 ‘코드를 되돌리는 것’만으로는 부족합니다. 최소한 배포물의 이전 버전 복원, 정책 롤백, 옵션 기능 재활성화의 여지, 로그 수집 지속을 함께 고려해야 합니다. VBScript가 아직 FOD로 존재하는 단계라면 Phase 2 안내대로 옵션 기능으로 다시 활성화할 여지가 있지만, Phase 3에서 삭제된 후에는 그 도피처가 없어집니다.
이행 사례 스터디
전형적인 예로 경리부의 월간 집계 매크로를 가정해 보겠습니다. 현재 상태는 Excel 매크로가 WScript.Shell을 통해 cleanup.vbs를 실행하고, CSV 정리 후 VBScript.RegExp로 코드를 검증한 다음, 마지막으로 공유 폴더에 출력하는 구조입니다. 이 구성은 VBScript 폐지의 직격을 받는 데다, PowerShell로 단순 치환해도 ASR나 서명 운용에서 다시 막히기 쉬운 구조입니다.
이 사례에서는 나누어서 생각하는 것이 정답입니다. Excel 내부에서 완결되는 검증이나 서식·집계는 VBA 네이티브나 Office 2508+의 내장 RegExp로 옮긴다. 파일 변환이나 공유 폴더로의 입출력은 PowerShell로 옮긴다. 실행 기점이 ‘파일 도착’이나 ‘매일 정해진 시각’이라면 Power Automate로 옮긴다. 이렇게 하면 하나의 .vbs에 몰아넣었던 책임을 정리할 수 있습니다.
이행 후 구성 예시는 다음과 같습니다.
- Excel 매크로: 입력 확인, 화면 조작, 사용자용 메시지
- PowerShell: CSV 정규화, 공유 폴더 I/O, 로그 출력
- 서명 운용: PowerShell 스크립트에 Authenticode 서명
- 보안: AppLocker/App Control을 감사 모드로 먼저 확인, ASR 예외 필요 여부 판단
- 향후 확장: Excel 내부의 정형 처리는 Office Scripts로 단계적 이행
이 방식의 장점은 VBScript 런타임 의존을 빠르게 분리하면서도 전부를 한꺼번에 다시 만들 필요가 없다는 것입니다. RegExp는 Office 업데이트로 흡수하고, 운용 스크립트는 PowerShell로, 업무 흐름은 Power Automate로 하는 식으로 책임별로 나누면 장애 범위도 작아집니다.
추천 도구와 참고 링크
- 이 글의 샘플 코드 전체(PowerShell 감사 스크립트와 Pester 테스트) https://github.com/gomurin0428/komurasoft-blog-samples/tree/main/vbscript-deprecation-vba-excel-macro-internal-tools-audit-guide
공식 자료는 다음 순서로 읽는 것을 추천합니다.
- VBScript deprecation: Timelines and next steps 전체 로드맵과 각 Phase의 의미를 확인하기 위한 출발점.
- VBScript deprecation: Detection strategies for Windows Sysmon, GPO, Scheduled Task, Intune, MSI Custom Action까지 포함한 실전적인 검출 가이드.
- Prepare your VBA projects for VBScript deprecation in Windows VBA 관점에서 가장 중요. RegExp의 내장화, Office 2508 이후의 취급, 호환성 표가 정리되어 있다.
- Office 스크립트와 VBA 매크로의 차이 Excel 중심 처리를 Office Scripts로 옮겨야 할지 판단하기 좋은 자료.
- about_Execution_Policies / about_Signing / Set-AuthenticodeSignature / Get-AuthenticodeSignature PowerShell 이행 시 서명·실행 정책 운용의 기본 세트.
- Using Event Viewer with AppLocker / Use audit events to create App Control policy rules / App Control for Business를 사용한 스크립트 적용 감사 모드 설계, 이벤트 수집, 스크립트 적용 동작을 이해하는 데 필요.
- 공격 표면 축소 규칙 참조 Office 하위 프로세스, Win32 API, JS/VBS 다운로드 실행 차단 규칙을 확인하기 위한 자료.
- 인터넷에서 받은 매크로는 Office에서 기본적으로 차단됩니다 테스트 배포나 운영 환경 배포 시 MOTW 문제를 이해하기 위한 필수 자료.
보조 도구로는 다음과 같은 것을 실무에서 자주 사용합니다.
- Sysmon
vbscript.dll의 로드 모니터링이나 프로세스 관련 이벤트 수집의 기본. - GitHub의 Sysmon 설정 템플릿
SwiftOnSecurity의
sysmon-config는 품질 좋은 초기 템플릿, Olaf Hartong의sysmon-modular는 모듈형으로 운용하기 쉬운 출발점입니다. - oletools / olevba Office 파일에서 VBA 소스를 추출해 의심스러운 키워드나 자동 실행 매크로를 검출하는 데 적합합니다.
결론적으로, VBScript 폐지에 대한 대비는 ‘VBScript를 찾아서 PowerShell로 바꾼다’만으로는 부족합니다. Office 업데이트, 코드 분석, 운용 구성, 서명, ASR/AppLocker/App Control, UAT까지 하나의 대장으로 관리하는 것이 가장 빠르고 확실한 방법입니다. RegExp처럼 Office 업데이트로 구제할 수 있는 영역은 서둘러 구제하고, .vbs 실행이나 GPO/태스크/MSI 의존처럼 Windows 측의 단계적 전환으로 파탄나기 쉬운 영역은 우선적으로 분리하십시오.
관련 기사
같은 태그를 공유하는 최신 기사입니다. 더 가까운 주제로 지식을 넓힐 수 있습니다.
Power Automate로 업무 자동화하기 ── 클라우드 플로우・데스크톱 플로우 구분과 오류 처리 설계
Power Automate의 클라우드 플로우와 데스크톱 플로우의 차이, PowerShell/VBA와의 역할 분담, 라이선스, 오류 처리, UI 자동화 안정화, 자격 증명의 안전한 처리까지, 업무 자동화를 운영에 올리기 위한 실전 설계 지침을 정리...
C#(CSharp)에서 PowerShell을 실행하고 결과를 객체로 받는 방법
C#에서 PowerShell을 실행하고 결과를 문자열이 아닌 PSObject로 받는 방법을, PowerShell SDK, AddCommand, AddParameter, BaseObject, Properties, 오류 처리까지 실무 관점에서 정리합니다.
Pester로 하는 PowerShell 테스트 정비 ── 운영 스크립트를 쉽게 망가지지 않게 만드는 실무 패턴
PowerShell 스크립트를 Pester v5로 테스트하여 날짜 처리, 파일 작업, 삭제 처리, Mock, CI 실행까지 안전하게 정비하는 실무 절차를 정리합니다.
PowerShell 실용 명령어 모음 ── 일상 업무에서 자주 쓰는 작은 기능 늘리기
PowerShell로 일상 업무에 쓰는 실용 명령어로서, Measure-Object, Group-Object, Select-String, Compare-Object, Tee-Object, Start-Transcript 등의 활용 시점을 정리합니다.
PowerShell 스크립트 응용 ── 로그 조사·아카이브·리포트화를 안전하게 자동화하기
PowerShell 스크립트로 로그 조사, CSV 리포트, 오래된 로그 아카이브, 증적 보존, 작업 스케줄러 실행까지 안전하게 진행하는 실무 절차를 정리합니다.
관련 토픽
이 기사와 가까운 토픽 페이지입니다. 기사를 출발점 삼아 관련 서비스와 다른 기사로 이어집니다.
Windows 기술 토픽
Windows 개발, 장애 조사, 기존 자산 활용에 관한 KomuraSoft LLC 기사를 모은 토픽 허브입니다.
이 주제와 연결되는 서비스
이 기사는 다음 서비스 페이지로 이어집니다. 가까운 입구부터 확인해 주세요.
Windows 앱 개발
상주 처리, 장비 연동, 운영 로그, 유지 보수 가능한 구조가 필요한 Windows 데스크톱 애플리케이션을 지원합니다.
기존 자산 활용 & 이관 지원
COM / ActiveX / OCX 자산, 네이티브 코드, 32비트 의존성을 유지하면서 단계적인 이관 계획을 지원합니다.
자주 묻는 질문
이 기사 주제에 대해 상담 시 자주 나오는 질문을 모았습니다.
- VBScript는 언제 폐지되나요?
- 2026년 4월 시점에서 Microsoft는 VBScript를 단계적으로 폐지하는 방침을 공개하고 있습니다. Windows 11 버전 24H2에서는 먼저 Feature on Demand(FOD)로 기본 활성화되고, 다음 단계에서는 기본 비활성화되며, 최종 단계에서는 향후 Windows 릴리스에서 삭제할 계획입니다. 즉, 지금 정말로 해야 할 일은 전면 재작성보다 먼저 어디가 VBScript에 의존하고 있는지를 가시화하는 것입니다. FOD로 존재하는 단계라면 옵션 기능으로 다시 활성화할 여지가 있지만, 삭제된 후에는 그 도피처가 없어집니다.
- VBScript가 폐지되면 VBA나 Excel 매크로도 쓸 수 없게 되나요?
- 아닙니다. 이번 논점은 'VBA가 폐지된다'는 이야기가 아닙니다. Microsoft가 공개한 것은 어디까지나 VBScript의 단계적 폐지이며, VBA 프로젝트에 대한 영향은 주로 외부 .vbs 파일 실행과 VBScript.RegExp 같은 VBScript 계열 라이브러리 참조에 집중됩니다. VBA/Excel에서 .vbs를 직접 실행하는 처리는 단계 전환 이후 정지할 위험이 높아 우선적으로 찾아내야 할 대상입니다. GPO 로그온 스크립트, Scheduled Task, Intune 배포 스크립트, MSI의 VBScript Custom Action도 일제 장애가 되기 쉬운 중점 영역입니다.
- VBScript의 대체 기술로는 무엇을 쓰면 좋을까요?
- 대체 기술은 '무엇으로 작성할 수 있는가'가 아니라 어디까지의 책임을 맡길 것인가로 선택합니다. OS·파일·공유 폴더·AD·태스크·설치 프로그램을 다루는 처리는 Microsoft가 권장하는 PowerShell이 본선이며, 서명과 실행 정책의 공식 운용 수단도 있습니다. Excel 워크북 내부에서 완결되는 셀 조작이나 문서 출력은 VBA 네이티브, 클라우드 실행이나 Power Automate 연계를 중시한다면 Office Scripts, 두터운 데스크톱 통합이나 장기 운용되는 사내 애드인은 .NET/VSTO, 예약 실행이나 승인 플로우가 기점이라면 Power Automate가 후보입니다. 치환 후 ASR나 AppLocker에서 막히지 않는지 정책까지 포함한 테스트가 필요합니다.
- VBA에서 VBScript.RegExp를 사용하고 있는 경우에는 어떻게 해야 할까요?
- Office 버전 2508(Build 19127.20154) 이후에는 RegExp 클래스가 VBE에 표준으로 탑재되어, RegExp 용도에 한해서는 VBScript 의존의 일부를 Office 업데이트로 해소할 수 있게 되었습니다. 다만 예전 Office 클라이언트가 남아 있는 혼재 환경에서는 같은 VBA라도 동작하는 단말과 동작하지 않는 단말이 발생하기 쉬워집니다. 2508 미만 단말이 한 대라도 남아 있다면 새 구문은 컴파일 호환성 문제에 부딪히므로, Office 버전과 업데이트 채널을 대장화해 잔존 현황을 파악하고 이행 방침을 '신구문'·'구구문'·'분기 래퍼' 중 무엇으로 할지 먼저 정해야 합니다.
저자 프로필
기사 저자의 프로필 페이지입니다.
Go Komura
합동회사 코무라소프트 대표
Windows 소프트웨어 개발, 기술 상담, 장애 조사를 중심으로 재현이 어려운 장애 조사와 기존 자산이 남아 있는 프로젝트에 강점이 있습니다.
공개 링크