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