About me| Chi sono?| BLOG
Chiara| Paola| Valentina| Francesca
Home| Download| Poesie | Poems| Immagini | Pictures| Articoli | Papers| Winamp Plugins
English
› Home › Download › Poems › Pictures » Technical Papers › Winamp Plugins
Italiano
› Principale › Download › Poesie › Immagini » Articoli IoProgrammo › Plugins per Winamp

Informazioni Hardware (WMI)

 
	/*  06/03/2004  -  InfoPC.cs -   Salvatore Meschini  -  Scrive
    su Console  alcune informazioni relative al computer Verranno  mostrate   un
    paio    di   tecniche     per  la    gestione   delle     classi  WMI:    1)
    ManagementClass+ManagementObjectCollection   2)   WQL   Si    consulti    la
    documentazione  su System.Management per  scoprire altri metodi Compilazione
    dal  prompt DOS:  csc   InfoPC.cs Esecuzione dal  DOS-prompt:  InfoPc.exe (o
    più  semplicemente InfoPc)  Il  codice   è  molto   semplice  ed ha  l'unica
    finalità  di  illustrare al  lettore l'esistenza di: WMI, System.Management,
    WQL. */ 

/*      Nella      prossima      "puntata"      parleremo      della      classe
System.Diagnostics.PerformanceCounter */ 

using System; 
// Classi WMI (Windows Management Instrumentation) e non solo!
using System.Management; 
 
namespace InfoPC 
{ 
/* Per non complicare le cose evitiamo di creare una nuova classe (oltre a Class) e mettiamo tutto nel Main... */ 
class Class 
{ 

[STAThread] 
static void Main(string[] args) 
{ 
// Sistema Operativo (nome, versione, nome del computer) 
ManagementClass InfoOS = new ManagementClass("Win32_OperatingSystem"); 
ManagementObjectCollection Oggetti = InfoOS.GetInstances(); 
// Oggetti espone un metodo GetEnumerator (è una collezione!):uso foreach 
foreach(ManagementObject wmiObject in Oggetti) 
{ 
Console.WriteLine(wmiObject.GetPropertyValue("Caption")); 
Console.WriteLine(wmiObject.GetPropertyValue("CSDVersion")); 
Console.WriteLine(wmiObject.GetPropertyValue("Version")); 
Console.WriteLine(wmiObject.GetPropertyValue("CSName")); 

/* Ed ora un'altra tecnica... Avete presente il linguaggio SQL? E' il momento di imparare WQL!!! :-) */ 
System.Management.ObjectQuery InfoProcessore = new System.Management.ObjectQuery("SELECT * FROM Win32_processor"); 
ManagementObjectSearcher Lista = new ManagementObjectSearcher(InfoProcessore); 
foreach (ManagementObject Dato in Lista.Get()) 
{ 
// Informazioni sul processore 
Console.Write(Dato["Manufacturer"]+ " "+ Dato["Caption"]+ " "+ Int64.Parse(Dato["MaxClockSpeed"].ToString())+"MHz"); 
} 
/* OUTPUT: 
Microsoft Windows XP Professional 
Service Pack 1 
5.1.2600 
SAL 
GenuineIntel x86 Family 15 Model 2 Stepping 7 1998MHz 
*/ 

/* 
N.B. Altre informazioni interessanti sono ricavabili da Win32_LogicalMemoryConfiguration (es."TotalPhysicalMemory", 
"TotalVirtualMemory", ...), da Win32_VideoController, Win32_Share, Win32_Service, Win32_NetworkConnection, Win32_LogicalDisk,etc. 
Consultate la documentazione delle classi WMI su MSDN. WMI è uno strumento molto potente e versatile ma anche relativamente complesso! 
WMI non serve solo per reperire informazioni ma consente agli amministratori di sistema di effettuare una GESTIONE COMPLETA di: Windows, IIS, SQL Server,... 
*/ 

} 

} 
} 
} 
NEO77: Dopo innumerevoli ostacoli, ore ed ore di fatica, notti insonni... ...ero finalmente pronto a postare la mia soluzione per la lettura di informazioni sull'hardware , quando mi sono accorto che Salvatore (MITICO!) mi aveva preceduto... ...complimenti! Posto comunque il mio codice, specifico per le schede di rete:
using System.Management; ... ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach(ManagementObject mo in moc) { try { if ((bool)mo["IPEnabled"]==true) { Console.WriteLine("--------------------------------------------------------"); Console.WriteLine(mo["Caption"].ToString()); Console.WriteLine("--------------------------------------------------------"); foreach(System.Management.PropertyData pd in mo.Properties) { Console.WriteLine(pd.Name + ": " + pd.Value); } } } catch (System.Exception ex) { Console.WriteLine(ex.ToString()); } } Console.WriteLine("Premere un tasto per continuare..."); Console.ReadLine();

Il .NET Framework SDK include un programma che semplifica notevolmente la gestione delle entità WMI (Windows Management Instrumentation). L'eseguibile è denominato MgmtClassGen.exe e si trova nella directory \BIN del kit di sviluppo. MgmtClassGen sta per Management Strongly Typed Class Generator, dal nome potete intuire che la sua funzione principale è la generazione di una classe gestita. Tale classe agevola il compito del programmatore. Eseguendo MgmtClassGen.exe senza specificare parametri si ottiene:

Microsoft (R) Management Strongly Typed Class Generator Version 1.1.4322.573 Copyright © Microsoft Corporation 1998-2002. All rights reserved. MgmtClassGen [opzioni] /N WMI Spazio dei nomi WMI contenente la classe. Predefinito a root\cimv2 /O .NET spazio dei nomi, nel quale la classe viene generata /L Uno dei seguenti. Predefinito CS CS - CSharp(C#) VB - Visual Basic JS - JScript /P Percorso file di output /M Computer remoto da connettere. Predefinito computer locale /U Nome utente /PW Password /? Mostra questa schermata della guida Esempio : MgmtclassGen Win32_Logicaldisk /L VB /N root\cimv2 /P c:\temp\logicaldisk.vb I linguaggi supportati sono C#, VB.NET e JScript (gli amministratori di sistema abituati a creare script WMI gradiranno!). I passaggi necessari per utilizzare MgmtClassGen.exe sono essenzialmente tre: 1) Si trova lo Spazio dei nomi WMI di cui abbiamo bisogno nella documentazione del .NET Framework 2) Si genera la classe con MgmtClassGen.exe (l'esempio è molto chiaro!) 3) Si include la classe generata nel proprio progetto (VS. NET, C# Builder, Sharp Develop, ...). Arrivati a questo punto non resta che gestire opportunamente la classe! ----------------------------------------------------- Per ottenere la lista delle entità WMI presenti si può eseguire il seguente programma: // Enumera entità WMI - Salvatore Meschini // Compilazione: csc WMIEnum.cs // Esecuzione WMIEnum > Lista.txt using System; using System.Collections; using System.Management; namespace WMIEnum { class Enumeratore { [STAThread] static void Main(string[] args) { ManagementClass RadiceWMI = new ManagementClass(); // Crea Radice EnumerationOptions Opzioni = new EnumerationOptions(); Opzioni.EnumerateDeep = true; // Enumerazione completa! ArrayList Lista = new ArrayList(4096); // Capacità iniziale = 4096 elementi foreach(ManagementObject Cls in RadiceWMI.GetSubclasses(Opzioni)) { Lista.Add(Cls["__Class"]); // Aggiungi una classe alla lista } Lista.Sort(); // Ordina alfabeticamente la lista Console.WriteLine("Ho trovato {0} classi!",Lista.Count); for (int i=0; i < Lista.Count; i++) Console.WriteLine("{0}) {1}",i+1,Lista[i]); // Scrivi su Console } } } La lista base contiene circa 900 voci!
Click here - Clicca qui