Qu'est-ce que Windows PowerShell et que mange-t-il? Partie 5: Accès aux objets externes



Les systèmes d'exploitation Windows prennent en charge diverses infrastructures d'objets. Vous pouvez utiliser des interfaces de programmation d'applications (API) pour y accéder, mais le développement d'applications à part entière n'est pas toujours justifié. PowerShell possède des applets de commande spéciales qui vous permettent d'accéder aux objets .NET, COM, WMI (CIM) et ADSI de manière interactive. Dans la quatrième partie de la série, nous avons appris les bases en mettant l'accent sur les classes .NET Core, et maintenant nous voulons approfondir le sujet et comprendre les fonctionnalités de l'interaction de PowerShell avec des objets externes.

Table des matières:


Travailler avec JSON, XML et CSV
Travailler avec WMI et CIM
Travailler avec des objets COM
Travailler avec le service d'annuaire ADSI
Formater la sortie

Travailler avec JSON, XML et CSV


Dans les scripts PowerShell, vous devez souvent analyser les données JSON, XML et CSV. Habituellement, ce besoin survient lorsque vous travaillez avec des services Internet ou avec des fichiers de configuration. Certains administrateurs tentent d'analyser les données à l'aide d'expressions régulières, mais il n'est pas nécessaire de faire de tels sacrifices: PowerShell dispose en outre d'applets de commande spéciales pour la conversion dans les deux sens.



Le format JSON vous permet de décrire une variété d'objets et, en substance, est une table de hachage qui peut être imbriquée. La conversion d'un objet JSON en objet .NET en conséquence à l'aide de PowerShell est facile. Étant donné que les services Internet donnent généralement une très longue ligne au lieu d'un fichier magnifiquement formaté, cette conversion peut également être utile pour travailler en mode interactif. Dans l'exemple ci-dessous, nous avons utilisé une variable de texte multiligne pour décrire l'objet JSON:

$user = @"
{
   "firstName": "Ivan",
   "lastName": "Danko",
   "address": {
       "streetAddress": "Kremlin",
       "city": "Moscow"
   },
   "phoneNumbers": [
       "+7 495 1234567",
       "+7 499 1234567"
   ]
}
"@ | ConvertFrom-Json



Le problème inverse est résolu de manière similaire:

$file = Get-ChildItem C:\Windows\System32\notepad.exe
$file.VersionInfo | ConvertTo-Json



La chaîne de format JSON résultante est facile à envoyer à une autre application sur le réseau. Il peut s'agir, par exemple, d'un service RESTful. Le travail avec les applets de commande ConvertFrom-Csv, ConvertTo-Csv et ConvertTo-Xml est construit de la même manière, nous proposons aux lecteurs de l'étudier eux-mêmes.

Pour travailler avec XML et CSV, nous aurons besoin d'autres applets de commande: à l'



aide de ces outils, vous devez comprendre que la conversion d'un objet binaire au format texte enregistre uniquement la valeur de ses propriétés, mais pas les méthodes. La conversion de données JSON, XML ou CSV en un objet .NET à l'aide de PowerShell n'est possible que si elle est valide.

Travailler avec WMI et CIM


Windows Management Instrumentation (WMI) est une implémentation développée par Microsoft et adaptée à Windows de la norme WBEM (Web-Based Enterprise Management). Il est basé sur l'idée de créer une solution universelle pour surveiller l'environnement d'information distribué d'une entreprise et gérer ses composants. La structure de données WBEM, quant à elle, est basée sur le modèle commun d'information (CIM), qui met en œuvre une approche orientée objet de la représentation des systèmes informatiques. Le développement et la prise en charge de WMI dans Windows ont été interrompus; Microsoft recommande d'utiliser un mécanisme similaire pour la gestion de l'infrastructure - les objets CIM. Pour travailler avec eux, des applets de commande spéciales sont apparues dans PowerShell 3.0, que nous considérerons en parallèle avec leurs homologues WMI. Si le code contient des appels d'applet de commande pour travailler avec WMI, il doit être réécrit si possible.



Dans le cadre du modèle CIM (il est également utilisé en WMI), les données du système d'exploitation sont présentées sous forme de classes avec propriétés et méthodes. Les classes sont regroupées en ordre hiérarchique et liées logiquement par technologie d'espace de noms ou zone de gestion. Il existe un espace de noms racine Root qui a des sous-espaces: CIMv2, Default, Secutiry et WMI. Pour l'identification non ambiguë d'une instance d'une classe (objet) et la description de l'état de la ressource correspondante, les propriétés de classe sont utilisées, qui sont généralement en lecture seule. Des méthodes sont utilisées pour gérer la ressource.

L'instance de classe est accessible par le chemin complet, qui a la forme suivante:

[\\ComputerName\NameSpace][:ClassName][.KeyProperty1=Value1][,KeyProperty2=Value2]…]


ComputerName est le nom de l'ordinateur;
NameSpace - espace de noms;
ClassName - le nom de la classe;
KeyProperty1 = Value1, KeyProperty2 = Value2 - les propriétés de l'objet et les valeurs par lesquelles il est identifié.

Avant PowerShell, un simple outil WMI n'existait pas. Pour accéder aux objets, il fallait écrire des programmes assez complexes dans des langages de haut niveau (C ++, Visual Basic, Java Script) ou étudier le shell WMIC (WMI Command Line, qui est également abandonné) avec son propre langage. Grâce à PowerShell, les objets WMI sont accessibles à l'utilisateur moyen à partir de la ligne de commande ou dans des scripts. Tout d'abord, connectez-vous au sous-système WMI et obtenez une liste des classes disponibles à l'aide de l'applet de commande Get-WmiObject (alias gwmi). Pour obtenir une liste des classes CIM, utilisez l'applet de commande Get-CimClass.

Get-CimClass
Get-WmiObject -List



Nous avons répertorié les classes sur l'ordinateur local, mais vous pouvez vous connecter à la télécommande:

Get-CimClass -ComputerName IP- 
Get-CimClass -ComputerName _

ou

Get-WmiObject -ComputerName IP- -List
Get-WmiObject -ComputerName _ -List

Par défaut, les applets de commande Get-CimClass et Get-WmiObject se connectent à l'espace de noms Root \ CIMV2, qui stocke un grand nombre de classes pour la gestion du système. Pour modifier l'espace de noms, utilisez le paramètre -Namespace:

Get-CimClass -Namespace Root
Get-WmiObject -Namespace Root -List

Connaître le nom de la classe, il n'est pas difficile d'en obtenir des instances. La commande suivante renvoie toutes les instances de Win32_Service, c'est-à-dire services enregistrés sur la machine locale:

Get-WmiObject Win32_Service

Comme pour les autres types d'objets, une liste de propriétés et de méthodes s'affiche à l'aide de Get-Member. Les méthodes d'objet WMI sont accessibles directement ou à l'aide de l'applet de commande Invoke-WmiMethod. Vous pouvez également utiliser des applets de commande pour les objets WMI pour trier, filtrer, grouper, etc.

Get-WmiObject Win32_Service | Get-Member



Pour obtenir des objets CIM (instances de classes), utilisez l'applet de commande Get-CimInstance. Contrairement à WMI, les objets CIM résultants (objet résultant ou instances de classe) ne contiennent pas de méthodes de classe. Comme vous ne pouvez pas extraire directement une méthode, vous devez appeler l'applet de commande Invoke-CimMethod. Considérez la classe Win32_Service - services exécutés sur le système) et son instance pour le service de spouleur sur la machine locale:

Get-CimInstance Win32_service -filter "Name='spooler'" 



Regardons la structure de l'objet résultant:

Get-CimInstance Win32_service -filter "Name='spooler'" | Get-Member



À ce stade, les avantages des applets de commande pour travailler avec des objets CIM ne sont pas évidents. Ils concernent principalement le travail à distance dans un environnement distribué et seront discutés en détail dans le dernier article de la série consacrée à la résolution des problèmes pratiques d'administration.

Il existe également une boîte à outils spécifique à WMI: le WMI Query Language (WQL), un langage de requête de type SQL. Une requête WQL pour rechercher toutes les démarrages lors du démarrage d'un système de service ressemble à ceci:

select * from win32_service where startmode="Auto"

À partir de PowerShell, ils sont exécutés comme suit:

Get-WmiObject -Query 'select * from win32_service where startmode="Auto"'



Travailler avec des objets COM


Pour assurer l'interaction entre les applications sous Windows, une technologie de liaison et d'intégration d'objets (Object Linking and Embedding ou OLE) a été développée. Plus tard, la technologie OLE Automation est apparue, à l'aide de laquelle les applications client d'automatisation pouvaient appeler les fonctions d'autres applications - les serveurs d'automatisation. OLE et OLE Automation étaient basés sur la technologie de base du Component Object Model (COM), qui offre une norme binaire unique pour les composants logiciels. Les objets créés à l'aide de celui-ci et enregistrés dans le système d'exploitation peuvent être utilisés dans d'autres applications à l'aide de fichiers exécutables ou de bibliothèques dynamiques.

Vers le milieu des années 90, au lieu de OLE, un autre terme a commencé à être utilisé - ActiveX. Avant l'avènement de la plate-forme .NET, la technologie ActiveX était considérée comme la clé, et les objets COM sont toujours activement utilisés pour intégrer des applications dans Windows - de nombreux produits Microsoft et tiers sont des serveurs d'automatisation et permettent d'accéder à leurs services via eux. Pour accéder aux objets, ProgID est utilisé - un identificateur symbolique qui leur est attribué lors de l'inscription dans le registre Windows. Il a la forme suivante:

_..

La version n'est généralement pas indiquée:

_.

Voici quelques exemples de ProgID disponibles: InternetExplorer.Application (application Internet Explorer), Word.Application (application Microsoft Word), WScript.Shell (classe Shell de l'hôte de script Windows ou modèle d'objet serveur de script WSH).

Vous pouvez créer une instance de l'objet à l'aide de l' applet de commande New-Object décrite dans l'article précédent et voir sa structure à l'aide de Get-Member:

$myshell = New-Object -ComObject WScript.Shell
$myshell | Get-Member



Pour travailler avec des objets, des propriétés et des méthodes sont utilisées. Dites, pour créer un raccourci sur le bureau de l'utilisateur, vous devez appeler la méthode CreateShortcut ():

$link = $myshell.CreateShortcut("$Home\Desktop\Home.lnk")

Notez que le raccourci est également un objet COM:

$link | Get-Member



Il nous reste à remplir ses propriétés et à économiser:

$link.TargetPath = $Home
$link.Save()

De cette façon, nous avons créé un raccourci sur le bureau de l'utilisateur actif, et maintenant nous analyserons le travail avec les services d'automatisation externes en utilisant l'exemple de l'objet COM Shell.Application. Avec lui, vous pouvez automatiser certaines actions dans l'Explorateur Windows:

$myshell=New-Object -ComObject Shell.Application

ou pour faire court:

$myshell=New-Object -com Shell.Application
$myshell | Get-Member



L'objet Shell.Application a plusieurs méthodes de gestion de fenêtres différentes. Par exemple, pour afficher le contenu d'un répertoire donné, Explore () est utilisé:

$myshell.Explore("c:\")

Le système d'aide est appelé à l'aide de la méthode Help ():

$myshell.Help()


Il existe également trois méthodes pour appeler les boîtes de dialogue de recherche: FindFiles (), FindComputer () et FindPrinter ().

$myshell.FindFiles()
$myshell.FindComputer()
$myshell.FindPrinter()

Vous pouvez ouvrir la boîte de dialogue de lancement du programme à l'aide de la méthode FileRun (), et pour appeler la fenêtre de réglage de la date / heure, vous avez besoin de la méthode SetTime (). Il existe, par exemple, des méthodes pour appeler la fenêtre des paramètres de la barre des tâches, des éléments du panneau de contrôle indiquant l'un des fichiers cpl disponibles, pour gérer les fenêtres ouvertes:

$myshell.MinimizeAll()
$myshell.UndoMinimizeAll()
$myshell.TileHorizontally()
$myshell.TileVertically()

La méthode Windows () vous permet d'accéder à la collection de fenêtres ouvertes dans Explorer ou dans Internet Explorer. Voyons les propriétés et méthodes disponibles pour cette collection:

$myshell.Windows() | Get-Member



Il existe d'autres objets COM utiles, dont le nombre dépend du logiciel installé dans le système. Il était une fois, le principal outil d'automatisation de Windows était considéré comme le serveur de script WSH, dont le modèle objet comprend des objets COM: conçu pour fonctionner avec les fonctions réseau de WScript.Network et WScript.Shell que nous avons déjà mentionnées. Ce dernier crée non seulement des raccourcis sur le bureau, avec son aide, vous pouvez, par exemple, afficher des fenêtres d'informations avec des messages et des boutons, basculer entre les applications, lancer des programmes ou simuler des frappes.

Utilisation du service d'annuaire ADSI


En général, un catalogue fait référence à une source d'informations dans laquelle les données sur certains objets sont stockées. Par service d'annuaire, nous entendons une partie d'un système informatique distribué qui vous permet d'accéder et de manipuler des objets stockés. Un service d'annuaire peut combiner des données sur les objets réseau et les services qui les manipulent - il représente un point d'entrée unique pour interagir avec les ressources réseau. Il peut y avoir de nombreux services de ce type dans un réseau informatique hétérogène: un SAM local (Security Account Manager) pour les ordinateurs hors domaine, Active Directory, etc.

L'interaction avec différents services d'annuaire nécessite différents outils, ce qui crée certains inconvénients. À partir de Windows 2000, Microsoft a introduit la technologie ADSI (Active Directory Service Interface) unifiée pour les systèmes d'exploitation qui ne dépend pas d'un protocole d'accès réseau spécifique. Pour rechercher des objets, un espace de noms est défini pour le répertoire. Étant donné que différents services d'annuaire utilisent différentes méthodes de dénomination, ADSI définit une convention qui identifie de manière unique tout objet. Le concept de chaînes de liaison en deux parties ou ADsPath est introduit. La première partie du nom définit le service d'annuaire (fournisseur ADSI) et la seconde - l'emplacement de l'objet dans l'annuaire. Voici des exemples de désignation de différents fournisseurs ADSI:

LDAP: //utilisé pour les services d'annuaire basés sur LDAP, y compris pour Active Directory;

WinNT: // utilisé pour les ordinateurs locaux.

Il n'y a aucune applet de commande spéciale pour travailler avec ADSI dans PowerShell. À la place, l'opérateur de transtypage [ADSI] est utilisé suivi d'une chaîne de liaison. Par exemple, pour se connecter à l'utilisateur Ivanov à partir du domaine test.ru, la construction suivante est nécessaire:

$user = [ADSI]"LDAP://CN=Ivanov,DC=TEST,DC=RU"

Pour travailler avec des comptes locaux, vous devrez vous connecter à l'ordinateur avec le nom correspondant (pour vous connecter à l'ordinateur local, utilisez simplement le point au lieu du nom):

$computer = [ADSI]"WinNT://."

Par exemple, créez un nouvel utilisateur, Ivanov, sur la machine locale:

$user = $computer.Create("user","Ivanov")
$user.Put("Description","  PowerShell")
$user.SetInfo()

Connectez-vous maintenant à celui-ci:

$user1 = [ADSI]"WinNT://./Ivanov,user"
$user1.Description



Formatage de sortie


Le travail interactif nécessite souvent l'affichage de données. Dans d'autres shells, les commandes et les utilitaires eux-mêmes participent au formatage de la sortie, mais les objets binaires renvoyés par les fonctions et les applets de commande ne savent généralement pas comment procéder. Dans PowerShell, la sortie est formatée par quatre applets de commande spéciales qui alimentent les objets via le pipeline. Des informations plus détaillées peuvent être obtenues à l'aide de Get-Help:

Format-Table formate la sortie sous la forme d'un tableau dont les colonnes contiennent les valeurs des propriétés de l'objet ou les valeurs calculées. La possibilité de regrouper des données est prise en charge;

Format-List affiche l'objet sous la forme d'une liste de propriétés, chacune étant affichée sur une nouvelle ligne. La possibilité de regrouper des données est prise en charge;

Format personnaliséformate la sortie à l'aide d'une vue personnalisée;

Format-Wide formate les objets sous la forme d'un tableau large dans lequel une seule propriété de chaque objet est affichée.

Si aucune des applets de commande répertoriées n'est appelée, le module de mise en forme approprié au type de données affichées est utilisé. Les règles d'affichage sont stockées dans des fichiers de configuration au format XML avec l'extension .ps1xml, qui se trouvent dans le répertoire $ PSHome. Une liste d'entre eux peut être obtenue à l'aide de la commande suivante:

dir $pshome\*format*.ps1xm

La modification manuelle des fichiers de configuration n'est pas recommandée; il est préférable de créer les vôtres et de les inclure dans la liste des fichiers téléchargés à l'aide de l'applet de commande Update-FormatData. Si le formateur par défaut pour le type souhaité n'est pas défini, PowerShell affiche les propriétés de l'objet à l'écran dans une liste.

Ceci conclut la description de l'utilisation des objets dans PowerShell, et le dernier article de la série sera consacré à la résolution des problèmes pratiques de gestion d'un environnement d'informations réparties d'une entreprise. Dans ce document, tous les outils décrits nous sont utiles. L'accent sera principalement mis sur les objets CIM et leur comparaison avec WMI. Les pièces passées peuvent être trouvées sur les liens ci-dessous.



1: Windows PowerShell
2: Windows PowerShell
3: ,
4: ,


All Articles