Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 di Microsoft dello standard Web-Based Enterprise Management (WBEM). Per altre informazioni su WMI SDK, vedere Strumentazione gestione Windows. WBEM è uno standard di settore per il modo in cui le applicazioni espongono la strumentazione di gestione agli 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 con coppie attributo/valore. Le coppie possono essere di diversi 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 integrato 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 tramite questa interfaccia e accedere alla strumentazione di gestione dell'applicazione.
Accesso ai dati WMI
È possibile accedere ai dati WMI in molti modi diversi. Microsoft fornisce API WMI per script, applicazioni Visual Basic, applicazioni C++ e .NET Framework. Per altre informazioni, vedere Using WMI.
Attenzione
Se si utilizzano i metodi forniti da .NET Framework per accedere ai dati WMI a livello di codice, è necessario tenere presente che tali metodi possono generare eccezioni quando viene stabilita la connessione. La connessione non viene stabilita durante la costruzione dell'istanza ManagementObject , ma alla prima richiesta che comporta l'effettivo scambio di dati. Pertanto, è consigliabile utilizzare un try..catch
blocco per rilevare le possibili eccezioni.
È possibile modificare il livello di traccia e di registrazione dei messaggi, nonché le opzioni di registrazione dei messaggi per l'origine di System.ServiceModel
traccia in WMI. A tale scopo, è possibile accedere all'istanza AppDomainInfo , che espone le seguenti 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 modificarle in un secondo momento in true
quando l'applicazione è in esecuzione. In questo modo verrà abilitata in modo efficace la registrazione dei messaggi 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 vengono specificati listener di traccia per la registrazione dei messaggi o System.ServiceModel
per la traccia, nessuna delle modifiche viene applicata, anche se le modifiche sono accettate da WMI. Per ulteriori informazioni sulla corretta impostazione dei rispettivi listener, vedere Configurazione della registrazione dei messaggi e Configurazione della traccia. Il livello di traccia di tutte le altre origini di traccia specificato dalla configurazione è effettivo all'avvio dell'applicazione e non può essere modificato.
WCF espone un GetOperationCounterInstanceName
metodo per lo scripting. Questo metodo restituisce un nome di istanza del contatore delle prestazioni se viene fornito con un nome di operazione. Tuttavia, non convalida l'input. Pertanto, se si specifica un nome di operazione errato, viene restituito un nome di contatore errato.
La OutgoingChannel
proprietà dell'istanza non conta i Service
canali aperti da un servizio per connettersi a un altro servizio, se il client WCF per il servizio di destinazione non viene creato all'interno del Service
metodo.
Cautela WMI supporta solo un TimeSpan valore fino a 3 punti decimali. Ad esempio, se il servizio imposta una delle relative proprietà su MaxValue, il relativo valore viene troncato dopo 3 punti decimali quando viene visualizzato tramite WMI.
Sicurezza
Poiché il provider WMI WCF consente l'individuazione dei servizi in un ambiente, è necessario prestare la massima attenzione nel concedere l'accesso a tale provider. Se si allenta l'accesso predefinito solo per l'amministratore, è possibile consentire alle parti meno attendibili l'accesso ai dati sensibili nell'ambiente. In particolare, se si allentano le autorizzazioni per l'accesso remoto a WMI, possono verificarsi attacchi flooding. Se un processo viene inondato da un numero eccessivo di richieste WMI, le prestazioni possono essere ridotte.
Inoltre, se si riducono le autorizzazioni di accesso per il file MOF, le parti meno attendibili possono modificare il comportamento di WMI e modificare gli oggetti caricati nello schema WMI. Ad esempio, i campi possono essere rimossi in modo che i dati critici siano nascosti all'amministratore o che i campi che non vengono compilati o causano eccezioni vengano aggiunti al file.
Per impostazione predefinita, il provider WMI WCF concede le autorizzazioni "metodo di esecuzione", "scrittura provider" e "abilita account" per l'amministratore e l'autorizzazione "abilita account" per ASP.NET, servizio locale e servizio di rete. In particolare, nelle piattaforme non Windows Vista, l'account ASP.NET dispone dell'accesso in lettura allo spazio dei nomi WMI ServiceModel. Se non si desidera concedere questi privilegi a un determinato gruppo di utenti, è necessario disattivare il provider WMI (disabilitato per impostazione predefinita) o disabilitare l'accesso per il gruppo di utenti specifico.
Inoltre, quando si tenta di abilitare WMI tramite la configurazione, è possibile che WMI non venga abilitato a causa di privilegi utente insufficienti. Tuttavia, nessun evento viene scritto nel registro eventi per registrare questo errore.
Per modificare i livelli di privilegio utente, attenersi alla seguente procedura.
Fare clic su Start, quindi su Esegui e digitare compmgmt.msc.
Fare clic con il pulsante destro del mouse su Servizi e controlli applicazione/WMI per selezionare Proprietà.
Selezionare la scheda Sicurezza e passare allo spazio dei nomi Root/ServiceModel . Fare clic sul pulsante Sicurezza.
Selezionare il gruppo o l'utente specifico a cui si desidera controllare l'accesso e utilizzare la casella di controllo Consenti o Nega per configurare le autorizzazioni.
Concessione delle autorizzazioni di registrazione WMI WCF ad altri utenti
WCF espone i dati di gestione a WMI. A tale scopo, ospita un provider WMI in-process, talvolta denominato "provider disaccoppiato". Affinché i dati di gestione vengano esposti, l'account che registra il provider deve disporre delle autorizzazioni appropriate. In Windows, solo un piccolo set di account con privilegi può registrare provider disaccoppiati per impostazione predefinita. Si tratta di un problema perché gli utenti in genere desiderano esporre i dati WMI da un servizio WCF in esecuzione con un account che non è incluso nel set predefinito.
Per fornire questo accesso, un amministratore deve concedere le seguenti autorizzazioni all'account aggiuntivo nell'ordine seguente:
Autorizzazione per l'accesso allo spazio dei nomi WMI WCF.
Autorizzazione per la registrazione del provider WMI disaccoppiato WCF.
Per concedere l'autorizzazione di accesso allo spazio dei nomi WMI
Eseguire lo script di 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 SDDL (Security Descriptor Definition Language) per concedere al gruppo Built-In Users l'accesso allo spazio dei nomi WMI "root/servicemodel". Specifica gli ACL seguenti:
Built-In Administrator (BA) - Aveva già accesso.
Servizio di rete (NS): l'accesso era già disponibile.
Sistema locale (LS) - Aveva già accesso.
Built-In utenti: il gruppo a cui concedere l'accesso.
Per concedere l'accesso alla registrazione del provider
Eseguire lo script di 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 riportato in questa sezione vengono concessi privilegi di registrazione del provider WMI a tutti gli utenti locali. Se si desidera concedere l'accesso a un utente o a un gruppo non incorporato, è necessario ottenere l'ID di sicurezza (SID) dell'utente o del gruppo. Non esiste un modo semplice per ottenere il SID per un utente arbitrario. Un metodo consiste nell'accedere come utente desiderato e quindi eseguire il seguente comando shell.
Whoami /user
Per ulteriori informazioni, vedere SID noti.
Accesso alle istanze remote degli oggetti WMI
Se è necessario accedere alle istanze WMI di WCF in un computer remoto, è necessario abilitare la privacy dei pacchetti negli strumenti utilizzati per l'accesso. Nella sezione seguente viene descritto come ottenere questi risultati utilizzando WMI CIM Studio, Windows Management Instrumentation Tester e .NET SDK 2.0.
WMI CIM Studio
Se sono stati installati gli strumenti di amministrazione WMI, è possibile utilizzare WMI CIM Studio per accedere alle istanze WMI. Gli strumenti si trovano nella seguente cartella:
%windir%\Programmi\Strumenti WMI\
Nella finestra Connetti allo spazio dei nomi: digitare root\ServiceModel e fare clic su OK.
Nella finestra di accesso a WMI CIM Studio , fare clic sul pulsante Opzioni >> per espandere la finestra. Selezionare Privacy pacchetto per Livello di autenticazione e fare clic su OK.
Tester di Strumentazione gestione Windows
Questo strumento è installato da Windows. Per eseguirlo, avviare una console di comando digitando cmd.exe nella finestra di dialogo Avvia/Esegui e fare clic su OK. Quindi, digitawbemtest.exe nella finestra di comando. Viene quindi avviato lo strumento Tester di Strumentazione gestione Windows.
Fare clic sul pulsante Connetti nell'angolo in alto a destra della finestra.
Nella nuova finestra, immettere root\ServiceModel per il campo Spazio dei nomi e selezionare Privacy pacchetto per Livello di autenticazione. Fare clic su Connetti.
Utilizzo di codice gestito
È inoltre possibile accedere alle istanze WMI remote a livello di codice utilizzando le classi fornite dallo spazio dei System.Management nomi. Nell'esempio di codice seguente viene illustrato come eseguire questa operazione.
String wcfNamespace = $@"\\{this.serviceMachineName}\Root\ServiceModel");
ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);