/* 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:
Click here - Clicca quiMicrosoft (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!