Get-PC/Private/PCLocal.ps1

377 lines
16 KiB
PowerShell
Raw Normal View History

2024-06-11 18:27:55 +00:00
function Get-PCLocal {
# Spark connection params
$Tenant = 'https://samaritanhealth-amc.ivanticloud.com'
$Headers = @{
"Content-Type" = "application/json"
"Authorization" = 'rest_api_key=EB68123D62F8489295C807353C92D75B'
"Accept" = "*/*"
"Accept-Encoding" = "gzip, deflate, br"
2024-06-11 18:27:55 +00:00
}
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Network Adapters, Storage Disks, and Chassis" -PercentComplete 10
try {$win32_networkadapterconfiguration = Get-CimInstance -Class win32_networkadapterconfiguration} catch {$win32_networkadapterconfiguration = $null} #| MAC Address,
try {$win32_LogicalDisk = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" } catch {$win32_LogicalDisk = $null} #| Diskspace,
try {$win32_SystemEnclosure = Get-CimInstance -ClassName Win32_SystemEnclosure} catch {$win32_SystemEnclosure = $null} #| Asset Tag
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Bitlocker, Current User, RAM, Serial Number, and OS Version" -PercentComplete 20
try {$bitlocker = manage-bde -status C:} catch {$bitlocker = $null} # | Bitlocker Status
try {$PCInfo = get-computerinfo} catch {$PCInfo = $null}
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Printers, Imprivata, and Stoarge Disk Type" -PercentComplete 30
try {$physicalDisk = Get-PhysicalDisk} catch {$physicalDisk = $null} # | Disk Type
try {$win32_printer = (Get-CimInstance -ClassName win32_printer | Where-Object {$_.PortName -ne 'PORTPROMPT:' -and $_.PortName -ne 'nul:' -and $_.PortName -ne 'SHRFAX:'} | Select-Object -ExpandProperty Name) -join ' || ' }
catch{ $win32_printer = $null} # | Printers
try {$imprivataRegEntry = Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\SSOProvider\ISXAgent} catch {$imprivataRegEntry = $null}
Write-Progress -Activity "Retrieving data from online computers" -Status $Env:COMPUTERNAME -PercentComplete 40
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Kiosk Type and TPM status" -PercentComplete 40
try {$kioskRegEntry = Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\SHSCustom} catch {$kioskRegEntry = $null}
try {$win32_tpm = Get-CimInstance -Namespace root\cimv2\security\microsofttpm -Class win32_tpm} catch{$win32_tpm = $null} # | TPM
<#
$gpoPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\FVE\MDOPBitLockerManagement"
$gpoValue = Get-ItemPropertyValue -Path $gpoPath -Name "KeyRecoveryServiceEndPoint"
2024-06-11 18:27:55 +00:00
Switch($GpoValue -eq "https://shsmbam1.int.samhealth.net/MBAMRecoveryAndHardwareService/CoreService.svc")
2024-06-11 18:27:55 +00:00
{
$true {$gpoStatus = "GPO Applied"}
$false {$gpoStatus = "GPO Not Applied (Check if system is member of group MBAM_Default on ADUC"}
Default {$gpoStatus = "Error...GPOTEST Line PCRemote Line 276"}
2024-06-11 18:27:55 +00:00
}
#>
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Citrix Version, CPU Type, and Parsing Network Data" -PercentComplete 50
$CitrixViewer = "C:\Program Files (X86)\Citrix\ICA Client\CDViewer.exe"
#$LastUser = Get-ChildItem -Path C:\Users -Directory -Force -Exclude Public,Default,'Default User','All Users' | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 3 # | Last Users
try {$CPU = (Get-CimInstance -ClassName Win32_processor ).Name } catch {$CPU = $null}
2024-06-11 18:27:55 +00:00
2024-08-02 19:03:04 +00:00
#MAC Address
$MAC = ($win32_networkadapterconfiguration | Where-Object {$_.IpEnabled -Match "True"} | Select-Object -Expand macaddress) -join ","
#IP
$ip = ($win32_networkadapterconfiguration | Where-Object {$_.IpEnabled -Match "True"} | Select-Object -Expand IPAddress |
# IPv4 address filter
Where-Object {$_ -match "^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$"}
) -join ","
<#
if($ip -is [array]){
$ip = $ip[0]
2024-06-11 18:27:55 +00:00
}
#>
2024-06-11 18:27:55 +00:00
#Adapter
$adapter = ($win32_networkadapterconfiguration | Where-Object {$_.IpEnabled -Match "True"} | Select-Object -Expand Description) -join " | "
<#
if($adapter -is [array]){
$adapter = $adapter[0]
2024-08-02 19:03:04 +00:00
}
#>
#UserName
$Username = $PCInfo.CSUserName
if($null -eq $Username){
$Username = (Invoke-Command -SessionOption (New-PSSessionOption -NoMachineProfile) -ScriptBlock {Get-Process Explorer -IncludeUsername | Where-Object { $_.Username -notlike "*SYSTEM" }} ).Username
if($null -ne $Username){
$Username = "$Username (RDP/Inactive)"
}
else{
$Username = '**None**'
}
}
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Parsing Last Users and Total RAM" -PercentComplete 60
#Collecting most recent users from the registry
$lastuser = @()
$profiles = Get-CimInstance -Class Win32_UserProfile
$profiles | Where-Object {$_.SID.length -gt 10} | Foreach-Object {
$sid = $_.SID
$prop = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$sid\"
if($prop.LocalProfileUnLoadTimeHigh -and $prop.LocalProfileUnLoadTimeLow){
$a = '{0:x}' -f $prop.LocalProfileUnLoadTimeHigh
$b = '{0:x}' -f $prop.LocalProfileUnLoadTimeLow
$dec = [bigint]::Parse("$a$b",'AllowHexSpecifier')
$time = w32tm /ntte $dec
$lastTime = [datetime]($time -split ' - ')[1]
}
else{
$lastTime = "Unknown"
}
2024-06-11 18:27:55 +00:00
$obj = [PSCustomObject]@{
Name = ($_.LocalPath -split 'C:\\Users\\')[1]
LocalPath = $_.LocalPath
LastLoginTime = $lastTime
}
$lastuser += $obj
2024-06-11 18:27:55 +00:00
}
$lastuser = $lastuser | Where-Object LastLoginTime -ne 'Unknown' | Sort-Object LastLoginTime -Descending
#Last User
if($lastUser.Count -gt 1){
2024-06-11 18:27:55 +00:00
$lastUser1 = ($lastUser[0].Name + " (" + $lastUser[0].LastLoginTime + ")")
$lastUser2 = ($lastUser[1].Name + " (" + $lastUser[1].LastLoginTime + ")")
$lastUser3 = ($lastUser[2].Name + " (" + $lastUser[2].LastLoginTime + ")")
$TotalLastUsers = "$lastUser1 $lastUser2 $lastUser3"
}else{
2024-06-11 18:27:55 +00:00
$TotalLastUsers = $lastUser.Name + " (" + $lastUser.LastLoginTime + ")"
}
#ComputerModel
$Model = $PCInfo.CsModel
#RAM
$totalram = $PCInfo.CsTotalPhysicalMemory
$totalram = [math]::Round(($totalram / 1GB))
$ram = "$totalram GB"
#Drive Type
$DriveType = $physicalDisk.MediaType
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Parsing Disk Usage and Computer Info" -PercentComplete 70
#Free Harddrive Space
$CompFreeSpace = @([math]::Round($win32_LogicalDisk.FreeSpace / 1gb,2),[math]::Round($win32_LogicalDisk.Size / 1gb,2))
$free = $compFreeSpace[0]
$max = $compfreeSpace[1]
$freespace = "$free GB / $max GB"
#Service Tag
#$serviceTag = $win32_bios.SerialNumber
$serviceTag = $PCInfo.BiosSeralNumber
#BIOS
#$biosVersion = $win32_bios.SMBIOSBIOSVersion
$biosVersion = $PCInfo.BiosName
#Last Reboot
$lastbootTime = $PCInfo.OsLastBootUpTime
#Asset Tag
$assetTag = $win32_SystemEnclosure.SMBiosAssetTag
#Bitlocker Status
$PercentageEncrypted = (($bitlocker | Select-String "Percentage Encrypted") -split ': ')[1]
2024-06-11 18:27:55 +00:00
[int]$IntPercentageEncrypted = $PercentageEncrypted.Substring(0,4)
$EncryptionStatus = $null
2024-06-11 18:27:55 +00:00
If($bitlocker -like '*error*')
{
$EncryptionStatus = 'BitLocker - Error - Please investigate'
}
Elseif($IntPercentageEncrypted -eq 100)
{
$EncryptionStatus = "BitLocker - Encrypted ($PercentageEncrypted)"
2024-06-11 18:27:55 +00:00
}
ElseIf($IntPercentageEncrypted -gt 1)
{
$EncryptionStatus = "BitLocker - Encrypting ($PercentageEncrypted)"
}
Else
{
$EncryptionStatus = "BitLocker - Decrypted ($PercentageEncrypted)"
}
#OS
$os = $PCInfo.OSName + " (" + $PCInfo.OSArchitecture + ")"
2024-06-11 18:27:55 +00:00
#OS Build
$osVer = $PCInfo.WindowsVersion
if($osVer -gt 2004){
$osVer = (Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion").DisplayVersion
}
$osBuild = $PCInfo.OSBuildNumber
$osBuild = "Vers $osVer | Build #$osBuild"
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Parsing Printers, Imprivata type, and TPM status" -PercentComplete 80
#Printers
$printers = $win32_printer# ($win32_printer | Where-Object {$_.PortName -ne 'PORTPROMPT:' -and $_.PortName -ne 'nul:' -and $_.PortName -ne 'SHRFAX:'} | Select-Object -ExpandProperty Name) -join ' || '
if(!$printers){
$printers = "No Local/Networked Printer (Check Printer Mappings)"
}
2024-06-11 18:27:55 +00:00
#Imprivata
$ImprivataType = $imprivataRegEntry | Select-Object -ExpandProperty Type
if(!$imprivataType){
$ImprivataType = "Not Installed"
}
else{
Switch($ImprivataType){
1 {
$ImprivataType = $imprivataRegEntry | Select-Object -ExpandProperty FUS_Enabled
Switch($ImprivataType){
0 {$ImprivataType = "SUD"}
1 {$ImprivataType = "MUD"}
}
}
2 {$ImprivataType = "Kiosk"}
Default {$ImprivataType = "Not Installed"}
}
}
$kioskRole = try {$kioskRegEntry | Select-Object -ExpandProperty KioskRole} catch{ $null }
if (!$kioskRole) { $kioskRole = "None"}
2024-06-11 18:27:55 +00:00
#TPM
if($win32_tpm){
$tpmVersion = " | Vers " + $win32_tpm.ManufacturerVersionFull20
2024-06-11 18:27:55 +00:00
$tpmStatus = "On"
if($win32_tpm.IsActivated_InitialValue){
$tpmStatus += ", Activated"
}
else{
$tpmStatus += ", Not Activated"
}
if($win32_tpm.IsEnabled_InitialValue){
$tpmStatus += ", Enabled"
}
else {
$tpmStatus += ", Disabled"
}
if($win32_tpm.IsOwned_InitialValue){
$tpmStatus += ", Owned"
}
else{
$tpmStatus += ", Not Owned"
}
$tpmStatus += $tpmVersion
}
else {
$tpmStatus = "Off"
}
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -Status "Parsing Citrix Version, and Chassis Type" -PercentComplete 90
#Citrix Version
if( !(Test-path $CitrixViewer)){
$CitrixVersion = "Not Installed"
}
else{
#Checks this default install path
$CitrixVersion = Get-Command $citrixViewer | select-object -ExpandProperty Version #Grabs Citrix version number
}
2024-06-11 18:27:55 +00:00
#Chassis Type
2024-06-11 18:27:55 +00:00
Switch -Wildcard($Model) {
"Optiplex*" {
Switch -Wildcard($CPU)
{
"Intel(R) Core(TM) i5-9500 CPU*" {$chassisType = "SFF"} #5070
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i5-6500 CPU*" {$chassisType = "SFF"} #7040
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i5-6500T*" {$chassisType = "Micro"} #7040
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i7-6700 CPU*" {$chassisType = "SFF"} #7040
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i7-6700T*" {$chassisType = "Micro"} #7040
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i5-10500T*" {$chassisType = "Micro"} #5080
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i5-9500T*" {$chassisType = "Micro"} #5070
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i5-8500 CPU*" {$chassisType = "SFF"} #5060
"Intel(R) Core(TM) i5-8500T*" {$chassisType = "Micro"} #5060
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i5-7500*" {$chassisType = "SFF"} #5050
"Intel(R) Core(TM) i5-4670 CPU*" {$chassisType = "SFF"} #9020
"Intel(R) Core(TM) i5-4590 CPU*" {$chassisType = "SFF"} #9020
"Intel(R) Core(TM) i5-4590T CPU*" {$chassisType = "Micro"} #9020M
"Intel(R) Core(TM) i5-4690 CPU*" {$chassisType = "SFF"} #9020
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i5-3550 CPU*" {$chassisType = "SFF"} #9010
2024-06-11 18:27:55 +00:00
"Intel(R) Core(TM) i5-2400 CPU*" {$chassisType = "SFF"} #990
2024-06-11 18:27:55 +00:00
Default {$chassisType = "Optiplex - Chassis Type - Unknown"}
}
}
"Latitude*" {
$chassisType = "Laptop"
}
"Precision*"{
$chassisType = "Laptop"
}
"M24*" {
$chassisType = "Anesthesia Cart"
}
"Medix*"{
$chassisType = "Anesthesia Cart"
}
Default {$chassisType = "Unknown Model/Chassis"}
}
$timeout = 10
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
}
$cmdbData = $Query.Value
$LocationConstructors = @(
"SHS_AssetLocality",
"ivnt_Location",
"SHS_Floor",
"SHS_Department",
"SHS_LocationDetails"
)
$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
}
}
$LocationData = $LocationData -join ' | '
Write-Progress -Activity "Retrieving data from $Env:COMPUTERNAME" -PercentComplete 100
#Output
# $i++ | ProgressBar $i $comp 'Generating Output' $NumberofComputers $PCID
$obj = New-Object -TypeName PSObject
$obj | Add-Member -MemberType NoteProperty -Name 'Hostname' -Value $Env:COMPUTERNAME
$obj | Add-Member -MemberType NoteProperty -Name 'Status' -Value "Online"
$obj | Add-Member -MemberType NoteProperty -Name 'Current User' -Value "$userName"
$obj | Add-Member -MemberType NoteProperty -Name 'Last User(s)' -Value "$TotalLastUsers"
$obj | Add-Member -MemberType NoteProperty -Name 'IP | MAC' -Value "$ip | $mac"
$obj | Add-Member -MemberType NoteProperty -Name 'Adapter' -Value "$adapter"
$obj | Add-Member -MemberType NoteProperty -Name 'Model' -Value "$Model ($chassisType)"
$obj | Add-Member -MemberType NoteProperty -Name 'OS' -Value "$os | $osBuild"
$obj | Add-Member -MemberType NoteProperty -Name 'BIOS Ver' -Value "$biosVersion"
$obj | Add-Member -MemberType NoteProperty -Name 'Encryption' -Value "$EncryptionStatus"
$obj | Add-Member -MemberType NoteProperty -Name 'Free Space' -Value "$freespace | $driveType"
$obj | Add-Member -MemberType NoteProperty -Name 'RAM' -Value "$ram"
$obj | Add-Member -MemberType NoteProperty -Name 'SSO Client' -Value "$imprivataType"
$obj | Add-Member -MemberType NoteProperty -Name 'Kiosk Role' -Value "$kioskRole"
$obj | Add-Member -MemberType NoteProperty -Name 'Citrix Ver' -Value "$citrixVersion"
$obj | Add-Member -MemberType NoteProperty -Name 'Asset Tag' -Value "$assetTag"
$obj | Add-Member -MemberType NoteProperty -Name 'Service Tag' -Value "$serviceTag"
$obj | Add-Member -MemberType NoteProperty -Name 'Last Reboot' -Value "$lastbootTime"
$obj | Add-Member -MemberType NoteProperty -Name 'TPM Status' -Value "$tpmStatus"
$obj | Add-Member -MemberType NoteProperty -Name 'Printers' -Value "$printers"
$obj | Add-Member -MemberType NoteProperty -Name 'CMDB Location' -Value "$LocationData"
if($cmdbData.SHS_IsException -eq 'True'){
Write-host "***NOTICE: $ENV:COMPUTERNAME is a Device Exception computer. Please check CMDB/Asset Mgmt prior to supporting this workstation. ***" -BackgroundColor Black -ForegroundColor Yellow
$obj | Add-Member -MemberType NoteProperty -Name 'DEL Owner' -Value $cmdbData.SHS_ExceptionContact
$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 "Retrieving data from $Env:COMPUTERNAME" -Completed
return $obj
}