Delen via


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