获取 MS Office 列表



好的,我正在尝试从所有Office版本以及每个版本的数量中获取列表。我们正在迁移到Windows 10,我正试图说服他将Office升级到2016。我们的Office可以追溯到2010年。我需要每个版本有多少的列表。即使我可以得到什么计算机具有什么版本的列表。我尽量不单独对每台计算机进行审核,我们有 200 台计算机。

我尝试了几种不同的方法。

Get-ADComputer -Filter * -Property * | Select-Object Name |
Export-CSV ADcomputerslist.csv -NoTypeInformation -Encoding UTF8

这实际上不会保存到文件中

foreach ($computer in (Get-Content "c:computers.txt")){
Write-Verbose "Working on $computer..." -Verbose
Invoke-Command -ComputerName "$Computer" -ScriptBlock {
Get-ItemProperty HKLM:SoftwareMicrosoftWindowsCurrentVersionUninstallO365ProPlusRetail* |
Select-Object DisplayName, DisplayVersion, Publisher
} | export-csv C:results.csv -Append -NoTypeInformation
}

通常认为使用Get-WmiObject检查Win32_Product类是不安全的,因为这可能会无意中触发软件上的修复安装。检查注册表中是否有已安装的程序更安全:

# We need to check for both 64-bit and 32-bit software
$regPaths = "HKLM:SOFTWAREWow6432nodeMicrosoftWindowsCurrentVersionUninstall",
"HKLM:SOFTWAREMicrosoftWindowsCurrentVersionUninstall"
# Get the name of all installed software registered in the registry with Office in the name
# (you can search for exact strings if you know them for specific versions)
$regPaths | Foreach-Object {
( Get-ItemProperty "${_}*" DisplayName -EA SilentlyContinue ).DisplayName | Where-Object {
$_ -match 'office'
}
}

其工作方式是,对于两个注册表路径,我们希望从$regPaths获取基本路径下每个键的DisplayName值(这些大多是 GUID 命名的键,仅按名称标识软件的价值不大(。我们忽略错误,因为它们会使输出混乱,对于此操作,预计某些键可能没有DisplayName属性。我们不在乎这些。

一旦我们为所有子项枚举了DisplayName,我们想要过滤掉名称中没有"Office"的子项。请注意,-match运算符不区分大小写,因此大小写在这里无关紧要。因此,Where-Object子句只返回其中DisplayName找到字符串office如果您知道您支持的每个 Office 版本的确切 DisplayName 字符串,则可以调整此正则表达式,因为这本质上会返回名称中带有Office的任何内容。

作为替代方法,您可以读取其中一个 Office 应用程序(如 Word(的(default)注册表值并翻译版本号:

foreach ($computer in (Get-Content "c:computers.txt")){
Write-Verbose "Working on computer '$computer'..." -Verbose
Invoke-Command -ComputerName $computer -ScriptBlock {
(Get-ItemProperty -Path "Registry::HKEY_CLASSES_ROOTWord.ApplicationCurVer").'(default)' | ForEach-Object {
[PsCustomObject] @{
'Computer' = $computer
'OfficeVersion' = 
switch ([int]($_ -split '.')[-1]) {
16 {'MS Office 2016 OR MS Office 2019 or MS Office 365'; break}
15 {'MS Office 2013'; break}
14 {'MS Office 2010'; break}
12 {'MS Office 2007'; break}
11 {'MS Office 2003'}
}
}
}
} 
}

输出(类似(:

Computer OfficeVersion 
-------- ------------- 
PC_01    MS Office 2013
PC_02    MS Office 2010

不幸的是,Office 2019 和 Office 2016 不再通过此注册表值中的不同版本号进行区分。

我会这样做:-

首先启动 WinRM 服务

Get-Service -Name WinRM  -ComputerName machinename | Start-service

然后,一旦有了它,我们就可以查询 WinRM 以获取所有已安装的应用程序。

Get-CimInstance -ComputerName machinename -ClassName win32_product | Select-Object PSComputerName, Name, PackageName, InstallDate 

然后它的好做法在完成后禁用 WinRM

Get-Service -Name WinRM  -ComputerName df-ps-sitpc17 | Stop-service

最新更新