2008-08-27 3 views
2

ここでは、私が作業しているMSIの展開(InstallShieldを使用)に問題があります。バックグラウンドで実行されるプログラムは、ユーザーごとに実行する必要があり、ユーザーの介入なしに自動的に起動する必要があります。MSIのSYSTEMコンテキストでのEXE起動を停止する

Group Policy Object/Active Directory(GPO/AD)の展開で問題が発生するのは、ログインしようとしているユーザーではなく誰かがログインする前にアプリケーションがSYSTEMコンテキストで起動されているためです。それはSYSTEMプロセスがUSERプロセスの開始を妨げるようです。これは、ソフトウェアをユーザーに配備する前に、PCを2回再起動する必要があることを意味します。どうやってこれをやめるの?

基本的には現在のワークフローは次のとおりです。

  1. インストール/実行をアップグレードする...これは、公開アプリケーションのために働く
  2. 新しいファイルに
  3. スタートアップバックグラウンドアプリケーションをインストールし

バックグラウンドアプリケーションを強制終了し、インタラクティブMSIインストール - 問題があると思われるアプリケーションは「割り当て済み」です。手順3はユーザーコンテキストではなくSYSTEMコンテキストで行われるため、(

私は開発チームにSYSTEMコンテキストでの起動を防ぐためにEXEファイルを修正するのが理想的ですが、リリースサイクルは離れており、

(私はInstallScriptを知らないので... VBScriptは、使用できるInstallShieldのものがない場合にはおそらく行く方法です)

答えて

5

WindowsインストーラのLogonUserプロパティを、EXEを起動するアクションの条件として使用できます。

+0

私の最新リリースでこれを追加しました。(下のコードを置き換えてください) - 魅力的な作品です!ありがとう:) – saschabeaumont

+1

あなたがこれをより詳細に行う方法を説明することができれば素晴らしいだろう。 –

1

AHA!私が知っていたクリーンなソリューションでなければなりませんでした...私が働いていたコードは次のようになり始めていた。

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 
1

私はこれを実現するには、Windowsインストーラのプロパティに依存しないでしょう。私が正しく理解していれば、ユーザーごとにEXEファイルを一度実行したいと思うでしょう - おそらくユーザーのデフォルトを設定するのでしょうか?あなたが正しいコンテキストにいることを保証できる唯一の時間は、ユーザーが実際にログインするときです。平均的な展開のシナリオでは最近、偽装の量が増えているため、実際のユーザーのログインが正しいとは信じていませんステージでEXEファイルを実行します。

あまりにも多くの問題の原因があります。仮想化はリダイレクトカスタム権限とpriviledgeロックダウン、ターミナルサーバーのロックダウンは、

...レジストリのデプロイメントシステム、オペレーティングシステムのオーバーライドによって実行偽装がなどを書き込み、

Microsoftはと呼ばれる機能を持っていますあなたがログオン時にユーザーごとに「何か実行可能」を実行できるようにするアクティブなセットアップ。これは、スクリプトから実行可能ファイルまで、何でもかまいません。 Updating every profile's registry on Windows Server 2003

関連する問題