Определите, является ли Office 32-разрядным или 64-разрядным, с помощью реестра

StackOverflow https://stackoverflow.com/questions/2203980

Вопрос

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

Это было полезно?

Решение

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

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

  • Путь к реестру: HKEY_LOCAL_MACHINE\Программное обеспечение\Microsoft\Office\14.0\ Outlook
  • если у вас установлен Office 2013, используйте этот Путь к реестру: HKEY_LOCAL_MACHINE\Программное обеспечение\Microsoft\Office\15.0\ Outlook
  • Раздел реестра: Горечь
  • Значение:либо x86 , либо x64

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

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

Факторы, определяющие осуществимость установки 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.

Другие советы

Я протестировал ответ Otaku, и похоже, что значение разрядности 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 Bitness, ни у {90140000-0011-0000-1000-0000000FF1CE} в реестре (для 64-разрядной версии Office без установленного Outlook).

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

Например, вы можете проверить разрядность Winword.exe, какой путь хранится в
HKEY_LOCAL_MACHINE\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe.

Вот фрагмент кода 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() lie).

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

Мы можем проверить разрядность office 365 и 2016, используя этот раздел реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration

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

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

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

Если 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

Вот что я смог использовать в 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

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

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

Источник

Этот код InnoSetup работает у меня под управлением Win 10x64 и Office 2016 x86 (используя 'HKLM \ SOFTWARE\ Microsoft\ Office\ ClickToRun\ Configuration' и ключ 'Platform').

[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\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Microsoft\Office\14.0\Регистрация{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.Если ваше приложение не обращается к реестру таким же образом, вы можете увидеть другие результаты.

Сначала я написал это для 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

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

  1. Создает экземпляр Excel
  2. Добавляет рабочую книгу к этому экземпляру Excel
  3. Добавляет модуль VBA в эту книгу
  4. Вводит небольшую функцию VBA, которая возвращает разрядность Office
  5. Вызывает эту функцию
  6. Очищает

Вот такой подход реализован в VBScript:

Function OfficeBitness()

    Dim VBACode, Excel, Wb, Module, Result

    VBACode = "Function Is64bit() As Boolean" & vbCrLf & _
              "#If Win64 Then" & vbCrLf & _
              "    Is64bit = True" & vbCrLf & _
              "#End If" & vbCrLf & _
              "End Function"

    On Error Resume Next
    Set Excel = CreateObject("Excel.Application")
    Excel.Visible = False
    Set Wb = Excel.Workbooks.Add
    Set Module = Wb.VBProject.VBComponents.Add(1)
    Module.CodeModule.AddFromString VBACode
    Result = Excel.Run("Is64bit")
    Set Module = Nothing
    Wb.Saved = True
    Wb.Close False
    Excel.Quit
    Set Excel = Nothing
    On Error GoTo 0
    If IsEmpty(Result) Then
        OfficeBitness = 0 'Alternatively raise an error here?
    ElseIf Result = True Then
        OfficeBitness = 64
    Else
        OfficeBitness = 32
    End If

End Function

PS.Этот подход работает медленнее, чем другие здесь (около 2 секунд на моем ПК), но он может оказаться более надежным при различных установках и версиях Office.

Через несколько месяцев я понял, что может существовать более простой подход, хотя все еще тот, который создает экземпляр Excel.VBScript - это:

Function OfficeBitness()
    Dim Excel
    Set Excel = CreateObject("Excel.Application")
    Excel.Visible = False
    If InStr(Excel.OperatingSystem,"64") > 0 Then
        OfficeBitness = 64
    Else
        OfficeBitness = 32
    End if
    Excel.Quit
    Set Excel = Nothing
End Function

Это зависит от того факта, что Application.OperatingSystem, при вызове из 32-разрядного Excel в 64-разрядной Windows возвращает Windows (32-bit) NT 10.00 или, по крайней мере, это происходит на моем компьютере.Но это не упоминается в Документы.

У меня есть 64-разрядная версия win 7 + 32-разрядный Excel 2010.В реестре находится HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0 egistration{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, запишите файл .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

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

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

{БРММмммм-PPPPP-LLLL-p000-D000000FF1CE} р000

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

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

Раздел реестра Outlook Bitness на моем компьютере не существует.

Один из способов определить разрядность Outlook - изучить сам файл 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 способ различения двух форматов - это значение волшебного поля в 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 >доц .msg

.сообщение =Outlook.File.msg.15

C:\Users\me >введите Outlook.File.сообщение.15

Outlook.File.Сообщение.15="C:\Program Файлы (x86)\Microsoft Office oot\Office16\OUTLOOK.EXE " /f "%1"

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

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

2) Вы увидите 2 панели.Выбирайте команды из и настраивайте ленту

3) В меню Выбрать команду выберите Все команды

4) В получившемся списке выделите About (Excel)

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

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

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

Теперь, когда вы перейдете на вкладку Вид в Excel и нажмете о программе, вы увидите 32-разрядную или 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

Редактировать :Решение без касания клавиш регистрации - im Sorry Op .

Я узнал, что есть решение на C # - оригинал можно найти здесь :https://blogs.msdn.microsoft.com/webdav_101/2016/07/26/sample-detecting-installed-outlook-and-its-bitness/

Я немного изменил его для своих нужд.

просто передайте правильный outlookPath в GetOutlookBitness()

  public enum BinaryType : uint

    {
        SCS_32BIT_BINARY = 0, // A 32-bit Windows-based application
        SCS_64BIT_BINARY = 6, // A 64-bit Windows-based application.
        SCS_DOS_BINARY = 1, // An MS-DOS – based application
        SCS_OS216_BINARY = 5, // A 16-bit OS/2-based application
        SCS_PIF_BINARY = 3, // A PIF file that executes an MS-DOS – based application
        SCS_POSIX_BINARY = 4, // A POSIX – based application
        SCS_WOW_BINARY = 2 // A 16-bit Windows-based application
    }



    [DllImport("kernel32.dll")]
    static extern bool GetBinaryType(string lpApplicationName, out BinaryType lpBinaryType);




    public int GetOutlookBitness(string FilePath)
    {
        int bitness = 0;

        if (File.Exists(FilePath))
        {
            BinaryType type;
            GetBinaryType(FilePath, out type);


            switch (type)
            {
                case BinaryType.SCS_32BIT_BINARY:
                    bitness = 32;
                    break;
                case BinaryType.SCS_64BIT_BINARY:
                    bitness = 64;
                    break;
            }
        }

        return bitness;



    }

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top