Я знаю об этих бесплатных инструментах, которые могут помочь:
TSListUsers
утилита командной строки для отображения списка подключенных и отключенных пользователей, имени хоста, IP-адреса и номера сеанса RDP на локальном или удаленном сервере терминалов Windows / сервере RDP.
Чтобы составить список пользователей, вам необходимо иметь следующие способности:
- NetBios доступ к серверу
- Разрешения, позволяющие запрашивать информацию о сеансе RDP (если вы можете войти в TS, вы должны иметь это по умолчанию)
- Службы терминалов / RDP должны работать на целевом хосте
Полезным, но более простым инструментом является psloggedon :
Для сеансов Terminal Server полезным инструментом будет бесплатный LazyTS (управление службами терминалов) для PowerShell GUI.
Чистое решение PowerShell предполагает, что вошедшие в систему пользователи используют оболочку рабочего стола Explorer (а не пользовательскую оболочку).
Намного проще подсчитать экземпляры процесса explorer.exe
и найти их владельцев, как в этом сценарии :
$explorerprocesses = @(Get-WmiObject -Query "Select * FROM Win32_Process WHERE Name='explorer.exe'" -ErrorAction SilentlyContinue)
if ($explorerprocesses.Count -eq 0)
{
"No explorer process found / Nobody interactively logged on"
} else {
foreach ($i in $explorerprocesses)
{
$Username = $i.GetOwner().User
$Domain = $i.GetOwner().Domain
$Domain + "\" + $Username + " logged on since: " + ($i.ConvertToDateTime($i.CreationDate))
}
}
Более простой подход с использованием класса Win32_LogonSession
также работает, но имеет тенденцию давать больше результатов, чем ожидалось:
function get-logedonuser {
param (
[string]$computername = $env:COMPUTERNAME
)
Get-WmiObject -Class Win32_LogonSession -ComputerName $computername |
foreach {
$data = $_
$id = $data.__RELPATH -replace """", "'"
$q = "ASSOCIATORS OF {$id} WHERE ResultClass = Win32_Account"
Get-WmiObject -ComputerName $computername -Query $q |
select @{N="User";E={$($_.Caption)}},
@{N="LogonTime";E={$data.ConvertToDateTime($data.StartTime)}}
}
}