From 63bc3580e58c2e5d65c1e679c3c694b40db78035 Mon Sep 17 00:00:00 2001 From: Zachary Gorman Date: Mon, 23 Sep 2024 14:39:12 -0700 Subject: [PATCH] Too much, should've committed sooner lol --- Private/BatchInvokes.ps1 | 17 ++- Private/Find-ISMBusinessObject.ps1 | 4 +- Private/Get-CMDBFallback.ps1 | 28 ++-- Private/Get-Hostname.ps1 | 3 + Private/Get-ISMBusinessObject.ps1 | 4 +- Private/PCLocal.ps1 | 5 +- Private/SCCMQuery.ps1 | 7 +- Private/SCCMQueryBlock.ps1 | 205 ++++++++++++--------------- Private/SHSPrinter.ps1 | 17 ++- Private/ScanToEmail.ps1 | 46 ++++++ Private/Search-ISMBusinessObject.ps1 | 4 +- Public/Get-PC.ps1 | 8 +- patchnotes.txt | 13 +- 13 files changed, 206 insertions(+), 155 deletions(-) create mode 100644 Private/ScanToEmail.ps1 diff --git a/Private/BatchInvokes.ps1 b/Private/BatchInvokes.ps1 index 8555db9..fe8fcba 100644 --- a/Private/BatchInvokes.ps1 +++ b/Private/BatchInvokes.ps1 @@ -5,6 +5,9 @@ function Get-PCBatchInvoke { [string[]] $Computers ) + $Tenant = (Connect-ISM)[1] + $Headers = (Connect-ISM)[0] + $OnlineComputers = @() $OfflineComputers = @() $output = @() @@ -36,8 +39,10 @@ function Get-PCBatchInvoke { $missedhosts = $OnlineComputers | Where-Object -FilterScript {$_ -notin $contactedhosts} $missedJobs = @() if($missedhosts.count -gt 0){ + $i = 1 foreach($computer in $missedhosts){ - $missedJobs += Start-Job -ScriptBlock ${function:Get-SCCMQueryBlock} -ArgumentList $computer + $missedJobs += Start-Job -ScriptBlock ${function:Get-SCCMQueryBlock} -ArgumentList $computer,$i + $i++ } } $output += $offlineJobs | Receive-Job -Wait -AutoRemoveJob | Select-Object * -ExcludeProperty RunspaceId, PSComputerName, PSShowComputerName, PSSourceJobInstanceId @@ -63,11 +68,11 @@ function BatchInvokesProgressBar { $stage ) switch ($stage) { - 1 { Write-Progress -Activity "Connecting to computers" -Status "$item ($currentItemIndex/$TotalItems)" -PercentComplete (($currentItemIndex/$TotalItems) * 100)} - 2 { Write-Progress -Activity "Spinning up jobs" -PercentComplete ((10/100) * 100)} - 3 { Write-Progress -Activity "Querying online computers" -PercentComplete ((20/100)*100)} - 4 { Write-Progress -Activity "Querying SCCM for offline computers" -PercentComplete ((75/100) * 100)} - 5 { Write-Progress -Activity "Querying CMDB for computers not in SCCM" -PercentComplete ((85/100) * 100)} + 1 { Write-Progress -Activity "Connecting to computers" -Status "$item ($currentItemIndex/$TotalItems)" -PercentComplete (($currentItemIndex/$TotalItems) * 100) -Id 0} + 2 { Write-Progress -Activity "Spinning up jobs" -PercentComplete ((10/100) * 100) -Id 0} + 3 { Write-Progress -Activity "Querying online computers" -PercentComplete ((20/100)*100) -Id 0} + 4 { Write-Progress -Activity "Querying SCCM for offline computers" -PercentComplete ((75/100) * 100) -Id 0} + 5 { Write-Progress -Activity "Querying CMDB for computers not in SCCM" -PercentComplete ((85/100) * 100) -Id 0} Default {} } diff --git a/Private/Find-ISMBusinessObject.ps1 b/Private/Find-ISMBusinessObject.ps1 index ec24733..fb41702 100644 --- a/Private/Find-ISMBusinessObject.ps1 +++ b/Private/Find-ISMBusinessObject.ps1 @@ -130,7 +130,7 @@ Function Find-ISMBusinessObject { try { - $Query = Invoke-RestMethod -Method GET -uri $URI -headers $Headers + $Query = Invoke-RestMethod -Method GET -uri $URI -headers $Headers -TimeoutSec $SparkQueryTimeoutSec if (!$Query){ @@ -177,7 +177,7 @@ Function Find-ISMBusinessObject { $URI = "$Tenant/api/odata/businessobject/$BusinessObject`?`$top=100&`$skip=$Skip`$search=$SearchQuery" - $SkipQuery = Invoke-RestMethod -Method GET -uri $URI -headers $Headers + $SkipQuery = Invoke-RestMethod -Method GET -uri $URI -headers $Headers -TimeoutSec $SparkQueryTimeoutSec if ($SkipQuery){ $Results += $SkipQuery.Value diff --git a/Private/Get-CMDBFallback.ps1 b/Private/Get-CMDBFallback.ps1 index 5b7088c..1b167c0 100644 --- a/Private/Get-CMDBFallback.ps1 +++ b/Private/Get-CMDBFallback.ps1 @@ -2,33 +2,33 @@ function Get-CMDBFallback { param ( $comp ) - Write-Progress -Activity "CMDB Fallback $name" -Status 'Querying Spark! for Name match' -PercentComplete 30 -ParentId 1 + Write-Progress -Activity "CMDB Fallback $comp" -Status 'Querying Spark! for Name match' -PercentComplete 30 -ParentId 1 ## $cmdbData = Get-LANDeskCMDBItem -name $comp $cmdbData = Search-ISMBO -bo cis -filter "Name eq '$comp'" -RawFilter if(!$cmdbData){ - Write-Progress -Activity "CMDB Fallback $name" -Status 'Attempting to extract asset tag from name' -PercentComplete 40 -ParentId 1 - if($comp.Length -gt 5){ + Write-Progress -Activity "CMDB Fallback $comp" -Status 'Attempting to extract asset tag from name' -PercentComplete 40 -ParentId 1 + if($comp.Length -ge 5){ #$asset = $comp[-5..-1] -join "" # Match the first set of 5 digits that don't have any digits after it until end of line if ($comp -match "\d{5}(?!\d)*$") { $asset = $Matches[0]} ## $cmdbData = Get-LANDeskCMDBItem -AssetTag $asset $cmdbData = Search-ISMBO -bo cis -filter "AssetTag eq '$asset'" -RawFilter if($cmdbData){ - $comp = $cmdbData.values.Title - Write-Progress -Activity "CMDB Fallback $name" -Status "Asset tag found, checking connection to $comp" -PercentComplete 70 -ParentId 1 + $comp = $cmdbData.Name + Write-Progress -Activity "CMDB Fallback $comp" -Status "Asset tag found, checking connection to $comp" -PercentComplete 70 -ParentId 1 if(Test-Connection $comp){ - Write-Progress -Activity "CMDB Fallback $name" -Status "Rerunning get-pc with new name $comp" -PercentComplete 85 -ParentId 1 + Write-Progress -Activity "CMDB Fallback $comp" -Status "Rerunning get-pc with new name $comp" -PercentComplete 85 -ParentId 1 $getpcData = get-pc $comp - Write-Progress -Activity "CMDB Fallback $name" -Completed + Write-Progress -Activity "CMDB Fallback $comp" -Completed return $getpcData } } } } - Write-Progress -Activity "CMDB Fallback $name" -Status 'Parsing Spark! results' -PercentComplete 60 -ParentId 1 + Write-Progress -Activity "CMDB Fallback $comp" -Status 'Parsing Spark! results' -PercentComplete 60 -ParentId 1 $status = $cmdbData.Status if(!$status){ $status = 'No CMDB/SCCM Record Located' @@ -63,7 +63,7 @@ function Get-CMDBFallback { # $locationData = $cmdbData.values._SHSCalcLocationString # } if($cmdbData.CIType -eq 'MobileDevice'){ - Write-Progress -Activity "CMDB Fallback $name" -Status 'Querying Spark! for mobile device details' -PercentComplete 85 -ParentId 1 + Write-Progress -Activity "CMDB Fallback $comp" -Status 'Querying Spark! for mobile device details' -PercentComplete 85 -ParentId 1 $cmdbData = Get-ISMBO -bo ci__mobiledevices -RecID $cmdbData.RecId @@ -125,11 +125,11 @@ function Get-CMDBFallback { # } if ($cmdbData.CIType -eq "Computer"){ - Write-Progress -Activity "CMDB Fallback $name" -Status 'Querying Spark! for computer details' -PercentComplete 70 -ParentId 1 + Write-Progress -Activity "CMDB Fallback $comp" -Status 'Querying Spark! for computer details' -PercentComplete 70 -ParentId 1 $cmdbData = Get-ISMBO -BO ci__computers -recid $cmdbData.Recid - Write-Progress -Activity "CMDB Fallback $name" -Status 'Querying Spark! for memory details' -PercentComplete 80 -ParentId 1 + Write-Progress -Activity "CMDB Fallback $comp" -Status 'Querying Spark! for memory details' -PercentComplete 80 -ParentId 1 $memoryData = Search-ISMBO -bo frs_CIComponent__memorys -Filter "ParentLink_RecId eq '$($cmdbData.RecId)'" -RawFilter - Write-Progress -Activity "CMDB Fallback $name" -Status 'Querying Spark! for disk usage details' -PercentComplete 90 -ParentId 1 + Write-Progress -Activity "CMDB Fallback $comp" -Status 'Querying Spark! for disk usage details' -PercentComplete 90 -ParentId 1 $diskData = Search-ISMBO -bo frs_cicomponent__logicalstorages -Filter "ParentLink_RecId eq '$($cmdbdata.recid)'" -Rawfilter if ($memoryData){ $MemoryTotal = ($Memorydata.Memorysize | measure-object -sum).sum @@ -138,7 +138,7 @@ function Get-CMDBFallback { } $props = [Ordered]@{ - Hostname = "$comp" + Hostname = $cmdbData.Name Status = $status 'Current User' = "Not Available" 'Last User(s)' = $cmdbData.LoginName @@ -174,7 +174,7 @@ function Get-CMDBFallback { $obj | Add-Member -MemberType NoteProperty -Name 'DEL Vendor PC' -Value $cmdbData.SHS_IsVendorPC $obj | Add-Member -MemberType NoteProperty -Name 'DEL Description' -Value $cmdbData.SHS_ExceptionNotes } - Write-Progress -Activity "CMDB Fallback $name" -Completed + Write-Progress -Activity "CMDB Fallback $comp" -Completed return $obj } diff --git a/Private/Get-Hostname.ps1 b/Private/Get-Hostname.ps1 index cfc51ff..76236de 100644 --- a/Private/Get-Hostname.ps1 +++ b/Private/Get-Hostname.ps1 @@ -1,4 +1,7 @@ function Get-Hostname ([string]$name) { + Write-Progress -Activity "Resolving hostname for $name" -PercentComplete 0 -ParentId 1 + # Return early if the hostname already resolves + if (Resolve-DnsName $name) { return $name,''} Write-Progress -Activity "Resolving hostname for $name" -Status 'SCCM Asset Tag Lookup' -PercentComplete 10 -ParentId 1 $errMsg = '' if ($name.Length -eq 5) { diff --git a/Private/Get-ISMBusinessObject.ps1 b/Private/Get-ISMBusinessObject.ps1 index 275afd7..a7dc6c2 100644 --- a/Private/Get-ISMBusinessObject.ps1 +++ b/Private/Get-ISMBusinessObject.ps1 @@ -160,7 +160,7 @@ Function Get-ISMBusinessObject { try { - $Query = Invoke-RestMethod -Method GET -uri $URI -headers $Headers + $Query = Invoke-RestMethod -Method GET -uri $URI -headers $Headers -TimeoutSec $SparkQueryTimeoutSec if (!$Query){ @@ -207,7 +207,7 @@ Function Get-ISMBusinessObject { $URI = "$Tenant/api/odata/businessobject/$BusinessObject`?`$top=100&`$skip=$Skip" - $SkipQuery = Invoke-RestMethod -Method GET -uri $URI -headers $Headers + $SkipQuery = Invoke-RestMethod -Method GET -uri $URI -headers $Headers -TimeoutSec $SparkQueryTimeoutSec if ($SkipQuery){ $Results += $SkipQuery.Value diff --git a/Private/PCLocal.ps1 b/Private/PCLocal.ps1 index 4e89a93..33c1491 100644 --- a/Private/PCLocal.ps1 +++ b/Private/PCLocal.ps1 @@ -309,13 +309,14 @@ Default {$chassisType = "Unknown Model/Chassis"} } - $timeout = 10 + $timeout = if ($SparkQueryTimeoutSec) {$SparkQueryTimeoutSec} else {5} Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Querying Spark! for location details. Timeout $($timeout)s" -PercentComplete 95 $uri = "$Tenant/api/odata/businessobject/cis`?`$filter=Name eq '$ENV:COMPUTERNAME'&`$top=1&`$skip=0" try { $Query = Invoke-RestMethod -Method GET -uri $uri -headers $Headers -TimeoutSec $timeout } catch { - Write-Host $_.Exception.Message + #Write-Host $_.Exception.Message + Write-Warning "Failed querying Spark!" } $cmdbData = $Query.Value diff --git a/Private/SCCMQuery.ps1 b/Private/SCCMQuery.ps1 index 18d6b61..85760e8 100644 --- a/Private/SCCMQuery.ps1 +++ b/Private/SCCMQuery.ps1 @@ -24,7 +24,6 @@ Function Get-SCCMQuery { } } - $i = 0 Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Last Hardware Scan' -PercentComplete 10 -ParentId 1 $FindLastHardwareScanSCCM = Get-SCCMLastHardwareScan $comp if(!$FindLastHardwareScanSCCM){ @@ -61,7 +60,7 @@ Function Get-SCCMQuery { $CompModelSCCM = Get-SCCMFindModelQuery $comp Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Bios Version' -PercentComplete 30 -ParentId 1 $FindBiosVerSCCM = Get-SCCMBiosVerQuery $comp - Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for storage space' -PercentComplete 35 -ParentId 1 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for HDD/SSD space' -PercentComplete 35 -ParentId 1 $CompFreeSpaceSCCMGB = Get-SCCMFindFreeSpaceQuery $comp Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for RAM' -PercentComplete 40 -ParentId 1 $FindMemorySCCMGB = Get-SCCMFindMemoryQuery $comp @@ -70,7 +69,6 @@ Function Get-SCCMQuery { Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Service Tag' -PercentComplete 50 -ParentId 1 $FindServiceTagSCCM = Get-SCCMServiceTagQuery $comp Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for OS Name' -PercentComplete 55 -ParentId 1 - $i++; i++ | ProgressBar $i $comp "SCCM OS Name" $NumberofComputers $PCID $FindOSNameSCCM = Get-SCCMFindOSNameQuery $comp Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for OS Architecture' -PercentComplete 60 -ParentId 1 $FindOSArchSCCM = Get-SCCMFindOSArch $comp @@ -100,6 +98,7 @@ Function Get-SCCMQuery { Write-Host "Last Hardware Scan Time: $FindLastHardwareScanSCCM" -ForegroundColor Yellow } + Write-Progress -Activity "Getting SCCM data for $comp" -Completed $props = [Ordered]@{ Hostname = "$comp" @@ -508,4 +507,4 @@ Function Get-SCCM_HostnameMatch($name) { $SCCMQuery = "select distinct SMS_R_System.Name from SMS_R_System where SMS_R_System.Name is like '%$name%'" $res = Get-WmiObject -namespace $SCCMNameSpace -DirectRead -computer $SCCMServer -query $SCCMQuery | Select-Object -ExpandProperty Name return $res -} \ No newline at end of file +} diff --git a/Private/SCCMQueryBlock.ps1 b/Private/SCCMQueryBlock.ps1 index dbae756..8096db2 100644 --- a/Private/SCCMQueryBlock.ps1 +++ b/Private/SCCMQueryBlock.ps1 @@ -2,8 +2,7 @@ Function Get-SCCMQueryBlock { param ( [string]$comp, - [int]$NumberofComputers, - [int]$PCID + [int]$PCID = 1 ) #CONST $SITENAME="100" @@ -18,6 +17,8 @@ $SCCMNAMESPACE="root\sms\site_100" $compStatus = "Online" } + $progress = 5 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Checking if disabled in AD' -PercentComplete $progress -ParentID 0 -Id $PCID if(get-module -ListAvailable -Name 'ActiveDirectory'){ try { $adTest = ((Get-ADComputer $comp).DistinguishedName -match "Disabled Computers") } catch { $adTest = $true } if($adTest){ @@ -25,29 +26,13 @@ $SCCMNAMESPACE="root\sms\site_100" } } - $i = 0 - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM Last Hardware Scan" -PercentComplete (($i / 18) * 100) + $progress += 5 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Last Hardware Scan' -PercentComplete $progress -ParentID 0 -Id $PCID #Last Hardware Scan $FindLastHardwareScanQuery = "select SMS_G_System_WORKSTATION_STATUS.LastHardwareScan from SMS_R_System inner join SMS_G_System_WORKSTATION_STATUS on SMS_G_System_WORKSTATION_STATUS.ResourceID = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" $FindLastHardwareScanSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindLastHardwareScanQuery | Select-Object -ExpandProperty LastHardwareScan - - if($null -eq $FindLastHardwareScanSCCM){ - return $null - } - - $Year = $FindLastHardwareScanSCCM.substring(0,4) - $Month = $FindLastHardwareScanSCCM.substring(4,2) - $Day = $FindLastHardwareScanSCCM.substring(6,2) - - $Hour = $FindLastHardwareScanSCCM.substring(8,2) - $Minute = $FindLastHardwareScanSCCM.substring(10,2) - $Second = $FindLastHardwareScanSCCM.substring(12,2) - - $FindLastHardwareScanSCCM = "$Month/$Day/$Year $Hour" + ":" + "$Minute" + ":" + "$Second" - #End Last Hardware Scan if(!$FindLastHardwareScanSCCM){ $props = [Ordered]@{ @@ -75,91 +60,95 @@ $SCCMNAMESPACE="root\sms\site_100" return $obj } - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "Last User SCCM" -PercentComplete (($i / 18) * 100) - $SCCMLastUserLogOnQuery = "select SMS_R_System.LastLogonUserName from SMS_R_System where SMS_R_System.Name = '$comp'" - $LastUserSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $SCCMLastUserLogOnQuery | - Select-Object -ExpandProperty LastLogonUserName + + $Year = $FindLastHardwareScanSCCM.substring(0,4) + $Month = $FindLastHardwareScanSCCM.substring(4,2) + $Day = $FindLastHardwareScanSCCM.substring(6,2) - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM IP Query" -PercentComplete (($i / 18) * 100) - $FindIPQuery = "select SMS_R_System.IPAddresses from SMS_R_System where SMS_R_System.Name = '$comp'" - $FindIPSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindIPQuery | - Select-Object -ExpandProperty IPAddresses + $Hour = $FindLastHardwareScanSCCM.substring(8,2) + $Minute = $FindLastHardwareScanSCCM.substring(10,2) + $Second = $FindLastHardwareScanSCCM.substring(12,2) + + $FindLastHardwareScanSCCM = "$Month/$Day/$Year $Hour" + ":" + "$Minute" + ":" + "$Second" + #End Last Hardware Scan + + $progress += 10 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Last User Logon' -PercentComplete $progress -ParentID 0 -Id $PCID + $SCCMQuery = "select SMS_R_System.LastLogonUserName,SMS_R_System.IPAddresses,SMS_R_System.MACAddresses from SMS_R_System where SMS_R_System.Name = '$comp'" + $SCCMResults = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $SCCMQuery + + $LastUserSCCM = $SCCMResults | Select-Object -ExpandProperty LastLogonUserName + + $FindIPSCCM = $SCCMResults | Select-Object -ExpandProperty IPAddresses if($FindIPSCCM.Count -gt 1){ $FindIPSCCM = $FindIPSCCM[0] } - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "Find Model SCCM" -PercentComplete (($i / 18) * 100) + $FindMacAddressSCCM = $SCCMResults | Select-Object -ExpandProperty MACAddresses + $FindMacAddressSCCM = if($FindMacAddressSCCM.Count -gt 1){ + $FindMacAddressSCCM[0] + } + + $progress += 10 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Model' -PercentComplete $progress -ParentID 0 -Id $PCID $FindModelQuery = "select SMS_G_System_COMPUTER_SYSTEM.Model from SMS_R_System inner join SMS_G_System_COMPUTER_SYSTEM on SMS_G_System_COMPUTER_SYSTEM.ResourceId = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" $CompModelSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindModelQuery | Select-Object -ExpandProperty Model - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM Bios Version" -PercentComplete (($i / 18) * 100) + $progress += 5 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Bios Version' -PercentComplete $progress -ParentID 0 -Id $PCID $FindBiosVerQuery = "select SMS_G_System_PC_BIOS.SMBIOSBIOSVersion from SMS_R_System inner join SMS_G_System_PC_BIOS on SMS_G_System_PC_BIOS.ResourceId = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" $FindBiosVerSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindBiosVerQuery | Select-Object -ExpandProperty SMBIOSBIOSVersion - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM HDD/SSD Space" -PercentComplete (($i / 18) * 100) + $progress += 5 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for HDD/SSD space' -PercentComplete $progress -ParentID 0 -Id $PCID $FindFreeSpaceQuery = "select SMS_G_System_LOGICAL_DISK.Size from SMS_R_System inner join SMS_G_System_LOGICAL_DISK on SMS_G_System_LOGICAL_DISK.ResourceID = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" $CompFreeSpaceSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindFreeSpaceQuery | Select-Object -ExpandProperty Size $CompFreeSpaceSCCMGB = [math]::Round(($CompFreeSpaceSCCM / 1000), 2) - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM RAM" -PercentComplete (($i / 18) * 100) + $progress += 5 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for RAM' -PercentComplete $progress -ParentID 0 -Id $PCID $FindMemoryQuery = "select SMS_G_System_X86_PC_MEMORY.TotalPhysicalMemory from SMS_R_System inner join SMS_G_System_X86_PC_MEMORY on SMS_G_System_X86_PC_MEMORY.ResourceID = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" $FindMemorySCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindMemoryQuery | Select-Object -ExpandProperty TotalPhysicalMemory $FindMemorySCCMGB = [math]::Round($FindMemorySCCM / 1MB) - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM Asset Tag" -PercentComplete (($i / 18) * 100) - $FindAssetTagQuery = "select SMS_G_System_SYSTEM_ENCLOSURE.SMBIOSAssetTag from SMS_R_System inner join SMS_G_System_SYSTEM_ENCLOSURE on + $progress += 10 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Asset Tag' -PercentComplete $progress -ParentID 0 -Id $PCID + $SCCMQuery = "select SMS_G_System_SYSTEM_ENCLOSURE.SMBIOSAssetTag, SMS_G_System_SYSTEM_ENCLOSURE.SerialNumber from SMS_R_System inner join SMS_G_System_SYSTEM_ENCLOSURE on SMS_G_System_SYSTEM_ENCLOSURE.ResourceId = SMS_R_System.ResourceId inner join SMS_G_System_SYSTEM on SMS_G_System_SYSTEM.ResourceId = SMS_R_System.ResourceId where SMS_G_System_SYSTEM.Name = '$comp'" - $FindAssetTagSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindAssetTagQuery | - Select-Object -ExpandProperty SMBIOSAssetTag + $SCCMResults = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $SCCMQuery + $FindAssetTagSCCM = $SCCMResults | Select-Object -ExpandProperty SMBIOSAssetTag + $FindServiceTagSCCM = $SCCMResults | Select-Object -ExpandProperty SerialNumber - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM Service Tag" -PercentComplete (($i / 18) * 100) - $FindServiceTagQuery = "select SMS_G_System_SYSTEM_ENCLOSURE.SerialNumber from SMS_R_System inner join SMS_G_System_SYSTEM_ENCLOSURE on - SMS_G_System_SYSTEM_ENCLOSURE.ResourceId = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" - $FindServiceTagSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindServiceTagQuery | - Select-Object -ExpandProperty SerialNumber + $progress += 10 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for OS Name' -PercentComplete $progress -ParentID 0 -Id $PCID + $SCCMQuery = "select SMS_G_System_OPERATING_SYSTEM.Caption, SMS_G_System_OPERATING_SYSTEM.OSArchitecture, SMS_G_System_OPERATING_SYSTEM.BuildNumber,SMS_G_System_OPERATING_SYSTEM.LastBootUpTime + from SMS_R_System inner join SMS_G_System_OPERATING_SYSTEM + on SMS_G_System_OPERATING_SYSTEM.ResourceID = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" + $SCCMResults = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $SCCMQuery + $FindOSNameSCCM = $SCCMResults | Select-Object -ExpandProperty Caption + $FindOSArchSCCM = $SCCMResults | Select-Object -ExpandProperty OSArchitecture + $FindOSBuild = $SCCMResults | Select-Object -ExpandProperty BuildNumber + $FindLastBootUpTimeSCCM = $SCCMResults | Select-Object -ExpandProperty LastBootUpTime + if($null -ne $FindLastBootUpTimeSCCM){ + $Year = $FindLastBootUpTimeSCCM.substring(0,4) + $Month = $FindLastBootUpTimeSCCM.substring(4,2) + $Day = $FindLastBootUpTimeSCCM.substring(6,2) + $Hour = $FindLastBootUpTimeSCCM.substring(8,2) + $Minute = $FindLastBootUpTimeSCCM.substring(10,2) + $Second = $FindLastBootUpTimeSCCM.substring(12,2) + $FindLastBootUpTimeSCCM = "$Month/$Day/$Year $Hour" + ":" + "$Minute" + ":" + "$Second" + } - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM OS Name" -PercentComplete (($i / 18) * 100) - $FindOSNameQuery = "select SMS_G_System_OPERATING_SYSTEM.Caption, SMS_G_System_OPERATING_SYSTEM.OSArchitecture, SMS_G_System_OPERATING_SYSTEM.BuildNumber from - SMS_R_System inner join SMS_G_System_OPERATING_SYSTEM on SMS_G_System_OPERATING_SYSTEM.ResourceID = - SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" - $FindOSNameSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindOSNameQuery | - Select-Object -ExpandProperty Caption - - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM OS Architecture" -PercentComplete (($i / 18) * 100) - $FindOSNameQuery = "select SMS_G_System_OPERATING_SYSTEM.Caption, SMS_G_System_OPERATING_SYSTEM.OSArchitecture, SMS_G_System_OPERATING_SYSTEM.BuildNumber from - SMS_R_System inner join SMS_G_System_OPERATING_SYSTEM on SMS_G_System_OPERATING_SYSTEM.ResourceID = - SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" - $FindOSArchSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindOSNameQuery | - Select-Object -ExpandProperty OSArchitecture - - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM OS Build" -PercentComplete (($i / 18) * 100) - $FindOSNameQuery = "select SMS_G_System_OPERATING_SYSTEM.Caption, SMS_G_System_OPERATING_SYSTEM.OSArchitecture, SMS_G_System_OPERATING_SYSTEM.BuildNumber from - SMS_R_System inner join SMS_G_System_OPERATING_SYSTEM on SMS_G_System_OPERATING_SYSTEM.ResourceID = - SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" - $FindOSBuild = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindOSNameQuery | - Select-Object -ExpandProperty BuildNumber - - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM Encryption" -PercentComplete (($i / 18) * 100) + $progress += 10 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Encryption' -PercentComplete $progress -ParentID 0 -Id $PCID $FindEncryptionQuery = "select SMS_G_System_ENCRYPTABLE_VOLUME.ProtectionStatus from SMS_R_System inner join SMS_G_System_ENCRYPTABLE_VOLUME on SMS_G_System_ENCRYPTABLE_VOLUME.ResourceId = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" $FindEncryptionSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindEncryptionQuery | @@ -171,25 +160,8 @@ $SCCMNAMESPACE="root\sms\site_100" Default{$FindEncryptionSCCM = "Encryption Not Found"} } - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM Last Boot Up Time" -PercentComplete (($i / 18) * 100) - $FindLastBootUpTimeQuery = "select SMS_G_System_OPERATING_SYSTEM.LastBootUpTime from SMS_R_System inner join SMS_G_System_OPERATING_SYSTEM on - SMS_G_System_OPERATING_SYSTEM.ResourceId = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" - - $FindLastBootUpTimeSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindLastBootUpTimeQuery | - Select-Object -ExpandProperty LastBootUpTime - if($null -ne $FindLastBootUpTimeSCCM){ - $Year = $FindLastBootUpTimeSCCM.substring(0,4) - $Month = $FindLastBootUpTimeSCCM.substring(4,2) - $Day = $FindLastBootUpTimeSCCM.substring(6,2) - $Hour = $FindLastBootUpTimeSCCM.substring(8,2) - $Minute = $FindLastBootUpTimeSCCM.substring(10,2) - $Second = $FindLastBootUpTimeSCCM.substring(12,2) - $FindLastBootUpTimeSCCM = "$Month/$Day/$Year $Hour" + ":" + "$Minute" + ":" + "$Second" - } - - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM Printers" -PercentComplete (($i / 18) * 100) + $progress += 5 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Printers' -PercentComplete $progress -ParentID 0 -Id $PCID $FindPCPrinterQuery = "select SMS_G_System_PRINTER_DEVICE.Name, SMS_G_System_PRINTER_DEVICE.PortName from SMS_R_System inner join SMS_G_System_PRINTER_DEVICE on SMS_G_System_PRINTER_DEVICE.ResourceID = SMS_R_System.ResourceId where SMS_R_System.Name = '$comp'" $FindPCPrinterSCCM = (Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindPCPrinterQuery | @@ -197,16 +169,8 @@ $SCCMNAMESPACE="root\sms\site_100" Where-Object -Property PortName -ne PORTPROMPT: | Where-Object -Property PortName -ne SHRFAX: | Select-Object -ExpandProperty Name) -join ' || ' - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM MACAddress" -PercentComplete (($i / 18) * 100) - $FindMacAddressQuery = "select SMS_R_System.MACAddresses from SMS_R_System where SMS_R_System.Name = '$comp'" - $FindMacAddressSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindMacAddressQuery | Select-Object -ExpandProperty MACAddresses - $FindMacAddressSCCM = if($FindMacAddressSCCM.Count -gt 1){ - $FindMacAddressSCCM[0] - } - - $i++ - Write-Progress -Activity "Scanning PC $comp" -Status "SCCM Chassis Type" -PercentComplete (($i / 18) * 100) + $progress += 10 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for Chassis Type' -PercentComplete $progress -ParentID 0 -Id $PCID $FindProcessorQuery = "select SMS_G_System_PROCESSOR.Name from SMS_R_System inner join SMS_G_System_PROCESSOR on SMS_G_System_PROCESSOR.ResourceId = SMS_R_System.ResourceId inner join SMS_G_System_SYSTEM on SMS_G_System_SYSTEM.ResourceId = SMS_R_System.ResourceId where SMS_G_System_SYSTEM.Name = '$comp'" $FindProcessorSCCM = Get-WmiObject -namespace $SCCMNAMESPACE -DirectRead -computer $SCCMSERVER -query $FindProcessorQuery | Select-Object -ExpandProperty Name @@ -266,16 +230,16 @@ $SCCMNAMESPACE="root\sms\site_100" $MDBLcmdblocation = Get-Cocation $cmdbData #> - if($FindLastHardwareScanSCCM){ - Write-Host "`n`nPulling cached SCCM data for $comp." -ForegroundColor Yellow - Write-Host "Last Hardware Scan Time: $FindLastHardwareScanSCCM" -ForegroundColor Yellow - } + $progress += 5 + Write-Progress -Activity "Getting SCCM data for $comp" -Status 'Querying for CMDB data' -PercentComplete $progress -ParentID 0 -Id $PCID + $timeout = if ($SparkQueryTimeoutSec) {$SparkQueryTimeoutSec} else {5} $uri = "${using:Tenant}/api/odata/businessobject/cis`?`$filter=Name eq '$comp'&`$top=1&`$skip=0" try { - $Query = Invoke-RestMethod -Method GET -uri $uri -headers ${using:Headers} + $Query = Invoke-RestMethod -Method GET -uri $uri -headers ${using:Headers} -TimeoutSec $timeout } catch { - Write-Host $_.Exception.Message + #Write-Host $_.Exception.Message + Write-Warning "Failed querying Spark!" } $cmdbData = $Query.Value @@ -287,16 +251,23 @@ $SCCMNAMESPACE="root\sms\site_100" "SHS_LocationDetails" ) - $LocationData = Foreach($Loc in $LocationConstructors){ + $LocationData = Foreach($Loc in $LocationConstructors){ - if ($Loc -eq 'SHS_Floor'){ - $(if ($cmdbData.$Loc -match '-'){$cmdbData.$Loc.split('-')[-1] + " Floor"} else{$cmdbData.$Loc}) - } elseif (![string]::IsNullOrEmpty($cmdbData.$Loc)){ - $cmdbData.$Loc - } + if ($Loc -eq 'SHS_Floor'){ + $(if ($cmdbData.$Loc -match '-'){$cmdbData.$Loc.split('-')[-1] + " Floor"} else{$cmdbData.$Loc}) + } elseif (![string]::IsNullOrEmpty($cmdbData.$Loc)){ + $cmdbData.$Loc } + } - $LocationData = $LocationData -join ' | ' + $LocationData = $LocationData -join ' | ' + + if($FindLastHardwareScanSCCM){ + Write-Host "`n`nPulling cached SCCM data for $comp." -ForegroundColor Yellow + Write-Host "Last Hardware Scan Time: $FindLastHardwareScanSCCM" -ForegroundColor Yellow + } + + Write-Progress -Activity "Getting SCCM data for $comp" -Completed $props = [Ordered]@{ Hostname = "$comp" diff --git a/Private/SHSPrinter.ps1 b/Private/SHSPrinter.ps1 index 41711dc..14f820f 100644 --- a/Private/SHSPrinter.ps1 +++ b/Private/SHSPrinter.ps1 @@ -136,7 +136,6 @@ function Get-SHSPrinter { try { $status = $snmp.Get('.1.3.6.1.2.1.43.18.1.1.8.1.1') } catch { $status = $null } # Start of MAC $pMAC = $SNMP.get(".1.3.6.1.4.1.11.2.4.3.1.23.0") - write-host $pMAC.ToString() $MAC = [System.Text.Encoding]::Default.GetBytes($PMac) | ForEach-Object { $_.ToString('X2') @@ -185,6 +184,20 @@ function Get-SHSPrinter { try { $name = $snmp.Get('.1.3.6.1.4.1.11.2.4.3.5.46.0').toupper() } catch { $name = $null } Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for status' -PercentComplete 10 -ParentId 2 try { $status = $snmp.Get('.1.3.6.1.4.1.11.2.3.9.1.1.3.0') } catch { $status = $null } + Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for IP configuration' -PercentComplete 10 -ParentId 2 + try { $ipconfig = $snmp.Get('.1.3.6.1.4.1.11.2.4.3.5.1.0') } catch { $status = $null } + $ipconfig = switch ($ipconfig) { + 1 { '(manual)' } #manual-one + 2 { '(bootp)' } #bootp-two + 3 { '(manual)' } #manual-three + 4 { '(bootp)' } #bootp-four + 5 { '(dhcp)' } #dhcp + 6 { '' } #not-configured + 7 { '(default)' } #default-config + 8 { '(rarp)' } #rarp + 9 { '' } #read-only + 10 { '(auto-ip)' } #auto-ip + } if ($MAC -eq '') { Write-Progress -Activity "Getting hp features from $name" -Status 'Querying for MAC Address' -PercentComplete 15 -ParentId 2 $pMAC = $snmp.Get('.1.3.6.1.4.1.11.2.4.3.1.12.1.2.5') @@ -322,7 +335,7 @@ function Get-SHSPrinter { $props = [Ordered]@{ Machine = $printer Status = $status - IP = $printerip + IP = "$printerip $ipconfig" DomainName = $domainName MAC = $MAC Model = $model diff --git a/Private/ScanToEmail.ps1 b/Private/ScanToEmail.ps1 new file mode 100644 index 0000000..75c7261 --- /dev/null +++ b/Private/ScanToEmail.ps1 @@ -0,0 +1,46 @@ +function ScanToEmail { + param ( + [string]$printer + ) + + $DNSServers = @{ + 'Sam Square/Walnut' = @{ + 'Primary' = '10.98.2.45' + 'Secondary' = '10.98.2.74' + } + 'AGH' = @{ + 'Primary' = '10.10.15.11' + 'Secondary' = '10.30.15.18' + } + 'SPCH' = @{ + 'Primary' = '10.50.15.25' + 'Secondary' = '10.60.15.14' + } + 'GSRMC' = @{ + 'Primary' = '10.20.15.16' + 'Secondary' = '10.98.2.74' + } + 'SLCH' = @{ + 'Primary' = '10.30.15.18' + 'Secondary' = '10.10.15.11' + } + 'SNLH' = @{ + 'Primary' = '10.60.15.14' + 'Secondary' = '10.50.15.25' + } + } + + <# + Typically SNMP is set to read-only on most printers so we'll have to + replicate web requests. There isn't really a standard so this support + will have to be added for each new scheme. We can determine which scheme + to use based on the model number + #> + $snmp = New-Object -ComObject olePrn.OleSNMP + $printerip = (Resolve-DnsName $printer).IPAddress + $snmp.open($printerip, 'public', 2, 3000) + try { $model = $snmp.Get('.1.3.6.1.2.1.25.3.2.1.3.1') } catch { $model = $null } + switch -Regex ($model) { + '^HP LaserJet Pro M404n' { $function:ScanToEmailHPLJM400} + } +} \ No newline at end of file diff --git a/Private/Search-ISMBusinessObject.ps1 b/Private/Search-ISMBusinessObject.ps1 index 3d6a41c..59646a7 100644 --- a/Private/Search-ISMBusinessObject.ps1 +++ b/Private/Search-ISMBusinessObject.ps1 @@ -298,7 +298,7 @@ BEGIN { try{ $Query = $null - $Query = Invoke-RestMethod -Method GET -uri $uri -headers $headers + $Query = Invoke-RestMethod -Method GET -uri $uri -headers $headers -TimeoutSec $SparkQueryTimeoutSec } catch { @@ -322,7 +322,7 @@ BEGIN { $uri = "$Tenant/api/odata/businessobject/$BusinessObject`?`$filter=$($FilterEncodes[$FilterEncode])&`$top=100&`$skip=$Skip" - $SkipQuery = Invoke-RestMethod -Method GET -uri $uri -headers $headers + $SkipQuery = Invoke-RestMethod -Method GET -uri $uri -headers $headers -TimeoutSec $SparkQueryTimeoutSec if ($SkipQuery){ $Results += $SkipQuery.Value diff --git a/Public/Get-PC.ps1 b/Public/Get-PC.ps1 index dace548..7c21791 100644 --- a/Public/Get-PC.ps1 +++ b/Public/Get-PC.ps1 @@ -23,6 +23,8 @@ elseif ($devStage -eq "Dev") { $getPCWrappedPath = '\\int.samhealth.net\files\TEAM\SHSISDesktopSolutions\Powershell\Get-PC_Update_2023\Get-PC-Wrapped\backlog.txt' +$SparkQueryTimeoutSec = 5 + #lets user know when get-pc has been imported and what version they are running Write-Host "`nGet-PC Module Version $Version [$devStage] Loaded." -ForegroundColor Green if ($Version -ne $deployedVersion) { @@ -269,11 +271,11 @@ Function Get-PC { (New-Object Media.SoundPlayer $oopsSoundPath).Play() } - Write-Host "`n$msg" -ForegroundColor Red + Write-Host "`n$comp`n$msg" -ForegroundColor Red $props = [Ordered]@{ - Hostname = "$msg" - Status = "" + Hostname = "$comp" + Status = "$msg" 'Current User' = "" 'Last User(s)' = "" 'IP | MAC' = "" diff --git a/patchnotes.txt b/patchnotes.txt index c5e8f6d..af0a081 100644 --- a/patchnotes.txt +++ b/patchnotes.txt @@ -1,5 +1,16 @@ -Hi, I'm the patch notes, nice to meet you! +Hi, I'm the patch notes, nice to meet you! You can find me with the -PatchNotes flag. These are the changes in the most recent update of Get-PC +Patch: 2024-09-23 +-Add SHSPrinter IP indicates config method (dhcp, manual, etc.) +-Fix hostname search ends early if user supplied a correct hostname to get-pc (prevents recently changed hostname from failing) +-Fix Spark timeouts applied everywhere +-Fix bug where SCCM scan from BatchInvokes returns without making an object +-Fix found more Spark! error messages to suppress +-Fix SCCM queries have better progress bars +-Fix CMDB fallback reporting that it's querying an empty hostname but queries other details successfully +-Fix combined some SCCM queries for speed in BatchInvokes +-Tip try setting $SoundEnabled = $true then query a pc that's off domain + Patch: 2024-09-18 -Add When update is announced, most recent patch notes are announced with it -Add Patchnotes flag to the help readout so users know what's new