Programa Powershell para ver os utilizadores registados de momento (domínio e máquina) + estado (activo, inactivo, ausente)

Estou à procura de um comando simples para ver os utilizadores registados no servidor. Conheço esta:

Get-WmiObject -Class win32_computersystem
Mas isto não me dará a informação de que preciso. Volta. : dominio Fabricante Modelo Nome (Nome da máquina) Nome do utilizador primário TotalPhysicalMemory

Executei o Powershell 3.0 num servidor do Windows 2012.

Também

Get-WmiObject Win32_LoggedOnUser -ComputerName $Computer | Select Antecedent -Unique
Não me dá as respostas exactas de que preciso. Gostaria de ver também o tempo ocioso, ou se eles estão ativos ou longe.

Author: RayofCommand, 2014-04-22

6 answers

Em busca desta mesma solução, encontrei o que precisava sob uma pergunta diferente no stackoverflow.: Powershell-log-off-remote-session . A linha abaixo retornará uma lista de usuários conectados.
query user /server:$SERVER
 72
Author: Hyon, 2017-05-23 12:03:06
Não há nenhum" comando simples " para fazer isso. Você pode escrever uma função, ou tomar a sua escolha de vários que estão disponíveis on-line em vários repositórios de código. Eu uso isto:
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
}

}
 17
Author: mjolinor, 2014-04-25 13:36:16
Uma vez que estamos na área PowerShell, é muito útil se pudermos devolver um objeto PowerShell adequado ... Pessoalmente, gosto deste método de análise, pela ternura.
((quser) -replace '^>', '') -replace '\s{2,}', ',' | ConvertFrom-Csv

Nota: isto não conta para usuários desconectados ("disco"), mas funciona bem se você só quer obter uma lista rápida de usuários e não se importa com o resto da informação. Só queria uma lista e não queria saber se estavam desligados.

Se te importas quanto ao resto dos dados, é um pouco mais complexo.

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

Vou um passo mais longe e dou-lhe um objeto muito limpo no meu blog.

Acabei por transformar isto num módulo.

 5
Author: VertigoRay, 2018-07-22 06:49:35
Talvez possas fazer alguma coisa com o
    get-process -includeusername
 2
Author: js2010, 2017-06-04 15:27:05

Se você quiser encontrar usuários conectados interativamente, eu encontrei uma grande dica aqui: https://p0w3rsh3ll.wordpress.com/2012/02/03/get-logged-on-users / (o Win32_ComputerSystem não me ajudou)

$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))"
    }
}
 1
Author: DarKalimHero, 2017-06-22 09:55:26
Aqui está a minha abordagem baseada na sugestão do DarKalimHero, seleccionando apenas o Explorer.processos 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
}
 1
Author: Matze, 2018-03-07 09:14:57