獲取Windows平臺下 安裝office 版本位數信息

来源:https://www.cnblogs.com/skyheaving/archive/2020/01/14/12191209.html

最近在處理客戶端安裝程式過程,有一個需求:需要檢測Windows平臺下安裝office 版本信息以及獲取使用的office是32 位還是64 位; 當檢測出office 位數為64位時,提示當前office 不支持程式的使用。 找了很多資料,一般情況下,是不能直接獲取office 安裝位數信息的;加 ...


  最近在處理客戶端安裝程式過程,有一個需求:需要檢測Windows平臺下安裝office 版本信息以及獲取使用的office是32 位還是64 位; 當檢測出office 位數為64位時,提示當前office 不支持程式的使用。

  找了很多資料,一般情況下,是不能直接獲取office 安裝位數信息的;加上Windows 32 位與64位系統 ,安裝使用的office在不同Windows系統下註冊表位置不一樣,久久不能解決這個需求。

  話不多說,先記錄一下代碼。

註意事項:

  Environment.Is64BitOperatingSystem   ......//判斷當前windows是否為64位操作系統   // 支持 .NetFrame Work 4.0+

  RegistryKey.OpenBaseKey       .... // 支持 .NetFrame Work 4.0+

          //確定當前操作系統是否為 64 位操作系統
                if (Environment.Is64BitOperatingSystem)
                    // 64 位操作系統
                    registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
                else
                    // 32 位操作系統
                    registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);

 

 

 

檢測註冊表是否有wps安裝信息:

 1         /// <summary>
 2         /// 檢測本地是否安裝wps
 3         /// </summary>
 4         /// <returns></returns>
 5         public string CheckWpsExsitStatus()
 6         {
 7             string wpsJudge = string.Empty;
 8             try
 9             {
10                 //獲取 Windows 註冊表基項 HKEY_LOCAL_MACHINE。
11                 RegistryKey registryKey = Registry.LocalMachine;
12                 //確定當前操作系統是否為 64 位操作系統(支持.NetFrame Work 4.0+)
13                 if (Environment.Is64BitOperatingSystem)
14                     // 64 位操作系統
15                     registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
16                 else
17                     // 32 位操作系統
18                     registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
19 
20                 //讀取註冊表信息 32
21                 RegistryKey wpsKey1 = registryKey.OpenSubKey(@"SOFTWARE\Kingsoft\Office\6.0\common");
22                 if (wpsKey1 != null)
23                 {
24                     string filewps = wpsKey1.GetValue("InstallRoot").ToString();
25                     if (File.Exists(filewps + @"\office6\et.exe"))
26                     {
27                         wpsJudge = "本電腦安裝了Wps+Path=" + @"SOFTWARE\Kingsoft\Office\6.0\common";
28                     }
29                 }
30                 //讀取註冊表信息 6432
31                 RegistryKey wpsKey2 = registryKey.OpenSubKey(@"SOFTWARE\Wow6432Node\Kingsoft\Office\6.0\common");
32                 if (wpsKey1 != null)
33                 {
34                     string filewps = wpsKey2.GetValue("InstallRoot").ToString();
35                     if (File.Exists(filewps + @"\office6\et.exe"))
36                     {
37                         wpsJudge = "本電腦安裝了Wps+Path=" + @"SOFTWARE\Wow6432Node\Kingsoft\Office\6.0\common";
38                     }
39                 }
40 
41                 if (wpsJudge == string.Empty)
42                     wpsJudge = "未安裝wps!";
43             }
44             catch (Exception ex)
45             {
46                 wpsJudge = "檢測失敗!" + ex.Message;
47             }
48 
49             return wpsJudge;
50         }

 

   檢測office 安裝情況:

 1         /// <summary>
 2         /// 檢測本地是否安裝Office
 3         /// </summary>
 4         /// <param name="officeVersion">office 版本代號:14.0(office2010)</param>
 5         /// <returns></returns>
 6         public string CheckOfficeExsitStatus(string officeVersion)
 7         {
 8             string officeJudge = string.Empty;
 9             string officeVersionInfo = string.Empty;
10             if (string.IsNullOrEmpty(officeVersion))
11                 return officeJudge;
12             try
13             {
14                 //是否安裝office
15                 bool IsInstall = false;
16                 //系統版本
17                 bool IsSys64Bit = true;
18                 //office 安裝位數 1=32(NoWow6432Node);2=64(Wow6432Node)
19                 int IofficeSetInfo = 0;
20 
21                 //獲取 Windows 註冊表基項 HKEY_LOCAL_MACHINE。
22                 RegistryKey registryKey = Registry.LocalMachine;
23                 //確定當前操作系統是否為 64 位操作系統(支持.NetFrame Work 4.0+;4.0以下 可以去除當前判斷部分
24                 if (Environment.Is64BitOperatingSystem)
25                     // 64 位操作系統
26                     registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
27                 else
28                     // 32 位操作系統
29                     IsSys64Bit = false; registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
30 
31           // 32位操作系統?
32                 RegistryKey officeKey1 = registryKey.OpenSubKey(@"SOFTWARE\Microsoft\Office\" + officeVersion + @"\Word\InstallRoot");
33                 if (officeKey1 != null)
34                 {
35                     if (officeKey1.GetValue("Path") != null)
36                     {
37                         string filewps = officeKey1.GetValue("Path").ToString();
38                         if (File.Exists(filewps + "WINWORD.exe"))
39                         {
40                             IofficeSetInfo = 1;
41                             IsInstall = true;
43                         }
44                     }
45                 }
46           //64位操作系統安裝32位軟體 ?
47                 RegistryKey officeKey2 = registryKey.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Office\" + officeVersion + @"\Word\InstallRoot");
48                 if (officeKey2 != null)
49                 {
50                     if (officeKey2.GetValue("Path") != null)
51                     {
52                         string filewps = officeKey2.GetValue("Path").ToString();
53                         if (File.Exists(filewps + "WINWORD.exe"))
54                         {
55                             IofficeSetInfo = 2;
56                             IsInstall = true;
58                         }
59                     }
60                 }
61                 //已經安裝
62                 if (IsInstall)
63                 {
64                     //64位操作系統
65                     if (IsSys64Bit)
66                     {
67                         //使用office 位數信息
68                         if (IofficeSetInfo == 1)
69                         {
70                             officeVersionInfo = "當前安裝office 版本為64位";
71                         }
72                         else if (IofficeSetInfo == 2)
73                         {
74                             officeVersionInfo = "當前安裝office 版本為32位";
75                         }
76                     }
77                     else
78                     {
79                         if (IofficeSetInfo == 1)
80                         {
81                             officeVersionInfo = "當前安裝office 版本為32位";
82                         }
83                         else if (IofficeSetInfo == 2)
84                         {
85                             officeVersionInfo = "當前安裝office 版本為64位";
86                         }
87                     }
88                     officeVersionInfo = officeVersionInfo + $"IsSys64Bit={IsSys64Bit},IofficeSetInfo={IofficeSetInfo}";
89                 }
90 
91             }
92             catch (Exception ex)
93             {
94                 officeVersionInfo = "檢測失敗!" + ex.Message;
95             }
96 
97             return officeVersionInfo;
98         }

獲取office 版本名稱

 1         /// <summary>
 2         /// 返回office 版本(暫不包含office2019 )
 3         /// </summary>
 4         /// <param name="versionNum">office 版本代號</param>
 5         /// <returns></returns>
 6         public string GetOfficeVersionName(string versionNum)
 7         {
 8             string strDesc = string.Empty;
 9             switch (versionNum)
10             {
11                 case "8.0": { strDesc = "office97"; } break;
12                 case "9.0": { strDesc = "office2000"; } break;
13                 case "10.0": { strDesc = "officexp(2002)"; } break;
14                 case "11.0": { strDesc = "office2003"; } break;
15                 case "12.0": { strDesc = "office2007"; } break;
16                 case "14.0": { strDesc = "office2010"; } break;
17                 case "15.0": { strDesc = "office2013"; } break;
18                 case "16.0": { strDesc = "office2016"; } break;
19                 default: strDesc = "未找到匹配內容:version=" + versionNum; break;
20             }
21 
22             return strDesc;
23         }

     測試代碼:

 1  /// <summary>
 2         /// 獲取office 安裝情況
 3         /// </summary>
 4         public void GetVersionIsInstall()
 5         {
 6             var strArray = new string[] { "8.0", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0" };
 7             foreach (var item in strArray)
 8             {
 9                 var setInfo = CheckOfficeExsitStatus(item);//獲取安裝office 情況信息
10                 if (!string.IsNullOrEmpty(setInfo))
11                     Console.WriteLine("系統安裝Office版本為:" + GetOfficeVersionName(item));
12                 Console.WriteLine("item=" + item + ";" + setInfo);
13             }
14         }

測試效果截圖:

 

 

以上在Windows 7 以及 Windows Server 2008 R2 系統測試,可以使用;      如有不合理之處,請大家多多指教。

如果您覺得本文對您有幫助,歡迎點擊“推薦”按鈕,您的“推薦”將是我最大的寫作動力!(/:微笑)歡迎轉載,轉載請註明出處。


您的分享是我們最大的動力!

更多相關文章
  • 在這個互聯網時代,數據被稱為石油,由此數據安全是被看得尤為重要,本篇文章意在普及密碼學的基礎知識。 ...
  • 1 static DataTable ConvertJsonToTable(string jsonValue) 2 { 3 DataTable dt = (DataTable)JsonConvert.DeserializeObject(jsonValue, typeof(DataTable)); 4 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,記錄一下學習過程以備後續查用。 一、引言 在現實生活中,我們經常會遇到一些構成比較複雜的物品。比如電腦,是由CPU、主板、記憶體條、硬碟、顯卡、機箱等組裝而成的。手機也是複雜物品, 由主板 ...
  • 做了一個 項目本地測了沒問題發佈到正式環境上,幾天之後有個統計頁面報錯了,看了本地是正常的, 於是就排查,發現 ID 列 在對 字元串轉int 時候 由於用了 Convert.TonInt16 長度不夠, 資料庫的ID 已經到了33000。 自己也知道 Convert.TonInt16 、 Conv ...
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 C WPF之Material Design自定義顏色 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 1. 本文背景 主要介紹使用Material De ...
  • 生活中,如果1+2+3+4.....+100,大家基本上都會用等差數列計算,如果有人從1開始加,不是傻就是白X,那麼程式中呢,是不是也是這樣。今天無意中看到了尾遞歸,以前也寫過,但是不知道這個專業名詞,今天寫一下對比下性能問題。 今天主要是看到了尾遞歸,所以聯想到了這些,寫下這篇文章,其中也把Ben ...
  • 背景 通常,.Net 應用程式中的配置存儲在配置文件中,例如 App.config、Web.config 或 appsettings.json。從 ASP.Net Core 開始,出現了一個新的可擴展配置框架,它允許將配置存儲在配置文件之外,並從命令行、環境變數等等中檢索它們。 在傳統項目中,修改配 ...
  • 前言 導出功能幾乎是所有應用系統必不可少功能,今天我們來談一談,如何使用記憶體映射文件MMF進行記憶體優化,本文重點介紹使用方法,相關原理可以參考文末的連接 實現 我們以單次導出一個excel舉例(csv同理),excel包含1~n個sheet,在每個sheet中存儲的按行和列的坐標在單元格存儲具體數據 ...
一周排行
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 .NET CORE(C ) WPF 抽屜式菜單 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 4. 源碼 1. 本文背景 使用簡單動畫實現抽屜式菜單 ...
  • 在上面abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之八(三十四) 文章的學習之後。我們通過前面的八篇文章已經學習了通過WebAPI介面與控制器去實現新增、刪除與修改功能。接下來,我們要在控制器中實現查詢功能。 ...
  • 1.選中項目-->屬性-->生成-->選中 XML文檔文件(xml路徑和該項目相同) 2.選擇生成序列化程式集:自動/開 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,記錄一下學習過程以備後續查用。 一、引言 從今天開始我們開始講結構型設計模式,結構型設計模式有如下幾種:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。 創建型設 ...
  • C 中 ConfigureAwait 相關答疑FAQ 在前段時間經常看到園子里有一些文章討論到 ConfigureAwait,剛好今天在微軟官方博客看到了 "Stephen Toub" 前不久的一篇答疑 ConfigureAwait 的一篇文章,想翻譯過來。 原文地址:https://devblog ...
  • 想要實現二維數組中根據某個欄位排序,一般可以通過數組迴圈對比的方式實現。這裡介紹一種更簡單的方法,直接通過PHP函數實現。array_multisort() :可以用來一次對多個數組進行排序,或者根據某一維或多維對多維數組進行排序。詳細介紹可參考PHP手冊:https://www.php.net/m ...
  • 常用的軟體: 播放器: cloundMusic(網易雲音樂) https://music.163.com/#/download PotPlayer(一款強大的視頻播放器) https://daumpotplayer.com/download/ ACDsee(ACDsee圖片編輯器免費版) https ...
  • 發現問題 在一次偶然中,在爬取某個網站時,老方法,打開調試工具查看請求方式,請求攔截,是否是非同步載入,不亦樂乎,當我以為這個網站非常簡單的時候,發現二級網頁的地址和源碼不對應 Ajax非同步載入?源碼也是這樣的 而且這些鏈接直... ...
  • 準備年後要跳槽,所以最近一直再看面試題,並且把收集到的面試題整理了以下發到博客上,希望對大家有所幫助。 首先是集合類的面試題 1. HashMap 排序題,上機題。 已知一個 HashMap<Integer,User>集合, User 有 name(String)和 age(int)屬性。請寫一個方 ...
  • JVM體繫結構圖 Native Interface(本地介面) Java本地介面(Java Native Interface (JNI))允許運行在Java虛擬機(Java Virtual Machine (JVM))上的代碼調用本地程式和類庫,或者被它們調用,這些程式和類庫可以是其它語言編寫的,比 ...
x