Гид по подготовке VBA и внутренних инструментов к отказу от VBScript

· · VBScript, VBA, Excel, PowerShell, Office, Windows, Использование существующих активов

Краткое резюме

По состоянию на апрель 2026 года Microsoft опубликовала план поэтапного отказа от VBScript: в Windows 11 версии 24H2 VBScript сначала становится компонентом по требованию (Feature on Demand), включённым по умолчанию, на следующем этапе — отключённым по умолчанию, а на финальном этапе планируется удалить его из будущего выпуска Windows. Иными словами, прежде чем браться за «полное переписывание», действительно нужно сначала «сделать видимым, где именно есть зависимость от VBScript».

У VBA и макросов Excel есть, по сути, два реалистичных проблемных момента. Первый — случаи, когда .vbs запускается извне. Второй — обращение к библиотекам VBScript-типа, таким как VBScript.RegExp. Что касается второго, начиная с Office версии 2508 (сборка 19127.20154) класс RegExp включён в VBE по умолчанию, и хотя бы часть зависимости от RegExp мигрировать стало легче. С другой стороны, в смешанных средах, где остаются старые клиенты Office, один и тот же VBA-код легко работает на одних машинах и не работает на других.

Миграцию усложняет не столько сам VBScript, сколько «сопутствующая эксплуатация». Например, даже если заменить код так, чтобы Excel запускал powershell.exe, решение не заработает в продакшне, если оно упирается в правила снижения площади атаки — «блокировка создания дочерних процессов приложениями Office» или «блокировка вызовов Win32 API из макросов Office» — а также в AppLocker, App Control for Business, политику выполнения PowerShell, порядок подписи или контроль макросов у файлов с меткой MOTW. План миграции стоит проектировать не только как конвертацию кода, но и с учётом политик, подписи и аудита логов.

Кратчайший путь — инвентаризация → статическое обнаружение → сбор логов выполнения → выбор замены → тестирование → поэтапное внедрение. В этой статье мы разберём материал именно в таком порядке, с прицелом на практику.

Отметим, что весь код, встречающийся в этой статье, опубликован на GitHub как готовый к запуску и тестированию набор примеров (аудиторские скрипты PowerShell, примеры замены, справочный код VBA и Office Scripts, тесты Pester).

vbscript-deprecation-vba-excel-macro-internal-tools-audit-guide - komurasoft-blog-samples (GitHub)

Что именно меняется

Первое, что нужно усвоить: речь не о том, что «VBA будет отменён». Microsoft публикует план только о поэтапном отказе от VBScript, а влияние на проекты VBA концентрируется в основном на выполнении внешних .vbs и обращении к библиотекам семейства VBScript. В Microsoft 365 Developer Blog тоже указывается, что выполнение .vbs из VBA и использование VBScript.RegExp — типичные точки влияния.

Практический порядок приоритетов легче оценить в виде таблицы.

Паттерн зависимости Что происходит Приоритет
Прямой запуск .vbs из VBA/Excel С Phase 2 сбои в зависимости от конфигурации устройства, на Phase 3 останавливается как правило Высокий
Обращение к VBScript.RegExp Легко превращается в дефект в смешанных средах, где остаются версии ниже Office 2508 Высокий
Запуск внешних процессов через WScript.Shell / Shell Даже после замены может останавливаться ASR или AppLocker Высокий
Скрипты входа/запуска/завершения через GPO, задачи планировщика, скрипты развёртывания Intune Легко вызывает массовый сбой при обновлении ОС или переключении политики Высокий
Пользовательские действия VBScript в MSI Внезапно отказывают при установке, восстановлении, удалении Высокий

Этот порядок приоритетов — практическое решение, учитывающее план отказа от VBScript на стороне Windows, официальную стратегию обнаружения и спецификации ASR/AppLocker/App Control.

Только с RegExp ситуация немного иная. Начиная с Office версии 2508, класс RegExp по умолчанию входит в VBE, поэтому, если ограничиться сценариями RegExp, «часть зависимости от VBScript теперь можно снять обновлением Office». Однако это не решается автоматически в организациях со старым Office, медленными каналами обновления, смешанными средами или устаревшими образами устройств. Важно включить в реестр и «обновление Office», и «поэтапное переключение Windows» одновременно.

Как проводить инвентаризацию

Одного поиска по имени файла для инвентаризации недостаточно. Рекомендуем как минимум держать следующие десять аспектов в виде колонок по проектам, по инструментам и по бизнес-процессам.

  • Способ обнаружения мест, зависящих от VBScript Отдельно фиксировать поиск по файлам, анализ кода и анализ логов.
  • Использование CreateObject / GetObject / Execute / ExecuteGlobal и подобного внутри VBA Зависимость прячется в строках, поэтому статический поиск легко её пропускает.
  • Вызовы внешних скриптов из макросов Excel Отдельно отслеживать WScript.Shell, функцию Shell, wscript.exe / cscript.exe, а также .vbs / .js / .ps1.
  • Зависимость внутренних пакетных заданий и инструментов от скриптов Включить задачи планировщика, GPO, Intune, рабочие скрипты на общих папках и установщики.
  • Безопасность, права, подпись, политика AppLocker, App Control for Business, ASR, политика выполнения PowerShell, цифровая подпись, необходимость прав администратора.
  • Сравнение технологий замены и затрат на миграцию Сравнить нативный VBA, PowerShell, .NET/VSTO, Office Scripts и Power Automate.
  • План тестирования Разделить модульное, интеграционное, приёмочное тестирование и повторное тестирование после применения политик.
  • Порядок эксплуатации и откат Явно указать, что нужно вернуть для восстановления и насколько это можно автоматизировать.
  • Совместимость и производительность Различия версий Office, разрядность 32/64 бит, производительность устройств, нагрузка от сбора логов, тайм-ауты облачных потоков.
  • Пример практического кейса миграции Заранее подготовить один показательный пример, который можно использовать при объяснении на местах.

Из этих десяти пунктов особенно GPO, задачи планировщика, скрипты развёртывания Intune, пользовательские действия MSI и обнаружение через Sysmon/AppLocker/App Control прямо указаны в официальном руководстве Microsoft как приоритетные зоны.

Если представлять весь ход миграции в виде схемы, курс не собьётся.

Выполнение внешнего .vbsVBScript.RegExpGPO / задачи / MSIНеизвестная / скрытая зависимостьИнвентаризация активовТип зависимостиЗамена на PowerShell или нативный VBAПереход на встроенный RegExp Office 2508+Исправление централизованных настроек и артефактов развёртыванияСбор логов выполнения через Sysmon / AppLocker / App ControlМодульное тестированиеИнтеграционное тестированиеПилотное развёртывание в режиме аудитаПоэтапное отключение VBScript FOD

Если придерживаться такого порядка, можно заметно сократить типичную ситуацию переделки, когда «сначала переписали код, а потом всё упало из-за GPO или ASR».

Практическое обнаружение и примеры кода

Поиск по файлам и выявление конфигурации

В руководстве Microsoft по обнаружению рекомендуется вести рекурсивный поиск .vbs, отдавая приоритет путям с понятным назначением, таким как C:\Users, C:\ProgramData, C:\Scripts, а GPO, задачи планировщика, скрипты развёртывания Intune и пакеты MSI проверять отдельным треком. Мониторинг vbscript.dll через Sysmon эффективен, но мониторинг 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 оказываются зарыты внутри определений задач.

# Извлекаем вызовы 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 нужно вызывать внешнюю обработку, включая ОС, общие папки, AD, установщики и сбор логов, реалистичнее склоняться к PowerShell. Microsoft рекомендует PowerShell как замену VBScript, и на стороне PowerShell есть официальные средства для политики выполнения, подписи и проверки Authenticode. Отметим, что Shell в VBA по умолчанию асинхронен, поэтому для обработки, требующей контроля порядка, нужно отдельно продумать дизайн потока или логику ожидания.

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 Операции с ячейками, отчёты, простой вывод файлов, лёгкие правки существующих макросов Легко задействовать существующие активы, низкие затраты на обучение пользователей Слабый контроль над операциями ОС, подписью и распространением, зависимости от внешних процессов легко остаются Низкая Высокий
PowerShell Операции с файлами, общие папки, AD, задачи, установщики, автоматизация эксплуатации Рекомендуемая Microsoft замена, доступны подпись и управление политикой выполнения Требуется настройка политики выполнения, подписи, ASR, AppLocker Средняя Высокий
.NET / VSTO Сложная бизнес-логика, долгоживущие внутренние надстройки, тяжёлая интеграция UI Глубокая интеграция с Office, функциональность можно поставлять на уровне приложения Требует Windows, нужен VSTO-рантайм и дизайн распространения Высокая Средний
Office Scripts Типовое форматирование внутри книги Excel, облачное выполнение, интеграция с Power Automate Кросс-платформенность, легко делиться, удобно упорядочивать при Excel-центричном подходе Только для Excel, не подходит для внешней обработки ОС, есть ограничения на больших объёмах данных Средняя Средний
Power Automate Выполнение по расписанию, согласования, триггер на прибытие файла, интеграция с другими сервисами Легко визуализировать весь поток целиком, можно встроить PowerShell/.NET Дизайн эксплуатации разделяется между десктопом и облаком, нужен дизайн прав доступа Средняя–высокая Средний

Если изобразить ориентир выбора немного более наглядно, получится так.

ДаДа, и важны совместный доступ / облакоНетДаНетДаЗапуск по потоку или согласованиеОбнаруженная зависимость от VBScriptУкладывается ли внутри книги Excel?Нативный VBAOffice ScriptsЗатрагивает ли ОС, файлы, задачи, AD?PowerShellПлотная интеграция UI или долгоживущая надстройка?.NET / VSTOPower 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».
  • Если оставить объявления или вызовы API в VBA, можно упереться в правило ASR «блокировка вызовов Win32 API из макросов Office».
  • Тестовые .xlsm / .ps1, распространяемые через загруженные файлы или вложения писем, ведут себя по-разному в зависимости от метки MOTW и состояния подписи.
  • Сочетание Office Scripts и Power Automate удобно, но на больших CSV или при большом числе ячеек нужно учитывать тайм-ауты и ограничения на передачу данных.
  • Мониторинг Image Load в Sysmon удобен, но если небрежно расширить его на всю компанию, объём логов легко растёт.

Контрольный список процедуры миграции

  • Проведён статический поиск .vbs, wscript.exe, cscript.exe, VBScript.RegExp, WScript.Shell, Shell(, ExecuteGlobal
  • GPO, задачи планировщика, 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 в режим аудита в тестовой среде
Пробелы в подписи вызывают сбои только в продакшне Работает на ПК разработчика, но отклоняется на ПК пользователей Закрепить порядок подписи через Set-AuthenticodeSignature и Get-AuthenticodeSignature
RegExp ломается в смешанном Office Ошибки компиляции на некоторых машинах Свести остаток версий ниже 2508 в реестр, заранее внедрить обёртку или обновление
Office Scripts / Flow работают медленно Тайм-ауты на больших CSV Разбить файлы, организовать пакетную обработку, продумать точки синхронизации

Меры противодействия в этой таблице переносят проектные ограничения из официальных материалов Microsoft на внутреннюю эксплуатацию.

Отката недостаточно свести к «вернуть код обратно». Как минимум продумайте единым набором восстановление прежних версий распространяемых артефактов, откат политик, возможность повторно включить опциональный компонент и продолжение сбора логов. Пока VBScript ещё существует как FOD, согласно указаниям Phase 2 есть возможность повторно включить его как опциональный компонент, но после удаления на Phase 3 этой лазейки уже не будет.

Пример практического кейса миграции

В качестве типичного примера рассмотрим макрос ежемесячной сводки бухгалтерии. Сейчас макрос Excel запускает cleanup.vbs через WScript.Shell, после форматирования CSV проверяет коды через VBScript.RegExp и в конце выводит результат в общую папку. Такая конфигурация получает прямой удар от отказа VBScript, и даже при простой замене на PowerShell она легко снова остановится из-за ASR или порядка подписи.

В этом случае правильно разбить задачу на части. Проверку, форматирование и агрегацию, полностью укладывающиеся внутри Excel, стоит перенести на нативный VBA или встроенный RegExp Office 2508+. Конвертацию файлов и ввод-вывод в общую папку — перенести на PowerShell. Если триггером служит «прибытие файла» или «ежедневно в заданное время» — перенести на Power Automate. Так можно упорядочить обязанности, которые раньше были втиснуты в один .vbs.

Пример конфигурации после миграции такой.

  • Макрос Excel: проверка ввода, работа с экраном, сообщения для пользователя
  • PowerShell: нормализация CSV, ввод-вывод в общую папку, вывод логов
  • Порядок подписи: подпись Authenticode на скриптах PowerShell
  • Безопасность: заранее проверить AppLocker/App Control в режиме аудита, решить, нужны ли исключения ASR
  • Дальнейшее расширение: поэтапно перенести типовую обработку внутри Excel на Office Scripts

Преимущество такого подхода в том, что можно быстро отделить зависимость от рантайма VBScript, не переделывая всё сразу. Если разбивать по зонам ответственности — RegExp поглощается обновлением Office, рабочие скрипты переезжают на PowerShell, бизнес-процесс — на Power Automate, — область возможного сбоя тоже сужается.

Рекомендуемые инструменты и справочные ссылки

Официальные материалы рекомендуем читать в таком порядке.

  • VBScript deprecation: Timelines and next steps Отправная точка для проверки общей дорожной карты и значения фаз (Phase).
  • VBScript deprecation: Detection strategies for Windows Практическое руководство по обнаружению, включающее Sysmon, GPO, задачи планировщика, Intune и пользовательские действия MSI.
  • Prepare your VBA projects for VBScript deprecation in Windows Самый важный материал с точки зрения VBA. В нём разобраны встраивание RegExp, работа с версиями Office 2508 и новее, а также таблица совместимости.
  • Differences between Office Scripts and VBA macros Материал, который помогает понять, стоит ли переносить обработку, ориентированную на 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 / Script enforcement with App Control for Business Необходимо для понимания дизайна режима аудита, сбора событий и поведения применения скриптов.
  • Attack surface reduction rules reference Материал для проверки правил блокировки: дочерние процессы Office, вызовы Win32 API, выполнение загруженных JS/VBS.
  • Macros from the internet are blocked by default in Office Обязательно к прочтению для понимания проблем MOTW при тестовом распространении и промышленном развёртывании.

В качестве вспомогательных инструментов на практике часто используются такие.

  • Sysmon Основа для мониторинга загрузки vbscript.dll и сбора событий уровня процессов.
  • Шаблоны настройки Sysmon на GitHub sysmon-config от SwiftOnSecurity — качественный стартовый шаблон, а sysmon-modular от Olaf Hartong — модульная и удобная в эксплуатации отправная точка.
  • oletools / olevba Хорошо подходят как вспомогательное средство для извлечения исходного кода VBA из файлов Office и обнаружения подозрительных ключевых слов и автоматически выполняющихся макросов.

В заключение: подготовки к отказу от VBScript через «найти VBScript и заменить на PowerShell» недостаточно. Кратчайший и надёжный путь — вести единый реестр, охватывающий обновления Office, анализ кода, конфигурацию эксплуатации, подпись, ASR/AppLocker/App Control и UAT. Области, которые можно спасти обновлением Office, такие как RegExp, спасайте заранее, а области, которые легко ломаются на поэтапном переключении Windows — выполнение .vbs и зависимости от GPO/задач/MSI, — отделяйте в приоритетном порядке.

Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.

Автоматизация бизнес-процессов с Power Automate — выбор между облачным потоком и потоком рабочего стола, проектирование обработки ошибок

Разбираем различия между облачными потоками и потоками рабочего стола в Power Automate, выбор между PowerShell и VBA, лицензирование, обр...

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

Когда VBScript будет отменён?
По состоянию на апрель 2026 года Microsoft опубликовала план поэтапного отказа от VBScript. В Windows 11 версии 24H2 VBScript сначала становится компонентом по требованию (Feature on Demand, FOD), включённым по умолчанию, на следующем этапе — отключённым по умолчанию, а на финальном этапе планируется полностью удалить его из будущего выпуска Windows. Иными словами, прежде чем браться за полное переписывание, действительно нужно сделать другое — сделать видимыми все места, зависящие от VBScript. Пока VBScript существует как FOD, есть возможность повторно включить его как опциональный компонент, но после удаления этой лазейки уже не будет.
Если VBScript отменят, перестанут ли работать VBA и макросы Excel?
Нет, речь не о том, что «VBA будет отменён». Microsoft публикует план только о поэтапном отказе от VBScript, а влияние на проекты VBA сосредоточено в основном на выполнении внешних файлов .vbs и на обращении к библиотекам семейства VBScript, таким как VBScript.RegExp. Обработка, которая напрямую запускает .vbs из VBA/Excel, имеет высокий риск остановки после переключения этапов, и её нужно выявлять в первую очередь. Сценарии входа через GPO, задачи планировщика, скрипты развёртывания Intune и пользовательские действия VBScript в MSI — тоже приоритетные зоны, где легко случается массовый сбой.
Чем заменить VBScript?
Замену выбирают не по тому, «на чём можно написать», а по тому, какую зону ответственности она будет нести. Для обработки, затрагивающей ОС, файлы, общие папки, AD, задачи и установщики, основной кандидат — рекомендуемый Microsoft PowerShell, у которого есть и официальные средства для подписи и политики выполнения. Для операций с ячейками и отчётов, полностью укладывающихся внутри книги Excel, подходит нативный VBA; если важны облачное выполнение и интеграция с Power Automate — Office Scripts; для плотной десктопной интеграции и долгоживущих внутренних надстроек — .NET / VSTO; а для запуска по расписанию или процессов, начинающихся с согласования, — Power Automate. После замены нужно протестировать, включая политики, не останавливается ли решение из-за ASR или AppLocker.
Что делать, если в VBA используется VBScript.RegExp?
Начиная с Office версии 2508 (сборка 19127.20154), класс RegExp входит в VBE по умолчанию, поэтому, если ограничиться сценариями с RegExp, часть зависимости от VBScript теперь можно снять обновлением Office. Однако в смешанных средах, где остаются старые клиенты Office, один и тот же VBA-код легко работает на одних машинах и не работает на других. Если остаётся хотя бы одна машина с версией ниже 2508, новый синтаксис упирается в барьер совместимости при компиляции, поэтому версии Office и каналы обновления нужно свести в реестр, оценить остаток старых версий и заранее решить, каким будет курс миграции — «новый синтаксис», «старый синтаксис» или «ветвящаяся обёртка».

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог