我已经创作了一个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;设定?密码真的会被隐藏吗?
还有其他我不知道的想法吗?
这样的事情并不需要自定义操作。
答案 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>
因为我不想重置服务的启动类型,所以用户已经决定手动启动它们而不是自动启动它们(它是我们产品中的一个选项来设置它)。
通过执行此操作,它应该在升级时将服务保留为,而不是,而不是尝试使用空参数重新添加登录用户/传递
<小时/>
另一种方法是制作密码的盐渍哈希,并将用户和盐渍和散列密码存储到注册表中。在升级时,您可以读取这些值来解码密码并使用这些值。