Script Powershell pour voir les utilisateurs connectés (domaine et machine) + statut (Actif, Inactif, absent) )

je cherche une commande simple pour voir les utilisateurs connectés sur le serveur. Je connais celui-ci :

Get-WmiObject -Class win32_computersystem

mais cela ne me fournira pas l'information dont j'ai besoin. Il retourne : domaine Manufactureer Modèle Nom de (nom de la Machine) PrimaryOwnerName Totalmémoire physique 151930920"

J'exécute Powershell 3.0 sur un serveur Windows 2012.

aussi

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

ne me donne pas les Réponses exactes dont j'ai besoin. Je serais ravi de voir que Eh bien le temps mort, ou s'ils sont actifs ou loin.

26
demandé sur RayofCommand 2014-04-22 16:32:46

6 réponses

à la recherche de cette même solution, j'ai trouvé ce dont j'avais besoin sous une autre question dans stackoverflow: Powershell-log-off-distance-session . La ligne ci-dessous renvoie une liste des utilisateurs connectés.

query user /server:$SERVER
72
répondu Hyon 2017-05-23 12:03:06

il n'y a pas de" simple commande " pour faire ça. Vous pouvez écrire une fonction, ou prendre votre choix de plusieurs qui sont disponibles en ligne dans divers dépôts de code. J'utilise ceci:

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
répondu mjolinor 2014-04-25 13:36:16

puisque nous sommes dans la zone de PowerShell, c'est très utile si nous pouvons rendre un objet de PowerShell approprié ...

j'aime personnellement cette méthode d'analyse, pour la terseness:

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

Note: cela ne tient pas compte des utilisateurs déconnectés ("disque"), mais fonctionne bien si vous voulez juste obtenir une liste rapide des utilisateurs et ne se soucient pas du reste de l'information. Je voulais juste une liste et ne se soucient pas si elles étaient actuellement déconnecté.

si vous vous souciez du reste des données, c'est juste un peu plus complexe:

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

je vais un peu plus loin et vous donne un objet très propre sur mon blog.

j'ai fini par en faire un module.

5
répondu VertigoRay 2018-07-22 06:49:35

peut-être que tu peux faire quelque chose avec

    get-process -includeusername
2
répondu js2010 2017-06-04 15:27:05

si vous voulez trouver interactivement les utilisateurs connectés, j'ai trouvé un bon tip ici: https://p0w3rsh3ll.wordpress.com/2012/02/03/get-logged-on-users / (Win32_ComputerSystem did not help me)

$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
répondu DarKalimHero 2017-06-22 09:55:26

Voici mon approche basée sur la Suggestion de DarKalimHero en sélectionnant seulement sur Explorer.procédés 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
répondu Matze 2018-03-07 09:14:57