2008-11-23 4 views
8

किसी this handy script की भावना में एक स्क्रिप्ट (JScript, VBScript या समान) है, लेकिन MSIUSEREALADMINDETECTION संपत्तिस्क्रिप्ट एमएसआई को MSIUSEREALADMINDETECTION जोड़ने के लिए

मैं मैं ओर्का मैन्युअल का उपयोग करें या अपने को बदलने की सुविधा के साथ कर सकता है पता जोड़ने, बल्कि होगा वहां मत जाओ

उत्तर

11

कुछ refs

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 सेट करते हैं? कारण, जब मैं स्क्रिप्ट चलाता हूं, तो मैं यह पूछता हूं, यह हमेशा अन्य ब्लॉक में जाता है और एक नई संपत्ति जोड़ दी जाती है। भी, मेरा इंस्टॉलर अभी भी सिस्टम खाते के तहत चल रहा है, न कि उपयोगकर्ता खाता – Dhawalk