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.
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
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
}
}
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.
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
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))"
}
}
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
}
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