расширение инвентаризации при помощи MIF

Как известно, SCCM умеет инвентаризировать реестр и WMI. Часто возникает ситуация, когда собираемых сведений недостаточно и инвентаризацию нужно расширить, например, добавить в отчёт информацию о дате закупки ПК, переноса на другое рабочее место, серийный номер с наклейки на корпусе и т.д. Сделать это можно тремя способами, добавляя (или регулярно добавлять скриптами, обновляя) информацию в:

1. реестр и научить SCCM опрашивать нужные ветки и ключи;

2. WMI и научить SCCM опрашивать нужные классы;

3. MIF-файл. Учить не нужно: SCCM уже умеет вычитывать информацию из MIF-файлов (Management Information Format).

Организация Distributed Management Task Force (DMTF) занимается разработкой и поддержкой стандартов для управления системами. DMTF разработала CIM, WBEM (и его реализация на Windows — WMI), DMI и прочие стандарты, которые используются множеством вендоров. DMI — устаревший стандарт для управления программным обеспечением и аппаратными комплектующими, не зависим от вендора, операционной системы, протоколов управления и «железа».

DMI-архитектура состоит из DMI Service Provider (Service Layer — в старых спецификациях) — локальной резидентной программы, постоянно работающей в памяти, которая является связующим звеном между интерфейсом управляющей программы (Management Interface, MI), которая запрашивает информацию из MIF-базы, и DMI-совместимыми программами и аппаратными комплектующими (Component Interface, CI), которые через свой API вносят информацию в MIF-базу. Информация должна быть описана при помощи MIF — системонезависимого формата, а файлы, содержащие информацию о приложениях и комплектующих, называются MIF-файлами. Вся эта схема выглядит примерно так:

А если сказать совсем просто, то SCCM работает с DMI Service Provider через агента аппаратной инвентаризации, который умеет собирать информацию из MIF-файлов. SCCM умеет работать с IDMIF и NOIDMIF.

IDMIF — файлы с уникальным идентификатором, которые не ассоциированы с клиентом SCCM. Эти файлы отсылаются отдельно от отчёта по инвентаризации. В эти файлы вносят информацию, которая не связана напрямую с компьютером, например, имя копира или модель проектора. При удалении этих файлов с компьютера, информация из базы SCCM не удаляется.

NOIDMIF — файлы, привязанные к идентификатору компьютера, с которого они собраны. Информация из NOIDMIF прикрепляется к отчёту об инвентаризации. В эти файлы вносят информацию, связанную с компьютером, например, серийный номер и т.п. При удалении файлов с компьютера, информация удаляется из базы SCCM.

Если классы, описанные в MIF-файлах, являются уникальными, то они появятся в базе SCCM. В ином случае информация будет добавляться в уже существующие таблицы.

MIF-файлы — это ASCII-файлы, которые могут быть созданы в любом текстовом редакторе. Структура MIF-файла простая и состоит из компонента, групп внутри компонента и атрибутов внутри групп:

start component
start path
end path
start enum
end enum
start group
start attribute
start enum
end enum
end attribute
end group
start table
end table
end component

Логическую вложенность можно описать так: MIF -> Component -> Group -> Class -> Attribute.

Start и End определяют область блока. Компонент внутри MIF-файла может быть только один. Группы, классы и атрибуты (внутри группы) должны иметь уникальные идентификаторы.

Типы данных, которые используются в MIF:

Определяем компонент, даём ему какое-то разумное название:

Start Component
Name = "System Information"

Определяем группу атрибутов (именно это имя мы будем видеть в Resource Explorer) и класс. Класс внутри группы используется для определения группы и версии группы. Ключ является уникальным свойством, определяющим экземпляр класса. Если используется более одного экземпляра класса, ключ должен присутствовать, иначе последующие экземпляры класса будут затирать предыдущие:

Start Group
Name = "SuperFirma Info"
ID = 1
Class = "PCInfo"
Key = 1

Определяем атрибут, используя строковый тип данных:

Start Attribute
Name = "Serial Number"
ID = 1
Type = String(10)
Value = "556677"
End Attribute

Добавляем другие атрибуты, в итоге получая вот такой файл:

Start Component
Name = "System Information"
Start Group
Name = "SuperFirma Info"
ID = 1
Class = "PCInfo"
Key = 1
Start Attribute
Name = "Serial Number"
ID = 1
Type = String(10)
Value = "556677"
End Attribute
Start Attribute
Name = "Color"
ID = 2
Type = String(20)
Value = "зелёный"
End Attribute
Start Attribute
Name = "Vidan"
ID = 3
Type = String(10)
Value = "2.12.2011"
End Attribute
Start Attribute
Name = "Komu"
ID = 4
Type = String(30)
Value = "Маше Ивановой"
End Attribute
Start Attribute
Name = "DopInfo"
ID = 5
Type = String(50)
Value = "Третий размер"
End Attribute
End Group
End Component

Сохраняем текст в какое-то_имя.mif и проверяем его на корректный синтаксис при помощи утилиты MIFcheck:

Полученный файл помещаем в папку клиента CCM\Inventory\noidmifs. В агенте инвентаризации включаем сбор MIF-файлов:

После обновления политик на клиенте запускаем Hardware Inventory Cycle. Получив от клиента отчёт об инвентаризации, вот такие изменения наблюдаем в Resource Explorer:

В результате мы получили новый WMI-класс SMS_G_System_PCINFO, таблицу SuperFirma_Info_DATA и соответствующее ей представление v_GS_SuperFirma_Info0.

dataldr.log:

Moving MIF file C:\Program Files (x86)\Microsoft Configuration Manager\inboxes\auth\dataldr.box\H0CJNUXW.MIF to C:\Program Files (x86)\Microsoft Configuration Manager\inboxes\auth\dataldr.box\process\H0CJNUXW.MIF
Started the machine MIF processing thread, thread ID = AF0
Worker thread 4672 starting execution.
Done with job queueing.
Blocking until completion.
Thread: 0 is using GUID
Thread: 4672 will use GUID GUID:6EE8DB9B-AB50-4998-BA99-8068D806C51B
Processing Inventory for Machine: SCCM01 Version 1.87 Generated: 12/13/2011 12:56:55
CGroup::DefineGroupAndAttributes — Detected schema change. Waiting for the threads to finish the queue.
Thread 4672 has been granted exclusive access.
CGroup::DefineGroupAndAttributes — Proceeding with schema change.
Defining group Class: PCINFO…
group Name : SuperFirma Info…
CSqlSchema::CreateProcedure pSuperFirma_Info_DATA at 12/13/11 12:57:11
CSqlSchema::CreateProcedure dSuperFirma_Info_DATA at 12/13/11 12:57:11
done

Строим отчёт:

SELECT dbo.v_R_System.Name0 AS [PC name], dbo.v_GS_SuperFirma_Info0.Serial_Number00 AS [Serial number], dbo.v_GS_SuperFirma_Info0.Color0 AS Color,
dbo.v_GS_SuperFirma_Info0.Vidan0 AS [Give out], dbo.v_GS_SuperFirma_Info0.Komu0 AS [User Name], dbo.v_GS_SuperFirma_Info0.DopInfo0 AS [Additional info]
FROM dbo.v_GS_SuperFirma_Info0 INNER JOIN
dbo.v_R_System ON dbo.v_GS_SuperFirma_Info0.ResourceID = dbo.v_R_System.ResourceID

26 комментариев

  1. Первым делом спасибо за статью.

    Появился вопрос — насколько я понял, информация, загружаемая из mif файлов, уже должна быть в них, скажем так, статически прописана. А если мы хотим собрать некую «динамическую» информацию, например значение ключа в реестре или что-то в этом роде? С помощью mif фалов это можно сделать?

    Или же для решения этой задачи можно использовать только следующие вещи — формирование mif файла при помощи скрипта, который запихнет в этот самый mif всю необходимую информацию, либо правкой файла sms_def.mof?

  2. p.s. additional info порадовало 😀

  3. XD:

    А вот зачем как собрать серийные номера мониторов?
    «http://community.spiceworks.com/scripts/show/645-get-serial-number-model-of-monitor»
    выполнить на стороне клиента создать mof файл и запихнуть в него полученную инфу, интересует теперь как её от туда вытащить теперь в отчет SCCM

  4. XD:

    Благодарю за быстрый ответ, а теперь вопрос такой, что делать с машинами на которых не установлен клиент или они не в домене,решено что будет сервис, запускающий предыдущий скрипт (c поправками ) и сохранять некий отчет FTP сервере раз в день, теперь надо построить запрос и отчет в SCCM из файла на FTP.
    P.S. Политика безопасности предприятия не позволяет установки клиента и ввода некоторых машин в домен.
    за этот ответ с меня BAGbeer ^_^

  5. XD:

    найдено решение лучше и быстрее
    «http://www.myitforum.com/articles/8/view.asp?id=8489»
    не надо раскатывать .net 3.5 на все машины, причем добавление WMI класса успешно прошло только на winXP 🙁

  6. XD:

    Немного не точно написал объяснение. Про Wmi это было сказано на счет ссылок на статьи
    http://bowden-it.net/wordpress/?p=45
    http://bowden-it.net/wordpress/?p=48
    там пакет добавление класса Win32_MonitorDetails требует .net 3.5 sp1, все отработало на winXP, на ОС выше возвращается только PnPID монитора, хотя конечно понятно что обновление поставщика Wmi делает то же что и скрипт собирающий сырую инфу из EDID.
    ЗЫ. Обновление Wmi и раскатывание .net на 2к парка, очень много логов получу :), и не дай бог кто нить из админов запустит средства восстановления WMi.
    зато теперь знаю что кто то не читал(пробовал) статьи 🙂 которые линканул.
    закончу с MOF отпишусь о результатах

  7. XD:

    доброе утро всем, спешу поделиться что все отработало как часы (были некоторые проблемы но ни как не связанные с тем что делал с MOF.)

  8. KoVo:

    Спасибо, отличная статья!
    Делаю свои попытки в освоении материала. Буду признателен за помощь и мысли, в преобразовании .dat файла, примерно такого содержания:

    в .mif файл с целью дальнейшего сбора через SCCM информации по использованию сетевого трафика на разных интерфейсах, в частности 3G модема. Нужна помощь в написании скрипта или наставления как лучше поступить в данной ситуации?

    • KoVo:

      пардон) вот так выглядит кусок нужного в обработке .dat файла
      xml
      total
      item device=»HUAWEI Mobile Connect» apn=»ISP» starttime=»1321858191″ endtime=»1321861619″ time=»3428″ uploaded=»1921412″ downloaded=»18166608″ unitprice=»0″ fee=»0″ type=»0″
      total
      xml

    • admin:

      Если информация статическая, то mif легко получить, воспользовавшись примером в посте. Если динамическая, то нужно писать скрипт, который периодически будет вычитывать данные и заносить их в mif.

  9. KoVo:

    Большое Спасибо! Информация, динамическая (количество item device со временем растет). Правильно ли я понимаю, дабы не перезаписывать значения собираемых атрибутов их id придется увеличивать, тем самым накапливаю нужную информацию? Нет ли под рукой примера схожего по смыслу скрипта?

    • admin:

      Я Вас не совсем понял по поводу количества.

    • admin:

      Если Ваш 3G-модем определяется системой, то, возможно, нужная Вам информация об устройстве есть в реестре или WMI. Тогда нужно морочиться с sms_def.mof, но это будет сделано единожды и будет применяться ко всем клиентам.

      • KoVo:

        Прошу прощения за путаницу. Подразумевал, что в исходном файле с течением времени будет увеличиваться количество строк содержащих информацию про item device, а также их uploaded=»1921412? downloaded=»18166608? . Именно эту информацию, а также трафик и хотелось бы аккумулировать и не перезаписывать в отчете. Может быть для данной задачи средства инвентаризации SCCM не слишком подходят?

        • admin:

          Если принебречь отображением в реальном времени, то SCCM может показывать исторические данные. В Вашем случае — объём трафика за сегодня, вчера, позавчера и т.д. В данном случае нужно писать скрипт, который будет регулярно считывать .dat и вносить информацию в .mif, либо единожды править sms_def.mof (если мы говорим про SCCM 2007).

          Ещё можно поглядеть в сторону SCOM.

  10. […] расширить инвентаризацию при помощи MIF-файлов, как это делал для SCCM 2007, но столкнулся с ошибкой при обработке отчёта […]

Leave a Reply to ololo