Add local Windows Server inventory collection and validation; include core package
This commit is contained in:
56
powershell/Get-ServerInventory.ps1
Normal file
56
powershell/Get-ServerInventory.ps1
Normal file
@@ -0,0 +1,56 @@
|
||||
#requires -Version 5.1
|
||||
[CmdletBinding()]
|
||||
param([ValidateSet('all','system','roles','services','network','tasks','software','storage','shares','certificates')][string]$Section = 'all')
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
$WarningPreference = 'SilentlyContinue'
|
||||
$InformationPreference = 'SilentlyContinue'
|
||||
$env:PSModulePath = Join-Path $PSHOME 'Modules'
|
||||
[Console]::OutputEncoding = New-Object System.Text.UTF8Encoding($false)
|
||||
if ([Environment]::OSVersion.Platform -ne [PlatformID]::Win32NT) {
|
||||
[Console]::Error.WriteLine('This collector requires a local Windows Server execution host.')
|
||||
exit 2
|
||||
}
|
||||
. (Join-Path $PSScriptRoot 'Inventory.Common.ps1')
|
||||
foreach ($file in @('System','Roles','Services','Network','Tasks','Software','Storage','Certificates')) {
|
||||
. (Join-Path $PSScriptRoot ('Get-Server' + $file + '.ps1'))
|
||||
}
|
||||
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||
try {
|
||||
$principal = New-Object Security.Principal.WindowsPrincipal($identity)
|
||||
$script:SamsaraIsElevated = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
||||
} finally { $identity.Dispose() }
|
||||
$collectors = [ordered]@{
|
||||
system = { param($r) Get-SamsaraSystem $r }; roles = { param($r) Get-SamsaraRoles $r }
|
||||
services = { param($r) Get-SamsaraServices $r }; network = { param($r) Get-SamsaraNetwork $r }
|
||||
tasks = { param($r) Get-SamsaraTasks $r }; software = { param($r) Get-SamsaraSoftware $r }
|
||||
storage = { param($r) Get-SamsaraStorage $r }; shares = { param($r) Get-SamsaraShares $r }
|
||||
certificates = { param($r) Get-SamsaraCertificates $r }
|
||||
}
|
||||
if ($Section -ne 'all') {
|
||||
$result = Invoke-SamsaraSection $Section $collectors[$Section]
|
||||
ConvertTo-Json -InputObject $result -Depth 12 -Compress
|
||||
exit 0
|
||||
}
|
||||
# Direct PowerShell use emits the same complete inventory envelope as the Python backend.
|
||||
$inventory = [ordered]@{ roles=@(); services=@(); network=@(); tasks=@(); software=@(); storage=@(); certificates=@() }
|
||||
$checks = [ordered]@{}
|
||||
$collectedAt = Get-SamsaraTimestamp
|
||||
$server = $null
|
||||
foreach ($name in $collectors.Keys) {
|
||||
$result = Invoke-SamsaraSection $name $collectors[$name]
|
||||
$checks[$name] = ConvertTo-SamsaraCheck $result
|
||||
if ($name -eq 'system') {
|
||||
$server = $result.data
|
||||
if ([int]$server.product_type -notin @(2,3) -or $server.os_version -notin @('2016','2019','2022','2025')) {
|
||||
[Console]::Error.WriteLine('Unable to verify a supported Windows Server identity. No inventory emitted.')
|
||||
exit 2
|
||||
}
|
||||
} elseif ($name -eq 'shares') { $inventory.storage += @($result.data) }
|
||||
else { $inventory[$name] = @($result.data) }
|
||||
}
|
||||
ConvertTo-Json -InputObject ([ordered]@{ schema_version='1.0'; synthetic=$false; collected_at=$collectedAt
|
||||
server=$server; checks=$checks; inventory=$inventory }) -Depth 14 -Compress
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user