MSI が SYSTEM コンテキストで EXE を起動しないようにする
-
09-06-2019 - |
質問
私が取り組んでいる MSI デプロイメントで問題が発生しました (使用 インストールシールド)。ユーザーごとに実行する必要があるプログラムをバックグラウンドで実行しており、ユーザーの介入なしに自動的に開始する必要があります。
問題は グループポリシーオブジェクト/アクティブディレクトリ (GPO/AD) 展開では、アプリケーションは、ログインしようとしているユーザーとしてではなく、誰かがログインする前に SYSTEM コンテキストで開始されます。アプリケーションはユーザーごとに 1 回しか実行できず、SYSTEM プロセスが USER プロセスの起動を妨げているようです。これは、ソフトウェアをユーザーに展開する前に、PC を 2 回再起動する必要があることを意味します。これを止めるにはどうすればよいでしょうか?
基本的に現在のワークフローは次のとおりです。
- インストール/アップグレードが実行されます...バックグラウンドアプリケーションを強制終了する
- 新しいファイルをインストールする
- バックグラウンドアプリケーションの起動
これは公開アプリケーションとインタラクティブなアプリケーションで機能します。 MSI インストール - 問題があると思われるのは、「割り当てられた」アプリケーションのみです。ステップ 3 はユーザー コンテキストではなく SYSTEM コンテキストで発生します:(
理想的には、開発チームに EXE ファイルにパッチを当てて SYSTEM コンテキストで起動しないようにしてもらいたいのですが、それはリリース サイクルの先なので、当面はインストーラー ベースのソリューションを探しています。
(Installscriptは分かりません...だから私は推測します VBスクリプト 使用できるネイティブの InstallShield 機能がない場合は、おそらくこれが最善の方法です)。
解決
使用できます ログオンユーザー Windows インストーラーのプロパティを、EXE を起動するアクションの条件として使用します。
他のヒント
これを実現するために Windows インストーラー プロパティに依存するつもりはありません。私の理解が正しければ、EXE ファイルをユーザーごとに 1 回実行したいのですが、おそらくユーザーのデフォルトを設定するためでしょうか?正しいコンテキストにいることを保証できるのは、ユーザーが実際にログインするときだけです。最近、平均的な展開シナリオで偽装が大量に行われているため、EXE ファイルを実行するための正しい段階としては、実際のユーザーのログイン以外は何も信頼できません。
問題の原因が多すぎます。カスタム権限と特権のロックダウン、ターミナル サーバーのロックダウン、仮想化リダイレクト、展開システムによる偽装実行、レジストリ書き込みのためのオペレーティング システムのオーバーライドなど...
Microsoft には、ログオン時にユーザーごとに 1 回、「実行可能なもの」を実行できるようにするアクティブ セットアップと呼ばれる機能があります。これは、スクリプトから実行可能ファイルまで何でも構いません。詳細については、ここでの私の回答を参照してください。 Windows Server 2003 でのすべてのプロファイルのレジストリの更新
ああ!もっとクリーンな解決策が必要であることはわかっていました...私が取り組んでいたコードは次のようになり始めていました。
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'BackgroundProcess.exe'")
For Each objProcess in colProcessList
colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
If strNameOfUser = "SYSTEM" Then
objProcess.Terminate()
End If
Next