Powershell obtém um valor de 'query user' e não os cabeçalhos etc

1

Tarefa, obtenha o ID do comando do usuário de consulta, Estou tentando obter o valor de ID do comando 'query user',

Example:PS>  query user

 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME

>administrator         rdp-tcp#0           3  Active          .  04/25/2013 08:43

Estou tentando usar o psexec e anexar à sessão.

psexec \\pc -i sessionid somecommand

como eu poderia obter o ID e apenas o ID da consulta acima? isso é o que eu tentei até agora, entre outras coisas ...

PS>  query user |Select-Object $_.ID

USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME

>administrator         rdp-tcp#0           3  Active          .  04/25/2013 08:43

Eu acho que isso é fácil, mas aparentemente estou tendo um peido no cérebro, idealmente eu gosto de fazer isso:

$IDValue = query user | Get_the_ID_somehow

psexec \\pc -i $IDValue somecommand..

obrigado antecipadamente.

    
por user219872 25.04.2013 / 20:35

7 respostas

3

Como "usuário de consulta" não é um objeto, você não pode usá-lo como um objeto no powershell, a menos que você crie um PSObject personalizado, então

$IDValue = query user | Select-Object ID
will not work.

Eu usaria algo assim:

$users = query user ;
$IDs = @() ;

for ($i=1; $i -lt $users.Count;$i++) {
  # using regex to find the IDs
  $temp = [string]($users[$i] | Select-String -pattern "\s\d+\s").Matches ;
  $temp = $temp.Trim() ;
  $IDs += $temp ;
}
    
por 16.01.2014 / 02:28
1

Aqui está uma função de invólucro do PowerShell para 'usuário de consulta' / 'quser'. Ele analisa a saída de texto e fornece a você objetos reais do PowerShell que você pode consultar para os atributos individuais nos quais está interessado, como o ID da sessão.

Então você pode fazer coisas como:

$IDValue = Get-LoggedInUser -ComputerName server1 | where { $_.username -eq 'administrator' } | select-object -ExpandProperty id

Aqui está o código da função:

function Get-LoggedInUser
{
<#
    .SYNOPSIS
        Shows all the users currently logged in

    .DESCRIPTION
        Shows the users currently logged into the specified computernames

    .PARAMETER ComputerName
        One or more computernames

    .EXAMPLE
        PS C:\> Get-LoggedInUser
        Shows the users logged into the local system

    .EXAMPLE
        PS C:\> Get-LoggedInUser -ComputerName server1,server2,server3
        Shows the users logged into server1, server2, and server3

    .EXAMPLE
        PS C:\> Get-LoggedInUser  | where idletime -gt "1.0:0" | ft
        Get the users who have been idle for more than 1 day.  Format the output
        as a table.

        Note the "1.0:0" string - it must be either a system.timespan datatype or
        a string that can by converted to system.timespan.  Examples:
            days.hours:minutes
            hours:minutes
#>

    [CmdletBinding()]
    param
    (
        [ValidateNotNullOrEmpty()]
        [String[]]$ComputerName = $env:COMPUTERNAME
    )

    $out = @()

    ForEach ($computer in $ComputerName)
    {
        try { if (-not (Test-Connection -ComputerName $computer -Quiet -Count 1 -ErrorAction Stop)) { Write-Warning "Can't connect to $computer"; continue } }
        catch { Write-Warning "Can't test connect to $computer"; continue }

        $quserOut = quser.exe /SERVER:$computer 2>&1
        if ($quserOut -match "No user exists")
        { Write-Warning "No users logged in to $computer";  continue }

        $users = $quserOut -replace '\s{2,}', ',' |
        ConvertFrom-CSV -Header 'username', 'sessionname', 'id', 'state', 'idleTime', 'logonTime' |
        Add-Member -MemberType NoteProperty -Name ComputerName -Value $computer -PassThru

        $users = $users[1..$users.count]

        for ($i = 0; $i -lt $users.count; $i++)
        {
            if ($users[$i].sessionname -match '^\d+$')
            {
                $users[$i].logonTime = $users[$i].idleTime
                $users[$i].idleTime = $users[$i].STATE
                $users[$i].STATE = $users[$i].ID
                $users[$i].ID = $users[$i].SESSIONNAME
                $users[$i].SESSIONNAME = $null
            }

            # cast the correct datatypes
            $users[$i].ID = [int]$users[$i].ID

            $idleString = $users[$i].idleTime
            if ($idleString -eq '.') { $users[$i].idleTime = 0 }

            # if it's just a number by itself, insert a '0:' in front of it. Otherwise [timespan] cast will interpret the value as days rather than minutes
            if ($idleString -match '^\d+$')
            { $users[$i].idleTime = "0:$($users[$i].idleTime)" }

            # if it has a '+', change the '+' to a colon and add ':0' to the end
            if ($idleString -match "\+")
            {
                $newIdleString = $idleString -replace "\+", ":"
                $newIdleString = $newIdleString + ':0'
                $users[$i].idleTime = $newIdleString
            }

            $users[$i].idleTime = [timespan]$users[$i].idleTime
            $users[$i].logonTime = [datetime]$users[$i].logonTime
        }
        $users = $users | Sort-Object -Property idleTime
        $out += $users
    }
    Write-Output $out
}
    
por 22.09.2016 / 01:15
0
$userlock = Read-Host "Enter user"
$serverlock = Read-Host "Enter server"
$quserlock = quser /server $serverlock | Select-String -CaseSensitive $userlock
$quserlock
$quserlock1 = ($quserlock -split ' +') | Select-String -NotMatch "rdp-tcp"
$quserlock2 = ($quserlock1 -split ' +') | Select-String -NotMatch $userlock
$quserlock3 = $quserlock2[1]
$quserlock3
logoff $quserlock3.Line /server $serverlock
quser /server $serverlock
    
por 27.12.2016 / 09:27
0

Eu precisava do mesmo hoje, então é assim que resolvi:

function Get-TSSessions {
    param(
        $ComputerName = "localhost"
    )

    query user /server:$ComputerName |
    #Parse output
    ForEach-Object {
        # trim spaces at beginning and end
        $_ = $_.trim() 
        # insert , at specific places for ConvertFrom-CSV command
        $_ = $_.insert(22,",").insert(42,",").insert(47,",").insert(56,",").insert(68,",")
        # Remove every space two or more spaces
        $_ = $_ -replace "\s\s+",""
        # for debug purposes, comment out above row and uncomment row below
        #$_ = $_ -replace "\s","_"

        # output to pipe
        $_

    } |
    #Convert to objects
    ConvertFrom-Csv
}

Se você executar agora o Get-TSSessions, ele retornará uma matriz de objetos para cada usuário que o Powershell entender.

Veja um exemplo que mostra quais usuários desconectados estão executando o chrome.exe:

foreach ($user in GET-TSSessions)
{

    if($user.state -ne "Active")
    {   #User is not active
        $user
        tasklist /FI '"USERNAME eq '$user.USERNAME'"' /FI "IMAGENAME eq chrome.exe"
    }
    else
    {
        "User "+$user.USERNAME+" is currently active."
    }

}
    
por 25.10.2018 / 12:10
0

se você tiver o PowerShell 4.0+, poderá executar Get-RDUserSession no ConnectionBroker ( O PowerShell deve ser iniciado como Admin):

Get-RDUserSession | Select-Object UnifiedSessionID

use Get-RDUserSession | Format-List * para ver todas as propriedades que você pode selecionar

Portanto, não há necessidade de uma função personalizada

    
por 25.10.2018 / 14:27
-1

Eu acredito que você esteja procurando por $IDValue = query user | Select-Object ID

    
por 27.04.2013 / 15:18
-1

A função Get-LoggedInUser deve usar ParseExact() para corrigir Error: "String não foi reconhecida como um DateTime válido."

$users[$i].logonTime = [datetime]::ParseExact($users[$i].logonTime, "dd/MM/yyyy HH:mm", $null)
    
por 24.01.2017 / 13:44

Tags