Reputation: 36205
I am currently working on a C# project. I want to collect users statistics to better develop the software. I am using the Environment.OS
feature of C# but its only showing the OS name as something like Microsoft Windows NT
What I want to be able to retrieve is the actual known name of the OS like whether it is Windows XP, Windows Vista or Windows 7
and etc.
Is this possible?
Upvotes: 27
Views: 51515
Reputation: 11
Though this is not a fully C# way of detecting the OS Name, below code works for my needs-
public static string GetFriendlyOSName()
{
System.Diagnostics.Process cmd = new System.Diagnostics.Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.Arguments = "/C systeminfo | findstr /c:\"OS Name\"";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.CreateNoWindow = true;
cmd.Start();
cmd.WaitForExit();
string output = cmd.StandardOutput.ReadToEnd();
cmd.Close();
return output.Split(new[] { ':' }, 2)[1].Trim();
}
Note:
Upvotes: 1
Reputation: 1
string text = (string)Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion").GetValue("ProductName");
this code will get the full os name like this "Windows 8.1 Pro"
Upvotes: -1
Reputation: 305
Add a .NET reference to Microsoft.VisualBasic. Then call:
new Microsoft.VisualBasic.Devices.ComputerInfo().OSFullName
From MSDN:
This property returns detailed information about the operating system name if Windows Management Instrumentation (WMI) is installed on the computer. Otherwise, this property returns the same string as the
My.Computer.Info.OSPlatform
property, which provides less detailed information than WMI can provide.information than WMI can provide.
Upvotes: 9
Reputation: 75
String subKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion";
RegistryKey key = Registry.LocalMachine;
RegistryKey skey = key.OpenSubKey(subKey);
Console.WriteLine("OS Name: {0}", skey.GetValue("ProductName"));
I hope that you find this useful
Upvotes: 4
Reputation: 1
public int OStype()
{
int os = 0;
IEnumerable<string> list64 = Directory.GetDirectories(Environment.GetEnvironmentVariable("SystemRoot")).Where(s => s.Equals(@"C:\Windows\SysWOW64"));
IEnumerable<string> list32 = Directory.GetDirectories(Environment.GetEnvironmentVariable("SystemRoot")).Where(s => s.Equals(@"C:\Windows\System32"));
if (list32.Count() > 0)
{
os = 32;
if (list64.Count() > 0)
os = 64;
}
return os;
}
Upvotes: 2
Reputation: 1112
You should really try to avoid WMI for local use. It is very convenient but you pay dearly for it in terms of performance. Think laziness tax!
Kashish's answer about the registry does not work on all systems. Code below should and also includes the service pack:
public string HKLM_GetString(string path, string key)
{
try
{
RegistryKey rk = Registry.LocalMachine.OpenSubKey(path);
if (rk == null) return "";
return (string)rk.GetValue(key);
}
catch { return ""; }
}
public string FriendlyName()
{
string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName");
string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion");
if (ProductName != "")
{
return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName +
(CSDVersion != "" ? " " + CSDVersion : "");
}
return "";
}
Upvotes: 12
Reputation: 32428
Add a reference and using statements for System.Management
, then:
public static string GetOSFriendlyName()
{
string result = string.Empty;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem");
foreach (ManagementObject os in searcher.Get())
{
result = os["Caption"].ToString();
break;
}
return result;
}
Upvotes: 60
Reputation: 28158
System.OperatingSystem osInfo = System.Environment.OSVersion;
Upvotes: 3