Azure
如何使用 Azure 自動化 DSC 在客戶端工作站上安裝 SSMS?
太好了,我現在只需要知道 SSMS-Setup-ENU.exe 的產品 ID,對嗎?
但是,在地球上,我應該怎麼做呢?當我將它安裝在另一台機器上並嘗試https://blogs.msdn.microsoft.com/brian_farnhill/2017/07/04/getting-ids-to-use-with-the-package-dsc-resource中描述的方法時/我有兩個產品 ID:
PS C:\> $x86Path = "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" PS C:\> $installedItemsX86 = Get-ItemProperty -Path $x86Path | Select-Object -Property DisplayName, PSChildName PS C:\> $x64Path = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" PS C:\> $installedItemsX64 = Get-ItemProperty -Path $x64Path | Select-Object -Property DisplayName, PSChildName PS C:\> $installedItems = $installedItemsX86 + $installedItemsX64 PS C:\> $installedItems | Where-Object -FilterScript { $null -ne $_.DisplayName } | Sort-Object -Property DisplayName | sls 'Management Studio' @{DisplayName=Microsoft SQL Server Management Studio - 17.4; PSChildName={ac84c935-8f13-4f73-b541-7b09a11bdea8}} @{DisplayName=SQL Server 2017 Management Studio Extensions; PSChildName={6492E746-1C5D-48C2-A92A-97D431F74664}} @{DisplayName=SQL Server 2017 Management Studio Extensions; PSChildName={70C24F35-7E36-45FC-B289-3D2849E5556B}} @{DisplayName=SQL Server Management Studio; PSChildName={F8ADD24D-F2F2-465C-A675-F12FDB70DB82}} @{DisplayName=SQL Server Management Studio; PSChildName={1B8CFC46-1F08-4DA7-9FEA-E1F523FBD67F}} @{DisplayName=SQL Server Management Studio for Analysis Services; PSChildName={CC6997A7-1638-4E38-B6CF-E776997036B0}} @{DisplayName=SQL Server Management Studio for Reporting Services; PSChildName={4DDEB555-26D2-4E68-98AF-8F96232C13F2}}
我實際上嘗試了一種不同的方法,它產生了相同的結果(可能是因為兩者都“坐在”相同的數據上):
PS C:\> get-wmiobject Win32_Product -Filter "Name like '%sql%management%studio%'" | sort -Property Name | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize IdentifyingNumber Name LocalPackage ----------------- ---- ------------ {6492E746-1C5D-48C2-A92A-97D431F74664} SQL Server 2017 Management Studio Extensions C:\Windows\Installer\43f1a.msi {70C24F35-7E36-45FC-B289-3D2849E5556B} SQL Server 2017 Management Studio Extensions C:\Windows\Installer\43f16.msi {F8ADD24D-F2F2-465C-A675-F12FDB70DB82} SQL Server Management Studio C:\Windows\Installer\43f23.msi {1B8CFC46-1F08-4DA7-9FEA-E1F523FBD67F} SQL Server Management Studio C:\Windows\Installer\43f27.msi {CC6997A7-1638-4E38-B6CF-E776997036B0} SQL Server Management Studio for Analysis Services C:\Windows\Installer\43f43.msi {4DDEB555-26D2-4E68-98AF-8F96232C13F2} SQL Server Management Studio for Reporting Services C:\Windows\Installer\43f3c.msi
兩種方法都會產生兩個產品 ID:
- F8ADD24D-F2F2-465C-A675-F12FDB70DB82
- 1B8CFC46-1F08-4DA7-9FEA-E1F523FBD67F
那麼,哪一個是正確的呢?是否有更確定的方法來應對推斷正確產品 ID 的瘋狂?
我想我終於弄清楚發生了什麼,儘管我還沒有檢查這是否會幫助我使用 Azure 自動化 DSC 安裝 SSMS。
這是我所做的:
- 將 SSMS-Setup-ENU.exe 重命名為 SSMS-Setup-ENU.zip
- 往裡看了一眼。唯一的文本文件名為“0”,這是一個 XML 文件。
- 第一個元素是
<BurnManifest xmlns="http://schemas.microsoft.com/wix/2008/Burn">
我得出的結論,即 exe 是用 WIX burn 創建的。- 將文件重命名回來。
- 找到https://stackoverflow.com/questions/26749207/extract-contents-of-burn-bootstrapper
- 從https://github.com/wixtoolset/wix3/releases/tag/wix3111rtm下載並提取 wix311-binaries.zip
- Ran
dark.exe -x d:\temp SSMS-Setup-ENU.exe
,它從 SSMS-Setup-ENU.exe 中提取了很多 msi 文件到d:\temp
.- 找到https://stackoverflow.com/questions/31919064/powershell-get-the-msi-product-code-out-of-a-msi-file-without-installing
- 從答案中保存了 PowerShell 腳本並對其進行了一些修改以簡化管道(腳本程式碼如下)。
- 通過腳本傳輸所有 msis,並使用有問題的產品程式碼辨識兩個 msis。
PowerShell 腳本是:
param( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] [ValidateScript({ ($_ -match "\.msi$") -and (Test-Path $_ -PathType Leaf)})] $path) process { $comObjWI = New-Object -ComObject WindowsInstaller.Installer $MSIDatabase = $comObjWI.GetType().InvokeMember("OpenDatabase","InvokeMethod",$Null,$comObjWI,@("$Path",0)) $props = @{ Path = "$path" } @('ProductCode', 'ProductName') |% { $Query = "SELECT Value FROM Property WHERE Property = '$_'" $View = $MSIDatabase.GetType().InvokeMember("OpenView","InvokeMethod",$null,$MSIDatabase,($Query)) $View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null) $Record = $View.GetType().InvokeMember("Fetch","InvokeMethod",$null,$View,$null) $props[$_] = $Record.GetType().InvokeMember("StringData","GetProperty",$null,$Record,1) } New-Object psobject -Property $props }
最後的命令行是:
PS C:\> $g1 = "1B8CFC46-1F08-4DA7-9FEA-E1F523FBD67F" PS C:\> $g2 = "F8ADD24D-F2F2-465C-A675-F12FDB70DB82" PS C:\> dir D:\temp\AttachedContainer\x64\*.msi | .\GetProductCodeFromMSI.ps1 | sls "($g1|$g2)" @{Path=d:\temp\AttachedContainer\x64\sql_ssms.msi; ProductName=SQL Server Management Studio; ProductCode={F8ADD24D-F2F2-465C-A675-F12FDB70DB82}} @{Path=d:\temp\AttachedContainer\x64\sql_ssms_loc.msi; ProductName=SQL Server Management Studio; ProductCode={1B8CFC46-1F08-4DA7-9FEA-E1F523FBD67F}} PS C:\>
因此,兩個產品程式碼都在同一個 SSMS 安裝中,並且對應於 sql_ssms.msi 和 sql_ssms_loc.msi。兩者都具有相同的產品名稱 - SQL Server Management Studio。
現在,我不知道什麼是sql_ssms_loc.msi,但我會嘗試使用F8ADD24D-F2F2-465C-A675-F12FDB70DB82,因為它對應於sql_ssms.msi。將返回結果。
編輯 1
使用 F8ADD24D-F2F2-465C-A675-F12FDB70DB82 似乎有效。