Dir*_*mar 72
检查已安装的Office版本的一种方法是检查InstallRoot感兴趣的Office应用程序的注册表项.
例如,如果要检查是否已安装Word 2007,则应检查是否存在以下注册表项:
HKLM\Software\Microsoft\Office\12.0\Word\InstallRoot::Path
此条目包含可执行文件的路径.
将12.0(对于Office 2007)替换为相应的版本号:
Office 97 - 7.0 Office 98 - 8.0 Office 2000 - 9.0 Office XP - 10.0 Office 2003 - 11.0 Office 2007 - 12.0 Office 2010 - 14.0 (sic!) Office 2013 - 15.0 Office 2016 - 16.0 Office 2019 - 16.0 (sic!)
其他应用程序具有类似的键:
HKLM\Software\Microsoft\Office\12.0\Excel\InstallRoot::Path
HKLM\Software\Microsoft\Office\12.0\PowerPoint\InstallRoot::Path
或者,您可以检查所有应用程序的公共根路径:
HKLM\Software\Microsoft\Office\12.0\Common\InstallRoot::Path
不使用特定注册表项的另一个选项是使用此处所述的MSIEnumProductsAPI 查询MSI数据库.
另外,Microsoft不正式支持不同Office版本的并行安装.它们确实有些工作,但是你可能会产生不良影响和不一致.
更新:Office 2019和Office 365
从Office 2019开始,基于MSI的设置不再可用,"即点即用"是现在部署Office的唯一方法.连同对定期更新的Office 365的此更改,Office的主要/次要版本号也不再更新(至少目前为止).这意味着 - 即使对于Office 2019  - 注册表项中使用的值和Application.Version(例如在Word中)返回的值仍然是16.0.
暂时没有记录的方法来区分Office 2016和Office 2019.线索可能是winword.exe的文件版本; 但是,对于修补的Office 2016版本,此版本也会增加(请参阅下面的@antonio的评论).
如果您需要以某种方式区分Office版本,例如,为了确保存在某个功能或安装了最低版本的Office,可能是查看其中一个主要Office应用程序的文件版本的最佳方式:
// Using the file path to winword.exe
// Retrieve the path e.g. from the InstallRoot Registry key
var fileVersionInfo = FileVersionInfo.GetVersionInfo(@"C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE");
var version = new Version(fileVersionInfo.FileVersion);
// On a running instance using the `Process` class
var process = Process.GetProcessesByName("winword").First();
string fileVersionInfo = process.MainModule.FileVersionInfo.FileVersion;
var version = Version(fileVersionInfo);
Office 2019的文件版本是16.0.10730.20102,因此,如果您看到任何大于您处理Office 2019或当前Office 365版本的文件.
Jas*_*son 16
如果您在64位计算机上安装了32位Office,则可能需要检查是否存在"SOFTWARE\Wow6432Node\Microsoft\Office\12.0 \",并使用相应的版本替换12.0.对于安装在64位Windows 7上的Office 2007,情况确实如此.
请注意,Office 2010(== 14.0)是第一个存在64位版本的Office.
I found this CodeProject which helped me out with this very problem: http://www.codeproject.com/Articles/26520/Getting-Office-s-Version
namespace Software_Info_v1._0
{
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Interop;
public class MS_Office
{
    public string GetOfficeVersion()
    {
        string sVersion = string.Empty;
        Microsoft.Office.Interop.Word.Application appVersion = new Microsoft.Office.Interop.Word.Application();
        appVersion.Visible = false;
        switch (appVersion.Version.ToString())
        {
            case "7.0":
                sVersion = "95";
                break;
            case "8.0":
                sVersion = "97";
                break;
            case "9.0":
                sVersion = "2000";
                break;
            case "10.0":
                sVersion = "2002";
                break;
            case "11.0":
                sVersion = "2003";
                break;
            case "12.0":
                sVersion = "2007";
                break;
            case "14.0":
                sVersion = "2010";
                break;
            default:
                sVersion = "Too Old!";
                break;
        }
        Console.WriteLine("MS office version: " + sVersion);
        return null;
    }
}
}
小智 6
尽管这个问题很久以前就得到了回答,但我发现了一些与上述答案相关的有趣事实要补充。
正如 Dirk 提到的,从 Office 365 / 2019 开始,MS 似乎有一种奇怪的版本控制方式。您无法再通过查看可执行路径来区分这三个(2016、2019、O365)。就像他自称的那样,查看可执行文件的构建,作为判断哪个是什么的手段,也不是很有效。
经过一番研究,我找到了一个可行的解决方案。解决方案位于注册表子项下Computer\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\Licensing\LicensingNext。
所以,我的逻辑如下:
情况一:如果电脑安装了MSOffice 2016,.下没有子项Licensing。
情况 2:如果计算机安装了 MSOffice 2019,则有值的名称(Office 产品 ID 之一)。(例如Standard2019Volume)
情况 3:如果计算机安装了 Office365,则有一个名为o365bussinessretail(也是产品 ID)的值以及一些其他值。
为了区分这三个,我只是打开了钥匙,看看是否失败。如果打开失败,其Office 2016 . 然后我枚举LicensingNext并尝试查看是否有任何名称具有前缀o365,如果找到它,则它的O365。如果没有,那么它的Office 2019。
坦率地说,我没有足够的时间来测试不同环境下的逻辑。所以请注意。
希望这对感兴趣的人有所帮助。
| 归档时间: | 
 | 
| 查看次数: | 113958 次 | 
| 最近记录: |