Получить информацию о ПК (системе) на машине с Windows
Есть ли способ получить следующую информацию с помощью С# script.
Имя ПК
Метка
Тип процессора
Скорость процессора
размер диска c: \,
Установленная оперативная память,
Название ОС,
Ключ продукта ОС,
Версия Office и ключ продукта Office.
Спасибо.
Ответы
Ответ 1
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
Ответ 2
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.
}
}
}
}
}
Ответ 3
Существует пакет nuget с именем MissingLinq.Linq2Management
, который полностью закрыл все, что связано с WMI, в хороший сильно типизированный объект. Кажется довольно приятным.
https://missinglinq.codeplex.com/
Ответ 4
Для этого добавьте 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;
}
}
}
Ответ 5
У вас есть имя ПК в качестве значения, которое вы хотите, поэтому вы можете получить его из 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);
}
Это убирает трудных с дороги. Дело в том, что реестр ваш друг.