如何从 Powershell 中的内部版本号获取 Microsoft Office 的版本号

How to get the Version Number of Microsoft Office from its Build number in Powershell

我在基于 Windows 的系统上(通过 Remote Powershell)阅读了他们计算机上安装的内容。
这会创建一个报告。我在查看 Microsoft Office 软件的评估时遇到了一些困难。

从注册表中获取 Office 版本并不难:

Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' `
          | Select-Object -ExpandProperty VersionToReport  

这将输出类似 16.0.14527.20276 的内容。 也不难判断这是哪个主版本:

Nr Office Version
11.0 Office 2003
12.0 Office 2007
14.0 Office 2010
15.0 Office 2013
16.0 Office 2016+ (2019 or 2022 or MS365 version)

如您所见,16.0 版本是所有最新 Office 变体的集合。
从逻辑上讲,对于 Microsoft 来说,它对我来说毫无用处。

解决方案位于内部版本号的其余部分。这些数字指定您拥有的 Office 版本。
很明显我们使用的是 Office 365,但我想知道它们是否都是最新的。

使用内部版本号的其余部分,您可以获得更精细的版本。
您可以在此 Microsoft site 中查找它们。例如,您可以在那里找到 Build 14527.20234 的版本 2110.

因为我要监控数百台计算机,所以这需要自动化。
这样每次 Microsoft 创建新版本时,它都会自动更新。

我怎样才能得到一个 最新的数组 版本号和 版本号?

我创建了一个函数,因此您可以根据需要多次调用它。

它只会 运行 如果它需要或如果你强制它(参数 -ForceCSV-Output)。
我添加这个是为了防止脚本每次在您 - 例如 - 同时轮询 50 台计算机时启动查找。评估部分阻止了这种情况,但可以用两个提到的参数覆盖。

然后可以在其他系统上评估 CSV 输出,而无需安装或推送此功能。
为了使答案尽可能简短,我删除了尽可能多的 Write-Verbose 和注释行。

function Get-OfficeVersion {
    [CmdletBinding()]
    param([switch]$Output,[switch]$ForceCSV)

    $URL = "https://docs.microsoft.com/en-us/officeupdates/update-history-microsoft365-apps-by-date#version-history"
    $CsvFile = "\server\share\OfficeVersions.csv"
    # Evaluate whether script should run
    if ( ((gci $CsvFile).LastWriteTime.Date -eq (Get-Date).Date) -and !($ForceCSV.IsPresent)) 
     {$CsvOutput = $false} else {$CsvOutput = $true}
    if ($Output.IsPresent -or $CsvOutput -or $ForceCSV.IsPresent) {
    #End Evaluation
        $VersionsSite = (Invoke-WebRequest -Uri $URL)
        $VersionTableRawData = ($VersionsSite.AllElements | Where-Object {$_.tagname -eq 'TD'}).innertext | ? {$_ -like "Version* (Build *)"}

        $Versions = @() 
        foreach ($DataItem in $VersionTableRawData) {
                $ProcessedItem = (($DataItem -replace "\)") -split "\s\(")

                $item = New-Object PSObject
                $item | Add-Member -type NoteProperty -Name 'Version'  -Value ([string]($ProcessedItem[0].ToString().split(' ')[1] -replace ' ' -replace 'Version' -replace 'Build' -replace "\n" -join ''))
                $item | Add-Member -type NoteProperty -Name 'Build'    -Value ([string]($ProcessedItem[1].ToString().split(' ')[1] -replace ' ' -replace 'Version' -replace 'Build' -replace "\n" -join ''))
                $Versions += $item
        }

        $VersionsSorted = $Versions | sort Build -Unique | sort Version -Descending | select Build,Version
        if ($Output.IsPresent) {return $VersionsSorted}
    
        If ($CsvOutput) {$VersionsSorted | Export-csv -Path $CsvFile -Force -NoTypeInformation -Delimiter ','}
    }
}

作为奖励,我也做了这个列表的评估部分。
首先获取Office版本:

$OfficeVersionX32        = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -ErrorAction SilentlyContinue -WarningAction SilentlyContinue) | Select-Object -ExpandProperty VersionToReport
$OfficeVersionX64        = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\ClickToRun\Configuration' -ErrorAction SilentlyContinue -WarningAction SilentlyContinue)
if ( $OfficeVersionX32 -ne $null -and $OfficeVersionX64 -ne $null) {
  $OfficeVersion = "Both x32 version ($OfficeVersionX32) and x64 version ($OfficeVersionX64) installed!"
} elseif ($OfficeVersionX32 -eq $null -or $OfficeVersionX64 -eq $null) {
  $OfficeVersion = $OfficeVersionX32 + $OfficeVersionX64
}
$OfficeVersionMain = $OfficeVersion.Split(".")[0]
$OfficeVersionSub1  = $OfficeVersion.ToString().Replace("16.0.","")

然后您可以使用它来评估系统。
如前所述,对于版本号 11.0 到 15.0 来说很容易,困难从版本 16.0 开始。

$CsvFile = "\server\share\OfficeVersions.csv"
Switch  ($OfficeVersionMain) {
    11      {$MSOffice ="Office 2003 ($OfficeVersion)" }
    12      {$MSOffice ="Office 2007 ($OfficeVersion)" }
    14      {$MSOffice ="Office 2010 ($OfficeVersion)" }
    15      {$MSOffice ="Office 2013 ($OfficeVersion)" }
    16      {
                $LatestOfficeVersions = Import-Csv $CsvFile
                $MSOffice = "Office 365 (Version $(($LatestOfficeVersions | ? {$_.Build -eq $OfficeVersionSub1}).Version), $OfficeVersionSub1)"
            }
    default {$MSOffice = $OfficeVersion}
    $null   {$MSOffice = "No Office installed."}
}

并且输出 $MSOffice 您可以继续。 它应该是 "Office 365 (Version 2110, 14527.20234)".

的形式

您可以查看 https://config.office.com/officeSettings/inventory and have an overview in the Microsoft 365 Apps Admin Center. This would be the Microsoft Cloudway of seeing all your Office365 Installations and should work out of the box (no scripting or configuration needed). You can check the documentation here https://docs.microsoft.com/en-us/deployoffice/admincenter/inventory or see the techcomunity articel here https://techcommunity.microsoft.com/t5/microsoft-365-blog/inventory-on-microsoft-365-apps-admin-center-goes-ga/ba-p/2500065 . This is not the way to update all of your installations, but to see every installation and export this via csv and use it in a script to update. I hope this helps someone. Picture of Inventory