Aracılığıyla paylaş


Tanılama için Windows Yönetim İzlemesini Kullanma

Windows Communication Foundation (WCF), WCF Windows Yönetim Araçları (WMI) sağlayıcısı aracılığıyla bir hizmetin çalışma zamanındaki denetim verilerini kullanıma sunar.

WMI'yi etkinleştirme

WMI, Microsoft'un Web Tabanlı Kurumsal Yönetim (WBEM) standardını uygulamasıdır. WMI SDK'sı hakkında daha fazla bilgi için bkz . Windows Yönetim Araçları. WBEM, uygulamaların yönetim araçlarını dış yönetim araçlarına nasıl kullanıma sunmasına yönelik bir endüstri standardıdır.

WMI sağlayıcısı, WBEM uyumlu bir arabirim aracılığıyla izlemenin çalışma zamanında kullanıma sunan bir bileşendir. Öznitelik/değer çiftlerine sahip bir WMI nesneleri kümesinden oluşur. Çiftler bir dizi basit türde olabilir. Yönetim araçları, çalışma zamanında arabirim aracılığıyla hizmetlere bağlanabilir. WCF, adresler, bağlamalar, davranışlar ve dinleyiciler gibi hizmetlerin özniteliklerini kullanıma sunar.

Yerleşik WMI sağlayıcısı, uygulamanın yapılandırma dosyasında etkinleştirilebilir. Bu işlem, aşağıdaki örnek yapılandırmada <gösterildiği gibi system.serviceModel> bölümündeki tanılamanın> özniteliği <aracılığıyla wmiProviderEnabled yapılır.

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

Bu yapılandırma girdisi bir WMI arabirimini kullanıma sunar. Yönetim uygulamaları artık bu arabirim üzerinden bağlanabilir ve uygulamanın yönetim araçlarına erişebilir.

WMI Verilerine Erişme

WMI verilerine birçok farklı yolla erişilebilir. Microsoft betikler, Visual Basic uygulamaları, C++ uygulamaları ve .NET Framework için WMI API'leri sağlar. Daha fazla bilgi için bkz . WMI kullanma.

Dikkat

WMI verilerine program aracılığıyla erişmek için .NET Framework tarafından sağlanan yöntemleri kullanırsanız, bağlantı kurulduğunda bu tür yöntemlerin özel durumlar oluşturabileceğini unutmayın. Bağlantı, örneğin oluşturulması ManagementObject sırasında değil, gerçek veri değişimini içeren ilk istekte kurulur. Bu nedenle, olası özel durumları yakalamak için bir try..catch blok kullanmanız gerekir.

İzleme ve ileti günlüğü düzeyinin yanı sıra WMI'daki izleme kaynağı için System.ServiceModel ileti günlüğü seçeneklerini değiştirebilirsiniz. Bu, şu Boole özelliklerini kullanıma sunan AppDomainInfo örneğine erişilerek yapılabilir: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessagesve TraceLevel. Bu nedenle, ileti günlüğü için bir izleme dinleyicisi yapılandırırken bu seçenekleri false yapılandırmada olarak ayarlarsanız, daha sonra uygulama çalışırken olarak true değiştirebilirsiniz. Bu, çalışma zamanında ileti günlüğünü etkili bir şekilde etkinleştirir. Benzer şekilde, yapılandırma dosyanızda ileti günlüğünü etkinleştirirseniz WMI kullanarak çalışma zamanında devre dışı bırakabilirsiniz.

yapılandırma dosyasında ileti günlüğü izleme dinleyicisi yoksa veya izleme için hiçbir System.ServiceModel izleme dinleyicisi belirtilmezse, değişiklikler WMI tarafından kabul edilse bile değişikliklerinizin hiçbirinin etkin hale getirilmediğini unutmayın. İlgili dinleyicileri düzgün ayarlama hakkında daha fazla bilgi için bkz . İleti Günlüğünü Yapılandırma ve İzlemeyi Yapılandırma. Yapılandırma tarafından belirtilen diğer tüm izleme kaynaklarının izleme düzeyi, uygulama başlatıldığında etkilidir ve değiştirilemez.

WCF, betik oluşturma için bir GetOperationCounterInstanceName yöntem sunar. Bu yöntem, bir işlem adı sağlarsanız bir performans sayacı örneği adı döndürür. Ancak girişinizi doğrulamaz. Bu nedenle, yanlış bir işlem adı sağlarsanız, yanlış bir sayaç adı döndürülür.

OutgoingChannel Örneğin özelliğiService, hedef hizmete wcf istemcisi yönteminde Service oluşturulmamışsa, başka bir hizmete bağlanmak için bir hizmet tarafından açılan kanalları saymaz.

Dikkat WMI yalnızca 3 ondalık ayırıcıya kadar bir TimeSpan değeri destekler. Örneğin, hizmetiniz özelliklerinden birini olarak MaxValueayarlarsa, DEĞERI WMI aracılığıyla görüntülendiğinde 3 ondalık ayırıcıdan sonra kesilir.

Güvenlik

WCF WMI sağlayıcısı bir ortamdaki hizmetlerin bulunmasına izin verdiğinden, erişim izni vermek için çok dikkatli olmanız gerekir. Varsayılan yalnızca yönetici erişimini rahatlatırsanız, daha az güvenilen tarafların ortamınızdaki hassas verilere erişmesine izin verirseniz. Özellikle, uzak WMI erişimi üzerindeki izinleri gevşetiyorsanız, sel saldırıları oluşabilir. Bir işlem aşırı WMI istekleri tarafından sular altında kalırsa, performansı düşebilir.

Ayrıca, MOF dosyası için erişim izinlerini rahatlatırsanız, daha az güvenilen taraflar WMI'nin davranışını işleyebilir ve WMI şemasına yüklenen nesneleri değiştirebilir. Örneğin, kritik veriler yöneticiden gizlenecek veya dosyaya doldurulmayan veya özel durumlara neden olmayan alanlar eklenecek şekilde alanlar kaldırılabilir.

Varsayılan olarak, WCF WMI sağlayıcısı Yönetici istrator için "yürütme yöntemi", "sağlayıcı yazma" ve "hesabı etkinleştir" ve ASP.NET, Yerel Hizmet ve Ağ Hizmeti için "hesabı etkinleştir" izni verir. Özellikle, Windows Vista olmayan platformlarda, ASP.NET hesabının WMI ServiceModel ad alanına okuma erişimi vardır. Bu ayrıcalıkları belirli bir kullanıcı grubuna vermek istemiyorsanız WMI sağlayıcısını devre dışı bırakmanız (varsayılan olarak devre dışıdır) veya belirli bir kullanıcı grubu için erişimi devre dışı bırakmanız gerekir.

Ayrıca, yapılandırma aracılığıyla WMI'yi etkinleştirmeyi denediğinizde, kullanıcı ayrıcalığının yetersiz olması nedeniyle WMI etkinleştirilmemiş olabilir. Ancak, bu hatayı kaydetmek için olay günlüğüne hiçbir olay yazılmaması.

Kullanıcı ayrıcalık düzeylerini değiştirmek için aşağıdaki adımları kullanın.

  1. Başlat'a tıklayın ve çalıştır'a tıklayın ve compmgmt.msc yazın.

  2. Özellikler'i seçmek için Hizmetler ve Uygulama/WMI Denetimleri'ne sağ tıklayın.

  3. Güvenlik Sekmesini seçin ve Root/ServiceModel ad alanına gidin. Güvenlik düğmesine tıklayın.

  4. Erişimi denetlemek istediğiniz belirli bir grubu veya kullanıcıyı seçin ve izinleri yapılandırmak için İzin Ver veya Reddet onay kutusunu kullanın.

Ek Kullanıcılara WCF WMI Kayıt İzinleri Verme

WCF yönetim verilerini WMI'ye sunar. Bunu, bazen "ayrılmış sağlayıcı" olarak adlandırılan işlem içi bir WMI sağlayıcısı barındırarak yapar. Yönetim verilerinin kullanıma sunulacak olması için bu sağlayıcıyı kaydeden hesabın uygun izinlere sahip olması gerekir. Windows'ta, ayrılmış sağlayıcıları varsayılan olarak yalnızca küçük bir ayrıcalıklı hesap kümesi kaydedebilir. Bu bir sorundur çünkü kullanıcılar genellikle varsayılan kümede olmayan bir hesap altında çalışan bir WCF hizmetinden WMI verilerini kullanıma açmak ister.

Bu erişimi sağlamak için, yöneticinin ek hesaba aşağıdaki sırayla aşağıdaki izinleri vermesi gerekir:

  1. WCF WMI Ad Alanına erişim izni.

  2. WCF Ayrılmış WMI Sağlayıcısını kaydetme izni.

WMI ad alanı erişim izni vermek için

  1. Aşağıdaki PowerShell betiğini çalıştırın.

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

    Bu PowerShell betiği, Yerleşik Kullanıcılar grubuna "root/servicemodel" WMI ad alanına erişim vermek için Güvenlik Tanımlayıcısı Tanım Dili'ni (SDDL) kullanır. Aşağıdaki ACL'leri belirtir:

    • Yerleşik Yönetici istrator (BA) - Zaten erişimi vardı.

    • Ağ Hizmeti (NS) - Zaten erişimi vardı.

    • Yerel Sistem (LS) - Zaten erişimi vardı.

    • Yerleşik Kullanıcılar - Erişim izni vermek için grup.

Sağlayıcı kayıt erişimi vermek için

  1. Aşağıdaki PowerShell betiğini çalıştırın.

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

Rastgele Kullanıcılara veya Gruplara Erişim Verme

Bu bölümdeki örnek, tüm yerel kullanıcılara WMI Sağlayıcısı kayıt ayrıcalıkları verir. Yerleşik olmayan bir kullanıcı veya gruba erişim vermek istiyorsanız, bu kullanıcı veya grubun Güvenlik Tanımlayıcısını (SID) almanız gerekir. Rastgele bir kullanıcı için SID'yi almanın basit bir yolu yoktur. Yöntemlerden biri, istenen kullanıcı olarak oturum açmak ve ardından aşağıdaki kabuk komutunu vermektir.

Whoami /user  

Daha fazla bilgi için bkz . İyi Bilinen SID'ler.

Uzak WMI Nesne Örneklerine Erişme

Uzak bir makinede WCF WMI örneklerine erişmeniz gerekiyorsa, erişim için kullandığınız araçlarda paket gizliliğini etkinleştirmeniz gerekir. Aşağıdaki bölümde WMI CIM Studio, Windows Yönetim Araçları Sınayıcısı ve .NET SDK 2.0 kullanılarak bunların nasıl başarıldığı açıklanmaktadır.

WMI CIM Studio

WMI Yönetici istrative Tools yüklediyseniz WMI örneklerine erişmek için WMI CIM Studio'yu kullanabilirsiniz. Araçlar aşağıdaki klasördedir:

%windir%\Program Files\WMI Tools\

  1. ad alanına Bağlan: penceresinde root\ServiceModel yazın ve Tamam'a tıklayın.

  2. WMI CIM Studio Oturum Açma penceresinde Seçenekler >> düğmesine tıklayarak pencereyi genişletin. Kimlik doğrulama düzeyi için Paket gizliliği'ne tıklayın ve Tamam'a tıklayın.

Windows Yönetim Araçları Sınayıcısı

Bu araç Windows tarafından yüklenir. Çalıştırmak için Başlat/Çalıştır iletişim kutusuna cmd.exe yazarak bir komut konsolu başlatın ve Tamam'a tıklayın. Ardından komut penceresine wbemtest.exe yazın. Ardından Windows Yönetim Araçları Sınayıcısı aracı başlatılır.

  1. Pencerenin sağ üst köşesindeki Bağlan düğmesine tıklayın.

  2. Yeni pencerede, Ad Alanı alanına root\ServiceModelyazın ve Kimlik doğrulaması düzeyi için Paket gizliliği'ni seçin. Bağlan'a tıklayın.

Yönetilen Kodu Kullanma

Ayrıca, ad alanı tarafından sağlanan sınıfları kullanarak uzak WMI örneklerine System.Management program aracılığıyla erişebilirsiniz. Aşağıdaki kod örneği bunun nasıl yapılacağını gösterir.

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