Buongiorno Mr Script! Esecuzione del probe intensità di WMI

The Microsoft Scripting Guys

Contenuto

Gli spazi dei nomi
Classi WMI
Proprietà
I metodi

Quando uno degli Scripting Guys era scuole, egli era hobby due che ha effettivamente apprezzato. Uno stato con fermented bevande; l'altro è stato camping inverno. Suspects ha due sono correlati. Utilizzato insieme al durante i giorni è stato Affettuosi del suggerimento che "escono deep." Anche questo mese ci concentreremo seguire suggerimenti il vecchio amico. Ci concentreremo profondità in wilderness di WMI, Strumentazione gestione Windows ().

Fortunatamente, è non necessario hike in qualsiasi posizione in questo caso, probabilmente tranne per il produttore di caffè ed eseguire il backup. Al contrario, ci concentreremo probe l'intensità di WMI tramite script.

Gli Scripting Guy a questo punto, sono noti per essere folk molto pratico. Si tenta di presentare soluzioni ai problemi effettivi anziché spiegazioni lofty che sembrano lasciare alcuni particolari, come come eseguire effettivamente nulla, il lettore. Non considerare che è sta passare in tale bandwagon. Sebbene questa colonna non concentrarsi raggiungimento di attività di amministrazione sistema specifico, è necessario un obiettivo pratico. Scopo principale consiste nell'informare è sull'infrastruttura di WMI. E Vorremmo inoltre inserire alcuni script di ricerca utili nelle mani. Attivazione del blocco note, ci concentreremo completa!

Gli spazi dei nomi

L'archivio WMI è un database e viene utilizzata per memorizzare CIM (Common Information Model). Questo modello è orientata, ovvero composto da un set di descrizioni (classi WMI) che rappresentano elementi che WMI può gestire. La classe WMI Win32_Process, ad esempio, rappresenta i processi. Le classi WMI vengono memorizzate in diverse sezioni dell'archivio WMI. Una sezione dell'archivio WMI è noto come uno spazio dei nomi. Se dovesse stumble su un archivio WMI nel wilderness, la prima cosa che sarebbe probabilmente si informazioni è che si è suddiviso in questi spazi dei nomi ad alto livello. Lo script illustrato nella Figura 1

Nella figura 1 visualizzazione gli spazi dei nomi

strComputer = "."
Call EnumNameSpaces("root")

Sub EnumNameSpaces(strNameSpace)
    On Error Resume Next
    WScript.Echo strNameSpace
    Set objWMIService=GetObject _
        ("winmgmts:{impersonationLevel=impersonate}\\" & _ 
            strComputer & "\" & strNameSpace)

    Set colNameSpaces = objWMIService.InstancesOf("__NAMESPACE")

    For Each objNameSpace in colNameSpaces
        Call EnumNameSpaces(strNameSpace & "\" & objNameSpace.Name)
    Next
End Sub

vengono visualizzati i nomi di tutti gli spazi dei nomi nell'archivio WMI sul computer specificato nella variabile strComputer (un punto indica che il computer locale).

Gli spazi dei nomi possono includere subname­spaces. È possibile considerare l'intero sommario come come una struttura di directory. Pertanto, se si richiede solo tutti gli spazi dei nomi (a partire dallo spazio dei nomi principale), sarebbe otteniamo solo il primo livello di spazi dei nomi all'interno di radice, che potrebbe perdere eventuali sottospazi dei nomi. Utilizzare invece la mano di ricorsione. È possibile creare una subroutine denominata EnumNameSpaces che accetta uno spazio dei nomi come parametro e restituisce tutti i relativi sottospazi dei nomi.

È avviare operazioni chiamando EnumNameSpaces con principale come parametro. Restituirà tutti i gli spazi dei nomi all'interno dello spazio dei nomi principale. Quindi è possibile eseguire la ricorsione. Si noti che EnumNameSpaces chiama effettivamente stesso, passando a ciascuno del sottospazi dei nomi che identifica. Richiedere un grande slurp del caffè e pensare che. Il risultato è che ogni spazio dei nomi verrà elaborato e, in caso affermativo sottospazi dei nomi, verranno tutti visualizzati.

Si noti che è un'istruzione On Error Resume Next all'inizio della subroutine. Si tratta nel caso in cui si esegue lo script in un contesto di protezione che non hanno accesso a tutti gli spazi dei nomi. Se la distinzione tra maiuscole e minuscole, lo script ancora verrà eseguito, se verrà essere leggermente lento durante l'attesa di timeout.

Sì, è possibile solo utilizzare wbemtest.exe (è in ogni computer in cui è installato WMI) o (Scriptomatic go.microsoft.com/fwlink/?LinkId=125976) per eseguire questa operazione. Ma uno script di inizio e il competenze script importanti, è possibile filtrare tali spazi dei nomi o output di Excel o confrontare gli spazi dei nomi su due computer.

Ora che possiamo vedere suddivisa il repository, si sviluppare uno script che consente di esaminare novità in ciascuna delle sezioni. Sappiamo classi WMI vengono memorizzate in ciascuno dei tali spazi dei nomi, pertanto verranno innanzitutto elencare le.

Classi WMI

Ricordare menzionato che l'archivio WMI ospita Common Information Model? Tale modello è memorizzato all'interno il cimv2 dello spazio dei nomi (v2 per la versione 2). Esaminare lo spazio dei nomi CIMV2, dovrebbe essere visualizzato tutte le classi WMI che compongono tale modello. Lo script riportato di seguito esegue che:

strComputer = "."
Set objWMIService=GetObject("winmgmts: _
    {impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\cimv2")

For Each objclass in 
    objWMIService.SubclassesOf()
    Wscript.Echo objClass.Path_.Class
Next

Vediamo esattamente questo script funzionamento. La chiamata a GetObject restituisce un oggetto SWbemServices. Funzione GetObject è una funzione VBScript che restituisce i riferimenti agli oggetti COM tramite script. In questo caso, perché è trascorsa la stringa " winmgmts: … ", GetObject restituisce un oggetto alla raccolta di scripting WMI. Si noti che la stringa che viene passato a GetObject include lo spazio dei nomi a cui si desidera effettuare la connessione, \root\cimv2 in questo caso. Pertanto l'oggetto SWbemServices che è necessario utilizzare è associato allo specifico spazio dei nomi che è specificati. Consultare la documentazione di SWbemServices per visualizzare le possibili azioni è possibile eseguire lo script.

Uno che probabilmente molto familiare è ExecQuery. Questo è il metodo che consente di eseguire una query WQL (Windows Management Instrumentation Query Language) con lo spazio dei nomi a cui si è connessi. Ma ne esistono una serie di altre azioni che è possibile eseguire una volta ottenuto un oggetto SWbemServices associato a uno spazio dei nomi.

Si desidera visualizzare tutte le classi WMI nello spazio dei nomi e SubClassesOf esegue che. La documentazione indicante che restituisca un SWbemObjectSet. Che non sembrare come un'operazione può essere opportuno faccia singolarmente nel bosco. Concentrarsi solo le ultime tre lettere, è un insieme. E, come gli autori di script WMI noto, è possibile scorrere di un'utilizzando set for Each.

A questo punto, non troppo che ogni membro di un SWbemObjectSet è un SWbemObject. Ognuna delle tali SWbem­Objects rappresenta una delle classi WMI nello spazio dei nomi CIMV2. Esaminare la documentazione relativa a SWbem­Object e visualizzare tutte le informazioni è possibile output su tali classi.

Nello script, si è scelto di visualizzare solo il nome della classe. A tale scopo, è possibile accedere la proprietà Path_. Come si scopre, la proprietà Path_ è stessa un oggetto. Si tratta di un SWbemObjectPath e da un oggetto, è una serie di proprietà specifiche. Si utilizza la classe, ovvero il nome della classe.

Pertanto, non solo si dispone di uno script che può visualizzare tutti le classi WMI in uno spazio dei nomi, ma è inoltre disporre di uno script che può essere facilmente aggiornato per visualizzare diverse altre operazioni relative tali classi. Ad esempio, le classi WMI possono essere estensioni di altre classi WMI. Si supponga di disporre di un modello per un'automobile (Win32_Car), ma davvero è necessario gestire wagons workstation. Tutto il modello per l'auto all'wagon workstation.

Ma è necessario alcune operazioni aggiuntive, ad esempio un valore booleano che indica se dispone di tale paneling legno elaborata. Non si desidera ricreare tutte le funzionalità Win32_Car. Ciò che può essere opportuno è un meccanismo per estendere la classe Win32_Car per includere tutte le nuove proprietà. WMI include solo tali un meccanismo.

Per visualizzare se una classe WMI eredita le proprietà da un'altra classe WMI, è possibile controllare la proprietà Derivation_ della classe SWbemObject associata a tale classe WMI. Lo script in figura 2 visualizza lo spazio dei nomi CIMV2 insieme con un elenco di classi da cui derivano le classi WMI.

Nella figura 2 cimv2 classe derivazioni

strComputer = "."
Set objWMIService=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\cimv2")

For Each objclass in objWMIService.SubclassesOf()
    WScript.StdOut.Write objclass.Path_.Class
    arrDerivativeClasses = objClass.Derivation_ 
    For Each strDerivativeClass in arrDerivativeClasses 
       WScript.StdOut.Write " <- " & strDerivativeClass
    Next
    WScript.StdOut.Write vbNewLine
Next

    For Each objNameSpace in colNameSpaces
        Call EnumNameSpaces(strNameSpace & "\" & objNameSpace.Name)
    Next
End Sub

Lo script inizia da solo come quello precedente. Utilizza WScript.StdOut.Write anziché WScript.Echo per evitare di aggiungere automaticamente un carattere di nuova riga dopo la stringa visualizzata. (Nota: è necessario eseguire lo script utilizzando CScript.exe anziché Wscript.exe per StdOut.Write affinché.)

Osservando la documentazione relativa a SWbemObject, si noterà che dispone di una proprietà Derivation_. Tale proprietà è una matrice di stringhe contenente i nomi delle classi da cui è stata derivata dalla classe corrente. Nello script è scorrere tale matrice tramite For e vengono visualizzate tutte le classi separate da una freccia ascii. Una volta vengono utilizzati per inizia con l'oggetto SWbemServices restituito dalla funzione GetObject e sono esame tramite le possibilità nella documentazione di WMI Scripting Library, è possibile verificare proprietà e metodi in tali oggetti per trovare novità possibile denominati affatto.

Comprendere quale WMI Scripting Library oggetto che si sta utilizzando in qualsiasi punto nello script consente di spostare al livello successivo di script WMI. Invece di utilizzare solo script, consente di inoltre comprendere perché siamo riusciti a chiamare ExecQuery fare riferimento alla proprietà Properties_. E sarà in grado di eseguire ulteriori operazioni.

Lo strumento di Scriptomatic non live fino a aspettative? Nessun problema. Proseguire e modificarla per eseguire il risultato desiderato. Forse altri verrà acquistato la creazione dall'utente. In questo caso, solo posta istruzioni per indirizzo scripter@microsoft.com verifica con i dettagli relativi come si riceverà il titolo.

Proprietà

Ciascuna classe WMI modella qualcosa che è possibile gestire utilizzando un insieme di proprietà e metodi. Le proprietà sono le caratteristiche dell'aspetto. Un processo, ad esempio, dispone di un ID e una priorità e utilizza una quantità di memoria. Tutte queste proprietà sono incluse nella classe WMI Win32_Process.

Una volta è stata identificata la classe per gestire un'entità, esaminare le proprietà disponibili per verificare se si desidera gestire è il modello di gestione. La classe SWbemObject include una proprietà denominata Properties_. Divertente,? Il valore della proprietà è un oggetto SWbemPropertySet che include un insieme di oggetti SWbemProperty. Ognuna di tali oggetti SWbemProperty corrisponde a una proprietà nella classe WMI associata la SWbem­Object. È possibile sapere, tutti questi nomi SWbem * verificare tutti i dati audio così complicato, ma non tutti i non valido. Eseguire un'occhiata figura 3 .

fig03.gif

Nella figura 3 espone SWbemObject è associata la proprietà della classe WMI per whichit fare clic su Immagine per una visualizzazione ingrandita

Tenere presente che le classi che iniziano con SWbem * sono membri della libreria di oggetti di scripting WMI. Sono gli oggetti che consentono di lavorare con WMI. Non sono parte del modello WMI delle operazioni che è possibile gestire.

Nella Figura 3 , SWbemObject rappresenta una classe WMI, Win32_SomeClass, dispone di proprietà: Property_1, Property_2 e Property_3. Espone mediante la propria proprietà Properties_. Naturalmente, se è associato a un'altra classe WMI, Win32_SomeOther­Class, quindi il nome della relativa proprietà non viene modificato. È comunque Properties_. Ma le proprietà della classe a cui è associato probabilmente sarà diverse.

Essenzialmente, SWbemObject ha sulle proprietà della classe WMI specifica per cui è associato, ma consente di ottenere con tali proprietà diversi utilizzando lo stesso meccanismo Properties_. Chiaro? Richiedere un altro gulp di caffè e meditate nel diagramma. Tutti i diventerà crittografato.

Lo script nella Figura 4 sfrutta SWbemObject e la relativa proprietà Properties_ per recuperare e visualizzare tutte le proprietà della classe Win32_Service a WMI. È necessario conoscere l'estremità iniziale dello script. La modifica principale è che è valutare dello spazio dei nomi e la classe WMI, semplificare il loro modifica. Ad esempio, è possibile modificare solo il valore di strClass per Win32_BIOS per visualizzare le proprietà di tale classe anziché quelli di Win32_Service. Nel ciclo For Each, è scorrere L'SWbemPropertySet insieme (obj­Class.Properties) visualizzare il nome di ogni SWbemProperty.

Nella figura 4 ottenere le proprietà di Win32_Service

strComputer = "."
strNameSpace = "root\cimv2"
strClass = "Win32_Service"

Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\" & strNameSpace & ":" & strClass)

WScript.Echo strClass & " Class Properties"
WScript.Echo "------------------------------"

For Each objClassProperty in objClass.Properties_
    WScript.Echo objClassProperty.Name
Next

I metodi

Infine, alcune classi WMI vanno oltre le proprietà o caratteristiche di un'entità gestibile di modellazione e includono i metodi che consentono di accedere ai comportamenti o le azioni che può essere un'entità, o eseguita con esso.

Il formato dello script per restituire tutti i metodi di una classe WMI (illustrato nella Nella figura 5 ) esattamente Affianca lo script che restituisce le proprietà.

Nella figura 5 visualizzazione i metodi per una classe WMI

strComputer = "."
strNameSpace = "root\cimv2"
strClass = "Win32_Service"

Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\" & strNameSpace & ":" & strClass)

WScript.Echo strClass & " Class Methods"
WScript.Echo "---------------------------"

For Each objClassMethod in objClass.Methods_
    WScript.Echo objClassMethod.Name
Next

Naturalmente la differenza è che anziché la proprietà Properties_ viene utilizzata la proprietà Methods_. A questo punto, è possibile domandarsi sarebbe anche possibile visualizzare i tipi dei parametri di questi metodi accettano? Come si potrebbero visualizzare solo le classi WMI effettivamente dispongono di metodi? Questi sono i tipi di domande che è consigliabile scrivere script per rispondere al termine della lettura di questa colonna.

Probabilmente ti presentiamo è con una panoramica prima utile in come probe intensità di WMI. È necessario rendere la modalità tramite un insieme di strutture spesso di SWbem * s. Ma gli script forniscono un meccanismo interessante e leggero per passare completa. Inverno due amici camping non così fortunati. Sono non effettuate molto stretta. Si scopre una fornitura adeguata degli necessarie bevande fermented non era molto facilmente trasportati in intensità al centro della inverno.

lavoro The Scripting Guys , vengono utilizzate da, Microsoft. Quando non dedicano/coaching/visione al baseball (o a varie altre attività) eseguire il TechNet Script Center. Estrarre in www.scriptingguys.com.