前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WPF桌面端开发-获取系统版本,位数等信息

WPF桌面端开发-获取系统版本,位数等信息

作者头像
码客说
发布于 2023-07-11 06:09:19
发布于 2023-07-11 06:09:19
72500
代码可运行
举报
文章被收录于专栏:码客码客
运行总次数:0
代码可运行

获取系统版本

无论哪种方式获取系统版本,Win11获取到的都是Win10,但是版本号的方式可以通过构建号来判断Win11。

Management也能获取出Win11。

通过Version获取

注意:

通过版本号不能判断Win11,但是这里可以通过构建号来判断是否为Win11。

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 通过版本号方式获取系统版本
/// </summary>
/// <returns></returns>
public static string GetOsVersion()
{
    OperatingSystem os = Environment.OSVersion;
    Version vs = os.Version;
    string operatingSystem = "";
    switch (os.Platform)
    {
        case PlatformID.Win32Windows:
            switch (vs.Minor)
            {
                case 0:
                    operatingSystem = "95";
                    break;
                case 10:
                    operatingSystem = vs.Revision.ToString() == "2222A" ? "98SE" : "98";
                    break;
                case 90:
                    operatingSystem = "Me";
                    break;
            }
            break;
        case PlatformID.Win32NT:
            switch (vs.Major)
            {
                case 3:
                    operatingSystem = "NT 3.51";
                    break;
                case 4:
                    operatingSystem = "NT 4.0";
                    break;
                case 5:
                    operatingSystem = vs.Minor == 0 ? "2000" : "XP";
                    break;
                case 6:
                    if (vs.Minor == 0)
                        operatingSystem = "Vista";
                    else if (vs.Minor == 1)
                        operatingSystem = "7";
                    else if (vs.Minor == 2)
                        operatingSystem = "8";
                    else
                        operatingSystem = "8.1";
                    break;
                case 10:
                    operatingSystem = "10";
                    if (os.Version.Build >= 22000)
                    {
                        operatingSystem = "11";
                    }
                    break;
            }
            break;
    }
    if (operatingSystem != "")
    {
        operatingSystem = "Windows " + operatingSystem;
        if (os.ServicePack != "")
        {
            operatingSystem += " " + os.ServicePack;
        }
    }
    return operatingSystem;
}

Win10获取的是Win8

此方法在Win10下获取的值可能不是10,这是因为版本不兼容,解决方案是程序应用清单中增加配置:

添加文件

添加后属性中已经默认选择了这个清单文件

把清单中的这些配置解除注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
           Windows 版本的列表。取消评论适当的元素,
           Windows 将自动选择最兼容的环境。 -->

      <!-- Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />

      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />

      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />

      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />

      <!-- Windows 10 -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

    </application>
</compatibility>

这时候就能正常获取Win10了。

版本号

Version

PlatformID

Major version

Minor version

Windows 95

Win32Windows

4

0

Windows 98

Win32Windows

4

10

Windows Me

Win32Windows

4

90

Windows NT 4.0

Win32NT

4

0

Windows 2000

Win32NT

5

0

Windows XP

Win32NT

5

1

Windows XP 64-Bit Edition

Win32NT

5

1

Windows 2003

Win32NT

5

2

Windows Server 2003

Win32NT

5

2

Windows Server 2003 R2

Win32NT

5

2

Windows 2003

Win32NT

5

2

Windows Vista

Win32NT

6

0

Windows 2008

Win32NT

6

0

Windows Server 2008

Win32NT

6

0

Windows 7

Win32NT

6

1

Windows 2008 R2

Win32NT

6

1

Windows Server 2008 R2

Win32NT

6

1

Windows 8

Win32NT

6

2

Windows Server 2012

Win32NT

6

2

Windows 8.1

Win32NT

6

3

Windows Server 2012 R2

Win32NT

6

3

Windows Server 2016 Technical Preview

Win32NT

10

0

Windows 10

Win32NT

10

0

Windows 11

Win32NT

10

0

通过注册表获取

这种方式Win10及以前都是准确的,但是

这种方式Win11会获取为Win10。

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 获取Windows系统版本
/// </summary>
/// <returns>Windows系统版本字符串</returns>
public static string GetWindowsVersion()
{
    return (string)Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion")?.GetValue("ProductName");
}

通过InteropServices获取

注意:

这种方式Win11会获取为Win10。

添加引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
System.Runtime.InteropServices.Runtimelnformation

判断是否是Windows

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RuntimeInformation.IsOSPlatform(OSPlatform.Windows)

获取系统版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static string GetSysVersion()
{
    string osVersion = RuntimeInformation.OSDescription;
    return osVersion;
}

Management方式(推荐)

注意

这种方式能获取到Win11。

添加引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
System.Management

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 通过Management方式获取系统版本
/// </summary>
/// <returns></returns>
public static string GetOsNameInfo()
{
    try
    {
        ManagementClass osClass = new ManagementClass("Win32_OperatingSystem");
        foreach (var o in osClass.GetInstances())
        {
            var obj = (ManagementObject)o;
            PropertyDataCollection pdc = obj.Properties;
            foreach (PropertyData pd in pdc)
            {
                if (pd.Name == "Caption")
                {
                    return pd.Value.ToString()
                    .Replace(
                        "Microsoft ",
                        ""
                    );
                }
            }
        }
    }
    catch (Exception)
    {
        return "";
    }
    return "";
}

系统位数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 获取系统位数
/// </summary>
/// <returns></returns>
public static int GetBit()
{
    return Environment.Is64BitOperatingSystem ? 64 : 32;
}

品牌型号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 获取电脑品牌
/// </summary>
/// <returns></returns>
public static string GetPcManufacturer()
{
    // 电脑型号 Win32_ComputerSystem  Model
    //
    // 电脑品牌  Win32_ComputerSystem Manufacturer
    try
    {
        ManagementClass osClass = new ManagementClass("Win32_ComputerSystem");
        foreach (var o in osClass.GetInstances())
        {
            var obj = (ManagementObject)o;
            PropertyDataCollection pdc = obj.Properties;
            foreach (PropertyData pd in pdc)
            {
                if (pd.Name == "Manufacturer")
                {
                    return pd.Value.ToString().Replace("Microsoft ", "");
                }
            }
        }
    }
    catch (Exception)
    {
        return "";
    }
    return "";
}

/// <summary>
/// 获取电脑型号
/// </summary>
/// <returns></returns>
public static string GetPcModel()
{
    // 电脑型号 Win32_ComputerSystem  Model
    //
    // 电脑品牌  Win32_ComputerSystem Manufacturer
    try
    {
        ManagementClass osClass = new ManagementClass("Win32_ComputerSystem");
        foreach (var o in osClass.GetInstances())
        {
            var obj = (ManagementObject)o;
            PropertyDataCollection pdc = obj.Properties;
            foreach (PropertyData pd in pdc)
            {
                if (pd.Name == "Model")
                {
                    return pd.Value.ToString().Replace("Microsoft ", "");
                }
            }
        }
    }
    catch (Exception)
    {
        return "";
    }
    return "";
}

其他可获取的值

https://learn.microsoft.com/zh-cn/windows/win32/cimwin32prov/win32-computersystem?redirectedfrom=MSDN

常用的值

类型

Key

系统版本

Win32_OperatingSystem

Caption

电脑型号

Win32_ComputerSystem

Model

电脑品牌

Win32_ComputerSystem

Manufacturer

工作组

Win32_ComputerSystem

Domain

登录用户

Win32_ComputerSystem

UserName

计算机名

Win32_ComputerSystem

Name

最后盘符

Win32_BootConfiguration

LastDrive

主板序列号

Win32_ComputerSystemProduct

IdentifyingNumber

测试结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void GetSysInfo()
{
    List<string> strList = new List<string>();
    var sysInfo = ZSysUtils.GetSysVersion();
    strList.Add($@"InteropServices方式:{sysInfo}");
    strList.Add(@"============================");
    var windowsVersion = ZSysUtils.GetWindowsVersion();
    strList.Add($@"注册表方式:{windowsVersion}");
    strList.Add(@"============================");
    var osVersion = ZSysUtils.GetOsVersion();
    strList.Add($@"版本号方式:{osVersion}");
    strList.Add(@"============================");
    var osNameInfo = ZSysUtils.GetOsNameInfo();
    strList.Add($@"Management方式:{osNameInfo}");
    strList.Add(@"============================");
    strList.Add($@"系统位数:{ZSysUtils.GetBit()}");
    strList.Add(@"============================");
    var manufacturer = ZSysUtils.GetPcManufacturer();
    strList.Add($@"品牌:{manufacturer}");
    strList.Add(@"============================");
    var model = ZSysUtils.GetPcModel();
    strList.Add($@"型号:{model}");
    VersionTb.Text = string.Join(
        "\n",
        strList
    );
}

结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InteropServices方式:Windows 10.0.22621 
============================
注册表方式:Windows 10 Home China
============================
版本号方式:Windows 11
============================
Management方式:Windows 11 家庭中文版
============================
系统位数:64
============================
品牌:LENOVO
============================
型号:21CSA14YCD
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 复制 - 性能与扩展性的基石 2:部署及其配置
正所谓理论造航母,现实小帆船。单有理论,不动手实践,学到的知识犹如空中楼阁。接下来,我们一起来看下如何一步步进行 MySQL Replication 的配置。
北国风光
2019/04/11
5940
MySQL 复制 - 性能与扩展性的基石 2:部署及其配置
MySQL 主从复制的问题及解决方案
MySQL 主从复制的问题及解决方案
Java架构师必看
2021/05/06
4660
MySQL 主从复制的问题及解决方案
MySQL 复制 - 性能与扩展性的基石 1:概述及其原理
MySQL 内置的复制功能是构建基于 MySQL 的大规模、高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。
北国风光
2019/04/11
4460
MySQL 复制 - 性能与扩展性的基石 1:概述及其原理
MySQL 复制 - 性能与扩展性的基石 4:主备切换
一旦使用 MySQL 的复制功能,就很大可能会碰到主备切换的情况。也许是为了迭代升级服务器,或者是主库出现问题时,将一台备库转换成主库,或者只是希望重新分配容量。不过出于什么原因,都需要将新主库的信息告诉其它备库。
北国风光
2019/04/22
8650
MySQL 复制 - 性能与扩展性的基石 4:主备切换
MySQL复制性能优化和常见问题分析
二进制日志文件并不是每次写的时候都会同步到磁盘,当发生宕机的时候,可能会有最后一部分数据没有写入到binlog中,这给恢复和复制带来了问题。当sync_binlog=1表示每写缓冲一次就同步到磁盘,表示同步写磁盘的方式来写binlog。也就是说每当向MySQL提交一次事务,MySQL将进行一次fsync之类的磁盘同步命令来将binlog_cache的数据强制刷到磁盘中sync_binlog的值默认为0,sync_binlog=0时表示采用操作系统机制进行缓冲数据同步。采用sync_binlog=1时,会增加磁盘IO的次数,会影响写入性能。sync_binlog=1时,并不是100%安全,会存在相应的问题。比如说使用Innodb引擎时,在一个事务发出commit前,会将binlog立即刷到磁盘中。如果这时候已经写入到binlog中,但是还没有提交就已经挂了,那么MySQL重启时,会将通过Redo log、Undo log将这个事务回滚掉,但是binlog已经记入了该事务信息,不能回滚掉。所以我们需要设置innodb_support_xa=1确保MySQL服务层的binlog和MySQL存储引擎层的Redo log、Undo log之间的数据一致性。
用户2032165
2018/12/07
1.2K0
MySQL复制性能优化和常见问题分析
《高性能Mysql》学习笔记(三)
即没有特别指明的类型,大多数时候mysql 引擎都支持这种索引(Archive 是例外, 5.1 之前不支持,之后支持单个自增列的索引)
阿东
2021/11/02
1.3K0
MySQL 复制原理详解
腾讯云开发者社区
2017/06/15
3.1K0
MySQL 复制原理详解
MySQL 8 复制(一)——异步复制
简单说,复制就是将来自一个MySQL数据库服务器(主库)的数据复制到一个或多个MySQL数据库服务器(从库)。传统的MySQL复制提供了一种简单的Primary-Secondary复制方法,默认情况下,复制是单向异步的。MySQL支持两种复制方式:基于行的复制和基于语句的复制。这两种方式都是通过在主库上记录二进制日志(binlog)、在从库重放中继日志(relylog)的方式来实现异步的数据复制。二进制日志或中继日志中的记录被称为事件。所谓异步包含两层含义,一是主库的二进制日志写入与将其发送到从库是异步进行的,二是从库获取与重放日志事件是异步进行的。这意味着,在同一时间点从库上的数据更新可能落后于主库,并且无法保证主从之间的延迟间隔。
用户1148526
2019/05/25
5.2K0
mysql复制
一、复制的意义 mysql的复制功能是构建基于MySql大规模,高性能应用的基础,我们可以通过为服务器配置一个或多个备库来进行数据同步;复制功能不仅有利于构建高性能的应用,同时也是高可用性,可扩展行,灾难恢复,备份以及数据仓库等工作的基础 二、复制的方式 Mysql支持3种方式:基于语句的复制、基于行的复制、混合复制。对应的binlog的格式也有三种:STATEMENT,ROW,MIXED (1)基于语句的复制(SBR) 每一条会修改数据的sql语句会记录到binlog中。优点是不需要记录每一条sql语句和
magicsoar
2018/02/06
2.7K0
MySQL Replication 主从复制全方位解决方案
    在了解主从复制之前必须要了解的就是数据库的二进制日志(binlog),主从复制架构大多基于二进制日志进行,二进制日志相关信息参考:http://www.cnblogs.com/clsn/p/8087678.html#_label6
惨绿少年
2019/05/24
8830
MySQL 8 复制(六)——拓扑与性能
可以在任意个主从库之间建立复杂的复制拓扑结构,如普通的一主一(多)从、双(多)主复制、级联复制,MySQL 5.7.2后新增的多源复制,特殊场景下使用的Blackhole引擎与日志服务器等等。复制中的MySQL服务器须要遵循以下基本原则:
用户1148526
2019/07/11
1.8K0
MySQL 8 复制(六)——拓扑与性能
MySQL 8 复制(十)——组复制性能与限制
组复制的基本保证是,只有在组中的大多数节点接收到事务并且就并发事务的相对顺序达成一致之后,才会提交事务。其对事务的基本处理流程为:
用户1148526
2019/08/14
2.3K0
MySQL常见配置参数及命令
wait_timeout:客户端连接自动断开连接时间(默认值是28800s,8个小时),自动断开的操作是“Server层的连接器做的”,断开后需要重新连接;
向着百万年薪努力的小赵
2022/12/02
8510
mysql主从同步(2)-问题梳理
之前部署了Mysql主从复制环境(Mysql主从同步(1)-主从/主主环境部署梳理),在mysql同步过程中会出现很多问题,导致数据同步异常。 以下梳理了几种主从同步中可能存在的问题: 1)slave运行过慢不能与master同步,也就是MySQL数据库主从同步延迟 MySQL数据库slave服务器延迟的现象是非常普遍的,MySQL复制允许从机进行SELECT操作,但是在实际线上环境下,由于从机延迟的关系,很难将读取操作转向到从机。这就导致了有了以下一些潜规则:“实时性要求不高的读取操作可以放到slave服
洗尽了浮华
2018/01/23
2.4K0
MySQL主从复制能完美解决数据库单点问题吗?
2、从库的IO线程在指定位置读取主库binlog内容存储到本地的中继日志(Relay Log)中
lyb-geek
2019/10/31
2.2K0
MySQL 8 复制(二)——半同步复制
直到目前的最新版本为止,MySQL缺省依然使用异步复制策略。简单说所谓异步复制,指的是主库写二进制日志、从库的I/O线程读主库的二进制日志写本地中继日志、从库的SQL线程重放中继日志,这三步操作都是异步进行的。如此选择的主要理由是出于性能考虑,与同步复制相比,异步复制显然更快,同时能承载更高的吞吐量。但异步复制的缺点同样明显,不能保证主从数据实时一致,也无法控制从库的延迟时间,因此它不适于要求主从数据实时同步的场景。例如,为了分解读写压力,同一程序写主库读从库,但要求读到的数据与读主库的相同,异步复制不满足这种强数据一致性需求。异步复制的另一个问题是可能会有数据丢失,例如主库宕机时,已经提交的事务可能还没有传到从库上,如果此时强行主从切换,可能导致新主库上的数据不完整。
用户1148526
2019/05/25
5.4K0
高性能Mysql主从架构的复制原理及配置详解
Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
用户7353950
2022/05/11
5180
高性能Mysql主从架构的复制原理及配置详解
mysql读写分离延迟问题_MySQL读写分离后的延迟解决方案
根据上图可以看到QPS:10.73k,实际上真实的并发大量数据到达的时候,我这里最高的QPS是将近15k.而目前单个数据库分片(实例)4CPU8G内存的配置下,最高的性能是7k的QPS。
全栈程序员站长
2022/09/02
1.3K0
MySQL 主从复制解决了什么问题?出现同步延迟如何解决?
日志文件中记录的到底是什么呢?mysql支持了两种日志格式,这两种日志格式也体现了各自的复制方式
民工哥
2021/05/11
1.1K0
redis主从复制原理是同步还是异步_kubernetes高可用架构
在mysql5.4.1之前只存在这种复制模式,在mysql5.7前默认使用这种格式。
全栈程序员站长
2022/09/22
7790
redis主从复制原理是同步还是异步_kubernetes高可用架构
推荐阅读
相关推荐
MySQL 复制 - 性能与扩展性的基石 2:部署及其配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验