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-Object
ma 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-Member
elementu . 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-Member
elementu . 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-Object
program . 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.