Мы решили отказаться от этого, потому что это занимало слишком много времени.Однако я решил опубликовать то, что получил, на тот случай, если кому-то понадобится пойти дальше.
Во-первых, вот три соответствующие статьи базы знаний, в которых перечислены версии пакета обновления:
Метод 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):
- Доступ: MSACCESS.EXE
- Excel: EXCEL.EXE
- Outlook: OUTLOOK.EXE (используйте OUTLIB.DLL для2003)
- PowerPoint: POWERPNT.EXE
- Word: WINWORD.EXE
С помощью этой информации вы можете получить FileVersionInfo для выбранного приложения .Используя Word в качестве примера:
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(
Path.Combine(installRoot, "WINWORD.EXE"));
if (fileVersionInfo != null)
fileVersion = fileVersionInfo.FileVersion;
Теоретически, теперь вы можете сравнить этот номер версии с таблицами из статей базы знаний, чтобы найти правильный пакет обновления.Именно здесь я отказался от своих усилий по причинам, перечисленным в вопросе - номера версий просто не совпадают.
Вы можете использовать код, подобный приведенному ниже, чтобы сравнить версии для, скажем, Word 2010 SP1:
Version version = new Version(fileVersion);
if (version >= new Version("14.0.6024.1000"))
servicePack = 1
Вот некоторый код для получения версииОфисный пакет :
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);
}
Если вы пытаетесь получить название издания (т. Е. Professional, Ultimate, Student и т. Д.), Вас ждет приключение.Вот некоторые непроверенные фрагменты кода, которые могут быть полезны.Это отличается для каждой версии офиса и каждого издания, так что удачи!
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 ", "");