web-dev-qa-db-fra.com

Obtenir des informations sur le PC (système) sur la machine Windows

Existe-t-il un moyen d'obtenir les informations suivantes en utilisant le script c #.

Étiquette de service du nom du PC Type de processeur Taille de la vitesse du processeur du lecteur c: \, RAM installée, nom du système d'exploitation, clé de produit du système d'exploitation, version Office et clé de produit Office.

Merci.

22
dps123

WMI est ce que vous recherchez.

http://www.codeproject.com/KB/cs/EverythingInWmi02.aspx

Permettez-moi d'ajouter également le lien vers la partie 3, qui se concentre sur le matériel via WMI

http://www.codeproject.com/KB/cs/EverythingInWmi03.aspx

MSDN est également une excellente ressource pour les étendues WMI ...

http://msdn.Microsoft.com/en-us/library/aa394554 (v = vs.85) .aspx

16
dotalchemy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;   //This namespace is used to work with WMI classes. For using this namespace add reference of System.Management.dll .
using Microsoft.Win32;     //This namespace is used to work with Registry editor.

namespace OperatingSystemInfo1
{
    class TestProgram
    {
        static void Main(string[] args)
        {
            SystemInfo si = new SystemInfo();       //Create an object of SystemInfo class.
            si.getOperatingSystemInfo();            //Call get operating system info method which will display operating system information.
            si.getProcessorInfo();                  //Call get  processor info method which will display processor info.
            Console.ReadLine();                     //Wait for user to accept input key.
        }
    }
    public class SystemInfo
    {
        public void getOperatingSystemInfo()
        {
            Console.WriteLine("Displaying operating system info....\n");
            //Create an object of ManagementObjectSearcher class and pass query as parameter.
            ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
            foreach (ManagementObject managementObject in mos.Get())
            {
                if (managementObject["Caption"] != null)
                {
                    Console.WriteLine("Operating System Name  :  " + managementObject["Caption"].ToString());   //Display operating system caption
                }
                if (managementObject["OSArchitecture"] != null)
                {
                    Console.WriteLine("Operating System Architecture  :  " + managementObject["OSArchitecture"].ToString());   //Display operating system architecture.
                }
                if (managementObject["CSDVersion"] != null)
                {
                    Console.WriteLine("Operating System Service Pack   :  " + managementObject["CSDVersion"].ToString());     //Display operating system version.
                }
            }
        }

        public void getProcessorInfo()
        {
            Console.WriteLine("\n\nDisplaying Processor Name....");
            RegistryKey processor_name = Registry.LocalMachine.OpenSubKey(@"Hardware\Description\System\CentralProcessor\0", RegistryKeyPermissionCheck.ReadSubTree);   //This registry entry contains entry for processor info.

            if (processor_name != null)
            {
                if (processor_name.GetValue("ProcessorNameString") != null)
                {
                    Console.WriteLine(processor_name.GetValue("ProcessorNameString"));   //Display processor ingo.
                }
            }
        }
    }
}
12
Kamal Sukla

Il existe un paquet nuget appelé MissingLinq.Linq2Management qui a enveloppé à peu près tout ce qui concerne WMI dans un objet Nice fortement typé. Semble assez agréable.

https://missinglinq.codeplex.com/

2
viggity

Vous avez le nom de PC comme valeur que vous souhaitez, vous pouvez donc l'obtenir à partir de Environment.MachineName Si vous voulez l'ordinateur local, ou vous pouvez faire IPHostEntry hostEntry = Dns.GetHostEntry(ip); puis string Host = hostEntry.HostName; Pour utiliser DNS pour résoudre le nom d'un ordinateur distant si vous n'avez que son IP.

Vous pouvez obtenir certaines informations du registre, après avoir vérifié que le registre distant est en cours d'exécution, en supposant que vous souhaitiez un ordinateur distant:

ServiceController sc = new ServiceController("RemoteRegistry", computer); 
if (sc.Status.Equals(ServiceControllerStatus.Running)) 
{ 
    // do your stuff 
} 

Et vous pouvez le démarrer s'il est trouvé arrêté:

if (sc.Status.Equals(ServiceControllerStatus.Stopped) || 
sc.Status.Equals(ServiceControllerStatus.StopPending)) 
{ 
    sc.Start(); 
} 

Ajoutez cette instruction using en haut de votre page:

using Microsoft.Win32;

Pour le nom de l'ordinateur, vous pouvez accéder à HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName:

string path = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName";
RegistryKey rk = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, computer).OpenSubKey(path);
string pcName = rk.GetValue("computerName").ToString();

Pour toutes les commandes de registre locales, supprimez simplement RegistryKey.OpenRemoteBaseKey( Et , computer) - cela devient:

RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(path);

RegistryView.Registry64 N'est généralement pas requis (vous pouvez utiliser RegistryView.Default À la place), mais peut être nécessaire si vous créez une application 32 bits qui doit atteindre un registre sur un système d'exploitation 64 bits. Au lieu de tout sur une seule ligne, vous pouvez également faire quelque chose comme ceci, par exemple:

using (var root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
{
    using (var key = root.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion", false))
    {
        var registeredOwner = key.GetValue("RegisteredOwner");
    }
}

Crédit : https://social.msdn.Microsoft.com/Forums/en-US/ea997421-4d55-49db-97ad- cf629c65577b/registrylocalmachineopensubkey-does-not-return-all-values? forum = csharpgeneral

Pour le nom du CPU:

string path = @"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0";
RegistryKey rk = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, computer).OpenSubKey(path);
string cpuName = rk.GetValue("processorNameString").ToString();

Pour le nom et la clé du système d'exploitation:

string path = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion";
RegistryKey rk = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, computer).OpenSubKey(path);
string osName = rk.GetValue("productName").ToString();
string servicePack = rk.GetValue("CSDVersion").ToString();
byte[] digitalProductId = registry.GetValue("DigitalProductId") as byte[];
string osProductKey = DecodeProductKey(digitalProductId);

De Geeks With Blogs pour obtenir les clés de produit:

public static string DecodeProductKey(byte[] digitalProductId)
{
  // Offset of first byte of encoded product key in 
  //  'DigitalProductIdxxx" REG_BINARY value. Offset = 34H.
  const int keyStartIndex = 52;
  // Offset of last byte of encoded product key in 
  //  'DigitalProductIdxxx" REG_BINARY value. Offset = 43H.
  const int keyEndIndex = keyStartIndex + 15;
  // Possible alpha-numeric characters in product key.
  char[] digits = new char[]
  {
    'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R', 
    'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',
  };
  // Length of decoded product key
  const int decodeLength = 29;
  // Length of decoded product key in byte-form.
  // Each byte represents 2 chars.
  const int decodeStringLength = 15;
  // Array of containing the decoded product key.
  char[] decodedChars = new char[decodeLength];
  // Extract byte 52 to 67 inclusive.
  ArrayList hexPid = new ArrayList();
  for (int i = keyStartIndex; i <= keyEndIndex; i++)
  {
    hexPid.Add(digitalProductId[i]);
  }
  for (int i = decodeLength - 1; i >= 0; i--)
  {
    // Every sixth char is a separator.
    if ((i + 1) % 6 == 0)
    {
      decodedChars[i] = '-';
    }
    else
    {
      // Do the actual decoding.
      int digitMapIndex = 0;
      for (int j = decodeStringLength - 1; j >= 0; j--)
      {
        int byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
        hexPid[j] = (byte)(byteValue / 24);
        digitMapIndex = byteValue % 24;
        decodedChars[i] = digits[digitMapIndex];
      }
    }
  }
  return new string(decodedChars);
}

Cela met les durs à l'écart. Le fait est que le registre est votre ami.

2
vapcguy

Pour ce faire, ajoutez le Microsoft.VB dans votre réfrence. Pour ajouter ce clic droit au dossier Réfrence de la solution, explorez et cliquez sur Ajouter des réfrences puis cliquez sur le .NET et cliquez sur Microsoft.visualBasic puis cliquez sur OK. Après avoir fait cela, importez ceci comme:

using Microsoft.VisualBasic.Devices;

public void getSystemDetails()
{
    UserName.Text = Environment.UserName; // User name of PC
    LabelOS.Text = getOSInfo(); // OS version of pc
    MachineTxt.Text = Environment.MachineName;// Machine name
    string OStype = "";
    if (Environment.Is64BitOperatingSystem) { OStype = "64-Bit, "; } else { OStype = "32-Bit, "; }
    OStype += Environment.ProcessorCount.ToString() + " Processor";
    label8.Text = OStype; // Processor type

    ulong toalRam = cinfo.TotalPhysicalMemory;
    double toal = Convert.ToDouble(toalRam / (1024 * 1024));
    int t = Convert.ToInt32(Math.Ceiling(toal / 1024).ToString());
    label6.Text = t.ToString() + " GB";// ram detail
}

public string getOSInfo()
{
    //Get Operating system information.
    OperatingSystem os = Environment.OSVersion;
    //Get version information about the os.
    Version vs = os.Version;

    //Variable to hold our return value
    string operatingSystem = "";

    if (os.Platform == PlatformID.Win32Windows)
    {
        //This is a pre-NT version of Windows
        switch (vs.Minor)
        {
            case 0:
                operatingSystem = "95";
                break;
            case 10:
                if (vs.Revision.ToString() == "2222A")
                    operatingSystem = "98SE";
                else
                    operatingSystem = "98";
                break;
            case 90:
                operatingSystem = "Me";
                break;
            default:
                break;
        }
    }
    else if (os.Platform == PlatformID.Win32NT)
    {
        switch (vs.Major)
        {
            case 3:
                operatingSystem = "NT 3.51";
                break;
            case 4:
                operatingSystem = "NT 4.0";
                break;
            case 5:
                if (vs.Minor == 0)
                    operatingSystem = "Windows 2000";
                else
                    operatingSystem = "Windows XP";
                break;
            case 6:
                if (vs.Minor == 0)
                    operatingSystem = "Windows Vista";
                else
                    operatingSystem = "Windows 7 or Above";
                break;
            default:
                break;
        }
    }
}
1
Jeetendra Negi