Получить информацию о ПК (системе) на машине с Windows - C # скрипт - PullRequest
20 голосов
/ 20 января 2011

Есть ли способ получить следующую информацию с помощью скрипта c #.

Имя компьютера Имя службы Тег ЦП Тип скорости ЦП размер диска c: \, установленная оперативная память, имя ОС, ключ продукта ОС, OfficeВерсия и ключ продукта Office.

Спасибо.

Ответы [ 5 ]

15 голосов
/ 20 января 2011

WMI - это то, что вы ищете.

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

Позвольте мне добавить ссылку на часть 3, которая посвящена аппаратному обеспечению через WMI

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

MSDN также является отличным ресурсом для областей WMI ...

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

12 голосов
/ 15 ноября 2011
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.
                }
            }
        }
    }
}
1 голос
/ 25 октября 2017

У вас есть имя ПК в качестве значения, которое вы хотите, поэтому вы можете получить его из Environment.MachineName, если вы хотите локальный компьютер, или вы можете IPHostEntry hostEntry = Dns.GetHostEntry(ip); затем string host = hostEntry.HostName; использовать DNS для разрешения имени удаленного компьютера, еслиу вас есть только его IP.

Вы можете получить определенную информацию из реестра после того, как убедитесь, что удаленный реестр работает, при условии, что вам нужен удаленный компьютер:

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

И вы можете запуститьесли оно найдено, оно остановилось:

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

Добавьте этот оператор using в начало вашей страницы:

using Microsoft.Win32;

В качестве имени компьютера вы можете перейти к 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();

Для любых локальных команд реестра просто удалите RegistryKey.OpenRemoteBaseKey( и , computer) - становится:

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

Обычно RegistryView.Registry64не требуется (вы можете использовать RegistryView.Default вместо этого), но может быть необходимо при создании 32-разрядного приложения, которое должно попасть в реестр на 64-разрядной ОС.Вместо всего в одной строке, вы также можете сделать что-то вроде этого, например:

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

Кредит : https://social.msdn.microsoft.com/Forums/en-US/ea997421-4d55-49db-97ad-cf629c65577b/registrylocalmachineopensubkey-does-not-return-all-values?forum=csharpgeneral

Для имени процессора:

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

Для имени операционной системы и ключа:

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

От Geeks With Blogs для получения ключей продукта:

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

То, что получаеттрудные из пути.Дело в том, что реестр ваш друг.

1 голос
/ 03 апреля 2015

Для этого добавьте Microsoft.VB в ваш Refrence. Для добавления этого щелкните правой кнопкой мыши на папке Refrence решения исследовать и нажмите кнопку Добавить ссылки, затем нажмите .NET и щелкните Microsoft.visualBasic, затем нажмите кнопку ОК. После этого импортируйте это как:

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 голос
/ 31 марта 2014

Существует пакет nuget под названием MissingLinq.Linq2Management, который обернул почти все, что касается WMI, в красивый строго типизированный объект. Кажется, довольно мило.

https://missinglinq.codeplex.com/

...