Get pc (system) information on windows machine
Solution 1
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
Solution 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.
}
}
}
}
}
Solution 3
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");
}
}
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.
Solution 4
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/
Solution 5
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;
}
}
}
Related videos on Youtube
dps123
Updated on July 09, 2022Comments
-
dps123 almost 2 years
Is there a way to get the following information by using c# script.
PC Name Service Tag CPU type CPU speed size of the c:\ drive, Installed RAM, OS name, OS Product Key, Office Version, and Office Product Key.
Thanks.
-
Mitch Wheat over 13 yearsBTW, c# is not normally termed 'script'
-
dps123 over 13 yearsEvan - I have not tried anything yet
-
Joe Koberg over 6 years@MitchWheat C# Script is a separate thing from C#.
.csx
file extension, runnable bycsi.exe
included with recent Visual Studio releases. -
Mitch Wheat over 6 years@Joe Koberg: and was 'C# script' out in Jan 2011?
-
Jinjinov over 2 yearsI made a library for this: github.com/Jinjinov/Hardware.Info
-
-
Ashish Kamble over 5 yearsThere is nothing static method OpenRemoteBaseKey() in Registry class
Registry.OpenRemoteBaseKey
gives error butRegistryKey.OpenRemoteBaseKey
works fine what do you mean byjust remove Registry.OpenRemoteBaseKey( and , computer)
provide example please -
vapcguy over 5 years@AshishKamble Looked again & I believe
Registry.OpenRemoteBaseKey()
should've beenRegistryKey.OpenRemoteBaseKey()
- corrected that. What I meant by saying to remove that part of the line for local commands was that you literally just remove that part of the line-instead ofRegistryKey rk = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, computer).OpenSubKey(path);
it'sRegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(path);
. tinyurl.com/yaroy3rvRegistryView.Registry64
is optional but seems to help on a 64-bit system if a 32-bit app. -
vapcguy over 5 years@AshishKamble Made the edits to include the example I just gave, above.