快速的开发

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 396|回复: 1

[原创] 获得机器的操作系统信息

[复制链接]

10

主题

13

帖子

62

积分

超级版主

Rank: 8Rank: 8

积分
62

热心会员

发表于 2017-9-6 18:53:09 | 显示全部楼层 |阅读模式
本帖最后由 流浪剑客 于 2017-9-6 18:54 编辑

https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms724834(v=vs.85).aspx

https://msdn.microsoft.com/zh-cn/library/windows/desktop/dn481241(v=vs.85).aspx

http://www.cnblogs.com/chihirosan/p/5139078.html
http://blog.csdn.net/k1988/article/details/47614529



       [DllImport("user32")]
        public static extern int GetSystemMetrics(int nIndex);

        [DllImport("Kernel32", CharSet = CharSet.Unicode, EntryPoint = "GetVersionEx")]
        private static extern Boolean GetVersionEx_Struct(ref  OSVersionInfo osVersionInfo);

        // 因为Win32 GetVersionEx函数参数lpVersionInformation是一个指向 OSVERSIONINFO的数据结构
        // 所以托管代码中定义个结构体,把结构体对象作为非托管函数参数
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct OSVersionInfo
        {
            public UInt32 OSVersionInfoSize; // 结构的大小,在调用方法前要初始化该字段
            public UInt32 MajorVersion; // 系统主版本号
            public UInt32 MinorVersion; // 系统此版本号
            public UInt32 BuildNumber;  // 系统构建号
            public UInt32 PlatformId;  // 系统支持的平台

            // 此属性用于表示将其封送成内联数组
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string CSDVersion; // 系统补丁包的名称
            public UInt16 ServicePackMajor; // 系统补丁包的主版本
            public UInt16 ServicePackMinor;  // 系统补丁包的次版本
            public UInt16 SuiteMask;   //标识系统上的程序组
            public Byte ProductType;    //标识系统类型
            public Byte Reserved;  //保留,未使用
        }

        // 获得操作系统信息
        private static string GetOSVersion()
        {
            // 定义一个字符串存储版本信息
            string versionName = string.Empty;

            // 初始化一个结构体对象
            OSVersionInfo osVersionInformation = new OSVersionInfo();

            // 调用GetVersionEx 方法前,必须用SizeOf方法设置结构体中OSVersionInfoSize 成员
            osVersionInformation.OSVersionInfoSize = (UInt32)Marshal.SizeOf(typeof(OSVersionInfo));

            // 调用Win32函数
            Boolean result = GetVersionEx_Struct(ref osVersionInformation);

            if (!result)
            {
                // 如果调用失败,获得最后的错误码
                int errorcode = Marshal.GetLastWin32Error();
                Win32Exception win32Exc = new Win32Exception(errorcode);
                string resultMsg = ("调用失败的错误信息为: " + win32Exc.Message);
                // 调用失败时返回为空字符串
                return resultMsg;
            }
            else
            {
                switch (osVersionInformation.MajorVersion)
                {
                    case 5:
                        if (osVersionInformation.MinorVersion == 0)
                        {
                            versionName = "Windows 2000";
                        }
                        if (osVersionInformation.MinorVersion == 1)
                        {
                            versionName = "Windows XP";
                        }
                        if (osVersionInformation.MinorVersion == 2)
                        {
                            if (GetSystemMetrics(89) != 0)
                            {
                                versionName = "Windows Server 2003 R2";
                            }
                            else
                            {
                                versionName = "Windows Server 2003";
                            }
                        }
                        break;
                    case 6:
                        switch (osVersionInformation.MinorVersion)
                        {
                            case 0:
                                if (osVersionInformation.ProductType == (Byte)1)
                                {
                                    versionName = " Microsoft Windows Vista";
                                }
                                else
                                {
                                    versionName = "Microsoft Windows Server 2008"; // 服务器版本
                                }
                                break;
                            case 1:
                                if (osVersionInformation.ProductType == (Byte)1)
                                {
                                    versionName = " Microsoft Windows 7";
                                }
                                else
                                {
                                    versionName = "Microsoft Windows Server 2008 R2";
                                }
                                break;
                            case 2:
                                if (osVersionInformation.ProductType == (Byte)1)
                                {
                                    versionName = "Windows 8";
                                }
                                else
                                {
                                    versionName = "Windows Server 2012";
                                }
                                break;
                            case 3:
                                if (osVersionInformation.ProductType == (Byte)1)
                                {
                                    versionName = "Windows 8.1";
                                }
                                else
                                {
                                    versionName = "Windows Server 2012 R2";
                                }
                                break;
                        }
                        break;
                    case 10:
                        switch (osVersionInformation.MinorVersion)
                        {
                            case 0:
                                if (osVersionInformation.ProductType == (Byte)1)
                                {
                                    versionName = "Windows 10";
                                }
                                else
                                {
                                    versionName = "Windows Server 2016"; // 服务器版本
                                }
                                break;
                        }
                        break;
                    default:
                        versionName = "未知的操作系统";
                        break;
                }
                return versionName;
            }
        }

        public static string GetSystemInfo()
        {
            string OSName = null;
            System.OperatingSystem osInfo = System.Environment.OSVersion;
            switch (osInfo.Platform)
            {
                case PlatformID.Unix:
                    break;
                case PlatformID.Win32NT:
                    OSName = GetOSVersion();
                    break;
                case PlatformID.Win32S:
                    break;
                case PlatformID.Win32Windows:
                    switch (osInfo.Version.Major)
                    {
                        case 0:
                            OSName = "Windows 95";
                            break;
                        case 10:
                            if (osInfo.Version.Revision.ToString() == "2222A")
                                OSName = "Windows 98 Second Edition";
                            else
                                OSName = "Windows 98";
                            break;
                        case 90:
                            OSName = "Windows ME";
                            break;
                        default:
                            OSName = "Unknown Win32 Windows";
                            break;
                    }
                    break;
                case PlatformID.WinCE:
                    break;
                default:
                    break;
            }
            if (osInfo.ServicePack != null)
            {
                OSName += " " + osInfo.ServicePack;
            }
            return OSName;
        }
回复

使用道具 举报

10

主题

13

帖子

62

积分

超级版主

Rank: 8Rank: 8

积分
62

热心会员

 楼主| 发表于 2017-9-6 18:53:29 | 显示全部楼层
SxsTrace使用的方法:
1、cmd命令行下执行命令:SxsTrace Trace -logfile:SxsTrace.etl,启动跟踪;
2、执行目标程序,在弹出错误对话框后,对话框显示的是:
应用程序无法启动,因为应用程序的并行配置不正确,有关详细信息,请参阅应用程序事件日志,或使用命令行SxsTrace.exe工具
3、关闭对话框后,回到命令行,点击回车;
4、继续执行命令:SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt,解析跟踪信息为文本;
5、打开SxsTrace.txt就可以看到相关跟踪信息。
回复

使用道具 举报

QQ|Archiver|手机版|小黑屋|业务快速构建平台 ( 鄂ICP备15010001号

鄂公网安备 42011502000533号

GMT+8, 2019-8-20 11:52 , Processed in 0.083562 second(s), 25 queries .

Powered by Discuz! X3.3

© 2016-2036 Comsenz Inc.

快速回复 返回顶部 返回列表