Bagikan melalui


Menggunakan Instrumentasi Manajemen Windows untuk Diagnostik

WCF mengekspos data inspeksi layanan pada durasi 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 pada durasi melalui antarmuka yang kompatibel dengan WBEM. Ini terdiri dari sekumpulan objek WMI yang memiliki pasangan atribut/nilai. Pasangan bisa dari sejumlah jenis sederhana. Alat manajemen dapat terhubung ke layanan melalui antarmuka pada durasi. 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 dapat disusun dalam 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 melemparkan 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 pengelogan jejak dan pesan, serta opsi pengelogan pesan untuk System.ServiceModel sumber pelacakan di WMI. Ini dapat dilakukan dengan mengakses instans AppDomainInfo, yang mengekspos properti Boolean ini: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, dan TraceLevel. Oleh karena itu, jika Anda mengonfigurasi pendengar penelusuran untuk pesan masuk, tetapi mengatur opsi ini ke false dalam konfigurasi, Anda nantinya dapat mengubahnya menjadi true saat aplikasi berjalan. Ini akan secara efektif mengaktifkan pengelogan pesan pada durasi. Demikian pula, jika Anda mengaktifkan pesan masuk dalam file konfigurasi, Anda dapat menonaktifkannya pada durasi menggunakan WMI.

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

WCF mengekspos GetOperationCounterInstanceName metode untuk pembuatan skrip. Metode ini mengembalikan nama instans penghitung kinerja jika Anda memberinya nama operasi. Namun, itu tidak memvalidasi input Anda. Oleh karena itu, jika Anda memberikan nama operasi yang salah, nama penghitung yang salah dikembalikan.

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.

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

Keamanan

Karena penyedia WCF WMI memungkinkan penemuan layanan di lingkungan, Anda harus berhati-hati untuk memberikan akses ke dalamnya. 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 proses dibanjiri oleh permintaan WMI yang berlebihan, performanya dapat terdegradasi.

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 WCF WMI memberikan izin "jalankan metode", "tulis penyedia", dan "aktifkan akun" untuk Administrator, dan izin "aktifkan akun" untuk ASP.NET, Layanan Lokal, dan Layanan Jaringan. Secara khusus, pada platform non-Windows Vista, akun ASP.NET telah membaca akses ke namespace layanan 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, ketika 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 memodifikasi 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 aksesnya dan gunakan kotak centang Izinkan atau Tolak untuk mengonfigurasi izin.

Memberikan Izin Pendaftaran WCF WMI kepada Pengguna Tambahan

WCF mengekspos data manajemen ke WMI. Ini melakukannya dengan menghosting penyedia WMI dalam proses, kadang-kadang disebut "penyedia terpisah". Agar data manajemen terekspos, akun yang mendaftarkan penyedia ini harus memiliki izin yang sesuai. Dalam Windows, hanya sekumpulan kecil akun istimewa yang dapat mendaftarkan penyedia terpisah secara default. Ini adalah masalah karena pengguna biasanya ingin mengekspos data WMI dari layanan WCF yang berjalan di bawah akun yang tidak berada dalam set default.

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

  1. Izin untuk mengakses Namespace WCF WMI.

  2. Izin untuk mendaftarkan WCF Decoupled WMI Provider.

Untuk memberikan izin akses namespace layanan WMI

  1. Jalankan skrip PowerShell berikut.

    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 Pengguna Built-In ke namespace layanan WMI "root/servicemodel". Ini menentukan ACL berikut:

    • Administrator Bawaan (BA) - Sudah Memiliki Akses.

    • Layanan Jaringan (NS) - Sudah memiliki akses.

    • Sistem Lokal (LS) - Sudah memiliki akses.

    • Pengguna Bawaan - Grup untuk memberikan akses.

Untuk memberikan akses pendaftaran penyedia

  1. Jalankan skrip PowerShell berikut.

    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 ke Pengguna atau Grup Arbitrer

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 terpasang, Maka Anda harus mendapatkan Pengidentifikasi Keamanan (SID) pengguna atau grup tersebut. Tidak ada cara sederhana untuk mendapatkan SID untuk pengguna arbitrer. Salah satu metodenya adalah masuk sebagai pengguna yang diinginkan dan kemudian mengeluarkan perintah shell berikut.

Whoami /user  

Untuk informasi selengkapnya, lihat SID 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, Windows Management Instrumentation Tester, serta .NET SDK 2.0.

WMI CIM Studio

Jika Anda telah menginstal WMI Administrative Tools, Anda dapat menggunakan WMI CIM Studio untuk mengakses instans WMI. Alat berada di folder berikut:

%windir%\Program Files\WMI Tools\

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

  2. Di jendela Masuk WMI CIM Studio, klik tombol Opsi >> untuk memperluas jendela. Pilih Privasi paket untuk tingkat Autentikasi, dan klik OK.

Penguji Windows Management Instrumentation

Alat ini diinstal oleh Windows. Untuk menjalankannya, luncurkan konsol perintah dengan mengetik cmd.exe dalam kotak dialog Mulai/Jalankan dan klik OK. Kemudian, ketik wbemtest.exe di jendela perintah. Alat penguji Windows Management Instrumentation kemudian diluncurkan.

  1. Klik tombol Koneksi 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 layanan. Sampel kode berikut menunjukkan cara melakukannya.

String wcfNamespace = $@"\\{this.serviceMachineName}\Root\ServiceModel");
  
ConnectionOptions connection = new ConnectionOptions();  
connection.Authentication = AuthenticationLevel.PacketPrivacy;  
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);