Script de Powershell para ver los usuarios actualmente registrados ( dominio y máquina) + estado (activo, inactivo, ausente)


Estoy buscando un comando simple para ver a los usuarios registrados en el servidor. Conozco este:

Get-WmiObject -Class win32_computersystem

Pero esto no me proporcionará la información que necesito. Vuelve : dominio Manufactureer Modelo Nombre (Nombre de la máquina) PrimaryOwnerName Memoria física total

Corro Powershell 3.0 en un servidor Windows 2012.

También

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

No me da las respuestas exactas que necesito. Me encantaría ver también el tiempo de inactividad, o si están activos o ausentes.

Author: RayofCommand, 2014-04-22

6 answers

En busca de esta misma solución, encontré lo que necesitaba bajo una pregunta diferente en stackoverflow: Powershell-log-off-remote-session . La siguiente línea devolverá una lista de usuarios registrados.

query user /server:$SERVER
 72
Author: Hyon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:06

No hay un "comando simple" para hacer eso. Puede escribir una función, o elegir entre varias que están disponibles en línea en varios repositorios de código. Yo uso esto:

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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-25 13:36:16

Dado que estamos en el área de PowerShell, es extra útil si podemos devolver un objeto PowerShell adecuado ...

Personalmente me gusta este método de análisis, para la concisión:

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

Nota: esto no tiene en cuenta a los usuarios desconectados ("disco"), pero funciona bien si solo quieres obtener una lista rápida de usuarios y no te importa el resto de la información. Solo quería una lista y no me importaba si estaban desconectados.

Si te importa el resto de los datos es un poco más complejo:

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

Lo llevo un paso más allá y te doy un objeto muy limpio en mi blog.

Terminé convirtiendo esto en un módulo.

 5
Author: VertigoRay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-22 06:49:35

Tal vez puedas hacer algo con

    get-process -includeusername
 2
Author: js2010,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-04 15:27:05

Si quieres encontrar usuarios conectados interactivamente, he encontrado un gran consejo aquí: https://p0w3rsh3ll.wordpress.com/2012/02/03/get-logged-on-users / (Win32_ComputerSystem no me ayudó)

$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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-22 09:55:26

Aquí está mi Enfoque basado en la Sugerencia de DarKalimHero seleccionando solo en Explorer.procesos 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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-07 09:14:57