「Windows XP Professional Service Pack 1」または「Windows Server 2008 Standard Edition」などのOSバージョンを取得するエレガントな方法を探しています。
それを行うエレガントな方法はありますか?
プロセッサアーキテクチャ(x86やx64など)にも興味があります。
WMIを使用して製品名(「Microsoft®WindowsServer®2008 Enterprise」)を取得できます。
using System.Management;
var name = (from x in new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem").Get().Cast<ManagementObject>()
select x.GetPropertyValue("Caption")).FirstOrDefault();
return name != null ? name.ToString() : "Unknown";
ローカルで使用する場合は、WMIを実際に避けるようにしてください。それは非常に便利ですが、パフォーマンスの面であなたはそれに対して心から支払います。これは素早く簡単です:
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 "";
}
Environment.OSVersion
?また、Windows、Mac OS X、Unixなど、これが何の操作であるかを示します。64ビットと32ビットのどちらで実行しているかを調べるには、 IntPtr.Size
-32ビットでは4バイト、64ビットでは8バイトを返します。
試行:
new ComputerInfo().OSVersion;
出力:
Microsoft Windows 10 Enterprise
注:Microsoft.VisualBasic.Devices;
への参照を追加
サンプル出力:
Name = Windows Vista
Edition = Home Premium
Service Pack = Service Pack 1
Version = 6.0.6001.65536
Bits = 64
サンプルクラス:
class Program
{
static void Main( string[] args )
{
Console.WriteLine( "Operation System Information" );
Console.WriteLine( "----------------------------" );
Console.WriteLine( "Name = {0}", OSInfo.Name );
Console.WriteLine( "Edition = {0}", OSInfo.Edition );
Console.WriteLine( "Service Pack = {0}", OSInfo.ServicePack );
Console.WriteLine( "Version = {0}", OSInfo.VersionString );
Console.WriteLine( "Bits = {0}", OSInfo.Bits );
Console.ReadLine();
}
}
OSInfoクラスのソースコード: http://www.csharp411.com/determine-windows-version-and-edition-with-c/ ただし、コードにエラーがあります。 「case 6」ステートメント(#endregion NAMEの直前)を次のように置き換えます。
case 6:
switch (minorVersion)
{
case 0:
switch (productType)
{
case 1:
name = "Windows Vista";
break;
case 3:
name = "Windows Server 2008";
break;
}
break;
case 1:
switch (productType)
{
case 1:
name = "Windows 7";
break;
case 3:
name = "Windows Server 2008 R2";
break;
}
break;
}
break;
さらに一歩進んで、プログラムが64ビットまたは32ビットで実行されているかどうかを確認する場合:
public static class Wow
{
public static bool Is64BitProcess
{
get { return IntPtr.Size == 8; }
}
public static bool Is64BitOperatingSystem
{
get
{
// Clearly if this is a 64-bit process we must be on a 64-bit OS.
if (Is64BitProcess)
return true;
// Ok, so we are a 32-bit process, but is the OS 64-bit?
// If we are running under Wow64 than the OS is 64-bit.
bool isWow64;
return ModuleContainsFunction("kernel32.dll", "IsWow64Process") && IsWow64Process(GetCurrentProcess(), out isWow64) && isWow64;
}
}
static bool ModuleContainsFunction(string moduleName, string methodName)
{
IntPtr hModule = GetModuleHandle(moduleName);
if (hModule != IntPtr.Zero)
return GetProcAddress(hModule, methodName) != IntPtr.Zero;
return false;
}
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
extern static bool IsWow64Process(IntPtr hProcess, [MarshalAs(UnmanagedType.Bool)] out bool isWow64);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
extern static IntPtr GetCurrentProcess();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
extern static IntPtr GetModuleHandle(string moduleName);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
extern static IntPtr GetProcAddress(IntPtr hModule, string methodName);
}
注意すべきことの1つは、この情報は通常ローカライズされており、OSの言語によって異なる方法で報告されることです。
[〜#〜] wmi [〜#〜] から多くの情報を取得できます Win32_OperatingSystem クラスを探します
少し遅れましたが、これが私がやった方法です。将来誰かを助けるかもしれません。
using Microsoft.Win32;
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion");
string pathName = (string)registryKey.GetValue("productName");
プロセッサアーキテクチャの質問は複雑であることに注意してください。
どういう意味ですか(数値が大きいほど、より小さい数値が必要です):
3つすべてが真実でなければならないことに満足しているなら
IntPtr.Size == 8
3つすべてが真であることを示します
私はそれが質問への直接的な答えではなく、少し遅いことも知っていますが、OSがクライアントOSまたはサーバーであるかどうかを判断する方法のみを探している人には、次の方法があります:( System.Management参照を含める必要があります)
using System;
using System.Management;
ManagementClass osClass = new ManagementClass("Win32_OperatingSystem");
foreach (ManagementObject queryObj in osClass.GetInstances())
{
foreach (PropertyData prop in queryObj.Properties)
{
if (prop.Name == "ProductType")
{
ProdType = int.Parse(prop.Value.ToString());
}
}
}
一方、変数ProdTypeは、以前に初期化された整数です。 1〜3の値が含まれ、1はワークステーション、2はドメインコントローラ、3はサーバーを表します。
これは Win32_OperatingSystemのプロパティへのアクセス から取得され、少し変更されました...
Visual Basicデバイスを使用して、バージョン情報を取得できます。
コード:
using Microsoft.VisualBasic.Devices;
var versionID = new ComputerInfo().OSVersion;//6.1.7601.65536
var versionName = new ComputerInfo().OSFullName;//Microsoft Windows 7 Ultimate
var verionPlatform = new ComputerInfo().OSPlatform;//WinNT
Console.WriteLine(versionID);
Console.WriteLine(versionName);
Console.WriteLine(verionPlatform);
出力:
6.1.7601.65536
Microsoft Windows 10 Enterprise
WinNT
注:Microsoft.VisualBasic;
への参照を追加する必要があります
開示:これを投稿した後、IndexOf()
を含むZ.ExntensionMethods
というNuget拡張メソッドライブラリに依存していることに気付きました。
using Microsoft.VisualBasic.Devices;
string SimpleOSName()
{
var name = new ComputerInfo().OSFullName;
var parts = name.Split(' ').ToArray();
var take = name.Contains("Server")?3:2;
return string.Join(" ", parts.Skip(parts.IndexOf("Windows")).Take(take));
}
高速なパフォーマンスusing System.Management;
string SimpleOSName()
{
var name = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem")
.Get().Cast<ManagementObject>()
.Select(x => x.GetPropertyValue("Caption").ToString())
.First();
var parts = name.Split(' ').ToArray();
var take = name.Contains("Server")?3:2;
return string.Join(" ", parts.Skip(parts.IndexOf("Windows")).Take(take));
}
出力例:
Windows 7
Windows Server 2008