GroupPolicyForInterop.cs (13552B)
1 // ----------------------------------------------------------------------------- 2 // <copyright file="GroupPolicyForInterop.cs" company="Microsoft Corporation"> 3 // Copyright (c) Microsoft Corporation. Licensed under the MIT License. 4 // </copyright> 5 // ----------------------------------------------------------------------------- 6 7 namespace AppInstallerCLIE2ETests.Interop 8 { 9 using System; 10 using System.IO; 11 using System.Text; 12 using System.Threading; 13 using System.Threading.Tasks; 14 using AppInstallerCLIE2ETests.Helpers; 15 using Microsoft.Management.Deployment; 16 using Microsoft.Management.Deployment.Projection; 17 using Microsoft.WinGet.SharedLib.Exceptions; 18 using NUnit.Framework; 19 using Windows.System; 20 21 /// <summary> 22 /// Group Policy Tests for COM/WinRT Interop classes. 23 /// </summary> 24 [TestFixtureSource(typeof(InstanceInitializersSource), nameof(InstanceInitializersSource.InProcess), Category = nameof(InstanceInitializersSource.InProcess))] 25 [TestFixtureSource(typeof(InstanceInitializersSource), nameof(InstanceInitializersSource.OutOfProcess), Category = nameof(InstanceInitializersSource.OutOfProcess))] 26 public class GroupPolicyForInterop : BaseInterop 27 { 28 /// <summary> 29 /// Initializes a new instance of the <see cref="GroupPolicyForInterop"/> class. 30 /// </summary> 31 /// <param name="initializer">Initializer.</param> 32 public GroupPolicyForInterop(IInstanceInitializer initializer) 33 : base(initializer) 34 { 35 } 36 37 /// <summary> 38 /// Test setup. 39 /// </summary> 40 [SetUp] 41 public void SetUp() 42 { 43 GroupPolicyHelper.DeleteExistingPolicies(); 44 } 45 46 /// <summary> 47 /// Clean up. 48 /// </summary> 49 [TearDown] 50 public void CleanUp() 51 { 52 GroupPolicyHelper.DeleteExistingPolicies(); 53 } 54 55 /// <summary> 56 /// Test class Tear down. 57 /// </summary> 58 [OneTimeTearDown] 59 public void TestClassTearDown() 60 { 61 // Restore the tests source if it was removed as the affects subsequent tests. 62 TestCommon.SetupTestSource(); 63 } 64 65 /// <summary> 66 /// Validates disabling WinGetPolicy should block COM/WinRT Objects creation (InProcess and OutOfProcess). 67 /// </summary> 68 [Test] 69 public void DisableWinGetPolicy() 70 { 71 GroupPolicyHelper.EnableWinget.Disable(); 72 73 GroupPolicyException groupPolicyException = Assert.Catch<GroupPolicyException>(() => { PackageManager packageManager = this.TestFactory.CreatePackageManager(); }); 74 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 75 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 76 77 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { FindPackagesOptions findPackagesOptions = this.TestFactory.CreateFindPackagesOptions(); }); 78 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 79 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 80 81 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { CreateCompositePackageCatalogOptions createCompositePackageCatalogOptions = this.TestFactory.CreateCreateCompositePackageCatalogOptions(); }); 82 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 83 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 84 85 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { InstallOptions installOptions = this.TestFactory.CreateInstallOptions(); }); 86 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 87 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 88 89 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { UninstallOptions uninstallOptions = this.TestFactory.CreateUninstallOptions(); }); 90 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 91 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 92 93 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { DownloadOptions downloadOptions = this.TestFactory.CreateDownloadOptions(); }); 94 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 95 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 96 97 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { PackageMatchFilter packageMatchFilter = this.TestFactory.CreatePackageMatchFilter(); }); 98 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 99 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 100 101 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { RepairOptions repairOptions = this.TestFactory.CreateRepairOptions(); }); 102 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 103 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 104 105 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { AddPackageCatalogOptions packageManagerSettings = this.TestFactory.CreateAddPackageCatalogOptions(); }); 106 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 107 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 108 109 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { RemovePackageCatalogOptions packageManagerSettings = this.TestFactory.CreateRemovePackageCatalogOptions(); }); 110 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 111 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 112 113 // PackageManagerSettings is not implemented in context OutOfProcDev 114 if (this.TestFactory.Context == ClsidContext.InProc) 115 { 116 groupPolicyException = Assert.Catch<GroupPolicyException>(() => { PackageManagerSettings packageManagerSettings = this.TestFactory.CreatePackageManagerSettings(); }); 117 Assert.AreEqual(Constants.BlockByWinGetPolicyErrorMessage, groupPolicyException.Message); 118 Assert.AreEqual(Constants.ErrorCode.ERROR_BLOCKED_BY_POLICY, groupPolicyException.HResult); 119 } 120 } 121 122 /// <summary> 123 /// Validates disabling the EnableWindowsPackageManagerCommandLineInterfaces policy should still allow COM calls. 124 /// </summary> 125 /// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns> 126 [Test] 127 public async Task DisableWinGetCommandLineInterfacesPolicy() 128 { 129 GroupPolicyHelper.EnableWinGetCommandLineInterfaces.Disable(); 130 131 PackageManager packageManager = this.TestFactory.CreatePackageManager(); 132 string installDir = TestCommon.GetRandomTestDir(); 133 134 // Create composite package catalog source 135 var options = this.TestFactory.CreateCreateCompositePackageCatalogOptions(); 136 var testSource = packageManager.GetPackageCatalogByName(Constants.TestSourceName); 137 Assert.NotNull(testSource, $"{Constants.TestSourceName} cannot be null"); 138 options.Catalogs.Add(testSource); 139 options.CompositeSearchBehavior = CompositeSearchBehavior.AllCatalogs; 140 PackageCatalogReference compositeSource = packageManager.CreateCompositePackageCatalog(options); 141 142 // Find package 143 var searchResult = this.FindOnePackage(compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.ModifyRepairInstaller); 144 145 // Configure installation 146 var installOptions = this.TestFactory.CreateInstallOptions(); 147 installOptions.AcceptPackageAgreements = true; 148 installOptions.ReplacementInstallerArguments = $"/InstallDir {installDir} /Version 2.0.0.0 /DisplayName TestModifyRepair /UseHKLM"; 149 150 // Install 151 var installResult = await packageManager.InstallPackageAsync(searchResult.CatalogPackage, installOptions); 152 Assert.AreEqual(InstallResultStatus.Ok, installResult.Status); 153 154 // Find package again, but this time it should detect the installed version 155 searchResult = this.FindOnePackage(compositeSource, PackageMatchField.Id, PackageFieldMatchOption.Equals, Constants.ModifyRepairInstaller); 156 Assert.NotNull(searchResult.CatalogPackage.InstalledVersion); 157 158 // Repair 159 var repairOptions = this.TestFactory.CreateRepairOptions(); 160 repairOptions.PackageRepairMode = PackageRepairMode.Silent; 161 var repairResult = await packageManager.RepairPackageAsync(searchResult.CatalogPackage, repairOptions); 162 Assert.AreEqual(RepairResultStatus.Ok, repairResult.Status); 163 164 // Uninstall 165 var uninstallResult = await packageManager.UninstallPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateUninstallOptions()); 166 Assert.AreEqual(UninstallResultStatus.Ok, uninstallResult.Status); 167 Assert.True(TestCommon.VerifyTestExeUninstalled(installDir)); 168 169 // Clean up. 170 if (Directory.Exists(installDir)) 171 { 172 Directory.Delete(installDir, true); 173 } 174 175 // Download 176 var downloadResult = await packageManager.DownloadPackageAsync(searchResult.CatalogPackage, this.TestFactory.CreateDownloadOptions()); 177 Assert.AreEqual(DownloadResultStatus.Ok, downloadResult.Status); 178 var packageVersion = "2.0.0.0"; 179 string downloadDir = Path.Combine(TestCommon.GetDefaultDownloadDirectory(), $"{Constants.ModifyRepairInstaller}_{packageVersion}"); 180 TestCommon.AssertInstallerDownload(downloadDir, "TestModifyRepair", packageVersion, ProcessorArchitecture.X86, TestCommon.Scope.Unknown, PackageInstallerType.Burn, "en-US"); 181 182 // Add, update and remove package catalog 183 await this.AddUpdateRemovePackageCatalog(); 184 } 185 186 private async Task AddUpdateRemovePackageCatalog() 187 { 188 // Remove the tests source if it exists. 189 await this.RemovePackageCatalog(); 190 191 PackageManager packageManager = this.TestFactory.CreatePackageManager(); 192 193 // Add package catalog 194 AddPackageCatalogOptions options = this.TestFactory.CreateAddPackageCatalogOptions(); 195 options.SourceUri = Constants.TestSourceUrl; 196 options.Name = Constants.TestSourceName; 197 options.TrustLevel = PackageCatalogTrustLevel.Trusted; 198 199 var addCatalogResult = await packageManager.AddPackageCatalogAsync(options); 200 Assert.IsNotNull(addCatalogResult); 201 Assert.AreEqual(AddPackageCatalogStatus.Ok, addCatalogResult.Status); 202 203 // Get package catalog 204 var packageCatalog = packageManager.GetPackageCatalogByName(options.Name); 205 206 Assert.IsNotNull(packageCatalog); 207 Assert.AreEqual(options.Name, packageCatalog.Info.Name); 208 Assert.AreEqual(options.SourceUri, packageCatalog.Info.Argument); 209 var lastUpdatedTime = packageCatalog.Info.LastUpdateTime; 210 211 // Update package catalog 212 // Sleep for 30 seconds to make sure the last updated time is different after the refresh. 213 Thread.Sleep(TimeSpan.FromSeconds(30)); 214 215 var updateResult = await packageCatalog.RefreshPackageCatalogAsync(); 216 Assert.IsNotNull(updateResult); 217 Assert.AreEqual(RefreshPackageCatalogStatus.Ok, updateResult.Status); 218 219 packageCatalog = packageManager.GetPackageCatalogByName(options.Name); 220 Assert.IsTrue(packageCatalog.Info.LastUpdateTime > lastUpdatedTime); 221 222 // Remove package catalog 223 await this.RemovePackageCatalog(); 224 } 225 226 private async Task RemovePackageCatalog() 227 { 228 PackageManager packageManager = this.TestFactory.CreatePackageManager(); 229 230 // Remove the tests source if it exists. 231 RemovePackageCatalogOptions removePackageCatalogOptions = this.TestFactory.CreateRemovePackageCatalogOptions(); 232 removePackageCatalogOptions.Name = Constants.TestSourceName; 233 234 var removeCatalogResult = await packageManager.RemovePackageCatalogAsync(removePackageCatalogOptions); 235 Assert.IsNotNull(removeCatalogResult); 236 Assert.AreEqual(RemovePackageCatalogStatus.Ok, removeCatalogResult.Status); 237 238 var packageCatalog = packageManager.GetPackageCatalogByName(removePackageCatalogOptions.Name); 239 Assert.IsNull(packageCatalog); 240 } 241 } 242 }