Как программно найти правильный номер версии продукта Microsoft Office (и пакет обновления)? - PullRequest
4 голосов
/ 16 ноября 2011

У меня проблемы с поиском согласованного номера версии для нескольких продуктов Office.

Эта публикация привела меня к этим статьям базы знаний, в которых предлагаются различные способы поиска пакетов обновления для Office 2007 и Office 2010 .

Однако версии файлов Office .exe не соответствуют диаграмме.

Использование Excel 2010, установленного на моем компьютере, в качестве примера:

  • Справка> Сведения из Excel: Microsoft Excel 2010 (14.0.6106.5005) SP1
  • Файлверсия, просмотрев свойства Excel.exe: 14.0.6106.5005
  • Исходная версия файла (из таблицы): 14.0.4756.1000
  • Версия файла SP1 (из таблицы): 14.0.6024.1000

Существует ли более надежный способ получения номеров версий и пакетов обновлений для продуктов Microsoft Office?

Ответы [ 2 ]

6 голосов
/ 29 ноября 2011

Мы решили отказаться от этого, потому что это занимало слишком много времени.Однако я решил опубликовать то, что получил, на тот случай, если кому-то понадобится пойти дальше.

Во-первых, вот три соответствующие статьи базы знаний, в которых перечислены версии пакета обновления:

Метод 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 ", "");
0 голосов
/ 16 ноября 2011

Посмотрите, можете ли вы адаптировать этот код:

Как лучше всего получить версию Excel?

Этот код использует Application.ProductCode для определения версии Office.ProductCode - это свойство, доступное в большинстве продуктов Office.Я проверил Outlook, Word, Excel и Access 2003, и все они имели его.

Вы также можете использовать этот код:

Показать информацию о системе и версии

Этот код принимает имя файла MSACCESS.exe и использует Windows API для определения версии и информации о сборке, из которой можно получить номер пакета обновления.

...