Let's say I have a description "WAP" in the interface and I want to monitor ONLY the active interfaces. Slightly confused by the key values. Is '2' supposed to be for active interfaces? I have a script in place but something still is broken:
<#
.SYNOPSIS
Adds only "Up" WAP interfaces to SolarWinds monitoring.
Keeps all currently monitored interfaces, regardless of status.
Dumps raw XML of discovered interfaces (real XML, not CLIXML).
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)][string]$User,
[Parameter(Mandatory = $true)][string]$Password,
[Parameter(Mandatory = $true)][string]$ExcelPath,
[string]$OrionHost = "localhost"
)
Import-Module SwisPowershell -ErrorAction Stop
Import-Module ImportExcel -ErrorAction Stop
$DumpPath = "C:\Temp\SWIS_Dumps"
if (-not (Test-Path $DumpPath)) {
New-Item -Path $DumpPath -ItemType Directory | Out-Null
}
Write-Host "Connecting to SWIS on $OrionHost ..."
$swis = Connect-Swis -Hostname $OrionHost -Username $User -Password $Password
$SwitchList = (Import-Excel $ExcelPath | Select-Object -ExpandProperty IP)
foreach ($ip in $SwitchList) {
Write-Host "`nProcessing node for IP: $ip"
$node = Get-SwisData $swis "SELECT NodeID, Caption FROM Orion.Nodes WHERE IPAddress = '$ip'"
if (-not $node) {
Write-Warning "Node not found for IP $ip"
continue
}
$nid = $node.NodeID
$caption = $node.Caption
Write-Host "Found node: $caption (NodeID: $nid)"
# Get existing monitored interfaces
$existingIfaces = @(Get-SwisData $swis "SELECT Caption FROM Orion.NPM.Interfaces WHERE NodeID=$nid" | ForEach-Object { $_.Caption })
# Schedule List Resources
$job = (Invoke-SwisVerb $swis Orion.Nodes ScheduleListResources @($nid)).'#text'
Write-Host "Scheduled List Resources job ID: $job"
$timeout = New-TimeSpan -Minutes 2
$sw = [Diagnostics.Stopwatch]::StartNew()
do {
Start-Sleep -Seconds 5
$status = (Invoke-SwisVerb $swis Orion.Nodes GetScheduledListResourcesStatus @($job, $nid)).'#text'
Write-Host "Job status: $status"
} while (($status -notin @('ReadyForImport', 'Completed')) -and ($sw.Elapsed -lt $timeout))
if ($status -notin @('ReadyForImport', 'Completed')) {
Write-Warning "Timed out waiting for node $caption"
continue
}
# Retrieve discovery results
$JobResults = Invoke-SwisVerb $swis Orion.Nodes GetListResourcesResult @($job, $nid)
# --- Fixed: save actual SWIS XML ---
$dumpFile = Join-Path $DumpPath ("{0}_ListResources.xml" -f ($caption -replace '[^a-zA-Z0-9\-_]', '_'))
try {
$xmlNode = $JobResults.DiscoveryResultExportItem
if ($xmlNode -and $xmlNode.OuterXml) {
$xmlNode.OuterXml | Set-Content -Path $dumpFile -Force
} else {
# fallback: serialize whole job if direct XML missing
$JobResults | ConvertTo-Json -Depth 10 | Out-File -FilePath ($dumpFile -replace '.xml$', '.json')
}
Write-Host "Saved real XML dump to $dumpFile"
} catch {
Write-Warning "Failed to export XML for $caption : $_"
}
Write-Host "`nEvaluating WAP interfaces on ${caption}:"
Write-Host "--------------------------------------------------------------"
$Interfaces = @($JobResults.DiscoveryResultExportItem.Children.DiscoveryResultExportItem |
Where-Object { $_.DisplayName.'#text' -match 'WAP' })
foreach ($iface in $Interfaces) {
$disp = $iface.DisplayName.'#text'
# Extract ifOperStatus correctly (SolarWinds uses Key/Value)
$statusVal = $null
foreach ($m in $iface.Metadata) {
if ($m.Key.'#text' -eq 'ifOperStatus') {
$statusVal = $m.Value.'#text'
break
}
}
$isUp = ($statusVal -eq '2')
if ($isUp) {
if ($existingIfaces -notcontains $disp) {
Write-Host "$disp --> Up (will be added)"
if ($iface.PSObject.Properties.Name -contains 'IsSelected') { $iface.IsSelected = 'true' }
foreach ($child in @($iface.Children.DiscoveryResultExportItem)) {
if ($child.PSObject.Properties.Name -contains 'IsSelected') { $child.IsSelected = 'true' }
}
} else {
Write-Host "$disp --> Up (already monitored)"
}
} else {
Write-Host "$disp --> Down (ignored)"
}
}
Write-Host "`nImporting newly selected WAP interfaces for ${caption} ..."
try {
$importResult = Invoke-SwisVerb $swis Orion.Nodes ImportSelectedListResourcesResult @($job, $nid, $JobResults)
Write-Host "SWIS result: $($importResult.'#text')"
} catch {
Write-Warning "Import failed for $caption : $_"
continue
}
Write-Host "Completed import for ${caption}"
}
Write-Host "`nAll nodes processed. XML dumps stored in $DumpPath"