tags:

views:

1392

answers:

1

Anyone have a script (JScript, VBScript or similar) in the spirit of this handy script but adding the MSIUSEREALADMINDETECTION property

I know I could use Orca manually or with its transform feature, but would rather not go there.

+4  A: 

Some refs

Modifying the CustomAction_NoImpersonate.js referenced in the question gives this script which can add/set any value in the Properties table.

Call with "cscript.exe MSI_SetProperty.js your.msi property value"

// MSI_SetProperty.js <msi-file> <property> <value>
// Performs a post-build fixup of an msi to set the specified property (and add it if it doesn't already exist)

// Constant values from Windows Installer SDK
var msiOpenDatabaseModeTransact = 1;
var msiViewModifyInsert         = 1;
var msiViewModifyUpdate         = 2;  

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

var filespec = WScript.Arguments(0);
var property = WScript.Arguments(1);
var value = parseInt(WScript.Arguments(2));
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

WScript.StdOut.WriteLine("Looking for property:" + property);

try
{   
    var sql = "SELECT Property, Value FROM Property WHERE Property = '" + property + "'"; 
    var view = database.OpenView(sql); 
    view.Execute();  
    var record = view.Fetch(); 

    if (record)
    {  
     while (record)
     {
      WScript.StdOut.Write("Found: " + record.StringData(0) + ", " + record.StringData(1) + ", " + record.StringData(2));
      if (record.IntegerData(2) != value)
      {
       WScript.StdOut.WriteLine(" - changing to " + value);
       record.IntegerData(2) = value;
       view.Modify(msiViewModifyUpdate,record);
      }
      else
       WScript.StdOut.WriteLine(" - OK");

      record = view.Fetch();
     }
    }
    else
    {   
     WScript.StdOut.WriteLine("Not found, so adding");
     // There may be a better way to do this?
     sql = "INSERT INTO Property (Property,Value) VALUES ('" + property + "','" + value + "')";
     view = database.OpenView(sql);
     view.Execute();  
    }
    view.Close();
    database.Commit();
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}
Ryan

related questions