.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-Object
Argumentumlista 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 $AppLog
vá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-Object
COM-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ű $WshShell
vá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-Member
opcioná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 $PSHome
van 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-Member
megtekintheti 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 = $null
paranccsal, 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-Object
a 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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: