From 33c12fa386aa7ace7a6bd06a45bc3ecf17e9c8f5 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sun, 2 Nov 2025 00:03:07 -0700 Subject: Add support for perMachineOrUser Resolves 9175 --- src/api/wix/WixToolset.Data/Symbols/WixPackageSymbol.cs | 1 + .../Decompile/Decompiler.cs | 11 +++++++++-- src/wix/WixToolset.Core/Compiler_Package.cs | 9 ++++++++- .../test/WixToolsetTest.CoreIntegration/AllUsersFixture.cs | 12 ++++++++++++ .../TestData/AllUsers/PerMachineOrUser.wxs | 10 ++++++++++ src/xsd/wix.xsd | 13 ++++++++++++- 6 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachineOrUser.wxs (limited to 'src') diff --git a/src/api/wix/WixToolset.Data/Symbols/WixPackageSymbol.cs b/src/api/wix/WixToolset.Data/Symbols/WixPackageSymbol.cs index 9601ec7a..82a98cc0 100644 --- a/src/api/wix/WixToolset.Data/Symbols/WixPackageSymbol.cs +++ b/src/api/wix/WixToolset.Data/Symbols/WixPackageSymbol.cs @@ -54,6 +54,7 @@ namespace WixToolset.Data.Symbols PerMachine, PerUser, PerUserOrMachine, + PerMachineOrUser, } public enum WixPackageUpgradeStrategy diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs b/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs index 90b07776..8699ca2c 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs @@ -3056,9 +3056,16 @@ namespace WixToolset.Core.WindowsInstaller.Decompile { xAllUsers?.Remove(); } - else if (xAllUsers?.Attribute("Value")?.Value == "2" && xMsiInstallerPerUser?.Attribute("Value")?.Value == "1") + else if (xAllUsers?.Attribute("Value")?.Value == "2") { - this.DecompilerHelper.RootElement.SetAttributeValue("Scope", "perUserOrMachine"); + if (xMsiInstallerPerUser?.Attribute("Value")?.Value == "1") + { + this.DecompilerHelper.RootElement.SetAttributeValue("Scope", "perUserOrMachine"); + } + else + { + this.DecompilerHelper.RootElement.SetAttributeValue("Scope", "perMachineOrUser"); + } xAllUsers?.Remove(); xMsiInstallerPerUser?.Remove(); diff --git a/src/wix/WixToolset.Core/Compiler_Package.cs b/src/wix/WixToolset.Core/Compiler_Package.cs index 466c87a3..e0af9695 100644 --- a/src/wix/WixToolset.Core/Compiler_Package.cs +++ b/src/wix/WixToolset.Core/Compiler_Package.cs @@ -93,6 +93,9 @@ namespace WixToolset.Core case "perMachine": // handled below after we create the section. break; + case "perMachineOrUser": + scope = WixPackageScope.PerMachineOrUser; + break; case "perUser": scope = WixPackageScope.PerUser; sourceBits |= 8; @@ -101,7 +104,7 @@ namespace WixToolset.Core scope = WixPackageScope.PerUserOrMachine; break; default: - this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, installScope, "perMachine", "perUser", "perUserOrMachine")); + this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, attrib.Name.LocalName, installScope, "perMachine", "perMachineOrUser", "perUser", "perUserOrMachine")); break; } break; @@ -210,6 +213,10 @@ namespace WixToolset.Core this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "ALLUSERS"), "2", false, false, false, false); this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "MSIINSTALLPERUSER"), "1", false, false, false, false); } + else if (scope == WixPackageScope.PerMachineOrUser) + { + this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "ALLUSERS"), "2", false, false, false, false); + } else if (scope == WixPackageScope.PerMachine) { this.AddProperty(sourceLineNumbers, new Identifier(AccessModifier.Global, "ALLUSERS"), "1", false, false, false, false); diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/AllUsersFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/AllUsersFixture.cs index 0c1fd9e0..75c9a272 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/AllUsersFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/AllUsersFixture.cs @@ -22,6 +22,18 @@ namespace WixToolsetTest.CoreIntegration }, propertyRows); } + [Fact] + public void CanCheckPerMachineOrUserMsi() + { + var propertyRows = BuildAndQueryPropertyTable("PerMachineOrUser.wxs"); + + WixAssert.CompareLineByLine(new[] + { + "_SummaryInformation:WordCount\t2", + "Property:ALLUSERS\t2" + }, propertyRows); + } + [Fact] public void CanCheckPerUserMsi() { diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachineOrUser.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachineOrUser.wxs new file mode 100644 index 00000000..c0137747 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AllUsers/PerMachineOrUser.wxs @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/xsd/wix.xsd b/src/xsd/wix.xsd index 17111a00..cc0bc1dc 100644 --- a/src/xsd/wix.xsd +++ b/src/xsd/wix.xsd @@ -14187,6 +14187,16 @@ + + + + _New in WiX v7: WiX v7 adds this option to the Package Scope attribute._ + Set this value to declare that the package is [dual-purpose that can install per-machine or per-user](https://learn.microsoft.com/en-us/windows/win32/msi/single-package-authoring) + and defaults to installing per-machine. + Sets the ALLUSERS property to 2. + + + @@ -14198,7 +14208,8 @@ - Set this value to declare that the package is [dual-purpose that can install per-user or per-machine](https://learn.microsoft.com/en-us/windows/win32/msi/single-package-authoring). + Set this value to declare that the package is [dual-purpose that can install per-user or per-machine](https://learn.microsoft.com/en-us/windows/win32/msi/single-package-authoring) + and defaults to installing per-user. Sets the ALLUSERS property to 2 and MSIINSTALLPERUSER property to 1. -- cgit v1.2.3-55-g6feb