【问题标题】:Script to add MSIUSEREALADMINDETECTION to MSI将 MSIUSEREALADMINDETECTION 添加到 MSI 的脚本
【发布时间】:2008-11-23 13:10:27
【问题描述】:

任何人都有一个本着this handy script 精神的脚本(JScript、VBScript 或类似的),但添加了MSIUSEREALADMINDETECTION 属性

我知道我可以手动使用 Orca 或使用它的转换功能,但我不想去那里。

【问题讨论】:

    标签: windows-installer


    【解决方案1】:

    一些参考

    修改问题中引用的 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);
    }
    

    【讨论】:

    • MSIUSEREALADMINDETECTION 的十六进制值是多少。还是您只是设置 MSIUSEREALADMINDETECTION?原因,我在运行脚本时问这个,它总是进入 else 块并添加一个新属性。另外,我的安装程序似乎仍然在系统帐户而不是用户帐户下运行
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2010-09-11
    • 2018-12-02
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多