C#:获取环境信息

 外部环境数据
1.需要管理员权限
2.需要安装office2003以上完整版
3.需要安装flash reader 10.0以上
4.需要安装adodb reader;Adobe Acrobat X Pro; 8.0以上

代码比较差,仅供学习、参考

/// <summary>
    /// 外部环境数据
    /// 1.需要管理员权限
    /// 2.需要安装office2003以上完整版
    /// 3.需要安装flash reader 10.0以上
    /// 4.需要安装adodb reader;Adobe Acrobat X Pro; 8.0以上
    /// </summary>
    public class GlobalEnvironment
    {
        private GlobalEnvironment()
        { }

        private static GlobalEnvironment _instance = new GlobalEnvironment();
        public static GlobalEnvironment Instance
        {
            get { return _instance; }
        }

        /// <summary>
        /// 异步启动
        /// </summary>
        public void StartAsyc()
        {
            InitialTokeSource();
            ExecuteTasck(StartTask);
        }

        private void StartTask()
        {
            log4net.ILog _logger = log4net.LogManager.GetLogger("GlobalEnvironment");
            try
            {
                StringBuilder sb = new StringBuilder();
                SetAdminInfo(sb);
                SetOfficeInfo(sb);
                SetPDFInfo(sb);
                SetFlashInfo(sb);
                SetSystemInfo(sb);
                SetDriverInfo(sb);
                SetAssemblyVersionInfo(sb);

                _logger.FatalFormat(" 系统环境-{0}", sb.ToString());
            }
            catch (Exception ex)
            {
                _logger.ErrorFormat(" 读取系统环境错误-{0}", ex.Message);
            }

        }

        #region AssemblyVersionInfo

        private void SetAssemblyVersionInfo(StringBuilder sb)
        {
            sb.AppendFormat(" >>程序集信息- ");
            ProductPrj prj = new ProductPrj();
            PrintStringFormat(sb, " 产品名称{0},项目名称:{1},版本号:{2}", Enum.GetName(typeof(ProductType), prj.ProductType)
                                                                        , Enum.GetName(typeof(BranchType), prj.BranchType)
                                                                        , prj.Version);
        }
        #endregion

        #region DirverInfo
        private void SetDriverInfo(StringBuilder sb)
        {
            sb.AppendFormat(" >>硬盘信息- ");
            string exePath = AppDomain.CurrentDomain.BaseDirectory;
            DriveInfo driver = DriveInfo.GetDrives().FirstOrDefault(d => exePath.StartsWith(d.Name));

            StringBuilder sbDriver = new StringBuilder();
            if (driver != null)
            {
                sbDriver.AppendFormat("Drive {0}; ", driver.Name);
                sbDriver.AppendFormat("  File type: {0}; ", driver.DriveType);
                if (driver.IsReady == true)
                {
                    sbDriver.AppendFormat("  驱动器的卷标: {0}; ", driver.VolumeLabel);
                    sbDriver.AppendFormat("  文件系统的名称: {0}; ", driver.DriveFormat);
                    sbDriver.AppendFormat("  可用空闲空间总量:{0:N} bytes; ", driver.TotalFreeSpace);
                    sbDriver.AppendFormat("  存储空间的总大小:{0:N} bytes;  ", driver.TotalSize);
                }

            }

            PrintStringFormat(sb, @" >>应用程序执行路径{0},{1} ", exePath, sbDriver.ToString());
        }
        #endregion

        #region SystemInfo
        private void SetSystemInfo(StringBuilder sb)
        {
            sb.AppendFormat(" >>系统信息- ");
            const int nChars = 128;
            string flag = "$";
            StringBuilder Buff = new StringBuilder(nChars);
            GetWindowsDirectory(Buff, nChars);
            sb.AppendFormat(" Windows路径:{0}; ", Buff.ToString());
            GetSystemDirectory(Buff, nChars);
            sb.AppendFormat(" 系统路径:{0}; ", Buff.ToString());
            sb.AppendFormat(" 系统版本:{0}; ", GetOSType());
            sb.AppendFormat(" 计算机的名称:{0}; ", Environment.MachineName);
            sb.AppendFormat(" 当前系统是否为 64 位系统:{0}; ", Environment.Is64BitOperatingSystem);
            sb.AppendFormat(" 当前进程是否为 64 位进程:{0}; ", Environment.Is64BitProcess);

            sb.AppendFormat(" >>cpu信息- ");
            ///调用GetSystemInfo函数获取CPU的相关信息   
            CPU_INFO CpuInfo;
            CpuInfo = new CPU_INFO();
            GetSystemInfo(ref CpuInfo);
            sb.AppendFormat(" 逻辑处理器{0}个; ", CpuInfo.dwNumberOfProcessors.ToString());
            sb.AppendFormat(" CPU的类型为{0}; ", CpuInfo.dwProcessorType.ToString());
            sb.AppendFormat(" CPU的速度为{0}GHz;  ", CPUSpeed().ToString());

            sb.AppendFormat(" >>内存信息- ");
            ///调用GlobalMemoryStatus函数获取内存的相关信息   
            MEMORY_INFO MemInfo;
            MemInfo = new MEMORY_INFO();
            GlobalMemoryStatus(ref MemInfo);
            sb.AppendFormat(" 已经使用内存大小{0:N}%; ", MemInfo.dwMemoryLoad);
            sb.AppendFormat(" 可用交换文件大小有{0:N}字节; ", MemInfo.dwAvailPageFile);
            sb.AppendFormat(" 可使用的物理内存有{0:N}字节; ", MemInfo.dwAvailPhys);
            sb.AppendFormat(" 可使用的虚拟内存有{0:N}字节; ", MemInfo.dwAvailVirtual);
            sb.AppendFormat(" 交换文件总大小为{0:N}字节; ", MemInfo.dwTotalPageFile);
            sb.AppendFormat(" 物理内存共有{0:N}字节; ", MemInfo.dwTotalPhys);
            sb.AppendFormat(" 虚拟内存共有{0:N}字节; ", MemInfo.dwTotalVirtual);
            sb.Replace(flag, MemInfo.dwLength.ToString());

        }

        public float CPUSpeed()
        {
            ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
            uint sp = (uint)(Mo["CurrentClockSpeed"]);
            Mo.Dispose();
            return Convert.ToSingle(sp) / 1000;
        }

        public static string GetOSType()
        {
            //定义系统版本
            Version ver = System.Environment.OSVersion.Version;
            string OSType = "";
            //Major主版本号
            //Minor副版本号
            if (ver.Major == 5 && ver.Minor == 0)
            {
                OSType = " Windows 2000 ";
            }
            else if (ver.Major == 5 && ver.Minor == 1)
            {
                OSType = " Windows XP ";
            }
            else if (ver.Major == 5 && ver.Minor == 2)
            {
                OSType = " Windows 2003/Windows XP 64-Bit Edition/Windows Server 2003 R2 ";
            }
            else if (ver.Major == 6 && ver.Minor == 0)
            {
                OSType = " Windows Vista/Windows Server 2008 ";
            }
            else if (ver.Major == 6 && ver.Minor == 1)
            {
                OSType = " Windows7/Windows Server 2008 R2 ";
            }
            else if (ver.Major == 6 && ver.Minor == 2)
            {
                OSType = " Windows8/Windows Server 2012 ";
            }
            else if (ver.Major == 6 && ver.Minor == 3)
            {
                OSType = " Windows8.1/Windows Server 2012 R2 ";
            }
            else
            {
                OSType = string.Format("未知:major:{0},minor{1}", ver.Major, ver.Minor);
            }
            return OSType;
        }

        [DllImport("kernel32")]
        public static extern void GetWindowsDirectory(StringBuilder WinDir, int count);
        [DllImport("kernel32")]
        public static extern void GetSystemDirectory(StringBuilder SysDir, int count);
        [DllImport("kernel32")]
        public static extern void GetSystemInfo(ref CPU_INFO cpuinfo);
        [DllImport("kernel32")]
        public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo);
        [DllImport("kernel32")]
        public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo);
        //定义CPU的信息结构   
        [StructLayout(LayoutKind.Sequential)]
        public struct CPU_INFO
        {
            public uint dwOemId;
            public uint dwPageSize;
            public uint lpMinimumApplicationAddress;
            public uint lpMaximumApplicationAddress;
            public uint dwActiveProcessorMask;
            public uint dwNumberOfProcessors;
            public uint dwProcessorType;
            public uint dwAllocationGranularity;
            public uint dwProcessorLevel;
            public uint dwProcessorRevision;
        }
        //定义内存的信息结构   
        [StructLayout(LayoutKind.Sequential)]
        public struct MEMORY_INFO
        {
            public uint dwLength;
            public uint dwMemoryLoad;
            public uint dwTotalPhys;
            public uint dwAvailPhys;
            public uint dwTotalPageFile;
            public uint dwAvailPageFile;
            public uint dwTotalVirtual;
            public uint dwAvailVirtual;
        }
        //定义系统时间的信息结构   
        [StructLayout(LayoutKind.Sequential)]
        public struct SYSTEMTIME_INFO
        {
            public ushort wYear;
            public ushort wMonth;
            public ushort wDayOfWeek;
            public ushort wDay;
            public ushort wHour;
            public ushort wMinute;
            public ushort wSecond;
            public ushort wMilliseconds;
        }
        #endregion

        #region IsAdministrator
        public void SetAdminInfo(StringBuilder sb)
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            this.IsAdministrator = principal.IsInRole(WindowsBuiltInRole.Administrator);

            PrintStringFormat(sb, "admin: {0}", this.IsAdministrator ? "管理员" : "非管理员");
        }

        public bool IsAdministrator { get; private set; }
        #endregion

        #region office
        private const string RegOfficeKey = @"Software\Microsoft\Windows\Shell\AttachmentExecute\{0002DF01-0000-0000-C000-000000000046}";
        private void SetOfficeInfo(StringBuilder sb)
        {
            string wordVersion = "";
            string excelVersion = "";
            string pptVersion = "";

            if (IsAdministrator)
            {
                wordVersion = GetMajorVersion(RegisterValue("winword.exe"));
                excelVersion = GetMajorVersion(RegisterValue("excel.exe"));
                pptVersion = GetMajorVersion(RegisterValue("powerpnt.exe"));
            }

            this.WordEable = wordVersion == "" ? false : true;
            this.ExcelEable = excelVersion == "" ? false : true;
            this.PPTEable = pptVersion == "" ? false : true;

            PrintStringFormat(sb, "word: {0}", wordVersion);
            PrintStringFormat(sb, "excel: {0}", excelVersion);
            PrintStringFormat(sb, "ppt: {0}", pptVersion);
        }

        private string GetMajorVersion(string _path)
        {
            string toReturn = "";
            if (File.Exists(_path))
            {
                try
                {
                    FileVersionInfo _fileVersion = FileVersionInfo.GetVersionInfo(_path);
                    toReturn = _fileVersion.FileMajorPart.ToString();
                }
                catch
                { }
            }
            return toReturn;
        }
        #endregion

        #region pdf
        private void SetPDFInfo(StringBuilder sb)
        {
            string path = RegisterValue("AcroRd32.exe");
            if (string.IsNullOrEmpty(path)) path = RegisterValue("AcroDist.exe");
            PrintStringFormat(sb, "pdf: {0}", path);

            this.PdfEable = path == "" ? false : true;
        }
        #endregion

        #region flash
        private void SetFlashInfo(StringBuilder sb)
        {
            string version = "";
            version = GetAppVersion("ShockwaveFlash.ShockwaveFlash", (t, o) =>
            {
                return o.GetType().InvokeMember("GetVariable", BindingFlags.InvokeMethod,
                                                null, o, new object[] { "$version" }).ToString();
            });
            PrintStringFormat(sb, "flash player: {0}", version);

            if (version != "")
            {
                version = version.Replace("WIN", "").Trim();
                string[] va = version.Split(',');
                int v1 = 0;
                if (va.Length > 0)
                {
                    int.TryParse(va[0], out v1);
                }
                if (v1 > 9)
                    this.SwfEnable = true;
            }

        }
        #endregion

        #region taskecancel
        private CancellationTokenSource _tokenSource;

        private void InitialTokeSource()
        {
            _tokenSource = new CancellationTokenSource();
        }

        private void CancelTokeSource()
        {
            _tokenSource.Cancel();
        }

        private void ExecuteTasck(Action function)
        {
            TaskFactory taskFactory = new TaskFactory();
            CancellationToken token = _tokenSource.Token;


            taskFactory.StartNew(() =>
            {
                if (token.IsCancellationRequested)
                {
                    token.ThrowIfCancellationRequested();//强制取消 并不会让TaskTest1停止执行
                }
                function();
            }, token);
        }

        private Task<TResult> ExecuteTasck<TResult>(Func<TResult> function)
        {
            TaskFactory taskFactory = new TaskFactory();
            CancellationToken token = _tokenSource.Token;


            return taskFactory.StartNew<TResult>(() =>
            {
                if (token.IsCancellationRequested)
                {
                    token.ThrowIfCancellationRequested();//强制取消 并不会让TaskTest1停止执行
                }
                return function();
            }, token);
        }

        private Task<TResult> ExecuteTasck<TResult>(Func<object, TResult> function, object param)
        {
            TaskFactory taskFactory = new TaskFactory();
            CancellationToken token = _tokenSource.Token;

            return taskFactory.StartNew<TResult>((p) =>
            {
                if (token.IsCancellationRequested)
                {
                    token.ThrowIfCancellationRequested();//强制取消 并不会让TaskTest1停止执行
                }
                return function(p);
            }, param, token);
        }
        #endregion

        #region register
        private const string RegKey = @"Software\Microsoft\Windows\CurrentVersion\App Paths";
        private string RegisterValue(string _key)
        {
            string path = "";
            RegistryKey _mainKey = Registry.CurrentUser;
            try
            {
                _mainKey = _mainKey.OpenSubKey(RegKey + "\\" + _key, false);
                if (_mainKey != null)
                {
                    path = _mainKey.GetValue(string.Empty).ToString();
                }
            }
            catch
            { }

            //if not found, looks inside LOCAL_MACHINE:
            _mainKey = Registry.LocalMachine;
            if (string.IsNullOrEmpty(path))
            {
                try
                {
                    _mainKey = _mainKey.OpenSubKey(RegKey + "\\" + _key, false);
                    if (_mainKey != null)
                    {
                        path = _mainKey.GetValue(string.Empty).ToString();
                    }
                }
                catch
                {
                }
            }

            if (_mainKey != null)
                _mainKey.Close();
            return path;
        }
        #endregion

        #region version
        private string GetAppVersion(string progid, Func<Type, object, string> getVersionMethod)
        {
            try
            {
                Type type = Type.GetTypeFromProgID(progid);
                if (type != null)
                {
                    dynamic obj = Activator.CreateInstance(type);
                    var versionString = getVersionMethod(type, obj);

                    if (progid == "Word.Application") obj.Quit(false);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                    return versionString;
                }
            }
            catch (Exception ex)
            {
            }
            return "";
        }
        #endregion

        #region print
        private void PrintStringFormat(StringBuilder sb, string v, params string[] p)
        {
            sb.AppendFormat(v, p);
            sb.Append(" ; ");
        }
        #endregion

        #region enable
        public bool WordEable { get; private set; }
        public bool ExcelEable { get; private set; }
        public bool PPTEable { get; private set; }
        public bool PdfEable { get; set; }
        public bool SwfEnable { get; private set; }

        ///// <summary>
        /////检测资源控件是否可用
        ///// </summary>
        ///// <param name="func"></param>
        //public void ResCheckEnable(Func<Tuple<bool, bool, bool, bool, bool>> func)
        //{
        //    ExecuteTasck(() => {
        //        Tuple<bool, bool, bool, bool, bool> tuple = func();
        //        WordEable = tuple.Item1;
        //        ExcelEable = tuple.Item2;
        //        PPTEable = tuple.Item3;
        //        PdfEable = tuple.Item4;
        //        SwfEnable = tuple.Item5;                
        //    });
        //}

        #endregion


    }
View Code

 

posted @ 2016-12-22 16:37  慧由心生  阅读(711)  评论(0编辑  收藏  举报