New-object

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Interopérabilité .NET / COM
Cmdlet New-Object
Voir aussi Powershell .net · Powershell COM

New-Object instancie un objet .NET ou COM. C'est le point d'entrée de l'interopérabilité de PowerShell avec les frameworks .NET, COM, WMI et WSH.

Instancier un objet COM

COM (Component Object Model) permet d'interagir avec les API des applications. Quelques technologies connexes : DDE (Dynamic Data Exchange), OLE (Object Linking and Embedding), ADSI, WMI.

Les applications sont représentées dans le registre par leur ProgID (identification programmatique), sous la forme <programme>.<composant>.<version> — par exemple Word.Application.1 — et par un CLSID.

Rechercher un ProgID :

function Get-ProgID
{
    param([string]$ProgID = '.')
    Get-ChildItem REGISTRY::HKEY_CLASSES_ROOT\CLSID\*\ProgID |
        Where { $_.GetValue('') -match $ProgID } |
        ForEach-Object { $_.GetValue('') }
}

Get-ProgID explorer

Créer un objet COM :

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

Paramètres : -ComObject (ProgID de l'objet), -Strict (erreur si l'objet COM est en réalité un objet .NET encapsulé).

Instancier un objet .NET

# Constructeur simple
New-Object -TypeName System.DateTime

# Surcharge du constructeur
$var = New-Object -TypeName DateTime -ArgumentList 2008, 2, 13

# Instance de type String
$chaine = New-Object -TypeName System.String -ArgumentList 'Bonjour'
$chaine = New-Object System.String('Bonjour')

Déterminer l'encodage d'un fichier :

$sr = New-Object System.IO.StreamReader fichier.txt
$sr.CurrentEncoding

Assemblies

Une assembly est un ensemble de types .NET formant une unité logique exécutée par le CLR (Common Language Runtime).

# Lister les assemblies chargées
$assemblies = [System.AppDomain]::CurrentDomain.GetAssemblies()
$assemblies[0].GetExportedTypes()

# Charger une assembly
[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')

# Lister les types d'une assembly
[System.AppDomain]::CurrentDomain.GetAssemblies() |
  Where { $_.FullName -match 'System.Windows.Forms' } |
  ForEach-Object { $_.GetExportedTypes() } |
  ForEach-Object { $_.FullName }

Exemple : envoi de courriel

$expediteur   = 'robot@example.com'
$destinataire = 'admin@example.com'
$serveur      = 'smtp.example.com'
$objet        = 'Message envoyé avec PowerShell ' + (Get-Date)
$texte        = 'Ceci est le corps du message'

$message = New-Object System.Net.Mail.MailMessage
$message.Body    = $texte
$message.From    = $expediteur
$message.Subject = $objet
$message.To.Add($destinataire)

$client = New-Object System.Net.Mail.SmtpClient
$client.Host = $serveur
$client.Send($message)

Voir aussi Send-MailMessage.

Objets WSH (Windows Script Host)

# Raccourci de bureau
$cible   = 'C:\temp\fichier.doc'
$lien    = "$env:USERPROFILE\Desktop\MonLien.lnk"
$wshell  = New-Object -ComObject WScript.Shell
$raccourci = $wshell.CreateShortcut($lien)
$raccourci.TargetPath = $cible
$raccourci.Save()

# Mappage de disque réseau
$wshNetwork = New-Object -ComObject WScript.Network
$wshNetwork.MapNetworkDrive('X:', '\\serveur\partage')
$wshNetwork.RemoveNetworkDrive('X:')

Voir aussi