Определите, является ли Office 32-битным или 64-битным через реестр

Теперь это Office также поставляется с 64-битной установкой, где в реестре вы узнаете, установлена ​​ли версия Office 32-битной или 64-битной?

Из статьи TechNet о 64-разрядных версиях Office 2010 :

Если вы установили Office 2010, включая Microsoft Outlook 2010, Outlook устанавливает раздел реестра Bitness типа REG_SZ на компьютере, на котором он установлен. Раздел реестра Bitness указывает, установлена ​​ли установка Outlook 2010 32-разрядной или 64-разрядной. Это может быть полезно для администраторов, которые заинтересованы в аудите компьютеров для определения установленных версий Office 2010 в своей организации.

  • Путь к реестру: HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Office \ 14.0 \ Outlook
  • если вы установили Office 2013, используйте этот путь реестра: HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Office \ 15.0 \ Outlook
  • Ключ реестра: Bitness
  • Значение: x86 или x64

и в другом месте в той же статье:

Начиная с Office 2010, Outlook доступен как 32-разрядное приложение и 64-разрядное приложение. Версия (битность) Outlook, которую вы выбираете, зависит от выпуска операционной системы Windows (32-разрядная или 64-разрядная версия) и версии Office 2010 (32- или 64-разрядная), установленной на компьютере, если Office уже установлен на этом компьютере.

Факторы, которые определяют возможность установки 32-разрядной или 64-разрядной версии Outlook, include следующее:

  • Вы можете установить 32-разрядный Office 2010 и 32-разрядный Microsoft Outlook 2010 на поддерживаемую 32-разрядную или 64-разрядную версию операционной системы Windows. Вы можете установить 64-разрядную версию Office 2010 и 64-разрядного Outlook 2010 только на поддерживаемую 64-разрядную операционную систему.
  • По умолчанию установка Office 2010 в 64-разрядной версии операционной системы Windows – 32-разрядная версия Office 2010.
  • Битность установленной версии Outlook всегда совпадает с битностью Office 2010, если Office установлен на том же компьютере. То есть 32-разрядная версия Outlook 2010 не может быть установлена ​​на том же компьютере, на котором уже установлены 64-разрядные версии других приложений Office 2010, таких как 64-разрядный Microsoft Word 2010 или 64-разрядный Microsoft Excel 2010. Аналогично , 64-разрядная версия Outlook 2010 не может быть установлена ​​на том же компьютере, на котором уже установлены 32-разрядные версии других приложений Office.

Я протестировал ответ Отаку, и кажется, что значение битрейта Outlook установлено, даже если Outlook не установлен, хотя ссылка на статью явно не указывает на то, что это будет так.

Чтобы добавить к ответу vtrz, вот функция, которую я написал для Inno Setup:

 const { Constants for GetBinaryType return values. } SCS_32BIT_BINARY = 0; SCS_64BIT_BINARY = 6; { There are other values that GetBinaryType can return, but we're } { not interested in them. } { Declare Win32 function } function GetBinaryType(lpApplicationName: AnsiString; var lpBinaryType: Integer): Boolean; external '[email protected] stdcall'; function Is64BitExcelFromRegisteredExe(): Boolean; var excelPath: String; binaryType: Integer; begin Result := False; { Default value - assume 32-bit unless proven otherwise. } { RegQueryStringValue second param is '' to get the (default) value for the key } { with no sub-key name, as described at } { http://stackoverflow.com/questions/913938/ } if IsWin64() and RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe', '', excelPath) then begin { We've got the path to Excel. } try if GetBinaryType(excelPath, binaryType) then begin Result := (binaryType = SCS_64BIT_BINARY); end; except { Ignore - better just to assume it's 32-bit than to let the installation } { fail. This could fail because the GetBinaryType function is not } { available. I understand it's only available in Windows 2000 } { Professional onwards. } end; end; end; 

К сожалению, оба метода Otacku и @ clatonh не работают на меня – в реестре нет (Outlook) и {90140000-0011-0000- 1000 -0000000FF1CE} (для 64-разрядного Office без Outlook).

Единственный способ, который я нашел, но не через реестр, – проверить битту для одного из исполняемых файлов Office с помощью функции Windows API GetBinaryType (начиная с Windows 2000 Professional).

Например, вы можете проверить битву Winword.exe, какой путь хранится в
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Пути приложений \ Winword.exe.

Вот fragment кода MFC:

 CRegKey rk; if (ERROR_SUCCESS == rk.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Winword.exe", KEY_READ)) { CString strWinwordPath; DWORD dwSize = MAX_PATH; if (ERROR_SUCCESS == rk.QueryStringValue(strWinwordPath, strWinwordPath.GetBuffer(MAX_PATH), &dwSize)) { strWinwordPath.ReleaseBuffer(); DWORD dwBinaryType; if (::GetBinaryType(strWinwordPath, &dwBinaryType)) { if (SCS_64BIT_BINARY == dwBinaryType) { // Detected 64-bit Office } else { // Detected 32-bit Office } } else { // Failed } } else { // Failed } } else { // Failed } 

Внимание: запрос битов приложения Outlook НЕ работает надежно, если вызван в среде .NET.

Здесь мы используем GetBinaryType () в DLL, которая может быть вызвана любым приложением:

  • Если хост-приложение является 64-битным C / C ++, GetBinaryType () возвращает SCS_32BIT_BINARY.
  • Если хост-приложение является 64-битным .NET (мы протестировали «AnyCPU» в 64-битной системе), GetBinaryType () возвращает SCS_64BIT_BINARY.

Точно такой же DLL-код и точно такой же двоичный путь Outlook («c: / Program Files (x86) / …») на том же компьютере.

Это означает, что вам, возможно, придется самому протестировать двоичный файл, используя запись «IMAGE_NT_HEADERS.FileHeader.Machine».

Боже, я ненавижу неправильные возвращаемые значения некоторых Windows API (см. Также GetVersion () ложь).

Я нашел такой подход:

Если HKLM \ Software \ WOW6432Node существует, то Windows 64-бит.

Если HKLM \ Software \ WOW6432Node \ Microsoft \ Office существует, то Office 32-разрядный.

Если HKLM \ Software \ WOW6432Node \ Microsoft \ Office не существует, но HKLM \ Software \ Microsoft \ Office существует, то Office является 64-разрядным.

Если HKLM \ Software \ WOW6432Node не существует, то Windows и Office 32-разрядные.

Источник: Technet Forums

Вы можете выполнить поиск в реестре для {90140000-0011-0000-0000 -0000000FF1CE}. Если жирные цифры начинаются с 0, то x86, 1 – x64

Для меня это было в HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 14.0 \ Registration {90140000-0057-0000-0000-0000000FF1CE}

Источник

Этот код InnoSetup работает для меня под Win 10×64 и Office 2016 x86 (используя «HKLM \ SOFTWARE \ Microsoft \ Office \ ClickToRun \ Configuration» и ключ «Платформа»)

 [Code] const RegOffice='SOFTWARE\Microsoft\Office\ClickToRun\Configuration'; RegOfficeKey='Platform'; ///  /// Get current HKLM version ///  function GetHKLM: Integer; begin if IsWin64 then Result := HKLM64 else Result := HKLM32; end; ///  /// Check is Microsoft Office is installed or not ///  function IsOfficeInstalled (): Boolean; var platform: string; begin RegQueryStringValue(GetHKLM(), RegOffice, RegOfficeKey, platform); if platform = 'x86' then begin SuppressibleMsgBox('Microsoft Office found (x86 version)' , mbConfirmation, MB_YESNO or MB_DEFBUTTON1, IDYES); Result := True; end else if platform = 'x64' then begin SuppressibleMsgBox('Microsoft Office found (x64 version)', mbConfirmation, MB_YESNO or MB_DEFBUTTON1, IDYES); Result := True; end else begin SuppressibleMsgBox('Microsoft Office NOT found' + platform + '.', mbConfirmation, MB_YESNO or MB_DEFBUTTON1, IDYES); Result := False; end; end; 

У меня нет ключа, называемого битсом в любой из этих папок. У меня есть ключ, называемый «по умолчанию» в обеих этих папках, и значение «не задано». На моем компьютере появился стартер Office 2010 (предположим, 64 бит). Я удалил его и попытался выполнить полную установку 32-битного офиса. Я продолжаю получать следующее сообщение. файл несовместим, проверьте, нужна ли вам x86 или x64 версия программы.

любой совет для меня?

@clatonh: это путь к реестру на моем ПК: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 14.0 \ Registration {90140000-002A-0000-1000-0000000FF1CE}, и это определенно 32-разрядная установка на 64-битной ОПЕРАЦИОННЫЕ СИСТЕМЫ.

Ранее я слепо следовал за ответом на основе документов MSDN. Сегодня это оказалось меньше, чем необходимо. На компьютере с установленным Office Home и Student, который не включает Outlook, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Outlook присутствовал, но HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook не был. Теперь я изменил свой код, чтобы сначала найти «обычную» версию, отличную от Wow6432Node. Если это присутствует, оно будет использоваться. Если нет, это будет продолжаться, посмотрев версию Wow6432Node. Это проверяется установщиком Inno Setup – я не знаю, какие API-интерфейсы Inno Setup используют. Если ваше приложение не имеет доступа к реестру одинаково, вы можете увидеть разные результаты.

Вот что я смог использовать в VBscript для обнаружения Office 64bit Outlook:

 Dim WshShell, blnOffice64, strOutlookPath Set WshShell = WScript.CreateObject("WScript.Shell") blnOffice64=False strOutlookPath=WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\outlook.exe\Path") If WshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") = "AMD64" And _ not instr(strOutlookPath, "x86") > 0 then blnOffice64=True wscript.echo "Office 64" End If 

Сначала я написал это для Outlook. Немного изменил его для Word, но он не будет работать на автономной установке, потому что этот ключ не показывает битту, только Outlook.

Кроме того, я написал его только для поддержки текущих версий Office, => 2010

Я удалил все настройки и пост-обработку …

 :checkarch IF NOT "%PROCESSOR_ARCHITECTURE%"=="x86" SET InstallArch=64bit IF "%PROCESSOR_ARCHITEW6432%"=="AMD64" SET InstallArch=64bit IF "%InstallArch%"=="64bit" SET Wow6432Node=\Wow6432Node GOTO :beginscript :beginscript SET _cmdDetectedOfficeVersion=reg query "HKEY_CLASSES_ROOT\Word.Application\CurVer" @FOR /F "tokens=* USEBACKQ" %%F IN (`!_cmdDetectedOfficeVersion! 2^>NUL `) DO ( SET _intDetectedOfficeVersion=%%F ) set _intDetectedOfficeVersion=%_intDetectedOfficeVersion:~-2% :switchCase :: Call and mask out invalid call targets goto :case!_intDetectedOfficeVersion! 2>nul || ( :: Default case ECHO Not installed/Supported ) goto :case-install :case14 Set _strOutlookVer= Word 2010 (!_intDetectedOfficeVersion!) CALL :GetBitness !_intDetectedOfficeVersion! GOTO :case-install :case15 Set _strOutlookVer= Word 2013 (!_intDetectedOfficeVersion!) CALL :GetBitness !_intDetectedOfficeVersion! GOTO :case-install :case16 Set _strOutlookVer= Word 2016 (!_intDetectedOfficeVersion!) CALL :GetBitness !_intDetectedOfficeVersion! goto :case-install :case-install CALL :output_text !_strOutlookVer! !_strBitness! is installed GOTO :endscript :GetBitness FOR /F "tokens=3*" %%a in ('reg query "HKLM\Software%Wow6432Node%\Microsoft\Office\%1.0\Outlook" /v Bitness 2^>NUL') DO Set _strBitness=%%a GOTO :EOF 

Я выиграл 7 бит 64 бит + Excel 2010 32 бит. Реестр – HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 14.0 \ Registration {90140000-002A-0000-1000-0000000FF1CE}

Таким образом, это может указывать на битовость ОС, а не на битту Office

Я нашел безопасный и надежный способ в своем сценарии на основе InnoSetup, чтобы понять, является ли конкретное приложение 32-разрядным или 64-битным (в моем случае мне нужно было протестировать Excel) с помощью функции API Win32. Эта функция называется GetBinaryType() , она исходит из `kernel32 ‘(несмотря на имя, которое она имеет в 32 и 64-битном вкусе) и смотрит прямо на заголовок exe.

В этой статье в Википедии говорится:

В 64-разрядных версиях Windows есть две папки для файлов приложений; папка "Program Files" содержит 64-битные программы, а папка "Program Files (x86)" содержит 32-разрядные программы.

Поэтому, если программа установлена ​​в C:\Program Files это 64-разрядная версия. Если он установлен в C:\Program Files (x86) это 32-разрядная установка.

Еще один способ обнаружить битовость Office – выяснить, что такое typelib.

Например, чтобы определить битность Outlook, напишите файл .JS следующим образом:

 function detectVersion() var outlooktlib = "TypeLib\\{00062FFF-0000-0000-C000-000000000046}"; var HKCR = 0x80000000; var loc = new ActiveXObject("WbemScripting.SWbemLocator"); var svc = loc.ConnectServer(null,"root\\default"); var reg = svc.Get("StdRegProv"); var method = reg.Methods_.Item("EnumKey"); var inparam = method.InParameters.SpawnInstance_(); inparam.hDefKey = HKCR; inparam.sSubKeyName = outlooktlib; var outparam = reg.ExecMethod_(method.Name,inparam); tlibver = outparam.sNames.toArray()[0]; method = reg.Methods_.Item("GetStringValue"); inparam = method.InParameters.SpawnInstance_(); inparam.hDefKey = HKCR; inparam.sSubKeyName = outlooktlib + "\\" + tlibver + "\\0\\win32"; inparam.sValueName = ""; outparam = reg.ExecMethod_(method.Name,inparam); if(outparam.sValue) return "32 bit"; method = reg.Methods_.Item("GetStringValue"); inparam = method.InParameters.SpawnInstance_(); inparam.hDefKey = HKCR; inparam.sSubKeyName = outlooktlib + "\\" + tlibver + "\\0\\win64"; inparam.sValueName = ""; outparam = reg.ExecMethod_(method.Name,inparam); if(outparam.sValue) return "64 bit"; return "Not installed or unrecognizable"; } 

Вы можете узнать идентификатор typelib другого компонента Office и заменить первую строку функции для него. Вот краткий список интересных идентификаторов:

 {4AFFC9A0-5F99-101B-AF4E-00AA003F0F07} - Access {00020905-0000-0000-C000-000000000046} - Word {00020813-0000-0000-C000-000000000046} - Excel {91493440-5A91-11CF-8700-00AA0060263B} - Powerpoint {0002123C-0000-0000-C000-000000000046} - Publisher {0EA692EE-BB50-4E3C-AEF0-356D91732725} - OneNote 2010+ {F2A7EE29-8BF6-4A6D-83F1-098E366C709C} - OneNote 2007 

Все указанные выше идентификаторы lib были найдены с помощью инструмента OLE-COM Object Viewer Windows SDK, вы можете узнать больше lib id, используя его.

Преимущество такого подхода заключается в том, что он работает для всех версий офиса и обеспечивает контроль над каждым компонентом, который вам интересен. Кроме того, эти ключи находятся в HKEY_CLASSES_ROOT и глубоко интегрированы в систему, поэтому маловероятно, что они недоступны даже в среде песочницы.

NOTE WELL: Функция detectVersion, указанная выше , не работает . У меня 64-разрядная версия Office, а отдельная с 32. Обе версии, использующие эту функцию, возвращают «32 бит».

Проверка реестра вручную приводит к такому же выводу: 64-разрядные и 32-разрядные (32-разрядные версии Office 2010 x64 и Office 2013) 32-разрядные.

Лично я считаю, что команда Office должна просто писать и поддерживать легкоansible раздел реестра. Все надстройки должны ссылаться на это, и в настоящее время «угадывание» – это плохой подход, который разработчики должны использовать.

Вам не нужно создавать скрипты. Посмотрите на эту страницу, на которую я наткнулся:

https://social.msdn.microsoft.com/Forums/office/en-US/43499ae0-bcb5-4527-8edb-f5a955987b56/how-to-detect-whether-installed-ms-office-2010-is-32- или-64-бит? форум = worddev

Обобщить:

Четвертое поле в коде продукта указывает на болотность продукта.

{BRMMmmmm-PPPP-LLLL- p 000-D000000FF1CE} p000

0 для x86, 1 для x64 0-1 (Это также справедливо для MSOffice 2013)

Найдите в реестре путь установки интересующего офисного компонента, например, для Excel 2010 смотрите в ПРОГРАММНОМ ОБЕСПЕЧЕНИИ (Wow6432Node) \ Microsoft \ Office \ 14.0 \ Excel \ InstallRoot. Он будет либо в 32-битном реестре, либо в 64-битном реестре не для обоих.

На моем компьютере не существует ключа реестра Microsoft Outlook.

Один из способов определить Outlook Bitness – это изучить Outlook.exe и определить, является ли он 32-битным или 64-битным.

В частности, вы можете проверить тип [IMAGE_FILE_HEADER.Machine] [1], и это вернет значение, указывающее тип процессора.

Для отличной предыстории этого обсуждения, прочитав PE-заголовок файла, прочитайте это (устаревшая ссылка) , в котором говорится;

Структура IMAGE_NT_HEADERS является основным местом, где хранятся особенности PE-файла. Его смещение задается полем e_lfanew в IMAGE_DOS_HEADER в начале файла. На самом деле существуют две версии структуры IMAGE_NT_HEADER, одна для 32-разрядных исполняемых файлов, а другая для 64-разрядных версий. Различия настолько незначительны, что я буду считать их одинаковыми для целей этого обсуждения. Единственным правильным, одобренным Microsoft способом разграничения между двумя форматами является значение поля Magic в IMAGE_OPTIONAL_HEADER (описано в скором времени).

IMAGE_NT_HEADER состоит из трех полей:

typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

и здесь вы можете получить код c #.

Поле Magic находится в начале структуры IMAGE_OPTIONAL_HEADER, 2 байта со смещением 24 с начала _IMAGE_NT_HEADERS. Он имеет значения 0x10B для 32-битных и 0x20B для 64-разрядных.

Не через реестр, а через инструменты командной строки:

https://stackoverflow.com/a/6194710/2885897

C: \ Users \ me> assoc .msg

.msg = Outlook.File.msg.15

C: \ Users \ me> ftype Outlook.File.msg.15

Outlook.File.msg.15 = “C: \ Program Files ( x86 ) \ Microsoft Office \ Root \ Office16 \ OUTLOOK.EXE” / f “% 1”

Самый простой способ: поместите значок «О программе» в приложение Office 2016. Пример Excel

1) Открыть Excel -> Файл -> Параметры -> Настроить ленту

2) Вы увидите 2 панели. Выберите «Команды» и «Настроить ленту»

3) Из команды «Выбрать» выберите «Все команды»

4) Из полученного списка Highlight About (Excel)

5) Из меню «Настроить боль в ленте» выделите любой элемент (например, «Просмотр»), где вы хотите поместить значок «О программе»

6) Нажмите «Новая группа» внизу

7) Нажмите кнопку добавления, расположенную между двумя панелями. СДЕЛАННЫЙ

Теперь, когда вы нажимаете вкладку «Вид» в Excel и нажимаете, вы увидите 32-битный или 64-битный

Я нашел способ проверить офисную долото.

Мы можем проверить содержимое билета по адресу 365 и 2016 с помощью этого раздела реестра:

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration 

Платформа x86 для 32 бит.

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration 

Платформа x64 для 64 бит.

Пожалуйста, проверьте…

Я нашел намного более простой способ. Используя Powershell, мы можем подключить Excel как COM-объект.

 $user = $env:UserName $msoExcel = New-Object -ComObject Excel.Application $msoExcel | Select-Object -Property OperatingSystem | Out-File "\\SERVER\Path\To\Dump\msoVersion-$user.txt" exit 

Когда вы запрашиваете операционную систему таким образом, мы получаем странные результаты, посмотрите здесь. PC3 мой.

Надеюсь, это сработает для вас, ребята. Извините за недостаток кода; мои скрипты в основном функциональны.

Изменить . Не забудьте добавить код, чтобы закрыть Excel после того, как вы закончите извлечение данных.
После тестирования этого кода вчера у меня появилось множество открытий Excel и внезапное сбой.
Это позволит вам поддерживать пользователей и администраторов счастливыми (:

 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($msoExcel) Remove-Variable msoExcel 

Если вы хотите знать только, какой номер бит установлен установленной версии Office 2010, то в любом приложении Office 2010 просто нажмите «Файл», затем в справке. Информация о номере версии будет указана, а рядом с ней в скобках будет либо (32-разрядная), либо (64-разрядная).

Откройте Outlook 2013> Файл> Учетная запись Office> Об Outlook> нажмите кнопку «Большой» «О приложении Outlook»> прочитайте всплывающее описание

  • Ошибка открытия ключа реестра Java
  • Почему другие пути к папкам также добавляются в систему PATH с помощью SetX, а не только для указанного пути к папке?
  • Давайте будем гением компьютера.