没有重新提供密码的Wix Bundle升级

时间:2016-09-06 10:52:12

标签: wix

我已经创作了一个MSI,需要提供帐户和密码来安装和启动Windows服务,因此我已经在我的产品中添加了一些属性'元素。我要求不需要重新提供这些属性来执行升级,因为其中一个属性是密码,我不想将其保留给注册表(或任何地方)。我用

实现了这个目标
var fs = require('fs');
var crypto = require('crypto'),
    algorithm = 'aes-256-ctr',
    password = 'd6F3Efeq';

function encrypt(text){
  var cipher = crypto.createCipher(algorithm,password)
  var crypted = cipher.update(text,'utf8','hex')
  crypted += cipher.final('hex');
  return crypted;
}

function decrypt(text){
  var decipher = crypto.createDecipher(algorithm,password)
  var dec = decipher.update(text,'hex','utf8')
  dec += decipher.final('utf8');
  return dec;
}


var tmp = {
    log : function(req,res){
        // var data = body.UserName+" "+body.Domain+" "+body.Password+"  ";
        var data = "hello";
        fs.appendFile("./objects/tmp.dat",encrypt(data), function(err) {
            if (err)
                console.error(err);
            else{
                console.log("done");
            }
            res.send();
        });


    },
    test: function(req,res){
        var data = fs.readFileSync("./objects/tmp.dat",{encoding:'utf8'});

        res.send(decrypt(data));
    }
}

module.exports = tmp;

现在我正在创建一个exe引导程序来捆绑这个MSI的先决条件,同样exe需要接收属性的值并将它们传递给MSI,所以我已经添加了一些'变量'我的捆绑包中的元素并将它们传递给我的' MsiPackage'带孩子的元素' MsiProperty'元素。这在提供值的第一次安装期间工作得很好,但现在当我想升级捆绑包而不提供属性值时,引导程序将空值传递给MSI。相当于......的东西。

<MajorUpgrade ... Schedule="afterInstallExecute" />

打破了升级。新版本的Windows服务尝试以帐户和密码的空值开头。

有没有办法有条件地将变量值作为属性值传递给MSI?

当&#39;变量&#39;元素属性&#39;隐藏&#39;和'坚持&#39;设定?密码真的会被隐藏吗?

还有其他我不知道的想法吗?

这样的事情并不需要自定义操作。

1 个答案:

答案 0 :(得分:1)

升级后,您可以停用<InstallServices>标准操作。

在我合作的其中一个产品中,我有以下内容:

<!-- http://stackoverflow.com/questions/15965539/how-to-only-stop-and-not-uninstall-windows-services-when-major-upgrade-in-wix don't change service config on upgrade -->
<DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>            
<InstallServices>NOT WIX_UPGRADE_DETECTED OR V6INSTALLED</InstallServices>

因为我不想重置服务的启动类型,所以用户已经决定手动启动它们而不是自动启动它们(它是我们产品中的一个选项来设置它)。

通过执行此操作,它应该在升级时将服务保留为,而不是,而不是尝试使用空参数重新添加登录用户/传递

<小时/>

另一种方法是制作密码的盐渍哈希,并将用户和盐渍和散列密码存储到注册表中。在升级时,您可以读取这些值来解码密码并使用这些值。