MSI Custom Actionは管理者権限で実行します.


最近はメンテナンス前に、VS 2005が持参したインストールパッケージプロジェクトでmsiのインストールパッケージを作りました.
Custom Actionでいくつかのexeを実行するなどAdminの権限が得られず、操作が失敗したことが分かった.
オンライン検索ソリューションにより、属性の変更が必要であることが分かりましたが、これらの属性はCustom Actionを使用する必要があります.
msiの多くの属性はjsスクリプトによって追加されます.
ここではCustom Actionを追加したadmin権限を使ったシナリオを見ます.
// Usage: CustomAction_NoImpersonate.js <msi-file>
// Performs a post-build fixup of an MSI to change all
// deferred custom actions to include NoImpersonate 

// Constant values from Windows Installer
var msiOpenDatabaseModeTransact = 1; 

var msiViewModifyInsert = 1
var msiViewModifyUpdate = 2
var msiViewModifyAssign = 3
var msiViewModifyReplace = 4
var msiViewModifyDelete = 6 

var msidbCustomActionTypeInScript = 0x00000400;
var msidbCustomActionTypeNoImpersonate = 0x00000800 

if (WScript.Arguments.Length != 1)
{
  WScript.StdErr.WriteLine(WScript.ScriptName + " file");
  WScript.Quit(1);
} 

var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact); 

var sql
var view
var record 

try
{
  sql = "SELECT `Action`, `Type`, `Source`, `Target` FROM `CustomAction`"
  view = database.OpenView(sql);
  view.Execute();
  record = view.Fetch();
  while (record)
  { 

    if (record.IntegerData(2) & msidbCustomActionTypeInScript)
    {
      record.IntegerData(2) = record.IntegerData(2) | msidbCustomActionTypeNoImpersonate;
      view.Modify(msiViewModifyReplace, record);
    }
    record = view.Fetch();
  } 

  view.Close();
  database.Commit();
}
catch(e)
{
  WScript.StdErr.WriteLine(e);
  WScript.Quit(1);
} 

PS:Jsの使い方がわからないなら、参考してください.
Here are the instructions that can be used to modify an MSI built in VS 2005 to set the NoImpersote for all deferred custom actions:
  • Copy and paste the code listed below and save it to the directory that contains the Visual Studio project you are working on with the name Cusom ActionNoImpersonate.js(or download thesample script and extract the contenst to the project directory)
  • Open the project in Visual Studio 2005
  • Press F 4 to display the Propties window
  • Click on the name of your setup/deployment project in the Solution Explorer
  • Click on the PostBuildEvent item in the Properties window to cause a button labeled「…」to appar
  • Click on the"…"button to display the Post-build Event Command Line dialog
  • Add the following command line in the Post-build event command line text box:cscript.exe'$Customotion.js'(株)
  • Build your project in Visual Studio 2005 – now all deferred custom actions will have the NoImpersonate bit set for them
  • 以下はJSでmsiインストールパッケージのインストールが完了したらシステムを再起動する機能です.
    Option Explicit
    
    Const msiOpenDatabaseModeTransact = 1
    
    Dim msiPath : msiPath = Wscript.Arguments(0)
    
    Dim installer
    Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
    Dim database
    Set database = installer.OpenDatabase(msiPath, msiOpenDatabaseModeTransact)
    
    Dim query
    query = "INSERT INTO Property(Property, Value) VALUES('REBOOT', 'Force')"
    Dim view
    Set view = database.OpenView(query)
    view.Execute
    
    database.Commit
    
    インストールパッケージをインストールしても、コントロールパネルにアンインストールされていないjsスクリプトが表示されます.
    Option Explicit
    
    Const msiOpenDatabaseModeTransact = 1
    
    Dim msiPath : msiPath = Wscript.Arguments(0)
    
    Dim installer
    Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
    Dim database
    Set database = installer.OpenDatabase(msiPath, msiOpenDatabaseModeTransact)
    
    Dim query
    query = "INSERT INTO Property(Property, Value) VALUES('ARPSYSTEMCOMPONENT', '1')"
    Dim view
    Set view = database.OpenView(query)
    view.Execute
    
    database.Commit
    
    一般的なMSIパッケージのプロパティ:
    https://msdn.microsoft.com/en-us/library/windows/desktop/aa367750(v=vs.85).aspx