Get PC (system) information on a Windows machine
Is there a way to get the following information by using C#?
- PC Name,
- Service Tag,
- CPU type,
- CPU speed,
- Size of the C:\ drive,
- Installed RAM,
- OS name,
- OS Product Key,
- Office Version, and Office Produc开发者_Go百科t Key.
WMI is what you're looking for.
http://www.codeproject.com/KB/cs/EverythingInWmi02.aspx
Let me add the link to Part 3 too, which concentrates on hardware via WMI
http://www.codeproject.com/KB/cs/EverythingInWmi03.aspx
MSDN is also a great resource for WMI scopes...
http://msdn.microsoft.com/en-us/library/aa394554(v=vs.85).aspx
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.
}
}
}
}
}
You have PC Name as a value you want, so you can get this from Environment.MachineName
if you want the local computer, or you can do IPHostEntry hostEntry = Dns.GetHostEntry(ip);
then string host = hostEntry.HostName;
to use DNS to resolve a remote computer's name if you only have its IP.
You can get certain information from the registry, after you check that Remote Registry is running, assuming you want a remote computer:
ServiceController sc = new ServiceController("RemoteRegistry", computer);
if (sc.Status.Equals(ServiceControllerStatus.Running))
{
// do your stuff
}
And you can start it if found stopped:
if (sc.Status.Equals(ServiceControllerStatus.Stopped) ||
sc.Status.Equals(ServiceControllerStatus.StopPending))
{
sc.Start();
}
Add this using
statement to the top of your page:
using Microsoft.Win32;
For the Computer name, you can go to 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();
For any local registry commands, just remove RegistryKey.OpenRemoteBaseKey(
and , computer)
- it becomes:
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(path);
The RegistryView.Registry64
is usually not required (you can use RegistryView.Default
instead), but can be necessary if building a 32-bit app that needs to reach into a registry on a 64-bit OS. Instead of all in one line, you could also do something like this, for example:
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");
}
}
Credit: https://social.msdn.microsoft.com/Forums/en-US/ea997421-4d55-49db-97ad-cf629c65577b/registrylocalmachineopensubkey-does-not-return-all-values?forum=csharpgeneral
For the CPU name:
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();
For the OS Name and key:
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);
From Geeks With Blogs for getting product keys:
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);
}
That gets the hard ones out of the way. Point is, the registry is your friend.
There is a nuget package called MissingLinq.Linq2Management
that has wrapped pretty much everything about WMI into a nice strongly typed object. Seems pretty nice.
https://missinglinq.codeplex.com/
For doing this Add the Microsoft.VB in your Refrence. For adding this Right click to Refrence folder of solution explore and click the add Refrences then click the .NET and Click the Microsoft.visualBasic then click ok. After doing this import this like :
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;
}
}
}
精彩评论