Скрипт Powershell для просмотра в настоящее время зарегистрированных пользователей (домен и машина) + статус (активный, простой, прочь)

Я ищу простую команду для входа в систему на сервере. Я знаю это:

Get-WmiObject -Class win32_computersystem 

но это не даст мне информацию, в которой я нуждаюсь. Он возвращает: имя модели производителя (имя машины) PrimaryOwnerName TotalPhysicalMemory

Я запускаю Powershell 3.0 на сервере Windows 2012.

Также

 Get-WmiObject Win32_LoggedOnUser -ComputerName $Computer | Select Antecedent -Unique 

не дает мне точных ответов. Мне также хотелось бы видеть время простоя, или если они активны или прочь.

    В поисках этого же решения я нашел то, что мне нужно, по другому вопросу в stackoverflow: Powershell-log-off-remote-session . Следующая строка возвращает список зарегистрированных пользователей.

     query user /server:$SERVER 

    Для этого нет «простой команды». Вы можете написать функцию или выбрать свой выбор из нескольких доступных в Интернете в различных хранилищах кода. Я использую это:

     function get-loggedonuser ($computername){ #mjolinor 3/17/10 $regexa = '.+Domain="(.+)",Name="(.+)"$' $regexd = '.+LogonId="(\d+)"$' $logontype = @{ "0"="Local System" "2"="Interactive" #(Local logon) "3"="Network" # (Remote logon) "4"="Batch" # (Scheduled task) "5"="Service" # (Service account logon) "7"="Unlock" #(Screen saver) "8"="NetworkCleartext" # (Cleartext network logon) "9"="NewCredentials" #(RunAs using alternate credentials) "10"="RemoteInteractive" #(RDP\TS\RemoteAssistance) "11"="CachedInteractive" #(Local w\cached credentials) } $logon_sessions = @(gwmi win32_logonsession -ComputerName $computername) $logon_users = @(gwmi win32_loggedonuser -ComputerName $computername) $session_user = @{} $logon_users |% { $_.antecedent -match $regexa > $nul $username = $matches[1] + "\" + $matches[2] $_.dependent -match $regexd > $nul $session = $matches[1] $session_user[$session] += $username } $logon_sessions |%{ $starttime = [management.managementdatetimeconverter]::todatetime($_.starttime) $loggedonuser = New-Object -TypeName psobject $loggedonuser | Add-Member -MemberType NoteProperty -Name "Session" -Value $_.logonid $loggedonuser | Add-Member -MemberType NoteProperty -Name "User" -Value $session_user[$_.logonid] $loggedonuser | Add-Member -MemberType NoteProperty -Name "Type" -Value $logontype[$_.logontype.tostring()] $loggedonuser | Add-Member -MemberType NoteProperty -Name "Auth" -Value $_.authenticationpackage $loggedonuser | Add-Member -MemberType NoteProperty -Name "StartTime" -Value $starttime $loggedonuser } } 

    Поскольку мы находимся в области PowerShell, это очень полезно, если мы можем вернуть правильный объект PowerShell …

    Мне лично нравится этот метод parsingа, для терпения:

     ((quser) -replace '^>', '') -replace '\s{2,}', ',' | ConvertFrom-Csv 

    Примечание. Это не относится к отключенным («дисковым») пользователям, но работает хорошо, если вы просто хотите получить быстрый список пользователей и не заботитесь о остальной информации. Мне просто нужен список, и мне было все равно, были ли они в настоящее время отключены.

    Если вы заботитесь о остальной части данных, это немного сложнее:

     (((quser) -replace '^>', '') -replace '\s{2,}', ',').Trim() | ForEach-Object { if ($_.Split(',').Count -eq 5) { Write-Output ($_ -replace '(^[^,]+)', '$1,') } else { Write-Output $_ } } | ConvertFrom-Csv 

    Я делаю шаг дальше и даю вам очень чистый объект в своем блоге.

    Я превратил это в модуль.

    Может быть, вы можете сделать что-то с

      get-process -includeusername 

    Если вы хотите интерактивно регистрироваться на пользователях, я нашел замечательный совет: https://p0w3rsh3ll.wordpress.com/2012/02/03/get-logged-on-users/ (Win32_ComputerSystem мне не помог)

     $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 Write-Host "$Domain\$Username logged on since: $($i.ConvertToDateTime($i.CreationDate))" } } 

    Вот мой подход на основе предложения DarKalimHero, выбрав только процессы Explorer.exe

     Function Get-RdpSessions { param( [string]$computername ) $processinfo = Get-WmiObject -Query "select * from win32_process where name='explorer.exe'" -ComputerName $computername $processinfo | ForEach-Object { $_.GetOwner().User } | Sort-Object -Unique | ForEach-Object { New-Object psobject -Property @{Computer=$computername;LoggedOn=$_} } | Select-Object Computer,LoggedOn } 
    Давайте будем гением компьютера.