using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Reflection; using Intel.Management.Wsman; namespace Intel.Management.PSModule.Amt { class InventoryService : DriveContainer { public InventoryService(DriveItem parent) : base("HardwareAssets", parent) { _items = null; } public override void GetChildItems(ChildWriter writer) { writer.Add(new Bios(this)); writer.Add(new Baseboard(this)); writer.Add(new ComputerSystem(this)); writer.Add(new Memory(this)); writer.Add(new Fru(this)); writer.Add(new Cpu(this)); //wrtier.Add(new Cooling(this)); } IWsmanEnumeration ExecQuery(string query) { IWsmanConnection conn = ((AmtRootService)GetRoot()).Connection; return conn.ExecQuery(query); } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } /* class Container { public override string ToString() { return "Container"; } }*/ class HardwareItem : DriveContainer { public HardwareItem(string name,DriveItem parent) : base(name, parent) { _value = new Container(); } public void AddValues(string[] values,IManagedInstance itemObj) { List list = GetChildList(); foreach (string name in values) { IWsmanItem result = itemObj.GetProperty(name); if (!result.IsNull && result.IsString) list.Add(new DriveEntry(name,result.ToString(),this)); else if (!result.IsNull && result.IsObject) list.Add(new DriveEntry(name, AmtDriveInfo.FormatDate(result), this)); } _items=list.ToArray(); } public void AddValues(string[] values, IManagedInstance itemObj, Type type) { List list = GetChildList(); foreach (string name in values) { IWsmanItem result = itemObj.GetProperty(name); if (!result.IsNull && result.IsString) { //on the type object find a parse string method Type[] types={typeof(string)}; object[] methodParams={result.ToString()}; MethodInfo parseInfo=type.GetMethod("Parse", types); if (parseInfo != null) list.Add(new DriveEntry(name, parseInfo.Invoke(type, methodParams), this)); else list.Add(new DriveEntry(name, result.ToString(), this)); } } _items = list.ToArray(); } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }// end hardware item class Bios : DriveContainer { public Bios(DriveItem parent) : base("BIOS", parent) { _items = null; _value = new Container(); } public override void GetChildItems(ChildWriter writer) { InventoryService service = (InventoryService)Parent; //Read BIOS information //Select PartComponent From CIM_SystemBIOS IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM CIM_SystemBIOS"); foreach (IWsmanItem item in colObj) { //get the BIOS element IManagedInstance biosObj = item.Object.GetProperty("PartComponent").Ref.Get(); HardwareItem newBios = new HardwareItem(biosObj.GetProperty("ElementName").ToString(), this); string[] biosValues = { "Version","ReleaseDate","Manufacturer"}; newBios.AddValues(biosValues,biosObj); writer.Add(newBios); IWsmanEnumeration features = service.ExecQuery("SELECT * FROM CIM_BIOSFeatureBIOSElements"); foreach (IWsmanItem elements in features) { IManagedInstance partObj = elements.Object.GetProperty("PartComponent").Ref.Get(); if (partObj.GetProperty("Name").ToString().Equals(biosObj.GetProperty("Name").ToString())) { IManagedInstance groupObj = elements.Object.GetProperty("GroupComponent").Ref.Get(); HardwareItem newFeature = new HardwareItem( groupObj.GetProperty("ElementName").ToString(), this); string[] featureValues = { "Characteristics" }; newFeature.AddValues(featureValues, groupObj); writer.Add(newFeature); } } //for each feature }// foreach Bios }//end GetChildern public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }//End Bios Class class Baseboard : DriveContainer { public Baseboard(DriveItem parent) : base("Baseboard", parent) { _items = null; _value = new Container(); } public override void GetChildItems(ChildWriter writer) { InventoryService service = (InventoryService)Parent; //Read MotherBoard Information -Select From CIM_Card IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM CIM_Card"); foreach (IWsmanItem item in colObj) { HardwareItem newItem = new HardwareItem( item.Object.GetProperty("ElementName").ToString(), this); string[] boardValues = { "Manufacturer", "Model", "Version", "SerialNumber", "Tag" }; newItem.AddValues(boardValues, item.Object); writer.Add(newItem); }//foreach card } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }//End BaseBoard Class class ComputerSystem : DriveContainer { public ComputerSystem(DriveItem parent) : base("ComputerSystem", parent) { _items = null; _value = new Container(); } public override void GetChildItems(ChildWriter writer) { InventoryService service = (InventoryService)Parent; //Read Chassis information - Select From CIM_ComputerSystemPackage IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM CIM_ComputerSystemPackage"); foreach (IWsmanItem item in colObj) { IManagedInstance compObj = item.Object.GetProperty("Dependent").Ref.Get(); DriveItem newItem = new DriveEntry(compObj.GetProperty("Name").ToString(), AmtDriveInfo.FormatGuid(item.Object.GetProperty("PlatformGUID").ToString()), this); writer.Add(newItem); //Read Chassis information - Select From CIM_ComputerSystemPackage IManagedInstance chasObj = item.Object.GetProperty("Antecedent").Ref.Get(); HardwareItem newChas = new HardwareItem(" ", this); string[] boardValues = { "Model", "Manufacturer", "Version", "SerialNumber" }; newChas.AddValues(boardValues,chasObj); writer.Add(newChas); } } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }//end ComputerSystem class PowerSupply : DriveContainer { public PowerSupply(DriveItem parent) : base("PowerSupply", parent) { _items = null; _value = new Container(); } public override void GetChildItems(ChildWriter writer) { InventoryService service = (InventoryService)Parent; //Read PowerSupply information - Select From CIM_PowerSupply IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM CIM_PowerSupply"); foreach (IWsmanItem item in colObj) { //ProcessItem(new HardwareItem(service, item.Object, this), // list, provider, path, recurse); } } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }//end PowerSupply class class Cooling : DriveContainer { public Cooling(DriveItem parent) : base("Cooling", parent) { _items = null; _value = new Container(); } public override void GetChildItems(ChildWriter writer) { InventoryService service = (InventoryService)Parent; //Read cooling device information IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM CIM_Fan"); foreach (IWsmanItem item in colObj) { // ProcessItem(new HardwareItem(service, item.Object, this), // list, provider, path, recurse); } } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }// end Cooling class class Fru : DriveContainer { public Fru(DriveItem parent) : base("FRU", parent) { _items = null; _value = new Container(); } public override void GetChildItems(ChildWriter writer) { InventoryService service = (InventoryService)Parent; //Read PCI device Information - Select from AMT_PCIDevice IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM AMT_PCIDevice"); foreach (IWsmanItem item in colObj) { HardwareItem newItem = new HardwareItem( item.Object.GetProperty("DeviceID").ToString(), this); string[] values ={"VendorID","RevisionID","ProgIf","Subclass", "ClassCode","SubsystemVendorID","SubsystemID", "DeviceLocation"}; newItem.AddValues(values, item.Object); writer.Add(newItem); } } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }//end Fru class class Memory : DriveContainer { public Memory(DriveItem parent) : base("Memory", parent) { _items = null; _value = new Container(); } public override void GetChildItems(ChildWriter writer) { InventoryService service = (InventoryService)Parent; //Read Processor Information IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM CIM_Memory"); foreach (IWsmanItem item in colObj) { HardwareItem newItem = new HardwareItem( item.Object.GetProperty("DeviceID").ToString(), this); ValueMap valueMap = ValueMap.Create( item.Object.GetProperty("Access").ToString(), ValueList.MemoryAccess); newItem.AddChildItem(new DriveEntry("Access", valueMap, newItem)); newItem.AddChildItem(new DriveEntry("ConsumableBlocks", ulong.Parse(item.Object.GetProperty("ConsumableBlocks").ToString()), newItem)); newItem.AddChildItem(new DriveEntry("BlockSize", ulong.Parse(item.Object.GetProperty("BlockSize").ToString()), newItem)); newItem.AddChildItem(new DriveEntry("NumberOfBlocks", ulong.Parse(item.Object.GetProperty("NumberOfBlocks").ToString()), newItem)); newItem.AddChildItem(new DriveEntry("Volatile", bool.Parse(item.Object.GetProperty("Volatile").ToString()), newItem)); writer.Add(newItem); HardwareItem newDevices = new HardwareItem( "Devices", this); IWsmanEnumeration memDevices = service.ExecQuery("SELECT * FROM CIM_PhysicalMemory"); foreach (IWsmanItem deviceObj in memDevices) { HardwareItem newDevice = new HardwareItem( deviceObj.Object.GetProperty("Tag").ToString(), this); string[] values = { "Tag", "BankLabel", "PartNumber", "SerialNumber", "Manufacturer" }; newDevice.AddValues(values, deviceObj.Object); newDevice.AddChildItem(new DriveEntry("Capacity", ulong.Parse(deviceObj.Object.GetProperty("Capacity").ToString()), newItem)); newDevice.AddChildItem(new DriveEntry("Speed", uint.Parse(deviceObj.Object.GetProperty("Speed").ToString()), newItem)); valueMap = ValueMap.Create( deviceObj.Object.GetProperty("MemoryType").ToString(), ValueList.MemoryType); newDevice.AddChildItem(new DriveEntry("MemoryType", valueMap, newItem)); valueMap = ValueMap.Create( deviceObj.Object.GetProperty("FormFactor").ToString(), ValueList.MemoryFormFactor); newDevice.AddChildItem(new DriveEntry("FormFactor", valueMap, newItem)); newDevices.AddChildItem(newDevice); } writer.Add(newDevices); }//foreach CIM_Memory } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }//end memory class //class MediaDevice : DriveContainer //{ // public MeduaDevice(DriveItem parent) // : base("MeduaDevice", parent) // { // _items = null; // _value = new Container(); // } // public override void GetChildItems(ChildWriter writer) // { // InventoryService service = (InventoryService)Parent; // IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM CIM_MediaAccessDevice"); // foreach (IWsmanItem item in colObj) // { // HardwareItem newItem = new HardwareItem( // item.Object.GetProperty("DeviceID").ToString(), // this); // ValueMap valueMap = ValueMap.Create( // item.Object.GetProperty("MaxMediaSize").ToString(), // ValueList.MaxMediaSize); // newItem.AddChildItem(new DriveEntry("MaxMediaSize", valueMap, newItem)); // writer.Add(newItem); // } // IWsmanEnumeration cimRealizeObj = service.ExecQuery("SELECT * FROM CIM_Realizes"); // IManagedInstance packageInstance = null; // foreach (IWsmanItem item in cimRealizeObj) // { // if (item.Object.GetProperty("Dependent").IsA("CIM_Processor")) // { // IManagedInstance cpuObj = item.Object.GetProperty("Dependent").Ref.Get(); // IManagedInstance chipObj = item.Object.GetProperty("Antecedent").Ref.Get() // } // cimRealizeObj.AddSelector("Dependent", mediaDevice.Object.ToReference("DeviceID")); // } // public override object GetReturnObject() // { // return new NameValuePairItem(Name, Value); // } //}//end ComputerSystem class Cpu : DriveContainer { public Cpu(DriveItem parent) : base("Cpu", parent) { _items = null; _value = new Container(); } public override void GetChildItems(ChildWriter writer) { InventoryService service = (InventoryService)Parent; //Read Processor Information IWsmanEnumeration colObj = service.ExecQuery("SELECT * FROM CIM_Realizes"); foreach (IWsmanItem item in colObj) { //GroupComponent //PartComponent if (item.Object.GetProperty("Dependent").IsA("CIM_Processor")) { IManagedInstance cpuObj = item.Object.GetProperty("Dependent").Ref.Get(); IManagedInstance chipObj = item.Object.GetProperty("Antecedent").Ref.Get(); HardwareItem newItem = new HardwareItem( cpuObj.GetProperty("DeviceID").ToString() , this); string[] cpuValues = { "Role", "Stepping", }; newItem.AddValues(cpuValues, chipObj); ValueMap valueMap = ValueMap.Create( cpuObj.GetProperty("Family").ToString(), ValueList.CpuFamily); newItem.AddChildItem(new DriveEntry("Family", valueMap, newItem)); newItem.AddChildItem(new DriveEntry("CurrentClockSpeed", uint.Parse(cpuObj.GetProperty("CurrentClockSpeed").ToString()), newItem)); newItem.AddChildItem(new DriveEntry("MaxClockSpeed", uint.Parse(cpuObj.GetProperty("MaxClockSpeed").ToString()), newItem)); if (!cpuObj.GetProperty("ExternalBusClockSpeed").IsNull) { newItem.AddChildItem(new DriveEntry("ExternalBusClockSpeed", uint.Parse(cpuObj.GetProperty("ExternalBusClockSpeed").ToString()), newItem)); } valueMap = ValueMap.Create( cpuObj.GetProperty("CPUStatus").ToString(), ValueList.CpuStatus); newItem.AddChildItem(new DriveEntry("CPUStatus", valueMap, newItem)); valueMap = ValueMap.Create( cpuObj.GetProperty("UpgradeMethod").ToString(), ValueList.CpuUpgradeMethod); newItem.AddChildItem(new DriveEntry("UpgradeMethod", valueMap, newItem)); string[] chipValues = { "Manufacturer", "Version" }; newItem.AddValues(chipValues, chipObj); bool locationFound = false; try { // Select PhysicalLocation from CIM_PhysicalElementLocation WHERE Element= ChipObj IWsmanEnumeration locations = service.ExecQuery("CIM_PhysicalElementLocation"); ; foreach (IWsmanItem location in locations) { IManagedInstance elementObj = location.Object.GetProperty("Element").Ref.Get(); if (elementObj.GetProperty("Tag").ToString().Equals(chipObj.GetProperty("Tag").ToString())) { if (!locationFound) { locationFound = true; IManagedInstance locationObj = location.Object.GetProperty("PhysicalLocation").Ref.Get(); string[] locationValues = { "PhysicalPosition" }; newItem.AddValues(locationValues, locationObj); } } } } catch (WsmanUnreachableException) { } writer.Add(newItem); } // is Processor } // foreach CIM_Realizes } public override object GetReturnObject() { return new NameValuePairItem(Name, Value); } }// end CPU class } // End InventoryService } // end Namespace