C#获取本地操作系统的版本(急!!)

jishuzhichi 2006-12-21 05:56:52
废话不多说了,现在想通过C#写的应用程序获得当前使用的操作系统的版本,注意不是版本号,我通过Version.Minor == 1这种方式获得的只是windows xp和一些版本号,通过Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion")查看注册表获得的也只有windows xp 我想请问一下,怎么通过C#应用程序(注意不是WEB程序)获得当前应用(注意不是远程)的操作系统的版本,就是要windows xp professional或者windows xp home。先谢谢了~
...全文
2122 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿牛138588 2006-12-22
  • 打赏
  • 举报
回复
感觉wmi是正道
ernidan 2006-12-22
  • 打赏
  • 举报
回复
正在 赶做系统自动更新 遇到有关硬盘唯一号 和 MAC 的问题 你可以试着 用一些类似的方法
test33 2006-12-22
  • 打赏
  • 举报
回复
MARK`
xiangyuen 2006-12-22
  • 打赏
  • 举报
回复
study
wudi_1982 2006-12-22
  • 打赏
  • 举报
回复
使用GetVersionEx传递如下结构来获得此信息
typedef struct _OSVERSIONINFOEX {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
TCHAR szCSDVersion[128];
WORD wServicePackMajor;
WORD wServicePackMinor;
WORD wSuiteMask; //此成员可以用来作为判断home 还是professional的依据
BYTE wProductType;
BYTE wReserved;
} OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;

关于操作系统的其他的信息你都可以在此结构中找到,具体使用参见MSDN的帮助
不怎么用C#,现学现卖给你写了一段代码,(代码中有不合理的地方,自己参照修改,实在没用过C#)如下:

主要代码如下:
using System.Runtime.InteropServices;

上述结构在C#中定义如下:
[ StructLayout( LayoutKind.Sequential )]
public class OSVersionInfo
{
public int OSVersionInfoSize;
public int majorVersion;
public int minorVersion;
public int buildNumber;
public int platformId;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public String versionString;
public Int16 wServicePackMajor;
public Int16 wServicePackMinor;
public Int16 wSuiteMask;
public Byte wProductType;
public Byte wReserved;
}


public class GetSysApi
{
[ DllImport( "Kernel32.dll" )]
public static extern bool GetVersionEx( [In, Out] OSVersionInfo osvi );
}

private void button2_Click(object sender, System.EventArgs e)
{
OSVersionInfo osvi = new OSVersionInfo();
osvi.OSVersionInfoSize = Marshal.SizeOf( osvi );
GetSysApi.GetVersionEx(osvi);
string tm = osvi.buildNumber+osvi.majorVersion+osvi.minorVersion+
osvi.platformId +osvi.versionString+osvi.wProductType+
osvi.wReserved+osvi.wSuiteMask;
MessageBox.Show(tm);//根据那些成员变量,有足够的信息够你对操作系统进行判断
//我这里只写了你需求的关于windows xp professional或者windows xp home的判断
if ( osvi.wProductType == 1)
{
if( osvi.majorVersion == 4 )
MessageBox.Show( "Workstation 4.0 ");
else if(( osvi.wSuiteMask & 512 )!=0)
MessageBox.Show("Win Xp Home Edition " );
else MessageBox.Show("Win Xp Professional " );
}

}


搂主如果有兴趣,可以看看http://msdn2.microsoft.com/en-us/library/ms724429.aspx

一直学习 2006-12-22
  • 打赏
  • 举报
回复
UP
糖醋鼻子 2006-12-21
  • 打赏
  • 举报
回复
WMI试试呢?
jianjian8410 2006-12-21
  • 打赏
  • 举报
回复
学习 好偏门..
Reeezak 2006-12-21
  • 打赏
  • 举报
回复
其实象这样的东西还是应该多用WMI的
不仅方便,而且速度快

lz可以看看WSH的东西
Reeezak 2006-12-21
  • 打赏
  • 举报
回复
System.Management.SelectQuery query = new System.Management.SelectQuery("Win32_OperatingSystem");
System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher(query);
System.Management.ManagementObjectCollection objs = searcher.Get();
string s;
foreach (System.Management.ManagementObject obj in objs)
s = obj.GetPropertyValue("Caption").ToString();

jinta2001 2006-12-21
  • 打赏
  • 举报
回复
还是使用WMI吧,读boot.ini有可能读到错误信息。使用之前要using System.Management;
string buffer;
ManagementObjectSearcher searcher;
searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT PartComponent FROM Win32_SystemOperatingSystem");

foreach (ManagementObject queryObj in searcher.Get())
{
buffer=queryObj["PartComponent"].ToString();
//会返回"\\\\CCC\\root\\cimv2:Win32_OperatingSystem.Name=\"Microsoft Windows Server 2003 Enterprise Edition|D:\\\\WINDOWS|\\\\Device\\\\Harddisk0\\\\Partition2\""
}
searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT Caption FROM Win32_OperatingSystem");

foreach (ManagementObject queryObj in searcher.Get())
{
buffer=queryObj["Caption"].ToString();
//会返回"Microsoft(R) Windows(R) Server 2003, Enterprise Edition"
}
tcxx2008 2006-12-21
  • 打赏
  • 举报
回复
楼主的需求真的比较偏哦
jishuzhichi 2006-12-21
  • 打赏
  • 举报
回复
不知道是不是每个操作系统下都有这个配置文件呢?回去再测试一下,如果成功明天早晨结贴~~谢谢各位~
crazy7 2006-12-21
  • 打赏
  • 举报
回复
系统隐藏文件应该也可以读出来啊!
jishuzhichi 2006-12-21
  • 打赏
  • 举报
回复
恩,有道理,不过那个boot.ini是系统隐藏文件,我怎么也读不出它的内容,比较奇怪了~
lizhizhe2000 2006-12-21
  • 打赏
  • 举报
回复
也许可以试试系统盘下的BOOT.INI文件,读取类似于WINDOWS="Windows Server 2003, Enterprise"
jishuzhichi 2006-12-21
  • 打赏
  • 举报
回复
谢谢楼上的朋友,顶着有份~~
chenjunhui 2006-12-21
  • 打赏
  • 举报
回复
俺就是来顶滴
jishuzhichi 2006-12-21
  • 打赏
  • 举报
回复
楼上的大哥,你这个和我用Version.Minor == 1这种方法有什么区别??拜托有没有别的方法?你这个方法我已经试验过了呀
WeiWY 2006-12-21
  • 打赏
  • 举报
回复
public string GetWindowsVersion()
{
OperatingSystem os = Environment.OSVersion;
switch (os.Platform)
{
case PlatformID.Win32Windows:
switch (os.Version.Minor)
{
case 0:
return "Windows 95";
case 10:
if (os.Version.Revision.ToString() == "2222A")
return "Windows 98 第二版";
else
return "Windows 98";
case 90:
return "Windows Me";
}
break;
case PlatformID.Win32NT:
switch (os.Version.Major)
{
case 3:
return "Windows NT 3.51";
case 4:
return "Windows NT 4.0";
case 5:
switch (os.Version.Minor)
{
case 0:
return "Windows 200";
case 1:
return "Windows XP";
case 2:
return "Windows 2003";
}
break;
}
break;
}
return "失败";
}
加载更多回复(2)

110,578

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧