[英]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.