Определите, является ли 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 должна просто писать и поддерживать легкий для получения ключа реестра где-то. Все надстройка должна ссылаться на это, и в настоящее время "угадывание" - плохой подход для разработчиков, которые будут вынуждены использовать.
вам не нужно писать его. Посмотрите на эту страницу, на которую я наткнулся:
подведем итоги:
четвертое поле в 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" кнопка > Читать всплывающее описание