Гид по технологиям

Как собрать информацию о ПК Windows в Excel через WMI

8 min read IT администрирование Обновлено 23 Dec 2025
Информация о ПК Windows в Excel через WMI
Информация о ПК 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 или запуск макросов.

Ноутбук с открытой книгой Excel и кодом VBA

Шаг 1. Структура книги Excel

  1. Создайте новую книгу Excel и сохраните её как MyComputerInfo.xlsm (или другое имя, обязательно .xlsm).
  2. Пропустите Sheet1 и переименуйте следующие 11 листов в точности: Network, LogicalDisk, Processor, Physical Memory, Video Controller, OnBoardDevices, Operating System, Printer, Software, Accounts, Services.

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

Схема листов Excel с именами для сбора данных WMI

Шаг 2. Включение вкладки Разработчик и доступ к VBA

  1. Перейдите на вкладку «Файл» → «Параметры» → «Настроить ленту». В списке слева выберите «Все вкладки», затем добавьте «Разработчик» в правую колонку и нажмите «OK».
  2. На вкладке «Разработчик» в группе «Код» нажмите «Visual Basic» или «View Code».

Вкладка Разработчик в Excel: как добавить в ленту

Кнопка View Code и окно VBA Editor

Если вы не видите «Разработчик», добавьте его через Настройки 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

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

Окно VBA: ThisWorkbook, выбор события Open для автозапуска

Выпадающие списки событий Workbook и Open в VBA

Примечание: при первом запуске загрузка может длиться несколько минут — 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 (зависит от машины).
  • Если макросы включены, выполнение всех процедур завершается без необработанных ошибок.

Тестовые сценарии

  1. Открыть книгу на тестовой машине и убедиться, что листы заполнились.
  2. Отключить макросы, открыть книгу и проверить корректную обработку (должно быть предупреждение о макросах).
  3. Запустить процедуру вручную из редактора VBA и смотреть окно Immediate (Debug.Print) на наличие ошибок.

Роль‑ориентированные чеклисты

Для системного администратора

  • Сохранить шаблон как защищённый файл (.xlsm) в защищённой папке.
  • Показать администраторам, какие поля считаются чувствительными.
  • Настроить политику хранения и удаления устаревших отчётов.

Для разработчика VBA

  • Убедиться в согласованности имён листов и процедур.
  • Добавить обработку ошибок (On Error) в критических местах.
  • Оптимизировать чтение больших массивов, чтобы избежать блокировки Excel.

Для обычного пользователя

  • Не запускать макросы от неизвестных поставщиков.
  • При сомнениях показать файл ответственному администратору.

Отказ, откат и план восстановления

Если после добавления макросов книга вызывает ошибки или поведение нежелательно:

  1. Закройте книгу и откройте копию исходного файла без макросов.
  2. В редакторе VBA закомментируйте строку Private Sub Workbook_Open(), чтобы предотвратить автозапуск.
  3. Удалите/восстановите проблемную процедуру и протестируйте изменения локально.
  4. Восстановите книгу из резервной копии, если не удаётся устранить проблему.

Когда этот подход не подходит (контрпример)

  • В среде с жёсткой политикой безопасности, где макросы запрещены — применяйте SCCM/Intune/PowerShell DSC.
  • Для массовой инвентаризации тысяч машин — лучше использовать централизованные инструменты, а не ручной сбор через Excel.
  • Если требуется минимальное влияние на производительность; некоторые WMI‑запросы (например, Win32_Product) медленные.

Краткая методология внедрения (мини‑метод)

  1. Подготовьте шаблон книги и протестируйте локально.
  2. Добавьте обработку ошибок и логирование (запись в отдельный лог‑лист).
  3. Защитите книгу паролем и распространите среди доверенных администраторов.
  4. Постепенно добавляйте экспорт/агрегацию в централизованное хранилище.

Пример обработчика ошибок для вставки в процедуры

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Настройка Unity в Ubuntu 11.04
Linux

Настройка Unity в Ubuntu 11.04

Установка Anaconda на Ubuntu — пошагово
Руководства

Установка Anaconda на Ubuntu — пошагово

Как создать кастомные виджеты на iPhone
Гайды

Как создать кастомные виджеты на iPhone

Управление музыкой в Google Maps на iPhone и Android
Навигация

Управление музыкой в Google Maps на iPhone и Android

Зачёркивание в Microsoft Word — пошагово
Microsoft Word

Зачёркивание в Microsoft Word — пошагово

OneNote для школы: лучшие приёмы
Образование

OneNote для школы: лучшие приёмы