Utilizzo di Strumentazione gestione Windows (WMI) per la diagnostica

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

Attivazione di WMI

WMI è l'implementazione Microsoft dello standard WBEM (Web-Based Enterprise Management). Per ulteriori informazioni sull'SDK di WMI, visitare il sito Web di MSDN Library all'indirizzo https://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi\_start\_page.asp. 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 attraverso un'interfaccia compatibile con WBEM. È costituito da un insieme 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 sono in grado di connettersi ai servizi attraverso l'interfaccia in fase di esecuzione. WCF espone attributi dei servizi quali indirizzi, associazioni, comportamenti e listener.

Il provider WMI incorporato può essere attivato nel file di configurazione dell'applicazione. Questa operazione può essere eseguita utilizzando l'attributo wmiProviderEnabled dell'elemento <diagnostics> Element della sezione system.ServiceModel element, 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 utilizzando 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 ulteriori informazioni, visitare la pagina Web contenente informazioni sull'utilizzo di WMI.

Attenzione:
Se si utilizzano 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 utilizzare 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. Questa operazione può essere eseguita accedendo all'istanza AppDomainInfo che espone le proprietà booleane LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages e 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 verrà attivata la registrazione dei messaggi a runtime. Analogamente, se si attiva la registrazione dei messaggi nel file di configurazione, è possibile disattivarla a runtime utilizzando 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 ulteriori informazioni sulla corretta configurazione dei rispettivi listener, vedere Configurazione della registrazione dei messaggi e Configurazione delle funzionalità di 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 metodo GetOperationCounterInstanceName per lo scripting. 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 proprietà OutgoingChannel dell'istanza Service non conta i canali aperti da un servizio per la connessione a un altro servizio se il client WCF nel servizio di destinazione non viene creato all'interno del metodo Service.

Attenzione   WMI supporta soltanto valori TimeSpan che comprendono fino a 3 cifre 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.

Protezione

Poiché il provider WMI di WCF consente la rilevazione di servizi in un ambiente, nel concedere l'accesso all'ambiente è necessario prestare particolare attenzione. 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 di WCF concede le autorizzazioni "esegui metodo", "scrittura provider" e "abilita account" per l'amministratore e l'autorizzazione "abilita account" per ASP.NET, Servizio locale e Servizio di rete. In particolare, sulle piattaforme diverse da Windows Vista l'account ASP.NET dispone dell'accesso in lettura allo spazio dei nomi ServiceModel di WMI. Se non si desidera concedere questi privilegi a un particolare gruppo di utenti, è necessario disattivare il provider WMI (è disattivato per impostazione predefinita) o disattivare l'accesso per il gruppo di utenti specifico.

Inoltre, l'attivazione 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, utilizzare la procedura seguente:

  1. Fare clic su Start, scegliere Esegui e digitare quindi compmgmt.msc.
  2. Fare clic con il pulsante destro del mouse su Servizi e applicazioni/Controllo WMI, quindi scegliere Proprietà.
  3. Selezionare la Scheda Protezione e passare allo spazio dei nomi Root/ServiceModel. Fare clic sul pulsante Protezione.
  4. Selezionare il gruppo o l'utente specifico di cui si desidera controllare l'accesso e utilizzare la casella di controllo Consenti o Nega per configurare le autorizzazioni.

Accesso a istanze di oggetti WMI remote

Per accedere a istanze WMI di WCF in un computer remoto è necessario attivare la riservatezza dei pacchetti negli strumenti utilizzati per l'accesso. Nella sezione seguente viene descritta la procedura per accedere a istanze WMI utilizzando WMI CIM Studio, Tester di Strumentazione gestione Windows e .NET SDK 2.0.

WMI CIM Studio

Se nel computer è installato WMI Administrative Tools, per accedere a istanze WMI è possibile utilizzare WMI CIM Studio. Gli strumenti si trovano nella cartella seguente:

%windir%\Program Files\WMI Tools\

  1. Nella finestra Connetti a spazio dei nomi: digitare root\ServiceModel e fare clic su OK
  2. Nella finestra Accesso a WMI CIM Studio fare clic sul pulsante Opzioni >> per espandere la finestra. Selezionare Riservatezza pacch. per Livello autenticazione, quindi fare clic su OK.

Tester di Strumentazione gestione Windows

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

  1. Fare clic sul pulsante Connetti nell'angolo in alto a destra della finestra.
  2. Nella nuova finestra immettere root\ServiceModel per il campo Spazio dei nomi e selezionare Riservatezza pacch. per Livello autenticazione. Fare clic su Connetti.

Utilizzo di codice gestito

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

String wcfNamespace = String.Format(@"\\{0}\Root\ServiceModel",    
   this.serviceMachineName);

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