treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

別ユーザでmsiインストールしたとき、ショートカットが生成されない

該当ユーザは少ないと思うのですが、権限代行などでログイン中のユーザとは別のユーザからmsiファイルでインストールを実行した場合、インストール時に自動的に生成されるショートカットが生成されなかったため、その対処を記録しておきます。

状況

あるプリンタ用のアプリケーションを複数台にインストールするために展開準備をしていたのですが、スクリプト経由で権限代行を使用すると、インストール完了後に自動生成されるはずのショートカット作成やスタートメニューへの登録が正常に完了しない現象に遭遇しました。

具体的には、

このスタートメニューへの登録と、デスクトップ上へのショートカット生成が実施されないという動きをしています。

以下の手順では正常に動作します。

管理者権限のあるユーザアカウントでサインインしたWindows環境で、インストール.msiをダブルクリックで実行してウィザードからインストールを完了させる

権限代行せずに管理者権限のあるユーザアカウントのコマンドプロンプト(あるいは管理者として実行のcmd.exe)で"インストール.msi /passive"を実行する。

正常動作する手順もあるのでインストーラや環境上の問題はなさそうですが、サードパーティ製の権限代行機能を使用して"インストール.msi /passive"を実行した場合だけ、前述のショートカットが生成されなくて、スタートメニューへの登録も実行されない、という動きをします。

結論

Teamsのインストールなどで同じような話題が挙げられています。

■参考:Windows インストーラー (MSI) を使用してクラシック Teams を一括インストールする
https://learn.microsoft.com/ja-jp/microsoftteams/msi-deployment

msiexec.exeオプションである"ALLUSERS=1"指定が必要という結論でした。

前述のTeamsやzoomなどでも使われるユーザ個別にインストールする動きを見せるインストール.msiでは、ユーザ個別にインストールされるため1台のPCでもユーザ数分だけのインストール作業が必要になってしまいます。

例えば、ユーザ権限でインストールできるzoomの.msiとかTeamsのインストーラ(Teams_windows_x64.msi)は、実行するユーザだけにインストールされ、同じPCを使う別ユーザの環境で起動することができない形でのインストールとなります。
同じ1台のPCでも二人目のユーザが使用するためには、その(二人目の)ユーザでインストールという手作業が必要になります。

今回の対象アプリもそのような動きをしているようでした。

そこで、以下のようにオプションを付加することで、PCのユーザ全体へのインストールを明示することができます。これで望むような動きを見せてくれました。

Installer.msi /passive ALLUSERS=1

この"ALLUSERS=1"指定を追加することで、ユーザ単位のインストールからPC環境に対してのインストールをmsiが実行するようになるため、1台に何ユーザいても1回のmsi実行(インストール)で作業を完了できました。

ここに至るまでに調べたこと

インストール.msiのトラブルシューティングに使える知識だと思いましたので、調べたことを記述しておきます。

具体的にはインストール.msiの詳細ログ出力オプション"/l*v"を使いました。

上手くいかないInstaller.msiに次のようにオプションを付加して実行してみます。

Installer.msi /passive /l*v C:\TEMP\InstMsi.log"

そして、上手くいく/passiveなしでもログを出力してみて、

Installer.msi /l*v C:\TEMP\InstMsi2.log"

サードパーティ製の権限代行を使ってMSI実行した両方のログに加えて、手動でコマンドプロンプトから実行したケースでもログを出力し(ファイル名:コマンドプロンプト-UAC実行.txt)

この三つのログを見比べてみることにしました。

ログを比較

実際にMSIインストールの実行時に生成されたログを確認してみたところ、実際に参照されているパスがそれぞれで相違することが分かりました。
サードパーティ製の権限代行はシステムアカウントでインストール処理が実行されるようになっています。

--------------------------------------------------------------
権限代行の/passiveあり
--------------------------------------------------------------
Property(S): ProgramMenuFolder = C:\Windows\system32\config\systemprofile\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\
Property(S): DesktopFolder = C:\Windows\system32\config\systemprofile\Desktop\
(中略)
Property(S): TemplateFolder = C:\Windows\system32\config\systemprofile\AppData\Roaming\Microsoft\Windows\Templates\
Property(S): AdminToolsFolder = C:\Windows\system32\config\systemprofile\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools\
Property(S): StartupFolder = C:\Windows\system32\config\systemprofile\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
Property(S): StartMenuFolder = C:\Windows\system32\config\systemprofile\AppData\Roaming\Microsoft\Windows\Start Menu\
--------------------------------------------------------------
権限代行の/passiveなし
--------------------------------------------------------------
Property(S): ProgramMenuFolder = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
Property(S): DesktopFolder = C:\Users\Public\Desktop\
(中略)
Property(S): TemplateFolder = C:\ProgramData\Microsoft\Windows\Templates\
Property(S): AdminToolsFolder = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools\
Property(S): StartupFolder = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\
Property(S): StartMenuFolder = C:\ProgramData\Microsoft\Windows\Start Menu\
--------------------------------------------------------------

比べてみると、Administratorなどのように管理者権限のあるアカウントで実行した場合のデスクトップフォルダへのパスは
"C:\Users\Public\Desktop\"
を指しているのにたいし、権限代行を使ったパスは
"C:\Windows\system32\config\systemprofile\Desktop\"
と、ちょっと見たことないパスを示しているのがわかります。

恐らくスタートメニューへの登録というのも、
"C:\ProgramData\Microsoft\Windows\Start Menu\"
が通常のパスなのですが、
"C:\Windows\system32\config\systemprofile\AppData\Roaming\Microsoft\Windows\Start Menu\"
を参照してしまっていることがログから見て取れました。

ユーザ権限でUAC画面でAdministratorのパスワードを入力してインストールを実行したら、ログの記録内容は更に変化して、
(※インストール.msiは"\\FileSvr\\ShareF\Inst\"に保存されたものをダブルクリックで実行)

--------------------------------------------------------------
msiファイル直接実行(ユーザ権限&UAC実行)
--------------------------------------------------------------
Property(S): _DAA6C829EF454FBC8233447892803AEF = C:\Users\testuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\FUJIFILM GP Controller\
Property(S): ProgramMenuFolder = C:\Users\testuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\
Property(S): DesktopFolder = C:\Users\testuser\Desktop\
Property(S): SourceDir = \\FileSvr\\ShareF\Inst\
-------------------------------
Property(S): TempFolder = C:\Users\testuser\AppData\Local\Temp\
-------------------------------
Property(S): AdminToolsFolder = C:\Users\testuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools\
Property(S): StartupFolder = C:\Users\testuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\
Property(S): StartMenuFolder = C:\Users\testuser\AppData\Roaming\Microsoft\Windows\Start Menu\
--------------------------------------------------------------

デスクトップは"C:\Users\testuser\Desktop\"とユーザプロファイル内のデスクトップを参照していて、
スタートメニューのパスも"C:\Users\testuser\AppData\Roaming\Microsoft\Windows\Start Menu\"となっています。

実行するユーザによってこんなに違うんですね。