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.
À 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
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
}
}
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.
Peut-être que vous pouvez faire quelque chose avec
get-process -includeusername
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
}
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))"
}
}