Определите, является ли Office 32bit или 64bit через реестр

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

27 ответов


из статьи 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 или х64

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

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

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

  • 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 'GetBinaryTypeA@kernel32.dll 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\App пути\Winword.исполняемый.

вот фрагмент кода 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 файлы (x86)/...") на том же компьютере.

означает, что вам может потребоваться проверить двоичный файл самостоятельно, используя "IMAGE_NT_HEADERS.FileHeader.Машина " вход.

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


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

Если 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 Форумы


в реестре можно найти {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 10x64 и Office 2016 x86 (используя "HKLM\SOFTWARE\Microsoft\Office\ClickToRun\Configuration "и ключ "платформа")

[Code]
const
  RegOffice='SOFTWARE\Microsoft\Office\ClickToRun\Configuration';
  RegOfficeKey='Platform';

/// <summary>
/// Get current HKLM version
/// </summary>
function GetHKLM: Integer;
begin
  if IsWin64 then
    Result := HKLM64
  else
    Result := HKLM32;
end;

/// <summary>
/// Check is Microsoft Office is installed or not
/// </summary>
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;

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

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


@clatonh: это путь реестра на моем ПК: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0 \ Регистрация{90140000-002A-0000-1000-0000000FF1CE} и это определенно 32-разрядная установка на 64-разрядной ОС.


ранее я слепо следил за ответом, основанным на документах MSDN. Сегодня, это оказалось меньше, чем требуется. На компьютере с установленным Office Home и Student, который не включает Outlook,HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office.0\Outlook присутствовал, но HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office.0\Outlook не было. Теперь я изменил свой код, чтобы сначала найти "простую" версию без Wow6432Node. Если он есть, его используют. Если нет, он будет продолжаться, глядя на версию Wow6432Node. Это проверяется в установщике на основе Inno Setup-I не знаю, какие APIs 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

У меня есть win 7 64 бит + Excel 2010 32 бит. Реестр HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Registration{90140000-002A-0000-1000-0000000FF1CE}

Так что это может сказать битность ОС, а не битность Office


Я нашел безопасный и надежный способ в моем сценарии на основе InnoSetup, чтобы понять, является ли конкретное приложение 32-разрядным или 64-разрядным (в моем случае мне нужно было протестировать Excel), используя функцию Win32 API. Эта функция называется 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, напишите a .Файл 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 id были найдены через Windows SDK tool OLE-COM Object Viewer, вы можете узнать больше идентификаторов lib, используя он.

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


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

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

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


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

https://social.msdn.microsoft.com/Forums/office/en-US/43499ae0-bcb5-4527-8edb-f5a955987b56/how-to-detect-whether-installed-ms-office-2010-is-32-or-64-bit?forum=worddev

подведем итоги:

четвертое поле в productcode указывает на разрядность товар.

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

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


поиск в реестре для пути установки интересующего вас компонента office, например, для Excel 2010 посмотрите в SOFTWARE (Wow6432Node)\Microsoft\Office\14.0\Excel\InstallRoot. Это будет только либо в 32-разрядном реестре, либо в 64-разрядном реестре не оба.


раздел реестра Bitness Outlook не существует на моей машине.

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

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

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

структура IMAGE_NT_HEADERS является основным местоположением, где хранятся особенности PE-файла. Его смещение задается полем e_lfanew в IMAGE_DOS_HEADER в начале файла. На самом деле существует две версии структуры IMAGE_NT_HEADER: одна для 32-разрядных исполняемых файлов, а другая для 64-разрядных версий. Различия настолько незначительны, что я буду считать их одинаковыми для целей этого обсуждения. Единственный правильный, одобренный Microsoft способ дифференцирование между двумя форматами осуществляется через значение магического поля в 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#здесь.

магическое поле находится в начале структуры 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.Файл.глутамат натрия.15

C:\Users\me>ftype перспективы.Файл.глутамат натрия.15

Outlook.Файл.глутамат натрия.15="C:\Program Файлы ( x86)\Microsoft Office\Root\Office16\OUTLOOK.EXE " / f "%1"


лучший простой способ: поместите значок ABOUT в приложение Office 2016. Пример Excel

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

2) Вы увидите 2 форточки. Выберите Команды Из & Настроить Ленту

3) От Выберите Команду, Выберите Все Команды

4) Из полученного списка выделите About (Excel)

5) из Настройки боли ленты выделите любой элемент (например. View) где вы хотите поместить о икона

6) Нажмите кнопку Создать группу в нижней части

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

теперь, когда вы нажимаете вкладку " Вид "в excel и нажимаете "о программе", вы увидите 32-бит или 64-бит


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

мы можем проверить битность office 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

при запросе OperatingSystem таким образом, мы получаем странные результаты, посмотреть здесь. ПЦ3-мое.

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

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

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

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


открыть Outlook 2013 > файл > учетная запись Office > о Outlook > нажмите "большой"? О Outlook" кнопка > Читать всплывающее описание