none
SCCM 2012 Отчет по ПК RRS feed

  • Вопрос

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

    SELECT  distinct 
    CS.name0 as 'Computer Name', 
    CS.domain0 as 'Domain', 
    CS.UserName0 as 'User', 
    BIOS.SerialNumber0 as 'Bios serial', 
    SE.SerialNumber0 as 'System Enclosure serial', 
    CS.Manufacturer0 as 'Manufacturer', 
    CS.Model0 as 'model', 
    OS.Caption0 as 'OS', 
    RAA.SMS_Assigned_Sites0 as 'Site', 
    RAM.TotalPhysicalMemory0 as 'Total Memory', 
    sum(isnull(LDisk.Size0,'0')) as 'Hardrive Size', 
    sum(isnull(LDisk.FreeSpace0,'0')) AS 'Free Space', 
    CPU.MaxClockSpeed0 as 'Max CPU Speed', 
    CPU.Name0 as 'CPU Model', 
    CPU.Is64Bit0 as '64 Bit Compatible' 
    from  
      v_GS_COMPUTER_SYSTEM CS right join v_GS_PC_BIOS BIOS on BIOS.ResourceID = CS.ResourceID 
    right join v_GS_SYSTEM SYS on SYS.ResourceID = CS.ResourceID  
    right join v_GS_OPERATING_SYSTEM OS on OS.ResourceID = CS.ResourceID  
    right join v_RA_System_SMSAssignedSites RAA on RAA.ResourceID = CS.ResourceID 
    right join V_GS_X86_PC_MEMORY RAM on RAM.ResourceID = CS.ResourceID 
    right join v_GS_Logical_Disk LDisk on LDisk.ResourceID = CS.ResourceID 
    right join v_GS_Processor CPU on CPU.ResourceID = CS.ResourceID    
    right join v_GS_SYSTEM_ENCLOSURE SE on SE.ResourceID = CS.ResourceID 
    where 
    LDisk.DriveType0 =3 
    group by 
    CS.Name0, 
    CS.domain0, 
    CS.Username0, 
    BIOS.SerialNumber0, 
    SE.SerialNumber0, 
    CS.Manufacturer0, 
    CS.Model0, 
    OS.Caption0, 
    RAA.SMS_Assigned_Sites0, 
    RAM.TotalPhysicalMemory0, 
    CPU.MaxClockSpeed0, 
    CPU.Name0, 
    CPU.Is64Bit0 
    ORDER BY CS.name0

    В итоге, вместо названия производителя материнки стоит "System manufacture", вместо модели материнской платы - "System product name", по жестким дискам - свободное место показывает  = 0. Хотя если смотреть через Resource Explorer все данные с компьютеров собраны корректно и правильно. 

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

    26 июня 2014 г. 8:19

Ответы

  • Данные по Win32_BaseBoard хранятся в v_GS_BASEBOARD

    Данные по сетевым настройкам хранятся в v_GS_NETWORK_ADAPTER_CONFIGURATION

    С сетевухами (IP адрес, MAC адрес) есть одна тонкость: - у компьютеров может быть несколько сетевых интерфейсов, они могут быть выключены, может быть много IP адресов (в том числе IPv4 и IPv6). Я предпочитаю схлопывать их в одну ячейку, а IPv6 вообще выкидывать (ну и по мелочи фильтровать).

    В результате получается примерно следующий запрос (сами выбирайте, какие колонки вам нужны, а какие нет):

    SELECT  DISTINCT 
    	CS.name0 as 'Computer Name', 
    	CS.domain0 as 'Domain', 
    	CS.UserName0 as 'User', 
    	BASE.Manufacturer0 as 'BaseBoard Manufacturer',
    	BASE.SerialNumber0 as 'BaseBoard SerialNumber',
    	BASE.Model0 as 'BaseBoard Model',
    	BIOS.SerialNumber0 as 'Bios serial', 
    	SE.SerialNumber0 as 'System Enclosure serial', 
    	CS.Manufacturer0 as 'Manufacturer', 
    	CS.Model0 as 'model', 
    	OS.Caption0 as 'OS', 
    	RAA.SMS_Assigned_Sites0 as 'Site', 
    	RAM.TotalPhysicalMemory0 as 'Total Memory', 
    	sum(isnull(LDisk.Size0,'0')) as 'Hardrive Size', 
    	sum(isnull(LDisk.FreeSpace0,'0')) AS 'Free Space', 
    	CPU.MaxClockSpeed0 as 'Max CPU Speed', 
    	CPU.Name0 as 'CPU Model', 
    	CPU.Is64Bit0 as '64 Bit Compatible' ,
    	STUFF(( SELECT '; ' + NET.IPAddress0 FROM v_GS_NETWORK_ADAPTER_CONFIGURATION NET 
    		WHERE CS.ResourceID=NET.ResourceID 
    		AND NET.IPEnabled0='1' -- Enabled
    		AND NET.IPAddress0 != '0.0.0.0' -- Local Address
    		AND NET.IPAddress0 NOT LIKE '169.254.%' -- APIPA
    		AND NET.IPAddress0 NOT LIKE '%:%' -- IPv6
    		AND NET.IPAddress0 IS NOT NULL
    		GROUP BY NET.IPAddress0
    		FOR XML PATH ('')),1,1,'') as 'IP Addresses',
    	STUFF(( SELECT '; ' + NET.MACAddress0 FROM v_GS_NETWORK_ADAPTER_CONFIGURATION NET 
    		WHERE CS.ResourceID=NET.ResourceID 
    		AND NET.IPEnabled0='1' -- Enabled
    		AND NET.MACAddress0 IS NOT NULL
    		GROUP BY NET.MACAddress0
    		FOR XML PATH ('')),1,1,'') as 'MAC Addresses'
    FROM  v_GS_COMPUTER_SYSTEM CS 
    RIGHT JOIN v_GS_PC_BIOS BIOS ON BIOS.ResourceID = CS.ResourceID 
    RIGHT JOIN v_GS_SYSTEM SYS ON SYS.ResourceID = CS.ResourceID  
    RIGHT JOIN v_GS_OPERATING_SYSTEM OS ON OS.ResourceID = CS.ResourceID  
    RIGHT JOIN v_RA_System_SMSAssignedSites RAA ON RAA.ResourceID = CS.ResourceID 
    RIGHT JOIN V_GS_X86_PC_MEMORY RAM ON RAM.ResourceID = CS.ResourceID 
    RIGHT JOIN v_GS_Logical_Disk LDisk ON LDisk.ResourceID = CS.ResourceID 
    RIGHT JOIN v_GS_Processor CPU ON CPU.ResourceID = CS.ResourceID    
    RIGHT JOIN v_GS_SYSTEM_ENCLOSURE SE ON SE.ResourceID = CS.ResourceID 
    RIGHT JOIN v_GS_BASEBOARD BASE ON BASE.ResourceID = CS.ResourceID 
    WHERE 
    	LDisk.DriveType0 =3 
    GROUP BY 
    	CS.ResourceID,
    	CS.Name0, 
    	CS.domain0, 
    	CS.Username0, 
    	BASE.Manufacturer0,
    	BASE.SerialNumber0,
    	BASE.Model0,
    	BIOS.SerialNumber0, 
    	SE.SerialNumber0, 
    	CS.Manufacturer0, 
    	CS.Model0, 
    	OS.Caption0, 
    	RAA.SMS_Assigned_Sites0, 
    	RAM.TotalPhysicalMemory0, 
    	CPU.MaxClockSpeed0, 
    	CPU.Name0, 
    	CPU.Is64Bit0 
    ORDER BY CS.name0
    Есть один нюанс - запрос покажет пустые результаты, если не включали инвентаризацию Win32_BaseBoard
    • Предложено в качестве ответа PeTrProduct 26 июня 2014 г. 12:52
    • Изменено PeTrProduct 26 июня 2014 г. 12:53
    • Помечено в качестве ответа Dshumov 26 июня 2014 г. 12:53
    26 июня 2014 г. 12:50

Все ответы

  • Отчет полностью правильный, ошибок нет. Какие данные собрались, такие вы и видите в результатах, в данном случае - без вариантов (если не рассматривать вариант что базы SCCM перепутали))).

    Проверяйте, какой компьютер вы смотрите в Resource Explorer, а на какой смотрите в запросе. Наверняка это просто разные компьютеры, т.к. данные в любом случае смотрятся именно в этих вьюхах.

    Произвоитель и модель - обычные для NoName коробок, у брендовых устройств всё определяется правильно. В запросе ошибки нет, именно там они и должны находиться в БД.

    Пустое свободное место - обычная ситуация для схемы инвентаризации по умолчанию. Чтобы включить сбор этого атрибута поправьте клиентскую политику: Hardware Inventory > Set Classes -> найти "Logical Disk" и поставить галочку напротив атрибута "Free Space (MB)". А без этого в соответствующих полях в качестве значения стоит NULL, которые вы преобразуете в 0 через ISNULL. Так что этот ноль в отчете нужно воспринимать как НЕТ ДАННЫХ.

    • Предложено в качестве ответа PeTrProduct 26 июня 2014 г. 11:48
    26 июня 2014 г. 11:48
  • Спасибо. Да, вы правы, компы не брендовые. А можно ли как-то к этому отчету привязать BaseBoard? Кажется так этот класс называется. Я его включал в Set Classes. И Resource Explorer я смотрел именно ветку  BaseBoard.

    В идеале хотелось бы видеть отчет с такими данными:

    CPU,Memory,BaseBoard,IP,MAC Address,NetBIOS Name

    • Изменено Dshumov 26 июня 2014 г. 12:06
    26 июня 2014 г. 12:01
  • Данные по Win32_BaseBoard хранятся в v_GS_BASEBOARD

    Данные по сетевым настройкам хранятся в v_GS_NETWORK_ADAPTER_CONFIGURATION

    С сетевухами (IP адрес, MAC адрес) есть одна тонкость: - у компьютеров может быть несколько сетевых интерфейсов, они могут быть выключены, может быть много IP адресов (в том числе IPv4 и IPv6). Я предпочитаю схлопывать их в одну ячейку, а IPv6 вообще выкидывать (ну и по мелочи фильтровать).

    В результате получается примерно следующий запрос (сами выбирайте, какие колонки вам нужны, а какие нет):

    SELECT  DISTINCT 
    	CS.name0 as 'Computer Name', 
    	CS.domain0 as 'Domain', 
    	CS.UserName0 as 'User', 
    	BASE.Manufacturer0 as 'BaseBoard Manufacturer',
    	BASE.SerialNumber0 as 'BaseBoard SerialNumber',
    	BASE.Model0 as 'BaseBoard Model',
    	BIOS.SerialNumber0 as 'Bios serial', 
    	SE.SerialNumber0 as 'System Enclosure serial', 
    	CS.Manufacturer0 as 'Manufacturer', 
    	CS.Model0 as 'model', 
    	OS.Caption0 as 'OS', 
    	RAA.SMS_Assigned_Sites0 as 'Site', 
    	RAM.TotalPhysicalMemory0 as 'Total Memory', 
    	sum(isnull(LDisk.Size0,'0')) as 'Hardrive Size', 
    	sum(isnull(LDisk.FreeSpace0,'0')) AS 'Free Space', 
    	CPU.MaxClockSpeed0 as 'Max CPU Speed', 
    	CPU.Name0 as 'CPU Model', 
    	CPU.Is64Bit0 as '64 Bit Compatible' ,
    	STUFF(( SELECT '; ' + NET.IPAddress0 FROM v_GS_NETWORK_ADAPTER_CONFIGURATION NET 
    		WHERE CS.ResourceID=NET.ResourceID 
    		AND NET.IPEnabled0='1' -- Enabled
    		AND NET.IPAddress0 != '0.0.0.0' -- Local Address
    		AND NET.IPAddress0 NOT LIKE '169.254.%' -- APIPA
    		AND NET.IPAddress0 NOT LIKE '%:%' -- IPv6
    		AND NET.IPAddress0 IS NOT NULL
    		GROUP BY NET.IPAddress0
    		FOR XML PATH ('')),1,1,'') as 'IP Addresses',
    	STUFF(( SELECT '; ' + NET.MACAddress0 FROM v_GS_NETWORK_ADAPTER_CONFIGURATION NET 
    		WHERE CS.ResourceID=NET.ResourceID 
    		AND NET.IPEnabled0='1' -- Enabled
    		AND NET.MACAddress0 IS NOT NULL
    		GROUP BY NET.MACAddress0
    		FOR XML PATH ('')),1,1,'') as 'MAC Addresses'
    FROM  v_GS_COMPUTER_SYSTEM CS 
    RIGHT JOIN v_GS_PC_BIOS BIOS ON BIOS.ResourceID = CS.ResourceID 
    RIGHT JOIN v_GS_SYSTEM SYS ON SYS.ResourceID = CS.ResourceID  
    RIGHT JOIN v_GS_OPERATING_SYSTEM OS ON OS.ResourceID = CS.ResourceID  
    RIGHT JOIN v_RA_System_SMSAssignedSites RAA ON RAA.ResourceID = CS.ResourceID 
    RIGHT JOIN V_GS_X86_PC_MEMORY RAM ON RAM.ResourceID = CS.ResourceID 
    RIGHT JOIN v_GS_Logical_Disk LDisk ON LDisk.ResourceID = CS.ResourceID 
    RIGHT JOIN v_GS_Processor CPU ON CPU.ResourceID = CS.ResourceID    
    RIGHT JOIN v_GS_SYSTEM_ENCLOSURE SE ON SE.ResourceID = CS.ResourceID 
    RIGHT JOIN v_GS_BASEBOARD BASE ON BASE.ResourceID = CS.ResourceID 
    WHERE 
    	LDisk.DriveType0 =3 
    GROUP BY 
    	CS.ResourceID,
    	CS.Name0, 
    	CS.domain0, 
    	CS.Username0, 
    	BASE.Manufacturer0,
    	BASE.SerialNumber0,
    	BASE.Model0,
    	BIOS.SerialNumber0, 
    	SE.SerialNumber0, 
    	CS.Manufacturer0, 
    	CS.Model0, 
    	OS.Caption0, 
    	RAA.SMS_Assigned_Sites0, 
    	RAM.TotalPhysicalMemory0, 
    	CPU.MaxClockSpeed0, 
    	CPU.Name0, 
    	CPU.Is64Bit0 
    ORDER BY CS.name0
    Есть один нюанс - запрос покажет пустые результаты, если не включали инвентаризацию Win32_BaseBoard
    • Предложено в качестве ответа PeTrProduct 26 июня 2014 г. 12:52
    • Изменено PeTrProduct 26 июня 2014 г. 12:53
    • Помечено в качестве ответа Dshumov 26 июня 2014 г. 12:53
    26 июня 2014 г. 12:50
  • Спасибище! Буду разбираться с как это сделано.
    26 июня 2014 г. 12:54
  • А у меня все равно получается такая история у большей части машину IP null
    
    • Изменено butunin 2 сентября 2015 г. 10:32
    2 сентября 2015 г. 9:24
  • ну скорее всего просто не хватает классов, которые вы выбрали в инвентаризации, смотрите класс Win32_NetworkAdapterConfiguration в настройках агента и инвентаризации + на какие коллекции деплоится политика.

    Get-WmiObject Win32_NetworkAdapterConfiguration | fl ipaddress
    а нас интересует IpAddress
    2 сентября 2015 г. 15:39
    Модератор
  • Классов хватает, так как у части машин отчет от IP есть ... 
    11 сентября 2015 г. 10:21
  • ну, а вы посмотрите, что на этой машине с WMI, какие данные в классе, применяются ли политики агента на коллекцию, в которой лежит машина и что с логам по инвентаризации.
    11 сентября 2015 г. 10:45
    Модератор