Certains composants logiciels des interfaces .NET Framework et COM vous permettent d'effectuer de nombreuses tâches d'administration du système. Windows PowerShell prend en charge l'utilisation de ces composants, de sorte que vous n'êtes pas limité aux tâches pouvant être effectuées au moyen des applets de commande. De nombreuses applets de commande de la version initiale de Windows PowerShell ne fonctionnent pas sur des ordinateurs distants. Nous montrerons comment contourner cette limitation lors de la gestion des journaux des événements en utilisant la classe .NET Framework System.Diagnostics.EventLog directement à partir de Windows PowerShell.

Utilisation de New-Object pour l'accès aux journaux des événements

La bibliothèque de classes .NET Framework comprend une classe nommée System.Diagnostics.EventLog que vous pouvez utiliser pour gérer les journaux des événements. Vous pouvez créer une nouvelle instance d'une classe .NET Framework en utilisant l'applet de commande New-Object avec le paramètre TypeName (nom de type). Par exemple, la commande suivante crée une référence de journal des événements :

PS> New-Object -TypeName System.Diagnostics.EventLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----

Bien que la commande ait créé une instance de la classe EventLog, cette instance n'inclut aucune donnée. La raison en est que nous n'avons pas spécifié de journal des événements particulier. Comment obtenir un véritable journal des événements ?

Utilisation de constructeurs avec New-Object

Pour faire référence à un journal des événements particulier, vous devez en spécifier le nom. New-Object a un paramètre ArgumentList. Les arguments que vous passez comme valeurs à ce paramètre sont utilisés par une méthode de démarrage spéciale de l'objet. La méthode est appelée « constructeur », car elle sert à construire l'objet. Par exemple, pour obtenir une référence au journal Application, vous spécifiez la chaîne « Application » en tant qu'argument :

PS> New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Max(K) Retain OverflowAction        Entries Name
------ ------ --------------        ------- ----
16,384      7 OverwriteOlder          2,160 Application
Remarque :

Dans la mesure où la plupart des classes principales .NET Framework sont contenues dans l'espace de noms System, Windows PowerShell essaie automatiquement de rechercher les classes que vous spécifiez dans l'espace de noms System s'il ne peut pas trouver de correspondance pour le nom de type spécifié. Cela signifie que vous pouvez spécifier Diagnostics.EventLog au lieu de System.Diagnostics.EventLog.

Stockage d'objets dans des variables

Vous pouvez stocker une référence à un objet de manière à pouvoir l'utiliser dans l'interpréteur de commandes actuel. Bien que Windows PowerShell vous permette de réaliser un travail considérable avec les pipelines en réduisant le besoin en variables, stocker des références aux objets dans des variables peut parfois faciliter la manipulation de ces objets.

Windows PowerShell vous permet de créer des variables qui sont pour l'essentiel des objets nommés. La sortie de toute commande Windows PowerShell valide peut être stockée dans une variable. Les noms de variables commencent toujours par $. Si vous souhaitez stocker la référence au journal Application dans une variable nommée $AppLog, tapez le nom de la variable, suivi du signe égal, puis tapez la commande utilisée pour créer l'objet du journal Application :

PS> $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Si vous tapez ensuite $AppLog, vous constatez que cette variable contient le journal Application :

PS> $AppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16,384      7 OverwriteOlder          2,160 Application

Accès à un journal des événements distant avec New-Object

Les commandes utilisées dans la section précédente ciblent l'ordinateur local ; l'applet de commande Get-EventLog peut le faire. Pour accéder au journal Application d'un ordinateur distant, vous devez fournir à la fois le nom du journal et un nom d'ordinateur (ou une adresse IP) en tant qu'arguments.

PS> $RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81
PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder            262 Application

Maintenant que nous disposons d'une référence à un journal des événements stockée dans la variable $RemoteAppLog, quelles tâches pouvons-nous effectuer dessus ?

Effacement d'un journal des événements avec des méthodes d'objets

Les objets sont souvent assortis de méthodes qui peuvent être appelées pour effectuer des tâches. Vous pouvez utiliser Get-Member pour afficher les méthodes associées à un objet. La commande suivante et la sortie sélectionnée affichent quelques méthodes de la classe EventLog :

PS> $RemoteAppLog | Get-Member -MemberType Method


   TypeName: System.Diagnostics.EventLog

Name                      MemberType Definition
----                      ---------- ----------
...
Clear                     Method     System.Void Clear()
Close                     Method     System.Void Close()
...
GetType                   Method     System.Type GetType()
...
ModifyOverflowPolicy      Method     System.Void ModifyOverflowPolicy(Overfl...
RegisterDisplayName       Method     System.Void RegisterDisplayName(String ...
...
ToString                  Method     System.String ToString()
WriteEntry                Method     System.Void WriteEntry(String message),...
WriteEvent                Method     System.Void WriteEvent(EventInstance in...

La méthode Clear() peut être utilisée pour effacer le journal des événements. Lorsque vous appelez une méthode, même si celle-ci ne requiert pas d'arguments, vous devez toujours faire suivre son nom de parenthèses. Cela permet à Windows PowerShell de faire la distinction entre la méthode et une éventuelle propriété du même nom. Tapez la commande suivante pour appeler la méthode Clear :

PS> $RemoteAppLog.Clear()

Tapez la commande ci-dessous pour afficher le journal. Vous verrez que le contenu du journal des événements a été effacé et qu'il présente maintenant 0 entrée au lieu de 262 :

PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

Création d'objets COM avec New-Object

Vous pouvez utiliser New-Object pour utiliser des composants COM (Component Object Model). Ces composants vont des diverses bibliothèques fournies avec WSH (Windows Script Host) aux applications ActiveX comme Internet Explorer installées sur la plupart des systèmes.

New-Object utilise des wrappers RCW (Runtime Callable Wrapper) .NET Framework pour créer des objets COM. Les limitations qui lui sont applicables sont donc les mêmes que celles de .NET Framework lors de l'appel d'objets COM. Pour créer un objet COM, vous devez spécifier le paramètre ComObject avec l'identificateur programmatique (ou ProgId) de la classe COM à utiliser. Une discussion complète des limitations de l'utilisation d'objets COM et de l'identification des ProgId disponibles sur un système dépasse le cadre du présent guide de l'utilisateur, mais la plupart des objets connus d'environnements tels que WSH peuvent être utilisés dans Windows PowerShell.

Vous pouvez créer les objets WSH en spécifiant ces ProgId : WScript.Shell, WScript.Network, Scripting.Dictionary et Scripting.FileSystemObject. Les commandes suivantes créent ces objets :

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Bien que la plupart des fonctionnalités de ces classes soient rendues disponibles par d'autres moyens dans Windows PowerShell, certaines tâches, telles que la création de raccourcis, restent plus simples en utilisant des classes WSH.

Création d'un raccourci sur le Bureau avec WScript.Shell

La création d'un raccourci peut être effectuée rapidement avec un objet COM. Supposez que vous souhaitez créer sur votre Bureau un raccourci vers le dossier de base de Windows PowerShell. Vous devez d'abord créer une référence à WScript.Shell, que nous stockerons dans une variable nommée $WshShell :

$WshShell = New-Object -ComObject WScript.Shell

Get-Member fonctionne avec les objets COM, de sorte que vous pouvez explorer les membres de l'objet en tapant :

PS> $WshShell | Get-Member


   TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}

Name                     MemberType            Definition
----                     ----------            ----------
AppActivate              Method                bool AppActivate (Variant, Va...
CreateShortcut           Method                IDispatch CreateShortcut (str...
...

Get-Member a un paramètre InputObject facultatif que vous pouvez utiliser au lieu de recourir à une redirection pour fournir l'entrée à Get-Member. L'utilisation de la commande Get-Member -InputObject $WshShell donne la même sortie que celle présentée ci-dessus. Si vous utilisez InputObject, son argument est traité comme un élément unique. Cela signifie que si une variable contient plusieurs objets, Get-Member les traite comme un tableau d'objets. Par exemple :

PS> $a = 1,2,"three"
PS> Get-Member -InputObject $a
TypeName: System.Object[]
Name               MemberType    Definition
----               ----------    ----------
Count              AliasProperty Count = Length
...

La méthode WScript.Shell CreateShortcut accepte un seul argument : le chemin d'accès au fichier de raccourci à créer. Nous pourrions taper le chemin d'accès complet au Bureau, mais il existe un moyen plus simple. Le Bureau est en principe représenté par un dossier nommé Desktop et situé sous le dossier de base de l'utilisateur actuel. Windows PowerShell fournit une variable $Home qui contient le chemin d'accès à ce dossier. Nous pouvons spécifier le chemin d'accès au dossier de base en utilisant cette variable, puis ajouter le nom du dossier Desktop et le nom du raccourci à créer en tapant :

$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")

Lorsque vous faites figurer entre guillemets doubles quelque chose qui ressemble à un nom de variable, Windows PowerShell essaie de substituer une valeur correspondante. Si vous utilisez des guillemets simples, Windows PowerShell n'essaie pas de substituer la valeur de la variable. Par exemple, essayez de taper les commandes suivantes :

PS> "$Home\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
PS> '$Home\Desktop\PSHome.lnk'
$Home\Desktop\PSHome.lnk

Nous disposons à présent d'une variable nommée $lnk qui contient une nouvelle référence de raccourci. Si vous souhaitez en consulter les membres, vous pouvez la diriger vers Get-Member. La sortie suivante affiche les membres que nous devons utiliser pour terminer de créer notre raccourci :

PS> $lnk | Get-Member

TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}

Name MemberType Definition

---- ---------- ----------

...

Save Method void Save ()

...

TargetPath Property string TargetPath () {get} {set}

...

Nous devons spécifier TargetPath, qui représente le dossier d'application pour Windows PowerShell, puis enregistrer le raccourci $lnk en appelant la méthode Save. Le chemin d'accès au dossier d'application Windows PowerShell est stocké dans la variable $PSHome. Nous pouvons donc réaliser l'opération en tapant :

$lnk.TargetPath = $PSHome

$lnk.Save()

Utilisation d'Internet Explorer à partir de Windows PowerShell

De nombreuses applications (y compris la famille Microsoft Office d'applications et Internet Explorer) peuvent être automatisées en utilisant COM. Internet Explorer illustre certaines des techniques et questions classiques qu'implique l'utilisation d'applications COM.

Vous créez une instance d'Internet Explorer en spécifiant son ProgID, InternetExplorer.Application :

$ie = New-Object -ComObject InternetExplorer.Application

Cette commande démarre Internet Explorer, mais ne le rend pas visible. Si vous tapez Get-Process, vous pouvez voir qu'un processus nommé iexplore est en cours d'exécution. En fait, si vous quittez Windows PowerShell, l'exécution du processus se poursuit. Vous devez redémarrer l'ordinateur ou utiliser un outil tel que le Gestionnaire des tâches pour mettre fin au processus iexplore.

Remarque :

Les objets COM qui démarrent en tant que processus distincts, communément appelés « exécutables ActiveX », peuvent ou non afficher une fenêtre d'interface utilisateur lorsqu'ils démarrent. S'ils créent une fenêtre, mais ne la rendent pas visibles, comme c'est le cas d'Internet Explorer, c'est généralement le Bureau Windows qui est activé et vous devez rendre la fenêtre visible pour interagir avec l'application en question.

En tapant $ie | Get-Member, vous pouvez consulter les propriétés et méthodes d'Internet Explorer. Pour voir la fenêtre Internet Explorer, définissez la propriété Visible sur $true en tapant :

$ie.Visible = $true

Vous pouvez alors accéder à une adresse Web spécifique en utilisant la méthode Navigate :

$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")

En utilisant d'autres membres du modèle objet d'Internet Explorer, il est possible de récupérer le contenu textuel de la page Web. La commande suivante affichera le texte HTML du corps de la page Web active :

$ie.Document.Body.InnerText

Pour fermer Internet Explorer à partir de PowerShell, appelez sa méthode Quit() :

$ie.Quit()

Cela forcera sa fermeture. La variable $ie ne contient plus de référence valide, bien qu'elle semble toujours être un objet COM. Si vous essayez de l'utiliser, vous obtenez une erreur d'automation :

PS> $ie | Get-Member
Get-Member : Exception retrieving the string representation for property "Appli
cation" : "The object invoked has disconnected from its clients. (Exception fro
m HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
At line:1 char:16
+ $ie | Get-Member <<<<

Vous pouvez soit supprimer la référence restante avec une commande telle que $ie = $null, soit complètement supprimer la variable en tapant :

Remove-Variable ie
Remarque :

Il n'existe pas de norme en ce qui concerne la fermeture ou la poursuite de l'exécution d'un exécutable ActiveX lorsque vous supprimez la référence correspondante. En fonction des circonstances, telles que la visibilité de l'application, l'exécution d'un document modifié dedans, voire la poursuite ou non de l'exécution de Windows PowerShell, l'application peut ou non être fermée. C'est la raison pour laquelle vous devez tester le comportement d'arrêt de chaque exécutable ActiveX que vous souhaitez utiliser dans Windows PowerShell.

Obtention d'avertissements sur les objets COM associés à un wrapper .NET Framework

Dans certains cas, un objet COM peut être associé à un wrapper RCW (wrapper pouvant être appelé par le runtime) .NET Framework, qui sera utilisé par New-Object. Le comportement de ce wrapper pouvant différer de celui d'un objet COM classique, New-Object a un paramètre Strict qui vous avertit de l'accès au wrapper RCW. Si vous spécifiez le paramètre Strict, puis créez un objet COM qui utilise un wrapper RCW, un message d'avertissement s'affiche :

PS> $xl = New-Object -ComObject Excel.Application -Strict
New-Object : The object written to the pipeline is an instance of the type "Mic
rosoft.Office.Interop.Excel.ApplicationClass" from the component's primary inte
rop assembly. If this type exposes different members than the IDispatch members
, scripts written to work with this object might not work if the primary intero
p assembly is not installed.
At line:1 char:17
+ $xl = New-Object  <<<< -ComObject Excel.Application -Strict

Bien que l'objet soit effectivement créé, vous êtes averti qu'il ne s'agit pas d'un objet COM standard.




Table des matières