2013-05-29 5 views
3

Я пишу программу на C# для проведения аппаратного аудита на многих рабочих станциях Windows XP.Определите, какие (если есть) устройства PCI подключаются к разъемам PCI (e) материнской платы

Мне нужно определить, какие PCI-устройства являются фактическими картами, подключенными через слот для материнской платы - НЕ бортовые устройства, которые также используют шины PCI (встроенные в материнскую плату).

Я могу успешно перечислить все устройства, которые используют все шины PCI, используя различные классы WMI, но ни один из них не дает никаких указаний на то, что находится на борту, и то, что подключено через слот.

Я не беспокоюсь о том, как информация извлекается или откуда она поступает (например, Pinvoke, WMI, реестр и т. Д.), Если она надежна.

Спасибо!

+0

Вы проверили класс Win32_OnBoardDevice? –

+0

Да, но он произвольно возвращает видео и сетевые устройства, которые, как я знаю, встроены в материнскую плату и не подключены к аппаратным средствам. Было бы полезно, если Win32_OnBoardDevice возвратил согласованную информацию (например, вернул все встроенные или все не встроенные устройства), но это, похоже, не так. – Bosco

ответ

3

После многих часов я придумал «разумно» надежный подход.

Эта логика принципиально предполагает, что идентификатор шины PCI с разъемами уникален и отделен от всех других (встроенных) идентификаторов шины PCI. Пока мои тесты показали, что это так; несмотря на это все еще предположение.

Мой код довольно долго, и я уверен, что это можно было бы улучшить, так вместо этого я объясню процесс в псевдо-коде:

  1. Определите, сколько слотов используются (и только действовать, если по меньшей мере, один слот на самом деле используется):

    "SELECT SlotDesignation ОТ Win32_SystemSlot ГДЕ CurrentUsage = 4"

  2. S оторвал все идентификаторы устройства, которые принадлежат к шине PCI:

    "SELECT DeviceID ОТ Win32_Bus, где BusType = 5"

  3. Capture все системные и логическое устройство объединения:

    " SELECT * FROM Win32_DeviceBus "

  4. Поиск всех syst em и логических устройств (свойство антецедента) и подсчитывать каждый раз, когда возникает каждый идентификатор устройства.

  5. Теперь вы можете определить идентификатор устройства, в котором находятся слот-устройства PCI, путем поиска идентификатора устройства, который происходит столько же раз, сколько количества устройств, найденных в системных слотах.

  6. Для каждого результата Win32_DeviceBus, содержащего DeviceID (в свойстве antecedent), зависимое свойство будет ссылаться на другой идентификатор устройства, который будет использоваться для класса Win32_PnPEntity.

  7. Запросить Win32_PnPEntity с недавно зарегистрированным DeviceID, и теперь у вас есть вся информация о вашем устройстве (точнее, вся информация, предоставляемая Win32_PnPEntity)!

    "SELECT * FROM Win32_PnPEntity WHERE DeviceID = '" + DeviceId + "'"

К сожалению, я не мог найти способ, чтобы использовать строго ограниченный объем информации, возвращаемой класса Win32_SystemSlot (это сделало бы жизнь слишком простой!), кроме количества результатов, возвращаемых запросом «in use».

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

+0

Интересно, насколько хорошо этот метод будет работать с системами, которые имеют вложенную шину PCI (то есть PCI-мост PCI). – jrh