Vytváření objektů .NET a COM

Tato ukázka běží jenom na platformách Windows.

Existují softwarové komponenty s rozhraním .NET Framework a com, které umožňují provádět mnoho úloh správy systému. PowerShell umožňuje používat tyto komponenty, takže nejste omezeni na úlohy, které je možné provádět pomocí rutin. Mnoho rutin v počáteční verzi PowerShellu nefunguje se vzdálenými počítači. Ukážeme si, jak toto omezení obejít při správě protokolů událostí pomocí třídy .NET Framework System.Diagnostics.EventLog přímo z PowerShellu.

Použití nového objektu pro přístup k protokolu událostí

Knihovna tříd rozhraní .NET Framework obsahuje třídu s názvem System.Diagnostics.EventLog , kterou lze použít ke správě protokolů událostí. Novou instanci třídy rozhraní .NET Framework můžete vytvořit pomocí New-Object rutiny s parametrem TypeName . Například následující příkaz vytvoří odkaz na protokol událostí:

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

Přestože příkaz vytvořil instanci třídy EventLog , instance neobsahuje žádná data. je to proto, že jsme nezadali konkrétní protokol událostí. Jak získáte skutečný protokol událostí?

Použití konstruktorů s new-Object

Pokud chcete odkazovat na konkrétní protokol událostí, musíte zadat název protokolu. New-Objectmá parametr ArgumentList. Argumenty, které předáte jako hodnoty tohoto parametru, se používají speciální spouštěcí metodou objektu. Metoda se nazývá konstruktor , protože se používá k vytvoření objektu. Pokud například chcete získat odkaz na protokol aplikace, zadáte řetězec Application jako argument:

New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Max(K) Retain OverflowAction        Entries Name
------ ------ --------------        ------- ----
16,384      7 OverwriteOlder          2,160 Application

Poznámka:

Vzhledem k tomu, že většina tříd .NET je obsažena v systémovém oboru názvů, PowerShell se automaticky pokusí najít třídy, které zadáte v oboru názvů systému, pokud nemůže najít shodu pro zadaný název typu. To znamená, že místo Diagnostics.EventLogSystem.Diagnostics.EventLog.

Ukládání objektů v proměnných

Můžete chtít uložit odkaz na objekt, abyste ho mohli použít v aktuálním prostředí. I když PowerShell umožňuje pracovat s kanály hodně, snižuje potřebu proměnných, někdy ukládání odkazů na objekty v proměnných usnadňuje manipulaci s těmito objekty.

Výstup z libovolného platného příkazu PowerShellu lze uložit do proměnné. Názvy proměnných vždy začínají na $. Pokud chcete uložit odkaz na aplikační protokol do proměnné s názvem $AppLog, zadejte název proměnné, za kterou následuje rovnítko a potom zadejte příkaz použitý k vytvoření objektu protokolu aplikace:

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Pokud pak zadáte $AppLog, uvidíte, že obsahuje protokol aplikace:

$AppLog
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16,384      7 OverwriteOlder          2,160 Application

Přístup ke vzdálenému protokolu událostí pomocí new-object

Příkazy použité v předchozí části cílí na místní počítač; to Get-EventLog může udělat rutina. Pokud chcete získat přístup k protokolu aplikace ve vzdáleném počítači, musíte jako argumenty zadat název protokolu i název počítače (nebo IP adresu).

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

Když teď máme odkaz na protokol událostí uložený v $RemoteAppLog proměnné, jaké úlohy s ní můžeme provádět?

Vymazání protokolu událostí pomocí metod objektů

Objekty často mají metody, které lze volat k provádění úloh. Můžete použít Get-Member k zobrazení metod přidružených k objektu. Následující příkaz a vybraný výstup ukazují některé metody třídy 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...

Metodu Clear() lze použít k vymazání protokolu událostí. Při volání metody je nutné vždy postupovat podle názvu metody závorky, i když metoda nevyžaduje argumenty. To umožňuje PowerShellu rozlišovat mezi metodou a potenciální vlastností se stejným názvem. Zadejte následující příkaz, který zavolá metodu Clear :

$RemoteAppLog.Clear()
$RemoteAppLog
  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application

Všimněte si, že protokol událostí byl vymazán a nyní obsahuje 0 položek místo 262.

Vytváření objektů COM pomocí new-Object

Můžete použít New-Object k práci s komponentami modelu COM (Component Object Model). Komponenty se liší od různých knihoven, které jsou součástí programu Windows Script Host (WSH), až po technologie ActiveX aplikace, jako je Internet Explorer, které jsou nainstalované ve většině systémů.

New-Object používá k vytváření objektů MODELU COM obálky s voláním modulu runtime rozhraní .NET Framework, takže má stejná omezení jako rozhraní .NET Framework při volání objektů MODELU COM. Chcete-li vytvořit objekt COM, je nutné zadat ComObject parametr s Programmatic Identifier nebo ProgId třídy COM, kterou chcete použít. Úplná diskuze o omezeních použití modelu COM a určení dostupných identifikátorů ProgId v systému přesahuje rozsah příručky tohoto uživatele, ale většinu známých objektů z prostředí, jako je WSH, je možné použít v PowerShellu.

Objekty WSH můžete vytvořit zadáním těchtogid: WScript.Shell, WScript.Network, Scripting.Dictionary a Scripting.FileSystemObject. Následující příkazy vytvářejí tyto objekty:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

I když je většina funkcí těchto tříd k dispozici jinými způsoby v prostředí Windows PowerShell, několik úloh, jako je vytvoření zástupce, jsou stále jednodušší pomocí tříd WSH.

Vytvoření zástupce na ploše pomocí WScript.Shellu

Jedním z úkolů, které lze rychle provést pomocí objektu COM, je vytvoření zástupce. Předpokládejme, že chcete na ploše vytvořit zástupce, který odkazuje na domovskou složku powershellu. Nejprve musíte vytvořit odkaz na WScript.Shell, který uložíme do proměnné s názvem $WshShell:

$WshShell = New-Object -ComObject WScript.Shell

Get-Member funguje s objekty MODELU COM, abyste mohli prozkoumat členy objektu zadáním:

$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 má volitelný parametr InputObject , který můžete použít místo pipingu k zadání vstupu pro Get-Member. Pokud byste místo toho použili příkaz Get-Member -InputObject $WshShell, získáte stejný výstup, jak je znázorněno výše. Pokud používáte InputObject, považuje argument za jedinou položku. To znamená, že pokud máte v proměnné několik objektů, Get-Member považuje je za pole objektů. Příklad:

$a = 1,2,"three"
Get-Member -InputObject $a
TypeName: System.Object[]
Name               MemberType    Definition
----               ----------    ----------
Count              AliasProperty Count = Length
...

Metoda WScript.Shell CreateShortcut přijímá jeden argument, cestu k souboru zástupce pro vytvoření. Mohli bychom zadat úplnou cestu k ploše, ale existuje jednodušší způsob. Plocha je obvykle reprezentována složkou s názvem Plocha uvnitř domovské složky aktuálního uživatele. Windows PowerShell má proměnnou $HOME , která obsahuje cestu k této složce. Pomocí této proměnné můžeme zadat cestu k domovské složce a pak přidat název složky Plocha a název zástupce, který chcete vytvořit zadáním:

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

Když použijete něco, co vypadá jako název proměnné uvnitř dvojitých uvozovek, PowerShell se pokusí nahradit odpovídající hodnotu. Pokud použijete jednoduché uvozovky, PowerShell se nepokouší nahradit hodnotu proměnné. Zkuste například zadat následující příkazy:

"$HOME\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
'$HOME\Desktop\PSHome.lnk'
$HOME\Desktop\PSHome.lnk

Teď máme proměnnou s názvem $lnk , která obsahuje nový odkaz na zástupce. Pokud chcete zobrazit jeho členy, můžete ho přát Get-Memberna . Následující výstup ukazuje členy, které potřebujeme použít k dokončení vytváření zástupce:

$lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
Name             MemberType   Definition
----             ----------   ----------
...
Save             Method       void Save ()
...
TargetPath       Property     string TargetPath () {get} {set}

Potřebujeme zadat TargetPath, což je složka aplikace pro PowerShell, a pak zástupce uložit voláním Save metody. Cesta ke složce aplikace PowerShellu je uložená v proměnné $PSHome, takže to můžeme udělat zadáním:

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

Použití Internet Exploreru z PowerShellu

Mnoho aplikací, včetně systém Microsoft Office řady aplikací a Aplikace Internet Explorer, je možné automatizovat pomocí modelu COM. Následující příklady ilustrují některé typické techniky a problémy související s prací s aplikacemi založenými na modelu COM.

Instanci aplikace Internet Explorer vytvoříte zadáním Internet Exploreru ProgId, InternetExplorer.Application:

$ie = New-Object -ComObject InternetExplorer.Application

Tento příkaz spustí Internet Explorer, ale nezviditelní ho. Pokud zadáte Get-Process, uvidíte, že je spuštěný proces iexplore . Pokud ve skutečnosti ukončíte PowerShell, proces se bude dál spouštět. Chcete-li proces ukončit iexplore , musíte počítač restartovat nebo použít nástroj, jako je Správce úloh.

Poznámka:

Objekty COM, které se spouští jako samostatné procesy, běžně označované jako technologie ActiveX spustitelné soubory, mohou nebo nemusí při spuštění zobrazit okno uživatelského rozhraní. Pokud vytvoří okno, ale nezobrazí ho, například Internet Explorer, fokus se obvykle přesune na plochu Windows. Aby bylo okno viditelné, musíte ho zviditelnit, aby s ním mohlo pracovat.

Zadáním $ie | Get-Membermůžete zobrazit vlastnosti a metody aplikace Internet Explorer. Pokud chcete zobrazit okno Internet Exploreru, nastavte vlastnost $true Visible zadáním:

$ie.Visible = $true

Pak můžete pomocí Navigate metody přejít na konkrétní webovou adresu:

$ie.Navigate("https://devblogs.microsoft.com/scripting/")

Pomocí jiných členů objektového modelu Aplikace Internet Explorer je možné načíst textový obsah z webové stránky. Následující příkaz zobrazí text HTML v textu aktuální webové stránky:

$ie.Document.Body.InnerText

Pokud chcete internet Explorer zavřít z PowerShellu, zavolejte jeho Quit() metodu:

$ie.Quit()

Proměnná $ie již neobsahuje platný odkaz, i když se stále zdá být objektem MODELU COM. Pokud se ho pokusíte použít, PowerShell vrátí chybu automatizace:

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

Zbývající odkaz můžete odebrat příkazem, jako je $ie = $null, nebo proměnnou úplně odebrat zadáním:

Remove-Variable ie

Poznámka:

Neexistuje žádný běžný standard pro to, jestli technologie ActiveX spustitelné soubory ukončí nebo se budou dál spouštět, když odeberete odkaz na jeden. V závislosti na okolnostech, jako je například to, jestli je aplikace viditelná, jestli je v něm spuštěný upravený dokument, a dokonce i to, jestli je PowerShell stále spuštěný, může nebo nemusí ukončit aplikaci. Z tohoto důvodu byste měli otestovat chování ukončení pro každý technologie ActiveX spustitelný soubor, který chcete použít v PowerShellu.

Zobrazení upozornění na objekty MODELU COM zabalené rozhraním .NET Framework

V některých případech může objekt COM mít přidruženou obálku rcW (Runtime-Callable Wrapper) rozhraní .NET Framework , kterou používá New-Object. Vzhledem k tomu, že chování RCW se může lišit od chování normálního objektu COM, New-Objectstrict parametr, který vás upozorní na přístup RCW. Pokud zadáte strict parametr a pak vytvoříte objekt COM, který používá RCW, zobrazí se upozornění:

$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

I když je objekt stále vytvořený, zobrazí se upozornění, že se nejedná o standardní objekt MODELU COM.