.NET ve COM Nesneleri (New-Object) Oluşturma

Birçok sistem yönetimi görevi .NET Framework com arabirimleri ve com arabirimleri ile yazılım bileşenleri vardır. Windows PowerShell bileşenleri kullanmana olanak sağlar, bu nedenle cmdlet'ler kullanılarak gerçekleştirilecek görevlerle sınırlı olmazsınız. İlk sürümde yer alan cmdlet'Windows PowerShell uzak bilgisayarlarda çalışmıyor. Doğrudan .NET Framework System.Diagnostics.EventLog sınıfını kullanarak olay günlüklerini yönetme sırasında bu sınırlamayı nasıl Windows PowerShell.

Olay New-Object Erişimi için Güvenlik Bilgileri Kullanma

Sınıf .NET Framework Kitaplığı, olay günlüklerini yönetmek için kullanılan System.Diagnostics.EventLog adlı bir sınıf içerir. TypeName parametresiyle cmdlet'ini kullanarak bir .NET Framework New-Object sınıfının yeni bir örneğini oluşturabilirsiniz. Örneğin, aşağıdaki komut bir olay günlüğü başvurusu oluşturur:

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

Komut EventLog sınıfının bir örneğini oluşturdu, ancak örnek herhangi bir veri içermez. Bunun nedeni belirli bir olay günlüğü belirtmemizdir. Gerçek olay günlüğünü nasıl elde musunuz?

Oluşturucuları New-Object

Belirli bir olay günlüğüne başvurmak için günlüğün adını belirtmeniz gerekir. New-Object bir ArgumentList parametresine sahip. Bu parametreye değer olarak geçersiniz bağımsız değişkenleri nesnesinin özel bir başlangıç yöntemi tarafından kullanılır. yöntemi, nesnesini oluşturmak için kullanılan bir oluşturucu olarak adlandırılır. Örneğin, Uygulama günlüğüne başvuru almak için 'Application' dizesini bağımsız değişken olarak belirtirsiniz:

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

Not

.NET Framework temel sınıfların çoğu Sistem ad alanına ait olduğu için, Windows PowerShell belirttiğiniz typename için bir eşleşme bulamazsa sistem ad alanı içinde belirttiğiniz sınıfları otomatik olarak bulmaya çalışır. Başka bir ifadeyle System.Diagnostics.EventLog yerine Diagnostics.EventLog belirtesiniz.

Nesneleri Değişkenlere Depolama

Geçerli kabukta kullanmak için bir nesneye başvuru depolamak istiyor olabilirsiniz. Bu Windows PowerShell işlem hatlarıyla çok fazla iş yapma, değişkenlere olan ihtiyacı daha az hale getirirken, bazen nesnelere yapılan başvuruların değişkenlerde depolanması, bu nesneleri işlemeyi daha kullanışlı hale getirir.

Windows PowerShell nesne olarak adlandırılmış değişkenler oluşturmanıza olanak sağlar. Herhangi bir geçerli Windows PowerShell çıkışı bir değişkende depolanmış olabilir. Değişken adları her zaman ile $ başlar. Uygulama günlüğü başvurularını $AppLog adlı bir değişkende depolamak için değişkenin adını ve ardından eşittir işareti yazın ve ardından Uygulama günlüğü nesnesini oluşturmak için kullanılan komutu yazın:

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

Daha sonra $AppLog, Uygulama günlüğünü içerdiğini görebilir:

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

New-Object ile Uzak Olay Günlüğüne Erişme

Önceki bölümde kullanılan komutlar yerel bilgisayarı hedefler; Get-EventLog cmdlet'i bunu yapar. Uzak bir bilgisayarda Uygulama günlüğüne erişmek için, bağımsız değişken olarak hem günlük adını hem de bilgisayar adını (veya IP adresini) s eklisiniz.

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

Artık değişkende depolanan bir olay günlüğüne başvuruya sahip $RemoteAppLog olduğunuza göre, bu günlükte hangi görevleri gerçekleştirebilirsiniz?

Nesne Yöntemleriyle Olay Günlüğünü Temizleme

Nesnelerin genellikle görevleri gerçekleştirmek için çağrılan yöntemleri vardır. bir Get-Member nesnesiyle ilişkili yöntemleri görüntülemek için kullanabilirsiniz. Aşağıdaki komut ve seçilen çıkış, EventLog sınıfının bazı yöntemlerini gösterir:

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

Olay günlüğünü temizlemek için 'Clear()' yöntemi kullanılabilir. Yöntem çağrılırken, yöntem bağımsız değişken gerektirmese bile her zaman yöntem adını parantezle izlemeniz gerekir. Bu, Windows PowerShell ile aynı adla olası bir özelliği birbirinden ayırt etmek için bir yöntem sağlar. Clear yöntemini çağıran aşağıdakini yazın:

$RemoteAppLog.Clear()

Günlüğü görüntülemek için aşağıdakini yazın. Olay günlüğünün temiz olduğunu ve şimdi 262 yerine 0 girdisi olduğunu görüyorsunuz:

$RemoteAppLog

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

New-Object ile COM Nesneleri Oluşturma

Bileşen Nesne New-Object Modeli (COM) bileşenleriyle çalışmak için kullanabilirsiniz. Bileşenler, Windows Script Host (WSH) ile birlikte gelen çeşitli kitaplıklardan, çoğu ActiveX yüklü Internet Explorer gibi farklı uygulamalara kadar birçok farklı kitaplıktan oluşur.

New-ObjectCOM .NET Framework Runtime-Callable oluşturmak için sarmalayıcıları kullanır, bu nedenle COM nesnelerini .NET Framework ile aynı sınırlamalara sahiptir. COM nesnesi oluşturmak için ComObject parametresini kullanmak istediğiniz COM sınıfının Program Tanımlayıcısı veya ProgId değeriyle belirtmeniz gerekir. COM kullanımı sınırlamaları ve sistemde hangi ProgId'ler olduğunu belirlemek bu kullanıcı kılavuzunun kapsamının dışındadır, ancak WSH gibi ortamlardan en iyi bilinen nesneler Windows PowerShell.

Şu progidleri belirterek WSH nesnelerini oluşturabilirsiniz: WScript.Shell, WScript.Network, Scripting.Dictionary ve Scripting.FileSystemObject. Aşağıdaki komutlar bu nesneleri oluşturur:

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

Bu sınıfların işlevlerinin çoğu Windows PowerShell diğer yollarla kullanılabilir hale geliyor olsa da, kısayol oluşturma gibi birkaç görevi WSH sınıflarını kullanarak yapmak yine de daha kolaydır.

WScript.Shell ile Masaüstü Kısayolu Oluşturma

COM nesnesiyle hızlı bir şekilde gerçekleştirilecek görevlerden biri kısayol oluşturmaktır. Masaüstünüzde uygulamanın giriş klasörüne bağlantı olan bir kısayol oluşturmak Windows PowerShell. İlk olarak, $WshShell adlı değişkende depolayacak WScript.Shell'e bir başvuru oluşturmanız $WshShell:

$WshShell = New-Object -ComObject WScript.Shell

Get-Member COM nesneleriyle birlikte çalışır, bu nedenle aşağıdakini yazarak nesnenin üyelerini keşfedebilirsiniz:

$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 , giriş sağlamak için piping yerine kullanabileceğiniz isteğe bağlı bir InputObject parametresine Get-Member sahip. Bunun yerine Get-Member -InputObject komutunu kullanarak komutunu kullanarak yukarıda gösterildiği gibi aynı çıktıyı $WshShell. InputObject kullanırsanız, bağımsız değişkenini tek bir öğe olarak kabul eder. Bu, bir değişkende birden fazla nesne varsa bunları Get-Member bir nesne dizisi olarak işley olduğu anlamına gelir. Örneğin:

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

WScript.Shell CreateShortcut yöntemi tek bir bağımsız değişken kabul eder ve oluşturul edilecek kısayol dosyasının yoludur. Masaüstü için tam yolu yazabilirsiniz ancak bunun daha kolay bir yolu vardır. Masaüstü normalde geçerli kullanıcının giriş klasörünün içinde Desktop adlı bir klasörle temsil edilen bir klasördür. Windows PowerShell klasörün yolunu $Home içeren bir değişkeni vardır. Bu değişkeni kullanarak giriş klasörünün yolunu belirtebilirsiniz ve ardından şunları yazarak Desktop klasörünün adını ve oluşturmak için kısayolun adını ekleyebiliriz:

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

Çift tırnak içinde değişken adına benzer bir şey kullanırken, Windows PowerShell eşleşen bir değerin yerine kullanmaya çalışır. Tek tırnak kullanırsanız, Windows PowerShell değişken değerinin yerine kullanmayı denemez. Örneğin, aşağıdaki komutları yazmayı deneyin:

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

Artık yeni bir kısayol başvurusu $lnk içeren adlı bir değişkenimiz var. Üyelerini görmek için bunu 'a Get-Member yöneltin. Aşağıdaki çıktıda kısayolu oluşturmayı tamamlamak için kullanmamız gereken üyeler gösterilmiştir:

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

Windows PowerShell için uygulama klasörü olan TargetPath'i belirtmemiz ve ardından Save $lnk ** ** kısayolunu kaydetmemiz gerekir. Uygulama Windows PowerShell yolu değişkende depolanır, $PSHome bu nedenle bunu yazarak yapabiliriz:

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

Internet Explorer'den Windows PowerShell

Birçok uygulama (Microsoft Office ailesi ve Internet Explorer dahil) COM kullanılarak otomatik hale kullanılabilir. Internet Explorer COM tabanlı uygulamalarla çalışırken karşılaşılan tipik tekniklerden ve sorunlardan bazıları göstermektedir.

Internet Explorer ProgId, InternetExplorer.Application belirterek bir Internet Explorer örneği oluşturabilirsiniz:

$ie = New-Object -ComObject InternetExplorer.Application

Bu komut Internet Explorer başlatır, ancak görünür hale değildir. Get-Process yazarak iexplore adlı bir sürecin çalıştırılanı olduğunu görebilirsiniz. Aslında, bir Windows PowerShell çıkarsanız işlem çalışmaya devam eder. Bilgisayarı yeniden başlatmanız veya görev yöneticisi gibi bir araç kullanarak iexplore işlemini sona erdirebilirsiniz.

Not

Genellikle yürütülebilir dosyalar olarak adlandırılan ayrı işlemler olarak ActiveX COM nesneleri, başladıkları zaman bir kullanıcı arabirimi penceresi görüntüleniyor olabilir veya görüntülemez. Bir pencere oluştursalar ancak Internet Explorer gibi görünür hale Windows odak genellikle Windows masaüstüne taşınacak ve pencereyle etkileşim kurmak için pencereyi görünür hale gelecek şekilde oluşturmanız gerekir.

$ie | Get-Memberyazarak, dosyanın özelliklerini ve yöntemlerini Internet Explorer. Görünen pencereyi Internet Explorer için Visible özelliğini şu şekilde $true ayarlayın:

$ie.Visible = $true

Daha sonra Navigate yöntemini kullanarak belirli bir Web adresine gidin:

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

Web sayfasından Internet Explorer nesne modelinin diğer üyelerini kullanarak metin içeriğini almak mümkündür. Aşağıdaki komut, geçerli Web sayfasının gövdesinde HTML metnini görüntüler:

$ie.Document.Body.InnerText

PowerShell Internet Explorer den gelen bir kaynağı kapatmak için yöntemini Quit() çağırın:

$ie.Quit()

Bu, kapanmaya zorlar. Değişken, $ie com nesnesi gibi görünüyor olsa bile artık geçerli bir başvuruya sahip değildir. Kullanmayı denerse otomasyon hatası alırsınız:

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

$ie = $null gibi bir komutla kalan başvurudan kaldırabilir veya yazarak değişkeni tamamen kaldırabilirsiniz:

Remove-Variable ie

Not

Bir başvuru kaldıran yürütülebilir ActiveX veya çalışmaya devam etmek için ortak bir standart yoktur. Uygulamanın görünür olup olmadığı, düzenlenmiş bir belgenin içinde çalıştırılıyor olup olmadığı ve hatta uygulamanın hala Windows PowerShell olup olmadığı gibi durumlara bağlı olarak uygulama çıkışa neden olabilir veya çıkılamayabilirsiniz. Bu nedenle, bir dosyada kullanmak istediğiniz her ActiveX dosyanın sonlandırma davranışını test Windows PowerShell.

.NET Framework-Wrapped COM nesneleri hakkında uyarılar alma

bazı durumlarda, bir COM nesnesi ilişkili bir .NET Framework çalışma zamanına çağrılabilir sarmalayıcı veya rcw içerebilir ve bu, tarafından kullanılır New-Object . RCW davranışı normal COM nesnesinin davranışından farklı olabileceğinden, New-Object RCW erişimi konusunda sizi uyarmak Için katı bir parametreye sahiptir. Katı parametresini belirleyip, BIR RCW kullanan bir com nesnesi oluşturursanız, bir uyarı iletisi alırsınız:

$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

Nesne yine de oluşturulsa da, standart bir COM nesnesi olmadığı hakkında uyarılırsınız.