2008-11-23 23 views

Trả lời

11

Một số refs

Sửa đổi CustomAction_NoImpersonate.js tham chiếu trong câu hỏi đưa ra kịch bản này có thể thêm/đặt bất kỳ giá trị trong bảng tính .

Gọi với "MSI_SetProperty.js cscript.exe your.msi giá trị tài sản"

// 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

giá trị hex của MSIUSEREALADMINDETECTION là gì. hoặc bạn chỉ cần thiết lập MSIUSEREALADMINDETECTION? Lý do, tôi hỏi điều này khi tôi chạy kịch bản, nó luôn luôn đi trong khối khác và một tài sản mới được thêm vào. Ngoài ra, trình cài đặt của tôi vẫn có vẻ đang chạy trong tài khoản hệ thống chứ không phải tài khoản người dùng – Dhawalk

Các vấn đề liên quan