Задача не столько нужная в работе, сколько использована мной для записи некоторых трюков powershell.
Допустим есть несколько серверов rdp, есть логин пользователя (usefree) и необходимость найти на каких серверах у него есть в данный момент сессия (активная или нет — не важно). Если логин другой — он передается в сценарий параметром.
Код сценария.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | param ($Login = "usefree") Import-Module ActiveDirectory $Amount = 0 $Servers = Get-ADComputer -Filter {OperatingSystem -like "*server*"} ForEach ($Server in $Servers) { $ServerName = $Server.Name $connection = Test-Connection $ServerName -Count 1 -ErrorAction SilentlyContinue if ($connection -ne $null){ if (Get-WmiObject win32_computersystem -ComputerName $ServerName -ErrorAction SilentlyContinue) { $queryResults = qwinsta /server:$ServerName ForEach ($queryResult in $queryResults) { if ($queryResult -match $Login){ $Matched += "$ServerName " $Amount++ } } } } } if ($Amount -gt 0){ Write-host "Servers where $Login Session found: $Matched" } else { Write-host "No $Login sessions found" } |
Перед поиском логина осуществляется проверка связи с сервером:
1 2 | $connection = Test-Connection $ServerName -Count 1 -ErrorAction SilentlyContinue if ($connection -ne $null){ |
и проверка запущенного на нем сервера RPC:
1 | if (Get-WmiObject win32_computersystem -ComputerName $ServerName -ErrorAction SilentlyContinue) { |