This next script is used to extract the inventory and alert history from Dell Open Manage via the API using Powershell into excel for quick and easy manipulation.
Personally I use this data to help track inventory, firmware, software, etc… for Dell hosts in a visual way but the data can be used in any way as it’s exported into .xlsx
Make sure to install https://github.com/dfinke/ImportExcel otherwise it will not export to excel.
So to the script..
So that I don’t keep being prompted for credentials I save the account user and password with the powershell Get-Credential command.
$cred = Get-Credential $cred | Export-Clixml -Path "D:\DellOM\Config\OM.xml"
Script usage for inventory and xls
.\DellOpenManageReporter.ps1 -OMServer 'DellOM.vMan.ch' -CollectionType 'Inventory' -creds 'OM' -FileName 'Inventory' -OutputLocation 'D:\DellOM\Report\' -Format 'XLS'
Script usage for inventory and xls
.\DellOpenManageReporter.ps1 -OMServer 'DellOM.vMan.ch' -CollectionType 'Alerts' -creds 'OM' -FileName 'Alerts' -OutputLocation 'D:\DellOM\Report\' -Format 'XLS'
And now here is the whole script
I have started using github so check out the latest version here
#Powershell collector script for Dell Open Manage #v1.0 vMAN.ch, 02.09.2017 - Initial Version - Requires Module --> https://github.com/dfinke/ImportExcel if $Format is XLS <# .SYNOPSIS Collecting Alarm, state, inventory and other data depending on the Script requires Powershell v3 and above. Run the command below to store user and pass in secure credential XML for each environment $cred = Get-Credential $cred | Export-Clixml -Path "E:\DellOM\Config\OM.xml" .\DellOpenManageReporter.ps1 -OMServer 'DellOM.vMan.ch' -CollectionType 'Inventory' -creds 'OM' -FileName 'Inventory' -OutputLocation 'D:\DellOM\Report\' -Format 'XLS' #> param ( [String]$OMServer, [String]$CollectionType, [String]$creds, [String]$FileName, [String]$OutputLocation, [String]$Format ) #Vars $ScriptPath = (Get-Item -Path ".\" -Verbose).FullName $LogFileLoc = $ScriptPath + '\Log\Logfile.log' $RunDateTime = (Get-date) $RunDateTime = $RunDateTime.tostring("yyyyMMddHHmmss") #Logging Function Function Log([String]$message, [String]$LogType, [String]$LogFile){ $date = Get-Date -UFormat '%m-%d-%Y %H:%M:%S' $message = $date + "`t" + $LogType + "`t" + $message $message >> $LogFile } #Take all certs. add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls #Get Stored Credentials if($creds -gt ""){ $cred = Import-Clixml -Path "$ScriptPath\config\$creds.xml" } else { echo "Credentials not specified, stop hammer time!" Exit } #Script Starts here baby! switch($CollectionType) { Alerts { Echo "Running Alert Report" Log -Message "Running Alert Report" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc $AlertFilterList = @() $AlertFilterURL = 'https://' + $OMServer + ":2607/api/OME.svc/AlertFilters" #Get List of Event filters Echo "Connecting to $AlertFilterURL to get a list of AlertFilters" Log -Message "Connecting to $AlertFilterURL to get a list of AlertFilters" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc [xml]$AlertFilter = Invoke-RestMethod -Method Get -Uri $AlertFilterURL -Credential $cred ForEach ($AlertGroup in $AlertFilter.GetAllAlertFiltersResponse.GetAllAlertFiltersResult.AlertFilter){ $AlertFilterList += New-Object PSObject -Property @{ Name = $AlertGroup.Name Id = $AlertGroup.Id Type = $AlertGroup.Type IsEnabled = $AlertGroup.IsEnabled IsReadOnly = $AlertGroup.IsReadOnly } } #Start Collecting all Alerts for Filters which are enabled. $AlertReport = @() [Array]$AlertTypes = $AlertFilterList | Where-Object IsEnabled -EQ 'True' | select Name,Id,Type Foreach ($AlertType in $AlertTypes.Id){ $AlertURL = 'https://' + $OMServer + ":2607/api/OME.svc/AlertFilters/$AlertType/Alerts" Echo "Connecting to $AlertURL and Dumping alerts" Log -Message "Connecting to $AlertURL and Dumping alerts" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc [xml]$Alerts = Invoke-RestMethod -Method Get -Uri $AlertUrl -Credential $cred If ($Alerts.GetAlertsForFilterResponse.GetAlertsForFilterResult.Alert){ ForEach ($Alert in $Alerts.GetAlertsForFilterResponse.GetAlertsForFilterResult.Alert){ $AlertReport += New-Object PSObject -Property @{ AlertTypeID = $AlertType DeviceIdentifier = $Alert.DeviceIdentifier DeviceName = $Alert.DeviceName DeviceNodeId = $Alert.DeviceNodeId DeviceServiceTag = $Alert.DeviceServiceTag DeviceSystemModelType = $Alert.DeviceSystemModelType DeviceType = $Alert.DeviceType DeviceTypeName = $Alert.DeviceTypeName EventCategory = $Alert.EventCategory EventSource = $Alert.EventSource Id = $Alert.Id IsIdrac = $Alert.IsIdrac IsInband = $Alert.IsInband Message = $Alert.Message OSName = $Alert.OSName Package = $Alert.Package SNMPEnterpriseOID = $Alert.SNMPEnterpriseOID SNMPGenericTrapID = $Alert.SNMPGenericTrapID SNMPSpecificTrapID = $Alert.SNMPSpecificTrapID Severity = $Alert.Severity SourceName = $Alert.SourceName Status = $Alert.Status Time = $Alert.Time } } } } #Sort Report by date / time, Save output to file Echo "Sorting Report By Date / Time" Log -Message "Sorting Report By Date / Time" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc $AlertReport = $AlertReport | Sort-Object { $_.Time -as [datetime] } If ($Format -eq 'XLS'){ $OutputExcelFile = $OutputLocation + '\' + $FileName + '.xlsx' Echo "Exporting XLSX Report to $OutputExcelFile" Log -Message "Exporting XLSX Report to $OutputExcelFile" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc $AlertFilterList | select Name,Id,Type,IsEnabled,IsReadOnly | Export-Excel $OutputExcelFile -WorkSheetname AlertTypes $AlertReport | select AlertTypeID,DeviceIdentifier,DeviceName,DeviceNodeId,DeviceServiceTag,DeviceSystemModelType,DeviceType,DeviceTypeName,EventCategory,EventSource,Id,IsIdrac,IsInband,Message,OSName,Package,SNMPEnterpriseOID,SNMPGenericTrapID,SNMPSpecificTrapID,Severity,SourceName,Status,Time | Export-Excel $OutputExcelFile -WorkSheetname Alerts } If ($Format -eq 'CSV'){ $OutputCSVFile = $OutputLocation + '\' + $FileName + '.csv' Echo "Exporting CSV Report to $OutputCSVFile" Log -Message "Exporting CSV Report to $OutputCSVFile" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc $AlertReport | select AlertTypeID,DeviceIdentifier,DeviceName,DeviceNodeId,DeviceServiceTag,DeviceSystemModelType,DeviceType,DeviceTypeName,EventCategory,EventSource,Id,IsIdrac,IsInband,Message,OSName,Package,SNMPEnterpriseOID,SNMPGenericTrapID,SNMPSpecificTrapID,Severity,SourceName,Status,Time | Export-csv $OutputCSVFile } echo 'All done, Terminating Script' Log -Message "All done, Terminating Script" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc Remove-Variable * -Force -ErrorAction SilentlyContinue } Inventory { Echo "Running Group Inventory Report" Log -Message "Running Group Inventory Report" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc $GroupInventoryList = @() $GroupInventoryFilterURL = 'https://' + $OMServer + ":2607/api/OME.svc/DeviceGroups" #Get List of Groups filters Echo "Connecting to $GroupInventoryFilterURL to get a list of Inventory Groups" Log -Message "Connecting to $GroupInventoryFilterURL to get a list of Inventory Groups" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc [xml]$GroupInventoryFilter = Invoke-RestMethod -Method Get -Uri $GroupInventoryFilterURL -Credential $cred $GroupInventoryFilteredList = $GroupInventoryFilter.GetDeviceGroupsResponse.GetDeviceGroupsResult.DeviceGroup | Where { $_.DeviceCount -gt 0 } ForEach ($Group in $GroupInventoryFilteredList){ $GroupInventoryList += New-Object PSObject -Property @{ Name = $Group.Name Id = $Group.Id Type = $Group.Type Description = $Group.Description DeviceCount = $Group.DeviceCount RollupHealth = $Group.RollupHealth } } #Start Collecting all Devices in each of the Device Groups. $DeviceReport = @() $DeviceSoftwareReport = @() $DeviceNICReport = @() $DeviceFirmwareReport = @() $DeviceMemoryReport = @() $DeviceProcessorReport = @() [Array]$DeviceGroup = $GroupInventoryList | select Name,Id Foreach ($DeviceGroupId in $DeviceGroup.Id){ $DeviceGroupURL = 'https://' + $OMServer + ":2607/api/OME.svc/DeviceGroups/$DeviceGroupId/Devices" Echo "Connecting to $DeviceGroupURL and Dumping Device Groups" Log -Message "Connecting to $DeviceGroupURL and Dumping Device Groups" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc [xml]$Devices = Invoke-RestMethod -Method Get -Uri $DeviceGroupURL -Credential $cred ForEach ($Device in $Devices.GetDevicesResponse.GetDevicesResult.Device){ $DeviceReport += New-Object PSObject -Property @{ GroupId = $DeviceGroupId AssetTag = $Device.AssetTag DNSName = $Device.DNSName DiscoveryTime = $Device.DiscoveryTime ExpressServiceCode = $Device.ExpressServiceCode GlobalStatus = $Device.GlobalStatus Id = $Device.Id InventoryTime = $Device.InventoryTime IsIdrac = $Device.IsIdrac IsInband = $Device.IsInband LaunchURL = $Device.LaunchURL Name = $Device.Name NodeId = $Device.NodeId OSName = $Device.OSName OSRevision = $Device.OSRevision PowerStatus = $Device.PowerStatus ServiceTag = $Device.ServiceTag StatusTime = $Device.StatusTime SystemId = $Device.SystemId SystemModel = $Device.SystemModel Type = $Device.Type } } } #Extract Inventory information from each Device. $DeviceUnique = $DeviceReport | Select Name,Id,AssetTag,NodeId,DNSName,DiscoveryTime,ExpressServiceCode,GlobalStatus,InventoryTime,IsIdrac,IsInband,LaunchURL,OSName,OSRevision,PowerStatus,ServiceTag,StatusTime,SystemId,SystemModel,Type -Unique Foreach ($DeviceId in $DeviceUnique.id){ $DeviceURL = 'https://' + $OMServer + ":2607/api/OME.svc/Devices/$DeviceId/Inventory" If ($DeviceReport.IsIdrac -eq 'true'){ Echo "Connecting to $DeviceURL to get Device Inventory" Log -Message "Connecting to $DeviceURL to get Device Inventory" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc [xml]$Dev = Invoke-RestMethod -Method Get -Uri $DeviceURL -Credential $cred $DevSoftware = $Dev.DeviceInventory2Response.DeviceInventory2Result.Software.Software ForEach ($Software in $DevSoftware){ $DeviceSoftwareReport += New-Object PSObject -Property @{ DeviceID = $DeviceId Description = $Software.Description Type = $Software.Type Version = $Software.Version } } $DevNIC = $Dev.DeviceInventory2Response.DeviceInventory2Result.NIC.NIC ForEach ($Nic in $DevNIC){ $DeviceNICReport += New-Object PSObject -Property @{ DeviceID = $DeviceId Description = $Nic.Description IPAddress = $Nic.IPAddress MACAddress = $Nic.MACAddress Pingable = $Nic.Pingable Vendor = $Nic.Vendor } } $DevFirmware = $Dev.DeviceInventory2Response.DeviceInventory2Result.Firmware.Firmware ForEach ($Firmware in $DevFirmware){ $DeviceFirmwareReport += New-Object PSObject -Property @{ DeviceID = $DeviceId Name = $Firmware.Name Type = $Firmware.Type Version = $Firmware.Version } } $DevMemory = $Dev.DeviceInventory2Response.DeviceInventory2Result.Memory.MemoryEntries.Memory ForEach ($Memory in $DevMemory){ $DeviceMemoryReport += New-Object PSObject -Property @{ DeviceID = $DeviceId Name = $Memory.Name Type = $Memory.Type Manufacturer = $Memory.Manufacturer Size = $Memory.Size PartNumber = $Memory.PartNumber } } $DevProcessor = $Dev.DeviceInventory2Response.DeviceInventory2Result.Processor.Processor ForEach ($Processor in $DevProcessor){ $DeviceProcessorReport += New-Object PSObject -Property @{ DeviceID = $DeviceId Brand = $Processor.Brand Cores = $Processor.Cores CurSpeed = $Processor.CurSpeed MaxSpeed = $Processor.MaxSpeed Model = $Processor.Model } } } } #Output to file If ($Format -eq 'XLS'){ $OutputExcelFile = $OutputLocation + '\' + $FileName + '.xlsx' Echo "Exporting XLSX Report to $OutputExcelFile" Log -Message "Exporting XLSX Report to $OutputExcelFile" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc $GroupInventoryList | select Name,Id | Export-Excel $OutputExcelFile -WorkSheetname GroupInventory $DeviceReport | select GroupId,Name,Id,AssetTag,NodeId,DNSName,DiscoveryTime,ExpressServiceCode,GlobalStatus,InventoryTime,IsIdrac,IsInband,LaunchURL,OSName,OSRevision,PowerStatus,ServiceTag,StatusTime,SystemId,SystemModel,Type | Export-Excel $OutputExcelFile -WorkSheetname Devices $DeviceSoftwareReport | select DeviceID,Description,Type,Version | Export-Excel $OutputExcelFile -WorkSheetname Software $DeviceFirmwareReport | select DeviceID,Name,Type,Version | Export-Excel $OutputExcelFile -WorkSheetname Firmware $DeviceMemoryReport | select DeviceID,Name,Type,Manufacturer,Size,PartNumber | Export-Excel $OutputExcelFile -WorkSheetname Memory $DeviceProcessorReport | select DeviceID,Brand,Cores,CurSpeed,MaxSpeed,Model | Export-Excel $OutputExcelFile -WorkSheetname Processor $DeviceNICReport | select DeviceID,Description,IPAddress,MACAddress,Pingable,Vendor | Export-Excel $OutputExcelFile -WorkSheetname NIC } If ($Format -eq 'CSV'){ $OutputCSVFile = $OutputLocation + '\' + $FileName + '.csv' Echo "Exporting CSV Report to $OutputCSVFile" Log -Message "Exporting CSV Report to $OutputCSVFile" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc $DeviceReport | select GroupId,Name,Id,AssetTag,NodeId,DNSName,DiscoveryTime,ExpressServiceCode,GlobalStatus,InventoryTime,IsIdrac,IsInband,LaunchURL,OSName,OSRevision,PowerStatus,ServiceTag,StatusTime,SystemId,SystemModel,Type | Export-Excel $OutputExcelFile -WorkSheetname Devices } echo 'All done, Terminating Script' Log -Message "All done, Terminating Script" -LogType "JOB-$RunDateTime" -LogFile $LogFileLoc #Remove-Variable * -Force -ErrorAction SilentlyContinue } Default {" Script does something!! "} }
vMan
Recent Comments