文章目錄
- debug - 安裝.msi時,為所有用戶安裝程序
- 概述
- 筆記
- 試試在目標.msi后面直接加參數的測試
- 備注
- 備注
- END
debug - 安裝.msi時,為所有用戶安裝程序
概述
為了測試,裝了一個test.msi.
安裝時,只有安裝路徑的選擇,沒有是否為所有用戶安裝的選項。
本地有2個用戶,一個是正式的win10微軟賬號usr_a,一個是本地開發賬號usr_b。
usr_a的權限最高,是本機的第一個管理員賬號。usr_b的權限稍微低一些,也是管理員。
如果直接安裝test.msi, usr_a可以正常用安裝好的test程序。
但是切到usr_b后,無法使用usr_a安裝好的test程序。
嘗試查看test.msi的命令行幫助,看到有選項可以為所有用戶安裝。
不過必須在cmd下安裝(或者寫在.bat中),才能輸入命令行參數。
安裝.msi時,加了"為所有用戶"安裝的選項。安裝完成后,切到usr_b, 確實可以用test程序了。
筆記
go1.24.1.windows-amd64.msi --help
Windows ? Installer. V 5.0.19041.4651msiexec /Option <Required Parameter> [Optional Parameter]安裝選項</package | /i> <Product.msi>安裝或配置產品/a <Product.msi>管理安裝 - 在網絡上安裝產品/j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>]公布產品 - m 公布到所有用戶,u 公布到當前用戶</uninstall | /x> <Product.msi | ProductCode>卸載產品
顯示選項/quiet安靜模式,無用戶交互/passive無人參與模式 - 只顯示進度欄/q[n|b|r|f]設置用戶界面級別n - 無用戶界面b - 基本界面r - 精簡界面f - 完整界面(默認值)/help幫助信息
重新啟動選項/norestart安裝完成后不重新啟動/promptrestart必要時提示用戶重新啟動/forcerestart安裝后始終重新啟動計算機
日志選項/l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <LogFile>i - 狀態消息w - 非致命警告e - 所有錯誤消息a - 操作的啟動r - 操作特定記錄u - 用戶請求c - 初始用戶界面參數m - 內存不足或致命退出信息o - 磁盤空間不足消息p - 終端屬性v - 詳細輸出x - 額外調試信息+ - 擴展到現有日志文件! - 每一行刷新到日志* - 記錄所有信息,除了 v 和 x 選項/log <LogFile>與 /l* <LogFile> 相同
更新選項/update <Update1.msp>[;Update2.msp]應用更新/uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode>刪除產品的更新
修復選項/f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode>修復產品p - 僅當文件丟失時o - 如果文件丟失或安裝了更舊的版本(默認值)e - 如果文件丟失或安裝了相同或更舊的版本d - 如果文件丟失或安裝了不同版本c - 如果文件丟失或較驗和與計算的值不匹配a - 強制重新安裝所有文件u - 所有必要的用戶特定注冊表項(默認值)m - 所有必要的計算機特定注冊表項(默認值)s - 所有現有的快捷鍵方式(默認值)v - 從源運行并重新緩存本地安裝包
設置公共屬性[PROPERTY=PropertyValue]請查閱 Windows (R) Installer SDK 獲得有關
命令行語法的其他文檔。版權所有 (C) Microsoft Corporation. 保留所有權利。
此軟件的部分內容系基于 Independent JPEG Group 的工作。
看不大清楚,好像是msiexec + /jm
參數為為所有用戶安裝。
不過我開始理解錯了,沒有用msiexec帶命令行安裝go1.24.1.windows-amd64.msi ,輸入成了go1.24.1.windows-amd64.msi /m
不過安裝完,所有用戶中都可以正常使用安裝完的go命令行。
因為我用的/m
參數并不是msiexec的標準參數,但是又有效果,我就想看一下,給msiexec加/m參數會咋樣?
msiexec /i "go1.24.1.windows-amd64.msi" /m /log "my_log_2025_0321_1650.txt"
不報錯。不知道msiexec是否將/m參數丟棄了。
看日志
Property(S): dirD847BCAADF455EBFA9F73B7D803AC0EF = C:\Program Files\Go\test\wasmmemsize.dir\
Property(S): WixUIRMOption = UseRM
Property(S): WIXUI_INSTALLDIR = INSTALLDIR
Property(S): ALLUSERS = 1 // !!!
Property(S): ARPNOMODIFY = 1
Property(S): ARPINSTALLLOCATION = C:\Program Files\Go\
Property(S): ProgramFiles64Folder = C:\Program Files\
Property(S): TARGETDIR = E:\
Property(S): ProgramMenuFolder = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
Property(S): EnvironmentEntries = E:\
Property(S): SourceDir = D:\tools\go\
可以看到 ALLUSERS 的值為1,說明 /m
可能是將ALLUSERS置為1了。
查看msiexec用的是哪一個?
D:\tools\go>where msiexec
C:\Windows\System32\msiexec.exe
我現在用的是第2個用戶(me),用IDA64看一下, 是否msiexec.exe真有/m
參數。
看到處理 /m 這個參數了,并沒有報錯,還是繼續處理后面的參數。
初步看起來,確實處理這個參數了。
不過匯編看起來不好看啊。
要不用反證法,給一個不存在的參數,看是否報錯就行了。
如果能實驗出能報錯的無效參數,那么就可以反證 /m
參數是有效的。
將 /m
改為/d
, 這是一個不在命令行參數說明中的參數,此時,會彈出msiexec的參數說明界面。這說明/d
參數是無效的。
程序處理參數的方式一般是一致的,既然/m
從單步調試看,是被正常處理的;且不會彈出幫助界面。那么說明/m
是有效的參數。
試試在目標.msi后面直接加參數的測試
go1.24.1.windows-amd64.msi /d
這說明直接在目標msi后面加上參數的效果和在 msiexec后面加的參數是一致的,也說明 /d
這種無效參數,是會彈出msi幫助界面的。
看看目標msi加上/m
參數的效果。
目標msi加/m
參數,是可以正常運行msi的。
這說明,/m
參數雖然沒有在msi的標準命令行參數說明中,但是也是一個隱藏正常可用的參數。且根據前面實驗的結果(日志中 Property(S): ALLUSERS = 1 // !!!
),/m
參數的作用,就是為所有用戶安裝程序。
備注
誤打誤撞實驗出來的參數 /m
可以為所有用戶安裝msi程序。
如果要按照msiexec的標準參數來為所有用戶安裝,請使用標準的參數
但是我用 /jm
參數會彈出幫助界面啊,并不會安裝。
莫非我看錯了?
是不是msiexec的命令行參數寫錯了?
那么用 -m
參數試試,帶上日志,看看是否為所有用戶安裝
go1.24.1.windows-amd64.msi -m /log my_log_go1.24.1.windows-amd64.txt
正常安裝完。
查看my_log_go1.24.1.windows-amd64.txt,看看是否有為所有用戶安裝的選項。
// 寫了3個環境變量
WriteEnvironmentStrings: Name: PATH, Value: C:\Program Files\Go\bin, Action 1610612737
WriteEnvironmentStrings: Name: GOPATH, Value: %USERPROFILE%\go, Action 2
WriteEnvironmentStrings: Name: PATH, Value: %USERPROFILE%\go\bin, Action 1073741825
// ...
Property(S): WixUIRMOption = UseRM
Property(S): WIXUI_INSTALLDIR = INSTALLDIR
Property(S): ALLUSERS = 1 // !!! 確實是為所有用戶安裝了程序
Property(S): ARPNOMODIFY = 1
Property(S): ARPINSTALLLOCATION = C:\Program Files\Go\
Property(S): ProgramFiles64Folder = C:\Program Files\
Property(S): TARGETDIR = E:\
Property(S): ProgramMenuFolder = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
Property(S): EnvironmentEntries = E:\
Property(S): SourceDir = D:\tools\go\
// ...
Property(S): LogonUser = me // !!! 我是在第2個用戶上裝的msi
// ...
Property(S): AdminUser = 1 // !!! 第2個用戶也是管理員身份
備注
可能是msiexec的命令行幫助寫錯了。
也有可能是我理解錯了。
反正要安裝a.msi, 只要加上參數/m
或者-m
就可以為所有用戶安裝a.msi程序。