[PowerShell] Récupération de la liste des processus utilisateurs via WMI sur un serveur TSE avec PowerShell
Le service TSE de Microsoft n’implémente pas de classe WMI propre à la gestion des processus des utilisateurs distants. Des classes WMI propres à la gestion de Terminal Server existent, mais la gestion des processus reste basique.
Pour rappel, voici les classes WMI existantes pour TSE chez Microsoft. Toutes ces classes sont accessibles dans l’espace de noms ‘CIMV2’:
| Win32_TerminalService | Win32_TSNetworkAdapterListSetting |
| Win32_Terminal | Win32_TSPermissionsSetting |
| Win32_TSGeneralSetting | Win32_TSAccount |
| Win32_TSLogonSetting | Win32_TSSessionSetting |
| Win32_TSEnvironmentSetting | Win32_TSRemoteControlSetting |
| Win32_TSClientSetting | Win32_TSNetworkAdapterSetting |
| Win32_TSNetworkAdapterListSetting | Win32_TSPermissionsSetting |
| Win32_TSAccount | |
Vous pouvez retrouver plus de détails sur ces classes WMI sur le site Technet de MS.
La finalité du script ci-dessous est de pouvoir associer un utilisateur avec les processus qui s’exécute dans son contexte de sécurité. Pour cela WMI offre une classe permettant de récupérer la liste des processus système: WIN32_Process
WIN32_Process contient quelques méthodes permettant d’associer un processus à un utilisateur ou plus exactement au contexte d’exécution de celui-ci. La méthode utilisé pour cela se nomme GetOwner().
Le but est donc de récupérer les processus en cours d’exécution sur le serveur TSE et d’associer un nom d’utilisateur à celui-ci. Le tout insérer dans un classeur Excel afin de pouvoir utiliser les filtres sur les colonnes.
# Create Excel Workbook
$excel = New-Object -comobject Excel.Application
$excel.Visible = $True
$workbook = $excel.Workbooks.Add()
#Create Excel Sheet in Workbook
$sheet = $workbook.Worksheets.Item(1)
$sheet.Name = "Process List"
$sheet = $workbook.WorkSheets.Item("Process List")
# Define start position and others parameters
$x = 2
$lineStyle = "microsoft.office.interop.excel.XlLineStyle" -as [type]
$colorIndex = "microsoft.office.interop.excel.XlColorIndex" -as [type]
For($ba = 1 ; $ba -le 2 ; $ba++)
{
$sheet.cells.item(1,$ba).font.bold = $true
$sheet.cells.item(1,$ba).borders.LineStyle = $lineStyle::xlDashDot
$sheet.cells.item(1,$ba).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic
}
$sheet.cells.item(1,1) = "Processus"
$sheet.cells.item(1,2) = "User"
# Use WMI Class WIN32_Process with PowerShell
$MyWMIClassGet = gwmi Win32_Process
foreach ($unProc in $MyWMIClassGet)
{
# If Domain Name of context User is Null - Is System account
if (!$UnProc.GetOwner().Domain)
{
$sheet.cells.item($x, 1) = $UnProc.Name
$x++
}
else
{
#Retrieve User Name for others Process
$sheet.cells.item($x, 1) = $UnProc.Name
$sheet.cells.item($x,2) = $UnProc.GetOwner().User
$x++
}
}
$range = $sheet.usedRange
$range.Interior.ColorIndex = 19
$range.Font.ColorIndex = 11
$range.EntireColumn.AutoFit() | out-null
Voila le résultat du fichier Excel généré:
