Gestione -

Inventari client avanzati con SMS

Wes Dobry

 

Panoramica:

  • Utilizzo di Hardware Inventory Agent di SMS 2003
  • Espansione di inventari con i file MIF
  • File MOF dinamici e statici

Scarica il codice per questo articolo: DobrySMSInventory2007_04.exe (152KB)

A ogni amministratore, almeno una volta nella vita, è capitato di imbattersi in una situazione in cui il proprio capo abbia avanzato la richiesta di cercare una serie di informazioni la cui raccolta richiedeva un notevole impegno e lavoro. Immaginiamo tuttavia di trovarci di fronte a un amministratore lungimirante

che abbia già raccolto i dati richiesti. Egli potrebbe pertanto fornire al proprio capo le informazioni richieste in modo istantaneo, evitando inutili tempi di inattività, eliminando la necessità di ore di straordinario ed eventualmente garantendo alla propria società un risparmio non indifferente in termini di denaro. Potrebbe diventare un vero e proprio eroe.

Microsoft® Systems Management Server (SMS) 2003 consente di raccogliere un'estesa quantità di informazioni. Non è tuttavia in grado di raccogliere qualsiasi tipo di informazione. Per impostazione predefinita, SMS 2003 non fornisce ad esempio alcuna informazione sui gruppi locali e i relativi membri o sugli utenti locali e i rispettivi attributi. La mancata disponibilità di queste informazioni può rappresentare un problema nel caso in cui, ad esempio, un tecnico inserisca il gruppo Domain Users o Everyone nel gruppo Administrators locale in ciascun sistema utilizzato. Si supponga inoltre che una società non sia in alcun modo in grado di sapere quali elenchi di esclusione di file e cartelle locali siano inclusi nella soluzione antivirus/antispyware aziendale. Questo potrebbe non sembrare un problema di fondamentale importanza, almeno finché qualcuno nel settore IT non si accorga che gli utenti stanno includendo c:\*.*nell'elenco di esclusione.

Con la giusta combinazione delle conoscenze acquisite in relazione ai linguaggi di script, al servizio Windows® Management Instrumentation (WMI) e a SMS è possibile espandere gli inventari SMS in modo che siano in grado di contenere pressoché qualsiasi tipo di informazione. Questa espansione è resa possibile grazie all'utilizzo dei file MIF (Management Information Format) e MOF (Management Object Format).

Esecuzione di un inventario

Con SMS, le organizzazioni sono in grado di eseguire distribuzioni, personalizzate, monitorare le destinazioni e gestire i sistemi distribuiti. L'espansione degli inventari SMS consente di creare e gestire una destinazione molto più personalizzata. È possibile, ad esempio, applicare criteri di protezione locali aziendali distribuendo i criteri di protezione su sistemi i cui criteri sono stati modificati da un utente. È inoltre possibile disattivare account utente locali non approvati e rimuovere amministratori locali estranei.

Le organizzazioni utilizzano naturalmente SMS per ottenere in modo tempestivo informazioni dettagliate sui sistemi locali. L'espansione degli inventari consente di creare report con informazioni completamente personalizzate di cui non si potrebbe disporre in maniera immediata nel caso in cui si utilizzassero esclusivamente inventari predefiniti. Le informazioni possono essere inoltre molto granulari. Si supponga, ad esempio, di creare un report contenente il numero di sistemi che dispongono di una specifica chiave del Registro di sistema che fa riferimento a una determinata server farm. Questo consentirebbe agli amministratori di stimare in maniera approssimativa il numero di client che fanno riferimento a ciascuna farm in un determinato momento. Analogamente, il team di protezione può verificare quali sistemi in rete eseguono uno specifico processo noto come spyware.

Il valore dei file MIF e MOF deriva dalla capacità di immettere informazioni provenienti da quasi qualsiasi fonte con un minimo di manipolazione.??? Se sono basate su testo, le informazioni possono essere modificate e inserite in WMI con un file MOF o raccolte sotto forma di file MIF e inviate al successivo ciclo di inventario hardware. L'implementazione dell'espansione di un inventario prevede che si abbia una certa familiarità con il linguaggio VBScript o JScript® e che si sappia con esattezza quali informazioni si intende raccogliere. Considerato che è possibile raccogliere praticamente qualsiasi tipo di informazione, le competenze richieste possono spaziare dalla conoscenza generale di WMI alla conoscenza approfondita di SQL. La comprensione di SQL è naturalmente un requisito essenziale, indipendentemente dal tipo di informazione che si intende raccogliere, in quanto potrebbe essere necessario ricorrere a tali conoscenze nel caso in cui si presentasse la necessità di inserire in report i dati raccolti.

Funzionamento degli inventari

SMS contiene due tipi di processi di inventario: hardware e software. Gli inventari software includono solo informazioni sui file, indicando ad esempio la posizione in cui risiedono, le relative versioni, le dimensioni e altri attributi dei file. Tuttavia, il processo dell'inventario software consente anche di raccogliere i file e archiviarli nel server del sito.

L'espansione degli inventari hardware è un'attività piuttosto semplice in quanto gli inventari hardware contengono la più ampia gamma di informazioni relative a un sistema. Le informazioni negli inventari hardware vengono acquisite principalmente da WMI, dal Registro di sistema e dal BIOS di sistema.

Gli inventari hardware vengono raccolti in base a una pianificazione, che viene specificata nelle impostazioni del sito di Hardware Inventory Agent in SMS 2003. È possibile impostare le raccolte in modo che vengano eseguite con una frequenza massima di una volta al minuto o una frequenza minima di una volta dopo diversi mesi. In genere, è consigliabile trovare il giusto equilibrio tra l'esigenza di raccogliere le informazioni desiderate alla massima velocità richiesta dalla gestione e la necessità di evitare un carico eccessivo sulla rete, i server del sito, i punti di gestione o i client.

Quando Hardware Inventory Agent viene installato per la prima volta, viene automaticamente compilato il file sms_def.mof. Questo file contiene tutte le informazioni raccolte inizialmente da SMS. Quando questo file viene compilato, tutti gli spazi dei nomi SMS e le classi associate necessarie per Hardware Inventory Agent vengono creati in WMI. La maggior parte di questi elementi risiede nello spazio dei nomi \\.\root\CIMv2\SMS. Una volta completata l'installazione, Hardware Inventory Agent analizza la maggior parte di queste classi per creare le informazioni che verranno successivamente inviate al punto di gestione ed eventualmente al database del sito.

File MIF

Oltre a estrarre informazioni dalle classi WMI, Hardware Inventory Agent esegue la ricerca dei file MIF nelle cartelle delle raccolte NOIDMIF e IDMIF. Tutti i file MIF che l'agente trova in tali cartelle vengono elaborati nel successivo inventario hardware.

I file MIF forniscono il metodo più semplice per espandere l'inventario hardware SMS. Sono disponibili due tipi di file MIF: NOIDMIF e IDMIF. Questi sono file statici in formato XML che possono contenere praticamente qualsiasi tipo di informazione che un utente potrebbe desiderare di inserire nel database SMS. Possono essere creati con lgi stessi metodi utilizzati per creare normali file di testo. È possibile pertanto creare questi file tramite la maggior parte dei linguaggi di script o manualmente.

In genere, i file MIF vengono utilizzati in situazioni in cui le informazioni non sono contenute nel Registro di sistema o in WMI oppure quando è necessario immettere le informazioni manualmente. Questi file possono essere creati, ad esempio, quando il team di distribuzione dell'hardware rilascia un nuovo sistema. Il tecnico responsabile della distribuzione può accedere a un'applicazione HTML nel sistema e immettere tutte le informazioni sulle risorse da utilizzare per l'aggiornamento di un database di gestione delle risorse. Successivamente, questa applicazione crea in modo dinamico un file NOIDMIF e consente al tecnico di eseguire il download del file nella cartella delle raccolte del file NOIDMIF. Il file NOIDMIF può contenere tutte le informazioni immesse dal tecnico ed è incorporato nel database SMS.

Le differenze tra i file NOIDMIF e IDMIF sono minime. Un file IDMIF contiene un'intestazione univoca che fornisce informazioni sull'architettura e un ID univoco. I file IDMIF possono essere utilizzati per incorporare i dispositivi non di sistema in SMS come entità proprie. È possibile, ad esempio, utilizzare uno script per creare sistemi in SMS che corrispondono in realtà a stampanti e scrivere le informazioni su tali sistemi nel database SMS.

I file NOIDMIF e IDMIF vengono archiviati in percorsi standard, specificati dalle chiavi del Registro di sistema. In genere, vengono archiviati in %SYSTEMROOT%\system32\ccm\Inventory\NOIDMIF e ...\IDMIF, partendo dal presupposto che l'agente SMS sia stato installato nel percorso predefinito. Se l'agente è stato installato in un percorso personalizzato, le directory MIF dovrebbero risiedere in %CCMAGENTINSTALLDIR%\Inventory\NOIDMIF e ...\IDMIF. Per eventuali dubbi sui percorsi di tali directory, è possibile trovare i percorsi elencati nelle chiavi del Registro di sistema seguenti:

HKEY_LOCAL_MACHINE\Software\Microsoft\SMS\
Client\Configuration\Client Properties\NOIDMIF Directory

HKEY_LOCAL_MACHINE\Software\Microsoft\SMS\
Client\Configuration\Client Properties\IDMIF Directory

I file MIF hanno sempre lo stesso formato, indipendentemente dalle informazioni raccolte. Se si esamina il file MIF illustrato nella Figura 1, si potrà notare che il file è composto da un singolo componente che contiene più gruppi e un singolo attributo in ciascun gruppo. Sebbene siano necessarie tutte le sezioni del file, non occorre tuttavia disporre di più di un gruppo o voce di attributo. Ciascun gruppo all'interno del file MIF può essere considerato come una riga all'interno dei dati della sezione specificata nell'inventario hardware e ogni attributo all'interno del gruppo può essere considerato come una colonna di tale riga.

Figure 1 LocalAdmins.mif

Start Component
  Name = “WORKSTATION”
    Start Group
        Name = “Local Admins”
        ID = 1
        Class = “Microsoft|LocalAdminsMIF|1.0”
        Start Attribute
            Name = “Account”
            ID = 1
            ACCESS = READ-ONLY
            Storage = Specific
            Type = String(100)
            Value = “Win32_UserAccount.Domain=’Contoso’,Name=’Domain Admins’”
        End Attribute
    End Group
    Start Group
        Name = “Local Admins”
        ID = 2
        Class = “Microsoft|LocalAdminsMIF”
        Start Attribute
            Name = “Account”
            ID = 1
            ACCESS = READ-ONLY
            Storage = Specific
            Type = String(100)
            Value = “Win32_UserAccount.Domain=’Contoso’,Name=’Technicians’”
        End Attribute
    End Group
    Start Group
        Name = “Local Admins”
        ID = 3
        Class = “Microsoft|LocalAdminsMIF”
        Start Attribute
            Name = “Account”
            ID = 1
            ACCESS = READ-ONLY
            Storage = Specific
            Type = String(100)
            Value = “Win32_UserAccount.Domain=’Example-PC’,Name=’Administrator’”
        End Attribute
    End Group
    Start Group
        Name = “Local Admins”
        ID = 4
        Class = “Microsoft|LocalAdminsMIF”
        Start Attribute
            Name = “Account”
            ID = 1
            ACCESS = READ-ONLY
            Storage = Specific
            Type = String(100)
            Value = “Win32_UserAccount.Domain=’Example-PC’,Name=’RandomUser’”
        End Attribute
    End Group
End Component

Il file LocalAdmin.vbs, illustrato nella Figura 2, rappresenta un esempio piuttosto semplice di linguaggio VBScript. Questo file di esempio cerca la directory di NOIDMIF, elimina il file MIF temporaneo, se disponibile, crea il file MIF temporaneo, scrive in modo ricorsivo nel file le informazioni raccolte tramite una semplice query WMI, elimina il file MIF contenuto nella cartella delle raccolte di NOIDMIF e infine sposta il file NOIDMIF temporaneo nella cartella delle raccolte di NOIDMIF.

Figure 2 LocalAdmin.vbs

On Error Resume Next

Const ForAppending = 8

Set objWshShell = CreateObject(“WScript.Shell”)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

strTempDir = objWshShell.ExpandEnvironmentStrings(“%TEMP%”)
strWinDir = objWshShell.ExpandEnvironmentStrings(“%WINDIR%”)
strComputerName = objWshShell.ExpandEnvironmentStrings(“%COMPUTERNAME%”)
strNoIDMifRegLocation = “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Client\Configuration\Client “ _
   & “Properties\NOIDMIF Directory”
strNoIDMifDirectory = objWshShell.RegRead(strNoIDMifRegLocation)
strMifFileName = “\LocalAdmins.mif”
strClassID = “Microsoft|LocalAdminsMIF|1.0”

If objFSO.FileExists(strTempDir & strMifFile) Then
   objFSO.DeleteFile(strTempDir & strMifFile)
End If

Set objMifFile = objFSO.OpenTextFile(strTempDir & strMifFileName, ForAppending, True)

objMifFile.Writeline “Start Component”
objMifFile.Writeline “ Name = “ & Chr(34) & “WORKSTATION” & Chr(34)

strWBEMQuery = “SELECT partcomponent FROM win32_groupuser WHERE groupcomponent = “ & Chr(34) _
   & “\\\\” & strComputerName & “\\root\\cimv2:Win32_Group.Domain=\” & Chr(34) & strComputerName _
   & “\” & Chr(34) & “,Name=\” & Chr(34) & “Administrators\” & Chr(34) & Chr(34)

Set objWBEM = CreateObject(“WbemScripting.SWbemLocator”)
Set objWBEMServer = objWBEM.ConnectServer(, “root\cimv2”)
Set colResults = objWBEMServer.ExecQuery(strWBEMQuery)

i = 1
For Each objItem in colResults
         objMifFile.Writeline “ Start Group”
         objMifFile.Writeline “ Name = “ & Chr(34) & “Local Admins” & Chr(34)
         objMifFile.Writeline “ ID = “ & i
         objMifFile.Writeline “ Class = “ & Chr(34) & strClassID & Chr(34)
         objMifFile.Writeline “ Start Attribute”
         objMifFile.Writeline “ Name = “ & Chr(34) & “Account” & Chr(34)
         objMifFile.Writeline “ ID = 1”
         objMifFile.Writeline “ ACCESS = READ-ONLY”
         objMifFile.Writeline “ Storage = Specific”
         objMifFile.Writeline “ Type = String(100)”
         strUserName = objItem.PartComponent
         strUserName = mid(strUserName, instr(1, strUserName, chr(58)) + 1)
         If Instr(1, strUserName, Chr(92), 1) > 0 Then 
                  strUserName = Replace(strUserName, Chr(92), Chr(92) & Chr(92), 1, -1, 1)
         End If
         If Instr(1, strUserName, Chr(34), 1) > 0 Then
                  strUserName = Replace(strUserName, Chr(34), Chr(39), 1, -1, 1)
         End If

         objMifFile.Writeline “ Value = “ & Chr(34) & strUserName & Chr(34)
         objMifFile.Writeline “ End Attribute”
         objMifFile.Writeline “ End Group”
         i = i + 1
Next

objMifFile.Writeline “End Component”
objMifFile.Close

If objFSO.FileExists(strNoIDMifDir & strMifFileName) Then
   objFSO.DeleteFile(strNoIDMifDir & strMifFileName)
End If

objFSO.MoveFile strTempDir & strMifFileName, strNoIDMifDir & strMifFileName

Sebbene i file MIF forniscano un metodo semplice per espandere l'inventario hardware SMS, è consigliabile prendere in considerazione alcuni fattori durante l'utilizzo di questi file. I file MIF vengono elaborati in ogni ciclo di inventario hardware. Tuttavia, poiché questi file vengono creati, raccolti, analizzati e infine inseriti nell'inventario, è possibile che la visualizzazione nell'inventario delle informazioni contenute in un file MIF venga ritardata di un ciclo di inventario hardware. Ne consegue che se una società dispone di cicli di inventario hardware della durata di un giorno, i dati nel database del relativo sito potrebbero risalire a due giorni prima. È pertanto necessario prestare particolare attenzione al momento in cui i programmi progettati per la creazione dei file MIF vengono annunciati e al momento in cui il ciclo di inventario hardware viene eseguito.

Si supponga ad esempio che una società denominata Contoso disponga di cicli di inventario di un giorno che vengono eseguiti a mezzanotte. Lunedì alle ore 13:00 viene eseguito un VBScript, che determina la creazione di un file NOIDMIF contenente l'output di uno scanner rootkit. Questo output viene raccolto a mezzanotte e restituito al punto di gestione. L'amministratore SMS di Contoso esamina tali informazioni il mercoledì sera alle ore 22:00 circa e rileva che le informazioni risalgono a 45 ore prima. Questa situazione si verifica in quanto l'amministratore SMS non ha considerato con attenzione quando annunciare il programma utilizzato per la creazione del file NOIDMIF.

File MOF

I file MOF sono più complessi rispetto ai file MIF. Presentano tuttavia un vantaggio rispetto ai file MIF, in quanto sono in grado di immettere le informazioni direttamente in WMI e diventano parte del processo di raccolta dei dati standard di Hardware Inventory Agent. Pertanto, potrebbe non essere necessario annunciare continuamente un VBscript per recuperare le informazioni necessarie, con un conseguente risparmio di tempo e frustrazione. Il file MOF può essere invece annunciato una sola volta per ogni computer e viene automaticamente compilato.

I file MOF offrono inoltre il vantaggio di rendere disponibili informazioni aggiornate in base al resto dei dati contenuti nell'inventario hardware. Ogni volta che Hardware Inventory Agent esegue il relativo ciclo, viene eseguita una query sulle classi e sui provider descritti nel file MOF e le informazioni vengono restituite in tempi brevissimi. Quando occorre ottenere informazioni in tempi rapidi, è possibile eseguire un pacchetto contenente il file MOF e un VBScript, iniziando un inventario hardware. Il tempo impiegato per acquisire le informazioni necessaire è pari alla durata di un ciclo di criteri di un programma annunciato.

I file MOF vengono classificati in tre categorie: file MOF per una classe e uno spazio dei nomi WMI esistenti, file MOF per una classe aggiuntiva con un provider WMI esistente e file MOF per una classe aggiuntiva che non dispone di un provider WMI.

I file MOF contengono due parti. La prima parte è la sezione relativa alla definizione degli spazi dei nomi. In questa sezione vengono identificate le informazioni del provider WMI. La seconda sezione contiene gli attributi di report di SMS. Questa sezione indica a Hardware Inventory Agent la posizione in cui cercare ed elaborare le informazioni contenute nelle classi WMI sopra citate. Poiché i file MOF gestiscono WMI direttamente, se si intende utilizzare questi file è consigliabile dedicare un po' di tempo alla consultazione del Software Development Kit (SDK) di Microsoft WMI (per ulteriori informazioni, visitare il sito Web all'indirizzo go.microsoft.com/fwlink/?LinkID=83121).

Ciascuna delle classificazioni sopra riportate dei file MOF può essere statica o dinamica. Si dispone, ad esempio, di un file MOF statico se la procedura di creazione della società prevede la creazione di un file MOF contenente informazioni relativi agli utenti responsabili della creazione del sistema, alla versioni build dei server utilizzate, alle versioni build iniziali, alla data di creazione del computer e così via. Poiché non è necessario aggiornare queste informazioni, è possibile inserirle direttamente nel file MOF e compilarle in WMI mediante mofcomp.exe. Successivamente, è necessario espandere l'area in cui Hardware Inventory Agent esegue la ricerca aggiungendo le informazioni relative a gruppi e classi al file sms_def.mof sul server del sito.

Un file MOF dinamico è simile a un file MOF statico, tranne per il fatto che, anziché scrivere le informazioni raccolte direttamente in WMI, i dati vengono raccolti tramite un provider WMI. Un provider WMI è un plug-in che consente a un'applicazione o un servizio di immettere le informazioni direttamente in WMI. Questo provider consente l'accesso dinamico ad altre aree di WMI e del sistema, ad esempio informazioni relative al Registro di sistema, ai percorsi dei file e a Windows Installer.

Per quanto concerne l'utilizzo dei file MOF, il metodo più semplice per migliorare l'inventario hardware consiste nel configurare l'inventario in modo che venga catalogata una quantità di informazioni maggiore rispetto a quella già presente in WMI. Questa operazione può essere eseguita estendendo il file sms_def.mof o attivando classi di report aggiuntive che sono correntemente disattivate. Il file sms_def.mof si trova nella cartella \\siteserver\SMS_<codicesito>\inboxes\clifiles.src\hinv. Tutti i dispositivi all'interno dell'azienda inseriranno il nuovo file sms_def.mof nel successivo ciclo di criteri del computer e inizieranno a raccogliere e a restituire le informazioni.

Il secondo approccio, in termini di difficoltà, prevede l'utilizzo di un provider WMI esistente ma la creazione di una nuova classe. Un esempio di questo approccio è illustrato nella Figura 3. In questo esempio, utilizzando il provider del Registro di sistema incorporato, la classe CU_Desktop viene creata con una proprietà dinamica che esegue una query su HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper nel dispositivo locale. Una volta compilato il file MOF sul client, è necessario aggiungere le informazioni contenute in SMS_Def_Extension.mof (vedere la Figura 4) a sms_def.mof. Il file contiene informazioni relative a se SMS deve restituire informazioni su di esso, al nome del gruppo, all'ID della classe, alla classe che Hardware Inventory Agent deve esaminare in WMI per individuare le informazioni da inserire nel report e, infine, ai valori effettivi.

Figure 4 SMS_Def_Extentions.mof

#pragma namespace ("\\\\.\\root\\CIMv2\\sms")
 [ SMS_Report    (TRUE),
  SMS_Group_Name ("Current User Desktop"),
  SMS_Class_ID   ("MICROSOFT|CU_Desktop|1.0") ]
class Power_Mgmt : SMS_Class_Template
{
    [SMS_Report(TRUE),key]
        string  index;
    [SMS_Report(TRUE)]
    sint32   CurrentUserDesktop;
};

Figure 3 CurrentUserDesktop.mof

#pragma namespace(“\\\\.\\root\\CIMv2”)
// Registry property provider
instance of __Win32Provider as $PropProv
{
    Name    =”RegPropProv” ;
    ClsID   = “{72967901-68EC-11d0-B729-00AA0062CBB7}”;
    ImpersonationLevel = 1;
    PerUserInitialization = “FALSE”;
};
instance of __PropertyProviderRegistration
{
    Provider       =$PropProv;
    SupportsPut    =TRUE;
    SupportsGet    =TRUE;
};
[DYNPROPS]
class CU_Desktop
{
    [key]
    string  index = “current”;
    sint32 CurrentUserDesktop;
};
[DYNPROPS]
instance of CU_Desktop
{
     [PropertyContext(“local|HKEY_CURRENT_USER\\Control Panel\\Desktop|Wallpaper”),
        Dynamic, Provider(“RegPropProv”)]
        CurrentUserDesktop;
};

I file MOF sono in grado inoltre di accedere alle informazioni fornite dai provider WMI che non sono incluse per impostazione predefinita nei sistemi. Per utilizzare questi provider, il provider WMI deve essere distribuito e installato prima della compilazione del file MOF sul client e prima dell'estensione del file sms_def.mof.

Conclusione

I file MIF e MOF sono strumenti potenti per raccogliere in modo rapido ed efficace le informazioni desiderate. Questi formati di file forniscono una struttura di base per inserire con facilità le informazioni desiderate nel database SMS senza modificare direttamente le tabelle. È possibile includere in inventari e in report pressoché qualsiasi tipo di informazioni. Ma, cosa più importante, è possibile evitare situazioni problematiche, in quanto gli amministratori possono operare in modo proattivo per raccogliere informazioni di importanza cruciale.

Il funzionamento dei file MIF e MOF non è di immediata comprensione. Sono tuttavia disponibili alcune risorse utili in cui vengono fornite informazioni sulla modalità di utilizzo di questi file. Per iniziare, consultare la Documentazione e l'SDK di WMI, oltre alla Guida operativa di Systems Management Server 2003. Si consiglia di dedicare tutto il tempo necessario alla comprensione di tali concetti in quanto l'utilità delle informazioni acquisite da un inventario SMS esteso può superare di gran lunga quella dei dati in esso inseriti.

Wes Dobry vive a Orlando, un'area della Florida in cui lavora come consulente e amministratore di rete per una grossa azienda che opera nel settore della sanità. È possibile contattarlo all'indirizzo wesdobry@wesdobry.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.