Hola necesito ayuda con un programa

Iniciado por CDC33, 3 Junio 2019, 20:43 PM

0 Miembros y 2 Visitantes están viendo este tema.

CDC33

Necesito hacer un programa que me muestre la información de mi hardware con el lenguaje de programación C#, ya investigue un poco pero hay algunas cosas que aun no las he podido sacar estoy utilizando WMI para ver el hardware

Eleкtro

#1
Cita de: CDC33 en  3 Junio 2019, 20:43 PM
Necesito hacer un programa que me muestre la información de mi hardware con el lenguaje de programación C#, ya investigue un poco pero hay algunas cosas que aun no las he podido sacar estoy utilizando WMI para ver el hardware

Yo necesito, tu necesitas, él necesita, ellos necesitan, nosotros necesitamos, sin duda la peor forma en la que puedes comenzar a escribir una duda de programación...

Por cierto, ¿cual es tu duda?. Especifica que información te falta por obtener, y trata de compartir un código para demostrar que lo has intentado hacer por ti mismo. Aquí no se hacen tareas.

Aporta lo que se te solicita, y con gusto te ayudaré(mos).

Saludos.








CDC33

los tipo de datos numéricos son los que no puedo mostrar en un formulario,la versión de Bios  la tarjeta de red nose como llamarlos del WMI

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Management;

namespace MiPrimerFormulario
{
    public partial class Usuario : Form
    {
        public Usuario()
        {
            InitializeComponent();
        }

        private void btnMostrarUsuario_Click(object sender, EventArgs e)
        {
            txtUsuario.Text = Environment.UserName;
        }

        private void btnMDominio_Click(object sender, EventArgs e)
        {
            txtDominio.Text = Environment.UserDomainName;
        }

        private void btnMDirectorio_Click(object sender, EventArgs e)
        {
            txtDirectorio.Text = Environment.CurrentDirectory;
        }

        private void btnMIP_Click(object sender, EventArgs e)
        {
            IPHostEntry host;
            host = Dns.GetHostEntry(Dns.GetHostName());

            foreach(IPAddress iP in host.AddressList)
            {
                if(iP.AddressFamily.ToString() == "InterNetwork")
                {
                    txtIP.Text = iP.ToString();
                }
            }
        }

        private void btnProcesador_Click(object sender, EventArgs e)
        {
            ManagementObjectSearcher s = new ManagementObjectSearcher("root\\CIMV2", "SELECT *FROM Win32_Processor");
            foreach(ManagementObject pro in s.Get())
            {
                txtProcesador.Text = pro["Name"].ToString();
            }
        }

        private void hora_Tick(object sender, EventArgs e)
        {
            lbHora.Text = DateTime.Now.ToLongTimeString();
            lbFecha.Text = DateTime.Now.ToLongDateString();
        }

        private void btnCdDuro_Click(object sender, EventArgs e)
        {
            ManagementObjectSearcher disco = new ManagementObjectSearcher("root\\CIMV2", "SELECT *FROM  Win32_LogicalDisk where drivetype=3");
            foreach(ManagementObject dd in disco.Get())
            {
                long hdd = Int64.Parse(dd["Size"].ToString());
                double hd = hdd / 1024 / 1024/ 1024;
                txtCdDuro.Text = hd.ToString();
            }
        }

        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();
            }
        }

        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();
            }
        }

        private void btnNucleos_Click(object sender, EventArgs e)
        {
            ManagementObjectSearcher cr = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");
            var numerodenucleos = 0;

            foreach(ManagementObject nucleo in cr.Get())
            {
                numerodenucleos += Convert.ToInt32(nucleo["NumberOfCores"]);
                txtNucleos.Text = numerodenucleos.ToString();
            }
        }

        private void btnArquitectura_Click(object sender, EventArgs e)
        {


        }

        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();
            }
        }
    }
}

CDC33


Eleкtro

#4
Ok. Paso a responderte a las dudas y a mencionar varios de los fallos y/o imperfecciones del código que has mostrado...

Cita de: CDC33 en  4 Junio 2019, 00:19 AM
Código (csharp) [Seleccionar]
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 ).




Cita de: CDC33 en  4 Junio 2019, 00:19 AM
Código (csharp) [Seleccionar]
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).




Citar
Código (csharp) [Seleccionar]
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.




Citar
Código (csharp) [Seleccionar]
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").




Citar
Código (csharp) [Seleccionar]
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.




Citar
Código (csharp) [Seleccionar]
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:

Código (csharp) [Seleccionar]
using System.Net.Sockets;
Código (csharp) [Seleccionar]
If (iP.AddressFamily == AddressFamily.InterNetwork) {...}




Citar
Código (csharp) [Seleccionar]
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...

Código (csharp) [Seleccionar]
foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces()) {
Console.WriteLine(adapter.NetworkInterfaceType.ToString());
}


Cita de: CDC33 en  4 Junio 2019, 00:19 AM
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().




Cita de: CDC33 en  4 Junio 2019, 00:19 AM
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.




Cita de: CDC33 en  4 Junio 2019, 00:19 AM
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.








CDC33

Gracias por la información y por aclarar mis dudas, perdón por el código horrible que mostré pero estoy enpesando.

Y CDC33 no es ningún canal de youtuve