question

Rockamakis-3249 avatar image
0 Votes"
Rockamakis-3249 asked LimitlessTechnology-2700 answered

Need PowerShell Function help

I am relatively new to PowerShell and attempting to create a function to get system inventory.


Function Get-SystemInfo($ComputerName)
{

Foreach ( $computer in $computerName ) {

Write-Progress -Activity "Collecting System Information of $computer"

$system = @()

$OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Computer
If($OS.Version -eq "10.0.17134") { $OS.Version = '1803' }
elseif($OS.Version -eq "10.0.17763") { $OS.Version = '1809' }
elseif($OS.Version -eq "10.0.18362") { $OS.Version = '1903' }
elseif($OS.Version -eq "10.0.18363") { $OS.Version = '1909' }
elseif($OS.Version -eq "10.0.19041") { $OS.Version = '2004' }
elseif($OS.Version -eq "10.0.19042") { $OS.Version = '2010' }
elseif($OS.Version -eq "10.0.20206") { $OS.Version = '2101' }

$sheetS = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $Computer
If ($null -eq $sheets.UserName) { Get-WinEvent -Computer $Computer -FilterHashtable @{Logname='Security';ID=4672} -MaxEvents 1|
Select-Object @{N='User';E={$_.Properties[1].Value}} { $sheets.UserName = 'User' }}

$pingStatus = Get-WmiObject -Query "Select * from win32_PingStatus where Address='$Computer'"
$cpu = Get-WmiObject -ClassName Win32_ComputerSystem -ComputerName $computer | Select-Object -Property Name, Manufacturer, Model, UserName
$bios = Get-WmiObject -ClassName Win32_Bios -ComputerName $computer

$MAC = Get-WmiObject win32_networkadapterconfiguration -ComputerName $computer | Select-Object -Property @{name='IPAddress';Expression={($_.IPAddress[0])}},MacAddress | Where-Object IPAddress -NE $null

$monitor = Get-WmiObject WmiMonitorID -ComputerName $computer -Namespace root\wmi |
Select-Object @{n="Manufacturer";e={[System.Text.Encoding]::ASCII.GetString($.ManufacturerName -ne 00)}},
@{n="Model";e={[System.Text.Encoding]::ASCII.GetString($
.UserFriendlyName -ne 00)}},
@{n="Serial_Number";e={[System.Text.Encoding]::ASCII.GetString($_.SerialNumberID -ne 00)}}

$AD = Get-ADComputer $computer -Properties * | Select-Object DistinguishedName, LastLogonDate, OperatingSystemVersion, lastLogonTimestamp, whenChanged, whenCreated, CanonicalName, streetaddress, location
If($OS.Version -eq "10.0.17134") { $OS.Version = '1803' }
elseif($OS.Version -eq "10.0.17763") { $OS.Version = '1809' }
elseif($OS.Version -eq "10.0.18362") { $OS.Version = '1903' }
elseif($OS.Version -eq "10.0.18363") { $OS.Version = '1909' }
elseif($OS.Version -eq "10.0.19041") { $OS.Version = '2004' }
elseif($OS.Version -eq "10.0.19042") { $OS.Version = '2010' }
elseif($OS.Version -eq "10.0.20206") { $OS.Version = '2101' }


foreach ( $hardware in $computer) {
$SystemName = $hardware
$SystemStatus = $pingStatus
$UserName = $sheetS.UserName.trim("\")
$OSVersion = $OS.Version
$MacAddress = $MAC.MacAddress
$SystemMan = $cpu.Manufacturer
$SystemMod = $cpu.Model
$SystemSerial = $bios.SerialNumber
$Monitor1Man = $monitor[0]
$Monitor1Mod = $monitor[1]
$Monitor1Ser = $monitor[2]
$Monitor2Man = $monitor[3]
$Monitor2Mod = $monitor[4]
$Monitor2Ser = $monitor[5]
$Monitor3Man = $monitor[6]
$Monitor3Mod = $monitor[7]
$Monitor3Ser = $monitor[8]
$Street = $AD.streetaddress
$Location = $AD.location
$OU2 = $AD.CanonicalName

$SystemInfo = [PSCustomObject]@{Computer = $SystemName;
Status = $SystemStatus;
UserName = $UserName;
OS_Version = $OSVersion;
MAC_Address = $MacAddress;
System_Manufacturer = $SystemMan;
System_Model = $SystemMod;
System_Serial_Number = $SystemSerial;
Monitor_1_Manufacturer = $Monitor1Man;
Monitor_1_Model = $Monitor1Mod;
Monitor_1_Serial = $Monitor1Ser;
Monitor_2_Manufacturer = $Monitor2Man;
Monitor_2_Model = $Monitor2Mod;
Monitor_2_Serial = $Monitor2Ser;
Monitor_3_Manufacturer = $Monitor3Man;
Monitor_3_Model = $Monitor3Mod;
Monitor_3_Serial = $Monitor3Ser;
Street_Address = $Street;
Location = $Location;
OU = $OU2}

$system += $SystemInfo

}
$props = 'Computer','Status','User_Name','OS_Version','MAC_Address','System_Manufacturer','System_Model','System_Serial_Number','Monitor_1_Manufacturer','Monitor_1_Model','Monitor_1_Serial','Monitor_2_Manufacturer','Monitor_2_Model','Monitor_2_Serial','Monitor_3_Manufacturer','Monitor_3_Model','Monitor_3_Serial','Street_Address','Location','OU'
$system = ($system | Select-Object $props | Sort-Object Computer)
$system

     }

} # End Function

Right now if I run it it only prints out the system name, street address, location and OU with no other information. The end goal is for the output to display all the information of connected systems and for the disconnected systems it will only display the information that can be pulled from AD.

windows-server-powershell
· 1
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

When you post code, please use the code editor to do so. Activate the code editor by clicking the "Code Sample" icon in the format bar (it's 5th from the left and has "101 010" as its graphic), or use CTRL+K.

If you post code as if it were text, the default editor screws up the code in subtle ways that cause errors. It also makes it difficult to separate the code from the text in the post.

0 Votes 0 ·
RichMatheisen-8856 avatar image
0 Votes"
RichMatheisen-8856 answered

I took the liberty of neatening up your code and fixing a few errors. There's still some work for you to do to get the monitor data into discrete properties.

 Function Get-SystemInfo($ComputerName) {
     $versionhash = @{
                 "10.0.17134" = '1803'
                 "10.0.17763" = '1809'
                 "10.0.18362" = '1903'
                 "10.0.18363" = '1909'
                 "10.0.19041" = '2004'
                 "10.0.19042" = '2010'
                 "10.0.20206" = '2101'
             }
        
     Foreach ( $computer in $computerName ) {
         Write-Progress -Activity "Collecting System Information of $computer"
    
         $OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Computer
         if ($versionhash.ContainsKey($OS.Version)){
             $OS.Version = $versionhash.($OS.Version)
         }
         else{
             $OS.Version = "UNKNOWN $($OS.Version)"
         }
         $sheetS = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $Computer
         If ($null -eq $sheets.UserName) {
             $SheetS.UserName =  Get-WinEvent -Computer $Computer -FilterHashtable @{Logname = 'Security'; ID = 4672 } -MaxEvents 1 |
                                     Select-Object -ExpandProperty $_.Properties[1].Value
         }
    
         $pingStatus = Get-WmiObject -Query "Select * from win32_PingStatus where Address='$Computer'"   # Why not use Test-Connection cmdlet?
         $cpu =  Get-WmiObject -ClassName Win32_ComputerSystem -ComputerName $computer | 
                     Select-Object -Property Name, Manufacturer, Model, UserName
         $bios = Get-WmiObject -ClassName Win32_Bios -ComputerName $computer
         $MAC =  Get-WmiObject win32_networkadapterconfiguration -ComputerName $computer | 
                     Select-Object -Property @{name = 'IPAddress'; Expression = { ($_.IPAddress[0]) } }, MacAddress | Where-Object IPAddress -NE $null
         $monitor =  Get-WmiObject WmiMonitorID -ComputerName $computer -Namespace root\wmi |
                         Select-Object   @{n = "Manufacturer"; e = { [System.Text.Encoding]::ASCII.GetString($_.ManufacturerName -ne 00) } },
                                         @{n = "Model"; e = { [System.Text.Encoding]::ASCII.GetString($_.UserFriendlyName -ne 00) } },
                                         @{n = "Serial_Number"; e = { [System.Text.Encoding]::ASCII.GetString($_.SerialNumberID -ne 00) } }
         Try{
             $AD =   Get-ADComputer $computer -Properties * -ErrorAction STOP | 
                         Select-Object DistinguishedName, LastLogonDate, OperatingSystemVersion, lastLogonTimestamp, whenChanged, whenCreated, CanonicalName, streetaddress, location
         }
         Catch{
             $AD = "" | Select-Object @{n=DistinguishedName;e={$computer + 'Not found in AD'}}, LastLogonDate, OperatingSystemVersion, lastLogonTimestamp, whenChanged, whenCreated, CanonicalName, streetaddress, location
         }
    
         [PSCustomObject]@{
             Computer                             = $computer
             Status                               = $pingStatus
             UserName                             = $sheetS.UserName.trim("\")
             OS_Version                           = $OS.Version
             MAC_Address                          = $MAC.MacAddress
             System_Manufacturer                  = $cpu.Manufacturer
             System_Model                         = $cpu.Model
             System_Serial_Number                 = $bios.SerialNumber
             Monitor_1_Manufacturer               = $monitor[0]
             Monitor_1_Model                      = $monitor[1]
             Monitor_1_Serial                     = $monitor[2]
             Monitor_2_Manufacturer               = $monitor[3]
             Monitor_2_Model                      = $monitor[4]
             Monitor_2_Serial                     = $monitor[5]
             Monitor_3_Manufacturer               = $monitor[6]
             Monitor_3_Model                      = $monitor[7]
             Monitor_3_Serial                     = $monitor[8]
             Street_Address                       = $AD.streetaddress
             Location                             = $AD.location
             OU                                   = $AD.CanonicalName
         }
     }
 } # End Function
    
 # how to use function
 Get-SystemInfo 'WS06' |
     Sort-Object Computer
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

LimitlessTechnology-2700 avatar image
0 Votes"
LimitlessTechnology-2700 answered

Hello @Rockamakis-3249

I would recommend to check the suggestions on the next post, as it covers the same topic already:

https://social.technet.microsoft.com/Forums/Azure/en-US/268387c7-dea5-41c8-a986-8a49c18e3041/asset-inventory-assistance-with-powershell-script?forum=winserverpowershell

Hope this helps with your query,


--If the reply is helpful, please Upvote and Accept as answer--

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.