Skip to content
David Kittell
David Kittell

Application & System: Development / Integration / Orchestration

  • Services
    • Application Development
    • Online Application Integration
  • Code
  • Online Tools
  • Tech Support
David Kittell

Application & System: Development / Integration / Orchestration

PowerShell – Get Computer Information

Posted on November 6, 2015November 10, 2015 By David Kittell

This script is pieced together from various posts, I only take credit for combining the resources.

There is more than initially is seen to this script, based on the code below it will write a text file on c:\ and does need admin privileges in order to run.

Right around lines 358-361 should be uncommented and comment out 365 if you want to use this on a network rather than a specific machine.

Of course if you are attempting this on a network you will need at least domain admin rights to the network

Import-Module WebAdministration

function Get-ProductKey
    {
        $regVal = Get-ItemProperty $regDir.PSPath
        $arrVal = $regVal.DigitalProductId
        $arrBin = $arrVal[52..66]
        $arrChr = "B", "C", "D", "F", "G", "H", "J", "K", "M", "P", "Q", "R", `
            "T", "V", "W", "X", "Y", "2", "3", "4", "6", "7", "8", "9"
 
        for ($i = 24; $i -ge 0; $i--)
            {
                $k = 0;
                for ($j = 14; $j -ge 0; $j--)
                    {
                        $k = $k * 256 -bxor $arrBin[$j]
                        $arrBin[$j] = [math]::truncate($k / 24)
                        $k = $k % 24
                    }
                 
                $strKey = $arrChr[$k] + $strKey
 
                if (($i % 5 -eq 0) -and ($i -ne 0))
                    {
                        $strKey = "-" + $strKey
                    }
 
            }
        $strKey
}

function Get-Installed
{      
  [CmdletBinding()]
  param
  (
    [Parameter(Mandatory=$False)]
    [Alias('computer')]
    [string]$computername=$env:computername,
    [string]$re = ".*",
    [boolean]$compress=$true,
    [boolean]$namesummary=$false,
    [boolean]$makeobjects=$false,
    [boolean]$showupdates=$false,
    [string]$valuenameRE="displayversion|windowsinstaller|uninstallstring|installlocation|localpackage|installsource|installdate|madeup-|gp_",
    [string]$makeobjectsRE="displayversion|windowsinstaller|uninstallstring|installlocation|localpackage|installsource|installdate|madeup-|gp_"
  )
 
  begin {
    try
    {
        $regbase=[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$computername)
    }
    catch [Exception]
    {
        # see if remote registry is stopped
        Write-Host "Failed to open registry due to "  $_.Exception.Message
        if ($_.Exception.HResult -eq 53)
        {
            # The network path was not found
            exit
        }
        Write-Host "Checking if registry service started on "  $computername
        try
        {
            Get-Service remoteregistry -ComputerName $computername|gm
            $remoteregistry=(Get-Service remoteregistry -ComputerName $computername).status
        }
        catch [Exception]
        {
            Write-Host "cannot reach service manager on " $computername
            exit
        }
        "Remote Registry status is " + $remoteregistry
        if ($remoteregistry -ieq "stopped")
        {
            Set-Service remoteregistry -Status Running -Computername $computername
            sleep 5
            try
            {
                $regbase=[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$computername)
            }
            catch [Exception]
            {
                return $_.Exception.Message
            }
        }
        else
        {
            write-Host  "could not open registry for "  $computername
            exit
 
        }
    }
    $software=@{} # Keep hash of software displaynames -> hash of keypaths -> hash of valuename->values
    $valuenamesfound=@{} # keep count of valuenames found
    $pg2displayname=@{} # set in getproductdata and used in getgrouppolicydata
    $sid2logid=@{}  # Set it
    $installedbywho=@{} # track who has installed a product
    Function load_sid2logid
    {
        # Set $sid2logid using registry profilelist
        $ProfileListKey=$regbase.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList",$False)
        if ($ProfileListKey -eq $null) {return "Yuck"}
        foreach ($guid in $ProfileListKey.GetSubKeyNames())
        {
            if ($guid -imatch "^s-")
            {
                switch($guid.ToUpper())
                {
                    "S-1-5-18" {$sid2logid.Add("S-1-5-18","System")}
                    "S-1-5-19" {$sid2logid.Add("S-1-5-19","Service")}
                    "S-1-5-20" {$sid2logid.Add("S-1-5-20","Network")}
                    default
                    {
                        [string]$ProfileImagePath=$ProfileListKey.OpenSubKey($guid).GetValue("ProfileImagePath")
                        $logid=$ProfileImagePath.Split("\")[-1]
                        $sid2logid.Add($guid.ToUpper(),$logid)
                    }
                }
 
            }
        }
    }
    load_sid2logid
 
    Function WantedDisplayName
    {
        param([string]$wanteddisplayname)
        if ($wanteddisplayname -ieq $null -or $wanteddisplayname -ieq "")
        {
            return($false)
        }
        if (-not ($wanteddisplayname -imatch $re))
        {
            return($false)
        }
        # displayname wanted 
        if ($showupdates)
        {
            return($true)
        }
        else
        {
            if ($wanteddisplayname -imatch "update|hotfix")
            {
                return($false)
            }
            return($true)
             
        }
    }
  }
 
  process 
  {
 
    Function upvaluenamesfound
    {
        param([string]$valuename)
        if ($valuenamesfound.ContainsKey($valuename))
        {
            $valuenamesfound.$valuename++
        }
        else
        {
            $valuenamesfound.Add($valuename,1)
        }
    }
 
    Function getuninstalldata
    {
        param([STRING] $subkeyname)
        $uninstallkey=$regbase.OpenSubKey($subkeyname,$False)
        if ($uninstallkey -ne $null)
        {
            foreach ($gname in $uninstallkey.GetSubKeyNames())
            {
                $prodkey=$uninstallkey.OpenSubKey($gname)
         
                $displayname=$prodkey.GetValue("displayname")
                $uninstallstring=$prodkey.GetValue("uninstallstring")
                if (WantedDisplayName($displayname) -and $uninstallstring -ine ""  -and $uninstallstring -ine $null )
                {
                    $KeyPath=$subkeyname+"\"+$gname
                    $valuehash= @{}
                    #"KeyPath=" + $KeyPath
                    #"displayname='" + $displayname + "'"
                    $valuehash.Add("madeup-gname",$gname)
                    upvaluenamesfound("madeup-gname")
                    if ($subkeyname -imatch "wow6432node")
                    {
                        $valuehash.Add("madeup-wow",1)
                        upvaluenamesfound("madeup-wow")
                    }
                    else
                    {
                        $valuehash.Add("madeup-native",1)
                        upvaluenamesfound("madeup-native")
                    }
                    foreach ($valuename in $prodkey.GetValueNames())
                    {
                        $value=$prodkey.GetValue($valuename)
                        if ($value -ine "" -and $value -ine $null)
                        {
                            $valuehash.Add($valuename.tolower(),$prodkey.GetValue($valuename))
                            upvaluenamesfound($valuename)
                            #"added " + $valuename + "=" + $valuehash.$valuename
                        }
                    }
                    $guidformat="no"
                    if ($gname.StartsWith("{") -and $gname.EndsWith("}") -and $gname.Length -eq 38 ) {$guidformat="yes"} 
                    $tolower=$displayname.ToLower()
                    if ($software.ContainsKey($tolower))
                    {
                        $software.$tolower.Add($KeyPath.ToLower(),$valuehash)
                    }
                    else
                    {
                        $subhash=@{}
                        $subhash.Add($KeyPath.ToLower(),$valuehash)
                        $software.Add($tolower,$subhash)
                    }
                }
            }
        }
    }
 
    Function getproductdatabysid
    {
        param([string]$sid)
        $subkeyname="SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\"+$sid+"\Products"
        $productkey=$regbase.OpenSubKey($subkeyname,$False)
        foreach ($gname in $productkey.GetSubKeyNames())
        {
            $prodkey=$productkey.OpenSubKey($gname).OpenSubKey("InstallProperties")
            try
            {
                $displayname=$prodkey.GetValue("displayname")
                $uninstallstring=$prodkey.GetValue("uninstallstring")
                $pg2displayname.Add($gname.ToLower(),$displayname)  # remember packed guid
            }
            catch
            {
                $uninstallstring=""
                $displayname=""
            }
            if (WantedDisplayName($displayname)  -and $uninstallstring -ine ""  -and $uninstallstring -ine $null )
            {
                $KeyPath=$subkeyname+"\"+$gname + "\InstallProperties"
                #"KeyPath=" + $KeyPath
                #"displayname='" + $displayname + "'"
                $valuehash= @{}
                $valuehash.Add("madeup-loginid",$sid2logid.$sid)
                foreach ($valuename in $prodkey.GetValueNames())
                {
                    $value=$prodkey.GetValue($valuename)
                    if ($value -ine "" -and $value -ine $null)
                    {
                        $valuehash.Add($valuename.tolower(),$prodkey.GetValue($valuename))      
                        upvaluenamesfound($valuename)
                        #"added " + $valuename + "=" + $valuehash.$valuename
                    }
                }
                $tolower=$displayname.ToLower()
                if ($software.ContainsKey($tolower))
                {
                    $software.$tolower.Add($KeyPath.ToLower(),$valuehash)
                }
                else
                {
                    $subhash=@{}
                    $subhash.Add($KeyPath.ToLower(),$valuehash)
                    $software.Add($tolower,$subhash)
                }
            }
        }
    }
 
    Function getproductdata
    {
        $subkeyname="SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData"
        $userdatakey=$regbase.OpenSubKey($subkeyname,$False)
        foreach ($sid in $userdatakey.GetSubKeyNames())
        {
            getproductdatabysid($sid)
        }
    }
 
    Function getgrouppolicydata
    {
        $subkeyname="SOFTWARE/Microsoft/Windows/CurrentVersion/Group Policy/AppMgmt"
        $gpkey=$regbase.OpenSubKey($subkeyname,$False)
        if ($gpkey -eq $null)
        {
            return
        }
        foreach ($gname in $gpkey.GetSubKeyNames())
        {
            $prodkey=$gpkey.OpenSubKey($gname)
            $displayname=$pg2displayname.($gname.ToLower())
            if (WantedDisplayName($displayname))
            {
                $keypath=$subkeyname+ "\" + $gname
                $valuehash=@{}
                foreach ($valuename in $prodkey.GetValueNames())
                {
                    $value=$prodkey.GetValue($valuename)
                    if ($value -ine "" -and $value -ine $null)
                    {
                        $valuehash.Add("gp_"+$valuename.tolower(),$prodkey.GetValue($valuename))      
                        upvaluenamesfound($valuename)
                        #"added " + $valuename + "=" + $valuehash.$valuename
                    }
                }
                $tolower=$displayname.ToLower()
                if ($software.ContainsKey($tolower))
                {
                    $software.$tolower.Add($KeyPath.ToLower(),$valuehash)
                }
                else
                {
                    $subhash=@{}
                    $subhash.Add($KeyPath.ToLower(),$valuehash)
                    $software.Add($tolower,$subhash)
                }
            }
        }
    }
 
    getuninstalldata("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
    getuninstalldata("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall")
    getproductdata
    getgrouppolicydata
 
    #HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\00002109610090400000000000F01FEC\InstallProperties
    if ($namesummary)
    {
        $mykeys=$valuenamesfound.keys|sort-object -Property @{Expression={[int]$valuenamesfound.$_}; Ascending=$false}
        foreach ($valuename in ($mykeys))
        {
            if ($valuename -ne "" -and $valuename -ne $null) {$valuename + "," + $valuenamesfound.$valuename}
        }
    }
    elseif ($makeobjects)
    {
      foreach ($displayname in ($software.Keys|Sort-Object))
        {
            if ($displayname -imatch $re) {
                #" "
                #"displayname="  + $displayname
                $compressedhash=@{};
                foreach ($keypath in ($software.$displayname.Keys|Sort-Object))
                {
                    foreach ($valuename in ($software.$displayname.$keypath.Keys|Sort-Object))
                    {
                       if (-not $compressedhash.ContainsKey($valuename))
                       {
                            $compressedhash.Add($valuename,$software.$displayname.$keypath.$valuename)
                       }
                       elseif ($valuename -ieq "madeup-loginid")
                       {
                            $compressedhash.$valuename += ("," + $software.$displayname.$keypath.$valuename)
                       }
                    }
                }
                $obj=New-Object object
                $obj|Add-Member -MemberType NoteProperty "displayname"  $displayname
                foreach ($valuename in ($valuenamesfound.keys|Sort-Object))
                {
                    if ($valuename -imatch $makeobjectsRE)
                    {
                        if ($compressedhash.ContainsKey($valuename))
                        {
                            $obj|Add-Member -MemberType NoteProperty $valuename $compressedhash.$valuename
                        }
                        else
                        {
                            $obj|Add-Member -MemberType NoteProperty $valuename ""
                        }
                    }
                }
                Write-Output $obj
            }
        }
    }
    elseif ($compress)
    {
        foreach ($displayname in ($software.Keys|Sort-Object))
        {
            if ($displayname -imatch $re) {
                " "
                "displayname="  + $displayname
                $compressedhash=@{};
                foreach ($keypath in ($software.$displayname.Keys|Sort-Object))
                {
                    foreach ($valuename in ($software.$displayname.$keypath.Keys|Sort-Object))
                    {
                       if (-not $compressedhash.ContainsKey($valuename))
                       {
                            $compressedhash.Add($valuename,$software.$displayname.$keypath.$valuename)
                       }
                       elseif ($valuename -ieq "madeup-loginid")
                       {
                            $compressedhash.$valuename += ("," + $software.$displayname.$keypath.$valuename)
                       }
                    }
                }
                foreach ($valuename in ($compressedhash.Keys|Sort-Object))
                {
                    if ($valuename -imatch $valuenameRE)
                    {
                        "           " + $valuename +  "=" +  $compressedhash.$valuename
                    }
                }
            }
        }
    }
    else
    {
        foreach ($displayname in ($software.Keys|Sort-Object))
        {
            if ($displayname -imatch $re) {
                " "
                "displayname="  + $displayname
                foreach ($keypath in ($software.$displayname.Keys|Sort-Object))
                {
                    "      keypath=" + $keypath
                    foreach ($valuename in ($software.$displayname.$keypath.Keys|Sort-Object))
                    {
                        if ($valuename -imatch $valuenameRE)
                        {
                            "           " + $valuename +  "=" +  $software.$displayname.$keypath.$valuename
                        }
                    }
                }
            }
        }
    }
  }
}
 

# IP Address Information - Start
function Get-NetworkIP
    {
[cmdletbinding()]            
param (            
 [parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]            
    [string[]]$ComputerName = $env:computername            
)                        
            
begin {}            
process {            
 foreach ($Computer in $ComputerName) {            
  if(Test-Connection -ComputerName $Computer -Count 1 -ea 0) {            
   try {            
    $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer -EA Stop | ? {$_.IPEnabled}            
   } catch {            
        Write-Warning "Error occurred while querying $computer."            
        Continue            
   }            
   foreach ($Network in $Networks) {            
   $Adapter = $Network.Description
    $IPAddress  = $Network.IpAddress[0]            
    $SubnetMask  = $Network.IPSubnet[0]            
    $DefaultGateway = $Network.DefaultIPGateway            
    $DNSServers  = $Network.DNSServerSearchOrder            
    $IsDHCPEnabled = $false            
    If($network.DHCPEnabled) {            
     $IsDHCPEnabled = $true            
    }            
    $MACAddress  = $Network.MACAddress            
    $OutputObj  = New-Object -Type PSObject            
    #$OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Computer.ToUpper()            
    $OutputObj | Add-Member -MemberType NoteProperty -Name Adapter -Value $Adapter            
    $OutputObj | Add-Member -MemberType NoteProperty -Name IPAddress -Value $IPAddress            
    $OutputObj | Add-Member -MemberType NoteProperty -Name SubnetMask -Value $SubnetMask            
    $OutputObj | Add-Member -MemberType NoteProperty -Name Gateway -Value $DefaultGateway            
    $OutputObj | Add-Member -MemberType NoteProperty -Name IsDHCPEnabled -Value $IsDHCPEnabled            
    $OutputObj | Add-Member -MemberType NoteProperty -Name DNSServers -Value $DNSServers            
    $OutputObj | Add-Member -MemberType NoteProperty -Name MACAddress -Value $MACAddress            
    $OutputObj            
   }            
  }            
 }            
}            
            
end {}
}
# IP Address Information - Stop

 
#Windows
 
$regDir = Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
 
$key_1 = Get-ProductKey
    
Function ShowInfo { 
 
 if ([string]::IsNullOrEmpty($compname))
 {
 Write-Host "Unable to get computer name"
 }
 else
 {
      "General Computer Information:`n"
      # Create Table
       $CITable = New-Object system.Data.DataTable "Computer Information"
#Create Columns for table 
       $CITcol1 = New-Object system.Data.DataColumn Item,([string])       
       $CITcol2 = New-Object system.Data.DataColumn Value,([string])
#Add Columns to table
       $CITable.columns.add($CITcol1)
       $CITable.columns.add($CITcol2)
      $I = gwmi -computer $compname Win32_ComputerSystem    
#Create Row Variable 
      $CITRow = $CITable.NewRow()
#Assign items to row variable
      $CITRow.Item = 'Computer Name' 
      $CITRow.Value = $I.Name
#Add Row to Table using Row Variable
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Domain Name'
      $CITRow.Value = $I.Domain
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Manufacturer'
      $CITRow.Value = $I.Manufacturer
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Model'
      $CITRow.Value = $I.Model
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'System Type'
      $CITRow.Value = $I.SystemType
      $CITable.Rows.Add($CITRow)
       
      $I = gwmi -computer $compname Win32_BIOS
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Serial Number'
      $CITRow.Value = $I.SerialNumber
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'BIOS Name'
      $CITRow.Value = $I.Name
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = '     Version'
      $CITRow.Value = $I.SMBIOSBIOSVersion
      $CITable.Rows.Add($CITRow)
 
      $I = gwmi -computer $compname Win32_ComputerSystem
 
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Current User ID'
      $CITRow.Value = $I.Username
      $CITable.Rows.Add($CITRow)
       
      $I = gwmi -computer $compname Win32_OperatingSystem
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'OS Name'
      $CITRow.Value = $I.Caption
      $CITable.Rows.Add($CITRow)
       
    $CITRow = $CITable.NewRow()
      $CITRow.Item = 'OS Service Pack'
      $CITRow.Value = $I.ServicePackMajorVersion
      $CITable.Rows.Add($CITRow)

      
       $CITRow = $CITable.NewRow()
      $CITRow.Item = 'OS Version'
      $CITRow.Value = $I.Version
      $CITable.Rows.Add($CITRow)

        $CITRow = $CITable.NewRow()
      $CITRow.Item = 'OS Product Key'
      $CITRow.Value = $key_1
      $CITable.Rows.Add($CITRow)
 
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Serial Number'
      $CITRow.Value = $I.SerialNumber
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'OS Bit Width'
      $CITRow.Value = $I.OSArchitecture
      $CITable.Rows.Add($CITRow)
       
      $I = gwmi -computer $compname -Class Win32_Processor | select $WMI_ProcProps

      # CPU count
                if (@($I)[0].NumberOfCores) #Modern OS
                {
                    $Sockets = @($I).Count
                    $Cores = ($I | Measure-Object -Property NumberOfLogicalProcessors -Sum).Sum
                }
                else #Legacy OS
                {
                    $Sockets = @($I | Select-Object -Property SocketDesignation -Unique).Count
                    $Cores = @($I).Count
                }

       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Processor Name'
      $CITRow.Value = $I.Name
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = '          Info'
      $CITRow.Value = $I.Caption
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = '          Maker'
      $CITRow.Value = $I.Manufacturer
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = '          ID'
      $CITRow.Value = $I.ProcessorId
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = '          Cores'
      $CITRow.Value = $Cores
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = '          Sockets'
      $CITRow.Value = $Sockets
      $CITable.Rows.Add($CITRow)
      
 
      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Address Width'
      $CITRow.Value = $I.AddressWidth
      $CITable.Rows.Add($CITRow)
  
 $wmi = gwmi -computer $compname Win32_OperatingSystem
  
      $localdatetime = $wmi.ConvertToDateTime($wmi.LocalDateTime) 
      $lastbootuptime = $wmi.ConvertToDateTime($wmi.LastBootUpTime) 
      $OSInstallDate =  $wmi.ConvertToDateTime($wmi.InstallDate) 
    $uptime = $localdatetime - $lastbootuptime
       
$CITRow = $CITable.NewRow()
      $CITRow.Item = 'OS Install Date'
      $CITRow.Value = $OSInstallDate
      $CITable.Rows.Add($CITRow)


      $CITRow = $CITable.NewRow()
      $CITRow.Item = 'Time Current'
      $CITRow.Value = $LocalDateTime
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = '     Last Boot'
      $CITRow.Value = $LastBootUpTime
      $CITable.Rows.Add($CITRow)
       
      $CITRow = $CITable.NewRow()
      $CITRow.Item = '     Total Up'
      $CITRow.Value =  "$($Uptime.days) days $($Uptime.hours) hours $($Uptime.minutes) minutes"
      $CITable.Rows.Add($CITRow)
       
#Output table
      $fmt = @{Expression={$_.Item};Label="Item";width=20},
             @{Expression={$_.Value};Label="Value";Width=40}
              
      $CITable | Select-Object Item,Value | Format-Table $fmt -AutoSize
 
      #Battery Information
 "Battery Information:"
Get-WmiObject Win32_Battery -ComputerName $compname  | Select Caption,Name,DesignVoltage,DeviceID,EstimatedChargeRemaining,EstimatedRunTime | Format-Table -autosize
  
#Disk Info 
            "Drive Information:"
            $fmt = @{Expression={$_.Name};Label="Drive Letter";width=12},
                     @{Expression={$_.VolumeName};Label="Vol Name";Width=15},
                     @{Expression={ '{0:#,000.00}' -f ($_.Size/1gb)};Label="Disk Size / GB";width=14},
                     @{Expression={ '{0:#,000.00}' -f ($_.FreeSpace/1gb)};Label="Free Space / GB";width=15}
                      
            $wmi = gwmi -computer $compname Win32_logicaldisk 
            $wmi | Format-Table $fmt -AutoSize
 
# Hard-Disk 
"Hard Disk Information"
Get-WmiObject win32_diskDrive -ComputerName $compname  | select Model,SerialNumber,InterfaceType,Size,Partitions | Format-Table -autosize
  
# CD ROM Drive 
"Optical Disk Information"
Get-WmiObject Win32_CDROMDrive -ComputerName $compname  |  select Name,Drive,MediaLoaded,MediaType,MfrAssignedRevisionLevel | Format-Table -autosize
 
 
#Memory Info 
            "Memory Information:"
            $fmt = 
                @{Expression={$_.Manufacturer};Label="Manufacturer";},
                 @{Expression={$_.PartNumber};Label="PartNumber";},                
                @{Expression={$_.Speed};Label="Speed";width=20},
                @{Expression={$_.DataWidth};Label="Data Width";width=10},
                @{Expression={ '{0:#.00}' -f ($_.Capacity/1gb)};Label="Module Size / GB";width=16},
                @{Expression={$_.DeviceLocator};Label="Slot";width=6},
                @{Expression={$_.SerialNumber};Label="Serial No."}
 
            $wmi = gwmi -computer $compname Win32_PhysicalMemory 
            $wmi | Format-Table $fmt -AutoSize
 
 # IIS Information - Start
 "IIS Information:"
  $props = @{Expression={$_.Name};Label="Site Name"}, ` @{Expression={$_.applicationPool};Label="Site App Pool";}, ` @{Expression={$_.PhysicalPath};Label="Site Physical Path";}

dir IIS:\Sites | Format-Table $props -AutoSize

      # IIS Information - Stop
 
#Network Information
"Network Information:"

Get-NetworkIP | Format-Table -AutoSize
 
Get-WmiObject win32_networkadapter -ComputerName $compname  | Select Name,Manufacturer,Description ,AdapterType,Speed,MACAddress,NetConnectionID | Format-Table -autosize
 
# Network Information - Start           
 foreach ($Computer in $ComputerName) {            
  if(Test-Connection -ComputerName $Computer -Count 1 -ea 0) {            
   try {            
    $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $Computer -EA Stop | ? {$_.IPEnabled}            
   } catch {            
        Write-Warning "Error occurred while querying $computer."            
        Continue            
   }            
   foreach ($Network in $Networks) {            
    $IPAddress  = $Network.IpAddress[0]            
    $SubnetMask  = $Network.IPSubnet[0]            
    $DefaultGateway = $Network.DefaultIPGateway            
    $DNSServers  = $Network.DNSServerSearchOrder            
    $IsDHCPEnabled = $false            
    If($network.DHCPEnabled) {            
     $IsDHCPEnabled = $true            
    }            
    $MACAddress  = $Network.MACAddress            
    $OutputObj  = New-Object -Type PSObject            
    #$OutputObj | Add-Member -MemberType NoteProperty -Name ComputerName -Value $Computer.ToUpper()            
    $OutputObj | Add-Member -MemberType NoteProperty -Name Interface -Value $Network.Caption         
    $OutputObj | Add-Member -MemberType NoteProperty -Name IPAddress -Value $IPAddress            
    $OutputObj | Add-Member -MemberType NoteProperty -Name SubnetMask -Value $SubnetMask            
    $OutputObj | Add-Member -MemberType NoteProperty -Name Gateway -Value $DefaultGateway            
    $OutputObj | Add-Member -MemberType NoteProperty -Name IsDHCPEnabled -Value $IsDHCPEnabled            
    $OutputObj | Add-Member -MemberType NoteProperty -Name DNSServers -Value $DNSServers            
    $OutputObj | Add-Member -MemberType NoteProperty -Name MACAddress -Value $MACAddress            
    $OutputObj | Format-Table -AutoSize -Wrap
   }            
  }            
 }   
 # Network Information - Stop
 
#PC Printer Information 
            "Installed Printer Information:"
            gwmi -computer $compname Win32_Printer | Select-Object DeviceID,DriverName, PortName | Format-Table -autosize

# Application Info
"Application Information:"

Get-Installed -makeobjects $true -compress $false |format-table -autosize  displayname, displayversion, installdate
 
#Service Info
"Service Information:"
 
Get-Service|Format-Table name,displayname, status –AutoSize
 
 
 
#Monitor Info 
            "Monitor Information:" 
            #Turn off Error Messages 
            $ErrorActionPreference_Backup = $ErrorActionPreference 
            $ErrorActionPreference = "SilentlyContinue" 
  
  
            $keytype=[Microsoft.Win32.RegistryHive]::LocalMachine 
            if($reg=[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($keytype,$compname)){ 
                #Create Table To Hold Info 
                $montable = New-Object system.Data.DataTable "Monitor Info" 
                #Create Columns for Table 
                $moncol1 = New-Object system.Data.DataColumn Name,([string]) 
                $moncol2 = New-Object system.Data.DataColumn Serial,([string]) 
                $moncol3 = New-Object system.Data.DataColumn Ascii,([string]) 
                #Add Columns to Table 
                $montable.columns.add($moncol1) 
                $montable.columns.add($moncol2) 
                $montable.columns.add($moncol3) 
  
  
  
                $regKey= $reg.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum\DISPLAY" ) 
                $HID = $regkey.GetSubKeyNames() 
                foreach($HID_KEY_NAME in $HID){ 
                    $regKey= $reg.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum\\DISPLAY\\$HID_KEY_NAME" ) 
                    $DID = $regkey.GetSubKeyNames() 
                    foreach($DID_KEY_NAME in $DID){ 
                        $regKey= $reg.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum\\DISPLAY\\$HID_KEY_NAME\\$DID_KEY_NAME\\Device Parameters" ) 
                        $EDID = $regKey.GetValue("EDID") 
                        foreach($int in $EDID){ 
                            $EDID_String = $EDID_String+([char]$int) 
                        } 
                        #Create new row in table 
                        $monrow=$montable.NewRow() 
                          
                        #MonitorName 
                        $checkstring = [char]0x00 + [char]0x00 + [char]0x00 + [char]0xFC + [char]0x00            
                        $matchfound = $EDID_String -match "$checkstring([\w ]+)" 
                        if($matchfound){$monrow.Name = [string]$matches[1]} else {$monrow.Name = '-'} 
  
                          
                        #Serial Number 
                        $checkstring = [char]0x00 + [char]0x00 + [char]0x00 + [char]0xFF + [char]0x00            
                        $matchfound =  $EDID_String -match "$checkstring(\S+)" 
                        if($matchfound){$monrow.Serial = [string]$matches[1]} else {$monrow.Serial = '-'} 
                                                  
                        #AsciiString 
                        $checkstring = [char]0x00 + [char]0x00 + [char]0x00 + [char]0xFE + [char]0x00            
                        $matchfound = $EDID_String -match "$checkstring([\w ]+)" 
                        if($matchfound){$monrow.Ascii = [string]$matches[1]} else {$monrow.Ascii = '-'}          
  
                                  
                        $EDID_String = '' 
                          
                        $montable.Rows.Add($monrow) 
                    }   # End - foreach($DID_KEY_NAME in $DID)
                     
                } # End - foreach($HID_KEY_NAME in $HID)
                 
                $montable | select-object  -unique Serial,Name,Ascii | Where-Object {$_.Serial -ne "-"} | Format-Table  -AutoSize
                  
            }   # End If
             
            else {  
                Write-Host "Access Denied - Check Permissions" 
            } 
             
             }
} #End Function ShowInfo
  
#---------Start Main-------------- 
Clear-Host
 
# Single Computer Based - Start
$compname = $env:COMPUTERNAME
# Single Computer Based - Stop

$exportFile = "c:\Computer_Info_" + $compname + ".txt"

ShowInfo > $exportFile

Primary source: http://windowssecrets.com/forums/showthread.php/140015-PowerShell-PC-Information-Utility

Originally Posted on November 6, 2015
Last Updated on November 10, 2015
All information on this site is shared with the intention to help. Before any source code or program is ran on a production (non-development) system it is suggested you test it and fully understand what it is doing not just what it appears it is doing. I accept no responsibility for any damage you may do with this code.

Related

Code PowerShell

Post navigation

Previous post
Next post

Related Posts

C# ASPX Email File

Posted on April 4, 2014October 26, 2015

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <asp:label id="lblUploadStatus" runat="server"></asp:label><br /> <asp:label id="lblEmailStatus" runat="server"></asp:label><br /> <form id="form1" runat="server"> <div> From: <asp:textbox id="txtFromEmail" runat="server" /><br /> <asp:fileupload id="FileUpload1" runat="server" /><br /> <asp:button id="btnUpload" runat="server" text="Submit" onclick="btnUpload_Click"…

Read More

Mac Terminal – Random Readable Password

Posted on February 1, 2017

I recently was challenged to create a random readable password for Mac OS. While I designed this for Mac OS it’s likely it will work with little to no changes on any UNIX system. Password format was two digit number then a word followed by another word with special characters…

Read More

List All Files In Folder

Posted on September 23, 2015

<?PHP function getDirectory( $path = ‘.’, $level = 0 ){ $ignore = array( ‘cgi-bin’, ‘.’, ‘..’ ); // Directories to ignore when listing output. Many hosts // will deny PHP access to the cgi-bin. $dh = @opendir( $path ); // Open the directory to the handle $dh while( false !==…

Read More

Code

Top Posts & Pages

  • PowerShell - Rename Pictures to Image Taken
  • Front Page
  • PowerShell - IIS Remove Site
  • SQLite - Auto-Increment / Auto Generate GUID
  • PowerShell - FTP Upload Directory With Sub-Directories

Recent Posts

  • Javascript – Digital Clock with Style
  • BASH – Web Ping Log
  • BASH – Picture / Video File Name Manipulation
  • Mac OSX Terminal – Create SSH Key
  • Bash – Rename Picture

Top Posts

  • PowerShell - Rename Pictures to Image Taken
  • PowerShell - IIS Remove Site
  • SQLite - Auto-Increment / Auto Generate GUID
  • PowerShell - FTP Upload Directory With Sub-Directories
  • Raspberry Pi - Remove Default Apps
  • PowerShell - Change Windows CD/DVD Drive Letter
©2025 David Kittell | WordPress Theme by SuperbThemes