Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Sampel ini hanya berjalan pada platform Windows.
Ada komponen perangkat lunak dengan antarmuka .NET Framework dan COM yang memungkinkan Anda melakukan banyak tugas administrasi sistem. PowerShell memungkinkan Anda menggunakan komponen ini, sehingga Anda tidak terbatas pada tugas yang dapat dilakukan dengan menggunakan cmdlet. Banyak cmdlet dalam rilis awal PowerShell tidak berfungsi terhadap komputer jarak jauh. Kami akan menunjukkan cara mengatasi batasan ini saat mengelola log peristiwa dengan menggunakan kelas .NET Framework System.Diagnostics.EventLog langsung dari PowerShell.
Menggunakan New-Object untuk akses log peristiwa
Pustaka Kelas .NET Framework menyertakan kelas bernama System.Diagnostics.EventLog yang dapat digunakan untuk mengelola log peristiwa. Anda dapat membuat instans baru kelas .NET Framework dengan menggunakan New-Object cmdlet dengan parameter TypeName . Misalnya, perintah berikut membuat referensi log peristiwa:
New-Object -TypeName System.Diagnostics.EventLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
Meskipun perintah telah membuat instans kelas EventLog , instans tidak menyertakan data apa pun. itu karena kami tidak menentukan log peristiwa tertentu. Bagaimana Anda mendapatkan log peristiwa nyata?
Menggunakan konstruktor dengan New-Object
Untuk merujuk ke log peristiwa tertentu, Anda perlu menentukan nama log. New-Object memiliki parameter ArgumentList . Argumen yang Anda teruskan sebagai nilai ke parameter ini digunakan oleh metode startup khusus objek. Metode ini disebut konstruktor karena digunakan untuk membangun objek. Misalnya, untuk mendapatkan referensi ke log Aplikasi, Anda menentukan string 'Aplikasi' sebagai argumen:
New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
16,384 7 OverwriteOlder 2,160 Application
Catatan
Karena sebagian besar kelas .NET terkandung dalam namespace layanan Sistem , PowerShell secara otomatis mencoba menemukan kelas yang Anda tentukan di namespace sistem jika tidak dapat menemukan kecocokan untuk nama jenis yang Anda tentukan. Ini berarti Anda dapat menentukan Diagnostics.EventLog alih-alih System.Diagnostics.EventLog.
Menyimpan Objek dalam Variabel
Anda mungkin ingin menyimpan referensi ke objek, sehingga Anda dapat menggunakannya di shell saat ini. Meskipun PowerShell memungkinkan Anda melakukan banyak pekerjaan dengan alur, mengurangi kebutuhan akan variabel, terkadang menyimpan referensi ke objek dalam variabel membuatnya lebih nyaman untuk memanipulasi objek tersebut.
Output dari perintah PowerShell yang valid dapat disimpan dalam variabel. Nama variabel selalu dimulai dengan $. Jika Anda ingin menyimpan referensi log Aplikasi dalam variabel bernama $AppLog, ketik nama variabel, diikuti dengan tanda sama dengan lalu ketik perintah yang digunakan untuk membuat objek log Aplikasi:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
Jika Anda kemudian mengetik $AppLog, Anda dapat melihat bahwa itu berisi log Aplikasi:
$AppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
16,384 7 OverwriteOlder 2,160 Application
Mengakses log peristiwa jarak jauh dengan New-Object
Perintah yang digunakan di bagian sebelumnya menargetkan komputer lokal; Get-EventLog cmdlet dapat melakukan itu. Untuk mengakses log Aplikasi pada komputer jarak jauh, Anda harus menyediakan nama log dan nama komputer (atau alamat IP) sebagai argumen.
$RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application, 192.168.1.81
$RemoteAppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
512 7 OverwriteOlder 262 Application
Sekarang setelah kita memiliki referensi ke log peristiwa yang disimpan dalam $RemoteAppLog variabel, tugas apa yang dapat kita lakukan di atasnya?
Menghapus log peristiwa dengan metode objek
Objek sering memiliki metode yang dapat dipanggil untuk melakukan tugas. Anda dapat menggunakan Get-Member untuk menampilkan metode yang terkait dengan objek. Perintah berikut dan output yang dipilih menunjukkan beberapa metode kelas 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...
Metode Clear() ini dapat digunakan untuk menghapus log peristiwa. Saat memanggil metode, Anda harus selalu mengikuti nama metode dengan tanda kurung, bahkan jika metode tidak memerlukan argumen. Ini memungkinkan PowerShell membedakan antara metode dan properti potensial dengan nama yang sama. Ketik yang berikut ini untuk memanggil metode Clear :
$RemoteAppLog.Clear()
$RemoteAppLog
Max(K) Retain OverflowAction Entries Name
------ ------ -------------- ------- ----
512 7 OverwriteOlder 0 Application
Perhatikan bahwa log peristiwa dibersihkan dan sekarang memiliki 0 entri alih-alih 262.
Membuat objek COM dengan New-Object
Anda dapat menggunakan New-Object untuk bekerja dengan komponen Model Objek Komponen (COM). Komponen berkisar dari berbagai pustaka yang disertakan dengan Windows Script Host (WSH) hingga aplikasi ActiveX seperti Internet Explorer yang diinstal pada sebagian besar sistem.
New-Object menggunakan Pembungkus .NET Framework Runtime-Callable untuk membuat objek COM, sehingga memiliki batasan yang sama dengan yang dilakukan .NET Framework saat memanggil objek COM. Untuk membuat objek COM, Anda perlu menentukan parameter ComObject dengan Pengidentifikasi Terprogram atau ProgId kelas COM yang ingin Anda gunakan. Diskusi lengkap tentang batasan penggunaan COM dan menentukan progId apa yang tersedia pada sistem berada di luar cakupan panduan pengguna ini, tetapi objek yang paling terkenal dari lingkungan seperti WSH dapat digunakan dalam PowerShell.
Anda dapat membuat objek WSH dengan menentukan progid ini: WScript.Shell, WScript.Network, Scripting.Dictionary, dan Scripting.FileSystemObject. Perintah berikut membuat objek ini:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject
Meskipun sebagian besar fungsionalitas kelas ini tersedia dengan cara lain di Windows PowerShell, beberapa tugas seperti pembuatan pintasan masih lebih mudah dilakukan menggunakan kelas WSH.
Membuat pintasan desktop dengan WScript.Shell
Satu tugas yang dapat dilakukan dengan cepat dengan objek COM adalah membuat pintasan. Misalkan Anda ingin membuat pintasan di desktop Anda yang menautkan ke folder beranda untuk PowerShell. Anda harus terlebih dahulu membuat referensi ke WScript.Shell, yang akan kami simpan dalam variabel bernama $WshShell:
$WshShell = New-Object -ComObject WScript.Shell
Get-Member bekerja dengan objek COM, sehingga Anda dapat menjelajahi anggota objek dengan mengetik:
$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 memiliki parameter InputObject opsional yang dapat Anda gunakan alih-alih pipa untuk memberikan input ke Get-Member. Anda akan mendapatkan output yang sama seperti yang ditunjukkan di atas jika Anda menggunakan perintah Get-Member -InputObject $WshShell. Jika Anda menggunakan InputObject, itu memperlakukan argumennya sebagai satu item. Ini berarti bahwa jika Anda memiliki beberapa objek dalam variabel, Get-Member memperlakukannya sebagai array objek. Contohnya:
$a = 1,2,"three"
Get-Member -InputObject $a
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Metode WScript.Shell CreateShortcut menerima satu argumen, jalur ke file pintasan untuk dibuat. Kita bisa mengetikkan jalur lengkap ke desktop, tetapi ada cara yang lebih mudah. Desktop biasanya diwakili oleh folder bernama Desktop di dalam folder utama pengguna saat ini. Windows PowerShell memiliki variabel $HOME yang berisi jalur ke folder ini. Kita dapat menentukan jalur ke folder beranda dengan menggunakan variabel ini, lalu menambahkan nama folder Desktop dan nama pintasan yang akan dibuat dengan mengetik:
$lnk = $WshShell.CreateShortcut("$HOME\Desktop\PSHome.lnk")
Saat Anda menggunakan sesuatu yang terlihat seperti nama variabel di dalam tanda kutip ganda, PowerShell mencoba mengganti nilai yang cocok. Jika Anda menggunakan tanda kutip tunggal, PowerShell tidak mencoba mengganti nilai variabel. Misalnya, coba ketik perintah berikut:
"$HOME\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
'$HOME\Desktop\PSHome.lnk'
$HOME\Desktop\PSHome.lnk
Kita sekarang memiliki variabel bernama $lnk yang berisi referensi pintasan baru. Jika Anda ingin melihat anggotanya, Anda dapat menyalurkannya ke Get-Member. Output di bawah ini menunjukkan anggota yang perlu kita gunakan untuk menyelesaikan pembuatan pintasan kita:
$lnk | Get-Member
TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}
Name MemberType Definition
---- ---------- ----------
...
Save Method void Save ()
...
TargetPath Property string TargetPath () {get} {set}
Kita perlu menentukan TargetPath, yang merupakan folder aplikasi untuk PowerShell, lalu menyimpan pintasan dengan memanggil Save metode . Jalur folder aplikasi PowerShell disimpan dalam variabel $PSHome, sehingga kita dapat melakukan ini dengan mengetik:
$lnk.TargetPath = $PSHome
$lnk.Save()
Menggunakan Internet Explorer dari PowerShell
Banyak aplikasi, termasuk keluarga aplikasi Microsoft Office dan Internet Explorer, dapat diotomatisasi dengan menggunakan COM. Contoh berikut menggambarkan beberapa teknik dan masalah umum yang terlibat dalam bekerja dengan aplikasi berbasis COM.
Anda membuat instans Internet Explorer dengan menentukan Internet Explorer ProgId, InternetExplorer.Application:
$ie = New-Object -ComObject InternetExplorer.Application
Perintah ini memulai Internet Explorer, tetapi tidak membuatnya terlihat. Jika Anda mengetik Get-Process, Anda dapat melihat bahwa proses bernama iexplore sedang berjalan. Bahkan, jika Anda keluar dari PowerShell, proses akan terus berjalan. Anda harus me-reboot komputer atau menggunakan alat seperti Task Manager untuk mengakhiri iexplore proses.
Catatan
Objek COM yang dimulai sebagai proses terpisah, umumnya disebut Executable ActiveX, mungkin atau mungkin tidak menampilkan jendela antarmuka pengguna saat dimulai. Jika mereka membuat jendela tetapi tidak membuatnya terlihat, seperti Internet Explorer, fokus biasanya berpindah ke desktop Windows. Anda harus membuat jendela terlihat untuk berinteraksi dengannya.
Dengan mengetik $ie | Get-Member, Anda dapat melihat properti dan metode untuk Internet Explorer. Untuk melihat jendela Internet Explorer, atur properti Terlihat ke $true dengan mengetik:
$ie.Visible = $true
Anda kemudian dapat menavigasi ke alamat Web tertentu menggunakan Navigate metode :
$ie.Navigate("https://devblogs.microsoft.com/scripting/")
Menggunakan anggota lain dari model objek Internet Explorer, dimungkinkan untuk mengambil konten teks dari halaman Web. Perintah berikut menampilkan teks HTML dalam isi halaman Web saat ini:
$ie.Document.Body.InnerText
Untuk menutup Internet Explorer dari dalam PowerShell, panggil metodenya Quit() :
$ie.Quit()
Variabel $ie tidak lagi berisi referensi yang valid meskipun masih tampak sebagai objek COM. Jika Anda mencoba menggunakannya, PowerShell mengembalikan kesalahan otomatisasi:
$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 <<<<
Anda dapat menghapus referensi yang tersisa dengan perintah seperti $ie = $null, atau menghapus variabel sepenuhnya dengan mengetik:
Remove-Variable ie
Catatan
Tidak ada standar umum untuk apakah ActiveX executables keluar atau terus berjalan saat Anda menghapus referensi ke salah satu. Tergantung pada keadaan, seperti apakah aplikasi terlihat, apakah dokumen yang diedit berjalan di dalamnya, dan bahkan apakah PowerShell masih berjalan, aplikasi mungkin atau mungkin tidak keluar. Untuk alasan ini, Anda harus menguji perilaku penghentian untuk setiap executable ActiveX yang ingin Anda gunakan di PowerShell.
Mendapatkan peringatan tentang objek COM yang dibungkus .NET Framework
Dalam beberapa kasus, objek COM mungkin memiliki .NET Framework Runtime-Callable Wrapper (RCW) terkait yang digunakan oleh New-Object. Karena perilaku RCW mungkin berbeda dari perilaku objek COM normal, New-Object memiliki parameter Ketat untuk memperingatkan Anda tentang akses RCW. Jika Anda menentukan parameter Ketat lalu membuat objek COM yang menggunakan RCW, Anda mendapatkan pesan peringatan:
$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
Meskipun objek masih dibuat, Anda diperingatkan bahwa itu bukan objek COM standar.