.NET- és COM-objektumok létrehozása

Ez a minta csak Windows-platformokon fut.

Vannak olyan szoftverösszetevők .NET-keretrendszer és COM-felületekkel, amelyek számos rendszerfelügyeleti feladat elvégzését teszik lehetővé. A PowerShell lehetővé teszi ezeknek az összetevőknek a használatát, így nem korlátozódik a parancsmagokkal végrehajtható feladatokra. A PowerShell kezdeti kiadásának parancsmagjai közül sok nem működik távoli számítógépeken. Bemutatjuk, hogyan lehet megkerülni ezt a korlátozást az eseménynaplók kezelése során a .NET-keretrendszer System.Diagnostics.EventLog osztály használatával közvetlenül a PowerShellből.

A New-Object használata eseménynapló-hozzáféréshez

A .NET-keretrendszer osztálytár tartalmaz egy System.Diagnostics.EventLog nevű osztályt, amely az eseménynaplók kezelésére használható. Egy .NET-keretrendszer osztály új példányát a New-Object TypeName paraméterrel rendelkező parancsmaggal hozhatja létre. A következő parancs például létrehoz egy eseménynapló-hivatkozást:

New-Object -TypeName System.Diagnostics.EventLog
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----

Bár a parancs létrehozta az EventLog osztály egy példányát, a példány nem tartalmaz adatokat. ennek az az oka, hogy nem adtunk meg egy adott eseménynaplót. Hogyan szerezhet be valós eseménynaplót?

Konstruktorok használata New-Object használatával

Egy adott eseménynaplóra való hivatkozáshoz meg kell adnia a napló nevét. New-ObjectArgumentumlista paramétert használ. A paraméternek átadott argumentumokat az objektum egy speciális indítási módszere használja. A metódust konstruktornak nevezzük, mert az objektum létrehozásához használják. Ha például az alkalmazásnaplóra szeretne hivatkozni, argumentumként adja meg az "Alkalmazás" sztringet:

New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Max(K) Retain OverflowAction        Entries Name
------ ------ --------------        ------- ----
16,384      7 OverwriteOlder          2,160 Application

Feljegyzés

Mivel a .NET-osztályok többsége a rendszernévtérben található, a PowerShell automatikusan megkísérli megkeresni a rendszernévtérben megadott osztályokat, ha nem talál egyezést a megadott típusnévvel. Ez azt jelenti, hogy megadhatja ahelyettSystem.Diagnostics.EventLog, hogy .Diagnostics.EventLog

Objektumok tárolása változókban

Érdemes lehet egy objektumra mutató hivatkozást tárolni, hogy az aktuális rendszerhéjban használhassa. Bár a PowerShell sok munkát tesz lehetővé a folyamatokkal, csökkenti a változók iránti igényt, néha az objektumokra mutató hivatkozások változókban való tárolása kényelmesebbé teszi az objektumok manipulálását.

Bármely érvényes PowerShell-parancs kimenete egy változóban tárolható. A változónevek mindig a kezdőbetűvel kezdődnek $. Ha az alkalmazásnapló-hivatkozást egy névvel ellátott $AppLogváltozóban szeretné tárolni, írja be a változó nevét, majd egy egyenlőségjelet, majd írja be az alkalmazásnapló-objektum létrehozásához használt parancsot:

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

Ha ezután beírja $AppLog, láthatja, hogy az alkalmazásnaplót tartalmazza:

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

Távoli eseménynapló elérése New-Object használatával

Az előző szakaszban használt parancsok a helyi számítógépet célják; a Get-EventLog parancsmag képes erre. Ha távoli számítógépen szeretné elérni az alkalmazásnaplót, argumentumként meg kell adnia a napló nevét és a számítógép nevét (vagy IP-címét).

$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application, 192.168.1.81
$RemoteAppLog
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder            262 Application

Most, hogy a változóban $RemoteAppLog tárolt eseménynaplóra hivatkozunk, milyen feladatokat hajthatunk végre rajta?

Eseménynapló törlése objektummetódusokkal

Az objektumok gyakran rendelkeznek olyan metódusokkal, amelyek meghívhatók a feladatok végrehajtásához. Az objektumhoz társított metódusok megjelenítésére használható Get-Member . Az alábbi parancs és a kiválasztott kimenet az EventLog osztály néhány metódusát jeleníti meg:

$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...

A Clear() metódus az eseménynapló törlésére használható. Metódus meghívásakor mindig zárójelek szerint kell követnie a metódus nevét, még akkor is, ha a metódus nem igényel argumentumokat. Így a PowerShell megkülönbözteti a metódust és az azonos nevű potenciális tulajdonságot. Írja be a következőt a Clear metódus meghívásához:

$RemoteAppLog.Clear()
$RemoteAppLog
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

Figyelje meg, hogy az eseménynapló törölve lett, és 262 helyett 0 bejegyzést tartalmaz.

COM-objektumok létrehozása New-Object használatával

New-Object A komponensobjektum-modell (COM) összetevőivel is dolgozhat. Az összetevők a Windows Script Host (WSH) különböző kódtáraitól az ActiveX-alkalmazásokig, például az Internet Explorerig terjednek, amelyek a legtöbb rendszeren telepítve vannak.

New-ObjectCOM-objektumok létrehozásához .NET-keretrendszer Runtime-Callable Burkolókat használ, így ugyanazokkal a korlátozásokkal rendelkezik, mint .NET-keretrendszer a COM-objektumok meghívásakor. COM-objektum létrehozásához meg kell adnia a ComObject paramétert a használni kívánt COM-osztály programozott azonosítójával vagy ProgId azonosítójával . A COM-használat korlátainak teljes körű megvitatása és annak meghatározása, hogy milyen ProgId-k érhetők el a rendszeren, túlmutat a jelen felhasználói útmutató hatókörén, de a környezetekből, például a WSH-ból származó legtöbb jól ismert objektum használható a PowerShellben.

A WSH-objektumokat a következő proxyk megadásával hozhatja létre: WScript.Shell, WScript.Network, Scripting.Dictionary és Scripting.FileSystemObject. A következő parancsok hozzák létre ezeket az objektumokat:

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

Bár ezeknek az osztályoknak a legtöbb funkciója más módon is elérhetővé válik a Windows PowerShellben, néhány feladat, például a parancsikon létrehozása továbbra is könnyebben elvégezhető a WSH-osztályok használatával.

Asztali parancsikon létrehozása a WScript.Shell használatával

A COM-objektumokkal gyorsan végrehajtható egyik feladat egy parancsikon létrehozása. Tegyük fel, hogy létre szeretne hozni egy parancsikont az asztalon, amely a PowerShell kezdőlapjára mutat. Először létre kell hoznia egy WScript.Shell-hivatkozást, amelyet egy következő nevű $WshShellváltozóban tárolunk:

$WshShell = New-Object -ComObject WScript.Shell

Get-Member COM-objektumokkal működik, így a következő beírással vizsgálhatja meg az objektum tagjait:

$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-Memberopcionális InputObject paraméterrel rendelkezik, amelyet a pipálás helyett használhat a bemenet megadásához.Get-Member A fenti kimenettel megegyező kimenetet kapna, ha ehelyett a Get-Member -InputObject $WshShell parancsot használta. Az InputObject használata esetén az argumentumot egyetlen elemként kezeli. Ez azt jelenti, hogy ha egy változóban több objektum is szerepel, Get-Member akkor objektumtömbként kezeli őket. Példa:

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

A WScript.Shell CreateShortcut metódus egyetlen argumentumot fogad el, a létrehozandó parancsikonfájl elérési útját. Beírhatjuk az asztal teljes elérési útját, de van egy egyszerűbb módszer. Az asztalt általában egy Desktop nevű mappa jelöli az aktuális felhasználó kezdőlapjának mappájában. A Windows PowerShell rendelkezik egy változóval $HOME , amely tartalmazza a mappa elérési útját. Ezzel a változóval megadhatja a kezdőmappa elérési útját, majd adja hozzá az Asztali mappa nevét és a létrehozandó parancsikon nevét a következő beírással:

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

Ha olyan változónevet használ, amely dupla idézőjelek között szerepel, a PowerShell megpróbál egyező értéket helyettesíteni. Ha egyszeres idézőjeleket használ, a PowerShell nem próbálja helyettesíteni a változó értékét. Írja be például a következő parancsokat:

"$HOME\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
'$HOME\Desktop\PSHome.lnk'
$HOME\Desktop\PSHome.lnk

Most már van egy változó neve $lnk , amely egy új parancsikon-hivatkozást tartalmaz. Ha látni szeretné a tagjait, akkor a következőre adhatja a csövet Get-Member. Az alábbi kimenet azokat a tagokat jeleníti meg, amelyekre a parancsikon létrehozásához szükségünk van:

$lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
Name             MemberType   Definition
----             ----------   ----------
...
Save             Method       void Save ()
...
TargetPath       Property     string TargetPath () {get} {set}

Meg kell adnunk a TargetPathot, amely a PowerShell alkalmazásmappája, majd menteni kell a parancsikont a Save metódus meghívásával. A PowerShell-alkalmazás mappa elérési útja a változóban $PSHomevan tárolva, így ezt a következő beírással teheti meg:

$lnk.TargetPath = $PSHome
$lnk.Save()

Az Internet Explorer használata a PowerShellből

Számos alkalmazás, köztük a Microsoft Office alkalmazáscsaládja és az Internet Explorer is automatizálható a COM használatával. Az alábbi példák a COM-alapú alkalmazások használatához kapcsolódó tipikus technikákat és problémákat szemléltetik.

Egy Internet Explorer-példányt az Internet Explorer ProgId,InternetExplorer.Application azonosítójának megadásával hozhat létre:

$ie = New-Object -ComObject InternetExplorer.Application

Ez a parancs elindítja az Internet Explorert, de nem teszi láthatóvá. Ha beírja Get-Process, láthatja, hogy egy elnevezett iexplore folyamat fut. Valójában, ha kilép a PowerShellből, a folyamat továbbra is futni fog. A folyamat befejezéséhez újra kell indítania a számítógépet, vagy egy olyan eszközt kell használnia, mint a iexplore Task Manager.

Feljegyzés

Azok a COM-objektumok, amelyek különálló folyamatként indulnak el, úgynevezett ActiveX-végrehajtható elemek lehetnek, vagy nem jelennek meg a felhasználói felület ablakai az indításkor. Ha létrehoznak egy ablakot, de nem teszik láthatóvá, például az Internet Explorert, a fókusz általában a Windows asztalára kerül. Az ablaknak láthatóvá kell tennie az interakcióhoz.

A gépeléssel $ie | Get-Membermegtekintheti az Internet Explorer tulajdonságait és metódusát. Az Internet Explorer ablakának megtekintéséhez állítsa be a Visible tulajdonságot $true a következő beírással:

$ie.Visible = $true

Ezután egy adott webcímre navigálhat a Navigate következő módszerrel:

$ie.Navigate("https://devblogs.microsoft.com/scripting/")

Az Internet Explorer objektummodell más tagjaival lekérheti a szöveges tartalmakat a weblapról. Az alábbi parancs az aktuális weblap törzsében jeleníti meg a HTML-szöveget:

$ie.Document.Body.InnerText

Ha az Internet Explorert a PowerShellből szeretné bezárni, hívja meg a metódust Quit() :

$ie.Quit()

A $ie változó már nem tartalmaz érvényes hivatkozást, annak ellenére, hogy továbbra is COM-objektumnak tűnik. Ha megpróbálja használni, a PowerShell egy automatizálási hibát ad vissza:

$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 <<<<

Eltávolíthatja a fennmaradó hivatkozást egy ilyen $ie = $nullparanccsal, vagy teljesen eltávolíthatja a változót a következő beírással:

Remove-Variable ie

Feljegyzés

Nincs általános szabvány arra vonatkozóan, hogy az ActiveX-végrehajtható fájlok kilépnek-e, vagy továbbra is futnak-e, amikor eltávolít egy hivatkozást. A körülményektől függően , például az alkalmazás látható-e, hogy egy szerkesztett dokumentum fut-e benne, és hogy a PowerShell továbbra is fut-e, előfordulhat, hogy az alkalmazás kilép. Ezért tesztelnie kell a leállítási viselkedést minden Olyan ActiveX-végrehajtható fájl esetében, amelyet a PowerShellben szeretne használni.

Figyelmeztetések .NET-keretrendszer becsomagolt COM-objektumokkal kapcsolatban

Bizonyos esetekben előfordulhat, hogy egy COM-objektumhoz társított .NET-keretrendszer futtatókörnyezet-hívható burkoló (RCW) tartozik, amelyet New-Objecta rendszer használ. Mivel az RCW viselkedése eltérhet a normál COM-objektum viselkedésétől, New-Object szigorú paraméterrel figyelmezteti önt az RCW-hozzáférésre. Ha megadja a Szigorú paramétert, majd létrehoz egy RCW-t használó COM-objektumot, figyelmeztető üzenetet kap:

$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 interop assembly. If
this type exposes different members than the IDispatch members , scripts written to work with this
object might not work if the primary interop assembly isn't installed. At line:1 char:17 + $xl =
New-Object <<<< -ComObject Excel.Application -Strict

Bár az objektum még mindig létrejön, a rendszer figyelmezteti, hogy nem szabványos COM-objektum.