我无法为多个Office产品找到一致的版本号。
这个post让我看到了这些知识库文章,这些文章提供了查找Office 2007和Office 2010产品服务包的不同方法。
但是,Office .exe文件的文件版本与图表不一致。
使用我机器上安装的Excel 2010作为示例:
是否有更可靠的方法来检索Microsoft Office产品的版本号和服务包?
答案 0 :(得分:6)
我们决定退出这个,因为它花了太多时间。但是,我想我会发布我得到的东西以防任何人需要更远的地方。
首先,以下是列出Service Pack版本的三篇相关知识库文章:
这些文章中的方法2表明可执行文件的属性是获取实际文件版本的可靠方法。不幸的是,事实并非如此。
以下是查找可执行文件的方法:
找到Office的安装根目录:
// version is one of these three: Office 2003 = 11, Office 2007 = 12, Office 2010 = 14
RegistryKey registryKey =
Registry.LocalMachine.OpenSubKey(String.Format(
@"SOFTWARE\Microsoft\Office\{0}.0\Common\InstallRoot", (int)version));
if (registryKey == null)
registryKey = Registry.LocalMachine.OpenSubKey(
registryKeyPath.Insert("SOFTWARE".Length, "\\Wow6432Node"));
if (registryKey != null)
installRoot = registryKey.GetValue("Path").ToString();
然后附加可执行文件的名称(Office 2003的例外情况):
使用此信息,您可以获取所选应用程序的FileVersionInfo 。以Word为例:
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(
Path.Combine(installRoot, "WINWORD.EXE"));
if (fileVersionInfo != null)
fileVersion = fileVersionInfo.FileVersion;
从理论上讲,您现在可以将此版本号与KB文章中的表进行比较,以找到正确的Service Pack。这是我因为问题中列出的原因而放弃我的努力的地方 - 你会发现版本号不匹配。
您可以使用类似于以下的代码比较版本,例如Word 2010 SP1:
Version version = new Version(fileVersion);
if (version >= new Version("14.0.6024.1000"))
servicePack = 1
以下是获取Office套件版本的一些代码:
string msodllPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
String.Format(@"Common Files\microsoft shared\OFFICE{0}\MSO.DLL", (int)Version));
if (!File.Exists(msodllPath))
msodllPath = msodllPath.Replace("Program Files", "Program Files (x86)");
if (File.Exists(msodllPath))
{
FileVersionInfo msodll = FileVersionInfo.GetVersionInfo(msodllPath);
FileVersion = new Version(msodll.FileVersion);
}
如果您正在尝试获取版本名称(即专业版,旗舰版,学生版等),那么您正在冒险。这里有一些可能有用的未经测试的代码片段。每个版本的办公室和每个版本都有所不同,祝你好运!
string fullNameRegistryKey = "";
if (Version == OfficeVersion.Office2010)
fullNameRegistryKey = String.Format(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Office{0}.PROPLUSR",
(int)Version);
else if (Version == OfficeVersion.Office2007)
fullNameRegistryKey = String.Format(
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\PRO",
(int)Version);
RegistryKey installRootRegistryKey = GetSoftwareRegistryKey(fullNameRegistryKey);
if (installRootRegistryKey != null)
FullName = installRootRegistryKey.GetValue("DisplayName")
.ToString().Replace("Microsoft ", "");
答案 1 :(得分:0)
看看你是否可以改编这段代码:
What is the best way to get Excel version?
此代码使用Application.ProductCode来确定Office版本。 ProductCode是大多数Office产品中可用的属性。我检查了Outlook,Word,Excel和Access 2003,所有人都有它。
您也可以利用此代码:
Display system and version information
此代码采用MSACCESS.exe文件名并使用Windows API确定版本和程序集信息,从中可以派生服务包编号。