Aracılığıyla paylaş


.NET ve COM nesneleri oluşturma

Bu örnek yalnızca Windows platformlarında çalışır.

Birçok sistem yönetimi görevini gerçekleştirmenizi sağlayan .NET Framework ve COM arabirimlerine sahip yazılım bileşenleri vardır. PowerShell bu bileşenleri kullanmanıza olanak tanır, bu nedenle cmdlet'ler kullanılarak gerçekleştirilebilecek görevlerle sınırlı değilsiniz. PowerShell'in ilk sürümündeki cmdlet'lerin çoğu uzak bilgisayarlarda çalışmaz. Doğrudan PowerShell'den .NET Framework System.Diagnostics.EventLog sınıfını kullanarak olay günlüklerini yönetirken bu sınırlamanın nasıl aşılacağını göstereceğiz.

Olay günlüğü erişimi için New-Object kullanma

.NET Framework Sınıf Kitaplığı, olay günlüklerini yönetmek için kullanılabilecek System.Diagnostics.EventLog adlı bir sınıf içerir. TypeName parametresiyle cmdlet'ini New-Object kullanarak .NET Framework 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
  ------ ------ --------------        ------- ----

Komutu EventLog sınıfının bir örneğini oluşturmuş olsa da, örnek herhangi bir veri içermez. Bunun nedeni, belirli bir olay günlüğü belirtmemiş olmamızdır. Gerçek bir olay günlüğünü nasıl edinebilirsiniz?

Oluşturucuları New-Object ile kullanma

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

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

Not

.NET sınıflarının çoğu Sistem ad alanında yer aldığı için PowerShell, belirttiğiniz tür adı için bir eşleşme bulamazsa Sistem ad alanında belirttiğiniz sınıfları otomatik olarak bulmaya çalışır. Bu, yerine System.Diagnostics.EventLogbelirtebileceğiniz Diagnostics.EventLog anlamına gelir.

Nesneleri Değişkenlerde Depolama

Geçerli kabukta kullanabilmek için bir nesneye başvuru depolamak isteyebilirsiniz. PowerShell işlem hatlarıyla çok fazla çalışma yapmanıza olanak tanır, ancak değişkenlere olan ihtiyacı azaltsa da, bazen değişkenlerdeki nesnelere yönelik başvuruları depolamak bu nesneleri işlemeyi daha kolay hale getirir.

Geçerli bir PowerShell komutunun çıkışı bir değişkende depolanabilir. Değişken adları her zaman ile $başlar. Uygulama günlüğü başvurusunu adlı $AppLogbir değişkende depolamak istiyorsanız değişkenin adını ve ardından eşittir işaretini 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 yazarsanız $AppLog, Uygulama günlüğünü içerdiğini görebilirsiniz:

$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 yapabilir. Uzak bilgisayardaki Uygulama günlüğüne erişmek için hem günlük adını hem de bilgisayar adını (veya IP adresini) bağımsız değişken olarak sağlamanız gerekir.

$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 $RemoteAppLog depolanan bir olay günlüğüne başvurumuz olduğuna göre, bu değişkende hangi görevleri gerçekleştirebiliriz?

Nesne yöntemleriyle olay günlüğünü temizleme

Nesneler genellikle görevleri gerçekleştirmek için çağrılabilen yöntemlere sahiptir. Bir nesneyle ilişkili yöntemleri görüntülemek için kullanabilirsiniz Get-Member . Aşağıdaki komut ve seçili çı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...

Clear() yöntemi, olay günlüğünü temizlemek için kullanılabilir. Bir yöntemi çağırırken, yöntem bağımsız değişken gerektirmese bile yöntem adını her zaman parantezlere göre izlemeniz gerekir. Bu, PowerShell'in yöntemiyle aynı ada sahip olası bir özelliği ayırt etmesine olanak tanır. Clear yöntemini çağırmak için aşağıdakileri yazın:

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

Olay günlüğünün temizlendiğine ve artık 262 yerine 0 girişe sahip olduğuna dikkat edin.

New-Object ile COM nesneleri oluşturma

Bileşen Nesne Modeli (COM) bileşenleriyle çalışmak için kullanabilirsiniz New-Object . Bileşenler, Windows Betik Konağı'na (WSH) dahil edilen çeşitli kitaplıklardan çoğu sistemde yüklü olan Internet Explorer gibi ActiveX uygulamalarına kadar değişir.

New-Object COM nesneleri oluşturmak için .NET Framework Runtime-Çağrılabilen Sarmalayıcılar kullanır, bu nedenle .NET Framework'ün COM nesnelerini çağırırken yaptığı sınırlamalarla aynı sınırlamalara sahiptir. COM nesnesi oluşturmak için, kullanmak istediğiniz COM sınıfının Programlı Tanımlayıcısı veya ProgId değeriyle ComObject parametresini belirtmeniz gerekir. COM kullanımı sınırlamalarının tam bir tartışması ve sistemde hangi ProgId'lerin kullanılabilir olduğunu belirleme, bu kullanıcı kılavuzunun kapsamı dışındadır, ancak WSH gibi ortamlardaki en iyi bilinen nesneler PowerShell'de kullanılabilir.

WScript.Shell, WScript.Network, Scripting.Dictionary ve Scripting.FileSystemObject değerlerini belirterek WSH nesnelerini oluşturabilirsiniz. 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'de başka yollarla kullanılabilir hale getiriliyor olsa da, kısayol oluşturma gibi birkaç görevi WSH sınıflarını kullanarak yapmak hala daha kolaydır.

WScript.Shell ile masaüstü kısayolu oluşturma

COM nesnesiyle hızlı bir şekilde gerçekleştirilebilecek görevlerden biri kısayol oluşturmaktır. Masaüstünüzde PowerShell'in giriş klasörüne bağlanan bir kısayol oluşturmak istediğinizi varsayalım. İlk olarak adlı $WshShellbir değişkende depoladığımız WScript.Shell'e bir başvuru oluşturmanız gerekir:

$WshShell = New-Object -ComObject WScript.Shell

Get-Member com nesneleri ile çalışır, böylece 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 , öğesine giriş sağlamak için piping yerine kullanabileceğiniz isteğe bağlı bir InputObject parametresine Get-Membersahiptir. Bunun yerine Get-Member -InputObject $WshShell komutunu kullandıysanız, yukarıda gösterildiği gibi aynı çıktıyı alırsınız. InputObject kullanırsanız bağımsız değişkenini tek bir öğe olarak değerlendirir. Bu, değişkende birkaç nesneniz varsa bunları Get-Member bir nesne dizisi olarak değerlendirdiği 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, oluşturulacak kısayol dosyasının yolu olan tek bir bağımsız değişkeni kabul eder. Masaüstünün tam yolunu yazabiliriz, ancak bunun daha kolay bir yolu vardır. Masaüstü normalde geçerli kullanıcının giriş klasörünün içinde Masaüstü adlı bir klasörle temsil edilir. Windows PowerShell'de bu klasörün yolunu içeren bir değişken $HOME vardır. Bu değişkeni kullanarak giriş klasörünün yolunu belirtebilir ve ardından masaüstü klasörünün adını ve oluşturulacak kısayolun adını yazarak ekleyebiliriz:

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

Çift tırnak içinde değişken adı gibi görünen bir şey kullandığınızda, PowerShell eşleşen bir değeri kullanmaya çalışır. Tek tırnak kullanıyorsanız PowerShell değişken değerini değiştirmeyi 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 içeren adlı $lnk bir değişkenimiz var. Üyelerini görmek istiyorsanız, öğesine Get-Memberkanal oluşturabilirsiniz. Aşağıdaki çıkış, kısayolumuzu oluşturmayı tamamlamak için kullanmamız gereken üyeleri gösterir:

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

PowerShell'in uygulama klasörü olan TargetPath'i belirtmemiz ve ardından yöntemini çağırarak kısayolu Save kaydetmemiz gerekir. PowerShell uygulama klasörü yolu değişkeninde $PSHomedepolanır, bu nedenle şunu yazarak bunu yapabiliriz:

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

PowerShell'den Internet Explorer kullanma

Microsoft Office uygulama ailesi ve Internet Explorer dahil olmak üzere birçok uygulama COM kullanılarak otomatikleştirilebilir. Aşağıdaki örneklerde, COM tabanlı uygulamalarla çalışmayla ilgili bazı tipik teknikler ve sorunlar gösterilmektedir.

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

$ie = New-Object -ComObject InternetExplorer.Application

Bu komut Internet Explorer'ı başlatır, ancak görünür yapmaz. yazarsanız Get-Processadlı iexplore bir işlemin çalıştığını görebilirsiniz. Aslında, PowerShell'dan çıkarsanız işlem çalışmaya devam eder. İşlemi sonlandırmak iexplore için bilgisayarı yeniden başlatmanız veya Görev Yöneticisi gibi bir araç kullanmanız gerekir.

Not

Genellikle ActiveX yürütülebilir dosyaları olarak adlandırılan ayrı işlemler olarak başlayan COM nesneleri, başlatıldığında bir kullanıcı arabirimi penceresi görüntüleyebilir veya görüntülemeyebilir. Bir pencere oluşturur ancak Internet Explorer gibi görünür hale getirmezlerse, odak genellikle Windows masaüstüne taşınır. Pencereyle etkileşimde bulunmak için pencereyi görünür hale getirmeniz gerekir.

yazarak $ie | Get-MemberInternet Explorer özelliklerini ve yöntemlerini görüntüleyebilirsiniz. Internet Explorer penceresini görmek için şunu yazarak Visible özelliğini $true olarak ayarlayın:

$ie.Visible = $true

Ardından yöntemini kullanarak Navigate belirli bir Web adresine gidebilirsiniz:

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

Internet Explorer nesne modelinin diğer üyelerini kullanarak, Web sayfasından metin içeriği 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

Internet Explorer'ı PowerShell'in içinden kapatmak için yöntemini çağırın Quit() :

$ie.Quit()

Değişken $ie , com nesnesi gibi görünse bile artık geçerli bir başvuru içermiyor. Kullanmayı denerseniz PowerShell bir otomasyon hatası döndürür:

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

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

Remove-Variable ie

Not

Bir başvuruyu kaldırdığınızda ActiveX yürütülebilir dosyalarından çıkılıp çıkılmayacağı veya çalışmaya devam edilmeyeceği konusunda yaygın bir standart yoktur. Uygulamanın görünür olup olmadığı, düzenlenen bir belgenin çalışıp çalışmadığı ve PowerShell'in hala çalışıp çalışmadığı gibi koşullara bağlı olarak uygulamadan çıkılabilir veya olmayabilir. Bu nedenle, PowerShell'de kullanmak istediğiniz her ActiveX yürütülebilir dosyası için sonlandırma davranışını test etmelisiniz.

.NET Framework sarmalanmış COM nesneleri hakkında uyarılar alma

Bazı durumlarda, bir COM nesnesinin tarafından New-Objectkullanılan ilişkili bir .NET Framework Runtime-Callable Wrapper (RCW) olabilir. RCW'nin davranışı normal COM nesnesinin davranışından farklı olabileceğinden, New-Object RCW erişimi konusunda sizi uyarmak için Strict parametresi vardır. Strict parametresini belirtir ve ardından 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 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

Nesne hala oluşturulmuş olsa da, standart bir COM nesnesi olmadığı konusunda uyarılırsınız.