Manera más fácil de analizar ''usuario de consulta'' en PowerShell
parsing scripting (2)
Actualmente tengo la siguiente consulta en PowerShell:
query user /server:$server
Cuál devuelve la salida:
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
svc_chthost 2 Disc 1:05 8/16/2016 12:01 PM
myusername rdp-tcp 3 Active . 8/29/2016 11:29 AM
Actualmente, estoy usando @(query user /server:$server).Count - 1
como un valor para representar la cantidad de usuarios que @(query user /server:$server).Count - 1
sesión (no es bonita, lo sé). Sin embargo, ahora me gustaría obtener información como USERNAME
, ID
y LOGON TIME
para usar en otras partes de mi script.
Mi pregunta está rodeando una forma más fácil de analizar la información anterior, o una mejor solución para mi problema: Recuento y recopilación de información relacionada con los usuarios que han iniciado sesión.
He encontrado otras soluciones que parecen funcionar mejor, pero estoy seguro de que tiene que haber una manera más simple de lograr esta tarea:
$ComputerName | Foreach-object {
$Computer = $_
try
{
$processinfo = @(Get-WmiObject -class win32_process -ComputerName $Computer -EA "Stop")
if ($processinfo)
{
$processinfo | Foreach-Object {$_.GetOwner().User} |
Where-Object {$_ -ne "NETWORK SERVICE" -and $_ -ne "LOCAL SERVICE" -and $_ -ne "SYSTEM"} |
Sort-Object -Unique |
ForEach-Object { New-Object psobject -Property @{Computer=$Computer;LoggedOn=$_} } |
Select-Object Computer,LoggedOn
}#If
}
catch
{
}
¡Referencias impresionantes en los comentarios, y aún abierta a más respuestas para esta pregunta, ya que debería tener una solución más fácil!
foreach ($s in $servers) #For Each Server
{
foreach($ServerLine in @(query user /server:$s) -split "/n") #Each Server Line
{
#USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
$Parsed_Server = $ServerLine -split ''/s+''
$Parsed_Server[1] #USERNAME
$Parsed_Server[2] #SESSIONNAME
$Parsed_Server[3] #ID
$Parsed_Server[4] #STATE
$Parsed_Server[5] #IDLE TIME
$Parsed_Server[6] #LOGON TIME
}
}
Esta solución resuelve el problema por el momento, tipo de descuidado.
Para obtener más soluciones en profundidad con más funcionalidades, verifique los comentarios sobre la pregunta original :)
Agregué el código anterior para formatear correctamente y también considerar a los usuarios desconectados
$HaSH = @()
foreach($ServerLine in @(query user) -split "/n") {
$Report = "" | Select-Object UserName, Session, ID, State, IdleTime, LogonTime
$Parsed_Server = $ServerLine -split ''/s+''
if($Parsed_Server -like "USERNAME*") {
Continue
}
$Report.UserName = $Parsed_Server[1]
$Report.Session = $Parsed_Server[2]
$Report.ID = $Parsed_Server[3]
$Report.State = $Parsed_Server[4]
$Report.IdleTime = $Parsed_Server[5]
$Report.LogonTime = $Parsed_Server[6]+" " +$Parsed_Server[7]+" "+$Parsed_Server[8]
if($Parsed_Server[3] -eq "Disc") {
$Report.Session = "None"
$Report.ID = $Parsed_Server[2]
$Report.State = $Parsed_Server[3]
$Report.IdleTime = $Parsed_Server[4]
$Report.LogonTime = $Parsed_Server[5]+" " +$Parsed_Server[6]+" "+$Parsed_Server[7]
}
if($Parsed_Server -like ">*") {
$Parsed_Server=$Parsed_Server.Replace(">","")
$Report.UserName = $Parsed_Server[0]
$Report.Session = $Parsed_Server[1]
$Report.ID = $Parsed_Server[2]
$Report.State = $Parsed_Server[3]
$Report.IdleTime = $Parsed_Server[4]
$Report.LogonTime = $Parsed_Server[5]+" " +$Parsed_Server[6]+" "+$Parsed_Server[7]
}
$HaSH+=$Report
}