web-dev-qa-db-fra.com

Script Powershell pour voir les utilisateurs actuellement 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 les informations dont j'ai besoin . Il retourne: domainManufactureerModelNom (Nom de l'ordinateur) PrimaryOwnerName TotalPhysicalMemory

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

Également 

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

ne me donne pas les réponses exactes dont j'ai besoin ... Je voudrais aussi voir le temps d'inactivité, si elles sont actives ou en déplacement.

27
RayofCommand

À la recherche de cette même solution, j'ai trouvé ce qu'il me fallait sous une question différente dans stackoverflow: Powershell-log-off-remote-session . La ligne ci-dessous renverra une liste des utilisateurs connectés.

query user /server:$SERVER
78
Hyon

Il n'y a pas de "simple commande" pour faire ça. Vous pouvez écrire une fonction ou choisir plusieurs fonctions disponibles en ligne dans différents référentiels 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
}

}
19
mjolinor

Puisque nous sommes dans la zone PowerShell, il est particulièrement utile de pouvoir renvoyer un objet PowerShell approprié ...

Personnellement, j'aime bien cette méthode d'analyse, pour la concision:

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

Remarque: ceci ne représente pas les utilisateurs déconnectés ("disc"), mais fonctionne bien si vous voulez juste obtenir une liste rapide des utilisateurs et ne vous souciez pas du reste des informations. je voulais juste une liste et je ne me souciais pas de savoir s'ils étaient actuellement déconnectés.

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

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

8
VertigoRay

Peut-être que vous pouvez faire quelque chose avec 

    get-process -includeusername
2
js2010

Voici mon approche basée sur la suggestion de DarKalimHero en sélectionnant uniquement les processus Explorer.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
Matze

Si vous voulez trouver des utilisateurs connectés de manière interactive, j'ai trouvé un bon conseil ici: https://p0w3rsh3ll.wordpress.com/2012/02/03/get-logged-on-users/ (Win32_ComputerSystem n'a pas aidé moi)

$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
DarKalimHero