Public/Reports/Get-CurrentDeviceStatus.ps1
function Get-CurrentDeviceStatus { <# .SYNOPSIS Gets the current device status of all devices of the desired type from one or more recording servers .DESCRIPTION Uses the RecorderStatusService2 client to call GetCurrentDeviceStatus and receive the current status of all devices of the desired type(s). Specify one or more types in the DeviceType parameter to receive status of more device types than cameras. .EXAMPLE PS C:\> Get-RecordingServer -Name 'My Recording Server' | Get-CurrentDeviceStatus -DeviceType All Gets the status of all devices of all device types from the Recording Server named 'My Recording Server'. .EXAMPLE PS C:\> Get-CurrentDeviceStatus -DeviceType Camera, Microphone Gets the status of all cameras and microphones from all recording servers. #> [CmdletBinding()] [OutputType([pscustomobject])] param ( # Specifies one or more Recording Server ID's to which the results will be limited. Omit this parameter if you want device status from all Recording Servers [Parameter(ValueFromPipelineByPropertyName)] [Alias('Id')] [guid[]] $RecordingServerId, # Specifies the type of devices to include in the results. By default only cameras will be included and you can expand this to include all device types [Parameter()] [ValidateSet('Camera', 'Microphone', 'Speaker', 'Metadata', 'Input event', 'Output', 'Event', 'Hardware', 'All')] [string[]] $DeviceType = 'Camera', # Specifies that the output should be provided in a complete hashtable instead of one pscustomobject value at a time [Parameter()] [switch] $AsHashTable, # Specifies the runspacepool to use. If no runspacepool is provided, one will be created. [Parameter()] [System.Management.Automation.Runspaces.RunspacePool] $RunspacePool ) process { if ($DeviceType -contains 'All') { $DeviceType = @('Camera', 'Microphone', 'Speaker', 'Metadata', 'Input event', 'Output', 'Event', 'Hardware') } $includedDeviceTypes = $DeviceType | Foreach-Object { [videoos.platform.kind]::$_ } $disposeRunspacePool = $true if ($PSBoundParameters.ContainsKey('RunspacePool')) { $disposeRunspacePool = $false } $pool = $RunspacePool if ($null -eq $pool) { Write-Verbose "Creating a runspace pool" $pool = [runspacefactory]::CreateRunspacePool(1, ([int]$env:NUMBER_OF_PROCESSORS + 1)) $pool.Open() } $scriptBlock = { param( [uri]$Uri, [guid[]]$DeviceIds ) try { $client = [VideoOS.Platform.SDK.Proxy.Status2.RecorderStatusService2]::new($Uri) $client.GetCurrentDeviceStatus((Get-Token), $deviceIds) } catch { throw "Unable to get current device status from $Uri" } } Write-Verbose 'Retrieving recording server information' $managementServer = [videoos.platform.configuration]::Instance.GetItems([videoos.platform.itemhierarchy]::SystemDefined) | Where-Object { $_.FQID.Kind -eq [videoos.platform.kind]::Server -and $_.FQID.ObjectId -eq (Get-ManagementServer).Id } $recorders = $managementServer.GetChildren() | Where-Object { $_.FQID.ServerId.ServerType -eq 'XPCORS' -and ($null -eq $RecordingServerId -or $_.FQID.ObjectId -in $RecordingServerId) } Write-Verbose "Retrieving video device statistics from $($recorders.Count) recording servers" try { $threads = New-Object System.Collections.Generic.List[pscustomobject] foreach ($recorder in $recorders) { Write-Verbose "Requesting device status from $($recorder.Name) at $($recorder.FQID.ServerId.Uri)" $folders = $recorder.GetChildren() | Where-Object { $_.FQID.Kind -in $includedDeviceTypes -and $_.FQID.FolderType -eq [videoos.platform.foldertype]::SystemDefined} $deviceIds = [guid[]]($folders | Foreach-Object { $children = $_.GetChildren() if ($null -ne $children -and $children.Count -gt 0) { $children.FQID.ObjectId } }) $ps = [powershell]::Create() $ps.RunspacePool = $pool $asyncResult = $ps.AddScript($scriptBlock).AddParameters(@{ Uri = $recorder.FQID.ServerId.Uri DeviceIds = $deviceIds }).BeginInvoke() $threads.Add([pscustomobject]@{ RecordingServerId = $recorder.FQID.ObjectId PowerShell = $ps Result = $asyncResult }) } if ($threads.Count -eq 0) { return } $hashTable = @{} $completedThreads = New-Object System.Collections.Generic.List[pscustomobject] while ($threads.Count -gt 0) { foreach ($thread in $threads) { if ($thread.Result.IsCompleted) { Write-Verbose "Receiving results from recording server with ID $($thread.RecordingServerId)" if ($AsHashTable) { $hashTable.$($thread.RecordingServerId.ToString()) = $null } else { $obj = @{ RecordingServerId = $thread.RecordingServerId.ToString() CurrentDeviceStatus = $null } } try { $result = $thread.PowerShell.EndInvoke($thread.Result) | ForEach-Object { Write-Output $_ } if ($AsHashTable) { $hashTable.$($thread.RecordingServerId.ToString()) = $result } else { $obj.CurrentDeviceStatus = $result } } catch { Write-Error $_ } finally { $thread.PowerShell.Dispose() $completedThreads.Add($thread) if (!$AsHashTable) { Write-Output ([pscustomobject]$obj) } } } } $completedThreads | Foreach-Object { [void]$threads.Remove($_)} $completedThreads.Clear() if ($threads.Count -eq 0) { break; } Start-Sleep -Milliseconds 250 } if ($AsHashTable) { Write-Output $hashTable } } finally { if ($threads.Count -gt 0) { Write-Warning "Stopping $($threads.Count) running PowerShell instances. This may take a minute. . ." foreach ($thread in $threads) { $thread.PowerShell.Dispose() } } if ($disposeRunspacePool) { Write-Verbose "Closing runspace pool in $($MyInvocation.MyCommand.Name)" $pool.Close() $pool.Dispose() } } } } |