2008-11-23 61 views

回答

11

一些裁判

修改的问题,引用的CustomAction_NoImpersonate.js给这个脚本可以添加/设置在属性表中的任何值。

用电话 “的Cscript.exe MSI_SetProperty.js your.msi属性值”

// 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); 
} 
+0

什么是MSIUSEREALADMINDETECTION的十六进制值。或者你只是简单地设置MSIUSEREALADMINDETECTION?原因是,当我运行脚本时,我会问这个问题,它总是在else块中,并且添加一个新的属性。另外,我的安装程序似乎仍然在系统帐户下运行,而不是用户帐户 – Dhawalk 2013-08-09 21:18:06