Tworzenie obiektów .NET i COM

Ten przykład działa tylko na platformach Windows.

Istnieją składniki oprogramowania z interfejsami .NET Framework i COM, które umożliwiają wykonywanie wielu zadań administracyjnych systemu. Program PowerShell umożliwia korzystanie z tych składników, dlatego nie jest ograniczony do zadań, które można wykonywać za pomocą poleceń cmdlet. Wiele poleceń cmdlet w początkowej wersji programu PowerShell nie działa na komputerach zdalnych. Pokażemy, jak obejść to ograniczenie podczas zarządzania dziennikami zdarzeń przy użyciu klasy .NET Framework System.Diagnostics.EventLog bezpośrednio z poziomu programu PowerShell.

Używanie obiektu New-Object na potrzeby dostępu do dziennika zdarzeń

Biblioteka klas programu .NET Framework zawiera klasę o nazwie System.Diagnostics.EventLog , która może służyć do zarządzania dziennikami zdarzeń. Możesz utworzyć nowe wystąpienie klasy .NET Framework przy użyciu New-Object polecenia cmdlet z parametrem TypeName . Na przykład następujące polecenie tworzy odwołanie do dziennika zdarzeń:

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

Mimo że polecenie utworzyło wystąpienie klasy EventLog , wystąpienie nie zawiera żadnych danych. jest to spowodowane tym, że nie określiliśmy określonego dziennika zdarzeń. Jak uzyskać prawdziwy dziennik zdarzeń?

Używanie konstruktorów z obiektem New-Object

Aby odwołać się do określonego dziennika zdarzeń, należy określić nazwę dziennika. New-Objectma parametr ArgumentList. Argumenty przekazywane jako wartości do tego parametru są używane przez specjalną metodę uruchamiania obiektu. Metoda jest nazywana konstruktorem, ponieważ jest używana do konstruowania obiektu. Aby na przykład uzyskać odwołanie do dziennika aplikacji, należy określić ciąg "Aplikacja" jako argument:

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

Uwaga

Ponieważ większość klas platformy .NET znajduje się w przestrzeni nazw systemowej , program PowerShell automatycznie próbuje znaleźć klasy określone w przestrzeni nazw systemowej , jeśli nie może znaleźć dopasowania dla określonej nazwy typu. Oznacza to, że można określić Diagnostics.EventLog zamiast System.Diagnostics.EventLog.

Przechowywanie obiektów w zmiennych

Możesz chcieć przechowywać odwołanie do obiektu, aby można było go użyć w bieżącej powłoce. Chociaż program PowerShell umożliwia wykonywanie dużej ilości pracy z potokami, zmniejszenie zapotrzebowania na zmienne, czasami przechowywanie odwołań do obiektów w zmiennych ułatwia manipulowanie tymi obiektami.

Dane wyjściowe z dowolnego prawidłowego polecenia programu PowerShell można przechowywać w zmiennej. Nazwy zmiennych zawsze zaczynają się od $. Jeśli chcesz przechowywać odwołanie do dziennika aplikacji w zmiennej o nazwie $AppLog, wpisz nazwę zmiennej, a następnie znak równości, a następnie wpisz polecenie użyte do utworzenia obiektu dziennika aplikacji:

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

Jeśli następnie wpiszesz ciąg $AppLog, zobaczysz, że zawiera on dziennik aplikacji:

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

Uzyskiwanie dostępu do zdalnego dziennika zdarzeń za pomocą polecenia New-Object

Polecenia używane w poprzedniej sekcji dotyczą komputera lokalnego; polecenie Get-EventLog cmdlet może to zrobić. Aby uzyskać dostęp do dziennika aplikacji na komputerze zdalnym, należy podać zarówno nazwę dziennika, jak i nazwę komputera (lub adres IP) jako argumenty.

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

Teraz, gdy mamy odwołanie do dziennika zdarzeń przechowywanego w zmiennej $RemoteAppLog , jakie zadania możemy wykonać na nim?

Czyszczenie dziennika zdarzeń za pomocą metod obiektów

Obiekty często mają metody, które mogą być wywoływane w celu wykonywania zadań. Można użyć Get-Member polecenia , aby wyświetlić metody skojarzone z obiektem. Następujące polecenie i wybrane dane wyjściowe pokazują niektóre metody klasy 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...

Metody Clear() można użyć do wyczyszczenia dziennika zdarzeń. Podczas wywoływania metody należy zawsze postępować zgodnie z nazwą metody nawiasami, nawet jeśli metoda nie wymaga argumentów. Dzięki temu program PowerShell rozróżnia metodę i potencjalną właściwość o tej samej nazwie. Wpisz następujące polecenie, aby wywołać metodę Clear :

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

Zwróć uwagę, że dziennik zdarzeń został wyczyszczone, a teraz zawiera 0 wpisów zamiast 262.

Tworzenie obiektów COM za pomocą obiektu New-Object

Możesz użyć New-Object polecenia , aby pracować ze składnikami modelu obiektów składników (COM). Składniki obejmują różne biblioteki dołączone do hosta skryptów systemu Windows (WSH) do aplikacji ActiveX, takich jak Internet Explorer, które są instalowane w większości systemów.

New-Object Używa otoek wywoływanych przez środowisko uruchomieniowe .NET Framework do tworzenia obiektów COM, dlatego ma te same ograniczenia, które program .NET Framework wykonuje podczas wywoływania obiektów COM. Aby utworzyć obiekt COM, należy określić parametr ComObject za pomocą identyfikatora programowego lub ProgId klasy COM, której chcesz użyć. Pełna dyskusja na temat ograniczeń użycia modelu COM i określenia, jakie identyfikatory ProgId są dostępne w systemie, wykracza poza zakres przewodnika tego użytkownika, ale większość znanych obiektów ze środowisk, takich jak WSH, może być używana w programie PowerShell.

Obiekty WSH można utworzyć, określając następujące progidy: WScript.Shell, WScript.Network, Scripting.Dictionary i Scripting.FileSystemObject. Następujące polecenia tworzą te obiekty:

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

Chociaż większość funkcji tych klas jest udostępniana na inne sposoby w programie Windows PowerShell, kilka zadań, takich jak tworzenie skrótów, jest nadal łatwiejsze do wykonania przy użyciu klas WSH.

Tworzenie skrótu klasycznego za pomocą biblioteki WScript.Shell

Jednym z zadań, które można wykonać szybko za pomocą obiektu COM, jest utworzenie skrótu. Załóżmy, że chcesz utworzyć skrót na pulpicie, który łączy się z folderem głównym programu PowerShell. Najpierw należy utworzyć odwołanie do biblioteki WScript.Shell, która będzie przechowywana w zmiennej o nazwie $WshShell:

$WshShell = New-Object -ComObject WScript.Shell

Get-Member działa z obiektami COM, dzięki czemu można eksplorować elementy członkowskie obiektu, wpisując:

$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 ma opcjonalny parametr InputObject , którego można użyć zamiast potokowania, aby podać dane wejściowe do Get-Memberelementu . Jeśli zamiast tego użyto polecenia Get-Member -InputObject $WshShell, uzyskasz te same dane wyjściowe, jak pokazano powyżej. Jeśli używasz obiektu InputObject, traktuje argument jako pojedynczy element. Oznacza to, że jeśli w zmiennej istnieje kilka obiektów, Get-Member traktuje je jako tablicę obiektów. Na przykład:

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

Metoda WScript.Shell CreateShortcut akceptuje jeden argument, ścieżkę do pliku skrótu do utworzenia. Możemy wpisać pełną ścieżkę do pulpitu, ale istnieje łatwiejszy sposób. Pulpit jest zwykle reprezentowany przez folder o nazwie Desktop wewnątrz folderu macierzystego bieżącego użytkownika. Program Windows PowerShell ma zmienną $HOME zawierającą ścieżkę do tego folderu. Możemy określić ścieżkę do folderu macierzystego przy użyciu tej zmiennej, a następnie dodać nazwę folderu Desktop i nazwę skrótu do utworzenia, wpisując:

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

Gdy używasz czegoś, co wygląda jak nazwa zmiennej wewnątrz podwójnych cudzysłowów, program PowerShell próbuje zastąpić zgodną wartość. Jeśli używasz pojedynczych cudzysłowów, program PowerShell nie próbuje zastąpić wartości zmiennej. Spróbuj na przykład wpisać następujące polecenia:

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

Teraz mamy zmienną o nazwie $lnk zawierającą nowe odwołanie do skrótów. Jeśli chcesz zobaczyć jego członków, możesz przekazać go potok do Get-Memberelementu . W poniższych danych wyjściowych przedstawiono elementy członkowskie, których musimy użyć, aby zakończyć tworzenie skrótu:

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

Musimy określić ścieżkę TargetPath, czyli folder aplikacji dla programu PowerShell, a następnie zapisać skrót, wywołując metodę Save . Ścieżka folderu aplikacji programu PowerShell jest przechowywana w zmiennej $PSHome, więc możemy to zrobić, wpisując:

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

Korzystanie z programu Internet Explorer z poziomu programu PowerShell

Wiele aplikacji, w tym rodziny aplikacji pakietu Microsoft Office i programu Internet Explorer, można zautomatyzować przy użyciu modelu COM. W poniższych przykładach przedstawiono niektóre typowe techniki i problemy związane z pracą z aplikacjami opartymi na modelu COM.

Wystąpienie programu Internet Explorer można utworzyć, określając identyfikator ProgId programu Internet Explorer, InternetExplorer.Application:

$ie = New-Object -ComObject InternetExplorer.Application

To polecenie uruchamia program Internet Explorer, ale nie powoduje jego widoczności. Jeśli wpiszesz ciąg Get-Process, zobaczysz, że proces o nazwie iexplore jest uruchomiony. W rzeczywistości, jeśli zakończysz działanie programu PowerShell, proces będzie nadal działać. Aby zakończyć iexplore proces, należy ponownie uruchomić komputer lub użyć narzędzia takiego jak Menedżer zadań.

Uwaga

Obiekty COM, które rozpoczynają się jako oddzielne procesy, często nazywane plikami wykonywalnym ActiveX, mogą lub nie mogą wyświetlać okna interfejsu użytkownika podczas uruchamiania. Jeśli tworzą okno, ale nie są widoczne, na przykład w programie Internet Explorer, fokus zwykle przenosi się na pulpit systemu Windows. Aby móc z nim korzystać, musisz uwidocznić okno.

Wpisując polecenie $ie | Get-Member, można wyświetlić właściwości i metody dla programu Internet Explorer. Aby wyświetlić okno programu Internet Explorer, ustaw właściwość Visible na $true, wpisując:

$ie.Visible = $true

Następnie możesz przejść do określonego adresu internetowego Navigate przy użyciu metody :

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

Korzystając z innych elementów członkowskich modelu obiektów programu Internet Explorer, można pobrać zawartość tekstową ze strony sieci Web. Następujące polecenie wyświetla tekst HTML w treści bieżącej strony sieci Web:

$ie.Document.Body.InnerText

Aby zamknąć program Internet Explorer z poziomu programu PowerShell, wywołaj jego Quit() metodę:

$ie.Quit()

Zmienna $ie nie zawiera już prawidłowego odwołania, mimo że nadal wydaje się być obiektem COM. Jeśli spróbujesz go użyć, program PowerShell zwróci błąd automatyzacji:

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

Możesz usunąć pozostałe odwołanie za pomocą polecenia takiego jak $ie = $null, lub całkowicie usunąć zmienną, wpisując:

Remove-Variable ie

Uwaga

Nie ma wspólnego standardu niezależnie od tego, czy pliki wykonywalne ActiveX zakończą działanie, czy nadal będą uruchamiane po usunięciu odwołania do niego. W zależności od okoliczności, takich jak to, czy aplikacja jest widoczna, czy edytowany dokument jest w nim uruchomiony, a nawet czy program PowerShell jest nadal uruchomiony, aplikacja może lub nie może zakończyć działania. Z tego powodu należy przetestować zachowanie zakończenia dla każdego pliku wykonywalnego ActiveX, którego chcesz użyć w programie PowerShell.

Uzyskiwanie ostrzeżeń dotyczących obiektów COM opakowanych w program .NET Framework

W niektórych przypadkach obiekt COM może mieć skojarzony obiekt .NET Framework Runtime-Callable Wrapper (RCW), który jest używany przez New-Objectprogram . Ponieważ zachowanie RCW może różnić się od zachowania normalnego obiektu COM, New-Object ma parametr Strict , aby ostrzec o dostępie RCW. Jeśli określisz parametr Strict , a następnie utworzysz obiekt COM, który używa RCW, zostanie wyświetlony komunikat ostrzegawczy:

$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

Mimo że obiekt jest nadal tworzony, ostrzegasz, że nie jest to standardowy obiekt COM.