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.
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
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
}
}
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.
peut-être que tu peux faire quelque chose avec
get-process -includeusername
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))"
}
}
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
}