zoukankan      html  css  js  c++  java
  • 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 = @"SoftwareMicrosoftWindowsShellAttachmentExecute{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 = @"SoftwareMicrosoftWindowsCurrentVersionApp 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
  • 相关阅读:
    Matlab图像处理函数:regionprops
    Java的 volatile关键字的底层实现原理
    SQL学习(一.索引)
    solr7.7.0搜索引擎使用(四)(搜索语法)
    solr7.7.0搜索引擎使用(三)(添加文件索引)
    singleton单例模式小结
    多态小结
    quartz定时任务时间设置
    EditPlus编译运行java文件
    NoClassDefFoundError错误发生的原因
  • 原文地址:https://www.cnblogs.com/shenchao/p/6211851.html
Copyright © 2011-2022 走看看