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 }