.NET- en COM-objecten maken
Dit voorbeeld wordt alleen uitgevoerd op Windows-platforms.
Er zijn softwareonderdelen met .NET Framework- en COM-interfaces waarmee u veel systeembeheertaken kunt uitvoeren. Met PowerShell kunt u deze onderdelen gebruiken, dus u bent niet beperkt tot de taken die kunnen worden uitgevoerd met behulp van cmdlets. Veel van de cmdlets in de eerste versie van PowerShell werken niet op externe computers. We laten zien hoe u deze beperking kunt omzeilen bij het beheren van gebeurtenislogboeken met behulp van de klasse .NET Framework System.Diagnostics.EventLog rechtstreeks vanuit PowerShell.
Nieuw object gebruiken voor toegang tot gebeurtenislogboeken
De .NET Framework-klassebibliotheek bevat een klasse met de naam System.Diagnostics.EventLog die kan worden gebruikt voor het beheren van gebeurtenislogboeken. U kunt een nieuw exemplaar van een .NET Framework-klasse maken met behulp van de New-Object
cmdlet met de parameter TypeName . Met de volgende opdracht maakt u bijvoorbeeld een verwijzing naar het gebeurtenislogboek:
New-Object -TypeName System.Diagnostics.EventLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
Hoewel de opdracht een exemplaar van de EventLog-klasse heeft gemaakt, bevat het exemplaar geen gegevens. dat komt doordat we geen bepaald gebeurtenislogboek hebben opgegeven. Hoe krijgt u een echt gebeurtenislogboek?
Constructors gebruiken met New-Object
Als u naar een specifiek gebeurtenislogboek wilt verwijzen, moet u de naam van het logboek opgeven. New-Object
heeft een parameter ArgumentList . De argumenten die u als waarden aan deze parameter doorgeeft, worden gebruikt door een speciale opstartmethode van het object. De methode wordt een constructor genoemd omdat deze wordt gebruikt om het object te maken. Als u bijvoorbeeld een verwijzing naar het toepassingslogboek wilt ophalen, geeft u de tekenreeks 'Toepassing' op als argument:
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
16,384 7 OverwriteOlder 2,160 Application
Notitie
Omdat de meeste .NET-klassen zijn opgenomen in de systeemnaamruimte , probeert PowerShell automatisch klassen te vinden die u opgeeft in de systeemnaamruimte als deze geen overeenkomst kan vinden voor de typenaam die u opgeeft. Dit betekent dat u kunt opgeven Diagnostics.EventLog
in plaats van System.Diagnostics.EventLog
.
Objecten opslaan in variabelen
Mogelijk wilt u een verwijzing naar een object opslaan, zodat u dit in de huidige shell kunt gebruiken. Hoewel u met PowerShell veel werk kunt doen met pijplijnen, vermindert u de noodzaak van variabelen, waardoor verwijzingen naar objecten soms in variabelen worden opgeslagen, is het handiger om deze objecten te manipuleren.
De uitvoer van een geldige PowerShell-opdracht kan worden opgeslagen in een variabele. Variabelenamen beginnen altijd met $
. Als u de verwijzing naar het toepassingslogboek wilt opslaan in een variabele met de naam $AppLog
, typt u de naam van de variabele, gevolgd door een gelijkteken en typt u vervolgens de opdracht die wordt gebruikt om het toepassingslogboekobject te maken:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Als u vervolgens typt $AppLog
, ziet u dat het het toepassingslogboek bevat:
$AppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
16,384 7 OverwriteOlder 2,160 Application
Toegang tot een extern gebeurtenislogboek met New-Object
De opdrachten die in de vorige sectie worden gebruikt, zijn gericht op de lokale computer; de Get-EventLog
cmdlet kan dat doen. Als u toegang wilt krijgen tot het toepassingslogboek op een externe computer, moet u zowel de logboeknaam als een computernaam (of IP-adres) opgeven als argumenten.
$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application, 192.168.1.81
$RemoteAppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
512 7 OverwriteOlder 262 Application
Nu we een verwijzing hebben naar een gebeurtenislogboek dat is opgeslagen in de $RemoteAppLog
variabele, welke taken kunnen we hierop uitvoeren?
Een gebeurtenislogboek wissen met objectmethoden
Objecten hebben vaak methoden die kunnen worden aangeroepen om taken uit te voeren. U kunt de Get-Member
methoden weergeven die zijn gekoppeld aan een object. Met de volgende opdracht en de geselecteerde uitvoer worden enkele methoden van de EventLog-klasse weergegeven:
$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...
De Clear()
methode kan worden gebruikt om het gebeurtenislogboek te wissen. Wanneer u een methode aanroept, moet u altijd de naam van de methode tussen haakjes volgen, zelfs als voor de methode geen argumenten zijn vereist. Hierdoor kan PowerShell onderscheid maken tussen de methode en een mogelijke eigenschap met dezelfde naam. Typ het volgende om de Clear-methode aan te roepen:
$RemoteAppLog.Clear()
$RemoteAppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
512 7 OverwriteOlder 0 Application
U ziet dat het gebeurtenislogboek is gewist en nu 0 vermeldingen bevat in plaats van 262.
COM-objecten maken met Nieuw-Object
U kunt gebruiken New-Object
om te werken met COM-onderdelen (Component Object Model). Onderdelen variëren van de verschillende bibliotheken die zijn opgenomen in Windows Script Host (WSH) tot ActiveX-toepassingen zoals Internet Explorer die op de meeste systemen zijn geïnstalleerd.
New-Object
maakt gebruik van .NET Framework Runtime-Callable Wrappers om COM-objecten te maken, dus het heeft dezelfde beperkingen die .NET Framework doet bij het aanroepen van COM-objecten. Als u een COM-object wilt maken, moet u de parameter ComObject opgeven met de programmatische id of ProgId van de COM-klasse die u wilt gebruiken. Een volledige bespreking van de beperkingen van COM-gebruik en het bepalen welke ProgIds beschikbaar zijn op een systeem valt buiten het bereik van de handleiding van deze gebruiker, maar de meest bekende objecten uit omgevingen zoals WSH kunnen worden gebruikt in PowerShell.
U kunt de WSH-objecten maken door deze progids op te geven: WScript.Shell, WScript.Network, Scripting.Dictionary en Scripting.FileSystemObject. Met de volgende opdrachten worden deze objecten gemaakt:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Hoewel de meeste functionaliteit van deze klassen op andere manieren beschikbaar wordt gesteld in Windows PowerShell, zijn een aantal taken zoals het maken van snelkoppelingen nog steeds eenvoudiger om de WSH-klassen te gebruiken.
Een snelkoppeling op het bureaublad maken met WScript.Shell
Een taak die snel kan worden uitgevoerd met een COM-object, is het maken van een snelkoppeling. Stel dat u een snelkoppeling op uw bureaublad wilt maken die is gekoppeld aan de basismap voor PowerShell. U moet eerst een verwijzing maken naar WScript.Shell, die wordt opgeslagen in een variabele met de naam $WshShell
:
$WshShell = New-Object -ComObject WScript.Shell
Get-Member
werkt met COM-objecten, zodat u de leden van het object kunt verkennen door het volgende te typen:
$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
heeft een optionele InputObject-parameter die u kunt gebruiken in plaats van piping om invoer aan te Get-Member
geven. U krijgt dezelfde uitvoer als hierboven als u in plaats daarvan de opdracht Get-Member -InputObject $WshShell hebt gebruikt. Als u InputObject gebruikt, wordt het argument als één item behandeld. Dit betekent dat als u meerdere objecten in een variabele hebt, Get-Member
deze als een matrix met objecten behandelt. Voorbeeld:
$a = 1,2,"three"
Get-Member -InputObject $a
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
De methode WScript.Shell CreateShortcut accepteert één argument, het pad naar het snelkoppelingsbestand dat u wilt maken. We kunnen het volledige pad naar het bureaublad typen, maar er is een eenvoudigere manier. Het bureaublad wordt normaal gesproken vertegenwoordigd door een map met de naam Desktop in de basismap van de huidige gebruiker. Windows PowerShell heeft een variabele $HOME
die het pad naar deze map bevat. We kunnen het pad naar de basismap opgeven met behulp van deze variabele en vervolgens de naam van de map Bureaublad en de naam voor de snelkoppeling toevoegen die u wilt maken door te typen:
$lnk = $WshShell.CreateShortcut("$HOME\Desktop\PSHome.lnk")
Wanneer u iets gebruikt dat lijkt op een variabelenaam tussen dubbele aanhalingstekens, probeert PowerShell een overeenkomende waarde te vervangen. Als u enkele aanhalingstekens gebruikt, probeert PowerShell de variabele waarde niet te vervangen. Typ bijvoorbeeld de volgende opdrachten:
"$HOME\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
'$HOME\Desktop\PSHome.lnk'
$HOME\Desktop\PSHome.lnk
We hebben nu een variabele met de naam $lnk
die een nieuwe snelkoppelingsreferentie bevat. Als u de leden wilt zien, kunt u deze doorsluisen naar Get-Member
. In de onderstaande uitvoer ziet u de leden die we moeten gebruiken om het maken van de snelkoppeling te voltooien:
$lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
Name MemberType Definition
---- ---------- ----------
...
Save Method void Save ()
...
TargetPath Property string TargetPath () {get} {set}
We moeten het TargetPath opgeven, de toepassingsmap voor PowerShell, en vervolgens de snelkoppeling opslaan door de methode aan te Save
roepen. Het pad naar de PowerShell-toepassingsmap wordt opgeslagen in de variabele $PSHome
, zodat we dit kunnen doen door het volgende te typen:
$lnk.TargetPath = $PSHome
$lnk.Save()
Internet Explorer gebruiken vanuit PowerShell
Veel toepassingen, waaronder de Microsoft Office-serie van toepassingen en Internet Explorer, kunnen worden geautomatiseerd met COM. In de volgende voorbeelden ziet u enkele van de typische technieken en problemen die betrekking hebben op het werken met COM-toepassingen.
U maakt een Internet Explorer-exemplaar door de Internet Explorer ProgId, InternetExplorer.Application op te geven:
$ie = New-Object -ComObject InternetExplorer.Application
Met deze opdracht wordt Internet Explorer gestart, maar wordt deze niet zichtbaar. Als u typt Get-Process
, ziet u dat een proces met de naam iexplore
wordt uitgevoerd. Als u PowerShell afsluit, blijft het proces actief. U moet de computer opnieuw opstarten of een hulpprogramma zoals Taakbeheer gebruiken om het iexplore
proces te beëindigen.
Notitie
COM-objecten die worden gestart als afzonderlijke processen, ook wel ActiveX-uitvoerbare bestanden genoemd, kunnen een venster van de gebruikersinterface wel of niet weergeven wanneer ze worden opgestart. Als ze een venster maken, maar het niet zichtbaar maken, zoals Internet Explorer, wordt de focus meestal verplaatst naar het Windows-bureaublad. U moet het venster zichtbaar maken om ermee te communiceren.
Door te typen $ie | Get-Member
, kunt u eigenschappen en methoden voor Internet Explorer weergeven. Als u het Internet Explorer-venster wilt zien, stelt u de eigenschap $true
Visible in op door te typen:
$ie.Visible = $true
U kunt vervolgens met behulp van de Navigate
methode naar een specifiek webadres navigeren:
$ie.Navigate("https://devblogs.microsoft.com/scripting/")
Met andere leden van het Internet Explorer-objectmodel kunt u tekstinhoud ophalen van de webpagina. Met de volgende opdracht wordt de HTML-tekst in de hoofdtekst van de huidige webpagina weergegeven:
$ie.Document.Body.InnerText
Als u Internet Explorer vanuit PowerShell wilt sluiten, roept u de methode aan Quit()
:
$ie.Quit()
De $ie
variabele bevat geen geldige verwijzing meer, ook al lijkt deze nog steeds een COM-object te zijn. Als u deze probeert te gebruiken, retourneert PowerShell een automatiseringsfout:
$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 <<<<
U kunt de resterende verwijzing verwijderen met een opdracht zoals $ie = $null
, of de variabele volledig verwijderen door het volgende te typen:
Remove-Variable ie
Notitie
Er is geen algemene standaard voor het afsluiten of uitvoeren van ActiveX-uitvoerbare bestanden wanneer u een verwijzing naar een bestand verwijdert. Afhankelijk van de omstandigheden, zoals of de toepassing zichtbaar is, of er een bewerkt document wordt uitgevoerd en zelfs of PowerShell nog actief is, kan de toepassing wel of niet worden afgesloten. Daarom moet u het beëindigingsgedrag testen voor elk Uitvoerbaar ActiveX-bestand dat u wilt gebruiken in PowerShell.
Waarschuwingen over .NET Framework-verpakte COM-objecten krijgen
In sommige gevallen heeft een COM-object mogelijk een bijbehorende .NET Framework Runtime Callable Wrapper (RCW) die wordt gebruikt door New-Object
. Omdat het gedrag van de RCW kan afwijken van het gedrag van het normale COM-object, New-Object
heeft een strikte parameter om u te waarschuwen voor RCW-toegang. Als u de parameter Strict opgeeft en vervolgens een COM-object maakt dat gebruikmaakt van een RCW, krijgt u een waarschuwingsbericht:
$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
Hoewel het object nog steeds wordt gemaakt, wordt u gewaarschuwd dat het geen standaard COM-object is.