четверг, 14 октября 2010 г.

Добавление информации о количестве процессоров и наличии гипертрединга в аппаратную инвентаризацию sccm

В sms_def.mof класс win32_processor переопределен классом sms_processor. Как гласит комментарий в sms_def.mof, это сделано для добавление другой специфичной информации о процессоре. И действительно, например, добавлены такие атрибуты как isMulticore, isMobile.

Начиная с win2008/Vista введены новые полезные атрибуты "NumberOfCores" и "NumberofLogicalProcessors".

NumberOfCores - отображает количество ядер. Где ядро - физический процессор, находящийся в микросхеме. Например, в двухъядерном процессоре NumberOfCores будет равно 2.

NumberofLogicalProcessors - отображает количество логических процессоров. Для процессоров с гипертредингом, это значение включает только процессоры с включенным гипертредингом.

  Для того чтобы добавить отображение этих атрибутов в Windows XP SP2 нужно применить следующее обновление http://support.microsoft.com/kb/936235, для Windows 2003 (для x86 - SP1, для x64 - SP2) http://support.microsoft.com/default.aspx/kb/932370

Атрибутов "NumberOfCores" и "NumberofLogicalProcessors" нет в sms_def.mof и для того чтобы добавить их определение, рекомендуется создать новый класс, чтобы не повредить результаты существующих отчетов.

Пример добавления нового класса в sms_def.mof:
// Do NOT change to "false" the existing sms_processor class.

[ SMS_Report (TRUE),
SMS_Group_Name ("Processor_Addtl"),
SMS_Class_ID ("CUSTOM|Processor_Addtl|1.0")]

class win32_processor : SMS_Class_Template
{
[SMS_Report (FALSE) ] uint16 AddressWidth;
[SMS_Report (FALSE) ] uint16 Architecture;
[SMS_Report (FALSE) ] uint16 Availability;
[SMS_Report (FALSE) ] string Caption;
[SMS_Report (FALSE) ] uint32 ConfigManagerErrorCode;
[SMS_Report (FALSE) ] boolean ConfigManagerUserConfig;
[SMS_Report (FALSE) ] uint16 CpuStatus;
[SMS_Report (FALSE) ] uint32 CurrentClockSpeed;
[SMS_Report (FALSE) ] uint16 CurrentVoltage;
[SMS_Report (FALSE) ] uint16 DataWidth;
[SMS_Report (FALSE) ] string Description;
[SMS_Report (TRUE), key ] string DeviceID;
[SMS_Report (FALSE) ] boolean ErrorCleared;
[SMS_Report (FALSE) ] string ErrorDescription;
[SMS_Report (FALSE) ] uint32 ExtClock;
[SMS_Report (FALSE) ] uint16 Family;
[SMS_Report (FALSE) ] datetime InstallDate;
[SMS_Report (FALSE) ] uint32 L2CacheSize;
[SMS_Report (FALSE) ] uint32 L2CacheSpeed;
[SMS_Report (FALSE) ] uint32 LastErrorCode;
[SMS_Report (FALSE) ] uint16 Level;
[SMS_Report (FALSE) ] uint16 LoadPercentage;
[SMS_Report (FALSE) ] string Manufacturer;
[SMS_Report (FALSE) ] uint32 MaxClockSpeed;
[SMS_Report (FALSE) ] string Name;
[SMS_Report (TRUE) ] uint32 NumberOfCores;
[SMS_Report (TRUE) ] uint32 NumberOfLogicalProcessors;
[SMS_Report (FALSE) ] string OtherFamilyDescription;
[SMS_Report (FALSE) ] string PNPDeviceID;
[SMS_Report (FALSE) ] uint16 PowerManagementCapabilities[];
[SMS_Report (FALSE) ] boolean PowerManagementSupported;
[SMS_Report (FALSE) ] string ProcessorId;
[SMS_Report (FALSE) ] uint16 ProcessorType;
[SMS_Report (FALSE) ] uint16 Revision;
[SMS_Report (FALSE) ] string Role;
[SMS_Report (FALSE) ] string SocketDesignation;
[SMS_Report (FALSE) ] string Status;
[SMS_Report (FALSE) ] uint16 StatusInfo;
[SMS_Report (FALSE) ] string Stepping;
[SMS_Report (FALSE) ] string SystemName;
[SMS_Report (FALSE) ] string UniqueId;
[SMS_Report (FALSE) ] uint16 UpgradeMethod;
[SMS_Report (FALSE) ] string Version;
[SMS_Report (FALSE) ] uint32 VoltageCaps;
};

После того как новые данные инвентаризации попадут в базу, можно построить например такой отчет, отображающий информацию об имеющихся процессорах для выбранной рабочей станции:

SELECT
SYS.Netbios_Name0,
Processor.Name0,
Processor.NormSpeed0 as [CPU Speed],
Processor.DeviceID0,
ProcAddtl.NumberOfCores0 as [Number of Cores],
ProcAddtl.NumberOfLogicalProcessors0 as [Number of Logical Processors]
FROM v_R_System SYS
JOIN v_GS_PROCESSOR Processor on SYS.ResourceID=Processor.ResourceID
left join v_gs_Processor_Addtl0 as ProcAddtl on Processor.ResourceID = ProcAddtl.ResourceID
WHERE SYS.Netbios_Name0 LIKE @variable

где переменной "variable" соответствует имя рабочей станции, полученной с помощью следующего запроса:

begin
if (@__filterwildcard = '')
SELECT DISTINCT SYS.Netbios_Name0 from v_R_System SYS ORDER By SYS.Netbios_Name0
else
SELECT DISTINCT SYS.Netbios_Name0 from v_R_System SYS
WHERE SYS.Netbios_Name0 like @__filterwildcard
ORDER By SYS.Netbios_Name0
end

Ссылки по теме:
1. http://msdn.microsoft.com/en-us/library/aa394373%28VS.85%29.aspx
2. http://myitforum.com/cs2/blogs/skissinger/archive/2009/05/19/numberofcores-mof-edit.aspx

2 комментария:

  1. добавил в sms_def.mof.
    при выполнении запроса ругается: Invalid object name 'v_gs_Processor_Addtl0'.
    скажите, пожалуйста, как пнуть сбор новых инвентаризационных данных?

    ОтветитьУдалить
    Ответы
    1. воспользовался http://sourceforge.net/projects/smscollctr/

      Удалить