Как собрать информацию о ПК Windows в Excel через WMI
Важно: этот метод работает только в настольной версии Excel с поддержкой макросов (.xlsm). Макросы могут быть отключены политиками безопасности — включите «Enable Content» только для доверенных файлов.
Кому пригодится это руководство
- Системным администраторам для инвентаризации компьютеров в отделе.
- IT‑техникам для сбора конфигураций перед апгрейдом или ремонтом.
- Разработчикам VBA, которые хотят использовать WMI внутри Office.
Что вы получите
- Готовую книгу Excel с вкладками для сетевых, дисковых, процессорных, видеодрайверных и других данных.
- VBA‑модули, использующие классы WMI Win32_* для извлечения атрибутов системы и записи их в листы.
- Автоматический запуск сбора данных при открытии книги.
- Руководство по тестам, безопасности и откату.
Что такое WMI в одной строке
WMI (Windows Management Instrumentation) — это набор API и классов (Win32_*), позволяющих программно читать конфигурацию и состояние Windows‑системы.
Требования и подготовка
- Windows (любая современная версия: Windows 10/11 и Windows Server — см. раздел совместимости).
- Настольная версия Microsoft Excel с поддержкой VBA (файл сохраните как .xlsm).
- Права пользователя достаточные для доступа к WMI (обычно стандартные локальные права достаточно для чтения).
Примечание: в корпоративной среде политики групп могут ограничивать доступ к WMI или запуск макросов.

Шаг 1. Структура книги Excel
- Создайте новую книгу Excel и сохраните её как MyComputerInfo.xlsm (или другое имя, обязательно .xlsm).
- Пропустите Sheet1 и переименуйте следующие 11 листов в точности: Network, LogicalDisk, Processor, Physical Memory, Video Controller, OnBoardDevices, Operating System, Printer, Software, Accounts, Services.
Эти листы будут заполняться автоматически при запуске макросов.
Шаг 2. Включение вкладки Разработчик и доступ к VBA
- Перейдите на вкладку «Файл» → «Параметры» → «Настроить ленту». В списке слева выберите «Все вкладки», затем добавьте «Разработчик» в правую колонку и нажмите «OK».
- На вкладке «Разработчик» в группе «Код» нажмите «Visual Basic» или «View Code».
Если вы не видите «Разработчик», добавьте его через Настройки Excel, как описано выше.
Шаг 3. Модули WMI — базовая заготовка
Откройте окно Project Explorer в VBA (обычно слева). Если папки Modules нет, вставьте модуль: Insert → Module.
В модуль (Module1) поместите в самом верху следующие объявления глобальных переменных (одна строка — одна переменная):
Public oWMISrvEx As Object 'SWbemServicesEx
Public oWMIObjSet As Object 'SWbemServicesObjectSet
Public oWMIObjEx As Object 'SWbemObjectEx
Public oWMIProp As Object 'SWbemProperty
Public sWQL As String 'WQL Statement
Public nЭти переменные упрощают доступ к объектам WMI между подпрограммами.
Шаг 4. Пример модуля для сетевой информации
Ниже — полностью рабочая подпрограмма, которая извлекает свойства из Win32_NetworkAdapterConfiguration и записывает их в лист “Network”. Скопируйте её в Module1.
Sub NetworkWMI()
sWQL = "Select * From Win32_NetworkAdapterConfiguration"
Set oWMISrvEx = GetObject("winmgmts:root/CIMV2")
Set oWMIObjSet = oWMISrvEx.ExecQuery(sWQL)
intRow = 2
strRow = Str(intRow)
ThisWorkbook.Sheets("Network").Range("A1").Value = "Name"
ThisWorkbook.Sheets("Network").Cells(1, 1).Font.Bold = True
ThisWorkbook.Sheets("Network").Range("B1").Value = "Value"
ThisWorkbook.Sheets("Network").Cells(1, 2).Font.Bold = True
For Each oWMIObjEx In oWMIObjSet
For Each oWMIProp In oWMIObjEx.Properties_
If Not IsNull(oWMIProp.Value) Then
If IsArray(oWMIProp.Value) Then
For n = LBound(oWMIProp.Value) To UBound(oWMIProp.Value)
Debug.Print oWMIProp.Name & "(" & n & ")", oWMIProp.Value(n)
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value(n)
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
intRow = intRow + 1
strRow = Str(intRow)
Next
Else
ThisWorkbook.Sheets("Network").Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).Value = oWMIProp.Value
ThisWorkbook.Sheets("Network").Range("B" & Trim(strRow)).HorizontalAlignment = xlLeft
intRow = intRow + 1
strRow = Str(intRow)
End If
End If
Next
Next
End SubПояснение: код проходит по всем объектам и их свойствам, записывая имя свойства в колонку A, а значение — в колонку B. Если свойство массивное, оно разворачивается по индексам.
Шаг 5. Копирование и адаптация функции для других листов
Для каждого листа создайте отдельную субрутину, почти идентичную NetworkWMI, но с заменой WMI‑класса и имён листа. Примеры соответствий:
- NetworkWMI — Win32_NetworkAdapterConfiguration — лист “Network”
- LogicalDiskWMI — Win32_LogicalDisk — лист “LogicalDisk”
- ProcessorWMI — Win32_Processor — лист “Processor”
- PhysicalMemWMI — Win32_PhysicalMemoryArray — лист “Physical Memory”
- VideoControlWMI — Win32_VideoController — лист “Video Controller”
- OnBoardWMI — Win32_OnBoardDevice — лист “OnBoardDevices”
- OperatingWMI — Win32_OperatingSystem — лист “Operating System”
- PrinterWMI — Win32_Printer — лист “Printer”
- SoftwareWMI — Win32_Product — лист “Software”
- ServicesWMI — Win32_BaseService — лист “Services”
Пример: чтобы получить данные дисков, замените строку sWQL на:
sWQL = "Select * From Win32_LogicalDisk"и замените все упоминания листа “Network” на “LogicalDisk” в теле процедуры.
Совет: используйте поиск/замену в редакторе VBA (Ctrl+H) и пропишите шаблон один раз, затем адаптируйте имена.
Шаг 6. Автоматический запуск при открытии книги
Чтобы запускать все подпрограммы при открытии книги, откройте объект ThisWorkbook в Project Explorer и выберите вверху события Workbook → Open. Вставьте следующие строки внутри Private Sub Workbook_Open():
Private Sub Workbook_Open()
NetworkWMI
LogicalDiskWMI
ProcessorWMI
PhysicalMemWMI
VideoControlWMI
OnBoardWMI
PrinterWMI
SoftwareWMI
OperatingWMI
ServicesWMI
End SubТеперь при каждом открытии книги все листы автоматически будут заполняться актуальными данными.
Примечание: при первом запуске загрузка может длиться несколько минут — WMI перебирает множество свойств. Если макросы отключены, нажмите «Enable Content».
Что ещё можно сделать с этими данными
- Создать сводную панель (dashboard) на вкладке «Overview» и подгружать ключевые метрики через формулы или Power Query.
- Экспортировать данные в CSV для массовой обработки или в CMDB.
- Скрипт для удалённого сбора: если разрешено, использовать PowerShell/PSRemoting + WMI для сбора с нескольких машин и запись в общую книгу.
Безопасность и конфиденциальность
- Макросы способны выполнять произвольный код. Открывайте и запускайте темы макросов только для проверенных источников.
- Собранные данные могут содержать уникальные идентификаторы (серийные номера, SID, пути к файлам). Храните книгу в защищённом месте и ограничьте доступ.
- Если вы планируете отправлять отчёты внешним подрядчикам, удалите или токенизируйте чувствительные поля.
Совместимость и ограничения
- Классы WMI и доступные свойства могут различаться между версиями Windows и производителями оборудования. Некоторые устройства возвращают пустые свойства.
- Win32_Product — медленный и потенциально запускающий перепроверку MSI (не рекомендуется массово для продакшн‑инвентаризации). Лучше собирать список установленных программ через реестр или PowerShell (Get‑InstalledModule / Get‑PackageProvider), особенно в больших средах.
- Для удалённого сбора с нескольких компьютеров лучше использовать PowerShell Remoting, SCCM, Intune или специализированные средства.
Руководство по проверке и приёмке
Критерии приёмки
- Книга открывается без ошибок и показывает заголовки “Name” и “Value” на каждой целевой вкладке.
- Для тестовой машины заполнены 10+ строк на вкладке Network и 5+ строк на вкладке Processor (зависит от машины).
- Если макросы включены, выполнение всех процедур завершается без необработанных ошибок.
Тестовые сценарии
- Открыть книгу на тестовой машине и убедиться, что листы заполнились.
- Отключить макросы, открыть книгу и проверить корректную обработку (должно быть предупреждение о макросах).
- Запустить процедуру вручную из редактора VBA и смотреть окно Immediate (Debug.Print) на наличие ошибок.
Роль‑ориентированные чеклисты
Для системного администратора
- Сохранить шаблон как защищённый файл (.xlsm) в защищённой папке.
- Показать администраторам, какие поля считаются чувствительными.
- Настроить политику хранения и удаления устаревших отчётов.
Для разработчика VBA
- Убедиться в согласованности имён листов и процедур.
- Добавить обработку ошибок (On Error) в критических местах.
- Оптимизировать чтение больших массивов, чтобы избежать блокировки Excel.
Для обычного пользователя
- Не запускать макросы от неизвестных поставщиков.
- При сомнениях показать файл ответственному администратору.
Отказ, откат и план восстановления
Если после добавления макросов книга вызывает ошибки или поведение нежелательно:
- Закройте книгу и откройте копию исходного файла без макросов.
- В редакторе VBA закомментируйте строку Private Sub Workbook_Open(), чтобы предотвратить автозапуск.
- Удалите/восстановите проблемную процедуру и протестируйте изменения локально.
- Восстановите книгу из резервной копии, если не удаётся устранить проблему.
Когда этот подход не подходит (контрпример)
- В среде с жёсткой политикой безопасности, где макросы запрещены — применяйте SCCM/Intune/PowerShell DSC.
- Для массовой инвентаризации тысяч машин — лучше использовать централизованные инструменты, а не ручной сбор через Excel.
- Если требуется минимальное влияние на производительность; некоторые WMI‑запросы (например, Win32_Product) медленные.
Краткая методология внедрения (мини‑метод)
- Подготовьте шаблон книги и протестируйте локально.
- Добавьте обработку ошибок и логирование (запись в отдельный лог‑лист).
- Защитите книгу паролем и распространите среди доверенных администраторов.
- Постепенно добавляйте экспорт/агрегацию в централизованное хранилище.
Пример обработчика ошибок для вставки в процедуры
Sub SafeNetworkWMI()
On Error GoTo ErrHandler
NetworkWMI
Exit Sub
ErrHandler:
ThisWorkbook.Sheets("Network").Range("A1").Value = "Error: " & Err.Number & " - " & Err.Description
End SubНебольшой словарь терминов — 1 строка на термин
- WMI: интерфейс для доступа к информации о Windows.
- Win32_*: набор классов WMI, каждый описывает объект системы.
- VBA: Visual Basic for Applications — макроязык Office.
- .xlsm: формат Excel с поддержкой макросов.
Шаблоны и сниппеты для быстрого старта
- Заголовки колонок (копируйте в каждую процедуру):
ThisWorkbook.Sheets("{SheetName}").Range("A1").Value = "Name"
ThisWorkbook.Sheets("{SheetName}").Cells(1, 1).Font.Bold = True
ThisWorkbook.Sheets("{SheetName}").Range("B1").Value = "Value"
ThisWorkbook.Sheets("{SheetName}").Cells(1, 2).Font.Bold = True- Универсальная процедура вызова WMI с указанием класса и листа (шаблон для опытных пользователей):
Sub GenericWMI(sClass As String, sSheet As String)
sWQL = "Select * From " & sClass
Set oWMISrvEx = GetObject("winmgmts:root/CIMV2")
Set oWMIObjSet = oWMISrvEx.ExecQuery(sWQL)
intRow = 2
strRow = Str(intRow)
ThisWorkbook.Sheets(sSheet).Range("A1").Value = "Name"
ThisWorkbook.Sheets(sSheet).Range("B1").Value = "Value"
For Each oWMIObjEx In oWMIObjSet
For Each oWMIProp In oWMIObjEx.Properties_
If Not IsNull(oWMIProp.Value) Then
If IsArray(oWMIProp.Value) Then
For n = LBound(oWMIProp.Value) To UBound(oWMIProp.Value)
ThisWorkbook.Sheets(sSheet).Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets(sSheet).Range("B" & Trim(strRow)).Value = oWMIProp.Value(n)
intRow = intRow + 1
strRow = Str(intRow)
Next
Else
ThisWorkbook.Sheets(sSheet).Range("A" & Trim(strRow)).Value = oWMIProp.Name
ThisWorkbook.Sheets(sSheet).Range("B" & Trim(strRow)).Value = oWMIProp.Value
intRow = intRow + 1
strRow = Str(intRow)
End If
End If
Next
Next
End SubСоветы по оптимизации
- Фильтруйте свойства WMI, указывая в запросе только те поля, которые действительно нужны (снижение времени выполнения).
- Совмещайте вызовы: для больших классов делайте промежуточную агрегацию в массивы, затем запись в лист одним блоком.
- Отключайте экранное обновление (Application.ScreenUpdating = False) и автоматическую переработку формул для ускорения записи.
Mermaid: Дерево решений — стоит ли использовать Excel + WMI?
flowchart TD
A[Нужно собрать данные с 1–100 ПК?] -->|Да| B[Есть доступ к макросам?]
A -->|Нет| C[Использовать централизованное средство]
B -->|Да| D[Excel + WMI подходит]
B -->|Нет| E[Использовать PowerShell или SCCM]
D --> F[Тестировать на 1 ПК, затем масштабировать]
E --> G[Использовать удалённые скрипты/агенты]Частые ошибки и как их исправлять
- Ошибка: “Automation error” — проверьте, установлен ли WMI и нет ли ограничений политик.
- Нулевые значения в столбцах — многие свойства необязательны и зависят от производителя железа.
- Очень долгий запуск — исключите тяжёлые классы (Win32_Product) или отфильтруйте поля.
Заключение
Использование WMI через VBA в Excel — недорогой и быстрый способ получить богатый набор данных о локальном ПК. Для небольших инфраструктур это удобный инструмент для инвентаризации и диагностики. В корпоративных масштабах рассмотрите более централизованные решения.
Краткие выводы:
- Подготовьте книгу с требуемыми листами и модулем.
- Скопируйте и адаптируйте пример NetworkWMI для остальных листов.
- Используйте обработку ошибок и меры безопасности при хранении собранных данных.
Если вы уже пробовали подобные инструменты или хотите поделиться улучшениями — оставьте комментарий и описание вашего подхода.
Image Credits: Adriano Castelli via Shutterstock.com, Mclek via Shutterstock