簡體   English   中英

獲取MS Office列表

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM