Dans cet article, nous verrons comment utiliser Powershell pour récuperer la liste des services utilisant un compte spécifique. Les quelques lignes de code qui vous seront expliquées ont été utilisées dans un script plus grand permettant de récuperer la liste des services, tâches planifiées et connecteurs ODBC utilisant un compte spécifique.

Problématique

Tout utilisateur de Powershell commence par utiliser cet outil notamment pour le contrôle de processus, de services, ou de fichier. Les commandes Get-Process, Get-Service et Get-item / Get-Childitem sont parmi les toutes premières qu'un utilisateur novice va découvrir, et leur utilité est évidente pour le débutant comme pour l'expert de Powershell. Cependant, ces commandes, aussi pratiques soient-elles, sont malheureusement "tronquées" de certaines informations utiles.

Prenons l'exemple d'un service Windows. Un service Windows possède (entre autres) :

  • Un nom
  • Une description
  • Un type de démarrage
  • Un status
  • Un nom d'utilisateur.

Observons maintenant quelles informations nous pouvons récupérer parmi cette liste que je vous ai fourni, en utilisant Powershell. Par exemple, le service Themes, qui gère l'apparence générale de la session Windows.

theme1

En appelant la variable dans lequel nous avons enregistré le service, nous voyons son status, son nom, et le nom d'affichage.

p

Il nous manque toujours quelques informations cependant. En allant chercher les méthodes et propriétés (à l'aide de Get-Member), nous retrouvons plus d'informations... mais cependant, toujours pas de nom d'utilisateur.

theme3

Et la raison à cela est assez simple et en même temps assez déroutante : Le nom d'utilisateur qui lance le service ne peut PAS être trouvé via Get-Service. Je ne comprends toujours pas à l'heure qu'il est pourquoi cette information n'est pas remontée par la commande Get-Service , alors qu'elle est aisément trouvable depuis une autre commande, que je vais vous montrer.

Comment faire?

Comme un certain nombre de commandes, Get-Service n'est rien de plus que l'adaptation d'une autre commande utilisant ici WMI et la classe Win32_Service. Nous allons donc rechercher à l'aide de WMI le service Thèmes à l'aide d'un filtre, puis nous verrons ce que nous pouvons en tirer.

Observez d'abord la syntaxe de la commande de filtre, vous verrez qu'elle diffère de ce que Powershell propose d'habitude.

$themeswmi = Get-WmiObject Win32_service -filter 'NAME = "Themes"'

Pourquoi 'NAME = "Themes"' et non pas l'habituel 'NAME -eq "Themes"' ?

Tout simplement parce que les filtres de Get-Wmiobject n'utilisent pas Powershell mais un autre langage, syntaxé différemment, le WQL (Wmi Query Language). Je vous invite à vous rendre sur cette page afin d'en savoir plus sur la manière de faire des requêtes en WQL. Maintenant, regardons le résultat d'un get-member sur notre variable issue d'une requête WMI.

theme5

Nous y trouvons une propriété nommée "Startname", qui contient le nom de l'utilisateur lançant le service.

theme6

Ainsi, d'une simple commande, il nous est facile d'obtenir l'intégralité des services utilisant un compte précis. Il est a noter également qu'il est plus pratique d'utiliser le filtre sur la requête WMI plutot que de faire un Where-Object sur le contenu de la variable renvoyée, car le paramètre -filter de Get-Wmiobject est BEAUCOUP PLUS RAPIDE que le Where-Object, pour la simple et bonne raison que Where-object va filtrer l'intégralité du resultat du Get-Wmiobject (ce qui nécessite donc que Get-Wmiobject récolte l'intégralité des résultats), alors que le paramètre -filter va ne selectionner qu'une partie des objets correspondants au filtre.

$servicesadmin = Get-WmiObject Win32_Service -filter 'STARTNAME LIKE "%administrateur%"' -computername nom_du_serveur

Ajouter un commentaire

Article précédent Article suivant