[英]Get a List of 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:\Software\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail* |
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:\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
# 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)
的(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_ROOT\Word.Application\CurVer").'(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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.