Bagikan melalui


Menggunakan Instrumentasi Manajemen Windows untuk Diagnostik

Windows Communication Foundation (WCF) memaparkan data inspeksi layanan saat runtime melalui penyedia WCF Windows Management Instrumentation (WMI).

Mengaktifkan WMI

WMI adalah implementasi Microsoft dari standar Web-Based Enterprise Management (WBEM). Untuk informasi selengkapnya tentang WMI SDK, lihat Instrumentasi Manajemen Windows. WBEM adalah standar industri untuk bagaimana aplikasi mengekspos instrumentasi manajemen ke alat manajemen eksternal.

Penyedia WMI adalah komponen yang mengekspos instrumentasi saat runtime melalui antarmuka yang kompatibel dengan WBEM. Ini terdiri dari sekumpulan objek WMI yang memiliki pasangan atribut/nilai. Pasangan dapat terdiri dari sejumlah jenis sederhana. Alat manajemen dapat terhubung ke layanan melalui antarmuka saat runtime. WCF mengekspos atribut layanan seperti alamat, pengikatan, perilaku, dan pendengar.

Penyedia WMI bawaan dapat diaktifkan dalam file konfigurasi aplikasi. Ini dilakukan melalui wmiProviderEnabled atribut <diagnostik> di <bagian system.serviceModel> , seperti yang ditunjukkan dalam konfigurasi sampel berikut.

<system.serviceModel>
    …
    <diagnostics wmiProviderEnabled="true" />
    …
</system.serviceModel>

Entri konfigurasi ini mengekspos antarmuka WMI. Aplikasi manajemen sekarang dapat terhubung melalui antarmuka ini dan mengakses instrumentasi manajemen aplikasi.

Mengakses Data WMI

Data WMI dapat diakses dengan berbagai cara. Microsoft menyediakan API WMI untuk skrip, aplikasi Visual Basic, aplikasi C++, dan .NET Framework. Untuk informasi selengkapnya, lihat Menggunakan WMI.

Perhatian

Jika Anda menggunakan metode yang disediakan .NET Framework untuk mengakses data WMI secara terprogram, Anda harus menyadari bahwa metode tersebut dapat memunculkan pengecualian saat koneksi dibuat. Koneksi tidak dibuat selama konstruksi ManagementObject instans, tetapi pada permintaan pertama yang melibatkan pertukaran data aktual. Oleh karena itu, Anda harus menggunakan try..catch blok untuk menangkap kemungkinan pengecualian.

Anda dapat mengubah tingkat pelacakan dan pengelogan pesan, serta opsi pengelogan pesan untuk System.ServiceModel sumber pelacakan di WMI. Ini dapat dilakukan dengan mengakses instance AppDomainInfo , yang mengekspos properti Boolean ini: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, dan TraceLevel. Oleh karena itu, jika Anda mengonfigurasi pendengar pelacakan untuk pengelogan pesan, tetapi atur opsi ini ke false dalam konfigurasi, Anda nantinya dapat mengubahnya menjadi true saat aplikasi berjalan. Ini akan secara efektif mengaktifkan pengelogan pesan pada runtime. Demikian pula, jika Anda mengaktifkan pengelogan pesan dalam file konfigurasi, Anda dapat menonaktifkannya saat runtime menggunakan WMI.

Anda harus menyadari bahwa jika tidak ada pemroses pelacakan pencatatan pesan untuk pencatatan pesan, atau tidak ada System.ServiceModel pendengar pelacakan untuk pelacakan yang ditentukan dalam file konfigurasi, tidak ada perubahan Anda yang diterapkan, meskipun perubahan tersebut diterima oleh WMI. Untuk informasi selengkapnya tentang menyiapkan masing-masing pemroses dengan benar, lihat Mengonfigurasi Pencatatan Pesan dan Mengonfigurasi Pelacakan. Tingkat pelacakan semua sumber pelacakan lain yang ditentukan oleh konfigurasi efektif saat aplikasi dimulai, dan tidak dapat diubah.

WCF mengekspos GetOperationCounterInstanceName metode untuk pembuatan skrip. Metode ini mengembalikan nama instans penghitung performa jika Anda memberikannya dengan nama operasi. Namun, itu tidak memvalidasi masukan Anda. Oleh karena itu, jika Anda memberikan nama operasi yang salah, nama penghitung yang salah akan ditampilkan.

Properti OutgoingChannelService instans tidak menghitung saluran yang dibuka oleh layanan untuk terhubung ke layanan lain, jika klien WCF ke layanan tujuan tidak dibuat dalam Service metode.

Hati WMI hanya mendukung TimeSpan nilai hingga 3 titik desimal. Misalnya, jika layanan Anda mengatur salah satu propertinya ke MaxValue, nilainya dipotong setelah 3 titik desimal saat dilihat melalui WMI.

Keamanan

Karena penyedia WMI WCF memungkinkan penemuan layanan di lingkungan, Anda harus sangat berhati-hati untuk memberikan akses ke layanan tersebut. Jika Anda melonggarkan akses khusus administrator default, Anda dapat mengizinkan pihak yang kurang tepercaya mengakses data sensitif di lingkungan Anda. Secara khusus, jika Anda melonggarkan izin pada akses WMI jarak jauh, serangan banjir dapat terjadi. Jika suatu proses dibanjiri oleh permintaan WMI yang berlebihan, kinerjanya dapat menurun.

Selain itu, jika Anda melonggarkan izin akses untuk file MOF, pihak yang kurang tepercaya dapat memanipulasi perilaku WMI dan mengubah objek yang dimuat dalam skema WMI. Misalnya, bidang dapat dihapus sedemikian rupa sehingga data penting disembunyikan dari administrator atau bidang yang tidak terisi atau menyebabkan pengecualian ditambahkan ke file.

Secara default, penyedia WMI WCF memberikan izin "execute method", "provider write", dan "enable account" untuk Administrator, dan izin "enable account" untuk ASP.NET, Local Service, dan Network Service. Secara khusus, pada platform non-Windows Vista, akun ASP.NET memiliki akses baca ke namespace WMI ServiceModel. Jika Anda tidak ingin memberikan hak istimewa ini ke grup pengguna tertentu, Anda harus menonaktifkan penyedia WMI (dinonaktifkan secara default), atau menonaktifkan akses untuk grup pengguna tertentu.

Selain itu, saat Anda mencoba mengaktifkan WMI melalui konfigurasi, WMI mungkin tidak diaktifkan karena hak istimewa pengguna yang tidak memadai. Namun, tidak ada peristiwa yang ditulis ke log peristiwa untuk mencatat kegagalan ini.

Untuk mengubah tingkat hak istimewa pengguna, gunakan langkah-langkah berikut.

  1. Klik Mulai lalu Jalankan dan ketik compmgmt.msc.

  2. Klik kanan Layanan dan Kontrol Aplikasi/WMI untuk memilih Properti.

  3. Pilih Tab Keamanan , dan navigasikan ke namespace Root/ServiceModel . Klik tombol Keamanan .

  4. Pilih grup atau pengguna tertentu yang ingin Anda kontrol akses dan gunakan kotak centang Izinkan atau Tolak untuk mengonfigurasi izin.

Memberikan Izin Pendaftaran WCF WMI kepada Pengguna Tambahan

WCF mengekspos data manajemen ke WMI. Itu dilakukan dengan menghosting penyedia WMI dalam proses, kadang-kadang disebut "penyedia yang dipisahkan". Agar data manajemen dapat diekspos, akun yang mendaftarkan penyedia ini harus memiliki izin yang sesuai. Di Windows, hanya sekelompok kecil akun istimewa yang dapat mendaftarkan penyedia yang dipisahkan secara default. Ini adalah masalah karena pengguna biasanya ingin mengekspos data WMI dari layanan WCF yang berjalan di bawah akun yang tidak ada dalam set default.

Untuk menyediakan akses ini, administrator harus memberikan izin berikut ke akun tambahan dalam urutan berikut:

  1. Izin untuk mengakses Namespace WMI WCF.

  2. Izin untuk mendaftarkan Penyedia WMI Terputus WCF.

Untuk memberikan izin akses namespace WMI

  1. Jalankan skrip PowerShell berikut ini.

    write-host ""
    write-host "Granting Access to root/servicemodel WMI namespace to built in users group"
    write-host ""
    
    # Create the binary representation of the permissions to grant in SDDL
    $newPermissions = "O:BAG:BAD:P(A;CI;CCDCLCSWRPWPRCWD;;;BA)(A;CI;CC;;;NS)(A;CI;CC;;;LS)(A;CI;CC;;;BU)"
    $converter = new-object system.management.ManagementClass Win32_SecurityDescriptorHelper
    $binarySD = $converter.SDDLToBinarySD($newPermissions)
    $convertedPermissions = ,$binarySD.BinarySD
    
    # Get the object used to set the permissions
    $security = gwmi -namespace root/servicemodel -class __SystemSecurity
    
    # Get and output the current settings
    $binarySD = @($null)
    $result = $security.PsBase.InvokeMethod("GetSD",$binarySD)
    
    $outsddl = $converter.BinarySDToSDDL($binarySD[0])
    write-host "Previous ACL: "$outsddl.SDDL
    
    # Change the Access Control List (ACL) using SDDL
    $result = $security.PsBase.InvokeMethod("SetSD",$convertedPermissions)
    
    # Get and output the current settings
    $binarySD = @($null)
    $result = $security.PsBase.InvokeMethod("GetSD",$binarySD)
    
    $outsddl = $converter.BinarySDToSDDL($binarySD[0])
    write-host "New ACL:      "$outsddl.SDDL
    write-host ""
    

    Skrip PowerShell ini menggunakan Security Descriptor Definition Language (SDDL) untuk memberikan akses grup Built-In Users ke namespace WMI "root/servicemodel". Ini menentukan ACL berikut:

    • Built-In administrator (BA) - sudah memiliki akses.

    • Layanan Jaringan (NS) - Sudah memiliki akses.

    • Sistem Lokal (LS) - Sudah Memiliki Akses.

    • Built-In Pengguna - Grup yang akan diberikan aksesnya.

Untuk memberikan akses pendaftaran penyedia

  1. Jalankan skrip PowerShell berikut ini.

    write-host ""
    write-host "Granting WCF provider registration access to built in users group"
    write-host ""
    # Set security on ServiceModel provider
    $provider = get-WmiObject -namespace "root\servicemodel" __Win32Provider
    
    write-host "Previous ACL: "$provider.SecurityDescriptor
    $result = $provider.SecurityDescriptor = "O:BUG:BUD:(A;;0x1;;;BA)(A;;0x1;;;NS)(A;;0x1;;;LS)(A;;0x1;;;BU)"
    
    # Commit the changes and display it to the console
    $result = $provider.Put()
    write-host "New ACL:      "$provider.SecurityDescriptor
    write-host ""
    

Memberikan Akses kepada Pengguna atau Grup Sewenang-wenang

Contoh di bagian ini memberikan hak istimewa pendaftaran Penyedia WMI kepada semua pengguna lokal. Jika Anda ingin memberikan akses ke pengguna atau grup yang tidak bawaan, Anda harus mendapatkan Pengenal Keamanan (SID) pengguna atau grup tersebut. Tidak ada cara sederhana untuk mendapatkan SID untuk pengguna yang sewenang-wenang. Salah satu metodenya adalah masuk sebagai pengguna yang diinginkan dan kemudian mengeluarkan perintah shell berikut.

Whoami /user

Untuk informasi selengkapnya, lihat SID yang Terkenal.

Mengakses Instans Objek WMI Jarak Jauh

Jika Anda perlu mengakses instans WCF WMI pada komputer jarak jauh, Anda harus mengaktifkan privasi paket pada alat yang Anda gunakan untuk akses. Bagian berikut menjelaskan cara mencapainya menggunakan WMI CIM Studio, Penguji Instrumentasi Manajemen Windows, serta .NET SDK 2.0.

WMI CIM Studio

Jika Anda telah menginstal Alat Administratif WMI, Anda dapat menggunakan WMI CIM Studio untuk mengakses instans WMI. Alat-alat tersebut ada di folder berikut:

%windir%\Program Files\WMI Tools\

  1. Di jendela Hubungkan ke namespace:, ketik root\ServiceModel dan klik OK.

  2. Di jendela WMI CIM Studio Login , klik tombol Opsi >> untuk memperluas jendela. Pilih Privasi paket untuk Tingkat autentikasi, dan klik OK.

Penguji Instrumentasi Manajemen Windows

Alat ini diinstal oleh Windows. Untuk menjalankannya, luncurkan konsol perintah dengan mengetikkan cmd.exe di kotak dialog Mulai/Jalankan dan klik OK. Kemudian, ketik wbemtest.exe di jendela perintah. Alat Penguji Instrumentasi Manajemen Windows kemudian diluncurkan.

  1. Klik tombol Hubungkan di sudut kanan atas jendela.

  2. Di jendela baru, masukkan root\ServiceModel untuk bidang Namespace , dan pilih Privasi paket untuk tingkat Autentikasi. Klik Sambungkan.

Menggunakan Kode Terkelola

Anda juga dapat mengakses instans WMI jarak jauh secara terprogram dengan menggunakan kelas yang disediakan oleh System.Management namespace. Sampel kode berikut menunjukkan cara melakukan ini.

String wcfNamespace = $@"\\{this.serviceMachineName}\Root\ServiceModel");

ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);