Was ist Windows PowerShell und was isst es? Teil 5: Zugriff auf externe Objekte



Windows-Betriebssysteme unterstützen eine Vielzahl von Objektinfrastrukturen. Sie können Anwendungsprogrammierschnittstellen (APIs) verwenden, um auf sie zuzugreifen. Die Entwicklung vollwertiger Anwendungen ist jedoch nicht immer gerechtfertigt. PowerShell verfügt über spezielle Cmdlets, mit denen Sie interaktiv auf .NET-, COM-, WMI- (CIM) und ADSI-Objekte zugreifen können. Im vierten Teil der Serie haben wir die Grundlagen mit Schwerpunkt auf .NET Core-Klassen gelernt. Jetzt möchten wir das Thema vertiefen und die Funktionen der PowerShell-Interaktion mit externen Objekten verstehen.

Inhaltsverzeichnis:


Arbeiten mit JSON, XML und CSV
Arbeiten mit WMI und CIM
Arbeiten mit COM-Objekten
Arbeiten mit ADSI-Verzeichnisdienst
Formatieren der Ausgabe

Arbeiten Sie mit JSON, XML und CSV


In PowerShell-Skripten müssen Sie häufig JSON-, XML- und CSV-Daten analysieren. Normalerweise tritt dieser Bedarf bei der Arbeit mit Internetdiensten oder mit Konfigurationsdateien auf. Einige Administratoren versuchen, Daten mit regulären Ausdrücken zu analysieren, aber es ist nicht erforderlich, solche Opfer zu bringen: PowerShell verfügt außerdem über spezielle Cmdlets für die Konvertierung in beide Richtungen.



Das JSON-Format ermöglicht die Beschreibung einer Vielzahl von Objekten und ist im Wesentlichen eine Hashtabelle, die verschachtelt werden kann. Das entsprechende Konvertieren eines JSON-Objekts in ein .NET-Objekt mithilfe von PowerShell ist einfach. Da Internetdienste normalerweise eine sehr lange Zeile anstelle einer schön formatierten Datei angeben, kann diese Konvertierung auch für die Arbeit im interaktiven Modus hilfreich sein. Im folgenden Beispiel haben wir eine mehrzeilige Textvariable verwendet, um das JSON-Objekt zu beschreiben:

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



Das umgekehrte Problem wird auf ähnliche Weise gelöst:

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



Die resultierende Zeichenfolge im JSON-Format kann einfach über das Netzwerk an eine andere Anwendung gesendet werden. Dies kann beispielsweise ein RESTful-Service sein. Die Arbeit mit den Cmdlets ConvertFrom-Csv, ConvertTo-Csv und ConvertTo-Xml erfolgt ungefähr auf die gleiche Weise. Wir empfehlen den Lesern, sie selbst zu studieren.

Um mit XML und CSV arbeiten zu können, benötigen wir andere Cmdlets:



Mit diesen Tools müssen Sie verstehen, dass beim Konvertieren eines Binärobjekts in ein Textformat nur der Wert seiner Eigenschaften gespeichert wird, nicht jedoch die Methoden. Das Konvertieren von JSON-, XML- oder CSV-Daten in ein .NET-Objekt mit PowerShell ist nur möglich, wenn es gültig ist.

Arbeiten Sie mit WMI und CIM


Windows Management Instrumentation (WMI) ist eine von Microsoft entwickelte und Windows-angepasste Implementierung des WBEM-Standards (Web-Based Enterprise Management). Es basiert auf der Idee, eine universelle Lösung für die Überwachung der verteilten Informationsumgebung eines Unternehmens und die Verwaltung seiner Komponenten zu schaffen. Die WBEM-Datenstruktur basiert wiederum auf dem Common Information Model (CIM), das einen objektorientierten Ansatz zur Darstellung von Computersystemen implementiert. Die Weiterentwicklung und Unterstützung von WMI unter Windows wurde eingestellt. Microsoft empfiehlt die Verwendung eines ähnlichen Mechanismus für die Verwaltung der Infrastruktur - CIM-Objekte. Um mit ihnen zu arbeiten, wurden in PowerShell 3.0 spezielle Cmdlets angezeigt, die wir parallel zu WMI-Gegenstücken betrachten werden. Wenn der Code Cmdlet-Aufrufe für die Arbeit mit WMI enthält, sollte er nach Möglichkeit neu geschrieben werden.



Im Rahmen des CIM-Modells (es wird auch in WMI verwendet) werden die Betriebssystemdaten in Form von Klassen mit Eigenschaften und Methoden dargestellt. Die Klassen sind hierarchisch geordnet und nach Namespace-Technologie oder Verwaltungsbereich logisch verknüpft. Es gibt einen Root-Root-Namespace mit Unterbereichen: CIMv2, Default, Secutiry und WMI. Zur eindeutigen Identifizierung einer Instanz einer Klasse (eines Objekts) und zur Beschreibung des Status der entsprechenden Ressource werden Klasseneigenschaften verwendet, die normalerweise schreibgeschützt sind. Methoden werden zum Verwalten der Ressource verwendet.

Auf die Klasseninstanz kann über den vollständigen Pfad zugegriffen werden, der die folgende Form hat:

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

Dabei ist
Computername der Name des Computers.
NameSpace - Namespace;
Klassenname - der Name der Klasse;
KeyProperty1 = Wert1, KeyProperty2 = Wert2 - die Eigenschaften des Objekts und die Werte, anhand derer es identifiziert wird.

Vor PowerShell gab es kein einfaches WMI-Tool. Um auf die Objekte zugreifen zu können, mussten Sie ziemlich komplexe Programme in Hochsprachen (C ++, Visual Basic, Java Script) schreiben oder die WMIC-Shell (WMI Command Line, die ebenfalls eingestellt wird) in einer eigenen Sprache studieren. Über PowerShell können WMI-Objekte über die Befehlszeile oder in Skripten auf den durchschnittlichen Benutzer zugegriffen werden. Stellen Sie zunächst eine Verbindung zum WMI-Subsystem her und rufen Sie mithilfe des Cmdlets Get-WmiObject (alias gwmi) eine Liste der verfügbaren Klassen ab. Verwenden Sie das Cmdlet Get-CimClass, um eine Liste der CIM-Klassen abzurufen.

Get-CimClass
Get-WmiObject -List



Wir haben die Klassen auf dem lokalen Computer aufgelistet, aber Sie können eine Verbindung zur Fernbedienung herstellen:

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

oder

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

Standardmäßig stellen die Cmdlets Get-CimClass und Get-WmiObject eine Verbindung zum Namespace Root \ CIMV2 her, in dem eine große Anzahl von Klassen für die Verwaltung des Systems gespeichert ist. Verwenden Sie den Parameter -Namespace, um den Namespace zu ändern:

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

Wenn Sie den Namen der Klasse kennen, ist es nicht schwierig, Instanzen davon zu erhalten. Der folgende Befehl gibt alle Instanzen von Win32_Service zurück, d. H. Auf dem lokalen Computer registrierte Dienste:

Get-WmiObject Win32_Service

Wie bei anderen Objekttypen wird mit Get-Member eine Liste der Eigenschaften und Methoden angezeigt. Auf WMI-Objektmethoden kann direkt oder über das Cmdlet Invoke-WmiMethod zugegriffen werden. Sie können auch Cmdlets für WMI-Objekte zum Sortieren, Filtern, Gruppieren usw. verwenden.

Get-WmiObject Win32_Service | Get-Member



Verwenden Sie das Cmdlet Get-CimInstance, um CIM-Objekte (Instanzen von Klassen) abzurufen. Im Gegensatz zu WMI enthalten die resultierenden CIM-Objekte (resultierende Objekt- oder Klasseninstanzen) keine Klassenmethoden. Da Sie eine Methode nicht direkt extrahieren können, müssen Sie das Cmdlet Invoke-CimMethod aufrufen. Betrachten Sie die Win32_Service-Klasse (auf dem System ausgeführte Dienste) und ihre Instanz für den Spooler-Dienst auf dem lokalen Computer:

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



Schauen wir uns die Struktur des resultierenden Objekts an:

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



Zu diesem Zeitpunkt sind die Vorteile von Cmdlets für die Arbeit mit CIM-Objekten nicht offensichtlich. Sie beziehen sich hauptsächlich auf Remote-Arbeit in einer verteilten Umgebung und werden im letzten Artikel der Reihe zur Lösung praktischer Verwaltungsprobleme ausführlich erörtert.

Es gibt auch ein WMI-spezifisches Toolkit: die WMI Query Language (WQL), eine SQL-ähnliche Abfragesprache. Eine WQL-Abfrage zum Suchen nach allen Starts beim Starten eines Service-Systems sieht folgendermaßen aus:

select * from win32_service where startmode="Auto"

In PowerShell werden sie wie folgt ausgeführt:

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



Arbeiten Sie mit COM-Objekten


Um die Interaktion zwischen Anwendungen in Windows sicherzustellen, wurde eine Technologie zum Verknüpfen und Einbetten von Objekten (Object Linking and Embedding oder OLE) entwickelt. Später erschien die OLE-Automatisierungstechnologie, mit deren Hilfe Automatisierungsclientanwendungen Funktionen anderer Anwendungen aufrufen konnten - Automatisierungsserver. OLE und OLE Automation basierten auf der Kerntechnologie des Component Object Model (COM), das einen einzigen Binärstandard für Softwarekomponenten bietet. Mit ihm erstellte und im Betriebssystem registrierte Objekte können in anderen Anwendungen mit ausführbaren Dateien oder dynamischen Bibliotheken verwendet werden.

Um die Mitte der neunziger Jahre wurde anstelle von OLE ein anderer Begriff verwendet - ActiveX. Vor dem Aufkommen der .NET-Plattform galt die ActiveX-Technologie als Schlüssel, und COM-Objekte werden immer noch aktiv zur Integration von Anwendungen in Windows verwendet. Viele Microsoft- und Drittanbieterprodukte sind Automatisierungsserver und bieten über diese Zugriff auf ihre Dienste. Für den Zugriff auf Objekte wird ProgID verwendet - eine symbolische Kennung, die ihnen bei der Registrierung in der Windows-Registrierung zugewiesen wird. Es hat die folgende Form:

_..

Die Version wird normalerweise nicht angegeben:

_.

Einige Beispiele für verfügbare ProgIDs sind: InternetExplorer.Application (Internet Explorer-Anwendung), Word.Application (Microsoft Word-Anwendung), WScript.Shell (Shell-Klasse vom Windows Script Host- oder WSH-Script Server-Objektmodell).

Sie können eine Instanz des Objekts mit dem im vorherigen Artikel beschriebenen Cmdlet "Neues Objekt" erstellen und dessen Struktur mit "Get-Member" anzeigen :

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



Für die Arbeit mit Objekten werden Eigenschaften und Methoden verwendet. Um beispielsweise eine Verknüpfung auf dem Desktop des Benutzers zu erstellen, müssen Sie die CreateShortcut () -Methode aufrufen:

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

Beachten Sie, dass die Verknüpfung auch ein COM-Objekt ist:

$link | Get-Member



Es bleibt uns überlassen, seine Eigenschaften auszufüllen und zu speichern:

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

Auf diese Weise haben wir eine Verknüpfung auf dem Desktop des aktiven Benutzers erstellt und analysieren nun die Arbeit mit externen Automatisierungsdiensten am Beispiel des Shell.Application COM-Objekts. Damit können Sie einige Aktionen im Windows Explorer automatisieren:

$myshell=New-Object -ComObject Shell.Application

oder kurz:

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



Das Shell.Application-Objekt verfügt über einige verschiedene Fensterverwaltungsmethoden. Um beispielsweise den Inhalt eines bestimmten Verzeichnisses anzuzeigen, wird Explore () verwendet:

$myshell.Explore("c:\")

Das Hilfesystem wird mit der Help () -Methode aufgerufen:

$myshell.Help()


Es gibt auch drei Methoden zum Aufrufen von Suchdialogen: FindFiles (), FindComputer () und FindPrinter ().

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

Sie können den Programmstartdialog mit der FileRun () -Methode öffnen. Um das Fenster zur Einstellung von Datum und Uhrzeit aufzurufen, benötigen Sie die SetTime () -Methode. Es gibt beispielsweise Methoden zum Aufrufen des Einstellungsfensters der Taskleiste, Elemente der Systemsteuerung, die eine der verfügbaren CPL-Dateien angeben, zum Verwalten geöffneter Fenster:

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

Mit der Windows () -Methode können Sie im Explorer oder im Internet Explorer auf die Sammlung geöffneter Fenster zugreifen. Sehen wir uns die Eigenschaften und Methoden an, die für diese Sammlung verfügbar sind:

$myshell.Windows() | Get-Member



Es gibt andere nützliche COM-Objekte, deren Anzahl von der im System installierten Software abhängt. Das Hauptautomatisierungstool in Windows war einst der WSH-Skriptserver, dessen Objektmodell auch COM-Objekte enthält: Entwickelt für die bereits erwähnten Netzwerkfunktionen von WScript.Network und WScript.Shell. Letzteres erstellt nicht nur Verknüpfungen auf dem Desktop, mit dessen Hilfe Sie beispielsweise Informationsfenster mit Meldungen und Schaltflächen anzeigen, zwischen Anwendungen wechseln, Programme starten oder Tastenanschläge simulieren können.

Arbeiten mit dem ADSI-Verzeichnisdienst


Im Allgemeinen bezieht sich ein Katalog auf eine Informationsquelle, in der Daten zu einigen Objekten gespeichert sind. Mit Verzeichnisdienst ist ein Teil eines verteilten Computersystems gemeint, mit dem Sie auf gespeicherte Objekte zugreifen und diese bearbeiten können. Ein Verzeichnisdienst kann Daten zu Netzwerkobjekten und den Diensten, die diese bearbeiten, kombinieren. Er stellt einen einzigen Einstiegspunkt für die Interaktion mit Netzwerkressourcen dar. In einem heterogenen Computernetzwerk können viele solcher Dienste vorhanden sein: ein lokaler SAM (Security Account Manager) für Computer ohne Domäne, Active Directory usw.

Die Interaktion mit verschiedenen Verzeichnisdiensten erfordert unterschiedliche Tools, was zu gewissen Unannehmlichkeiten führt. Ab Windows 2000 hat Microsoft die ADSI-Technologie (Unified Active Directory Service Interface) für Betriebssysteme eingeführt, die nicht von einem bestimmten Netzwerkzugriffsprotokoll abhängig sind. Um Objekte zu finden, wird ein Namespace für das Verzeichnis definiert. Da verschiedene Verzeichnisdienste unterschiedliche Benennungsmethoden verwenden, definiert ADSI eine Konvention, die jedes Objekt eindeutig identifiziert. Das Konzept der zweiteiligen Bindungszeichenfolgen oder ADsPath wird vorgestellt. Der erste Teil des Namens definiert den Verzeichnisdienst (ADSI-Anbieter) und der zweite den Speicherort des Objekts im Verzeichnis. Hier sind Beispiele für die Bezeichnung verschiedener ADSI-Anbieter:

LDAP: //wird für LDAP-basierte Verzeichnisdienste verwendet, einschließlich für Active Directory;

WinNT: // wird für lokale Computer verwendet.

Es gibt keine speziellen Cmdlets für die Arbeit mit ADSI in PowerShell. Stattdessen wird der Cast-Operator [ADSI] gefolgt von einer Bindungszeichenfolge verwendet. Um beispielsweise über die Domäne test.ru eine Verbindung zum Benutzer Ivanov herzustellen, ist die folgende Konstruktion erforderlich:

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

Um mit lokalen Konten arbeiten zu können, müssen Sie eine Verbindung zum Computer mit dem entsprechenden Namen herstellen (um eine Verbindung zum lokalen Computer herzustellen, verwenden Sie einfach den Punkt anstelle des Namens):

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

Erstellen Sie beispielsweise einen neuen Benutzer, Ivanov, auf dem lokalen Computer:

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

Verbinden Sie sich jetzt damit:

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



Ausgabeformatierung


Interaktive Arbeit erfordert häufig die Anzeige von Daten. In anderen Shells sind die Befehle und Dienstprogramme selbst mit der Formatierung der Ausgabe beschäftigt, aber binäre Objekte, die von Funktionen und Cmdlets zurückgegeben werden, wissen normalerweise nicht, wie dies zu tun ist. In PowerShell wird die Ausgabe von vier speziellen Cmdlets formatiert, die Objekte durch die Pipeline führen. Detailliertere Informationen erhalten Sie mit Get-Help:

Format-Table formatiert die Ausgabe in Form einer Tabelle, deren Spalten die Werte der Objekteigenschaften oder berechneten Werte enthalten. Die Möglichkeit, Daten zu gruppieren, wird unterstützt.

Format-List zeigt das Objekt als Liste von Eigenschaften an, von denen jede in einer neuen Zeile angezeigt wird. Die Möglichkeit, Daten zu gruppieren, wird unterstützt.

Format-benutzerdefiniertFormate, die mithilfe einer benutzerdefinierten Ansicht ausgegeben werden;

Formatweit formatiert Objekte in Form einer breiten Tabelle, in der nur eine Eigenschaft jedes Objekts angezeigt wird.

Wenn keines der aufgelisteten Cmdlets aufgerufen wird, wird das Formatierungsmodul verwendet, das dem angezeigten Datentyp entspricht. Anzeigeregeln werden in Konfigurationsdateien im XML-Format mit der Erweiterung .ps1xml gespeichert, die sich im Verzeichnis $ PSHome befinden. Eine Liste von ihnen kann mit dem folgenden Befehl abgerufen werden:

dir $pshome\*format*.ps1xm

Das manuelle Bearbeiten von Konfigurationsdateien wird nicht empfohlen. Es ist besser, eigene Dateien zu erstellen und diese mit dem Cmdlet Update-FormatData in die Liste der heruntergeladenen Dateien aufzunehmen. Wenn der Standardformatierer für den gewünschten Typ nicht definiert ist, zeigt PowerShell die Eigenschaften des Objekts auf dem Bildschirm in einer Liste an.

Damit ist die Beschreibung der Arbeit mit Objekten in PowerShell abgeschlossen. Der letzte Artikel der Reihe befasst sich mit der Lösung praktischer Probleme bei der Verwaltung einer verteilten Informationsumgebung eines Unternehmens. Darin sind alle beschriebenen Werkzeuge für uns nützlich. Das Hauptaugenmerk wird auf CIM-Objekten und deren Vergleich mit WMI liegen. Frühere Teile finden Sie unter den folgenden Links.



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


All Articles