Powershell – System Data Gathering Script

I’ve been meaning to get something like this together for a while, so it will be an always evolving script.

Currently it outputs to a single line in a CSV per machine, but I hope to change this to give the option of outputting to a HTML page/report.

Already I have included a Wishlist of futures options I’d like to include.

### Wishlist
### 20.05.2020 – NOK

Patch Level/hotfixs installed
Central CSV for collating info?
Backup of Registry? May not be required for this level.


Push-Location (Split-Path -path $MyInvocation.MyCommand.Definition -Parent)

# Cutting out manual input of file names for local running.
[Parameter(Mandatory=$true, position=0)][string]$infile,
[Parameter(Mandatory=$true, position=1)][string]$outfile

$infile = "servers.csv"
$outfile = "$($env:computername)_Output.csv"
$ServicesFile = "$($env:computername)_Services.csv"
$AddRemoveProgramsFile = "$($env:computername)_AddRemovePrograms.csv"
$SchedTaskFile = "$($env:computername)_SchedTask.csv"

#Column header in input CSV file that contains the host name
$ColumnHeader = "ComputerName"
$HostList = import-csv $infile | select-object $ColumnHeader
$out = @()

foreach($object in $HostList) {

$os = Get-CIMInstance -computername $object.("ComputerName") -class win32_operatingsystem
$vol = Get-CIMInstance -computername $object.("ComputerName") -class Win32_Volume
$siz = Get-CIMInstance -computername $object.("computername") -class Win32_LogicalDisk | where-object {$_.DriveType -eq "3"}
$net = Get-CIMInstance -computername $object.("ComputerName") -class Win32_NetworkAdapterConfiguration | where-object { $_.IPAddress -ne $null }
$cmp = Get-CIMInstance -computername $object.("ComputerName") -class Win32_ComputerSystem
$stg = Get-CIMInstance -ComputerName $object.("Computername") -class Win32_SystemEnclosure
$far = Get-WindowsFeature -ComputerName $object.("ComputerName") | Where-Object Installed
$freespace = $siz.FreeSpace | %{[math]::round($_/1GB)}
$capacity = $siz.size | %{[math]::round($_/1GB)}
$MShypervisor = If(Test-Path "HKLM:\SOFTWARE\Microsoft\Virtual Machine\Guest\Parameters"){(get-item "HKLM:\SOFTWARE\Microsoft\Virtual Machine\Guest\Parameters").GetValue("HostName")}else{""}
Write-Verbose " Variables Fulfilled"

# Create Additional Files to suppliment Output.csv
Write-Verbose "Getting Services…"
Get-CimInstance -ComputerName $object.("Computername") -class win32_service | Sort-Object | Select-Object Caption,Startmode,Started,StartName | Export-Csv $ServicesFile -NoTypeInformation
Write-Verbose "Getting Installed Applications…"
Get-CimInstance -ComputerName $object.("Computername") -class win32_Product | Sort-Object | Select-Object Name,Version,Installdate | Export-Csv $AddRemoveProgramsFile -NoTypeInformation
Write-Verbose "Getting Scheduled tasks…"
Get-ScheduledTask | Get-ScheduledTaskInfo | Sort-Object |Select-Object TaskName,Description,Author,State,LastRunTime,LastTaskResult,NextRunTime,TaskPath | Export-Csv $SchedTaskFile -NoTypeInformation
Write-Verbose "Extra Files Populated"

$DeviceInfo= @{}
$DeviceInfo.add("Operating System", $os.name.split("|")[0])
$DeviceInfo.add("Version", $os.Version)
$DeviceInfo.add("Architecture", $os.OSArchitecture)
$deviceInfo.add("ServiceTag/Serial", $stg.SerialNumber)
$DeviceInfo.add("P or V", $cmp.model)
$deviceInfo.add("HyperV Host", $MShypervisor)
$deviceInfo.add("Logical Processors", $cmp.NumberOfLogicalProcessors -join (", "))
$DeviceInfo.add("Total Memory", "{0:N2}" -f ([math]::round($cmp.TotalPhysicalMemory / 1GB),2) + " GB")
$DeviceInfo.add("Serial Number", $os.SerialNumber)
$DeviceInfo.add("Organization", $os.Organization)
$DeviceInfo.add("Last Boot Time", $os.LastBootUpTime)
$deviceInfo.add("Disk ID", ($siz.DeviceID -join (", ")))
$deviceInfo.Add("Disk Size", $capacity -join (", "))
$deviceInfo.Add("Free Capacity", $freespace -join (", "))
$DeviceInfo.add("System Name", $cmp.name -join (", "))
$DeviceInfo.add("File System", $vol.FileSystem -join (", "))
$DeviceInfo.add("IP Address", ($net.IPAddress -join (", ")))
$DeviceInfo.add("Default Gateway", ($net.DefaultIPGateway -join (", ")))
$DeviceInfo.add("DNS Server", ($net.DNSServerSearchOrder -join (", ")))
$DeviceInfo.add("Subnet", ($net.IPSubnet -join (", ")))
$DeviceInfo.add("MAC Address", $net.MACAddress )
$DeviceInfo.add("Roles and Features", $far.name -join (", "))

$out += New-Object PSObject -Property $DeviceInfo | Select-Object `
"System Name", "Last Boot Time", "Organization", "Serial Number","Operating System", "ServiceTag/Serial", `
"Version","Architecture","P or V", "HyperV Host", "Total Memory", "File System", "Disk ID", "Disk Size", `
"Free Capacity","MAC Address","IP Address","Default Gateway", "DNS Server", "Subnet", "Roles and Features"

Write-Verbose ($out | Out-String) -Verbose
$out | Export-CSV $outfile -NoTypeInformation



Leave a Reply

Your email address will not be published. Required fields are marked *