.NET- en COM-objecten maken (New-Object)

Er zijn softwareonderdelen met .NET Framework com-interfaces waarmee u veel systeembeheertaken kunt uitvoeren. Windows PowerShell kunt u deze onderdelen gebruiken, zodat u niet beperkt bent tot de taken die kunnen worden uitgevoerd met cmdlets. Veel van de cmdlets in de eerste versie van Windows PowerShell werken niet op externe computers. We laten zien hoe u deze beperking kunt omzeilen bij het rechtstreeks beheren van gebeurtenislogboeken met behulp van de klasse .NET Framework System.Diagnostics.EventLog vanuit Windows PowerShell.

Toegang New-Object gebeurtenislogboek gebruiken

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 maken met behulp van de New-Object cmdlet met de parameter TypeName. Met de volgende opdracht maakt u bijvoorbeeld een verwijzing naar gebeurtenislogboek:

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

Hoewel met de opdracht een exemplaar van de EventLog-klasse is 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-Objectheeft een ArgumentList-parameter. 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 op halen, 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 Framework-kernklassen zijn opgenomen in de systeemnaamruimte, probeert Windows PowerShell automatisch klassen te vinden die u opgeeft in de systeemnaamruimte als er geen overeenkomst kan worden gevonden voor de typenaam die u opgeeft. Dit betekent dat u Diagnostics.EventLog kunt opgeven in plaats van System.Diagnostics.EventLog.

Objecten opslaan in variabelen

Mogelijk wilt u een verwijzing naar een object opslaan, zodat u deze kunt gebruiken in de huidige shell. Hoewel Windows PowerShell u veel werk kunt doen met pijplijnen, is het soms handiger om deze objecten te bewerken door de noodzaak van variabelen te verminderen. Soms is het handiger om verwijzingen naar objecten op te slaan in variabelen.

Windows PowerShell kunt u variabelen maken die in feite benoemde objecten zijn. De uitvoer van een geldige Windows PowerShell kan worden opgeslagen in een variabele. Namen van variabelen beginnen altijd met $ . Als u de naslag voor 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 $AppLog typt, ziet u dat deze 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) als argumenten gebruiken.

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

Welke taken kunnen we uitvoeren nu we een verwijzing hebben naar een gebeurtenislogboek dat is opgeslagen in $RemoteAppLog de variabele?

Een gebeurtenislogboek wissen met objectmethoden

Objecten hebben vaak methoden die kunnen worden aangeroepen om taken uit te voeren. U kunt gebruiken om Get-Member de methoden weer te geven die aan een object zijn gekoppeld. De volgende opdracht en de geselecteerde uitvoer tonen enkele methoden van de klasse EventLog:

$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 methode Clear()' kan worden gebruikt om het gebeurtenislogboek te leeg te maken. Wanneer u een methode aanroept, moet u de naam van de methode altijd tussen haakjes volgen, zelfs als de methode geen argumenten vereist. Hiermee kunt Windows PowerShell maken tussen de methode en een mogelijke eigenschap met dezelfde naam. Typ het volgende om de clear-methode aan te roepen:

$RemoteAppLog.Clear()

Typ het volgende om het logboek weer te geven. U ziet dat het gebeurtenislogboek is geweerd en nu 0 vermeldingen heeft in plaats van 262:

$RemoteAppLog

```Output
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

COM-objecten maken met New-Object

U kunt gebruiken New-Object om te werken met Component Object Model (COM)-onderdelen. 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-Objectgebruikt .NET Framework Runtime-Callable wrappers om COM-objecten te maken, zodat deze dezelfde beperkingen heeft als .NET Framework 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 bepalen welke ProgId's beschikbaar zijn op een systeem valt buiten het bereik van deze gebruikershandleiding, maar de meeste bekende objecten uit omgevingen zoals WSH kunnen worden gebruikt binnen Windows 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 te doen met behulp van de WSH-klassen.

Een snelkoppeling naar 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 wilt maken op uw bureaublad die is koppelingen naar de basismap voor Windows PowerShell. U moet eerst een verwijzing naar WScript.Shell maken, die we opslaan 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 doorspijpen om invoer te leveren aan Get-Member . U krijgt dezelfde uitvoer als hierboven weergegeven als u in plaats daarvan de opdracht Get-Member -InputObject$WshShell. Als u InputObject gebruikt, wordt het argument ervan als één item behandeld. Dit betekent dat als u meerdere objecten in een variabele hebt, deze als een matrix met Get-Member objecten behandelt. Bijvoorbeeld:

$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 doorgaans vertegenwoordigd door een map met de naam Desktop in de startmap van de huidige gebruiker. Windows PowerShell bevat 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 Desktop en de naam voor de snelkoppeling toevoegen door het volgende te typen:

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

Wanneer u iets gebruikt dat lijkt op een variabelenaam tussen dubbele aanhalingstekens, probeert Windows PowerShell een overeenkomende waarde te vervangen. Als u enkele aanhalingstekens gebruikt, Windows PowerShell de variabele waarde niet 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 $lnk naam die een nieuwe snelkoppelingsverwijzing bevat. Als u de leden ervan wilt zien, kunt u deze doorseen 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 TargetPath opgeven. Dit is de toepassingsmap voor Windows PowerShell en vervolgens de snelkoppeling opslaan $lnk door de methode ** Save aan ** te roepen. Het Windows PowerShell toepassingsmap wordt opgeslagen in de variabele , zodat $PSHome we dit kunnen doen door het volgende te typen:

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

Met Internet Explorer van Windows PowerShell

Veel toepassingen (waaronder de Microsoft Office van toepassingen en Internet Explorer) kunnen worden geautomatiseerd met behulp van COM. Internet Explorer worden enkele van de typische technieken en problemen geïllustreerd die betrokken zijn bij het werken met COM-toepassingen.

U maakt een Internet Explorer-instantie door de Internet Explorer ProgId, InternetExplorer.Application op te geven:

$ie = New-Object -ComObject InternetExplorer.Application

Met deze opdracht Internet Explorer gestart, maar wordt deze niet zichtbaar. Als u Get-Process typt, ziet u dat er een proces met de naam iexplore wordt uitgevoerd. Als u de Windows PowerShell, blijft het proces zelfs worden uitgevoerd. U moet de computer opnieuw opstarten of een hulpprogramma zoals Taakbeheer het iexplore-proces beëindigen.

Notitie

COM-objecten die beginnen als afzonderlijke processen, vaak ActiveX uitvoerbare bestanden genoemd, geven al dan niet een gebruikersinterfacevenster weer wanneer ze worden geopend. Als ze een venster maken maar het niet zichtbaar maken, zoals Internet Explorer, wordt de focus over het algemeen verplaatst naar het Windows-bureaublad en moet u het venster zichtbaar maken om erop te kunnen reageren.

Door te $ie | Get-Member typen, kunt u eigenschappen en methoden voor Internet Explorer. Als u het Internet Explorer wilt zien, stelt u de eigenschap Visible in op $true door het volgende te typen:

$ie.Visible = $true

U kunt vervolgens naar een specifiek webadres navigeren met behulp van de methode Navigate:

$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 weergegeven in de hoofdtekst van de huidige webpagina:

$ie.Document.Body.InnerText

Als u uw Internet Explorer vanuit PowerShell wilt sluiten, roept u de methode Quit() aan:

$ie.Quit()

Hierdoor wordt deze geforceerd gesloten. De variabele bevat geen geldige verwijzing meer, hoewel deze nog $ie steeds een COM-object lijkt te zijn. Als u deze probeert te gebruiken, wordt er een automatiseringsfout weergegeven:

$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 ActiveX uitvoerbare bestanden worden afgesloten of blijven worden uitgevoerd 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 Windows PowerShell nog steeds wordt uitgevoerd, kan de toepassing al dan niet worden afgesloten. Daarom moet u het beëindigingsgedrag testen voor elk ActiveX uitvoerbaar bestand dat u wilt gebruiken in Windows PowerShell.

Waarschuwingen ontvangen over .NET Framework-Wrapped COM-objecten

In sommige gevallen kan een COM-object een gekoppelde .NET Framework Runtime-Callable Wrapper of RCW hebben. Dit wordt gebruikt door New-Object . Omdat het gedrag van de RCW kan verschillen van het gedrag van het normale COM-object, heeft een strikte parameter om u te waarschuwen New-Object over 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 inte rop assembly. If
this type exposes different members than the IDispatch members , scripts written to work with this
object might not work if the primary intero p assembly is not installed. At line:1 char:17 + $xl =
New-Object <<<< -ComObject Excel.Application -Strict

Hoewel het object nog steeds is gemaakt, wordt u gewaarschuwd dat het geen standaard COM-object is.