Condividi tramite


Uso di Strumentazione gestione Windows (WMI) per la diagnostica

Windows Communication Foundation (WCF) espone i dati di ispezione di un servizio in fase di esecuzione tramite un provider WMI (Windows Management Instrumentation) WCF.

Abilitazione di WMI

WMI è l'implementazione Microsoft dello standard WBEM (Web-Based Enterprise Management). Per altre informazioni su WMI SDK, vedere Strumentazione gestione Windows. WBEM è uno standard industriale che definisce la modalità in cui le applicazioni espongono la strumentazione della gestione a strumenti di gestione esterni.

Un provider WMI è un componente che espone la strumentazione in fase di esecuzione tramite un'interfaccia compatibile con WBEM. È costituito da un set di oggetti WMI che hanno coppie di valore/attributo. Le coppie possono essere costituite da un numero qualsiasi di tipi semplici. Gli strumenti di gestione possono connettersi ai servizi tramite l'interfaccia in fase di esecuzione. WCF espone attributi di servizi, ad esempio indirizzi, associazioni, comportamenti e listener.

Il provider WMI incorporato può essere attivato nel file di configurazione dell'applicazione. Questa operazione viene eseguita tramite l'attributo wmiProviderEnabled della< diagnostica> nella <sezione system.serviceModel>, come illustrato nella configurazione di esempio seguente.

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

Questa voce di configurazione espone un'interfaccia WMI. Le applicazioni di gestione possono ora connettersi usando questa interfaccia e accedere la strumentazione di gestione dell'applicazione.

Accesso ai dati WMI

L'accesso ai dati WMI può essere eseguito in molti modi diversi. Microsoft fornisce API WMI per script, applicazioni Visual Basic, applicazioni C++ e .NET Framework. Per altre informazioni, vedere Uso di WMI.

Attenzione

Se si usano i metodi forniti da .NET Framework per accedere ai dati WMI a livello di programmazione, tenere presente che questi metodi possono generare eccezioni nel momento in cui viene stabilita la connessione. La connessione non viene stabilita durante la costruzione dell'istanza ManagementObject, ma alla prima richiesta che comporta uno scambio di dati effettivo. Per intercettare le possibili eccezioni è pertanto necessario usare un blocco try..catch.

Per l'origine di traccia System.ServiceModel in WMI è possibile modificare il livello di registrazione della traccia e del messaggio, nonché le opzioni di registrazione dei messaggi. A tale scopo, accedere all'istanza di AppDomainInfo , che espone queste proprietà booleane: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessagese TraceLevel. Pertanto, se si configura un listener di traccia per la registrazione dei messaggi, ma si impostano queste opzioni su false nella configurazione, è possibile in seguito modificarle in true quando l'applicazione è in esecuzione. In questo modo la registrazione dei messaggi verrà abilitata in modo efficace in fase di esecuzione. Analogamente, se si abilita la registrazione dei messaggi nel file di configurazione, è possibile disabilitarla in fase di esecuzione usando WMI.

Se nel file di configurazione non viene specificato alcun listener di traccia per la registrazione dei messaggi né alcun listener di traccia System.ServiceModel, nessuna delle modifiche apportate verrà resa effettiva, anche se accettata da WMI. Per altre informazioni sulla corretta configurazione dei rispettivi listener, vedere Configurazione della registrazione dei messaggi e Configurazione della traccia. Il livello di traccia di tutte le altre origini di traccia specificate dalla configurazione viene attivato all'avvio dell'applicazione e non può essere modificato.

WCF espone un GetOperationCounterInstanceName metodo per la creazione di script. Se al metodo viene fornito un nome operazione, il metodo restituisce il nome di un'istanza di contatore delle prestazioni. L'input non viene tuttavia convalidato. Pertanto, se si fornisce un nome operazione errato, verrà restituito un nome di contatore errato.

La OutgoingChannel proprietà dell'istanza Service non conta i canali aperti da un servizio per connettersi a un altro servizio, se il client WCF al servizio di destinazione non viene creato all'interno del Service metodo .

Attenzione WMI supporta solo un TimeSpan valore fino a 3 punti decimali. Ad esempio, se il servizio imposta una delle proprietà su MaxValue, quando viene visualizzato in WMI il valore viene troncato dopo 3 cifre decimali.

Sicurezza

Poiché il provider WMI WCF consente l'individuazione dei servizi in un ambiente, è consigliabile prestare particolare attenzione per concedere l'accesso. Se si consentono deroghe all'accesso al solo amministratore (impostazione predefinita), è possibile che l'accesso a dati sensibili presenti nell'ambiente sia consentito anche a utenti meno attendibili. In particolare, se le autorizzazioni all'accesso WMI remoto vengono concesse indistintamente, possono verificarsi attacchi flood. Se un processo viene sovraccaricato da un numero eccessivo di richieste WMI, è possibile che si verifichi una riduzione delle prestazioni.

Inoltre, se si concedono liberamente autorizzazioni di accesso al file MOF, utenti meno attendibili potrebbero modificare il comportamento di WMI e alterare gli oggetti caricati nello schema WMI. È possibile ad esempio rimuovere campi in modo che i dati critici vengano nascosti dall'amministratore o che i campi che non contengono o generano eccezioni vengano aggiunti al file.

Per impostazione predefinita, il provider WMI WCF concede l'autorizzazione "execute method", "provider write" e "enable account" per Amministrazione istrator e l'autorizzazione "enable account" per ASP.NET, Servizio locale e Servizio di rete. In particolare, nelle piattaforme non Windows Vista, l'account ASP.NET ha accesso in lettura allo spazio dei nomi SERVICEModel WMI. Se non si desidera concedere questi privilegi a un particolare gruppo di utenti, è necessario disattivare il provider WMI (è disabilitato per impostazione predefinita) o disabilitare l'accesso per il gruppo di utenti specifico.

Inoltre, l'abilitazione di WMI mediante la configurazione potrebbe non essere possibile a causa di privilegi utente insufficienti. Per questo errore non viene tuttavia scritto alcun evento nel registro eventi.

Per modificare i livelli dei privilegi utente, usare la procedura seguente:

  1. Fare clic su Start e quindi su Esegui e digitare compmgmt.msc.

  2. Fare clic con il pulsante destro del mouse su Servizi e controlli Application/WMI per selezionare Proprietà.

  3. Selezionare la scheda Sicurezza e passare allo spazio dei nomi Root/ServiceModel . Fare clic sul pulsante Sicurezza .

  4. Selezionare il gruppo o l'utente specifico che si vuole controllare l'accesso e usare la casella di controllo Consenti o Nega per configurare le autorizzazioni.

Concessione di autorizzazioni di registrazione WMI per WCF a utenti aggiuntivi

WCF espone dati di gestione a WMI. Lo fa ospitando un provider WMI in-process, talvolta denominato "provider disaccoppiato". Per l'esposizione dei dati di gestione, l'account che registra il provider deve disporre di autorizzazioni appropriate. Per impostazione predefinita, in Windows solo un set ridotto di account privilegiati può registrare provider disaccoppiati. Ciò costituisce un problema, in quanto gli utenti desiderano in genere esporre dati WMI da un servizio WCF in esecuzione con un account non incluso nel set predefinito.

Per fornire tale accesso, un amministratore deve concedere le autorizzazioni seguenti all'account aggiuntivo nell'ordine indicato di seguito:

  1. Autorizzazione per accedere allo spazio dei nomi WMI per WCF.

  2. Autorizzazione per registrare il provider disaccoppiato WMI per WCF.

Per concedere l'autorizzazione di accesso allo spazio dei nomi WMI

  1. Eseguire lo script PowerShell seguente.

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

    Questo script di PowerShell usa il linguaggio SDDL (Security Descriptor Definition Language) per concedere al gruppo Utenti predefiniti l'accesso allo spazio dei nomi WMI "root/servicemodel". Lo script specifica gli ACL seguenti:

    • Account Administrator predefinito: dispone già di accesso.

    • Servizio di rete: dispone già di accesso.

    • Sistema locale: dispone già di accesso.

    • Gruppo Users predefinito: gruppo a cui concedere l'accesso.

Per concedere accesso alla registrazione del provider

  1. Eseguire lo script PowerShell seguente.

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

Concessione dell'accesso a utenti o gruppi arbitrari

Nell'esempio contenuto in questa sezione vengono concessi privilegi di registrazione del provider WMI a tutti gli utenti locali. Se si vuole concedere l'accesso a un utente o a un gruppo che non è integrato, è necessario ottenere l'identificatore di sicurezza (SID) dell'utente o del gruppo. Non è possibile ottenere il SID di un utente arbitrario in modo semplice. Un metodo consiste nell'accedere come utente desiderato e quindi eseguire il comando shell seguente.

Whoami /user  

Per altre informazioni, vedere SID noti.

Accesso a istanze di oggetti WMI remote

Se è necessario accedere alle istanze WMI WCF in un computer remoto, è necessario abilitare la privacy dei pacchetti negli strumenti usati per l'accesso. Nella sezione seguente viene descritta la procedura per accedere a istanze WMI usando WMI CIM Studio, Tester di Strumentazione gestione Windows e .NET SDK 2.0.

WMI CIM Studio

Se è stato installato WMI Amministrazione istrative Tools, è possibile usare WMI CIM Studio per accedere alle istanze WMI. Gli strumenti si trovano nella cartella seguente:

%windir%\Programmi\Strumenti WMI\

  1. Nella finestra Connessione allo spazio dei nomi digitareroot\ServiceModel e fare clic su OK.

  2. Nella finestra DI ACCESSO DI WMI CIM Studio fare clic sul pulsante Opzioni >> per espandere la finestra. Selezionare Privacy dei pacchetti per Livello di autenticazione e fare clic su OK.

Tester di Strumentazione gestione Windows

Questo strumento viene installato da Windows. Per eseguirlo, avviare una console dei comandi digitando cmd.exe nella finestra di dialogo Avvia/Esegui e fare clic su OK. Digitare quindi wbemtest.exe nella finestra di comando. Lo strumento Tester di Strumentazione gestione Windows viene avviato.

  1. Fare clic sul pulsante Connessione nell'angolo superiore destro della finestra.

  2. Nella nuova finestra immettere root\ServiceModel per il campo Spazio dei nomi e selezionare Privacy dei pacchetti per Livello di autenticazione. Fare clic su Connetti.

Uso di codice gestito

Per accedere a istanze WMI remote a livello di programmazione è anche possibile usare le classi fornite dallo spazio dei nomi System.Management. Nell'esempio di codice seguente viene illustrato come eseguire questa procedura.

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