Ok. Paso a responderte a las dudas y a mencionar varios de los fallos y/o imperfecciones del código que has mostrado...
ManagementObjectSearcher disco
= new ManagementObjectSearcher
("root\\CIMV2",
"SELECT *FROM Win32_LogicalDisk where drivetype=3");
Si de por si la infraestructura WMI es lenta, es todavía más lenta si devuelves todas las propiedades de una clase y sus herencias, para luego no usarlas en absoluto. Por ese motivo, usar el comodín o asterisco se podría considerar un mal hábito de programación.
En lugar de usar ese comodín, solamente selecciona aquellas propiedades que realmente necesites devolver/usar, en este caso:
"SELECT Size FROM Win32_LogicalDisk WHERE DriveType=3"
Ah, y ahora si, te debería funcionar.
De todas formas no necesitas realizar una consulta WMI para eso. Puedes obtener el tamaño y otra información de los HDD mediante la función
System.IO.DriveInfo.GetDrives(), la cual devolverá una colección de tipo
System.IO.DriveInfo. Además, ten en cuenta que en la propiedad
DriveInfo.DriveType se especifica el tipo de dispositivo mediante la enumeración
System.IO.DriveType (
DriveType.Fixed = 3 ).
double hd = hdd / 1024 / 1024/ 1024;
txtCdDuro.Text = hd.ToString();
Ese cálculo es innecesario, y la representación visual, imprecisa.
Para darle un formato de texto a un tamaño especificado en bytes, y como resultado del formato mostrar algo como "500 GB" o "2,5 TB", sencillamente puedes usar la función de Windows
StrFormatByteSize64:
De este modo obtendrás la misma representación textual que utiliza Windows para mostrar el tamaño de unidades y de archivos, en la unidad de tamaño más apropiada (ej. 1024 -> 1,00 KB).
private void btnRAM_Click(object sender, EventArgs e)
{
ManagementObjectSearcher cram
= new ManagementObjectSearcher
("root\\CIMV2",
"SELECT Capacity FROM Win32_PhysicalMemory");
UInt64 Capacity = 0;
foreach(ManagementObject ram in cram.Get())
{
Capacity += Convert.ToUInt64(ram["Capacity"]);
double cantidad = Capacity / 1024 / 1024 / 1024;
txtCdRam.Text = cantidad.ToString();
}
}
Me he fijado que en ese y en todos los demás métodos haces múltiples asignaciones a propiedades de los controles de la UI. En este caso la propiedad
txtCdRam.Text, deberías asignarla una única vez (fuera del búcle), ya que por cada iteración del búcle / slot de memoria establecerás un valor nuevo/incrementado a la propiedad
txtCdRam.Text. Lo mismo en el resto de búcles, ya que nada te asegura que vaya a haber un único elemento en la colección que iteras. Trata de corregir ese mal hábito de programación.
Lo mismo para el método donde haces doble reasignación de la hora/fecha actua (
System.Date.Now).
Aparte, y con respecto a lo de obtener el tamaño del disco, también es innecesario hacerlo mediante WMI, ya que simplemente puedes usar la propiedad
Microsoft.VisualBasic.Devices.ComputerInfo.TotalPhysicalMemory.
private void btnArquitectura_Click(object sender, EventArgs e) { }
Veo que el bloque de ese método está vacío. Supongo que es una de las cosas que te faltan por completar...
Bien. Para obtener la arquitectura puedes verificar el valor de la propiedad
System.Environment.Is64BitOperatingSystem, o también puedes usar la función
System.Environment.GetEnvironmentVariable con la variable de entorno
PROCESSOR_ARCHITECTURE para obtener directamente una representación textual ("x86" / "x64").
private void btnSO_Click(object sender, EventArgs e)
{
ManagementObjectSearcher w
= new ManagementObjectSearcher
("root\\CIMV2",
"SELECT * FROM Win32_OperatingSystem");
foreach(ManagementObject so in w.Get())
{
txtSO.Text = so.ToString();
}
}
Si lo que realmente pretendías era mostrar el nombre amistoso del sistema operativo actual, entonces debes obtener la propiedad
Caption de la clase WMI
Win32_OperatingSystem. Pero de todas formas esto es también innecesario pudiendo usar la propiedad
Microsoft.VisualBasic.Devices.ComputerInfo.OSFullName.
if(iP.AddressFamily.ToString() == "InterNetwork") {...}
¿Me puedes explicar, esa conversión y evaluación al tipo String, a cuento de que?.
Anda, no me hagas una chapuza así. Haz la evaluación como Dios manda:
using System.Net.Sockets;
If (iP.AddressFamily == AddressFamily.InterNetwork) {...}
private void btnTRed_Click(object sender, EventArgs e)
{
ManagementObjectSearcher tr
= new ManagementObjectSearcher
("root\\CIMV2",
"SELECT * FROM Win32_NetworkAdapter");
foreach(ManagementObject red in tr.Get())
{
txtTdeRed.Text = red["AdapterType"].ToString();
}
}
De nuevo, una consulta WMI no es necesaria aquí para obtener la información de los adaptadores de red...
foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) {
Console.WriteLine(adapter.NetworkInterfaceType.ToString());
}
la tarjeta de red nose como llamarlos del WMI
Esa duda queda respondida con el ejemplo de arriba / el uso de la función
System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces().
los tipo de datos numéricos son los que no puedo mostrar en un formulario,
El tipo de dato numérico que no podías obtener (tamaño del disco duro) ya quedó solucionado. Si hay alguno más, especifica.
la versión de BIOS
Propiedad
SMBIOSBIOSVersion de la clase WMI
Win32_BIOS...
Eso sería todo, suponiendo que no me haya dejado nada por resolverte.
EDITO: Si tienes alguna duda sobre como generar código en C# relacionado con consultas WMI, o si quieres explorar las clases de WMI para ver en tiempo real cual es el valor específico de cada propiedad, entonces te puede servir de ayuda la aplicación
WMI Code Creator de Microsoft, o mi programa favorito:
WMI Delphi Code Creator.
PD: Supongo que CDC podrían ser las siglas de un nombre, pero me suena como el canal de Youtube 'CDeCiencia', ¿es pura casualidad o tienes algo que ver?. xD Ya me gustaría ver por el foro a alguno de esos científicos youtubers formulando preguntas informáticas...
En fin. Un saludo.