Einige Softwarekomponenten mit .NET Framework- und COM-Schnittstelle ermöglichen das Durchführen von Aufgaben der Systemverwaltung. Diese Komponenten können in Windows PowerShell verwendet werden, sodass Sie nicht auf die Aufgaben beschränkt sind, die mit Cmdlets durchgeführt werden können. Zahlreiche Cmdlets in der ursprünglichen Version von Windows PowerShell können nicht mit Remotecomputern verwendet werden. Diese Einschränkung bei der Verwaltung von Ereignisprotokollen mit der System.Diagnostics.EventLog-Klasse von .NET direkt in Windows PowerShell kann jedoch wie im Folgenden beschrieben umgangen werden.
Verwenden von New-Object für den Zugriff auf Ereignisprotokolle
Die .NET Framework-Klassenbibliothek enthält die System.Diagnostics.EventLog-Klasse, mit der Ereignisprotokolle verwaltet werden können. Mit dem Cmdlet New-Object und dem TypeName-Parameter können Sie eine neue Instanz einer .NET-Klasse erstellen. Beispielsweise wird mit dem folgenden Befehl ein Verweis auf ein Ereignisprotokoll erstellt:
PS> New-Object -TypeName System.Diagnostics.EventLog Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ----
Zwar wurde mit dem Befehl eine Instanz der EventLog-Klasse erstellt, doch enthält die Instanz keine Daten. Ursache ist die fehlende Angabe eines bestimmten Ereignisprotokolls. Wie lässt sich ein echtes Ereignisprotokoll abrufen?
Verwenden von Konstruktoren mit New-Object
Zum Verweisen auf ein bestimmtes Ereignisprotokoll müssen Sie den Namen des Ereignisprotokolls angeben. New-Object weist den ArgumentList-Parameter auf. Die Argumente, die als Werte an diesen Parameter übergeben werden, werden durch eine besondere Startmethode des Objekts verwendet. Die Methode wird als Konstruktor bezeichnet, da sie zum Erstellen ("Konstruieren") des Objekts verwendet wird. Wenn Sie beispielsweise auf das Anwendungsprotokoll verweisen möchten, geben Sie die Zeichenfolge "Application" als Argument an:
PS> New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ---- 16,384 7 OverwriteOlder 2,160 Application
Hinweis: | |
Da ein Großteil der wichtigsten .NET Framework-Kernklassen im System-Namespace enthalten ist, sucht Windows PowerShell automatisch nach den im System-Namespace angegebenen Klassen, wenn keine Übereinstimmung für den angegebenen Typnamen gefunden werden kann. Dies bedeutet, dass Sie "Diagnostics.EventLog" anstelle von "System.Diagnostics.EventLog" angeben können. |
Speichern von Objekten in Variablen
Möglicherweise möchten Sie einen Verweis auf ein Objekt speichern, um dieses in der aktuellen Shell verwenden zu können. Zwar können Sie in Windows PowerShell zahlreiche Vorgänge mit Pipelines ausführen und so die Notwendigkeit der Verwendung von Variablen reduzieren. Durch Speichern von Objekten in Variablen kann die Bearbeitung dieser Objekte jedoch vereinfacht werden.
Mit Windows PowerShell können Sie Variablen erstellen, bei denen es sich im Grunde genommen um benannte Objekte handelt. Die Ausgabe eines beliebigen Windows PowerShell-Befehls kann in einer Variablen gespeichert werden. Variablennamen beginnen immer mit $. Wenn Sie den Anwendungsprotokollverweis in der Variablen "$AppLog" speichern möchten, geben Sie den Namen der Variablen, gefolgt von einem Gleichheitszeichen, und dann den Namen des Befehls ein, mit dem das Anwendungsprotokollobjekt erstellt wurde:
PS> $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Wenn Sie nun "$AppLog" eingeben, können Sie sehen, dass das Anwendungsprotokoll enthalten ist:
PS> $AppLog Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ---- 16,384 7 OverwriteOlder 2,160 Application
Zugreifen auf ein Remoteereignisprotokoll mit New-Object
Die Befehle im vorangegangenen Abschnitt beziehen sich auf den lokalen Computer. Zu diesem Zweck kann das Cmdlet Get-EventLog verwendet werden. Um auf das Anwendungsprotokoll auf einem Remotecomputer zugreifen zu können, müssen Sie den Namen des Protokolls und den Namen des Computers (oder die IP-Adresse) als Argumente angeben.
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
Sie haben nun einen Verweis auf ein Ereignisprotokoll erstellt, das in der Variablen "$RemoteAppLog" gespeichert ist. Welche Aufgaben können mit diesem ausgeführt werden?
Löschen eines Ereignisprotokolls mit Objektmethoden
Objekte verfügen häufig über Methoden, die zur Durchführung bestimmter Aufgaben aufgerufen werden können. Mit Get-Member können Sie die einem Objekt zugeordneten Methoden anzeigen. Der folgende Befehl und die ausgewählte Ausgabe veranschaulichen einige Methoden der EventLog-Klasse:
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...
Mit der Clear()-Methode kann das Ereignisprotokoll gelöscht werden. Beim Aufrufen einer Methode muss der Namen der Methode immer von Klammern gefolgt sein; dies gilt auch, wenn für die Methode keine Argumente erforderlich sind. Windows PowerShell kann so zwischen der Methode und einer potenziellen Eigenschaft gleichen Namens unterscheiden. Geben Sie Folgendes ein, um die Clear-Methode aufzurufen:
PS> $RemoteAppLog.Clear()
Geben Sie Folgendes ein, um das Protokoll anzuzeigen. Das Ereignisprotokoll ist nun leer und weist 0 anstelle von 262 Einträgen auf:
PS> $RemoteAppLog Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ---- 512 7 OverwriteOlder 0 Application
Erstellen von COM-Objekten mit New-Object
Verwenden Sie New-Object, wenn Sie mit COM-Komponenten (Component Object Model) arbeiten möchten. Die Komponenten reichen von zahlreichen Bibliotheken, die im Windows Script Host (WSH) enthalten sind, bis hin zu ActiveX-Anwendungen wie Internet Explorer, die auf den meisten Systemen installiert sind.
New-Object erstellt COM-Objekte mit Runtime-Callable Wrappers von .NET Framework, sodass beim Aufrufen von COM-Objekten die gleichen Einschränkungen wie bei .NET gelten. Wenn Sie ein COM-Objekt erstellen möchten, müssen Sie den ComObject-Parameter mit der ProgID der COM-Klasse angeben, die Sie verwenden möchten. Eine umfassende Erläuterung der Einschränkungen bei der COM-Verwendung sowie zur Bestimmung der im System verfügbaren ProgIDs übersteigt den Rahmen dieses Handbuchs. Die Mehrzahl der bekannten Objekte in Umgebungen wie WSH kann jedoch in Windows PowerShell verwendet werden.
Erstellen Sie WSH-Objekte, indem Sie folgende ProgIDs angeben: WScript.Shell, WScript.Network, Scripting.Dictionary und Scripting.FileSystemObject. Die Objekte werden mit den folgenden Befehlen erstellt:
New-Object -ComObject WScript.Shell New-Object -ComObject WScript.Network New-Object -ComObject Scripting.Dictionary New-Object -ComObject Scripting.FileSystemObject
Auch wenn die Funktionalität dieser Klassen in Windows PowerShell zum größten Teil auch auf andere Weise verfügbar gemacht wird, lassen sich einige Aufgaben wie das Erstellen von Verknüpfungen doch am einfachsten mit WSH-Klassen ausführen.
Erstellen einer Desktop-Verknüpfung mit "WScript.Shell"
Verknüpfungen können ganz einfach mit einem COM-Objekt erstellt werden. Angenommen, Sie möchten eine Verknüpfung mit dem Basisordner für Windows PowerShell auf dem Desktop erstellen. Erstellen Sie zunächst einen Verweis auf WScript.Shell. Dieser wird in der Variablen $WshShell gespeichert:
$WshShell = New-Object -ComObject WScript.Shell
Get-Member kann mit COM-Objekten verwendet werden, sodass Sie die Elemente des Objekts mit folgendem Befehl anzeigen können:
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 verfügt über den optionalen InputObject-Parameter, mit dem Sie anstelle einer Pipeline die Eingabe für Get-Member bereitstellen können. Wenn Sie stattdessen den Befehl Get-Member -InputObject $WshShell verwenden, erhalten Sie die gleiche Ausgabe wie oben. Wenn Sie InputObject verwenden, wird das Argument als einzelnes Element behandelt. Wenn in einer Variablen mehrere Objekte vorhanden sind, werden diese daher von Get-Member als Objektarray behandelt. Beispiel:
PS> $a = 1,2,"three" PS> Get-Member -InputObject $a TypeName: System.Object[] Name MemberType Definition ---- ---------- ---------- Count AliasProperty Count = Length ...
Die WScript.Shell CreateShortcut-Methode akzeptiert nur ein einzelnes Argument, den Pfad zur Verknüpfungsdatei, die erstellt werden soll. Neben der Eingabe des vollständigen Pfads zum Desktop gibt es eine einfachere Möglichkeit. Der Desktop wird normalerweise durch den Ordner "Desktop" im Basisordner des aktuellen Benutzers dargestellt. Windows PowerShell enthält die Variable $Home, die wiederum den Pfad dieses Ordners enthält. Mit dieser Variablen kann der Pfad zum Basisordner angegeben werden. Anschließend können Sie den Namen des Desktopordners sowie den Namen der zu erstellenden Verknüpfung durch folgende Eingabe hinzufügen:
$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")
Wenn Sie einen variablenähnlichen Namen in Anführungszeichen verwenden, versucht Windows PowerShell diesen durch einen passenden Wert zu ersetzen. Wenn Sie einfache Anführungszeichen verwenden, versucht Windows PowerShell nicht, den Variablenwert zu ersetzen. Geben Sie beispielsweise folgende Befehle ein:
PS> "$Home\Desktop\PSHome.lnk" C:\Documents and Settings\aka\Desktop\PSHome.lnk PS> '$Home\Desktop\PSHome.lnk' $Home\Desktop\PSHome.lnk
Nun ist die Variable $lnk vorhanden, die einen neuen Verknüpfungsverweis enthält. Wenn Sie die Elemente anzeigen möchten, können Sie die Variable über die Pipeline an Get-Member übergeben. Die folgende Ausgabe zeigt die Elemente, die zum Fertigstellen der Verknüpfung erforderlich sind:
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}
...
Geben Sie den TargetPath, d. h. den Anwendungsordner für Windows PowerShell an. Speichern Sie anschließend die Verknüpfung $lnk durch Aufrufen der Save-Methode. Der Pfad des Windows PowerShell-Anwendungsordners wird in der Variablen $PSHome gespeichert, sodass Sie mit folgender Eingabe fortfahren können:
$lnk.TargetPath = $PSHome
$lnk.Save()
Verwenden von Internet Explorer in Windows PowerShell
Zahlreiche Anwendungen (einschließlich der Microsoft Office-Produktfamilie und Internet Explorer) können mit COM automatisiert werden. Internet Explorer veranschaulicht einige der typischen Verfahren und Probleme bei Verwendung von COM-basierten Anwendungen.
Sie können eine Instanz von Internet Explorer erstellen, indem Sie die ProgID von Internet Explorer (InternetExplorer.Application) angeben:
$ie = New-Object -ComObject InternetExplorer.Application
Mit diesem Befehl wird Internet Explorer gestartet, jedoch nicht angezeigt. Sie können Get-Process eingeben, um zu überprüfen, ob der Prozess "iexplore" ausgeführt wird. Wenn Sie Windows PowerShell beenden, wird der Prozess weiterhin ausgeführt. Sie müssen den Computer neu starten oder ein Tool wie Task-Manager verwenden, um den Prozess "iexplore" zu beenden.
Hinweis: | |
Von COM-Objekten, die als separate Prozesse gestartet werden (ausführbare ActiveX-Dateien), kann beim Start eine Benutzeroberfläche angezeigt werden. Wenn ein Fenster mit einer Benutzeroberfläche erstellt, jedoch nicht angezeigt wird (z. B. Internet Explorer), wird der Fokus dem Windows Desktop zugewiesen, und das Fenster muss zur Interaktion angezeigt werden. |
Geben Sie $ie | Get-Member ein, um die Eigenschaften und Methoden für Internet Explorer anzuzeigen. Wenn Sie das Internet Explorer-Fenster anzeigen möchten, legen Sie die Visible-Eigenschaft durch folgende Eingabe auf "$true" fest:
$ie.Visible = $true
Anschließend können Sie mit der Navigate-Methode zu einer bestimmten Webadresse navigieren:
$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")
Mit anderen Elementen des Internet Explorer-Objektmodells können Sie Textinhalte von der Webseite abrufen. Mit dem folgenden Befehl wird der HTML-Text im Textteil der aktuellen Webseite angezeigt:
$ie.Document.Body.InnerText
Um Internet Explorer in PowerShell zu schließen, rufen Sie die Quit()-Methode auf:
$ie.Quit()
Dieser Befehl erzwingt das Schließen. Die Variable "$ie" enthält keinen gültigen Verweis mehr, obwohl es sich scheinbar noch um ein COM-Objekt handelt. Alle Versuche, diese Variable zu verwenden, generieren einen Automatisierungsfehler:
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 <<<<
Sie können den verbleibenden Verweis mit einem Befehl wie "$ie = $null" entfernen, oder Sie können die Variable durch folgende Eingabe vollständig entfernen:
Remove-Variable ie
Hinweis: | |
Für das Verhalten von ausführbaren ActiveX-Dateien nach Entfernen eines Verweises auf diese – Beenden oder Fortsetzen der Ausführung – ist kein Standardverhalten festgelegt. Je nachdem, ob beispielsweise die Anwendung sichtbar ist, ein bearbeitetes Dokument darin ausgeführt wird oder Windows PowerShell möglicherweise noch ausgeführt wird, kann die Anwendung beendet werden. Sie sollten daher das Beendigungsverhalten jeder ausführbaren ActiveX-Datei testen, die Sie in Windows PowerShell verwenden möchten. |
Abrufen von Warnungen zu von .NET Framework umschlossenen COM-Objekten
COM-Objekten kann in einigen Fällen ein Runtime-Callable Wrapper (RCW) von .NET Framework zugeordnet sein, der von New-Object verwendet wird. Da sich der RCW möglicherweise anders als ein gewöhnliches COM-Objekt verhält, enthält New-Object den Strict-Parameter, mit dem Warnungen zum RCW-Zugriff ausgegeben werden. Wenn Sie den Strict-Parameter angeben und anschließend ein COM-Objekt erstellen, das einen RCW verwendet, erhalten Sie folgende Warnmeldung:
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
Das Objekt wird zwar erstellt, die Warnung gibt jedoch an, dass es sich nicht um ein Standard-COM-Objekt handelt.