From aba2aa1433ddf1ef6d2d0880df2598b140fa05e1 Mon Sep 17 00:00:00 2001 From: Matt McSpirit Date: Thu, 7 Oct 2021 16:49:18 -0700 Subject: [PATCH] October 2021 Update --- README.md | 73 +- {nested => archive}/README.md | 61 +- {nested => archive}/json/azshcilabvm.json | 0 {media => archive/media}/Login-AzAccount.png | Bin .../media}/New-AzRoleAssignment.png | Bin .../media}/New-AzRoleDefinition.png | Bin {media => archive/media}/aad_permissions.png | Bin {media => archive/media}/add_nodes.png | Bin {media => archive/media}/add_nodes_ga.png | Bin {media => archive/media}/adds_group.png | Bin {media => archive/media}/adds_new_user.png | Bin {media => archive/media}/adds_prereq.png | Bin {media => archive/media}/adds_wizard.png | Bin {media => archive/media}/api_permissions.png | Bin .../media}/api_permissions_ga.png | Bin {media => archive/media}/auto_shutdown.png | Bin {media => archive/media}/azshci_data_disk.png | Bin .../media}/azshci_disks_added.png | Bin .../media}/azshci_disks_added_ga.png | Bin {media => archive/media}/azshci_laptop.png | Bin .../media}/azshci_settings_ps.png | Bin .../media}/azshci_settings_ps_ga.png | Bin {media => archive/media}/azshci_setup.png | Bin .../media}/azshci_setup_complete.png | Bin {media => archive/media}/azure_ad_app.png | Bin {media => archive/media}/azure_ad_app_ga.png | Bin {media => archive/media}/azure_arm.png | Bin {media => archive/media}/azure_blob.png | Bin {media => archive/media}/azure_blob_ga.png | Bin .../media}/azure_cloud_witness.png | Bin .../media}/azure_cloud_witness_ga.png | Bin {media => archive/media}/azure_keys.png | Bin {media => archive/media}/azure_keys_ga.png | Bin {media => archive/media}/azure_login_reg.png | Bin .../media}/azure_portal_hcicluster.png | Bin .../media}/azure_subscriptions.png | Bin .../media}/azure_subscriptions_ga.png | Bin .../media}/azure_vm_custom_template.png | Bin .../azure_vm_custom_template_complete.png | Bin {media => archive/media}/azure_vm_search.png | Bin .../media}/azure_vm_search_ga.png | Bin {media => archive/media}/boot_from_dvd.png | Bin .../media}/connect_to_mgmt01.png | Bin {media => archive/media}/connect_to_vm.png | Bin .../media}/connect_to_vm_properties.png | Bin {media => archive/media}/dc_created.png | Bin .../media}/dc_install_progress.png | Bin {media => archive/media}/dc_nic.png | Bin {media => archive/media}/dhcp_complete.png | Bin {media => archive/media}/dhcp_dns.png | Bin {media => archive/media}/dhcp_enabled.png | Bin {media => archive/media}/dhcp_scope.png | Bin {media => archive/media}/download_files.png | Bin {media => archive/media}/dynamicmem.png | Bin .../media}/dynamicmem_mgmt01.png | Bin {media => archive/media}/enable_nested.png | Bin {media => archive/media}/enhanced_session.png | Bin {media => archive/media}/extension_update.png | Bin .../media}/extension_update_needed.png | Bin {media => archive/media}/flow_chart_ga.png | Bin archive/media/flow_chart_ga_oct21.png | Bin 0 -> 21586 bytes .../media}/flow_chart_paths_old.png | Bin {media => archive/media}/get_net_nat.png | Bin {media => archive/media}/ie_enhanced.png | Bin {media => archive/media}/instaill_rsat.png | Bin {media => archive/media}/ip_settings.PNG | Bin {media => archive/media}/nested.png | Bin {media => archive/media}/nested_virt.png | Bin {media => archive/media}/nested_virt_arch.png | Bin .../media}/nested_virt_arch_ga.png | Bin {media => archive/media}/nested_virt_mgmt.png | Bin .../media}/nested_virt_mgmt_ga.png | Bin .../media}/nested_virt_nodes.png | Bin .../media}/nested_virt_nodes_ga.png | Bin .../media}/nested_virt_physical.png | Bin .../media}/nested_virt_physical_ga.png | Bin .../media}/new_vm_dynamicmem.png | Bin {media => archive/media}/new_vm_mgmt01.png | Bin .../media}/new_vm_mgmt01_vhd.png | Bin .../media}/new_vm_mgmt01_vhd_ga.png | Bin {media => archive/media}/new_vm_name.png | Bin {media => archive/media}/new_vm_node.png | Bin .../media}/new_vm_node_memory.png | Bin .../media}/new_vm_node_memory_ga.png | Bin .../media}/new_vm_node_settings.png | Bin .../media}/new_vm_node_settings_ga.png | Bin {media => archive/media}/new_vm_node_vhd.png | Bin {media => archive/media}/new_vm_vhd.png | Bin {media => archive/media}/nic_adapter.png | Bin {media => archive/media}/node_ipconfig.png | Bin {media => archive/media}/node_turned_off.png | Bin {media => archive/media}/physical.png | Bin .../media}/powershell_vm_deployed.png | Bin {media => archive/media}/reg_check.png | Bin {media => archive/media}/reg_check_ga.png | Bin {media => archive/media}/register_azshci.png | Bin .../media}/register_azshci_ga.png | Bin .../media}/registration_record.png | Bin {media => archive/media}/registration_rg.png | Bin .../media}/registration_rg_ga.png | Bin .../media}/registration_status.png | Bin {media => archive/media}/sconfig.png | Bin {media => archive/media}/sconfig_nic.png | Bin {media => archive/media}/startvm.png | Bin {media => archive/media}/startvm_mgmt01.png | Bin {media => archive/media}/sysdm.png | Bin {media => archive/media}/systeminfo_upd.png | Bin {media => archive/media}/vm_connect.png | Bin {media => archive/media}/vm_connect_ga.png | Bin .../media}/w10_install_complete.png | Bin {media => archive/media}/w10_setup.png | Bin {media => archive/media}/wac_azshciclus.png | Bin .../media}/wac_azshciclus_ga.png | Bin .../media}/wac_azure_connect.png | Bin {media => archive/media}/wac_azure_key.png | Bin {media => archive/media}/wac_azure_key_ga.png | Bin .../media}/wac_azure_permissions.png | Bin .../media}/wac_azure_reg_dashboard.png | Bin .../media}/wac_azure_reg_dashboard_2.png | Bin .../media}/wac_azure_reg_dashboard_3.png | Bin .../media}/wac_azure_register.png | Bin .../media}/wac_check_drives_ga.png | Bin {media => archive/media}/wac_clean_drives.png | Bin .../media}/wac_clean_drives_ga.png | Bin .../media}/wac_cloud_witness_new.png | Bin .../media}/wac_cloud_witness_new_ga.png | Bin .../media}/wac_cluster_success.png | Bin .../media}/wac_cluster_success_ga.png | Bin {media => archive/media}/wac_cluster_type.png | Bin .../media}/wac_cluster_type_ga.png | Bin .../media}/wac_compute_vswitch.png | Bin .../media}/wac_compute_vswitch_ga.png | Bin {media => archive/media}/wac_create_clus.png | Bin .../media}/wac_create_clus_ga.png | Bin {media => archive/media}/wac_credssp.png | Bin {media => archive/media}/wac_credssp_ga.png | Bin .../media}/wac_define_network.png | Bin .../media}/wac_define_network_ga.png | Bin .../media}/wac_domain_joined.png | Bin .../media}/wac_domain_joined_ga.png | Bin {media => archive/media}/wac_enable_dedup.png | Bin .../media}/wac_enable_dedup_ga.png | Bin {media => archive/media}/wac_enable_rdma.png | Bin {media => archive/media}/wac_installed.png | Bin .../media}/wac_installed_features.png | Bin .../media}/wac_installed_features_ga.png | Bin .../media}/wac_management_nic.png | Bin .../media}/wac_management_nic_ga.png | Bin {media => archive/media}/wac_move.png | Bin {media => archive/media}/wac_move_ga.png | Bin .../media}/wac_nic_selection.png | Bin {media => archive/media}/wac_restart.png | Bin {media => archive/media}/wac_restart_ga.png | Bin {media => archive/media}/wac_s2d_enabled.png | Bin .../media}/wac_s2d_enabled_ga.png | Bin {media => archive/media}/wac_singlemgmt.png | Bin .../media}/wac_singlemgmt_ga.png | Bin .../media}/wac_storage_validated.png | Bin .../media}/wac_storage_validated_ga.png | Bin .../media}/wac_validate_storage.png | Bin .../media}/wac_validate_storage_ga.png | Bin {media => archive/media}/wac_validated.png | Bin {media => archive/media}/wac_validated_ga.png | Bin .../media}/wac_verify_drives.png | Bin .../media}/wac_verify_network.png | Bin .../media}/wac_verify_network_ga.png | Bin {media => archive/media}/wac_vm001.png | Bin {media => archive/media}/wac_vm001_ga.png | Bin {media => archive/media}/wac_vm_storage.png | Bin .../media}/wac_vm_storage_deployed.png | Bin .../media}/wac_vm_storage_deployed_ga.png | Bin .../media}/wac_vm_storage_ga.png | Bin {media => archive/media}/wac_vswitches.png | Bin {media => archive/media}/wac_vswitches_ga.png | Bin .../media}/ws_install_complete.png | Bin {media => archive/media}/ws_setup.png | Bin .../steps/1_NestedOnPhysical.md | 8 +- .../steps/2a_ManagementInfraGUI.md | 64 +- .../steps/2b_ManagementInfraPS.md | 26 +- .../steps/3a_AzSHCINodesGUI.md | 28 +- {nested => archive}/steps/3b_AzSHCINodesPS.md | 10 +- {nested => archive}/steps/4_AzSHCICluster.md | 96 +- {nested => archive}/steps/5_ExploreAzSHCI.md | 16 +- deployment/dsc/azshcihost.zip | Bin 0 -> 1417230 bytes .../6.0.1/ActiveDirectoryDsc.psd1 | 283 + .../MSFT_ADComputer/MSFT_ADComputer.psm1 | 964 ++++ .../MSFT_ADComputer.schema.mof | 23 + .../DSCResources/MSFT_ADComputer/README.md | 20 + .../en-US/MSFT_ADComputer.strings.psd1 | 27 + .../en-US/about_ADComputer.help.txt | 275 + .../MSFT_ADDomain/MSFT_ADDomain.psm1 | 555 ++ .../MSFT_ADDomain/MSFT_ADDomain.schema.mof | 18 + .../DSCResources/MSFT_ADDomain/README.md | 7 + .../en-US/MSFT_ADDomain.strings.psd1 | 17 + .../en-US/about_ADDomain.help.txt | 164 + .../MSFT_ADDomainController.psm1 | 854 ++++ .../MSFT_ADDomainController.schema.mof | 19 + .../MSFT_ADDomainController/README.md | 35 + .../MSFT_ADDomainController.strings.psd1 | 23 + .../en-US/about_ADDomainController.help.txt | 457 ++ .../MSFT_ADDomainControllerProperties.psm1 | 197 + ...FT_ADDomainControllerProperties.schema.mof | 6 + .../README.md | 8 + ..._ADDomainControllerProperties.strings.psd1 | 8 + ...bout_ADDomainControllerProperties.help.txt | 39 + .../MSFT_ADDomainDefaultPasswordPolicy.psm1 | 374 ++ ...T_ADDomainDefaultPasswordPolicy.schema.mof | 17 + .../README.md | 7 + ...ADDomainDefaultPasswordPolicy.strings.psd1 | 9 + ...out_ADDomainDefaultPasswordPolicy.help.txt | 94 + .../MSFT_ADDomainFunctionalLevel.psm1 | 194 + .../MSFT_ADDomainFunctionalLevel.schema.mof | 6 + .../MSFT_ADDomainFunctionalLevel/README.md | 15 + .../MSFT_ADDomainFunctionalLevel.strings.psd1 | 8 + .../about_ADDomainFunctionalLevel.help.txt | 47 + .../MSFT_ADDomainTrust.psm1 | 714 +++ .../MSFT_ADDomainTrust.schema.mof | 11 + .../DSCResources/MSFT_ADDomainTrust/README.md | 7 + .../en-US/MSFT_ADDomainTrust.strings.psd1 | 15 + .../en-US/about_ADDomainTrust.help.txt | 120 + .../MSFT_ADForestFunctionalLevel.psm1 | 193 + .../MSFT_ADForestFunctionalLevel.schema.mof | 6 + .../MSFT_ADForestFunctionalLevel/README.md | 15 + .../MSFT_ADForestFunctionalLevel.strings.psd1 | 8 + .../about_ADForestFunctionalLevel.help.txt | 47 + .../MSFT_ADForestProperties.psm1 | 509 ++ .../MSFT_ADForestProperties.schema.mof | 13 + .../MSFT_ADForestProperties/README.md | 8 + .../MSFT_ADForestProperties.strings.psd1 | 17 + .../en-US/about_ADForestProperties.help.txt | 111 + .../MSFT_ADGroup/MSFT_ADGroup.psm1 | 853 +++ .../MSFT_ADGroup/MSFT_ADGroup.schema.mof | 21 + .../6.0.1/DSCResources/MSFT_ADGroup/README.md | 11 + .../en-US/MSFT_ADGroup.strings.psd1 | 16 + .../MSFT_ADGroup/en-US/about_ADGroup.help.txt | 171 + .../MSFT_ADKDSKey/MSFT_ADKDSKey.psm1 | 516 ++ .../MSFT_ADKDSKey/MSFT_ADKDSKey.schema.mof | 11 + .../DSCResources/MSFT_ADKDSKey/README.md | 7 + .../en-US/MSFT_ADKDSKey.strings.psd1 | 25 + .../en-US/about_ADKDSKey.help.txt | 104 + .../MSFT_ADManagedServiceAccount.psm1 | 733 +++ .../MSFT_ADManagedServiceAccount.schema.mof | 17 + .../MSFT_ADManagedServiceAccount/README.md | 9 + .../MSFT_ADManagedServiceAccount.strings.psd1 | 22 + .../about_ADManagedServiceAccount.help.txt | 161 + .../MSFT_ADObjectEnabledState.psm1 | 386 ++ .../MSFT_ADObjectEnabledState.schema.mof | 9 + .../MSFT_ADObjectEnabledState/README.md | 15 + .../MSFT_ADObjectEnabledState.strings.psd1 | 12 + .../en-US/about_ADObjectEnabledState.help.txt | 155 + .../MSFT_ADObjectPermissionEntry.psm1 | 372 ++ .../MSFT_ADObjectPermissionEntry.schema.mof | 12 + .../MSFT_ADObjectPermissionEntry/README.md | 10 + .../MSFT_ADObjectPermissionEntry.strings.psd1 | 11 + .../about_ADObjectPermissionEntry.help.txt | 129 + .../MSFT_ADOptionalFeature.psm1 | 226 + .../MSFT_ADOptionalFeature.schema.mof | 8 + .../MSFT_ADOptionalFeature/README.md | 10 + .../en-US/MSFT_ADOptionalFeature.strings.psd1 | 12 + .../en-US/about_ADOptionalFeature.help.txt | 61 + .../MSFT_ADOrganizationalUnit.psm1 | 429 ++ .../MSFT_ADOrganizationalUnit.schema.mof | 12 + .../MSFT_ADOrganizationalUnit/README.md | 11 + .../MSFT_ADOrganizationalUnit.strings.psd1 | 20 + .../en-US/about_ADOrganizationalUnit.help.txt | 85 + .../MSFT_ADReplicationSite.psm1 | 237 + .../MSFT_ADReplicationSite.schema.mof | 8 + .../MSFT_ADReplicationSite/README.md | 7 + .../en-US/MSFT_ADReplicationSite.strings.psd1 | 12 + .../en-US/about_ADReplicationSite.help.txt | 87 + .../MSFT_ADReplicationSiteLink.psm1 | 605 +++ .../MSFT_ADReplicationSiteLink.schema.mof | 15 + .../MSFT_ADReplicationSiteLink/README.md | 7 + .../MSFT_ADReplicationSiteLink.strings.psd1 | 12 + .../about_ADReplicationSiteLink.help.txt | 120 + .../MSFT_ADReplicationSubnet.psm1 | 273 + .../MSFT_ADReplicationSubnet.schema.mof | 9 + .../MSFT_ADReplicationSubnet/README.md | 7 + .../MSFT_ADReplicationSubnet.strings.psd1 | 13 + .../en-US/about_ADReplicationSubnet.help.txt | 52 + .../MSFT_ADServicePrincipalName.psm1 | 207 + .../MSFT_ADServicePrincipalName.schema.mof | 7 + .../MSFT_ADServicePrincipalName/README.md | 7 + .../MSFT_ADServicePrincipalName.strings.psd1 | 11 + .../about_ADServicePrincipalName.help.txt | 60 + .../MSFT_ADUser/MSFT_ADUser.PropertyMap.psd1 | 310 ++ .../DSCResources/MSFT_ADUser/MSFT_ADUser.psm1 | 1934 +++++++ .../MSFT_ADUser/MSFT_ADUser.schema.mof | 66 + .../6.0.1/DSCResources/MSFT_ADUser/README.md | 11 + .../en-US/MSFT_ADUser.strings.psd1 | 25 + .../MSFT_ADUser/en-US/about_ADUser.help.txt | 386 ++ .../MSFT_WaitForADDomain.psm1 | 629 +++ .../MSFT_WaitForADDomain.schema.mof | 11 + .../MSFT_WaitForADDomain/README.md | 24 + .../en-US/MSFT_WaitForADDomain.strings.psd1 | 22 + .../en-US/about_WaitForADDomain.help.txt | 273 + .../ActiveDirectoryDsc.Common.psd1 | 80 + .../ActiveDirectoryDsc.Common.psm1 | 2356 +++++++++ .../ActiveDirectoryDsc.Common.strings.psd1 | 52 + .../6.0.1/PSGetModuleInfo.xml | Bin 0 -> 76080 bytes .../en-US/about_ActiveDirectoryDsc.help.txt | 23 + deployment/dsc/azshcihost/AzSHCIHost.ps1 | 1122 ++++ .../8.4.0/ComputerManagementDsc.psd1 | 91 + .../DSC_Computer/DSC_Computer.psm1 | 650 +++ .../DSC_Computer/DSC_Computer.schema.mof | 13 + .../8.4.0/DSCResources/DSC_Computer/README.md | 4 + .../en-US/DSC_Computer.strings.psd1 | 19 + .../DSC_IEEnhancedSecurityConfiguration.psm1 | 251 + ...IEEnhancedSecurityConfiguration.schema.mof | 7 + .../README.md | 4 + ...EnhancedSecurityConfiguration.strings.psd1 | 10 + .../DSC_OfflineDomainJoin.psm1 | 243 + .../DSC_OfflineDomainJoin.schema.mof | 6 + .../DSC_OfflineDomainJoin/README.md | 5 + .../en-US/DSC_OfflineDomainJoin.strings.psd1 | 11 + .../DSC_PendingReboot/DSC_PendingReboot.psm1 | 387 ++ .../DSC_PendingReboot.schema.mof | 16 + .../DSCResources/DSC_PendingReboot/README.md | 16 + .../en-US/DSC_PendingReboot.data.psd1 | 24 + .../en-US/DSC_PendingReboot.strings.psd1 | 9 + .../DSC_PowerPlan/DSC_PowerPlan.psm1 | 158 + .../DSC_PowerPlan/DSC_PowerPlan.schema.mof | 7 + .../DSCResources/DSC_PowerPlan/README.md | 3 + .../en-US/DSC_PowerPlan.schema.mfl | 6 + .../en-US/DSC_PowerPlan.strings.psd1 | 9 + .../DSC_PowerShellExecutionPolicy.psm1 | 138 + .../DSC_PowerShellExecutionPolicy.schema.mof | 6 + .../DSC_PowerShellExecutionPolicy/README.md | 4 + ...DSC_PowerShellExecutionPolicy.strings.psd1 | 8 + .../DSC_RemoteDesktopAdmin.psm1 | 184 + .../DSC_RemoteDesktopAdmin.schema.mof | 8 + .../DSC_RemoteDesktopAdmin/README.md | 5 + .../en-US/DSC_RemoteDesktopAdmin.strings.psd1 | 8 + .../DSC_ScheduledTask/DSC_ScheduledTask.psm1 | 1996 ++++++++ .../DSC_ScheduledTask.schema.mof | 50 + .../DSCResources/DSC_ScheduledTask/README.md | 39 + .../en-US/DSC_ScheduledTask.strings.psd1 | 36 + .../DSC_SmbServerConfiguration.data.psd1 | 46 + .../DSC_SmbServerConfiguration.psm1 | 708 +++ .../DSC_SmbServerConfiguration.schema.mof | 51 + .../DSC_SmbServerConfiguration/README.md | 7 + .../DSC_SmbServerConfiguration.schema.mfl | 47 + .../DSC_SmbServerConfiguration.strings.psd1 | 8 + .../DSC_SmbShare/DSC_SmbShare.psm1 | 853 +++ .../DSC_SmbShare/DSC_SmbShare.schema.mof | 27 + .../8.4.0/DSCResources/DSC_SmbShare/README.md | 40 + .../en-US/DSC_SmbShare.schema.mfl | 21 + .../en-US/DSC_SmbShare.strings.psd1 | 21 + .../DSC_SystemLocale/DSC_SystemLocale.psm1 | 191 + .../DSC_SystemLocale.schema.mof | 6 + .../DSCResources/DSC_SystemLocale/README.md | 10 + .../en-US/DSC_SystemLocale.strings.psd1 | 9 + .../DSC_TimeZone/DSC_TimeZone.psm1 | 125 + .../DSC_TimeZone/DSC_TimeZone.schema.mof | 6 + .../8.4.0/DSCResources/DSC_TimeZone/README.md | 7 + .../en-US/DSC_TimeZone.strings.psd1 | 7 + .../DSC_UserAccountControl.psm1 | 591 +++ .../DSC_UserAccountControl.schema.mof | 15 + .../DSC_UserAccountControl/README.md | 96 + .../en-US/DSC_UserAccountControl.strings.psd1 | 14 + .../DSC_VirtualMemory/DSC_VirtualMemory.psm1 | 529 ++ .../DSC_VirtualMemory.schema.mof | 10 + .../DSCResources/DSC_VirtualMemory/README.md | 4 + .../en-US/DSC_VirtualMemory.strings.psd1 | 14 + .../DSC_WindowsCapability.psm1 | 209 + .../DSC_WindowsCapability.schema.mof | 9 + .../DSC_WindowsCapability/README.md | 10 + .../en-US/DSC_WindowsCapability.strings.psd1 | 13 + .../DSC_WindowsEventLog.psm1 | 453 ++ .../DSC_WindowsEventLog.schema.mof | 12 + .../DSC_WindowsEventLog/README.md | 5 + .../en-US/DSC_WindowsEventLog.strings.psd1 | 24 + .../ComputerManagementDsc.Common.psm1 | 635 +++ .../SetTimeZone.cs | 271 + .../ComputerManagementDsc.Common.strings.psd1 | 15 + .../0.9.3/DscResource.Common.psd1 | 73 + .../0.9.3/DscResource.Common.psm1 | 2179 ++++++++ .../en-US/DscResource.Common.strings.psd1 | 37 + .../en-US/about_DscResource.Common.help.txt | 26 + .../about_ComputerManagementDsc.help.txt | 34 + .../DSCR_Shortcut/2.1.1/DSCR_Shortcut.psd1 | 83 + .../DSCResources/cShortcut/cShortcut.psm1 | 861 ++++ .../cShortcut/cShortcut.schema.mof | 16 + .../azshcihost/DSCR_Shortcut/2.1.1/LICENSE | 21 + .../2.1.1/Libs/ShellLink/ShellLink.cs | 612 +++ .../2.1.1/Libs/VKeyUtil/VKeyUtil.cs | 27 + .../azshcihost/DSCR_Shortcut/2.1.1/README.md | 139 + .../DSC_DnsServerADZone.psm1 | 340 ++ .../DSC_DnsServerADZone.schema.mof | 11 + .../DSC_DnsServerADZone/README.md | 3 + .../en-US/DSC_DnsServerADZone.strings.psd1 | 10 + .../en-US/about_DnsServerADZone.help.txt | 86 + .../DSC_DnsServerClientSubnet.psm1 | 238 + .../DSC_DnsServerClientSubnet.schema.mof | 8 + .../DSC_DnsServerClientSubnet/README.md | 7 + .../DSC_DnsServerClientSubnet.strings.psd1 | 10 + .../about_DnsServerClientSubnet.help.txt | 46 + .../DSC_DnsServerConditionalForwarder.psm1 | 430 ++ ...C_DnsServerConditionalForwarder.schema.mof | 10 + .../README.md | 5 + ...DnsServerConditionalForwarder.strings.psd1 | 20 + ...out_DnsServerConditionalForwarder.help.txt | 54 + .../DSC_DnsServerDiagnostics.psm1 | 533 ++ .../DSC_DnsServerDiagnostics.schema.mof | 33 + .../DSC_DnsServerDiagnostics/README.md | 12 + .../DSC_DnsServerDiagnostics.strings.psd1 | 6 + .../en-US/about_DnsServerDiagnostics.help.txt | 221 + .../DSC_DnsServerForwarder.psm1 | 189 + .../DSC_DnsServerForwarder.schema.mof | 9 + .../DSC_DnsServerForwarder/README.md | 6 + .../en-US/DSC_DnsServerForwarder.strings.psd1 | 10 + .../en-US/about_DnsServerForwarder.help.txt | 147 + .../DSC_DnsServerPrimaryZone.psm1 | 187 + .../DSC_DnsServerPrimaryZone.schema.mof | 8 + .../DSC_DnsServerPrimaryZone/README.md | 3 + .../DSC_DnsServerPrimaryZone.strings.psd1 | 8 + .../en-US/about_DnsServerPrimaryZone.help.txt | 135 + .../DSC_DnsServerRootHint.psm1 | 124 + .../DSC_DnsServerRootHint.schema.mof | 6 + .../DSC_DnsServerRootHint/README.md | 3 + .../en-US/DSC_DnsServerRootHint.strings.psd1 | 8 + .../en-US/about_DnsServerRootHint.help.txt | 65 + .../DSC_DnsServerSecondaryZone.psm1 | 277 + .../DSC_DnsServerSecondaryZone.schema.mof | 8 + .../DSC_DnsServerSecondaryZone/README.md | 6 + .../DSC_DnsServerSecondaryZone.strings.psd1 | 17 + .../about_DnsServerSecondaryZone.help.txt | 45 + .../DSC_DnsServerSetting.psm1 | 1480 ++++++ .../DSC_DnsServerSetting.schema.mof | 79 + .../DSC_DnsServerSetting/README.md | 24 + .../en-US/DSC_DnsServerSetting.strings.psd1 | 9 + .../en-US/about_DnsServerSetting.help.txt | 493 ++ .../DSC_DnsServerSettingLegacy.psm1 | 260 + .../DSC_DnsServerSettingLegacy.schema.mof | 8 + .../DSC_DnsServerSettingLegacy/README.md | 12 + .../DSC_DnsServerSettingLegacy.strings.psd1 | 8 + .../about_DnsServerSettingLegacy.help.txt | 73 + .../DSC_DnsServerZoneAging.psm1 | 196 + .../DSC_DnsServerZoneAging.schema.mof | 8 + .../DSC_DnsServerZoneAging/README.md | 5 + .../en-US/DSC_DnsServerZoneAging.strings.psd1 | 9 + .../en-US/about_DnsServerZoneAging.help.txt | 64 + .../DSC_DnsServerZoneScope.psm1 | 144 + .../DSC_DnsServerZoneScope.schema.mof | 8 + .../DSC_DnsServerZoneScope/README.md | 9 + .../en-US/DSC_DnsServerZoneScope.strings.psd1 | 9 + .../en-US/about_DnsServerZoneScope.help.txt | 45 + .../DSC_DnsServerZoneTransfer.psm1 | 238 + .../DSC_DnsServerZoneTransfer.schema.mof | 7 + .../DSC_DnsServerZoneTransfer/README.md | 3 + .../DSC_DnsServerZoneTransfer.strings.psd1 | 10 + .../about_DnsServerZoneTransfer.help.txt | 34 + .../DnsServerDsc/3.0.0/DnsServerDsc.psd1 | 192 + .../DnsServerDsc/3.0.0/DnsServerDsc.psm1 | 3044 +++++++++++ .../DnsServerDsc.Common.psd1 | 47 + .../DnsServerDsc.Common.psm1 | 416 ++ .../en-US/DnsServerDsc.Common.strings.psd1 | 17 + .../0.10.2/DscResource.Common.psd1 | 82 + .../0.10.2/DscResource.Common.psm1 | 2535 +++++++++ .../en-US/DscResource.Common.strings.psd1 | 38 + .../en-US/about_DscResource.Common.help.txt | 26 + .../DnsServerDsc/3.0.0/PSGetModuleInfo.xml | Bin 0 -> 62730 bytes .../3.0.0/en-US/DnsRecordA.strings.psd1 | 10 + .../3.0.0/en-US/DnsRecordAScoped.strings.psd1 | 10 + .../3.0.0/en-US/DnsRecordAaaa.strings.psd1 | 10 + .../en-US/DnsRecordAaaaScoped.strings.psd1 | 10 + .../3.0.0/en-US/DnsRecordBase.strings.psd1 | 20 + .../3.0.0/en-US/DnsRecordCname.strings.psd1 | 10 + .../en-US/DnsRecordCnameScoped.strings.psd1 | 10 + .../3.0.0/en-US/DnsRecordMx.strings.psd1 | 11 + .../en-US/DnsRecordMxScoped.strings.psd1 | 10 + .../3.0.0/en-US/DnsRecordNs.strings.psd1 | 11 + .../en-US/DnsRecordNsScoped.strings.psd1 | 10 + .../3.0.0/en-US/DnsRecordPtr.strings.psd1 | 13 + .../3.0.0/en-US/DnsRecordSrv.strings.psd1 | 10 + .../en-US/DnsRecordSrvScoped.strings.psd1 | 11 + .../3.0.0/en-US/DnsServerCache.strings.psd1 | 14 + .../en-US/DnsServerDsSetting.strings.psd1 | 14 + .../3.0.0/en-US/DnsServerDsc.strings.psd1 | 12 + .../3.0.0/en-US/DnsServerEDns.strings.psd1 | 14 + .../en-US/DnsServerRecursion.strings.psd1 | 15 + .../en-US/DnsServerScavenging.strings.psd1 | 14 + .../3.0.0/en-US/ResourceBase.strings.psd1 | 17 + .../en-US/ResourcePropertiesBase.strings.psd1 | 14 + .../3.0.0/en-US/about_DnsRecordA.help.txt | 80 + .../en-US/about_DnsRecordAScoped.help.txt | 79 + .../3.0.0/en-US/about_DnsRecordAaaa.help.txt | 80 + .../en-US/about_DnsRecordAaaaScoped.help.txt | 79 + .../3.0.0/en-US/about_DnsRecordCname.help.txt | 16 + .../en-US/about_DnsRecordCnameScoped.help.txt | 12 + .../3.0.0/en-US/about_DnsRecordMx.help.txt | 90 + .../en-US/about_DnsRecordMxScoped.help.txt | 82 + .../3.0.0/en-US/about_DnsRecordNs.help.txt | 80 + .../en-US/about_DnsRecordNsScoped.help.txt | 79 + .../3.0.0/en-US/about_DnsRecordPtr.help.txt | 143 + .../3.0.0/en-US/about_DnsRecordSrv.help.txt | 112 + .../en-US/about_DnsRecordSrvScoped.help.txt | 95 + .../3.0.0/en-US/about_DnsServerCache.help.txt | 93 + .../en-US/about_DnsServerDsSetting.help.txt | 228 + .../3.0.0/en-US/about_DnsServerDsc.help.txt | 25 + .../3.0.0/en-US/about_DnsServerEDns.help.txt | 85 + .../en-US/about_DnsServerRecursion.help.txt | 52 + .../en-US/about_DnsServerScavenging.help.txt | 137 + .../10.2/Convert-WindowsImage.ps1 | 4081 +++++++++++++++ .../10.2/Hyper-ConvertImage.psd1 | Bin 0 -> 7426 bytes .../10.2/Hyper-ConvertImage.psm1 | 4550 +++++++++++++++++ .../10.2/PSGetModuleInfo.xml | Bin 0 -> 11062 bytes .../Classes/MSCatalogResponse.Class.ps1 | 18 + .../0.21.0/Classes/MSCatalogUpdate.Class.ps1 | 31 + .../Format/MSCatalogUpdate.Format.ps1xml | 51 + .../MSCatalog/0.21.0/MSCatalog.psd1 | 122 + .../MSCatalog/0.21.0/MSCatalog.psm1 | 27 + .../MSCatalog/0.21.0/PSGetModuleInfo.xml | Bin 0 -> 11148 bytes .../0.21.0/Private/Get-UpdateLinks.ps1 | 26 + .../0.21.0/Private/Invoke-CatalogRequest.ps1 | 61 + .../0.21.0/Private/Invoke-DownloadFile.ps1 | 24 + .../0.21.0/Private/Invoke-ParseDate.ps1 | 8 + .../0.21.0/Private/Sort-CatalogResults.ps1 | 76 + .../0.21.0/Public/Get-MSCatalogUpdate.ps1 | 161 + .../0.21.0/Public/Save-MSCatalogUpdate.ps1 | 146 + .../0.21.0/Types/Net45/HtmlAgilityPack.dll | Bin 0 -> 162816 bytes .../Types/netstandard2.0/HtmlAgilityPack.dll | Bin 0 -> 157184 bytes .../DSC_DefaultGatewayAddress.psm1 | 376 ++ .../DSC_DefaultGatewayAddress.schema.mof | 7 + .../DSC_DefaultGatewayAddress/README.md | 4 + .../DSC_DefaultGatewayAddress.strings.psd1 | 15 + .../about_DefaultGatewayAddress.help.txt | 60 + .../DSC_DnsClientGlobalSetting.data.psd1 | 16 + .../DSC_DnsClientGlobalSetting.psm1 | 267 + .../DSC_DnsClientGlobalSetting.schema.mof | 8 + .../DSC_DnsClientGlobalSetting/README.MD | 3 + .../DSC_DnsClientGlobalSetting.strings.psd1 | 10 + .../about_DnsClientGlobalSetting.help.txt | 64 + .../DSC_DnsConnectionSuffix.psm1 | 268 + .../DSC_DnsConnectionSuffix.schema.mof | 9 + .../DSC_DnsConnectionSuffix/README.MD | 3 + .../DSC_DnsConnectionSuffix.strings.psd1 | 10 + .../en-US/about_DnsConnectionSuffix.help.txt | 47 + .../DSC_DnsServerAddress.psm1 | 327 ++ .../DSC_DnsServerAddress.schema.mof | 8 + .../DSC_DnsServerAddress/README.MD | 3 + .../en-US/DSC_DnsServerAddress.strings.psd1 | 13 + .../en-US/about_DnsServerAddress.help.txt | 89 + .../DSC_Firewall/DSC_Firewall.data.psd1 | 36 + .../DSC_Firewall/DSC_Firewall.psm1 | 1377 +++++ .../DSC_Firewall/DSC_Firewall.schema.mof | 37 + .../8.2.0/DSCResources/DSC_Firewall/README.MD | 3 + .../en-US/DSC_Firewall.strings.psd1 | 24 + .../en-US/about_Firewall.help.txt | 275 + .../DSC_FirewallProfile.data.psd1 | 72 + .../DSC_FirewallProfile.psm1 | 470 ++ .../DSC_FirewallProfile.schema.mof | 22 + .../DSC_FirewallProfile/README.MD | 4 + .../en-US/DSC_FirewallProfile.strings.psd1 | 10 + .../en-US/about_FirewallProfile.help.txt | 124 + .../DSC_HostsFile/DSC_HostsFile.psm1 | 278 + .../DSC_HostsFile/DSC_HostsFile.schema.mof | 7 + .../DSCResources/DSC_HostsFile/README.MD | 3 + .../en-US/DSC_HostsFile.strings.psd1 | 11 + .../en-US/about_HostsFile.help.txt | 58 + .../DSC_IPAddress/DSC_IPAddress.psm1 | 505 ++ .../DSC_IPAddress/DSC_IPAddress.schema.mof | 8 + .../DSCResources/DSC_IPAddress/README.MD | 4 + .../en-US/DSC_IPAddress.strings.psd1 | 15 + .../en-US/about_IPAddress.help.txt | 177 + .../DSC_IPAddressOption.psm1 | 131 + .../DSC_IPAddressOption.schema.mof | 6 + .../DSC_IPAddressOption/README.MD | 8 + .../en-US/DSC_IPAddressOption.strings.psd1 | 7 + .../en-US/about_IPAddressOption.help.txt | 38 + .../DSC_NetAdapterAdvancedProperty.psm1 | 221 + .../DSC_NetAdapterAdvancedProperty.schema.mof | 8 + .../DSC_NetAdapterAdvancedProperty/README.MD | 59 + ...SC_NetAdapterAdvancedProperty.strings.psd1 | 8 + .../about_NetAdapterAdvancedProperty.help.txt | 98 + .../DSC_NetAdapterBinding.psm1 | 278 + .../DSC_NetAdapterBinding.schema.mof | 8 + .../DSC_NetAdapterBinding/README.MD | 3 + .../en-US/DSC_NetAdapterBinding.strings.psd1 | 12 + .../en-US/about_NetAdapterBinding.help.txt | 44 + .../DSC_NetAdapterLso/DSC_NetAdapterLso.psm1 | 256 + .../DSC_NetAdapterLso.schema.mof | 7 + .../DSCResources/DSC_NetAdapterLso/README.MD | 4 + .../en-US/DSC_NetAdapterLso.strings.psd1 | 8 + .../en-US/about_NetAdapterLso.help.txt | 59 + .../DSC_NetAdapterName.psm1 | 399 ++ .../DSC_NetAdapterName.schema.mof | 15 + .../DSCResources/DSC_NetAdapterName/README.MD | 3 + .../en-US/DSC_NetAdapterName.strings.psd1 | 11 + .../en-US/about_NetAdapterName.help.txt | 160 + .../DSC_NetAdapterRdma.psm1 | 165 + .../DSC_NetAdapterRdma.schema.mof | 6 + .../DSCResources/DSC_NetAdapterRdma/README.MD | 3 + .../en-US/DSC_NetAdapterRdma.strings.psd1 | 10 + .../en-US/about_NetAdapterRdma.help.txt | 51 + .../DSC_NetAdapterRSC.schema.mof | 9 + .../DSC_NetAdapterRsc/DSC_NetAdapterRsc.psm1 | 245 + .../DSCResources/DSC_NetAdapterRsc/README.MD | 3 + .../en-US/DSC_NetAdapterRsc.strings.psd1 | 8 + .../en-US/about_NetAdapterRsc.help.txt | 85 + .../DSC_NetAdapterRss/DSC_NetAdapterRss.psm1 | 178 + .../DSC_NetAdapterRss.schema.mof | 6 + .../DSCResources/DSC_NetAdapterRss/README.MD | 5 + .../en-US/DSC_NetAdapterRss.strings.psd1 | 8 + .../en-US/about_NetAdapterRss.help.txt | 35 + .../DSC_NetAdapterState.psm1 | 195 + .../DSC_NetAdapterState.schema.mof | 6 + .../DSC_NetAdapterState/README.MD | 3 + .../en-US/DSC_NetAdapterState.strings.psd1 | 9 + .../en-US/about_NetAdapterState.help.txt | 52 + .../DSCResources/DSC_NetBios/DSC_NetBios.psm1 | 236 + .../DSC_NetBios/DSC_NetBios.schema.mof | 7 + .../8.2.0/DSCResources/DSC_NetBios/README.MD | 3 + .../en-US/DSC_NetBios.strings.psd1 | 13 + .../DSC_NetBios/en-US/about_NetBios.help.txt | 52 + .../DSC_NetConnectionProfile.psm1 | 230 + .../DSC_NetConnectionProfile.schema.mof | 8 + .../DSC_NetConnectionProfile/README.MD | 3 + .../DSC_NetConnectionProfile.strings.psd1 | 11 + .../en-US/about_NetConnectionProfile.help.txt | 65 + .../DSC_NetIPInterface.data.psd1 | 72 + .../DSC_NetIPInterface.psm1 | 519 ++ .../DSC_NetIPInterface.schema.mof | 23 + .../DSCResources/DSC_NetIPInterface/README.MD | 9 + .../en-US/DSC_NetIPInterface.strings.psd1 | 10 + .../en-US/about_NetIPInterface.help.txt | 241 + .../DSC_NetworkTeam/DSC_NetworkTeam.psm1 | 327 ++ .../DSC_NetworkTeam.schema.mof | 9 + .../DSCResources/DSC_NetworkTeam/README.MD | 3 + .../en-US/DSC_NetworkTeam.strings.psd1 | 24 + .../en-US/about_NetworkTeam.help.txt | 78 + .../DSC_NetworkTeamInterface.psm1 | 307 ++ .../DSC_NetworkTeamInterface.schema.mof | 9 + .../DSC_NetworkTeamInterface/README.MD | 3 + .../DSC_NetworkTeamInterface.strings.psd1 | 17 + .../en-US/about_NetworkTeamInterface.help.txt | 83 + .../DSC_ProxySettings/DSC_ProxySettings.psm1 | 853 +++ .../DSC_ProxySettings.schema.mof | 14 + .../DSCResources/DSC_ProxySettings/README.md | 3 + .../en-US/DSC_ProxySettings.strings.psd1 | 15 + .../en-US/about_ProxySettings.help.txt | 121 + .../DSCResources/DSC_Route/DSC_Route.psm1 | 633 +++ .../DSC_Route/DSC_Route.schema.mof | 12 + .../8.2.0/DSCResources/DSC_Route/README.MD | 3 + .../DSC_Route/en-US/DSC_Route.strings.psd1 | 19 + .../DSC_Route/en-US/about_Route.help.txt | 64 + .../DSC_WaitForNetworkTeam.psm1 | 223 + .../DSC_WaitForNetworkTeam.schema.mof | 8 + .../DSC_WaitForNetworkTeam/README.md | 3 + .../en-US/DSC_WaitForNetworkTeam.strings.psd1 | 11 + .../en-US/about_WaitForNetworkTeam.help.txt | 48 + .../DSC_WinsServerAddress.psm1 | 168 + .../DSC_WinsServerAddress.schema.mof | 6 + .../DSC_WinsServerAddress/README.MD | 3 + .../en-US/DSC_WinsServerAddress.strings.psd1 | 11 + .../en-US/about_WinsServerAddress.help.txt | 51 + .../DSC_WinsSetting/DSC_WinsSetting.psm1 | 186 + .../DSC_WinsSetting.schema.mof | 7 + .../DSCResources/DSC_WinsSetting/README.MD | 4 + .../en-US/DSC_WinsSetting.strings.psd1 | 9 + .../en-US/about_WinsSetting.help.txt | 40 + .../0.9.3/DscResource.Common.psd1 | 73 + .../0.9.3/DscResource.Common.psm1 | 2179 ++++++++ .../en-US/DscResource.Common.strings.psd1 | 37 + .../en-US/about_DscResource.Common.help.txt | 26 + .../NetworkingDsc.Common.psm1 | 582 +++ .../en-US/NetworkingDsc.Common.strings.psd1 | 16 + .../NetworkingDsc/8.2.0/NetworkingDsc.psd1 | 114 + .../8.2.0/en-US/about_NetworkingDsc.help.txt | 29 + .../5.0.1/DSCResources/DSC_Disk/DSC_Disk.psm1 | 923 ++++ .../DSCResources/DSC_Disk/DSC_Disk.schema.mof | 15 + .../5.0.1/DSCResources/DSC_Disk/README.md | 68 + .../DSC_Disk/en-US/DSC_Disk.strings.psd1 | 42 + .../DSC_DiskAccessPath.psm1 | 835 +++ .../DSC_DiskAccessPath.schema.mof | 13 + .../DSCResources/DSC_DiskAccessPath/README.md | 30 + .../en-US/DSC_DiskAccessPath.strings.psd1 | 39 + .../DSC_MountImage/DSC_MountImage.psm1 | 594 +++ .../DSC_MountImage/DSC_MountImage.schema.mof | 11 + .../DSCResources/DSC_MountImage/README.md | 4 + .../en-US/DSC_MountImage.strings.psd1 | 17 + .../DSC_OpticalDiskDriveLetter.psm1 | 390 ++ .../DSC_OpticalDiskDriveLetter.schema.mof | 8 + .../DSC_OpticalDiskDriveLetter/README.md | 39 + .../DSC_OpticalDiskDriveLetter.strings.psd1 | 16 + .../DSC_WaitForDisk/DSC_WaitForDisk.psm1 | 220 + .../DSC_WaitForDisk.schema.mof | 10 + .../DSCResources/DSC_WaitForDisk/README.md | 29 + .../en-US/DSC_WaitForDisk.strings.psd1 | 8 + .../DSC_WaitForVolume/DSC_WaitForVolume.psm1 | 205 + .../DSC_WaitForVolume.schema.mof | 8 + .../DSCResources/DSC_WaitForVolume/README.md | 3 + .../en-US/DSC_WaitForVolume.strings.psd1 | 8 + .../0.9.3/DscResource.Common.psd1 | 73 + .../0.9.3/DscResource.Common.psm1 | 2179 ++++++++ .../en-US/DscResource.Common.strings.psd1 | 37 + .../en-US/about_DscResource.Common.help.txt | 26 + .../StorageDsc.Common/StorageDsc.Common.psm1 | 231 + .../en-US/StorageDsc.Common.strings.psd1 | 7 + .../StorageDsc/5.0.1/PSGetModuleInfo.xml | Bin 0 -> 20704 bytes .../StorageDsc/5.0.1/StorageDsc.psd1 | 95 + .../5.0.1/en-US/about_StorageDsc.help.txt | 25 + .../0.0.1/WindowsDeploymentHelper.psd1 | Bin 0 -> 8890 bytes .../0.0.1/WindowsDeploymentHelper.psm1 | 351 ++ .../1.0.7/Functions/Add-UpdateImage.ps1 | 277 + .../1.0.7/Functions/Convert-Wim2VHD.ps1 | 242 + .../1.0.7/Functions/Get-VhdPartitionStyle.ps1 | 24 + .../1.0.7/Functions/HelperFunctions.ps1 | 321 ++ .../Functions/Initialize-VHDPartition.ps1 | 346 ++ .../Functions/Invoke-CreateVmRunAndWait.ps1 | 80 + .../Functions/Invoke-WindowsImageUpdate.ps1 | 489 ++ .../1.0.7/Functions/Mount-VhdAndRunBlock.ps1 | 55 + .../1.0.7/Functions/New-Unattend.ps1 | 971 ++++ .../New-WindowsImageToolsExample.ps1 | 485 ++ .../1.0.7/Functions/Set-UpdateConfig.ps1 | 254 + .../1.0.7/Functions/Set-VHDPartition.ps1 | 530 ++ .../Functions/Update-WindowsImageWMF.ps1 | 338 ++ .../1.0.7/Functions/Wim2VhdClass.ps1 | 1637 ++++++ .../1.0.7/WindowsImageTools.psd1 | 132 + .../1.0.7/WindowsImageTools.psm1 | 42 + .../cChoco/2.5.0.0/AppVeyor/AppVeyorBuild.ps1 | 32 + .../2.5.0.0/AppVeyor/AppVeyorDeploy.ps1 | 45 + .../2.5.0.0/AppVeyor/AppVeyorInstall.ps1 | 57 + .../cChoco/2.5.0.0/AppVeyor/AppVeyorTest.ps1 | 43 + .../cChocoConfig/cChocoConfig.psm1 | 188 + .../cChocoConfig/cChocoConfig.schema.mof | 9 + .../cChocoFeature/cChocoFeature.psm1 | 148 + .../cChocoFeature/cChocoFeature.schema.mof | 8 + .../cChocoInstaller/cChocoInstaller.psm1 | 212 + .../cChocoInstaller.schema.mof | 6 + .../cChocoPackageInstall.psm1 | 553 ++ .../cChocoPackageInstall.schema.mof | 12 + .../cChocoPackageInstallerSet.psd1 | 95 + .../cChocoPackageInstallerSet.schema.psm1 | 45 + .../cChocoSource/cChocoSource.psm1 | 187 + .../cChocoSource/cChocoSource.schema.mof | 9 + .../cChoco/2.5.0.0/ExampleConfig.ps1 | 80 + .../2.5.0.0/Examples/cChocoConfigExample.ps1 | 39 + .../2.5.0.0/Examples/cChocoFeatureExample.ps1 | 41 + ...cChocoInstaller_cChocoInstallerExample.ps1 | 36 + ...oInstaller_cChocoPackageInstallExample.ps1 | 33 + .../dsc/azshcihost/cChoco/2.5.0.0/LICENSE | 174 + .../dsc/azshcihost/cChoco/2.5.0.0/NOTICE | 14 + .../cChoco/2.5.0.0/PSGetModuleInfo.xml | Bin 0 -> 15666 bytes .../2.5.0.0/Tests/cChocoConfig_Tests.ps1 | 105 + .../2.5.0.0/Tests/cChocoFeature_Tests.ps1 | 87 + .../2.5.0.0/Tests/cChocoInstaller_Tests.ps1 | 28 + .../Tests/cChocoPackageInstall_Tests.ps1 | 195 + .../Tests/cChoco_ScriptAnalyzerTests.ps1 | 46 + .../Tests/cChoco_xDscResourceTests.ps1 | 41 + .../cChoco/2.5.0.0/TestsResults.xml | 313 ++ .../azshcihost/cChoco/2.5.0.0/appveyor.yml | 48 + .../dsc/azshcihost/cChoco/2.5.0.0/cChoco.psd1 | Bin 0 -> 1216 bytes .../dsc/azshcihost/cChoco/2.5.0.0/readme.md | 58 + .../DSCResources/cVMIPAddress/README.md | 51 + .../cVMIPAddress/cVMIPAddress.psm1 | Bin 0 -> 22566 bytes .../cVMIPAddress/cVMIPAddress.schema.mof | Bin 0 -> 638 bytes .../cVMIPAddress/en-US/cVMIPAddress.psd1 | Bin 0 -> 2792 bytes .../DSCResources/cVMNetworkAdapter/Readme.md | 111 + .../cVMNetworkAdapter/cVMNetworkAdapter.psm1 | 308 ++ .../cVMNetworkAdapter.schema.mof | Bin 0 -> 734 bytes .../en-US/cVMNetworkAdapter.psd1 | 23 + .../cVMNetworkAdapterSettings/README.md | 78 + .../cVMNetworkAdapterSettings.psm1 | 297 ++ .../cVMNetworkAdapterSettings.schema.mof | Bin 0 -> 1876 bytes .../en-US/cVMNetworkAdapterSettings.psd1 | 12 + .../cVMNetworkAdapterVlan/Readme.md | 94 + .../cVMNetworkAdapterVlan.psm1 | 444 ++ .../cVMNetworkAdapterVlan.schema.mof | Bin 0 -> 1146 bytes .../en-US/cVMNetworkAdapterVlan.psd1 | 22 + .../3.0.0.0/DSCResources/cVMSwitch/README.md | 98 + .../DSCResources/cVMSwitch/cVMSwitch.psm1 | 618 +++ .../cVMSwitch/cVMSwitch.schema.mof | Bin 0 -> 2572 bytes .../cVMSwitch/en-US/cVMSwitch.psd1 | 36 + .../cWaitForVMGuestIntegration/README.md | 42 + .../cWaitForVMGuestIntegration.psm1 | Bin 0 -> 7228 bytes .../cWaitForVMGuestIntegration.schema.mof | Bin 0 -> 506 bytes .../en-US/cWaitForVMGuestIntegration.psd1 | Bin 0 -> 964 bytes .../cVMIPAddress/ResetIPAddress.Example.ps1 | 12 + .../cVMIPAddress/SetIPAddress.Example.ps1 | 15 + ...teVMNetworkAdapterManagementOS.Example.ps1 | 13 + ...orkAdapterMultipleManagementOS.Example.ps1 | 21 + ...eateVMNetworkAdapterMultipleVM.Example.ps1 | 29 + ...orkAdapterMultipleVMMACAddress.Example.ps1 | 23 + ...orkAdapterSettingsManagementOS.Example.ps1 | 13 + ...tworkAdapterSettingsVMMultiple.Example.ps1 | 22 + ...NetworkAdapterSettingsVMSimple.Example.ps1 | 13 + ...NetworkAdapterVlanManagementOS.Example.ps1 | 13 + ...dapterVlanMultipleManagementOS.Example.ps1 | 29 + ...VMNetworkAdapterVlanMultipleVM.Example.ps1 | 20 + .../cVMSwitch/HostTeamSwitch.Example.ps1 | 14 + .../cVMSwitch/InternalSwitch.Example.ps1 | 11 + .../cVMSwitch/NetAdapterSwitch.Example.ps1 | 13 + .../cVMSwitch/PrivateSwitch.Example.ps1 | 11 + .../cVMSwitch/SETTeamSwitch.Example.ps1 | 16 + ...tForIntegrationComponentCustom.Example.ps1 | 12 + ...ForIntegrationComponentDefault.Example.ps1 | 10 + ...SETTeamWithHostNetworkAdapters.Example.ps1 | 105 + .../dsc/azshcihost/cHyper-V/3.0.0.0/README.md | 18 + .../azshcihost/cHyper-V/3.0.0.0/cHyper-V.psd1 | Bin 0 -> 3108 bytes deployment/dsc/azshcihost/dscmetadata.json | 20 + .../MSFT_xCredSSP/MSFT_xCredSSP.psm1 | 324 ++ .../MSFT_xCredSSP/MSFT_xCredSSP.schema.mof | 9 + .../dsc/azshcihost/xCredSSP/1.3.0.0/LICENSE | 21 + .../xCredSSP/1.3.0.0/PSGetModuleInfo.xml | Bin 0 -> 11376 bytes .../dsc/azshcihost/xCredSSP/1.3.0.0/README.md | 102 + .../Tests/Unit/MSFT_xCredSSP.tests.ps1 | 275 + .../azshcihost/xCredSSP/1.3.0.0/xCredSSP.psd1 | 60 + .../2.0.0.0/DSCResources/Helper.psm1 | 267 + .../MSFT_DhcpPolicyOptionValue.psm1 | 207 + .../MSFT_DhcpPolicyOptionValue.schema.mof | 11 + .../MSFT_DhcpReservedIPOptionValue.psm1 | 209 + .../MSFT_DhcpReservedIPOptionValue.schema.mof | 11 + .../MSFT_DhcpScopeOptionValue.psm1 | 209 + .../MSFT_DhcpScopeOptionValue.schema.mof | 11 + .../MSFT_DhcpServerOptionValue.psm1 | 187 + .../MSFT_DhcpServerOptionValue.schema.mof | 10 + .../MSFT_xDhcpServerAuthorization.psm1 | 171 + .../MSFT_xDhcpServerAuthorization.schema.mof | 7 + .../MSFT_xDhcpServerClass.psm1 | 192 + .../MSFT_xDhcpServerClass.schema.mof | 10 + .../MSFT_xDhcpServerOption.psm1 | 428 ++ .../MSFT_xDhcpServerOption.schema.mof | 11 + .../MSFT_xDhcpServerOptionDefinition.psm1 | 396 ++ ...SFT_xDhcpServerOptionDefinition.schema.mof | 12 + .../MSFT_xDhcpServerReservation.psm1 | 354 ++ .../MSFT_xDhcpServerReservation.schema.mof | 11 + .../MSFT_xDhcpServerScope.psm1 | 700 +++ .../MSFT_xDhcpServerScope.schema.mof | 15 + .../azshcihost/xDhcpServer/2.0.0.0/LICENSE | 21 + .../Misc/New-DhcpServerOptionResource.ps1 | 17 + .../New-DhcpServerReservationResource.ps1 | 17 + .../Misc/New-DhcpServerScopeResource.ps1 | 24 + .../2.0.0.0/Modules/CommonResourceHelper.psm1 | 265 + .../OptionValueHelper.psm1 | 758 +++ .../en-US/OptionValueHelper.strings.psd1 | 38 + .../azshcihost/xDhcpServer/2.0.0.0/README.md | 321 ++ .../DhcpPolicyOptionValue.ps1 | 36 + .../DhcpReservedIPOptionValue.ps1 | 25 + .../DhcpScopeOptionValue.ps1 | 47 + .../DhcpServerOptionValue.ps1 | 24 + .../2.0.0.0/Samples/SampleConfiguration.ps1 | 74 + .../2.0.0.0/TestSampleUsingAzure.ps1 | 17 + .../Tests/Unit/CommonResourceHelper.Tests.ps1 | 191 + .../2.0.0.0/Tests/Unit/Helper.Tests.ps1 | 78 + .../Unit/MSFT_DhcpPolicyOptionValue.Tests.ps1 | 211 + .../MSFT_DhcpReservedIPOptionValue.Tests.ps1 | 208 + .../Unit/MSFT_DhcpScopeOptionValue.Tests.ps1 | 211 + .../Unit/MSFT_DhcpServerOptionValue.Tests.ps1 | 204 + .../MSFT_xDhcpServerAuthorization.Tests.ps1 | 209 + .../Unit/MSFT_xDhcpServerClass.Tests.ps1 | 167 + .../Unit/MSFT_xDhcpServerOption.tests.ps1 | 368 ++ ...MSFT_xDhcpServerOptionDefinition.Tests.ps1 | 229 + .../Unit/MSFT_xDhcpServerScope.Tests.ps1 | 295 ++ .../xDhcpServer/2.0.0.0/xDhcpServer.psd1 | 64 + .../azshcihost/xHyper-V/3.17.0.0/CHANGELOG.md | 198 + .../HyperVCommon/HyperVCommon.psm1 | 436 ++ .../en-us/HyperVCommon.strings.psd1 | 16 + .../DSCResources/MSFT_xVHD/MSFT_xVHD.psm1 | 381 ++ .../MSFT_xVHD/MSFT_xVHD.schema.mof | 15 + .../MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.psm1 | 437 ++ .../MSFT_xVMDvdDrive.schema.mof | 9 + .../en-us/MSFT_xVMDvdDrive.strings.psd1 | 20 + .../MSFT_xVMHardDiskDrive.psm1 | 273 + .../MSFT_xVMHardDiskDrive.schema.mof | 10 + .../en-US/MSFT_xVMHardDiskDrive.strings.psd1 | 12 + .../MSFT_xVMHost/MSFT_xVMHost.psm1 | 457 ++ .../MSFT_xVMHost/MSFT_xVMHost.schema.mof | 21 + .../MSFT_xVMHost/en-US/MSFT_xVMHost.psd1 | 11 + .../MSFT_xVMHyperV/MSFT_xVMHyperV.psm1 | 988 ++++ .../MSFT_xVMHyperV/MSFT_xVMHyperV.schema.mof | 30 + .../MSFT_xVMHyperV/en-US/MSFT_xVMHyperV.psd1 | 28 + .../MSFT_xVMNetworkAdapter.psm1 | 681 +++ .../MSFT_xVMNetworkAdapter.schema.mof | 23 + .../en-US/MSFT_xVMNetworkAdapter.psd1 | 37 + .../MSFT_xVMProcessor/MSFT_xVMProcessor.psm1 | 443 ++ .../MSFT_xVMProcessor.schema.mof | 17 + .../en-US/MSFT_xVMProcessor.psd1 | 12 + .../MSFT_xVMScsiController.psm1 | 234 + .../MSFT_xVMScsiController.schema.mof | 8 + .../en-US/MSFT_xVMScsiController.strings.psd1 | 14 + .../MSFT_xVMSwitch/MSFT_xVMSwitch.psm1 | 677 +++ .../MSFT_xVMSwitch/MSFT_xVMSwitch.schema.mof | 14 + .../en-us/MSFT_xVMSwitch.strings.psd1 | 43 + .../MSFT_xVhdFileDirectory.psm1 | 504 ++ .../MSFT_xVhdFileDirectory.schema.mof | 24 + .../Sample_xVHD_AdditionalPropertyVHD.ps1 | 46 + .../3.17.0.0/Examples/Sample_xVHD_DiffVHD.ps1 | 64 + .../Examples/Sample_xVHD_FixedVHD.ps1 | 60 + .../Sample_xVHD_MissingPropertyVHD.ps1 | 36 + .../3.17.0.0/Examples/Sample_xVHD_NewVHD.ps1 | 58 + ...VMHardDiskDrive_VMWith4AdditionalDisks.ps1 | 97 + ...ample_xVMHardDiskDrive_VMWithExtraDisk.ps1 | 79 + .../Examples/Sample_xVMHost_Paths.ps1 | 22 + .../Examples/Sample_xVMHyperV_Complete.ps1 | 103 + .../Sample_xVMHyperV_DynamicMemory.ps1 | 47 + .../Sample_xVMHyperV_MultipleNICs.ps1 | 72 + .../Examples/Sample_xVMHyperV_Simple.ps1 | 35 + .../Sample_xVMHyperV_SimpleWithDVDDrive.ps1 | 48 + ...MHyperV_SimpleWithNestedVirtualization.ps1 | 54 + .../Sample_xVMNetworkAdapter_ManagementOS.ps1 | 13 + ...xVMNetworkAdapter_MultipleManagementOS.ps1 | 21 + .../Sample_xVMNetworkAdapter_MultipleVM.ps1 | 29 + ...xVMNetworkAdapter_MultipleVMMACAddress.ps1 | 23 + ...NetworkAdapter_VMStaticNetworkSettings.ps1 | 20 + ...Sample_xVMNetworkAdapter_VMVlanTagging.ps1 | 15 + ...ample_xVMScsiController_AddControllers.ps1 | 68 + .../Examples/Sample_xVMSwitch_External.ps1 | 35 + .../Examples/Sample_xVMSwitch_ExternalSET.ps1 | 47 + .../Sample_xVMSwitch_ExternalSET_LBMode.ps1 | 48 + .../Examples/Sample_xVMSwitch_Internal.ps1 | 31 + .../Examples/Sample_xVhdFileExamples.ps1 | 171 + .../dsc/azshcihost/xHyper-V/3.17.0.0/LICENSE | 21 + .../3.17.0.0/Misc/VHDResourceGenerator.ps1 | 13 + .../Misc/VMHardDiskDriveGenerator.ps1 | 8 + .../3.17.0.0/Misc/VMResourceGenerator.ps1 | 26 + .../Misc/VMScsiControllerGenerator.ps1 | 5 + .../3.17.0.0/Misc/VMSwitchGenerator.ps1 | 8 + .../azshcihost/xHyper-V/3.17.0.0/README.md | 523 ++ .../Integration/IntegrationTestsCommon.psm1 | 59 + .../MSFT_xVMDvdDrive.Integration.Tests.ps1 | 141 + .../MSFT_xVMDvdDrive_add.config.ps1 | 14 + .../MSFT_xVMDvdDrive_remove.config.ps1 | 14 + .../MSFT_xVMHost.Integration.Tests.ps1 | 94 + .../Integration/MSFT_xVMHost_set.config.ps1 | 29 + .../MSFT_xVMProcessor.Integration.Tests.ps1 | 103 + .../MSFT_xVMProcessor_set.config.ps1 | 12 + .../Tests/Unit/HyperVCommon.tests.ps1 | 338 ++ .../3.17.0.0/Tests/Unit/MSFT_xVHD.tests.ps1 | 302 ++ .../Tests/Unit/MSFT_xVMDvdDrive.tests.ps1 | 881 ++++ .../Unit/MSFT_xVMHardDiskDrive.Tests.ps1 | 381 ++ .../Tests/Unit/MSFT_xVMHost.tests.ps1 | 346 ++ .../Tests/Unit/MSFT_xVMHyperV.Tests.ps1 | 669 +++ .../Unit/MSFT_xVMNetworkAdapter.Tests.ps1 | 357 ++ .../Tests/Unit/MSFT_xVMProcessor.Tests.ps1 | 343 ++ .../Unit/MSFT_xVMScsiController.Tests.ps1 | 352 ++ ...MSwitch_BandwidthReservationMode.Tests.ps1 | 549 ++ ..._xVMSwitch_EnableEmbeddedTeaming.Tests.ps1 | 550 ++ .../Tests/Unit/MSFT_xVMSwitch_Id.Tests.ps1 | 421 ++ .../xHyper-V/3.17.0.0/xHyper-V.psd1 | 75 + .../DSC_xArchive/DSC_xArchive.psm1 | 1712 +++++++ .../DSC_xArchive/DSC_xArchive.schema.mof | 11 + .../en-US/DSC_xArchive.schema.mfl | 11 + .../en-US/DSC_xArchive.strings.psd1 | 58 + .../DSC_xDSCWebService.psm1 | 1759 +++++++ .../DSC_xDSCWebService.schema.mof | 25 + .../en-US/DSC_xDSCWebService.strings.psd1 | 11 + .../DSC_xEnvironmentResource.psm1 | 1156 +++++ .../DSC_xEnvironmentResource.schema.mof | 9 + .../en-US/DSC_xEnvironmentResource.schema.mfl | 9 + .../DSC_xEnvironmentResource.strings.psd1 | 19 + .../DSC_xGroupResource.psm1 | 2620 ++++++++++ .../DSC_xGroupResource.schema.mof | 12 + .../en-US/DSC_xGroupResource.schema.mfl | 11 + .../en-US/DSC_xGroupResource.strings.psd1 | 35 + .../DSC_xMsiPackage/DSC_xMsiPackage.psm1 | 1693 ++++++ .../DSC_xMsiPackage.schema.mof | 24 + .../en-US/DSC_xMsiPackage.schema.mfl | 23 + .../en-US/DSC_xMsiPackage.strings.psd1 | 45 + .../DSC_xPSSessionConfiguration.psm1 | 799 +++ .../DSC_xPSSessionConfiguration.schema.mof | 11 + .../DSC_xPSSessionConfiguration.strings.psd1 | 25 + .../DSC_xPackageResource.psm1 | 2054 ++++++++ .../DSC_xPackageResource.schema.mof | 30 + .../en-US/DSC_xPackageResource.schema.mfl | 32 + .../en-US/DSC_xPackageResource.strings.psd1 | 64 + .../DSC_xRegistryResource.psm1 | 1536 ++++++ .../DSC_xRegistryResource.schema.mof | 11 + .../en-US/DSC_xRegistryResource.schema.mfl | 11 + .../en-US/DSC_xRegistryResource.strings.psd1 | 35 + .../DSC_xRemoteFile/DSC_xRemoteFile.psm1 | 851 +++ .../DSC_xRemoteFile.schema.mof | 17 + .../en-us/DSC_xRemoteFile.strings.psd1 | 26 + .../DSC_xScriptResource.psm1 | 288 ++ .../DSC_xScriptResource.schema.mof | 10 + .../en-US/DSC_xScriptResource.schema.mfl | 9 + .../en-US/DSC_xScriptResource.strings.psd1 | 16 + .../DSC_xServiceResource.psm1 | 1870 +++++++ .../DSC_xServiceResource.schema.mof | 19 + .../en-US/DSC_xServiceResource.schema.mfl | 16 + .../en-US/DSC_xServiceResource.strings.psd1 | 40 + .../DSC_xUserResource/DSC_xUserResource.psm1 | 1397 +++++ .../DSC_xUserResource.schema.mof | 13 + .../en-US/DSC_xUserResource.schema.mfl | 13 + .../en-US/DSC_xUserResource.strings.psd1 | 23 + .../DSC_xWindowsFeature.psm1 | 568 ++ .../DSC_xWindowsFeature.schema.mof | 11 + .../en-US/DSC_xWindowsFeature.schema.mfl | 11 + .../en-US/DSC_xWindowsFeature.strings.psd1 | 23 + .../DSC_xWindowsOptionalFeature.psm1 | 417 ++ .../DSC_xWindowsOptionalFeature.schema.mof | 14 + .../DSC_xWindowsOptionalFeature.schema.mfl | 13 + .../DSC_xWindowsOptionalFeature.strings.psd1 | 20 + .../DSC_xWindowsPackageCab.psm1 | 238 + .../DSC_xWindowsPackageCab.schema.mof | 9 + .../en-US/DSC_xWindowsPackageCab.schema.mfl | 8 + .../en-US/DSC_xWindowsPackageCab.strings.psd1 | 13 + .../DSC_xWindowsProcess.psm1 | 1565 ++++++ .../DSC_xWindowsProcess.schema.mof | 18 + .../en-US/DSC_xWindowsProcess.schema.mfl | 19 + .../en-US/DSC_xWindowsProcess.strings.psd1 | 36 + .../DSCResources/xFileUpload/xFileUpload.psd1 | 25 + .../xFileUpload/xFileUpload.schema.psm1 | 670 +++ .../DSCResources/xGroupSet/xGroupSet.psd1 | 25 + .../xGroupSet/xGroupSet.schema.psm1 | 74 + .../DSCResources/xProcessSet/xProcessSet.psd1 | 25 + .../xProcessSet/xProcessSet.schema.psm1 | 104 + .../DSCResources/xServiceSet/xServiceSet.psd1 | 25 + .../xServiceSet/xServiceSet.schema.psm1 | 96 + .../xWindowsFeatureSet.psd1 | 25 + .../xWindowsFeatureSet.schema.psm1 | 85 + .../xWindowsOptionalFeatureSet.psd1 | 25 + .../xWindowsOptionalFeatureSet.schema.psm1 | 83 + .../DscPullServerSetup.psm1 | 492 ++ .../DscPullServerSetupTest.ps1 | 134 + .../Modules/DscPullServerSetup/README.md | 61 + .../en-US/DscPullServerSetup.strings.psd1 | 15 + ...iredStateConfiguration.Common.strings.psd1 | 11 + .../xPSDesiredStateConfiguration.Common.psd1 | 69 + .../xPSDesiredStateConfiguration.Common.psm1 | 828 +++ ...edStateConfiguration.Firewall.strings.psd1 | 4 + ...xPSDesiredStateConfiguration.Firewall.psd1 | 59 + ...xPSDesiredStateConfiguration.Firewall.psm1 | 106 + ...redStateConfiguration.PSWSIIS.strings.psd1 | 4 + .../xPSDesiredStateConfiguration.PSWSIIS.psd1 | 63 + .../xPSDesiredStateConfiguration.PSWSIIS.psm1 | 1022 ++++ ...edStateConfiguration.Security.strings.psd1 | 4 + ...xPSDesiredStateConfiguration.Security.psd1 | 58 + ...xPSDesiredStateConfiguration.Security.psm1 | 120 + .../GenerateXRemoteFileSchema.ps1 | 9 + .../New-PSSessionConfigurationResource.ps1 | 18 + ...bout_xPSDesiredStateConfiguration.help.txt | 29 + .../9.1.0/xPSDesiredStateConfiguration.psd1 | 200 + .../helpers/Install-AzsRolesandFeatures.ps1 | 38 + deployment/helpers/Register-AzSHCI.ps1 | 16 + deployment/helpers/Update-AD.ps1 | 55 + deployment/json/azshcihost.json | 618 +++ deployment/json/updatevnet.json | 68 + deployment/json/vnet.json | 59 + deployment/media/Add-NetNatStaticMapping.png | Bin 0 -> 19259 bytes deployment/media/Login-AzAccount.png | Bin 0 -> 15477 bytes deployment/media/aad_permissions.png | Bin 0 -> 105836 bytes deployment/media/access_web_app.png | Bin 0 -> 19909 bytes deployment/media/add_cluster_method1.png | Bin 0 -> 11476 bytes deployment/media/add_feed.png | Bin 0 -> 3262 bytes deployment/media/add_nodes_ga.png | Bin 0 -> 43104 bytes deployment/media/aks_azure_reg.png | Bin 0 -> 8317 bytes deployment/media/aks_basics_arc.png | Bin 0 -> 24460 bytes .../media/aks_basics_cluster_details (1).png | Bin 0 -> 13256 bytes .../media/aks_basics_cluster_details.png | Bin 0 -> 13268 bytes .../aks_basics_cluster_details_single.png | Bin 0 -> 13065 bytes deployment/media/aks_basics_primarynp.png | Bin 0 -> 14866 bytes deployment/media/aks_create.png | Bin 0 -> 30564 bytes deployment/media/aks_create_complete.png | Bin 0 -> 6199 bytes deployment/media/aks_create_start.png | Bin 0 -> 10144 bytes deployment/media/aks_dashboard.png | Bin 0 -> 15763 bytes deployment/media/aks_deploy_started.png | Bin 0 -> 19877 bytes deployment/media/aks_deploy_success.png | Bin 0 -> 14042 bytes deployment/media/aks_extension.png | Bin 0 -> 53694 bytes deployment/media/aks_host_mgmtconfirm.png | Bin 0 -> 3200 bytes deployment/media/aks_hostconfig_credssp.png | Bin 0 -> 13539 bytes .../media/aks_hostconfig_hostdetails.png | Bin 0 -> 5698 bytes .../aks_hostconfig_hostdetails_single.png | Bin 0 -> 7854 bytes deployment/media/aks_hostconfig_lb.png | Bin 0 -> 6628 bytes deployment/media/aks_hostconfig_vmnet.png | Bin 0 -> 17574 bytes deployment/media/aks_hostconfig_vmnet_int.png | Bin 0 -> 18852 bytes deployment/media/aks_in_arc.png | Bin 0 -> 55025 bytes deployment/media/aks_node_pools.png | Bin 0 -> 10676 bytes deployment/media/aks_runtime.png | Bin 0 -> 28264 bytes deployment/media/aks_virtual_networking.png | Bin 0 -> 14650 bytes deployment/media/akshci_config.png | Bin 0 -> 60419 bytes deployment/media/akshci_config_new.png | Bin 0 -> 6896 bytes .../media/akshci_powershell_folders.png | Bin 0 -> 14175 bytes deployment/media/akshci_wac_folders.png | Bin 0 -> 21176 bytes deployment/media/akshcievalguide.png | Bin 0 -> 55063 bytes deployment/media/akshcihost_in_wac.png | Bin 0 -> 19815 bytes deployment/media/allow_popup_edge.png | Bin 0 -> 4718 bytes deployment/media/auto_shutdown.png | Bin 0 -> 34986 bytes deployment/media/available_extensions.png | Bin 0 -> 20673 bytes deployment/media/azure_arm.png | Bin 0 -> 29181 bytes deployment/media/azure_blob_ga.png | Bin 0 -> 5405 bytes deployment/media/azure_cloud_witness_ga.png | Bin 0 -> 36062 bytes deployment/media/azure_keys_ga.png | Bin 0 -> 15119 bytes deployment/media/azure_login_reg.png | Bin 0 -> 16816 bytes deployment/media/azure_portal_hcicluster.png | Bin 0 -> 52665 bytes deployment/media/azure_subscriptions_ga.png | Bin 0 -> 12281 bytes deployment/media/azure_vm_custom_template.png | Bin 0 -> 59799 bytes .../azure_vm_custom_template_complete.png | Bin 0 -> 49719 bytes .../azure_vm_custom_template_completed.png | Bin 0 -> 63580 bytes .../media/azure_vm_custom_template_new.png | Bin 0 -> 41983 bytes deployment/media/azure_vm_search.png | Bin 0 -> 46695 bytes deployment/media/azure_vm_search_ga.png | Bin 0 -> 18103 bytes deployment/media/azure_vote_app.png | Bin 0 -> 21568 bytes deployment/media/connect_to_vm.png | Bin 0 -> 14918 bytes deployment/media/connect_to_vm_properties.png | Bin 0 -> 37862 bytes deployment/media/create_cluster_method1.png | Bin 0 -> 11476 bytes deployment/media/create_cluster_method2.png | Bin 0 -> 14782 bytes deployment/media/default_browser.png | Bin 0 -> 2433 bytes deployment/media/deployment_complete.png | Bin 0 -> 18199 bytes deployment/media/extension_update.png | Bin 0 -> 2960 bytes deployment/media/extension_update_needed.png | Bin 0 -> 13406 bytes deployment/media/flow_chart_ga.png | Bin 0 -> 10693 bytes .../media/get-dscconfigurationstatus.png | Bin 0 -> 16350 bytes .../media/get-dscconfigurationstatus2.png | Bin 0 -> 7697 bytes deployment/media/get_akshcicluster.png | Bin 0 -> 8632 bytes deployment/media/get_akshcicluster_2.png | Bin 0 -> 13074 bytes deployment/media/get_akshcicluster_3.png | Bin 0 -> 12670 bytes deployment/media/get_akshcicluster_new.png | Bin 0 -> 6398 bytes deployment/media/get_akshcicluster_wac.png | Bin 0 -> 7694 bytes deployment/media/get_akshcicluster_wac1.png | Bin 0 -> 9504 bytes deployment/media/get_akshcicluster_wac2.png | Bin 0 -> 8061 bytes deployment/media/get_akshcicluster_wac3.png | Bin 0 -> 8858 bytes deployment/media/get_akshcicred.png | Bin 0 -> 11927 bytes deployment/media/get_akshcicred_2.png | Bin 0 -> 11677 bytes .../media/get_akshcikubernetesversion.png | Bin 0 -> 6887 bytes deployment/media/get_akshcinodepool_wac.png | Bin 0 -> 15281 bytes deployment/media/get_module_functions.png | Bin 0 -> 170688 bytes deployment/media/get_net_nat.png | Bin 0 -> 14775 bytes deployment/media/grant_folder_permissions.png | Bin 0 -> 14490 bytes deployment/media/initialize_akshcinode.png | Bin 0 -> 31604 bytes deployment/media/install_akshci.png | Bin 0 -> 110248 bytes deployment/media/installed_extensions.png | Bin 0 -> 16165 bytes .../media/installed_extensions_cluster.png | Bin 0 -> 23146 bytes deployment/media/kubectl_apply.png | Bin 0 -> 5025 bytes deployment/media/kubectl_get_nodes.png | Bin 0 -> 8835 bytes deployment/media/kubectl_get_pods.png | Bin 0 -> 10895 bytes deployment/media/kubectl_get_pods_scaled.png | Bin 0 -> 9985 bytes deployment/media/kubectl_get_service.png | Bin 0 -> 7734 bytes deployment/media/kubectl_scale.png | Bin 0 -> 5804 bytes deployment/media/kubectl_service.png | Bin 0 -> 21426 bytes deployment/media/nested.png | Bin 0 -> 42889 bytes deployment/media/nested_virt.png | Bin 0 -> 137872 bytes deployment/media/nested_virt_akshci_ga.png | Bin 0 -> 122736 bytes deployment/media/nested_virt_arch_ga.png | Bin 0 -> 122329 bytes .../media/nested_virt_arch_ga_oct21.png | Bin 0 -> 196512 bytes deployment/media/nested_virt_nodes_ga.png | Bin 0 -> 122317 bytes deployment/media/new_akshcicluster.png | Bin 0 -> 69971 bytes deployment/media/new_security_rule.png | Bin 0 -> 24759 bytes deployment/media/powershell_vm_deployed.png | Bin 0 -> 14678 bytes deployment/media/reg_check.png | Bin 0 -> 21423 bytes deployment/media/register_azshci_ga.png | Bin 0 -> 31338 bytes deployment/media/register_wac_azure.png | Bin 0 -> 12397 bytes deployment/media/registration_rg_ga.png | Bin 0 -> 8623 bytes deployment/media/registration_status.png | Bin 0 -> 56216 bytes deployment/media/vm_connect_ga.png | Bin 0 -> 11305 bytes deployment/media/vm_deployment_error.png | Bin 0 -> 36555 bytes deployment/media/wac_azshciclus_ga.png | Bin 0 -> 16607 bytes .../media/wac_azure_arc_register_error.png | Bin 0 -> 6860 bytes deployment/media/wac_azure_connect (1).png | Bin 0 -> 35025 bytes deployment/media/wac_azure_connect (2).png | Bin 0 -> 37997 bytes deployment/media/wac_azure_connect.png | Bin 0 -> 38222 bytes deployment/media/wac_azure_key_ga.png | Bin 0 -> 17323 bytes deployment/media/wac_azure_permissions.png | Bin 0 -> 23900 bytes deployment/media/wac_azure_reg_dashboard.png | Bin 0 -> 5673 bytes .../media/wac_azure_reg_dashboard_2.png | Bin 0 -> 3501 bytes .../media/wac_azure_reg_dashboard_3.png | Bin 0 -> 3300 bytes deployment/media/wac_azure_register.png | Bin 0 -> 6777 bytes deployment/media/wac_azuread_confirm.png | Bin 0 -> 44113 bytes deployment/media/wac_azuread_grant.png | Bin 0 -> 67200 bytes deployment/media/wac_azureadapp.png | Bin 0 -> 19583 bytes deployment/media/wac_check_drives_ga.png | Bin 0 -> 39795 bytes deployment/media/wac_clean_drives_ga.png | Bin 0 -> 44697 bytes deployment/media/wac_cloud_witness_new_ga.png | Bin 0 -> 12373 bytes deployment/media/wac_cluster_success_ga.png | Bin 0 -> 20638 bytes deployment/media/wac_cluster_type_ga.png | Bin 0 -> 26949 bytes deployment/media/wac_compute_vswitch_ga.png | Bin 0 -> 6266 bytes deployment/media/wac_create_clus_dhcp_ga.png | Bin 0 -> 20218 bytes .../media/wac_create_clus_static_ga.png | Bin 0 -> 27492 bytes deployment/media/wac_credssp_ga.png | Bin 0 -> 9844 bytes deployment/media/wac_define_network_ga.png | Bin 0 -> 33021 bytes deployment/media/wac_domain_joined_ga.png | Bin 0 -> 22192 bytes deployment/media/wac_enable_dedup_ga.png | Bin 0 -> 45885 bytes deployment/media/wac_enable_rdma.png | Bin 0 -> 14575 bytes deployment/media/wac_fs_witness_new_ga.png | Bin 0 -> 16012 bytes deployment/media/wac_host_config.png | Bin 0 -> 34365 bytes deployment/media/wac_installed.png | Bin 0 -> 13112 bytes .../media/wac_installed_features_ga.png | Bin 0 -> 43884 bytes deployment/media/wac_management_nic_ga.png | Bin 0 -> 22481 bytes deployment/media/wac_move_ga.png | Bin 0 -> 15860 bytes deployment/media/wac_restart_ga.png | Bin 0 -> 32047 bytes deployment/media/wac_s2d_enabled_ga.png | Bin 0 -> 35000 bytes deployment/media/wac_singlemgmt_ga.png | Bin 0 -> 18855 bytes deployment/media/wac_storage_validated_ga.png | Bin 0 -> 47426 bytes deployment/media/wac_system_checks.png | Bin 0 -> 28457 bytes deployment/media/wac_system_checks_single.png | Bin 0 -> 21866 bytes deployment/media/wac_teamedmgmt_ga.png | Bin 0 -> 31592 bytes deployment/media/wac_validate_storage_ga.png | Bin 0 -> 29646 bytes deployment/media/wac_validated_ga.png | Bin 0 -> 28008 bytes deployment/media/wac_verify_network_ga.png | Bin 0 -> 51577 bytes deployment/media/wac_vm001_ga.png | Bin 0 -> 14897 bytes .../media/wac_vm_storage_deployed_ga.png | Bin 0 -> 17109 bytes deployment/media/wac_vm_storage_ga.png | Bin 0 -> 10039 bytes deployment/media/wac_vswitches_ga.png | Bin 0 -> 42532 bytes deployment/scripts/installWac.ps1 | 11 + deployment/steps/1_DeployAzureVM.md | 233 + deployment/steps/2_DeployAzSHCI.md | 314 ++ deployment/steps/3_AzSHCIIntegration.md | 348 ++ deployment/steps/4_ExploreAzSHCI.md | 178 + nested/steps/1b_NestedInAzure.md | 412 -- 1199 files changed, 143239 insertions(+), 579 deletions(-) rename {nested => archive}/README.md (69%) rename {nested => archive}/json/azshcilabvm.json (100%) rename {media => archive/media}/Login-AzAccount.png (100%) rename {media => archive/media}/New-AzRoleAssignment.png (100%) rename {media => archive/media}/New-AzRoleDefinition.png (100%) rename {media => archive/media}/aad_permissions.png (100%) rename {media => archive/media}/add_nodes.png (100%) rename {media => archive/media}/add_nodes_ga.png (100%) rename {media => archive/media}/adds_group.png (100%) rename {media => archive/media}/adds_new_user.png (100%) rename {media => archive/media}/adds_prereq.png (100%) rename {media => archive/media}/adds_wizard.png (100%) rename {media => archive/media}/api_permissions.png (100%) rename {media => archive/media}/api_permissions_ga.png (100%) rename {media => archive/media}/auto_shutdown.png (100%) rename {media => archive/media}/azshci_data_disk.png (100%) rename {media => archive/media}/azshci_disks_added.png (100%) rename {media => archive/media}/azshci_disks_added_ga.png (100%) rename {media => archive/media}/azshci_laptop.png (100%) rename {media => archive/media}/azshci_settings_ps.png (100%) rename {media => archive/media}/azshci_settings_ps_ga.png (100%) rename {media => archive/media}/azshci_setup.png (100%) rename {media => archive/media}/azshci_setup_complete.png (100%) rename {media => archive/media}/azure_ad_app.png (100%) rename {media => archive/media}/azure_ad_app_ga.png (100%) rename {media => archive/media}/azure_arm.png (100%) rename {media => archive/media}/azure_blob.png (100%) rename {media => archive/media}/azure_blob_ga.png (100%) rename {media => archive/media}/azure_cloud_witness.png (100%) rename {media => archive/media}/azure_cloud_witness_ga.png (100%) rename {media => archive/media}/azure_keys.png (100%) rename {media => archive/media}/azure_keys_ga.png (100%) rename {media => archive/media}/azure_login_reg.png (100%) rename {media => archive/media}/azure_portal_hcicluster.png (100%) rename {media => archive/media}/azure_subscriptions.png (100%) rename {media => archive/media}/azure_subscriptions_ga.png (100%) rename {media => archive/media}/azure_vm_custom_template.png (100%) rename {media => archive/media}/azure_vm_custom_template_complete.png (100%) rename {media => archive/media}/azure_vm_search.png (100%) rename {media => archive/media}/azure_vm_search_ga.png (100%) rename {media => archive/media}/boot_from_dvd.png (100%) rename {media => archive/media}/connect_to_mgmt01.png (100%) rename {media => archive/media}/connect_to_vm.png (100%) rename {media => archive/media}/connect_to_vm_properties.png (100%) rename {media => archive/media}/dc_created.png (100%) rename {media => archive/media}/dc_install_progress.png (100%) rename {media => archive/media}/dc_nic.png (100%) rename {media => archive/media}/dhcp_complete.png (100%) rename {media => archive/media}/dhcp_dns.png (100%) rename {media => archive/media}/dhcp_enabled.png (100%) rename {media => archive/media}/dhcp_scope.png (100%) rename {media => archive/media}/download_files.png (100%) rename {media => archive/media}/dynamicmem.png (100%) rename {media => archive/media}/dynamicmem_mgmt01.png (100%) rename {media => archive/media}/enable_nested.png (100%) rename {media => archive/media}/enhanced_session.png (100%) rename {media => archive/media}/extension_update.png (100%) rename {media => archive/media}/extension_update_needed.png (100%) rename {media => archive/media}/flow_chart_ga.png (100%) create mode 100644 archive/media/flow_chart_ga_oct21.png rename {media => archive/media}/flow_chart_paths_old.png (100%) rename {media => archive/media}/get_net_nat.png (100%) rename {media => archive/media}/ie_enhanced.png (100%) rename {media => archive/media}/instaill_rsat.png (100%) rename {media => archive/media}/ip_settings.PNG (100%) rename {media => archive/media}/nested.png (100%) rename {media => archive/media}/nested_virt.png (100%) rename {media => archive/media}/nested_virt_arch.png (100%) rename {media => archive/media}/nested_virt_arch_ga.png (100%) rename {media => archive/media}/nested_virt_mgmt.png (100%) rename {media => archive/media}/nested_virt_mgmt_ga.png (100%) rename {media => archive/media}/nested_virt_nodes.png (100%) rename {media => archive/media}/nested_virt_nodes_ga.png (100%) rename {media => archive/media}/nested_virt_physical.png (100%) rename {media => archive/media}/nested_virt_physical_ga.png (100%) rename {media => archive/media}/new_vm_dynamicmem.png (100%) rename {media => archive/media}/new_vm_mgmt01.png (100%) rename {media => archive/media}/new_vm_mgmt01_vhd.png (100%) rename {media => archive/media}/new_vm_mgmt01_vhd_ga.png (100%) rename {media => archive/media}/new_vm_name.png (100%) rename {media => archive/media}/new_vm_node.png (100%) rename {media => archive/media}/new_vm_node_memory.png (100%) rename {media => archive/media}/new_vm_node_memory_ga.png (100%) rename {media => archive/media}/new_vm_node_settings.png (100%) rename {media => archive/media}/new_vm_node_settings_ga.png (100%) rename {media => archive/media}/new_vm_node_vhd.png (100%) rename {media => archive/media}/new_vm_vhd.png (100%) rename {media => archive/media}/nic_adapter.png (100%) rename {media => archive/media}/node_ipconfig.png (100%) rename {media => archive/media}/node_turned_off.png (100%) rename {media => archive/media}/physical.png (100%) rename {media => archive/media}/powershell_vm_deployed.png (100%) rename {media => archive/media}/reg_check.png (100%) rename {media => archive/media}/reg_check_ga.png (100%) rename {media => archive/media}/register_azshci.png (100%) rename {media => archive/media}/register_azshci_ga.png (100%) rename {media => archive/media}/registration_record.png (100%) rename {media => archive/media}/registration_rg.png (100%) rename {media => archive/media}/registration_rg_ga.png (100%) rename {media => archive/media}/registration_status.png (100%) rename {media => archive/media}/sconfig.png (100%) rename {media => archive/media}/sconfig_nic.png (100%) rename {media => archive/media}/startvm.png (100%) rename {media => archive/media}/startvm_mgmt01.png (100%) rename {media => archive/media}/sysdm.png (100%) rename {media => archive/media}/systeminfo_upd.png (100%) rename {media => archive/media}/vm_connect.png (100%) rename {media => archive/media}/vm_connect_ga.png (100%) rename {media => archive/media}/w10_install_complete.png (100%) rename {media => archive/media}/w10_setup.png (100%) rename {media => archive/media}/wac_azshciclus.png (100%) rename {media => archive/media}/wac_azshciclus_ga.png (100%) rename {media => archive/media}/wac_azure_connect.png (100%) rename {media => archive/media}/wac_azure_key.png (100%) rename {media => archive/media}/wac_azure_key_ga.png (100%) rename {media => archive/media}/wac_azure_permissions.png (100%) rename {media => archive/media}/wac_azure_reg_dashboard.png (100%) rename {media => archive/media}/wac_azure_reg_dashboard_2.png (100%) rename {media => archive/media}/wac_azure_reg_dashboard_3.png (100%) rename {media => archive/media}/wac_azure_register.png (100%) rename {media => archive/media}/wac_check_drives_ga.png (100%) rename {media => archive/media}/wac_clean_drives.png (100%) rename {media => archive/media}/wac_clean_drives_ga.png (100%) rename {media => archive/media}/wac_cloud_witness_new.png (100%) rename {media => archive/media}/wac_cloud_witness_new_ga.png (100%) rename {media => archive/media}/wac_cluster_success.png (100%) rename {media => archive/media}/wac_cluster_success_ga.png (100%) rename {media => archive/media}/wac_cluster_type.png (100%) rename {media => archive/media}/wac_cluster_type_ga.png (100%) rename {media => archive/media}/wac_compute_vswitch.png (100%) rename {media => archive/media}/wac_compute_vswitch_ga.png (100%) rename {media => archive/media}/wac_create_clus.png (100%) rename {media => archive/media}/wac_create_clus_ga.png (100%) rename {media => archive/media}/wac_credssp.png (100%) rename {media => archive/media}/wac_credssp_ga.png (100%) rename {media => archive/media}/wac_define_network.png (100%) rename {media => archive/media}/wac_define_network_ga.png (100%) rename {media => archive/media}/wac_domain_joined.png (100%) rename {media => archive/media}/wac_domain_joined_ga.png (100%) rename {media => archive/media}/wac_enable_dedup.png (100%) rename {media => archive/media}/wac_enable_dedup_ga.png (100%) rename {media => archive/media}/wac_enable_rdma.png (100%) rename {media => archive/media}/wac_installed.png (100%) rename {media => archive/media}/wac_installed_features.png (100%) rename {media => archive/media}/wac_installed_features_ga.png (100%) rename {media => archive/media}/wac_management_nic.png (100%) rename {media => archive/media}/wac_management_nic_ga.png (100%) rename {media => archive/media}/wac_move.png (100%) rename {media => archive/media}/wac_move_ga.png (100%) rename {media => archive/media}/wac_nic_selection.png (100%) rename {media => archive/media}/wac_restart.png (100%) rename {media => archive/media}/wac_restart_ga.png (100%) rename {media => archive/media}/wac_s2d_enabled.png (100%) rename {media => archive/media}/wac_s2d_enabled_ga.png (100%) rename {media => archive/media}/wac_singlemgmt.png (100%) rename {media => archive/media}/wac_singlemgmt_ga.png (100%) rename {media => archive/media}/wac_storage_validated.png (100%) rename {media => archive/media}/wac_storage_validated_ga.png (100%) rename {media => archive/media}/wac_validate_storage.png (100%) rename {media => archive/media}/wac_validate_storage_ga.png (100%) rename {media => archive/media}/wac_validated.png (100%) rename {media => archive/media}/wac_validated_ga.png (100%) rename {media => archive/media}/wac_verify_drives.png (100%) rename {media => archive/media}/wac_verify_network.png (100%) rename {media => archive/media}/wac_verify_network_ga.png (100%) rename {media => archive/media}/wac_vm001.png (100%) rename {media => archive/media}/wac_vm001_ga.png (100%) rename {media => archive/media}/wac_vm_storage.png (100%) rename {media => archive/media}/wac_vm_storage_deployed.png (100%) rename {media => archive/media}/wac_vm_storage_deployed_ga.png (100%) rename {media => archive/media}/wac_vm_storage_ga.png (100%) rename {media => archive/media}/wac_vswitches.png (100%) rename {media => archive/media}/wac_vswitches_ga.png (100%) rename {media => archive/media}/ws_install_complete.png (100%) rename {media => archive/media}/ws_setup.png (100%) rename nested/steps/1a_NestedOnPhysical.md => archive/steps/1_NestedOnPhysical.md (96%) rename {nested => archive}/steps/2a_ManagementInfraGUI.md (88%) rename {nested => archive}/steps/2b_ManagementInfraPS.md (95%) rename {nested => archive}/steps/3a_AzSHCINodesGUI.md (89%) rename {nested => archive}/steps/3b_AzSHCINodesPS.md (96%) rename {nested => archive}/steps/4_AzSHCICluster.md (87%) rename {nested => archive}/steps/5_ExploreAzSHCI.md (94%) create mode 100644 deployment/dsc/azshcihost.zip create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/ActiveDirectoryDsc.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/MSFT_ADComputer.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/MSFT_ADComputer.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/en-US/MSFT_ADComputer.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/en-US/about_ADComputer.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/MSFT_ADDomain.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/MSFT_ADDomain.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/en-US/MSFT_ADDomain.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/en-US/about_ADDomain.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/MSFT_ADDomainController.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/MSFT_ADDomainController.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/en-US/MSFT_ADDomainController.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/en-US/about_ADDomainController.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/MSFT_ADDomainControllerProperties.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/MSFT_ADDomainControllerProperties.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/en-US/MSFT_ADDomainControllerProperties.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/en-US/about_ADDomainControllerProperties.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/MSFT_ADDomainDefaultPasswordPolicy.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/MSFT_ADDomainDefaultPasswordPolicy.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/en-US/MSFT_ADDomainDefaultPasswordPolicy.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/en-US/about_ADDomainDefaultPasswordPolicy.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/MSFT_ADDomainFunctionalLevel.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/MSFT_ADDomainFunctionalLevel.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/en-US/MSFT_ADDomainFunctionalLevel.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/en-US/about_ADDomainFunctionalLevel.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/MSFT_ADDomainTrust.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/MSFT_ADDomainTrust.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/en-US/MSFT_ADDomainTrust.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/en-US/about_ADDomainTrust.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/MSFT_ADForestFunctionalLevel.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/MSFT_ADForestFunctionalLevel.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/en-US/MSFT_ADForestFunctionalLevel.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/en-US/about_ADForestFunctionalLevel.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/MSFT_ADForestProperties.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/MSFT_ADForestProperties.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/en-US/MSFT_ADForestProperties.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/en-US/about_ADForestProperties.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/MSFT_ADGroup.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/MSFT_ADGroup.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/en-US/MSFT_ADGroup.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/en-US/about_ADGroup.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/MSFT_ADKDSKey.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/MSFT_ADKDSKey.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/en-US/MSFT_ADKDSKey.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/en-US/about_ADKDSKey.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/MSFT_ADManagedServiceAccount.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/MSFT_ADManagedServiceAccount.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/en-US/MSFT_ADManagedServiceAccount.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/en-US/about_ADManagedServiceAccount.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/MSFT_ADObjectEnabledState.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/MSFT_ADObjectEnabledState.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/en-US/MSFT_ADObjectEnabledState.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/en-US/about_ADObjectEnabledState.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/MSFT_ADObjectPermissionEntry.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/MSFT_ADObjectPermissionEntry.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/en-US/MSFT_ADObjectPermissionEntry.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/en-US/about_ADObjectPermissionEntry.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/MSFT_ADOptionalFeature.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/MSFT_ADOptionalFeature.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/en-US/MSFT_ADOptionalFeature.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/en-US/about_ADOptionalFeature.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/en-US/MSFT_ADOrganizationalUnit.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/en-US/about_ADOrganizationalUnit.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/MSFT_ADReplicationSite.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/MSFT_ADReplicationSite.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/en-US/MSFT_ADReplicationSite.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/en-US/about_ADReplicationSite.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/MSFT_ADReplicationSiteLink.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/MSFT_ADReplicationSiteLink.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/en-US/MSFT_ADReplicationSiteLink.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/en-US/about_ADReplicationSiteLink.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/MSFT_ADReplicationSubnet.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/MSFT_ADReplicationSubnet.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/en-US/MSFT_ADReplicationSubnet.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/en-US/about_ADReplicationSubnet.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/MSFT_ADServicePrincipalName.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/MSFT_ADServicePrincipalName.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/en-US/MSFT_ADServicePrincipalName.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/en-US/about_ADServicePrincipalName.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.PropertyMap.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/en-US/MSFT_ADUser.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/en-US/about_ADUser.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/MSFT_WaitForADDomain.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/MSFT_WaitForADDomain.schema.mof create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/README.md create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/en-US/MSFT_WaitForADDomain.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/en-US/about_WaitForADDomain.help.txt create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psm1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/en-US/ActiveDirectoryDsc.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/PSGetModuleInfo.xml create mode 100644 deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/en-US/about_ActiveDirectoryDsc.help.txt create mode 100644 deployment/dsc/azshcihost/AzSHCIHost.ps1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/ComputerManagementDsc.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/DSC_Computer.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/DSC_Computer.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/en-US/DSC_Computer.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/DSC_IEEnhancedSecurityConfiguration.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/DSC_IEEnhancedSecurityConfiguration.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/en-US/DSC_IEEnhancedSecurityConfiguration.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/DSC_OfflineDomainJoin.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/DSC_OfflineDomainJoin.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/en-US/DSC_OfflineDomainJoin.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/DSC_PendingReboot.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/DSC_PendingReboot.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/en-US/DSC_PendingReboot.data.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/en-US/DSC_PendingReboot.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/DSC_PowerPlan.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/DSC_PowerPlan.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/en-US/DSC_PowerPlan.schema.mfl create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/en-US/DSC_PowerPlan.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/DSC_PowerShellExecutionPolicy.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/DSC_PowerShellExecutionPolicy.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/en-US/DSC_PowerShellExecutionPolicy.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/DSC_RemoteDesktopAdmin.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/DSC_RemoteDesktopAdmin.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/en-US/DSC_RemoteDesktopAdmin.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/DSC_ScheduledTask.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/DSC_ScheduledTask.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/en-US/DSC_ScheduledTask.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.data.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/en-US/DSC_SmbServerConfiguration.schema.mfl create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/en-US/DSC_SmbServerConfiguration.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/DSC_SmbShare.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/DSC_SmbShare.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/en-US/DSC_SmbShare.schema.mfl create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/en-US/DSC_SmbShare.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/DSC_SystemLocale.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/DSC_SystemLocale.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/en-US/DSC_SystemLocale.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/DSC_TimeZone.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/DSC_TimeZone.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/en-US/DSC_TimeZone.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/DSC_UserAccountControl.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/DSC_UserAccountControl.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/en-US/DSC_UserAccountControl.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/DSC_VirtualMemory.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/DSC_VirtualMemory.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/en-US/DSC_VirtualMemory.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/DSC_WindowsCapability.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/DSC_WindowsCapability.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/en-US/DSC_WindowsCapability.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/DSC_WindowsEventLog.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/DSC_WindowsEventLog.schema.mof create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/README.md create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/en-US/DSC_WindowsEventLog.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/ComputerManagementDsc.Common.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/SetTimeZone.cs create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/en-US/ComputerManagementDsc.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt create mode 100644 deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/en-US/about_ComputerManagementDsc.help.txt create mode 100644 deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCR_Shortcut.psd1 create mode 100644 deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCResources/cShortcut/cShortcut.psm1 create mode 100644 deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCResources/cShortcut/cShortcut.schema.mof create mode 100644 deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/LICENSE create mode 100644 deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/Libs/ShellLink/ShellLink.cs create mode 100644 deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/Libs/VKeyUtil/VKeyUtil.cs create mode 100644 deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/DSC_DnsServerADZone.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/DSC_DnsServerADZone.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/en-US/DSC_DnsServerADZone.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/en-US/about_DnsServerADZone.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/DSC_DnsServerClientSubnet.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/DSC_DnsServerClientSubnet.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/en-US/DSC_DnsServerClientSubnet.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/en-US/about_DnsServerClientSubnet.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/DSC_DnsServerConditionalForwarder.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/DSC_DnsServerConditionalForwarder.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/en-US/DSC_DnsServerConditionalForwarder.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/en-US/about_DnsServerConditionalForwarder.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/DSC_DnsServerDiagnostics.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/DSC_DnsServerDiagnostics.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/en-US/DSC_DnsServerDiagnostics.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/en-US/about_DnsServerDiagnostics.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/DSC_DnsServerForwarder.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/DSC_DnsServerForwarder.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/en-US/DSC_DnsServerForwarder.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/en-US/about_DnsServerForwarder.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/DSC_DnsServerPrimaryZone.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/DSC_DnsServerPrimaryZone.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/en-US/DSC_DnsServerPrimaryZone.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/en-US/about_DnsServerPrimaryZone.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/DSC_DnsServerRootHint.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/DSC_DnsServerRootHint.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/en-US/DSC_DnsServerRootHint.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/en-US/about_DnsServerRootHint.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/DSC_DnsServerSecondaryZone.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/DSC_DnsServerSecondaryZone.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/en-US/DSC_DnsServerSecondaryZone.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/en-US/about_DnsServerSecondaryZone.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/DSC_DnsServerSetting.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/DSC_DnsServerSetting.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/en-US/DSC_DnsServerSetting.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/en-US/about_DnsServerSetting.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/DSC_DnsServerSettingLegacy.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/DSC_DnsServerSettingLegacy.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/en-US/DSC_DnsServerSettingLegacy.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/en-US/about_DnsServerSettingLegacy.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/DSC_DnsServerZoneAging.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/DSC_DnsServerZoneAging.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/en-US/DSC_DnsServerZoneAging.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/en-US/about_DnsServerZoneAging.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/DSC_DnsServerZoneScope.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/DSC_DnsServerZoneScope.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/en-US/DSC_DnsServerZoneScope.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/en-US/about_DnsServerZoneScope.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/DSC_DnsServerZoneTransfer.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/DSC_DnsServerZoneTransfer.schema.mof create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/README.md create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/en-US/DSC_DnsServerZoneTransfer.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/en-US/about_DnsServerZoneTransfer.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DnsServerDsc.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DnsServerDsc.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/DnsServerDsc.Common.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/DnsServerDsc.Common.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/en-US/DnsServerDsc.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/DscResource.Common.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/DscResource.Common.psm1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/en-US/DscResource.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/en-US/about_DscResource.Common.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/PSGetModuleInfo.xml create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordA.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAScoped.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAaaa.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAaaaScoped.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordBase.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordCname.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordCnameScoped.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordMx.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordMxScoped.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordNs.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordNsScoped.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordPtr.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordSrv.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordSrvScoped.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerCache.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerDsSetting.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerDsc.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerEDns.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerRecursion.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerScavenging.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/ResourceBase.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/ResourcePropertiesBase.strings.psd1 create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordA.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAScoped.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAaaa.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAaaaScoped.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordCname.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordCnameScoped.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordMx.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordMxScoped.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordNs.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordNsScoped.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordPtr.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordSrv.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordSrvScoped.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerCache.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerDsSetting.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerDsc.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerEDns.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerRecursion.help.txt create mode 100644 deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerScavenging.help.txt create mode 100644 deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Convert-WindowsImage.ps1 create mode 100644 deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Hyper-ConvertImage.psd1 create mode 100644 deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Hyper-ConvertImage.psm1 create mode 100644 deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/PSGetModuleInfo.xml create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Classes/MSCatalogResponse.Class.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Classes/MSCatalogUpdate.Class.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Format/MSCatalogUpdate.Format.ps1xml create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/MSCatalog.psd1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/MSCatalog.psm1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/PSGetModuleInfo.xml create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Get-UpdateLinks.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-CatalogRequest.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-DownloadFile.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-ParseDate.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Sort-CatalogResults.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Public/Get-MSCatalogUpdate.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Public/Save-MSCatalogUpdate.ps1 create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Types/Net45/HtmlAgilityPack.dll create mode 100644 deployment/dsc/azshcihost/MSCatalog/0.21.0/Types/netstandard2.0/HtmlAgilityPack.dll create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/DSC_DefaultGatewayAddress.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/DSC_DefaultGatewayAddress.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/README.md create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/en-US/DSC_DefaultGatewayAddress.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/en-US/about_DefaultGatewayAddress.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.data.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/en-US/DSC_DnsClientGlobalSetting.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/en-US/about_DnsClientGlobalSetting.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/DSC_DnsConnectionSuffix.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/DSC_DnsConnectionSuffix.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/en-US/DSC_DnsConnectionSuffix.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/en-US/about_DnsConnectionSuffix.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/DSC_DnsServerAddress.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/DSC_DnsServerAddress.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/en-US/DSC_DnsServerAddress.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/en-US/about_DnsServerAddress.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.data.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/en-US/DSC_Firewall.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/en-US/about_Firewall.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.data.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/en-US/DSC_FirewallProfile.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/en-US/about_FirewallProfile.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/DSC_HostsFile.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/DSC_HostsFile.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/en-US/DSC_HostsFile.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/en-US/about_HostsFile.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/DSC_IPAddress.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/DSC_IPAddress.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/en-US/DSC_IPAddress.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/en-US/about_IPAddress.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/DSC_IPAddressOption.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/DSC_IPAddressOption.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/en-US/DSC_IPAddressOption.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/en-US/about_IPAddressOption.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/DSC_NetAdapterAdvancedProperty.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/DSC_NetAdapterAdvancedProperty.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/en-US/DSC_NetAdapterAdvancedProperty.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/en-US/about_NetAdapterAdvancedProperty.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/DSC_NetAdapterBinding.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/DSC_NetAdapterBinding.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/en-US/DSC_NetAdapterBinding.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/en-US/about_NetAdapterBinding.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/DSC_NetAdapterLso.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/DSC_NetAdapterLso.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/en-US/DSC_NetAdapterLso.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/en-US/about_NetAdapterLso.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/DSC_NetAdapterName.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/DSC_NetAdapterName.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/en-US/DSC_NetAdapterName.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/en-US/about_NetAdapterName.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/DSC_NetAdapterRdma.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/DSC_NetAdapterRdma.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/en-US/DSC_NetAdapterRdma.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/en-US/about_NetAdapterRdma.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/DSC_NetAdapterRSC.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/DSC_NetAdapterRsc.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/en-US/DSC_NetAdapterRsc.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/en-US/about_NetAdapterRsc.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/DSC_NetAdapterRss.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/DSC_NetAdapterRss.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/en-US/DSC_NetAdapterRss.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/en-US/about_NetAdapterRss.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/DSC_NetAdapterState.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/DSC_NetAdapterState.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/en-US/DSC_NetAdapterState.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/en-US/about_NetAdapterState.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/DSC_NetBios.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/DSC_NetBios.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/en-US/DSC_NetBios.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/en-US/about_NetBios.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/DSC_NetConnectionProfile.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/DSC_NetConnectionProfile.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/en-US/DSC_NetConnectionProfile.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/en-US/about_NetConnectionProfile.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.data.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/en-US/DSC_NetIPInterface.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/en-US/about_NetIPInterface.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/DSC_NetworkTeam.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/DSC_NetworkTeam.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/en-US/DSC_NetworkTeam.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/en-US/about_NetworkTeam.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/DSC_NetworkTeamInterface.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/DSC_NetworkTeamInterface.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/en-US/DSC_NetworkTeamInterface.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/en-US/about_NetworkTeamInterface.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/DSC_ProxySettings.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/DSC_ProxySettings.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/README.md create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/en-US/DSC_ProxySettings.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/en-US/about_ProxySettings.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/DSC_Route.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/DSC_Route.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/en-US/DSC_Route.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/en-US/about_Route.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/DSC_WaitForNetworkTeam.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/DSC_WaitForNetworkTeam.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/README.md create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/en-US/DSC_WaitForNetworkTeam.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/en-US/about_WaitForNetworkTeam.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/DSC_WinsServerAddress.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/DSC_WinsServerAddress.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/en-US/DSC_WinsServerAddress.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/en-US/about_WinsServerAddress.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/DSC_WinsSetting.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/DSC_WinsSetting.schema.mof create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/README.MD create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/en-US/DSC_WinsSetting.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/en-US/about_WinsSetting.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/NetworkingDsc.Common/NetworkingDsc.Common.psm1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/NetworkingDsc.Common/en-US/NetworkingDsc.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/NetworkingDsc.psd1 create mode 100644 deployment/dsc/azshcihost/NetworkingDsc/8.2.0/en-US/about_NetworkingDsc.help.txt create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/DSC_Disk.psm1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/DSC_Disk.schema.mof create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/README.md create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/en-US/DSC_Disk.strings.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/DSC_DiskAccessPath.psm1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/DSC_DiskAccessPath.schema.mof create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/README.md create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/en-US/DSC_DiskAccessPath.strings.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/DSC_MountImage.psm1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/DSC_MountImage.schema.mof create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/README.md create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/en-US/DSC_MountImage.strings.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/DSC_OpticalDiskDriveLetter.psm1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/DSC_OpticalDiskDriveLetter.schema.mof create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/README.md create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/en-US/DSC_OpticalDiskDriveLetter.strings.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/DSC_WaitForDisk.psm1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/DSC_WaitForDisk.schema.mof create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/README.md create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/en-US/DSC_WaitForDisk.strings.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/DSC_WaitForVolume.psm1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/DSC_WaitForVolume.schema.mof create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/README.md create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/en-US/DSC_WaitForVolume.strings.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/StorageDsc.Common/StorageDsc.Common.psm1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/StorageDsc.Common/en-US/StorageDsc.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/PSGetModuleInfo.xml create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/StorageDsc.psd1 create mode 100644 deployment/dsc/azshcihost/StorageDsc/5.0.1/en-US/about_StorageDsc.help.txt create mode 100644 deployment/dsc/azshcihost/WindowsDeploymentHelper/0.0.1/WindowsDeploymentHelper.psd1 create mode 100644 deployment/dsc/azshcihost/WindowsDeploymentHelper/0.0.1/WindowsDeploymentHelper.psm1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Add-UpdateImage.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Convert-Wim2VHD.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Get-VhdPartitionStyle.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/HelperFunctions.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Initialize-VHDPartition.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Invoke-CreateVmRunAndWait.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Invoke-WindowsImageUpdate.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Mount-VhdAndRunBlock.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/New-Unattend.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/New-WindowsImageToolsExample.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Set-UpdateConfig.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Set-VHDPartition.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Update-WindowsImageWMF.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Wim2VhdClass.ps1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/WindowsImageTools.psd1 create mode 100644 deployment/dsc/azshcihost/WindowsImageTools/1.0.7/WindowsImageTools.psm1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorBuild.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorDeploy.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorInstall.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorTest.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoConfig/cChocoConfig.psm1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoConfig/cChocoConfig.schema.mof create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoFeature/cChocoFeature.psm1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoFeature/cChocoFeature.schema.mof create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoInstaller/cChocoInstaller.psm1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoInstaller/cChocoInstaller.schema.mof create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstall/cChocoPackageInstall.psm1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstall/cChocoPackageInstall.schema.mof create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstallerSet/cChocoPackageInstallerSet.psd1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstallerSet/cChocoPackageInstallerSet.schema.psm1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoSource/cChocoSource.psm1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoSource/cChocoSource.schema.mof create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/ExampleConfig.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoConfigExample.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoFeatureExample.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoInstaller_cChocoInstallerExample.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoInstaller_cChocoPackageInstallExample.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/LICENSE create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/NOTICE create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/PSGetModuleInfo.xml create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoConfig_Tests.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoFeature_Tests.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoInstaller_Tests.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoPackageInstall_Tests.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChoco_ScriptAnalyzerTests.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChoco_xDscResourceTests.ps1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/TestsResults.xml create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/appveyor.yml create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/cChoco.psd1 create mode 100644 deployment/dsc/azshcihost/cChoco/2.5.0.0/readme.md create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/README.md create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/cVMIPAddress.psm1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/cVMIPAddress.schema.mof create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/en-US/cVMIPAddress.psd1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/Readme.md create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/cVMNetworkAdapter.psm1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/cVMNetworkAdapter.schema.mof create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/en-US/cVMNetworkAdapter.psd1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/README.md create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/cVMNetworkAdapterSettings.psm1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/cVMNetworkAdapterSettings.schema.mof create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/en-US/cVMNetworkAdapterSettings.psd1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/Readme.md create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/cVMNetworkAdapterVlan.psm1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/cVMNetworkAdapterVlan.schema.mof create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/en-US/cVMNetworkAdapterVlan.psd1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/README.md create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/cVMSwitch.psm1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/cVMSwitch.schema.mof create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/en-US/cVMSwitch.psd1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/README.md create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/cWaitForVMGuestIntegration.psm1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/cWaitForVMGuestIntegration.schema.mof create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/en-US/cWaitForVMGuestIntegration.psd1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMIPAddress/ResetIPAddress.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMIPAddress/SetIPAddress.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterManagementOS.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleManagementOS.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleVM.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleVMMACAddress.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsManagementOS.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsVMMultiple.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsVMSimple.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanManagementOS.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanMultipleManagementOS.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanMultipleVM.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/HostTeamSwitch.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/InternalSwitch.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/NetAdapterSwitch.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/PrivateSwitch.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/SETTeamSwitch.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cWaitForVMIntegrationComponent/WaitForIntegrationComponentCustom.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cWaitForVMIntegrationComponent/WaitForIntegrationComponentDefault.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/SwitchEmbeddedTeamingWithHostNetworkAdapter/SETTeamWithHostNetworkAdapters.Example.ps1 create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/README.md create mode 100644 deployment/dsc/azshcihost/cHyper-V/3.0.0.0/cHyper-V.psd1 create mode 100644 deployment/dsc/azshcihost/dscmetadata.json create mode 100644 deployment/dsc/azshcihost/xCredSSP/1.3.0.0/DSCResources/MSFT_xCredSSP/MSFT_xCredSSP.psm1 create mode 100644 deployment/dsc/azshcihost/xCredSSP/1.3.0.0/DSCResources/MSFT_xCredSSP/MSFT_xCredSSP.schema.mof create mode 100644 deployment/dsc/azshcihost/xCredSSP/1.3.0.0/LICENSE create mode 100644 deployment/dsc/azshcihost/xCredSSP/1.3.0.0/PSGetModuleInfo.xml create mode 100644 deployment/dsc/azshcihost/xCredSSP/1.3.0.0/README.md create mode 100644 deployment/dsc/azshcihost/xCredSSP/1.3.0.0/Tests/Unit/MSFT_xCredSSP.tests.ps1 create mode 100644 deployment/dsc/azshcihost/xCredSSP/1.3.0.0/xCredSSP.psd1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/Helper.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpPolicyOptionValue/MSFT_DhcpPolicyOptionValue.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpPolicyOptionValue/MSFT_DhcpPolicyOptionValue.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpReservedIPOptionValue/MSFT_DhcpReservedIPOptionValue.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpReservedIPOptionValue/MSFT_DhcpReservedIPOptionValue.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpScopeOptionValue/MSFT_DhcpScopeOptionValue.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpScopeOptionValue/MSFT_DhcpScopeOptionValue.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpServerOptionValue/MSFT_DhcpServerOptionValue.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpServerOptionValue/MSFT_DhcpServerOptionValue.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerAuthorization/MSFT_xDhcpServerAuthorization.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerAuthorization/MSFT_xDhcpServerAuthorization.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerClass/MSFT_xDhcpServerClass.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerClass/MSFT_xDhcpServerClass.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOption/MSFT_xDhcpServerOption.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOption/MSFT_xDhcpServerOption.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOptionDefinition/MSFT_xDhcpServerOptionDefinition.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOptionDefinition/MSFT_xDhcpServerOptionDefinition.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerReservation/MSFT_xDhcpServerReservation.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerReservation/MSFT_xDhcpServerReservation.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerScope/MSFT_xDhcpServerScope.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerScope/MSFT_xDhcpServerScope.schema.mof create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/LICENSE create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerOptionResource.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerReservationResource.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerScopeResource.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/CommonResourceHelper.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/DhcpServerDsc.OptionValueHelper/OptionValueHelper.psm1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/DhcpServerDsc.OptionValueHelper/en-US/OptionValueHelper.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/README.md create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpPolicyOptionValue/DhcpPolicyOptionValue.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpReservedIPOptionValue/DhcpReservedIPOptionValue.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpScopeOptionValue/DhcpScopeOptionValue.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpServerOptionValue/DhcpServerOptionValue.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/SampleConfiguration.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/TestSampleUsingAzure.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/CommonResourceHelper.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/Helper.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpPolicyOptionValue.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpReservedIPOptionValue.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpScopeOptionValue.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpServerOptionValue.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerAuthorization.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerClass.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerOption.tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerOptionDefinition.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerScope.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/xDhcpServer.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/CHANGELOG.md create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/HyperVCommon/HyperVCommon.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/HyperVCommon/en-us/HyperVCommon.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVHD/MSFT_xVHD.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVHD/MSFT_xVHD.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/en-us/MSFT_xVMDvdDrive.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/MSFT_xVMHardDiskDrive.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/MSFT_xVMHardDiskDrive.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/en-US/MSFT_xVMHardDiskDrive.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/MSFT_xVMHost.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/MSFT_xVMHost.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/en-US/MSFT_xVMHost.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/MSFT_xVMHyperV.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/MSFT_xVMHyperV.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/en-US/MSFT_xVMHyperV.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/MSFT_xVMNetworkAdapter.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/MSFT_xVMNetworkAdapter.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/en-US/MSFT_xVMNetworkAdapter.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/MSFT_xVMProcessor.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/MSFT_xVMProcessor.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/en-US/MSFT_xVMProcessor.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/MSFT_xVMScsiController.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/MSFT_xVMScsiController.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/en-US/MSFT_xVMScsiController.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/MSFT_xVMSwitch.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/MSFT_xVMSwitch.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/en-us/MSFT_xVMSwitch.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVhdFileDirectory/MSFT_xVhdFileDirectory.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVhdFileDirectory/MSFT_xVhdFileDirectory.schema.mof create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_AdditionalPropertyVHD.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_DiffVHD.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_FixedVHD.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_MissingPropertyVHD.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_NewVHD.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHardDiskDrive_VMWith4AdditionalDisks.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHardDiskDrive_VMWithExtraDisk.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHost_Paths.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_Complete.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_DynamicMemory.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_MultipleNICs.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_Simple.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_SimpleWithDVDDrive.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_SimpleWithNestedVirtualization.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_ManagementOS.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleManagementOS.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleVM.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleVMMACAddress.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_VMStaticNetworkSettings.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_VMVlanTagging.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMScsiController_AddControllers.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_External.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_ExternalSET.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_ExternalSET_LBMode.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_Internal.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVhdFileExamples.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/LICENSE create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VHDResourceGenerator.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMHardDiskDriveGenerator.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMResourceGenerator.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMScsiControllerGenerator.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMSwitchGenerator.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/README.md create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/IntegrationTestsCommon.psm1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive.Integration.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive_add.config.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive_remove.config.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMHost.Integration.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMHost_set.config.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMProcessor.Integration.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMProcessor_set.config.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/HyperVCommon.tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVHD.tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMDvdDrive.tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHardDiskDrive.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHost.tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHyperV.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMNetworkAdapter.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMProcessor.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMScsiController.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_BandwidthReservationMode.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_EnableEmbeddedTeaming.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_Id.Tests.ps1 create mode 100644 deployment/dsc/azshcihost/xHyper-V/3.17.0.0/xHyper-V.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/DSC_xArchive.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/DSC_xArchive.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/en-US/DSC_xArchive.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/en-US/DSC_xArchive.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/DSC_xDSCWebService.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/DSC_xDSCWebService.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/en-US/DSC_xDSCWebService.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/DSC_xEnvironmentResource.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/DSC_xEnvironmentResource.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/en-US/DSC_xEnvironmentResource.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/en-US/DSC_xEnvironmentResource.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/DSC_xGroupResource.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/DSC_xGroupResource.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/en-US/DSC_xGroupResource.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/en-US/DSC_xGroupResource.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/DSC_xMsiPackage.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/DSC_xMsiPackage.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/en-US/DSC_xMsiPackage.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/en-US/DSC_xMsiPackage.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/DSC_xPSSessionConfiguration.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/DSC_xPSSessionConfiguration.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/en-US/DSC_xPSSessionConfiguration.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/DSC_xPackageResource.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/DSC_xPackageResource.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/en-US/DSC_xPackageResource.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/en-US/DSC_xPackageResource.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/DSC_xRegistryResource.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/DSC_xRegistryResource.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/en-US/DSC_xRegistryResource.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/en-US/DSC_xRegistryResource.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/DSC_xRemoteFile.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/DSC_xRemoteFile.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/en-us/DSC_xRemoteFile.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/DSC_xScriptResource.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/DSC_xScriptResource.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/en-US/DSC_xScriptResource.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/en-US/DSC_xScriptResource.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/DSC_xServiceResource.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/DSC_xServiceResource.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/en-US/DSC_xServiceResource.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/en-US/DSC_xServiceResource.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/DSC_xUserResource.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/DSC_xUserResource.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/en-US/DSC_xUserResource.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/en-US/DSC_xUserResource.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/DSC_xWindowsFeature.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/DSC_xWindowsFeature.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/en-US/DSC_xWindowsFeature.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/en-US/DSC_xWindowsFeature.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/DSC_xWindowsOptionalFeature.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/DSC_xWindowsOptionalFeature.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/en-US/DSC_xWindowsOptionalFeature.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/en-US/DSC_xWindowsOptionalFeature.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/DSC_xWindowsPackageCab.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/DSC_xWindowsPackageCab.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/en-US/DSC_xWindowsPackageCab.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/en-US/DSC_xWindowsPackageCab.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/DSC_xWindowsProcess.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/DSC_xWindowsProcess.schema.mof create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/en-US/DSC_xWindowsProcess.schema.mfl create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/en-US/DSC_xWindowsProcess.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xFileUpload/xFileUpload.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xFileUpload/xFileUpload.schema.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xGroupSet/xGroupSet.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xGroupSet/xGroupSet.schema.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xProcessSet/xProcessSet.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xProcessSet/xProcessSet.schema.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xServiceSet/xServiceSet.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xServiceSet/xServiceSet.schema.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsFeatureSet/xWindowsFeatureSet.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsFeatureSet/xWindowsFeatureSet.schema.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsOptionalFeatureSet/xWindowsOptionalFeatureSet.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsOptionalFeatureSet/xWindowsOptionalFeatureSet.schema.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/DscPullServerSetup.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/DscPullServerSetupTest/DscPullServerSetupTest.ps1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/README.md create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/en-US/DscPullServerSetup.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/en-US/xPSDesiredStateConfiguration.Common.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/xPSDesiredStateConfiguration.Common.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/xPSDesiredStateConfiguration.Common.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/en-US/xPSDesiredStateConfiguration.Firewall.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/xPSDesiredStateConfiguration.Firewall.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/xPSDesiredStateConfiguration.Firewall.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/en-US/xPSDesiredStateConfiguration.PSWSIIS.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/en-US/xPSDesiredStateConfiguration.Security.strings.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/xPSDesiredStateConfiguration.Security.psd1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/xPSDesiredStateConfiguration.Security.psm1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/ResourceDesignerScripts/GenerateXRemoteFileSchema.ps1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/ResourceDesignerScripts/New-PSSessionConfigurationResource.ps1 create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/en-US/about_xPSDesiredStateConfiguration.help.txt create mode 100644 deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/xPSDesiredStateConfiguration.psd1 create mode 100644 deployment/helpers/Install-AzsRolesandFeatures.ps1 create mode 100644 deployment/helpers/Register-AzSHCI.ps1 create mode 100644 deployment/helpers/Update-AD.ps1 create mode 100644 deployment/json/azshcihost.json create mode 100644 deployment/json/updatevnet.json create mode 100644 deployment/json/vnet.json create mode 100644 deployment/media/Add-NetNatStaticMapping.png create mode 100644 deployment/media/Login-AzAccount.png create mode 100644 deployment/media/aad_permissions.png create mode 100644 deployment/media/access_web_app.png create mode 100644 deployment/media/add_cluster_method1.png create mode 100644 deployment/media/add_feed.png create mode 100644 deployment/media/add_nodes_ga.png create mode 100644 deployment/media/aks_azure_reg.png create mode 100644 deployment/media/aks_basics_arc.png create mode 100644 deployment/media/aks_basics_cluster_details (1).png create mode 100644 deployment/media/aks_basics_cluster_details.png create mode 100644 deployment/media/aks_basics_cluster_details_single.png create mode 100644 deployment/media/aks_basics_primarynp.png create mode 100644 deployment/media/aks_create.png create mode 100644 deployment/media/aks_create_complete.png create mode 100644 deployment/media/aks_create_start.png create mode 100644 deployment/media/aks_dashboard.png create mode 100644 deployment/media/aks_deploy_started.png create mode 100644 deployment/media/aks_deploy_success.png create mode 100644 deployment/media/aks_extension.png create mode 100644 deployment/media/aks_host_mgmtconfirm.png create mode 100644 deployment/media/aks_hostconfig_credssp.png create mode 100644 deployment/media/aks_hostconfig_hostdetails.png create mode 100644 deployment/media/aks_hostconfig_hostdetails_single.png create mode 100644 deployment/media/aks_hostconfig_lb.png create mode 100644 deployment/media/aks_hostconfig_vmnet.png create mode 100644 deployment/media/aks_hostconfig_vmnet_int.png create mode 100644 deployment/media/aks_in_arc.png create mode 100644 deployment/media/aks_node_pools.png create mode 100644 deployment/media/aks_runtime.png create mode 100644 deployment/media/aks_virtual_networking.png create mode 100644 deployment/media/akshci_config.png create mode 100644 deployment/media/akshci_config_new.png create mode 100644 deployment/media/akshci_powershell_folders.png create mode 100644 deployment/media/akshci_wac_folders.png create mode 100644 deployment/media/akshcievalguide.png create mode 100644 deployment/media/akshcihost_in_wac.png create mode 100644 deployment/media/allow_popup_edge.png create mode 100644 deployment/media/auto_shutdown.png create mode 100644 deployment/media/available_extensions.png create mode 100644 deployment/media/azure_arm.png create mode 100644 deployment/media/azure_blob_ga.png create mode 100644 deployment/media/azure_cloud_witness_ga.png create mode 100644 deployment/media/azure_keys_ga.png create mode 100644 deployment/media/azure_login_reg.png create mode 100644 deployment/media/azure_portal_hcicluster.png create mode 100644 deployment/media/azure_subscriptions_ga.png create mode 100644 deployment/media/azure_vm_custom_template.png create mode 100644 deployment/media/azure_vm_custom_template_complete.png create mode 100644 deployment/media/azure_vm_custom_template_completed.png create mode 100644 deployment/media/azure_vm_custom_template_new.png create mode 100644 deployment/media/azure_vm_search.png create mode 100644 deployment/media/azure_vm_search_ga.png create mode 100644 deployment/media/azure_vote_app.png create mode 100644 deployment/media/connect_to_vm.png create mode 100644 deployment/media/connect_to_vm_properties.png create mode 100644 deployment/media/create_cluster_method1.png create mode 100644 deployment/media/create_cluster_method2.png create mode 100644 deployment/media/default_browser.png create mode 100644 deployment/media/deployment_complete.png create mode 100644 deployment/media/extension_update.png create mode 100644 deployment/media/extension_update_needed.png create mode 100644 deployment/media/flow_chart_ga.png create mode 100644 deployment/media/get-dscconfigurationstatus.png create mode 100644 deployment/media/get-dscconfigurationstatus2.png create mode 100644 deployment/media/get_akshcicluster.png create mode 100644 deployment/media/get_akshcicluster_2.png create mode 100644 deployment/media/get_akshcicluster_3.png create mode 100644 deployment/media/get_akshcicluster_new.png create mode 100644 deployment/media/get_akshcicluster_wac.png create mode 100644 deployment/media/get_akshcicluster_wac1.png create mode 100644 deployment/media/get_akshcicluster_wac2.png create mode 100644 deployment/media/get_akshcicluster_wac3.png create mode 100644 deployment/media/get_akshcicred.png create mode 100644 deployment/media/get_akshcicred_2.png create mode 100644 deployment/media/get_akshcikubernetesversion.png create mode 100644 deployment/media/get_akshcinodepool_wac.png create mode 100644 deployment/media/get_module_functions.png create mode 100644 deployment/media/get_net_nat.png create mode 100644 deployment/media/grant_folder_permissions.png create mode 100644 deployment/media/initialize_akshcinode.png create mode 100644 deployment/media/install_akshci.png create mode 100644 deployment/media/installed_extensions.png create mode 100644 deployment/media/installed_extensions_cluster.png create mode 100644 deployment/media/kubectl_apply.png create mode 100644 deployment/media/kubectl_get_nodes.png create mode 100644 deployment/media/kubectl_get_pods.png create mode 100644 deployment/media/kubectl_get_pods_scaled.png create mode 100644 deployment/media/kubectl_get_service.png create mode 100644 deployment/media/kubectl_scale.png create mode 100644 deployment/media/kubectl_service.png create mode 100644 deployment/media/nested.png create mode 100644 deployment/media/nested_virt.png create mode 100644 deployment/media/nested_virt_akshci_ga.png create mode 100644 deployment/media/nested_virt_arch_ga.png create mode 100644 deployment/media/nested_virt_arch_ga_oct21.png create mode 100644 deployment/media/nested_virt_nodes_ga.png create mode 100644 deployment/media/new_akshcicluster.png create mode 100644 deployment/media/new_security_rule.png create mode 100644 deployment/media/powershell_vm_deployed.png create mode 100644 deployment/media/reg_check.png create mode 100644 deployment/media/register_azshci_ga.png create mode 100644 deployment/media/register_wac_azure.png create mode 100644 deployment/media/registration_rg_ga.png create mode 100644 deployment/media/registration_status.png create mode 100644 deployment/media/vm_connect_ga.png create mode 100644 deployment/media/vm_deployment_error.png create mode 100644 deployment/media/wac_azshciclus_ga.png create mode 100644 deployment/media/wac_azure_arc_register_error.png create mode 100644 deployment/media/wac_azure_connect (1).png create mode 100644 deployment/media/wac_azure_connect (2).png create mode 100644 deployment/media/wac_azure_connect.png create mode 100644 deployment/media/wac_azure_key_ga.png create mode 100644 deployment/media/wac_azure_permissions.png create mode 100644 deployment/media/wac_azure_reg_dashboard.png create mode 100644 deployment/media/wac_azure_reg_dashboard_2.png create mode 100644 deployment/media/wac_azure_reg_dashboard_3.png create mode 100644 deployment/media/wac_azure_register.png create mode 100644 deployment/media/wac_azuread_confirm.png create mode 100644 deployment/media/wac_azuread_grant.png create mode 100644 deployment/media/wac_azureadapp.png create mode 100644 deployment/media/wac_check_drives_ga.png create mode 100644 deployment/media/wac_clean_drives_ga.png create mode 100644 deployment/media/wac_cloud_witness_new_ga.png create mode 100644 deployment/media/wac_cluster_success_ga.png create mode 100644 deployment/media/wac_cluster_type_ga.png create mode 100644 deployment/media/wac_compute_vswitch_ga.png create mode 100644 deployment/media/wac_create_clus_dhcp_ga.png create mode 100644 deployment/media/wac_create_clus_static_ga.png create mode 100644 deployment/media/wac_credssp_ga.png create mode 100644 deployment/media/wac_define_network_ga.png create mode 100644 deployment/media/wac_domain_joined_ga.png create mode 100644 deployment/media/wac_enable_dedup_ga.png create mode 100644 deployment/media/wac_enable_rdma.png create mode 100644 deployment/media/wac_fs_witness_new_ga.png create mode 100644 deployment/media/wac_host_config.png create mode 100644 deployment/media/wac_installed.png create mode 100644 deployment/media/wac_installed_features_ga.png create mode 100644 deployment/media/wac_management_nic_ga.png create mode 100644 deployment/media/wac_move_ga.png create mode 100644 deployment/media/wac_restart_ga.png create mode 100644 deployment/media/wac_s2d_enabled_ga.png create mode 100644 deployment/media/wac_singlemgmt_ga.png create mode 100644 deployment/media/wac_storage_validated_ga.png create mode 100644 deployment/media/wac_system_checks.png create mode 100644 deployment/media/wac_system_checks_single.png create mode 100644 deployment/media/wac_teamedmgmt_ga.png create mode 100644 deployment/media/wac_validate_storage_ga.png create mode 100644 deployment/media/wac_validated_ga.png create mode 100644 deployment/media/wac_verify_network_ga.png create mode 100644 deployment/media/wac_vm001_ga.png create mode 100644 deployment/media/wac_vm_storage_deployed_ga.png create mode 100644 deployment/media/wac_vm_storage_ga.png create mode 100644 deployment/media/wac_vswitches_ga.png create mode 100644 deployment/scripts/installWac.ps1 create mode 100644 deployment/steps/1_DeployAzureVM.md create mode 100644 deployment/steps/2_DeployAzSHCI.md create mode 100644 deployment/steps/3_AzSHCIIntegration.md create mode 100644 deployment/steps/4_ExploreAzSHCI.md delete mode 100644 nested/steps/1b_NestedInAzure.md diff --git a/README.md b/README.md index 96c2368..8b1915d 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,10 @@ Welcome to the Azure Stack HCI 20H2 Evaluation Guide In this guide, we'll walk you experiencing a number of the amazing capabilities within [Azure Stack HCI 20H2](https://azure.microsoft.com/en-us/products/azure-stack/hci/ "link to the Azure Stack HCI 20H2 landing page"), and set the foundation for you to explore in your own time. You'll cover aspects such as: -* Deploying Azure Stack HCI 20H2 nodes -* Deploying supporting management infrastructure, including Active Directory domain and management tooling -* Building a Hyperconverged cluster using Windows Admin Center, including configuring a cloud witness +* Building a hyperconverged Azure Stack HCI cluster using Windows Admin Center +* Configuring a cloud witness * Registering Azure Stack HCI 20H2 with Azure -* and more...! +* Creating storage volumes and deploying a VM Contents ----------- @@ -18,7 +17,12 @@ Contents - [Contents](#contents) - [What is Azure Stack HCI 20H2?](#what-is-azure-stack-hci-20h2) - [Why follow this guide?](#why-follow-this-guide) -- [Start your Azure Stack HCI 20H2 evaluation using nested virtualization](#start-your-azure-stack-hci-20h2-evaluation-using-nested-virtualization) +- [Interested in AKS on Azure Stack HCI?](#interested-in-aks-on-azure-stack-hci) +- [Evaluating in Azure](#evaluating-in-azure) +- [Nested Virtualization](#nested-virtualization) +- [Deployment of Azure Stack HCI 20H2 nested in Azure](#deployment-of-azure-stack-hci-20h2-nested-in-azure) +- [Deployment Workflow](#deployment-workflow) +- [Get started](#get-started) - [Product improvements](#product-improvements) - [Raising issues](#raising-issues) - [Contributions & Legal](#contributions--legal) @@ -35,25 +39,66 @@ If you're interested in learning more about what Azure Stack HCI 20H2 is, make s Why follow this guide? ----------- -This evaluation guide will walk you through standing up a sandboxed, isolated Azure Stack HCI 20H2 environment using **nested virtualization**, and can run on a **single physical system**, such as a workstation, laptop, or server of you have one, or alternatively, you can run the whole configuration in Azure. We'll go into more details for this path, shortly. - -The important takeaway here is, by following this guide, you'll lay down a solid foundation on to which you can explore additional Azure Stack HCI 20H2 scenarios in the future, so keep checking back for additional scenarios over time. +This evaluation guide will walk you through standing up a sandboxed, isolated Azure Stack HCI 20H2 environment using **nested virtualization** in a **single Azure VM**. The important takeaway here is, by following this guide, you'll lay down a solid foundation on to which you can explore additional Azure Stack HCI 20H2 scenarios in the future, so keep checking back for additional scenarios over time. Interested in AKS on Azure Stack HCI? ----------- If you're interested in evaluating AKS on Azure Stack HCI (AKS-HCI), and you're planning to evaluate all the solutions using nested virtualization in Azure, it's certainly tempting to run AKS-HCI on top of an Azure Stack HCI 20H2 nested cluster in an Azure VM, however we **strongly discourage** this approach due to the performance impact of multiple layers of nested virtualization. The recommended approach to test AKS-HCI in an Azure VM using [the official AKS on Azure Stack HCI eval guide](https://aka.ms/aks-hci-evalonazure "AKS on Azure Stack HCI eval guide"). -Start your Azure Stack HCI 20H2 evaluation using nested virtualization +Evaluating in Azure ----------- -If you have a single physical system, which could be a laptop, desktop, or server, or you have no spare hardware at all, using **nested virtualization** would be a great approach to experiencing Azure Stack HCI 20H2. You can get more details at the start of the nested path. +As with any infrastructure technology, in order to test, validate and evaluate the technology, there's typically a requirement for hardware. If you're fortunate enough to have multiple server-class pieces of hardware going spare (ideally hardware validated for Azure Stack HCI 20H2, found on our [Azure Stack HCI 20H2 Catalog](https://aka.ms/azurestackhcicatalog "Azure Stack HCI 20H2 Catalog")), you can certainly perform a more real-world evaluation of Azure Stack HCI 20H2. -![Nested path image](/media/nested.png "Nested virtualization path image") +For the purpose of this evaluation guide however, we'll be relying on **nested virtualization** to allow us to consolidate a full lab infrastructure, down **onto a single Hyper-V host inside an Azure VM**. -[**Evaluate Azure Stack HCI 20H2 using Nested Virtualization**](/nested/README.md "Evaluate Azure Stack HCI 20H2 using Nested Virtualization") +************************* ### Important Note - Production Deployments ### -The use of nested virtualization in this evaluation guide is aimed at providing flexibility for deploying Azure Stack HCI 20H2 in a lab, or test environment. For **production** use, **Azure Stack HCI 20H2 should be deployed on validated physical hardware**, of which you can find a vast array of choices on the [Azure Stack HCI 20H2 Catalog](https://aka.ms/azurestackhcicatalog "Azure Stack HCI 20H2 Catalog"). +The use of nested virtualization in this evaluation guide is aimed at providing flexibility for evaluating Azure Stack HCI 20H2. For **production** use, **Azure Stack HCI 20H2 should be deployed on validated physical hardware**, of which you can find a vast array of choices on the [Azure Stack HCI 20H2 Catalog](https://aka.ms/azurestackhcicatalog "Azure Stack HCI 20H2 Catalog"). + +************************* + +Nested Virtualization +----------- +If you're not familiar with Nested Virtualization, at a high level, it allows a virtualization platform, such as Hyper-V, or VMware ESXi, to run virtual machines that, within those virtual machines, run a virtualization platform. It may be easier to think about this in an architectural view. + +![Nested virtualization architecture](/deployment/media/nested_virt.png "Nested virtualization architecture") + +As you can see from the graphic, at the base layer, you have your physical hardware, onto which you install a hypervisor. In this case, for our example, we're using Windows Server 2019 with the Hyper-V role enabled. The hypervisor on the lowest level is considered L0 or the level 0 hypervisor. On that physical host, you create a virtual machine, and into that virtual machine, you deploy an OS that itself, has a hypervisor enabled. In this example, that 1st Virtualized Layer is running a **nested** Azure Stack HCI 20H2 operating system. This would be an L1 or level 1 hypervisor. Finally, in our example, inside the Azure Stack HCI 20H2 OS, you create a virtual machine to run a workload. This could in fact also contain a hypervisor, which would be known as the L2 or level 2 hypervisor, and so the process continues, with multiple levels of nested virtualization possible. + +The use of nested virtualization opens up amazing opportunities for building complex scenarios on significantly reduced hardware footprints, however it shouldn't be seen as a substitute for real-world deployments, performance and scale testing etc. + +Deployment of Azure Stack HCI 20H2 nested in Azure +----------- +For those of you who don't have multiple server-class pieces of hardware to test a full hyperconverged solution, this evaluation guide will detail using **nested virtualization** in Azure to evaluate Azure Stack HCI. + +![Architecture diagram for Azure Stack HCI 20H2 nested in Azure](/deployment/media/nested_virt_arch_ga_oct21.png "Architecture diagram for Azure Stack HCI 20H2 nested in Azure") + +In this configuration, you'll take advantage of the nested virtualization support provided within certain Azure VM sizes. You'll deploy a single Azure VM running Windows Server 2019 to act as your main Hyper-V host - and through PowerShell DSC, this will be automatically configured with the relevant roles and features needed for this guide. It will also download all required binaries, and deploy 2 Azure Stack HCI 20H2 nodes, ready for clustering. + +To reiterate, the whole configuration will run **inside the single Azure VM**. + +Deployment Workflow +----------- + +This guide will walk you through deploying a sandboxed infrastructure - the general flow will be as follows: + +**Part 1 - Complete the pre-requisites - deploy your Azure VM**: In this step, you'll create a VM in Azure using an Azure Resource Manager template. This VM will run Windows Server 2019 Datacenter, with the full desktop experience. PowerShell DSC will automatically configure this VM with the appropriate roles and features, download the necessary binaries, and configure 2 Azure Stack HCI 20H2 nodes, ready for clustering. + +**Part 2 - Configure your Azure Stack HCI 20H2 Cluster**: In this step, you'll use Windows Admin Center to deploy an Azure Stack HCI 20H2 cluster - along with a Cloud Witness, a Cluster Shared Volume, and finally, you'll register this cluster with Azure. + +**Part 3 - Integrate Azure Stack HCI 20H2 with Azure**: In this step, you'll use Windows Admin Center to register your Azure Stack HCI Cluster with Azure and explore what's presented in the portal + +**Part 4 - Explore the management of your Azure Stack HCI 20H2 environment**: With your deployment completed, you're now ready to explore many of the management aspects within the Windows Admin Center. + +Get started +----------- + +* [**Part 1** - Complete the prerequisites - deploy your Azure VM](/steps/1_DeployAzureVM.md "Complete the prerequisites - deploy your Azure VM") +* [**Part 2** - Configure your Azure Stack HCI 20H2 Cluster](/steps/2_DeployAzSHCI.md "Configure your Azure Stack HCI 20H2 Cluster") +* [**Part 3** - Integrate Azure Stack HCI 20H2 with Azure](/steps/3_AzSHCIIntegration.md "Integrate Azure Stack HCI 20H2 with Azure") +* [**Part 4** - Explore Azure Stack HCI Management](/steps/4_ExploreAzSHCI.md "Explore Azure Stack HCI Management") Product improvements ----------- @@ -85,4 +130,4 @@ Microsoft, Windows, Microsoft Azure and/or other Microsoft products and services Privacy information can be found at https://privacy.microsoft.com/en-us/ -Microsoft and any contributors reserve all other rights, whether under their respective copyrights, patents, or trademarks, whether by implication, estoppel or otherwise. +Microsoft and any contributors reserve all other rights, whether under their respective copyrights, patents, or trademarks, whether by implication, estoppel or otherwise. \ No newline at end of file diff --git a/nested/README.md b/archive/README.md similarity index 69% rename from nested/README.md rename to archive/README.md index 1f84ea4..63d7525 100644 --- a/nested/README.md +++ b/archive/README.md @@ -1,6 +1,21 @@ Evaluate Azure Stack HCI 20H2 using Nested Virtualization ============== +Important Note +----------- + +*********************** +This section of the eval guide has been **archived**. If you're looking to evaluate Azure Stack HCI in an Azure VM, the best approach is to use the latest version of the guidance, which you can find here: + +* [**Part 1** - Complete the prerequisites - deploy your Azure VM](/deployment/steps/1_DeployAzureVM.md "Complete the prerequisites - deploy your Azure VM") +* [**Part 2** - Configure your Azure Stack HCI 20H2 Cluster](/deployment/steps/2_DeployAzSHCI.md "Configure your Azure Stack HCI 20H2 Cluster") +* [**Part 3** - Integrate Azure Stack HCI 20H2 with Azure](/deployment/steps/3_AzSHCIIntegration.md "Integrate Azure Stack HCI 20H2 with Azure") +* [**Part 4** - Explore Azure Stack HCI Management](/deployment/steps/4_ExploreAzSHCI.md "Explore Azure Stack HCI Management") + +If you wish to evaluate Azure Stack HCI on a **single physical system**, you can use the guidance below. + +*********************** + As with any infrastructure technology, in order to test, validate and evaluate the technology, there's typically a requirement for hardware. If you're fortunate enough to have multiple server-class pieces of hardware going spare (ideally hardware validated for Azure Stack HCI 20H2, found on our [Azure Stack HCI 20H2 Catalog](https://aka.ms/azurestackhcicatalog "Azure Stack HCI 20H2 Catalog")), you can certainly perform a more real-world evaluation of Azure Stack HCI 20H2. For the purpose of this evaluation guide however, we'll be relying on **nested virtualization** to allow us to consolidate a full lab infrastructure, down onto a single Hyper-V host, either on-prem, or in Azure. If you do have spare physical hardware, you should be able to follow along and use your own hardware - you can just skip the nested-specific steps. @@ -10,9 +25,10 @@ The use of nested virtualization in this evaluation guide is aimed at providing Contents ----------- +- [Important Note](#important-note) - [Contents](#contents) - [Nested Virtualization](#nested-virtualization) -- [Deployment Options](#deployment-options) +- [Deployment](#deployment) - [Deployment Workflow](#deployment-workflow) - [Product improvements](#product-improvements) - [Raising issues](#raising-issues) @@ -21,74 +37,61 @@ Nested Virtualization ----------- If you're not familiar with Nested Virtualization, at a high level, it allows a virtualization platform, such as Hyper-V, or VMware ESXi, to run virtual machines that, within those virtual machines, run a virtualization platform. It may be easier to think about this in an architectural view. -![Nested virtualization architecture](/media/nested_virt.png "Nested virtualization architecture") +![Nested virtualization architecture](/archive/media/nested_virt.png "Nested virtualization architecture") As you can see from the graphic, at the base layer, you have your physical hardware, onto which you install a hypervisor. In this case, for our example, we're using Windows Server 2019 with the Hyper-V role enabled. The hypervisor on the lowest level is considered L0 or the level 0 hypervisor. On that physical host, you create a virtual machine, and into that virtual machine, you deploy an OS that itself, has a hypervisor enabled. In this example, that 1st Virtualized Layer is running a **nested** Azure Stack HCI 20H2 operating system. This would be an L1 or level 1 hypervisor. Finally, in our example, inside the Azure Stack HCI 20H2 OS, you create a virtual machine to run a workload. This could in fact also contain a hypervisor, which would be known as the L2 or level 2 hypervisor, and so the process continues, with multiple levels of nested virtualization possible. The use of nested virtualization opens up amazing opportunities for building complex scenarios on significantly reduced hardware footprints, however it shouldn't be seen as a substitute for real-world deployments, performance and scale testing etc. -Deployment Options +Deployment ----------- -For those of you who don't have multiple server-class pieces of hardware to test a full hyperconverged solution, this evaluation guide will detail 2 configurations, both using **nested virtualization**, that should be of interest. +For those of you who don't have multiple server-class pieces of hardware to test a full hyperconverged solution, this evaluation guide will detail how you can deploy on a single physical system, using **nested virtualization**. ### Deployment of Azure Stack HCI 20H2 nested on a physical system ### -![Architecture diagram for Azure Stack HCI 20H2 nested on a physical system](/media/nested_virt_physical_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested on a physical system") +![Architecture diagram for Azure Stack HCI 20H2 nested on a physical system](/archive/media/nested_virt_physical_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested on a physical system") In this configuration, you'll again take advantage of nested virtualization, but in this case, you'll deploy the whole solution on a single desktop/laptop/server. On your physical system, you'll run either Windows Server 2016/2019 or Windows 10 Pro/Enterprise/Education, with the Hyper-V role enabled. On Hyper-V, you'll deploy a sandbox infrastructure, consisting of a Windows Server 2019 domain controller VM, a management VM running Windows 10 Enterprise, and a nested Azure Stack HCI 20H2 cluster. #### Important note for systems with AMD CPUs #### For those of you wanting to evaluate Azure Stack HCI 20H2 in a nested configuration, with **AMD-based systems**, the only way this is currently possible is to use **Windows 10 Insider Build 19636 or newer** as your Hyper-V host. Your system should have AMD's 1st generation Ryzen/Epyc or newer CPUs. You can get more information on [nested virtualization on AMD here](https://techcommunity.microsoft.com/t5/virtualization/amd-nested-virtualization-support/ba-p/1434841 "Nested virtualization on AMD-based systems"). -If you can't run the Windows 10 Insider builds on your AMD-based system, it may be a better approach to [deploy in Azure instead](/nested/steps/1b_NestedInAzure.md "Deploy in Azure"). We'll be sure to update this guidance as and when new updates to nested virtualization support become available. - -### Deployment of Azure Stack HCI 20H2 nested in Azure ### - -![Architecture diagram for Azure Stack HCI 20H2 nested in Azure](/media/nested_virt_arch_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested in Azure") - -In this configuration, you'll take advantage of the nested virtualization support provided within certain Azure VM sizes. You'll first deploy a single Azure VM running Windows Server 2019. Inside this VM, you'll enable the Hyper-V role, and deploy a Windows Server 2019 domain controller VM, along with a management VM, running Windows 10 Enterprise. This management VM will also run the Windows Admin Center. Finally, you'll deploy a nested Azure Stack HCI 20H2 cluster, with a minimum of 2 nodes, however the number of nodes will be based on the size of your Azure VM. - -To reiterate, the whole configuration (Domain Controller VM, Management VM and Azure Stack HCI 20H2 Nodes) will run inside the single Azure VM. +If you can't run the Windows 10 Insider builds on your AMD-based system, it may be a better approach to [deploy in Azure instead](/steps/1b_NestedInAzure.md "Deploy in Azure"). We'll be sure to update this guidance as and when new updates to nested virtualization support become available. Deployment Workflow ----------- -This guide will walk you through deploying a sandboxed Azure Stack HCI 20H2 infrastructure. Many of the steps will be universal, regardless of whether you are deploying in Azure, or deploying on a single physical system, however to accommodate different preferences, we've provided paths for those of you who prefer PowerShell, or GUI (Graphical User Interface, such as Hyper-V Manager, Server Manager etc)-based deployments. +This guide will walk you through deploying a sandboxed Azure Stack HCI 20H2 infrastructure. To accommodate different preferences, we've provided paths for those of you who prefer PowerShell, or GUI (Graphical User Interface, such as Hyper-V Manager, Server Manager etc)-based deployments. The general flow will be as follows: -![Evaluation guide workflow using nested virtualization](/media/flow_chart_ga.png "Evaluation guide workflow using nested virtualization") +![Evaluation guide workflow using nested virtualization](/archive/media/flow_chart_ga_oct21.png "Evaluation guide workflow using nested virtualization") -#### Part 1a - Deploy Hyper-V on a physical system #### +#### Part 1 - Deploy Hyper-V on a physical system #### In this step, on your existing system, that's running Windows Server 2016/2019 or Windows 10 Pro/Enterprise/Education, you'll enable the Hyper-V role and create a NAT virtual switch to enable network communication between sandbox VMs, and out to the internet. -* [**Part 1a** - Start your deployment on a physical system](/nested/steps/1a_NestedOnPhysical.md "Start your deployment on a physical system") - -#### Part 1b - Deploy Hyper-V host in Azure #### -In this step, you'll create a suitable VM in Azure using PowerShell or an Azure Resource Manager template. This VM will run Windows Server 2019 Datacenter, with the full desktop experience. On this system, you'll enable the Hyper-V role and accompanying management tools, and create a NAT virtual switch to enable network communication between sandbox VMs, and out to the internet. - -* [**Part 1b** - Start your deployment into Azure](/nested/steps/1b_NestedInAzure.md "Start your deployment into Azure") +* [**Part 1a** - Start your deployment on a physical system](/steps/1_NestedOnPhysical.md "Start your deployment on a physical system") #### Part 2 - Deploy management infrastructure #### In this step, you'll use **either the GUI, or PowerShell** to deploy and configure both a Windows Server 2019 domain controller, and a Windows 10 management VM on your Hyper-V host. You'll create a Windows Server 2019 Active Directory domain, and join the Windows 10 management VM to this domain. You'll also install the Windows Admin Center ahead of deploying the nested Azure Stack HCI 20H2 cluster. -* [**Part 2a** - Deploy your management infrastructure with the GUI](/nested/steps/2a_ManagementInfraGUI.md "Deploy your management infrastructure with the GUI") -* [**Part 2b** - Deploy your management infrastructure with PowerShell](/nested/steps/2b_ManagementInfraPS.md "Deploy your management infrastructure with PowerShell") +* [**Part 2a** - Deploy your management infrastructure with the GUI](/steps/2a_ManagementInfraGUI.md "Deploy your management infrastructure with the GUI") +* [**Part 2b** - Deploy your management infrastructure with PowerShell](/steps/2b_ManagementInfraPS.md "Deploy your management infrastructure with PowerShell") #### Part 3 - Deploy nested Azure Stack HCI 20H2 nodes #### In this step, you'll use **either the GUI or PowerShell** to create a number of nested Azure Stack HCI 20H2 nodes. -* [**Part 3a** - Create your nested Azure Stack HCI 20H2 nodes with the GUI](/nested/steps/3a_AzSHCINodesGUI.md "Create your nested Azure Stack HCI 20H2 nodes with the GUI") -* [**Part 3b** - Create your nested Azure Stack HCI 20H2 nodes with PowerShell](/nested/steps/3b_AzSHCINodesPS.md "Create your nested Azure Stack HCI 20H2 nodes with PowerShell") +* [**Part 3a** - Create your nested Azure Stack HCI 20H2 nodes with the GUI](/steps/3a_AzSHCINodesGUI.md "Create your nested Azure Stack HCI 20H2 nodes with the GUI") +* [**Part 3b** - Create your nested Azure Stack HCI 20H2 nodes with PowerShell](/steps/3b_AzSHCINodesPS.md "Create your nested Azure Stack HCI 20H2 nodes with PowerShell") #### Part 4 - Create your nested Azure Stack HCI 20H2 cluster #### In this step, you'll use the Windows Admin Center, on the Windows 10 management VM, to create the nested Azure Stack HCI 20H2 cluster, and perform some post-deployment tasks to validate the configuration. -* [**Part 4** - Create your nested Azure Stack HCI 20H2 cluster](/nested/steps/4_AzSHCICluster.md "Create your nested Azure Stack HCI 20H2 cluster") +* [**Part 4** - Create your nested Azure Stack HCI 20H2 cluster](/steps/4_AzSHCICluster.md "Create your nested Azure Stack HCI 20H2 cluster") #### Part 5 - Explore the management of your Azure Stack HCI 20H2 environment #### With your deployment completed, you're now ready to explore many of the management aspects within the Windows Admin Center. -* [**Part 5** - Explore the management of your Azure Stack HCI 20H2 environment](/nested/steps/5_ExploreAzSHCI.md "Explore the management of your Azure Stack HCI 20H2 environment") +* [**Part 5** - Explore the management of your Azure Stack HCI 20H2 environment](/steps/5_ExploreAzSHCI.md "Explore the management of your Azure Stack HCI 20H2 environment") Product improvements ----------- diff --git a/nested/json/azshcilabvm.json b/archive/json/azshcilabvm.json similarity index 100% rename from nested/json/azshcilabvm.json rename to archive/json/azshcilabvm.json diff --git a/media/Login-AzAccount.png b/archive/media/Login-AzAccount.png similarity index 100% rename from media/Login-AzAccount.png rename to archive/media/Login-AzAccount.png diff --git a/media/New-AzRoleAssignment.png b/archive/media/New-AzRoleAssignment.png similarity index 100% rename from media/New-AzRoleAssignment.png rename to archive/media/New-AzRoleAssignment.png diff --git a/media/New-AzRoleDefinition.png b/archive/media/New-AzRoleDefinition.png similarity index 100% rename from media/New-AzRoleDefinition.png rename to archive/media/New-AzRoleDefinition.png diff --git a/media/aad_permissions.png b/archive/media/aad_permissions.png similarity index 100% rename from media/aad_permissions.png rename to archive/media/aad_permissions.png diff --git a/media/add_nodes.png b/archive/media/add_nodes.png similarity index 100% rename from media/add_nodes.png rename to archive/media/add_nodes.png diff --git a/media/add_nodes_ga.png b/archive/media/add_nodes_ga.png similarity index 100% rename from media/add_nodes_ga.png rename to archive/media/add_nodes_ga.png diff --git a/media/adds_group.png b/archive/media/adds_group.png similarity index 100% rename from media/adds_group.png rename to archive/media/adds_group.png diff --git a/media/adds_new_user.png b/archive/media/adds_new_user.png similarity index 100% rename from media/adds_new_user.png rename to archive/media/adds_new_user.png diff --git a/media/adds_prereq.png b/archive/media/adds_prereq.png similarity index 100% rename from media/adds_prereq.png rename to archive/media/adds_prereq.png diff --git a/media/adds_wizard.png b/archive/media/adds_wizard.png similarity index 100% rename from media/adds_wizard.png rename to archive/media/adds_wizard.png diff --git a/media/api_permissions.png b/archive/media/api_permissions.png similarity index 100% rename from media/api_permissions.png rename to archive/media/api_permissions.png diff --git a/media/api_permissions_ga.png b/archive/media/api_permissions_ga.png similarity index 100% rename from media/api_permissions_ga.png rename to archive/media/api_permissions_ga.png diff --git a/media/auto_shutdown.png b/archive/media/auto_shutdown.png similarity index 100% rename from media/auto_shutdown.png rename to archive/media/auto_shutdown.png diff --git a/media/azshci_data_disk.png b/archive/media/azshci_data_disk.png similarity index 100% rename from media/azshci_data_disk.png rename to archive/media/azshci_data_disk.png diff --git a/media/azshci_disks_added.png b/archive/media/azshci_disks_added.png similarity index 100% rename from media/azshci_disks_added.png rename to archive/media/azshci_disks_added.png diff --git a/media/azshci_disks_added_ga.png b/archive/media/azshci_disks_added_ga.png similarity index 100% rename from media/azshci_disks_added_ga.png rename to archive/media/azshci_disks_added_ga.png diff --git a/media/azshci_laptop.png b/archive/media/azshci_laptop.png similarity index 100% rename from media/azshci_laptop.png rename to archive/media/azshci_laptop.png diff --git a/media/azshci_settings_ps.png b/archive/media/azshci_settings_ps.png similarity index 100% rename from media/azshci_settings_ps.png rename to archive/media/azshci_settings_ps.png diff --git a/media/azshci_settings_ps_ga.png b/archive/media/azshci_settings_ps_ga.png similarity index 100% rename from media/azshci_settings_ps_ga.png rename to archive/media/azshci_settings_ps_ga.png diff --git a/media/azshci_setup.png b/archive/media/azshci_setup.png similarity index 100% rename from media/azshci_setup.png rename to archive/media/azshci_setup.png diff --git a/media/azshci_setup_complete.png b/archive/media/azshci_setup_complete.png similarity index 100% rename from media/azshci_setup_complete.png rename to archive/media/azshci_setup_complete.png diff --git a/media/azure_ad_app.png b/archive/media/azure_ad_app.png similarity index 100% rename from media/azure_ad_app.png rename to archive/media/azure_ad_app.png diff --git a/media/azure_ad_app_ga.png b/archive/media/azure_ad_app_ga.png similarity index 100% rename from media/azure_ad_app_ga.png rename to archive/media/azure_ad_app_ga.png diff --git a/media/azure_arm.png b/archive/media/azure_arm.png similarity index 100% rename from media/azure_arm.png rename to archive/media/azure_arm.png diff --git a/media/azure_blob.png b/archive/media/azure_blob.png similarity index 100% rename from media/azure_blob.png rename to archive/media/azure_blob.png diff --git a/media/azure_blob_ga.png b/archive/media/azure_blob_ga.png similarity index 100% rename from media/azure_blob_ga.png rename to archive/media/azure_blob_ga.png diff --git a/media/azure_cloud_witness.png b/archive/media/azure_cloud_witness.png similarity index 100% rename from media/azure_cloud_witness.png rename to archive/media/azure_cloud_witness.png diff --git a/media/azure_cloud_witness_ga.png b/archive/media/azure_cloud_witness_ga.png similarity index 100% rename from media/azure_cloud_witness_ga.png rename to archive/media/azure_cloud_witness_ga.png diff --git a/media/azure_keys.png b/archive/media/azure_keys.png similarity index 100% rename from media/azure_keys.png rename to archive/media/azure_keys.png diff --git a/media/azure_keys_ga.png b/archive/media/azure_keys_ga.png similarity index 100% rename from media/azure_keys_ga.png rename to archive/media/azure_keys_ga.png diff --git a/media/azure_login_reg.png b/archive/media/azure_login_reg.png similarity index 100% rename from media/azure_login_reg.png rename to archive/media/azure_login_reg.png diff --git a/media/azure_portal_hcicluster.png b/archive/media/azure_portal_hcicluster.png similarity index 100% rename from media/azure_portal_hcicluster.png rename to archive/media/azure_portal_hcicluster.png diff --git a/media/azure_subscriptions.png b/archive/media/azure_subscriptions.png similarity index 100% rename from media/azure_subscriptions.png rename to archive/media/azure_subscriptions.png diff --git a/media/azure_subscriptions_ga.png b/archive/media/azure_subscriptions_ga.png similarity index 100% rename from media/azure_subscriptions_ga.png rename to archive/media/azure_subscriptions_ga.png diff --git a/media/azure_vm_custom_template.png b/archive/media/azure_vm_custom_template.png similarity index 100% rename from media/azure_vm_custom_template.png rename to archive/media/azure_vm_custom_template.png diff --git a/media/azure_vm_custom_template_complete.png b/archive/media/azure_vm_custom_template_complete.png similarity index 100% rename from media/azure_vm_custom_template_complete.png rename to archive/media/azure_vm_custom_template_complete.png diff --git a/media/azure_vm_search.png b/archive/media/azure_vm_search.png similarity index 100% rename from media/azure_vm_search.png rename to archive/media/azure_vm_search.png diff --git a/media/azure_vm_search_ga.png b/archive/media/azure_vm_search_ga.png similarity index 100% rename from media/azure_vm_search_ga.png rename to archive/media/azure_vm_search_ga.png diff --git a/media/boot_from_dvd.png b/archive/media/boot_from_dvd.png similarity index 100% rename from media/boot_from_dvd.png rename to archive/media/boot_from_dvd.png diff --git a/media/connect_to_mgmt01.png b/archive/media/connect_to_mgmt01.png similarity index 100% rename from media/connect_to_mgmt01.png rename to archive/media/connect_to_mgmt01.png diff --git a/media/connect_to_vm.png b/archive/media/connect_to_vm.png similarity index 100% rename from media/connect_to_vm.png rename to archive/media/connect_to_vm.png diff --git a/media/connect_to_vm_properties.png b/archive/media/connect_to_vm_properties.png similarity index 100% rename from media/connect_to_vm_properties.png rename to archive/media/connect_to_vm_properties.png diff --git a/media/dc_created.png b/archive/media/dc_created.png similarity index 100% rename from media/dc_created.png rename to archive/media/dc_created.png diff --git a/media/dc_install_progress.png b/archive/media/dc_install_progress.png similarity index 100% rename from media/dc_install_progress.png rename to archive/media/dc_install_progress.png diff --git a/media/dc_nic.png b/archive/media/dc_nic.png similarity index 100% rename from media/dc_nic.png rename to archive/media/dc_nic.png diff --git a/media/dhcp_complete.png b/archive/media/dhcp_complete.png similarity index 100% rename from media/dhcp_complete.png rename to archive/media/dhcp_complete.png diff --git a/media/dhcp_dns.png b/archive/media/dhcp_dns.png similarity index 100% rename from media/dhcp_dns.png rename to archive/media/dhcp_dns.png diff --git a/media/dhcp_enabled.png b/archive/media/dhcp_enabled.png similarity index 100% rename from media/dhcp_enabled.png rename to archive/media/dhcp_enabled.png diff --git a/media/dhcp_scope.png b/archive/media/dhcp_scope.png similarity index 100% rename from media/dhcp_scope.png rename to archive/media/dhcp_scope.png diff --git a/media/download_files.png b/archive/media/download_files.png similarity index 100% rename from media/download_files.png rename to archive/media/download_files.png diff --git a/media/dynamicmem.png b/archive/media/dynamicmem.png similarity index 100% rename from media/dynamicmem.png rename to archive/media/dynamicmem.png diff --git a/media/dynamicmem_mgmt01.png b/archive/media/dynamicmem_mgmt01.png similarity index 100% rename from media/dynamicmem_mgmt01.png rename to archive/media/dynamicmem_mgmt01.png diff --git a/media/enable_nested.png b/archive/media/enable_nested.png similarity index 100% rename from media/enable_nested.png rename to archive/media/enable_nested.png diff --git a/media/enhanced_session.png b/archive/media/enhanced_session.png similarity index 100% rename from media/enhanced_session.png rename to archive/media/enhanced_session.png diff --git a/media/extension_update.png b/archive/media/extension_update.png similarity index 100% rename from media/extension_update.png rename to archive/media/extension_update.png diff --git a/media/extension_update_needed.png b/archive/media/extension_update_needed.png similarity index 100% rename from media/extension_update_needed.png rename to archive/media/extension_update_needed.png diff --git a/media/flow_chart_ga.png b/archive/media/flow_chart_ga.png similarity index 100% rename from media/flow_chart_ga.png rename to archive/media/flow_chart_ga.png diff --git a/archive/media/flow_chart_ga_oct21.png b/archive/media/flow_chart_ga_oct21.png new file mode 100644 index 0000000000000000000000000000000000000000..bdbc7e77ac007fce3e2df72314288e417b8ef003 GIT binary patch literal 21586 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 literal 0 HcmV?d00001 diff --git a/media/flow_chart_paths_old.png b/archive/media/flow_chart_paths_old.png similarity index 100% rename from media/flow_chart_paths_old.png rename to archive/media/flow_chart_paths_old.png diff --git a/media/get_net_nat.png b/archive/media/get_net_nat.png similarity index 100% rename from media/get_net_nat.png rename to archive/media/get_net_nat.png diff --git a/media/ie_enhanced.png b/archive/media/ie_enhanced.png similarity index 100% rename from media/ie_enhanced.png rename to archive/media/ie_enhanced.png diff --git a/media/instaill_rsat.png b/archive/media/instaill_rsat.png similarity index 100% rename from media/instaill_rsat.png rename to archive/media/instaill_rsat.png diff --git a/media/ip_settings.PNG b/archive/media/ip_settings.PNG similarity index 100% rename from media/ip_settings.PNG rename to archive/media/ip_settings.PNG diff --git a/media/nested.png b/archive/media/nested.png similarity index 100% rename from media/nested.png rename to archive/media/nested.png diff --git a/media/nested_virt.png b/archive/media/nested_virt.png similarity index 100% rename from media/nested_virt.png rename to archive/media/nested_virt.png diff --git a/media/nested_virt_arch.png b/archive/media/nested_virt_arch.png similarity index 100% rename from media/nested_virt_arch.png rename to archive/media/nested_virt_arch.png diff --git a/media/nested_virt_arch_ga.png b/archive/media/nested_virt_arch_ga.png similarity index 100% rename from media/nested_virt_arch_ga.png rename to archive/media/nested_virt_arch_ga.png diff --git a/media/nested_virt_mgmt.png b/archive/media/nested_virt_mgmt.png similarity index 100% rename from media/nested_virt_mgmt.png rename to archive/media/nested_virt_mgmt.png diff --git a/media/nested_virt_mgmt_ga.png b/archive/media/nested_virt_mgmt_ga.png similarity index 100% rename from media/nested_virt_mgmt_ga.png rename to archive/media/nested_virt_mgmt_ga.png diff --git a/media/nested_virt_nodes.png b/archive/media/nested_virt_nodes.png similarity index 100% rename from media/nested_virt_nodes.png rename to archive/media/nested_virt_nodes.png diff --git a/media/nested_virt_nodes_ga.png b/archive/media/nested_virt_nodes_ga.png similarity index 100% rename from media/nested_virt_nodes_ga.png rename to archive/media/nested_virt_nodes_ga.png diff --git a/media/nested_virt_physical.png b/archive/media/nested_virt_physical.png similarity index 100% rename from media/nested_virt_physical.png rename to archive/media/nested_virt_physical.png diff --git a/media/nested_virt_physical_ga.png b/archive/media/nested_virt_physical_ga.png similarity index 100% rename from media/nested_virt_physical_ga.png rename to archive/media/nested_virt_physical_ga.png diff --git a/media/new_vm_dynamicmem.png b/archive/media/new_vm_dynamicmem.png similarity index 100% rename from media/new_vm_dynamicmem.png rename to archive/media/new_vm_dynamicmem.png diff --git a/media/new_vm_mgmt01.png b/archive/media/new_vm_mgmt01.png similarity index 100% rename from media/new_vm_mgmt01.png rename to archive/media/new_vm_mgmt01.png diff --git a/media/new_vm_mgmt01_vhd.png b/archive/media/new_vm_mgmt01_vhd.png similarity index 100% rename from media/new_vm_mgmt01_vhd.png rename to archive/media/new_vm_mgmt01_vhd.png diff --git a/media/new_vm_mgmt01_vhd_ga.png b/archive/media/new_vm_mgmt01_vhd_ga.png similarity index 100% rename from media/new_vm_mgmt01_vhd_ga.png rename to archive/media/new_vm_mgmt01_vhd_ga.png diff --git a/media/new_vm_name.png b/archive/media/new_vm_name.png similarity index 100% rename from media/new_vm_name.png rename to archive/media/new_vm_name.png diff --git a/media/new_vm_node.png b/archive/media/new_vm_node.png similarity index 100% rename from media/new_vm_node.png rename to archive/media/new_vm_node.png diff --git a/media/new_vm_node_memory.png b/archive/media/new_vm_node_memory.png similarity index 100% rename from media/new_vm_node_memory.png rename to archive/media/new_vm_node_memory.png diff --git a/media/new_vm_node_memory_ga.png b/archive/media/new_vm_node_memory_ga.png similarity index 100% rename from media/new_vm_node_memory_ga.png rename to archive/media/new_vm_node_memory_ga.png diff --git a/media/new_vm_node_settings.png b/archive/media/new_vm_node_settings.png similarity index 100% rename from media/new_vm_node_settings.png rename to archive/media/new_vm_node_settings.png diff --git a/media/new_vm_node_settings_ga.png b/archive/media/new_vm_node_settings_ga.png similarity index 100% rename from media/new_vm_node_settings_ga.png rename to archive/media/new_vm_node_settings_ga.png diff --git a/media/new_vm_node_vhd.png b/archive/media/new_vm_node_vhd.png similarity index 100% rename from media/new_vm_node_vhd.png rename to archive/media/new_vm_node_vhd.png diff --git a/media/new_vm_vhd.png b/archive/media/new_vm_vhd.png similarity index 100% rename from media/new_vm_vhd.png rename to archive/media/new_vm_vhd.png diff --git a/media/nic_adapter.png b/archive/media/nic_adapter.png similarity index 100% rename from media/nic_adapter.png rename to archive/media/nic_adapter.png diff --git a/media/node_ipconfig.png b/archive/media/node_ipconfig.png similarity index 100% rename from media/node_ipconfig.png rename to archive/media/node_ipconfig.png diff --git a/media/node_turned_off.png b/archive/media/node_turned_off.png similarity index 100% rename from media/node_turned_off.png rename to archive/media/node_turned_off.png diff --git a/media/physical.png b/archive/media/physical.png similarity index 100% rename from media/physical.png rename to archive/media/physical.png diff --git a/media/powershell_vm_deployed.png b/archive/media/powershell_vm_deployed.png similarity index 100% rename from media/powershell_vm_deployed.png rename to archive/media/powershell_vm_deployed.png diff --git a/media/reg_check.png b/archive/media/reg_check.png similarity index 100% rename from media/reg_check.png rename to archive/media/reg_check.png diff --git a/media/reg_check_ga.png b/archive/media/reg_check_ga.png similarity index 100% rename from media/reg_check_ga.png rename to archive/media/reg_check_ga.png diff --git a/media/register_azshci.png b/archive/media/register_azshci.png similarity index 100% rename from media/register_azshci.png rename to archive/media/register_azshci.png diff --git a/media/register_azshci_ga.png b/archive/media/register_azshci_ga.png similarity index 100% rename from media/register_azshci_ga.png rename to archive/media/register_azshci_ga.png diff --git a/media/registration_record.png b/archive/media/registration_record.png similarity index 100% rename from media/registration_record.png rename to archive/media/registration_record.png diff --git a/media/registration_rg.png b/archive/media/registration_rg.png similarity index 100% rename from media/registration_rg.png rename to archive/media/registration_rg.png diff --git a/media/registration_rg_ga.png b/archive/media/registration_rg_ga.png similarity index 100% rename from media/registration_rg_ga.png rename to archive/media/registration_rg_ga.png diff --git a/media/registration_status.png b/archive/media/registration_status.png similarity index 100% rename from media/registration_status.png rename to archive/media/registration_status.png diff --git a/media/sconfig.png b/archive/media/sconfig.png similarity index 100% rename from media/sconfig.png rename to archive/media/sconfig.png diff --git a/media/sconfig_nic.png b/archive/media/sconfig_nic.png similarity index 100% rename from media/sconfig_nic.png rename to archive/media/sconfig_nic.png diff --git a/media/startvm.png b/archive/media/startvm.png similarity index 100% rename from media/startvm.png rename to archive/media/startvm.png diff --git a/media/startvm_mgmt01.png b/archive/media/startvm_mgmt01.png similarity index 100% rename from media/startvm_mgmt01.png rename to archive/media/startvm_mgmt01.png diff --git a/media/sysdm.png b/archive/media/sysdm.png similarity index 100% rename from media/sysdm.png rename to archive/media/sysdm.png diff --git a/media/systeminfo_upd.png b/archive/media/systeminfo_upd.png similarity index 100% rename from media/systeminfo_upd.png rename to archive/media/systeminfo_upd.png diff --git a/media/vm_connect.png b/archive/media/vm_connect.png similarity index 100% rename from media/vm_connect.png rename to archive/media/vm_connect.png diff --git a/media/vm_connect_ga.png b/archive/media/vm_connect_ga.png similarity index 100% rename from media/vm_connect_ga.png rename to archive/media/vm_connect_ga.png diff --git a/media/w10_install_complete.png b/archive/media/w10_install_complete.png similarity index 100% rename from media/w10_install_complete.png rename to archive/media/w10_install_complete.png diff --git a/media/w10_setup.png b/archive/media/w10_setup.png similarity index 100% rename from media/w10_setup.png rename to archive/media/w10_setup.png diff --git a/media/wac_azshciclus.png b/archive/media/wac_azshciclus.png similarity index 100% rename from media/wac_azshciclus.png rename to archive/media/wac_azshciclus.png diff --git a/media/wac_azshciclus_ga.png b/archive/media/wac_azshciclus_ga.png similarity index 100% rename from media/wac_azshciclus_ga.png rename to archive/media/wac_azshciclus_ga.png diff --git a/media/wac_azure_connect.png b/archive/media/wac_azure_connect.png similarity index 100% rename from media/wac_azure_connect.png rename to archive/media/wac_azure_connect.png diff --git a/media/wac_azure_key.png b/archive/media/wac_azure_key.png similarity index 100% rename from media/wac_azure_key.png rename to archive/media/wac_azure_key.png diff --git a/media/wac_azure_key_ga.png b/archive/media/wac_azure_key_ga.png similarity index 100% rename from media/wac_azure_key_ga.png rename to archive/media/wac_azure_key_ga.png diff --git a/media/wac_azure_permissions.png b/archive/media/wac_azure_permissions.png similarity index 100% rename from media/wac_azure_permissions.png rename to archive/media/wac_azure_permissions.png diff --git a/media/wac_azure_reg_dashboard.png b/archive/media/wac_azure_reg_dashboard.png similarity index 100% rename from media/wac_azure_reg_dashboard.png rename to archive/media/wac_azure_reg_dashboard.png diff --git a/media/wac_azure_reg_dashboard_2.png b/archive/media/wac_azure_reg_dashboard_2.png similarity index 100% rename from media/wac_azure_reg_dashboard_2.png rename to archive/media/wac_azure_reg_dashboard_2.png diff --git a/media/wac_azure_reg_dashboard_3.png b/archive/media/wac_azure_reg_dashboard_3.png similarity index 100% rename from media/wac_azure_reg_dashboard_3.png rename to archive/media/wac_azure_reg_dashboard_3.png diff --git a/media/wac_azure_register.png b/archive/media/wac_azure_register.png similarity index 100% rename from media/wac_azure_register.png rename to archive/media/wac_azure_register.png diff --git a/media/wac_check_drives_ga.png b/archive/media/wac_check_drives_ga.png similarity index 100% rename from media/wac_check_drives_ga.png rename to archive/media/wac_check_drives_ga.png diff --git a/media/wac_clean_drives.png b/archive/media/wac_clean_drives.png similarity index 100% rename from media/wac_clean_drives.png rename to archive/media/wac_clean_drives.png diff --git a/media/wac_clean_drives_ga.png b/archive/media/wac_clean_drives_ga.png similarity index 100% rename from media/wac_clean_drives_ga.png rename to archive/media/wac_clean_drives_ga.png diff --git a/media/wac_cloud_witness_new.png b/archive/media/wac_cloud_witness_new.png similarity index 100% rename from media/wac_cloud_witness_new.png rename to archive/media/wac_cloud_witness_new.png diff --git a/media/wac_cloud_witness_new_ga.png b/archive/media/wac_cloud_witness_new_ga.png similarity index 100% rename from media/wac_cloud_witness_new_ga.png rename to archive/media/wac_cloud_witness_new_ga.png diff --git a/media/wac_cluster_success.png b/archive/media/wac_cluster_success.png similarity index 100% rename from media/wac_cluster_success.png rename to archive/media/wac_cluster_success.png diff --git a/media/wac_cluster_success_ga.png b/archive/media/wac_cluster_success_ga.png similarity index 100% rename from media/wac_cluster_success_ga.png rename to archive/media/wac_cluster_success_ga.png diff --git a/media/wac_cluster_type.png b/archive/media/wac_cluster_type.png similarity index 100% rename from media/wac_cluster_type.png rename to archive/media/wac_cluster_type.png diff --git a/media/wac_cluster_type_ga.png b/archive/media/wac_cluster_type_ga.png similarity index 100% rename from media/wac_cluster_type_ga.png rename to archive/media/wac_cluster_type_ga.png diff --git a/media/wac_compute_vswitch.png b/archive/media/wac_compute_vswitch.png similarity index 100% rename from media/wac_compute_vswitch.png rename to archive/media/wac_compute_vswitch.png diff --git a/media/wac_compute_vswitch_ga.png b/archive/media/wac_compute_vswitch_ga.png similarity index 100% rename from media/wac_compute_vswitch_ga.png rename to archive/media/wac_compute_vswitch_ga.png diff --git a/media/wac_create_clus.png b/archive/media/wac_create_clus.png similarity index 100% rename from media/wac_create_clus.png rename to archive/media/wac_create_clus.png diff --git a/media/wac_create_clus_ga.png b/archive/media/wac_create_clus_ga.png similarity index 100% rename from media/wac_create_clus_ga.png rename to archive/media/wac_create_clus_ga.png diff --git a/media/wac_credssp.png b/archive/media/wac_credssp.png similarity index 100% rename from media/wac_credssp.png rename to archive/media/wac_credssp.png diff --git a/media/wac_credssp_ga.png b/archive/media/wac_credssp_ga.png similarity index 100% rename from media/wac_credssp_ga.png rename to archive/media/wac_credssp_ga.png diff --git a/media/wac_define_network.png b/archive/media/wac_define_network.png similarity index 100% rename from media/wac_define_network.png rename to archive/media/wac_define_network.png diff --git a/media/wac_define_network_ga.png b/archive/media/wac_define_network_ga.png similarity index 100% rename from media/wac_define_network_ga.png rename to archive/media/wac_define_network_ga.png diff --git a/media/wac_domain_joined.png b/archive/media/wac_domain_joined.png similarity index 100% rename from media/wac_domain_joined.png rename to archive/media/wac_domain_joined.png diff --git a/media/wac_domain_joined_ga.png b/archive/media/wac_domain_joined_ga.png similarity index 100% rename from media/wac_domain_joined_ga.png rename to archive/media/wac_domain_joined_ga.png diff --git a/media/wac_enable_dedup.png b/archive/media/wac_enable_dedup.png similarity index 100% rename from media/wac_enable_dedup.png rename to archive/media/wac_enable_dedup.png diff --git a/media/wac_enable_dedup_ga.png b/archive/media/wac_enable_dedup_ga.png similarity index 100% rename from media/wac_enable_dedup_ga.png rename to archive/media/wac_enable_dedup_ga.png diff --git a/media/wac_enable_rdma.png b/archive/media/wac_enable_rdma.png similarity index 100% rename from media/wac_enable_rdma.png rename to archive/media/wac_enable_rdma.png diff --git a/media/wac_installed.png b/archive/media/wac_installed.png similarity index 100% rename from media/wac_installed.png rename to archive/media/wac_installed.png diff --git a/media/wac_installed_features.png b/archive/media/wac_installed_features.png similarity index 100% rename from media/wac_installed_features.png rename to archive/media/wac_installed_features.png diff --git a/media/wac_installed_features_ga.png b/archive/media/wac_installed_features_ga.png similarity index 100% rename from media/wac_installed_features_ga.png rename to archive/media/wac_installed_features_ga.png diff --git a/media/wac_management_nic.png b/archive/media/wac_management_nic.png similarity index 100% rename from media/wac_management_nic.png rename to archive/media/wac_management_nic.png diff --git a/media/wac_management_nic_ga.png b/archive/media/wac_management_nic_ga.png similarity index 100% rename from media/wac_management_nic_ga.png rename to archive/media/wac_management_nic_ga.png diff --git a/media/wac_move.png b/archive/media/wac_move.png similarity index 100% rename from media/wac_move.png rename to archive/media/wac_move.png diff --git a/media/wac_move_ga.png b/archive/media/wac_move_ga.png similarity index 100% rename from media/wac_move_ga.png rename to archive/media/wac_move_ga.png diff --git a/media/wac_nic_selection.png b/archive/media/wac_nic_selection.png similarity index 100% rename from media/wac_nic_selection.png rename to archive/media/wac_nic_selection.png diff --git a/media/wac_restart.png b/archive/media/wac_restart.png similarity index 100% rename from media/wac_restart.png rename to archive/media/wac_restart.png diff --git a/media/wac_restart_ga.png b/archive/media/wac_restart_ga.png similarity index 100% rename from media/wac_restart_ga.png rename to archive/media/wac_restart_ga.png diff --git a/media/wac_s2d_enabled.png b/archive/media/wac_s2d_enabled.png similarity index 100% rename from media/wac_s2d_enabled.png rename to archive/media/wac_s2d_enabled.png diff --git a/media/wac_s2d_enabled_ga.png b/archive/media/wac_s2d_enabled_ga.png similarity index 100% rename from media/wac_s2d_enabled_ga.png rename to archive/media/wac_s2d_enabled_ga.png diff --git a/media/wac_singlemgmt.png b/archive/media/wac_singlemgmt.png similarity index 100% rename from media/wac_singlemgmt.png rename to archive/media/wac_singlemgmt.png diff --git a/media/wac_singlemgmt_ga.png b/archive/media/wac_singlemgmt_ga.png similarity index 100% rename from media/wac_singlemgmt_ga.png rename to archive/media/wac_singlemgmt_ga.png diff --git a/media/wac_storage_validated.png b/archive/media/wac_storage_validated.png similarity index 100% rename from media/wac_storage_validated.png rename to archive/media/wac_storage_validated.png diff --git a/media/wac_storage_validated_ga.png b/archive/media/wac_storage_validated_ga.png similarity index 100% rename from media/wac_storage_validated_ga.png rename to archive/media/wac_storage_validated_ga.png diff --git a/media/wac_validate_storage.png b/archive/media/wac_validate_storage.png similarity index 100% rename from media/wac_validate_storage.png rename to archive/media/wac_validate_storage.png diff --git a/media/wac_validate_storage_ga.png b/archive/media/wac_validate_storage_ga.png similarity index 100% rename from media/wac_validate_storage_ga.png rename to archive/media/wac_validate_storage_ga.png diff --git a/media/wac_validated.png b/archive/media/wac_validated.png similarity index 100% rename from media/wac_validated.png rename to archive/media/wac_validated.png diff --git a/media/wac_validated_ga.png b/archive/media/wac_validated_ga.png similarity index 100% rename from media/wac_validated_ga.png rename to archive/media/wac_validated_ga.png diff --git a/media/wac_verify_drives.png b/archive/media/wac_verify_drives.png similarity index 100% rename from media/wac_verify_drives.png rename to archive/media/wac_verify_drives.png diff --git a/media/wac_verify_network.png b/archive/media/wac_verify_network.png similarity index 100% rename from media/wac_verify_network.png rename to archive/media/wac_verify_network.png diff --git a/media/wac_verify_network_ga.png b/archive/media/wac_verify_network_ga.png similarity index 100% rename from media/wac_verify_network_ga.png rename to archive/media/wac_verify_network_ga.png diff --git a/media/wac_vm001.png b/archive/media/wac_vm001.png similarity index 100% rename from media/wac_vm001.png rename to archive/media/wac_vm001.png diff --git a/media/wac_vm001_ga.png b/archive/media/wac_vm001_ga.png similarity index 100% rename from media/wac_vm001_ga.png rename to archive/media/wac_vm001_ga.png diff --git a/media/wac_vm_storage.png b/archive/media/wac_vm_storage.png similarity index 100% rename from media/wac_vm_storage.png rename to archive/media/wac_vm_storage.png diff --git a/media/wac_vm_storage_deployed.png b/archive/media/wac_vm_storage_deployed.png similarity index 100% rename from media/wac_vm_storage_deployed.png rename to archive/media/wac_vm_storage_deployed.png diff --git a/media/wac_vm_storage_deployed_ga.png b/archive/media/wac_vm_storage_deployed_ga.png similarity index 100% rename from media/wac_vm_storage_deployed_ga.png rename to archive/media/wac_vm_storage_deployed_ga.png diff --git a/media/wac_vm_storage_ga.png b/archive/media/wac_vm_storage_ga.png similarity index 100% rename from media/wac_vm_storage_ga.png rename to archive/media/wac_vm_storage_ga.png diff --git a/media/wac_vswitches.png b/archive/media/wac_vswitches.png similarity index 100% rename from media/wac_vswitches.png rename to archive/media/wac_vswitches.png diff --git a/media/wac_vswitches_ga.png b/archive/media/wac_vswitches_ga.png similarity index 100% rename from media/wac_vswitches_ga.png rename to archive/media/wac_vswitches_ga.png diff --git a/media/ws_install_complete.png b/archive/media/ws_install_complete.png similarity index 100% rename from media/ws_install_complete.png rename to archive/media/ws_install_complete.png diff --git a/media/ws_setup.png b/archive/media/ws_setup.png similarity index 100% rename from media/ws_setup.png rename to archive/media/ws_setup.png diff --git a/nested/steps/1a_NestedOnPhysical.md b/archive/steps/1_NestedOnPhysical.md similarity index 96% rename from nested/steps/1a_NestedOnPhysical.md rename to archive/steps/1_NestedOnPhysical.md index ebbfccb..f1f6205 100644 --- a/nested/steps/1a_NestedOnPhysical.md +++ b/archive/steps/1_NestedOnPhysical.md @@ -28,7 +28,7 @@ Architecture From an architecture perspective, the following graphic showcases the different layers and interconnections between the different components: -![Architecture diagram for Azure Stack HCI 20H2 nested on a physical system](/media/nested_virt_physical_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested on a physical system") +![Architecture diagram for Azure Stack HCI 20H2 nested on a physical system](/archive/media/nested_virt_physical_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested on a physical system") Will my hardware support this? ----------- @@ -52,7 +52,7 @@ If you can't run the Windows 10 Insider builds on your AMD-based system, it may ### Verify Hardware Compatibility ### After checking the operating system and hardware requirements above, verify hardware compatibility in Windows by opening a PowerShell session or a command prompt (cmd.exe) window, typing **systeminfo**, and then checking the Hyper-V Requirements section. If all listed Hyper-V requirements have a value of **Yes**, your system can run the Hyper-V role. If any item returns No, check the requirements above and make adjustments where possible. -![Hyper-V requirements](/media/systeminfo_upd.png "Hyper-V requirements") +![Hyper-V requirements](/archive/media/systeminfo_upd.png "Hyper-V requirements") If you run **systeminfo** on an existing Hyper-V host, the Hyper-V Requirements section reads: @@ -64,7 +64,7 @@ With 16GB memory, running on a laptop, we'll need to ensure that we're taking ad **NOTE** When you configure your nested Azure Stack HCI 20H2 nodes later, they will **require a minimum of 4GB RAM per node**, otherwise, they won't boot, so on a 16GB system, expect 2-3 nodes plus management infrastructure realistically - if you see the screenshot below, on my 16GB laptop, you'll see 2 Azure Stack HCI 20H2 nodes, with DC01/MGMT01, with a little memory left over for the host. -![Azure Stack HCI 20H2 cluster running on a laptop](/media/azshci_laptop.png "Azure Stack HCI 20H2 cluster running on a laptop") +![Azure Stack HCI 20H2 cluster running on a laptop](/archive/media/azshci_laptop.png "Azure Stack HCI 20H2 cluster running on a laptop") Obviously, if you have a larger physical system, such as a workstation, or server, you'll likely have a greater amount of memory available to you, therefore you can adjust the memory levels for the different resources accordingly. @@ -149,7 +149,7 @@ Get-NetNat The **Get-NetNat** cmdlet gets Network Address Translation (NAT) objects configured on a computer. NAT modifies IP address and port information in packet headers. Your configuration should look similar to the configuration below: -![Result of Get-NetNat PowerShell command](/media/get_net_nat.png "Result of Get-NetNat PowerShell command") +![Result of Get-NetNat PowerShell command](/archive/media/get_net_nat.png "Result of Get-NetNat PowerShell command") The final part of the process is to enable Enhanced Session mode. Enhanced Session mode can be useful to enhance the user experience, particularly when using the Windows 10 Management VM later, when connecting to a VM over VMConnect. To enable Enhanced Session Mode with PowerShell, run the following on your Hyper-V host: diff --git a/nested/steps/2a_ManagementInfraGUI.md b/archive/steps/2a_ManagementInfraGUI.md similarity index 88% rename from nested/steps/2a_ManagementInfraGUI.md rename to archive/steps/2a_ManagementInfraGUI.md index 74a9b38..88410af 100644 --- a/nested/steps/2a_ManagementInfraGUI.md +++ b/archive/steps/2a_ManagementInfraGUI.md @@ -2,7 +2,7 @@ Deploy management infrastructure with the GUI ============== Overview ----------- -With your Hyper-V host up and running, either in Azure, or on a local physical system, it's now time to deploy the core management infrastructure to support the Azure Stack HCI 20H2 deployment in a future step. +With your Hyper-V host up and running, it's now time to deploy the core management infrastructure to support the Azure Stack HCI 20H2 deployment in a future step. ### Important Note ### In this step, you'll be using the GUI (Graphical User Interface, such as Hyper-V Manager, Server Manager etc) to create resources. If you prefer to use PowerShell, which may allow faster completion, head on over to the [PowerShell guide](/nested/steps/2b_ManagementInfraPS.md). @@ -24,7 +24,7 @@ Architecture As shown on the architecture graphic below, the core management infrastructure consists of a Windows Server 2019 domain controller VM, along with a Windows 10 Enterprise VM, which will run the Windows Admin Center. In this step, you'll deploy both of those key components. -![Architecture diagram for Azure Stack HCI 20H2 nested with management infra highlighted](/media/nested_virt_mgmt_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested with management infra highlighted") +![Architecture diagram for Azure Stack HCI 20H2 nested with management infra highlighted](/archive/media/nested_virt_mgmt_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested with management infra highlighted") However, before you deploy your management infrastructure, first, you need to download the necessary software components required to complete this evalution. @@ -52,7 +52,7 @@ If you're running Windows Server 2019 as your Hyper-V host, it doesn't ship with 3. In the **Properties** view, find the **IE Enhanced Security Configuration** item, and click on **On** 4. In the **Internet Explorer Enhanced Security Configuration** window, under **Administrators**, click **Off** and click **OK** -![Setting the Internet Explorer Enhanced Security Configuration to Off](/media/ie_enhanced.png "Setting the Internet Explorer Enhanced Security Configuration to Off") +![Setting the Internet Explorer Enhanced Security Configuration to Off](/archive/media/ie_enhanced.png "Setting the Internet Explorer Enhanced Security Configuration to Off") 5. Close **Server Manager** @@ -64,7 +64,7 @@ Next, in order to download the ISO files, **open your web browser** and follow t 3. Visit https://azure.microsoft.com/en-us/products/azure-stack/hci/hci-download, complete the registration form, and download the ISO. Save the file as **AzSHCI.iso** to C:\ISO 4. Visit https://aka.ms/wacdownload to download the executables for the Windows Admin Center. Save it as **WindowsAdminCenter.msi**, also in C:\ISO -![All files have been downloaded onto your Hyper-V host](/media/download_files.png "All files have been downloaded onto your Hyper-V host") +![All files have been downloaded onto your Hyper-V host](/archive/media/download_files.png "All files have been downloaded onto your Hyper-V host") With all files downloaded, proceed on to creating your management infrastructure. @@ -86,17 +86,17 @@ In this step, you'll be using Hyper-V Manager to deploy a Windows Server 2019 do 5. Tick the box for **Store the virtual machine in a different location** and click **Browse** 6. In the **Select Folder** window, click on **This PC**, navigate to **C:**, click on **New Folder**, name it **VMs** then click **Select Folder** and click **Next** -![Specify VM name and location](/media/new_vm_name.png "Specify VM name and location") +![Specify VM name and location](/archive/media/new_vm_name.png "Specify VM name and location") 7. On the **Specify Generation** page, select **Generation 2** and click **Next** 8. On the **Assign Memory** page, assign 4GB memory by entering **4096** for Startup memory and tick the **Use Dynamic Memory for this virtual machine**, then click **Next** -![Assign VM memory](/media/new_vm_dynamicmem.png "Assign VM memory") +![Assign VM memory](/archive/media/new_vm_dynamicmem.png "Assign VM memory") 9. On the **Configure Networking** page, select **InternalNAT** and click **Next** 10. On the **Connect Virtual Hard Disk** page, set the **size** to **30** and click **Next** -![Connect Virtual Hard Disk](/media/new_vm_vhd.png "Connect Virtual Hard Disk") +![Connect Virtual Hard Disk](/archive/media/new_vm_vhd.png "Connect Virtual Hard Disk") 11. On the **Installation Options** page, select **Install an operating system from a bootable image file**, and click **Browse** 12. Navigate to **C:\ISO** and select your **WS2019.iso** file, and click **Open**. Then click **Next** @@ -109,23 +109,23 @@ Your new DC01 virtual machine will now be created. Once created, we need to mak * Minimum RAM: 1024 * Maximum RAM: 4096 -![Updating memory for DC01](/media/dynamicmem.png "Updating memory for DC01") +![Updating memory for DC01](/archive/media/dynamicmem.png "Updating memory for DC01") 3. If you are running on a **Windows 10 Hyper-V host**, you should **disable automatic checkpoints**. From the **Settings** window, under **Management**, click **Checkpoints** and then if ticked, **untick** the **Enable checkpoints** box, then click **Apply** 4. Finally, under **Automatic Start Action**, select **Always start this virtual machine automatically**, then click **OK** With the VM configured correctly, in **Hyper-V Manager**, double-click DC01. This should open the VM Connect window. -![Starting up DC01](/media/startvm.png "Starting up DC01") +![Starting up DC01](/archive/media/startvm.png "Starting up DC01") In the center of the window, there is a message explaining the VM is currently switched off. Click on **Start** and then quickly **press any key** inside the VM to boot from the ISO file. If you miss the prompt to press a key to boot from CD or DVD, simply reset the VM and try again. -![Booting the VM and triggering the boot from DVD](/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") +![Booting the VM and triggering the boot from DVD](/archive/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") ### Complete the Out of Box Experience (OOBE) ### With the VM running, and the boot process initiated, you should be in a position to start the deployment of the Windows Server 2019 OS. -![Initiate setup of the Windows Server 2019 OS](/media/ws_setup.png "Initiate setup of the Windows Server 2019 OS") +![Initiate setup of the Windows Server 2019 OS](/archive/media/ws_setup.png "Initiate setup of the Windows Server 2019 OS") Proceed through the process, making the following selections: @@ -161,7 +161,7 @@ Firstly, you will configure the networking inside the VM and rename the OS, befo * Preferred DNS server: 1.1.1.1 * Alternate DNS server: 1.0.0.1 -![Network settings for DC01](/media/dc_nic.png "Network settings for DC01") +![Network settings for DC01](/archive/media/dc_nic.png "Network settings for DC01") #### Optional - Update DC01 with latest Windows Updates #### If you'd like to ensure DC01 is fully updated, click on **Start**, search for **Updates** and select **Check for Updates** in the results. Check for any new updates and install any that are required. This may take a few minutes. @@ -186,13 +186,13 @@ First, you'll configure Active Directory: 11. On the **DNS Server** page, click **Next** 12. On the **Confirmation** page, review the information and click **Install** -![Active Directory Domain Services installation progress](/media/dc_install_progress.png "Active Directory Domain Services installation progress") +![Active Directory Domain Services installation progress](/archive/media/dc_install_progress.png "Active Directory Domain Services installation progress") The installation of Active Directory Domain Services will begin, and take a few moments to complete. Once complete, click **Promote this server to a domain controller** to continue the configuration of DC01. The **Active Directory Domain Services Configuration Wizard** should open. 1. On the **Deployment configuration** page, select **Add a new forest**, enter **azshci.local** as the Root domain name, and click **Next** -![Active Directory Domain Services configuration wizard](/media/adds_wizard.png "Active Directory Domain Services configuration wizard") +![Active Directory Domain Services configuration wizard](/archive/media/adds_wizard.png "Active Directory Domain Services configuration wizard") 2. On the **Domain Controller options** page, leave the defaults, provide a **Directory Services Restore Mode (DSRM) password**, then click **Next** 3. On the **DNS Options** page, click **Next** @@ -202,7 +202,7 @@ The installation of Active Directory Domain Services will begin, and take a few The prerequisites will then be checked, and once completed, click **Install**. This will take a few moments. -![Active Directory Domain Services configuration wizard prerequisites check](/media/adds_prereq.png "Active Directory Domain Services configuration wizard prerequisites check") +![Active Directory Domain Services configuration wizard prerequisites check](/archive/media/adds_prereq.png "Active Directory Domain Services configuration wizard prerequisites check") Once completed, DC01 should reboot automatically, but if not, ensure you reboot it yourself. @@ -222,14 +222,14 @@ Rather than use the main domain admin account, we'll add an additional administr * Full name: Lab Admin * User logon name: labadmin -![Active Directory Domain Services New Object wizard - adding a user](/media/adds_new_user.png "Active Directory Domain Services New Object wizard - adding a user") +![Active Directory Domain Services New Object wizard - adding a user](/archive/media/adds_new_user.png "Active Directory Domain Services New Object wizard - adding a user") 4. Provide a password for this new account, and **tick the Password never expires** box, then click **Next**, then click **Finish** 5. Click on the **Users** OU, and find the new **Lab Admin** account 6. Right-click the **Lab Admin** account, and click **Add to a group...** 7. In the **Select Groups** window, in the **Enter the object names to select** box, enter **Domain Admins**, **Schema Admins** and **Enterprise Admins**, clicking **Check Names** after each one, then click **OK**, then **OK** to close the confirmation popup -![Active Directory Domain Services New Object wizard - adding a user to groups](/media/adds_group.png "Active Directory Domain Services New Object wizard - adding a user to groups") +![Active Directory Domain Services New Object wizard - adding a user to groups](/archive/media/adds_group.png "Active Directory Domain Services New Object wizard - adding a user to groups") 8. Close the **Active Directory Users and Computers** window @@ -253,17 +253,17 @@ In this step, you'll be using Hyper-V Manager to deploy a Windows 10 Enterprise 5. Tick the box for **Store the virtual machine in a different location** and click **Browse** 6. In the **Select Folder** window, click on **This PC**, navigate to **C:**, click on **VMs**, click **Select Folder** and click **Next** -![Specify VM name and location](/media/new_vm_mgmt01.png "Specify VM name and location") +![Specify VM name and location](/archive/media/new_vm_mgmt01.png "Specify VM name and location") 7. On the **Specify Generation** page, select **Generation 2** and click **Next** 8. On the **Assign Memory** page, assign 4GB memory by entering **4096** for Startup memory and tick the **Use Dynamic Memory for this virtual machine**, then click **Next** -![Assign VM memory](/media/new_vm_dynamicmem.png "Assign VM memory") +![Assign VM memory](/archive/media/new_vm_dynamicmem.png "Assign VM memory") 9. On the **Configure Networking** page, select **InternalNAT** and click **Next** 10. On the **Connect Virtual Hard Disk** page, leave the **size** at **127** and click **Next** -![Connect Virtual Hard Disk](/media/new_vm_mgmt01_vhd_ga.png "Connect Virtual Hard Disk") +![Connect Virtual Hard Disk](/archive/media/new_vm_mgmt01_vhd_ga.png "Connect Virtual Hard Disk") 11. On the **Installation Options** page, select **Install an operating system from a bootable image file**, and click **Browse** 12. Navigate to **C:\ISO** and select your **W10.iso** file, and click **Open**. Then click **Next** @@ -277,22 +277,22 @@ Your new MGMT01 virtual machine will now be created. Once created, we need to m * Minimum RAM: 2048 * Maximum RAM: 4096 -![Updating memory for MGMT01](/media/dynamicmem_mgmt01.png "Updating memory for MGMT01") +![Updating memory for MGMT01](/archive/media/dynamicmem_mgmt01.png "Updating memory for MGMT01") 3. If you are running on a **Windows 10 Hyper-V host**, you should **disable automatic checkpoints**. From the **Settings** window, under **Management**, click **Checkpoints** and then if ticked, **untick** the **Enable checkpoints** box, then click **OK** With the VM configured correctly, in **Hyper-V Manager**, double-click MGMT01. This should open the VM Connect window. -![Starting up MGMT01](/media/startvm_mgmt01.png "Starting up MGMT01") +![Starting up MGMT01](/archive/media/startvm_mgmt01.png "Starting up MGMT01") In the center of the window, there is a message explaining the VM is currently switched off. Click on **Start** and then quickly **press any key** inside the VM to boot from the ISO file. If you miss the prompt to press a key to boot from CD or DVD, simply reset the VM and try again. -![Booting the VM and triggering the boot from DVD](/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") +![Booting the VM and triggering the boot from DVD](/archive/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") ### Complete the Out of Box Experience (OOBE) ### With the VM running, and the boot process initiated, you should be in a position to start the deployment of the Windows 10 OS. -![Initiate setup of Windows 10](/media/w10_setup.png "Initiate setup of Windows 10") +![Initiate setup of Windows 10](/archive/media/w10_setup.png "Initiate setup of Windows 10") Proceed through the process, making the following selections: @@ -322,7 +322,7 @@ With MGMT01 up and running, it's time to configure the networking so it can comm 1. In the bottom-right corner, right-click the NIC icon, and select **Open Network & Internet settings** -![Select NIC](/media/nic_adapter.png "Select NIC") +![Select NIC](/archive/media/nic_adapter.png "Select NIC") 2. In the **Settings** window, click on **Ethernet** and then click on the **Ethernet adapter** shown in the central window 3. Under **IP settings**, click **Edit**, then enter the following information, then click **Save** and close **Settings** @@ -333,7 +333,7 @@ With MGMT01 up and running, it's time to configure the networking so it can comm * Gateway: 192.168.0.1 * Preferred DNS: 192.168.0.2 -![Setting static NIC settings](/media/ip_settings.PNG "Setting static NIC settings") +![Setting static NIC settings](/archive/media/ip_settings.PNG "Setting static NIC settings") #### Optional - Install the new Microsoft Edge #### It's highly recommended to install the new version of the Microsoft Edge browser, as it gives a much smoother browsing experience, and is more efficient with it's use of limited resources, if you've deployed in a memory-constrained environment. @@ -357,7 +357,7 @@ Before installing the Windows Admin Center, you'll join MGMT01 to the azshci.loc 1. Ensure you're logged into MGMT01, then click on **Start** and enter **sysdm.cpl**, then in the results, select **sysdm.cpl** -![Open the System Properties dialog box](/media/sysdm.png "Open the System Properties dialog box") +![Open the System Properties dialog box](/archive/media/sysdm.png "Open the System Properties dialog box") 2. In the **System Properties** window, click on **Change**, then enter the following details, then click **OK** @@ -380,11 +380,11 @@ Firstly, navigate to C:\ISO, or wherever you chose to store your ISOs and Window Navigate to **Hyper-V Manager**, locate **MGMT01** and double-click the VM. This will open the VM Connect window. If you haven't set this already, you should be presented with a **Connect to MGMT01** screen. Ensure that the display size is set to **Full Screen** and using the **Show Options** dropdown, ensure that **Save my settings for future connections to this virtual machine** is ticked, then click **Connect**. -![Establish a VM Connect session to MGMT01](/media/connect_to_mgmt01.png "Establish a VM Connect session to MGMT01") +![Establish a VM Connect session to MGMT01](/archive/media/connect_to_mgmt01.png "Establish a VM Connect session to MGMT01") **NOTE** if you don't see the prompt for **Enhanced Session Mode**, simply click on the **Enhanced Session** button in the VM Connect window to activate it, and define your default settings. -![Enhanced Session Mode button](/media/enhanced_session.png "Enhanced Session Mode button") +![Enhanced Session Mode button](/archive/media/enhanced_session.png "Enhanced Session Mode button") When prompted, enter your **Lab Admin (azshci.local\labadmin) credentials** to log into MGMT01. When on the desktop, **right-click** and select **paste** to transfer the Windows Admin Center executable onto the desktop of MGMT01. @@ -395,18 +395,18 @@ To install the Windows Admin Center, simply **double-click** the executable on t 3. On the **Install Windows Admin Center on Windows 10** screen, read the installation information, then click **Next** 4. On the **Installing Windows Admin Center** screen, tick the **Create a desktop shortcut...** box, and click **Install**. The install process will take a few minutes, and once completed, you should be presented with some certificate information. -![Windows Admin Center installed](/media/wac_installed.png "Windows Admin Center installed") +![Windows Admin Center installed](/archive/media/wac_installed.png "Windows Admin Center installed") 5. Tick the **Open Windows Admin Center** box, and click **Finish** 6. Windows Admin Center will now open on https://localhost:port/ 7. Once open, you may receive notifications in the top-right corner, indicating that some extensions may require updating. -![Windows Admin Center extensions available](/media/extension_update.png "Windows Admin Center extensions available") +![Windows Admin Center extensions available](/archive/media/extension_update.png "Windows Admin Center extensions available") 8. If you do require extension updates, click on the notification, then **Go to Extensions** 9. On the **Extensions** page, you'll find a list of installed extensions. Any that require an update will be listed: -![Windows Admin Center extensions required](/media/extension_update_needed.png "Windows Admin Center extensions required") +![Windows Admin Center extensions required](/archive/media/extension_update_needed.png "Windows Admin Center extensions required") 10. Click on the extension, and click **Update**. This will take a few moments, and will reload the page when complete. With the extensions updated, navigate back to the Windows Admin Center homepage. diff --git a/nested/steps/2b_ManagementInfraPS.md b/archive/steps/2b_ManagementInfraPS.md similarity index 95% rename from nested/steps/2b_ManagementInfraPS.md rename to archive/steps/2b_ManagementInfraPS.md index d88c13b..44f83c4 100644 --- a/nested/steps/2b_ManagementInfraPS.md +++ b/archive/steps/2b_ManagementInfraPS.md @@ -3,7 +3,7 @@ Deploy management infrastructure with PowerShell Overview ----------- -With your Hyper-V host up and running, either in Azure, or on a local physical system, it's now time to deploy the core management infrastructure to support the Azure Stack HCI 20H2 deployment in a future step. +With your Hyper-V host up and running, it's now time to deploy the core management infrastructure to support the Azure Stack HCI 20H2 deployment in a future step. Contents ----------- @@ -26,7 +26,7 @@ Architecture As shown on the architecture graphic below, the core management infrastructure consists of a Windows Server 2019 domain controller VM, along with a Windows 10 Enterprise VM, which will run the Windows Admin Center. In this step, you'll deploy both of those key components. -![Architecture diagram for Azure Stack HCI 20H2 nested with management infra highlighted](/media/nested_virt_mgmt_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested with management infra highlighted") +![Architecture diagram for Azure Stack HCI 20H2 nested with management infra highlighted](/archive/media/nested_virt_mgmt_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested with management infra highlighted") However, before you deploy your management infrastructure, first, you need to download the necessary software components required to complete this evalution. @@ -61,7 +61,7 @@ Next, in order to download the ISO files, **open your web browser** and follow t 3. Visit https://azure.microsoft.com/en-us/products/azure-stack/hci/hci-download, complete the registration form, and download the ISO. Save the file as **AzSHCI.iso** to C:\ISO 4. Visit https://aka.ms/wacdownload to download the executables for the Windows Admin Center. Save it as **WindowsAdminCenter.msi**, also in C:\ISO -![All files have been downloaded onto your Hyper-V host](/media/download_files.png "All files have been downloaded onto your Hyper-V host") +![All files have been downloaded onto your Hyper-V host](/archive/media/download_files.png "All files have been downloaded onto your Hyper-V host") With all files downloaded, proceed on to creating your management infrastructure. @@ -116,12 +116,12 @@ Start-Sleep -Seconds 5 # Just gives enough time to see the "Press any key..." me Start-VM -Name DC01 ``` -![Booting the VM and triggering the boot from DVD](/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") +![Booting the VM and triggering the boot from DVD](/archive/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") ### Complete the Out of Box Experience (OOBE) ### With the VM running, and the boot process initiated, you should be in a position to start the deployment of the Windows Server 2019 OS. -![Initiate setup of the Windows Server 2019 OS](/media/ws_setup.png "Initiate setup of the Windows Server 2019 OS") +![Initiate setup of the Windows Server 2019 OS](/archive/media/ws_setup.png "Initiate setup of the Windows Server 2019 OS") Proceed through the process, making the following selections: @@ -134,7 +134,7 @@ Proceed through the process, making the following selections: Installation will then begin, and will take a few minutes, automatically rebooting as part of the process. -![Initiate setup of the Windows Server 2019 OS](/media/ws_install_complete.png "Initiate setup of the Windows Server 2019 OS") +![Initiate setup of the Windows Server 2019 OS](/archive/media/ws_install_complete.png "Initiate setup of the Windows Server 2019 OS") With the installation complete, you'll be prompted to change the password before logging in. Enter a password, and once complete, you should be at the **C:\Users\Administrator** screen. You can **close** the VM Connect window, as we will continue configuring the domain controller using PowerShell, from AzSHCIHost001. @@ -229,7 +229,7 @@ Invoke-Command -VMName DC01 -Credential $dcCreds -ScriptBlock { When the process is completed successfully, you should see a message similar to this below. Once validated, you should be able to reboot the domain controller and proceed on through the process. -![Active Directory role successfully install and domain controller configured](/media/dc_created.png "Active Directory role successfully install and domain controller configured") +![Active Directory role successfully install and domain controller configured](/archive/media/dc_created.png "Active Directory role successfully install and domain controller configured") ```powershell Write-Verbose "Rebooting DC01 to finish installing of Active Directory" -Verbose @@ -327,12 +327,12 @@ Start-Sleep -Seconds 5 Start-VM -Name MGMT01 ``` -![Booting the VM and triggering the boot from DVD](/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") +![Booting the VM and triggering the boot from DVD](/archive/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") ### Complete the Out of Box Experience (OOBE) ### With the VM running, and the boot process initiated, you should be in a position to start the deployment of the Windows 10 OS. -![Initiate setup of Windows 10](/media/w10_setup.png "Initiate setup of Windows 10") +![Initiate setup of Windows 10](/archive/media/w10_setup.png "Initiate setup of Windows 10") Proceed through the process, making the following selections: @@ -381,7 +381,7 @@ vmconnect.exe localhost MGMT01 This will open the VM Connect window. You should be presented with a **Connect to MGMT01** screen. Ensure that the display size is set to **Full Screen** and using the **Show Options** dropdown, ensure that **Save my settings for future connections to this virtual machine** is ticked, then click **Connect**. -![Establish a VM Connect session to MGMT01](/media/connect_to_mgmt01.png "Establish a VM Connect session to MGMT01") +![Establish a VM Connect session to MGMT01](/archive/media/connect_to_mgmt01.png "Establish a VM Connect session to MGMT01") 1. Open the existing **Microsoft Edge** browser, and navigate to https://www.microsoft.com/edge 2. On the landing page, click on **Download** and when prompted, **read the license terms** then click **Accept and download** @@ -452,18 +452,18 @@ To install the Windows Admin Center, simply **double-click** the executable on t 3. On the **Install Windows Admin Center on Windows 10** screen, read the installation information, then click **Next** 4. On the **Installing Windows Admin Center** screen, tick the **Create a desktop shortcut...** box, and click **Install**. The install process will take a few minutes, and once completed, you should be presented with some certificate information. -![Windows Admin Center installed](/media/wac_installed.png "Windows Admin Center installed") +![Windows Admin Center installed](/archive/media/wac_installed.png "Windows Admin Center installed") 5. Tick the **Open Windows Admin Center** box, and click **Finish** 6. Windows Admin Center will now open on https://localhost:port/ 7. Once open, you may receive notifications in the top-right corner, indicating that some extensions may require updating. -![Windows Admin Center extensions available](/media/extension_update.png "Windows Admin Center extensions available") +![Windows Admin Center extensions available](/archive/media/extension_update.png "Windows Admin Center extensions available") 8. If you do require extension updates, click on the notification, then **Go to Extensions** 9. On the **Extensions** page, you'll find a list of installed extensions. Any that require an update will be listed: -![Windows Admin Center extensions required](/media/extension_update_needed.png "Windows Admin Center extensions required") +![Windows Admin Center extensions required](/archive/media/extension_update_needed.png "Windows Admin Center extensions required") 10. Click on the extension, and click **Update**. This will take a few moments, and will reload the page when complete. With the extensions updated, navigate back to the Windows Admin Center homepage. diff --git a/nested/steps/3a_AzSHCINodesGUI.md b/archive/steps/3a_AzSHCINodesGUI.md similarity index 89% rename from nested/steps/3a_AzSHCINodesGUI.md rename to archive/steps/3a_AzSHCINodesGUI.md index 1c402b3..4c07ea4 100644 --- a/nested/steps/3a_AzSHCINodesGUI.md +++ b/archive/steps/3a_AzSHCINodesGUI.md @@ -20,7 +20,7 @@ Architecture As shown on the architecture graphic below, in this step, **you'll deploy a number of nested Azure Stack HCI 20H2 nodes**. The minimum number for deployment of a local Azure Stack HCI 20H2 cluster is **2 nodes**, however if your Hyper-V host has enough spare capacity, you could deploy additional nested nodes, and explore more complex scenarios, such as a nested **stretch cluster**. For the purpose of this step, we'll focus on deploying 2 nodes, however you should make adjustments based on your environment. -![Architecture diagram for Azure Stack HCI 20H2 nested](/media/nested_virt_nodes_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested") +![Architecture diagram for Azure Stack HCI 20H2 nested](/archive/media/nested_virt_nodes_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested") Create your first nested Azure Stack HCI 20H2 node ----------- @@ -40,12 +40,12 @@ In this step, you'll be using Hyper-V Manager to deploy an Azure Stack HCI 20H2 5. Tick the box for **Store the virtual machine in a different location** and click **Browse** 6. In the **Select Folder** window, click on **This **PC****, navigate to **C:**, click on the **VMs** folder, click **Select Folder** and then click **Next** -![Specify VM name and location](/media/new_vm_node.png "Specify VM name and location") +![Specify VM name and location](/archive/media/new_vm_node.png "Specify VM name and location") 7. On the **Specify Generation** page, select **Generation 2** and click **Next** 8. On the **Assign Memory** page, assign 24GB memory by entering **24576** for Startup memory and leave the the **Use Dynamic Memory for this virtual machine** empty, then click **Next** -![Assign VM memory](/media/new_vm_node_memory_ga.png "Assign VM memory") +![Assign VM memory](/archive/media/new_vm_node_memory_ga.png "Assign VM memory") #### Dynamic Memory and Runtime Memory Resize #### When Hyper-V is running inside a virtual machine, the virtual machine must be turned off to adjust its memory. This means that even if dynamic memory is enabled, **the amount of memory will not fluctuate**. For virtual machines without dynamic memory enabled, any attempt to adjust the amount of memory while it's on will fail. Note that simply enabling nested virtualization will have no effect on dynamic memory or runtime memory resize. The incompatibility only occurs while Hyper-V is running in the VM. @@ -55,7 +55,7 @@ When Hyper-V is running inside a virtual machine, the virtual machine must be tu 9. On the **Configure Networking** page, select **InternalNAT** and click **Next** 10. On the **Connect Virtual Hard Disk** page, change **size** to **30** and click **Next** -![Connect Virtual Hard Disk](/media/new_vm_node_vhd.png "Connect Virtual Hard Disk") +![Connect Virtual Hard Disk](/archive/media/new_vm_node_vhd.png "Connect Virtual Hard Disk") 11. On the **Installation Options** page, select **Install an operating system from a bootable image file**, and click **Browse** 12. Navigate to **C:\ISO** and select your **AzSHCI.iso** file, and click **Open**. Then click **Next** @@ -74,7 +74,7 @@ Your new AZSHCINODE01 virtual machine will now be created. Once created, we nee 9. Once you have **4 network adapters**, click on **Processor** 10. For **Number of virtual processors**, choose a number appropriate to your underlying hardware. In this case, we'll choose **16** but you should choose a number appropriate to your physical system size, then click **Apply** -![Configuring the vm settings](/media/new_vm_node_settings.png "Configuring the vm settings") +![Configuring the vm settings](/archive/media/new_vm_node_settings.png "Configuring the vm settings") You now need to add additional hard drives to support the Azure Stack HCI 20H2 nodes and cluster. You need to add a minimum of 2 data disks, but we will add 4 data disks to each node. @@ -85,14 +85,14 @@ You now need to add additional hard drives to support the Azure Stack HCI 20H2 n 13. On the **Choose Disk Type** page, ensure **Dynamically expanding** is selected, then click **Next** 14. On the **Specify Name and Location** page, enter **DATA01.vhdx**, and change the location to **C:\VMs\AZSHCINODE01\Virtual Hard Disks**, then click **Next** -![Adding additional hard drives to AzSHCINode01](/media/azshci_data_disk.png "Adding additional hard drives to AzSHCINode01") +![Adding additional hard drives to AzSHCINode01](/archive/media/azshci_data_disk.png "Adding additional hard drives to AzSHCINode01") 15. On the **Configure Disk** page, ensure **Create a blank virtual hard disk** is selected, set size to **100**, then click **Next** 16. On the **Completing the New Virtual Hard Disk Wizard** page, review your settings and click **Finish** 17. Back in the **AZSHCINODE01 settings**, click **Apply** 18. **Repeat steps 11-17** to add **at least 3 more data disks** -![Finished adding additional hard drives to AzSHCINode01](/media/azshci_disks_added_ga.png "Finished adding additional hard drives to AzSHCINode01") +![Finished adding additional hard drives to AzSHCINode01](/archive/media/azshci_disks_added_ga.png "Finished adding additional hard drives to AzSHCINode01") 19. If you are running on a **Windows 10 Hyper-V host**, you should also **disable automatic checkpoints**. From the **Settings** window, under **Management**, click **Checkpoints** and then if ticked, **untick** the **Enable checkpoints** box, then click **OK** @@ -102,20 +102,20 @@ Before starting the VM, in order to enable Hyper-V to function inside the AZSHCI Set-VMProcessor -VMName AZSHCINODE01 -ExposeVirtualizationExtensions $true -Verbose ``` -![Enabling nested virtualization on AZSHCINODE01](/media/enable_nested.png "Enabling nested virtualization on AZSHCINODE01") +![Enabling nested virtualization on AZSHCINODE01](/archive/media/enable_nested.png "Enabling nested virtualization on AZSHCINODE01") With the VM configured correctly, in **Hyper-V Manager**, double-click the AZSHCINODE01 VM. This should open the VM Connect window. -![Starting up AZSHCINODE01](/media/node_turned_off.png "Starting up AZSHCINODE01") +![Starting up AZSHCINODE01](/archive/media/node_turned_off.png "Starting up AZSHCINODE01") In the center of the window, there is a message explaining the VM is currently switched off. Click on **Start** and then quickly **press any key** inside the VM to boot from the ISO file. If you miss the prompt to press a key to boot from CD or DVD, simply reset the VM and try again. -![Booting the VM and triggering the boot from DVD](/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") +![Booting the VM and triggering the boot from DVD](/archive/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") ### Complete the Out of Box Experience (OOBE) ### With the VM running, and the boot process initiated, you should be in a position to start the deployment of the Azure Stack HCI 20H2 OS. -![Initiate setup of the Azure Stack HCI 20H2 OS](/media/azshci_setup.png "Initiate setup of the Azure Stack HCI 20H2 OS") +![Initiate setup of the Azure Stack HCI 20H2 OS](/archive/media/azshci_setup.png "Initiate setup of the Azure Stack HCI 20H2 OS") Proceed through the process, making the following selections: @@ -127,11 +127,11 @@ Proceed through the process, making the following selections: Installation will then begin, and will take a few minutes, automatically rebooting as part of the process. -![Completed setup of the Azure Stack HCI 20H2 OS](/media/azshci_setup_complete.png "Completed setup of the Azure Stack HCI 20H2 OS") +![Completed setup of the Azure Stack HCI 20H2 OS](/archive/media/azshci_setup_complete.png "Completed setup of the Azure Stack HCI 20H2 OS") With the installation complete, you'll be prompted to change the password before logging in. Enter a password, and once complete, you should be at the **command prompt** on the "Welcome to Azure Stack HCI" screen. -![Azure Stack HCI 20H2 Welcome Screen](/media/sconfig.png "Azure Stack HCI 20H2 Welcome Screen") +![Azure Stack HCI 20H2 Welcome Screen](/archive/media/sconfig.png "Azure Stack HCI 20H2 Welcome Screen") #### Configure Azure Stack HCI 20H2 node networking using SConfig #### With the node up and running, it's time to configure the networking with SConfig, a useful local administrative interface. @@ -140,7 +140,7 @@ With the node up and running, it's time to configure the networking with SConfig 2. Enter **8** then press **Enter** to select **Network Settings** 3. Choose one of the interfaces by typing the corresponding number, and pressing **Enter** -![Showing NICs using SConfig](/media/sconfig_nic.png "Showing NICs using SConfig") +![Showing NICs using SConfig](/archive/media/sconfig_nic.png "Showing NICs using SConfig") 4. On the **Network Adapter Settings** screen, press **1**, then **Enter** 5. Enter **S** for **Static IP** and press **Enter** diff --git a/nested/steps/3b_AzSHCINodesPS.md b/archive/steps/3b_AzSHCINodesPS.md similarity index 96% rename from nested/steps/3b_AzSHCINodesPS.md rename to archive/steps/3b_AzSHCINodesPS.md index 1a1f2c5..2fe290c 100644 --- a/nested/steps/3b_AzSHCINodesPS.md +++ b/archive/steps/3b_AzSHCINodesPS.md @@ -22,7 +22,7 @@ Architecture As shown on the architecture graphic below, in this step, **you'll deploy a number of nested Azure Stack HCI 20H2 nodes**. The minimum number for deployment of a local Azure Stack HCI 20H2 cluster is **2 nodes**, however if your Hyper-V host has enough spare capacity, you could deploy additional nested nodes, and explore more complex scenarios, such as a nested **stretch cluster**. For the purpose of this step, we'll focus on deploying 2 nodes, however you should make adjustments based on your environment. -![Architecture diagram for Azure Stack HCI 20H2 nested](/media/nested_virt_nodes_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested") +![Architecture diagram for Azure Stack HCI 20H2 nested](/archive/media/nested_virt_nodes_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested") Create your first nested Azure Stack HCI 20H2 node ----------- @@ -87,7 +87,7 @@ Set-VMProcessor -VMName $nodeName -ExposeVirtualizationExtensions $true -Verbose When those commands have completed, this is what you would see in Hyper-V Manager, in the settings view: -![Finished settings for the AZSHCINODE01 node](/media/azshci_settings_ps_ga.png "Finished settings for the AZSHCINODE01 node") +![Finished settings for the AZSHCINODE01 node](/archive/media/azshci_settings_ps_ga.png "Finished settings for the AZSHCINODE01 node") With the VM configured correctly, you can use the following commands to connect to the VM using VM Connect, and at the same time, start the VM. To boot from the ISO, you'll need to click on the VM and quickly press a key to trigger the boot from the DVD inside the VM. If you miss the prompt to press a key to boot from CD or DVD, simply reset the VM and try again. @@ -98,12 +98,12 @@ Start-Sleep -Seconds 5 Start-VM -Name $nodeName ``` -![Booting the VM and triggering the boot from DVD](/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") +![Booting the VM and triggering the boot from DVD](/archive/media/boot_from_dvd.png "Booting the VM and triggering the boot from DVD") ### Complete the Out of Box Experience (OOBE) ### With the VM running, and the boot process initiated, you should be in a position to start the deployment of the Azure Stack HCI 20H2 OS. -![Initiate setup of the Azure Stack HCI 20H2 OS](/media/azshci_setup.png "Initiate setup of the Azure Stack HCI 20H2 OS") +![Initiate setup of the Azure Stack HCI 20H2 OS](/archive/media/azshci_setup.png "Initiate setup of the Azure Stack HCI 20H2 OS") Proceed through the process, making the following selections: @@ -115,7 +115,7 @@ Proceed through the process, making the following selections: Installation will then begin, and will take a few minutes, automatically rebooting as part of the process. -![Completed setup of the Azure Stack HCI 20H2 OS](/media/azshci_setup_complete.png "Completed setup of the Azure Stack HCI 20H2 OS") +![Completed setup of the Azure Stack HCI 20H2 OS](/archive/media/azshci_setup_complete.png "Completed setup of the Azure Stack HCI 20H2 OS") With the installation complete, you'll be prompted to change the password before logging in. Enter a password and exit to command line. Once complete, you should be at the **command prompt** on the "Welcome to Azure Stack HCI" screen. Minimize the VM Connect window. diff --git a/nested/steps/4_AzSHCICluster.md b/archive/steps/4_AzSHCICluster.md similarity index 87% rename from nested/steps/4_AzSHCICluster.md rename to archive/steps/4_AzSHCICluster.md index 8686ac4..85ef1e7 100644 --- a/nested/steps/4_AzSHCICluster.md +++ b/archive/steps/4_AzSHCICluster.md @@ -24,7 +24,7 @@ Architecture As shown on the architecture graphic below, in this step, you'll take the nodes that you previously deployed, and be **clustering them into an Azure Stack HCI 20H2 cluster**. You'll be focused on **creating a cluster in a single site**, but in later articles, we'll also cover creating a stretch cluster. -![Architecture diagram for Azure Stack HCI 20H2 nested](/media/nested_virt_nodes_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested") +![Architecture diagram for Azure Stack HCI 20H2 nested](/archive/media/nested_virt_nodes_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested") Before you begin ----------- @@ -64,34 +64,34 @@ If you have just 2 nodes, or if your preference is for a cluster running in a si ### Get started ### -![Choose cluster type in the Create Cluster wizard](/media/wac_cluster_type_ga.png "Choose cluster type in the Create Cluster wizard") +![Choose cluster type in the Create Cluster wizard](/archive/media/wac_cluster_type_ga.png "Choose cluster type in the Create Cluster wizard") 1. Ensure you select **Azure Stack HCI**, select **All servers in one site** and cick **Create** 2. On the **Check the prerequisites** page, review the requirements and click **Next** 3. On the **Add Servers** page, supply a **username**, which should be **azshci\labadmin** and **your-domain-admin-password** and then one by one, enter the node names (or IP addresses if names don't resolve) of your Azure Stack HCI 20H2 nodes, clicking **Add** after each one has been located. Each node will be validated, and given a **Ready** status when fully validated. This may take a few moments - once you've added all nodes, click **Next** -![Add servers in the Create Cluster wizard](/media/add_nodes_ga.png "Add servers in the Create Cluster wizard") +![Add servers in the Create Cluster wizard](/archive/media/add_nodes_ga.png "Add servers in the Create Cluster wizard") 4. On the **Join a domain** page, details should already be in place, as we joined the domain previously, so click **Next** -![Joined the domain in the Create Cluster wizard](/media/wac_domain_joined_ga.png "Joined the domain in the Create Cluster wizard") +![Joined the domain in the Create Cluster wizard](/archive/media/wac_domain_joined_ga.png "Joined the domain in the Create Cluster wizard") 5. On the **Install features** page, Windows Admin Center will query the nodes for currently installed features, and will request you install required features. Click **Install features**. This will take a few moments - once complete, click **Next** -![Installing required features in the Create Cluster wizard](/media/wac_installed_features_ga.png "Installing required features in the Create Cluster wizard") +![Installing required features in the Create Cluster wizard](/archive/media/wac_installed_features_ga.png "Installing required features in the Create Cluster wizard") 6. On the **Install updates** page, Windows Admin Center will query the nodes for available updates, and will request you install any that are required. Optionally, click **Install updates**. This will take a few moments - once complete, click **Next** 7. On the **Install hardware updates** page, in a nested environment it's likely you'll have no updates, so click **Next** 8. On the **Restart servers** page, if required, click **Restart servers** -![Restart nodes in the Create Cluster wizard](/media/wac_restart_ga.png "Restart nodes in the Create Cluster wizard") +![Restart nodes in the Create Cluster wizard](/archive/media/wac_restart_ga.png "Restart nodes in the Create Cluster wizard") ### Networking ### With the servers domain joined, configured with the appropriate features, updated and rebooted, you're ready to configure your network. You have a number of different choices here, so we'll try to explain why we're making each selection, so you can better apply it to your environment further down the road. Firstly, Windows Admin Center will verify your networking setup - it'll tell you how many NICs are in each node, along with relevant hardware information, MAC address and status information. Review for accuracy, and then click **Next** -![Verify network in the Create Cluster wizard](/media/wac_verify_network_ga.png "Verify network in the Create Cluster wizard") +![Verify network in the Create Cluster wizard](/archive/media/wac_verify_network_ga.png "Verify network in the Create Cluster wizard") The first key step with setting up the networking with Windows Admin Center, is to choose a management NIC that will be dedicated for management use. You can choose either a single NIC, or two NICs for redundancy. This step specifically designates 1 or 2 adapters that will be used by the Windows Admin Center to orchestrate the cluster creation flow. It's mandatory to select at least one of the adapters for management, and in a physical deployment, the 1GbE NICs are usually good candidates for this. @@ -100,24 +100,24 @@ As it stands, this is the way that the Windows Admin Center approaches the netwo #### Network Setup Overview #### Each of your Azure Stack HCI 20H2 nodes should have 4 NICs. For this simple evaluation, you'll dedicate the NICs in the following way: -* 1 NIC will be dedicated to management. It will reside on the 192.168.0.0/24 subnet. No virtual switch will be attached to this NIC. -* 1 NIC will be dedicated to VM traffic. A virtual switch will be attached to this NIC and the Azure Stack HCI 20H2 host will no longer use this NIC for it's own traffic. +* 1 NIC will be dedicated to management. It will reside on the 192.168.0.0/24 subnet. No virtual switch will be attached to this NIC. +* 1 NIC will be dedicated to VM traffic. A virtual switch will be attached to this NIC and the Azure Stack HCI 20H2 host will no longer use this NIC for it's own traffic. * 2 NICs will be dedicated to storage traffic. They will reside on 2 separate subnets, 10.10.10.0/24 and 10.10.11.0/24. No virtual switches will be attached to these NICs. Again, this is just one **example** network configuration for the simple purpose of evaluation. 1. Back in the Windows Admin Center, on the **Select the adapters to use for management** page, ensure you select the **One physical network adapter for management** box -![Select management adapter in the Create Cluster wizard](/media/wac_management_nic_ga.png "Select management adapter in the Create Cluster wizard") +![Select management adapter in the Create Cluster wizard](/archive/media/wac_management_nic_ga.png "Select management adapter in the Create Cluster wizard") 2. Then, for each node, **select the highlighted NIC** that will be dedicated for management. The reason only one NIC is highlighted, is because this is the only one that has an IP address assigned from a previous step. Once you've finished your selections, scroll to the bottom, then click **Apply and test** -![Select management adapters in the Create Cluster wizard](/media/wac_singlemgmt_ga.png "Select management adapters in the Create Cluster wizard") +![Select management adapters in the Create Cluster wizard](/archive/media/wac_singlemgmt_ga.png "Select management adapters in the Create Cluster wizard") 3. Windows Admin Center will then apply the configuration to your NIC. When complete and successful, click **Next** 4. On the **Virtual Switch** page, you have a number of options -![Select vSwitch in the Create Cluster wizard](/media/wac_vswitches_ga.png "Select vSwitch in the Create Cluster wizard") +![Select vSwitch in the Create Cluster wizard](/archive/media/wac_vswitches_ga.png "Select vSwitch in the Create Cluster wizard") * **Create one virtual switch for compute and storage together** - in this configuration, your Azure Stack HCI 20H2 nodes will create a vSwitch, comprised of multiple NICs, and the bandwidth available across these NICs will be shared by the Azure Stack HCI 20H2 nodes themselves, for storage traffic, and in addition, any VMs you deploy on top of the nodes, will also share this bandwidth. * **Create one virtual switch for compute only** - in this configuration, you would leave some NICs dedicated to storage traffic, and have a set of NICs attached to a vSwitch, to which your VMs traffic would be dedicated. @@ -126,11 +126,11 @@ Again, this is just one **example** network configuration for the simple purpose 5. Select the **Create one virtual switch for compute only**, and select the **Ethernet 2** NICs on each node, then click **Next** -![Create single vSwitch for Compute in the Create Cluster wizard](/media/wac_compute_vswitch_ga.png "Create single vSwitch for Compute in the Create Cluster wizard") +![Create single vSwitch for Compute in the Create Cluster wizard](/archive/media/wac_compute_vswitch_ga.png "Create single vSwitch for Compute in the Create Cluster wizard") 6. On the **RDMA** page, you're now able to configure the appropriate RDMA settings for your host networks. If you do choose to tick the box, in a nested environment, you'll be presented with an error, so click **Next** -![Error message when configuring RDMA in a nested environment](/media/wac_enable_rdma.png "Error message when configuring RDMA in a nested environment") +![Error message when configuring RDMA in a nested environment](/archive/media/wac_enable_rdma.png "Error message when configuring RDMA in a nested environment") 7. On the **Define networks** page, this is where you can define the specific networks, separate subnets, and optionally apply VLANs. In this **nested environment**, we now have 3 NICs remaining. Configure your remaining NICs as follows, by clicking on a field in the table and entering the appropriate information. @@ -147,7 +147,7 @@ Again, this is just one **example** network configuration for the simple purpose When you click **Apply and test**, Windows Admin Center validates network connectivity between the adapters in the same VLAN and subnet, which may take a few moments. Once complete, your configuration should look similar to this: -![Define networks in the Create Cluster wizard](/media/wac_define_network_ga.png "Define networks in the Create Cluster wizard") +![Define networks in the Create Cluster wizard](/archive/media/wac_define_network_ga.png "Define networks in the Create Cluster wizard") 8. Once the networks have been verified, you can optionally review the networking test report, and once complete, click **Next** @@ -158,7 +158,7 @@ With the network configured for the evaluation environment, it's time to constru 1. At the start of the **Cluster** wizard, on the **Validate the cluster** page, click **Validate**. You *may* be prompted with a **Credential Security Service Provider (CredSSP)** box - read the information, then click **Yes** -![Validate cluster in the Create Cluster wizard](/media/wac_credssp_ga.png "Validate cluster in the Create Cluster wizard") +![Validate cluster in the Create Cluster wizard](/archive/media/wac_credssp_ga.png "Validate cluster in the Create Cluster wizard") 2. Cluster validation will then start, and will take a few moments to complete - once completed, you should see a successful message. @@ -166,7 +166,7 @@ With the network configured for the evaluation environment, it's time to constru **NOTE** - if you see an issues when trying to validate the cluster, [see the workarounds here](#troubleshooting-cluster-validation-issues). -![Validation complete in the Create Cluster wizard](/media/wac_validated_ga.png "Validation complete in the Create Cluster wizard") +![Validation complete in the Create Cluster wizard](/archive/media/wac_validated_ga.png "Validation complete in the Create Cluster wizard") 1. Optionally, if you want to review the validation report, click on **Download report** and open the file in your browser. 2. Back in the **Validate the cluster** screen, click **Next** @@ -174,34 +174,34 @@ With the network configured for the evaluation environment, it's time to constru 4. Under **IP address**, click **Specify one or more static addresses**, and enter **192.168.0.10** (assuming you've deployed less than 10 nodes, otherwise adjust accordingly), and click **Add** 5. Expand **Advanced** and review the settings, then click **Create cluster** -![Finalize cluster creation in the Create Cluster wizard](/media/wac_create_clus_ga.png "Finalize cluster creation in the Create Cluster wizard") +![Finalize cluster creation in the Create Cluster wizard](/archive/media/wac_create_clus_ga.png "Finalize cluster creation in the Create Cluster wizard") 6. With all settings confirmed, click **Create cluster**. This will take a few moments. Once complete, click **Next: Storage** -![Cluster creation successful in the Create Cluster wizard](/media/wac_cluster_success_ga.png "Cluster creation successful in the Create Cluster wizard") +![Cluster creation successful in the Create Cluster wizard](/archive/media/wac_cluster_success_ga.png "Cluster creation successful in the Create Cluster wizard") ### Storage ### With the cluster successfully created, you're now good to proceed on to configuring your storage. Whilst less important in a fresh nested environment, it's always good to start from a clean slate, so first, you'll clean the drives before configuring storage. 1. On the storage landing page within the Create Cluster wizard, click **Erase Drives**, and when prompted, with **You're about to erase all existing data**, click **Erase drives**. Once complete, you should have a successful confirmation message, then click **Next** -![Cleaning drives in the Create Cluster wizard](/media/wac_clean_drives_ga.png "Cleaning drives in the Create Cluster wizard") +![Cleaning drives in the Create Cluster wizard](/archive/media/wac_clean_drives_ga.png "Cleaning drives in the Create Cluster wizard") 2. On the **Check drives** page, validate that all your drives have been detected, and show correctly. As these are virtual disks in a nested environment, they won't display as SSD or HDD etc. You should have **4 data drives** per node. Once verified, click **Next** -![Verified drives in the Create Cluster wizard](/media/wac_check_drives_ga.png "Verified drives in the Create Cluster wizard") +![Verified drives in the Create Cluster wizard](/archive/media/wac_check_drives_ga.png "Verified drives in the Create Cluster wizard") 3. Storage Spaces Direct validation tests will then automatically run, which will take a few moments. -![Verifying Storage Spaces Direct in the Create Cluster wizard](/media/wac_validate_storage_ga.png "Verifying Storage Spaces Direct in the Create Cluster wizard") +![Verifying Storage Spaces Direct in the Create Cluster wizard](/archive/media/wac_validate_storage_ga.png "Verifying Storage Spaces Direct in the Create Cluster wizard") 4. Once completed, you should see a successful confirmation. You can scroll through the brief list of tests, or alternatively, click to **Download report** to view more detailed information, then click **Next** -![Storage verified in the Create Cluster wizard](/media/wac_storage_validated_ga.png "Storage verified in the Create Cluster wizard") +![Storage verified in the Create Cluster wizard](/archive/media/wac_storage_validated_ga.png "Storage verified in the Create Cluster wizard") 5. The final step with storage, is to **Enable Storage Spaces Direct**, so click **Enable**. This will take a few moments. -![Storage Spaces Direct enabled in the Create Cluster wizard](/media/wac_s2d_enabled_ga.png "Storage Spaces Direct enabled in the Create Cluster wizard") +![Storage Spaces Direct enabled in the Create Cluster wizard](/archive/media/wac_s2d_enabled_ga.png "Storage Spaces Direct enabled in the Create Cluster wizard") 6. With Storage Spaces Direct enabled, click **Finish** 7. On the **confirmation page**, click on **Go to connections list** @@ -218,14 +218,14 @@ As part of this guide, we're going to set up cluster quorum, using **Windows Adm 1. If you're not already, ensure you're logged into your **Windows Admin Center** instance, and click on your **azshciclus** cluster that you created earlier -![Connect to your cluster with Windows Admin Center](/media/wac_azshciclus_ga.png "Connect to your cluster with Windows Admin Center") +![Connect to your cluster with Windows Admin Center](/archive/media/wac_azshciclus_ga.png "Connect to your cluster with Windows Admin Center") 2. You may be prompted for credentials, so log in with your **azshci\labadmin** credentials and tick the **Use these credentials for all connections** box. You should then be connected to your **azshciclus cluster** 3. After a few moments of verification, the **cluster dashboard** will open. 4. On the **cluster dashboard**, at the very bottom-left of the window, click on **Settings** 5. In the **Settings** window, click on **Witness** and under **Witness type**, use the drop-down to select **Cloud witness** -![Set up cloud witness in Windows Admin Center](/media/wac_cloud_witness_new_ga.png "Set up cloud witness in Windows Admin Center") +![Set up cloud witness in Windows Admin Center](/archive/media/wac_cloud_witness_new_ga.png "Set up cloud witness in Windows Admin Center") 6. Open a new tab in your browser, and navigate to **https://portal.azure.com** and login with your Azure credentials 7. You should already have a subscription from an earlier step, but if not, you should [review those steps and create one, then come back here](/nested/steps/1b_NestedInAzure.md#get-an-azure-subscription) @@ -239,7 +239,7 @@ As part of this guide, we're going to set up cluster quorum, using **Windows Adm * Account kind: **Storage (general purpose v1)** is the best option for cloud witness * Replication: **Locally-redundant storage (LRS)** - Failover Clustering uses the blob file as the arbitration point, which requires some consistency guarantees when reading the data. Therefore you must select Locally-redundant storage for Replication type. -![Set up storage account in Azure](/media/azure_cloud_witness_ga.png "Set up storage account in Azure") +![Set up storage account in Azure](/archive/media/azure_cloud_witness_ga.png "Set up storage account in Azure") 10. On the **Networking** and **Data protection** pages, accept the defaults and press **Next** 11. On the **Advanced** page, ensure that **Blob public access** is **disabled**, and **Minimum TLS version** is set to **Version 1.2** @@ -248,17 +248,17 @@ As part of this guide, we're going to set up cluster quorum, using **Windows Adm 14. On the left-hand navigation, under Settings, click **Access Keys**. When you create a Microsoft Azure Storage Account, it is associated with two Access Keys that are automatically generated - Primary Access key and Secondary Access key. For a first-time creation of Cloud Witness, use the **Primary Access Key**. There is no restriction regarding which key to use for Cloud Witness. 15. Click on **Show keys** and take a copy of the **Storage account name** and **key1** -![Configure Primary Access key in Azure](/media/azure_keys_ga.png "Configure Primary Access key in Azure") +![Configure Primary Access key in Azure](/archive/media/azure_keys_ga.png "Configure Primary Access key in Azure") 16. On the left-hand navigation, under Settings, click **Properties** and make a note of your **blob service endpoint**. -![Blob Service endpoint in Azure](/media/azure_blob_ga.png "Blob Service endpoint in Azure") +![Blob Service endpoint in Azure](/archive/media/azure_blob_ga.png "Blob Service endpoint in Azure") **NOTE** - The required service endpoint is the section of the Blob service URL **after blob.**, i.e. for our configuration, **core.windows.net** 17. With all the information gathered, return to the **Windows Admin Center** and complete the form with your values, then click **Save** -![Providing storage account info in Windows Admin Center](/media/wac_azure_key_ga.png "Providing storage account info in Windows Admin Center") +![Providing storage account info in Windows Admin Center](/archive/media/wac_azure_key_ga.png "Providing storage account info in Windows Admin Center") 18. Within a few moments, your witness settings should be successfully applied and you have now completed configuring the quorum settings for the **azshciclus** cluster. @@ -280,14 +280,14 @@ You'll need appropriate **Azure Active Directory permissions** to complete the r #### What happens when you register Azure Stack HCI 20H2? #### When you register your Azure Stack HCI 20H2 cluster, the process creates an Azure Resource Manager (ARM) resource to represent the on-prem cluster. This resource is provisioned by an Azure resource provider (RP) and placed inside a resource group, within your chosen Azure subscription. If these Azure concepts are new to you, you can check out an [overview of them, and more, here](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/overview "Azure Resource Manager overview"). -![ARM architecture for Azure Stack HCI 20H2](/media/azure_arm.png "ARM architecture for Azure Stack HCI 20H2") +![ARM architecture for Azure Stack HCI 20H2](/archive/media/azure_arm.png "ARM architecture for Azure Stack HCI 20H2") In addition to creating an Azure resource in your subscription, registering Azure Stack HCI 20H2 creates an app identity, conceptually similar to a user, in your Azure Active Directory tenant. The app identity inherits the cluster name. This identity acts on behalf on the Azure Stack HCI 20H2 cloud service, as appropriate, within your subscription. #### Understanding required Azure Active Directory permissions #### If the user who registers Azure Stack HCI 20H2 is an Azure Active Directory global administrator or has been delegated sufficient permissions, this all happens automatically, and no additional action is required. If not, approval may be needed from your Azure Active Directory global administrator (or someone with appropriate permissions) to complete registration. Your global administrator can either explicitly grant consent to the app, or they can delegate permissions so that you can grant consent to the app. -![Azure Active Directory Permissions](/media/aad_permissions.png "Azure Active Directory Permissions") +![Azure Active Directory Permissions](/archive/media/aad_permissions.png "Azure Active Directory Permissions") The user who runs Register-AzStackHCI needs Azure AD permissions to: @@ -383,31 +383,31 @@ To complete registration, you have 2 options - you can use **Windows Admin Cente 1. On **MGMT01**, logged in as **azshci\labadmin**, open the Windows Admin Center, and on the **All connections** page, select your azshciclus 2. When the cluster dashboard has loaded, in the top-right corner, you'll see the **status of the Azure registration/connection** -![Azure registration status in Windows Admin Center](/media/wac_azure_reg_dashboard.png "Azure registration status in Windows Admin Center") +![Azure registration status in Windows Admin Center](/archive/media/wac_azure_reg_dashboard.png "Azure registration status in Windows Admin Center") 3. Click on **Install PowerShell modules** to trigger Windows Admin Center to download and install the appropriate PowerShell modules to the Azure Stack HCI 20H2 node. This may take a few moments. -![Azure registration status in Windows Admin Center](/media/wac_azure_reg_dashboard_2.png "Azure registration status in Windows Admin Center") +![Azure registration status in Windows Admin Center](/archive/media/wac_azure_reg_dashboard_2.png "Azure registration status in Windows Admin Center") 4. Once installed, you can begin the registration process by clicking **Register this cluster** 5. If you haven't already, you'll be prompted to register Windows Admin Center with an Azure tenant. Follow the instructions to **Copy the code** and then click on the link to configure device login. 6. When prompted for credentials, **enter your Azure credentials** for a tenant you'd like to register the Windows Admin Center 7. Back in Windows Admin Center, you'll notice your tenant information has been added. You can now click **Connect** to connect Windows Admin Center to Azure -![Connecting Windows Admin Center to Azure](/media/wac_azure_connect.png "Connecting Windows Admin Center to Azure") +![Connecting Windows Admin Center to Azure](/archive/media/wac_azure_connect.png "Connecting Windows Admin Center to Azure") 8. Click on **Sign in** and when prompted for credentials, **enter your Azure credentials** and you should see a popup that asks for you to accept the permissions, so click **Accept** -![Permissions for Windows Admin Center](/media/wac_azure_permissions.png "Permissions for Windows Admin Center") +![Permissions for Windows Admin Center](/archive/media/wac_azure_permissions.png "Permissions for Windows Admin Center") 9. Back in Windows Admin Center, you may need to refresh the page if your 'Register this cluster' link is not active. Once active, click **Register this cluster** and you should be presented with a window requesting more information. 10. Choose your **Azure subscription** that you'd like to use to register, along with an **Azure resource group** and **region**, then click **Register**. This will take a few moments. -![Final step for registering Azure Stack HCI with Windows Admin Center](/media/wac_azure_register.png "Final step for registering Azure Stack HCI with Windows Admin Center") +![Final step for registering Azure Stack HCI with Windows Admin Center](/archive/media/wac_azure_register.png "Final step for registering Azure Stack HCI with Windows Admin Center") 11. Once completed, you should see updated status on the Windows Admin Center dashboard, showing that the cluster has been correctly registered. -![Azure registration status in Windows Admin Center](/media/wac_azure_reg_dashboard_3.png "Azure registration status in Windows Admin Center") +![Azure registration status in Windows Admin Center](/archive/media/wac_azure_reg_dashboard_3.png "Azure registration status in Windows Admin Center") You can now proceed on to [Viewing registration details in the Azure portal](#View-registration-details-in-the-Azure-portal) @@ -433,13 +433,13 @@ Invoke-Command -ComputerName AZSHCINODE01 -ScriptBlock { } ``` -![Check the registration status of the Azure Stack HCI 20H2 cluster](/media/reg_check.png "Check the registration status of the Azure Stack HCI 20H2 cluster") +![Check the registration status of the Azure Stack HCI 20H2 cluster](/archive/media/reg_check.png "Check the registration status of the Azure Stack HCI 20H2 cluster") As you can see from the result, the cluster is yet to be registered, and the cluster status identifies as **Clustered**. Azure Stack HCI 20H2 needs to register within 30 days of installation per the Azure Online Services Terms. If not clustered after 30 days, the **ClusterStatus** will show **OutOfPolicy**, and if not registered after 30 days, the **RegistrationStatus** will show **OutOfPolicy**. 3. To register the cluster, you'll first need to get your **Azure subscription ID**. An easy way to do this is to quickly **log into https://portal.azure.com**, and in the **search box** at the top of the screen, search for **subscriptions** and then click on **Subscriptions** -![Azure Subscriptions](/media/azure_subscriptions_ga.png "Azure Subscriptions") +![Azure Subscriptions](/archive/media/azure_subscriptions_ga.png "Azure Subscriptions") 4. Your **subscription** should be shown in the main window. If you have more than one subscription listed here, click the correct one, and in the new blade, copy the **Subscription ID**. @@ -472,11 +472,11 @@ Of these commands, many are optional: 6. Once dependencies have been installed, you'll receive a popup on **MGMT01** to authenticate to Azure. Provide your **Azure credentials**. -![Login to Azure](/media/azure_login_reg.png "Login to Azure") +![Login to Azure](/archive/media/azure_login_reg.png "Login to Azure") 7. Once successfully authenticated, the registration process will begin, and will take a few moments. Once complete, you should see a message indicating success, as per below: -![Register Azure Stack HCI 20H2 with PowerShell](/media/register_azshci_ga.png "Register Azure Stack HCI 20H2 with PowerShell") +![Register Azure Stack HCI 20H2 with PowerShell](/archive/media/register_azshci_ga.png "Register Azure Stack HCI 20H2 with PowerShell") **NOTE** - if upon registering, you receive an error similar to that below, please **try a different region**. You can still proceed to [Step 5](#next-steps) and continue with your evaluation, and it won't affect any functionality. Just make sure you come back and register later! @@ -491,7 +491,7 @@ Invoke-Command -ComputerName AZSHCINODE01 -ScriptBlock { Get-AzureStackHCI } ``` -![Check updated registration status with PowerShell](/media/registration_status.png "Check updated registration status with PowerShell") +![Check updated registration status with PowerShell](/archive/media/registration_status.png "Check updated registration status with PowerShell") You can see the **ConnectionStatus** and **LastConnected** time, which is usually within the last day unless the cluster is temporarily disconnected from the Internet. An Azure Stack HCI 20H2 cluster can operate fully offline for up to 30 consecutive days. @@ -501,23 +501,23 @@ With registration complete, either through Windows Admin Center, or through Powe 1. On **MGMT01**, open the Edge browser and **log into https://portal.azure.com** to check the resources created there. In the **search box** at the top of the screen, search for **Resource groups** and then click on **Resource groups** 2. You should see a new **Resource group** listed, with the name you specified earlier, which in our case, is **AZSHCICLUS_RG** -![Registration resource group in Azure](/media/registration_rg_ga.png "Registration resource group in Azure") +![Registration resource group in Azure](/archive/media/registration_rg_ga.png "Registration resource group in Azure") 12. Click on the **AZSHCICLUS_RG** resource group, and in the central pane, you'll see that a record with the name **azshciclus** has been created inside the resource group 13. Click on the **azihciclus** record, and you'll be taken to the new Azure Stack HCI Resource Provider, which shows information about all of your clusters, including details on the currently selected cluster -![Overview of the recently registered cluster in the Azure portal](/media/azure_portal_hcicluster.png "Overview of the recently registered cluster in the Azure portal") +![Overview of the recently registered cluster in the Azure portal](/archive/media/azure_portal_hcicluster.png "Overview of the recently registered cluster in the Azure portal") 14. Next, still in the Azure portal, in the **search box** at the top of the screen, search for **Azure Active Directory** and then click on **Azure Active Directory** 15. Click on **App Registrations**, then (you may need to click on **All applications**) in the box labeled "Start typing a name or Application ID to filter these results", enter **azshciclus** and in the results, click on your application -![Application ID in App Registrations in Azure](/media/azure_ad_app_ga.png "Application ID in App Registrations in Azure") +![Application ID in App Registrations in Azure](/archive/media/azure_ad_app_ga.png "Application ID in App Registrations in Azure") 1. Within the application, click on **API permissions**. From there, you can see the **Configured permissions** which have been created as part of the **Register-AzureStackHCI** you ran earlier. You can see that a number of services that have been granted appropriate permissions for billing and cluster management. Optionally, you can click on these services to see more information -![Application ID API Permissions for App Registration in Azure](/media/api_permissions_ga.png "Application ID API Permissions for App Registration in Azure") +![Application ID API Permissions for App Registration in Azure](/archive/media/api_permissions_ga.png "Application ID API Permissions for App Registration in Azure") **NOTE** - If when you ran **Register-AzureStackHCI**, you don't have appropriate permissions in Azure Active Directory, to grant admin consent, you will need to work with your Azure Active Directory administrator to complete registration later. You can exit and leave the registration in status "**pending admin consent**," i.e. partially completed. Once consent has been granted, **simply re-run Register-AzureStackHCI** to complete registration. @@ -598,4 +598,4 @@ Set-WinSystemLocale -SystemLocale en-US Restart-Computer -Force ``` -Then run validate again, and it should pass this step. This bug is being actively worked on, and should be addressed soon. +Then run validate again, and it should pass this step. This bug is being actively worked on, and should be addressed soon. \ No newline at end of file diff --git a/nested/steps/5_ExploreAzSHCI.md b/archive/steps/5_ExploreAzSHCI.md similarity index 94% rename from nested/steps/5_ExploreAzSHCI.md rename to archive/steps/5_ExploreAzSHCI.md index 876ce03..d15843b 100644 --- a/nested/steps/5_ExploreAzSHCI.md +++ b/archive/steps/5_ExploreAzSHCI.md @@ -30,11 +30,11 @@ You should be over on **MGMT01**, but if you're not, log into MGMT01, and open t 4. In the **Create volume** pane, enter **VMSTORAGE** for the volume name, and leave **Resiliency** as **Two-way mirror** 5. In Size on HDD, specify **20GB** for the size of the volume, then click **Create**. -![Create a volume on Azure Stack HCI 20H2](/media/wac_vm_storage_ga.png "Create a volume on Azure Stack HCI 20H2") +![Create a volume on Azure Stack HCI 20H2](/archive/media/wac_vm_storage_ga.png "Create a volume on Azure Stack HCI 20H2") 6. Creating the volume can take a few minutes. Notifications in the upper-right will let you know when the volume is created. The new volume appears in the Inventory list -![Volume created on Azure Stack HCI 20H2](/media/wac_vm_storage_deployed_ga.png "Volume created on Azure Stack HCI 20H2") +![Volume created on Azure Stack HCI 20H2](/archive/media/wac_vm_storage_deployed_ga.png "Volume created on Azure Stack HCI 20H2") ### Optional - Create a mirror-accelerated parity volume ### @@ -55,7 +55,7 @@ You may have seen, during the **Create volume** wizard, you could have enabled d 1. Still in **Windows Admin Center** on **MGMT01**, on the Volumes page, select the **Inventory** tab, and then select your **VMSTORAGE** volume 2. On the Volume VMSTORAGE pane, you'll see a simple rocker switch to enable **Deduplication and compression**. Click to enable it, and click **Start** -![Enable deduplication on volume](/media/wac_enable_dedup_ga.png "Enable deduplication on volume") +![Enable deduplication on volume](/archive/media/wac_enable_dedup_ga.png "Enable deduplication on volume") 3. In the **Enable deduplication** pane, use the drop-down to select **Hyper-V** then click **Enable Deduplication**. This should be enabled quickly, as there's no files on the volume. @@ -87,12 +87,12 @@ You should still be over on **MGMT01**, but if you're not, log into MGMT01, and 5. The creation process will take a few moments, and once complete, **VM001** should show within the **Virtual machines view** 6. Click on the **VM** and then click **Start** - within moments, the VM should be running -![VM001 up and running](/media/wac_vm001_ga.png "VM001 up and running") +![VM001 up and running](/archive/media/wac_vm001_ga.png "VM001 up and running") 7. Click on **VM001** to view the properties and status for this running VM 8. Click on **Connect** - you may get a **VM Connect** prompt: -![Connect to VM001](/media/vm_connect_ga.png "Connect to VM001") +![Connect to VM001](/archive/media/vm_connect_ga.png "Connect to VM001") 9. Click on **Go to Settings** and in the **Remote Desktop** pane, click on **Allow remote connections to this computer**, then **Save** 10. Click the **Back** button in your browser to return to the VM001 view, then click **Connect**, and when prompted with the certificate prompt, click **Connect** and enter appropriate credentials @@ -109,7 +109,7 @@ The final step we'll cover is using Windows Admin Center to live migrate VM001 f 3. Under **Host server**, make a note of the node that VM001 is currently running on. You may need to expand the column width to see the name 4. Next to **VM001**, click the tick box next to VM001, then click **More**. You'll notice you can Clone, Domain Join and also Move the VM. Click **Move** -![Start Live Migration using Windows Admin Center](/media/wac_move_ga.png "Start Live Migration using Windows Admin Center") +![Start Live Migration using Windows Admin Center](/archive/media/wac_move_ga.png "Start Live Migration using Windows Admin Center") 5. In the **Move Virtual Machine** pane, ensure **Failover Cluster** is selected, and leave the default **Best available cluster node** to allow Windows Admin Center to pick where to migrate the VM to, then click **Move** 6. The live migration will then begin, and within a few seconds, the VM should be running on a different node. @@ -140,7 +140,7 @@ Get-VM | Stop-VM -Force 3. Once all the VMs are switched off, you can then shut down your Hyper-V host. If you're running this environment on physical gear on-prem, you're all done, but if you deployed in Azure, visit https://portal.azure.com/, and login with your Azure credentials. Once logged in, using the search box on the dashboard, enter "azshci" and once the results are returned, click on your AzSHCIHost virtual machine. -![Virtual machine located in Azure](/media/azure_vm_search_ga.png "Virtual machine located in Azure") +![Virtual machine located in Azure](/archive/media/azure_vm_search_ga.png "Virtual machine located in Azure") 4. Once on the overview blade for your VM, along the **top navigation**, click **Stop**, and then click **OK**. Your VM will then be deallocated and **compute charges** will cease. @@ -148,7 +148,7 @@ Congratulations! ----------- You've reached the end of the evaluation guide. In this guide you have: -* Deployed/Configured a Hyper-V host, either on-prem or in Azure, to run your nested sandbox environment +* Deployed/Configured a Hyper-V host to run your nested sandbox environment * Deployed a management infrastructure including a Windows Server 2019 Active Directory and Windows 10 management server * Installed and configured the Windows Admin Center * Created, deployed and configured a number of Azure Stack HCI 20H2 nodes, in nested virtual machines diff --git a/deployment/dsc/azshcihost.zip b/deployment/dsc/azshcihost.zip new file mode 100644 index 0000000000000000000000000000000000000000..cf9360bed2c5e2b616a50e6dcb5394a0cda7a4d5 GIT binary patch literal 1417230 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 z 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ⅇ^VW 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

^Sx0M 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%0DF8r=>|)I9DmV9%}U{%8!(0?xVj{& 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
?3j6ANf?) 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%0A9NiX+ro}DI`(Yc>JEQ|H?Y1MY9gah)gs}`;zD7= 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
?+|=%SY!&rPobAkM8sbI=XUr7sqRq$= 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%0Ae*&}MJ)HQ~dQ(3ggz>2ZqBwQe^4?iN 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 +$script:computerObjectPropertyMap = @( + @{ + ParameterName = 'ComputerName' + PropertyName = 'CN' + }, + @{ + ParameterName = 'Location' + }, + @{ + ParameterName = 'DnsHostName' + }, + @{ + ParameterName = 'ServicePrincipalNames' + PropertyName = 'ServicePrincipalName' + }, + @{ + ParameterName = 'UserPrincipalName' + }, + @{ + ParameterName = 'DisplayName' + }, + @{ + ParameterName = 'Path' + PropertyName = 'DistinguishedName' + }, + @{ + ParameterName = 'Description' + }, + @{ + ParameterName = 'Enabled' + }, + @{ + ParameterName = 'Manager' + PropertyName = 'ManagedBy' + }, + @{ + ParameterName = 'DistinguishedName' + ParameterType = 'Read' + PropertyName = 'DistinguishedName' + }, + @{ + ParameterName = 'SID' + ParameterType = 'Read' + } +) + +<# + .SYNOPSIS + Returns the current state of the Active Directory computer account. + + .PARAMETER ComputerName + Specifies the name of the Active Directory computer account to manage. + You can identify a computer by its distinguished name, GUID, security + identifier (SID) or Security Accounts Manager (SAM) account name. + + .PARAMETER RequestFile + Specifies the full path to the Offline Domain Join Request file to create. + + .PARAMETER EnabledOnCreation + Specifies if the computer account is created enabled or disabled. + By default the Enabled property of the computer account will be set to + the default value of the cmdlet New-ADComputer. This property is ignored + if the parameter RequestFile is specified in the same configuration. + This parameter does not enforce the property `Enabled`. To enforce the + property `Enabled` see the resource ADObjectEnabledState. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to connect to perform the task. + + Used by Get-ADCommonParameters and is returned as a common parameter. + + .PARAMETER Credential + Specifies the user account credentials to use to perform the task. + + Used by Get-ADCommonParameters and is returned as a common parameter. + + .PARAMETER RestoreFromRecycleBin + Try to restore the organizational unit from the recycle bin before + creating a new one. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ComputerName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $RequestFile, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $EnabledOnCreation + ) + + Assert-Module -ModuleName 'ActiveDirectory' -ImportModule + + <# + These are properties that have no corresponding property in a + Computer account object. + #> + $getTargetResourceReturnValue = @{ + Ensure = 'Absent' + ComputerName = $null + Location = $null + DnsHostName = $null + ServicePrincipalNames = $null + UserPrincipalName = $null + DisplayName = $null + Path = $null + Description = $null + Enabled = $false + Manager = $null + DomainController = $DomainController + Credential = $Credential + RequestFile = $RequestFile + RestoreFromRecycleBin = $RestoreFromRecycleBin + EnabledOnCreation = $EnabledOnCreation + DistinguishedName = $null + SID = $null + SamAccountName = $null + } + + $getADComputerResult = $null + + try + { + <# + Create an array of the Active Directory Computer object property + names to retrieve from the Computer object. + #> + $computerObjectProperties = Convert-PropertyMapToObjectProperties -PropertyMap $script:computerObjectPropertyMap + + <# + When the property ServicePrincipalName is read with Get-ADComputer + the property name must be 'ServicePrincipalNames', but when it is + written with Set-ADComputer the property name must be + 'ServicePrincipalName'. This difference is handled here. + #> + $computerObjectProperties = @($computerObjectProperties | + Where-Object -FilterScript { + $_ -ne 'ServicePrincipalName' + }) + + $computerObjectProperties += @('ServicePrincipalNames') + + Write-Verbose -Message ($script:localizedData.RetrievingComputerAccount -f $ComputerName) + + $getADComputerParameters = Get-ADCommonParameters @PSBoundParameters + $getADComputerParameters['Properties'] = $computerObjectProperties + + # If the computer account is not found Get-ADComputer will throw an error. + $getADComputerResult = Get-ADComputer @getADComputerParameters + + Write-Verbose -Message ($script:localizedData.ComputerAccountIsPresent -f $ComputerName) + + $getTargetResourceReturnValue['Ensure'] = 'Present' + $getTargetResourceReturnValue['ComputerName'] = $getADComputerResult.CN + $getTargetResourceReturnValue['Location'] = $getADComputerResult.Location + $getTargetResourceReturnValue['DnsHostName'] = $getADComputerResult.DnsHostName + $getTargetResourceReturnValue['ServicePrincipalNames'] = [System.String[]] $getADComputerResult.ServicePrincipalNames + $getTargetResourceReturnValue['UserPrincipalName'] = $getADComputerResult.UserPrincipalName + $getTargetResourceReturnValue['DisplayName'] = $getADComputerResult.DisplayName + $getTargetResourceReturnValue['Path'] = Get-ADObjectParentDN -DN $getADComputerResult.DistinguishedName + $getTargetResourceReturnValue['Description'] = $getADComputerResult.Description + $getTargetResourceReturnValue['Enabled'] = $getADComputerResult.Enabled + $getTargetResourceReturnValue['Manager'] = $getADComputerResult.ManagedBy + $getTargetResourceReturnValue['DomainController'] = $DomainController + $getTargetResourceReturnValue['Credential'] = $Credential + $getTargetResourceReturnValue['RequestFile'] = $RequestFile + $getTargetResourceReturnValue['RestoreFromRecycleBin'] = $RestoreFromRecycleBin + $getTargetResourceReturnValue['EnabledOnCreation'] = $EnabledOnCreation + $getTargetResourceReturnValue['DistinguishedName'] = $getADComputerResult.DistinguishedName + $getTargetResourceReturnValue['SID'] = $getADComputerResult.SID + $getTargetResourceReturnValue['SamAccountName'] = $getADComputerResult.SamAccountName + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + Write-Verbose -Message ($script:localizedData.ComputerAccountIsAbsent -f $ComputerName) + } + catch + { + $errorMessage = $script:localizedData.FailedToRetrieveComputerAccount -f $ComputerName + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + return $getTargetResourceReturnValue +} + +<# + .SYNOPSIS + Determines if the Active Directory computer account is in the desired state. + + .PARAMETER ComputerName + Specifies the name of the Active Directory computer account to manage. + You can identify a computer by its distinguished name, GUID, security + identifier (SID) or Security Accounts Manager (SAM) account name. + + .PARAMETER Ensure + Specifies whether the computer account is present or absent. + Valid values are 'Present' and 'Absent'. The default is 'Present'. + + .PARAMETER UserPrincipalName + Specifies the UPN assigned to the computer account. + + .PARAMETER DisplayName + Specifies the display name of the computer. + + .PARAMETER Path + Specifies the X.500 path of the container where the computer is located. + + .PARAMETER Location + Specifies the location of the computer, such as an office number. + + .PARAMETER DnsHostName + Specifies the fully qualified domain name (FQDN) of the computer. + + .PARAMETER ServicePrincipalNames + Specifies the service principal names for the computer account. + + .PARAMETER Description + Specifies a description of the computer account. + + .PARAMETER Manager + Specifies the user or group Distinguished Name that manages the computer + account. Valid values are the user's or group's DistinguishedName, + ObjectGUID, SID or SamAccountName. + + .PARAMETER RequestFile + Specifies the full path to the Offline Domain Join Request file to create. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to connect to perform the task. + + .PARAMETER Credential + Specifies the user account credentials to use to perform the task. + + .PARAMETER RestoreFromRecycleBin + Try to restore the organizational unit from the recycle bin before + creating a new one. + + .PARAMETER EnabledOnCreation + Specifies if the computer account is created enabled or disabled. + By default the Enabled property of the computer account will be set to + the default value of the cmdlet New-ADComputer. This property is ignored + if the parameter RequestFile is specified in the same configuration. + This parameter does not enforce the property `Enabled`. To enforce the + property `Enabled` see the resource ADObjectEnabledState. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + # Common Name + [Parameter(Mandatory = $true)] + [System.String] + $ComputerName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNull()] + [System.String] + $UserPrincipalName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Path, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Location, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DnsHostName, + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $ServicePrincipalNames, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Manager, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $RequestFile, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $EnabledOnCreation + ) + + Write-Verbose -Message ( + $script:localizedData.TestConfiguration -f $ComputerName + ) + + $getTargetResourceParameters = @{ + ComputerName = $ComputerName + RequestFile = $RequestFile + DomainController = $DomainController + Credential = $Credential + RestoreFromRecycleBin = $RestoreFromRecycleBin + EnabledOnCreation = $EnabledOnCreation + } + + # Need the @() around this to get a new array to enumerate. + @($getTargetResourceParameters.Keys) | + ForEach-Object { + if (-not $PSBoundParameters.ContainsKey($_)) + { + $getTargetResourceParameters.Remove($_) + } + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + $testTargetResourceReturnValue = $true + + if ($Ensure -eq 'Absent') + { + if ($getTargetResourceResult.Ensure -eq 'Present') + { + Write-Verbose -Message ( + $script:localizedData.ComputerAccountShouldBeAbsent -f $ComputerName + ) + + $testTargetResourceReturnValue = $false + } + } + else + { + if ($getTargetResourceResult.Ensure -eq 'Absent') + { + Write-Verbose -Message ( + $script:localizedData.ComputerAccountShouldBePresent -f $ComputerName + ) + + $testTargetResourceReturnValue = $false + } + else + { + <# + - Ignores the parameter ComputerName since we are not supporting + renaming a computer account. + - Ignore to compare the parameter ServicePrincipalNames here + because it needs a special comparison, so it is handled + afterwards. + - Ignores the Enabled property because it is not enforced in this + resource. + #> + $compareTargetResourceStateParameters = @{ + CurrentValues = $getTargetResourceResult + DesiredValues = $PSBoundParameters + # This gives an array of properties to compare. + Properties = $script:computerObjectPropertyMap.ParameterName + # But these properties + IgnoreProperties = @( + 'ComputerName' + 'ServicePrincipalNames' + 'Enabled' + ) + } + + $compareTargetResourceStateResult = Compare-ResourcePropertyState @compareTargetResourceStateParameters + + if ($false -in $compareTargetResourceStateResult.InDesiredState) + { + $testTargetResourceReturnValue = $false + } + + if ($PSBoundParameters.ContainsKey('ServicePrincipalNames')) + { + $testServicePrincipalNamesParameters = @{ + ExistingServicePrincipalNames = $getTargetResourceResult.ServicePrincipalNames + ServicePrincipalNames = $ServicePrincipalNames + } + + $testTargetResourceReturnValue = Test-ServicePrincipalNames @testServicePrincipalNamesParameters + } + } + + } + + if ($testTargetResourceReturnValue) + { + Write-Verbose -Message ($script:localizedData.ComputerAccountInDesiredState -f $ComputerName) + } + else + { + Write-Verbose -Message ($script:localizedData.ComputerAccountNotInDesiredState -f $ComputerName) + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Creates, removes or modifies the Active Directory computer account. + + .PARAMETER ComputerName + Specifies the name of the Active Directory computer account to manage. + You can identify a computer by its distinguished name, GUID, security + identifier (SID) or Security Accounts Manager (SAM) account name. + + .PARAMETER Ensure + Specifies whether the computer account is present or absent. + Valid values are 'Present' and 'Absent'. The default is 'Present'. + + .PARAMETER UserPrincipalName + Specifies the UPN assigned to the computer account. + + .PARAMETER DisplayName + Specifies the display name of the computer. + + .PARAMETER Path + Specifies the X.500 path of the container where the computer is located. + + .PARAMETER Location + Specifies the location of the computer, such as an office number. + + .PARAMETER DnsHostName + Specifies the fully qualified domain name (FQDN) of the computer. + + .PARAMETER ServicePrincipalNames + Specifies the service principal names for the computer account. + + .PARAMETER Description + Specifies a description of the computer account. + + .PARAMETER Manager + Specifies the user or group Distinguished Name that manages the computer + account. Valid values are the user's or group's DistinguishedName, + ObjectGUID, SID or SamAccountName. + + .PARAMETER RequestFile + Specifies the full path to the Offline Domain Join Request file to create. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to connect to perform the task. + + .PARAMETER Credential + Specifies the user account credentials to use to perform the task. + + .PARAMETER RestoreFromRecycleBin + Try to restore the organizational unit from the recycle bin before + creating a new one. + + .PARAMETER EnabledOnCreation + Specifies if the computer account is created enabled or disabled. + By default the Enabled property of the computer account will be set to + the default value of the cmdlet New-ADComputer. This property is ignored + if the parameter RequestFile is specified in the same configuration. + This parameter does not enforce the property `Enabled`. To enforce the + property `Enabled` see the resource ADObjectEnabledState. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ComputerName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNull()] + [System.String] + $UserPrincipalName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Path, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Location, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DnsHostName, + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $ServicePrincipalNames, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Manager, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $RequestFile, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $EnabledOnCreation + ) + + $getTargetResourceParameters = @{ + ComputerName = $ComputerName + RequestFile = $RequestFile + DomainController = $DomainController + Credential = $Credential + RestoreFromRecycleBin = $RestoreFromRecycleBin + EnabledOnCreation = $EnabledOnCreation + } + + # Need the @() around this to get a new array to enumerate. + @($getTargetResourceParameters.Keys) | + ForEach-Object { + if (-not $PSBoundParameters.ContainsKey($_)) + { + $getTargetResourceParameters.Remove($_) + } + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + if ($Ensure -eq 'Present') + { + if ($getTargetResourceResult.Ensure -eq 'Absent') + { + $restorationSuccessful = $false + + # Try to restore computer account from recycle bin if it exists. + if ($RestoreFromRecycleBin) + { + Write-Verbose -Message ( + $script:localizedData.RestoringComputerAccount -f $ComputerName + ) + + $restoreADCommonObjectParameters = Get-ADCommonParameters @PSBoundParameters + $restoreADCommonObjectParameters['ObjectClass'] = 'Computer' + $restoreADCommonObjectParameters['ErrorAction'] = 'Stop' + + $restorationSuccessful = Restore-ADCommonObject @restoreADCommonObjectParameters + } + + if (-not $RestoreFromRecycleBin -or ($RestoreFromRecycleBin -and -not $restorationSuccessful)) + { + <# + The computer account does not exist, or the computer account + was not present in recycle bin, so the computer account needs + to be created. + #> + + if ($RequestFile) + { + <# + Use DJOIN to create the computer account as well as the + Offline Domain Join (ODJ) request file. + #> + + # This should only be performed on a Domain Member, so detect the Domain Name. + $domainName = Get-DomainName + + Write-Verbose -Message ( + $script:localizedData.CreateOfflineDomainJoinRequest -f $RequestFile, $ComputerName, $domainName + ) + + $dJoinArguments = @( + '/PROVISION' + '/DOMAIN', + $domainName + '/MACHINE', + $ComputerName + ) + + if ($PSBoundParameters.ContainsKey('Path')) + { + $dJoinArguments += @( + '/MACHINEOU', + $Path + ) + } + + if ($PSBoundParameters.ContainsKey('DomainController')) + { + $dJoinArguments += @( + '/DCNAME', + $DomainController + ) + } + + $dJoinArguments += @( + '/SAVEFILE', + $RequestFile + ) + + $startProcessParameters = @{ + FilePath = 'djoin.exe' + ArgumentList = $dJoinArguments + Timeout = 300 + } + + $dJoinProcessExitCode = Start-ProcessWithTimeout @startProcessParameters + + if ($dJoinProcessExitCode -ne 0) + { + $errorMessage = $script:localizedData.FailedToCreateOfflineDomainJoinRequest -f $ComputerName, $dJoinProcessExitCode + New-InvalidOperationException -Message $errorMessage + } + else + { + Write-Verbose -Message ( + $script:localizedData.CreatedOfflineDomainJoinRequestFile -f $RequestFile + ) + } + } + else + { + $newADComputerParameters = Get-ADCommonParameters @PSBoundParameters -UseNameParameter + + if ($PSBoundParameters.ContainsKey('Path')) + { + Write-Verbose -Message ( + $script:localizedData.CreateComputerAccountInPath -f $ComputerName, $Path + ) + + $newADComputerParameters['Path'] = $Path + } + else + { + Write-Verbose -Message ( + $script:localizedData.CreateComputerAccount -f $ComputerName + ) + } + + <# + If the parameter EnabledOnCreation is specified, then the + property Enabled is set to that value. + #> + if ($PSBoundParameters.ContainsKey('EnabledOnCreation')) + { + if ($EnabledOnCreation) + { + Write-Verbose -Message ($script:localizedData.EnabledComputerAccount -f $ComputerName) + } + else + { + Write-Verbose -Message ($script:localizedData.DisabledComputerAccount -f $ComputerName) + } + + $newADComputerParameters['Enabled'] = $EnabledOnCreation + } + + New-ADComputer @newADComputerParameters + } + } + + <# + Now retrieve the newly created computer account so the other + properties can be set if specified. + #> + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + } + + <# + - Ignores the parameter ComputerName since we are not supporting + renaming a computer account. + - Ignore to compare the parameter ServicePrincipalNames here + because it needs a special comparison, so it is handled + afterwards. + - Ignores the Enabled property because it is not enforced in this + resource. + #> + $compareTargetResourceStateParameters = @{ + CurrentValues = $getTargetResourceResult + DesiredValues = $PSBoundParameters + # This gives an array of properties to compare. + Properties = $script:computerObjectPropertyMap.ParameterName + # But these properties + IgnoreProperties = @( + 'ComputerName' + 'ServicePrincipalNames' + 'Enabled' + ) + } + + $compareTargetResourceStateResult = Compare-ResourcePropertyState @compareTargetResourceStateParameters + + if ($PSBoundParameters.ContainsKey('ServicePrincipalNames')) + { + $testServicePrincipalNamesParameters = @{ + ExistingServicePrincipalNames = $getTargetResourceResult.ServicePrincipalNames + ServicePrincipalNames = $ServicePrincipalNames + } + + $compareTargetResourceStateResult += @{ + ParameterName = 'ServicePrincipalNames' + Expected = $testServicePrincipalNamesParameters.ServicePrincipalNames + Actual = $testServicePrincipalNamesParameters.ExistingServicePrincipalNames + InDesiredState = Test-ServicePrincipalNames @testServicePrincipalNamesParameters + } + } + + $commonParameters = Get-ADCommonParameters @PSBoundParameters + + if ($compareTargetResourceStateResult.Where( { $_.ParameterName -eq 'Path' -and -not $_.InDesiredState })) + { + <# + Must move the computer account since we can't simply + update the DistinguishedName property + + It does not work moving the computer account using the + SamAccountName as the identity, so using the property + DistinguishedName instead. + #> + $moveADObjectParameters = $commonParameters.Clone() + $moveADObjectParameters['Identity'] = $getTargetResourceResult.DistinguishedName + + Write-Verbose -Message ( + $script:localizedData.MovingComputerAccount -f $ComputerName, $getTargetResourceResult.Path, $Path + ) + + Move-ADObject @moveADObjectParameters -TargetPath $Path + } + + $replaceComputerProperties = @{} + $removeComputerProperties = @{} + + # Get all properties, other than Path, that is not in desired state. + $propertiesNotInDesiredState = $compareTargetResourceStateResult | + Where-Object -FilterScript { + $_.ParameterName -ne 'Path' -and -not $_.InDesiredState + } + + foreach ($property in $propertiesNotInDesiredState) + { + $computerAccountPropertyName = ($script:computerObjectPropertyMap | + Where-Object -FilterScript { + $_.ParameterName -eq $property.ParameterName + }).PropertyName + + if (-not $computerAccountPropertyName) + { + $computerAccountPropertyName = $property.ParameterName + } + + if ($property.Expected) + { + Write-Verbose -Message ( + $script:localizedData.UpdatingComputerAccountProperty -f $computerAccountPropertyName, ($property.Expected -join ''',''') + ) + + # Replace the current value. + $replaceComputerProperties[$computerAccountPropertyName] = $property.Expected + } + else + { + Write-Verbose -Message ( + $script:localizedData.RemovingComputerAccountProperty -f $property.ParameterName, ($property.Actual -join ''',''') + ) + + # Remove the current value since the desired value is empty or nothing. + $removeComputerProperties[$computerAccountPropertyName] = $property.Actual + } + } + + $setADComputerParameters = $commonParameters.Clone() + + # Set-ADComputer is only called if we have something to change. + if ($replaceComputerProperties.Count -gt 0 -or $removeComputerProperties.Count -gt 0) + { + if ($replaceComputerProperties.Count -gt 0) + { + $setADComputerParameters['Replace'] = $replaceComputerProperties + } + if ($removeComputerProperties.Count -gt 0) + { + $setADComputerParameters['Remove'] = $removeComputerProperties + } + + Set-DscADComputer -Parameters $setADComputerParameters + + Write-Verbose -Message ( + $script:localizedData.UpdatedComputerAccount -f $ComputerName + ) + } + } + elseif ($Ensure -eq 'Absent' -and $getTargetResourceResult.Ensure -eq 'Present') + { + # User exists and needs removing + Write-Verbose -Message ( + $script:localizedData.RemovingComputerAccount -f $ComputerName + ) + + $removeADComputerParameters = Get-ADCommonParameters @PSBoundParameters + $removeADComputerParameters['Confirm'] = $false + + Remove-ADComputer @removeADComputerParameters | + Out-Null + } +} + +<# + .SYNOPSIS + This evaluates the service principal names current state against the + desired state. + + .PARAMETER ExistingServicePrincipalNames + An array of existing service principal names that should be compared + against the array in parameter ServicePrincipalNames. + + .PARAMETER ServicePrincipalNames + An array of the desired service principal names that should be compared + against the array in parameter ExistingServicePrincipalNames. +#> +function Test-ServicePrincipalNames +{ + param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyCollection()] + [System.String[]] + $ExistingServicePrincipalNames, + + [Parameter(Mandatory = $true)] + [AllowEmptyCollection()] + [AllowEmptyString()] + [System.String[]] + $ServicePrincipalNames + + ) + + $testServicePrincipalNamesReturnValue = $true + + $testMembersParameters = @{ + ExistingMembers = $ExistingServicePrincipalNames + Members = $ServicePrincipalNames + } + + if (-not (Test-Members @testMembersParameters)) + { + Write-Verbose -Message ( + $script:localizedData.ServicePrincipalNamesNotInDesiredState ` + -f ($ExistingServicePrincipalNames -join ','), ($ServicePrincipalNames -join ',') + ) + + $testServicePrincipalNamesReturnValue = $false + } + else + { + Write-Verbose -Message ( + $script:localizedData.ServicePrincipalNamesInDesiredState + ) + } + + return $testServicePrincipalNamesReturnValue +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/MSFT_ADComputer.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/MSFT_ADComputer.schema.mof new file mode 100644 index 0000000..04a4b79 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/MSFT_ADComputer.schema.mof @@ -0,0 +1,23 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADComputer")] +class MSFT_ADComputer : OMI_BaseResource +{ + [Key, Description("Specifies the name of the Active Directory computer account to manage. You can identify a computer by its distinguished name, GUID, security identifier (SID) or Security Accounts Manager (SAM) account name.")] String ComputerName; + [Write, Description("Specifies the location of the computer, such as an office number.")] String Location; + [Write, Description("Specifies the fully qualified domain name (FQDN) of the computer account.")] String DnsHostName; + [Write, Description("Specifies the service principal names for the computer account.")] String ServicePrincipalNames[]; + [Write, Description("Specifies the User Principal Name (UPN) assigned to the computer account.")] String UserPrincipalName; + [Write, Description("Specifies the display name of the computer account.")] String DisplayName; + [Write, Description("Specifies the X.500 path of the Organizational Unit (OU) or container where the computer is located.")] String Path; + [Write, Description("Specifies a description of the computer account.")] String Description; + [Write, Description("Specifies the user or group Distinguished Name that manages the computer account. Valid values are the user's or group's DistinguishedName, ObjectGUID, SID or SamAccountName.")] String Manager; + [Write, Description("Specifies the Active Directory Domain Services instance to connect to perform the task.")] String DomainController; + [Write, Description("Specifies the user account credentials to use to perform the task."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Specifies the full path to the Offline Domain Join Request file to create.")] String RequestFile; + [Write, Description("Specifies whether the computer account is present or absent. Default value is 'Present'."), ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [Write, Description("Try to restore the computer account from the recycle bin before creating a new one.")] Boolean RestoreFromRecycleBin; + [Write, Description("Specifies if the computer account is created enabled or disabled. By default the Enabled property of the computer account will be set to the default value of the cmdlet New-ADComputer. This property is ignored if the parameter RequestFile is specified in the same configuration. This parameter does not enforce the property Enabled. To enforce the property Enabled see the resource ADObjectEnabledState.")] Boolean EnabledOnCreation; + [Read, Description("Returns the X.500 path of the computer object.")] String DistinguishedName; + [Read, Description("Returns the security identifier of the computer object.")] String SID; + [Read, Description("Returns the SAM account name of the computer object.")] String SamAccountName; + [Read, Description("Returns $true if the computer object is enabled, otherwise it returns $false.")] Boolean Enabled; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/README.md new file mode 100644 index 0000000..e70463d --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/README.md @@ -0,0 +1,20 @@ +# Description + +The ADComputer DSC resource will manage computer accounts within Active Directory. +This resource can be used to provision a computer account before the computer is +added to the domain. These pre-created computer objects can be used with offline +domain join, unsecure domain Join and RODC domain join scenarios. + +>**Note:** An Offline Domain Join (ODJ) request file will only be created +>when a computer account is first created in the domain. Setting an Offline +>Domain Join (ODJ) Request file path for a configuration that updates a +>computer account that already exists, or restore it from the recycle bin +>will not cause the Offline Domain Join (ODJ) request file to be created. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. +* The parameter `RestoreFromRecycleBin` requires that the feature Recycle + Bin has been enabled prior to an object is deleted. If the feature + Recycle Bin is disabled then the property `msDS-LastKnownRDN` is not + added the deleted object. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/en-US/MSFT_ADComputer.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/en-US/MSFT_ADComputer.strings.psd1 new file mode 100644 index 0000000..d160755 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/en-US/MSFT_ADComputer.strings.psd1 @@ -0,0 +1,27 @@ +# culture="en-US" +ConvertFrom-StringData @' + RetrievingComputerAccount = Retrieving the information about the computer account '{0}' from Active Directory. (ADC0002) + ComputerAccountIsPresent = The computer account '{0}' is present in Active Directory. (ADC0003) + ComputerAccountIsAbsent = The computer account '{0}' is absent from Active Directory. (ADC0004) + FailedToRetrieveComputerAccount = Failed to retrieve the computer account '{0}' from Active Directory. (ADC0005) + TestConfiguration = Determining the current state of the computer account '{0}'. (ADC0006) + ComputerAccountShouldBeAbsent = The computer account '{0}' is present in Active Directory, but expected it to be absent. (ADC0007) + ComputerAccountShouldBePresent = The computer account '{0}' is absent in Active Directory, but expected it to be present. (ADC0008) + ServicePrincipalNamesInDesiredState = The service principal names was in desired state. (ADC0009) + ServicePrincipalNamesNotInDesiredState = The service principal names was '{0}', but expected them to be '{1}'. (ADC0010) + ComputerAccountInDesiredState = The computer account '{0}' is in the desired state. (ADC0011) + ComputerAccountNotInDesiredState = The computer account '{0}' is not in the desired state. (ADC0012) + RestoringComputerAccount = Attempting to restore the computer object {0} from recycle bin. (ADC0013) + FailedToCreateOfflineDomainJoinRequest = Failed to create the Offline Domain Join (ODJ) request file for the computer account '{0}' with the error code '{1}'. (ADC0014) + CreateOfflineDomainJoinRequest = Attempting to create the Offline Domain Join (ODJ) request file '{0}' for the computer account '{1}' in the domain '{2}'. (ADC0015) + CreatedOfflineDomainJoinRequestFile = The Offline Domain Join (ODJ) request file '{0}' was created successfully. (ADC0016) + CreateComputerAccount = The computer account '{0}' is created in Active Directory, at the default path. (ADC0017) + CreateComputerAccountInPath = The computer account '{0}' is created in Active Directory, at the path '{1}'. (ADC0018) + DisabledComputerAccount = The computer account '{0}' is created disabled. (ADC0019) + EnabledComputerAccount = The computer account '{0}' is created enabled. (ADC0020) + MovingComputerAccount = Moving the computer account '{0}' from the path '{1}' to the path '{2}'. (ADC0021) + UpdatingComputerAccountProperty = Updating the computer account property '{0}' with the value(s) '{1}'. (ADC0022) + RemovingComputerAccountProperty = Removing the value(s) '{1}' from the computer account property '{0}'. (ADC0023) + UpdatedComputerAccount = The computer account '{0}' was updated in Active Directory. (ADC0024) + RemovingComputerAccount = Removing the computer account '{0}' from Active Directory. (ADC0025) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/en-US/about_ADComputer.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/en-US/about_ADComputer.help.txt new file mode 100644 index 0000000..582c045 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADComputer/en-US/about_ADComputer.help.txt @@ -0,0 +1,275 @@ +.NAME + ADComputer + +.DESCRIPTION + The ADComputer DSC resource will manage computer accounts within Active Directory. + This resource can be used to provision a computer account before the computer is + added to the domain. These pre-created computer objects can be used with offline + domain join, unsecure domain Join and RODC domain join scenarios. + + >**Note:** An Offline Domain Join (ODJ) request file will only be created + >when a computer account is first created in the domain. Setting an Offline + >Domain Join (ODJ) Request file path for a configuration that updates a + >computer account that already exists, or restore it from the recycle bin + >will not cause the Offline Domain Join (ODJ) request file to be created. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + * The parameter `RestoreFromRecycleBin` requires that the feature Recycle + Bin has been enabled prior to an object is deleted. If the feature + Recycle Bin is disabled then the property `msDS-LastKnownRDN` is not + added the deleted object. + +.PARAMETER ComputerName + Key - String + Specifies the name of the Active Directory computer account to manage. You can identify a computer by its distinguished name, GUID, security identifier (SID) or Security Accounts Manager (SAM) account name. + +.PARAMETER Location + Write - String + Specifies the location of the computer, such as an office number. + +.PARAMETER DnsHostName + Write - String + Specifies the fully qualified domain name (FQDN) of the computer account. + +.PARAMETER ServicePrincipalNames + Write - StringArray + Specifies the service principal names for the computer account. + +.PARAMETER UserPrincipalName + Write - String + Specifies the User Principal Name (UPN) assigned to the computer account. + +.PARAMETER DisplayName + Write - String + Specifies the display name of the computer account. + +.PARAMETER Path + Write - String + Specifies the X.500 path of the Organizational Unit (OU) or container where the computer is located. + +.PARAMETER Description + Write - String + Specifies a description of the computer account. + +.PARAMETER Manager + Write - String + Specifies the user or group Distinguished Name that manages the computer account. Valid values are the user's or group's DistinguishedName, ObjectGUID, SID or SamAccountName. + +.PARAMETER DomainController + Write - String + Specifies the Active Directory Domain Services instance to connect to perform the task. + +.PARAMETER Credential + Write - PSCredential + Specifies the user account credentials to use to perform the task. + +.PARAMETER RequestFile + Write - String + Specifies the full path to the Offline Domain Join Request file to create. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies whether the computer account is present or absent. Default value is 'Present'. + +.PARAMETER RestoreFromRecycleBin + Write - Boolean + Try to restore the computer account from the recycle bin before creating a new one. + +.PARAMETER EnabledOnCreation + Write - Boolean + Specifies if the computer account is created enabled or disabled. By default the Enabled property of the computer account will be set to the default value of the cmdlet New-ADComputer. This property is ignored if the parameter RequestFile is specified in the same configuration. This parameter does not enforce the property Enabled. To enforce the property Enabled see the resource ADObjectEnabledState. + +.PARAMETER DistinguishedName + Read - String + Returns the X.500 path of the computer object. + +.PARAMETER SID + Read - String + Returns the security identifier of the computer object. + +.PARAMETER SamAccountName + Read - String + Returns the SAM account name of the computer object. + +.PARAMETER Enabled + Read - Boolean + Returns $true if the computer object is enabled, otherwise it returns $false. + +.EXAMPLE 1 + +This configuration will create two Active Directory computer accounts +enabled. The property Enabled will not be enforced in either case. + +Configuration ADComputer_AddComputerAccount_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADComputer 'CreateEnabled_SQL01' + { + ComputerName = 'SQL01' + + PsDscRunAsCredential = $Credential + } + + ADComputer 'CreateEnabled_SQL02' + { + ComputerName = 'SQL02' + EnabledOnCreation = $true + + PsDscRunAsCredential = $Credential + } + } +} + +.EXAMPLE 2 + +This configuration will create an Active Directory computer account +disabled. The property Enabled will not be enforced. + +Configuration ADComputer_AddComputerAccountDisabled_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADComputer 'CreateDisabled' + { + ComputerName = 'CLU_CNO01' + EnabledOnCreation = $false + + PsDscRunAsCredential = $Credential + } + } +} + +.EXAMPLE 3 + +This configuration will create an Active Directory computer account +on the specified domain controller and in the specific organizational +unit. + +Configuration ADComputer_AddComputerAccountSpecificPath_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADComputer 'CreateComputerAccount' + { + DomainController = 'DC01' + ComputerName = 'SQL01' + Path = 'OU=Servers,DC=contoso,DC=com' + Credential = $Credential + } + } +} + +.EXAMPLE 4 + +This configuration will create an Active Directory computer account +on the specified domain controller and in the specific organizational +unit. After the account is create an Offline Domain Join Request file +is created to the specified path. + +Configuration ADComputer_AddComputerAccountAndCreateODJRequest_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADComputer 'CreateComputerAccount' + { + DomainController = 'DC01' + ComputerName = 'NANO-200' + Path = 'OU=Servers,DC=contoso,DC=com' + RequestFile = 'D:\ODJFiles\NANO-200.txt' + Credential = $Credential + } + } +} + +.EXAMPLE 5 + +This configuration will create a computer account disabled, configure +a cluster using the disabled computer account, and enforcing the +computer account to be enabled. + +Configuration ADComputer_CreateClusterComputerAccount_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName ActiveDirectoryDsc + Import-DscResource -ModuleName xFailoverCluster -ModuleVersion '1.14.1' + + node localhost + { + ADComputer 'ClusterAccount' + { + ComputerName = 'CLU_CNO01' + EnabledOnCreation = $false + } + + xCluster 'CreateCluster' + { + Name = 'CLU_CNO01' + StaticIPAddress = '192.168.100.20/24' + DomainAdministratorCredential = $Credential + + DependsOn = '[ADComputer]ClusterAccount' + } + + ADObjectEnabledState 'EnforceEnabledPropertyToEnabled' + { + Identity = 'CLU_CNO01' + ObjectClass = 'Computer' + Enabled = $true + + DependsOn = '[xCluster]CreateCluster' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/MSFT_ADDomain.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/MSFT_ADDomain.psm1 new file mode 100644 index 0000000..bd6f8e9 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/MSFT_ADDomain.psm1 @@ -0,0 +1,555 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADDomain' + +<# + .SYNOPSIS + Get the current state of the Domain. + + .PARAMETER DomainName + The fully qualified domain name (FQDN) of a new domain. If setting up a + child domain this must be set to a single-label DNS name. + + .PARAMETER Credential + Specifies the user name and password that corresponds to the account used to install + the domain controller. These are only used when adding a child domain and these credentials + need the correct permission in the parent domain. This will not be created as a user in the + new domain. The domain administrator password will be the same as the password of the local + Administrator of this node. + + .PARAMETER SafeModeAdministratorPassword + Password for the administrator account when the computer is started in Safe Mode. + + .PARAMETER ParentDomainName + Fully qualified domain name (FQDN) of the parent domain. + + .NOTES + Used Functions: + Name | Module + -------------------------------|-------------------------- + Get-ADDomain | ActiveDirectory + Get-ADForest | ActiveDirectory + Assert-Module | ActiveDirectoryDsc.Common + Resolve-DomainFQDN | ActiveDirectoryDsc.Common + New-InvalidOperationException | ActiveDirectoryDsc.Common + ConvertTo-DeploymentForestMode | ActiveDirectoryDsc.Common + ConvertTo-DeploymentDomainMode | ActiveDirectoryDsc.Common +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $SafeModeAdministratorPassword, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ParentDomainName + ) + + Assert-Module -ModuleName 'ADDSDeployment' -ImportModule + $domainFQDN = Resolve-DomainFQDN -DomainName $DomainName -ParentDomainName $ParentDomainName + + # If the domain has been installed then the Netlogon SysVol registry item will exist. + $domainShouldBePresent = $true + try + { + $sysvolPath = Get-ItemPropertyValue -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters' -Name 'SysVol' + } + catch + { + $domainShouldBePresent = $false + } + + if ($domainShouldBePresent) + { + # Test that the correct domain SysVol path exists + $domainSysVolPath = Join-Path -Path $sysvolPath -ChildPath $domainFQDN + + if (-not (Test-Path -Path $domainSysVolPath)) + { + $errorMessage = $script:localizedData.SysVolPathDoesNotExistError -f $domainSysVolPath + New-InvalidOperationException -Message $errorMessage + } + + Write-Verbose ($script:localizedData.QueryDomain -f $domainFQDN) + + $retries = 0 + $maxRetries = 15 + $retryIntervalInSeconds = 30 + + do + { + $domainFound = $true + try + { + $domain = Get-ADDomain -Identity $domainFQDN -Server localhost -ErrorAction Stop + } + catch [Microsoft.ActiveDirectory.Management.ADServerDownException], ` + [System.Security.Authentication.AuthenticationException], ` + [System.InvalidOperationException], ` + [System.ArgumentException] + { + Write-Verbose ($script:localizedData.ADServerNotReady -f $domainFQDN) + $domainFound = $false + # will fall into the retry mechanism. + } + catch + { + $errorMessage = $script:localizedData.GetAdDomainUnexpectedError -f $domainFQDN + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + if (-not $domainFound) + { + $retries++ + + Write-Verbose ($script:localizedData.RetryingGetADDomain -f + $retries, $maxRetries, $retryIntervalInSeconds) + + Start-Sleep -Seconds $retryIntervalInSeconds + } + } while ((-not $domainFound) -and $retries -lt $maxRetries) + + if ($retries -eq $maxRetries) + { + $errorMessage = $script:localizedData.MaxDomainRetriesReachedError -f $domainFQDN + New-InvalidOperationException -Message $errorMessage + } + } + else + { + $domain = $null + } + + if ($domain) + { + Write-Verbose ($script:localizedData.DomainFound -f $domain.DnsRoot) + + try + { + $forest = Get-ADForest -Identity $domain.Forest -Server localhost -ErrorAction Stop + } + catch + { + $errorMessage = $script:localizedData.GetAdForestUnexpectedError -f $domain.Forest + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + $deploymentForestMode = (ConvertTo-DeploymentForestMode -Mode $forest.ForestMode) -as [System.String] + $deploymentDomainMode = (ConvertTo-DeploymentDomainMode -Mode $domain.DomainMode) -as [System.String] + $serviceNTDS = Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' + $serviceNETLOGON = Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters' + + $returnValue = @{ + DomainName = $DomainName + Credential = $Credential + SafeModeAdministratorPassword = $SafeModeAdministratorPassword + ParentDomainName = $domain.ParentDomain + DomainNetBiosName = $domain.NetBIOSName + DnsDelegationCredential = $null + DatabasePath = $serviceNTDS.'DSA Working Directory' + LogPath = $serviceNTDS.'Database log files path' + SysvolPath = $serviceNETLOGON.SysVol -replace '\\sysvol$', '' + ForestMode = $deploymentForestMode + DomainMode = $deploymentDomainMode + DomainExist = $true + Forest = $forest.Name + DnsRoot = $domain.DnsRoot + } + } + else + { + $returnValue = @{ + DomainName = $DomainName + Credential = $Credential + SafeModeAdministratorPassword = $SafeModeAdministratorPassword + ParentDomainName = $ParentDomainName + DomainNetBiosName = $null + DnsDelegationCredential = $null + DatabasePath = $null + LogPath = $null + SysvolPath = $null + ForestMode = $null + DomainMode = $null + DomainExist = $false + Forest = $null + DnsRoot = $null + } + } + + return $returnValue +} #end function Get-TargetResource + +<# + .SYNOPSIS + Tests the current state of the Domain. + + .PARAMETER DomainName + The fully qualified domain name (FQDN) of a new domain. If setting up a + child domain this must be set to a single-label DNS name. + + .PARAMETER Credential + Specifies the user name and password that corresponds to the account used to install + the domain controller. These are only used when adding a child domain and these credentials + need the correct permission in the parent domain. This will not be created as a user in the + new domain. The domain administrator password will be the same as the password of the local + Administrator of this node. + + .PARAMETER SafeModeAdministratorPassword + Password for the administrator account when the computer is started in Safe Mode. + + .PARAMETER ParentDomainName + Fully qualified domain name (FQDN) of the parent domain. + + .PARAMETER DomainNetBiosName + NetBIOS name for the new domain. + + .PARAMETER DnsDelegationCredential + Credential used for creating DNS delegation. + + .PARAMETER DatabasePath + Path to a directory that contains the domain database. + + .PARAMETER LogPath + Path to a directory for the log file that will be written. + + .PARAMETER SysvolPath + Path to a directory where the Sysvol file will be written. + + .PARAMETER ForestMode + The Forest Functional Level for the entire forest. + + .PARAMETER DomainMode + The Domain Functional Level for the entire domain. + + .NOTES + Used Functions: + Name | Module + -------------------|-------------------------- + Resolve-DomainFQDN | ActiveDirectoryDsc.Common +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $SafeModeAdministratorPassword, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ParentDomainName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainNetBiosName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $DnsDelegationCredential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DatabasePath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $SysvolPath, + + [Parameter()] + [ValidateSet('Win2008', 'Win2008R2', 'Win2012', 'Win2012R2', 'WinThreshold')] + [System.String] + $ForestMode, + + [Parameter()] + [ValidateSet('Win2008', 'Win2008R2', 'Win2012', 'Win2012R2', 'WinThreshold')] + [System.String] + $DomainMode + ) + + $getTargetResourceParameters = @{ + DomainName = $DomainName + Credential = $Credential + SafeModeAdministratorPassword = $SafeModeAdministratorPassword + ParentDomainName = $ParentDomainName + } + + @($getTargetResourceParameters.Keys) | + ForEach-Object { + if (-not $PSBoundParameters.ContainsKey($_)) + { + $getTargetResourceParameters.Remove($_) + } + } + + $targetResource = Get-TargetResource @getTargetResourceParameters + + $domainFQDN = Resolve-DomainFQDN -DomainName $DomainName -ParentDomainName $ParentDomainName + + if ($targetResource.DomainExist) + { + Write-Verbose -Message ($script:localizedData.DomainInDesiredState -f + $domainFQDN) + $inDesiredState = $true + } + else + { + Write-Verbose -Message ($script:localizedData.DomainNotInDesiredState -f + $domainFQDN) + $inDesiredState = $false + } + + return $inDesiredState +} #end function Test-TargetResource + +<# + .SYNOPSIS + Sets the state of the Domain. + + .PARAMETER DomainName + The fully qualified domain name (FQDN) of a new domain. If setting up a + child domain this must be set to a single-label DNS name. + + .PARAMETER Credential + Specifies the user name and password that corresponds to the account used to install + the domain controller. These are only used when adding a child domain and these credentials + need the correct permission in the parent domain. This will not be created as a user in the + new domain. The domain administrator password will be the same as the password of the local + Administrator of this node. + + .PARAMETER SafeModeAdministratorPassword + Password for the administrator account when the computer is started in Safe Mode. + + .PARAMETER ParentDomainName + Fully qualified domain name (FQDN) of the parent domain. + + .PARAMETER DomainNetBiosName + NetBIOS name for the new domain. + + .PARAMETER DnsDelegationCredential + Credential used for creating DNS delegation. + + .PARAMETER DatabasePath + Path to a directory that contains the domain database. + + .PARAMETER LogPath + Path to a directory for the log file that will be written. + + .PARAMETER SysvolPath + Path to a directory where the Sysvol file will be written. + + .PARAMETER ForestMode + The Forest Functional Level for the entire forest. + + .PARAMETER DomainMode + The Domain Functional Level for the entire domain. + + .NOTES + Used Functions: + Name | Module + -------------------------------|-------------------------- + Install-ADDSDomain | ActiveDirectory + Install-ADDSForest | ActiveDirectory +#> +function Set-TargetResource +{ + <# + Suppressing this rule because $global:DSCMachineStatus is used to + trigger a reboot for the one that was suppressed when calling + Install-ADDSForest or Install-ADDSDomain. + #> + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $SafeModeAdministratorPassword, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ParentDomainName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainNetBiosName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $DnsDelegationCredential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DatabasePath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $SysvolPath, + + [Parameter()] + [ValidateSet('Win2008', 'Win2008R2', 'Win2012', 'Win2012R2', 'WinThreshold')] + [System.String] + $ForestMode, + + [Parameter()] + [ValidateSet('Win2008', 'Win2008R2', 'Win2012', 'Win2012R2', 'WinThreshold')] + [System.String] + $DomainMode + ) + + # Debug can pause Install-ADDSForest/Install-ADDSDomain, so we remove it. + $null = $PSBoundParameters.Remove('Debug') + + $getTargetResourceParameters = @{ + DomainName = $DomainName + Credential = $Credential + SafeModeAdministratorPassword = $SafeModeAdministratorPassword + ParentDomainName = $ParentDomainName + } + + @($getTargetResourceParameters.Keys) | + ForEach-Object { + if (-not $PSBoundParameters.ContainsKey($_)) + { + $getTargetResourceParameters.Remove($_) + } + } + + $targetResource = Get-TargetResource @getTargetResourceParameters + + if (-not $targetResource.DomainExist) + { + $installADDSParameters = @{ + SafeModeAdministratorPassword = $SafeModeAdministratorPassword.Password + NoRebootOnCompletion = $true + Force = $true + ErrorAction = 'Stop' + } + + if ($PSBoundParameters.ContainsKey('DnsDelegationCredential')) + { + $installADDSParameters['DnsDelegationCredential'] = $DnsDelegationCredential + $installADDSParameters['CreateDnsDelegation'] = $true + } + + if ($PSBoundParameters.ContainsKey('DatabasePath')) + { + $installADDSParameters['DatabasePath'] = $DatabasePath + } + + if ($PSBoundParameters.ContainsKey('LogPath')) + { + $installADDSParameters['LogPath'] = $LogPath + } + + if ($PSBoundParameters.ContainsKey('SysvolPath')) + { + $installADDSParameters['SysvolPath'] = $SysvolPath + } + + if ($PSBoundParameters.ContainsKey('DomainMode')) + { + $installADDSParameters['DomainMode'] = $DomainMode + } + + if ($PSBoundParameters.ContainsKey('ParentDomainName')) + { + Write-Verbose -Message ($script:localizedData.CreatingChildDomain -f $DomainName, $ParentDomainName) + $installADDSParameters['Credential'] = $Credential + $installADDSParameters['NewDomainName'] = $DomainName + $installADDSParameters['ParentDomainName'] = $ParentDomainName + $installADDSParameters['DomainType'] = 'ChildDomain' + + if ($PSBoundParameters.ContainsKey('DomainNetBiosName')) + { + $installADDSParameters['NewDomainNetBiosName'] = $DomainNetBiosName + } + + Install-ADDSDomain @installADDSParameters + + Write-Verbose -Message ($script:localizedData.CreatedChildDomain) + } + else + { + Write-Verbose -Message ($script:localizedData.CreatingForest -f $DomainName) + $installADDSParameters['DomainName'] = $DomainName + + if ($PSBoundParameters.ContainsKey('DomainNetBiosName')) + { + $installADDSParameters['DomainNetBiosName'] = $DomainNetBiosName + } + + if ($PSBoundParameters.ContainsKey('ForestMode')) + { + $installADDSParameters['ForestMode'] = $ForestMode + } + + Install-ADDSForest @installADDSParameters + + Write-Verbose -Message ($script:localizedData.CreatedForest -f $DomainName) + } + + <# + Signal to the LCM to reboot the node to compensate for the one we + suppressed from Install-ADDSForest/Install-ADDSDomain. + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', + Justification = 'Set LCM DSCMachineStatus to indicate reboot required')] + $global:DSCMachineStatus = 1 + } +} #end function Set-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/MSFT_ADDomain.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/MSFT_ADDomain.schema.mof new file mode 100644 index 0000000..542c9fe --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/MSFT_ADDomain.schema.mof @@ -0,0 +1,18 @@ +[ClassVersion("1.0.1.0"), FriendlyName("ADDomain")] +class MSFT_ADDomain : OMI_BaseResource +{ + [Key, Description("The fully qualified domain name (FQDN) of a new domain. If setting up a child domain this must be set to a single-label DNS name.")] String DomainName; + [Required, Description("Specifies the user name and password that corresponds to the account used to install the domain controller. These are only used when adding a child domain and these credentials need the correct permission in the parent domain. This will not be created as a user in the new domain. The domain administrator password will be the same as the password of the local Administrator of this node."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Required, Description("Password for the administrator account when the computer is started in Safe Mode."), EmbeddedInstance("MSFT_Credential")] String SafeModeAdministratorPassword; + [Write, Description("Fully qualified domain name (FQDN) of the parent domain.")] String ParentDomainName; + [Write, Description("NetBIOS name for the new domain.")] String DomainNetBiosName; + [Write, Description("Credential used for creating DNS delegation."), EmbeddedInstance("MSFT_Credential")] String DnsDelegationCredential; + [Write, Description("Path to a directory that contains the domain database.")] String DatabasePath; + [Write, Description("Path to a directory for the log file that will be written.")] String LogPath; + [Write, Description("Path to a directory where the Sysvol file will be written.")] String SysvolPath; + [Write, Description("The Forest Functional Level for the entire forest."), ValueMap{"Win2008", "Win2008R2", "Win2012", "Win2012R2", "WinThreshold"}, Values{"Win2008", "Win2008R2", "Win2012", "Win2012R2", "WinThreshold"}] String ForestMode; + [Write, Description("The Domain Functional Level for the entire domain."), ValueMap{"Win2008", "Win2008R2", "Win2012", "Win2012R2", "WinThreshold"}, Values{"Win2008", "Win2008R2", "Win2012", "Win2012R2", "WinThreshold"}] String DomainMode; + [Read, Description("Returns $true if the domain is available, or $false if the domain could not be found.")] Boolean DomainExist; + [Read, Description("Returns the fully qualified domain name (FQDN) DNS root of the domain.")] String DnsRoot; + [Read, Description("Returns the fully qualified domain name (FQDN) of the forest.")] String Forest; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/README.md new file mode 100644 index 0000000..9dc0c25 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/README.md @@ -0,0 +1,7 @@ +# Description + +The ADDomain resource creates a new domain in a new forest or a child domain in an existing forest. While it is possible to set the forest functional level and the domain functional level during deployment with this resource the common restrictions apply. For more information see [TechNet](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/active-directory-functional-levels). + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/en-US/MSFT_ADDomain.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/en-US/MSFT_ADDomain.strings.psd1 new file mode 100644 index 0000000..d744978 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/en-US/MSFT_ADDomain.strings.psd1 @@ -0,0 +1,17 @@ +# culture="en-US" +ConvertFrom-StringData @' + QueryDomain = Querying for domain '{0}'. (ADD0001) + ADServerNotReady = The AD Server for domain '{0}' is currently not ready. (ADD0002) + DomainFound = Active Directory domain '{0}' found. (ADD0003) + CreatingChildDomain = Creating domain '{0}' as a child of domain '{1}'. (ADD0004) + CreatedChildDomain = Child domain '{0}' created. (ADD0005) + CreatingForest = Creating AD forest '{0}'. (ADD0006) + CreatedForest = AD forest '{0}' created. (ADD0007) + DomainInDesiredState = The domain '{0}' is in the desired state. (ADD0008) + DomainNotInDesiredState = The domain '{0}' is NOT in the desired state. (ADD0009) + RetryingGetADDomain = Attempt {0} of {1} to call Get-ADDomain failed, retrying in {2} seconds. (ADD0010) + SysVolPathDoesNotExistError = The expected SysVol Path '{0}' does not exist. (ADD0011) + MaxDomainRetriesReachedError = Maximum Get-ADDomain retries reached and the domain did not respond. (ADD0012) + GetAdDomainUnexpectedError = Error getting AD domain '{0}'. (ADD0013) + GetAdForestUnexpectedError = Error getting AD forest '{0}'. (ADD0014) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/en-US/about_ADDomain.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/en-US/about_ADDomain.help.txt new file mode 100644 index 0000000..acf5188 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomain/en-US/about_ADDomain.help.txt @@ -0,0 +1,164 @@ +.NAME + ADDomain + +.DESCRIPTION + The ADDomain resource creates a new domain in a new forest or a child domain in an existing forest. While it is possible to set the forest functional level and the domain functional level during deployment with this resource the common restrictions apply. For more information see [TechNet](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/active-directory-functional-levels). + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER DomainName + Key - String + The fully qualified domain name (FQDN) of a new domain. If setting up a child domain this must be set to a single-label DNS name. + +.PARAMETER Credential + Required - PSCredential + Specifies the user name and password that corresponds to the account used to install the domain controller. These are only used when adding a child domain and these credentials need the correct permission in the parent domain. This will not be created as a user in the new domain. The domain administrator password will be the same as the password of the local Administrator of this node. + +.PARAMETER SafeModeAdministratorPassword + Required - PSCredential + Password for the administrator account when the computer is started in Safe Mode. + +.PARAMETER ParentDomainName + Write - String + Fully qualified domain name (FQDN) of the parent domain. + +.PARAMETER DomainNetBiosName + Write - String + NetBIOS name for the new domain. + +.PARAMETER DnsDelegationCredential + Write - PSCredential + Credential used for creating DNS delegation. + +.PARAMETER DatabasePath + Write - String + Path to a directory that contains the domain database. + +.PARAMETER LogPath + Write - String + Path to a directory for the log file that will be written. + +.PARAMETER SysvolPath + Write - String + Path to a directory where the Sysvol file will be written. + +.PARAMETER ForestMode + Write - String + Allowed values: Win2008, Win2008R2, Win2012, Win2012R2, WinThreshold + The Forest Functional Level for the entire forest. + +.PARAMETER DomainMode + Write - String + Allowed values: Win2008, Win2008R2, Win2012, Win2012R2, WinThreshold + The Domain Functional Level for the entire domain. + +.PARAMETER DomainExist + Read - Boolean + Returns $true if the domain is available, or $false if the domain could not be found. + +.PARAMETER DnsRoot + Read - String + Returns the fully qualified domain name (FQDN) DNS root of the domain. + +.PARAMETER Forest + Read - String + Returns the fully qualified domain name (FQDN) of the forest. + +.EXAMPLE 1 + +This configuration will create a new domain with a new forest and a forest +functional level of Server 2016. + +Configuration ADDomain_NewForest_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $SafeModePassword + ) + + Import-DscResource -ModuleName PSDesiredStateConfiguration + Import-DscResource -ModuleName ActiveDirectoryDsc + + node 'localhost' + { + WindowsFeature 'ADDS' + { + Name = 'AD-Domain-Services' + Ensure = 'Present' + } + + WindowsFeature 'RSAT' + { + Name = 'RSAT-AD-PowerShell' + Ensure = 'Present' + } + + ADDomain 'contoso.com' + { + DomainName = 'contoso.com' + Credential = $Credential + SafemodeAdministratorPassword = $SafeModePassword + ForestMode = 'WinThreshold' + } + } +} + +.EXAMPLE 2 + +This configuration will create a new child domain in an existing forest with +a Domain Functional Level of Windows Server 2012R2. + +Configuration ADDomain_NewChildDomain_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $SafeModePassword + ) + + Import-DscResource -ModuleName PSDesiredStateConfiguration + Import-DscResource -ModuleName ActiveDirectoryDsc + + node 'localhost' + { + WindowsFeature 'ADDS' + { + Name = 'AD-Domain-Services' + Ensure = 'Present' + } + + WindowsFeature 'RSAT' + { + Name = 'RSAT-AD-PowerShell' + Ensure = 'Present' + } + + ADDomain 'child' + { + DomainName = 'child' + Credential = $Credential + SafemodeAdministratorPassword = $SafeModePassword + DomainMode = 'Win2012R2' + ParentDomainName = 'contoso.com' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/MSFT_ADDomainController.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/MSFT_ADDomainController.psm1 new file mode 100644 index 0000000..dafef40 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/MSFT_ADDomainController.psm1 @@ -0,0 +1,854 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADDomainController' + +<# + .SYNOPSIS + Returns the current state of the domain controller. + + .PARAMETER DomainName + Provide the FQDN of the domain the Domain Controller is being added to. + + .PARAMETER Credential + Specifies the credential for the account used to install the domain controller. + This account must have permission to access the other domain controllers + in the domain to be able replicate domain information. + + .PARAMETER SafemodeAdministratorPassword + Provide a password that will be used to set the DSRM password. This is a PSCredential. + + .NOTES + Used Functions: + Name | Module + ------------------------------------------------|-------------------------- + Get-ADDomain | ActiveDirectory + Get-ADDomainControllerPasswordReplicationPolicy | ActiveDirectory + Get-DomainControllerObject | ActiveDirectoryDsc.Common + Assert-Module | ActiveDirectoryDsc.Common +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $SafemodeAdministratorPassword + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + Write-Verbose -Message ($script:localizedData.ResolveDomainName -f $DomainName) + + try + { + $domain = Get-ADDomain -Identity $DomainName -Credential $Credential + } + catch + { + $errorMessage = $script:localizedData.MissingDomain -f $DomainName + New-ObjectNotFoundException -Message $errorMessage -ErrorRecord $_ + } + + Write-Verbose -Message ($script:localizedData.DomainPresent -f $DomainName) + + $domainControllerObject = Get-DomainControllerObject ` + -DomainName $DomainName -ComputerName $env:COMPUTERNAME -Credential $Credential + + if ($domainControllerObject) + { + Write-Verbose -Message ($script:localizedData.IsDomainController -f + $domainControllerObject.Name, $domainControllerObject.Domain) + + $allowedPasswordReplicationAccountName = ( + Get-ADDomainControllerPasswordReplicationPolicy -Allowed -Identity $domainControllerObject | + ForEach-Object -MemberName sAMAccountName) + $deniedPasswordReplicationAccountName = ( + Get-ADDomainControllerPasswordReplicationPolicy -Denied -Identity $domainControllerObject | + ForEach-Object -MemberName sAMAccountName) + $serviceNTDS = Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters' + $serviceNETLOGON = Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters' + $installDns = [System.Boolean](Get-Service -Name dns -ErrorAction SilentlyContinue) + + $targetResource = @{ + AllowPasswordReplicationAccountName = @($allowedPasswordReplicationAccountName) + Credential = $Credential + DatabasePath = $serviceNTDS.'DSA Working Directory' + DenyPasswordReplicationAccountName = @($deniedPasswordReplicationAccountName) + DomainName = $domainControllerObject.Domain + Ensure = $true + FlexibleSingleMasterOperationRole = @($domainControllerObject.OperationMasterRoles) + InstallationMediaPath = $null + InstallDns = $installDns + IsGlobalCatalog = $domainControllerObject.IsGlobalCatalog + LogPath = $serviceNTDS.'Database log files path' + ReadOnlyReplica = $domainControllerObject.IsReadOnly + SafemodeAdministratorPassword = $SafemodeAdministratorPassword + SiteName = $domainControllerObject.Site + SysvolPath = $serviceNETLOGON.SysVol -replace '\\sysvol$', '' + } + } + else + { + Write-Verbose -Message ($script:localizedData.NotDomainController -f $env:COMPUTERNAME) + + $targetResource = @{ + AllowPasswordReplicationAccountName = $null + Credential = $Credential + DatabasePath = $null + DenyPasswordReplicationAccountName = $null + DomainName = $DomainName + Ensure = $false + FlexibleSingleMasterOperationRole = $null + InstallationMediaPath = $null + InstallDns = $false + IsGlobalCatalog = $false + LogPath = $null + ReadOnlyReplica = $false + SafemodeAdministratorPassword = $SafemodeAdministratorPassword + SiteName = $null + SysvolPath = $null + } + } + + return $targetResource +} + +<# + .SYNOPSIS + Installs, or change properties on, a domain controller. + + .PARAMETER DomainName + Provide the FQDN of the domain the Domain Controller is being added to. + + .PARAMETER Credential + Specifies the credential for the account used to install the domain controller. + This account must have permission to access the other domain controllers + in the domain to be able replicate domain information. + + .PARAMETER SafemodeAdministratorPassword + Provide a password that will be used to set the DSRM password. This is a PSCredential. + + .PARAMETER DatabasePath + Provide the path where the NTDS.dit will be created and stored. + + .PARAMETER LogPath + Provide the path where the logs for the NTDS will be created and stored. + + .PARAMETER SysvolPath + Provide the path where the Sysvol will be created and stored. + + .PARAMETER SiteName + Provide the name of the site you want the Domain Controller to be added to. + + .PARAMETER InstallationMediaPath + Provide the path for the IFM folder that was created with ntdsutil. + This should not be on a share but locally to the Domain Controller being promoted. + + .PARAMETER IsGlobalCatalog + Specifies if the domain controller will be a Global Catalog (GC). + + .PARAMETER ReadOnlyReplica + Specifies if the domain controller should be provisioned as read-only domain controller + + .PARAMETER AllowPasswordReplicationAccountName + Provides a list of the users, computers, and groups to add to the password replication allowed list. + + .PARAMETER DenyPasswordReplicationAccountName + Provides a list of the users, computers, and groups to add to the password replication denied list. + + .PARAMETER FlexibleSingleMasterOperationRole + Specifies one or more Flexible Single Master Operation (FSMO) roles to + move to this domain controller. The current owner must be online and + responding for the move to be allowed. + + .PARAMETER InstallDns + Specifies if the DNS Server service should be installed and configured on + the domain controller. If this is not set the default value of the parameter + InstallDns of the cmdlet Install-ADDSDomainController is used. + The parameter `InstallDns` is only used during the provisioning of a domain + controller. The parameter cannot be used to install or uninstall the DNS + server on an already provisioned domain controller. + .NOTES + Used Functions: + Name | Module + ---------------------------------------------------|-------------------------- + Install-ADDSDomainController | ActiveDirectory + Get-ADDomain | ActiveDirectory + Get-ADForest | ActiveDirectory + Set-ADObject | ActiveDirectory + Move-ADDirectoryServer | ActiveDirectory + Move-ADDirectoryServerOperationMasterRole | ActiveDirectory + Remove-ADDomainControllerPasswordReplicationPolicy | ActiveDirectory + Add-ADDomainControllerPasswordReplicationPolicy | ActiveDirectory + Get-DomainControllerObject | ActiveDirectoryDsc.Common + New-InvalidOperationException | ActiveDirectoryDsc.Common +#> +function Set-TargetResource +{ + <# + Suppressing this rule because $global:DSCMachineStatus is used to + trigger a reboot for the one that was suppressed when calling + Install-ADDSDomainController. + #> + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '', + Justification = 'Read-Only Domain Controller (RODC) Creation support(AllowPasswordReplicationAccountName and DenyPasswordReplicationAccountName)')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $SafemodeAdministratorPassword, + + [Parameter()] + [System.String] + $DatabasePath, + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [System.String] + $SysvolPath, + + [Parameter()] + [System.String] + $SiteName, + + [Parameter()] + [System.String] + $InstallationMediaPath, + + [Parameter()] + [System.Boolean] + $IsGlobalCatalog, + + [Parameter()] + [System.Boolean] + $ReadOnlyReplica, + + [Parameter()] + [System.String[]] + $AllowPasswordReplicationAccountName, + + [Parameter()] + [System.String[]] + $DenyPasswordReplicationAccountName, + + [Parameter()] + [ValidateSet('DomainNamingMaster', 'SchemaMaster', 'InfrastructureMaster', 'PDCEmulator', 'RIDMaster')] + [System.String[]] + $FlexibleSingleMasterOperationRole, + + [Parameter()] + [System.Boolean] + $InstallDns + ) + + $getTargetResourceParameters = @{ + DomainName = $DomainName + Credential = $Credential + SafeModeAdministratorPassword = $SafemodeAdministratorPassword + } + + $targetResource = Get-TargetResource @getTargetResourceParameters + + if ($targetResource.Ensure -eq $false) + { + Write-Verbose -Message ($script:localizedData.Promoting -f $env:COMPUTERNAME, $DomainName) + + # Node is not a domain controller so we promote it. + $installADDSDomainControllerParameters = @{ + DomainName = $DomainName + SafeModeAdministratorPassword = $SafemodeAdministratorPassword.Password + Credential = $Credential + NoRebootOnCompletion = $true + Force = $true + } + + if ($PSBoundParameters.ContainsKey('ReadOnlyReplica') -and $ReadOnlyReplica -eq $true) + { + if (-not $PSBoundParameters.ContainsKey('SiteName')) + { + New-InvalidOperationException -Message $script:localizedData.RODCMissingSite + } + + $installADDSDomainControllerParameters.Add('ReadOnlyReplica', $true) + } + + if ($PSBoundParameters.ContainsKey('AllowPasswordReplicationAccountName')) + { + $installADDSDomainControllerParameters.Add('AllowPasswordReplicationAccountName', + $AllowPasswordReplicationAccountName) + } + + if ($PSBoundParameters.ContainsKey('DenyPasswordReplicationAccountName')) + { + $installADDSDomainControllerParameters.Add('DenyPasswordReplicationAccountName', + $DenyPasswordReplicationAccountName) + } + + if ($PSBoundParameters.ContainsKey('DatabasePath')) + { + $installADDSDomainControllerParameters.Add('DatabasePath', $DatabasePath) + } + + if ($PSBoundParameters.ContainsKey('LogPath')) + { + $installADDSDomainControllerParameters.Add('LogPath', $LogPath) + } + + if ($PSBoundParameters.ContainsKey('SysvolPath')) + { + $installADDSDomainControllerParameters.Add('SysvolPath', $SysvolPath) + } + + if ($PSBoundParameters.ContainsKey('SiteName') -and $SiteName) + { + $installADDSDomainControllerParameters.Add('SiteName', $SiteName) + } + + if ($PSBoundParameters.ContainsKey('IsGlobalCatalog') -and $IsGlobalCatalog -eq $false) + { + $installADDSDomainControllerParameters.Add('NoGlobalCatalog', $true) + } + + if ($PSBoundParameters.ContainsKey('InstallDns')) + { + $installADDSDomainControllerParameters.Add('InstallDns', $InstallDns) + } + + if (-not [System.String]::IsNullOrWhiteSpace($InstallationMediaPath)) + { + $installADDSDomainControllerParameters.Add('InstallationMediaPath', $InstallationMediaPath) + } + + Install-ADDSDomainController @installADDSDomainControllerParameters + + Write-Verbose -Message ($script:localizedData.Promoted -f $env:COMPUTERNAME, $DomainName) + + <# + Signal to the LCM to reboot the node to compensate for the one we + suppressed from Install-ADDSDomainController + #> + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', + Justification = 'Set LCM DSCMachineStatus to indicate reboot required')] + $global:DSCMachineStatus = 1 + } + elseif ($targetResource.Ensure) + { + # Node is a domain controller. We check if other properties are in desired state + + Write-Verbose -Message ($script:localizedData.IsDomainController -f $env:COMPUTERNAME, $DomainName) + + $domainControllerObject = Get-DomainControllerObject ` + -DomainName $DomainName -ComputerName $env:COMPUTERNAME -Credential $Credential + + # Check if Node Global Catalog state is correct + if ($PSBoundParameters.ContainsKey('IsGlobalCatalog') -and + $targetResource.IsGlobalCatalog -ne $IsGlobalCatalog) + { + # DC is not in the expected Global Catalog state + if ($IsGlobalCatalog) + { + $globalCatalogOptionValue = 1 + + Write-Verbose -Message $script:localizedData.AddGlobalCatalog + } + else + { + $globalCatalogOptionValue = 0 + + Write-Verbose -Message $script:localizedData.RemoveGlobalCatalog + } + + Set-ADObject -Identity $domainControllerObject.NTDSSettingsObjectDN -Replace @{ + options = $globalCatalogOptionValue + } + } + + if ($PSBoundParameters.ContainsKey('SiteName') -and $targetResource.SiteName -ne $SiteName) + { + # DC is not in correct site. Move it. + Write-Verbose -Message ($script:localizedData.MovingDomainController -f + $targetResource.SiteName, $SiteName) + + Move-ADDirectoryServer -Identity $env:COMPUTERNAME -Site $SiteName -Credential $Credential + } + + if ($PSBoundParameters.ContainsKey('AllowPasswordReplicationAccountName')) + { + $testMembersParameters = @{ + ExistingMembers = $targetResource.AllowPasswordReplicationAccountName + Members = $AllowPasswordReplicationAccountName + } + + if (-not (Test-Members @testMembersParameters)) + { + Write-Verbose -Message ( + $script:localizedData.AllowedSyncAccountsMismatch -f + ($targetResource.AllowPasswordReplicationAccountName -join ';'), + ($AllowPasswordReplicationAccountName -join ';') + ) + + $getMembersToAddAndRemoveParameters = @{ + DesiredMembers = $AllowPasswordReplicationAccountName + CurrentMembers = $targetResource.AllowPasswordReplicationAccountName + } + + $getMembersToAddAndRemoveResult = Get-MembersToAddAndRemove @getMembersToAddAndRemoveParameters + + $adPrincipalsToRemove = $getMembersToAddAndRemoveResult.MembersToRemove + $adPrincipalsToAdd = $getMembersToAddAndRemoveResult.MembersToAdd + + if ($null -ne $adPrincipalsToRemove) + { + $removeADPasswordReplicationPolicy = @{ + Identity = $domainControllerObject + AllowedList = $adPrincipalsToRemove + } + + Remove-ADDomainControllerPasswordReplicationPolicy @removeADPasswordReplicationPolicy ` + -Confirm:$false + } + + if ($null -ne $adPrincipalsToAdd) + { + $addADPasswordReplicationPolicy = @{ + Identity = $domainControllerObject + AllowedList = $adPrincipalsToAdd + } + + Add-ADDomainControllerPasswordReplicationPolicy @addADPasswordReplicationPolicy + } + } + } + + if ($PSBoundParameters.ContainsKey('DenyPasswordReplicationAccountName')) + { + $testMembersParameters = @{ + ExistingMembers = $targetResource.DenyPasswordReplicationAccountName + Members = $DenyPasswordReplicationAccountName; + } + + if (-not (Test-Members @testMembersParameters)) + { + Write-Verbose -Message ( + $script:localizedData.DenySyncAccountsMismatch -f + ($targetResource.DenyPasswordReplicationAccountName -join ';'), + ($DenyPasswordReplicationAccountName -join ';') + ) + + $getMembersToAddAndRemoveParameters = @{ + DesiredMembers = $DenyPasswordReplicationAccountName + CurrentMembers = $targetResource.DenyPasswordReplicationAccountName + } + + $getMembersToAddAndRemoveResult = Get-MembersToAddAndRemove @getMembersToAddAndRemoveParameters + + $adPrincipalsToRemove = $getMembersToAddAndRemoveResult.MembersToRemove + $adPrincipalsToAdd = $getMembersToAddAndRemoveResult.MembersToAdd + + if ($null -ne $adPrincipalsToRemove) + { + $removeADPasswordReplicationPolicy = @{ + Identity = $domainControllerObject + DeniedList = $adPrincipalsToRemove + } + + Remove-ADDomainControllerPasswordReplicationPolicy @removeADPasswordReplicationPolicy ` + -Confirm:$false + } + + if ($null -ne $adPrincipalsToAdd) + { + $addADPasswordReplicationPolicy = @{ + Identity = $domainControllerObject + DeniedList = $adPrincipalsToAdd + } + + Add-ADDomainControllerPasswordReplicationPolicy @addADPasswordReplicationPolicy + } + + } + } + + if ($PSBoundParameters.ContainsKey('FlexibleSingleMasterOperationRole')) + { + foreach ($desiredFlexibleSingleMasterOperationRole in $FlexibleSingleMasterOperationRole) + { + if ($desiredFlexibleSingleMasterOperationRole -notin $targetResource.FlexibleSingleMasterOperationRole) + { + switch ($desiredFlexibleSingleMasterOperationRole) + { + <# + Connect to any available domain controller to get the + current owner for the specific role. + #> + { $_ -in @('DomainNamingMaster', 'SchemaMaster') } + { + $currentOwnerFullyQualifiedDomainName = (Get-ADForest).$_ + } + + { $_ -in @('InfrastructureMaster', 'PDCEmulator', 'RIDMaster') } + { + $currentOwnerFullyQualifiedDomainName = (Get-ADDomain).$_ + } + } + + Write-Verbose -Message ($script:localizedData.MovingFlexibleSingleMasterOperationRole -f + $desiredFlexibleSingleMasterOperationRole, $currentOwnerFullyQualifiedDomainName) + + <# + Using the object returned from Get-ADDomainController to handle + an issue with calling Move-ADDirectoryServerOperationMasterRole + with Fully Qualified Domain Name (FQDN) in the Identity parameter. + #> + $MoveADDirectoryServerOperationMasterRoleParameters = @{ + Identity = $domainControllerObject + OperationMasterRole = $desiredFlexibleSingleMasterOperationRole + Server = $currentOwnerFullyQualifiedDomainName + ErrorAction = 'Stop' + } + + Move-ADDirectoryServerOperationMasterRole @MoveADDirectoryServerOperationMasterRoleParameters + } + } + } + } +} + +<# + .SYNOPSIS + Determines if the domain controller is in desired state. + + .PARAMETER DomainName + Provide the FQDN of the domain the Domain Controller is being added to. + + .PARAMETER Credential + Specifies the credential for the account used to install the domain controller. + This account must have permission to access the other domain controllers + in the domain to be able replicate domain information. + + .PARAMETER SafemodeAdministratorPassword + Provide a password that will be used to set the DSRM password. This is a PSCredential. + + .PARAMETER DatabasePath + Provide the path where the NTDS.dit will be created and stored. + + .PARAMETER LogPath + Provide the path where the logs for the NTDS will be created and stored. + + .PARAMETER SysvolPath + Provide the path where the Sysvol will be created and stored. + + .PARAMETER SiteName + Provide the name of the site you want the Domain Controller to be added to. + + .PARAMETER InstallationMediaPath + Provide the path for the IFM folder that was created with ntdsutil. + This should not be on a share but locally to the Domain Controller being promoted. + + .PARAMETER IsGlobalCatalog + Specifies if the domain controller will be a Global Catalog (GC). + + .PARAMETER ReadOnlyReplica + Specifies if the domain controller should be provisioned as read-only domain controller + + .PARAMETER AllowPasswordReplicationAccountName + Provides a list of the users, computers, and groups to add to the password replication allowed list. + + .PARAMETER DenyPasswordReplicationAccountName + Provides a list of the users, computers, and groups to add to the password replication denied list. + + .PARAMETER FlexibleSingleMasterOperationRole + Specifies one or more Flexible Single Master Operation (FSMO) roles to + move to this domain controller. The current owner must be online and + responding for the move to be allowed. + + .PARAMETER InstallDns + Specifies if the DNS Server service should be installed and configured on + the domain controller. If this is not set the default value of the parameter + InstallDns of the cmdlet Install-ADDSDomainController is used. + The parameter `InstallDns` is only used during the provisioning of a domain + controller. The parameter cannot be used to install or uninstall the DNS + server on an already provisioned domain controller. + + Not used in Test-TargetResource. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Test-ADReplicationSite | ActiveDirectoryDsc.Common + New-InvalidOperationException | ActiveDirectoryDsc.Common + New-ObjectNotFoundException | ActiveDirectoryDsc.Common + Test-Members | ActiveDirectoryDsc.Common +#> +function Test-TargetResource +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "", + Justification = 'Read-Only Domain Controller (RODC) Creation support($AllowPasswordReplicationAccountName and DenyPasswordReplicationAccountName)')] + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $SafemodeAdministratorPassword, + + [Parameter()] + [System.String] + $DatabasePath, + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [System.String] + $SysvolPath, + + [Parameter()] + [System.String] + $SiteName, + + [Parameter()] + [System.String] + $InstallationMediaPath, + + [Parameter()] + [System.Boolean] + $IsGlobalCatalog, + + [Parameter()] + [System.Boolean] + $ReadOnlyReplica, + + [Parameter()] + [System.String[]] + $AllowPasswordReplicationAccountName, + + [Parameter()] + [System.String[]] + $DenyPasswordReplicationAccountName, + + [Parameter()] + [ValidateSet('DomainNamingMaster', 'SchemaMaster', 'InfrastructureMaster', 'PDCEmulator', 'RIDMaster')] + [System.String[]] + $FlexibleSingleMasterOperationRole, + + [Parameter()] + [System.Boolean] + $InstallDns + ) + + Write-Verbose -Message ($script:localizedData.TestingConfiguration -f $env:COMPUTERNAME, $DomainName) + + if ($PSBoundParameters.ContainsKey('ReadOnlyReplica') -and $ReadOnlyReplica -eq $true) + { + if (-not $PSBoundParameters.ContainsKey('SiteName')) + { + New-InvalidOperationException -Message $script:localizedData.RODCMissingSite + } + } + + if ($PSBoundParameters.ContainsKey('SiteName')) + { + if (-not (Test-ADReplicationSite -SiteName $SiteName -DomainName $DomainName -Credential $Credential)) + { + $errorMessage = $script:localizedData.FailedToFindSite -f $SiteName, $DomainName + New-ObjectNotFoundException -Message $errorMessage + } + } + + $getTargetResourceParameters = @{ + DomainName = $DomainName + Credential = $Credential + SafeModeAdministratorPassword = $SafemodeAdministratorPassword + } + + $existingResource = Get-TargetResource @getTargetResourceParameters + + $testTargetResourceReturnValue = $existingResource.Ensure + + if ($PSBoundParameters.ContainsKey('ReadOnlyReplica') -and $ReadOnlyReplica) + { + if ($testTargetResourceReturnValue -and -not $testTargetResourceReturnValue.ReadOnlyReplica) + { + New-InvalidOperationException -Message $script:localizedData.CannotConvertToRODC + } + } + + if ($PSBoundParameters.ContainsKey('SiteName') -and $existingResource.SiteName -ne $SiteName) + { + Write-Verbose -Message ($script:localizedData.WrongSite -f $existingResource.SiteName, $SiteName) + + $testTargetResourceReturnValue = $false + } + + # Check Global Catalog Config + if ($PSBoundParameters.ContainsKey('IsGlobalCatalog') -and $existingResource.IsGlobalCatalog -ne $IsGlobalCatalog) + { + if ($IsGlobalCatalog) + { + Write-Verbose -Message ($script:localizedData.ExpectedGlobalCatalogEnabled -f + $existingResource.SiteName, $SiteName) + } + else + { + Write-Verbose -Message ($script:localizedData.ExpectedGlobalCatalogDisabled -f + $existingResource.SiteName, $SiteName) + } + + $testTargetResourceReturnValue = $false + } + + if ($PSBoundParameters.ContainsKey('AllowPasswordReplicationAccountName') -and + $null -ne $existingResource.AllowPasswordReplicationAccountName) + { + $testMembersParameters = @{ + ExistingMembers = $existingResource.AllowPasswordReplicationAccountName + Members = $AllowPasswordReplicationAccountName + } + + if (-not (Test-Members @testMembersParameters)) + { + Write-Verbose -Message ( + $script:localizedData.AllowedSyncAccountsMismatch -f + ($existingResource.AllowPasswordReplicationAccountName -join ';'), + ($AllowPasswordReplicationAccountName -join ';') + ) + + $testTargetResourceReturnValue = $false + } + } + + if ($PSBoundParameters.ContainsKey('DenyPasswordReplicationAccountName') -and + $null -ne $existingResource.DenyPasswordReplicationAccountName) + { + $testMembersParameters = @{ + ExistingMembers = $existingResource.DenyPasswordReplicationAccountName + Members = $DenyPasswordReplicationAccountName; + } + + if (-not (Test-Members @testMembersParameters)) + { + Write-Verbose -Message ( + $script:localizedData.DenySyncAccountsMismatch -f + ($existingResource.DenyPasswordReplicationAccountName -join ';'), + ($DenyPasswordReplicationAccountName -join ';') + ) + + $testTargetResourceReturnValue = $false + } + } + + <# + Only evaluate Flexible Single Master Operation (FSMO) roles if the + node is already a domain controller. + #> + if ($PSBoundParameters.ContainsKey('FlexibleSingleMasterOperationRole') -and $existingResource.Ensure -eq $true) + { + $FlexibleSingleMasterOperationRole | ForEach-Object -Process { + if ($_ -notin $existingResource.FlexibleSingleMasterOperationRole) + { + Write-Verbose -Message ($script:localizedData.NotOwnerOfFlexibleSingleMasterOperationRole -f $_ ) + + $testTargetResourceReturnValue = $false + } + } + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Return a hashtable with members that are not present in CurrentMembers, + and members that are present add should not be present. + + .PARAMETER DesiredMembers + Specifies the list of desired members in the hashtable. + + .PARAMETER CurrentMembers + Specifies the list of current members in the hashtable. + + .OUTPUTS + Returns a hashtable with two properties. The property MembersToAdd contains the + members as ADPrincipal objects that are not members in the collection + provided in $CurrentMembers. The property MembersToRemove contains the + unwanted members as ADPrincipal objects in the collection provided + in $CurrentMembers. +#> +function Get-MembersToAddAndRemove +{ + param + ( + [Parameter(Mandatory = $true)] + [AllowNull()] + [AllowEmptyCollection()] + [System.String[]] + $DesiredMembers, + + [Parameter(Mandatory = $true)] + [AllowNull()] + [AllowEmptyCollection()] + [System.String[]] + $CurrentMembers + ) + + $principalsToRemove = foreach ($memberName in $CurrentMembers) + { + if ($memberName -notin $DesiredMembers) + { + New-Object -TypeName Microsoft.ActiveDirectory.Management.ADPrincipal -ArgumentList $memberName + } + } + + $principalsToAdd = foreach ($memberName in $DesiredMembers) + { + if ($memberName -notin $CurrentMembers) + { + New-Object -TypeName Microsoft.ActiveDirectory.Management.ADPrincipal -ArgumentList $memberName + } + } + + return @{ + MembersToAdd = [Microsoft.ActiveDirectory.Management.ADPrincipal[]] $principalsToAdd + MembersToRemove = [Microsoft.ActiveDirectory.Management.ADPrincipal[]] $principalsToRemove + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/MSFT_ADDomainController.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/MSFT_ADDomainController.schema.mof new file mode 100644 index 0000000..e235028 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/MSFT_ADDomainController.schema.mof @@ -0,0 +1,19 @@ +[ClassVersion("1.0.1.0"), FriendlyName("ADDomainController")] +class MSFT_ADDomainController : OMI_BaseResource +{ + [Key, Description("The fully qualified domain name (FQDN) of the domain the Domain Controller will be joining.")] String DomainName; + [Required, Description("The credentials (as a 'PSCredential' object) of a user that has Domain Administrator rights to add the Domain Controller to the domain."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Required, Description("The 'PSCredential' object containing the password to use for Directory Services Restore Mode (DSRM)."), EmbeddedInstance("MSFT_Credential")] String SafemodeAdministratorPassword; + [Write, Description("The path where the database will be stored.")] String DatabasePath; + [Write, Description("The path where the logs will be stored.")] String LogPath; + [Write, Description("The path where the Sysvol will be stored.")] String SysvolPath; + [Write, Description("The name of the site this Domain Controller will be added to.")] String SiteName; + [Write, Description("The path of the media you want to use install the Domain Controller.")] String InstallationMediaPath; + [Write, Description("Specifies if the domain controller will be a Global Catalog (GC).")] Boolean IsGlobalCatalog; + [Read, Description("Returns the state of the Domain Controller.")] String Ensure; + [Write, Description("Indicates that the cmdlet installs the domain controller as an Read-Only Domain Controller (RODC) for an existing domain.")] Boolean ReadOnlyReplica; + [Write, Description("Specifies an array of names of user accounts, group accounts, and computer accounts whose passwords can be replicated to this Read-Only Domain Controller (RODC).")] String AllowPasswordReplicationAccountName[]; + [Write, Description("Specifies the names of user accounts, group accounts, and computer accounts whose passwords are not to be replicated to this Read-Only Domain Controller (RODC).")] String DenyPasswordReplicationAccountName[]; + [Write, Description("Specifies one or more Flexible Single Master Operation (FSMO) roles to move to this domain controller. The current owner must be online and responding for the move to be allowed."), ValueMap{"DomainNamingMaster", "SchemaMaster", "InfrastructureMaster", "PDCEmulator", "RIDMaster"}, Values{"DomainNamingMaster", "SchemaMaster", "InfrastructureMaster", "PDCEmulator", "RIDMaster"}] String FlexibleSingleMasterOperationRole[]; + [Write, Description("Specifies if the DNS Server service should be installed and configured on the Domain Controller. If this is not set the default value of the parameter `InstallDns` of the cmdlet Install-ADDSDomainController is used. This parameter is only used during the provisioning of a domain controller. The parameter cannot be used to install or uninstall the DNS server on an already provisioned domain controller.")] Boolean InstallDns; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/README.md new file mode 100644 index 0000000..e82abc5 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/README.md @@ -0,0 +1,35 @@ +# Description + +The ADDomainController DSC resource will install and configure domain +controllers in Active Directory. Installation of Read-Only Domain Controllers +(RODC) is also supported. + +Promotion of a Domain Controller using an existing DNS is available using +the `InstallDns` parameter. The parameter specifies if the DNS Server service +should be installed and configured on the domain controller. If this is +not set the default value of the parameter `InstallDns` of the cmdlet +[`Install-ADDSDomainController`](https://docs.microsoft.com/en-us/powershell/module/addsdeployment/install-addsdomaincontroller) +is used. The parameter `InstallDns` is only used during the provisioning +of a domain controller. The parameter cannot be used to install or uninstall +the DNS server on an already provisioned domain controller. + +>**Note:** If the account used for the parameter `Credential` +>cannot connect to another domain controller, for example using a credential +>without the domain name, then the cmdlet `Install-ADDSDomainController` will +>seemingly halt (without reporting an error) when trying to replicate +>information from another domain controller. +>Make sure to use a correct domain account with the correct permission as +>the account for the parameter `Credential`. + +The parameter `FlexibleSingleMasterOperationRole` is ignored until +the node has been provisioned as a domain controller. Take extra care +to make sure the Flexible Single Master Operation (FSMO) roles are moved +accordingly to avoid that two domain controller try to get to be the +owner of the same role (potential "ping-pong"-behavior). + +>The resource does not support seizing of Flexible Single Master Operation +>(FSMO) roles + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/en-US/MSFT_ADDomainController.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/en-US/MSFT_ADDomainController.strings.psd1 new file mode 100644 index 0000000..278c5b5 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/en-US/MSFT_ADDomainController.strings.psd1 @@ -0,0 +1,23 @@ +ConvertFrom-StringData @' + ResolveDomainName = Resolving the domain name '{0}'. (ADDC0001) + DomainPresent = The domain '{0}' is present. Looking for domain controllers. (ADDC0002) + NotDomainController = The current node '{0}' is not a domain controller. (ADDC0006) + IsDomainController = The current node '{0}' is a domain controller for the domain '{1}'. (ADDC0007) + MissingDomain = Current node could not find the domain '{0}'. (ADDC0008) + Promoting = Promoting the current node to be a domain controller for the domain '{1}'. (ADDC0009) + Promoted = The current node '{0}' has been promoted to a domain controller for the domain '{1}'. (ADDC0010) + AddGlobalCatalog = Adding Global Catalog to the domain controller. (ADDC0011) + RemoveGlobalCatalog = Removing Global Catalog from the domain controller. (ADDC0012) + MovingDomainController = Moving Domain Controller from site '{0}' to site '{1}'. (ADDC0013) + FailedToFindSite = The site '{0}' could not be found in the domain '{1}'. (ADDC0014) + TestingConfiguration = Determine the state of the domain controller on the current node '{0}' in the domain '{1}'. (ADDC0015) + WrongSite = The domain controller is in the site '{0}', but expected it to be in the site '{1}'. (ADDC0016) + ExpectedGlobalCatalogEnabled = The domain controller does not contain a Global Catalog, but it was expected to have a Global Catalog. (ADDC0018) + ExpectedGlobalCatalogDisabled = The domain controller have a Global Catalog, but it was expected to not have a Global Catalog. (ADDC0019) + AllowedSyncAccountsMismatch = There is a mismatch in AllowPasswordReplicationAccountName list. Got {0}, expected was {1}. (ADDC0020) + DenySyncAccountsMismatch = There is a mismatch in DenyPasswordReplicationAccountName list. Got {0}, expected was {1}. (ADDC0021) + RODCMissingSite = You have specified 'ReadOnlyReplica', but did not provide a site name. (ADDC0022) + CannotConvertToRODC = Cannot convert a existing domain controller to a Read-Only Domain Controller (RODC). (ADDC0023) + NotOwnerOfFlexibleSingleMasterOperationRole = The domain controller was expected to be the owner of the Flexible Single Master Operation (FSMO) role '{0}', but it is not. (ADDC0024) + MovingFlexibleSingleMasterOperationRole = The Flexible Single Master Operation (FSMO) role '{0}' is being moved from domain controller '{1}' to this domain controller. (ADDC0025) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/en-US/about_ADDomainController.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/en-US/about_ADDomainController.help.txt new file mode 100644 index 0000000..cea22f9 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainController/en-US/about_ADDomainController.help.txt @@ -0,0 +1,457 @@ +.NAME + ADDomainController + +.DESCRIPTION + The ADDomainController DSC resource will install and configure domain + controllers in Active Directory. Installation of Read-Only Domain Controllers + (RODC) is also supported. + + Promotion of a Domain Controller using an existing DNS is available using + the `InstallDns` parameter. The parameter specifies if the DNS Server service + should be installed and configured on the domain controller. If this is + not set the default value of the parameter `InstallDns` of the cmdlet + [`Install-ADDSDomainController`](https://docs.microsoft.com/en-us/powershell/module/addsdeployment/install-addsdomaincontroller) + is used. The parameter `InstallDns` is only used during the provisioning + of a domain controller. The parameter cannot be used to install or uninstall + the DNS server on an already provisioned domain controller. + + >**Note:** If the account used for the parameter `Credential` + >cannot connect to another domain controller, for example using a credential + >without the domain name, then the cmdlet `Install-ADDSDomainController` will + >seemingly halt (without reporting an error) when trying to replicate + >information from another domain controller. + >Make sure to use a correct domain account with the correct permission as + >the account for the parameter `Credential`. + + The parameter `FlexibleSingleMasterOperationRole` is ignored until + the node has been provisioned as a domain controller. Take extra care + to make sure the Flexible Single Master Operation (FSMO) roles are moved + accordingly to avoid that two domain controller try to get to be the + owner of the same role (potential "ping-pong"-behavior). + + >The resource does not support seizing of Flexible Single Master Operation + >(FSMO) roles + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER DomainName + Key - String + The fully qualified domain name (FQDN) of the domain the Domain Controller will be joining. + +.PARAMETER Credential + Required - PSCredential + The credentials (as a 'PSCredential' object) of a user that has Domain Administrator rights to add the Domain Controller to the domain. + +.PARAMETER SafemodeAdministratorPassword + Required - PSCredential + The 'PSCredential' object containing the password to use for Directory Services Restore Mode (DSRM). + +.PARAMETER DatabasePath + Write - String + The path where the database will be stored. + +.PARAMETER LogPath + Write - String + The path where the logs will be stored. + +.PARAMETER SysvolPath + Write - String + The path where the Sysvol will be stored. + +.PARAMETER SiteName + Write - String + The name of the site this Domain Controller will be added to. + +.PARAMETER InstallationMediaPath + Write - String + The path of the media you want to use install the Domain Controller. + +.PARAMETER IsGlobalCatalog + Write - Boolean + Specifies if the domain controller will be a Global Catalog (GC). + +.PARAMETER Ensure + Read - String + Returns the state of the Domain Controller. + +.PARAMETER ReadOnlyReplica + Write - Boolean + Indicates that the cmdlet installs the domain controller as an Read-Only Domain Controller (RODC) for an existing domain. + +.PARAMETER AllowPasswordReplicationAccountName + Write - StringArray + Specifies an array of names of user accounts, group accounts, and computer accounts whose passwords can be replicated to this Read-Only Domain Controller (RODC). + +.PARAMETER DenyPasswordReplicationAccountName + Write - StringArray + Specifies the names of user accounts, group accounts, and computer accounts whose passwords are not to be replicated to this Read-Only Domain Controller (RODC). + +.PARAMETER FlexibleSingleMasterOperationRole + Write - StringArray + Allowed values: DomainNamingMaster, SchemaMaster, InfrastructureMaster, PDCEmulator, RIDMaster + Specifies one or more Flexible Single Master Operation (FSMO) roles to move to this domain controller. The current owner must be online and responding for the move to be allowed. + +.PARAMETER InstallDns + Write - Boolean + Specifies if the DNS Server service should be installed and configured on the Domain Controller. If this is not set the default value of the parameter `InstallDns` of the cmdlet Install-ADDSDomainController is used. This parameter is only used during the provisioning of a domain controller. The parameter cannot be used to install or uninstall the DNS server on an already provisioned domain controller. + +.EXAMPLE 1 + +This configuration will add a domain controller to the domain +contoso.com. + +Configuration ADDomainController_AddDomainControllerToDomainMinimal_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $SafeModePassword + ) + + Import-DscResource -ModuleName PSDesiredStateConfiguration + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + WindowsFeature 'InstallADDomainServicesFeature' + { + Ensure = 'Present' + Name = 'AD-Domain-Services' + } + + WindowsFeature 'RSATADPowerShell' + { + Ensure = 'Present' + Name = 'RSAT-AD-PowerShell' + + DependsOn = '[WindowsFeature]InstallADDomainServicesFeature' + } + + WaitForADDomain 'WaitForestAvailability' + { + DomainName = 'contoso.com' + Credential = $Credential + + DependsOn = '[WindowsFeature]RSATADPowerShell' + } + + ADDomainController 'DomainControllerMinimal' + { + DomainName = 'contoso.com' + Credential = $Credential + SafeModeAdministratorPassword = $SafeModePassword + + DependsOn = '[WaitForADDomain]WaitForestAvailability' + } + } +} + +.EXAMPLE 2 + +This configuration will add a domain controller to the domain +contoso.com, specifying all properties of the resource. + +Configuration ADDomainController_AddDomainControllerToDomainAllProperties_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $SafeModePassword + ) + + Import-DscResource -ModuleName PSDesiredStateConfiguration + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + WindowsFeature 'InstallADDomainServicesFeature' + { + Ensure = 'Present' + Name = 'AD-Domain-Services' + } + + WindowsFeature 'RSATADPowerShell' + { + Ensure = 'Present' + Name = 'RSAT-AD-PowerShell' + + DependsOn = '[WindowsFeature]InstallADDomainServicesFeature' + } + + WaitForADDomain 'WaitForestAvailability' + { + DomainName = 'contoso.com' + Credential = $Credential + + DependsOn = '[WindowsFeature]RSATADPowerShell' + } + + ADDomainController 'DomainControllerAllProperties' + { + DomainName = 'contoso.com' + Credential = $Credential + SafeModeAdministratorPassword = $SafeModePassword + DatabasePath = 'C:\Windows\NTDS' + LogPath = 'C:\Windows\Logs' + SysvolPath = 'C:\Windows\SYSVOL' + SiteName = 'Europe' + IsGlobalCatalog = $true + + DependsOn = '[WaitForADDomain]WaitForestAvailability' + } + } +} + +.EXAMPLE 3 + +This configuration will add a domain controller to the domain +contoso.com using the information from media. + +Configuration ADDomainController_AddDomainControllerToDomainUsingIFM_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $SafeModePassword + ) + + Import-DscResource -ModuleName PSDesiredStateConfiguration + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + WindowsFeature 'InstallADDomainServicesFeature' + { + Ensure = 'Present' + Name = 'AD-Domain-Services' + } + + WindowsFeature 'RSATADPowerShell' + { + Ensure = 'Present' + Name = 'RSAT-AD-PowerShell' + + DependsOn = '[WindowsFeature]InstallADDomainServicesFeature' + } + + WaitForADDomain 'WaitForestAvailability' + { + DomainName = 'contoso.com' + Credential = $Credential + + DependsOn = '[WindowsFeature]RSATADPowerShell' + } + + ADDomainController 'DomainControllerWithIFM' + { + DomainName = 'contoso.com' + Credential = $Credential + SafeModeAdministratorPassword = $SafeModePassword + InstallationMediaPath = 'F:\IFM' + + DependsOn = '[WaitForADDomain]WaitForestAvailability' + } + } +} + +.EXAMPLE 4 + +This configuration will add a read-only domain controller to the domain contoso.com +and specify a list of account, whose passwords are allowed/denied for synchronisation. + +Configuration ADDomainController_AddReadOnlyDomainController_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $SafeModePassword + ) + + Import-DscResource -ModuleName PSDesiredStateConfiguration + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + WindowsFeature 'InstallADDomainServicesFeature' + { + Ensure = 'Present' + Name = 'AD-Domain-Services' + } + + WindowsFeature 'RSATADPowerShell' + { + Ensure = 'Present' + Name = 'RSAT-AD-PowerShell' + + DependsOn = '[WindowsFeature]InstallADDomainServicesFeature' + } + + WaitForADDomain 'WaitForestAvailability' + { + DomainName = 'contoso.com' + Credential = $Credential + + DependsOn = '[WindowsFeature]RSATADPowerShell' + } + + ADDomainController 'Read-OnlyDomainController(RODC)' + { + DomainName = 'contoso.com' + Credential = $Credential + SafeModeAdministratorPassword = $SafeModePassword + ReadOnlyReplica = $true + SiteName = 'Default-First-Site-Name' + AllowPasswordReplicationAccountName = @('pvdi.test1', 'pvdi.test') + DenyPasswordReplicationAccountName = @('SVC_PVS', 'TA2SCVMM') + + DependsOn = '[WaitForADDomain]WaitForestAvailability' + } + } +} + +.EXAMPLE 5 + +This configuration will add a domain controller to the domain +contoso.com, and when the configuration is enforced it will +move the Flexible Single Master Operation (FSMO) role +'RIDMaster' from the current owner to this domain controller. + +Configuration ADDomainController_AddDomainControllerAndMoveRole_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $SafeModePassword + ) + + Import-DscResource -ModuleName PSDesiredStateConfiguration + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + WindowsFeature 'InstallADDomainServicesFeature' + { + Ensure = 'Present' + Name = 'AD-Domain-Services' + } + + WindowsFeature 'RSATADPowerShell' + { + Ensure = 'Present' + Name = 'RSAT-AD-PowerShell' + + DependsOn = '[WindowsFeature]InstallADDomainServicesFeature' + } + + WaitForADDomain 'WaitForestAvailability' + { + DomainName = 'contoso.com' + Credential = $Credential + + DependsOn = '[WindowsFeature]RSATADPowerShell' + } + + ADDomainController 'DomainControllerMinimal' + { + DomainName = 'contoso.com' + Credential = $Credential + SafeModeAdministratorPassword = $SafeModePassword + FlexibleSingleMasterOperationRole = @('RIDMaster') + + DependsOn = '[WaitForADDomain]WaitForestAvailability' + } + } +} + +.EXAMPLE 6 + +This configuration will add a domain controller to the domain contoso.com +without installing the local DNS server service and using the one in the existing domain. + +Configuration ADDomainController_AddDomainControllerUsingInstallDns_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName PSDesiredStateConfiguration + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + WindowsFeature 'InstallADDomainServicesFeature' + { + Ensure = 'Present' + Name = 'AD-Domain-Services' + } + + WindowsFeature 'RSATADPowerShell' + { + Ensure = 'Present' + Name = 'RSAT-AD-PowerShell' + + DependsOn = '[WindowsFeature]InstallADDomainServicesFeature' + } + + WaitForADDomain 'WaitForestAvailability' + { + DomainName = 'contoso.com' + Credential = $Credential + + DependsOn = '[WindowsFeature]RSATADPowerShell' + } + + ADDomainController 'DomainControllerUsingExistingDNSServer' + { + DomainName = 'contoso.com' + Credential = $Credential + SafeModeAdministratorPassword = $Credential + InstallDns = $false + + DependsOn = '[WaitForADDomain]WaitForestAvailability' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/MSFT_ADDomainControllerProperties.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/MSFT_ADDomainControllerProperties.psm1 new file mode 100644 index 0000000..12f984a --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/MSFT_ADDomainControllerProperties.psm1 @@ -0,0 +1,197 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADDomainControllerProperties' + +<# + .SYNOPSIS + Returns the current state of the properties of the domain controller. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance + ) + + Write-Verbose -Message ( + $script:localizedData.RetrievingProperties -f $env:COMPUTERNAME + ) + + $getTargetResourceReturnValue = @{ + IsSingleInstance = $IsSingleInstance + ContentFreshness = 0 + } + + $getCimInstanceParameters = @{ + Namespace = 'ROOT/MicrosoftDfs' + Query = 'select MaxOfflineTimeInDays from DfsrMachineConfig' + } + + $getTargetResourceReturnValue['ContentFreshness'] = (Get-CimInstance @getCimInstanceParameters).MaxOfflineTimeInDays + + return $getTargetResourceReturnValue +} + +<# + .SYNOPSIS + Determines if the properties are in the desired state. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER ContentFreshness + Specifies the Distributed File System Replication (DFSR) server threshold + after the number of days its content is considered stale (MaxOfflineTimeInDays) + Once the content is considered stale, the Distributed File System Replication + (DFSR) server will no longer be able to replicate. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.UInt32] + $ContentFreshness + ) + + Write-Verbose -Message ( + $script:localizedData.TestConfiguration -f $env:COMPUTERNAME + ) + + $compareTargetResourceStateResult = Compare-TargetResourceState @PSBoundParameters + + if ($false -in $compareTargetResourceStateResult.InDesiredState) + { + Write-Verbose -Message $script:localizedData.DomainControllerNotInDesiredState + + $testTargetResourceReturnValue = $false + } + else + { + Write-Verbose -Message $script:localizedData.DomainControllerInDesiredState + + $testTargetResourceReturnValue = $true + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Sets the properties on the Active Directory domain controller. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER ContentFreshness + Specifies the Distributed File System Replication (DFSR) server threshold + after the number of days its content is considered stale (MaxOfflineTimeInDays) + Once the content is considered stale, the Distributed File System Replication + (DFSR) server will no longer be able to replicate. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.UInt32] + $ContentFreshness + ) + + $compareTargetResourceStateResult = Compare-TargetResourceState @PSBoundParameters + + # Get all properties that are not in desired state. + $propertiesNotInDesiredState = $compareTargetResourceStateResult | Where-Object -FilterScript { + -not $_.InDesiredState + } + + if ($propertiesNotInDesiredState.Where( { $_.ParameterName -eq 'ContentFreshness' })) + { + Write-Verbose -Message ( + $script:localizedData.ContentFreshnessUpdated -f $ContentFreshness + ) + + $setCimInstanceParameters = @{ + Namespace = 'ROOT/MicrosoftDfs' + Query = 'select MaxOfflineTimeInDays from DfsrMachineConfig' + Property = @{ + MaxOfflineTimeInDays = $ContentFreshness + } + + } + + $null = Set-CimInstance @setCimInstanceParameters + } +} + +<# + .SYNOPSIS + Compares the properties in the current state with the properties of the + desired state and returns a hashtable with the comparison result. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER ContentFreshness + Specifies the Distributed File System Replication (DFSR) server threshold + after the number of days its content is considered stale (MaxOfflineTimeInDays) + Once the content is considered stale, the Distributed File System Replication + (DFSR) server will no longer be able to replicate. +#> +function Compare-TargetResourceState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.UInt32] + $ContentFreshness + ) + + $getTargetResourceParameters = @{ + IsSingleInstance = $IsSingleInstance + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + $compareTargetResourceStateParameters = @{ + CurrentValues = $getTargetResourceResult + DesiredValues = $PSBoundParameters + Properties = @('ContentFreshness') + } + + return Compare-ResourcePropertyState @compareTargetResourceStateParameters +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/MSFT_ADDomainControllerProperties.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/MSFT_ADDomainControllerProperties.schema.mof new file mode 100644 index 0000000..b358aa4 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/MSFT_ADDomainControllerProperties.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADDomainControllerProperties")] +class MSFT_ADDomainControllerProperties : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Specifies the Distributed File System Replication (DFSR) server threshold after the number of days its content is considered stale (MaxOfflineTimeInDays). Once the content is considered stale, the Distributed File System Replication (DFSR) server will no longer be able to replicate.")] UInt32 ContentFreshness; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/README.md new file mode 100644 index 0000000..8c24edc --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/README.md @@ -0,0 +1,8 @@ +# Description + +This resource enforces the single instance properties of a domain controller. +*Properties that must always have a value, but the value can be changed.* + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/en-US/MSFT_ADDomainControllerProperties.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/en-US/MSFT_ADDomainControllerProperties.strings.psd1 new file mode 100644 index 0000000..5a4971d --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/en-US/MSFT_ADDomainControllerProperties.strings.psd1 @@ -0,0 +1,8 @@ +# culture="en-US" +ConvertFrom-StringData @' + RetrievingProperties = Retrieving the properties for the domain controller '{0}'. (ADDCP0001) + TestConfiguration = Determining the current state of the properties on the domain controller '{0}'. (ADDCP0002) + DomainControllerInDesiredState = The domain controller is in the desired state. (ADDCP0003) + DomainControllerNotInDesiredState = The domain controller is not in the desired state. (ADDCP0004) + ContentFreshnessUpdated = The content freshness property (MaxOfflineTimeInDays) will be updated to {0} days. (ADDCP0005) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/en-US/about_ADDomainControllerProperties.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/en-US/about_ADDomainControllerProperties.help.txt new file mode 100644 index 0000000..3b6ecf3 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainControllerProperties/en-US/about_ADDomainControllerProperties.help.txt @@ -0,0 +1,39 @@ +.NAME + ADDomainControllerProperties + +.DESCRIPTION + This resource enforces the single instance properties of a domain controller. + *Properties that must always have a value, but the value can be changed.* + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER IsSingleInstance + Key - String + Allowed values: Yes + Specifies the resource is a single instance, the value must be 'Yes'. + +.PARAMETER ContentFreshness + Write - UInt32 + Specifies the Distributed File System Replication (DFSR) server threshold after the number of days its content is considered stale (MaxOfflineTimeInDays). Once the content is considered stale, the Distributed File System Replication (DFSR) server will no longer be able to replicate. + +.EXAMPLE 1 + +This configuration will set the content freshness to 100 days. + +Configuration ADDomainControllerProperties_SetContentFreshness_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADDomainControllerProperties 'ContentFreshness' + { + IsSingleInstance = 'Yes' + ContentFreshness = 100 + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/MSFT_ADDomainDefaultPasswordPolicy.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/MSFT_ADDomainDefaultPasswordPolicy.psm1 new file mode 100644 index 0000000..7ed0a90 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/MSFT_ADDomainDefaultPasswordPolicy.psm1 @@ -0,0 +1,374 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADDomainDefaultPasswordPolicy' + +# List of changeable policy properties +$mutablePropertyMap = @( + @{ + Name = 'ComplexityEnabled' + } + @{ + Name = 'LockoutDuration' + IsTimeSpan = $true + } + @{ + Name = 'LockoutObservationWindow' + IsTimeSpan = $true + } + @{ + Name = 'LockoutThreshold' + } + @{ + Name = 'MinPasswordAge' + IsTimeSpan = $true + } + @{ + Name = 'MaxPasswordAge' + IsTimeSpan = $true + } + @{ + Name = 'MinPasswordLength' + } + @{ + Name = 'PasswordHistoryCount' + } + @{ + Name = 'ReversibleEncryptionEnabled' + } +) + +<# + .SYNOPSIS + Returns the current state of the Active Directory default domain password + policy. + + .PARAMETER DomainName + Name of the domain to which the password policy will be applied. + + .PARAMETER DomainController + Active Directory domain controller to enact the change upon. + + .PARAMETER Credential + Credentials used to access the domain. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + $PSBoundParameters['Identity'] = $DomainName + + $getADDefaultDomainPasswordPolicyParams = Get-ADCommonParameters @PSBoundParameters + + Write-Verbose -Message ($script:localizedData.QueryingDomainPasswordPolicy -f $DomainName) + + $policy = Get-ADDefaultDomainPasswordPolicy @getADDefaultDomainPasswordPolicyParams + + return @{ + DomainName = $DomainName + ComplexityEnabled = $policy.ComplexityEnabled + LockoutDuration = ConvertFrom-Timespan -Timespan $policy.LockoutDuration -TimeSpanType Minutes + LockoutObservationWindow = ConvertFrom-Timespan -Timespan $policy.LockoutObservationWindow -TimeSpanType Minutes + LockoutThreshold = $policy.LockoutThreshold + MinPasswordAge = ConvertFrom-Timespan -Timespan $policy.MinPasswordAge -TimeSpanType Minutes + MaxPasswordAge = ConvertFrom-Timespan -Timespan $policy.MaxPasswordAge -TimeSpanType Minutes + MinPasswordLength = $policy.MinPasswordLength + PasswordHistoryCount = $policy.PasswordHistoryCount + ReversibleEncryptionEnabled = $policy.ReversibleEncryptionEnabled + } +} #end Get-TargetResource + +<# + .SYNOPSIS + Determines if the Active Directory default domain password policy is in + the desired state + + .PARAMETER DomainName + Name of the domain to which the password policy will be applied. + + .PARAMETER ComplexityEnabled + Whether password complexity is enabled for the default password policy. + + .PARAMETER LockoutDuration + Length of time that an account is locked after the number of failed login attempts (minutes). + + .PARAMETER LockoutObservationWindow + Maximum time between two unsuccessful login attempts before the counter is reset to 0 (minutes). + + .PARAMETER LockoutThreshold + Number of unsuccessful login attempts that are permitted before an account is locked out. + + .PARAMETER MinPasswordAge + Minimum length of time that you can have the same password (minutes). + + .PARAMETER MaxPasswordAge + Maximum length of time that you can have the same password (minutes). + + .PARAMETER MinPasswordLength + Minimum number of characters that a password must contain. + + .PARAMETER PasswordHistoryCount + Number of previous passwords to remember. + + .PARAMETER ReversibleEncryptionEnabled + Whether the directory must store passwords using reversible encryption. + + .PARAMETER DomainController + Active Directory domain controller to enact the change upon. + + .PARAMETER Credential + Credentials used to access the domain. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.Boolean] + $ComplexityEnabled, + + [Parameter()] + [System.UInt32] + $LockoutDuration, + + [Parameter()] + [System.UInt32] + $LockoutObservationWindow, + + [Parameter()] + [System.UInt32] + $LockoutThreshold, + + [Parameter()] + [System.UInt32] + $MinPasswordAge, + + [Parameter()] + [System.UInt32] + $MaxPasswordAge, + + [Parameter()] + [System.UInt32] + $MinPasswordLength, + + [Parameter()] + [System.UInt32] + $PasswordHistoryCount, + + [Parameter()] + [System.Boolean] + $ReversibleEncryptionEnabled, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + $getTargetResourceParams = @{ + DomainName = $DomainName + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getTargetResourceParams['Credential'] = $Credential + } + + if ($PSBoundParameters.ContainsKey('DomainController')) + { + $getTargetResourceParams['DomainController'] = $DomainController + } + + $targetResource = Get-TargetResource @getTargetResourceParams + + $inDesiredState = $true + foreach ($property in $mutablePropertyMap) + { + $propertyName = $property.Name + + if ($PSBoundParameters.ContainsKey($propertyName)) + { + $expectedValue = $PSBoundParameters[$propertyName] + $actualValue = $targetResource[$propertyName] + + if ($expectedValue -ne $actualValue) + { + $valueIncorrectMessage = $script:localizedData.ResourcePropertyValueIncorrect -f $propertyName, $expectedValue, $actualValue + Write-Verbose -Message $valueIncorrectMessage + $inDesiredState = $false + } + } + } + + if ($inDesiredState) + { + Write-Verbose -Message ($script:localizedData.ResourceInDesiredState -f $DomainName) + return $true + } + else + { + Write-Verbose -Message ($script:localizedData.ResourceNotInDesiredState -f $DomainName) + return $false + } +} #end Test-TargetResource + +<# + .SYNOPSIS + Modifies the Active Directory default domain password policy. + + .PARAMETER DomainName + Name of the domain to which the password policy will be applied. + + .PARAMETER ComplexityEnabled + Whether password complexity is enabled for the default password policy. + + .PARAMETER LockoutDuration + Length of time that an account is locked after the number of failed login attempts (minutes). + + .PARAMETER LockoutObservationWindow + Maximum time between two unsuccessful login attempts before the counter is reset to 0 (minutes). + + .PARAMETER LockoutThreshold + Number of unsuccessful login attempts that are permitted before an account is locked out. + + .PARAMETER MinPasswordAge + Minimum length of time that you can have the same password (minutes). + + .PARAMETER MaxPasswordAge + Maximum length of time that you can have the same password (minutes). + + .PARAMETER MinPasswordLength + Minimum number of characters that a password must contain. + + .PARAMETER PasswordHistoryCount + Number of previous passwords to remember. + + .PARAMETER ReversibleEncryptionEnabled + Whether the directory must store passwords using reversible encryption. + + .PARAMETER DomainController + Active Directory domain controller to enact the change upon. + + .PARAMETER Credential + Credentials used to access the domain. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.Boolean] + $ComplexityEnabled, + + [Parameter()] + [System.UInt32] + $LockoutDuration, + + [Parameter()] + [System.UInt32] + $LockoutObservationWindow, + + [Parameter()] + [System.UInt32] + $LockoutThreshold, + + [Parameter()] + [System.UInt32] + $MinPasswordAge, + + [Parameter()] + [System.UInt32] + $MaxPasswordAge, + + [Parameter()] + [System.UInt32] + $MinPasswordLength, + + [Parameter()] + [System.UInt32] + $PasswordHistoryCount, + + [Parameter()] + [System.Boolean] + $ReversibleEncryptionEnabled, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + $PSBoundParameters['Identity'] = $DomainName + + $setADDefaultDomainPasswordPolicyParams = Get-ADCommonParameters @PSBoundParameters + + foreach ($property in $mutablePropertyMap) + { + $propertyName = $property.Name + + if ($PSBoundParameters.ContainsKey($propertyName)) + { + $propertyValue = $PSBoundParameters[$propertyName] + + if ($property.IsTimeSpan -eq $true) + { + $propertyValue = ConvertTo-TimeSpan -TimeSpan $propertyValue -TimeSpanType Minutes + } + + $setADDefaultDomainPasswordPolicyParams[$propertyName] = $propertyValue + + Write-Verbose -Message ($script:localizedData.SettingPasswordPolicyValue -f $propertyName, $propertyValue) + } + } + + Write-Verbose -Message ($script:localizedData.UpdatingDomainPasswordPolicy -f $DomainName) + + [ref] $null = Set-ADDefaultDomainPasswordPolicy @setADDefaultDomainPasswordPolicyParams +} #end Set-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/MSFT_ADDomainDefaultPasswordPolicy.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/MSFT_ADDomainDefaultPasswordPolicy.schema.mof new file mode 100644 index 0000000..d34e317 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/MSFT_ADDomainDefaultPasswordPolicy.schema.mof @@ -0,0 +1,17 @@ +[ClassVersion("1.0.0"), FriendlyName("ADDomainDefaultPasswordPolicy")] +class MSFT_ADDomainDefaultPasswordPolicy : OMI_BaseResource +{ + [Key, Description("Name of the domain to which the password policy will be applied.")] String DomainName; + [Write, Description("Whether password complexity is enabled for the default password policy.")] Boolean ComplexityEnabled; + [Write, Description("Length of time that an account is locked after the number of failed login attempts (minutes).")] UInt32 LockoutDuration; + [Write, Description("Maximum time between two unsuccessful login attempts before the counter is reset to 0 (minutes).")] UInt32 LockoutObservationWindow; + [Write, Description("Number of unsuccessful login attempts that are permitted before an account is locked out.")] UInt32 LockoutThreshold; + [Write, Description("Minimum length of time that you can have the same password (minutes).")] UInt32 MinPasswordAge; + [Write, Description("Maximum length of time that you can have the same password (minutes).")] UInt32 MaxPasswordAge; + [Write, Description("Minimum number of characters that a password must contain.")] UInt32 MinPasswordLength; + [Write, Description("Number of previous passwords to remember.")] UInt32 PasswordHistoryCount; + [Write, Description("Whether the directory must store passwords using reversible encryption.")] Boolean ReversibleEncryptionEnabled; + [Write, Description("Active Directory domain controller to enact the change upon.")] String DomainController; + [Write, Description("Credentials used to access the domain."), EmbeddedInstance("MSFT_Credential")] String Credential; +}; + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/README.md new file mode 100644 index 0000000..117554b --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/README.md @@ -0,0 +1,7 @@ +# Description + +The ADDomainDefaultPasswordPolicy DSC resource will manage an Active Directory domain's default password policy. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/en-US/MSFT_ADDomainDefaultPasswordPolicy.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/en-US/MSFT_ADDomainDefaultPasswordPolicy.strings.psd1 new file mode 100644 index 0000000..ee44acc --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/en-US/MSFT_ADDomainDefaultPasswordPolicy.strings.psd1 @@ -0,0 +1,9 @@ +# culture="en-US" +ConvertFrom-StringData @' + QueryingDomainPasswordPolicy = Querying Active Directory domain '{0}' default password policy. (ADDDPP0001) + UpdatingDomainPasswordPolicy = Updating Active Directory domain '{0}' default password policy. (ADDDPP0002) + SettingPasswordPolicyValue = Setting password policy '{0}' property to '{1}'. (ADDDPP0003) + ResourcePropertyValueIncorrect = Property '{0}' value is incorrect; expected '{1}', actual '{2}'. (ADDDPP0004) + ResourceInDesiredState = Resource '{0}' is in the desired state. (ADDDPP0005) + ResourceNotInDesiredState = Resource '{0}' is NOT in the desired state. (ADDDPP0006) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/en-US/about_ADDomainDefaultPasswordPolicy.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/en-US/about_ADDomainDefaultPasswordPolicy.help.txt new file mode 100644 index 0000000..9e7f687 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainDefaultPasswordPolicy/en-US/about_ADDomainDefaultPasswordPolicy.help.txt @@ -0,0 +1,94 @@ +.NAME + ADDomainDefaultPasswordPolicy + +.DESCRIPTION + The ADDomainDefaultPasswordPolicy DSC resource will manage an Active Directory domain's default password policy. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER DomainName + Key - String + Name of the domain to which the password policy will be applied. + +.PARAMETER ComplexityEnabled + Write - Boolean + Whether password complexity is enabled for the default password policy. + +.PARAMETER LockoutDuration + Write - UInt32 + Length of time that an account is locked after the number of failed login attempts (minutes). + +.PARAMETER LockoutObservationWindow + Write - UInt32 + Maximum time between two unsuccessful login attempts before the counter is reset to 0 (minutes). + +.PARAMETER LockoutThreshold + Write - UInt32 + Number of unsuccessful login attempts that are permitted before an account is locked out. + +.PARAMETER MinPasswordAge + Write - UInt32 + Minimum length of time that you can have the same password (minutes). + +.PARAMETER MaxPasswordAge + Write - UInt32 + Maximum length of time that you can have the same password (minutes). + +.PARAMETER MinPasswordLength + Write - UInt32 + Minimum number of characters that a password must contain. + +.PARAMETER PasswordHistoryCount + Write - UInt32 + Number of previous passwords to remember. + +.PARAMETER ReversibleEncryptionEnabled + Write - Boolean + Whether the directory must store passwords using reversible encryption. + +.PARAMETER DomainController + Write - String + Active Directory domain controller to enact the change upon. + +.PARAMETER Credential + Write - PSCredential + Credentials used to access the domain. + +.EXAMPLE 1 + +This configuration will set an Active Directory domain's default password +policy to set the minimum password length and complexity. + +Configuration ADDomainDefaultPasswordPolicy_ConfigureDefaultPasswordPolicy_Config +{ + Param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $ComplexityEnabled, + + [Parameter(Mandatory = $true)] + [System.Int32] + $MinPasswordLength + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADDomainDefaultPasswordPolicy 'DefaultPasswordPolicy' + { + DomainName = $DomainName + ComplexityEnabled = $ComplexityEnabled + MinPasswordLength = $MinPasswordLength + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/MSFT_ADDomainFunctionalLevel.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/MSFT_ADDomainFunctionalLevel.psm1 new file mode 100644 index 0000000..b71b04f --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/MSFT_ADDomainFunctionalLevel.psm1 @@ -0,0 +1,194 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADDomainFunctionalLevel' + +<# + .SYNOPSIS + Returns the current functional level of the domain. + + .PARAMETER DomainIdentity + Specifies the Active Directory domain to modify. You can identify a + domain by its distinguished name, GUID, security identifier, DNS domain + name, or NetBIOS domain name. + + .PARAMETER DomainMode + Specifies the functional level for the Active Directory domain. + + Not used in Get-TargetResource. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainIdentity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Windows2008R2Domain', 'Windows2012Domain', 'Windows2012R2Domain', 'Windows2016Domain')] + [System.String] + $DomainMode + ) + + Write-Verbose -Message ( + $script:localizedData.RetrievingDomainMode -f $DomainIdentity + ) + + $getTargetResourceReturnValue = @{ + DomainIdentity = $DomainIdentity + DomainMode = $null + } + + $domainObject = Get-ADDomain -Identity $DomainIdentity -ErrorAction 'Stop' + + $getTargetResourceReturnValue['DomainMode'] = $domainObject.DomainMode + + return $getTargetResourceReturnValue +} + +<# + .SYNOPSIS + Determines if the functional level is in the desired state. + + .PARAMETER DomainIdentity + Specifies the Active Directory domain to modify. You can identify a + domain by its distinguished name, GUID, security identifier, DNS domain + name, or NetBIOS domain name. + + .PARAMETER DomainMode + Specifies the functional level for the Active Directory domain. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainIdentity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Windows2008R2Domain', 'Windows2012Domain', 'Windows2012R2Domain', 'Windows2016Domain')] + [System.String] + $DomainMode + ) + + Write-Verbose -Message ( + $script:localizedData.TestConfiguration -f $DomainIdentity + ) + + $compareTargetResourceStateResult = Compare-TargetResourceState @PSBoundParameters + + if ($false -in $compareTargetResourceStateResult.InDesiredState) + { + Write-Verbose -Message $script:localizedData.LevelNotInDesiredState + + $testTargetResourceReturnValue = $false + } + else + { + Write-Verbose -Message $script:localizedData.LevelInDesiredState + + $testTargetResourceReturnValue = $true + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Sets the functional level on the Active Directory domain. + + .PARAMETER DomainIdentity + Specifies the Active Directory domain to modify. You can identify a + domain by its distinguished name, GUID, security identifier, DNS domain + name, or NetBIOS domain name. + + .PARAMETER DomainMode + Specifies the functional level for the Active Directory domain. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainIdentity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Windows2008R2Domain', 'Windows2012Domain', 'Windows2012R2Domain', 'Windows2016Domain')] + [System.String] + $DomainMode + ) + + $compareTargetResourceStateResult = Compare-TargetResourceState @PSBoundParameters + + # Get all properties that are not in desired state. + $propertiesNotInDesiredState = $compareTargetResourceStateResult | Where-Object -FilterScript { + -not $_.InDesiredState + } + + $domainModeProperty = $propertiesNotInDesiredState.Where( { $_.ParameterName -eq 'DomainMode' }) + + if ($domainModeProperty) + { + Write-Verbose -Message ( + $script:localizedData.DomainModeUpdating -f $domainModeProperty.Actual, $DomainMode + ) + + $setADDomainModeParameters = @{ + Identity = $DomainIdentity + DomainMode = [Microsoft.ActiveDirectory.Management.ADDomainMode]::$DomainMode + Confirm = $false + } + + Set-ADDomainMode @setADDomainModeParameters + } +} + +<# + .SYNOPSIS + Compares the properties in the current state with the properties of the + desired state and returns a hashtable with the comparison result. + + .PARAMETER DomainIdentity + Specifies the Active Directory domain to modify. You can identify a + domain by its distinguished name, GUID, security identifier, DNS domain + name, or NetBIOS domain name. + + .PARAMETER DomainMode + Specifies the functional level for the Active Directory domain. +#> +function Compare-TargetResourceState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainIdentity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Windows2008R2Domain', 'Windows2012Domain', 'Windows2012R2Domain', 'Windows2016Domain')] + [System.String] + $DomainMode + ) + + $getTargetResourceResult = Get-TargetResource @PSBoundParameters + + $compareTargetResourceStateParameters = @{ + CurrentValues = $getTargetResourceResult + DesiredValues = $PSBoundParameters + Properties = @('DomainMode') + } + + return Compare-ResourcePropertyState @compareTargetResourceStateParameters +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/MSFT_ADDomainFunctionalLevel.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/MSFT_ADDomainFunctionalLevel.schema.mof new file mode 100644 index 0000000..1eb8c7b --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/MSFT_ADDomainFunctionalLevel.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADDomainFunctionalLevel")] +class MSFT_ADDomainFunctionalLevel : OMI_BaseResource +{ + [Key, Description("Specifies the Active Directory domain to modify. You can identify a domain by its distinguished name, GUID, security identifier, DNS domain name, or NetBIOS domain name.")] String DomainIdentity; + [Required, Description("Specifies the functional level for the Active Directory domain."), ValueMap{"Windows2008R2Domain", "Windows2012Domain", "Windows2012R2Domain", "Windows2016Domain"}, Values{"Windows2008R2Domain", "Windows2012Domain", "Windows2012R2Domain", "Windows2016Domain"}] String DomainMode; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/README.md new file mode 100644 index 0000000..c8f260e --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/README.md @@ -0,0 +1,15 @@ +# Description + +This resource changes the domain functional level. For further details, see [Forest and Domain Functional Levels](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/active-directory-functional-levels). + +**WARNING: This action might be irreversible!** Make sure you understand +the consequences of changing the domain functional level. + +Read more about raising function levels and potential roll back +scenarios in the Active Directory documentation. For example: [Upgrade Domain Controllers to Windows Server 2016](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/deploy/upgrade-domain-controllers). + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. +* Target machine must be running the minimum required operating system + version for the domain functional level to set. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/en-US/MSFT_ADDomainFunctionalLevel.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/en-US/MSFT_ADDomainFunctionalLevel.strings.psd1 new file mode 100644 index 0000000..f9c0c52 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/en-US/MSFT_ADDomainFunctionalLevel.strings.psd1 @@ -0,0 +1,8 @@ +# culture="en-US" +ConvertFrom-StringData @' + RetrievingDomainMode = Retrieving the domain functional level for the domain '{0}'. (ADDFL0001) + TestConfiguration = Determining the current domain functional level in the domain '{0}'. (ADDFL0002) + LevelInDesiredState = The domain functional level is in the desired state. (ADDFL0003) + LevelNotInDesiredState = The domain functional level is not in the desired state. (ADDFL0004) + DomainModeUpdating = The domain functional level will change from '{0}' to '{1}'. (ADDFL0005) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/en-US/about_ADDomainFunctionalLevel.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/en-US/about_ADDomainFunctionalLevel.help.txt new file mode 100644 index 0000000..cbd21de --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainFunctionalLevel/en-US/about_ADDomainFunctionalLevel.help.txt @@ -0,0 +1,47 @@ +.NAME + ADDomainFunctionalLevel + +.Description + This resource changes the domain functional level. For further details, see [Forest and Domain Functional Levels](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/active-directory-functional-levels). + + **WARNING: This action might be irreversible!** Make sure you understand + the consequences of changing the domain functional level. + + Read more about raising function levels and potential roll back + scenarios in the Active Directory documentation. For example: [Upgrade Domain Controllers to Windows Server 2016](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/deploy/upgrade-domain-controllers). + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + * Target machine must be running the minimum required operating system + version for the domain functional level to set. + +.PARAMETER DomainIdentity + Key - String + Specifies the Active Directory domain to modify. You can identify a domain by its distinguished name, GUID, security identifier, DNS domain name, or NetBIOS domain name. + +.PARAMETER DomainMode + Required - String + Allowed values: Windows2008R2Domain, Windows2012Domain, Windows2012R2Domain, Windows2016Domain + Specifies the functional level for the Active Directory domain. + +.EXAMPLE 1 + +This configuration will change the domain functional level to +a Windows Server 2012 R2 Domain. + +Configuration ADDomainFunctionalLevel_SetLevel_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADDomainFunctionalLevel 'ChangeDomainFunctionalLevel' + { + DomainIdentity = 'contoso.com' + DomainMode = 'Windows2012R2Domain' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/MSFT_ADDomainTrust.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/MSFT_ADDomainTrust.psm1 new file mode 100644 index 0000000..9e66274 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/MSFT_ADDomainTrust.psm1 @@ -0,0 +1,714 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADDomainTrust' + +<# + .SYNOPSIS + Returns the current state of the Active Directory trust. + + .PARAMETER SourceDomainName + Specifies the name of the Active Directory domain that is requesting the + trust. + + .PARAMETER TargetDomainName + Specifies the name of the Active Directory domain that is being trusted. + + .PARAMETER TargetCredential + Specifies the credentials to authenticate to the target domain. + + .PARAMETER TrustType + Specifies the type of trust. The value 'External' means the context Domain, + while the value 'Forest' means the context 'Forest'. + + .PARAMETER TrustDirection + Specifies the direction of the trust. + + .PARAMETER AllowTrustRecreation + Specifies if the is allowed to be recreated if required. Default value is + $false. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SourceDomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $TargetDomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $TargetCredential, + + [Parameter(Mandatory = $true)] + [ValidateSet('External', 'Forest')] + [System.String] + $TrustType, + + [Parameter(Mandatory = $true)] + [ValidateSet('Bidirectional', 'Inbound', 'Outbound')] + [System.String] + $TrustDirection, + + [Parameter()] + [System.Boolean] + $AllowTrustRecreation = $false + ) + + # Return a credential object without the password. + $cimCredentialInstance = New-CimCredentialInstance -Credential $TargetCredential + + $returnValue = @{ + SourceDomainName = $SourceDomainName + TargetDomainName = $TargetDomainName + TargetCredential = $cimCredentialInstance + AllowTrustRecreation = $AllowTrustRecreation + } + + $getTrustTargetAndSourceObject = @{ + SourceDomainName = $SourceDomainName + TargetDomainName = $TargetDomainName + TargetCredential = $TargetCredential + TrustType = $TrustType + } + + $trustSource, $trustTarget = Get-TrustSourceAndTargetObject @getTrustTargetAndSourceObject + + try + { + # Find trust between source & destination. + Write-Verbose -Message ( + $script:localizedData.CheckingTrustMessage -f $SourceDomainName, $TargetDomainName, $directoryContextTyp + ) + + $trust = $trustSource.GetTrustRelationship($trustTarget) + + $returnValue['TrustDirection'] = $trust.TrustDirection + $returnValue['TrustType'] = ConvertFrom-DirectoryContextType -DirectoryContextType $trust.TrustType + + Write-Verbose -Message ($script:localizedData.TrustPresentMessage -f $SourceDomainName, $TargetDomainName, $directoryContextType) + + $returnValue['Ensure'] = 'Present' + } + catch + { + Write-Verbose -Message ($script:localizedData.TrustAbsentMessage -f $SourceDomainName, $TargetDomainName, $directoryContextType) + + $returnValue['Ensure'] = 'Absent' + $returnValue['TrustDirection'] = $null + $returnValue['TrustType'] = $null + } + + return $returnValue +} + +<# + .SYNOPSIS + Creates, removes, or updates the Active Directory trust so it is in the + desired state. + + .PARAMETER SourceDomainName + Specifies the name of the Active Directory domain that is requesting the + trust. + + .PARAMETER TargetDomainName + Specifies the name of the Active Directory domain that is being trusted. + + .PARAMETER TargetCredential + Specifies the credentials to authenticate to the target domain. + + .PARAMETER TrustType + Specifies the type of trust. The value 'External' means the context Domain, + while the value 'Forest' means the context 'Forest'. + + .PARAMETER TrustDirection + Specifies the direction of the trust. + + .PARAMETER Ensure + Specifies whether the computer account is present or absent. Default + value is 'Present'. + + .PARAMETER AllowTrustRecreation + Specifies if the is allowed to be recreated if required. Default value is + $false. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SourceDomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $TargetDomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $TargetCredential, + + [Parameter(Mandatory = $true)] + [ValidateSet('External', 'Forest')] + [System.String] + $TrustType, + + [Parameter(Mandatory = $true)] + [ValidateSet('Bidirectional', 'Inbound', 'Outbound')] + [System.String] + $TrustDirection, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $AllowTrustRecreation = $false + ) + + $getTrustTargetAndSourceObject = @{ + SourceDomainName = $SourceDomainName + TargetDomainName = $TargetDomainName + TargetCredential = $TargetCredential + TrustType = $TrustType + } + + $trustSource, $trustTarget = Get-TrustSourceAndTargetObject @getTrustTargetAndSourceObject + + # Only pass those properties that should be evaluated. + $compareTargetResourceStateParameters = @{} + $PSBoundParameters + $compareTargetResourceStateParameters.Remove('AllowTrustRecreation') + + $compareTargetResourceStateResult = Compare-TargetResourceState @compareTargetResourceStateParameters + + # Get all properties that are not in desired state. + $propertiesNotInDesiredState = $compareTargetResourceStateResult | + Where-Object -FilterScript { -not $_.InDesiredState } + + if ($propertiesNotInDesiredState.Where( { $_.ParameterName -eq 'Ensure' })) + { + if ($Ensure -eq 'Present') + { + # Create trust. + $trustSource.CreateTrustRelationship($trustTarget, $TrustDirection) + + Write-Verbose -Message ( + $script:localizedData.AddedTrust -f @( + $SourceDomainName, + $TargetDomainName, + $TrustType, + $TrustDirection + ) + ) + } + else + { + # Remove trust. + $trustSource.DeleteTrustRelationship($trustTarget) + + Write-Verbose -Message ( + $script:localizedData.RemovedTrust -f @( + $SourceDomainName, + $TargetDomainName, + $TrustType, + $TrustDirection + ) + ) + } + } + else + { + if ($Ensure -eq 'Present') + { + $trustRecreated = $false + + # Check properties. + $trustTypeProperty = $propertiesNotInDesiredState.Where( { $_.ParameterName -eq 'TrustType' }) + + if ($trustTypeProperty) + { + Write-Verbose -Message ( + $script:localizedData.NeedToRecreateTrust -f @( + $SourceDomainName, + $TargetDomainName, + (ConvertFrom-DirectoryContextType -DirectoryContextType $trustTypeProperty.Actual), + $TrustType + ) + ) + + if ($AllowTrustRecreation) + { + $trustSource.DeleteTrustRelationship($trustTarget) + $trustSource.CreateTrustRelationship($trustTarget, $TrustDirection) + + Write-Verbose -Message ( + $script:localizedData.RecreatedTrustType -f @( + $SourceDomainName, + $TargetDomainName, + $TrustType, + $TrustDirection + ) + ) + + $trustRecreated = $true + } + else + { + throw $script:localizedData.NotOptInToRecreateTrust + } + } + + <# + In case the trust direction property should be wrong, there + is no need to update that property twice since it was set + to the correct value when the trust was recreated. + #> + if (-not $trustRecreated) + { + if ($propertiesNotInDesiredState.Where( { $_.ParameterName -eq 'TrustDirection' })) + { + $trustSource.UpdateTrustRelationship($trustTarget, $TrustDirection) + + Write-Verbose -Message ( + $script:localizedData.SetTrustDirection -f $TrustDirection + ) + } + } + + Write-Verbose -Message $script:localizedData.InDesiredState + } + else + { + # The trust is already absent, so in desired state. + Write-Verbose -Message $script:localizedData.InDesiredState + } + } +} + +<# + .SYNOPSIS + Determines if the properties of the Active Directory trust is in + the desired state. + + .PARAMETER SourceDomainName + Specifies the name of the Active Directory domain that is requesting the + trust. + + .PARAMETER TargetDomainName + Specifies the name of the Active Directory domain that is being trusted. + + .PARAMETER TargetCredential + Specifies the credentials to authenticate to the target domain. + + .PARAMETER TrustType + Specifies the type of trust. The value 'External' means the context Domain, + while the value 'Forest' means the context 'Forest'. + + .PARAMETER TrustDirection + Specifies the direction of the trust. + + .PARAMETER Ensure + Specifies whether the computer account is present or absent. Default + value is 'Present'. + + .PARAMETER AllowTrustRecreation + Specifies if the is allowed to be recreated if required. Default value is + $false. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SourceDomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $TargetDomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $TargetCredential, + + [Parameter(Mandatory = $true)] + [ValidateSet('External', 'Forest')] + [System.String] + $TrustType, + + [Parameter(Mandatory = $true)] + [ValidateSet('Bidirectional', 'Inbound', 'Outbound')] + [System.String] + $TrustDirection, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $AllowTrustRecreation = $false + ) + + Write-Verbose -Message ( + $script:localizedData.TestConfiguration -f $SourceDomainName, $TargetDomainName, $TrustType + ) + + # Only pass those properties that should be evaluated. + $compareTargetResourceStateParameters = @{} + $PSBoundParameters + $compareTargetResourceStateParameters.Remove('AllowTrustRecreation') + + <# + This returns array of hashtables which contain the properties ParameterName, + Expected, Actual, and InDesiredState. + #> + $compareTargetResourceStateResult = Compare-TargetResourceState @compareTargetResourceStateParameters + + if ($false -in $compareTargetResourceStateResult.InDesiredState) + { + $testTargetResourceReturnValue = $false + + Write-Verbose -Message $script:localizedData.NotInDesiredState + } + else + { + $testTargetResourceReturnValue = $true + + Write-Verbose -Message $script:localizedData.InDesiredState + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Compares the properties in the current state with the properties of the + desired state and returns a hashtable with the comparison result. + + .PARAMETER SourceDomainName + Specifies the name of the Active Directory domain that is requesting the + trust. + + .PARAMETER TargetDomainName + Specifies the name of the Active Directory domain that is being trusted. + + .PARAMETER TargetCredential + Specifies the credentials to authenticate to the target domain. + + .PARAMETER TrustType + Specifies the type of trust. The value 'External' means the context Domain, + while the value 'Forest' means the context 'Forest'. + + .PARAMETER TrustDirection + Specifies the direction of the trust. + + .PARAMETER Ensure + Specifies whether the computer account is present or absent. Default + value is 'Present'. +#> +function Compare-TargetResourceState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SourceDomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $TargetDomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $TargetCredential, + + [Parameter(Mandatory = $true)] + [ValidateSet('External', 'Forest')] + [System.String] + $TrustType, + + [Parameter(Mandatory = $true)] + [ValidateSet('Bidirectional', 'Inbound', 'Outbound')] + [System.String] + $TrustDirection, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $getTargetResourceParameters = @{ + SourceDomainName = $SourceDomainName + TargetDomainName = $TargetDomainName + TargetCredential = $TargetCredential + TrustType = $TrustType + TrustDirection = $TrustDirection + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + <# + If the desired state should be Absent, then there is no need to + compare properties other than 'Ensure'. If the other properties + would be compared, they would return a false negative during test. + #> + if ($Ensure -eq 'Present') + { + $propertiesToEvaluate = @( + 'Ensure' + 'TrustType' + 'TrustDirection' + ) + } + else + { + $propertiesToEvaluate = @( + 'Ensure' + ) + } + + <# + If the user did not specify Ensure property, then it is not part of + the $PSBoundParameters, but it still needs to be compared. + Copy the hashtable $PSBoundParameters and add 'Ensure' property to make + sure it is part of the DesiredValues. + #> + $desiredValues = @{} + $PSBoundParameters + $desiredValues['Ensure'] = $Ensure + + $compareResourcePropertyStateParameters = @{ + CurrentValues = $getTargetResourceResult + DesiredValues = $desiredValues + Properties = $propertiesToEvaluate + } + + return Compare-ResourcePropertyState @compareResourcePropertyStateParameters +} + +<# + .SYNOPSIS + This returns a new object of the type System.DirectoryServices.ActiveDirectory.Domain + which is a class that represents an Active Directory Domain Services domain. + + .PARAMETER DirectoryContext + The Active Directory context from which the domain object is returned. + Calling the Get-ADDirectoryContext gets a value that can be provided in + this parameter. + + .NOTES + This is a wrapper to enable unit testing of this resource. + see issue https://github.com/PowerShell/ActiveDirectoryDsc/issues/324 + for more information. +#> +function Get-ActiveDirectoryDomain +{ + [CmdletBinding()] + [OutputType([System.DirectoryServices.ActiveDirectory.Domain])] + param + ( + [Parameter(Mandatory = $true)] + [System.DirectoryServices.ActiveDirectory.DirectoryContext] + $DirectoryContext + ) + + return [System.DirectoryServices.ActiveDirectory.Domain]::GetDomain($DirectoryContext) +} + +<# + .SYNOPSIS + This returns a new object of the type System.DirectoryServices.ActiveDirectory.Forest + which is a class that represents an Active Directory Domain Services forest. + + .PARAMETER DirectoryContext + The Active Directory context from which the forest object is returned. + Calling the Get-ADDirectoryContext gets a value that can be provided in + this parameter. + + .NOTES + This is a wrapper to enable unit testing of this resource. + see issue https://github.com/PowerShell/ActiveDirectoryDsc/issues/324 + for more information. +#> +function Get-ActiveDirectoryForest +{ + [CmdletBinding()] + [OutputType([System.DirectoryServices.ActiveDirectory.Forest])] + param + ( + [Parameter(Mandatory = $true)] + [System.DirectoryServices.ActiveDirectory.DirectoryContext] + $DirectoryContext + ) + + return [System.DirectoryServices.ActiveDirectory.Forest]::GetForest($DirectoryContext) +} + +<# + .SYNOPSIS + This returns the converted value from a Trust Type value to the correct + Directory Context Type value. + + .PARAMETER TrustType + The trust type value to convert. +#> +function ConvertTo-DirectoryContextType +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TrustType + ) + + switch ($TrustType) + { + 'External' + { + $directoryContextType = 'Domain' + } + + 'Forest' + { + $directoryContextType = 'Forest' + } + } + + return $directoryContextType +} + +<# + .SYNOPSIS + This returns the converted value from a Directory Context Type value to + the correct Trust Type value. + + .PARAMETER DirectoryContextType + The Directory Context Type value to convert. +#> +function ConvertFrom-DirectoryContextType +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DirectoryContextType + ) + + switch ($DirectoryContextType) + { + 'Domain' + { + $trustType = 'External' + } + + 'Forest' + { + $trustType = 'Forest' + } + } + + return $trustType +} + +<# + .SYNOPSIS + Returns two objects where the first object is for the source domain and + the second object is for the target domain. + + .PARAMETER SourceDomainName + Specifies the name of the Active Directory domain that is requesting the + trust. + + .PARAMETER TargetDomainName + Specifies the name of the Active Directory domain that is being trusted. + + .PARAMETER TargetCredential + Specifies the credentials to authenticate to the target domain. + + .PARAMETER TrustType + Specifies the type of trust. The value 'External' means the context Domain, + while the value 'Forest' means the context 'Forest'. + + .OUTPUTS + For both objects the type returned is either of the type + System.DirectoryServices.ActiveDirectory.Domain or of the type + System.DirectoryServices.ActiveDirectory.Forest. +#> +function Get-TrustSourceAndTargetObject +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SourceDomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $TargetDomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $TargetCredential, + + [Parameter(Mandatory = $true)] + [ValidateSet('External', 'Forest')] + [System.String] + $TrustType + ) + + $directoryContextType = ConvertTo-DirectoryContextType -TrustType $TrustType + + # Create the target object. + $getADDirectoryContextParameters = @{ + DirectoryContextType = $directoryContextType + Name = $TargetDomainName + Credential = $TargetCredential + } + + $targetDirectoryContext = Get-ADDirectoryContext @getADDirectoryContextParameters + + # Create the source object. + $getADDirectoryContextParameters = @{ + DirectoryContextType = $directoryContextType + Name = $SourceDomainName + } + + $sourceDirectoryContext = Get-ADDirectoryContext @getADDirectoryContextParameters + + if ($directoryContextType -eq 'Domain') + { + $trustSource = Get-ActiveDirectoryDomain -DirectoryContext $sourceDirectoryContext + $trustTarget = Get-ActiveDirectoryDomain -DirectoryContext $targetDirectoryContext + } + else + { + $trustSource = Get-ActiveDirectoryForest -DirectoryContext $sourceDirectoryContext + $trustTarget = Get-ActiveDirectoryForest -DirectoryContext $targetDirectoryContext + } + + return $trustSource, $trustTarget +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/MSFT_ADDomainTrust.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/MSFT_ADDomainTrust.schema.mof new file mode 100644 index 0000000..1043d91 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/MSFT_ADDomainTrust.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.1.0"), FriendlyName("ADDomainTrust")] +class MSFT_ADDomainTrust : OMI_BaseResource +{ + [Write, Description("Specifies whether the computer account is present or absent. Default value is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Required, Description("Specifies the credentials to authenticate to the target domain."), EmbeddedInstance("MSFT_Credential")] String TargetCredential; + [Key, Description("Specifies the name of the Active Directory domain that is being trusted.")] String TargetDomainName; + [Required, Description("Specifies the type of trust. The value 'External' means the context Domain, while the value 'Forest' means the context 'Forest'."), ValueMap{"External","Forest"}, Values{"External","Forest"}] String TrustType; + [Required, Description("Specifies the direction of the trust."), ValueMap{"Bidirectional","Inbound","Outbound"}, Values{"Bidirectional","Inbound","Outbound"}] String TrustDirection; + [Key, Description("Specifies the name of the Active Directory domain that is requesting the trust.")] String SourceDomainName; + [Write, Description("Specifies if the is allowed to be recreated if required. Default value is $false.")] Boolean AllowTrustRecreation; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/README.md new file mode 100644 index 0000000..f874320 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/README.md @@ -0,0 +1,7 @@ +# Description + +The ADDomainTrust DSC resource will manage Domain Trusts within Active Directory. A trust is a relationship, which you establish between domains or forests. To understand more about trusts in Active Directory, please see the article [Forest Design Models](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/plan/forest-design-models) for more information. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/en-US/MSFT_ADDomainTrust.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/en-US/MSFT_ADDomainTrust.strings.psd1 new file mode 100644 index 0000000..291635f --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/en-US/MSFT_ADDomainTrust.strings.psd1 @@ -0,0 +1,15 @@ +# culture="en-US" +ConvertFrom-StringData @' +CheckingTrustMessage = Determining if the trust between domains '{0}' and '{1}' with the context type '{2}' exists. (ADDT0001) +RemovedTrust = Trust between between domains '{0}' and '{1}' with the context type '{2}' has been removed. (ADDT0002) +AddedTrust = Created the trust between domains '{0}' and '{1}' with the context type '{2}' and direction '{3}'. (ADDT0003) +SetTrustDirection = The trust direction has been changed to '{0}'. (ADDT0004) +TrustPresentMessage = The trust between domains '{0}' and '{1}' with the context type '{2}' exist. (ADDT0005) +TrustAbsentMessage = There is no trust between domains '{0}' and '{1}' with the context type '{2}'. (ADDT0006) +TestConfiguration = Determining the current state of the Active Directory trust with source domain '{0}', target domain '{1}' and context type '{2}'. (ADDT0007) +InDesiredState = The Active Directory trust is in the desired state. (ADDT0008) +NotInDesiredState = The Active Directory trust is not in the desired state. (ADDT0009) +NeedToRecreateTrust = The trust type is not in desired state, removing the trust between the domains '{0}' and '{1}' with the context type '{2}' to be able to recreate the trust with the correct context type '{3}'. (ADDT0010) +RecreatedTrustType = Recreated the trust between domains '{0}' and '{1}' with the context type '{2}' and direction '{3}'. (ADDT0011) +NotOptInToRecreateTrust = Not opt-in to recreate trust. To opt-in set the parameter AllowTrustRecreation to $true. +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/en-US/about_ADDomainTrust.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/en-US/about_ADDomainTrust.help.txt new file mode 100644 index 0000000..d6d1870 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADDomainTrust/en-US/about_ADDomainTrust.help.txt @@ -0,0 +1,120 @@ +.NAME + ADDomainTrust + +.DESCRIPTION + The ADDomainTrust DSC resource will manage Domain Trusts within Active Directory. A trust is a relationship, which you establish between domains or forests. To understand more about trusts in Active Directory, please see the article [Forest Design Models](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/plan/forest-design-models) for more information. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies whether the computer account is present or absent. Default value is 'Present'. + +.PARAMETER TargetCredential + Required - PSCredential + Specifies the credentials to authenticate to the target domain. + +.PARAMETER TargetDomainName + Key - String + Specifies the name of the Active Directory domain that is being trusted. + +.PARAMETER TrustType + Required - String + Allowed values: External, Forest + Specifies the type of trust. The value 'External' means the context Domain, while the value 'Forest' means the context 'Forest'. + +.PARAMETER TrustDirection + Required - String + Allowed values: Bidirectional, Inbound, Outbound + Specifies the direction of the trust. + +.PARAMETER SourceDomainName + Key - String + Specifies the name of the Active Directory domain that is requesting the trust. + +.PARAMETER AllowTrustRecreation + Write - Boolean + Specifies if the is allowed to be recreated if required. Default value is $false. + +.EXAMPLE 1 + +This configuration will create a new one way inbound trust between two +domains. + +Configuration ADDomainTrust_ExternalInboundTrust_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SourceDomain, + + [Parameter(Mandatory = $true)] + [System.String] + $TargetDomain, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $TargetDomainAdminCred + ) + + Import-DscResource -module ActiveDirectoryDsc + + node localhost + { + ADDomainTrust 'Trust' + { + Ensure = 'Present' + SourceDomainName = $SourceDomain + TargetDomainName = $TargetDomain + TargetCredential = $TargetDomainAdminCred + TrustDirection = 'Inbound' + TrustType = 'External' + } + } +} + +.EXAMPLE 2 + +This configuration will create a new one way inbound trust between two +domains, and allows the trust to recreated if it should have the wrong +trust type. + +Configuration ADDomainTrust_ExternalInboundTrustWithOptInToRecreate_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SourceDomain, + + [Parameter(Mandatory = $true)] + [System.String] + $TargetDomain, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $TargetDomainAdminCred + ) + + Import-DscResource -module ActiveDirectoryDsc + + node localhost + { + ADDomainTrust 'Trust' + { + Ensure = 'Present' + SourceDomainName = $SourceDomain + TargetDomainName = $TargetDomain + TargetCredential = $TargetDomainAdminCred + TrustDirection = 'Inbound' + TrustType = 'External' + AllowTrustRecreation = $true + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/MSFT_ADForestFunctionalLevel.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/MSFT_ADForestFunctionalLevel.psm1 new file mode 100644 index 0000000..40ce7ac --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/MSFT_ADForestFunctionalLevel.psm1 @@ -0,0 +1,193 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADForestFunctionalLevel' + +<# + .SYNOPSIS + Returns the current functional level of the forest. + + .PARAMETER ForestIdentity + Specifies the Active Directory forest to modify. You can identify a + forest by its fully qualified domain name (FQDN), GUID, DNS host name, + or NetBIOS name. + + .PARAMETER ForestMode + Specifies the the functional level for the Active Directory forest. + + Not used in Get-TargetResource. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ForestIdentity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Windows2008R2Forest', 'Windows2012Forest', 'Windows2012R2Forest', 'Windows2016Forest')] + [System.String] + $ForestMode + ) + + Write-Verbose -Message ( + $script:localizedData.RetrievingForestMode -f $ForestIdentity + ) + + $getTargetResourceReturnValue = @{ + ForestIdentity = $ForestIdentity + ForestMode = $null + } + + $forestObject = Get-ADForest -Identity $ForestIdentity -ErrorAction 'Stop' + $getTargetResourceReturnValue['ForestMode'] = $forestObject.ForestMode + + return $getTargetResourceReturnValue +} + +<# + .SYNOPSIS + Determines if the functional level is in the desired state. + + .PARAMETER ForestIdentity + Specifies the Active Directory forest to modify. You can identify a + forest by its fully qualified domain name (FQDN), GUID, DNS host name, + or NetBIOS name. + + .PARAMETER ForestMode + Specifies the the functional level for the Active Directory forest. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ForestIdentity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Windows2008R2Forest', 'Windows2012Forest', 'Windows2012R2Forest', 'Windows2016Forest')] + [System.String] + $ForestMode + ) + + Write-Verbose -Message ( + $script:localizedData.TestConfiguration -f $ForestIdentity + ) + + $compareTargetResourceStateResult = Compare-TargetResourceState @PSBoundParameters + + if ($false -in $compareTargetResourceStateResult.InDesiredState) + { + Write-Verbose -Message $script:localizedData.LevelNotInDesiredState + + $testTargetResourceReturnValue = $false + } + else + { + Write-Verbose -Message $script:localizedData.LevelInDesiredState + + $testTargetResourceReturnValue = $true + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Sets the functional level on the Active Directory forest. + + .PARAMETER ForestIdentity + Specifies the Active Directory forest to modify. You can identify a + forest by its fully qualified domain name (FQDN), GUID, DNS host name, + or NetBIOS name. + + .PARAMETER ForestMode + Specifies the the functional level for the Active Directory forest. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ForestIdentity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Windows2008R2Forest', 'Windows2012Forest', 'Windows2012R2Forest', 'Windows2016Forest')] + [System.String] + $ForestMode + ) + + $compareTargetResourceStateResult = Compare-TargetResourceState @PSBoundParameters + + # Get all properties that are not in desired state. + $propertiesNotInDesiredState = $compareTargetResourceStateResult | Where-Object -FilterScript { + -not $_.InDesiredState + } + + $forestModeProperty = $propertiesNotInDesiredState.Where( { $_.ParameterName -eq 'ForestMode' }) + + if ($forestModeProperty) + { + Write-Verbose -Message ( + $script:localizedData.ForestModeUpdating -f $forestModeProperty.Actual, $ForestMode + ) + + $setADForestModeParameters = @{ + Identity = $ForestIdentity + ForestMode = [Microsoft.ActiveDirectory.Management.ADForestMode]::$ForestMode + Confirm = $false + } + + Set-ADForestMode @setADForestModeParameters + } +} + +<# + .SYNOPSIS + Compares the properties in the current state with the properties of the + desired state and returns a hashtable with the comparison result. + + .PARAMETER ForestIdentity + Specifies the Active Directory forest to modify. You can identify a + forest by its fully qualified domain name (FQDN), GUID, DNS host name, + or NetBIOS name. + + .PARAMETER ForestMode + Specifies the the functional level for the Active Directory forest. +#> +function Compare-TargetResourceState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ForestIdentity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Windows2008R2Forest', 'Windows2012Forest', 'Windows2012R2Forest', 'Windows2016Forest')] + [System.String] + $ForestMode + ) + + $getTargetResourceResult = Get-TargetResource @PSBoundParameters + + $compareTargetResourceStateParameters = @{ + CurrentValues = $getTargetResourceResult + DesiredValues = $PSBoundParameters + Properties = @('ForestMode') + } + + return Compare-ResourcePropertyState @compareTargetResourceStateParameters +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/MSFT_ADForestFunctionalLevel.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/MSFT_ADForestFunctionalLevel.schema.mof new file mode 100644 index 0000000..8ac2fd0 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/MSFT_ADForestFunctionalLevel.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADForestFunctionalLevel")] +class MSFT_ADForestFunctionalLevel : OMI_BaseResource +{ + [Key, Description("Specifies the Active Directory forest to modify. You can identify a forest by its fully qualified domain name (FQDN), GUID, DNS host name, or NetBIOS name.")] String ForestIdentity; + [Required, Description("Specifies the the functional level for the Active Directory forest."), ValueMap{"Windows2008R2Forest", "Windows2012Forest", "Windows2012R2Forest", "Windows2016Forest"}, Values{"Windows2008R2Forest", "Windows2012Forest", "Windows2012R2Forest", "Windows2016Forest"}] String ForestMode; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/README.md new file mode 100644 index 0000000..21d32ff --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/README.md @@ -0,0 +1,15 @@ +# Description + +This resource changes the forest functional level. For further details, see [Forest and Domain Functional Levels](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/active-directory-functional-levels). + +**WARNING: This action might be irreversible!** Make sure you understand +the consequences of changing the forest functional level. + +Read more about raising function levels and potential roll back +scenarios in the Active Directory documentation, for example: [Upgrade Domain Controllers to Windows Server 2016](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/deploy/upgrade-domain-controllers). + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. +* Target machine must be running the minimum required operating system + version for the forest functional level to set. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/en-US/MSFT_ADForestFunctionalLevel.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/en-US/MSFT_ADForestFunctionalLevel.strings.psd1 new file mode 100644 index 0000000..1191387 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/en-US/MSFT_ADForestFunctionalLevel.strings.psd1 @@ -0,0 +1,8 @@ +# culture="en-US" +ConvertFrom-StringData @' + RetrievingForestMode = Retrieving the forest functional level for the forest '{0}'. (ADFFL0001) + TestConfiguration = Determining the current forest functional level in the forest '{0}'. (ADFFL0002) + LevelInDesiredState = The forest functional level is in the desired state. (ADFFL0003) + LevelNotInDesiredState = The forest functional level is not in the desired state. (ADFFL0004) + ForestModeUpdating = The forest functional level will change from '{0}' to '{1}'. (ADFFL0005) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/en-US/about_ADForestFunctionalLevel.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/en-US/about_ADForestFunctionalLevel.help.txt new file mode 100644 index 0000000..2068176 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestFunctionalLevel/en-US/about_ADForestFunctionalLevel.help.txt @@ -0,0 +1,47 @@ +.NAME + ADForestFunctionalLevel + +.DESCRIPTION + This resource changes the forest functional level. For further details, see [Forest and Domain Functional Levels](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/active-directory-functional-levels). + + **WARNING: This action might be irreversible!** Make sure you understand + the consequences of changing the forest functional level. + + Read more about raising function levels and potential roll back + scenarios in the Active Directory documentation, for example: [Upgrade Domain Controllers to Windows Server 2016](https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/deploy/upgrade-domain-controllers). + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + * Target machine must be running the minimum required operating system + version for the forest functional level to set. + +.PARAMETER ForestIdentity + Key - String + Specifies the Active Directory forest to modify. You can identify a forest by its fully qualified domain name (FQDN), GUID, DNS host name, or NetBIOS name. + +.PARAMETER ForestMode + Required - String + Allowed values: Windows2008R2Forest, Windows2012Forest, Windows2012R2Forest, Windows2016Forest + Specifies the the functional level for the Active Directory forest. + +.EXAMPLE 1 + +This configuration will change the forest functional level to +a Windows Server 2012 R2 Forest. + +Configuration ADForestFunctionalLevel_SetLevel_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADForestFunctionalLevel 'ChangeForestFunctionalLevel' + { + ForestIdentity = 'contoso.com' + ForestMode = 'Windows2012R2Forest' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/MSFT_ADForestProperties.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/MSFT_ADForestProperties.psm1 new file mode 100644 index 0000000..879d800 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/MSFT_ADForestProperties.psm1 @@ -0,0 +1,509 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADForestProperties' +$script:psModuleName = 'ActiveDirectory' + +<# + .SYNOPSIS + Gets the current state of user principal name and service principal name suffixes in the forest. + + .PARAMETER Credential + The user account credentials to use to perform this task. + + .PARAMETER ForestName + The target Active Directory forest for the change. + + .PARAMETER ServicePrincipalNameSuffixToAdd + The Service Principal Name Suffix(es) to add in the forest. Cannot be used with ServicePrincipalNameSuffix. + + .PARAMETER ServicePrincipalNameSuffixToRemove + The Service Principal Name Suffix(es) to remove in the forest. Cannot be used with ServicePrincipalNameSuffix. + + .PARAMETER UserPrincipalNameSuffixToAdd + The User Principal Name Suffix(es) to add in the forest. Cannot be used with UserPrincipalNameSuffix. + + .PARAMETER UserPrincipalNameSuffixToRemove + The User Principal Name Suffix(es) to remove in the forest. Cannot be used with UserPrincipalNameSuffix. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Assert-Module | ActiveDirectoryDsc.Common + Get-ADForest | ActiveDirectory + Get-ADObject | ActiveDirectory + Get-ADRootDSE | ActiveDirectory +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.String] + $ForestName, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffix, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffixToAdd, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffixToRemove, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffix, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffixToAdd, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffixToRemove + ) + + Assert-Module -ModuleName $script:psModuleName + + Write-Verbose -Message ($script:localizedData.GetForest -f $ForestName) + $forest = Get-ADForest -Identity $ForestName + + $configurationNamingContext = (Get-ADRootDSE).configurationNamingContext + $identity = "CN=Directory Service,CN=Windows NT,CN=Services,$configurationNamingContext" + $tombstoneLifetime = (Get-ADObject -Identity $identity -Partition $configurationNamingContext ` + -Properties 'tombstonelifetime').tombstonelifetime + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $cimCredential = New-CimCredentialInstance -Credential $Credential + } + else + { + $cimCredential = $null + } + + return @{ + Credential = $cimCredential + ForestName = $forest.Name + ServicePrincipalNameSuffix = [System.Array] $forest.SpnSuffixes + ServicePrincipalNameSuffixToAdd = [System.Array] $ServicePrincipalNameSuffixToAdd + ServicePrincipalNameSuffixToRemove = [System.Array] $ServicePrincipalNameSuffixToRemove + TombstoneLifetime = $tombstoneLifetime + UserPrincipalNameSuffix = [System.Array] $forest.UpnSuffixes + UserPrincipalNameSuffixToAdd = [System.Array] $UserPrincipalNameSuffixToAdd + UserPrincipalNameSuffixToRemove = [System.Array] $UserPrincipalNameSuffixToRemove + } +} + +<# + .SYNOPSIS + Tests the current state of user principal name and service principal name suffixes in the forest. + + .PARAMETER Credential + The user account credentials to use to perform this task. + + .PARAMETER ForestName + The target Active Directory forest for the change. + + .PARAMETER ServicePrincipalNameSuffix + The Service Principal Name Suffix(es) to be explicitly defined in the forest and replace existing + members. Cannot be used with ServicePrincipalNameSuffixToAdd or ServicePrincipalNameSuffixToRemove. + + .PARAMETER ServicePrincipalNameSuffixToAdd + The Service Principal Name Suffix(es) to add in the forest. Cannot be used with ServicePrincipalNameSuffix. + + .PARAMETER ServicePrincipalNameSuffixToRemove + The Service Principal Name Suffix(es) to remove in the forest. Cannot be used with ServicePrincipalNameSuffix. + + .PARAMETER TombstoneLifetime + Specifies the AD Tombstone lifetime which determines how long deleted items exist in Active Directory before + they are purged. + + .PARAMETER UserPrincipalNameSuffix + The User Principal Name Suffix(es) to be explicitly defined in the forest and replace existing + members. Cannot be used with UserPrincipalNameSuffixToAdd or UserPrincipalNameSuffixToRemove. + + .PARAMETER UserPrincipalNameSuffixToAdd + The User Principal Name Suffix(es) to add in the forest. Cannot be used with UserPrincipalNameSuffix. + + .PARAMETER UserPrincipalNameSuffixToRemove + The User Principal Name Suffix(es) to remove in the forest. Cannot be used with UserPrincipalNameSuffix. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Assert-MemberParameters | ActiveDirectoryDsc.Common + Assert-Module | ActiveDirectoryDsc.Common + Test-Members | ActiveDirectoryDsc.Common +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.String] + $ForestName, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffix, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffixToAdd, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffixToRemove, + + [Parameter()] + [System.Int32] + $TombstoneLifetime, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffix, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffixToAdd, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffixToRemove + ) + + Assert-Module -ModuleName $script:psModuleName + + $inDesiredState = $true + + $targetResource = Get-TargetResource -ForestName $ForestName + + # Validate parameters before we even attempt to retrieve anything + $assertMemberParameters = @{} + + if ($PSBoundParameters.ContainsKey('ServicePrincipalNameSuffix') -and + -not [system.string]::IsNullOrEmpty($ServicePrincipalNameSuffix)) + { + $assertMemberParameters['Members'] = $ServicePrincipalNameSuffix + } + + if ($PSBoundParameters.ContainsKey('ServicePrincipalNameSuffixToAdd') -and + -not [system.string]::IsNullOrEmpty($ServicePrincipalNameSuffixToAdd)) + { + $assertMemberParameters['MembersToInclude'] = $ServicePrincipalNameSuffixToAdd + } + + if ($PSBoundParameters.ContainsKey('ServicePrincipalNameSuffixToRemove') -and + -not [system.string]::IsNullOrEmpty($ServicePrincipalNameSuffixToRemove)) + { + $assertMemberParameters['MembersToExclude'] = $ServicePrincipalNameSuffixToRemove + } + + Assert-MemberParameters @assertMemberParameters -ErrorAction Stop + + if (-not ( Test-Members @assertMemberParameters -ExistingMembers ($targetResource.ServicePrincipalNameSuffix -split ',') )) + { + Write-Verbose -Message ($script:localizedData.ForestSpnSuffixNotInDesiredState -f $ForestName) + $inDesiredState = $false + } + + $assertMemberParameters = @{} + + if ($PSBoundParameters.ContainsKey('UserPrincipalNameSuffix') -and + -not [system.string]::IsNullOrEmpty($UserPrincipalNameSuffix)) + { + $assertMemberParameters['Members'] = $UserPrincipalNameSuffix + } + + if ($PSBoundParameters.ContainsKey('UserPrincipalNameSuffixToAdd') -and + -not [system.string]::IsNullOrEmpty($UserPrincipalNameSuffixToAdd)) + { + $assertMemberParameters['MembersToInclude'] = $UserPrincipalNameSuffixToAdd + } + + if ($PSBoundParameters.ContainsKey('UserPrincipalNameSuffixToRemove') -and + -not [system.string]::IsNullOrEmpty($UserPrincipalNameSuffixToRemove)) + { + $assertMemberParameters['MembersToExclude'] = $UserPrincipalNameSuffixToRemove + } + + Assert-MemberParameters @assertMemberParameters -ErrorAction Stop + + if (-not ( Test-Members @assertMemberParameters -ExistingMembers ($targetResource.UserPrincipalNameSuffix -split ',') )) + { + Write-Verbose -Message ($script:localizedData.ForestUpnSuffixNotInDesiredState -f $ForestName) + + $inDesiredState = $false + } + + if ($PSBoundParameters.ContainsKey('TombstoneLifetime')) + { + if ($TombstoneLifetime -ne $targetResource.TombstoneLifetime) + { + Write-Verbose -Message ($script:localizedData.TombstoneLifetimeNotInDesiredState -f + $ForestName, $targetResource.TombstoneLifetime, $TombstoneLifetime) + + $inDesiredState = $false + } + } + + return $inDesiredState +} + +<# + .SYNOPSIS + Sets the user principal name and service principal name suffixes in the forest. + + .PARAMETER Credential + The user account credentials to use to perform this task. + + .PARAMETER ForestName + The target Active Directory forest for the change. + + .PARAMETER ServicePrincipalNameSuffix + The Service Principal Name Suffix(es) to be explicitly defined in the forest and replace existing + members. Cannot be used with ServicePrincipalNameSuffixToAdd or ServicePrincipalNameSuffixToRemove. + + .PARAMETER ServicePrincipalNameSuffixToAdd + The Service Principal Name Suffix(es) to add in the forest. Cannot be used with ServicePrincipalNameSuffix. + + .PARAMETER ServicePrincipalNameSuffixToRemove + The Service Principal Name Suffix(es) to remove in the forest. Cannot be used with ServicePrincipalNameSuffix. + + .PARAMETER TombstoneLifetime + Specifies the AD Tombstone lifetime which determines how long deleted items exist in Active Directory before + they are purged. + + .PARAMETER UserPrincipalNameSuffix + The User Principal Name Suffix(es) to be explicitly defined in the forest and replace existing + members. Cannot be used with UserPrincipalNameSuffixToAdd or UserPrincipalNameSuffixToRemove. + + .PARAMETER UserPrincipalNameSuffixToAdd + The User Principal Name Suffix(es) to add in the forest. Cannot be used with UserPrincipalNameSuffix. + + .PARAMETER UserPrincipalNameSuffixToRemove + The User Principal Name Suffix(es) to remove in the forest. Cannot be used with UserPrincipalNameSuffix. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Assert-Module | ActiveDirectoryDsc.Common + Get-ADRootDSE | ActiveDirectory + New-InvalidOperationException | ActiveDirectoryDsc.Common + Set-ADForest | ActiveDirectory + Set-ODObject | ActiveDirectory +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.String] + $ForestName, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffix, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffixToAdd, + + [Parameter()] + [System.String[]] + $ServicePrincipalNameSuffixToRemove, + + [Parameter()] + [System.Int32] + $TombstoneLifetime, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffix, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffixToAdd, + + [Parameter()] + [System.String[]] + $UserPrincipalNameSuffixToRemove + ) + + Assert-Module -ModuleName $script:psModuleName + + $targetResource = Get-TargetResource -ForestName $ForestName + + $setADForestParameters = @{} + + # add ServicePrincipalName parameter + if ($PSBoundParameters.ContainsKey('ServicePrincipalNameSuffix')) + { + if (-not [system.string]::IsNullOrEmpty($ServicePrincipalNameSuffix)) + { + $setADForestParameters['SpnSuffixes'] = @{ + Replace = $($ServicePrincipalNameSuffix) + } + + Write-Verbose -Message ($script:localizedData.ReplaceSpnSuffix -f + ($ServicePrincipalNameSuffix -join ', '), $ForestName) + } + else + { + $setADForestParameters['SpnSuffixes'] = $null + Write-Verbose -Message ($script:localizedData.ClearSpnSuffix -f $ForestName) + } + } + + if ($PSBoundParameters.ContainsKey('ServicePrincipalNameSuffixToAdd') -and + -not [system.string]::IsNullOrEmpty($ServicePrincipalNameSuffixToAdd)) + { + $setADForestParameters['SpnSuffixes'] = @{ + Add = $($ServicePrincipalNameSuffixToAdd) + } + + Write-Verbose -Message ($script:localizedData.AddSpnSuffix -f + ($ServicePrincipalNameSuffixToAdd -join ', '), $ForestName) + } + + if ($PSBoundParameters.ContainsKey('ServicePrincipalNameSuffixToRemove') -and + -not [system.string]::IsNullOrEmpty($ServicePrincipalNameSuffixToRemove)) + { + if ($setADForestParameters['SpnSuffixes']) + { + $setADForestParameters['SpnSuffixes']['Remove'] = $($ServicePrincipalNameSuffixToRemove) + } + else + { + $setADForestParameters['SpnSuffixes'] = @{ + Remove = $($ServicePrincipalNameSuffixToRemove) + } + } + + Write-Verbose -Message ($script:localizedData.RemoveSpnSuffix -f + ($ServicePrincipalNameSuffixToRemove -join ', '), $ForestName) + } + + # add UserPrincipalName parameter + if ($PSBoundParameters.ContainsKey('UserPrincipalNameSuffix')) + { + if (-not [system.string]::IsNullOrEmpty($UserPrincipalNameSuffix)) + { + $setADForestParameters['UpnSuffixes'] = @{ + Replace = $($UserPrincipalNameSuffix) + } + + Write-Verbose -Message ($script:localizedData.ReplaceUpnSuffix -f + ($UserPrincipalNameSuffix -join ', '), $ForestName) + } + else + { + $setADForestParameters['UpnSuffixes'] = $null + Write-Verbose -Message ($script:localizedData.ClearUpnSuffix -f $ForestName) + } + } + + if ($PSBoundParameters.ContainsKey('UserPrincipalNameSuffixToAdd') -and + -not [system.string]::IsNullOrEmpty($UserPrincipalNameSuffixToAdd)) + { + $setADForestParameters['UpnSuffixes'] = @{ + Add = $($UserPrincipalNameSuffixToAdd) + } + + Write-Verbose -Message ($script:localizedData.AddUpnSuffix -f + ($UserPrincipalNameSuffixToAdd -join ', '), $ForestName) + } + + if ($PSBoundParameters.ContainsKey('UserPrincipalNameSuffixToRemove') -and + -not [system.string]::IsNullOrEmpty($UserPrincipalNameSuffixToRemove)) + { + if ($setADForestParameters['UpnSuffixes']) + { + $setADForestParameters['UpnSuffixes']['Remove'] = $($UserPrincipalNameSuffixToRemove) + } + else + { + $setADForestParameters['UpnSuffixes'] = @{ + Remove = $($UserPrincipalNameSuffixToRemove) + } + } + + Write-Verbose -Message ($script:localizedData.RemoveUpnSuffix -f + ($UserPrincipalNameSuffixToRemove -join ', '), $ForestName) + } + + # Only run Set-ADForest if a value needs updating + if ($setADForestParameters.count -gt 0) + { + if ($PSBoundParameters.ContainsKey('Credential')) + { + $setADForestParameters['Credential'] = $Credential + } + + $setADForestParameters['Identity'] = $ForestName + + Set-ADForest @setADForestParameters + } + + if ($PSBoundParameters.ContainsKey('TombstoneLifetime') -and + $TombstoneLifetime -ne $targetResource.TombstoneLifetime) + { + Write-Verbose -Message ($script:localizedData.SetTombstoneLifetime -f + $TombstoneLifetime, $ForestName) + + $configurationNamingContext = (Get-ADRootDSE).configurationNamingContext + $identity = "CN=Directory Service,CN=Windows NT,CN=Services,$configurationNamingContext" + + $setADObjectParameters = @{ + Identity = $identity + Partition = $configurationNamingContext + Replace = @{ + tombstonelifetime = $TombstoneLifetime + } + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $setADObjectParameters['Credential'] = $Credential + } + + try + { + Set-ADObject @setADObjectParameters + } + catch + { + $errorMessage = ($script:localizedData.SetTombstoneLifetimeError -f + $TombstoneLifetime, $ForestName) + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/MSFT_ADForestProperties.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/MSFT_ADForestProperties.schema.mof new file mode 100644 index 0000000..649954e --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/MSFT_ADForestProperties.schema.mof @@ -0,0 +1,13 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADForestProperties")] +class MSFT_ADForestProperties : OMI_BaseResource +{ + [Write, Description("Specifies the user account credentials to use to perform this task."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Key, Description("Specifies the target Active Directory forest for the change.")] String ForestName; + [Write, Description("Specifies the Service Principal Name (SPN) Suffix(es) to be explicitly defined in the forest and replace existing Service Principal Names. Cannot be used with ServicePrincipalNameSuffixToAdd or ServicePrincipalNameSuffixToRemove.")] String ServicePrincipalNameSuffix[]; + [Write, Description("Specifies the Service Principal Name (SPN) Suffix(es) to be added to the forest. Cannot be used with ServicePrincipalNameSuffix.")] String ServicePrincipalNameSuffixToAdd[]; + [Write, Description("Specifies the Service Principal Name (SPN) Suffix(es) to be removed from the forest. Cannot be used with ServicePrincipalNameSuffix.")] String ServicePrincipalNameSuffixToRemove[]; + [Write, Description("Specifies the AD Tombstone lifetime which determines how long deleted items exist in Active Directory before they are purged.")] Sint32 TombStoneLifetime; + [Write, Description("Specifies the User Principal Name (UPN) Suffix(es) to be explicitly defined in the forest and replace existing User Principal Names. Cannot be used with UserPrincipalNameSuffixToAdd or UserPrincipalNameSuffixToRemove.")] String UserPrincipalNameSuffix[]; + [Write, Description("Specifies the User Principal Name (UPN) Suffix(es) to be added to the forest. Cannot be used with UserPrincipalNameSuffix.")] String UserPrincipalNameSuffixToAdd[]; + [Write, Description("Specifies the User Principal Name (UPN) Suffix(es) to be removed from the forest. Cannot be used with UserPrincipalNameSuffix.")] String UserPrincipalNameSuffixToRemove[]; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/README.md new file mode 100644 index 0000000..68e767b --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/README.md @@ -0,0 +1,8 @@ +# Description + +The ADForestProperties DSC resource will manage forest wide settings within an Active Directory forest. +These include User Principal Name (UPN) suffixes, Service Principal Name (SPN) suffixes and the tombstone lifetime. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/en-US/MSFT_ADForestProperties.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/en-US/MSFT_ADForestProperties.strings.psd1 new file mode 100644 index 0000000..547d589 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/en-US/MSFT_ADForestProperties.strings.psd1 @@ -0,0 +1,17 @@ +# culture="en-US" +ConvertFrom-StringData @' + GetForest = Getting properties for forest '{0}'. (ADFP0001) + ForestUpnSuffixNotInDesiredState = User Principal Name Suffix for forest '{0}' not in the desired state. (ADFP0002) + ForestSpnSuffixNotInDesiredState = Service Principal Name Suffix for forest '{0}' not in the desired state. (ADFP0003) + AddSpnSuffix = Adding Service Principal Name Suffix: '{0}' for forest '{1}'. (ADFP0004) + RemoveSpnSuffix = Removing Service Principal Name Suffix: '{0}' for forest '{1}'. (ADFP0005) + ReplaceSpnSuffix = Replacing Service Principal Name Suffix with: '{0}' for forest '{1}'. (ADFP0006) + ClearSpnSuffix = Clearing Service Principal Name Suffix for forest '{0}'. (ADFP0007) + AddUpnSuffix = Adding User Principal Name Suffix: '{0}' for forest '{1}'. (ADFP0008) + RemoveUpnSuffix = Removing User Principal Name Suffix: '{0}' for forest '{1}'. (ADFP0009) + ReplaceUpnSuffix = Replacing User Principal Name Suffix with: '{0}' for forest '{1}'. (ADFP0010) + ClearUpnSuffix = Clearing User Principal Name Suffix for forest '{0}'. (ADFP0011) + TombstoneLifetimeNotInDesiredState = Tombstone lifetime for forest '{0}' not in the desired state. Current: '{1}', Expected: '{2}'. (ADFP0012) + SetTombstoneLifetime = Setting tombstone lifetime to '{0}' for forest '{1}. (ADFP0013) + SetTombstoneLifetimeError = Error setting tombstone lifetime to '{0}' for forest '{1}. (ADFP0014) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/en-US/about_ADForestProperties.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/en-US/about_ADForestProperties.help.txt new file mode 100644 index 0000000..8f2bb7b --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADForestProperties/en-US/about_ADForestProperties.help.txt @@ -0,0 +1,111 @@ +.NAME + ADForestProperties + +.DESCRIPTION + The ADForestProperties DSC resource will manage forest wide settings within an Active Directory forest. + These include User Principal Name (UPN) suffixes, Service Principal Name (SPN) suffixes and the tombstone lifetime. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER Credential + Write - PSCredential + Specifies the user account credentials to use to perform this task. + +.PARAMETER ForestName + Key - String + Specifies the target Active Directory forest for the change. + +.PARAMETER ServicePrincipalNameSuffix + Write - StringArray + Specifies the Service Principal Name (SPN) Suffix(es) to be explicitly defined in the forest and replace existing Service Principal Names. Cannot be used with ServicePrincipalNameSuffixToAdd or ServicePrincipalNameSuffixToRemove. + +.PARAMETER ServicePrincipalNameSuffixToAdd + Write - StringArray + Specifies the Service Principal Name (SPN) Suffix(es) to be added to the forest. Cannot be used with ServicePrincipalNameSuffix. + +.PARAMETER ServicePrincipalNameSuffixToRemove + Write - StringArray + Specifies the Service Principal Name (SPN) Suffix(es) to be removed from the forest. Cannot be used with ServicePrincipalNameSuffix. + +.PARAMETER TombStoneLifetime + Write - SInt32 + Specifies the AD Tombstone lifetime which determines how long deleted items exist in Active Directory before they are purged. + +.PARAMETER UserPrincipalNameSuffix + Write - StringArray + Specifies the User Principal Name (UPN) Suffix(es) to be explicitly defined in the forest and replace existing User Principal Names. Cannot be used with UserPrincipalNameSuffixToAdd or UserPrincipalNameSuffixToRemove. + +.PARAMETER UserPrincipalNameSuffixToAdd + Write - StringArray + Specifies the User Principal Name (UPN) Suffix(es) to be added to the forest. Cannot be used with UserPrincipalNameSuffix. + +.PARAMETER UserPrincipalNameSuffixToRemove + Write - StringArray + Specifies the User Principal Name (UPN) Suffix(es) to be removed from the forest. Cannot be used with UserPrincipalNameSuffix. + +.EXAMPLE 1 + +This configuration will manage the Service and User Principal name suffixes +in the forest by replacing any existing suffixes with the ones specified +in the configuration. + +Configuration ADForestProperties_ReplaceForestProperties_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node 'localhost' + { + ADForestProperties 'contoso.com' + { + ForestName = 'contoso.com' + UserPrincipalNameSuffix = 'fabrikam.com', 'industry.com' + ServicePrincipalNameSuffix = 'corporate.com' + } + } +} + +.EXAMPLE 2 + +This configuration will manage the Service and User Principal name suffixes in +the forest by adding and removing the desired suffixes. This will not overwrite +existing suffixes in the forest. + +Configuration ADForestProperties_AddRemoveForestProperties_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADForestProperties 'ContosoProperties' + { + ForestName = 'contoso.com' + ServicePrincipalNameSuffixToAdd = 'test.net' + ServicePrincipalNameSuffixToRemove = 'test.com' + UserPrincipalNameSuffixToAdd = 'cloudapp.net', 'fabrikam.com' + UserPrincipalNameSuffixToRemove = 'pester.net' + } + } +} + +.EXAMPLE 3 + +This configuration will manage the Tombstone Lifetime setting of the +Active Directory forest. + +Configuration ADForestProperties_AddRemoveForestProperties_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADForestProperties 'ContosoProperties' + { + ForestName = 'contoso.com' + TombstoneLifetime = 200 + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/MSFT_ADGroup.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/MSFT_ADGroup.psm1 new file mode 100644 index 0000000..723f0dc --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/MSFT_ADGroup.psm1 @@ -0,0 +1,853 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADGroup' + +<# + .SYNOPSIS + Returns the current state of the Active Directory group. + + .PARAMETER GroupName + Name of the Active Directory group. + + .PARAMETER GroupScope + Active Directory group scope. Default value is 'Global'. + + .PARAMETER Category + Active Directory group category. Default value is 'Security'. + + .PARAMETER Path + Location of the group within Active Directory expressed as a Distinguished Name. + + .PARAMETER Ensure + Specifies if this Active Directory group should be present or absent. + Default value is 'Present'. + + .PARAMETER Description + Description of the Active Directory group. + + .PARAMETER DisplayName + Display name of the Active Directory group. + + .PARAMETER Credential + Credentials used to enact the change upon. + + .PARAMETER DomainController + Active Directory domain controller to enact the change upon. + + .PARAMETER Members + Active Directory group membership should match membership exactly. + + .PARAMETER MembersToInclude + Active Directory group should include these members. + + .PARAMETER MembersToExclude + Active Directory group should NOT include these members. + + .PARAMETER MembershipAttribute + Active Directory attribute used to perform membership operations. + Default value is 'SamAccountName'. + + .PARAMETER ManagedBy + Active Directory managed by attribute specified as a DistinguishedName. + + .PARAMETER Notes + Active Directory group notes field. + + .PARAMETER RestoreFromRecycleBin + Try to restore the group from the recycle bin before creating a new one. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('DomainLocal', 'Global', 'Universal')] + [System.String] + $GroupScope = 'Global', + + [Parameter()] + [ValidateSet('Security', 'Distribution')] + [System.String] + $Category = 'Security', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateSet('SamAccountName', 'DistinguishedName', 'SID', 'ObjectGUID')] + [System.String] + $MembershipAttribute = 'SamAccountName', + + # This must be the user's DN + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ManagedBy, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Notes, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + $getTargetResourceReturnValue = @{ + Ensure = 'Absent' + GroupName = $GroupName + GroupScope = $null + Category = $null + Path = $null + Description = $null + DisplayName = $null + Members = @() + MembersToInclude = $MembersToInclude + MembersToExclude = $MembersToExclude + MembershipAttribute = $MembershipAttribute + ManagedBy = $null + Notes = $null + DistinguishedName = $null + } + + $commonParameters = Get-ADCommonParameters @PSBoundParameters + + try + { + $adGroup = Get-ADGroup @commonParameters -Properties @( + 'Name', + 'GroupScope', + 'GroupCategory', + 'DistinguishedName', + 'Description', + 'DisplayName', + 'ManagedBy', + 'Info' + ) + + Write-Verbose -Message ($script:localizedData.RetrievingGroupMembers -f $MembershipAttribute) + + if ($adGroup) + { + # Retrieve the current list of members, returning the specified membership attribute + [System.Array] $adGroupMembers = (Get-ADGroupMember @commonParameters).$MembershipAttribute + + $getTargetResourceReturnValue['Ensure'] = 'Present' + $getTargetResourceReturnValue['GroupName'] = $adGroup.Name + $getTargetResourceReturnValue['GroupScope'] = $adGroup.GroupScope + $getTargetResourceReturnValue['Category'] = $adGroup.GroupCategory + $getTargetResourceReturnValue['DistinguishedName'] = $adGroup.DistinguishedName + $getTargetResourceReturnValue['Path'] = Get-ADObjectParentDN -DN $adGroup.DistinguishedName + $getTargetResourceReturnValue['Description'] = $adGroup.Description + $getTargetResourceReturnValue['DisplayName'] = $adGroup.DisplayName + $getTargetResourceReturnValue['Members'] = $adGroupMembers + $getTargetResourceReturnValue['ManagedBy'] = $adGroup.ManagedBy + $getTargetResourceReturnValue['Notes'] = $adGroup.Info + } + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + Write-Verbose -Message ($script:localizedData.GroupNotFound -f $GroupName) + } + + return $getTargetResourceReturnValue +} #end function Get-TargetResource + +<# + .SYNOPSIS + Determines if the Active Directory group is in the desired state. + + .PARAMETER GroupName + Name of the Active Directory group. + + .PARAMETER GroupScope + Active Directory group scope. Default value is 'Global'. + + .PARAMETER Category + Active Directory group category. Default value is 'Security'. + + .PARAMETER Path + Location of the group within Active Directory expressed as a Distinguished Name. + + .PARAMETER Ensure + Specifies if this Active Directory group should be present or absent. + Default value is 'Present'. + + .PARAMETER Description + Description of the Active Directory group. + + .PARAMETER DisplayName + Display name of the Active Directory group. + + .PARAMETER Credential + Credentials used to enact the change upon. + + .PARAMETER DomainController + Active Directory domain controller to enact the change upon. + + .PARAMETER Members + Active Directory group membership should match membership exactly. + + .PARAMETER MembersToInclude + Active Directory group should include these members. + + .PARAMETER MembersToExclude + Active Directory group should NOT include these members. + + .PARAMETER MembershipAttribute + Active Directory attribute used to perform membership operations. + Default value is 'SamAccountName'. + + .PARAMETER ManagedBy + Active Directory managed by attribute specified as a DistinguishedName. + + .PARAMETER Notes + Active Directory group notes field. + + .PARAMETER RestoreFromRecycleBin + Try to restore the group from the recycle bin before creating a new one. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('DomainLocal', 'Global', 'Universal')] + [System.String] + $GroupScope = 'Global', + + [Parameter()] + [ValidateSet('Security', 'Distribution')] + [System.String] + $Category = 'Security', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateSet('SamAccountName', 'DistinguishedName', 'SID', 'ObjectGUID')] + [System.String] + $MembershipAttribute = 'SamAccountName', + + # This must be the user's DN + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ManagedBy, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Notes, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin + ) + + # Validate parameters before we even attempt to retrieve anything + $assertMemberParameters = @{} + + # Members parameter should always be tested to enforce an empty group (issue #189) + if ($PSBoundParameters.ContainsKey('Members')) + { + $assertMemberParameters['Members'] = $Members + } + + if ($PSBoundParameters.ContainsKey('MembersToInclude') -and -not [System.String]::IsNullOrEmpty($MembersToInclude)) + { + $assertMemberParameters['MembersToInclude'] = $MembersToInclude + } + + if ($PSBoundParameters.ContainsKey('MembersToExclude') -and -not [System.String]::IsNullOrEmpty($MembersToExclude)) + { + $assertMemberParameters['MembersToExclude'] = $MembersToExclude + } + + Assert-MemberParameters @assertMemberParameters + + $targetResource = Get-TargetResource @PSBoundParameters + + $targetResourceInCompliance = $true + + if ($PSBoundParameters.ContainsKey('GroupScope') -and $targetResource.GroupScope -ne $GroupScope) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f 'GroupScope', $GroupScope, $targetResource.GroupScope) + $targetResourceInCompliance = $false + } + + if ($PSBoundParameters.ContainsKey('Category') -and $targetResource.Category -ne $Category) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f 'Category', $Category, $targetResource.Category) + $targetResourceInCompliance = $false + } + + if ($Path -and ($targetResource.Path -ne $Path)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f 'Path', $Path, $targetResource.Path) + $targetResourceInCompliance = $false + } + + if ($Description -and ($targetResource.Description -ne $Description)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f 'Description', $Description, $targetResource.Description) + $targetResourceInCompliance = $false + } + + if ($DisplayName -and ($targetResource.DisplayName -ne $DisplayName)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f 'DisplayName', $DisplayName, $targetResource.DisplayName) + $targetResourceInCompliance = $false + } + + if ($ManagedBy -and ($targetResource.ManagedBy -ne $ManagedBy)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f 'ManagedBy', $ManagedBy, $targetResource.ManagedBy) + $targetResourceInCompliance = $false + } + + if ($Notes -and ($targetResource.Notes -ne $Notes)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f 'Notes', $Notes, $targetResource.Notes) + $targetResourceInCompliance = $false + } + + # Test group members match passed membership parameters + if (-not (Test-Members @assertMemberParameters -ExistingMembers $targetResource.Members)) + { + Write-Verbose -Message $script:localizedData.GroupMembershipNotDesiredState + $targetResourceInCompliance = $false + } + + if ($targetResource.Ensure -ne $Ensure) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f 'Ensure', $Ensure, $targetResource.Ensure) + $targetResourceInCompliance = $false + } + + return $targetResourceInCompliance +} #end function Test-TargetResource + +<# + .SYNOPSIS + Creates, removes or modifies the Active Directory group. + + .PARAMETER GroupName + Name of the Active Directory group. + + .PARAMETER GroupScope + Active Directory group scope. Default value is 'Global'. + + .PARAMETER Category + Active Directory group category. Default value is 'Security'. + + .PARAMETER Path + Location of the group within Active Directory expressed as a Distinguished Name. + + .PARAMETER Ensure + Specifies if this Active Directory group should be present or absent. + Default value is 'Present'. + + .PARAMETER Description + Description of the Active Directory group. + + .PARAMETER DisplayName + Display name of the Active Directory group. + + .PARAMETER Credential + Credentials used to enact the change upon. + + .PARAMETER DomainController + Active Directory domain controller to enact the change upon. + + .PARAMETER Members + Active Directory group membership should match membership exactly. + + .PARAMETER MembersToInclude + Active Directory group should include these members. + + .PARAMETER MembersToExclude + Active Directory group should NOT include these members. + + .PARAMETER MembershipAttribute + Active Directory attribute used to perform membership operations. + Default value is 'SamAccountName'. + + .PARAMETER ManagedBy + Active Directory managed by attribute specified as a DistinguishedName. + + .PARAMETER Notes + Active Directory group notes field. + + .PARAMETER RestoreFromRecycleBin + Try to restore the group from the recycle bin before creating a new one. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('DomainLocal', 'Global', 'Universal')] + [System.String] + $GroupScope = 'Global', + + [Parameter()] + [ValidateSet('Security', 'Distribution')] + [System.String] + $Category = 'Security', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateSet('SamAccountName', 'DistinguishedName', 'SID', 'ObjectGUID')] + [System.String] + $MembershipAttribute = 'SamAccountName', + + # This must be the user's DN + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ManagedBy, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Notes, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin + + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + $assertMemberParameters = @{} + + # Members parameter should always be added to enforce an empty group (issue #189) + if ($PSBoundParameters.ContainsKey('Members')) + { + $assertMemberParameters['Members'] = $Members + } + + if ($PSBoundParameters.ContainsKey('MembersToInclude') -and -not [System.String]::IsNullOrEmpty($MembersToInclude)) + { + $assertMemberParameters['MembersToInclude'] = $MembersToInclude + } + + if ($PSBoundParameters.ContainsKey('MembersToExclude') -and -not [System.String]::IsNullOrEmpty($MembersToExclude)) + { + $assertMemberParameters['MembersToExclude'] = $MembersToExclude + } + + Assert-MemberParameters @assertMemberParameters + + $membersInMultipleDomains = $false + + if ($MembershipAttribute -eq 'DistinguishedName') + { + $allMembers = $Members + $MembersToInclude + $MembersToExclude + + $groupMemberDomains = @() + + foreach ($member in $allMembers) + { + $groupMemberDomains += Get-ADDomainNameFromDistinguishedName -DistinguishedName $member + } + + $uniqueGroupMemberDomainCount = $groupMemberDomains | + Select-Object -Unique + + $GroupMemberDomainCount = $uniqueGroupMemberDomainCount.count + + if ($GroupMemberDomainCount -gt 1 -or ($groupMemberDomains -ine (Get-DomainName)).Count -gt 0) + { + Write-Verbose -Message ($script:localizedData.GroupMembershipMultipleDomains -f $GroupMemberDomainCount) + $membersInMultipleDomains = $true + } + } + + $commonParameters = Get-ADCommonParameters @PSBoundParameters + + $getTargetResourceResult = Get-TargetResource @PSBoundParameters + + if ($getTargetResourceResult.Ensure -eq 'Present') + { + if ($Ensure -eq 'Present') + { + $setADGroupParams = $commonParameters.Clone() + $setADGroupParams['Identity'] = $getTargetResourceResult.DistinguishedName + + # Update existing group properties + if ($PSBoundParameters.ContainsKey('Category') -and $Category -ne $getTargetResourceResult.Category) + { + Write-Verbose -Message ($script:localizedData.UpdatingGroupProperty -f 'Category', $Category) + + $setADGroupParams['GroupCategory'] = $Category + } + + if ($PSBoundParameters.ContainsKey('GroupScope') -and $GroupScope -ne $getTargetResourceResult.GroupScope) + { + # Cannot change DomainLocal to Global or vice versa directly. Need to change them to a Universal group first! + Set-ADGroup -Identity $getTargetResourceResult.DistinguishedName -GroupScope 'Universal' -ErrorAction 'Stop' + + Write-Verbose -Message ($script:localizedData.UpdatingGroupProperty -f 'GroupScope', $GroupScope) + + $setADGroupParams['GroupScope'] = $GroupScope + } + + if ($Description -and ($Description -ne $getTargetResourceResult.Description)) + { + Write-Verbose -Message ($script:localizedData.UpdatingGroupProperty -f 'Description', $Description) + + $setADGroupParams['Description'] = $Description + } + + if ($DisplayName -and ($DisplayName -ne $getTargetResourceResult.DisplayName)) + { + Write-Verbose -Message ($script:localizedData.UpdatingGroupProperty -f 'DisplayName', $DisplayName) + + $setADGroupParams['DisplayName'] = $DisplayName + } + + if ($ManagedBy -and ($ManagedBy -ne $getTargetResourceResult.ManagedBy)) + { + Write-Verbose -Message ($script:localizedData.UpdatingGroupProperty -f 'ManagedBy', $ManagedBy) + + $setADGroupParams['ManagedBy'] = $ManagedBy + } + + if ($Notes -and ($Notes -ne $getTargetResourceResult.Notes)) + { + Write-Verbose -Message ($script:localizedData.UpdatingGroupProperty -f 'Notes', $Notes) + + $setADGroupParams['Replace'] = @{ + Info = $Notes + } + } + + Write-Verbose -Message ($script:localizedData.UpdatingGroup -f $GroupName) + + Set-ADGroup @setADGroupParams -ErrorAction 'Stop' + + $groupParentDistinguishedName = Get-ADObjectParentDN -DN $getTargetResourceResult.DistinguishedName + + # Move group if the path is not correct + if ($Path -and $Path -ne $groupParentDistinguishedName) + { + Write-Verbose -Message ($script:localizedData.MovingGroup -f $GroupName, $Path) + + $moveADObjectParams = $commonParameters.Clone() + $moveADObjectParams['Identity'] = $getTargetResourceResult.DistinguishedName + $moveADObjectParams['TargetPath'] = $Path + $moveADObjectParams['ErrorAction'] = 'Stop' + + Move-ADObject @moveADObjectParams + } + + if ($assertMemberParameters.Count -gt 0) + { + Write-Verbose -Message ($script:localizedData.RetrievingGroupMembers -f $MembershipAttribute) + + $adGroupMembers = (Get-ADGroupMember @commonParameters).$MembershipAttribute + + $assertMemberParameters['ExistingMembers'] = $adGroupMembers + + # Return $false if the members mismatch. + if (-not (Test-Members @assertMemberParameters)) + { + # Members parameter should always be enforce if it is bound (issue #189) + if ($PSBoundParameters.ContainsKey('Members')) + { + # Remove all existing first and add explicit members + $Members = Remove-DuplicateMembers -Members $Members + + # We can only remove members if there are members already in the group! + if ($adGroupMembers.Count -gt 0) + { + Write-Verbose -Message ($script:localizedData.RemovingGroupMembers -f $adGroupMembers.Count, $GroupName) + + Remove-ADGroupMember @commonParameters -Members $adGroupMembers -Confirm:$false -ErrorAction 'Stop' + } + + Write-Verbose -Message ($script:localizedData.AddingGroupMembers -f $Members.Count, $GroupName) + + Add-ADCommonGroupMember -Parameters $commonParameters -Members $Members -MembersInMultipleDomains:$membersInMultipleDomains + } + + if ($PSBoundParameters.ContainsKey('MembersToInclude') -and -not [System.String]::IsNullOrEmpty($MembersToInclude)) + { + $MembersToInclude = Remove-DuplicateMembers -Members $MembersToInclude + + Write-Verbose -Message ($script:localizedData.AddingGroupMembers -f $MembersToInclude.Count, $GroupName) + + Add-ADCommonGroupMember -Parameters $commonParameters -Members $MembersToInclude -MembersInMultipleDomains:$membersInMultipleDomains + } + + if ($PSBoundParameters.ContainsKey('MembersToExclude') -and -not [System.String]::IsNullOrEmpty($MembersToExclude)) + { + $MembersToExclude = Remove-DuplicateMembers -Members $MembersToExclude + + Write-Verbose -Message ($script:localizedData.RemovingGroupMembers -f $MembersToExclude.Count, $GroupName) + + Remove-ADGroupMember @commonParameters -Members $MembersToExclude -Confirm:$false -ErrorAction 'Stop' + } + } + } + } + elseif ($Ensure -eq 'Absent') + { + # Remove existing group + Write-Verbose -Message ($script:localizedData.RemovingGroup -f $GroupName) + + Remove-ADGroup @commonParameters -Confirm:$false -ErrorAction 'Stop' + } + } + else + { + # The Active Directory group does not exist, check if it should. + if ($Ensure -eq 'Present') + { + $commonParametersUsingName = Get-ADCommonParameters @PSBoundParameters -UseNameParameter + + $newAdGroupParameters = $commonParametersUsingName.Clone() + $newAdGroupParameters['GroupCategory'] = $Category + $newAdGroupParameters['GroupScope'] = $GroupScope + + if ($PSBoundParameters.ContainsKey('Description')) + { + $newAdGroupParameters['Description'] = $Description + } + + if ($PSBoundParameters.ContainsKey('DisplayName')) + { + $newAdGroupParameters['DisplayName'] = $DisplayName + } + + if ($PSBoundParameters.ContainsKey('ManagedBy')) + { + $newAdGroupParameters['ManagedBy'] = $ManagedBy + } + + if ($PSBoundParameters.ContainsKey('Path')) + { + $newAdGroupParameters['Path'] = $Path + } + + $adGroup = $null + + # Create group. Try to restore account first if it exists. + if ($RestoreFromRecycleBin) + { + Write-Verbose -Message ($script:localizedData.RestoringGroup -f $GroupName) + + $restoreParams = Get-ADCommonParameters @PSBoundParameters + + $adGroup = Restore-ADCommonObject @restoreParams -ObjectClass 'Group' + } + + <# + Check if the Active Directory group was restored, if not create + the group. + #> + if (-not $adGroup) + { + Write-Verbose -Message ($script:localizedData.AddingGroup -f $GroupName) + + $adGroup = New-ADGroup @newAdGroupParameters -PassThru -ErrorAction 'Stop' + } + + <# + Only the New-ADGroup cmdlet takes a -Name parameter. Refresh + the parameters with the -Identity parameter rather than -Name. + #> + $commonParameters = Get-ADCommonParameters @PSBoundParameters + + if ($PSBoundParameters.ContainsKey('Notes')) + { + # Can't set the Notes field when creating the group + Write-Verbose -Message ($script:localizedData.UpdatingGroupProperty -f 'Notes', $Notes) + + $setADGroupParams = $commonParameters.Clone() + $setADGroupParams['Identity'] = $adGroup.DistinguishedName + $setADGroupParams['ErrorAction'] = 'Stop' + $setADGroupParams['Add'] = @{ + Info = $Notes + } + + Set-ADGroup @setADGroupParams + } + + # Add the required members + if ($PSBoundParameters.ContainsKey('Members') -and -not [System.String]::IsNullOrEmpty($Members)) + { + $Members = Remove-DuplicateMembers -Members $Members + + Write-Verbose -Message ($script:localizedData.AddingGroupMembers -f $Members.Count, $GroupName) + + Add-ADCommonGroupMember -Parameters $commonParameters -Members $Members -MembersInMultipleDomains:$membersInMultipleDomains + } + elseif ($PSBoundParameters.ContainsKey('MembersToInclude') -and -not [System.String]::IsNullOrEmpty($MembersToInclude)) + { + $MembersToInclude = Remove-DuplicateMembers -Members $MembersToInclude + + Write-Verbose -Message ($script:localizedData.AddingGroupMembers -f $MembersToInclude.Count, $GroupName) + + Add-ADCommonGroupMember -Parameters $commonParameters -Members $MembersToInclude -MembersInMultipleDomains:$membersInMultipleDomains + } + } + } #end catch +} #end function Set-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/MSFT_ADGroup.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/MSFT_ADGroup.schema.mof new file mode 100644 index 0000000..7021d37 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/MSFT_ADGroup.schema.mof @@ -0,0 +1,21 @@ +[ClassVersion("1.0.1.0"), FriendlyName("ADGroup")] +class MSFT_ADGroup : OMI_BaseResource +{ + [Key, Description("Name of the Active Directory group.")] String GroupName; + [Write, Description("Active Directory group scope. Default value is 'Global'."), ValueMap{"DomainLocal","Global","Universal"}, Values{"DomainLocal","Global","Universal"}] String GroupScope; + [Write, Description("Active Directory group category. Default value is 'Security'."), ValueMap{"Security","Distribution"}, Values{"Security","Distribution"}] String Category; + [Write, Description("Location of the group within Active Directory expressed as a Distinguished Name.")] String Path; + [Write, Description("Specifies if this Active Directory group should be present or absent. Default value is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Description of the Active Directory group.")] String Description; + [Write, Description("Display name of the Active Directory group.")] String DisplayName; + [Write, Description("Credentials used to enact the change upon."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Active Directory domain controller to enact the change upon.")] String DomainController; + [Write, Description("Active Directory group membership should match membership exactly.")] String Members[]; + [Write, Description("Active Directory group should include these members.")] String MembersToInclude[]; + [Write, Description("Active Directory group should NOT include these members.")] String MembersToExclude[]; + [Write, Description("Active Directory attribute used to perform membership operations. Default value is 'SamAccountName'."), ValueMap{"SamAccountName","DistinguishedName","ObjectGUID","SID"}, Values{"SamAccountName","DistinguishedName","ObjectGUID","SID"}] String MembershipAttribute; + [Write, Description("Active Directory managed by attribute specified as a DistinguishedName.")] String ManagedBy; + [Write, Description("Active Directory group notes field.")] String Notes; + [Write, Description("Try to restore the group from the recycle bin before creating a new one.")] Boolean RestoreFromRecycleBin; + [Read, Description("Returns the distinguished name of the Active Directory group.")] String DistinguishedName; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/README.md new file mode 100644 index 0000000..ef2dd48 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/README.md @@ -0,0 +1,11 @@ +# Description + +The ADGroup DSC resource will manage groups within Active Directory. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. +* The parameter `RestoreFromRecycleBin` requires that the feature Recycle + Bin has been enabled prior to an object is deleted. If the feature + Recycle Bin is disabled then the property `msDS-LastKnownRDN` is not + added the deleted object. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/en-US/MSFT_ADGroup.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/en-US/MSFT_ADGroup.strings.psd1 new file mode 100644 index 0000000..7194ef5 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/en-US/MSFT_ADGroup.strings.psd1 @@ -0,0 +1,16 @@ +# culture="en-US" +ConvertFrom-StringData @' + RetrievingGroupMembers = Retrieving group membership based on '{0}' property. (ADG0001) + GroupMembershipNotDesiredState = Group membership is NOT in the desired state. (ADG0002) + AddingGroupMembers = Adding '{0}' member(s) to AD group '{1}'. (ADG0003) + RemovingGroupMembers = Removing '{0}' member(s) from AD group '{1}'. (ADG0004) + AddingGroup = Creating AD Group '{0}'. (ADG0005) + UpdatingGroup = Updating AD Group '{0}'. (ADG0006) + RemovingGroup = Removing AD Group '{0}'. (ADG0007) + MovingGroup = Moving AD Group '{0}' to '{1}'. (ADG0008) + RestoringGroup = Attempting to restore the group {0} from recycle bin. (ADG0009) + GroupNotFound = AD Group '{0}' was not found. (ADG00010) + NotDesiredPropertyState = AD Group '{0}' is not correct. Expected '{1}', actual '{2}'. (ADG0011) + UpdatingGroupProperty = Updating AD Group property '{0}' to '{1}'. (ADG0012) + GroupMembershipMultipleDomains = Group membership objects are in '{0}' different AD Domains. (ADG0013) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/en-US/about_ADGroup.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/en-US/about_ADGroup.help.txt new file mode 100644 index 0000000..ee212c3 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADGroup/en-US/about_ADGroup.help.txt @@ -0,0 +1,171 @@ +.NAME + ADGroup + +.DESCRIPTION + The ADGroup DSC resource will manage groups within Active Directory. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + * The parameter `RestoreFromRecycleBin` requires that the feature Recycle + Bin has been enabled prior to an object is deleted. If the feature + Recycle Bin is disabled then the property `msDS-LastKnownRDN` is not + added the deleted object. + +.PARAMETER GroupName + Key - String + Name of the Active Directory group. + +.PARAMETER GroupScope + Write - String + Allowed values: DomainLocal, Global, Universal + Active Directory group scope. Default value is 'Global'. + +.PARAMETER Category + Write - String + Allowed values: Security, Distribution + Active Directory group category. Default value is 'Security'. + +.PARAMETER Path + Write - String + Location of the group within Active Directory expressed as a Distinguished Name. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if this Active Directory group should be present or absent. Default value is 'Present'. + +.PARAMETER Description + Write - String + Description of the Active Directory group. + +.PARAMETER DisplayName + Write - String + Display name of the Active Directory group. + +.PARAMETER Credential + Write - PSCredential + Credentials used to enact the change upon. + +.PARAMETER DomainController + Write - String + Active Directory domain controller to enact the change upon. + +.PARAMETER Members + Write - StringArray + Active Directory group membership should match membership exactly. + +.PARAMETER MembersToInclude + Write - StringArray + Active Directory group should include these members. + +.PARAMETER MembersToExclude + Write - StringArray + Active Directory group should NOT include these members. + +.PARAMETER MembershipAttribute + Write - String + Allowed values: SamAccountName, DistinguishedName, ObjectGUID, SID + Active Directory attribute used to perform membership operations. Default value is 'SamAccountName'. + +.PARAMETER ManagedBy + Write - String + Active Directory managed by attribute specified as a DistinguishedName. + +.PARAMETER Notes + Write - String + Active Directory group notes field. + +.PARAMETER RestoreFromRecycleBin + Write - Boolean + Try to restore the group from the recycle bin before creating a new one. + +.PARAMETER DistinguishedName + Read - String + Returns the distinguished name of the Active Directory group. + +.EXAMPLE 1 + +This configuration will create a new domain-local group + +Configuration ADGroup_NewGroup_Config +{ + param + ( + [parameter(Mandatory = $true)] + [System.String] + $GroupName, + + [ValidateSet('DomainLocal', 'Global', 'Universal')] + [System.String] + $Scope = 'Global', + + [ValidateSet('Security', 'Distribution')] + [System.String] + $Category = 'Security', + + [ValidateNotNullOrEmpty()] + [System.String] + $Description + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADGroup 'ExampleGroup' + { + GroupName = $GroupName + GroupScope = $Scope + Category = $Category + Description = $Description + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will create a new domain-local group with three members. + +Configuration ADGroup_NewGroupWithMembers_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADGroup 'dl1' + { + GroupName = 'DL_APP_1' + GroupScope = 'DomainLocal' + Members = 'john', 'jim', 'sally' + } + } +} + +.EXAMPLE 3 + +This configuration will create a new domain-local group in contoso with +three members in different domains. + +Configuration ADGroup_NewGroupMultiDomainMembers_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADGroup 'dl1' + { + GroupName = 'DL_APP_1' + GroupScope = 'DomainLocal' + MembershipAttribute = 'DistinguishedName' + Members = @( + 'CN=john,OU=Accounts,DC=contoso,DC=com' + 'CN=jim,OU=Accounts,DC=subdomain,DC=contoso,DC=com' + 'CN=sally,OU=Accounts,DC=anothersub,DC=contoso,DC=com' + ) + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/MSFT_ADKDSKey.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/MSFT_ADKDSKey.psm1 new file mode 100644 index 0000000..73a337e --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/MSFT_ADKDSKey.psm1 @@ -0,0 +1,516 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADKDSKey' + +<# + .SYNOPSIS + Gets the specified KDS root key + + .PARAMETER EffectiveTime + Specifies the Effective time when a KDS root key can be used. + There is a 10 hour minimum from creation date to allow active directory + to properly replicate across all domain controllers. For this reason, + the date must be set in the future for creation.While this parameter + accepts a string, it will be converted into a DateTime object. + This will also try to take into account cultural settings. + + Example: + '05/01/1999 13:00' using default or 'en-US' culture would be May 1st, + but using 'de-DE' culture would be 5th of January. The culture is + automatically pulled from the operating system and this can be checked + using 'Get-Culture' +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EffectiveTime + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + $targetResource = @{ + EffectiveTime = $EffectiveTime + CreationTime = $null + KeyId = $null + Ensure = $null + DistinguishedName = $null + } + + Write-Verbose -Message ($script:localizedData.RetrievingKDSRootKey -f $EffectiveTime) + + try + { + $effectiveTimeObject = [DateTime]::Parse($EffectiveTime) + } + catch + { + $errorMessage = $script:localizedData.EffectiveTimeInvalid -f $EffectiveTime + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + $currentUser = Get-CurrentUser + if (-not (Assert-HasDomainAdminRights -User $currentUser)) + { + $errorMessage = $script:localizedData.IncorrectPermissions -f $currentUser.Name + New-InvalidResultException -Message $errorMessage + } + + try + { + $kdsRootKeys = Get-KdsRootKey + } + catch + { + $errorMessage = $script:localizedData.RetrievingKDSRootKeyError -f $EffectiveTime + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + $kdsRootKey = $null + if ($kdsRootKeys) + { + $kdsRootKey = $kdsRootKeys.GetEnumerator() | + Where-Object -FilterScript { + [DateTime]::Parse($_.EffectiveTime) -eq $effectiveTimeObject + } + } + + if (-not $kdsRootKey) + { + $targetResource['Ensure'] = 'Absent' + } + else + { + Write-Verbose -Message ($script:localizedData.FoundKDSRootKey -f $EffectiveTime) + if ($kdsRootKeys.Count -gt 1) + { + Write-Warning -Message ($script:localizedData.FoundKDSRootKeyMultiple) + } + + if ($kdsRootKey.Count -gt 1) + { + $errorMessage = $script:localizedData.FoundKDSRootKeySameEffectiveTime -f $EffectiveTime + New-InvalidOperationException -Message $errorMessage + } + elseif ($kdsRootKey) + { + $targetResource['Ensure'] = 'Present' + $targetResource['EffectiveTime'] = ([DateTime]::Parse($kdsRootKey.EffectiveTime)).ToString() + $targetResource['CreationTime'] = $kdsRootKey.CreationTime + $targetResource['KeyId'] = $kdsRootKey.KeyId + $targetResource['DistinguishedName'] = 'CN={0},CN=Master Root Keys,CN=Group Key Distribution Service,CN=Services,CN=Configuration,{1}' -f + $kdsRootKey.KeyId, (Get-ADRootDomainDN) + } + } + + return $targetResource +} + +<# + .SYNOPSIS + Creates or deletes the KDS root Key + + .PARAMETER EffectiveTime + Specifies the Effective time when a KDS root key can be used. + There is a 10 hour minimum from creation date to allow active directory + to properly replicate across all domain controllers. For this reason, + the date must be set in the future for creation.While this parameter + accepts a string, it will be converted into a DateTime object. + This will also try to take into account cultural settings. + + Example: + '05/01/1999 13:00' using default or 'en-US' culture would be May 1st, + but using 'de-DE' culture would be 5th of January. The culture is + automatically pulled from the operating system and this can be checked + using 'Get-Culture' + + .PARAMETER AllowUnsafeEffectiveTime + This option will allow you to create a KDS root key if EffectiveTime is set in the past. + This may cause issues if you are creating a Group Managed Service Account right + after you create the KDS Root Key. In order to get around this, you must create + the KDS Root Key using a date in the past. This should be used at your own risk + and should only be used in lab environments. + + .PARAMETER Ensure + Specifies if this KDS Root Key should be present or absent + + .PARAMETER ForceRemove + This option will allow you to remove a KDS root key if there is only one key left. + It should not break your Group Managed Service Accounts (gMSAs), but if the gMSA + password expires and it needs to request a new password, it will not be able to + generate a new password until a new KDS Root Key is installed and ready for use. + Because of this, the last KDS Root Key will not be removed unless this option is specified +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EffectiveTime, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Boolean] + $AllowUnsafeEffectiveTime, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Boolean] + $ForceRemove + ) + + $getTargetResourceParameters = @{ + EffectiveTime = $EffectiveTime + Ensure = $Ensure + } + + $compareTargetResourceNonCompliant = Compare-TargetResourceState @getTargetResourceParameters | + Where-Object -FilterScript { + $_.Pass -eq $false + } + + $ensureState = $compareTargetResourceNonCompliant | + Where-Object -FilterScript { + $_.Parameter -eq 'Ensure' + } + + if ($ensureState) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyState -f + 'Ensure', $EffectiveTime, $ensureState.Expected, $ensureState.Actual) + Write-Verbose -Message ($script:localizedData.KDSRootKeyNotInDesiredState -f $EffectiveTime) + return $false + } + else + { + Write-Verbose -Message ($script:localizedData.KDSRootKeyInDesiredState -f $EffectiveTime) + return $true + } +} + +<# + .SYNOPSIS + Creates or deletes the KDS root Key + + .PARAMETER EffectiveTime + Specifies the Effective time when a KDS root key can be used. + There is a 10 hour minimum from creation date to allow active directory + to properly replicate across all domain controllers. For this reason, + the date must be set in the future for creation.While this parameter + accepts a string, it will be converted into a DateTime object. + This will also try to take into account cultural settings. + + Example: + '05/01/1999 13:00' using default or 'en-US' culture would be May 1st, + but using 'de-DE' culture would be 5th of January. The culture is + automatically pulled from the operating system and this can be checked + using 'Get-Culture' + + .PARAMETER AllowUnsafeEffectiveTime + This option will allow you to create a KDS root key if EffectiveTime is set in the past. + This may cause issues if you are creating a Group Managed Service Account right + after you create the KDS Root Key. In order to get around this, you must create + the KDS Root Key using a date in the past. This should be used at your own risk + and should only be used in lab environments. + + .PARAMETER Ensure + Specifies if this KDS Root Key should be present or absent + + .PARAMETER ForceRemove + This option will allow you to remove a KDS root key if there is only one key left. + It should not break your Group Managed Service Accounts (gMSAs), but if the gMSA + password expires and it needs to request a new password, it will not be able to + generate a new password until a new KDS Root Key is installed and ready for use. + Because of this, the last KDS Root Key will not be removed unless this option is specified +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EffectiveTime, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Boolean] + $AllowUnsafeEffectiveTime, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Boolean] + $ForceRemove + ) + + $getTargetResourceParameters = @{ + EffectiveTime = $EffectiveTime + Ensure = $Ensure + } + + $compareTargetResource = Compare-TargetResourceState @getTargetResourceParameters + $ensureState = $compareTargetResource | + Where-Object -FilterScript { + $_.Parameter -eq 'Ensure' + } + + # Ensure is not in proper state + if ($ensureState.Pass -eq $false) + { + if ($Ensure -eq 'Present') + { + try + { + $effectiveTimeObject = [DateTime]::Parse($EffectiveTime) + } + catch + { + $errorMessage = $script:localizedData.EffectiveTimeInvalid -f $EffectiveTime + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + $currentDateTimeObject = Get-Date + + # We want the key to be present, but it currently does not exist + if ($effectiveTimeObject -le $currentDateTimeObject -and + $PSBoundParameters.ContainsKey('AllowUnsafeEffectiveTime') -and $AllowUnsafeEffectiveTime) + { + Write-Warning -Message ($script:localizedData.AddingKDSRootKeyDateInPast -f $EffectiveTime) + } + elseif ($effectiveTimeObject -le $currentDateTimeObject) + { + <# + Effective time is in the past and we don't have AllowUnsafeEffectiveTime set + to enabled, so we exit with an error + #> + $errorMessage = $script:localizedData.AddingKDSRootKeyError -f $EffectiveTime + New-InvalidOperationException -Message $errorMessage + } + else + { + Write-Verbose -Message ($script:localizedData.AddingKDSRootKey -f $EffectiveTime) + } + + <# + EffectiveTime appears to expect a UTC datetime, so we are converting + it to UTC before adding. Get-KDSRootKey will return the wrong time if we + don't convert first + #> + try + { + Add-KDSRootKey -EffectiveTime $effectiveTimeObject.ToUniversalTime() + } + catch + { + $errorMessage = $script:localizedData.KDSRootKeyAddError -f $EffectiveTime + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + elseif ($Ensure -eq 'Absent') + { + # We want the account to be Absent, but it is Present + if ((Get-KdsRootKey).Count -gt 1) + { + Write-Verbose -Message ($script:localizedData.RemovingKDSRootKey -f $EffectiveTime) + } + else + { + if ($PSBoundParameters.ContainsKey('ForceRemove') -and $ForceRemove) + { + Write-Verbose -Message ($script:localizedData.RemovingKDSRootKey -f $EffectiveTime) + Write-Warning -Message ($script:localizedData.NotEnoughKDSRootKeysPresent -f $EffectiveTime) + } + else + { + $errorMessage = $script:localizedData.NotEnoughKDSRootKeysPresentNoForce -f $EffectiveTime + New-InvalidOperationException -Message $errorMessage + } + } + + $distinguishedName = $compareTargetResource | + Where-Object -FilterScript { $_.Parameter -eq 'DistinguishedName' } + + try + { + Remove-ADObject -Identity $distinguishedName.Actual -Confirm:$false + } + catch + { + $errorMessage = $script:localizedData.KDSRootKeyRemoveError -f $EffectiveTime + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + } +} + +<# + .SYNOPSIS + Compares the state of the KDS root key + + .PARAMETER EffectiveTime + Specifies the Effective time when a KDS root key can be used. + There is a 10 hour minimum from creation date to allow active directory + to properly replicate across all domain controllers. For this reason, + the date must be set in the future for creation. While this parameter + accepts a string, it will be converted into a DateTime object. + This will also try to take into account cultural settings. + + Example: + '05/01/1999 13:00' using default or 'en-US' culture would be May 1st, + but using 'de-DE' culture would be 5th of January. The culture is + automatically pulled from the operating system and this can be checked + using 'Get-Culture' + + .PARAMETER Ensure + Specifies if this KDS Root Key should be present or absent + +#> +function Compare-TargetResourceState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EffectiveTime, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure + ) + + $getTargetResourceParameters = @{ + EffectiveTime = $EffectiveTime + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + $compareTargetResource = @() + + # Add DistinguishedName as it won't be passed as an argument, but we want to get the DN in Set + $PSBoundParameters['DistinguishedName'] = $getTargetResourceResult['DistinguishedName'] + + # Convert EffectiveTime to DateTime object for comparison + $PSBoundParameters['EffectiveTime'] = [DateTime]::Parse($EffectiveTime) + $getTargetResourceResult['EffectiveTime'] = [DateTime]::Parse($getTargetResourceResult.EffectiveTime) + + foreach ($parameter in $PSBoundParameters.Keys) + { + if ($PSBoundParameters.$parameter -eq $getTargetResourceResult.$parameter) + { + # Check if parameter is in compliance + $compareTargetResource += [pscustomobject] @{ + Parameter = $parameter + Expected = $PSBoundParameters.$parameter + Actual = $getTargetResourceResult.$parameter + Pass = $true + } + } + # Need to check if parameter is part of schema, otherwise ignore all other parameters like verbose + elseif ($getTargetResourceResult.ContainsKey($parameter)) + { + <# + We are out of compliance if we get here + $PSBoundParameters.$parameter -ne $getTargetResourceResult.$parameter + #> + $compareTargetResource += [pscustomobject] @{ + Parameter = $parameter + Expected = $PSBoundParameters.$parameter + Actual = $getTargetResourceResult.$parameter + Pass = $false + } + } + } #end foreach PSBoundParameter + + return $compareTargetResource +} + +<# + .SYNOPSIS + Checks permissions to see if the user or computer has domain admin permissions. + + .DESCRIPTION + DSC Resources run under the SYSTEM user context and there is no Credential parameter + to pass to the KDSRootKey powershell commands. For this reason, we need to check + permissions manually, otherwise we get back empty results with no error. One must use + PsDscRunAsCredential or run this resource on the domain controller + + .PARAMETER User + The user to check permissions against + + .NOTES + Get-KdsRootKey will return $null instead of a permission error if it can't retrieve the keys + so we need manually check +#> +function Assert-HasDomainAdminRights +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Security.Principal.WindowsIdentity] + $User + ) + + $windowsPrincipal = New-Object -TypeName 'System.Security.Principal.WindowsPrincipal' -ArgumentList @($User) + $osInfo = Get-CimInstance -ClassName Win32_OperatingSystem + + Write-Verbose -Message ($script:localizedData.CheckingDomainAdminUserRights -f $User.Name) + Write-Verbose -Message ($script:localizedData.CheckingDomainAdminComputerRights -f $osInfo.CSName, $osInfo.ProductType) + + return $windowsPrincipal.IsInRole("Domain Admins") -or + $windowsPrincipal.IsInRole("Enterprise Admins") -or + $osInfo.ProductType -eq 2 +} + +<# + .SYNOPSIS + Returns a string with the Distinguished Name of the root domain. + + .DESCRIPTION + If you have a domain with sub-domains, this will return the root domain name. For example, + if you had a domain contoso.com and a sub domain of fake.contoso.com, it would return + contoso.com. + + This is used to get the Forest level root domain name. The KDS Root Key is created at the forest + level and this is used to determine it's distinguished name +#> +function Get-ADRootDomainDN +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + $rootDomainDN = (New-Object -TypeName System.DirectoryServices.DirectoryEntry('LDAP://RootDSE')).Get('rootDomainNamingContext') + Write-Verbose -Message ($script:localizedData.RetrievedRootDomainDN -f $rootDomainDN) + return $rootDomainDN +} + +Export-ModuleMember *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/MSFT_ADKDSKey.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/MSFT_ADKDSKey.schema.mof new file mode 100644 index 0000000..50ea5f4 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/MSFT_ADKDSKey.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.1.0"), FriendlyName("ADKDSKey")] +class MSFT_ADKDSKey : OMI_BaseResource +{ + [Key, Description("Specifies the Effective time when a KDS root key can be used. There is a 10 hour minimum from creation date to allow active directory to properly replicate across all domain controllers. For this reason, the date must be set in the future for creation. While this parameter accepts a string, it will be converted into a DateTime object. This will also try to take into account cultural settings. Example: '05/01/1999 13:00 using default or 'en-US' culture would be May 1st, but using 'de-DE' culture would be 5th of January. The culture is automatically pulled from the operating system and this can be checked using 'Get-Culture'.")] String EffectiveTime; + [Write, Description("Specifies if this KDS Root Key should be present or absent. Default value is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("This option will allow you to create a KDS root key if EffectiveTime is set in the past. This may cause issues if you are creating a Group Managed Service Account right after you create the KDS Root Key. In order to get around this, you must create the KDS Root Key using a date in the past. This should be used at your own risk and should only be used in lab environments.")] Boolean AllowUnsafeEffectiveTime; + [Write, Description("This option will allow you to remove a KDS root key if there is only one key left. It should not break your Group Managed Service Accounts (gMSA), but if the gMSA password expires and it needs to request a new password, it will not be able to generate a new password until a new KDS Root Key is installed and ready for use. Because of this, the last KDS Root Key will not be removed unless this option is specified.")] Boolean ForceRemove; + [Read, Description("Returns the Distinguished Name (DN) of the KDS root key. The KDS Root Key is stored in 'CN=Master Root Keys,CN=Group Key Distribution Service,CN=Services,CN=Configuration' at the Forest level. This is also why replication needs 10 hours to occur before using the KDS Root Key as a safety measure.")] String DistinguishedName; + [Read, Description("Returns the Creation date and time of the KDS root key for informational purposes.")] DateTime CreationTime; + [Read, Description("Returns the KeyID of the KDS root key. This is the Common Name (CN) within Active Directory and is required to build the Distinguished Name.")] String KeyId; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/README.md new file mode 100644 index 0000000..fe95102 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/README.md @@ -0,0 +1,7 @@ +# Description + +The ADKDSKey DSC resource will manage KDS Root Keys within Active Directory. The KDS root keys are used to begin generating Group Managed Service Account (gMSA) passwords. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/en-US/MSFT_ADKDSKey.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/en-US/MSFT_ADKDSKey.strings.psd1 new file mode 100644 index 0000000..98ddadc --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/en-US/MSFT_ADKDSKey.strings.psd1 @@ -0,0 +1,25 @@ + +# culture='en-US' +ConvertFrom-StringData @' + RetrievingKDSRootKey = Retrieving KDS Root Key with effective date of '{0}'. (KDSK0001) + RetrievingKDSRootKeyError = There was an error retrieving the KDS Root Key with effective date of '{0}'. (KDSK0002) + AddingKDSRootKey = Creating KDS Root Key with the effective date of '{0}'. (KDSK0003) + AddingKDSRootKeyDateInPast = Effective date is in the past and the 'AllowUnsafeEffectiveTime' is set to Enabled. Adding KDS Root Key with the effective date of '{0}', overriding 10 hour safety measure for domain controller replication. (KDSK0004) + AddingKDSRootKeyError = Effective date of '{0}' is in the past and 'AllowUnsafeEffectiveTime' was not specified so the KDS Root Key will NOT be created. (KDSK0005) + KDSRootKeyAddError = There was an error when trying to Add the KDS Root Key with the effective date of '{0}'. (KDSK0006) + KDSRootKeyRemoveError = There was an error when trying to Remove the KDS Root Key with the effective date of '{0}'. (KDSK0007) + FoundKDSRootKeySameEffectiveTime = Found more than one KDS Root Keys with the same effective time, please ensure that only one KDS key exists with the effective time of '{0}'. (KDSK0008) + FoundKDSRootKeyMultiple = Found more than one KDS Root Keys. This shouldn't be an issue, but having only one key per domain is recommended. (KDSK0009) + FoundKDSRootKey = Found KDS Root Key with the effective date of '{0}'. (KDSK0010) + NotEnoughKDSRootKeysPresent = The KDS Root Key with effective date of '{0}' is the only key that exists. Please ensure a key exists if there are existing 'Group Managed Service Accounts (gMSAs)' present. (KDSK0011) + NotEnoughKDSRootKeysPresentNoForce = There is only one KDS Root Key left and the 'ForceRemove' parameter no set; therefore, the KDS Root Key with effective date of '{0}' will not be removed. (KDSK0012) + RemovingKDSRootKey = Removing the KDS Root Key with effective date '{0}'. (KDSK0013) + KDSRootKeyNotInDesiredState = KDS Root Key with the effective date of '{0}' is NOT in the desired state. (KDSK0014) + KDSRootKeyInDesiredState = KDS Root Key with the effective date of '{0}' is in the desired state. (KDSK0015) + NotDesiredPropertyState = The parameter of '{0}' for the KDS Root Key with the effective date of '{1}' is incorrect. Expected '{2}', actual '{3}'. (KDSK0016) + IncorrectPermissions = The DSC resource is running under the context of '{0}' and doesn't have 'Domain Admin' permissions. This resource needs to run as a Domain Admin or on a Domain Controller. (KDSK0017) + EffectiveTimeInvalid = The EffectiveTime of '{0}' is invalid. Please ensure that the date and time is parsable using DateTime. (KDSK0018) + CheckingDomainAdminUserRights = Checking if the user '{0}' has valid Domain Admin permissions. (KDSK0019) + CheckingDomainAdminComputerRights = Checking if the node '{0}' is a Domain Controller. The node has a product type of '{1}'. If the product type is 2, then it is a domain controller. (KDSK0020) + RetrievedRootDomainDN = Retrieved the root domain distinguished name of '{0}'. (KDSK0021) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/en-US/about_ADKDSKey.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/en-US/about_ADKDSKey.help.txt new file mode 100644 index 0000000..9d72ef3 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADKDSKey/en-US/about_ADKDSKey.help.txt @@ -0,0 +1,104 @@ +.NAME + ADKDSKey + +.DESCRIPTION + The ADKDSKey DSC resource will manage KDS Root Keys within Active Directory. The KDS root keys are used to begin generating Group Managed Service Account (gMSA) passwords. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER EffectiveTime + Key - String + Specifies the Effective time when a KDS root key can be used. There is a 10 hour minimum from creation date to allow active directory to properly replicate across all domain controllers. For this reason, the date must be set in the future for creation. While this parameter accepts a string, it will be converted into a DateTime object. This will also try to take into account cultural settings. Example: '05/01/1999 13:00 using default or 'en-US' culture would be May 1st, but using 'de-DE' culture would be 5th of January. The culture is automatically pulled from the operating system and this can be checked using 'Get-Culture'. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if this KDS Root Key should be present or absent. Default value is 'Present'. + +.PARAMETER AllowUnsafeEffectiveTime + Write - Boolean + This option will allow you to create a KDS root key if EffectiveTime is set in the past. This may cause issues if you are creating a Group Managed Service Account right after you create the KDS Root Key. In order to get around this, you must create the KDS Root Key using a date in the past. This should be used at your own risk and should only be used in lab environments. + +.PARAMETER ForceRemove + Write - Boolean + This option will allow you to remove a KDS root key if there is only one key left. It should not break your Group Managed Service Accounts (gMSA), but if the gMSA password expires and it needs to request a new password, it will not be able to generate a new password until a new KDS Root Key is installed and ready for use. Because of this, the last KDS Root Key will not be removed unless this option is specified. + +.PARAMETER DistinguishedName + Read - String + Returns the Distinguished Name (DN) of the KDS root key. The KDS Root Key is stored in 'CN=Master Root Keys,CN=Group Key Distribution Service,CN=Services,CN=Configuration' at the Forest level. This is also why replication needs 10 hours to occur before using the KDS Root Key as a safety measure. + +.PARAMETER CreationTime + Read - DateTime + Returns the Creation date and time of the KDS root key for informational purposes. + +.PARAMETER KeyId + Read - String + Returns the KeyID of the KDS root key. This is the Common Name (CN) within Active Directory and is required to build the Distinguished Name. + +.EXAMPLE 1 + +This configuration will create a KDS root key. If the date is set to a time +slightly ahead in the future, the key won't be usable for at least 10 hours +from the creation time. + +Configuration ADKDSKey_CreateKDSRootKey_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADKDSKey 'ExampleKDSRootKey' + { + Ensure = 'Present' + EffectiveTime = '1/1/2030 13:00' + # Date must be set to at time in the future + } + } +} + +.EXAMPLE 2 + +This configuration will create a KDS root key in the past. This will allow +the key to be used right away, but if all the domain controllers haven't +replicated yet, there may be issues when retrieving the gMSA password. +Use with caution + +Configuration ADKDSKey_CreateKDSRootKeyInPast_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADKDSKey 'ExampleKDSRootKeyInPast' + { + Ensure = 'Present' + EffectiveTime = '1/1/1999 13:00' + AllowUnsafeEffectiveTime = $true # Use with caution + } + } +} + +.EXAMPLE 3 + +This configuration will remove the last KDS root key. Use with caution. +If gMSAs are installed on the network, they will not be able to reset +their passwords and it may cause services to fail. + +Configuration ADKDSKey_CreateKDSRootKeyRemoveLastKey_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADKDSKey 'ExampleKDSRootKeyForceRemove' + { + Ensure = 'Absent' + EffectiveTime = '1/1/2030 13:00' + ForceRemove = $true # This will allow you to remove the key if it's the last one + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/MSFT_ADManagedServiceAccount.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/MSFT_ADManagedServiceAccount.psm1 new file mode 100644 index 0000000..4526ee7 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/MSFT_ADManagedServiceAccount.psm1 @@ -0,0 +1,733 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADManagedServiceAccount' + +$script:errorCodeKdsRootKeyNotFound = -2146893811 + +<# + .SYNOPSIS + Returns the current state of an Active Directory managed service account. + + .PARAMETER ServiceAccountName + Specifies the Security Account Manager (SAM) account name of the managed service account (ldapDisplayName + 'sAMAccountName'). To be compatible with older operating systems, create a SAM account name that is 20 characters + or less. Once created, the user's SamAccountName and CN cannot be changed. + + .PARAMETER AccountType + The type of managed service account. Standalone will create a Standalone Managed Service Account (sMSA) and + Group will create a Group Managed Service Account (gMSA). + + .PARAMETER Credential + Specifies the user account credentials to use to perform this task. + This is only required if not executing the task on a domain controller or using the DomainController parameter. + + .PARAMETER DomainController + Specifies the Active Directory Domain Controller instance to use to perform the task. + This is only required if not executing the task on a domain controller. + + .PARAMETER MembershipAttribute + Active Directory attribute used to perform membership operations for Group Managed Service Accounts (gMSAs). + If not specified, this value defaults to SamAccountName. Only used when 'Group' is selected for 'AccountType'. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Get-ADObject | ActiveDirectory + Get-ADServiceAccount | ActiveDirectory + Assert-Module | ActiveDirectoryDsc.Common + Get-ADCommonParameters | ActiveDirectoryDsc.Common + Get-ADObjectParentDN | ActiveDirectoryDsc.Common + New-InvalidOperationException | ActiveDirectoryDsc.Common +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceAccountName, + + [Parameter(Mandatory = $true)] + [ValidateSet('Group', 'Standalone')] + [System.String] + $AccountType, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateSet('SamAccountName', 'DistinguishedName', 'ObjectSid', 'ObjectGUID')] + [System.String] + $MembershipAttribute = 'SamAccountName' + ) + + Assert-Module -ModuleName 'ActiveDirectory' + $adServiceAccountParameters = Get-ADCommonParameters @PSBoundParameters + + Write-Verbose -Message ($script:localizedData.RetrievingManagedServiceAccountMessage -f + $ServiceAccountName) + + try + { + $adServiceAccount = Get-ADServiceAccount @adServiceAccountParameters -Properties @( + 'DistinguishedName' + 'Description' + 'DisplayName' + 'ObjectClass' + 'Enabled' + 'PrincipalsAllowedToRetrieveManagedPassword' + 'KerberosEncryptionType' + ) + } + + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + Write-Verbose -Message ($script:localizedData.ManagedServiceAccountNotFoundMessage -f + $AccountType, $ServiceAccountName) + $adServiceAccount = $null + } + catch + { + $errorMessage = $script:localizedData.RetrievingManagedServiceAccountError -f $ServiceAccountName + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + if ($adServiceAccount) + { + # Resource exists + $managedPasswordPrincipals = @() + + if ($adServiceAccount.ObjectClass -eq 'msDS-ManagedServiceAccount') + { + $existingAccountType = 'Standalone' + } + else + { + $existingAccountType = 'Group' + + Write-Verbose -Message ($script:localizedData.RetrievingManagedPasswordPrincipalsMessage -f + $MembershipAttribute) + + foreach ($identity in $adServiceAccount.PrincipalsAllowedToRetrieveManagedPassword) + { + try + { + $principal = (Get-ADObject -Identity $identity -Properties $MembershipAttribute).$MembershipAttribute + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + # Add unresolved SID as principal if the identity could not be found + $principal = $identity + } + catch + { + $errorMessage = $script:localizedData.RetrievingManagedPasswordPrincipalsError -f $identity + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + $managedPasswordPrincipals += $principal + } + } + + $targetResource = @{ + ServiceAccountName = $ServiceAccountName + AccountType = $existingAccountType + Path = Get-ADObjectParentDN -DN $adServiceAccount.DistinguishedName + Description = $adServiceAccount.Description + DisplayName = $adServiceAccount.DisplayName + DistinguishedName = $adServiceAccount.DistinguishedName + Enabled = $adServiceAccount.Enabled + KerberosEncryptionType = $adServiceAccount.KerberosEncryptionType -split (', ') + ManagedPasswordPrincipals = $managedPasswordPrincipals + MembershipAttribute = $MembershipAttribute + Ensure = 'Present' + } + } + else + { + # Resource does not exist + $targetResource = @{ + ServiceAccountName = $ServiceAccountName + AccountType = $AccountType + Path = $null + Description = $null + DisplayName = $null + DistinguishedName = $null + Enabled = $false + KerberosEncryptionType = @() + ManagedPasswordPrincipals = @() + MembershipAttribute = $MembershipAttribute + Ensure = 'Absent' + } + } + + return $targetResource +} #end function Get-TargetResource + +<# + .SYNOPSIS + Tests if an Active Directory managed service account is in the desired state. + + .PARAMETER ServiceAccountName + Specifies the Security Account Manager (SAM) account name of the managed service account (ldapDisplayName + 'sAMAccountName'). To be compatible with older operating systems, create a SAM account name that is 20 + characters or less. Once created, the user's SamAccountName and CN cannot be changed. + + .PARAMETER AccountType + The type of managed service account. Standalone will create a Standalone Managed Service Account (sMSA) and + Group will create a Group Managed Service Account (gMSA). + + .PARAMETER Credential + Specifies the user account credentials to use to perform this task. + This is only required if not executing the task on a domain controller or using the DomainController parameter. + + .PARAMETER Description + Specifies the description of the account (ldapDisplayName 'description'). + + .PARAMETER DisplayName + Specifies the display name of the account (ldapDisplayName 'displayName'). + + .PARAMETER DomainController + Specifies the Active Directory Domain Controller instance to use to perform the task. + This is only required if not executing the task on a domain controller. + + .PARAMETER Ensure + Specifies whether the user account is created or deleted. If not specified, this value defaults to Present. + + .PARAMETER KerberosEncryptionType + Specifies which Kerberos encryption types the account supports when creating service tickets. + This value sets the encryption types supported flags of the Active Directory msDS-SupportedEncryptionTypes + attribute. + + .PARAMETER ManagedPasswordPrincipals + Specifies the membership policy for systems which can use a group managed service account. (ldapDisplayName + 'msDS-GroupMSAMembership'). Only used when 'Group' is selected for 'AccountType'. + + .PARAMETER MembershipAttribute + Active Directory attribute used to perform membership operations for Group Managed Service Accounts (gMSAs). + If not specified, this value defaults to SamAccountName. Only used when 'Group' is selected for 'AccountType'. + + .PARAMETER Path + Specifies the X.500 path of the Organizational Unit (OU) or container where the new account is created. + Specified as a Distinguished Name (DN). + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Compare-ResourcePropertyState | ActiveDirectoryDsc.Common +#> +function Test-TargetResource +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', "", + Justification = 'False positive on ManagedPasswordPrincipals')] + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceAccountName, + + [Parameter(Mandatory = $true)] + [ValidateSet('Group', 'Standalone')] + [System.String] + $AccountType, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('None', 'RC4', 'AES128', 'AES256')] + [System.String[]] + $KerberosEncryptionType, + + [Parameter()] + [System.String[]] + $ManagedPasswordPrincipals, + + [Parameter()] + [ValidateSet('SamAccountName', 'DistinguishedName', 'ObjectSid', 'ObjectGUID')] + [System.String] + $MembershipAttribute = 'SamAccountName', + + [Parameter()] + [System.String] + $Path + ) + + # Need to set these parameters to compare if users are using the default parameter values + [HashTable] $parameters = $PSBoundParameters + $parameters['MembershipAttribute'] = $MembershipAttribute + + $getTargetResourceParameters = @{ + ServiceAccountName = $ServiceAccountName + AccountType = $AccountType + DomainController = $DomainController + MembershipAttribute = $MembershipAttribute + } + + @($getTargetResourceParameters.Keys) | + ForEach-Object { + if (-not $parameters.ContainsKey($_)) + { + $getTargetResourceParameters.Remove($_) + } + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + if ($getTargetResourceResult.Ensure -eq 'Present') + { + # Resource exists + if ($Ensure -eq 'Present') + { + # Resource should exist + $propertiesNotInDesiredState = ( + Compare-ResourcePropertyState -CurrentValues $getTargetResourceResult -DesiredValues $parameters ` + -IgnoreProperties 'DomainController', 'Credential' | Where-Object -Property InDesiredState -eq $false) + + if ($propertiesNotInDesiredState) + { + $inDesiredState = $false + } + else + { + # Resource is in desired state + Write-Verbose -Message ($script:localizedData.ManagedServiceAccountInDesiredStateMessage -f + $AccountType, $ServiceAccountName) + $inDesiredState = $true + } + } + else + { + # Resource should not exist + Write-Verbose -Message ($script:localizedData.ResourceExistsButShouldNotMessage -f + $AccountType, $ServiceAccountName) + $inDesiredState = $false + } + } + else + { + # Resource does not exist + if ($Ensure -eq 'Present') + { + # Resource should exist + Write-Verbose -Message ($script:localizedData.ResourceDoesNotExistButShouldMessage -f + $AccountType, $ServiceAccountName) + $inDesiredState = $false + } + else + { + # Resource should not exist + Write-Verbose -Message ($script:localizedData.ManagedServiceAccountInDesiredStateMessage -f + $AccountType, $ServiceAccountName) + $inDesiredState = $true + } + } + + $inDesiredState +} #end function Test-TargetResource + +<# + .SYNOPSIS + Sets the state of an Active Directory managed service account. + + .PARAMETER ServiceAccountName + Specifies the Security Account Manager (SAM) account name of the managed service account (ldapDisplayName + 'sAMAccountName'). To be compatible with older operating systems, create a SAM account name that is 20 + characters or less. Once created, the user's SamAccountName and CN cannot be changed. + + .PARAMETER AccountType + The type of managed service account. Standalone will create a Standalone Managed Service Account (sMSA) and + Group will create a Group Managed Service Account (gMSA). + + .PARAMETER Credential + Specifies the user account credentials to use to perform this task. + This is only required if not executing the task on a domain controller or using the DomainController parameter. + + .PARAMETER Description + Specifies the description of the account (ldapDisplayName 'description'). + + .PARAMETER DisplayName + Specifies the display name of the account (ldapDisplayName 'displayName'). + + .PARAMETER DomainController + Specifies the Active Directory Domain Controller instance to use to perform the task. + This is only required if not executing the task on a domain controller. + + .PARAMETER Ensure + Specifies whether the user account is created or deleted. If not specified, this value defaults to Present. + + .PARAMETER KerberosEncryptionType + Specifies which Kerberos encryption types the account supports when creating service tickets. + This value sets the encryption types supported flags of the Active Directory msDS-SupportedEncryptionTypes + attribute. + + .PARAMETER ManagedPasswordPrincipals + Specifies the membership policy for systems which can use a group managed service account. (ldapDisplayName + 'msDS-GroupMSAMembership'). Only used when 'Group' is selected for 'AccountType'. + + .PARAMETER MembershipAttribute + Active Directory attribute used to perform membership operations for Group Managed Service Accounts (gMSAs). + If not specified, this value defaults to SamAccountName. Only used when 'Group' is selected for 'AccountType'. + + .PARAMETER Path + Specifies the X.500 path of the Organizational Unit (OU) or container where the new account is created. + Specified as a Distinguished Name (DN). + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Get-ADDomain | ActiveDirectory + Move-ADObject | ActiveDirectory + New-ADServiceAccount | ActiveDirectory + Remove-ADServiceAccount | ActiveDirectory + Set-ADServiceAccount | ActiveDirectory + Compare-ResourcePropertyState | ActiveDirectoryDsc.Common + Get-ADCommonParameters | ActiveDirectoryDsc.Common + Get-DomainName | ActiveDirectoryDsc.Common + New-InvalidOperationException | ActiveDirectoryDsc.Common +#> + +function Set-TargetResource +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', "", + Justification = 'False positive on ManagedPasswordPrincipals')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceAccountName, + + [Parameter(Mandatory = $true)] + [ValidateSet('Group', 'Standalone')] + [System.String] + $AccountType, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('None', 'RC4', 'AES128', 'AES256')] + [System.String[]] + $KerberosEncryptionType, + + [Parameter()] + [System.String[]] + $ManagedPasswordPrincipals, + + [Parameter()] + [ValidateSet('SamAccountName', 'DistinguishedName', 'ObjectSid', 'ObjectGUID')] + [System.String] + $MembershipAttribute = 'SamAccountName', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + # Need to set these to compare if not specified since user is using defaults + [HashTable] $parameters = $PSBoundParameters + $parameters['MembershipAttribute'] = $MembershipAttribute + + $adServiceAccountParameters = Get-ADCommonParameters @parameters + + $getTargetResourceParameters = @{ + ServiceAccountName = $ServiceAccountName + AccountType = $AccountType + DomainController = $DomainController + MembershipAttribute = $MembershipAttribute + } + + @($getTargetResourceParameters.Keys) | + ForEach-Object { + if (-not $parameters.ContainsKey($_)) + { + $getTargetResourceParameters.Remove($_) + } + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + if ($Ensure -eq 'Present') + { + # Resource should be present + if ($getTargetResourceResult.Ensure -eq 'Present') + { + # Resource is present + $createNewAdServiceAccount = $false + $propertiesNotInDesiredState = ( + Compare-ResourcePropertyState -CurrentValues $getTargetResourceResult -DesiredValues $parameters ` + -IgnoreProperties 'DomainController', 'Credential' | Where-Object -Property InDesiredState -eq $false) + if ($propertiesNotInDesiredState) + { + if ($propertiesNotInDesiredState.ParameterName -contains 'AccountType') + { + # AccountType has changed, so the account needs recreating + Write-Verbose -Message ($script:localizedData.RecreatingManagedServiceAccountMessage -f + $AccountType, $ServiceAccountName) + try + { + Remove-ADServiceAccount @adServiceAccountParameters -Confirm:$false + } + catch + { + $errorMessage = ($script:localizedData.RemovingManagedServiceAccountError -f + $AccountType, $ServiceAccountName) + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + $createNewAdServiceAccount = $true + } + else + { + $setServiceAccountParameters = $adServiceAccountParameters.Clone() + $setAdServiceAccountRequired = $false + $moveAdServiceAccountRequired = $false + + foreach ($property in $propertiesNotInDesiredState) + { + if ($property.ParameterName -eq 'Path') + { + # The path has changed, so the account needs moving, but not until after any other changes + $moveAdServiceAccountRequired = $true + } + else + { + $setAdServiceAccountRequired = $true + + Write-Verbose -Message ($script:localizedData.UpdatingManagedServiceAccountPropertyMessage -f + $AccountType, $ServiceAccountName, $property.ParameterName, ($property.Expected -join ', ')) + + if ($property.ParameterName -eq 'ManagedPasswordPrincipals' -and $AccountType -eq 'Group') + { + $setServiceAccountParameters.Add('PrincipalsAllowedToRetrieveManagedPassword', + $ManagedPasswordPrincipals) + } + else + { + $SetServiceAccountParameters.Add($property.ParameterName, $property.Expected) + } + } + } + + if ($setAdServiceAccountRequired) + { + try + { + Set-ADServiceAccount @setServiceAccountParameters + } + catch + { + $errorMessage = ($script:localizedData.SettingManagedServiceAccountError -f + $AccountType, $ServiceAccountName) + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + + if ($moveAdServiceAccountRequired) + { + Write-Verbose -Message ($script:localizedData.MovingManagedServiceAccountMessage -f + $AccountType, $ServiceAccountName, $getTargetResourceResult.Path, $Path) + $moveADObjectParameters = $adServiceAccountParameters.Clone() + $moveADObjectParameters.Identity = $getTargetResourceResult.DistinguishedName + try + { + Move-ADObject @moveADObjectParameters -TargetPath $Path + } + catch + { + $errorMessage = ($script:localizedData.MovingManagedServiceAccountError -f + $AccountType, $ServiceAccountName, $getTargetResourceResult.Path, $Path) + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + } + } + } + else + { + # Resource is absent + $createNewAdServiceAccount = $true + } + + if ($createNewAdServiceAccount) + { + if (-not $parameters.ContainsKey('Path')) + { + # Get default MSA path as one has not been specified + try + { + $domainDistinguishedName = (Get-ADDomain).DistinguishedName + } + catch + { + $errorMessage = $script:localizedData.GettingADDomainError + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + $messagePath = "CN=Managed Service Accounts,$domainDistinguishedName" + } + else + { + $messagePath = $Path + } + + Write-Verbose -Message ($script:localizedData.AddingManagedServiceAccountMessage -f + $AccountType, $ServiceAccountName, $messagePath) + + $newAdServiceAccountParameters = Get-ADCommonParameters @parameters -UseNameParameter + + if ($parameters.ContainsKey('Description')) + { + $newAdServiceAccountParameters.Description = $Description + } + + if ($parameters.ContainsKey('DisplayName')) + { + $newAdServiceAccountParameters.DisplayName = $DisplayName + } + + if ($parameters.ContainsKey('Path')) + { + $newAdServiceAccountParameters.Path = $Path + } + + if ( $AccountType -eq 'Standalone' ) + { + # Create standalone managed service account + $newAdServiceAccountParameters.RestrictToSingleComputer = $true + } + else + { + # Create group managed service account + $newAdServiceAccountParameters.DNSHostName = "$ServiceAccountName.$(Get-DomainName)" + + if ($parameters.ContainsKey('ManagedPasswordPrincipals')) + { + $newAdServiceAccountParameters.PrincipalsAllowedToRetrieveManagedPassword = ` + $ManagedPasswordPrincipals + } + } + + try + { + New-ADServiceAccount @newAdServiceAccountParameters + } + catch [Microsoft.ActiveDirectory.Management.ADException] + { + if ($_.Exception.ErrorCode -eq $script:errorCodeKdsRootKeyNotFound) + { + $errorMessage = ($script:localizedData.KdsRootKeyNotFoundError -f + $ServiceAccountName) + } + else + { + $errorMessage = ($script:localizedData.AddingManagedServiceAccountError -f + $AccountType, $ServiceAccountName, $messagePath) + } + + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + catch + { + $errorMessage = ($script:localizedData.AddingManagedServiceAccountError -f + $AccountType, $ServiceAccountName, $messagePath) + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + } + else + { + # Resource should be absent + if ($getTargetResourceResult.Ensure -eq 'Present') + { + # Resource is present + Write-Verbose -Message ($script:localizedData.RemovingManagedServiceAccountMessage -f + $AccountType, $ServiceAccountName) + + try + { + Remove-ADServiceAccount @adServiceAccountParameters -Confirm:$false + } + catch + { + $errorMessage = ($script:localizedData.RemovingManagedServiceAccountError -f + $AccountType, $ServiceAccountName) + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + else + { + # Resource is absent + Write-Verbose -Message ($script:localizedData.ManagedServiceAccountInDesiredStateMessage -f + $AccountType, $ServiceAccountName) + } + } +} #end function Set-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/MSFT_ADManagedServiceAccount.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/MSFT_ADManagedServiceAccount.schema.mof new file mode 100644 index 0000000..31ffe06 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/MSFT_ADManagedServiceAccount.schema.mof @@ -0,0 +1,17 @@ +[ClassVersion("1.0.1.0"), FriendlyName("ADManagedServiceAccount")] +class MSFT_ADManagedServiceAccount : OMI_BaseResource +{ + [Key, Description("Specifies the Security Account Manager (SAM) account name of the managed service account (ldapDisplayName 'sAMAccountName'). To be compatible with older operating systems, create a SAM account name that is 20 characters or less. Once created, the user's SamAccountName and CN cannot be changed.")] String ServiceAccountName; + [Required, Description("The type of managed service account. Standalone will create a Standalone Managed Service Account (sMSA) and Group will create a Group Managed Service Account (gMSA)."), ValueMap{"Group","Standalone"}, Values{"Group","Standalone"}] String AccountType; + [Write, Description("Specifies the user account credentials to use to perform this task. This is only required if not executing the task on a domain controller or using the parameter DomainController."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Specifies the description of the account (ldapDisplayName 'description').")] String Description; + [Write, Description("Specifies the display name of the account (ldapDisplayName 'displayName').")] String DisplayName; + [Write, Description("Specifies the Active Directory Domain Controller instance to use to perform the task. This is only required if not executing the task on a domain controller.")] String DomainController; + [Write, Description("Specifies whether the user account is created or deleted. If not specified, this value defaults to Present."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Specifies which Kerberos encryption types the account supports when creating service tickets. This value sets the encryption types supported flags of the Active Directory msDS-SupportedEncryptionTypes attribute."),ValueMap{"None","RC4","AES128","AES256"}, Values{"None","RC4","AES128","AES256"}] String KerberosEncryptionType[]; + [Write, Description("Specifies the membership policy for systems which can use a group managed service account. (ldapDisplayName 'msDS-GroupMSAMembership'). Only used when 'Group' is selected for 'AccountType'.")] String ManagedPasswordPrincipals[]; + [Write, Description("Active Directory attribute used to perform membership operations for Group Managed Service Accounts (gMSA). If not specified, this value defaults to SamAccountName."), ValueMap{"SamAccountName","DistinguishedName","ObjectGUID","ObjectSid"}, Values{"SamAccountName","DistinguishedName","ObjectGUID","ObjectSid"}] String MembershipAttribute; + [Write, Description("Specifies the X.500 path of the Organizational Unit (OU) or container where the new account is created. Specified as a Distinguished Name (DN).")] String Path; + [Read, Description("Returns whether the user account is enabled or disabled.")] Boolean Enabled; + [Read, Description("Returns the Distinguished Name of the Service Account.")] String DistinguishedName; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/README.md new file mode 100644 index 0000000..059ae00 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/README.md @@ -0,0 +1,9 @@ +# Description + +The ADManagedServiceAccount DSC resource will manage Single and Group Managed Service Accounts (MSAs) within Active Directory. A Managed Service Account is a managed domain account that provides automatic password management, simplified service principal name (SPN) management and the ability to delegate management to other administrators. +A Single Managed Service Account can only be used on a single computer, whereas a Group Managed Service Account can be shared across multiple computers. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. +* Group Managed Service Accounts need at least one Windows Server 2012 Domain Controller. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/en-US/MSFT_ADManagedServiceAccount.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/en-US/MSFT_ADManagedServiceAccount.strings.psd1 new file mode 100644 index 0000000..afcc58b --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/en-US/MSFT_ADManagedServiceAccount.strings.psd1 @@ -0,0 +1,22 @@ +# culture='en-US' +ConvertFrom-StringData @' + AddingManagedServiceAccountMessage = Adding {0} Account '{1}' to '{2}'. (MSA0001) + RecreatingManagedServiceAccountMessage = Recreating {0} Account '{1}'. (MSA0002) + RemovingManagedServiceAccountMessage = Removing {0} Account '{1}'. (MSA0003) + MovingManagedServiceAccountMessage = Moving {0} Account '{1}' from '{2}' to '{3}'. (MSA0004) + ManagedServiceAccountNotFoundMessage = {0} Account '{1}' was not found. (MSA0005) + RetrievingManagedServiceAccountMessage = Retrieving Account '{0}'. (MSA0006) + ManagedServiceAccountInDesiredStateMessage = {0} Account '{1}' is in the desired state. (MSA0007) + UpdatingManagedServiceAccountPropertyMessage = Updating {0} Account '{1}' property '{2}' to '{3}'. (MSA0008) + RetrievingManagedPasswordPrincipalsMessage = Retrieving Principals Allowed To Retrieve Managed Password based on '{0}' property. (MSA0009) + ResourceExistsButShouldNotMessage = {0} Account '{1}' exists but should not. (MSA0010) + ResourceDoesNotExistButShouldMessage = {0} Account '{1}' does not exist but should. (MSA0011) + AddingManagedServiceAccountError = Error adding {0} Account '{1}' to '{2}'. (MSA0012) + RemovingManagedServiceAccountError = Error removing {0} Account '{1}'. (MSA0013) + SettingManagedServiceAccountError = Error setting {0} Account '{1}'. (MSA0014) + MovingManagedServiceAccountError = Error moving {0} Account '{1}' from '{2}' to '{3}'. (MSA0015) + RetrievingManagedServiceAccountError = Error retrieving Account '{0}'. (MSA0016) + RetrievingManagedPasswordPrincipalsError = Error retrieving Principal '{0}'. (MSA0017) + GettingADDomainError = Error getting Active Directory Domain details. (MSA0018) + KdsRootKeyNotFoundError = Error adding group account '{0}'. The KDS Root Key was not found. (MSA0019) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/en-US/about_ADManagedServiceAccount.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/en-US/about_ADManagedServiceAccount.help.txt new file mode 100644 index 0000000..67bb3de --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADManagedServiceAccount/en-US/about_ADManagedServiceAccount.help.txt @@ -0,0 +1,161 @@ +.NAME + ADManagedServiceAccount + +.DESCRIPTION + The ADManagedServiceAccount DSC resource will manage Single and Group Managed Service Accounts (MSAs) within Active Directory. A Managed Service Account is a managed domain account that provides automatic password management, simplified service principal name (SPN) management and the ability to delegate management to other administrators. + A Single Managed Service Account can only be used on a single computer, whereas a Group Managed Service Account can be shared across multiple computers. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + * Group Managed Service Accounts need at least one Windows Server 2012 Domain Controller. + +.PARAMETER ServiceAccountName + Key - String + Specifies the Security Account Manager (SAM) account name of the managed service account (ldapDisplayName 'sAMAccountName'). To be compatible with older operating systems, create a SAM account name that is 20 characters or less. Once created, the user's SamAccountName and CN cannot be changed. + +.PARAMETER AccountType + Required - String + Allowed values: Group, Standalone + The type of managed service account. Standalone will create a Standalone Managed Service Account (sMSA) and Group will create a Group Managed Service Account (gMSA). + +.PARAMETER Credential + Write - PSCredential + Specifies the user account credentials to use to perform this task. This is only required if not executing the task on a domain controller or using the parameter DomainController. + +.PARAMETER Description + Write - String + Specifies the description of the account (ldapDisplayName 'description'). + +.PARAMETER DisplayName + Write - String + Specifies the display name of the account (ldapDisplayName 'displayName'). + +.PARAMETER DomainController + Write - String + Specifies the Active Directory Domain Controller instance to use to perform the task. This is only required if not executing the task on a domain controller. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies whether the user account is created or deleted. If not specified, this value defaults to Present. + +.PARAMETER KerberosEncryptionType + Write - StringArray + Allowed values: None, RC4, AES128, AES256 + Specifies which Kerberos encryption types the account supports when creating service tickets. This value sets the encryption types supported flags of the Active Directory msDS-SupportedEncryptionTypes attribute. + +.PARAMETER ManagedPasswordPrincipals + Write - StringArray + Specifies the membership policy for systems which can use a group managed service account. (ldapDisplayName 'msDS-GroupMSAMembership'). Only used when 'Group' is selected for 'AccountType'. + +.PARAMETER MembershipAttribute + Write - String + Allowed values: SamAccountName, DistinguishedName, ObjectGUID, ObjectSid + Active Directory attribute used to perform membership operations for Group Managed Service Accounts (gMSA). If not specified, this value defaults to SamAccountName. + +.PARAMETER Path + Write - String + Specifies the X.500 path of the Organizational Unit (OU) or container where the new account is created. Specified as a Distinguished Name (DN). + +.PARAMETER Enabled + Read - Boolean + Returns whether the user account is enabled or disabled. + +.PARAMETER DistinguishedName + Read - String + Returns the Distinguished Name of the Service Account. + +.EXAMPLE 1 + +This configuration will create a standalone managed service account in the default 'Managed Service Accounts' +container. + +Configuration ADManagedServiceAccount_CreateManagedServiceAccount_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADManagedServiceAccount 'ExampleStandaloneMSA' + { + Ensure = 'Present' + ServiceAccountName = 'Service01' + AccountType = 'Standalone' + } + } +} + +.EXAMPLE 2 + +This configuration will create a group managed service account in the default 'Managed Service Accounts' +container. + +Configuration ADManagedServiceAccount_CreateGroupManagedServiceAccount_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADManagedServiceAccount 'ExampleGroupMSA' + { + Ensure = 'Present' + ServiceAccountName = 'Service01' + AccountType = 'Group' + } + } +} + +.EXAMPLE 3 + +This configuration will create a group managed service account with members in the default 'Managed Service +Accounts' container. + +Configuration ADManagedServiceAccount_CreateGroupManagedServiceAccountWithMembers_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADManagedServiceAccount 'AddingMembersUsingSamAccountName' + { + Ensure = 'Present' + ServiceAccountName = 'Service01' + AccountType = 'Group' + ManagedPasswordPrincipals = 'User01', 'Computer01$' + } + + ADManagedServiceAccount 'AddingMembersUsingDN' + { + Ensure = 'Present' + ServiceAccountName = 'Service02' + AccountType = 'Group' + ManagedPasswordPrincipals = 'CN=User01,OU=Users,DC=contoso,DC=com', 'CN=Computer01,OU=Computers,DC=contoso,DC=com' + } + } +} + +.EXAMPLE 4 + +This configuration will create a group managed service account in the specified path. + +Configuration ADManagedServiceAccount_CreateGroupManagedServiceAccountCustomPath_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + Node localhost + { + ADManagedServiceAccount 'ExampleGroupMSA' + { + Ensure = 'Present' + ServiceAccountName = 'Service01' + AccountType = 'Group' + Path = 'OU=ServiceAccounts,DC=contoso,DC=com' + } + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/MSFT_ADObjectEnabledState.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/MSFT_ADObjectEnabledState.psm1 new file mode 100644 index 0000000..905e268 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/MSFT_ADObjectEnabledState.psm1 @@ -0,0 +1,386 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADObjectEnabledState' + +<# + .SYNOPSIS + Returns the current state of the property Enabled of an Active Directory + object. + + .PARAMETER Identity + Specifies the identity of an object that has the object class specified + in the parameter ObjectClass. When ObjectClass is set to 'Computer' then + this property can be set to either distinguished name, GUID (objectGUID), + security identifier (objectSid), or security Accounts Manager account + name (sAMAccountName). + + .PARAMETER ObjectClass + Specifies the object class. + + .PARAMETER Enabled + Specifies the value of the Enabled property. + + Not used in Get-TargetResource. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to connect to perform the task. + + Used by Get-ADCommonParameters and is returned as a common parameter. + + .PARAMETER Credential + Specifies the user account credentials to use to perform the task. + + Used by Get-ADCommonParameters and is returned as a common parameter. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Identity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Computer')] + [System.String] + $ObjectClass, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Boolean] + $Enabled, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + Assert-Module -ModuleName 'ActiveDirectory' -ImportModule + + <# + These are properties that have no corresponding property in a + Computer account object. + #> + $getTargetResourceReturnValue = @{ + Identity = $Identity + ObjectClass = $ObjectClass + Enabled = $false + DomainController = $DomainController + Credential = $Credential + } + + switch ($ObjectClass) + { + 'Computer' + { + $getADComputerResult = $null + + try + { + Write-Verbose -Message ($script:localizedData.RetrievingComputerAccount -f $Identity) + + $getADComputerParameters = Get-ADCommonParameters @PSBoundParameters + $getADComputerParameters['Properties'] = 'Enabled' + + # If the computer account is not found Get-ADComputer will throw an error. + $getADComputerResult = Get-ADComputer @getADComputerParameters + + $getTargetResourceReturnValue['Enabled'] = $getADComputerResult.Enabled + + if ($getADComputerResult.Enabled) + { + Write-Verbose -Message $script:localizedData.ComputerAccountEnabled + } + else + { + Write-Verbose -Message $script:localizedData.ComputerAccountDisabled + } + } + catch + { + $errorMessage = $script:localizedData.FailedToRetrieveComputerAccount -f $Identity + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + } + + return $getTargetResourceReturnValue +} + +<# + .SYNOPSIS + Determines if the property Enabled of the Active Directory object is in + the desired state. + + .PARAMETER Identity + Specifies the identity of an object that has the object class specified + in the parameter ObjectClass. When ObjectClass is set to 'Computer' then + this property can be set to either distinguished name, GUID (objectGUID), + security identifier (objectSid), or security Accounts Manager account + name (sAMAccountName). + + .PARAMETER ObjectClass + Specifies the object class. + + .PARAMETER Enabled + Specifies the value of the Enabled property. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to connect to + perform the task. + + .PARAMETER Credential + Specifies the user account credentials to use to perform the task. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Identity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Computer')] + [System.String] + $ObjectClass, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Boolean] + $Enabled, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + Write-Verbose -Message ( + $script:localizedData.TestConfiguration -f $Identity, $ObjectClass + ) + + $compareTargetResourceStateResult = Compare-TargetResourceState @PSBoundParameters + + if ($false -in $compareTargetResourceStateResult.InDesiredState) + { + $testTargetResourceReturnValue = $false + } + else + { + $testTargetResourceReturnValue = $true + } + + switch ($ObjectClass) + { + 'Computer' + { + if ($testTargetResourceReturnValue) + { + Write-Verbose -Message ($script:localizedData.ComputerAccountInDesiredState -f $Identity) + } + else + { + Write-Verbose -Message ($script:localizedData.ComputerAccountNotInDesiredState -f $Identity) + } + } + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Sets the property Enabled of the Active Directory object. + + .PARAMETER Identity + Specifies the identity of an object that has the object class specified + in the parameter ObjectClass. When ObjectClass is set to 'Computer' then + this property can be set to either distinguished name, GUID (objectGUID), + security identifier (objectSid), or security Accounts Manager account + name (sAMAccountName). + + .PARAMETER ObjectClass + Specifies the object class. + + .PARAMETER Enabled + Specifies the value of the Enabled property. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to connect to + perform the task. + + .PARAMETER Credential + Specifies the user account credentials to use to perform the task. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Identity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Computer')] + [System.String] + $ObjectClass, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Boolean] + $Enabled, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + $compareTargetResourceStateResult = Compare-TargetResourceState @PSBoundParameters + + # Get all properties that are not in desired state. + $propertiesNotInDesiredState = $compareTargetResourceStateResult | Where-Object -FilterScript { + -not $_.InDesiredState + } + + if ($propertiesNotInDesiredState.Where( { $_.ParameterName -eq 'Enabled' })) + { + $commonParameters = Get-ADCommonParameters @PSBoundParameters + + switch ($ObjectClass) + { + 'Computer' + { + $setADComputerParameters = $commonParameters.Clone() + $setADComputerParameters['Enabled'] = $Enabled + + Set-DscADComputer -Parameters $setADComputerParameters + + if ($Enabled) + { + Write-Verbose -Message ( + $script:localizedData.ComputerAccountHasBeenEnabled -f $Identity + ) + } + else + { + Write-Verbose -Message ( + $script:localizedData.ComputerAccountHasBeenDisabled -f $Identity + ) + } + } + } + } +} + +<# + .SYNOPSIS + Compares the properties in the current state with the properties of the + desired state and returns a hashtable with the comaprison result. + + .PARAMETER Identity + Specifies the identity of an object that has the object class specified + in the parameter ObjectClass. When ObjectClass is set to 'Computer' then + this property can be set to either distinguished name, GUID (objectGUID), + security identifier (objectSid), or security Accounts Manager account + name (sAMAccountName). + + .PARAMETER ObjectClass + Specifies the object class. + + .PARAMETER Enabled + Specifies the value of the Enabled property. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to connect to + perform the task. + + .PARAMETER Credential + Specifies the user account credentials to use to perform the task. +#> +function Compare-TargetResourceState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Identity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Computer')] + [System.String] + $ObjectClass, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Boolean] + $Enabled, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + $getTargetResourceParameters = @{ + Identity = $Identity + ObjectClass = $ObjectClass + Enabled = $Enabled + DomainController = $DomainController + Credential = $Credential + } + + # Need the @() around this to get a new array to enumerate. + @($getTargetResourceParameters.Keys) | ForEach-Object { + if (-not $PSBoundParameters.ContainsKey($_)) + { + $getTargetResourceParameters.Remove($_) + } + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + $compareTargetResourceStateParameters = @{ + CurrentValues = $getTargetResourceResult + DesiredValues = $PSBoundParameters + Properties = @('Enabled') + } + + return Compare-ResourcePropertyState @compareTargetResourceStateParameters +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/MSFT_ADObjectEnabledState.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/MSFT_ADObjectEnabledState.schema.mof new file mode 100644 index 0000000..fa7b0b0 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/MSFT_ADObjectEnabledState.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADObjectEnabledState")] +class MSFT_ADObjectEnabledState : OMI_BaseResource +{ + [Key, Description("Specifies the identity of an object that has the object class specified in the parameter ObjectClass. When ObjectClass is set to 'Computer' then this property can be set to either distinguished name, GUID (objectGUID), security identifier (objectSid), or security Accounts Manager account name (sAMAccountName).")] String Identity; + [Key, Description("Specifies the object class."), ValueMap{"Computer"}, Values{"Computer"}] String ObjectClass; + [Required, Description("Specifies the value of the Enabled property.")] Boolean Enabled; + [Write, Description("Specifies the Active Directory Domain Services instance to connect to perform the task.")] String DomainController; + [Write, Description("Specifies the user account credentials to use to perform the task."), EmbeddedInstance("MSFT_Credential")] String Credential; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/README.md new file mode 100644 index 0000000..8a6978d --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/README.md @@ -0,0 +1,15 @@ +# Description + +This resource enforces the property `Enabled` on the object class *Computer*. + +>This resource could support other object classes like *msDS-ManagedServiceAccount*, +>*msDS-GroupManagedServiceAccount*, and *User*. But these object classes +>are not yet supported due to that other resources already enforces the +>`Enabled` property. If this resource should support another object class, +>then it should be made so that only one resource enforces the enabled +>property. This is to prevent a potential "ping-pong" behavior if both +>resource would be used in a configuration. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/en-US/MSFT_ADObjectEnabledState.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/en-US/MSFT_ADObjectEnabledState.strings.psd1 new file mode 100644 index 0000000..9ff22a6 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/en-US/MSFT_ADObjectEnabledState.strings.psd1 @@ -0,0 +1,12 @@ +# culture="en-US" +ConvertFrom-StringData @' + RetrievingComputerAccount = Retrieving the information about the computer account '{0}' from Active Directory. (ADOES0001) + ComputerAccountEnabled = The computer account is enabled. (ADOES0002) + ComputerAccountDisabled = The computer account is disabled. (ADOES0003) + FailedToRetrieveComputerAccount = Failed to retrieve the computer account '{0}' from Active Directory. (ADOES0005) + TestConfiguration = Determining the current state of the enabled property of the object with the identity '{0}' and object class '{1}'. (ADOES0006) + ComputerAccountInDesiredState = The property Enabled of the computer account '{0}' is in the desired state. (ADOES0007) + ComputerAccountNotInDesiredState = The property Enabled of the computer account '{0}' is not in the desired state. (ADOES0008) + ComputerAccountHasBeenDisabled = The computer account '{0}' has been disabled. (ADOES0009) + ComputerAccountHasBeenEnabled = The computer account '{0}' has been enabled. (ADOES0010) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/en-US/about_ADObjectEnabledState.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/en-US/about_ADObjectEnabledState.help.txt new file mode 100644 index 0000000..63f94b2 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectEnabledState/en-US/about_ADObjectEnabledState.help.txt @@ -0,0 +1,155 @@ +.NAME + ADObjectEnabledState + +.DESCRIPTION + This resource enforces the property `Enabled` on the object class *Computer*. + + >This resource could support other object classes like *msDS-ManagedServiceAccount*, + >*msDS-GroupManagedServiceAccount*, and *User*. But these object classes + >are not yet supported due to that other resources already enforces the + >`Enabled` property. If this resource should support another object class, + >then it should be made so that only one resource enforces the enabled + >property. This is to prevent a potential "ping-pong" behavior if both + >resource would be used in a configuration. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER Identity + Key - String + Specifies the identity of an object that has the object class specified in the parameter ObjectClass. When ObjectClass is set to 'Computer' then this property can be set to either distinguished name, GUID (objectGUID), security identifier (objectSid), or security Accounts Manager account name (sAMAccountName). + +.PARAMETER ObjectClass + Key - String + Allowed values: Computer + Specifies the object class. + +.PARAMETER Enabled + Required - Boolean + Specifies the value of the Enabled property. + +.PARAMETER DomainController + Write - String + Specifies the Active Directory Domain Services instance to connect to perform the task. + +.PARAMETER Credential + Write - PSCredential + Specifies the user account credentials to use to perform the task. + +.EXAMPLE 1 + +This configuration will create a computer account disabled, and +enforcing the account to be enabled. + +Configuration ADObjectEnabledState_EnabledComputerAccount_Config +{ + Import-DscResource -ModuleName ActiveDirectoryDsc + + node localhost + { + ADComputer 'CreateDisabled' + { + ComputerName = 'CLU_CNO01' + EnabledOnCreation = $false + } + + ADObjectEnabledState 'EnforceEnabledPropertyToEnabled' + { + Identity = 'CLU_CNO01' + ObjectClass = 'Computer' + Enabled = $true + + DependsOn = '[ADComputer]CreateDisabled' + } + } +} + +.EXAMPLE 2 + +This configuration will create a computer account disabled, configure +a cluster using the disabled computer account, and enforcing the +computer account to be enabled. + +Configuration ADObjectEnabledState_CreateClusterComputerAccount_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName ActiveDirectoryDsc + Import-DscResource -ModuleName xFailoverCluster -ModuleVersion '1.14.1' + + node localhost + { + ADComputer 'ClusterAccount' + { + ComputerName = 'CLU_CNO01' + EnabledOnCreation = $false + } + + xCluster 'CreateCluster' + { + Name = 'CLU_CNO01' + StaticIPAddress = '192.168.100.20/24' + DomainAdministratorCredential = $Credential + + DependsOn = '[ADComputer]ClusterAccount' + } + + ADObjectEnabledState 'EnforceEnabledPropertyToEnabled' + { + Identity = 'CLU_CNO01' + ObjectClass = 'Computer' + Enabled = $true + + DependsOn = '[xCluster]CreateCluster' + } + } +} + +.EXAMPLE 3 + +This configuration will configure a cluster using a pre-staged computer +account, and enforcing the pre-staged computer account to be enabled. + +Configuration ADObjectEnabledState_EnabledPrestagedClusterComputerAccount_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName ActiveDirectoryDsc + Import-DscResource -ModuleName xFailoverCluster -ModuleVersion '1.14.1' + + node localhost + { + xCluster 'CreateCluster' + { + Name = 'CLU_CNO01' + StaticIPAddress = '192.168.100.20/24' + DomainAdministratorCredential = $Credential + } + + ADObjectEnabledState 'EnforceEnabledPropertyToEnabled' + { + Identity = 'CLU_CNO01' + ObjectClass = 'Computer' + Enabled = $true + + DependsOn = @( + '[xCluster]CreateCluster' + ) + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/MSFT_ADObjectPermissionEntry.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/MSFT_ADObjectPermissionEntry.psm1 new file mode 100644 index 0000000..ee1931e --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/MSFT_ADObjectPermissionEntry.psm1 @@ -0,0 +1,372 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADObjectPermissionEntry' + +<# + .SYNOPSIS + Get the current state of the object permission entry. + + .PARAMETER Path + Active Directory path of the target object to add or remove the + permission entry, specified as a Distinguished Name. + + .PARAMETER IdentityReference + Indicates the identity of the principal for the permission entry. + + .PARAMETER AccessControlType + Indicates whether to Allow or Deny access to the target object. + + .PARAMETER ObjectType + The schema GUID of the object to which the access rule applies. + + .PARAMETER ActiveDirectorySecurityInheritance + One of the 'ActiveDirectorySecurityInheritance' enumeration values that + specifies the inheritance type of the access rule. + + .PARAMETER InheritedObjectType + The schema GUID of the child object type that can inherit this access + rule. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [System.String] + $IdentityReference, + + [Parameter(Mandatory = $true)] + [ValidateSet('Allow', 'Deny')] + [System.String] + $AccessControlType, + + [Parameter(Mandatory = $true)] + [System.String] + $ObjectType, + + [Parameter(Mandatory = $true)] + [ValidateSet('All', 'Children', 'Descendents', 'None', 'SelfAndChildren')] + [System.String] + $ActiveDirectorySecurityInheritance, + + [Parameter(Mandatory = $true)] + [System.String] + $InheritedObjectType + ) + + Assert-ADPSDrive + + # Return object, by default representing an absent ace + $returnValue = @{ + Ensure = 'Absent' + Path = $Path + IdentityReference = $IdentityReference + ActiveDirectoryRights = '' + AccessControlType = $AccessControlType + ObjectType = $ObjectType + ActiveDirectorySecurityInheritance = $ActiveDirectorySecurityInheritance + InheritedObjectType = $InheritedObjectType + } + + try + { + # Get the current acl + $acl = Get-Acl -Path "AD:$Path" -ErrorAction Stop + } + catch [System.Management.Automation.ItemNotFoundException] + { + Write-Verbose -Message ($script:localizedData.ObjectPathIsAbsent -f $Path) + $acl = $null + } + catch + { + throw $_ + } + + if ($null -ne $acl) + { + foreach ($access in $acl.Access) + { + if ($access.IsInherited -eq $false) + { + <# + Check if the ace does match the parameters. If yes, the target + ace has been found, return present with the assigned rights. + #> + if ($access.IdentityReference.Value -eq $IdentityReference -and + $access.AccessControlType -eq $AccessControlType -and + $access.ObjectType.Guid -eq $ObjectType -and + $access.InheritanceType -eq $ActiveDirectorySecurityInheritance -and + $access.InheritedObjectType.Guid -eq $InheritedObjectType) + { + $returnValue['Ensure'] = 'Present' + $returnValue['ActiveDirectoryRights'] = [System.String[]] $access.ActiveDirectoryRights.ToString().Split(',').ForEach( { $_.Trim() }) + } + } + } + } + + if ($returnValue.Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.ObjectPermissionEntryFound -f $Path) + } + else + { + Write-Verbose -Message ($script:localizedData.ObjectPermissionEntryNotFound -f $Path) + } + + return $returnValue +} + +<# + .SYNOPSIS + Add or remove the object permission entry. + + .PARAMETER Ensure + Indicates if the access will be added (Present) or will be removed + (Absent). Default is 'Present'. + + .PARAMETER Path + Active Directory path of the target object to add or remove the + permission entry, specified as a Distinguished Name. + + .PARAMETER IdentityReference + Indicates the identity of the principal for the permission entry. + + .PARAMETER ActiveDirectoryRights + A combination of one or more of the ActiveDirectoryRights enumeration + values that specifies the rights of the access rule. Default is + 'GenericAll'. + + .PARAMETER AccessControlType + Indicates whether to Allow or Deny access to the target object. + + .PARAMETER ObjectType + The schema GUID of the object to which the access rule applies. + + .PARAMETER ActiveDirectorySecurityInheritance + One of the 'ActiveDirectorySecurityInheritance' enumeration values that + specifies the inheritance type of the access rule. + + .PARAMETER InheritedObjectType + The schema GUID of the child object type that can inherit this access + rule. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [System.String] + $IdentityReference, + + [Parameter()] + [ValidateSet('AccessSystemSecurity', 'CreateChild', 'Delete', 'DeleteChild', 'DeleteTree', 'ExtendedRight', 'GenericAll', 'GenericExecute', 'GenericRead', 'GenericWrite', 'ListChildren', 'ListObject', 'ReadControl', 'ReadProperty', 'Self', 'Synchronize', 'WriteDacl', 'WriteOwner', 'WriteProperty')] + [System.String[]] + $ActiveDirectoryRights = 'GenericAll', + + [Parameter(Mandatory = $true)] + [ValidateSet('Allow', 'Deny')] + [System.String] + $AccessControlType, + + [Parameter(Mandatory = $true)] + [System.String] + $ObjectType, + + [Parameter(Mandatory = $true)] + [ValidateSet('All', 'Children', 'Descendents', 'None', 'SelfAndChildren')] + [System.String] + $ActiveDirectorySecurityInheritance, + + [Parameter(Mandatory = $true)] + [System.String] + $InheritedObjectType + ) + + Assert-ADPSDrive + + # Get the current acl + $acl = Get-Acl -Path "AD:$Path" + + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.AddingObjectPermissionEntry -f $Path) + + $ntAccount = New-Object -TypeName 'System.Security.Principal.NTAccount' -ArgumentList $IdentityReference + + $ace = New-Object -TypeName 'System.DirectoryServices.ActiveDirectoryAccessRule' -ArgumentList @( + $ntAccount, + $ActiveDirectoryRights, + $AccessControlType, + $ObjectType, + $ActiveDirectorySecurityInheritance, + $InheritedObjectType + ) + + $acl.AddAccessRule($ace) + } + else + { + <# + Iterate through all ace entries to find the desired ace, which + should be absent. If found, remove the ace from the acl. + #> + foreach ($access in $acl.Access) + { + if ($access.IsInherited -eq $false) + { + if ($access.IdentityReference.Value -eq $IdentityReference -and + $access.AccessControlType -eq $AccessControlType -and + $access.ObjectType.Guid -eq $ObjectType -and + $access.InheritanceType -eq $ActiveDirectorySecurityInheritance -and + $access.InheritedObjectType.Guid -eq $InheritedObjectType) + { + Write-Verbose -Message ($script:localizedData.RemovingObjectPermissionEntry -f $Path) + + $acl.RemoveAccessRule($access) + } + } + } + } + + # Set the updated acl to the object + $acl | + Set-Acl -Path "AD:$Path" +} + +<# + .SYNOPSIS + Test the object permission entry. + + .PARAMETER Ensure + Indicates if the access will be added (Present) or will be removed + (Absent). Default is 'Present'. + + .PARAMETER Path + Active Directory path of the target object to add or remove the + permission entry, specified as a Distinguished Name. + + .PARAMETER IdentityReference + Indicates the identity of the principal for the permission entry. + + .PARAMETER ActiveDirectoryRights + A combination of one or more of the ActiveDirectoryRights enumeration + values that specifies the rights of the access rule. Default is + 'GenericAll'. + + .PARAMETER AccessControlType + Indicates whether to Allow or Deny access to the target object. + + .PARAMETER ObjectType + The schema GUID of the object to which the access rule applies. + + .PARAMETER ActiveDirectorySecurityInheritance + One of the 'ActiveDirectorySecurityInheritance' enumeration values that + specifies the inheritance type of the access rule. + + .PARAMETER InheritedObjectType + The schema GUID of the child object type that can inherit this access + rule. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [System.String] + $IdentityReference, + + [Parameter()] + [ValidateSet('AccessSystemSecurity', 'CreateChild', 'Delete', 'DeleteChild', 'DeleteTree', 'ExtendedRight', 'GenericAll', 'GenericExecute', 'GenericRead', 'GenericWrite', 'ListChildren', 'ListObject', 'ReadControl', 'ReadProperty', 'Self', 'Synchronize', 'WriteDacl', 'WriteOwner', 'WriteProperty')] + [System.String[]] + $ActiveDirectoryRights = 'GenericAll', + + [Parameter(Mandatory = $true)] + [ValidateSet('Allow', 'Deny')] + [System.String] + $AccessControlType, + + [Parameter(Mandatory = $true)] + [System.String] + $ObjectType, + + [Parameter(Mandatory = $true)] + [ValidateSet('All', 'Children', 'Descendents', 'None', 'SelfAndChildren')] + [System.String] + $ActiveDirectorySecurityInheritance, + + [Parameter(Mandatory = $true)] + [System.String] + $InheritedObjectType + ) + + # Get the current state + $getTargetResourceSplat = @{ + Path = $Path + IdentityReference = $IdentityReference + AccessControlType = $AccessControlType + ObjectType = $ObjectType + ActiveDirectorySecurityInheritance = $ActiveDirectorySecurityInheritance + InheritedObjectType = $InheritedObjectType + } + $currentState = Get-TargetResource @getTargetResourceSplat + + # Always check, if the ensure state is desired + $returnValue = $currentState.Ensure -eq $Ensure + + # Only check the Active Directory rights, if ensure is set to present + if ($Ensure -eq 'Present') + { + # Convert to array to a string for easy compare + [System.String] $currentActiveDirectoryRights = ($currentState.ActiveDirectoryRights | + Sort-Object) -join ', ' + + [System.String] $desiredActiveDirectoryRights = ($ActiveDirectoryRights | + Sort-Object) -join ', ' + + $returnValue = $returnValue -and $currentActiveDirectoryRights -eq $desiredActiveDirectoryRights + } + + if ($returnValue) + { + Write-Verbose -Message ($script:localizedData.ObjectPermissionEntryInDesiredState -f $Path) + } + else + { + Write-Verbose -Message ($script:localizedData.ObjectPermissionEntryNotInDesiredState -f $Path) + } + + return $returnValue +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/MSFT_ADObjectPermissionEntry.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/MSFT_ADObjectPermissionEntry.schema.mof new file mode 100644 index 0000000..b5e4770 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/MSFT_ADObjectPermissionEntry.schema.mof @@ -0,0 +1,12 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADObjectPermissionEntry")] +class MSFT_ADObjectPermissionEntry : OMI_BaseResource +{ + [Write, Description("Indicates if the access will be added (Present) or will be removed (Absent). Default value is 'Present'."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Key, Description("Active Directory path of the target object to add or remove the permission entry, specified as a Distinguished Name.")] String Path; + [Key, Description("Indicates the identity of the principal for the ACE. Use the notation DOMAIN\\SamAccountName for the identity.")] String IdentityReference; + [Write, Description("A combination of one or more of the ActiveDirectoryRights enumeration values that specifies the rights of the access rule. Default value is 'GenericAll'."), ValueMap{"AccessSystemSecurity", "CreateChild", "Delete", "DeleteChild", "DeleteTree", "ExtendedRight", "GenericAll", "GenericExecute", "GenericRead", "GenericWrite", "ListChildren", "ListObject", "ReadControl", "ReadProperty", "Self", "Synchronize", "WriteDacl", "WriteOwner", "WriteProperty"}, Values{"AccessSystemSecurity", "CreateChild", "Delete", "DeleteChild", "DeleteTree", "ExtendedRight", "GenericAll", "GenericExecute", "GenericRead", "GenericWrite", "ListChildren", "ListObject", "ReadControl", "ReadProperty", "Self", "Synchronize", "WriteDacl", "WriteOwner", "WriteProperty"}] String ActiveDirectoryRights[]; + [Key, Description("Indicates whether to Allow or Deny access to the target object."), ValueMap{"Allow", "Deny"}, Values{"Allow", "Deny"}] String AccessControlType; + [Key, Description("The schema GUID of the object to which the access rule applies. If the permission entry shouldn't be restricted to a specific object type, use the zero guid (00000000-0000-0000-0000-000000000000).")] String ObjectType; + [Key, Description("One of the 'ActiveDirectorySecurityInheritance' enumeration values that specifies the inheritance type of the access rule."), ValueMap{"All", "Children", "Descendents", "None", "SelfAndChildren"}, Values{"All", "Children", "Descendents", "None", "SelfAndChildren"}] String ActiveDirectorySecurityInheritance; + [Key, Description("The schema GUID of the child object type that can inherit this access rule. If the permission entry shouldn't be restricted to a specific inherited object type, use the zero guid (00000000-0000-0000-0000-000000000000).")] String InheritedObjectType; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/README.md new file mode 100644 index 0000000..993ab74 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/README.md @@ -0,0 +1,10 @@ +# Description + +The ADObjectPermissionEntry DSC resource will manage access control lists on Active Directory objects. The resource is +designed to to manage just one entry in the list of permissios (ACL) for one AD object. It will only interact with the +one permission and leave all others as they were. The resource can be used multiple times to add multiple entries into +one ACL. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/en-US/MSFT_ADObjectPermissionEntry.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/en-US/MSFT_ADObjectPermissionEntry.strings.psd1 new file mode 100644 index 0000000..6827587 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/en-US/MSFT_ADObjectPermissionEntry.strings.psd1 @@ -0,0 +1,11 @@ + +# culture='en-US' +ConvertFrom-StringData @' + ObjectPermissionEntryFound = Object permission entry found on object '{0}'. (OPE0001) + ObjectPermissionEntryNotFound = Object permission entry not found on object '{0}'. (OPE0002) + AddingObjectPermissionEntry = Adding object permission entry to object '{0}'. (OPE0003) + RemovingObjectPermissionEntry = Removing object permission entry from object '{0}'. (OPE0004) + ObjectPermissionEntryInDesiredState = Object permission entry on object '{0}' is in the desired state. (OPE0005) + ObjectPermissionEntryNotInDesiredState = Object permission entry on object '{0}' is not in the desired state. (OPE0006) + ObjectPathIsAbsent = Object Path '{0}' is absent from Active Directory. (OPE0007) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/en-US/about_ADObjectPermissionEntry.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/en-US/about_ADObjectPermissionEntry.help.txt new file mode 100644 index 0000000..20a2a20 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADObjectPermissionEntry/en-US/about_ADObjectPermissionEntry.help.txt @@ -0,0 +1,129 @@ +.NAME + ADObjectPermissionEntry + +.DESCRIPTION + The ADObjectPermissionEntry DSC resource will manage access control lists on Active Directory objects. The resource is + designed to to manage just one entry in the list of permissios (ACL) for one AD object. It will only interact with the + one permission and leave all others as they were. The resource can be used multiple times to add multiple entries into + one ACL. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Indicates if the access will be added (Present) or will be removed (Absent). Default value is 'Present'. + +.PARAMETER Path + Key - String + Active Directory path of the target object to add or remove the permission entry, specified as a Distinguished Name. + +.PARAMETER IdentityReference + Key - String + Indicates the identity of the principal for the ACE. Use the notation DOMAIN\SamAccountName for the identity. + +.PARAMETER ActiveDirectoryRights + Write - StringArray + Allowed values: AccessSystemSecurity, CreateChild, Delete, DeleteChild, DeleteTree, ExtendedRight, GenericAll, GenericExecute, GenericRead, GenericWrite, ListChildren, ListObject, ReadControl, ReadProperty, Self, Synchronize, WriteDacl, WriteOwner, WriteProperty + A combination of one or more of the ActiveDirectoryRights enumeration values that specifies the rights of the access rule. Default value is 'GenericAll'. + +.PARAMETER AccessControlType + Key - String + Allowed values: Allow, Deny + Indicates whether to Allow or Deny access to the target object. + +.PARAMETER ObjectType + Key - String + The schema GUID of the object to which the access rule applies. If the permission entry shouldn't be restricted to a specific object type, use the zero guid (00000000-0000-0000-0000-000000000000). + +.PARAMETER ActiveDirectorySecurityInheritance + Key - String + Allowed values: All, Children, Descendents, None, SelfAndChildren + One of the 'ActiveDirectorySecurityInheritance' enumeration values that specifies the inheritance type of the access rule. + +.PARAMETER InheritedObjectType + Key - String + The schema GUID of the child object type that can inherit this access rule. If the permission entry shouldn't be restricted to a specific inherited object type, use the zero guid (00000000-0000-0000-0000-000000000000). + +.EXAMPLE 1 + +This configuration will add full control (GenericAll) permissions to +the virtual computer object (VCO) ROLE01 for a cluster name object (CNO) +CONTOSO\CLUSTER01$. This is used so that the Windows Failover Cluster +can control the roles AD objects. + +Configuration ADObjectPermissionEntry_DelegateFullControl_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADObjectPermissionEntry 'ADObjectPermissionEntry' + { + Ensure = 'Present' + Path = 'CN=ROLE01,CN=Computers,DC=contoso,DC=com' + IdentityReference = 'CONTOSO\CLUSTER01$' + ActiveDirectoryRights = 'GenericAll' + AccessControlType = 'Allow' + ObjectType = '00000000-0000-0000-0000-000000000000' + ActiveDirectorySecurityInheritance = 'None' + InheritedObjectType = '00000000-0000-0000-0000-000000000000' + } + } +} + +.EXAMPLE 2 + +This configuration will add a group permission to create and delete +(CreateChild,DeleteChild) computer objects in an OU and any sub-OUs that +may get created. + +Configuration ADObjectPermissionEntry_CreateDeleteComputerObject_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADObjectPermissionEntry 'ADObjectPermissionEntry' + { + Ensure = 'Present' + Path = 'OU=ContosoComputers,DC=contoso,DC=com' + IdentityReference = 'CONTOSO\ComputerAdminGroup' + ActiveDirectoryRights = 'CreateChild', 'DeleteChild' + AccessControlType = 'Allow' + ObjectType = 'bf967a86-0de6-11d0-a285-00aa003049e2' # Computer objects + ActiveDirectorySecurityInheritance = 'All' + InheritedObjectType = '00000000-0000-0000-0000-000000000000' + } + } +} + +.EXAMPLE 3 + +This configuration will add a group permission to allow read and write +(ReadProperty, WriteProperty) of all properties of computer objects in +an OU and any sub-OUs that may get created. + +Configuration ADObjectPermissionEntry_ReadWriteComputerObjectProperties_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADObjectPermissionEntry 'ADObjectPermissionEntry' + { + Ensure = 'Present' + Path = 'OU=ContosoComputers,DC=contoso,DC=com' + IdentityReference = 'CONTOSO\ComputerAdminGroup' + ActiveDirectoryRights = 'ReadProperty', 'WriteProperty' + AccessControlType = 'Allow' + ObjectType = '00000000-0000-0000-0000-000000000000' + ActiveDirectorySecurityInheritance = 'Descendents' + InheritedObjectType = 'bf967a86-0de6-11d0-a285-00aa003049e2' # Computer objects + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/MSFT_ADOptionalFeature.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/MSFT_ADOptionalFeature.psm1 new file mode 100644 index 0000000..b48e62d --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/MSFT_ADOptionalFeature.psm1 @@ -0,0 +1,226 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADOptionalFeature' + +<# + .SYNOPSIS + Gets the state of the Active Directory Optional Feature. + + .PARAMETER FeatureName + The name of the Optional feature to be enabled. + + .PARAMETER ForestFQDN + The fully qualified domain name (FQDN) of the forest in which to change the Optional feature. + + .PARAMETER EnterpriseAdministratorCredential + The user account credentials to use to perform this task. + +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $FeatureName, + + [Parameter(Mandatory = $true)] + [System.String] + $ForestFQDN, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $EnterpriseAdministratorCredential + ) + + $previousErrorActionPreference = $ErrorActionPreference + + try + { + # AD cmdlets generate non-terminating errors. + $ErrorActionPreference = 'Stop' + + $forest = Get-ADForest -Server $ForestFQDN -Credential $EnterpriseAdministratorCredential + + $feature = Get-ADOptionalFeature -Identity $FeatureName -Server $forest.DomainNamingMaster -Credential $EnterpriseAdministratorCredential + + if ($feature.EnabledScopes.Count -gt 0) + { + Write-Verbose -Message ($script:localizedData.OptionalFeatureEnabled -f $FeatureName) + $featureEnabled = $True + } + else + { + Write-Verbose -Message ($script:localizedData.OptionalFeatureNotEnabled -f $FeatureName) + $featureEnabled = $False + } + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException], [Microsoft.ActiveDirectory.Management.ADServerDownException] + { + $errorMessage = $script:localizedData.ForestNotFound -f $ForestFQDN + New-ObjectNotFoundException -Message $errorMessage -ErrorRecord $_ + } + catch [System.Security.Authentication.AuthenticationException] + { + $errorMessage = $script:localizedData.CredentialError + New-InvalidArgumentException -Message $errorMessage -ArgumentName 'EnterpriseAdministratorCredential' + } + catch + { + $errorMessage = $script:localizedData.GetUnhandledException -f $ForestFQDN + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + finally + { + $ErrorActionPreference = $previousErrorActionPreference + } + + # Return a credential object without the password. + $cimCredentialInstance = New-CimCredentialInstance -Credential $EnterpriseAdministratorCredential + + return @{ + ForestFQDN = $ForestFQDN + FeatureName = $FeatureName + Enabled = $featureEnabled + EnterpriseAdministratorCredential = $cimCredentialInstance + } +} + +<# + .SYNOPSIS + Sets the state of the Active Directory Optional Feature. + + .PARAMETER FeatureName + The name of the Optional feature to be enabled. + + .PARAMETER ForestFQDN + The fully qualified domain name (FQDN) of the forest in which to change the Optional feature. + + .PARAMETER EnterpriseAdministratorCredential + The user account credentials to use to perform this task. + +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $FeatureName, + + [Parameter(Mandatory = $true)] + [System.String] + $ForestFQDN, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $EnterpriseAdministratorCredential + ) + + $previousErrorActionPreference = $ErrorActionPreference + + try + { + # AD cmdlets generate non-terminating errors. + $ErrorActionPreference = 'Stop' + + $forest = Get-ADForest -Server $ForestFQDN -Credential $EnterpriseAdministratorCredential + $domain = Get-ADDomain -Server $ForestFQDN -Credential $EnterpriseAdministratorCredential + + $feature = Get-ADOptionalFeature -Identity $FeatureName -Server $forest.DomainNamingMaster -Credential $EnterpriseAdministratorCredential + + # Check minimum forest level and throw if not + if (($forest.ForestMode -as [int]) -lt ($feature.RequiredForestMode -as [int])) + { + throw ($script:localizedData.ForestFunctionalLevelError -f $forest.ForestMode) + } + + # Check minimum domain level and throw if not + if (($domain.DomainMode -as [int]) -lt ($feature.RequiredDomainMode -as [int])) + { + throw ($script:localizedData.DomainFunctionalLevelError -f $domain.DomainMode) + } + + Write-Verbose -Message ($script:localizedData.EnablingOptionalFeature -f $forest.RootDomain, $FeatureName) + + Enable-ADOptionalFeature -Identity $FeatureName -Scope ForestOrConfigurationSet ` + -Target $forest.RootDomain -Server $forest.DomainNamingMaster ` + -Credential $EnterpriseAdministratorCredential ` + -Verbose:$VerbosePreference + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException], [Microsoft.ActiveDirectory.Management.ADServerDownException] + { + $errorMessage = $script:localizedData.ForestNotFound -f $ForestFQDN + New-ObjectNotFoundException -Message $errorMessage -ErrorRecord $_ + } + catch [System.Security.Authentication.AuthenticationException] + { + $errorMessage = $script:localizedData.CredentialError + New-InvalidArgumentException -Message $errorMessage -ArgumentName 'EnterpriseAdministratorCredential' + } + catch + { + $errorMessage = $script:localizedData.SetUnhandledException -f $ForestFQDN + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + finally + { + $ErrorActionPreference = $previousErrorActionPreference + } +} + +<# + .SYNOPSIS + Tests the state of the Active Directory Optional Feature. + + .PARAMETER FeatureName + The name of the Optional feature to be enabled. + + .PARAMETER ForestFQDN + The fully qualified domain name (FQDN) of the forest in which to change the Optional feature. + + .PARAMETER EnterpriseAdministratorCredential + The user account credentials to use to perform this task. + +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $FeatureName, + + [Parameter(Mandatory = $true)] + [System.String] + $ForestFQDN, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $EnterpriseAdministratorCredential + ) + + $state = Get-TargetResource @PSBoundParameters + + if ($true -eq $state.Enabled) + { + Write-Verbose -Message ($script:localizedData.OptionalFeatureEnabled -f $FeatureName) + return $true + } + else + { + Write-Verbose -Message ($script:localizedData.OptionalFeatureNotEnabled -f $FeatureName) + return $false + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/MSFT_ADOptionalFeature.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/MSFT_ADOptionalFeature.schema.mof new file mode 100644 index 0000000..97b6fc6 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/MSFT_ADOptionalFeature.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADOptionalFeature")] +class MSFT_ADOptionalFeature : OMI_BaseResource +{ + [Key, Description("Specifies the target Active Directory forest for the change.")] String ForestFQDN; + [Key, Description("Specifies the feature to be activated")] String FeatureName; + [Required, EmbeddedInstance("MSFT_Credential"), Description("Specifies the user account credentials to use to perform this task.")] String EnterpriseAdministratorCredential; + [Read, Description("Shows the current state of the feature i.e. enabled or not")] Boolean Enabled; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/README.md new file mode 100644 index 0000000..c9f02d9 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/README.md @@ -0,0 +1,10 @@ +# Description + +The ADOptionalFeature DSC resource will enable the Active Directory Optional Feature of choice for the target forest. +This resource first verifies that the forest and domain modes match or exceed the requirements. If the forest or domain mode +is insufficient, then the resource will exit with an error message. The change is executed against the +Domain Naming Master FSMO of the forest. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later, depending on the feature. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/en-US/MSFT_ADOptionalFeature.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/en-US/MSFT_ADOptionalFeature.strings.psd1 new file mode 100644 index 0000000..2716bc4 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/en-US/MSFT_ADOptionalFeature.strings.psd1 @@ -0,0 +1,12 @@ +# culture='en-US' +ConvertFrom-StringData @' + ForestNotFound = Cannot contact forest '{0}'. Check the spelling of the Forest FQDN and make sure that a domain controller is available on the network. (ADOF0001) + CredentialError = Credential error. Check the username and password used. (ADOF0002) + GetUnhandledException = Unhandled exception getting Optional Feature status for forest '{0}'. (ADOF0003) + SetUnhandledException = Unhandled exception setting Optional Feature status for forest '{0}'. (ADOF0004) + ForestFunctionalLevelError = Forest functional level '{0}' does not meet minimum requirement of Windows2008R2Forest or greater. (ADOF0005) + DomainFunctionalLevelError = Domain functional level '{0}' does not meet minimum requirement of Windows2008R2Forest or greater. (ADOF0006) + OptionalFeatureEnabled = Active Directory {0} is enabled. (ADOF0007) + OptionalFeatureNotEnabled = Active Directory {0} is not enabled. (ADOF0008) + EnablingOptionalFeature = Enabling Active Directory {1} in the forest '{0}'. (ADOF0009) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/en-US/about_ADOptionalFeature.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/en-US/about_ADOptionalFeature.help.txt new file mode 100644 index 0000000..5bd6b3c --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOptionalFeature/en-US/about_ADOptionalFeature.help.txt @@ -0,0 +1,61 @@ +.NAME + ADOptionalFeature + +.DESCRIPTION + The ADOptionalFeature DSC resource will enable the Active Directory Optional Feature of choice for the target forest. + This resource first verifies that the forest and domain modes match or exceed the requirements. If the forest or domain mode + is insufficient, then the resource will exit with an error message. The change is executed against the + Domain Naming Master FSMO of the forest. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later, depending on the feature. + +.PARAMETER ForestFQDN + Key - String + Specifies the target Active Directory forest for the change. + +.PARAMETER FeatureName + Key - String + Specifies the feature to be activated + +.PARAMETER EnterpriseAdministratorCredential + Required - PSCredential + Specifies the user account credentials to use to perform this task. + +.PARAMETER Enabled + Read - Boolean + Shows the current state of the feature i.e. enabled or not + +.EXAMPLE 1 + +This configuration will enable the Active Directory Recycle Bin for a +specified Domain + +Configuration ADOptionalFeature_EnableADRecycleBin_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ForestFQDN, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $EnterpriseAdministratorCredential + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADOptionalFeature RecycleBin + { + FeatureName = "Recycle Bin Feature" + EnterpriseAdministratorCredential = $EnterpriseAdministratorCredential + ForestFQDN = $ForestFQDN + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.psm1 new file mode 100644 index 0000000..67dcacf --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.psm1 @@ -0,0 +1,429 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADOrganizationalUnit' + +<# + .SYNOPSIS + Gets the Organizational Unit (OU) from Active Directory + + .PARAMETER Name + Specifies the name of the Organizational Unit (OU). + + .PARAMETER Path + Specifies the X.500 path of the OrganizationalUnit (OU) or container where the new object is created. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Get-ADOrganizationalUnit | ActiveDirectory + Assert-Module | ActiveDirectoryDsc.Common + New-InvalidOperationException | ActiveDirectoryDsc.Common +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $Path + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + Write-Verbose ($script:localizedData.RetrievingOU -f $Name, $Path) + + try + { + $ou = Get-ADOrganizationalUnit -Filter "Name -eq '$Name'" -SearchBase $Path ` + -SearchScope OneLevel -Properties ProtectedFromAccidentalDeletion, Description + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + Write-Verbose -Message ($script:localizedData.OUPathIsAbsent -f $Path) + $ou = $null + } + catch + { + $errorMessage = $script:localizedData.GetResourceError -f $Name + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + if ($ou) + { + Write-Verbose -Message ($script:localizedData.OUIsPresent -f $Name) + + $targetResource = @{ + Name = $Name + Path = $Path + ProtectedFromAccidentalDeletion = $ou.ProtectedFromAccidentalDeletion + Description = $ou.Description + DistinguishedName = $ou.DistinguishedName + Ensure = 'Present' + } + } + else + { + Write-Verbose -Message ($script:localizedData.OUIsAbsent -f $Name) + + $targetResource = @{ + Name = $Name + Path = $Path + ProtectedFromAccidentalDeletion = $null + Description = $null + DistinguishedName = $null + Ensure = 'Absent' + } + } + + return $targetResource +} # end function Get-TargetResource + +<# + .SYNOPSIS + Tests the state of the specified Organizational Unit (OU). + + .PARAMETER Name + Specifies the name of the Organizational Unit (OU). + + .PARAMETER Path + Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created. + + .PARAMETER Ensure + Specifies whether the Organizational Unit (OU) should be present or absent. Default value is 'Present'. + + .PARAMETER Credential + The credential to be used to perform the operation on Active Directory. + + .PARAMETER ProtectedFromAccidentalDeletion + Specifies if the Organizational Unit (OU) container should be protected from deletion. Default value is $true. + + .PARAMETER Description + Specifies the description of the Organizational Unit (OU). Default value is empty (''). + + .PARAMETER RestoreFromRecycleBin + Try to restore the Organizational Unit (OU) from the recycle bin before creating a new one. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Compare-ResourcePropertyState | ActiveDirectoryDsc.Common +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $ProtectedFromAccidentalDeletion = $true, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Description = '', + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin + ) + + $targetResource = Get-TargetResource -Name $Name -Path $Path + + if ($targetResource.Ensure -eq 'Present') + { + # Resource exists + if ($Ensure -eq 'Present') + { + # Resource should exist + $propertiesNotInDesiredState = ( + Compare-ResourcePropertyState -CurrentValue $targetResource -DesiredValues $PSBoundParameters | + Where-Object -Property InDesiredState -eq $false) + + if ($propertiesNotInDesiredState) + { + $inDesiredState = $false + } + else + { + # Resource is in the desired state + Write-Verbose ($script:localizedData.OUInDesiredState -f $Name) + + $inDesiredState = $true + } + } + else + { + # Resource should not exist + Write-Verbose ($script:localizedData.OUExistsButShouldNot -f $Name) + + $inDesiredState = $false + } + } + else + { + # Resource does not exist + if ($Ensure -eq 'Present') + { + # Resource should exist + Write-Verbose ($script:localizedData.OUDoesNotExistButShould -f $Name) + + $inDesiredState = $false + } + else + { + # Resource should not exist + Write-Verbose ($script:localizedData.OUDoesNotExistAndShouldNot -f $Name) + + $inDesiredState = $true + } + } + + return $inDesiredState +} #end function Test-TargetResource + +<# + .SYNOPSIS + Sets the state of the Organizational Unit (OU) in Active Directory. + + .PARAMETER Name + Specifies the name of the Organizational Unit (OU). + + .PARAMETER Path + Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created. + + .PARAMETER Ensure + Specifies whether the Organizational Unit (OU) should be present or absent. Default value is 'Present'. + + .PARAMETER Credential + The credential to be used to perform the operation on Active Directory. + + .PARAMETER ProtectedFromAccidentalDeletion + Specifies if the Organizational Unit (OU) container should be protected from deletion. Default value is $true. + + .PARAMETER Description + Specifies the description of the Organizational Unit (OU). Default value is empty (''). + + .PARAMETER RestoreFromRecycleBin + Try to restore the Organizational Unit (OU) from the recycle bin before creating a new one. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + New-ADOrganizationalUnit | ActiveDirectory + Set-ADOrganizationalUnit | ActiveDirectory + Remove-ADOrganizationalUnit | ActiveDirectory + New-InvalidOperationException | ActiveDirectoryDsc.Common + Restore-ADCommonObject | ActiveDirectoryDsc.Common + New-ObjectNotFoundException | ActiveDirectoryDsc.Common +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $ProtectedFromAccidentalDeletion = $true, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Description = '', + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin + ) + + $targetResource = Get-TargetResource -Name $Name -Path $Path + + if ($targetResource.Ensure -eq 'Present') + { + if ($Ensure -eq 'Present') + { + Write-Verbose ($script:localizedData.UpdatingOU -f $Name) + + $setADOrganizationalUnitParams = @{ + Identity = $targetResource.DistinguishedName + Description = $Description + ProtectedFromAccidentalDeletion = $ProtectedFromAccidentalDeletion + } + + if ($Credential) + { + $setADOrganizationalUnitParams['Credential'] = $Credential + } + + try + { + Set-ADOrganizationalUnit @setADOrganizationalUnitParams + } + catch + { + $errorMessage = $script:localizedData.SetResourceError -f $Name + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + } + else + { + Write-Verbose ($script:localizedData.DeletingOU -f $Name) + + # Disable 'ProtectedFromAccidentalDeletion' if it is set. + if ($targetResource.ProtectedFromAccidentalDeletion) + { + $setADOrganizationalUnitParams = @{ + Identity = $targetResource.DistinguishedName + ProtectedFromAccidentalDeletion = $false + } + + if ($Credential) + { + $setADOrganizationalUnitParams['Credential'] = $Credential + } + + try + { + Set-ADOrganizationalUnit @setADOrganizationalUnitParams + } + catch + { + $errorMessage = $script:localizedData.SetResourceError -f $Name + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + + $removeADOrganizationalUnitParams = @{ + Identity = $targetResource.DistinguishedName + } + + if ($Credential) + { + $removeADOrganizationalUnitParams['Credential'] = $Credential + } + + try + { + Remove-ADOrganizationalUnit @removeADOrganizationalUnitParams + } + catch + { + $errorMessage = $script:localizedData.RemoveResourceError -f $Name + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + } + else + { + if ($Ensure -eq 'Present') + { + if ($RestoreFromRecycleBin) + { + Write-Verbose -Message ($script:localizedData.RestoringOu -f $Name) + + $restoreParams = @{ + Identity = $Name + ObjectClass = 'OrganizationalUnit' + ErrorAction = 'Stop' + } + + if ($Credential) + { + $restoreParams['Credential'] = $Credential + } + + $restoreSuccessful = Restore-ADCommonObject @restoreParams + } + + if (-not $RestoreFromRecycleBin -or ($RestoreFromRecycleBin -and -not $restoreSuccessful)) + { + Write-Verbose ($script:localizedData.CreatingOU -f $Name) + + $newADOrganizationalUnitParams = @{ + Name = $Name + Path = $Path + Description = $Description + ProtectedFromAccidentalDeletion = $ProtectedFromAccidentalDeletion + } + + if ($Credential) + { + $newADOrganizationalUnitParams['Credential'] = $Credential + } + + try + { + New-ADOrganizationalUnit @newADOrganizationalUnitParams + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + $errorMessage = $script:localizedData.PathNotFoundError -f $Path + New-ObjectNotFoundException -Message $errorMessage + } + catch + { + $errorMessage = $script:localizedData.NewResourceError -f $Name + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + } + } +} #end function Set-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.schema.mof new file mode 100644 index 0000000..b139e69 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/MSFT_ADOrganizationalUnit.schema.mof @@ -0,0 +1,12 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADOrganizationalUnit")] +class MSFT_ADOrganizationalUnit : OMI_BaseResource +{ + [Key, Description("The name of the Organizational Unit (OU).")] String Name; + [Key, Description("Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created.")] String Path; + [Write, Description("Specifies whether the Organizational Unit (OU) should be present or absent. Default value is 'Present'."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Write, Description("The credential to be used to perform the operation on Active Directory."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Specifies if the Organizational Unit (OU) container should be protected from deletion. Default value is $true.")] Boolean ProtectedFromAccidentalDeletion; + [Write, Description("Specifies the description of the Organizational Unit (OU). Default value is empty ('').")] String Description; + [Write, Description("Try to restore the Organizational Unit (OU) from the recycle bin before creating a new one.")] Boolean RestoreFromRecycleBin; + [Read, Description("Returns the X.500 distinguished name of the Organizational Unit.")] String DistinguishedName; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/README.md new file mode 100644 index 0000000..66887e9 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/README.md @@ -0,0 +1,11 @@ +# Description + +The ADOrganizational Unit DSC resource will manage Organizational Units (OUs) within Active Directory. An OU is a +subdivision within an Active Directory into which you can place users, groups, computers, and other organizational +units. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. +* The parameter `RestoreFromRecycleBin` requires that the feature Recycle Bin has been enabled prior to an object being + deleted. If the Recycle Bin feature is disabled then the property `msDS-LastKnownRDN` is not added the deleted object. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/en-US/MSFT_ADOrganizationalUnit.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/en-US/MSFT_ADOrganizationalUnit.strings.psd1 new file mode 100644 index 0000000..09d4977 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/en-US/MSFT_ADOrganizationalUnit.strings.psd1 @@ -0,0 +1,20 @@ +# culture="en-US" +ConvertFrom-StringData @' + RetrievingOU = Retrieving OU '{0}' from path '{1}'. (ADOU0001) + UpdatingOU = Updating OU '{0}'. (ADOU0002) + DeletingOU = Deleting OU '{0}'. (ADOU0003) + CreatingOU = Creating OU '{0}'. (ADOU0004) + RestoringOU = Attempting to restore the organizational unit object' {0}' from the recycle bin. (ADOU0005) + OUInDesiredState = OU '{0}' exists and is in the desired state. (ADOU0006) + OUExistsButShouldNot = OU '{0}' exists when it should not exist. (ADOU0007) + OUDoesNotExistButShould = OU '{0}' does not exist when it should exist. (ADOU0008) + OUDoesNotExistAndShouldNot = OU '{0}' does not exist and is in the desired state. (ADOU00090) + PathNotFoundError = The Path '{0}' was not found. (ADOU0010) + OUIsPresent = The OU '{0}' is present. (ADOU0011) + OUIsAbsent = The OU '{0}' is absent. (ADOU0012) + OUPathIsAbsent = The OU Parent Path '{0}' is absent. (ADOU0013) + GetResourceError = Error getting OU '{0}'. (ADOU0014) + NewResourceError = Error adding OU '{0}'. (ADOU0015) + SetResourceError = Error updating OU '{0}'. (ADOU0016) + RemoveResourceError = Error removing OU '{0}'. (ADOU0017) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/en-US/about_ADOrganizationalUnit.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/en-US/about_ADOrganizationalUnit.help.txt new file mode 100644 index 0000000..6bd4b38 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADOrganizationalUnit/en-US/about_ADOrganizationalUnit.help.txt @@ -0,0 +1,85 @@ +.NAME + ADOrganizationalUnit + +.DESCRIPTION + The ADOrganizational Unit DSC resource will manage Organizational Units (OUs) within Active Directory. An OU is a + subdivision within an Active Directory into which you can place users, groups, computers, and other organizational + units. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + * The parameter `RestoreFromRecycleBin` requires that the feature Recycle Bin has been enabled prior to an object being + deleted. If the Recycle Bin feature is disabled then the property `msDS-LastKnownRDN` is not added the deleted object. + +.PARAMETER Name + Key - String + The name of the Organizational Unit (OU). + +.PARAMETER Path + Key - String + Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies whether the Organizational Unit (OU) should be present or absent. Default value is 'Present'. + +.PARAMETER Credential + Write - PSCredential + The credential to be used to perform the operation on Active Directory. + +.PARAMETER ProtectedFromAccidentalDeletion + Write - Boolean + Specifies if the Organizational Unit (OU) container should be protected from deletion. Default value is $true. + +.PARAMETER Description + Write - String + Specifies the description of the Organizational Unit (OU). Default value is empty (''). + +.PARAMETER RestoreFromRecycleBin + Write - Boolean + Try to restore the Organizational Unit (OU) from the recycle bin before creating a new one. + +.EXAMPLE 1 + +This configuration will add an Active Directory organizational unit to the domain. + +Configuration ADOrganizationalUnit_CreateADOU_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [System.Boolean] + $ProtectedFromAccidentalDeletion = $true, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Description = '' + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADOrganizationalUnit 'ExampleOU' + { + Name = $Name + Path = $Path + ProtectedFromAccidentalDeletion = $ProtectedFromAccidentalDeletion + Description = $Description + Ensure = 'Present' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/MSFT_ADReplicationSite.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/MSFT_ADReplicationSite.psm1 new file mode 100644 index 0000000..e1ddb96 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/MSFT_ADReplicationSite.psm1 @@ -0,0 +1,237 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADReplicationSite' + +<# + .SYNOPSIS + Returns the current state of the AD replication site. + + .PARAMETER Name + Specifies the name of the AD replication site. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $RenameDefaultFirstSiteName + ) + + # Get the replication site filtered by it's name. If the site is not + # present, the command will return $null. + Write-Verbose -Message ($script:localizedData.GetReplicationSite -f $Name) + $replicationSite = Get-ADReplicationSite -Filter { Name -eq $Name } -ErrorAction SilentlyContinue + + if ($null -eq $replicationSite) + { + Write-Verbose -Message ($script:localizedData.ReplicationSiteAbsent -f $Name) + $returnValue = @{ + Ensure = 'Absent' + Name = $Name + Description = $null + RenameDefaultFirstSiteName = $RenameDefaultFirstSiteName + } + } + else + { + Write-Verbose -Message ($script:localizedData.ReplicationSitePresent -f $Name) + $returnValue = @{ + Ensure = 'Present' + Name = $Name + Description = $replicationSite.Description + RenameDefaultFirstSiteName = $RenameDefaultFirstSiteName + } + } + + return $returnValue +} + +<# + .SYNOPSIS + Add, remove or rename the AD replication site. + + .PARAMETER Ensure + Specifies if the AD replication site should be added or remove. Default + value is 'Present'. + + .PARAMETER Name + Specifies the name of the AD replication site. + + .PARAMETER RenameDefaultFirstSiteName + Specify if the Default-First-Site-Name should be renamed, if it exists. + Dafult value is 'false'. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $RenameDefaultFirstSiteName = $false, + + [Parameter()] + [System.String] + $Description + ) + + $getTargetResourceResult = Get-TargetResource -Name $Name -RenameDefaultFirstSiteName $RenameDefaultFirstSiteName + + if ($Ensure -eq 'Present') + { + if ($getTargetResourceResult.Ensure -eq 'Absent') + { + $defaultFirstSiteName = Get-ADReplicationSite -Filter { Name -eq 'Default-First-Site-Name' } -ErrorAction SilentlyContinue + + <# + Check if the user specified to rename the Default-First-Site-Name + and if it still exists. If both is true, rename the replication site + instead of creating a new site. + #> + if ($RenameDefaultFirstSiteName -and $null -ne $defaultFirstSiteName) + { + Write-Verbose -Message ($script:localizedData.AddReplicationSiteDefaultFirstSiteName -f $Name) + + Rename-ADObject -Identity $defaultFirstSiteName.DistinguishedName -NewName $Name -ErrorAction Stop + } + else + { + Write-Verbose -Message ($script:localizedData.AddReplicationSite -f $Name) + + $newADReplicationSiteParameters = @{ + Name = $Name + ErrorAction = 'Stop' + } + + if ($PSBoundParameters.ContainsKey('Description')) + { + $newADReplicationSiteParameters['Description'] = $Description + } + + New-ADReplicationSite @newADReplicationSiteParameters + } + } + + if ($PSBoundParameters.ContainsKey('Description') -and $getTargetResourceResult.Description -ne $Description) + { + Write-Verbose -Message ($script:localizedData.UpdateReplicationSite -f $Name) + Set-ADReplicationSite -Identity $Name -Description $Description + } + } + + if ($Ensure -eq 'Absent') + { + Write-Verbose -Message ($script:localizedData.RemoveReplicationSite -f $Name) + + Remove-ADReplicationSite -Identity $Name -Confirm:$false -ErrorAction Stop + } +} + +<# + .SYNOPSIS + Test the AD replication site. + + .PARAMETER Ensure + Specifies if the AD replication site should be added or remove. Default + value is 'Present'. + + .PARAMETER Name + Specifies the name of the AD replication site. + + .PARAMETER RenameDefaultFirstSiteName + Specify if the Default-First-Site-Name should be renamed, if it exists. + Dafult value is 'false'. + + .PARAMETER Description + Specifies a description of the object. This parameter sets the value of + the Description property for the object. The LDAP Display Name + (ldapDisplayName) for this property is 'description'. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $RenameDefaultFirstSiteName = $false, + + [Parameter()] + [System.String] + $Description + ) + + $getTargetResourceResult = Get-TargetResource -Name $Name -RenameDefaultFirstSiteName $RenameDefaultFirstSiteName + $configurationCompliant = $true + + if ($getTargetResourceResult.Ensure -eq 'Absent') + { + # Site doesn't exist + if ($getTargetResourceResult.Ensure -eq $Ensure) + { + # Site should not exist + Write-Verbose -Message ($script:localizedData.ReplicationSiteInDesiredState -f $Name) + } + else + { + #Site should exist + Write-Verbose -Message ($script:localizedData.ReplicationSiteNotInDesiredState -f $Name) + $configurationCompliant = $false + } + } + else + { + # Site Exists + if ($getTargetResourceResult.Ensure -eq $Ensure) + { + # Site should exist + if ($PSBoundParameters.ContainsKey('Description') -and $getTargetResourceResult.Description -ne $Description) + { + Write-Verbose -Message ($script:localizedData.ReplicationSiteNotInDesiredState -f $Name) + $configurationCompliant = $false + } + else + { + Write-Verbose -Message ($script:localizedData.ReplicationSiteInDesiredState -f $Name) + } + } + else + { + # Site should not exist + Write-Verbose -Message ($script:localizedData.ReplicationSiteNotInDesiredState -f $Name) + $configurationCompliant = $false + } + } + + return $configurationCompliant +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/MSFT_ADReplicationSite.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/MSFT_ADReplicationSite.schema.mof new file mode 100644 index 0000000..2993c35 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/MSFT_ADReplicationSite.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADReplicationSite")] +class MSFT_ADReplicationSite : OMI_BaseResource +{ + [Write, Description("Specifies if the Active Directory replication site should be present or absent. Default value is 'Present'."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Key, Description("Specifies the name of the Active Directory replication site.")] String Name; + [Write, Description("Specifies if the Default-First-Site-Name should be renamed if it exists. Default value is $false.")] Boolean RenameDefaultFirstSiteName; + [Write, Description("Specifies a description of the object. This parameter sets the value of the Description property for the object. The LDAP Display Name (ldapDisplayName) for this property is 'description'.")] String Description; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/README.md new file mode 100644 index 0000000..43ef6b0 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/README.md @@ -0,0 +1,7 @@ +# Description + +The ADReplicationSite DSC resource will manage Replication Sites within Active Directory. Sites are used in Active Directory to either enable clients to discover network resources (published shares, domain controllers) close to the physical location of a client computer or to reduce network traffic over wide area network (WAN) links. Sites can also be used to optimize replication between domain controllers. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/en-US/MSFT_ADReplicationSite.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/en-US/MSFT_ADReplicationSite.strings.psd1 new file mode 100644 index 0000000..7a30f4d --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/en-US/MSFT_ADReplicationSite.strings.psd1 @@ -0,0 +1,12 @@ +# culture='en-US' +ConvertFrom-StringData @' + AddReplicationSiteDefaultFirstSiteName = Add the replication site 'Default-First-Site-Name' to '{0}'. (ADRS0001) + AddReplicationSite = Add the replication site '{0}'. (ADRS0002) + RemoveReplicationSite = Remove the replication site '{0}'. (ADRS0003) + GetReplicationSite = Getting replication site '{0}'. (ADRS0004) + ReplicationSiteAbsent = Replication site '{0}' is not present. (ADRS0005) + ReplicationSitePresent = Replication site '{0}' is present. (ADRS0006) + ReplicationSiteInDesiredState = The replication site '{0}' is in the desired state. (ADRS0007) + ReplicationSiteNotInDesiredState = The replication site '{0}' is not in the desired state. (ADRS0008) + UpdateReplicationSite = The replication site '{0}' needs to be updated. +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/en-US/about_ADReplicationSite.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/en-US/about_ADReplicationSite.help.txt new file mode 100644 index 0000000..eb08cab --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSite/en-US/about_ADReplicationSite.help.txt @@ -0,0 +1,87 @@ +.NAME + ADReplicationSite + +.DESCRIPTION + The ADReplicationSite DSC resource will manage Replication Sites within Active Directory. Sites are used in Active Directory to either enable clients to discover network resources (published shares, domain controllers) close to the physical location of a client computer or to reduce network traffic over wide area network (WAN) links. Sites can also be used to optimize replication between domain controllers. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if the Active Directory replication site should be present or absent. Default value is 'Present'. + +.PARAMETER Name + Key - String + Specifies the name of the Active Directory replication site. + +.PARAMETER RenameDefaultFirstSiteName + Write - Boolean + Specifies if the Default-First-Site-Name should be renamed if it exists. Default value is $false. + +.PARAMETER Description + Write - String + Specifies a description of the object. This parameter sets the value of the Description property for the object. The LDAP Display Name (ldapDisplayName) for this property is 'description'. + +.EXAMPLE 1 + +This configuration will create an Active Directory replication site +called 'Seattle'. + +Configuration ADReplicationSite_CreateADReplicationSite_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADReplicationSite 'SeattleSite' + { + Ensure = 'Present' + Name = 'Seattle' + } + } +} + +.EXAMPLE 2 + +This configuration will create an Active Directory replication site called +'Seattle'. If the 'Default-First-Site-Name' site exists, it will rename +this site instead of create a new one. + +Configuration ADReplicationSite_CreateADReplicationSiteRenameDefault_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADReplicationSite 'SeattleSite' + { + Ensure = 'Present' + Name = 'Seattle' + RenameDefaultFirstSiteName = $true + } + } +} + +.EXAMPLE 3 + +This configuration will remove the Active Directory replication site +called 'Cupertino'. + +Configuration ADReplicationSite_RemoveADReplicationSite_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADReplicationSite 'CupertinoSite' + { + Ensure = 'Absent' + Name = 'Cupertino' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/MSFT_ADReplicationSiteLink.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/MSFT_ADReplicationSiteLink.psm1 new file mode 100644 index 0000000..b5ecd8e --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/MSFT_ADReplicationSiteLink.psm1 @@ -0,0 +1,605 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADReplicationSiteLink' + +<# + .SYNOPSIS + Gets the current configuration on an AD Replication Site Link. + + .PARAMETER Name + Specifies the name of the AD Replication Site Link. + + .PARAMETER SitesExcluded + Specifies the list of sites to remove from a site link. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.String[]] + $SitesExcluded + ) + + try + { + $siteLink = Get-ADReplicationSiteLink -Identity $Name -Properties 'Description', 'Options' + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + Write-Verbose -Message ($script:localizedData.SiteLinkNotFound -f $Name) + + $siteLink = $null + } + catch + { + $errorMessage = $script:localizedData.GetSiteLinkUnexpectedError -f $Name + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + if ($null -ne $siteLink) + { + $siteCommonNames = @() + + if ($siteLink.SitesIncluded) + { + foreach ($siteDN in $siteLink.SitesIncluded) + { + $siteCommonNames += Resolve-SiteLinkName -SiteName $siteDn + } + } + + if ($null -eq $siteLink.Options) + { + $siteLinkOptions = Get-EnabledOptions -OptionValue 0 + } + else + { + $siteLinkOptions = Get-EnabledOptions -OptionValue $siteLink.Options + } + + $sitesExcludedEvaluated = $SitesExcluded | + Where-Object -FilterScript { $_ -notin $siteCommonNames } + + $returnValue = @{ + Name = $Name + Cost = $siteLink.Cost + Description = $siteLink.Description + ReplicationFrequencyInMinutes = $siteLink.ReplicationFrequencyInMinutes + SitesIncluded = $siteCommonNames + SitesExcluded = $sitesExcludedEvaluated + OptionChangeNotification = $siteLinkOptions.USE_NOTIFY + OptionTwoWaySync = $siteLinkOptions.TWOWAY_SYNC + OptionDisableCompression = $siteLinkOptions.DISABLE_COMPRESSION + Ensure = 'Present' + } + } + else + { + $returnValue = @{ + Name = $Name + Cost = $null + Description = $null + ReplicationFrequencyInMinutes = $null + SitesIncluded = $null + SitesExcluded = $SitesExcluded + OptionChangeNotification = $false + OptionTwoWaySync = $false + OptionDisableCompression = $false + Ensure = 'Absent' + } + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the desired configuration on an AD Replication Site Link. + + .PARAMETER Name + Specifies the name of the AD Replication Site Link. + + .PARAMETER Cost + Specifies the cost to be placed on the site link. + + .PARAMETER Description + Specifies a description of the object. + + .PARAMETER ReplicationFrequencyInMinutes + Specifies the frequency (in minutes) for which replication will occur where this site link is in use between sites. + + .PARAMETER SitesIncluded + Specifies the list of sites included in the site link. + + .PARAMETER SitesExcluded + Specifies the list of sites to remove from a site link. + + .PARAMETER OptionChangeNotification + Enables or disables Change Notification Replication on a site link. Default value is $false. + + .PARAMETER OptionTwoWaySync + Two Way Sync on a site link. Default value is $false. + + .PARAMETER OptionDisableCompression + Enables or disables Compression on a site link. Default value is $false. + + .PARAMETER Ensure + Specifies if the site link is created or deleted. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Int32] + $Cost, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.Int32] + $ReplicationFrequencyInMinutes, + + [Parameter()] + [System.String[]] + $SitesIncluded, + + [Parameter()] + [System.String[]] + $SitesExcluded, + + [Parameter()] + [System.Boolean] + $OptionChangeNotification = $false, + + [Parameter()] + [System.Boolean] + $OptionTwoWaySync = $false, + + [Parameter()] + [System.Boolean] + $OptionDisableCompression = $false, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + if ($Ensure -eq 'Present') + { + # Resource should be Present + $currentADSiteLink = Get-TargetResource -Name $Name + + <# + Since Set and New have different parameters we have to test if the + site link exists to determine what cmdlet we need to use. + #> + if ( $currentADSiteLink.Ensure -eq 'Absent' ) + { + # Resource is Absent + + # Modify parameters for splatting to New-ADReplicationSiteLink. + $newADReplicationSiteLinkParameters = @{ } + $PSBoundParameters + $newADReplicationSiteLinkParameters.Remove('Ensure') + $newADReplicationSiteLinkParameters.Remove('SitesExcluded') + $newADReplicationSiteLinkParameters.Remove('OptionChangeNotification') + $newADReplicationSiteLinkParameters.Remove('OptionTwoWaySync') + $newADReplicationSiteLinkParameters.Remove('OptionDisableCompression') + $newADReplicationSiteLinkParameters.Remove('Verbose') + + $optionsValue = ConvertTo-EnabledOptions -OptionChangeNotification $optionChangeNotification ` + -OptionTwoWaySync $optionTwoWaySync -OptionDisableCompression $optionDisableCompression + + if ($optionsValue -gt 0) + { + $newADReplicationSiteLinkParameters['OtherAttributes'] = @{ + options = $optionsValue + } + } + + Write-Verbose -Message ($script:localizedData.NewSiteLink -f $Name) + New-ADReplicationSiteLink @newADReplicationSiteLinkParameters + } + else + { + # Resource is Present + + $setADReplicationSiteLinkParameters = @{ } + $setADReplicationSiteLinkParameters['Identity'] = $Name + + $replaceParameters = @{ } + + # now we have to determine if we need to add or remove sites from SitesIncluded. + if (-not (Test-Members -ExistingMembers $currentADSiteLink.SitesIncluded ` + -MembersToInclude $SitesIncluded -MembersToExclude $SitesExcluded)) + { + # build the SitesIncluded hashtable. + $sitesIncludedParameters = @{ } + if ($SitesExcluded) + { + Write-Verbose -Message ($script:localizedData.RemovingSites -f $($SitesExcluded -join ', '), $Name) + + <# + Wrapped in $() as we were getting some weird results without it, + results were not being added into Hashtable as strings. + #> + $sitesIncludedParameters.Add('Remove', $($SitesExcluded)) + } + + if ($SitesIncluded) + { + Write-Verbose -Message ($script:localizedData.AddingSites -f $($SitesIncluded -join ', '), $Name) + + <# + Wrapped in $() as we were getting some weird results without it, + results were not being added into Hashtable as strings. + #> + $sitesIncludedParameters.Add('Add', $($SitesIncluded)) + } + + if ($null -ne $($sitesIncludedParameters.Keys)) + { + $setADReplicationSiteLinkParameters['SitesIncluded'] = $sitesIncludedParameters + } + } + + if ($PSBoundParameters.ContainsKey('Cost') -and ` + $Cost -ne $currentADSiteLink.Cost) + { + Write-Verbose -Message ($script:localizedData.SettingProperty -f + 'Cost', $Cost, $Name) + $setADReplicationSiteLinkParameters['Cost'] = $Cost + } + + if ($PSBoundParameters.ContainsKey('Description') -and ` + $Description -ne $currentADSiteLink.Description) + { + Write-Verbose -Message ($script:localizedData.SettingProperty -f + 'Description', $Description, $Name) + $setADReplicationSiteLinkParameters['Description'] = $Description + } + + if ($PSBoundParameters.ContainsKey('ReplicationFrequencyInMinutes') -and ` + $ReplicationFrequencyInMinutes -ne $currentADSiteLink.ReplicationFrequencyInMinutes) + { + Write-Verbose -Message ($script:localizedData.SettingProperty -f + 'ReplicationFrequencyInMinutes', $ReplicationFrequencyInMinutes, $Name) + $setADReplicationSiteLinkParameters['ReplicationFrequencyInMinutes'] = $ReplicationFrequencyInMinutes + } + + if ($PSBoundParameters.ContainsKey('OptionChangeNotification') -and ` + $OptionChangeNotification -ne $currentADSiteLink.OptionChangeNotification) + { + Write-Verbose -Message ($script:localizedData.SettingProperty -f + 'OptionChangeNotification', $OptionChangeNotification, $Name) + $changeNotification = $OptionChangeNotification + } + else + { + $changeNotification = $currentADSiteLink.OptionChangeNotification + } + + if ($PSBoundParameters.ContainsKey('OptionTwoWaySync') -and ` + $OptionTwoWaySync -ne $currentADSiteLink.OptionTwoWaySync) + { + Write-Verbose -Message ($script:localizedData.SettingProperty -f + 'TwoWaySync', $OptionTwoWaySync, $Name) + $twoWaySync = $OptionTwoWaySync + } + else + { + $twoWaySync = $currentADSiteLink.OptionTwoWaySync + } + + if ($PSBoundParameters.ContainsKey('OptionDisableCompression') -and ` + $OptionDisableCompression -ne $currentADSiteLink.OptionDisableCompression) + { + Write-Verbose -Message ($script:localizedData.SettingProperty -f + 'OptionDisableCompression', $OptionDisableCompression, $Name) + $disableCompression = $OptionDisableCompression + } + else + { + $disableCompression = $currentADSiteLink.OptionDisableCompression + } + + $optionsValue = ConvertTo-EnabledOptions -OptionChangeNotification $changeNotification ` + -OptionTwoWaySync $twoWaySync -OptionDisableCompression $disableCompression + + if ($optionsValue -gt 0) + { + $setADReplicationSiteLinkParameters.Add('Clear', 'Options') + } + else + { + $replaceParameters.Add('Options', $optionsValue) + } + + if ($replaceParameters.Count -gt 0) + { + $setADReplicationSiteLinkParameters.Add('Replace', $replaceParameters) + } + + Set-ADReplicationSiteLink @setADReplicationSiteLinkParameters + } + } + else + { + # Resource should be absent + + Write-Verbose -Message ($script:localizedData.RemoveSiteLink -f $Name) + + Remove-ADReplicationSiteLink -Identity $Name + } +} + +<# + .SYNOPSIS + Tests if the AD Replication Site Link is in a desired state. + + .PARAMETER Name + Specifies the name of the AD Replication Site Link. + + .PARAMETER Cost + Specifies the cost to be placed on the site link. + + .PARAMETER Description + Specifies a description of the object. + + .PARAMETER ReplicationFrequencyInMinutes + Specifies the frequency (in minutes) for which replication will occur where this site link is in use between sites. + + .PARAMETER SitesIncluded + Specifies the list of sites included in the site link. + + .PARAMETER SitesExcluded + Specifies the list of sites to remove from a site link. + + .PARAMETER OptionChangeNotification + Enables or disables Change Notification Replication on a site link. Default value is $false. + + .PARAMETER OptionTwoWaySync + Two Way Sync on a site link. Default value is $false. + + .PARAMETER OptionDisableCompression + Enables or disables Compression on a site link. Default value is $false. + + .PARAMETER Ensure + Specifies if the site link is created or deleted. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Int32] + $Cost, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.Int32] + $ReplicationFrequencyInMinutes, + + [Parameter()] + [System.String[]] + $SitesIncluded, + + [Parameter()] + [System.String[]] + $SitesExcluded, + + [Parameter()] + [System.Boolean] + $OptionChangeNotification = $false, + + [Parameter()] + [System.Boolean] + $OptionTwoWaySync = $false, + + [Parameter()] + [System.Boolean] + $OptionDisableCompression = $false, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $isCompliant = $true + $currentSiteLink = Get-TargetResource -Name $Name + + # Test for Ensure. + if ($Ensure -ne $currentSiteLink.Ensure) + { + return $false + } + + # Test for SitesIncluded. + foreach ($desiredIncludedSite in $SitesIncluded) + { + if ($desiredIncludedSite -notin $currentSiteLink.SitesIncluded) + { + Write-Verbose -Message ($script:localizedData.SiteNotFound -f $desiredIncludedSite, $($currentSiteLink.SitesIncluded -join ', ')) + $isCompliant = $false + } + } + + # Test for SitesExcluded. + foreach ($desiredExcludedSite in $SitesExcluded) + { + if ($desiredExcludedSite -in $currentSiteLink.SitesIncluded) + { + Write-Verbose -Message ($script:localizedData.SiteFoundInExcluded -f $desiredExcludedSite, $($currentSiteLink.SitesIncluded -join ', ')) + $isCompliant = $false + } + } + + foreach ($parameter in $PSBoundParameters.Keys) + { + # Test for Description|ReplicationFrequencyInMinutes|Cost. + if ($parameter -match 'Description|ReplicationFrequencyInMinutes|Cost|OptionChangeNotification|OptionTwoWaySync|OptionDisableCompression') + { + if ($PSBoundParameters[$parameter] -ne $currentSiteLink[$parameter]) + { + Write-Verbose -Message ($script:localizedData.PropertyNotInDesiredState -f $parameter, $($currentSiteLink[$parameter]), $($PSBoundParameters[$parameter])) + $isCompliant = $false + } + } + } + + return $isCompliant +} + +<# + .SYNOPSIS + Resolves the AD replication site link distinguished names to short names + + .PARAMETER SiteName + Specifies the distinguished name of a AD replication site link + + .EXAMPLE + PS C:\> Resolve-SiteLinkName -SiteName 'CN=Site1,CN=Sites,CN=Configuration,DC=contoso,DC=com' + Site1 +#> +function Resolve-SiteLinkName +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseCmdletCorrectly", "")] + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SiteName + ) + + $adSite = Get-ADReplicationSite -Identity $SiteName + + return $adSite.Name +} + +<# + .SYNOPSIS + Calculates the options enabled on a Site Link + + .PARAMETER OptionValue + The value of currently enabled options +#> +function Get-EnabledOptions +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + + param + ( + [Parameter(Mandatory = $true)] + [System.Int32] + $OptionValue + ) + + $returnValue = @{ + USE_NOTIFY = $false + TWOWAY_SYNC = $false + DISABLE_COMPRESSION = $false + } + + if (1 -band $optionValue) + { + $returnValue.USE_NOTIFY = $true + } + + if (2 -band $optionValue) + { + $returnValue.TWOWAY_SYNC = $true + } + + if (4 -band $optionValue) + { + $returnValue.DISABLE_COMPRESSION = $true + } + + return $returnValue +} + +<# + .SYNOPSIS + Calculates the options value for the given choices + + .PARAMETER OptionChangeNotification + Enable/Disable Change notification replication + + .PARAMETER OptionTwoWaySync + Enable/Disable Two Way sync + + .PARAMETER OptionDisableCompression + Enable/Disable Compression +#> +function ConvertTo-EnabledOptions +{ + [OutputType([System.Int32])] + [CmdletBinding()] + param + ( + [Parameter()] + [System.Boolean] + $OptionChangeNotification, + + [Parameter()] + [System.Boolean] + $OptionTwoWaySync, + + [Parameter()] + [System.Boolean] + $OptionDisableCompression + ) + + $returnValue = 0 + + if ($OptionChangeNotification) + { + $returnValue = $returnValue + 1 + } + + if ($OptionTwoWaySync) + { + $returnValue = $returnValue + 2 + } + + if ($OptionDisableCompression) + { + $returnValue = $returnValue + 4 + } + + return $returnValue +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/MSFT_ADReplicationSiteLink.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/MSFT_ADReplicationSiteLink.schema.mof new file mode 100644 index 0000000..533d01a --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/MSFT_ADReplicationSiteLink.schema.mof @@ -0,0 +1,15 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("ADReplicationSiteLink")] +class MSFT_ADReplicationSiteLink : OMI_BaseResource +{ + [Key, Description("Specifies the name of the site link.")] String Name; + [Write, Description("Specifies the cost to be placed on the site link.")] SInt32 Cost; + [Write, Description("This parameter sets the value of the Description property for the object.")] String Description; + [Write, Description("Species the frequency (in minutes) for which replication will occur where this site link is in use between sites.")] Sint32 ReplicationFrequencyInMinutes; + [Write, Description("Specifies the list of sites included in the site link.")] String SitesIncluded[]; + [Write, Description("Specifies the list of sites to exclude from the site link.")] String SitesExcluded[]; + [Write, Description("Specifies if the site link should be present or absent. Default value is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Enables or disables Change Notification Replication on a site link. Default value is $false.")] Boolean OptionChangeNotification; + [Write, Description("Enables or disables Two Way Sync on a site link. Default value is $false.")] Boolean OptionTwoWaySync; + [Write, Description("Enables or disables Compression on a site link. Default value is $false.")] Boolean OptionDisableCompression; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/README.md new file mode 100644 index 0000000..dc6e75b --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/README.md @@ -0,0 +1,7 @@ +# Description + +The ADReplicationSiteLink DSC resource will manage Replication Site Links within Active Directory. A site link connects two or more sites. Site links reflect the administrative policy for how sites are to be interconnected and the methods used to transfer replication traffic. You must connect sites with site links so that domain controllers at each site can replicate Active Directory changes. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/en-US/MSFT_ADReplicationSiteLink.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/en-US/MSFT_ADReplicationSiteLink.strings.psd1 new file mode 100644 index 0000000..c603ff7 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/en-US/MSFT_ADReplicationSiteLink.strings.psd1 @@ -0,0 +1,12 @@ +ConvertFrom-StringData @' + SiteNotFound = Site: '{0}' not found in SitesIncluded. Current SitesIncluded: '{1}'. (ADRSL0001) + SiteFoundInExcluded = Excluded '{0}' site found in SitesIncluded. Current SitesIncluded: '{1}'. (ADRSL0002) + PropertyNotInDesiredState = '{0}' is not in desired state Current: '{1}' Desired: '{2}'. (ADRSL0003) + SettingProperty = Setting property '{0}' to '{1}' on site link '{2}'. (ADRSL0004) + RemovingSites = Removing sites '{0}' from site link '{1}'. (ADRSL0005) + AddingSites = Adding sites '{0}' to site link '{1}'. (ADRSL0006) + NewSiteLink = Creating AD Site Link '{0}'. (ADRSL0007) + RemoveSiteLink = Removing AD Site Link '{0}'. (ADRSL0008) + SiteLinkNotFound = Could not find '{0}' site link. (ADRSL0009) + GetSiteLinkUnexpectedError = Unexpected error getting site link '{0}'. (ADRSL0010) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/en-US/about_ADReplicationSiteLink.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/en-US/about_ADReplicationSiteLink.help.txt new file mode 100644 index 0000000..a8fcd52 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSiteLink/en-US/about_ADReplicationSiteLink.help.txt @@ -0,0 +1,120 @@ +.NAME + ADReplicationSiteLink + +.DESCRIPTION + The ADReplicationSiteLink DSC resource will manage Replication Site Links within Active Directory. A site link connects two or more sites. Site links reflect the administrative policy for how sites are to be interconnected and the methods used to transfer replication traffic. You must connect sites with site links so that domain controllers at each site can replicate Active Directory changes. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER Name + Key - String + Specifies the name of the site link. + +.PARAMETER Cost + Write - SInt32 + Specifies the cost to be placed on the site link. + +.PARAMETER Description + Write - String + This parameter sets the value of the Description property for the object. + +.PARAMETER ReplicationFrequencyInMinutes + Write - SInt32 + Species the frequency (in minutes) for which replication will occur where this site link is in use between sites. + +.PARAMETER SitesIncluded + Write - StringArray + Specifies the list of sites included in the site link. + +.PARAMETER SitesExcluded + Write - StringArray + Specifies the list of sites to exclude from the site link. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if the site link should be present or absent. Default value is 'Present'. + +.PARAMETER OptionChangeNotification + Write - Boolean + Enables or disables Change Notification Replication on a site link. Default value is $false. + +.PARAMETER OptionTwoWaySync + Write - Boolean + Enables or disables Two Way Sync on a site link. Default value is $false. + +.PARAMETER OptionDisableCompression + Write - Boolean + Enables or disables Compression on a site link. Default value is $false. + +.EXAMPLE 1 + +This configuration will create an AD Replication Site Link. + +Configuration ADReplicationSiteLink_CreateReplicationSiteLink_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADReplicationSiteLink 'HQSiteLink' + { + Name = 'HQSiteLInk' + SitesIncluded = @('site1', 'site2') + Cost = 100 + ReplicationFrequencyInMinutes = 15 + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will modify an existing AD Replication Site Link. + +Configuration ADReplicationSiteLink_ModifyExistingReplicationSiteLink_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADReplicationSiteLink 'HQSiteLink' + { + Name = 'HQSiteLInk' + SitesIncluded = 'site1' + SitesExcluded = 'site2' + Cost = 100 + ReplicationFrequencyInMinutes = 20 + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will modify an existing AD Replication Site Link by enabling Replication Options. + +Configuration ADReplicationSiteLink_EnableOptions_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADReplicationSiteLink 'HQSiteLink' + { + Name = 'HQSiteLInk' + SitesIncluded = 'site1' + SitesExcluded = 'site2' + Cost = 100 + ReplicationFrequencyInMinutes = 20 + OptionChangeNotification = $true + OptionTwoWaySync = $true + OptionDisableCompression = $true + Ensure = 'Present' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/MSFT_ADReplicationSubnet.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/MSFT_ADReplicationSubnet.psm1 new file mode 100644 index 0000000..9584c34 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/MSFT_ADReplicationSubnet.psm1 @@ -0,0 +1,273 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADReplicationSubnet' + +<# + .SYNOPSIS + Returns the current state of the replication subnet. + + .PARAMETER Name + The name of the AD replication subnet, e.g. 10.0.0.0/24. + + .PARAMETER Site + The name of the assigned AD replication site, e.g. Default-First-Site-Name. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Site + ) + + <# + Get the replication subnet filtered by it's name. If the subnet is not + present, the command will return $null. + #> + Write-Verbose -Message ($script:localizedData.GetReplicationSubnet -f $Name) + + $replicationSubnet = Get-ADReplicationSubnet -Filter { Name -eq $Name } -Properties Description + + if ($null -eq $replicationSubnet) + { + # Replication subnet not found, return absent. + Write-Verbose -Message ($script:localizedData.ReplicationSubnetAbsent -f $Name) + + $returnValue = @{ + Ensure = 'Absent' + Name = $Name + Site = '' + Location = $null + Description = $null + } + } + else + { + # Get the name of the replication site, if it's not empty. + $replicationSiteName = '' + + if ($null -ne $replicationSubnet.Site) + { + $replicationSiteName = Get-ADObject -Identity $replicationSubnet.Site | + Select-Object -ExpandProperty 'Name' + } + + # Replication subnet found, return present. + Write-Verbose -Message ($script:localizedData.ReplicationSubnetPresent -f $Name) + + $returnValue = @{ + Ensure = 'Present' + Name = $Name + Site = $replicationSiteName + Location = [System.String] $replicationSubnet.Location + Description = [System.String] $replicationSubnet.Description + } + } + + return $returnValue +} + +<# + .SYNOPSIS + Add, remove or update the replication subnet. + + .PARAMETER Ensure + Specifies if the AD replication subnet should be added or remove. Default value is 'Present'. + + .PARAMETER Name + The name of the AD replication subnet, e.g. 10.0.0.0/24. + + .PARAMETER Site + The name of the assigned AD replication site, e.g. Default-First-Site-Name. + + .PARAMETER Location + The location for the AD replication site. Default value is empty. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Site, + + [Parameter()] + [System.String] + $Location = '', + + [Parameter()] + [System.String] + $Description + ) + + <# + Get the replication subnet filtered by it's name. If the subnet is not + present, the command will return $null. + #> + $replicationSubnet = Get-ADReplicationSubnet -Filter { Name -eq $Name } + + if ($Ensure -eq 'Present') + { + # Add the replication subnet, if it does not exist. + if ($null -eq $replicationSubnet) + { + Write-Verbose -Message ($script:localizedData.CreateReplicationSubnet -f $Name) + + $replicationSubnet = New-ADReplicationSubnet -Name $Name -Site $Site -PassThru + } + + <# + Get the name of the replication site, if it's not empty and update the + site if it's not vaild. + #> + if ($null -ne $replicationSubnet.Site) + { + $replicationSiteName = Get-ADObject -Identity $replicationSubnet.Site | + Select-Object -ExpandProperty 'Name' + } + + if ($replicationSiteName -ne $Site) + { + Write-Verbose -Message ($script:localizedData.SetReplicationSubnetSite -f $Name, $Site) + + Set-ADReplicationSubnet -Identity $replicationSubnet.DistinguishedName -Site $Site -PassThru + } + + <# + Update the location, if it's not valid. Ensure an empty location + string is converted to $null, because the Set-ADReplicationSubnet + does not accept an empty string for the location, but $null. + #> + $nullableLocation = $Location + if ([System.String]::IsNullOrEmpty($Location)) + { + $nullableLocation = $null + } + + if ($replicationSubnet.Location -ne $nullableLocation) + { + Write-Verbose -Message ($script:localizedData.SetReplicationSubnetLocation -f $Name, $nullableLocation) + + Set-ADReplicationSubnet -Identity $replicationSubnet.DistinguishedName -Location $nullableLocation -PassThru + } + + if ($PSBoundParameters.ContainsKey('Description')) + { + if ($replicationSubnet.Description -ne $Description) + { + Write-Verbose -Message ($script:localizedData.SetReplicationSubnetDescription -f $Name, $Description) + + Set-ADReplicationSubnet -Identity $replicationSubnet.DistinguishedName -Description $Description + } + } + } + + if ($Ensure -eq 'Absent') + { + # Remove the replication subnet, if it exists. + if ($null -ne $replicationSubnet) + { + Write-Verbose -Message ($script:localizedData.RemoveReplicationSubnet -f $Name) + + Remove-ADReplicationSubnet -Identity $replicationSubnet.DistinguishedName -Confirm:$false + } + } +} + +<# + .SYNOPSIS + Test the replication subnet. + + .PARAMETER Ensure + Specifies if the AD replication subnet should be added or remove. Default value is 'Present'. + + .PARAMETER Name + The name of the AD replication subnet, e.g. 10.0.0.0/24. + + .PARAMETER Site + The name of the assigned AD replication site, e.g. Default-First-Site-Name. + + .PARAMETER Location + The location for the AD replication site. Default value is empty. + + .PARAMETER Description + Specifies a description of the object. This parameter sets the value of the Description property for the object. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Site, + + [Parameter()] + [System.String] + $Location = '', + + [Parameter()] + [System.String] + $Description + ) + + $currentConfiguration = Get-TargetResource -Name $Name -Site $Site + + $desiredConfigurationMatch = $currentConfiguration.Ensure -eq $Ensure + + if ($Ensure -eq 'Present') + { + $desiredConfigurationMatch = $desiredConfigurationMatch -and + $currentConfiguration.Site -eq $Site -and + $currentConfiguration.Location -eq $Location -and + $currentConfiguration.Description -eq $Description + } + + if ($desiredConfigurationMatch) + { + Write-Verbose -Message ($script:localizedData.ReplicationSubnetInDesiredState -f $Name) + } + else + { + Write-Verbose -Message ($script:localizedData.ReplicationSubnetNotInDesiredState -f $Name) + } + + return $desiredConfigurationMatch +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/MSFT_ADReplicationSubnet.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/MSFT_ADReplicationSubnet.schema.mof new file mode 100644 index 0000000..e3535e9 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/MSFT_ADReplicationSubnet.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADReplicationSubnet")] +class MSFT_ADReplicationSubnet : OMI_BaseResource +{ + [Write, Description("Specifies if the Active Directory replication subnet should be present or absent. Default value is 'Present'."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Key, Description("The name of the Active Directory replication subnet, e.g. 10.0.0.0/24.")] String Name; + [Required, Description("The name of the assigned Active Directory replication site, e.g. Default-First-Site-Name.")] String Site; + [Write, Description("The location for the Active Directory replication site. Default value is empty ('') location.")] String Location; + [Write, Description("Specifies a description of the object. This parameter sets the value of the Description property for the object.")] String Description; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/README.md new file mode 100644 index 0000000..1826571 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/README.md @@ -0,0 +1,7 @@ +# Description + +The ADReplicationSubnet DSC resource will manage replication subnets. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/en-US/MSFT_ADReplicationSubnet.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/en-US/MSFT_ADReplicationSubnet.strings.psd1 new file mode 100644 index 0000000..ea55efb --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/en-US/MSFT_ADReplicationSubnet.strings.psd1 @@ -0,0 +1,13 @@ +# culture='en-US' +ConvertFrom-StringData @' + CreateReplicationSubnet = Create the replication subnet '{0}'. (ADRS0001) + RemoveReplicationSubnet = Remove the replication subnet '{0}'. (ADRS0002) + GetReplicationSubnet = Getting replication subnet '{0}'. (ADRS0003) + SetReplicationSubnetSite = Set the replication subnet '{0}' site to '{1}'. (ADRS0004) + SetReplicationSubnetLocation = Set the replication subnet '{0}' location to '{1}'. (ADRS0005) + ReplicationSubnetAbsent = Replication subnet '{0}' is absent. (ADRS0006) + ReplicationSubnetPresent = Replication subnet '{0}' is present. (ADRS0007) + ReplicationSubnetInDesiredState = The replication subnet '{0}' is in the desired state. (ADRS0008) + ReplicationSubnetNotInDesiredState = The replication subnet '{0}' is not in the desired state. (ADRS0009) + SetReplicationSubnetDescription = Set the replication subnet '{0}' description to '{1}'. (ADRS0010) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/en-US/about_ADReplicationSubnet.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/en-US/about_ADReplicationSubnet.help.txt new file mode 100644 index 0000000..6e9d4c0 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADReplicationSubnet/en-US/about_ADReplicationSubnet.help.txt @@ -0,0 +1,52 @@ +.NAME + ADReplicationSubnet + +.DESCRIPTION + The ADReplicationSubnet DSC resource will manage replication subnets. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if the Active Directory replication subnet should be present or absent. Default value is 'Present'. + +.PARAMETER Name + Key - String + The name of the Active Directory replication subnet, e.g. 10.0.0.0/24. + +.PARAMETER Site + Required - String + The name of the assigned Active Directory replication site, e.g. Default-First-Site-Name. + +.PARAMETER Location + Write - String + The location for the Active Directory replication site. Default value is empty ('') location. + +.PARAMETER Description + Write - String + Specifies a description of the object. This parameter sets the value of the Description property for the object. + +.EXAMPLE 1 + +This configuration will create an AD Replication Subnet. + +Configuration ADReplicationSubnet_CreateReplicationSubnet_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADReplicationSubnet 'LondonSubnet' + { + Name = '10.0.0.0/24' + Site = 'London' + Location = 'Datacenter 3' + Description = 'Datacenter Management Subnet' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/MSFT_ADServicePrincipalName.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/MSFT_ADServicePrincipalName.psm1 new file mode 100644 index 0000000..a2b6a28 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/MSFT_ADServicePrincipalName.psm1 @@ -0,0 +1,207 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_ADServicePrincipalName' + +<# + .SYNOPSIS + Returns the current state of the specified service principal name. + + .PARAMETER ServicePrincipalName + The full SPN to add or remove, e.g. HOST/LON-DC1. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServicePrincipalName + ) + + Write-Verbose -Message ($script:localizedData.GetServicePrincipalName -f $ServicePrincipalName) + + $spnAccounts = Get-ADObject -Filter { ServicePrincipalName -eq $ServicePrincipalName } -Properties 'SamAccountName' | + Select-Object -ExpandProperty 'SamAccountName' + + if ($spnAccounts.Count -eq 0) + { + # No SPN found + Write-Verbose -Message ($script:localizedData.ServicePrincipalNameAbsent -f $ServicePrincipalName) + + $returnValue = @{ + Ensure = 'Absent' + ServicePrincipalName = $ServicePrincipalName + Account = '' + } + } + else + { + # One or more SPN(s) found, return the account name(s) + Write-Verbose -Message ($script:localizedData.ServicePrincipalNamePresent -f $ServicePrincipalName, ($spnAccounts -join ';')) + + $returnValue = @{ + Ensure = 'Present' + ServicePrincipalName = $ServicePrincipalName + Account = $spnAccounts -join ';' + } + } + + return $returnValue +} + +<# + .SYNOPSIS + Add or remove the service principal name. + + .PARAMETER Ensure + Specifies if the service principal name should be added or removed. + + .PARAMETER ServicePrincipalName + The full SPN to add or remove, e.g. HOST/LON-DC1. + + .PARAMETER Account + The user or computer account to add or remove the SPN to , e.g. User1 or + LON-DC1$. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServicePrincipalName, + + [Parameter()] + [AllowEmptyString()] + [System.String] + $Account + ) + + # Get all Active Directory object having the target SPN configured. + $spnAccounts = Get-ADObject -Filter { ServicePrincipalName -eq $ServicePrincipalName } -Properties 'SamAccountName', 'DistinguishedName' + + if ($Ensure -eq 'Present') + { + <# + Throw an exception, if no account was specified or the account does + not exist. + #> + if ([System.String]::IsNullOrEmpty($Account) -or ($null -eq (Get-ADObject -Filter { SamAccountName -eq $Account }))) + { + throw ($script:localizedData.AccountNotFound -f $Account) + } + + # Remove the SPN(s) from any extra account. + foreach ($spnAccount in $spnAccounts) + { + if ($spnAccount.SamAccountName -ne $Account) + { + Write-Verbose -Message ($script:localizedData.RemoveServicePrincipalName -f $ServicePrincipalName, $spnAccount.SamAccountName) + + Set-ADObject -Identity $spnAccount.DistinguishedName -Remove @{ + ServicePrincipalName = $ServicePrincipalName + } + } + } + + <# + Add the SPN to the target account. Use Get-ADObject to get the target + object filtered by SamAccountName. Set-ADObject does not support the + field SamAccountName as Identifier. + #> + if ($spnAccounts.SamAccountName -notcontains $Account) + { + Write-Verbose -Message ($script:localizedData.AddServicePrincipalName -f $ServicePrincipalName, $Account) + + Get-ADObject -Filter { SamAccountName -eq $Account } | + Set-ADObject -Add @{ + ServicePrincipalName = $ServicePrincipalName + } + } + } + + # Remove the SPN from any account + if ($Ensure -eq 'Absent') + { + foreach ($spnAccount in $spnAccounts) + { + Write-Verbose -Message ($script:localizedData.RemoveServicePrincipalName -f $ServicePrincipalName, $spnAccount.SamAccountName) + + Set-ADObject -Identity $spnAccount.DistinguishedName -Remove @{ + ServicePrincipalName = $ServicePrincipalName + } + } + } +} + +<# + .SYNOPSIS + Tests the service principal name. + + .PARAMETER Ensure + Specifies if the service principal name should be added or removed. + + .PARAMETER ServicePrincipalName + The full SPN to add or remove, e.g. HOST/LON-DC1. + + .PARAMETER Account + The user or computer account to add or remove the SPN to, e.g. User1 or + LON-DC1$. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServicePrincipalName, + + [Parameter()] + [AllowEmptyString()] + [System.String] + $Account + ) + + $currentConfiguration = Get-TargetResource -ServicePrincipalName $ServicePrincipalName + + $desiredConfigurationMatch = $currentConfiguration.Ensure -eq $Ensure + + if ($Ensure -eq 'Present') + { + $desiredConfigurationMatch = $desiredConfigurationMatch -and + $currentConfiguration.Account -eq $Account + } + + if ($desiredConfigurationMatch) + { + Write-Verbose -Message ($script:localizedData.ServicePrincipalNameInDesiredState -f $ServicePrincipalName) + } + else + { + Write-Verbose -Message ($script:localizedData.ServicePrincipalNameNotInDesiredState -f $ServicePrincipalName) + } + + return $desiredConfigurationMatch +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/MSFT_ADServicePrincipalName.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/MSFT_ADServicePrincipalName.schema.mof new file mode 100644 index 0000000..2634d76 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/MSFT_ADServicePrincipalName.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADServicePrincipalName")] +class MSFT_ADServicePrincipalName : OMI_BaseResource +{ + [Write, Description("Specifies if the service principal name should be added or removed. Default value is 'Present'."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Key, Description("The full SPN to add or remove, e.g. HOST/LON-DC1.")] String ServicePrincipalName; + [Write, Description("The user or computer account to add or remove the SPN to, e.g. User1 or LON-DC1$. Default value is ''. If Ensure is set to Present, a value must be specified.")] String Account; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/README.md new file mode 100644 index 0000000..fbad07f --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/README.md @@ -0,0 +1,7 @@ +# Description + +The ADServicePrincipalName DSC resource will manage service principal names. A service principal name (SPN) is a unique identifier of a service instance. SPNs are used by Kerberos authentication to associate a service instance with a service logon account. This allows a client application to request that the service authenticate an account even if the client does not have the account name. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/en-US/MSFT_ADServicePrincipalName.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/en-US/MSFT_ADServicePrincipalName.strings.psd1 new file mode 100644 index 0000000..7fddbf1 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/en-US/MSFT_ADServicePrincipalName.strings.psd1 @@ -0,0 +1,11 @@ +# culture='en-US' +ConvertFrom-StringData @' + GetServicePrincipalName = Getting service principal name '{0}'. (ADSPN0001) + ServicePrincipalNameAbsent = Service principal name '{0}' is absent. (ADSPN0002) + ServicePrincipalNamePresent = Service principal name '{0}' is present on account(s) '{1}'. (ADSPN0003) + AccountNotFound = Active Directory object with SamAccountName '{0}' not found. (ADSPN0004) + RemoveServicePrincipalName = Removing service principal name '{0}' from account '{1}'. (ADSPN0005) + AddServicePrincipalName = Adding service principal name '{0}' to account '{1}. (ADSPN0006) + ServicePrincipalNameInDesiredState = Service principal name '{0}' is in the desired state. (ADSPN0007) + ServicePrincipalNameNotInDesiredState = Service principal name '{0}' is not in the desired state. (ADSPN0008) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/en-US/about_ADServicePrincipalName.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/en-US/about_ADServicePrincipalName.help.txt new file mode 100644 index 0000000..bbe4184 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADServicePrincipalName/en-US/about_ADServicePrincipalName.help.txt @@ -0,0 +1,60 @@ +.NAME + ADServicePrincipalName + +.DESCRIPTION + The ADServicePrincipalName DSC resource will manage service principal names. A service principal name (SPN) is a unique identifier of a service instance. SPNs are used by Kerberos authentication to associate a service instance with a service logon account. This allows a client application to request that the service authenticate an account even if the client does not have the account name. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if the service principal name should be added or removed. Default value is 'Present'. + +.PARAMETER ServicePrincipalName + Key - String + The full SPN to add or remove, e.g. HOST/LON-DC1. + +.PARAMETER Account + Write - String + The user or computer account to add or remove the SPN to, e.g. User1 or LON-DC1$. Default value is ''. If Ensure is set to Present, a value must be specified. + +.EXAMPLE 1 + +This configuration will add a Service Principal Name to a user account. + +Configuration ADServicePrincipalName_AddUserServicePrincipalName_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADServicePrincipalName 'SQL01Svc' + { + ServicePrincipalName = 'MSSQLSvc/sql01.contoso.com:1433' + Account = 'SQL01Svc' + } + } +} + +.EXAMPLE 2 + +This configuration will add a Service Principal Name to a computer account. + +Configuration ADServicePrincipalName_AddComputerServicePrincipalName_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADServicePrincipalName 'web.contoso.com' + { + ServicePrincipalName = 'HTTP/web.contoso.com' + Account = 'IIS01$' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.PropertyMap.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.PropertyMap.psd1 new file mode 100644 index 0000000..b9b27d9 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.PropertyMap.psd1 @@ -0,0 +1,310 @@ +@{ + Parameters = @( + @{ + Parameter = 'CommonName' + ADProperty = 'cn' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'UserPrincipalName' + ADProperty = 'UserPrincipalName' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'DisplayName' + ADProperty = 'DisplayName' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Path' + ADProperty = 'distinguishedName' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'GivenName' + ADProperty = 'GivenName' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Initials' + ADProperty = 'Initials' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Surname' + ADProperty = 'sn' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Description' + ADProperty = 'Description' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'StreetAddress' + ADProperty = 'StreetAddress' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'POBox' + ADProperty = 'PostOfficeBox' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'City' + ADProperty = 'l' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'State' + ADProperty = 'st' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'PostalCode' + ADProperty = 'PostalCode' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Country' + ADProperty = 'c' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Department' + ADProperty = 'Department' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Division' + ADProperty = 'Division' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Company' + ADProperty = 'Company' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Office' + ADProperty = 'physicalDeliveryOfficeName' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'JobTitle' + ADProperty = 'title' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'EmailAddress' + ADProperty = 'mail' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'EmployeeID' + ADProperty = 'EmployeeID' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'EmployeeNumber' + ADProperty = 'EmployeeNumber' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'HomeDirectory' + ADProperty = 'HomeDirectory' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'HomeDrive' + ADProperty = 'HomeDrive' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'HomePage' + ADProperty = 'wWWHomePage' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'ProfilePath' + ADProperty = 'ProfilePath' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'LogonScript' + ADProperty = 'scriptPath' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Notes' + ADProperty = 'info' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'OfficePhone' + ADProperty = 'telephoneNumber' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'MobilePhone' + ADProperty = 'mobile' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Fax' + ADProperty = 'facsimileTelephoneNumber' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Pager' + ADProperty = 'Pager' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'IPPhone' + ADProperty = 'IPPhone' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'HomePhone' + ADProperty = 'HomePhone' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Enabled' + ADProperty = 'Enabled' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'Manager' + ADProperty = 'Manager' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'LogonWorkstations' + ADProperty = 'userWorkStations' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'Organization' + ADProperty = 'o' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'OtherName' + ADProperty = 'middleName' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'ThumbnailPhoto' + ADProperty = 'thumbnailPhoto' + UseCmdletParameter = $false + Array = $false + } + @{ + Parameter = 'PasswordNeverExpires' + ADProperty = 'PasswordNeverExpires' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'CannotChangePassword' + ADProperty = 'CannotChangePassword' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'ChangePasswordAtLogon' + ADProperty = 'pwdLastSet' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'TrustedForDelegation' + ADProperty = 'TrustedForDelegation' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'AccountNotDelegated' + ADProperty = 'AccountNotDelegated' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'AllowReversiblePasswordEncryption' + ADProperty = 'AllowReversiblePasswordEncryption' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'CompoundIdentitySupported' + ADProperty = 'CompoundIdentitySupported' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'PasswordNotRequired' + ADProperty = 'PasswordNotRequired' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'SmartcardLogonRequired' + ADProperty = 'SmartcardLogonRequired' + UseCmdletParameter = $true + Array = $false + } + @{ + Parameter = 'ServicePrincipalNames' + ADProperty = 'ServicePrincipalName' + UseCmdletParameter = $false + Array = $true + } + @{ + Parameter = 'ProxyAddresses' + ADProperty = 'ProxyAddresses' + UseCmdletParameter = $false + Array = $true + } + ) +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.psm1 new file mode 100644 index 0000000..308ad35 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.psm1 @@ -0,0 +1,1934 @@ +[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPassWordParams', '')] +[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingPlainTextForPassword", "PasswordAuthentication")] +param () + +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:dscResourceName = [System.IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name) + +$script:localizedData = Get-LocalizedData -ResourceName $script:dscResourceName + +# Import a property map that maps the DSC resource parameters to the Active Directory user attributes. +$adPropertyMapPath = Join-Path -Path $PSScriptRoot -ChildPath "$($script:dscResourceName).PropertyMap.psd1" +$adPropertyMap = (Import-PowerShellDataFile -Path $adPropertyMapPath).Parameters + +<# + .SYNOPSIS + Returns the current state of the Active Directory User + + .PARAMETER DomainName + Name of the domain where the user account is located (only used if password is managed). + + .PARAMETER UserName + Specifies the Security Account Manager (SAM) account name of the user (ldapDisplayName 'sAMAccountName'). + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to use to perform the task. + + .PARAMETER Credential + Specifies the user account credentials to use to perform this task. + + .NOTES + Used Functions: + Name | Module + ------------------------------|-------------------------- + Get-ADUser | ActiveDirectory + Assert-Module | ActiveDirectoryDsc.Common + Get-ADCommonParameters | ActiveDirectoryDsc.Common + New-InvalidOperationException | ActiveDirectoryDsc.Common + Get-ADObjectParentDN | ActiveDirectoryDsc.Common + Get-MD5HashString | MSFT_ADUser +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $UserName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + $adCommonParameters = Get-ADCommonParameters @PSBoundParameters + + Write-Verbose -Message ($script:localizedData.RetrievingADUser -f $UserName, $DomainName) + + try + { + $adUser = Get-ADUser @adCommonParameters -Properties $adPropertyMap.ADProperty + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + Write-Verbose -Message ($script:localizedData.ADUserNotPresent -f $UserName, $DomainName) + + $adUser = $null + } + catch + { + $errorMessage = $script:localizedData.RetrievingADUserError -f $UserName, $DomainName + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + if ($adUser) + { + Write-Verbose -Message ($script:localizedData.ADUserIsPresent -f $UserName, $DomainName) + + $targetResource = @{ + DistinguishedName = $adUser.DistinguishedName # Read-only property + DomainController = $DomainController + DomainName = $DomainName + Ensure = 'Present' + Password = $null + UserName = $UserName + } + + # Retrieve each property from the ADPropertyMap and add to the hashtable + foreach ($property in $adPropertyMap) + { + $parameter = $property.Parameter + if ($parameter -eq 'Path') + { + # The path returned is not the parent container + if (-not [System.String]::IsNullOrEmpty($adUser.DistinguishedName)) + { + $targetResource[$parameter] = Get-ADObjectParentDN -DN $adUser.DistinguishedName + } + } + elseif ($parameter -eq 'ChangePasswordAtLogon') + { + if ($adUser.pwdlastset -eq 0) + { + $targetResource[$parameter] = $true + } + else + { + $targetResource[$parameter] = $false + } + } + elseif ($parameter -eq 'ThumbnailPhoto') + { + if ([System.String]::IsNullOrEmpty($adUser.$parameter)) + { + $targetResource[$parameter] = $null + $targetResource['ThumbnailPhotoHash'] = $null + } + else + { + $targetResource[$parameter] = [System.Convert]::ToBase64String($adUser.$parameter) + $targetResource['ThumbnailPhotoHash'] = Get-MD5HashString -Bytes $adUser.$parameter + } + } + else + { + $aDProperty = $property.ADProperty + if ($property.Array) + { + $targetResource[$parameter] = [System.String[]] $adUser.$ADProperty + } + else + { + $targetResource[$parameter] = $adUser.$aDProperty + } + } + } + } + else + { + $targetResource = @{ + DistinguishedName = $null + DomainController = $DomainController + DomainName = $DomainName + Ensure = 'Absent' + Password = $null + UserName = $UserName + } + + foreach ($property in $adPropertyMap) + { + $targetResource[$property.Parameter] = $null + } + } + + return $targetResource +} # end function Get-TargetResource + +<# + .SYNOPSIS + Tests the state of the Active Directory user account. + + .PARAMETER DomainName + Name of the domain where the user account is located (only used if password is managed). + + .PARAMETER UserName + Specifies the Security Account Manager (SAM) account name of the user (ldapDisplayName 'sAMAccountName'). + + .PARAMETER Password + Specifies a new password value for the account. + + .PARAMETER Ensure + Specifies whether the user account should be present or absent. Default value is 'Present'. + + .PARAMETER CommonName + Specifies the common name assigned to the user account (ldapDisplayName 'cn'). If not specified the default + value will be the same value provided in parameter UserName. + + .PARAMETER UserPrincipalName + Specifies the User Principal Name (UPN) assigned to the user account (ldapDisplayName 'userPrincipalName'). + + .PARAMETER DisplayName + Specifies the display name of the object (ldapDisplayName 'displayName'). + + .PARAMETER Path + Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created. + + .PARAMETER GivenName + Specifies the user's given name (ldapDisplayName 'givenName'). + + .PARAMETER Initials + Specifies the initials that represent part of a user's name (ldapDisplayName 'initials'). + + .PARAMETER Surname + Specifies the user's last name or surname (ldapDisplayName 'sn'). + + .PARAMETER Description + Specifies a description of the object (ldapDisplayName 'description'). + + .PARAMETER StreetAddress + Specifies the user's street address (ldapDisplayName 'streetAddress'). + + .PARAMETER POBox + Specifies the user's post office box number (ldapDisplayName 'postOfficeBox'). + + .PARAMETER City + Specifies the user's town or city (ldapDisplayName 'l'). + + .PARAMETER State + Specifies the user's or Organizational Unit's state or province (ldapDisplayName 'st'). + + .PARAMETER PostalCode + Specifies the user's postal code or zip code (ldapDisplayName 'postalCode'). + + .PARAMETER Country + Specifies the country or region code for the user's language of choice (ldapDisplayName 'c'). + + .PARAMETER Department + Specifies the user's department (ldapDisplayName 'department'). + + .PARAMETER Division + Specifies the user's division (ldapDisplayName 'division'). + + .PARAMETER Company + Specifies the user's company (ldapDisplayName 'company'). + + .PARAMETER Office + Specifies the location of the user's office or place of business (ldapDisplayName 'physicalDeliveryOfficeName'). + + .PARAMETER JobTitle + Specifies the user's title (ldapDisplayName 'title'). + + .PARAMETER EmailAddress + Specifies the user's e-mail address (ldapDisplayName 'mail'). + + .PARAMETER EmployeeID + Specifies the user's employee ID (ldapDisplayName 'employeeID'). + + .PARAMETER EmployeeNumber + Specifies the user's employee number (ldapDisplayName 'employeeNumber'). + + .PARAMETER HomeDirectory + Specifies a user's home directory path (ldapDisplayName 'homeDirectory'). + + .PARAMETER HomeDrive + Specifies a drive that is associated with the UNC path defined by the HomeDirectory property (ldapDisplayName + 'homeDrive'). + + .PARAMETER HomePage + Specifies the URL of the home page of the object (ldapDisplayName 'wWWHomePage'). + + .PARAMETER ProfilePath + Specifies a path to the user's profile (ldapDisplayName 'profilePath'). + + .PARAMETER LogonScript + Specifies a path to the user's log on script (ldapDisplayName 'scriptPath'). + + .PARAMETER Notes + Specifies the notes attached to the user's account (ldapDisplayName 'info'). + + .PARAMETER OfficePhone + Specifies the user's office telephone number (ldapDisplayName 'telephoneNumber'). + + .PARAMETER MobilePhone + Specifies the user's mobile phone number (ldapDisplayName 'mobile'). + + .PARAMETER Fax + Specifies the user's fax phone number (ldapDisplayName 'facsimileTelephoneNumber'). + + .PARAMETER HomePhone + Specifies the user's home telephone number (ldapDisplayName 'homePhone'). + + .PARAMETER Pager + Specifies the user's pager number (ldapDisplayName 'pager'). + + .PARAMETER IPPhone + Specifies the user's IP telephony phone number (ldapDisplayName 'ipPhone'). + + .PARAMETER Manager + Specifies the user's manager specified as a Distinguished Name (ldapDisplayName 'manager'). + + .PARAMETER LogonWorkstations + Specifies the computers that the user can access. To specify more than one computer, create a single + comma-separated list. You can identify a computer by using the Security Account Manager (SAM) account name + (sAMAccountName) or the DNS host name of the computer. The SAM account name is the same as the NetBIOS name of + the computer (ldapDisplayName 'userWorkStations'). + + .PARAMETER Organization + Specifies the user's organization. This parameter sets the Organization property of a user object + (ldapDisplayName 'o'). + + .PARAMETER OtherName + Specifies a name in addition to a user's given name and surname, such as the user's middle name. This parameter + sets the OtherName property of a user object (ldapDisplayName 'middleName'). + + .PARAMETER Enabled + Specifies if the account is enabled. Default value is $true. + + .PARAMETER CannotChangePassword + Specifies whether the account password can be changed. + + .PARAMETER ChangePasswordAtLogon + Specifies whether the account password must be changed during the next logon attempt. This will only be enabled + when the user is initially created. This parameter cannot be set to $true if the parameter PasswordNeverExpires + is also set to $true. + + .PARAMETER PasswordNeverExpires + Specifies whether the password of an account can expire. + + .PARAMETER TrustedForDelegation + Specifies whether an account is trusted for Kerberos delegation. Default value is $false. + + .PARAMETER AccountNotDelegated + Indicates whether the security context of the user is delegated to a service. When this parameter is set to + true, the security context of the account is not delegated to a service even when the service account is set as + trusted for Kerberos delegation. This parameter sets the AccountNotDelegated property for an Active Directory + account. This parameter also sets the ADS_UF_NOT_DELEGATED flag of the Active Directory User Account Control + (UAC) attribute. + + .PARAMETER AllowReversiblePasswordEncryption + Indicates whether reversible password encryption is allowed for the account. This parameter sets the + AllowReversiblePasswordEncryption property of the account. This parameter also sets the + ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED flag of the Active Directory User Account Control (UAC) attribute. + + .PARAMETER CompoundIdentitySupported + Specifies whether an account supports Kerberos service tickets which includes the authorization data for the + user's device. This value sets the compound identity supported flag of the Active Directory + msDS-SupportedEncryptionTypes attribute. + + .PARAMETER PasswordNotRequired + Specifies whether the account requires a password. A password is not required for a new account. This parameter + sets the PasswordNotRequired property of an account object. + + .PARAMETER SmartcardLogonRequired + Specifies whether a smart card is required to logon. This parameter sets the SmartCardLoginRequired property + for a user object. This parameter also sets the ADS_UF_SMARTCARD_REQUIRED flag of the Active Directory + User Account Control attribute. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to use to perform the task. + + .PARAMETER Credential + Specifies the user account credentials to use to perform this task. + + .PARAMETER PasswordAuthentication + Specifies the authentication context type used when testing passwords. Default value is 'Default'. + + .PARAMETER PasswordNeverResets + Specifies whether existing user's password should be reset. Default value is $false. + + .PARAMETER RestoreFromRecycleBin + Try to restore the user object from the recycle bin before creating a new one. + + .PARAMETER ServicePrincipalNames + Specifies the service principal names for the user account. + + .PARAMETER ProxyAddresses + Specifies the proxy addresses for the user account. + + .PARAMETER ThumbnailPhoto + Specifies the thumbnail photo to be used for the user object. Can be set either to a path pointing to a + .jpg-file, or to a Base64-encoded jpeg image. If set to an empty string ('') the current thumbnail photo will + be removed. The property ThumbnailPhoto will always return the image as a Base64-encoded string even if the + configuration specified a file path. + + .NOTES + Used Functions: + Name | Module + -----------------------|-------------------------- + Assert-Parameters | MSFT_ADUser + Test-Password | ActiveDirectoryDsc.Common + Compare-ThumbnailPhoto | MSFT_ADUser +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $UserName, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Password, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNull()] + [System.String] + $CommonName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $UserPrincipalName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Path, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $GivenName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Initials, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Surname, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $StreetAddress, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $POBox, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $City, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $State, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $PostalCode, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Country, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Department, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Division, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Company, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Office, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $JobTitle, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $EmailAddress, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $EmployeeID, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $EmployeeNumber, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $HomeDirectory, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $HomeDrive, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $HomePage, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $ProfilePath, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $LogonScript, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Notes, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $OfficePhone, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $MobilePhone, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Fax, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $HomePhone, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Pager, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $IPPhone, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Manager, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $LogonWorkstations, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Organization, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $OtherName, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $Enabled = $true, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $CannotChangePassword, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $ChangePasswordAtLogon, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $TrustedForDelegation, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $AccountNotDelegated, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $AllowReversiblePasswordEncryption, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $CompoundIdentitySupported, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $PasswordNotRequired, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $SmartcardLogonRequired, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateSet('Default', 'Negotiate')] + [System.String] + $PasswordAuthentication = 'Default', + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $PasswordNeverResets = $false, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin, + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $ServicePrincipalNames, + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $ProxyAddresses, + + [Parameter()] + [System.String] + $ThumbnailPhoto + ) + + <# + This is a workaround to set the CommonName default to UserName to make the resource able to enter debug mode. + For more information see issue https://github.com/PowerShell/ActiveDirectoryDsc/issues/427. + #> + if (-not $PSBoundParameters.ContainsKey('CommonName')) + { + $CommonName = $UserName + } + Assert-Parameters @PSBoundParameters + + $parameters = @{} + $PSBoundParameters + $parameters.Remove('DomainName') + $parameters.Remove('UserName') + $parameters.Remove('RestoreFromRecycleBin') + $parameters.Remove('PasswordNeverResets') + $parameters.Remove('PasswordAuthentication') + $parameters.Remove('DomainController') + $parameters.Remove('Credential') + $parameters.Remove('Ensure') + $parameters.Remove('Verbose') + $parameters.Remove('Debug') + + # Add parameters with default values as they may not be explicitly passed + $parameters['Enabled'] = $Enabled + + $getParameters = @{ + DomainName = $DomainName + UserName = $UserName + } + + if ($PSBoundParameters.ContainsKey('DomainController')) + { + $getParameters['DomainController'] = $DomainController + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getParameters['Credential'] = $Credential + } + + $targetResource = Get-TargetResource @getParameters + + $inDesiredState = $true + + if ($targetResource.Ensure -eq 'Present') + { + if ($Ensure -eq 'Present') + { + foreach ($parameter in $parameters.Keys) + { + if ($parameter -eq 'Password') + { + # Only process the Password parameter if the PasswordNeverResets parameter is false + if ($PasswordNeverResets -eq $false) + { + $testPasswordParams = @{ + Username = $UserName + Password = $Password + DomainName = $DomainName + PasswordAuthentication = $PasswordAuthentication + } + + if ($Credential) + { + $testPasswordParams['Credential'] = $Credential + } + + if (-not (Test-Password @testPasswordParams)) + { + Write-Verbose -Message ($script:localizedData.ADUserNotDesiredPropertyState -f + 'Password', '', '') + + $inDesiredState = $false + } + } + } + elseif ($parameter -eq 'ChangePasswordAtLogon' -and $parameters.$parameter -eq $true) + { + # Only process the 'ChangePasswordAtLogon = $true' parameter during new user creation + continue + } + elseif ($parameter -eq 'ThumbnailPhoto') + { + <# + Compare thumbnail hash, if they are the same the function + Compare-ThumbnailPhoto returns $null if they are the same. + #> + $compareThumbnailPhotoResult = Compare-ThumbnailPhoto -DesiredThumbnailPhoto $ThumbnailPhoto ` + -CurrentThumbnailPhotoHash $targetResource.ThumbnailPhotoHash + + if ($compareThumbnailPhotoResult) + { + Write-Verbose -Message ($script:localizedData.ADUserNotDesiredPropertyState -f + $parameter, ('Hash: ' + $compareThumbnailPhotoResult.DesiredThumbnailPhotoHash), + ('Hash: ' + $compareThumbnailPhotoResult.CurrentThumbnailPhotoHash)) + + $inDesiredState = $false + } + } + + # This check is required to be able to explicitly remove values with an empty string, if required + elseif (([System.String]::IsNullOrEmpty($parameters.$parameter)) -and ` + ([System.String]::IsNullOrEmpty($targetResource.$parameter))) + { + <# + Both values are null/empty and therefore we are compliant + Must catch this scenario separately, as Compare-Object can't compare Null objects + #> + continue + } + elseif (($null -ne $parameters.$parameter -and $null -eq $targetResource.$parameter) -or + ($null -eq $parameters.$parameter -and $null -ne $targetResource.$parameter) -or + (Compare-Object -ReferenceObject $parameters.$parameter ` + -DifferenceObject $targetResource.$parameter)) + { + Write-Verbose -Message ($script:localizedData.ADUserNotDesiredPropertyState -f + $parameter, ($parameters.$parameter -join '; '), ($targetResource.$parameter -join '; ')) + + $inDesiredState = $false + } + } #end foreach PSBoundParameter + + if ($inDesiredState) + { + # Resource is in desired state + Write-Verbose -Message ($script:localizedData.ADUserInDesiredState -f $UserName) + } + else + { + # Resource is not in the desired state + Write-Verbose -Message ($script:localizedData.ADUserNotInDesiredState -f $UserName) + } + } + else + { + # Resource should be Absent + Write-Verbose -Message ($script:localizedData.ADUserIsPresentButShouldBeAbsent -f $UserName) + + $inDesiredState = $false + } + } + else + { + # Resource is Absent + if ($Ensure -eq 'Present') + { + # Resource should be Present + Write-Verbose -Message ($script:localizedData.ADUserIsAbsentButShouldBePresent -f $UserName) + + $inDesiredState = $false + } + else + { + # Resource should be Absent + Write-Verbose ($script:localizedData.ADUserInDesiredState -f $UserName) + + $inDesiredState = $true + } + } + + return $inDesiredState +} # end function Test-TargetResource + +<# + .SYNOPSIS + Sets the properties of the Active Directory user account. + + .PARAMETER DomainName + Name of the domain where the user account is located (only used if password is managed). + + .PARAMETER UserName + Specifies the Security Account Manager (SAM) account name of the user (ldapDisplayName 'sAMAccountName'). + + .PARAMETER Password + Specifies a new password value for the account. + + .PARAMETER Ensure + Specifies whether the user account should be present or absent. Default value is 'Present'. + + .PARAMETER CommonName + Specifies the common name assigned to the user account (ldapDisplayName 'cn'). If not specified the default + value will be the same value provided in parameter UserName. + + .PARAMETER UserPrincipalName + Specifies the User Principal Name (UPN) assigned to the user account (ldapDisplayName 'userPrincipalName'). + + .PARAMETER DisplayName + Specifies the display name of the object (ldapDisplayName 'displayName'). + + .PARAMETER Path + Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created. + + .PARAMETER GivenName + Specifies the user's given name (ldapDisplayName 'givenName'). + + .PARAMETER Initials + Specifies the initials that represent part of a user's name (ldapDisplayName 'initials'). + + .PARAMETER Surname + Specifies the user's last name or surname (ldapDisplayName 'sn'). + + .PARAMETER Description + Specifies a description of the object (ldapDisplayName 'description'). + + .PARAMETER StreetAddress + Specifies the user's street address (ldapDisplayName 'streetAddress'). + + .PARAMETER POBox + Specifies the user's post office box number (ldapDisplayName 'postOfficeBox'). + + .PARAMETER City + Specifies the user's town or city (ldapDisplayName 'l'). + + .PARAMETER State + Specifies the user's or Organizational Unit's state or province (ldapDisplayName 'st'). + + .PARAMETER PostalCode + Specifies the user's postal code or zip code (ldapDisplayName 'postalCode'). + + .PARAMETER Country + Specifies the country or region code for the user's language of choice (ldapDisplayName 'c'). + + .PARAMETER Department + Specifies the user's department (ldapDisplayName 'department'). + + .PARAMETER Division + Specifies the user's division (ldapDisplayName 'division'). + + .PARAMETER Company + Specifies the user's company (ldapDisplayName 'company'). + + .PARAMETER Office + Specifies the location of the user's office or place of business (ldapDisplayName 'physicalDeliveryOfficeName'). + + .PARAMETER JobTitle + Specifies the user's title (ldapDisplayName 'title'). + + .PARAMETER EmailAddress + Specifies the user's e-mail address (ldapDisplayName 'mail'). + + .PARAMETER EmployeeID + Specifies the user's employee ID (ldapDisplayName 'employeeID'). + + .PARAMETER EmployeeNumber + Specifies the user's employee number (ldapDisplayName 'employeeNumber'). + + .PARAMETER HomeDirectory + Specifies a user's home directory path (ldapDisplayName 'homeDirectory'). + + .PARAMETER HomeDrive + Specifies a drive that is associated with the UNC path defined by the HomeDirectory property (ldapDisplayName + 'homeDrive'). + + .PARAMETER HomePage + Specifies the URL of the home page of the object (ldapDisplayName 'wWWHomePage'). + + .PARAMETER ProfilePath + Specifies a path to the user's profile (ldapDisplayName 'profilePath'). + + .PARAMETER LogonScript + Specifies a path to the user's log on script (ldapDisplayName 'scriptPath'). + + .PARAMETER Notes + Specifies the notes attached to the user's account (ldapDisplayName 'info'). + + .PARAMETER OfficePhone + Specifies the user's office telephone number (ldapDisplayName 'telephoneNumber'). + + .PARAMETER MobilePhone + Specifies the user's mobile phone number (ldapDisplayName 'mobile'). + + .PARAMETER Fax + Specifies the user's fax phone number (ldapDisplayName 'facsimileTelephoneNumber'). + + .PARAMETER HomePhone + Specifies the user's home telephone number (ldapDisplayName 'homePhone'). + + .PARAMETER Pager + Specifies the user's pager number (ldapDisplayName 'pager'). + + .PARAMETER IPPhone + Specifies the user's IP telephony phone number (ldapDisplayName 'ipPhone'). + + .PARAMETER Manager + Specifies the user's manager specified as a Distinguished Name (ldapDisplayName 'manager'). + + .PARAMETER LogonWorkstations + Specifies the computers that the user can access. To specify more than one computer, create a single + comma-separated list. You can identify a computer by using the Security Account Manager (SAM) account name + (sAMAccountName) or the DNS host name of the computer. The SAM account name is the same as the NetBIOS name of + the computer (ldapDisplayName 'userWorkStations'). + + .PARAMETER Organization + Specifies the user's organization. This parameter sets the Organization property of a user object + (ldapDisplayName 'o'). + + .PARAMETER OtherName + Specifies a name in addition to a user's given name and surname, such as the user's middle name. This parameter + sets the OtherName property of a user object (ldapDisplayName 'middleName'). + + .PARAMETER Enabled + Specifies if the account is enabled. Default value is $true. + + .PARAMETER CannotChangePassword + Specifies whether the account password can be changed. + + .PARAMETER ChangePasswordAtLogon + Specifies whether the account password must be changed during the next logon attempt. This will only be enabled + when the user is initially created. This parameter cannot be set to $true if the parameter PasswordNeverExpires + is also set to $true. + + .PARAMETER PasswordNeverExpires + Specifies whether the password of an account can expire. + + .PARAMETER TrustedForDelegation + Specifies whether an account is trusted for Kerberos delegation. Default value is $false. + + .PARAMETER AccountNotDelegated + Indicates whether the security context of the user is delegated to a service. When this parameter is set to + true, the security context of the account is not delegated to a service even when the service account is set as + trusted for Kerberos delegation. This parameter sets the AccountNotDelegated property for an Active Directory + account. This parameter also sets the ADS_UF_NOT_DELEGATED flag of the Active Directory User Account Control + (UAC) attribute. + + .PARAMETER AllowReversiblePasswordEncryption + Indicates whether reversible password encryption is allowed for the account. This parameter sets the + AllowReversiblePasswordEncryption property of the account. This parameter also sets the + ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED flag of the Active Directory User Account Control (UAC) attribute. + + .PARAMETER CompoundIdentitySupported + Specifies whether an account supports Kerberos service tickets which includes the authorization data for the + user's device. This value sets the compound identity supported flag of the Active Directory + msDS-SupportedEncryptionTypes attribute. + + .PARAMETER PasswordNotRequired + Specifies whether the account requires a password. A password is not required for a new account. This parameter + sets the PasswordNotRequired property of an account object. + + .PARAMETER SmartcardLogonRequired + Specifies whether a smart card is required to logon. This parameter sets the SmartCardLoginRequired property + for a user object. This parameter also sets the ADS_UF_SMARTCARD_REQUIRED flag of the Active Directory + User Account Control attribute. + + .PARAMETER DomainController + Specifies the Active Directory Domain Services instance to use to perform the task. + + .PARAMETER Credential + Specifies the user account credentials to use to perform this task. + + .PARAMETER PasswordAuthentication + Specifies the authentication context type used when testing passwords. Default value is 'Default'. + + .PARAMETER PasswordNeverResets + Specifies whether existing user's password should be reset. Default value is $false. + + .PARAMETER RestoreFromRecycleBin + Try to restore the user object from the recycle bin before creating a new one. + + .PARAMETER ServicePrincipalNames + Specifies the service principal names for the user account. + + .PARAMETER ProxyAddresses + Specifies the proxy addresses for the user account. + + .PARAMETER ThumbnailPhoto + Specifies the thumbnail photo to be used for the user object. Can be set either to a path pointing to a + .jpg-file, or to a Base64-encoded jpeg image. If set to an empty string ('') the current thumbnail photo will + be removed. The property ThumbnailPhoto will always return the image as a Base64-encoded string even if the + configuration specified a file path. + + .NOTES + Used Functions: + Name | Module + -----------------------|-------------------------- + Assert-Parameters | MSFT_ADUser + Compare-ThumbnailPhoto | MSFT_ADUser + Get-ThumbnailByteArray | MSFT_ADUser + Get-MD5HashString | MSFT_ADUser + Get-ADCommonParameters | ActiveDirectoryDsc.Common + Restore-ADCommonObject | ActiveDirectoryDsc.Common + Test-Password | ActiveDirectoryDsc.Common + New-ADUser | ActiveDirectory + Set-ADAccountPassword | ActiveDirectory + Set-ADUser | ActiveDirectory + Move-ADObject | ActiveDirectory + Rename-ADObject | ActiveDirectory + Remove-ADUser | ActiveDirectory +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $UserName, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Password, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNull()] + [System.String] + $CommonName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $UserPrincipalName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Path, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $GivenName, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Initials, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Surname, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $StreetAddress, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $POBox, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $City, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $State, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $PostalCode, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Country, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Department, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Division, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Company, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Office, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $JobTitle, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $EmailAddress, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $EmployeeID, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $EmployeeNumber, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $HomeDirectory, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $HomeDrive, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $HomePage, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $ProfilePath, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $LogonScript, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Notes, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $OfficePhone, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $MobilePhone, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Fax, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $HomePhone, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Pager, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $IPPhone, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Manager, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $LogonWorkstations, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Organization, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $OtherName, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $Enabled = $true, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $CannotChangePassword, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $ChangePasswordAtLogon, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $TrustedForDelegation, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $AccountNotDelegated, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $AllowReversiblePasswordEncryption, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $CompoundIdentitySupported, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $PasswordNotRequired, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $SmartcardLogonRequired, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DomainController, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateSet('Default', 'Negotiate')] + [System.String] + $PasswordAuthentication = 'Default', + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $PasswordNeverResets = $false, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $RestoreFromRecycleBin, + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $ServicePrincipalNames, + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $ProxyAddresses, + + [Parameter()] + [System.String] + $ThumbnailPhoto + ) + + <# + This is a workaround to set the CommonName default to UserName to make the resource able to enter debug mode. + For more information see issue https://github.com/PowerShell/ActiveDirectoryDsc/issues/427. + #> + if (-not $PSBoundParameters.ContainsKey('CommonName')) + { + $CommonName = $UserName + } + + Assert-Parameters @PSBoundParameters + + $parameters = @{} + $PSBoundParameters + $parameters.Remove('DomainName') + $parameters.Remove('UserName') + $parameters.Remove('PasswordNeverResets') + $parameters.Remove('PasswordAuthentication') + $parameters.Remove('RestoreFromRecycleBin') + $parameters.Remove('DomainController') + $parameters.Remove('Credential') + $parameters.Remove('Ensure') + $parameters.Remove('Verbose') + $parameters.Remove('Debug') + + # Add parameters with default values as they may not be explicitly passed + $parameters['Enabled'] = $Enabled + + $getParameters = @{ + DomainName = $DomainName + UserName = $UserName + } + + if ($PSBoundParameters.ContainsKey('DomainController')) + { + $getParameters['DomainController'] = $DomainController + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getParameters['Credential'] = $Credential + } + + $targetResource = Get-TargetResource @getParameters + + $restorationSuccessful = $false + + if ($Ensure -eq 'Present') + { + # Resource should be Present + if ($targetResource.Ensure -eq 'Absent') + { + # Resource is Absent + if ($RestoreFromRecycleBin) + { + # Try to restore account if it exists + Write-Verbose -Message ($script:localizedData.RestoringUser -f $UserName) + + $restoreParams = Get-ADCommonParameters @PSBoundParameters + $restorationSuccessful = Restore-ADCommonObject @restoreParams -ObjectClass User -ErrorAction Stop + } + + if (-not $RestoreFromRecycleBin -or ($RestoreFromRecycleBin -and -not $restorationSuccessful)) + { + # User does not exist and needs creating + $newADUserParams = Get-ADCommonParameters @PSBoundParameters -UseNameParameter + + $otherUserAttributes = @{} + $updateCnRequired = $false + + foreach ($parameter in $parameters.keys) + { + $adProperty = $adPropertyMap | + Where-Object -FilterScript { $_.Parameter -eq $parameter } + + if ($parameter -eq 'Password') + { + $newADUserParams['AccountPassword'] = $Password.Password + } + elseif ($parameter -eq 'CommonName') + { + if ($CommonName -ne $UserName) + { + # Need to set different CN using Rename after user creation + $updateCnRequired = $true + } + } + elseif ($parameter -eq 'ThumbnailPhoto') + { + [System.Byte[]] $thumbnailPhotoBytes = Get-ThumbnailByteArray ` + -ThumbnailPhoto $ThumbnailPhoto -Verbose:$false + + $otherUserAttributes[$adProperty.ADProperty] = $thumbnailPhotoBytes + } + else + { + if ($adProperty.UseCmdletParameter -eq $true) + { + # We need to pass the parameter explicitly to New-ADUser, not via -OtherAttributes + $newADUserParams[$adProperty.Parameter] = $parameters.$parameter + } + else + { + $otherUserAttributes[$adProperty.ADProperty] = $parameters.$parameter + } + } + } + + if ($otherUserAttributes.Keys.Count -gt 0) + { + $newADUserParams['OtherAttributes'] = $otherUserAttributes + } + + Write-Verbose -Message ($script:localizedData.AddingADUser -f $UserName, $DomainName) + + Write-Debug -Message ('New-ADUser Parameters:' + ($newADUserParams | Out-String)) + + $newADUser = New-ADUser @newADUserParams -SamAccountName $UserName -Passthru + + if ($updateCnRequired) + { + $renameAdObjectParameters = Get-ADCommonParameters @PSBoundParameters + + # Using the SamAccountName for identity with Rename-ADObject does not work, use the DN instead + $renameAdObjectParameters['Identity'] = $newADUser.DistinguishedName + + Rename-ADObject @renameAdObjectParameters -NewName $CommonName + } + } + } + if ($targetResource.Ensure -eq 'Present' -or $restorationSuccessful) + { + # Resource is Present or has just been restored from the recycle bin + $setADUserParams = @{} + $replaceUserProperties = @{} + $clearUserProperties = @() + $moveUserRequired = $false + $updateCnRequired = $false + + foreach ($parameter in $parameters.Keys) + { + # Find the associated AD property + $adProperty = $adPropertyMap | + Where-Object -FilterScript { $_.Parameter -eq $parameter } + + if ($parameter -eq 'Path') + { + if ($parameters.Path -ne $targetResource.Path) + { + # Move user after any property changes + $moveUserRequired = $true + } + } + elseif ($parameter -eq 'CommonName') + { + if ($parameters.CommonName -ne $targetResource.CommonName) + { + # Update CN after any property changes + $updateCnRequired = $true + } + } + elseif ($parameter -eq 'Password') + { + # Only process the Password parameter if the PasswordNeverResets parameter is false + if ($PasswordNeverResets -eq $false) + { + $adCommonParameters = Get-ADCommonParameters @PSBoundParameters + $testPasswordParams = @{ + Username = $UserName + Password = $Password + DomainName = $DomainName + PasswordAuthentication = $PasswordAuthentication + } + + if ($Credential) + { + $testPasswordParams['Credential'] = $Credential + } + if (-not (Test-Password @testPasswordParams)) + { + Write-Verbose -Message ($script:localizedData.SettingADUserPassword -f $UserName) + + Set-ADAccountPassword @adCommonParameters -Reset -NewPassword $Password.Password + } + } + } + elseif ($parameter -eq 'ChangePasswordAtLogon') + { + # Only process the 'ChangePasswordAtLogon = $true' parameter during new user creation + continue + } + elseif ($parameter -eq 'ThumbnailPhoto') + { + # Compare thumbnail hash, if they are the same the function Compare-ThumbnailPhoto returns $null. + if (Compare-ThumbnailPhoto -DesiredThumbnailPhoto $ThumbnailPhoto ` + -CurrentThumbnailPhotoHash $targetResource.ThumbnailPhotoHash) + { + if ($ThumbnailPhoto -eq [System.String]::Empty) + { + $clearUserProperties += $adProperty.ADProperty + + Write-Verbose -Message ($script:localizedData.ClearingADUserProperty -f + $adProperty.ADProperty) + } + else + { + [System.Byte[]] $thumbnailPhotoBytes = Get-ThumbnailByteArray ` + -ThumbnailPhoto $ThumbnailPhoto -Verbose:$false + + $thumbnailPhotoHash = Get-MD5HashString -Bytes $thumbnailPhotoBytes + + Write-Verbose -Message ($script:localizedData.UpdatingThumbnailPhotoProperty -f + $adProperty.ADProperty, $thumbnailPhotoHash) + + $replaceUserProperties[$adProperty.ADProperty] = $thumbnailPhotoBytes + } + } + } + elseif (([System.String]::IsNullOrEmpty($parameters.$parameter)) -and ` + ([System.String]::IsNullOrEmpty($targetResource.$parameter))) + { + <# + Both values are null/empty and therefore we are compliant + Must catch this scenario separately, as Compare-Object can't compare Null objects + #> + continue + } + # Use Compare-Object to allow comparison of string and array parameters + elseif (($null -ne $parameters.$parameter -and $null -eq $targetResource.$parameter) -or + ($null -eq $parameters.$parameter -and $null -ne $targetResource.$parameter) -or + (Compare-Object -ReferenceObject $parameters.$parameter ` + -DifferenceObject $targetResource.$parameter)) + { + if ([System.String]::IsNullOrEmpty($parameters.$parameter) -and ` + (-not ([System.String]::IsNullOrEmpty($targetResource.$parameter)))) + { + # We are clearing the existing value + Write-Verbose -Message ($script:localizedData.ClearingADUserProperty -f $parameter) + + $clearUserProperties += $adProperty.ADProperty + } #end if clear existing value + else + { + # We are replacing the existing value + Write-Verbose -Message ($script:localizedData.UpdatingADUserProperty -f + $parameter, ($parameters.$parameter -join ',')) + + if ($adProperty.UseCmdletParameter -eq $true) + { + # We need to pass the parameter explicitly to Set-ADUser, not via -Replace + $setADUserParams[$adProperty.ADProperty] = $parameters.$parameter + } + else + { + $replaceUserProperties[$adProperty.ADProperty] = $parameters.$parameter + } + } + } + } + + # Only pass -Clear and/or -Replace if we have something to set/change + if ($replaceUserProperties.Count -gt 0) + { + $setADUserParams['Replace'] = $replaceUserProperties + } + + if ($clearUserProperties.Count -gt 0) + { + $setADUserParams['Clear'] = $clearUserProperties; + } + + # Only call Set-ADUser if there are properties to change + if ($setADUserParams.Keys.Count -gt 0) + { + $setADUserParams += Get-ADCommonParameters @PSBoundParameters + + Write-Verbose -Message ($script:localizedData.UpdatingADUser -f $UserName, $DomainName) + + Write-Debug ('Set-ADUser Parameters: ' + ($setADUserParams | Out-String)) + + Set-ADUser @setADUserParams | Out-Null + } + + if ($moveUserRequired) + { + # Cannot move users by updating the DistinguishedName property + $moveAdObjectParameters = Get-ADCommonParameters @PSBoundParameters + + # Using the SamAccountName for identity with Move-ADObject does not work, use the DN instead + $moveAdObjectParameters['Identity'] = $targetResource.DistinguishedName + + Write-Verbose -Message ($script:localizedData.MovingADUser -f + $targetResource.Path, $parameters.Path) + + Move-ADObject @moveAdObjectParameters -TargetPath $parameters.Path + + # Set new target resource DN in case a rename is also required + $targetResource.DistinguishedName = "cn=$($targetResource.CommonName),$($parameters.Path)" + } + + if ($updateCnRequired) + { + # Cannot update the CN property directly. Must use Rename-ADObject + $renameAdObjectParameters = Get-ADCommonParameters @PSBoundParameters + + # Using the SamAccountName for identity with Rename-ADObject does not work, use the DN instead + $renameAdObjectParameters['Identity'] = $targetResource.DistinguishedName + + Write-Verbose -Message ($script:localizedData.UpdatingADUserProperty -f + 'CommonName', $parameters.CommonName) + + Rename-ADObject @renameAdObjectParameters -NewName $parameters.CommonName + } + } + } + elseif (($Ensure -eq 'Absent') -and ($targetResource.Ensure -eq 'Present')) + { + # User exists and needs removing + Write-Verbose ($script:localizedData.RemovingADUser -f $UserName, $DomainName) + + $adCommonParameters = Get-ADCommonParameters @PSBoundParameters + + Remove-ADUser @adCommonParameters -Confirm:$false | Out-Null + } + +} # end function Set-TargetResource + +<# + .SYNOPSIS + Internal function to validate unsupported options/configurations. + + .PARAMETER Password + Specifies a new password value for the account. + + .PARAMETER Enabled + Specifies if the account is enabled. Default value is $true. + + .PARAMETER ChangePasswordAtLogon + Specifies whether the account password must be changed during the next + logon attempt. This will only be enabled when the user is initially + created. This parameter cannot be set to $true if the parameter + PasswordNeverExpires is also set to $true. + + .PARAMETER PasswordNeverExpires + Specifies whether the password of an account can expire. + + .PARAMETER IgnoredArguments + Sets the rest of the arguments that are not passed into the this + function. +#> +function Assert-Parameters +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + $Password, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $Enabled = $true, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $ChangePasswordAtLogon, + + [Parameter()] + [ValidateNotNull()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter(ValueFromRemainingArguments)] + $IgnoredArguments + ) + + # We cannot test/set passwords on disabled AD accounts + if (($PSBoundParameters.ContainsKey('Password')) -and ($Enabled -eq $false)) + { + $errorMessage = $script:localizedData.PasswordParameterConflictError -f 'Enabled', $false, 'Password' + New-InvalidArgumentException -ArgumentName 'Password' -Message $errorMessage + } + + # ChangePasswordAtLogon cannot be set for an account that also has PasswordNeverExpires set + if ($PSBoundParameters.ContainsKey('ChangePasswordAtLogon') -and ` + $PSBoundParameters['ChangePasswordAtLogon'] -eq $true -and ` + $PSBoundParameters.ContainsKey('PasswordNeverExpires') -and ` + $PSBoundParameters['PasswordNeverExpires'] -eq $true) + { + $errorMessage = $script:localizedData.ChangePasswordParameterConflictError + New-InvalidArgumentException -ArgumentName 'ChangePasswordAtLogon, PasswordNeverExpires' -Message $errorMessage + } + +} #end function Assert-Parameters + +<# + .SYNOPSIS + Internal function to calculate the thumbnailPhoto hash. + + .PARAMETER Bytes + A Byte array that will be hashed. + + .OUTPUTS + Returns the MD5 hash of the bytes past in parameter Bytes, or $null if + the value of parameter is $null. +#> +function Get-MD5HashString +{ + [CmdletBinding()] + [OutputType([System.Byte[]])] + param + ( + [Parameter(Mandatory = $true)] + [AllowNull()] + [System.Byte[]] + $Bytes + ) + + $md5ReturnValue = $null + + if ($null -ne $Bytes) + { + $md5 = [System.Security.Cryptography.MD5]::Create() + $hashBytes = $md5.ComputeHash($Bytes) + + $md5ReturnValue = [System.BitConverter]::ToString($hashBytes).Replace('-', '') + } + + return $md5ReturnValue +} # end function Get-MD5HashString + +<# + .SYNOPSIS + Internal function to convert either a .jpg-file or a Base64-encoded jpeg + image to a Byte array. + + .PARAMETER ThumbnailPhoto + A string of either a .jpg-file or the string of a Base64-encoded jpeg image. + + .OUTPUTS + Returns a byte array of the image specified in the parameter ThumbnailPhoto. +#> +function Get-ThumbnailByteArray +{ + [CmdletBinding()] + [OutputType([System.Byte[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ThumbnailPhoto + ) + + # If $ThumbnailPhoto contains '.' or '\' then we assume that we have a file path + if ($ThumbnailPhoto -match '\.|\\') + { + if (Test-Path -Path $ThumbnailPhoto) + { + Write-Verbose -Message ($script:localizedData.LoadingThumbnailFromFile -f $ThumbnailPhoto) + $thumbnailPhotoAsByteArray = Get-Content -Path $ThumbnailPhoto -Encoding Byte + } + else + { + $errorMessage = $script:localizedData.ThumbnailPhotoNotAFile + New-InvalidOperationException -Message $errorMessage + } + } + else + { + $thumbnailPhotoAsByteArray = [System.Convert]::FromBase64String($ThumbnailPhoto) + } + + return $thumbnailPhotoAsByteArray +} # end function Get-ThumbnailByteArray + +<# + .SYNOPSIS + Internal function to compare two thumbnail photos. + + .PARAMETER DesiredThumbnailPhoto + The desired thumbnail photo. Can be set to either a path to a .jpg-file, + a Base64-encoded jpeg image, an empty string, or $null. + + .PARAMETER CurrentThumbnailPhotoHash + The current thumbnail photo MD5 hash, or an empty string or $null if there + is no current thumbnail photo. + + .OUTPUTS + Returns $null if the thumbnail photos are the same, or a hashtable with + the hashes if the thumbnail photos do not match. +#> +function Compare-ThumbnailPhoto +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $DesiredThumbnailPhoto, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $CurrentThumbnailPhotoHash + ) + + if ([System.String]::IsNullOrEmpty($DesiredThumbnailPhoto)) + { + $desiredThumbnailPhotoHash = $null + } + else + { + $desiredThumbnailPhotoHash = Get-MD5HashString ` + -Bytes (Get-ThumbnailByteArray -ThumbnailPhoto $DesiredThumbnailPhoto) + } + + <# + Compare thumbnail hashes. Must [System.String]::IsNullOrEmpty() to + compare empty values correctly. + #> + if ($desiredThumbnailPhotoHash -eq $CurrentThumbnailPhotoHash ` + -or ( + [System.String]::IsNullOrEmpty($desiredThumbnailPhotoHash) ` + -and [System.String]::IsNullOrEmpty($CurrentThumbnailPhotoHash) + ) + ) + { + $returnValue = $null + } + else + { + $returnValue = @{ + CurrentThumbnailPhotoHash = $CurrentThumbnailPhotoHash + DesiredThumbnailPhotoHash = $desiredThumbnailPhotoHash + } + } + + return $returnValue +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.schema.mof new file mode 100644 index 0000000..be736b0 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/MSFT_ADUser.schema.mof @@ -0,0 +1,66 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ADUser")] +class MSFT_ADUser : OMI_BaseResource +{ + [Key, Description("Name of the domain where the user account is located (only used if password is managed).")] String DomainName; + [Key, Description("Specifies the Security Account Manager (SAM) account name of the user (ldapDisplayName 'sAMAccountName').")] String UserName; + [Write, Description("Specifies a new password value for the account."), EmbeddedInstance("MSFT_Credential")] String Password; + [Write, Description("Specifies whether the user account should be present or absent. Default value is 'Present'."), ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [Write, Description("Specifies the common name assigned to the user account (ldapDisplayName 'cn'). If not specified the default value will be the same value provided in parameter UserName.")] String CommonName; + [Write, Description("Specifies the User Principal Name (UPN) assigned to the user account (ldapDisplayName 'userPrincipalName').")] String UserPrincipalName; + [Write, Description("Specifies the display name of the object (ldapDisplayName 'displayName').")] String DisplayName; + [Write, Description("Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created.")] String Path; + [Write, Description("Specifies the user's given name (ldapDisplayName 'givenName').")] String GivenName; + [Write, Description("Specifies the initials that represent part of a user's name (ldapDisplayName 'initials').")] String Initials; + [Write, Description("Specifies the user's last name or surname (ldapDisplayName 'sn').")] String Surname; + [Write, Description("Specifies a description of the object (ldapDisplayName 'description').")] String Description; + [Write, Description("Specifies the user's street address (ldapDisplayName 'streetAddress').")] String StreetAddress; + [Write, Description("Specifies the user's post office box number (ldapDisplayName 'postOfficeBox').")] String POBox; + [Write, Description("Specifies the user's town or city (ldapDisplayName 'l').")] String City; + [Write, Description("Specifies the user's or Organizational Unit's state or province (ldapDisplayName 'st').")] String State; + [Write, Description("Specifies the user's postal code or zip code (ldapDisplayName 'postalCode').")] String PostalCode; + [Write, Description("Specifies the country or region code for the user's language of choice (ldapDisplayName 'c').")] String Country; + [Write, Description("Specifies the user's department (ldapDisplayName 'department').")] String Department; + [Write, Description("Specifies the user's division (ldapDisplayName 'division').")] String Division; + [Write, Description("Specifies the user's company (ldapDisplayName 'company').")] String Company; + [Write, Description("Specifies the location of the user's office or place of business (ldapDisplayName 'physicalDeliveryOfficeName').")] String Office; + [Write, Description("Specifies the user's title (ldapDisplayName 'title').")] String JobTitle; + [Write, Description("Specifies the user's e-mail address (ldapDisplayName 'mail').")] String EmailAddress; + [Write, Description("Specifies the user's employee ID (ldapDisplayName 'employeeID').")] String EmployeeID; + [Write, Description("Specifies the user's employee number (ldapDisplayName 'employeeNumber').")] String EmployeeNumber; + [Write, Description("Specifies a user's home directory path (ldapDisplayName 'homeDirectory').")] String HomeDirectory; + [Write, Description("Specifies a drive that is associated with the UNC path defined by the HomeDirectory property (ldapDisplayName 'homeDrive').")] String HomeDrive; + [Write, Description("Specifies the URL of the home page of the object (ldapDisplayName 'wWWHomePage').")] String HomePage; + [Write, Description("Specifies a path to the user's profile (ldapDisplayName 'profilePath').")] String ProfilePath; + [Write, Description("Specifies a path to the user's log on script (ldapDisplayName 'scriptPath').")] String LogonScript; + [Write, Description("Specifies the notes attached to the user's accoutn (ldapDisplayName 'info').")] String Notes; + [Write, Description("Specifies the user's office telephone number (ldapDisplayName 'telephoneNumber').")] String OfficePhone; + [Write, Description("Specifies the user's mobile phone number (ldapDisplayName 'mobile').")] String MobilePhone; + [Write, Description("Specifies the user's fax phone number (ldapDisplayName 'facsimileTelephoneNumber').")] String Fax; + [Write, Description("Specifies the user's home telephone number (ldapDisplayName 'homePhone').")] String HomePhone; + [Write, Description("Specifies the user's pager number (ldapDisplayName 'pager').")] String Pager; + [Write, Description("Specifies the user's IP telephony phone number (ldapDisplayName 'ipPhone').")] String IPPhone; + [Write, Description("Specifies the user's manager specified as a Distinguished Name (ldapDisplayName 'manager').")] String Manager; + [Write, Description("Specifies the computers that the user can access. To specify more than one computer, create a single comma-separated list. You can identify a computer by using the Security Account Manager (SAM) account name (sAMAccountName) or the DNS host name of the computer. The SAM account name is the same as the NetBIOS name of the computer. The LDAP display name (ldapDisplayName) for this property is userWorkStations.")] String LogonWorkstations; + [Write, Description("Specifies the user's organization. This parameter sets the Organization property of a user object. The LDAP display name (ldapDisplayName) of this property is 'o'.")] String Organization; + [Write, Description("Specifies a name in addition to a user's given name and surname, such as the user's middle name. This parameter sets the OtherName property of a user object. The LDAP display name (ldapDisplayName) of this property is 'middleName'.")] String OtherName; + [Write, Description("Specifies if the account is enabled. Default value is $true.")] Boolean Enabled; + [Write, Description("Specifies whether the account password can be changed.")] Boolean CannotChangePassword; + [Write, Description("Specifies whether the account password must be changed during the next logon attempt. This will only be enabled when the user is initially created. This parameter cannot be set to $true if the parameter PasswordNeverExpires is also set to $true.")] Boolean ChangePasswordAtLogon; + [Write, Description("Specifies whether the password of an account can expire.")] Boolean PasswordNeverExpires; + [Write, Description("Specifies the Active Directory Domain Services instance to use to perform the task.")] String DomainController; + [Write, Description("Specifies the user account credentials to use to perform this task."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Specifies the authentication context type used when testing passwords. Default value is 'Default'."), ValueMap{"Default","Negotiate"},Values{"Default","Negotiate"}] String PasswordAuthentication; + [Write, Description("Specifies whether existing user's password should be reset. Default value is $false.")] Boolean PasswordNeverResets; + [Write, Description("Specifies whether an account is trusted for Kerberos delegation. Default value is $false.")] Boolean TrustedForDelegation; + [Write, Description("Try to restore the user object from the recycle bin before creating a new one.")] Boolean RestoreFromRecycleBin; + [Write, Description("Specifies the service principal names for the user account.")] String ServicePrincipalNames[]; + [Write, Description("Specifies the proxy addresses for the user account.")] String ProxyAddresses[]; + [Write, Description("Indicates whether the security context of the user is delegated to a service. When this parameter is set to true, the security context of the account is not delegated to a service even when the service account is set as trusted for Kerberos delegation. This parameter sets the AccountNotDelegated property for an Active Directory account. This parameter also sets the ADS_UF_NOT_DELEGATED flag of the Active Directory User Account Control (UAC) attribute.")] Boolean AccountNotDelegated; + [Write, Description("Indicates whether reversible password encryption is allowed for the account. This parameter sets the AllowReversiblePasswordEncryption property of the account. This parameter also sets the ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED flag of the Active Directory User Account Control (UAC) attribute.")] Boolean AllowReversiblePasswordEncryption; + [Write, Description("Specifies whether an account supports Kerberos service tickets which includes the authorization data for the user's device. This value sets the compound identity supported flag of the Active Directory msDS-SupportedEncryptionTypes attribute.")] Boolean CompoundIdentitySupported; + [Write, Description("Specifies whether the account requires a password. A password is not required for a new account. This parameter sets the PasswordNotRequired property of an account object.")] Boolean PasswordNotRequired; + [Write, Description("Specifies whether a smart card is required to logon. This parameter sets the SmartCardLoginRequired property for a user object. This parameter also sets the ADS_UF_SMARTCARD_REQUIRED flag of the Active Directory User Account Control attribute.")] Boolean SmartcardLogonRequired; + [Write, Description("Specifies the thumbnail photo to be used for the user object. Can be set either to a path pointing to a .jpg-file, or to a Base64-encoded jpeg image. If set to an empty string ('') the current thumbnail photo will be removed. The property ThumbnailPhoto will always return the image as a Base64-encoded string even if the configuration specified a file path.")] String ThumbnailPhoto; + [Read, Description("Returns the X.500 path of the object.")] String DistinguishedName; + [Read, Description("Return the MD5 hash of the current thumbnail photo, or $null if no thumbnail photo exist.")] String ThumbnailPhotoHash; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/README.md new file mode 100644 index 0000000..f4d0f42 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/README.md @@ -0,0 +1,11 @@ +# Description + +The ADUser DSC resource will manage Users within Active Directory. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. +* The parameter `RestoreFromRecycleBin` requires that the feature Recycle + Bin has been enabled prior to an object is deleted. If the feature + Recycle Bin is disabled then the property `msDS-LastKnownRDN` is not + added the deleted object. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/en-US/MSFT_ADUser.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/en-US/MSFT_ADUser.strings.psd1 new file mode 100644 index 0000000..5f16b24 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/en-US/MSFT_ADUser.strings.psd1 @@ -0,0 +1,25 @@ +# culture="en-US" +ConvertFrom-StringData @' + RetrievingADUserError = Error retrieving '{0}' from domain '{1}'. (ADU0001) + PasswordParameterConflictError = Parameter '{0}' cannot be set to '{1}' when the '{2}' parameter is specified. (ADU0002) + ChangePasswordParameterConflictError = Parameter 'ChangePasswordAtLogon' cannot be set to 'true' when Parameter 'PasswordNeverExpires' is also set to 'true'. (ADU0003) + RetrievingADUser = Retrieving '{0}' from domain '{1}'. (ADU0004) + ADUserIsPresent = '{0}' is present in domain '{1}'. (ADU0007) + ADUserNotPresent = '{0}' is not present in domain '{1}'. (ADU0008) + ADUserInDesiredState = '{0}' is in the desired state. (ADU0009) + ADUserNotInDesiredState = '{0}' is not in the desired state. (ADU0010) + ADUserIsPresentButShouldBeAbsent = '{0}' is present but should be absent. (ADU0011) + ADUserIsAbsentButShouldBePresent = '{0}' is absent but should be present. (ADU0012) + ADUserNotDesiredPropertyState = '{0}' property is NOT in the desired state. Expected '{1}', actual '{2}'. (ADU0013) + AddingADUser = Adding '{0} to domain '{1}'. (ADU0014) + RemovingADUser = Removing '{0}' from domain '{1}'. (ADU0015) + UpdatingADUser = Updating '{0}' in domain '{1}'. (ADU0016) + SettingADUserPassword = Setting password for '{0}'. (ADU0017) + UpdatingADUserProperty = Updating property '{0}' with '{1}'. (ADU0018) + ClearingADUserProperty = Clearing property '{0}'. (ADU0019) + MovingADUser = Moving user from '{0}' to '{1}'. (ADU0020) + RestoringUser = Attempting to restore the user object {0} from the recycle bin. (ADU0022) + LoadingThumbnailFromFile = Importing thumbnail photo from the file '{0}'. (ADU0024) + ThumbnailPhotoNotAFile = Expected the thumbnail photo to be a file because the string contained the character '.' or '\', but the file could not be found. (ADU0025) + UpdatingThumbnailPhotoProperty = Updating property '{0}' with a new thumbnail photo with MD5 hash '{1}'. (ADU0026) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/en-US/about_ADUser.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/en-US/about_ADUser.help.txt new file mode 100644 index 0000000..38a741e --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_ADUser/en-US/about_ADUser.help.txt @@ -0,0 +1,386 @@ +.NAME + ADUser + +.DESCRIPTION + The ADUser DSC resource will manage Users within Active Directory. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + * The parameter `RestoreFromRecycleBin` requires that the feature Recycle + Bin has been enabled prior to an object is deleted. If the feature + Recycle Bin is disabled then the property `msDS-LastKnownRDN` is not + added the deleted object. + +.PARAMETER DomainName + Key - String + Name of the domain where the user account is located (only used if password is managed). + +.PARAMETER UserName + Key - String + Specifies the Security Account Manager (SAM) account name of the user (ldapDisplayName 'sAMAccountName'). + +.PARAMETER Password + Write - PSCredential + Specifies a new password value for the account. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies whether the user account should be present or absent. Default value is 'Present'. + +.PARAMETER CommonName + Write - String + Specifies the common name assigned to the user account (ldapDisplayName 'cn'). If not specified the default value will be the same value provided in parameter UserName. + +.PARAMETER UserPrincipalName + Write - String + Specifies the User Principal Name (UPN) assigned to the user account (ldapDisplayName 'userPrincipalName'). + +.PARAMETER DisplayName + Write - String + Specifies the display name of the object (ldapDisplayName 'displayName'). + +.PARAMETER Path + Write - String + Specifies the X.500 path of the Organizational Unit (OU) or container where the new object is created. + +.PARAMETER GivenName + Write - String + Specifies the user's given name (ldapDisplayName 'givenName'). + +.PARAMETER Initials + Write - String + Specifies the initials that represent part of a user's name (ldapDisplayName 'initials'). + +.PARAMETER Surname + Write - String + Specifies the user's last name or surname (ldapDisplayName 'sn'). + +.PARAMETER Description + Write - String + Specifies a description of the object (ldapDisplayName 'description'). + +.PARAMETER StreetAddress + Write - String + Specifies the user's street address (ldapDisplayName 'streetAddress'). + +.PARAMETER POBox + Write - String + Specifies the user's post office box number (ldapDisplayName 'postOfficeBox'). + +.PARAMETER City + Write - String + Specifies the user's town or city (ldapDisplayName 'l'). + +.PARAMETER State + Write - String + Specifies the user's or Organizational Unit's state or province (ldapDisplayName 'st'). + +.PARAMETER PostalCode + Write - String + Specifies the user's postal code or zip code (ldapDisplayName 'postalCode'). + +.PARAMETER Country + Write - String + Specifies the country or region code for the user's language of choice (ldapDisplayName 'c'). + +.PARAMETER Department + Write - String + Specifies the user's department (ldapDisplayName 'department'). + +.PARAMETER Division + Write - String + Specifies the user's division (ldapDisplayName 'division'). + +.PARAMETER Company + Write - String + Specifies the user's company (ldapDisplayName 'company'). + +.PARAMETER Office + Write - String + Specifies the location of the user's office or place of business (ldapDisplayName 'physicalDeliveryOfficeName'). + +.PARAMETER JobTitle + Write - String + Specifies the user's title (ldapDisplayName 'title'). + +.PARAMETER EmailAddress + Write - String + Specifies the user's e-mail address (ldapDisplayName 'mail'). + +.PARAMETER EmployeeID + Write - String + Specifies the user's employee ID (ldapDisplayName 'employeeID'). + +.PARAMETER EmployeeNumber + Write - String + Specifies the user's employee number (ldapDisplayName 'employeeNumber'). + +.PARAMETER HomeDirectory + Write - String + Specifies a user's home directory path (ldapDisplayName 'homeDirectory'). + +.PARAMETER HomeDrive + Write - String + Specifies a drive that is associated with the UNC path defined by the HomeDirectory property (ldapDisplayName 'homeDrive'). + +.PARAMETER HomePage + Write - String + Specifies the URL of the home page of the object (ldapDisplayName 'wWWHomePage'). + +.PARAMETER ProfilePath + Write - String + Specifies a path to the user's profile (ldapDisplayName 'profilePath'). + +.PARAMETER LogonScript + Write - String + Specifies a path to the user's log on script (ldapDisplayName 'scriptPath'). + +.PARAMETER Notes + Write - String + Specifies the notes attached to the user's accoutn (ldapDisplayName 'info'). + +.PARAMETER OfficePhone + Write - String + Specifies the user's office telephone number (ldapDisplayName 'telephoneNumber'). + +.PARAMETER MobilePhone + Write - String + Specifies the user's mobile phone number (ldapDisplayName 'mobile'). + +.PARAMETER Fax + Write - String + Specifies the user's fax phone number (ldapDisplayName 'facsimileTelephoneNumber'). + +.PARAMETER HomePhone + Write - String + Specifies the user's home telephone number (ldapDisplayName 'homePhone'). + +.PARAMETER Pager + Write - String + Specifies the user's pager number (ldapDisplayName 'pager'). + +.PARAMETER IPPhone + Write - String + Specifies the user's IP telephony phone number (ldapDisplayName 'ipPhone'). + +.PARAMETER Manager + Write - String + Specifies the user's manager specified as a Distinguished Name (ldapDisplayName 'manager'). + +.PARAMETER LogonWorkstations + Write - String + Specifies the computers that the user can access. To specify more than one computer, create a single comma-separated list. You can identify a computer by using the Security Account Manager (SAM) account name (sAMAccountName) or the DNS host name of the computer. The SAM account name is the same as the NetBIOS name of the computer. The LDAP display name (ldapDisplayName) for this property is userWorkStations. + +.PARAMETER Organization + Write - String + Specifies the user's organization. This parameter sets the Organization property of a user object. The LDAP display name (ldapDisplayName) of this property is 'o'. + +.PARAMETER OtherName + Write - String + Specifies a name in addition to a user's given name and surname, such as the user's middle name. This parameter sets the OtherName property of a user object. The LDAP display name (ldapDisplayName) of this property is 'middleName'. + +.PARAMETER Enabled + Write - Boolean + Specifies if the account is enabled. Default value is $true. + +.PARAMETER CannotChangePassword + Write - Boolean + Specifies whether the account password can be changed. + +.PARAMETER ChangePasswordAtLogon + Write - Boolean + Specifies whether the account password must be changed during the next logon attempt. This will only be enabled when the user is initially created. This parameter cannot be set to $true if the parameter PasswordNeverExpires is also set to $true. + +.PARAMETER PasswordNeverExpires + Write - Boolean + Specifies whether the password of an account can expire. + +.PARAMETER DomainController + Write - String + Specifies the Active Directory Domain Services instance to use to perform the task. + +.PARAMETER Credential + Write - PSCredential + Specifies the user account credentials to use to perform this task. + +.PARAMETER PasswordAuthentication + Write - String + Allowed values: Default, Negotiate + Specifies the authentication context type used when testing passwords. Default value is 'Default'. + +.PARAMETER PasswordNeverResets + Write - Boolean + Specifies whether existing user's password should be reset. Default value is $false. + +.PARAMETER TrustedForDelegation + Write - Boolean + Specifies whether an account is trusted for Kerberos delegation. Default value is $false. + +.PARAMETER RestoreFromRecycleBin + Write - Boolean + Try to restore the user object from the recycle bin before creating a new one. + +.PARAMETER ServicePrincipalNames + Write - StringArray + Specifies the service principal names for the user account. + +.PARAMETER ProxyAddresses + Write - StringArray + Specifies the proxy addresses for the user account. + +.PARAMETER AccountNotDelegated + Write - Boolean + Indicates whether the security context of the user is delegated to a service. When this parameter is set to true, the security context of the account is not delegated to a service even when the service account is set as trusted for Kerberos delegation. This parameter sets the AccountNotDelegated property for an Active Directory account. This parameter also sets the ADS_UF_NOT_DELEGATED flag of the Active Directory User Account Control (UAC) attribute. + +.PARAMETER AllowReversiblePasswordEncryption + Write - Boolean + Indicates whether reversible password encryption is allowed for the account. This parameter sets the AllowReversiblePasswordEncryption property of the account. This parameter also sets the ADS_UF_ENCRYPTED_TEXT_PASSWORD_ALLOWED flag of the Active Directory User Account Control (UAC) attribute. + +.PARAMETER CompoundIdentitySupported + Write - Boolean + Specifies whether an account supports Kerberos service tickets which includes the authorization data for the user's device. This value sets the compound identity supported flag of the Active Directory msDS-SupportedEncryptionTypes attribute. + +.PARAMETER PasswordNotRequired + Write - Boolean + Specifies whether the account requires a password. A password is not required for a new account. This parameter sets the PasswordNotRequired property of an account object. + +.PARAMETER SmartcardLogonRequired + Write - Boolean + Specifies whether a smart card is required to logon. This parameter sets the SmartCardLoginRequired property for a user object. This parameter also sets the ADS_UF_SMARTCARD_REQUIRED flag of the Active Directory User Account Control attribute. + +.PARAMETER ThumbnailPhoto + Write - String + Specifies the thumbnail photo to be used for the user object. Can be set either to a path pointing to a .jpg-file, or to a Base64-encoded jpeg image. If set to an empty string ('') the current thumbnail photo will be removed. The property ThumbnailPhoto will always return the image as a Base64-encoded string even if the configuration specified a file path. + +.PARAMETER DistinguishedName + Read - String + Returns the X.500 path of the object. + +.PARAMETER ThumbnailPhotoHash + Read - String + Return the MD5 hash of the current thumbnail photo, or $null if no thumbnail photo exist. + +.EXAMPLE 1 + +This configuration will create a user with a managed password. +This might be used to manage the lifecycle of a service account. + +Configuration ADUser_CreateUserAndManagePassword_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Password + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADUser 'Contoso\ExampleUser' + { + Ensure = 'Present' + UserName = 'ExampleUser' + Password = $Password + DomainName = 'contoso.com' + Path = 'CN=Users,DC=contoso,DC=com' + } + } +} + +.EXAMPLE 2 + +This configuration will create a user with a password and then ignore +when the password has changed. This might be used with a traditional +user account where a managed password is not desired. + +Configuration ADUser_CreateUserAndIgnorePasswordChanges_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Password + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADUser 'Contoso\ExampleUser' + { + Ensure = 'Present' + UserName = 'ExampleUser' + Password = $Password + PasswordNeverResets = $true + DomainName = 'contoso.com' + Path = 'CN=Users,DC=contoso,DC=com' + } + } +} + +.EXAMPLE 3 + +This configuration will update a user with a thumbnail photo using +a jpeg image encoded as a Base64 string. + +Configuration ADUser_UpdateThumbnailPhotoAsBase64_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADUser 'Contoso\ExampleUser' + { + UserName = 'ExampleUser' + DomainName = 'contoso.com' + ThumbnailPhoto = '/9j/4AAQSkZJRgABAQEAYABgAAD/4QB .... STRING TRUNCATED FOR LENGTH' + } + } +} + +.EXAMPLE 4 + +This configuration will update a user with a thumbnail photo using +a jpeg file. + +Configuration ADUser_UpdateThumbnailPhotoFromFile_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADUser 'Contoso\ExampleUser' + { + UserName = 'ExampleUser' + DomainName = 'contoso.com' + ThumbnailPhoto = 'C:\ThumbnailPhotos\ExampleUser.jpg' + } + } +} + +.EXAMPLE 5 + +This configuration will remove the thumbnail photo from the user. + +Configuration ADUser_RemoveThumbnailPhoto_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + ADUser 'Contoso\ExampleUser' + { + UserName = 'ExampleUser' + DomainName = 'contoso.com' + ThumbnailPhoto = '' + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/MSFT_WaitForADDomain.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/MSFT_WaitForADDomain.psm1 new file mode 100644 index 0000000..e0bd01e --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/MSFT_WaitForADDomain.psm1 @@ -0,0 +1,629 @@ +$script:resourceModulePath = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent +$script:modulesFolderPath = Join-Path -Path $script:resourceModulePath -ChildPath 'Modules' + +$script:localizationModulePath = Join-Path -Path $script:modulesFolderPath -ChildPath 'ActiveDirectoryDsc.Common' +Import-Module -Name (Join-Path -Path $script:localizationModulePath -ChildPath 'ActiveDirectoryDsc.Common.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'MSFT_WaitForADDomain' + +# This file is used to remember the number of times the node has been rebooted. +$script:restartLogFile = Join-Path $env:temp -ChildPath 'WaitForADDomain_Reboot.tmp' + +# This scriptblock is ran inside the background job. +$script:waitForDomainControllerScriptBlock = { + param + ( + # Only used for unit tests, and debug purpose. + [Parameter()] + [System.Boolean] + $RunOnce, + + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $SiteName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.Boolean] + $WaitForValidCredentials + ) + + $domainFound = $false + + do + { + Import-Module ActiveDirectoryDsc + + $findDomainControllerParameters = @{ + DomainName = $DomainName + } + + if ($SiteName) + { + $findDomainControllerParameters['SiteName'] = $SiteName + + } + + if ($null -ne $Credential) + { + $findDomainControllerParameters['Credential'] = $Credential + } + + if ($PSBoundParameters.ContainsKey('WaitForValidCredentials')) + { + $findDomainControllerParameters['WaitForValidCredentials'] = $WaitForValidCredentials + } + + $currentDomainController = $null + + # Using verbose so that Receive-Job can output whats happened. + $currentDomainController = Find-DomainController @findDomainControllerParameters -Verbose + + if ($currentDomainController) + { + $domainFound = $true + } + else + { + $domainFound = $false + + # Using verbose so that Receive-Job can output whats happened. + Clear-DnsClientCache -Verbose + + Start-Sleep -Seconds 10 + } + } until ($domainFound -or $RunOnce) +} + +<# + .SYNOPSIS + Returns the current state of the specified Active Directory domain. + + .PARAMETER DomainName + Specifies the fully qualified domain name to wait for. + + .PARAMETER SiteName + Specifies the site in the domain where to look for a domain controller. + + .PARAMETER Credential + Specifies the credentials that are used when accessing the domain, + unless the built-in PsDscRunAsCredential is used. + + .PARAMETER WaitTimeout + Specifies the timeout in seconds that the resource will wait for the + domain to be accessible. Default value is 300 seconds. + + .PARAMETER RestartCount + Specifies the number of times the node will be reboot in an effort to + connect to the domain. + + .PARAMETER WaitForValidCredentials + Specifies that the resource will not throw an error if authentication + fails using the provided credentials and continue wait for the timeout. + This can be used if the credentials are known to eventually exist but + there are a potential timing issue before they are accessible. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $SiteName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.UInt64] + $WaitTimeout = 300, + + [Parameter()] + [System.UInt32] + $RestartCount, + + [Parameter()] + [System.Boolean] + $WaitForValidCredentials + ) + + $findDomainControllerParameters = @{ + DomainName = $DomainName + } + + Write-Verbose -Message ( + $script:localizedData.SearchDomainController -f $DomainName + ) + + if ($PSBoundParameters.ContainsKey('SiteName')) + { + $findDomainControllerParameters['SiteName'] = $SiteName + + Write-Verbose -Message ( + $script:localizedData.SearchInSiteOnly -f $SiteName + ) + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $cimCredentialInstance = New-CimCredentialInstance -Credential $Credential + + $findDomainControllerParameters['Credential'] = $Credential + + Write-Verbose -Message ( + $script:localizedData.ImpersonatingCredentials -f $Credential.UserName + ) + } + else + { + if ($null -ne $global:PsDscContext.RunAsUser) + { + # Running using PsDscRunAsCredential + Write-Verbose -Message ( + $script:localizedData.ImpersonatingCredentials -f $global:PsDscContext.RunAsUser + ) + } + else + { + # Running as SYSTEM or current user. + Write-Verbose -Message ( + $script:localizedData.ImpersonatingCredentials -f (Get-CurrentUser).Name + ) + } + + $cimCredentialInstance = $null + } + + $currentDomainController = $null + + if ($PSBoundParameters.ContainsKey('WaitForValidCredentials')) + { + $findDomainControllerParameters['WaitForValidCredentials'] = $WaitForValidCredentials + } + + $currentDomainController = Find-DomainController @findDomainControllerParameters + + if ($currentDomainController) + { + $domainFound = $true + $domainControllerSiteName = $currentDomainController.SiteName + + Write-Verbose -Message $script:localizedData.FoundDomainController + + } + else + { + $domainFound = $false + $domainControllerSiteName = $null + + Write-Verbose -Message $script:localizedData.NoDomainController + } + + return @{ + DomainName = $DomainName + SiteName = $domainControllerSiteName + Credential = $cimCredentialInstance + WaitTimeout = $WaitTimeout + RestartCount = $RestartCount + IsAvailable = $domainFound + WaitForValidCredentials = $WaitForValidCredentials + } +} + +<# + .SYNOPSIS + Waits for the specified Active Directory domain to have a domain + controller that can serve connections. + + .PARAMETER DomainName + Specifies the fully qualified domain name to wait for. + + .PARAMETER SiteName + Specifies the site in the domain where to look for a domain controller. + + .PARAMETER Credential + Specifies the credentials that are used when accessing the domain, + unless the built-in PsDscRunAsCredential is used. + + .PARAMETER WaitTimeout + Specifies the timeout in seconds that the resource will wait for the + domain to be accessible. Default value is 300 seconds. + + .PARAMETER RestartCount + Specifies the number of times the node will be reboot in an effort to + connect to the domain. + + .PARAMETER WaitForValidCredentials + Specifies that the resource will not throw an error if authentication + fails using the provided credentials and continue wait for the timeout. + This can be used if the credentials are known to eventually exist but + there are a potential timing issue before they are accessible. +#> +function Set-TargetResource +{ + <# + Suppressing this rule because $global:DSCMachineStatus is used to trigger + a reboot if the domain name cannot be found withing the timeout period. + #> + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $SiteName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.UInt64] + $WaitTimeout = 300, + + [Parameter()] + [System.UInt32] + $RestartCount, + + [Parameter()] + [System.Boolean] + $WaitForValidCredentials + ) + + Write-Verbose -Message ( + $script:localizedData.WaitingForDomain -f $DomainName, $WaitTimeout + ) + + # Only pass properties that could be used when fetching the domain controller. + $compareTargetResourceStateParameters = @{ + DomainName = $DomainName + SiteName = $SiteName + Credential = $Credential + WaitForValidCredentials = $WaitForValidCredentials + } + + <# + Removes any keys not bound to $PSBoundParameters. + Need the @() around this to get a new array to enumerate. + #> + @($compareTargetResourceStateParameters.Keys) | ForEach-Object { + if (-not $PSBoundParameters.ContainsKey($_)) + { + $compareTargetResourceStateParameters.Remove($_) + } + } + + <# + This returns array of hashtables which contain the properties ParameterName, + Expected, Actual, and InDesiredState. In this case only the property + 'IsAvailable' will be returned. + #> + $compareTargetResourceStateResult = Compare-TargetResourceState @compareTargetResourceStateParameters + + $isInDesiredState = $compareTargetResourceStateResult.Where( { $_.ParameterName -eq 'IsAvailable' }).InDesiredState + + if (-not $isInDesiredState) + { + $startJobParameters = @{ + ScriptBlock = $script:waitForDomainControllerScriptBlock + ArgumentList = @( + $false + $DomainName + $SiteName + $Credential + $WaitForValidCredentials + ) + } + + Write-Verbose -Message $script:localizedData.StartBackgroundJob + + $jobSearchDomainController = Start-Job @startJobParameters + + Write-Verbose -Message $script:localizedData.WaitBackgroundJob + + $waitJobResult = Wait-Job -Job $jobSearchDomainController -Timeout $WaitTimeout + + # Wait-Job returns an object if the job completed or failed within the timeout. + if ($waitJobResult) + { + Write-Verbose -Message $script:localizedData.BackgroundJobFinished + switch ($waitJobResult.State) + { + 'Failed' + { + Write-Warning -Message $script:localizedData.BackgroundJobFailed + + $foundDomainController = $false + } + + 'Completed' + { + Write-Verbose -Message $script:localizedData.BackgroundJobSuccessful + + if ($PSBoundParameters.ContainsKey('RestartCount')) + { + Remove-RestartLogFile + } + + $foundDomainController = $true + } + } + } + else + { + Write-Warning -Message $script:localizedData.TimeoutReached + + if ($PSBoundParameters.ContainsKey('RestartCount')) + { + # if the file does not exist this will set $currentRestartCount to 0. + [System.UInt32] $currentRestartCount = Get-Content $restartLogFile -ErrorAction SilentlyContinue + + if ($currentRestartCount -lt $RestartCount) + { + $currentRestartCount += 1 + + Set-Content -Path $restartLogFile -Value $currentRestartCount + + Write-Verbose -Message ( + $script:localizedData.RestartWasRequested -f $currentRestartCount, $RestartCount + ) + + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', + Justification = 'Set LCM DSCMachineStatus to indicate reboot required')] + $global:DSCMachineStatus = 1 + } + } + + # The timeout was reached and no restarts was requested. + $foundDomainController = $false + } + + # Only output the result from the running job if Verbose was chosen. + if ($PSBoundParameters.ContainsKey('Verbose') -or $waitJobResult.State -eq 'Failed') + { + Write-Verbose -Message $script:localizedData.StartOutputBackgroundJob + + Receive-Job -Job $jobSearchDomainController + + Write-Verbose -Message $script:localizedData.EndOutputBackgroundJob + } + + Write-Verbose -Message $script:localizedData.RemoveBackgroundJob + + # Forcedly remove the job even if it was not completed. + Remove-Job -Job $jobSearchDomainController -Force + } + else + { + $foundDomainController = $true + } + + if ($foundDomainController) + { + Write-Verbose -Message ($script:localizedData.DomainInDesiredState -f $DomainName) + } + else + { + throw $script:localizedData.NoDomainController + } +} + +<# + .SYNOPSIS + Determines if the specified Active Directory domain have a domain controller + that can serve connections. + + .PARAMETER DomainName + Specifies the fully qualified domain name to wait for. + + .PARAMETER SiteName + Specifies the site in the domain where to look for a domain controller. + + .PARAMETER Credential + Specifies the credentials that are used when accessing the domain, + unless the built-in PsDscRunAsCredential is used. + + .PARAMETER WaitTimeout + Specifies the timeout in seconds that the resource will wait for the + domain to be accessible. Default value is 300 seconds. + + .PARAMETER RestartCount + Specifies the number of times the node will be reboot in an effort to + connect to the domain. + + .PARAMETER WaitForValidCredentials + Specifies that the resource will not throw an error if authentication + fails using the provided credentials and continue wait for the timeout. + This can be used if the credentials are known to eventually exist but + there are a potential timing issue before they are accessible. +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $SiteName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.UInt64] + $WaitTimeout = 300, + + [Parameter()] + [System.UInt32] + $RestartCount, + + [Parameter()] + [System.Boolean] + $WaitForValidCredentials + ) + + Write-Verbose -Message ( + $script:localizedData.TestConfiguration -f $DomainName + ) + + # Only pass properties that could be used when fetching the domain controller. + $compareTargetResourceStateParameters = @{ + DomainName = $DomainName + SiteName = $SiteName + Credential = $Credential + WaitForValidCredentials = $WaitForValidCredentials + } + + <# + Removes any keys not bound to $PSBoundParameters. + Need the @() around this to get a new array to enumerate. + #> + @($compareTargetResourceStateParameters.Keys) | ForEach-Object { + if (-not $PSBoundParameters.ContainsKey($_)) + { + $compareTargetResourceStateParameters.Remove($_) + } + } + + <# + This returns array of hashtables which contain the properties ParameterName, + Expected, Actual, and InDesiredState. In this case only the property + 'IsAvailable' will be returned. + #> + $compareTargetResourceStateResult = Compare-TargetResourceState @compareTargetResourceStateParameters + + if ($false -in $compareTargetResourceStateResult.InDesiredState) + { + $testTargetResourceReturnValue = $false + + Write-Verbose -Message ( + $script:localizedData.DomainNotInDesiredState -f $DomainName + ) + } + else + { + $testTargetResourceReturnValue = $true + + if ($PSBoundParameters.ContainsKey('RestartCount') -and $RestartCount -gt 0 ) + { + Remove-RestartLogFile + } + + Write-Verbose -Message ( + $script:localizedData.DomainInDesiredState -f $DomainName + ) + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Compares the properties in the current state with the properties of the + desired state and returns a hashtable with the comparison result. + + .PARAMETER DomainName + Specifies the fully qualified domain name to wait for. + + .PARAMETER SiteName + Specifies the site in the domain where to look for a domain controller. + + .PARAMETER Credential + Specifies the credentials that are used when accessing the domain, + unless the built-in PsDscRunAsCredential is used. + + .PARAMETER WaitForValidCredentials + Specifies that the resource will not throw an error if authentication + fails using the provided credentials and continue wait for the timeout. + This can be used if the credentials are known to eventually exist but + there are a potential timing issue before they are accessible. +#> +function Compare-TargetResourceState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $SiteName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.Boolean] + $WaitForValidCredentials + ) + + $getTargetResourceParameters = @{ + DomainName = $DomainName + SiteName = $SiteName + Credential = $Credential + WaitForValidCredentials = $WaitForValidCredentials + } + + <# + Removes any keys not bound to $PSBoundParameters. + Need the @() around this to get a new array to enumerate. + #> + @($getTargetResourceParameters.Keys) | ForEach-Object { + if (-not $PSBoundParameters.ContainsKey($_)) + { + $getTargetResourceParameters.Remove($_) + } + } + + $getTargetResourceResult = Get-TargetResource @getTargetResourceParameters + + <# + Only interested in the read-only property IsAvailable, which + should always be compared to the value $true. + #> + $compareResourcePropertyStateParameters = @{ + CurrentValues = $getTargetResourceResult + DesiredValues = @{ + IsAvailable = $true + } + Properties = 'IsAvailable' + } + + return Compare-ResourcePropertyState @compareResourcePropertyStateParameters +} + +function Remove-RestartLogFile +{ + [CmdletBinding()] + param () + + if (Test-Path -Path $script:restartLogFile) + { + Remove-Item $script:restartLogFile -Force -ErrorAction SilentlyContinue + } +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/MSFT_WaitForADDomain.schema.mof b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/MSFT_WaitForADDomain.schema.mof new file mode 100644 index 0000000..238fc2e --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/MSFT_WaitForADDomain.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.1.0"), FriendlyName("WaitForADDomain")] +class MSFT_WaitForADDomain : OMI_BaseResource +{ + [Key, Description("Specifies the fully qualified domain name to wait for.")] String DomainName; + [Write, Description("Specifies the site in the domain where to look for a domain controller.")] String SiteName; + [Write, Description("Specifies the credentials that are used when accessing the domain, unless the built-in PsDscRunAsCredential is used."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Specifies the timeout in seconds that the resource will wait for the domain to be accessible. Default value is 300 seconds.")] UInt64 WaitTimeout; + [Write, Description("Specifies the number of times the node will be reboot in an effort to connect to the domain.")] UInt32 RestartCount; + [Write, Description("Specifies that the resource will not throw an error if authentication fails using the provided credentials and continue wait for the timeout. This can be used if the credentials are known to eventually exist but there are a potential timing issue before they are accessible.")] Boolean WaitForValidCredentials; + [Read, Description("Returns a value indicating if a domain controller was found.")] Boolean IsAvailable; +}; diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/README.md b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/README.md new file mode 100644 index 0000000..5c82c5f --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/README.md @@ -0,0 +1,24 @@ +# Description + +The WaitForADDomain resource is used to wait for Active Directory domain +controller to become available in the domain, or available in +a specific site in the domain. + +>Running the resource as *NT AUTHORITY\SYSTEM*, only work when +>evaluating the domain on the current node, for example on a +>node that should be a domain controller (which might require a +>restart of the node once the node becomes a domain controller). +>In all other scenarios use either the built-in parameter +>`PsDscRunAsCredential`, or the parameter `Credential`. + +Using the parameter `WaitForValidCredentials` ignores authentication +errors a let the resource wait until time timeout is reached. If the +parameter `WaitForValidCredentials` is not specified and the resource +throws an authentication error, then the resource will fail. But the +Local Configuration Manger (LCM) will automatically run the configuration +again to try to get the node in desired state. If and when the LCM retries +depends on how the LCM is configured. + +## Requirements + +* Target machine must be running Windows Server 2008 R2 or later. diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/en-US/MSFT_WaitForADDomain.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/en-US/MSFT_WaitForADDomain.strings.psd1 new file mode 100644 index 0000000..1bfbae4 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/en-US/MSFT_WaitForADDomain.strings.psd1 @@ -0,0 +1,22 @@ +# culture='en-US' +ConvertFrom-StringData @' + SearchDomainController = Searching for a domain controller in the domain '{0}'. (WFADD0001) + RestartWasRequested = A restart was requested when no domain controller was found. Restart number {0} of a total of {1}. (WFADD0003) + DomainInDesiredState = Domain '{0}' is in the desired state. (WFADD0006) + DomainNotInDesiredState = Domain '{0}' is not in the desired state. (WFADD0007) + FoundDomainController = Found domain controller. (WFADD0009) + NoDomainController = No domain controller was found. (WFADD0010) + ImpersonatingCredentials = Impersonating the credentials '{0}' when looking for a domain controller. (WFADD0011) + SearchInSiteOnly = Limiting the search scope for a domain controller to the site '{0}'. (WFADD0012) + TestConfiguration = Determining the current state of the Active Directory domain '{0}'. (WFADD0013) + BackgroundJobFinished = The background job finished running. (WFADD0014) + BackgroundJobFailed = The background job failed while searching for the domain controller. Returning the result of the background job. (WFADD0015) + TimeoutReached = The background job did not completed before the timeout period. (WFADD0016) + WaitingForDomain = Waiting for a domain '{0}' is available or until the timeout of {1} seconds has been reached. (WFADD0017) + StartBackgroundJob = Starting background job that will be searching for the domain controller. (WFADD0018) + WaitBackgroundJob = Waiting for the background job to finish, or timeout. (WFADD0019) + BackgroundJobSuccessful = The background job completed successfully. (WFADD0020) + StartOutputBackgroundJob = --- Start of result from background job. (WFADD0021) + EndOutputBackgroundJob = --- End of result from background job. (WFADD0022) + RemoveBackgroundJob = Removing the background job. (WFADD0023) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/en-US/about_WaitForADDomain.help.txt b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/en-US/about_WaitForADDomain.help.txt new file mode 100644 index 0000000..eb474f4 --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/DSCResources/MSFT_WaitForADDomain/en-US/about_WaitForADDomain.help.txt @@ -0,0 +1,273 @@ +.NAME + WaitForADDomain + +.DESCRIPTION + The WaitForADDomain resource is used to wait for Active Directory domain + controller to become available in the domain, or available in + a specific site in the domain. + + >Running the resource as *NT AUTHORITY\SYSTEM*, only work when + >evaluating the domain on the current node, for example on a + >node that should be a domain controller (which might require a + >restart of the node once the node becomes a domain controller). + >In all other scenarios use either the built-in parameter + >`PsDscRunAsCredential`, or the parameter `Credential`. + + Using the parameter `WaitForValidCredentials` ignores authentication + errors a let the resource wait until time timeout is reached. If the + parameter `WaitForValidCredentials` is not specified and the resource + throws an authentication error, then the resource will fail. But the + Local Configuration Manger (LCM) will automatically run the configuration + again to try to get the node in desired state. If and when the LCM retries + depends on how the LCM is configured. + + ## Requirements + + * Target machine must be running Windows Server 2008 R2 or later. + +.PARAMETER DomainName + Key - String + Specifies the fully qualified domain name to wait for. + +.PARAMETER SiteName + Write - String + Specifies the site in the domain where to look for a domain controller. + +.PARAMETER Credential + Write - PSCredential + Specifies the credentials that are used when accessing the domain, unless the built-in PsDscRunAsCredential is used. + +.PARAMETER WaitTimeout + Write - UInt64 + Specifies the timeout in seconds that the resource will wait for the domain to be accessible. Default value is 300 seconds. + +.PARAMETER RestartCount + Write - UInt32 + Specifies the number of times the node will be reboot in an effort to connect to the domain. + +.PARAMETER WaitForValidCredentials + Write - Boolean + Specifies that the resource will not throw an error if authentication fails using the provided credentials and continue wait for the timeout. This can be used if the credentials are known to eventually exist but there are a potential timing issue before they are accessible. + +.PARAMETER IsAvailable + Read - Boolean + Returns a value indicating if a domain controller was found. + +.EXAMPLE 1 + +This configuration will wait for an Active Directory domain controller +to respond within 300 seconds (default) in the domain 'contoso.com' +before returning and allowing the configuration to continue to run. +If the timeout is reached an error will be thrown. +This will use the current user when determining if the domain is available, +if run though LCM this will use SYSTEM (which might not have access). + +Configuration WaitForADDomain_WaitForDomainController_Config +{ + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + WaitForADDomain 'contoso.com' + { + DomainName = 'contoso.com' + } + } +} + +.EXAMPLE 2 + +This configuration will wait for an Active Directory domain controller +to respond within 300 seconds (default) in the domain 'contoso.com' +before returning and allowing the configuration to continue to run. +If the timeout is reached an error will be thrown. +This will use the user credential passed in the built-in PsDscRunAsCredential +parameter when determining if the domain is available. + +Configuration WaitForADDomain_WaitForDomainControllerUsingBuiltInCredential_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + WaitForADDomain 'contoso.com' + { + DomainName = 'contoso.com' + + PsDscRunAsCredential = $Credential + } + } +} + +.EXAMPLE 3 + +This configuration will wait for an Active Directory domain controller +to respond within 300 seconds (default) in the domain 'contoso.com' +before returning and allowing the configuration to continue to run. +If the timeout is reached an error will be thrown. +This will use the user credential passed in the parameter Credential +when determining if the domain is available. + +Configuration WaitForADDomain_WaitForDomainControllerUsingCredential_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + WaitForADDomain 'contoso.com' + { + DomainName = 'contoso.com' + Credential = $Credential + } + } +} + +.EXAMPLE 4 + +This configuration will wait for an Active Directory domain controller +in the site 'Europe' to respond within 300 seconds (default) in the +domain 'contoso.com' before returning and allowing the configuration to +continue to run. +If the timeout is reached an error will be thrown. +This will use the user credential passed in the built-in PsDscRunAsCredential +parameter when determining if the domain is available. + +Configuration WaitForADDomain_WaitForDomainControllerInSite_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + WaitForADDomain 'contoso.com' + { + DomainName = 'contoso.com' + SiteName = 'Europe' + + PsDscRunAsCredential = $Credential + } + } +} + +.EXAMPLE 5 + +This configuration will wait for an Active Directory domain controller +to respond within 300 seconds (default) in the domain 'contoso.com' +before returning and allowing the configuration to continue to run. +If the timeout is reached the node will be restarted up to two times +and again wait after each restart. If no domain controller is found +after the second restart an error will be thrown. +This will use the user credential passed in the built-in PsDscRunAsCredential +parameter when determining if the domain is available. + +Configuration WaitForADDomain_WaitForDomainControllerWithReboot_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + WaitForADDomain 'contoso.com' + { + DomainName = 'contoso.com' + RestartCount = 2 + + PsDscRunAsCredential = $Credential + } + } +} + +.EXAMPLE 6 + +This configuration will wait for an Active Directory domain controller +to respond within 600 seconds in the domain 'contoso.com' before +returning and allowing the configuration to continue to run. If the timeout +is reached an error will be thrown. +This will use the user credential passed in the built-in PsDscRunAsCredential +parameter when determining if the domain is available. + +Configuration WaitForADDomain_WaitForDomainControllerWithLongerDelay_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + WaitForADDomain 'contoso.com' + { + DomainName = 'contoso.com' + WaitTimeout = 600 + + PsDscRunAsCredential = $Credential + } + } +} + +.EXAMPLE 7 + +This configuration will wait for an Active Directory domain controller +to respond within the default period, and ignore any authentication +errors. + +Configuration WaitForADDomain_WaitForDomainControllerIgnoringAuthenticationErrors_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -Module ActiveDirectoryDsc + + Node localhost + { + WaitForADDomain 'contoso.com' + { + DomainName = 'contoso.com' + WaitForValidCredentials = $true + + PsDscRunAsCredential = $Credential + } + } +} + + diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psd1 new file mode 100644 index 0000000..a5bed4d --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psd1 @@ -0,0 +1,80 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'ActiveDirectoryDsc.Common.psm1' + + # Version number of this module. + ModuleVersion = '1.0' + + # ID used to uniquely identify this module + GUID = 'a4af6d71-e828-4ec3-8a05-6083b8d5d4c2' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Functions used by the DSC resources in ActiveDirectoryDsc.' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @( + 'New-InvalidArgumentException' + 'New-InvalidOperationException' + 'New-ObjectNotFoundException' + 'New-InvalidResultException' + 'Get-LocalizedData' + 'Start-ProcessWithTimeout' + 'Assert-Module' + 'Test-DomainMember' + 'Get-DomainName' + 'Resolve-DomainFQDN' + 'Get-ADObjectParentDN' + 'Assert-MemberParameters' + 'Remove-DuplicateMembers' + 'Test-Members' + 'ConvertTo-TimeSpan' + 'ConvertFrom-TimeSpan' + 'Get-ADCommonParameters' + 'Test-ADReplicationSite' + 'ConvertTo-DeploymentForestMode' + 'ConvertTo-DeploymentDomainMode' + 'Restore-ADCommonObject' + 'Get-ADDomainNameFromDistinguishedName' + 'Add-ADCommonGroupMember' + 'Get-DomainControllerObject' + 'Test-IsDomainController' + 'Convert-PropertyMapToObjectProperties' + 'Compare-ResourcePropertyState' + 'Test-DscPropertyState' + 'Assert-ADPSDrive' + 'Set-DscADComputer' + 'New-CimCredentialInstance' + 'Add-TypeAssembly' + 'Get-ADDirectoryContext' + 'Find-DomainController' + 'Get-CurrentUser' + 'Test-Password' + 'Test-PrincipalContextCredentials' + ) + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + } # End of PSData hashtable + + } # End of PrivateData hashtable +} diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psm1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psm1 new file mode 100644 index 0000000..5d2522b --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/ActiveDirectoryDsc.Common.psm1 @@ -0,0 +1,2356 @@ +<# + .SYNOPSIS + Retrieves the localized string data based on the machine's culture. + Falls back to en-US strings if the machine's culture is not supported. + + .PARAMETER ResourceName + The name of the resource as it appears before '.strings.psd1' of the localized string file. + For example: + For WindowsOptionalFeature: MSFT_WindowsOptionalFeature + For Service: MSFT_ServiceResource + For Registry: MSFT_RegistryResource + For Helper: SqlServerDscHelper + + .PARAMETER ScriptRoot + Optional. The root path where to expect to find the culture folder. This is only needed + for localization in helper modules. This should not normally be used for resources. + + .NOTES + To be able to use localization in the helper function, this function must + be first in the file, before Get-LocalizedData is used by itself to load + localized data for this helper module (see directly after this function). +#> +function Get-LocalizedData +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ResourceName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ScriptRoot + ) + + if (-not $ScriptRoot) + { + $dscResourcesFolder = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'DSCResources' + $resourceDirectory = Join-Path -Path $dscResourcesFolder -ChildPath $ResourceName + } + else + { + $resourceDirectory = $ScriptRoot + } + + $localizedStringFileLocation = Join-Path -Path $resourceDirectory -ChildPath $PSUICulture + + if (-not (Test-Path -Path $localizedStringFileLocation)) + { + # Fallback to en-US + $localizedStringFileLocation = Join-Path -Path $resourceDirectory -ChildPath 'en-US' + } + + Import-LocalizedData ` + -BindingVariable 'localizedData' ` + -FileName "$ResourceName.strings.psd1" ` + -BaseDirectory $localizedStringFileLocation + + return $localizedData +} + +<# + .SYNOPSIS + Creates and throws an invalid argument exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ArgumentName + The name of the invalid argument that is causing this error to be thrown. +#> +function New-InvalidArgumentException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArgumentName + ) + + $argumentException = New-Object -TypeName 'ArgumentException' ` + -ArgumentList @($Message, $ArgumentName) + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @($argumentException, $ArgumentName, 'InvalidArgument', $null) + } + + $errorRecord = New-Object @newObjectParameters + + throw $errorRecord +} + +<# + .SYNOPSIS + Creates and throws an invalid operation exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-InvalidOperationException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'InvalidOperation', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Creates and throws an object not found exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-ObjectNotFoundException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'ObjectNotFound', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Creates and throws an invalid result exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-InvalidResultException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'InvalidResult', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Starts a process with a timeout. + + .PARAMETER FilePath + String containing the path to the executable to start. + + .PARAMETER ArgumentList + The arguments that should be passed to the executable. + + .PARAMETER Timeout + The timeout in seconds to wait for the process to finish. + +#> +function Start-ProcessWithTimeout +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $FilePath, + + [Parameter()] + [System.String[]] + $ArgumentList, + + [Parameter(Mandatory = $true)] + [System.UInt32] + $Timeout + ) + + $startProcessParameters = @{ + FilePath = $FilePath + ArgumentList = $ArgumentList + PassThru = $true + NoNewWindow = $true + ErrorAction = 'Stop' + } + + $sqlSetupProcess = Start-Process @startProcessParameters + + Write-Verbose -Message ($script:localizedData.StartProcess -f $sqlSetupProcess.Id, $startProcessParameters.FilePath, $Timeout) -Verbose + + Wait-Process -InputObject $sqlSetupProcess -Timeout $Timeout -ErrorAction 'Stop' + + return $sqlSetupProcess.ExitCode +} + +<# + .SYNOPSIS + Assert if the role specific module is installed or not and optionally + import it. + + .PARAMETER ModuleName + The name of the module to assert is installed. + + .PARAMETER ImportModule + This switch causes the module to be imported if it is installed. +#> +function Assert-Module +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ModuleName = 'ActiveDirectory', + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ImportModule + ) + + if (-not (Get-Module -Name $ModuleName -ListAvailable)) + { + $errorMessage = $script:localizedData.ModuleNotFoundError -f $moduleName + New-ObjectNotFoundException -Message $errorMessage + } + + if ($ImportModule) + { + Import-Module -Name $ModuleName + } +} #end function Assert-Module + +<# + .SYNOPSIS + Tests whether this computer is a member of a domain. +#> +function Test-DomainMember +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + ) + + $isDomainMember = [System.Boolean] (Get-CimInstance -ClassName Win32_ComputerSystem -Verbose:$false).PartOfDomain + + return $isDomainMember +} + + +<# + .SYNOPSIS + Get the domain name of this computer. +#> +function Get-DomainName +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + ) + + $domainName = [System.String] (Get-CimInstance -ClassName Win32_ComputerSystem -Verbose:$false).Domain + + return $domainName +} # function Get-DomainName + +<# + .SYNOPSIS + Assemble a fully qualifies domain name by appending the domain name + to the parent domain name. + + .PARAMETER DomainName + The domain name to append to the ParentDomainName. + + .PARAMETER ParentDomainName + The parent domain name. +#> +function Resolve-DomainFQDN +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [AllowNull()] + [System.String] + $ParentDomainName + ) + + $domainFQDN = $DomainName + + if ($ParentDomainName) + { + $domainFQDN = '{0}.{1}' -f $DomainName, $ParentDomainName + } + + return $domainFQDN +} + +<# + .SYNOPSIS + Get an Active Directory object's parent distinguished name. + + .PARAMETER DN + The distinguished name of the object to return the parent from. + + .NOTES + Copyright (c) 2016 The University Of Vermont + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that + the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the + following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors may be used to endorse or promote + products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + http://www.uvm.edu/~gcd/code-license/ +#> +function Get-ADObjectParentDN +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DN + ) + + # https://www.uvm.edu/~gcd/2012/07/listing-parent-of-ad-object-in-powershell/ + $distinguishedNameParts = $DN -split '(? +function Assert-MemberParameters +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $MembersToExclude + ) + + if ($PSBoundParameters.ContainsKey('Members')) + { + if ($PSBoundParameters.ContainsKey('MembersToInclude') -or $PSBoundParameters.ContainsKey('MembersToExclude')) + { + # If Members are provided, Include and Exclude are not allowed. + $errorMessage = $script:localizedData.MembersAndIncludeExcludeError -f 'Members', 'MembersToInclude', 'MembersToExclude' + New-InvalidArgumentException -ArgumentName 'Members' -Message $errorMessage + } + } + + if ($PSBoundParameters.ContainsKey('MembersToInclude')) + { + $MembersToInclude = Remove-DuplicateMembers -Members $MembersToInclude + } + + if ($PSBoundParameters.ContainsKey('MembersToExclude')) + { + $MembersToExclude = Remove-DuplicateMembers -Members $MembersToExclude + } + + if (($PSBoundParameters.ContainsKey('MembersToInclude')) -and ($PSBoundParameters.ContainsKey('MembersToExclude'))) + { + if (($MembersToInclude.Length -eq 0) -and ($MembersToExclude.Length -eq 0)) + { + $errorMessage = $script:localizedData.IncludeAndExcludeAreEmptyError -f 'MembersToInclude', 'MembersToExclude' + New-InvalidArgumentException -ArgumentName 'MembersToInclude, MembersToExclude' -Message $errorMessage + } + + # Both MembersToInclude and MembersToExclude were provided. Check if they have common principals. + foreach ($member in $MembersToInclude) + { + if ($member -in $MembersToExclude) + { + $errorMessage = $script:localizedData.IncludeAndExcludeConflictError -f $member, 'MembersToInclude', 'MembersToExclude' + New-InvalidArgumentException -ArgumentName 'MembersToInclude, MembersToExclude' -Message $errorMessage + } + } + } + +} #end function Assert-MemberParameters + +<# + .SYNOPSIS + Remove duplicate members from a string array. The comparison is + case insensitive. + + .PARAMETER Members + The array of members to remove duplicates from. + + .OUTPUTS + A string array with the unique members- +#> +function Remove-DuplicateMembers +{ + [CmdletBinding()] + [OutputType([System.String[]])] + param + ( + [Parameter()] + [System.String[]] + $Members + ) + + if ($null -eq $Members -or $Members.Count -eq 0) + { + $uniqueMembers = [System.String[]] @() + } + else + { + $uniqueMembers = [System.String[]] ($members | Sort-Object -Unique) + } + + <# + Comma make sure we return the string array as the correct type, + and also make sure one entry is returned as a string array. + #> + return , $uniqueMembers +} #end function RemoveDuplicateMembers + +<# + .SYNOPSIS + Test whether the existing array members match the defined explicit array + and include/exclude the specified members. + + .PARAMETER ExistingMembers + Existing array members. + + .PARAMETER Members + Explicit array members. + + .PARAMETER MembersToInclude + Compulsory array members. + + .PARAMETER MembersToExclude + Excluded array members. +#> +function Test-Members +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [AllowNull()] + [System.String[]] + $ExistingMembers, + + [Parameter()] + [AllowNull()] + [System.String[]] + $Members, + + [Parameter()] + [AllowNull()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [AllowNull()] + [System.String[]] + $MembersToExclude + ) + + if ($PSBoundParameters.ContainsKey('Members')) + { + if ($null -eq $Members -or (($Members.Count -eq 1) -and ($Members[0].Length -eq 0))) + { + $Members = @() + } + + Write-Verbose ($script:localizedData.CheckingMembers -f 'Explicit') + + $Members = Remove-DuplicateMembers -Members $Members + + if ($ExistingMembers.Count -ne $Members.Count) + { + Write-Verbose -Message ($script:localizedData.MembershipCountMismatch -f $Members.Count, $ExistingMembers.Count) + return $false + } + + $isInDesiredState = $true + + foreach ($member in $Members) + { + if ($member -notin $ExistingMembers) + { + Write-Verbose -Message ($script:localizedData.MemberNotInDesiredState -f $member) + $isInDesiredState = $false + } + } + + if (-not $isInDesiredState) + { + Write-Verbose -Message ($script:localizedData.MembershipNotDesiredState -f $member) + return $false + } + } #end if $Members + + if ($PSBoundParameters.ContainsKey('MembersToInclude')) + { + if ($null -eq $MembersToInclude -or (($MembersToInclude.Count -eq 1) -and ($MembersToInclude[0].Length -eq 0))) + { + $MembersToInclude = @() + } + + Write-Verbose -Message ($script:localizedData.CheckingMembers -f 'Included') + + $MembersToInclude = Remove-DuplicateMembers -Members $MembersToInclude + + $isInDesiredState = $true + + foreach ($member in $MembersToInclude) + { + if ($member -notin $ExistingMembers) + { + Write-Verbose -Message ($script:localizedData.MemberNotInDesiredState -f $member) + $isInDesiredState = $false + } + } + + if (-not $isInDesiredState) + { + Write-Verbose -Message ($script:localizedData.MembershipNotDesiredState -f $member) + return $false + } + } #end if $MembersToInclude + + if ($PSBoundParameters.ContainsKey('MembersToExclude')) + { + if ($null -eq $MembersToExclude -or (($MembersToExclude.Count -eq 1) -and ($MembersToExclude[0].Length -eq 0))) + { + $MembersToExclude = @() + } + + Write-Verbose -Message ($script:localizedData.CheckingMembers -f 'Excluded') + + $MembersToExclude = Remove-DuplicateMembers -Members $MembersToExclude + + $isInDesiredState = $true + + foreach ($member in $MembersToExclude) + { + if ($member -in $ExistingMembers) + { + Write-Verbose -Message ($script:localizedData.MemberNotInDesiredState -f $member) + $isInDesiredState = $false + } + } + + if (-not $isInDesiredState) + { + Write-Verbose -Message ($script:localizedData.MembershipNotDesiredState -f $member) + return $false + } + } #end if $MembersToExclude + + Write-Verbose -Message $script:localizedData.MembershipInDesiredState + return $true +} #end function Test-Membership + +<# + .SYNOPSIS + Convert a specified time period in seconds, minutes, hours or days into + a time span object. + + .PARAMETER TimeSpan + The length of time to use for the time span. + + .PARAMETER TimeSpanType + The units of measure in the TimeSpan parameter. +#> +function ConvertTo-TimeSpan +{ + [CmdletBinding()] + [OutputType([System.TimeSpan])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.UInt32] + $TimeSpan, + + [Parameter(Mandatory = $true)] + [ValidateSet('Seconds', 'Minutes', 'Hours', 'Days')] + [System.String] + $TimeSpanType + ) + + $newTimeSpanParams = @{} + + switch ($TimeSpanType) + { + 'Seconds' + { + $newTimeSpanParams['Seconds'] = $TimeSpan + } + + 'Minutes' + { + $newTimeSpanParams['Minutes'] = $TimeSpan + } + + 'Hours' + { + $newTimeSpanParams['Hours'] = $TimeSpan + } + + 'Days' + { + $newTimeSpanParams['Days'] = $TimeSpan + } + } + return (New-TimeSpan @newTimeSpanParams) +} #end function ConvertTo-TimeSpan + +<# + .SYNOPSIS + Converts a System.TimeSpan into the number of seconds, minutes, hours or days. + + .PARAMETER TimeSpan + TimeSpan to convert into an integer + + .PARAMETER TimeSpanType + Convert timespan into the total number of seconds, minutes, hours or days. + + .EXAMPLE + ConvertFrom-TimeSpan -TimeSpan (New-TimeSpan -Days 15) -TimeSpanType Seconds + + Returns the number of seconds in 15 days. +#> +function ConvertFrom-TimeSpan +{ + [CmdletBinding()] + [OutputType([System.Int32])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.TimeSpan] + $TimeSpan, + + [Parameter(Mandatory = $true)] + [ValidateSet('Seconds', 'Minutes', 'Hours', 'Days')] + [System.String] + $TimeSpanType + ) + + switch ($TimeSpanType) + { + 'Seconds' + { + return $TimeSpan.TotalSeconds -as [System.UInt32] + } + 'Minutes' + { + return $TimeSpan.TotalMinutes -as [System.UInt32] + } + 'Hours' + { + return $TimeSpan.TotalHours -as [System.UInt32] + } + 'Days' + { + return $TimeSpan.TotalDays -as [System.UInt32] + } + } +} #end function ConvertFrom-TimeSpan + +<# + .SYNOPSIS + Returns common AD cmdlet connection parameter for splatting. + + .PARAMETER CommonName + When specified, a CommonName overrides theUsed by the ADUser + cmdletReturns the Identity as the Name key. For example, the + Get-ADUser, Set-ADUser and Remove-ADUser cmdlets take an Identity + parameter, but the New-ADUser cmdlet uses the Name parameter. + + .PARAMETER UseNameParameter + Returns the Identity as the Name key. For example, the Get-ADUser, + Set-ADUser and Remove-ADUser cmdlets take an Identity parameter, + but the New-ADUser cmdlet uses the Name parameter. + + .EXAMPLE + $getADUserParams = Get-CommonADParameters @PSBoundParameters + + Returns connection parameters suitable for Get-ADUser using the + splatted cmdlet parameters. + + .EXAMPLE + $newADUserParams = Get-CommonADParameters @PSBoundParameters -UseNameParameter + + Returns connection parameters suitable for New-ADUser using + the splatted cmdlet parameters. +#> +function Get-ADCommonParameters +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [Alias('UserName', 'GroupName', 'ComputerName', 'ServiceAccountName')] + [System.String] + $Identity, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $CommonName, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [Alias('DomainController')] + [System.String] + $Server, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $UseNameParameter, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $PreferCommonName, + + # Catch all to enable splatted $PSBoundParameters + [Parameter(ValueFromRemainingArguments)] + $RemainingArguments + ) + + if ($UseNameParameter) + { + if ($PreferCommonName -and ($PSBoundParameters.ContainsKey('CommonName'))) + { + $adConnectionParameters = @{ + Name = $CommonName + } + } + else + { + $adConnectionParameters = @{ + Name = $Identity + } + } + } + else + { + if ($PreferCommonName -and ($PSBoundParameters.ContainsKey('CommonName'))) + { + $adConnectionParameters = @{ + Identity = $CommonName + } + } + else + { + $adConnectionParameters = @{ + Identity = $Identity + } + } + } + + if ($Credential) + { + $adConnectionParameters['Credential'] = $Credential + } + + if ($Server) + { + $adConnectionParameters['Server'] = $Server + } + + return $adConnectionParameters +} #end function Get-ADCommonParameters + +<# + .SYNOPSIS + Test Active Directory replication site availablity. + + .PARAMETER SiteName + The replication site name to test the availability of. + + .PARAMETER DomainName + The domain name containing the replication site. + + .PARAMETER Credential + The credential to use to access the replication site. +#> +function Test-ADReplicationSite +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SiteName, + + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential + ) + + Write-Verbose -Message ($script:localizedData.CheckingSite -f $SiteName) + + $existingDC = "$((Get-ADDomainController -Discover -DomainName $DomainName -ForceDiscover).HostName)" + + try + { + $site = Get-ADReplicationSite -Identity $SiteName -Server $existingDC -Credential $Credential + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + return $false + } + + return ($null -ne $site) +} + +<# + .SYNOPSIS + Convert a ModeId or Microsoft.ActiveDirectory.Management.ADForestMode to + a Microsoft.DirectoryServices.Deployment.Types.ForestMode type. + + .PARAMETER ModeId + The ModeId value to convert to a + Microsoft.DirectoryServices.Deployment.Types.ForestMode type. + + .PARAMETER Mode + The Microsoft.ActiveDirectory.Management.ADForestMode value to convert + to a Microsoft.DirectoryServices.Deployment.Types.ForestMode type +#> +function ConvertTo-DeploymentForestMode +{ + [CmdletBinding()] + [OutputType([Microsoft.DirectoryServices.Deployment.Types.ForestMode])] + param + ( + [Parameter( + Mandatory = $true, + ParameterSetName = 'ById')] + [System.UInt16] + $ModeId, + + [Parameter( + Mandatory = $true, + ParameterSetName = 'ByName')] + [AllowNull()] + [System.Nullable``1[Microsoft.ActiveDirectory.Management.ADForestMode]] + $Mode + ) + + $convertedMode = $null + + if ($PSCmdlet.ParameterSetName -eq 'ByName' -and $Mode) + { + $convertedMode = $Mode -as [Microsoft.DirectoryServices.Deployment.Types.ForestMode] + } + + if ($PSCmdlet.ParameterSetName -eq 'ById') + { + $convertedMode = $ModeId -as [Microsoft.DirectoryServices.Deployment.Types.ForestMode] + } + + if ([enum]::GetValues([Microsoft.DirectoryServices.Deployment.Types.ForestMode]) -notcontains $convertedMode) + { + return $null + } + + return $convertedMode +} + +<# + .SYNOPSIS + Convert a ModeId or Microsoft.ActiveDirectory.Management.ADDomainMode to + a Microsoft.DirectoryServices.Deployment.Types.DomainMode type. + + .PARAMETER ModeId + The ModeId value to convert to a + Microsoft.DirectoryServices.Deployment.Types.DomainMode type. + + .PARAMETER Mode + The Microsoft.ActiveDirectory.Management.ADDomainMode value to convert + to a Microsoft.DirectoryServices.Deployment.Types.DomainMode type +#> +function ConvertTo-DeploymentDomainMode +{ + [CmdletBinding()] + [OutputType([Microsoft.DirectoryServices.Deployment.Types.DomainMode])] + param + ( + [Parameter( + Mandatory = $true, + ParameterSetName = 'ById')] + [System.UInt16] + $ModeId, + + [Parameter( + Mandatory = $true, + ParameterSetName = 'ByName')] + [AllowNull()] + [System.Nullable``1[Microsoft.ActiveDirectory.Management.ADDomainMode]] + $Mode + ) + + $convertedMode = $null + + if ($PSCmdlet.ParameterSetName -eq 'ByName' -and $Mode) + { + $convertedMode = $Mode -as [Microsoft.DirectoryServices.Deployment.Types.DomainMode] + } + + if ($PSCmdlet.ParameterSetName -eq 'ById') + { + $convertedMode = $ModeId -as [Microsoft.DirectoryServices.Deployment.Types.DomainMode] + } + + if ([enum]::GetValues([Microsoft.DirectoryServices.Deployment.Types.DomainMode]) -notcontains $convertedMode) + { + return $null + } + + return $convertedMode +} + +<# + .SYNOPSIS + Restore and AD object from the AD recyle bin. + + .PARAMETER Identity + The identity of the object to restore. + + .PARAMETER ObjectClass + The type of the AD object to restore. + + .PARAMETER Credential + The credential to use to restore the object in the Active + Directory. + + .PARAMETER Server + The name of the domain controller use to restore the object. +#> +function Restore-ADCommonObject +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [Alias('UserName', 'GroupName', 'ComputerName', 'ServiceAccountName')] + [System.String] + $Identity, + + [Parameter(Mandatory = $true)] + [ValidateSet('Computer', 'OrganizationalUnit', 'User', 'Group')] + [System.String] + $ObjectClass, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [Alias('DomainController')] + [System.String] + $Server + ) + + $restoreFilter = 'msDS-LastKnownRDN -eq "{0}" -and objectClass -eq "{1}" -and isDeleted -eq $true' -f $Identity, $ObjectClass + Write-Verbose -Message ($script:localizedData.FindInRecycleBin -f $restoreFilter) -Verbose + + <# + Using IsDeleted and IncludeDeletedObjects will mean that the cmdlet does not throw + any more, and simply returns $null instead + #> + $commonParams = Get-ADCommonParameters @PSBoundParameters + $getAdObjectParams = $commonParams.Clone() + $getAdObjectParams.Remove('Identity') + $getAdObjectParams['Filter'] = $restoreFilter + $getAdObjectParams['IncludeDeletedObjects'] = $true + $getAdObjectParams['Properties'] = @('whenChanged') + + # If more than one object is returned, we pick the one that was changed last. + $restorableObject = Get-ADObject @getAdObjectParams | + Sort-Object -Descending -Property 'whenChanged' | + Select-Object -First 1 + + $restoredObject = $null + + if ($restorableObject) + { + Write-Verbose -Message ($script:localizedData.FoundRestoreTargetInRecycleBin -f $Identity, $ObjectClass, $restorableObject.DistinguishedName) -Verbose + + try + { + $restoreParams = $commonParams.Clone() + $restoreParams['PassThru'] = $true + $restoreParams['ErrorAction'] = 'Stop' + $restoreParams['Identity'] = $restorableObject.DistinguishedName + $restoredObject = Restore-ADObject @restoreParams + + Write-Verbose -Message ($script:localizedData.RecycleBinRestoreSuccessful -f $Identity, $ObjectClass) -Verbose + } + catch [Microsoft.ActiveDirectory.Management.ADException] + { + # After Get-TargetResource is through, only one error can occur here: Object parent does not exist + $errorMessage = $script:localizedData.RecycleBinRestoreFailed -f $Identity, $ObjectClass + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + else + { + Write-Verbose -Message ($script:localizedData.NoObjectFoundInRecycleBin) -Verbose + } + + return $restoredObject +} + +<# + .SYNOPSIS + Converts an Active Directory distinguished name into a fully + qualified domain name. + + .DESCRIPTION + Takes an Active Directory distinguished name as input, returns + the domain FQDN. + + .PARAMETER DistinguishedName + The distinguished name to convert into the FQDN. + + .EXAMPLE + Get-ADDomainNameFromDistinguishedName -DistinguishedName 'CN=ExampleObject,OU=ExampleOU,DC=example,DC=com' + + .NOTES + Author: Robert D. Biddle (https://github.com/RobBiddle) + Created: December.20.2017 +#> +function Get-ADDomainNameFromDistinguishedName +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $DistinguishedName + ) + + if ($DistinguishedName -notlike '*DC=*') + { + return + } + + $splitDistinguishedName = ($DistinguishedName -split 'DC=') + $splitDistinguishedNameParts = $splitDistinguishedName[1..$splitDistinguishedName.Length] + $domainFqdn = '' + + foreach ($part in $splitDistinguishedNameParts) + { + $domainFqdn += "DC=$part" + } + + $domainName = $domainFqdn -replace 'DC=', '' -replace ',', '.' + + return $domainName + +} #end function Get-ADDomainNameFromDistinguishedName + +<# + .SYNOPSIS + Add group member from current or different domain. + + .PARAMETER Members + The members to add to the group. These may be in the same + domain as the group or in alternate domains. + + .PARAMETER Parameters + The parameters to pass to the Add-ADGroupMember cmdlet when + adding the members to the group. This should include the group + identity. + + .PARAMETER MembersInMultipleDomains + Setting this switch indicates that there are members from + alternate domains. This triggers the identities of the members + to be looked up in the alternate domain. + + .NOTES + Author original code: Robert D. Biddle (https://github.com/RobBiddle) + Author refactored code: Jan-Hendrik Peters (https://github.com/nyanhp) +#> +function Add-ADCommonGroupMember +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [hashtable] + $Parameters, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $MembersInMultipleDomains + ) + + Assert-Module -ModuleName ActiveDirectory + + if ($Members) + { + if ($MembersInMultipleDomains.IsPresent) + { + foreach ($member in $Members) + { + $memberDomain = Get-ADDomainNameFromDistinguishedName -DistinguishedName $member + + if (-not $memberDomain) + { + $errorMessage = $script:localizedData.EmptyDomainError -f $member, $Parameters.Identity + New-InvalidOperationException -Message $errorMessage + } + + Write-Verbose -Message ($script:localizedData.AddingGroupMember -f $member, $memberDomain, $Parameters.Identity) + + $commonParameters = @{ + Identity = $member + Server = $memberDomain + ErrorAction = 'Stop' + } + + $activeDirectoryObject = Get-ADObject @commonParameters -Properties @('ObjectClass') + + $memberObjectClass = $activeDirectoryObject.ObjectClass + + if ($memberObjectClass -eq 'computer') + { + $memberObject = Get-ADComputer @commonParameters + } + elseif ($memberObjectClass -eq 'group') + { + $memberObject = Get-ADGroup @commonParameters + } + elseif ($memberObjectClass -eq 'user') + { + $memberObject = Get-ADUser @commonParameters + } + elseif ($memberObjectClass -eq 'msDS-ManagedServiceAccount') + { + $memberObject = Get-ADServiceAccount @commonParameters + } + elseif ($memberObjectClass -eq 'msDS-GroupManagedServiceAccount') + { + $memberObject = Get-ADServiceAccount @commonParameters + } + + Add-ADGroupMember @Parameters -Members $memberObject -ErrorAction 'Stop' + } + } + else + { + Add-ADGroupMember @Parameters -Members $Members -ErrorAction 'Stop' + } + } +} + +<# + .SYNOPSIS + Returns the domain controller object if the node is a domain controller, + otherwise it return $null. + + .PARAMETER DomainName + The name of the domain that should contain the domain controller. + + .PARAMETER ComputerName + The name of the node to return the domain controller object for. + Defaults to $env:COMPUTERNAME. + + .OUTPUTS + If the domain controller is not found, an empty object ($null) is returned. + + .NOTES + Throws an exception of Microsoft.ActiveDirectory.Management.ADServerDownException + if the domain cannot be contacted. +#> +function Get-DomainControllerObject +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $ComputerName = $env:COMPUTERNAME, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential + ) + + <# + It is not possible to use `-ErrorAction 'SilentlyContinue` on the + cmdlet Get-ADDomainController, it will throw an error regardless. + #> + try + { + $getADDomainControllerParameters = @{ + Filter = 'Name -eq "{0}"' -f $ComputerName + Server = $DomainName + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getADDomainControllerParameters['Credential'] = $Credential + } + + $domainControllerObject = Get-ADDomainController @getADDomainControllerParameters + + if (-not $domainControllerObject -and (Test-IsDomainController) -eq $true) + { + $errorMessage = $script:localizedData.WasExpectingDomainController + New-InvalidResultException -Message $errorMessage + } + } + catch + { + $errorMessage = $script:localizedData.FailedEvaluatingDomainController + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + return $domainControllerObject +} + +<# + .SYNOPSIS + Returns $true if the node is a domain controller, otherwise it returns + $false +#> +function Test-IsDomainController +{ + [CmdletBinding()] + param + ( + ) + + $operatingSystemInformation = Get-CimInstance -ClassName 'Win32_OperatingSystem' + + return $operatingSystemInformation.ProductType -eq 2 +} + +<# + .SYNOPSIS + Converts a hashtable containing the parameter to property mappings to + an array of properties that can be used to call cmdlets that supports the + parameter Properties. + + .PARAMETER PropertyMap + The property map, as an array of hashtables, to convert to a properties array. + + .EXAMPLE + $computerObjectPropertyMap = @( + @{ + ParameterName = 'ComputerName' + PropertyName = 'cn' + }, + @{ + ParameterName = 'Location' + } + ) + + $computerObjectProperties = Convert-PropertyMapToObjectProperties $computerObjectPropertyMap + $getADComputerResult = Get-ADComputer -Identity 'APP01' -Properties $computerObjectProperties +#> +function Convert-PropertyMapToObjectProperties +{ + [CmdletBinding()] + [OutputType([System.Array])] + param + ( + [Parameter(Mandatory = $true)] + [System.Array] + $PropertyMap + ) + + $objectProperties = @() + + # Create an array of the AD property names to retrieve from the property map + foreach ($property in $PropertyMap) + { + if ($property -isnot [System.Collections.Hashtable]) + { + $errorMessage = $script:localizedData.PropertyMapArrayIsWrongType + New-InvalidOperationException -Message $errorMessage + } + + if ($property.ContainsKey('PropertyName')) + { + $objectProperties += @($property.PropertyName) + } + else + { + $objectProperties += $property.ParameterName + } + } + + return $objectProperties +} + +<# + .SYNOPSIS + This function is used to compare current and desired values for any DSC + resource, and return a hashtable with the result from the comparison. + + .PARAMETER CurrentValues + The current values that should be compared to to desired values. Normally + the values returned from Get-TargetResource. + + .PARAMETER DesiredValues + The values set in the configuration and is provided in the call to the + functions *-TargetResource, and that will be compared against current + values. Normally set to $PSBoundParameters. + + .PARAMETER Properties + An array of property names, from the keys provided in DesiredValues, that + will be compared. If this parameter is left out, all the keys in the + DesiredValues will be compared. +#> +function Compare-ResourcePropertyState +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $DesiredValues, + + [Parameter()] + [System.String[]] + $Properties, + + [Parameter()] + [System.String[]] + $IgnoreProperties + ) + + if ($PSBoundParameters.ContainsKey('Properties')) + { + # Filter out the parameters (keys) not specified in Properties + $desiredValuesToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -notin $Properties + } + + $desiredValuesToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + else + { + <# + Remove any common parameters that might be part of DesiredValues, + if it $PSBoundParameters was used to pass the desired values. + #> + $commonParametersToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -in [System.Management.Automation.PSCmdlet]::CommonParameters ` + -or $_ -in [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + } + + $commonParametersToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + + # Remove any properties that should be ignored. + if ($PSBoundParameters.ContainsKey('IgnoreProperties')) + { + $IgnoreProperties | + ForEach-Object -Process { + if ($DesiredValues.ContainsKey($_)) + { + $DesiredValues.Remove($_) + } + } + } + + $compareTargetResourceStateReturnValue = @() + + foreach ($parameterName in $DesiredValues.Keys) + { + Write-Verbose -Message ($script:localizedData.EvaluatePropertyState -f $parameterName) -Verbose + + $parameterState = @{ + ParameterName = $parameterName + Expected = $DesiredValues.$parameterName + Actual = $CurrentValues.$parameterName + } + + # Check if the parameter is in compliance. + $isPropertyInDesiredState = Test-DscPropertyState -Values @{ + CurrentValue = $CurrentValues.$parameterName + DesiredValue = $DesiredValues.$parameterName + } + + if ($isPropertyInDesiredState) + { + Write-Verbose -Message ($script:localizedData.PropertyInDesiredState -f $parameterName) -Verbose + + $parameterState['InDesiredState'] = $true + } + else + { + Write-Verbose -Message ($script:localizedData.PropertyNotInDesiredState -f $parameterName) -Verbose + + $parameterState['InDesiredState'] = $false + } + + $compareTargetResourceStateReturnValue += $parameterState + } + + return $compareTargetResourceStateReturnValue +} + +<# + .SYNOPSIS + This function is used to compare the current and the desired value of a + property. + + .PARAMETER Values + This is set to a hash table with the current value (the CurrentValue key) + and desired value (the DesiredValue key). + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 'John' + DesiredValue = 'Alice' + } + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 1 + DesiredValue = 2 + } +#> +function Test-DscPropertyState +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Values + ) + + if ($null -eq $Values.CurrentValue -and $null -eq $Values.DesiredValue) + { + # Both values are $null so return $true + $returnValue = $true + } + elseif ($null -eq $Values.CurrentValue -or $null -eq $Values.DesiredValue) + { + # Either CurrentValue or DesiredValue are $null so return $false + $returnValue = $false + } + elseif ($Values.DesiredValue.GetType().IsArray -or $Values.CurrentValue.GetType().IsArray) + { + $compareObjectParameters = @{ + ReferenceObject = $Values.CurrentValue + DifferenceObject = $Values.DesiredValue + } + + $arrayCompare = Compare-Object @compareObjectParameters + + if ($null -ne $arrayCompare) + { + Write-Verbose -Message $script:localizedData.ArrayDoesNotMatch -Verbose + + $arrayCompare | + ForEach-Object -Process { + Write-Verbose -Message ($script:localizedData.ArrayValueThatDoesNotMatch -f ` + $_.InputObject, $_.SideIndicator) -Verbose + } + + $returnValue = $false + } + else + { + $returnValue = $true + } + } + elseif ($Values.CurrentValue -ne $Values.DesiredValue) + { + $desiredType = $Values.DesiredValue.GetType() + + $returnValue = $false + + $supportedTypes = @( + 'String' + 'Int32' + 'UInt32' + 'Int16' + 'UInt16' + 'Single' + 'Boolean' + ) + + if ($desiredType.Name -notin $supportedTypes) + { + Write-Warning -Message ($script:localizedData.UnableToCompareType -f $desiredType.Name) + } + else + { + Write-Verbose -Message ( + $script:localizedData.PropertyValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $Values.CurrentValue, $Values.DesiredValue + ) -Verbose + } + } + else + { + $returnValue = $true + } + + return $returnValue +} + +<# + .SYNOPSIS + Asserts if the AD PS Provider has been installed. + + .NOTES + Attempts to force import the ActiveDirectory module if the AD PS Provider has not been installed + and throws an exception if the AD PS Provider cannot be installed. +#> + +function Assert-ADPSProvider +{ + [CmdletBinding()] + param () + + $activeDirectoryPSProvider = Get-PSProvider -PSProvider 'ActiveDirectory' -ErrorAction SilentlyContinue + + if ($null -eq $activeDirectoryPSProvider) + { + Write-Verbose -Message $script:localizedData.AdPsProviderNotFound -Verbose + Import-Module -Name 'ActiveDirectory' -Force + try + { + $activeDirectoryPSProvider = Get-PSProvider -PSProvider 'ActiveDirectory' + } + catch + { + $errorMessage = $script:localizedData.AdPsProviderInstallFailureError + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } +} + +<# + .SYNOPSIS + Asserts if the AD PS Drive has been created, and creates one if not. + + .PARAMETER Root + Specifies the AD path to which the drive is mapped. + + .NOTES + Throws an exception if the PS Drive cannot be created. +#> +function Assert-ADPSDrive +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $Root = '//RootDSE/' + ) + + Assert-Module -ModuleName 'ActiveDirectory' + + Assert-ADPSProvider + + $activeDirectoryPSDrive = Get-PSDrive -Name AD -ErrorAction SilentlyContinue + + if ($null -eq $activeDirectoryPSDrive) + { + Write-Verbose -Message $script:localizedData.CreatingNewADPSDrive -Verbose + + try + { + New-PSDrive -Name AD -PSProvider 'ActiveDirectory' -Root $Root -Scope Global -ErrorAction 'Stop' | + Out-Null + } + catch + { + $errorMessage = $script:localizedData.CreatingNewADPSDriveError + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } +} + +<# + .SYNOPSIS + This is a wrapper for Set-ADComputer. + + .PARAMETER Parameters + A hash table containing all parameters that will be passed trough to + Set-ADComputer. + + .NOTES + This is needed because of how Pester is unable to handle mocking the + cmdlet Set-ADComputer. Therefor there are no unit test for this function. +#> +function Set-DscADComputer +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Parameters + ) + + Set-ADComputer @Parameters | Out-Null +} + +<# + .SYNOPSIS + This returns a new MSFT_Credential CIM instance credential object to be + used when returning credential objects from Get-TargetResource. + This returns a credential object without the password. + + .PARAMETER Credential + The PSCredential object to return as a MSFT_Credential CIM instance + credential object. + + .NOTES + When returning a PSCredential object from Get-TargetResource, the + credential object does not contain the username. The object is empty. + + Password UserName PSComputerName + -------- -------- -------------- + localhost + + When the MSFT_Credential CIM instance credential object is returned by + the Get-TargetResource then the credential object contains the values + provided in the object. + + Password UserName PSComputerName + -------- -------- -------------- + COMPANY\TestAccount localhost +#> +function New-CimCredentialInstance +{ + [CmdletBinding()] + [OutputType([Microsoft.Management.Infrastructure.CimInstance])] + param + ( + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + $Credential + ) + + $newCimInstanceParameters = @{ + ClassName = 'MSFT_Credential' + ClientOnly = $true + Namespace = 'root/microsoft/windows/desiredstateconfiguration' + Property = @{ + UserName = [System.String] $Credential.UserName + Password = [System.String] $null + } + } + + return New-CimInstance @newCimInstanceParameters +} + +<# + .SYNOPSIS + This loads the assembly type, optionally after a check + if the type is missing in the PowerShell session. + + .PARAMETER AssemblyName + The assembly to load into the PowerShell session. + + .PARAMETER TypeName + An optional parameter to check if the type exist, if it exist then the + assembly is not loaded again. +#> +function Add-TypeAssembly +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $AssemblyName, + + [Parameter()] + [System.String] + $TypeName + ) + + if ($PSBoundParameters.ContainsKey('TypeName')) + { + if ($TypeName -as [Type]) + { + Write-Verbose -Message ($script:localizedData.TypeAlreadyExistInSession -f $TypeName) -Verbose + + # The type already exists so no need to load the type again. + return + } + else + { + Write-Verbose -Message ($script:localizedData.TypeDoesNotExistInSession -f $TypeName) -Verbose + } + } + + try + { + Write-Verbose -Message ($script:localizedData.AddingAssemblyToSession -f $AssemblyName) -Verbose + + Add-Type -AssemblyName $AssemblyName + } + catch + { + $missingRoleMessage = $script:localizedData.CouldNotLoadAssembly -f $AssemblyName + New-ObjectNotFoundException -Message $missingRoleMessage -ErrorRecord $_ + } +} + +<# + .SYNOPSIS + This returns a new object of the type System.DirectoryServices.ActiveDirectory.DirectoryContext. + + .PARAMETER DirectoryContextType + The context type of the object to return. Valid values are 'Domain', 'Forest', + 'ApplicationPartition', 'ConfigurationSet' or 'DirectoryServer'. + + .PARAMETER Name + An optional parameter for the target of the directory context. + For the correct format for this parameter depending on context type, see + the article https://docs.microsoft.com/en-us/dotnet/api/system.directoryservices.activedirectory.directorycontext?view=netframework-4.8 +#> +function Get-ADDirectoryContext +{ + [CmdletBinding()] + [OutputType([System.DirectoryServices.ActiveDirectory.DirectoryContext])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Domain', 'Forest', 'ApplicationPartition', 'ConfigurationSet', 'DirectoryServer')] + [System.String] + $DirectoryContextType, + + [Parameter()] + [System.String] + $Name, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential + ) + + $typeName = 'System.DirectoryServices.ActiveDirectory.DirectoryContext' + + Add-TypeAssembly -AssemblyName 'System.DirectoryServices' -TypeName $typeName + + Write-Verbose -Message ($script:localizedData.NewDirectoryContext -f $DirectoryContextType) -Verbose + + $newObjectArgumentList = @( + $DirectoryContextType + ) + + if ($PSBoundParameters.ContainsKey('Name')) + { + Write-Verbose -Message ($script:localizedData.NewDirectoryContextTarget -f $Name) -Verbose + + $newObjectArgumentList += @( + $Name + ) + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + Write-Verbose -Message ($script:localizedData.NewDirectoryContextCredential -f $Credential.UserName) -Verbose + + $newObjectArgumentList += @( + $Credential.UserName + $Credential.GetNetworkCredential().Password + ) + } + else + { + Write-Verbose -Message ($script:localizedData.NewDirectoryContextCredential -f (Get-CurrentUser).Name) -Verbose + } + + $newObjectParameters = @{ + TypeName = $typeName + ArgumentList = $newObjectArgumentList + } + + return New-Object @newObjectParameters +} + +<# + .SYNOPSIS + Gets the specified Active Directory domain + + .PARAMETER DomainName + Specifies the fully qualified domain name to wait for.. + + .PARAMETER DomainName + Specifies the site in the domain where to look for a domain controller. + + .PARAMETER Credential + Specifies the credentials that are used when accessing the domain, + or uses the current user if not specified. + + .PARAMETER WaitForValidCredentials + Specifies if authentication exceptions should be ignored. + + .NOTES + This function is designed so that it can run on any computer without + having the ActiveDirectory module installed. +#> +function Find-DomainController +{ + [OutputType([System.DirectoryServices.ActiveDirectory.DomainController])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $SiteName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $WaitForValidCredentials + ) + + if ($PSBoundParameters.ContainsKey('SiteName')) + { + Write-Verbose -Message ($script:localizedData.SearchingForDomainControllerInSite -f $SiteName, $DomainName) -Verbose + } + else + { + Write-Verbose -Message ($script:localizedData.SearchingForDomainController -f $DomainName) -Verbose + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $adDirectoryContext = Get-ADDirectoryContext -DirectoryContextType 'Domain' -Name $DomainName -Credential $Credential + } + else + { + $adDirectoryContext = Get-ADDirectoryContext -DirectoryContextType 'Domain' -Name $DomainName + } + + $domainControllerObject = $null + + try + { + if ($PSBoundParameters.ContainsKey('SiteName')) + { + $domainControllerObject = Find-DomainControllerFindOneInSiteWrapper -DirectoryContext $adDirectoryContext -SiteName $SiteName + + Write-Verbose -Message ($script:localizedData.FoundDomainControllerInSite -f $SiteName, $DomainName) -Verbose + } + else + { + $domainControllerObject = Find-DomainControllerFindOneWrapper -DirectoryContext $adDirectoryContext + + Write-Verbose -Message ($script:localizedData.FoundDomainController -f $DomainName) -Verbose + } + } + catch [System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectNotFoundException] + { + Write-Verbose -Message ($script:localizedData.FailedToFindDomainController -f $DomainName) -Verbose + } + catch [System.Management.Automation.MethodInvocationException] + { + $isTypeNameToSuppress = $_.Exception.InnerException -is [System.Security.Authentication.AuthenticationException] + + if ($WaitForValidCredentials.IsPresent -and $isTypeNameToSuppress) + { + Write-Warning -Message ( + $script:localizedData.IgnoreCredentialError -f $_.FullyQualifiedErrorId, $_.Exception.Message + ) + } + elseif ($_.Exception.InnerException -is [System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectNotFoundException]) + { + Write-Verbose -Message ($script:localizedData.FailedToFindDomainController -f $DomainName) -Verbose + } + else + { + throw $_ + } + } + catch + { + throw $_ + } + + return $domainControllerObject +} + +<# + .SYNOPSIS + This returns a new object of the type System.DirectoryServices.ActiveDirectory.Forest + which is a class that represents an Active Directory Domain Services forest. + + .PARAMETER DirectoryContext + The Active Directory context from which the forest object is returned. + Calling the Get-ADDirectoryContext gets a value that can be provided in + this parameter. + + .NOTES + This is a wrapper to enable unit testing of the function Find-DomainController. + It is not possible to make a stub class to mock these, since these classes + are loaded into the PowerShell session when it starts. + + This function is not exported. +#> +function Find-DomainControllerFindOneWrapper +{ + [CmdletBinding()] + [OutputType([System.DirectoryServices.ActiveDirectory.DomainController])] + param + ( + [Parameter(Mandatory = $true)] + [System.DirectoryServices.ActiveDirectory.DirectoryContext] + $DirectoryContext + ) + + return [System.DirectoryServices.ActiveDirectory.DomainController]::FindOne($DirectoryContext) +} + +<# + .SYNOPSIS + This returns a new object of the type System.DirectoryServices.ActiveDirectory.Forest + which is a class that represents an Active Directory Domain Services forest. + + .PARAMETER DirectoryContext + The Active Directory context from which the forest object is returned. + Calling the Get-ADDirectoryContext gets a value that can be provided in + this parameter. + + .PARAMETER SiteName + Specifies the site in the domain where to look for a domain controller. + + .NOTES + This is a wrapper to enable unit testing of the function Find-DomainController. + It is not possible to make a stub class to mock these, since these classes + are loaded into the PowerShell session when it starts. + + This function is not exported. +#> +function Find-DomainControllerFindOneInSiteWrapper +{ + [CmdletBinding()] + [OutputType([System.DirectoryServices.ActiveDirectory.DomainController])] + param + ( + [Parameter(Mandatory = $true)] + [System.DirectoryServices.ActiveDirectory.DirectoryContext] + $DirectoryContext, + + [Parameter(Mandatory = $true)] + [System.String] + $SiteName + ) + + return [System.DirectoryServices.ActiveDirectory.DomainController]::FindOne($DirectoryContext, $SiteName) +} + +<# + .SYNOPSIS + This is used to get the current user context when the resource + script runs. + + .NOTES + We are putting this in a function so we can mock it with pester +#> +function Get-CurrentUser +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + return [System.Security.Principal.WindowsIdentity]::GetCurrent() +} + +<# + .SYNOPSIS + Test the validity of a user's password. + + .PARAMETER DomainName + Name of the domain where the user account is located (only used if + password is managed). + + .PARAMETER UserName + Specifies the Security Account Manager (SAM) account name of the user + (ldapDisplayName 'sAMAccountName'). + + .PARAMETER Password + Specifies a new password value for the account. + + .PARAMETER Credential + Specifies the user account credentials to use to perform this task. + + .PARAMETER PasswordAuthentication + Specifies the authentication context type used when testing passwords. + Default value is 'Default'. +#> +function Test-Password +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter(Mandatory = $true)] + [System.String] + $UserName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Password, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential, + + # Specifies the authentication context type when testing user passwords #61 + [Parameter(Mandatory = $true)] + [ValidateSet('Default', 'Negotiate')] + [System.String] + $PasswordAuthentication + ) + + Write-Verbose -Message ($script:localizedData.CreatingADDomainConnection -f $DomainName) + + $principalContextTypeName = 'System.DirectoryServices.AccountManagement.PrincipalContext' + + Add-TypeAssembly -AssemblyName 'System.DirectoryServices.AccountManagement' -TypeName $principalContextTypeName + + <# + If the domain name contains a distinguished name, set it to the fully + qualified domain name (FQDN) instead. + If the $DomainName does not contain a distinguished name the function + Get-ADDomainNameFromDistinguishedName returns $null. + #> + $ADDomainName = Get-ADDomainNameFromDistinguishedName -DistinguishedName $DomainName + if ($ADDomainName) + { + $DomainName = $ADDomainName + } + + if ($Credential) + { + Write-Verbose -Message ( + $script:localizedData.TestPasswordUsingImpersonation -f $Credential.UserName, $UserName + ) + + $principalContext = New-Object -TypeName $principalContextTypeName -ArgumentList @( + [System.DirectoryServices.AccountManagement.ContextType]::Domain, + $DomainName, + $Credential.UserName, + $Credential.GetNetworkCredential().Password + ) + } + else + { + $principalContext = New-Object -TypeName $principalContextTypeName -ArgumentList @( + [System.DirectoryServices.AccountManagement.ContextType]::Domain, + $DomainName, + $null, + $null + ) + } + + Write-Verbose -Message ($script:localizedData.CheckingADUserPassword -f $UserName) + + $getPrincipalContextCredentials = @{ + UserName = $UserName + Password = $Password + PrincipalContext = $principalContext + PasswordAuthentication = $PasswordAuthentication + } + return Test-PrincipalContextCredentials @getPrincipalContextCredentials +} + +<# + .SYNOPSIS + Test the validity of credentials using a PrincipalContext + + .PARAMETER UserName + Specifies the Security Account Manager (SAM) account name of the user + (ldapDisplayName 'sAMAccountName'). + + .PARAMETER Password + Specifies a new password value for the account. + + .PARAMETER PrincipalContext + Specifies the PrincipalContext object that the credential test will be + performed using. + + .PARAMETER PasswordAuthentication + Specifies the authentication context type used when testing passwords. + Default value is 'Default'. + + .NOTES + We are putting this in a function so we can mock it with pester. +#> +function Test-PrincipalContextCredentials +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $UserName, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Password, + + [Parameter(Mandatory = $true)] + [System.DirectoryServices.AccountManagement.PrincipalContext] + $PrincipalContext, + + [Parameter(Mandatory = $true)] + [ValidateSet('Default', 'Negotiate')] + [System.String] + $PasswordAuthentication + ) + + if ($PasswordAuthentication -eq 'Negotiate') + { + $result = $principalContext.ValidateCredentials( + $UserName, + $Password.GetNetworkCredential().Password, + [System.DirectoryServices.AccountManagement.ContextOptions]::Negotiate -bor + [System.DirectoryServices.AccountManagement.ContextOptions]::Signing -bor + [System.DirectoryServices.AccountManagement.ContextOptions]::Sealing + ) + } + else + { + # Use default authentication context + $result = $principalContext.ValidateCredentials( + $UserName, + $Password.GetNetworkCredential().Password + ) + } + + return $result +} + +$script:localizedData = Get-LocalizedData -ResourceName 'ActiveDirectoryDsc.Common' -ScriptRoot $PSScriptRoot diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/en-US/ActiveDirectoryDsc.Common.strings.psd1 b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/en-US/ActiveDirectoryDsc.Common.strings.psd1 new file mode 100644 index 0000000..2ce9aae --- /dev/null +++ b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/Modules/ActiveDirectoryDsc.Common/en-US/ActiveDirectoryDsc.Common.strings.psd1 @@ -0,0 +1,52 @@ +# Localized resources for helper module ActiveDirectoryDsc.Common. + +ConvertFrom-StringData @' + WasExpectingDomainController = The operating system product type code returned 2, which indicates that this is domain controller, but was unable to retrieve the domain controller object. (ADCOMMON0001) + FailedEvaluatingDomainController = Could not evaluate if the node is a domain controller. (ADCOMMON0002) + EvaluatePropertyState = Evaluating the state of the property '{0}'. (ADCOMMON0003) + PropertyInDesiredState = The parameter '{0}' is in desired state. (ADCOMMON0004) + PropertyNotInDesiredState = The parameter '{0}' is not in desired state. (ADCOMMON0005) + ArrayDoesNotMatch = One or more values in an array does not match the desired state. Details of the changes are below. (ADCOMMON0006) + ArrayValueThatDoesNotMatch = {0} - {1} (ADCOMMON0007) + PropertyValueOfTypeDoesNotMatch = {0} value does not match. Current value is '{1}', but expected the value '{2}'. (ADCOMMON0008) + UnableToCompareType = Unable to compare the type {0} as it is not handled by the Test-DscPropertyState cmdlet. (ADCOMMON0009) + ModuleNotFoundError = Please ensure that the PowerShell module for role '{0}' is installed. (ADCOMMON0010) + MembersAndIncludeExcludeError = The '{0}' and '{1}' and/or '{2}' parameters conflict. The '{0}' parameter should not be used in any combination with the '{1}' and '{2}' parameters. (ADCOMMON0011) + IncludeAndExcludeConflictError = The member '{0}' is included in both '{1}' and '{2}' parameter values. The same member must not be included in both '{1}' and '{2}' parameter values. (ADCOMMON0014) + IncludeAndExcludeAreEmptyError = The '{0}' and '{1}' parameters are either both null or empty. At least one member must be specified in one of these parameters. (ADCOMMON0015) + RecycleBinRestoreFailed = Failed restoring {0} ({1}) from the recycle bin. (ADCOMMON0017) + EmptyDomainError = No domain name retrieved for group member {0} in group {1}. (ADCOMMON0018) + CheckingMembers = Checking for '{0}' members. (ADCOMMON0019) + MembershipCountMismatch = Membership count is not correct. Expected '{0}' members, actual '{1}' members. (ADCOMMON0020) + MemberNotInDesiredState = Member '{0}' is not in the desired state. (ADCOMMON0021) + MembershipInDesiredState = Membership is in the desired state. (ADCOMMON0023) + MembershipNotDesiredState = Membership is NOT in the desired state. (ADCOMMON0024) + CheckingSite = Checking for site '{0}'. (ADCOMMON0026) + FindInRecycleBin = Finding objects in the recycle bin matching the filter {0}. (ADCOMMON0027) + FoundRestoreTargetInRecycleBin = Found object {0} ({1}) in the recycle bin as {2}. Attempting to restore the object. (ADCOMMON0028) + RecycleBinRestoreSuccessful = Successfully restored object {0} ({1}) from the recycle bin. (ADCOMMON0029) + AddingGroupMember = Adding member '{0}' from domain '{1}' to AD group '{2}'. (ADCOMMON0030) + PropertyMapArrayIsWrongType = An object in the property map array is not of the type [System.Collections.Hashtable]. (ADCOMMON0031) + CreatingNewADPSDrive = Creating new AD: PSDrive. (ADCOMMON0032) + CreatingNewADPSDriveError = Error creating AD: PS Drive. (ADCOMMON0033) + StartProcess = Started the process with id {0} using the path '{1}', and with a timeout value of {2} seconds. (ADCOMMON0041) + CouldNotLoadAssembly = The assembly '{0}' could not be loaded into the PowerShell session. (ADCOMMON0042) + TypeAlreadyExistInSession = The type '{0}' is already loaded into the PowerShell session. (ADCOMMON0043) + TypeDoesNotExistInSession = Missing the type '{0}' from the PowerShell session. (ADCOMMON0044) + AddingAssemblyToSession = Adding the assembly '{0}' into the PowerShell session. (ADCOMMON0045) + NewDirectoryContext = Get a new Active Directory context of the type '{0}'. (ADCOMMON0046) + NewDirectoryContextTarget = The Active Directory context will target '{0}'. (ADCOMMON0047) + NewDirectoryContextCredential = The Active Directory context will be accessed using the '{0}' credentials. (ADCOMMON0048) + FoundDomainController = Found a domain controller in the domain '{0}'. (ADCOMMON0049) + FoundDomainControllerInSite = Found a domain controller in the site '{0}' in the domain '{1}'. (ADCOMMON0050) + FailedToFindDomainController = No domain controller was found in the domain '{0}'. (ADCOMMON0051) + SearchingForDomainController = Searching for a domain controller in the domain '{0}'. (ADCOMMON0052) + SearchingForDomainControllerInSite = Searching for a domain controller in the site '{0}' in the domain '{1}'. (ADCOMMON0053) + IgnoreCredentialError = Suppressing the credential error '{0}' with the message '{1}'. (ADCOMMON0054) + NoObjectFoundInRecycleBin = Did not find a restorable object in the recycle bin. (ADCOMMON0055) + AdPsProviderNotFound = The Active Directory PS Provider was not found, Forcing import of the ActiveDirectory module. (ADCOMMON0056) + AdPsProviderInstallFailureError = Error installing the Active Directory PS Provider. (ADCOMMON0057) + CreatingADDomainConnection = Creating connection to Active Directory domain '{0}'. (ADCOMMON0058) + CheckingADUserPassword = Checking Active Directory user '{0}' password. (ADCOMMON0059) + TestPasswordUsingImpersonation = Impersonating the credentials ''{0}'' to test password for user ''{1}''. (ADCOMMON0060) +'@ diff --git a/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/PSGetModuleInfo.xml b/deployment/dsc/azshcihost/ActiveDirectoryDsc/6.0.1/PSGetModuleInfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..4af3f7b94c670f1cff04385a11895b6abefde126 GIT binary patch literal 76080 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 Get-DscResource -Module ActiveDirectoryDsc + +NOTE: + Thank you to all those who contributed to this module, by writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Look out on the Github repository for issues and new releases. + +SEE ALSO + - https://github.com/dsccommunity/ActiveDirectoryDsc + +KEYWORDS + DSC, DscResource, ActiveDirectory diff --git a/deployment/dsc/azshcihost/AzSHCIHost.ps1 b/deployment/dsc/azshcihost/AzSHCIHost.ps1 new file mode 100644 index 0000000..386b7bb --- /dev/null +++ b/deployment/dsc/azshcihost/AzSHCIHost.ps1 @@ -0,0 +1,1122 @@ +configuration AzSHCIHost +{ + param + ( + [Parameter(Mandatory)] + [string]$DomainName, + [Parameter(Mandatory)] + [string]$environment, + [Parameter(Mandatory)] + [System.Management.Automation.PSCredential]$Admincreds, + [Parameter(Mandatory)] + [string]$enableDHCP, + [Parameter(Mandatory)] + [string]$customRdpPort, + [string]$vSwitchNameHost = "InternalNAT", + [String]$targetDrive = "V", + [String]$sourcePath = "$targetDrive" + ":\Source", + [String]$updatePath = "$sourcePath\Updates", + [String]$ssuPath = "$updatePath\SSU", + [String]$cuPath = "$updatePath\CU", + [String]$targetVMPath = "$targetDrive" + ":\VMs", + [String]$witnessPath = "$targetDrive" + ":\Witness", + [String]$targetADPath = "$targetDrive" + ":\ADDS", + [String]$baseVHDFolderPath = "$targetVMPath\Base", + [String]$azsHCIIsoUri = "https://aka.ms/2CNBagfhSZ8BM7jyEV8I", + [String]$azsHciVhdPath = "$baseVHDFolderPath\AzSHCI.vhdx", + [String]$azsHCIISOLocalPath = "$sourcePath\AzSHCI.iso", + [Int]$azsHostCount = 2, + [Int]$azsHostDataDiskCount = 4, + [Int64]$dataDiskSize = 250GB + ) + + Import-DscResource -ModuleName 'PSDesiredStateConfiguration' + Import-DscResource -ModuleName 'xPSDesiredStateConfiguration' + Import-DscResource -ModuleName 'ComputerManagementDsc' + Import-DscResource -ModuleName 'xHyper-v' + Import-DscResource -ModuleName 'cHyper-v' + Import-DscResource -ModuleName 'StorageDSC' + Import-DscResource -ModuleName 'NetworkingDSC' + Import-DscResource -ModuleName 'xDHCpServer' + Import-DscResource -ModuleName 'DnsServerDsc' + Import-DscResource -ModuleName 'cChoco' + Import-DscResource -ModuleName 'DSCR_Shortcut' + Import-DscResource -ModuleName 'xCredSSP' + Import-DscResource -ModuleName 'ActiveDirectoryDsc' + + $aszhciHostsMofUri = "https://raw.githubusercontent.com/Azure/AzureStackHCI-EvalGuide/main/deployment/helpers/Install-AzsRolesandFeatures.ps1" + $updateAdUri = "https://raw.githubusercontent.com/Azure/AzureStackHCI-EvalGuide/main/deployment/helpers/Update-AD.ps1" + $regHciUri = "https://raw.githubusercontent.com/Azure/AzureStackHCI-EvalGuide/main/deployment/helpers/Register-AzSHCI.ps1" + + if ($enableDHCP -eq "Enabled") { + $dhcpStatus = "Active" + } + else { $dhcpStatus = "Inactive" } + + [System.Management.Automation.PSCredential]$DomainCreds = New-Object System.Management.Automation.PSCredential ("${DomainName}\$($Admincreds.UserName)", $Admincreds.Password) + + $ipConfig = (Get-NetAdapter -Physical | Where-Object { $_.InterfaceDescription -like "*Hyper-V*" } | Get-NetIPConfiguration | Where-Object IPv4DefaultGateway) + $netAdapters = Get-NetAdapter -Name ($ipConfig.InterfaceAlias) | Select-Object -First 1 + $InterfaceAlias = $($netAdapters.Name) + + Node localhost + { + LocalConfigurationManager { + RebootNodeIfNeeded = $true + ActionAfterReboot = 'ContinueConfiguration' + ConfigurationMode = 'ApplyOnly' + } + + #### CREATE STORAGE SPACES V: & VM FOLDER #### + + Script StoragePool { + SetScript = { + New-StoragePool -FriendlyName AzSHCIPool -StorageSubSystemFriendlyName '*storage*' -PhysicalDisks (Get-PhysicalDisk -CanPool $true) + } + TestScript = { + (Get-StoragePool -ErrorAction SilentlyContinue -FriendlyName AzSHCIPool).OperationalStatus -eq 'OK' + } + GetScript = { + @{Ensure = if ((Get-StoragePool -FriendlyName AzSHCIPool).OperationalStatus -eq 'OK') { 'Present' } Else { 'Absent' } } + } + } + Script VirtualDisk { + SetScript = { + $disks = Get-StoragePool -FriendlyName AzSHCIPool -IsPrimordial $False | Get-PhysicalDisk + $diskNum = $disks.Count + New-VirtualDisk -StoragePoolFriendlyName AzSHCIPool -FriendlyName AzSHCIDisk -ResiliencySettingName Simple -NumberOfColumns $diskNum -UseMaximumSize + } + TestScript = { + (Get-VirtualDisk -ErrorAction SilentlyContinue -FriendlyName AzSHCIDisk).OperationalStatus -eq 'OK' + } + GetScript = { + @{Ensure = if ((Get-VirtualDisk -FriendlyName AzSHCIDisk).OperationalStatus -eq 'OK') { 'Present' } Else { 'Absent' } } + } + DependsOn = "[Script]StoragePool" + } + Script FormatDisk { + SetScript = { + $vDisk = Get-VirtualDisk -FriendlyName AzSHCIDisk + if ($vDisk | Get-Disk | Where-Object PartitionStyle -eq 'raw') { + $vDisk | Get-Disk | Initialize-Disk -Passthru | New-Partition -DriveLetter $Using:targetDrive -UseMaximumSize | Format-Volume -NewFileSystemLabel AzSHCIData -AllocationUnitSize 64KB -FileSystem NTFS + } + elseif ($vDisk | Get-Disk | Where-Object PartitionStyle -eq 'GPT') { + $vDisk | Get-Disk | New-Partition -DriveLetter $Using:targetDrive -UseMaximumSize | Format-Volume -NewFileSystemLabel AzSHCIData -AllocationUnitSize 64KB -FileSystem NTFS + } + } + TestScript = { + (Get-Volume -ErrorAction SilentlyContinue -FileSystemLabel AzSHCIData).FileSystem -eq 'NTFS' + } + GetScript = { + @{Ensure = if ((Get-Volume -FileSystemLabel AzSHCIData).FileSystem -eq 'NTFS') { 'Present' } Else { 'Absent' } } + } + DependsOn = "[Script]VirtualDisk" + } + + File "VMfolder" { + Type = 'Directory' + DestinationPath = $targetVMPath + DependsOn = "[Script]FormatDisk" + } + + File "Witnessfolder" { + Type = 'Directory' + DestinationPath = $witnessPath + DependsOn = "[Script]FormatDisk" + } + + if ($environment -eq "AD Domain") { + File "ADfolder" { + Type = 'Directory' + DestinationPath = $targetADPath + DependsOn = "[Script]FormatDisk" + } + } + + File "Source" { + DestinationPath = $sourcePath + Type = 'Directory' + Force = $true + DependsOn = "[Script]FormatDisk" + } + + File "Updates" { + DestinationPath = $updatePath + Type = 'Directory' + Force = $true + DependsOn = "[File]Source" + } + + File "CU" { + DestinationPath = $cuPath + Type = 'Directory' + Force = $true + DependsOn = "[File]Updates" + } + + File "SSU" { + DestinationPath = $ssuPath + Type = 'Directory' + Force = $true + DependsOn = "[File]Updates" + } + + File "VM-base" { + Type = 'Directory' + DestinationPath = $baseVHDFolderPath + DependsOn = "[File]VMfolder" + } + + script "Download DSC Config for AzsHci Hosts" { + GetScript = { + $result = Test-Path -Path "$using:sourcePath\Install-AzsRolesandFeatures.ps1" + return @{ 'Result' = $result } + } + + SetScript = { + Start-BitsTransfer -Source "$using:aszhciHostsMofUri" -Destination "$using:sourcePath\Install-AzsRolesandFeatures.ps1" + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[File]Source" + } + + script "Download Update-AD" { + GetScript = { + $result = Test-Path -Path "$using:sourcePath\Update-AD.ps1" + return @{ 'Result' = $result } + } + + SetScript = { + Start-BitsTransfer -Source "$using:updateAdUri" -Destination "$using:sourcePath\Update-AD.ps1" + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[File]Source" + } + + script "Download Register-AzSHCI" { + GetScript = { + $result = Test-Path -Path "$using:sourcePath\Register-AzSHCI.ps1" + return @{ 'Result' = $result } + } + + SetScript = { + Start-BitsTransfer -Source "$using:regHciUri" -Destination "$using:sourcePath\Register-AzSHCI.ps1" + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[File]Source" + } + + script "Download AzureStack HCI bits" { + GetScript = { + $result = Test-Path -Path $using:azsHCIISOLocalPath + return @{ 'Result' = $result } + } + + SetScript = { + Start-BitsTransfer -Source $using:azsHCIIsoUri -Destination $using:azsHCIISOLocalPath + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[File]Source" + } + + script "Download AzSHCI SSU" { + GetScript = { + $result = Test-Path -Path "$using:ssuPath\*" -Include "*.msu" + return @{ 'Result' = $result } + } + + SetScript = { + $ssuSearchString = "Servicing Stack Update for Azure Stack HCI, version 20H2 for x64-based Systems" + $ssuID = "Azure Stack HCI" + $ssuUpdate = Get-MSCatalogUpdate -Search $ssuSearchString | Where-Object Products -eq $ssuID | Select-Object -First 1 + $ssuUpdate | Save-MSCatalogUpdate -Destination $using:ssuPath + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[File]SSU" + } + + script "Download AzSHCI CU" { + GetScript = { + $result = Test-Path -Path "$using:cuPath\*" -Include "*.msu" + return @{ 'Result' = $result } + } + + SetScript = { + $cuSearchString = "Cumulative Update for Azure Stack HCI, version 20H2" + $cuID = "Azure Stack HCI" + $cuUpdate = Get-MSCatalogUpdate -Search $cuSearchString | Where-Object Products -eq $cuID | Where-Object Title -like "*$($cuSearchString)*" | Select-Object -First 1 + $cuUpdate | Save-MSCatalogUpdate -Destination $using:cuPath + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[File]CU" + } + + #### SET WINDOWS DEFENDER EXCLUSION FOR VM STORAGE #### + + Script defenderExclusions { + SetScript = { + $exclusionPath = "$Using:targetDrive" + ":\" + Add-MpPreference -ExclusionPath "$exclusionPath" + } + TestScript = { + $exclusionPath = "$Using:targetDrive" + ":\" + (Get-MpPreference).ExclusionPath -contains "$exclusionPath" + } + GetScript = { + $exclusionPath = "$Using:targetDrive" + ":\" + @{Ensure = if ((Get-MpPreference).ExclusionPath -contains "$exclusionPath") { 'Present' } Else { 'Absent' } } + } + DependsOn = "[File]VMfolder" + } + + #### REGISTRY & SCHEDULED TASK TWEAKS #### + + Registry "Disable Internet Explorer ESC for Admin" { + Key = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" + Ensure = 'Present' + ValueName = "IsInstalled" + ValueData = "0" + ValueType = "Dword" + } + + Registry "Disable Internet Explorer ESC for User" { + Key = "HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" + Ensure = 'Present' + ValueName = "IsInstalled" + ValueData = "0" + ValueType = "Dword" + } + + Registry "Disable Server Manager WAC Prompt" { + Key = "HKLM:\SOFTWARE\Microsoft\ServerManager" + Ensure = 'Present' + ValueName = "DoNotPopWACConsoleAtSMLaunch" + ValueData = "1" + ValueType = "Dword" + } + + Registry "Disable Network Profile Prompt" { + Key = 'HKLM:\System\CurrentControlSet\Control\Network\NewNetworkWindowOff' + Ensure = 'Present' + ValueName = '' + } + + if ($environment -eq "Workgroup") { + Registry "Set Network Private Profile Default" { + Key = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\010103000F0000F0010000000F0000F0C967A3643C3AD745950DA7859209176EF5B87C875FA20DF21951640E807D7C24' + Ensure = 'Present' + ValueName = "Category" + ValueData = "1" + ValueType = "Dword" + } + + Registry "SetWorkgroupDomain" { + Key = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" + Ensure = 'Present' + ValueName = "Domain" + ValueData = "$DomainName" + ValueType = "String" + } + + Registry "SetWorkgroupNVDomain" { + Key = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" + Ensure = 'Present' + ValueName = "NV Domain" + ValueData = "$DomainName" + ValueType = "String" + } + + Registry "NewCredSSPKey" { + Key = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentialsWhenNTLMOnly' + Ensure = 'Present' + ValueName = '' + } + + Registry "NewCredSSPKey2" { + Key = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation' + ValueName = 'AllowFreshCredentialsWhenNTLMOnly' + ValueData = '1' + ValueType = "Dword" + DependsOn = "[Registry]NewCredSSPKey" + } + + Registry "NewCredSSPKey3" { + Key = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentialsWhenNTLMOnly' + ValueName = '1' + ValueData = "*.$DomainName" + ValueType = "String" + DependsOn = "[Registry]NewCredSSPKey2" + } + } + + ScheduledTask "Disable Server Manager at Startup" { + TaskName = 'ServerManager' + Enable = $false + TaskPath = '\Microsoft\Windows\Server Manager' + } + + #### CUSTOM FIREWALL BASED ON ARM TEMPLATE #### + + if ($customRdpPort -ne "3389") { + + Registry "Set Custom RDP Port" { + Key = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' + ValueName = "PortNumber" + ValueData = "$customRdpPort" + ValueType = 'Dword' + } + + Firewall AddFirewallRule { + Name = 'CustomRdpRule' + DisplayName = 'Custom Rule for RDP' + Ensure = 'Present' + Enabled = 'True' + Profile = 'Any' + Direction = 'Inbound' + LocalPort = "$customRdpPort" + Protocol = 'TCP' + Description = 'Firewall Rule for Custom RDP Port' + } + } + + #### ENABLE ROLES & FEATURES #### + + WindowsFeature DNS { + Ensure = "Present" + Name = "DNS" + } + + WindowsFeature "Enable Deduplication" { + Ensure = "Present" + Name = "FS-Data-Deduplication" + } + + Script EnableDNSDiags { + SetScript = { + Set-DnsServerDiagnostics -All $true + Write-Verbose -Verbose "Enabling DNS client diagnostics" + } + GetScript = { @{} } + TestScript = { $false } + DependsOn = "[WindowsFeature]DNS" + } + + WindowsFeature DnsTools { + Ensure = "Present" + Name = "RSAT-DNS-Server" + DependsOn = "[WindowsFeature]DNS" + } + + DnsServerAddress "DnsServerAddress for $InterfaceAlias" + { + Address = '127.0.0.1' + InterfaceAlias = $InterfaceAlias + AddressFamily = 'IPv4' + DependsOn = "[WindowsFeature]DNS" + } + + if ($environment -eq "AD Domain") { + + WindowsFeature ADDSInstall { + Ensure = "Present" + Name = "AD-Domain-Services" + DependsOn = "[WindowsFeature]DNS" + } + + WindowsFeature ADDSTools { + Ensure = "Present" + Name = "RSAT-ADDS-Tools" + DependsOn = "[WindowsFeature]ADDSInstall" + } + + WindowsFeature ADAdminCenter { + Ensure = "Present" + Name = "RSAT-AD-AdminCenter" + DependsOn = "[WindowsFeature]ADDSInstall" + } + + ADDomain FirstDS { + DomainName = $DomainName + Credential = $DomainCreds + SafemodeAdministratorPassword = $DomainCreds + DatabasePath = "$targetADPath" + "\NTDS" + LogPath = "$targetADPath" + "\NTDS" + SysvolPath = "$targetADPath" + "\SYSVOL" + DependsOn = @("[File]ADfolder", "[WindowsFeature]ADDSInstall") + } + } + + WindowsFeature "RSAT-Clustering" { + Name = "RSAT-Clustering" + Ensure = "Present" + } + + WindowsFeature "Install DHCPServer" { + Name = 'DHCP' + Ensure = 'Present' + } + + WindowsFeature DHCPTools { + Ensure = "Present" + Name = "RSAT-DHCP" + DependsOn = "[WindowsFeature]Install DHCPServer" + } + + Registry "DHCpConfigComplete" { + Key = 'HKLM:\SOFTWARE\Microsoft\ServerManager\Roles\12' + ValueName = "ConfigurationState" + ValueData = "2" + ValueType = 'Dword' + DependsOn = "[WindowsFeature]DHCPTools" + } + + if ($environment -eq "AD Domain") { + WindowsFeature "Hyper-V" { + Name = "Hyper-V" + Ensure = "Present" + } + } + else { + WindowsFeature "Hyper-V" { + Name = "Hyper-V" + Ensure = "Present" + DependsOn = "[Registry]NewCredSSPKey3" + } + } + + WindowsFeature "RSAT-Hyper-V-Tools" { + Name = "RSAT-Hyper-V-Tools" + Ensure = "Present" + DependsOn = "[WindowsFeature]Hyper-V" + } + + #### HYPER-V vSWITCH CONFIG #### + + xVMHost "hpvHost" + { + IsSingleInstance = 'yes' + EnableEnhancedSessionMode = $true + VirtualHardDiskPath = $targetVMPath + VirtualMachinePath = $targetVMPath + DependsOn = "[WindowsFeature]Hyper-V" + } + + xVMSwitch "$vSwitchNameHost" + { + Name = $vSwitchNameHost + Type = "Internal" + DependsOn = "[WindowsFeature]Hyper-V" + } + + IPAddress "New IP for vEthernet $vSwitchNameHost" + { + InterfaceAlias = "vEthernet `($vSwitchNameHost`)" + AddressFamily = 'IPv4' + IPAddress = '192.168.0.1/16' + DependsOn = "[xVMSwitch]$vSwitchNameHost" + } + + NetIPInterface "Enable IP forwarding on vEthernet $vSwitchNameHost" + { + AddressFamily = 'IPv4' + InterfaceAlias = "vEthernet `($vSwitchNameHost`)" + Forwarding = 'Enabled' + DependsOn = "[IPAddress]New IP for vEthernet $vSwitchNameHost" + } + + NetAdapterRdma "EnableRDMAonvEthernet" + { + Name = "vEthernet `($vSwitchNameHost`)" + Enabled = $true + DependsOn = "[NetIPInterface]Enable IP forwarding on vEthernet $vSwitchNameHost" + } + + DnsServerAddress "DnsServerAddress for vEthernet $vSwitchNameHost" + { + Address = '127.0.0.1' + InterfaceAlias = "vEthernet `($vSwitchNameHost`)" + AddressFamily = 'IPv4' + DependsOn = "[IPAddress]New IP for vEthernet $vSwitchNameHost" + } + + if ($environment -eq "AD Domain") { + + xDhcpServerAuthorization "Authorize DHCP" { + Ensure = 'Present' + DependsOn = @('[WindowsFeature]Install DHCPServer') + DnsName = [System.Net.Dns]::GetHostByName($env:computerName).hostname + IPAddress = '192.168.0.1' + } + } + + if ($environment -eq "Workgroup") { + NetConnectionProfile SetProfile + { + InterfaceAlias = "$InterfaceAlias" + NetworkCategory = 'Private' + } + } + + #### PRIMARY NIC CONFIG #### + + NetAdapterBinding DisableIPv6Host + { + InterfaceAlias = "$InterfaceAlias" + ComponentId = 'ms_tcpip6' + State = 'Disabled' + } + + #### CONFIGURE InternaNAT NIC + + script NAT { + GetScript = { + $nat = "AzSHCINAT" + $result = if (Get-NetNat -Name $nat -ErrorAction SilentlyContinue) { $true } else { $false } + return @{ 'Result' = $result } + } + + SetScript = { + $nat = "AzSHCINAT" + New-NetNat -Name $nat -InternalIPInterfaceAddressPrefix "192.168.0.0/16" + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[IPAddress]New IP for vEthernet $vSwitchNameHost" + } + + NetAdapterBinding DisableIPv6NAT + { + InterfaceAlias = "vEthernet `($vSwitchNameHost`)" + ComponentId = 'ms_tcpip6' + State = 'Disabled' + DependsOn = "[Script]NAT" + } + + #### CONFIGURE DHCP SERVER + + xDhcpServerScope "AzSHCIDhcpScope" { + Ensure = 'Present' + IPStartRange = '192.168.0.10' + IPEndRange = '192.168.0.149' + ScopeId = '192.168.0.0' + Name = 'AzSHCI Lab Range' + SubnetMask = '255.255.0.0' + LeaseDuration = '01.00:00:00' + State = "$dhcpStatus" + AddressFamily = 'IPv4' + DependsOn = @("[WindowsFeature]Install DHCPServer", "[IPAddress]New IP for vEthernet $vSwitchNameHost") + } + + xDhcpServerOption "AzSHCIDhcpServerOption" { + Ensure = 'Present' + ScopeID = '192.168.0.0' + DnsDomain = "$DomainName" + DnsServerIPAddress = '192.168.0.1' + AddressFamily = 'IPv4' + Router = '192.168.0.1' + DependsOn = "[xDhcpServerScope]AzSHCIDhcpScope" + } + + if ($environment -eq "Workgroup") { + + DnsServerPrimaryZone SetPrimaryDNSZone { + Name = "$DomainName" + Ensure = 'Present' + DependsOn = "[script]NAT" + ZoneFile = "$DomainName" + ".dns" + DynamicUpdate = 'NonSecureAndSecure' + } + + DnsServerPrimaryZone SetReverseLookupZone { + Name = '0.168.192.in-addr.arpa' + Ensure = 'Present' + DependsOn = "[DnsServerPrimaryZone]SetPrimaryDNSZone" + ZoneFile = '0.168.192.in-addr.arpa.dns' + DynamicUpdate = 'NonSecureAndSecure' + } + } + elseif ($environment -eq "AD Domain") { + + DnsServerPrimaryZone SetReverseLookupZone { + Name = '0.168.192.in-addr.arpa' + Ensure = 'Present' + DependsOn = "[ADDomain]FirstDS" + ZoneFile = '0.168.192.in-addr.arpa.dns' + } + } + + #### FINALIZE DHCP + + Script SetDHCPDNSSetting { + SetScript = { + Set-DhcpServerv4DnsSetting -DynamicUpdates "Always" -DeleteDnsRRonLeaseExpiry $True -UpdateDnsRRForOlderClients $True -DisableDnsPtrRRUpdate $false + Write-Verbose -Verbose "Setting server level DNS dynamic update configuration settings" + } + GetScript = { @{} + } + TestScript = { $false } + DependsOn = "[xDhcpServerOption]AzSHCIDhcpServerOption" + } + + if ($environment -eq "Workgroup") { + + DnsConnectionSuffix AddSpecificSuffixHostNic + { + InterfaceAlias = "$InterfaceAlias" + ConnectionSpecificSuffix = "$DomainName" + DependsOn = "[DnsServerPrimaryZone]SetPrimaryDNSZone" + } + + DnsConnectionSuffix AddSpecificSuffixNATNic + { + InterfaceAlias = "vEthernet `($vSwitchNameHost`)" + ConnectionSpecificSuffix = "$DomainName" + DependsOn = "[DnsServerPrimaryZone]SetPrimaryDNSZone" + } + + #### CONFIGURE CREDSSP & WinRM + + xCredSSP Server { + Ensure = "Present" + Role = "Server" + DependsOn = "[DnsConnectionSuffix]AddSpecificSuffixNATNic" + SuppressReboot = $true + } + xCredSSP Client { + Ensure = "Present" + Role = "Client" + DelegateComputers = "$env:COMPUTERNAME" + ".$DomainName" + DependsOn = "[xCredSSP]Server" + SuppressReboot = $true + } + + #### CONFIGURE WinRM + + Script ConfigureWinRM { + SetScript = { + Set-Item WSMan:\localhost\Client\TrustedHosts "*.$Using:DomainName" -Force + } + TestScript = { + (Get-Item WSMan:\localhost\Client\TrustedHosts).Value -contains "*.$Using:DomainName" + } + GetScript = { + @{Ensure = if ((Get-Item WSMan:\localhost\Client\TrustedHosts).Value -contains "*.$Using:DomainName") { 'Present' } Else { 'Absent' } } + } + DependsOn = "[xCredSSP]Client" + } + } + + #### Start AzSHCI Node Creation #### + + script "prepareVHDX" { + GetScript = { + $result = Test-Path -Path $using:azsHciVhdPath + return @{ 'Result' = $result } + } + + SetScript = { + # Create Azure Stack HCI Host Image from ISO + + $scratchPath = "$using:targetVMPath\Scratch" + New-Item -ItemType Directory -Path "$scratchPath" -Force | Out-Null + + Convert-WindowsImage -SourcePath $using:azsHCIISOLocalPath -SizeBytes 100GB -VHDPath $using:azsHciVhdPath ` + -VHDFormat VHDX -VHDType Dynamic -VHDPartitionStyle GPT -Package $using:ssuPath -TempDirectory $using:targetVMPath -Verbose + + <# + Convert-Wim2Vhd -DiskLayout UEFI -SourcePath $using:azsHCIISOLocalPath -Path $using:azsHciVhdPath ` + -Package $using:ssuPath -Size 100GB -Dynamic -Index 1 -ErrorAction SilentlyContinue + #> + + # Need to wait for disk to fully unmount + While ((Get-Disk).Count -gt 2) { + Start-Sleep -Seconds 5 + } + + Start-Sleep -Seconds 5 + + Mount-VHD -Path $using:azsHciVhdPath -Passthru -ErrorAction Stop -Verbose + Start-Sleep -Seconds 2 + + $disks = Get-CimInstance -ClassName Win32_DiskDrive | Where-Object Caption -eq "Microsoft Virtual Disk" + foreach ($disk in $disks) { + $vols = Get-CimAssociatedInstance -CimInstance $disk -ResultClassName Win32_DiskPartition + foreach ($vol in $vols) { + $updatedrive = Get-CimAssociatedInstance -CimInstance $vol -ResultClassName Win32_LogicalDisk | + Where-Object VolumeName -ne 'System Reserved' + } + } + $updatepath = $updatedrive.DeviceID + "\" + + $updates = get-childitem -path $using:cuPath -Recurse | Where-Object { ($_.extension -eq ".msu") -or ($_.extension -eq ".cab") } | Select-Object fullname + foreach ($update in $updates) { + write-debug $update.fullname + $command = "dism /image:" + $updatepath + " /add-package /packagepath:'" + $update.fullname + "'" + write-debug $command + Invoke-Expression $command + } + + $command = "dism /image:" + $updatepath + " /Cleanup-Image /spsuperseded" + Invoke-Expression $command + + Dismount-VHD -path $using:azsHciVhdPath -confirm:$false + + Start-Sleep -Seconds 5 + + # Enable Hyper-V role on the Azure Stack HCI Host Image + Install-WindowsFeature -Vhd $using:azsHciVhdPath -Name Hyper-V + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[file]VM-Base", "[script]Download AzureStack HCI bits", "[script]Download AzSHCI SSU", "[script]Download AzSHCI CU" + } + + for ($i = 1; $i -lt $azsHostCount + 1; $i++) { + $suffix = '{0:D2}' -f $i + $vmname = $("AZSHCINODE" + $suffix) + $memory = 24gb + + file "VM-Folder-$vmname" { + Ensure = 'Present' + DestinationPath = "$targetVMPath\$vmname" + Type = 'Directory' + DependsOn = "[File]VMfolder" + } + + xVhd "NewOSDisk-$vmname" + { + Ensure = 'Present' + Name = "$vmname-OSDisk.vhdx" + Path = "$targetVMPath\$vmname" + Generation = 'vhdx' + ParentPath = $azsHciVhdPath + Type = 'Differencing' + DependsOn = "[xVMSwitch]$vSwitchNameHost", "[script]prepareVHDX", "[file]VM-Folder-$vmname" + } + + xVMHyperV "VM-$vmname" + { + Ensure = 'Present' + Name = $vmname + VhdPath = "$targetVMPath\$vmname\$vmname-OSDisk.vhdx" + Path = $targetVMPath + Generation = 2 + StartupMemory = $memory + ProcessorCount = 8 + DependsOn = "[xVhd]NewOSDisk-$vmname" + } + + xVMProcessor "Enable NestedVirtualization-$vmname" + { + VMName = $vmname + ExposeVirtualizationExtensions = $true + DependsOn = "[xVMHyperV]VM-$vmname" + } + + script "remove default Network Adapter on VM-$vmname" { + GetScript = { + $VMNetworkAdapter = Get-VMNetworkAdapter -VMName $using:vmname -Name 'Network Adapter' -ErrorAction SilentlyContinue + $result = if ($VMNetworkAdapter) { $false } else { $true } + return @{ + VMName = $VMNetworkAdapter.VMName + Name = $VMNetworkAdapter.Name + Result = $result + } + } + + SetScript = { + $state = [scriptblock]::Create($GetScript).Invoke() + Remove-VMNetworkAdapter -VMName $state.VMName -Name $state.Name + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[xVMHyperV]VM-$vmname" + } + + for ($k = 1; $k -le 1; $k++) { + $ipAddress = $('192.168.0.' + ($i + 1)) + $mgmtNicName = "$vmname-Management$k" + xVMNetworkAdapter "New Network Adapter $mgmtNicName $vmname DHCP" + { + Id = $mgmtNicName + Name = $mgmtNicName + SwitchName = $vSwitchNameHost + VMName = $vmname + NetworkSetting = xNetworkSettings { + IpAddress = $ipAddress + Subnet = "255.255.0.0" + DefaultGateway = "192.168.0.1" + DnsServer = "192.168.0.1" + } + Ensure = 'Present' + DependsOn = "[xVMHyperV]VM-$vmname" + } + + cVMNetworkAdapterSettings "Enable $vmname $mgmtNicName Mac address spoofing and Teaming" + { + Id = $mgmtNicName + Name = $mgmtNicName + SwitchName = $vSwitchNameHost + VMName = $vmname + AllowTeaming = 'on' + MacAddressSpoofing = 'on' + DependsOn = "[xVMNetworkAdapter]New Network Adapter $mgmtNicName $vmname DHCP" + } + } + + for ($l = 1; $l -le 3; $l++) { + $ipAddress = $('10.10.1' + $l + '.' + $i) + $nicName = "$vmname-ConvergedNic$l" + + xVMNetworkAdapter "New Network Adapter Converged $vmname $nicName $ipAddress" + { + Id = $nicName + Name = $nicName + SwitchName = $vSwitchNameHost + VMName = $vmname + NetworkSetting = xNetworkSettings { + IpAddress = $ipAddress + Subnet = "255.255.255.0" + } + Ensure = 'Present' + DependsOn = "[xVMHyperV]VM-$vmname" + } + + cVMNetworkAdapterSettings "Enable $vmname $nicName Mac address spoofing and Teaming" + { + Id = $nicName + Name = $nicName + SwitchName = $vSwitchNameHost + VMName = $vmname + AllowTeaming = 'on' + MacAddressSpoofing = 'on' + DependsOn = "[xVMNetworkAdapter]New Network Adapter Converged $vmname $nicName $ipAddress" + } + } + + for ($j = 1; $j -lt $azsHostDataDiskCount + 1 ; $j++) { + xvhd "$vmname-DataDisk$j" + { + Ensure = 'Present' + Name = "$vmname-DataDisk$j.vhdx" + Path = "$targetVMPath\$vmname" + Generation = 'vhdx' + Type = 'Dynamic' + MaximumSizeBytes = $dataDiskSize + DependsOn = "[xVMHyperV]VM-$vmname" + } + + xVMHardDiskDrive "$vmname-DataDisk$j" + { + VMName = $vmname + ControllerType = 'SCSI' + ControllerLocation = $j + Path = "$targetVMPath\$vmname\$vmname-DataDisk$j.vhdx" + Ensure = 'Present' + DependsOn = "[xVMHyperV]VM-$vmname" + } + } + + script "UnattendXML for $vmname" { + GetScript = { + $name = $using:vmname + $result = Test-Path -Path "$using:targetVMPath\$name\Unattend.xml" + return @{ 'Result' = $result } + } + + SetScript = { + try { + $name = $using:vmname + $mount = Mount-VHD -Path "$using:targetVMPath\$name\$name-OSDisk.vhdx" -Passthru -ErrorAction Stop -Verbose + Start-Sleep -Seconds 2 + $driveLetter = $mount | Get-Disk | Get-Partition | Get-Volume | Where-Object DriveLetter | Select-Object -ExpandProperty DriveLetter + + New-Item -Path $("$driveLetter" + ":" + "\Temp") -ItemType Directory -Force -ErrorAction Stop + Copy-Item -Path "$using:sourcePath\Install-AzsRolesandFeatures.ps1" -Destination $("$driveLetter" + ":" + "\Temp") -Force -ErrorAction Stop + + New-BasicUnattendXML -ComputerName $name -LocalAdministratorPassword $($using:Admincreds).Password -Domain $using:DomainName -Username $using:Admincreds.Username ` + -Password $($using:Admincreds).Password -JoinDomain $using:DomainName -AutoLogonCount 1 -OutputPath "$using:targetVMPath\$name" -Force ` + -PowerShellScriptFullPath 'c:\temp\Install-AzsRolesandFeatures.ps1' -ErrorAction Stop + + Copy-Item -Path "$using:targetVMPath\$name\Unattend.xml" -Destination $("$driveLetter" + ":" + "\Windows\system32\SysPrep") -Force -ErrorAction Stop + + Start-Sleep -Seconds 2 + } + finally { + Dismount-VHD -Path "$using:targetVMPath\$name\$name-OSDisk.vhdx" + } + Start-VM -Name $name + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[xVhd]NewOSDisk-$vmname", "[script]Download DSC Config for AzsHci Hosts" + } + } + + #### Update AD with Cluster Info #### + + script "UpdateAD" { + GetScript = { + $result = Test-Path -Path "$using:sourcePath\UpdateAD.txt" + return @{ 'Result' = $result } + } + + SetScript = { + Set-Location "$using:sourcePath\" + .\Update-AD.ps1 + New-item -Path "$using:sourcePath\" -Name "UpdateAD.txt" -ItemType File -Force + } + + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + DependsOn = "[script]UnattendXML for $vmname" + } + + #### Update WAC Extensions #### + + script "WACupdater" { + GetScript = { + # Specify the WAC gateway + $wac = "https://$env:COMPUTERNAME" + + # Add the module to the current session + $module = "$env:ProgramFiles\Windows Admin Center\PowerShell\Modules\ExtensionTools\ExtensionTools.psm1" + + Import-Module -Name $module -Verbose -Force + + # List the WAC extensions + $extensions = Get-Extension $wac | Where-Object { $_.isLatestVersion -like 'False' } + + $result = if ($extensions.count -gt 0) { $false } else { $true } + + return @{ + Wac = $WAC + extensions = $extensions + result = $result + } + } + TestScript = { + # Create and invoke a scriptblock using the $GetScript automatic variable, which contains a string representation of the GetScript. + $state = [scriptblock]::Create($GetScript).Invoke() + return $state.Result + } + SetScript = { + $state = [scriptblock]::Create($GetScript).Invoke() + $date = get-date -f yyyy-MM-dd + $logFile = Join-Path -Path "C:\Users\Public" -ChildPath $('WACUpdateLog-' + $date + '.log') + New-Item -Path $logFile -ItemType File -Force + ForEach ($extension in $state.extensions) { + Update-Extension $state.wac -ExtensionId $extension.Id -Verbose | Out-File -Append -FilePath $logFile -Force + } + } + } + + #### INSTALL CHOCO, DEPLOY EDGE and Shortcuts + + cChocoInstaller InstallChoco { + InstallDir = "c:\choco" + } + + cChocoFeature allowGlobalConfirmation { + FeatureName = "allowGlobalConfirmation" + Ensure = 'Present' + DependsOn = '[cChocoInstaller]installChoco' + } + + cChocoFeature useRememberedArgumentsForUpgrades { + FeatureName = "useRememberedArgumentsForUpgrades" + Ensure = 'Present' + DependsOn = '[cChocoInstaller]installChoco' + } + + cChocoPackageInstaller "Install Chromium Edge" { + Name = 'microsoft-edge' + Ensure = 'Present' + AutoUpgrade = $true + DependsOn = '[cChocoInstaller]installChoco' + } + + cShortcut "Wac Shortcut" + { + Path = 'C:\Users\Public\Desktop\Windows Admin Center.lnk' + Target = 'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe' + Arguments = "https://$env:computerName" + Icon = 'shell32.dll,34' + } + + #### STAGE 3c - Update Firewall + + Firewall WACInboundRule { + Name = 'WACInboundRule' + DisplayName = 'Allow Windows Admin Center' + Ensure = 'Present' + Enabled = 'True' + Profile = 'Any' + Direction = 'Inbound' + LocalPort = "443" + Protocol = 'TCP' + Description = 'Allow Windows Admin Center' + } + + Firewall WACOutboundRule { + Name = 'WACOutboundRule' + DisplayName = 'Allow Windows Admin Center' + Ensure = 'Present' + Enabled = 'True' + Profile = 'Any' + Direction = 'Outbound' + LocalPort = "443" + Protocol = 'TCP' + Description = 'Allow Windows Admin Center' + } + } +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/ComputerManagementDsc.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/ComputerManagementDsc.psd1 new file mode 100644 index 0000000..28da93f --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/ComputerManagementDsc.psd1 @@ -0,0 +1,91 @@ +@{ + # Version number of this module. + moduleVersion = '8.4.0' + + # ID used to uniquely identify this module + GUID = 'B5004952-489E-43EA-999C-F16A25355B89' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'DSC resources for configuration of a Windows computer. These DSC resources allow you to perform computer management tasks, such as renaming the computer, joining a domain and scheduling tasks as well as configuring items such as virtual memory, event logs, time zones and power settings.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' + + # Minimum version of the common language runtime (CLR) required by this module + CLRVersion = '4.0' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @() + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # DSC resources to export from this module + DscResourcesToExport = @( + 'Computer' + 'OfflineDomainJoin' + 'PendingReboot' + 'PowerPlan' + 'PowerShellExecutionPolicy' + 'RemoteDesktopAdmin' + 'ScheduledTask' + 'SmbServerConfiguration' + 'SmbShare' + 'SystemLocale' + 'TimeZone' + 'VirtualMemory' + 'WindowsEventLog' + 'WindowsCapability' + 'IEEnhancedSecurityConfiguration' + 'UserAccountControl' + ) + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/ComputerManagementDsc/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/ComputerManagementDsc' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [8.4.0] - 2020-08-03 + +### Changed + +- ComputerManagementDsc + - Automatically publish documentation to GitHub Wiki - Fixes [Issue #342](https://github.com/dsccommunity/ComputerManagementDsc/issues/342). + +' + } # End of PSData hashtable + } # End of PrivateData hashtable +} + + + diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/DSC_Computer.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/DSC_Computer.psm1 new file mode 100644 index 0000000..94b246f --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/DSC_Computer.psm1 @@ -0,0 +1,650 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope = 'Function')] +param +( +) + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +$FailToRenameAfterJoinDomainErrorId = 'FailToRenameAfterJoinDomain,Microsoft.PowerShell.Commands.AddComputerCommand' + +<# + .SYNOPSIS + Gets the current state of the computer. + + .PARAMETER Name + The desired computer name. + + .PARAMETER DomainName + The name of the domain to join. + + .PARAMETER JoinOU + The distinguished name of the organizational unit that the computer + account will be created in. + + .PARAMETER Credential + Credential to be used to join a domain. + + .PARAMETER UnjoinCredential + Credential to be used to leave a domain. + + .PARAMETER WorkGroupName + The name of the workgroup. + + .PARAMETER Description + The value assigned here will be set as the local computer description. + + .PARAMETER Server + The Active Directory Domain Controller to use to join the domain. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateLength(1, 15)] + [ValidateScript( { $_ -inotmatch '[\/\\:*?"<>|]' })] + [System.String] + $Name, + + [Parameter()] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $JoinOU, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.Management.Automation.PSCredential] + $UnjoinCredential, + + [Parameter()] + [System.String] + $WorkGroupName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String] + $Server + ) + + Write-Verbose -Message ($script:localizedData.GettingComputerStateMessage -f $Name) + + $convertToCimCredential = New-CimInstance ` + -ClassName DSC_Credential ` + -Property @{ + Username = [System.String] $Credential.UserName + Password = [System.String] $null + } ` + -Namespace root/microsoft/windows/desiredstateconfiguration ` + -ClientOnly + + $convertToCimUnjoinCredential = New-CimInstance ` + -ClassName DSC_Credential ` + -Property @{ + Username = [System.String] $UnjoinCredential.UserName + Password = [System.String] $null + } ` + -Namespace root/microsoft/windows/desiredstateconfiguration ` + -ClientOnly + + $returnValue = @{ + Name = $env:COMPUTERNAME + DomainName = Get-ComputerDomain + JoinOU = $JoinOU + CurrentOU = Get-ComputerOU + Credential = [ciminstance] $convertToCimCredential + UnjoinCredential = [ciminstance] $convertToCimUnjoinCredential + WorkGroupName = (Get-CimInstance -Class 'Win32_ComputerSystem').Workgroup + Description = (Get-CimInstance -Class 'Win32_OperatingSystem').Description + Server = Get-LogonServer + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the current state of the computer. + + .PARAMETER Name + The desired computer name. + + .PARAMETER DomainName + The name of the domain to join. + + .PARAMETER JoinOU + The distinguished name of the organizational unit that the computer + account will be created in. + + .PARAMETER Credential + Credential to be used to join a domain. + + .PARAMETER UnjoinCredential + Credential to be used to leave a domain. + + .PARAMETER WorkGroupName + The name of the workgroup. + + .PARAMETER Description + The value assigned here will be set as the local computer description. + + .PARAMETER Server + The Active Directory Domain Controller to use to join the domain. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateLength(1, 15)] + [ValidateScript( { $_ -inotmatch '[\/\\:*?"<>|]' })] + [System.String] + $Name, + + [Parameter()] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $JoinOU, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.Management.Automation.PSCredential] + $UnjoinCredential, + + [Parameter()] + [System.String] + $WorkGroupName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String] + $Server + ) + + Write-Verbose -Message ($script:localizedData.SettingComputerStateMessage -f $Name) + + Assert-DomainOrWorkGroup -DomainName $DomainName -WorkGroupName $WorkGroupName + + if ($Name -eq 'localhost') + { + $Name = $env:COMPUTERNAME + } + + if ($PSBoundParameters.ContainsKey('Description')) + { + Write-Verbose -Message ($script:localizedData.SettingComputerDescriptionMessage -f $Description) + $win32OperatingSystemCimInstance = Get-CimInstance -ClassName Win32_OperatingSystem + $win32OperatingSystemCimInstance.Description = $Description + Set-CimInstance -InputObject $win32OperatingSystemCimInstance + } + + if ($Credential) + { + if ($DomainName) + { + if ($DomainName -eq (Get-ComputerDomain)) + { + # Rename the computer, but stay joined to the domain. + Rename-Computer -NewName $Name -DomainCredential $Credential -Force + Write-Verbose -Message ($script:localizedData.RenamedComputerMessage -f $Name) + } + else + { + $addComputerParameters = @{ + DomainName = $DomainName + Credential = $Credential + Force = $true + } + $rename = $false + if ($Name -ne $env:COMPUTERNAME) + { + $addComputerParameters.Add("NewName", $Name) + $rename = $true + } + + if ($UnjoinCredential) + { + $addComputerParameters.Add("UnjoinDomainCredential", $UnjoinCredential) + } + + if ($JoinOU) + { + $addComputerParameters.Add("OUPath", $JoinOU) + } + + if ($Server) + { + $addComputerParameters.Add("Server", $Server) + } + + # Rename the computer, and join it to the domain. + try + { + Add-Computer @addComputerParameters + } + catch [System.InvalidOperationException] + { + <# + If the rename failed during the domain join, re-try the rename. + References to this issue: + https://social.technet.microsoft.com/Forums/windowsserver/en-US/81105b18-b1ff-4fcc-ae5c-2c1a7cf7bf3d/addcomputer-to-domain-with-new-name-returns-error + https://powershell.org/forums/topic/the-directory-service-is-busy/ + #> + if ($_.FullyQualifiedErrorId -eq $failToRenameAfterJoinDomainErrorId) + { + Write-Verbose -Message $script:localizedData.FailToRenameAfterJoinDomainMessage + Rename-Computer -NewName $Name -DomainCredential $Credential + } + else + { + New-InvalidOperationException -Message $_.Exception.Message -ErrorRecord $_ + } + } + catch + { + throw $_ + } + + if ($rename) + { + Write-Verbose -Message ($script:localizedData.RenamedComputerAndJoinedDomainMessage -f $Name, $DomainName) + } + else + { + Write-Verbose -Message ($script:localizedData.JoinedDomainMessage -f $DomainName) + } + } + } + elseif ($WorkGroupName) + { + if ($WorkGroupName -eq (Get-CimInstance -Class 'Win32_ComputerSystem').Workgroup) + { + # Rename the computer, but stay in the same workgroup. + Rename-Computer ` + -NewName $Name + + Write-Verbose -Message ($script:localizedData.RenamedComputerMessage -f $Name) + } + else + { + if ($Name -ne $env:COMPUTERNAME) + { + # Rename the computer, and join it to the workgroup. + Add-Computer ` + -NewName $Name ` + -Credential $Credential ` + -WorkgroupName $WorkGroupName ` + -Force + + Write-Verbose -Message ($script:localizedData.RenamedComputerAndJoinedWorkgroupMessage -f $Name, $WorkGroupName) + } + else + { + # Same computer name, and join it to the workgroup. + Add-Computer ` + -WorkGroupName $WorkGroupName ` + -Credential $Credential ` + -Force + + Write-Verbose -Message ($script:localizedData.JoinedWorkgroupMessage -f $WorkGroupName) + } + } + } + elseif ($Name -ne $env:COMPUTERNAME) + { + if (Get-ComputerDomain) + { + Rename-Computer ` + -NewName $Name ` + -DomainCredential $Credential ` + -Force + + Write-Verbose -Message ($script:localizedData.RenamedComputerMessage -f $Name) + } + else + { + Rename-Computer ` + -NewName $Name ` + -Force + + Write-Verbose -Message ($script:localizedData.RenamedComputerMessage -f $Name) + } + } + } + else + { + if ($DomainName) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.CredentialsNotSpecifiedError) ` + -ArgumentName 'Credentials' + } + + if ($WorkGroupName) + { + if ($WorkGroupName -eq (Get-CimInstance -Class 'Win32_ComputerSystem').Workgroup) + { + # Same workgroup, new computer name + Rename-Computer ` + -NewName $Name ` + -Force + + Write-Verbose -Message ($script:localizedData.RenamedComputerMessage -f $Name) + } + else + { + if ($name -ne $env:COMPUTERNAME) + { + # New workgroup, new computer name + Add-Computer ` + -WorkgroupName $WorkGroupName ` + -NewName $Name + + Write-Verbose -Message ($script:localizedData.RenamedComputerAndJoinedWorkgroupMessage -f $Name, $WorkGroupName) + } + else + { + # New workgroup, same computer name + Add-Computer ` + -WorkgroupName $WorkGroupName + + Write-Verbose -Message ($script:localizedData.JoinedWorkgroupMessage -f $WorkGroupName) + } + } + } + else + { + if ($Name -ne $env:COMPUTERNAME) + { + Rename-Computer ` + -NewName $Name + + Write-Verbose -Message ($script:localizedData.RenamedComputerMessage -f $Name) + } + } + } + + $global:DSCMachineStatus = 1 +} + +<# + .SYNOPSIS + Tests the current state of the computer. + + .PARAMETER Name + The desired computer name. + + .PARAMETER DomainName + The name of the domain to join. + + .PARAMETER JoinOU + The distinguished name of the organizational unit that the computer + account will be created in. + + .PARAMETER Credential + Credential to be used to join a domain. + + .PARAMETER UnjoinCredential + Credential to be used to leave a domain. + + .PARAMETER WorkGroupName + The name of the workgroup. + + .PARAMETER Description + The value assigned here will be set as the local computer description. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateLength(1, 15)] + [ValidateScript( { $_ -inotmatch '[\/\\:*?"<>|]' })] + [System.String] + $Name, + + [Parameter()] + [System.String] + $JoinOU, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.Management.Automation.PSCredential] + $UnjoinCredential, + + [Parameter()] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $WorkGroupName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String] + $Server + ) + + Write-Verbose -Message ($script:localizedData.TestingComputerStateMessage -f $Name) + + if (($Name -ne 'localhost') -and ($Name -ne $env:COMPUTERNAME)) + { + return $false + } + + if ($PSBoundParameters.ContainsKey('Description')) + { + Write-Verbose -Message ($script:localizedData.CheckingComputerDescriptionMessage -f $Description) + + if ($Description -ne (Get-CimInstance -Class 'Win32_OperatingSystem').Description) + { + return $false + } + } + + Assert-DomainOrWorkGroup -DomainName $DomainName -WorkGroupName $WorkGroupName + + if ($DomainName) + { + if (-not ($Credential)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.CredentialsNotSpecifiedError) ` + -ArgumentName 'Credentials' + } + + try + { + Write-Verbose -Message ($script:localizedData.CheckingDomainMemberMessage -f $DomainName) + + if ($DomainName.Contains('.')) + { + $getComputerDomainParameters = @{ + netbios = $false + } + } + else + { + $getComputerDomainParameters = @{ + netbios = $true + } + } + + return ($DomainName -eq (Get-ComputerDomain @getComputerDomainParameters)) + } + catch + { + Write-Verbose -Message ($script:localizedData.CheckingNotDomainMemberMessage) + + return $false + } + } + elseif ($WorkGroupName) + { + Write-Verbose -Message ($script:localizedData.CheckingWorkgroupMemberMessage -f $WorkGroupName) + + return ($WorkGroupName -eq (Get-CimInstance -Class 'Win32_ComputerSystem').Workgroup) + } + else + { + # No Domain or Workgroup specified and computer name is correct + return $true + } +} + +<# + .SYNOPSIS + Throws an exception if both the domain name and workgroup + name is set. + + .PARAMETER DomainName + The name of the domain to join. + + .PARAMETER WorkGroupName + The name of the workgroup. +#> +function Assert-DomainOrWorkGroup +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $DomainName, + + [Parameter()] + [System.String] + $WorkGroupName + ) + + if ($DomainName -and $WorkGroupName) + { + New-InvalidOperationException ` + -Message ($script:localizedData.DomainNameAndWorkgroupNameError) + } +} + +<# + .SYNOPSIS + Returns the domain the computer is joined to. + + .PARAMETER NetBios + Specifies if the NetBIOS name is returned instead of + the fully qualified domain name. +#> +function Get-ComputerDomain +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter()] + [Switch] + $NetBios + ) + + try + { + $domainInfo = Get-CimInstance -ClassName Win32_ComputerSystem + if ($domainInfo.PartOfDomain -eq $true) + { + if ($NetBios) + { + $domainName = (Get-Item -Path Env:\USERDOMAIN).Value + } + else + { + $domainName = $domainInfo.Domain + } + } + else + { + $domainName = '' + } + + return $domainName + } + catch [System.Management.Automation.MethodInvocationException] + { + Write-Verbose -Message ($script:localizedData.ComputerNotInDomainMessage) + } +} + +<# + .SYNOPSIS + Gets the organisation unit in the domain that the + computer account exists in. +#> +function Get-ComputerOU +{ + [CmdletBinding()] + param + ( + ) + + $ou = $null + + if (Get-ComputerDomain) + { + $dn = $null + $dn = ([adsisearcher]"(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))").FindOne().Properties.distinguishedname + $ou = $dn -replace '^(CN=.*?(?<=,))', '' + } + + return $ou +} + +<# + .SYNOPSIS + Returns the logon server. +#> +function Get-LogonServer +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + $logonserver = $env:LOGONSERVER -replace "\\", "" + return $logonserver +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/DSC_Computer.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/DSC_Computer.schema.mof new file mode 100644 index 0000000..96eae76 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/DSC_Computer.schema.mof @@ -0,0 +1,13 @@ +[ClassVersion("1.0.1.0"), FriendlyName("Computer")] +class DSC_Computer : OMI_BaseResource +{ + [Key, Description("The desired computer name.")] String Name; + [Write, Description("The name of the domain to join.")] String DomainName; + [Write, Description("The distinguished name of the organizational unit that the computer account will be created in.")] String JoinOU; + [Write, Description("Credential to be used to join a domain."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Credential to be used to leave a domain."), EmbeddedInstance("MSFT_Credential")] String UnjoinCredential; + [Write, Description("The name of the workgroup.")] String WorkGroupName; + [Write, Description("The value assigned here will be set as the local computer description.")] String Description; + [Write, Description("The Active Directory Domain Controller to use to join the domain")] String Server; + [Read, Description("A read-only property that specifies the organizational unit that the computer account is currently in.")] String CurrentOU; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/README.md new file mode 100644 index 0000000..d23b215 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/README.md @@ -0,0 +1,4 @@ +# Description + +The resource allows you to configure a computer by changing its name and +description and modifying its Active Directory domain or workgroup membership. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/en-US/DSC_Computer.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/en-US/DSC_Computer.strings.psd1 new file mode 100644 index 0000000..011bdec --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_Computer/en-US/DSC_Computer.strings.psd1 @@ -0,0 +1,19 @@ +ConvertFrom-StringData @' + GettingComputerStateMessage = Getting computer state for '{0}'. + SettingComputerStateMessage = Setting computer state for '{0}'. + SettingComputerDescriptionMessage = Setting computer description to '{0}'. + RenamedComputerMessage = Renamed computer to '{0}'. + RenamedComputerAndJoinedDomainMessage = Renamed computer to '{0}' and added to the domain '{1}'. + JoinedDomainMessage = Added computer to domain '{0}'. + FailToRenameAfterJoinDomainMessage = Failed to rename the computer during the domain join. Re-trying the rename. + RenamedComputerAndJoinedWorkgroupMessage = Renamed computer to '{0}' and addded to workgroup '{1}'. + JoinedWorkgroupMessage = Added computer to workgroup '{0}'. + CredentialsNotSpecifiedError = Must to specify credentials with domain. + TestingComputerStateMessage = Testing computer state for '{0}'. + CheckingComputerDescriptionMessage = Checking if computer description is '{0}'. + CheckingDomainMemberMessage = Checking if the machine is a member of domain '{0}'. + CheckingNotDomainMemberMessage = Checking if the machine is a not a member of a domain. + CheckingWorkgroupMemberMessage = Checking if the machine is a member of workgroup '{0}'. + DomainNameAndWorkgroupNameError = Only DomainName or WorkGroupName can be specified at once. + ComputerNotInDomainMessage = This machine is not a domain member. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/DSC_IEEnhancedSecurityConfiguration.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/DSC_IEEnhancedSecurityConfiguration.psm1 new file mode 100644 index 0000000..0a2506d --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/DSC_IEEnhancedSecurityConfiguration.psm1 @@ -0,0 +1,251 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +$script:registryKey_Administrators = 'HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}' +$script:registryKey_Users = 'HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}' +$script:registryKey_Property = 'IsInstalled' + +<# + .SYNOPSIS + Gets the current state of the IE Enhanced Security Configuration. + + .PARAMETER Role + Specifies the role for which the IE Enhanced Security Configuration + should be changed. + + .PARAMETER Enabled + Specifies if IE Enhanced Security Configuration should be enabled or + disabled. + + .PARAMETER SuppressRestart + Specifies if a restart of the node should be suppressed. By default the + node will be restarted if the value is changed. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Administrators', 'Users')] + [System.String] + $Role, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $Enabled, + + [Parameter()] + [System.Boolean] + $SuppressRestart + ) + + Write-Verbose -Message ($script:localizedData.GettingStateMessage -f $Role) + + $registryKey = Get-Variable -Name ('registryKey_{0}' -f $Role) -Scope 'Script' -ValueOnly + + try + { + $currentlyEnabled = [System.Boolean] (Get-ItemProperty -Path $registryKey -ErrorAction 'Stop').$script:registryKey_Property + } + catch + { + $currentlyEnabled = $false + + Write-Warning -Message ($script:localizedData.UnableToDetermineState -f $registryKey) + } + + $returnValue = @{ + Role = $Role + Enabled = $currentlyEnabled + SuppressRestart = $SuppressRestart + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the current state of the IE Enhanced Security Configuration. + + .PARAMETER Role + Specifies the role for which the IE Enhanced Security Configuration + should be changed. + + .PARAMETER Enabled + Specifies if IE Enhanced Security Configuration should be enabled or + disabled. + + .PARAMETER SuppressRestart + Specifies if a restart of the node should be suppressed. By default the + node will be restarted if the value is changed. + + .NOTES + The change could come in affect if the process Explorer is stopped, which + will make Windows automatically start a new process. But, stopping a + process feels wrong so the resource instead restarts the node when the + value is changed. +#> +function Set-TargetResource +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope = 'Function')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Administrators', 'Users')] + [System.String] + $Role, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $Enabled, + + [Parameter()] + [System.Boolean] + $SuppressRestart + ) + + $getTargetResourceResult = Get-TargetResource @PSBoundParameters + + if ($getTargetResourceResult.Enabled -ne $Enabled) + { + Write-Verbose -Message ($script:localizedData.SettingStateMessage -f $Role) + + $registryKey = Get-Variable -Name ('registryKey_{0}' -f $Role) -Scope 'Script' -ValueOnly + + try + { + $setItemPropertyParameters = @{ + Path = $registryKey + Name = $script:registryKey_Property + Value = $Enabled + ErrorAction = 'Stop' + } + + Set-ItemProperty @setItemPropertyParameters + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.FailedToSetDesiredState -f $Role) ` + -ErrorRecord $_ + } + + if ($SuppressRestart) + { + Write-Warning -Message $script:localizedData.SuppressRestart + } + else + { + $global:DSCMachineStatus = 1 + } + } + else + { + Write-Verbose -Message ($script:localizedData.InDesiredState -f $Role) + } +} + +<# + .SYNOPSIS + Tests the current state of the IE Enhanced Security Configuration. + + .PARAMETER Role + Specifies the role for which the IE Enhanced Security Configuration + should be changed. + + .PARAMETER Enabled + Specifies if IE Enhanced Security Configuration should be enabled or + disabled. + + .PARAMETER SuppressRestart + Specifies if a restart of the node should be suppressed. By default the + node will be restarted if the value is changed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Administrators', 'Users')] + [System.String] + $Role, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $Enabled, + + [Parameter()] + [System.Boolean] + $SuppressRestart + ) + + Write-Verbose -Message ($script:localizedData.TestingStateMessage -f $Role) + + $getTargetResourceResult = Get-TargetResource @PSBoundParameters + + if ($getTargetResourceResult.Enabled -ne $Enabled) + { + $testTargetResourceReturnValue = $false + + $currentStateString = Get-BooleanStringValue -Enabled $getTargetResourceResult.Enabled + $desiredStateString = Get-BooleanStringValue -Enabled $Enabled + + Write-Verbose -Message ($script:localizedData.NotInDesiredState -f $Role, $currentStateString, $desiredStateString) + } + else + { + $testTargetResourceReturnValue = $true + + Write-Verbose -Message ($script:localizedData.InDesiredState -f $Role) + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Returns the string representation of a boolean value. + + .PARAMETER Enabled + Specifies the boolean value to return the string representation for. +#> +function Get-BooleanStringValue +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.Boolean] + $Enabled + ) + + $booleanStringValue = switch ($Enabled) + { + $false + { + 'disabled' + } + + $true + { + 'enabled' + } + } + + return $booleanStringValue +} diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/DSC_IEEnhancedSecurityConfiguration.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/DSC_IEEnhancedSecurityConfiguration.schema.mof new file mode 100644 index 0000000..10aafd7 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/DSC_IEEnhancedSecurityConfiguration.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.1.0"), FriendlyName("IEEnhancedSecurityConfiguration")] +class DSC_IEEnhancedSecurityConfiguration : OMI_BaseResource +{ + [Key, Description("Specifies the role for which the IE Enhanced Security Configuration should be changed."), ValueMap{"Administrators","Users"}, Values{"Administrators","Users"}] String Role; + [Required, Description("Specifies if IE Enhanced Security Configuration should be enabled or disabled.")] Boolean Enabled; + [Write, Description("Specifies if a restart of the node should be suppressed. By default the node will be restarted if the value is changed.")] Boolean SuppressRestart; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/README.md new file mode 100644 index 0000000..fcbfdc1 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/README.md @@ -0,0 +1,4 @@ +# Description + +This resource allows you to configure the IE Enhanced Security Configuration +for administrator or user roles. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/en-US/DSC_IEEnhancedSecurityConfiguration.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/en-US/DSC_IEEnhancedSecurityConfiguration.strings.psd1 new file mode 100644 index 0000000..d470503 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_IEEnhancedSecurityConfiguration/en-US/DSC_IEEnhancedSecurityConfiguration.strings.psd1 @@ -0,0 +1,10 @@ +ConvertFrom-StringData @' + GettingStateMessage = Getting IE Enhanced Security Configuration state for '{0}'. (IEESC0001) + SettingStateMessage = Setting IE Enhanced Security Configuration state for '{0}'. (IEESC0002) + TestingStateMessage = Testing IE Enhanced Security Configuration state for '{0}'. (IEESC0003) + SuppressRestart = Suppressing the restart. For the change to come in affect the node must be restarted manually. (IEESC0004) + InDesiredState = The IE Enhanced Security Configuration for '{0}' is in desired state. (IEESC0005) + NotInDesiredState = The IE Enhanced Security Configuration for '{0}' was {1}, but expected it to be {2}. (IEESC0006) + UnableToDetermineState = The current state cannot be determined because the registry path '{0}' cannot be read. (IEESC0007) + FailedToSetDesiredState = Failed to set the desired state for '{0}'. (IEESC0008) +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/DSC_OfflineDomainJoin.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/DSC_OfflineDomainJoin.psm1 new file mode 100644 index 0000000..ecd48e2 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/DSC_OfflineDomainJoin.psm1 @@ -0,0 +1,243 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidGlobalVars", "", Scope = "Function")] +param +( +) + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Joins the computer to a domain with a domain join file. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + This value is Not used in Get-TargetResource. + + .PARAMETER RequestFile + The full path to the Offline Domain Join Request file to use. + This value is not used in Get-TargetResource. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RequestFile + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingOfflineDomainJoinMessage) + ) -join '') + + <# + It is not possible to read the ODJ file that was used to join a domain + So it has to always be returned as blank. + #> + $returnValue = @{ + IsSingleInstance = 'Yes' + RequestFile = '' + } + + return $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Sets the current state of the offline domain join. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER RequestFile + The full path to the Offline Domain Join Request file to use. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RequestFile + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingOfflineDomainJoinMessage) + ) -join '') + + # Check the ODJ Request file exists + if (-not (Test-Path -Path $RequestFile)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.RequestFileNotFoundError -f $RequestFile) ` + -ArgumentName 'RequestFile' + } # if + + <# + Don't need to check if the domain is already joined because + Set-TargetResource wouldn't fire unless it wasn't. + #> + Join-Domain -RequestFile $RequestFile +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the current state of the machine joining a domain using + an offline domain join file. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER RequestFile + The full path to the Offline Domain Join Request file to use. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RequestFile + ) + + # Flag to signal whether settings are correct + [System.Boolean] $desiredConfigurationMatch = $true + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingOfflineDomainJoinMessage) + ) -join '') + + # Check the ODJ Request file exists + if (-not (Test-Path -Path $RequestFile)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.RequestFileNotFoundError -f $RequestFile) ` + -ArgumentName 'RequestFile' + } # if + + $currentDomainName = Get-DomainName + + if ($currentDomainName) + { + # Domain is already joined. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DomainAlreadyJoinedMessage -f $CurrentDomainName) ` + ) -join '' ) + } + else + { + # Domain is not joined, so change is required. + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DomainNotJoinedMessage) + ) -join '') + + $desiredConfigurationMatch = $false + } # if + + return $desiredConfigurationMatch +} # Test-TargetResource + +<# + .SYNOPSIS + Uses DJoin.exe to join a Domain using a ODJ Request File. +#> +function Join-Domain +{ + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [System.String] + $RequestFile + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.AttemptingDomainJoinMessage -f $RequestFile) ` + ) -join '' ) + + $djoinResult = & djoin.exe @( + '/REQUESTODJ' + '/LOADFILE' + $RequestFile + '/WINDOWSPATH' + $ENV:SystemRoot + '/LOCALOS') + + if ($LASTEXITCODE -eq 0) + { + # Notify DSC that a reboot is required. + $global:DSCMachineStatus = 1 + } + else + { + Write-Verbose -Message $djoinResult + + New-InvalidOperationException ` + -Message ($script:localizedData.DjoinError -f $LASTEXITCODE) + } # if + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DomainJoinedMessage -f $RequestFile) ` + ) -join '' ) +} # function Join-Domain + +<# + .SYNOPSIS + Returns the name of the Domain the computer is joined to or + $null if not domain joined. +#> +function Get-DomainName +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + # Use CIM to detect the domain name so that this will work on Nano Server. + $computerSystem = Get-CimInstance -ClassName 'Win32_ComputerSystem' -Namespace root\cimv2 + + if ($computerSystem.Workgroup) + { + return $null + } + else + { + $computerSystem.Domain + } +} # function Get-DomainName + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/DSC_OfflineDomainJoin.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/DSC_OfflineDomainJoin.schema.mof new file mode 100644 index 0000000..787469c --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/DSC_OfflineDomainJoin.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("OfflineDomainJoin")] +class DSC_OfflineDomainJoin : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Required, Description("The full path to the Offline Domain Join Request file to use.")] String RequestFile; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/README.md new file mode 100644 index 0000000..578daea --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/README.md @@ -0,0 +1,5 @@ +# Description + +The resource allows you to join computers to an Active Directory domain using an +[Offline Domain Join](https://technet.microsoft.com/en-us/library/offline-domain-join-djoin-step-by-step(v=ws.10).aspx) +request file. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/en-US/DSC_OfflineDomainJoin.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/en-US/DSC_OfflineDomainJoin.strings.psd1 new file mode 100644 index 0000000..3cacc14 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_OfflineDomainJoin/en-US/DSC_OfflineDomainJoin.strings.psd1 @@ -0,0 +1,11 @@ +ConvertFrom-StringData @' + GettingOfflineDomainJoinMessage = Getting the Offline Domain Join State. + ApplyingOfflineDomainJoinMessage = Applying the Offline Domain Join State. + AttemptingDomainJoinMessage = Attempting domain join using ODJ Request file '{0}'. + DomainJoinedMessage = Domain joined using ODJ Request file '{0}'. Reboot will be required. + CheckingOfflineDomainJoinMessage = Checking the Offline Domain Join State. + DomainAlreadyJoinedMessage = The computer is already joined to a domain '{0}'. Change not required. + DomainNotJoinedMessage = The computer is not joined to a domain. Change required. + RequestFileNotFoundError = The ODJ Request file '{0}' does not exist. + DjoinError = Error {0} occured requesting the Offline Domain Join. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/DSC_PendingReboot.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/DSC_PendingReboot.psm1 new file mode 100644 index 0000000..c6d01f6 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/DSC_PendingReboot.psm1 @@ -0,0 +1,387 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidGlobalVars", "", Scope = "Function")] +param () + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + This data file contains a list of reboot triggers that will be checked + when determining if reboot is required. This is stored in a separate + data file so that it can also be used in testing. +#> +$script:localizedResourceData = Import-LocalizedData ` + -BaseDirectory $PSScriptRoot ` + -FileName 'DSC_PendingReboot.data.psd1' +$script:rebootTriggers = $script:localizedResourceData.RebootTriggers +<# + .SYNOPSIS + Returns the current state of the pending reboot. + + .PARAMETER Name + Specifies the name of this pending reboot check. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name + ) + + Write-Verbose -Message ($script:localizedData.GettingPendingRebootStateMessage -f $Name) + + return Get-PendingRebootState @PSBoundParameters +} + +<# + .SYNOPSIS + Sets the current state of the pending reboot. + + .PARAMETER Name + Specifies the name of this pending reboot check. + + .PARAMETER SkipComponentBasedServicing + Specifies whether to skip reboots triggered by the Component-Based Servicing component. + + .PARAMETER SkipWindowsUpdate + Specifies whether to skip reboots triggered by Windows Update. + + .PARAMETER SkipPendingFileRename + Specifies whether to skip pending file rename reboots. + + .PARAMETER SkipPendingComputerRename + Specifies whether to skip reboots triggered by a pending computer rename. + + .PARAMETER SkipCcmClientSDK + Specifies whether to skip reboots triggered by the ConfigMgr client. Defaults to True. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $SkipComponentBasedServicing, + + [Parameter()] + [System.Boolean] + $SkipWindowsUpdate, + + [Parameter()] + [System.Boolean] + $SkipPendingFileRename, + + [Parameter()] + [System.Boolean] + $SkipPendingComputerRename, + + [Parameter()] + [System.Boolean] + $SkipCcmClientSDK = $true + ) + + Write-Verbose -Message ($script:localizedData.SettingPendingRebootStateMessage -f $Name) + + $currentStatus = Get-PendingRebootState @PSBoundParameters + + if ($currentStatus.RebootRequired) + { + $global:DSCMachineStatus = 1 + } +} + +<# + .SYNOPSIS + Tests the current state of the pending reboot. + + .PARAMETER Name + Specifies the name of this pending reboot check. + + .PARAMETER SkipComponentBasedServicing + Specifies whether to skip reboots triggered by the Component-Based Servicing component. + + .PARAMETER SkipWindowsUpdate + Specifies whether to skip reboots triggered by Windows Update. + + .PARAMETER SkipPendingFileRename + Specifies whether to skip pending file rename reboots. + + .PARAMETER SkipPendingComputerRename + Specifies whether to skip reboots triggered by a pending computer rename. + + .PARAMETER SkipCcmClientSDK + Specifies whether to skip reboots triggered by the ConfigMgr client. Defaults to True. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $SkipComponentBasedServicing, + + [Parameter()] + [System.Boolean] + $SkipWindowsUpdate, + + [Parameter()] + [System.Boolean] + $SkipPendingFileRename, + + [Parameter()] + [System.Boolean] + $SkipPendingComputerRename, + + [Parameter()] + [System.Boolean] + $SkipCcmClientSDK = $true + ) + + Write-Verbose -Message ($script:localizedData.TestingPendingRebootStateMessage -f $Name) + + $currentStatus = Get-PendingRebootState @PSBoundParameters + + return (-not $currentStatus.RebootRequired) +} + +<# + .SYNOPSIS + Returns a hash table containing the current state of the pending reboot + triggers. + + .PARAMETER Name + Specifies the name of this pending reboot check. + + .PARAMETER SkipComponentBasedServicing + Specifies whether to skip reboots triggered by the Component-Based Servicing component. + + .PARAMETER SkipWindowsUpdate + Specifies whether to skip reboots triggered by Windows Update. + + .PARAMETER SkipPendingFileRename + Specifies whether to skip pending file rename reboots. + + .PARAMETER SkipPendingComputerRename + Specifies whether to skip reboots triggered by a pending computer rename. + + .PARAMETER SkipCcmClientSDK + Specifies whether to skip reboots triggered by the ConfigMgr client. Defaults to True. +#> +function Get-PendingRebootHashTable +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $SkipComponentBasedServicing, + + [Parameter()] + [System.Boolean] + $SkipWindowsUpdate, + + [Parameter()] + [System.Boolean] + $SkipPendingFileRename, + + [Parameter()] + [System.Boolean] + $SkipPendingComputerRename, + + [Parameter()] + [System.Boolean] + $SkipCcmClientSDK = $true + ) + + # The list of registry keys that will be used to determine if a reboot is required + $rebootRegistryKeys = @{ + ComponentBasedServicing = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\' + WindowsUpdate = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\' + PendingFileRename = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\' + ActiveComputerName = 'HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName' + PendingComputerName = 'HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName' + } + + $componentBasedServicingKeys = (Get-ChildItem -Path $rebootRegistryKeys.ComponentBasedServicing).Name + + if ($componentBasedServicingKeys) + { + $componentBasedServicing = $componentBasedServicingKeys.Split('\') -contains 'RebootPending' + } + else + { + $componentBasedServicing = $false + } + + $windowsUpdateKeys = (Get-ChildItem -Path $rebootRegistryKeys.WindowsUpdate).Name + + if ($windowsUpdateKeys) + { + $windowsUpdate = $windowsUpdateKeys.Split('\') -contains 'RebootRequired' + } + else + { + $windowsUpdate = $false + } + + $pendingFileRename = (Get-ItemProperty -Path $rebootRegistryKeys.PendingFileRename).PendingFileRenameOperations.Length -gt 0 + $activeComputerName = (Get-ItemProperty -Path $rebootRegistryKeys.ActiveComputerName).ComputerName + $pendingComputerName = (Get-ItemProperty -Path $rebootRegistryKeys.PendingComputerName).ComputerName + $pendingComputerRename = $activeComputerName -ne $pendingComputerName + + if ($SkipCcmClientSDK) + { + $ccmClientSDK = $false + } + else + { + $invokeCimMethodParameters = @{ + NameSpace = 'ROOT\ccm\ClientSDK' + ClassName = 'CCM_ClientUtilities' + Name = 'DetermineIfRebootPending' + ErrorAction = 'Stop' + } + + try + { + $ccmClientSDK = Invoke-CimMethod @invokeCimMethodParameters + } + catch + { + Write-Warning -Message ($script:localizedData.QueryCcmClientUtilitiesFailedMessage -f $_) + } + + $ccmClientSDK = ($ccmClientSDK.ReturnValue -eq 0) -and ($ccmClientSDK.IsHardRebootPending -or $ccmClientSDK.RebootPending) + } + + return @{ + Name = $Name + SkipComponentBasedServicing = $SkipComponentBasedServicing + ComponentBasedServicing = $componentBasedServicing + SkipWindowsUpdate = $SkipWindowsUpdate + WindowsUpdate = $windowsUpdate + SkipPendingFileRename = $SkipPendingFileRename + PendingFileRename = $pendingFileRename + SkipPendingComputerRename = $SkipPendingComputerRename + PendingComputerRename = $pendingComputerRename + SkipCcmClientSDK = $SkipCcmClientSDK + CcmClientSDK = $ccmClientSDK + } +} + +<# + .SYNOPSIS + Returns the current state of the pending reboot by assessing the result provided + in a pending reboot hash table. + + .PARAMETER Name + Specifies the name of this pending reboot check. + + .PARAMETER SkipComponentBasedServicing + Specifies whether to skip reboots triggered by the Component-Based Servicing component. + + .PARAMETER SkipWindowsUpdate + Specifies whether to skip reboots triggered by Windows Update. + + .PARAMETER SkipPendingFileRename + Specifies whether to skip pending file rename reboots. + + .PARAMETER SkipPendingComputerRename + Specifies whether to skip reboots triggered by a pending computer rename. + + .PARAMETER SkipCcmClientSDK + Specifies whether to skip reboots triggered by the ConfigMgr client. Defaults to True. +#> +function Get-PendingRebootState +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $SkipComponentBasedServicing, + + [Parameter()] + [System.Boolean] + $SkipWindowsUpdate, + + [Parameter()] + [System.Boolean] + $SkipPendingFileRename, + + [Parameter()] + [System.Boolean] + $SkipPendingComputerRename, + + [Parameter()] + [System.Boolean] + $SkipCcmClientSDK = $true + ) + + $pendingRebootState = Get-PendingRebootHashTable @PSBoundParameters + $rebootRequired = $false + + foreach ($rebootTrigger in $script:rebootTriggers) + { + $skipTriggerName = 'Skip{0}' -f $rebootTrigger.Name + $skipTrigger = $pendingRebootState.$skipTriggerName + + if ($skipTrigger) + { + Write-Verbose -Message ($script:localizedData.RebootRequiredButSkippedMessage -f $rebootTrigger.Description) + } + else + { + if ($pendingRebootState.$($rebootTrigger.Name)) + { + Write-Verbose -Message ($script:localizedData.RebootRequiredMessage -f $rebootTrigger.Description) + $rebootRequired = $true + } + else + { + Write-Verbose -Message ($script:localizedData.RebootNotRequiredMessage -f $rebootTrigger.Description) + } + } + } + + $pendingRebootState += @{ + RebootRequired = $rebootRequired + } + + return $pendingRebootState +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/DSC_PendingReboot.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/DSC_PendingReboot.schema.mof new file mode 100644 index 0000000..f11e51f --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/DSC_PendingReboot.schema.mof @@ -0,0 +1,16 @@ +[ClassVersion("1.0.0.0"), FriendlyName("PendingReboot")] +class DSC_PendingReboot : OMI_BaseResource +{ + [Key, Description("Specifies the name of this pending reboot check.")] String Name; + [Write, Description("Specifies whether to skip reboots triggered by the Component-Based Servicing component.")] Boolean SkipComponentBasedServicing; + [Read, Description("A value indicating whether the Component-Based Servicing component requested a reboot.")] Boolean ComponentBasedServicing; + [Write, Description("Specifies whether to skip reboots triggered by Windows Update.")] Boolean SkipWindowsUpdate; + [Read, Description("A value indicating whether Windows Update requested a reboot.")] Boolean WindowsUpdate; + [Write, Description("Specifies whether to skip pending file rename reboots.")] Boolean SkipPendingFileRename; + [Read, Description("A value indicating whether a pending file rename triggered a reboot.")] Boolean PendingFileRename; + [Write, Description("Specifies whether to skip reboots triggered by a pending computer rename.")] Boolean SkipPendingComputerRename; + [Read, Description("A value indicating whether a pending computer rename triggered a reboot.")] Boolean PendingComputerRename; + [Write, Description("Specifies whether to skip reboots triggered by the ConfigMgr client. Defaults to True.")] Boolean SkipCcmClientSDK; + [Read, Description("A value indicating whether the ConfigMgr client triggered a reboot.")] Boolean CcmClientSDK; + [Read, Description("A value indicating whether the node requires a reboot.")] Boolean RebootRequired; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/README.md new file mode 100644 index 0000000..d5b4e67 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/README.md @@ -0,0 +1,16 @@ +# Description + +PendingReboot examines three specific registry locations where a Windows Server +might indicate that a reboot is pending and allows DSC to predictably handle +the condition. + +DSC determines how to handle pending reboot conditions using the Local Configuration +Manager (LCM) setting `RebootNodeIfNeeded`. When DSC resources require reboot, within +a Set statement in a DSC Resource the global variable `DSCMachineStatus` is set to +value '1'. When this condition occurs and RebootNodeIfNeeded is set to 'True', +DSC reboots the machine after a successful Set. Otherwise, the reboot is postponed. + +Note: The expectation is that this resource will be used in conjunction with +knowledge of DSC Local Configuration Manager, which has the ability to manage +whether reboots happen automatically using the RebootIfNeeded parameter. For +more information on configuring the LCM, please reference [this TechNet article](https://technet.microsoft.com/en-us/library/dn249922.aspx). diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/en-US/DSC_PendingReboot.data.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/en-US/DSC_PendingReboot.data.psd1 new file mode 100644 index 0000000..1736652 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/en-US/DSC_PendingReboot.data.psd1 @@ -0,0 +1,24 @@ +@{ + RebootTriggers = @( + @{ + Name = 'ComponentBasedServicing' + Description = 'Component based servicing' + }, + @{ + Name = 'WindowsUpdate' + Description = 'Windows Update' + }, + @{ + Name = 'PendingFileRename' + Description = 'Pending file rename' + }, + @{ + Name = 'PendingComputerRename' + Description = 'Pending computer rename' + }, + @{ + Name = 'CcmClientSDK' + Description = 'ConfigMgr' + } + ) +} diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/en-US/DSC_PendingReboot.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/en-US/DSC_PendingReboot.strings.psd1 new file mode 100644 index 0000000..9cc9d62 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PendingReboot/en-US/DSC_PendingReboot.strings.psd1 @@ -0,0 +1,9 @@ +ConvertFrom-StringData @' + GettingPendingRebootStateMessage = Getting the Pending Reboot State for '{0}'. (PR0001) + TestingPendingRebootStateMessage = Testing the Pending Reboot State for '{0}'. (PR0002) + RebootRequiredMessage = {0} reboot required. (PR0003) + RebootNotRequiredMessage = {0} reboot is not required. (PR0004) + RebootRequiredButSkippedMessage = {0} reboot required, but is skipped. (PR0005) + SettingPendingRebootStateMessage = Setting the Pending Reboot State for '{0}' to reboot required. (PR0006) + QueryCcmClientUtilitiesFailedMessage = Unable to query CIM Class CCM_ClientUtilities because '{0}'. (PR0007) +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/DSC_PowerPlan.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/DSC_PowerPlan.psm1 new file mode 100644 index 0000000..1f8a711 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/DSC_PowerPlan.psm1 @@ -0,0 +1,158 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the power plan. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER Name + Specifies the name or GUID of the power plan to assign to the node. + + .EXAMPLE + Get-TargetResource -IsSingleInstance 'Yes' -Name 'High performance' +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + # This is best practice when writing a single-instance DSC resource. + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name + ) + + $desiredPowerPlan = Get-PowerPlan -PowerPlan $Name + + if ($desiredPowerPlan) + { + $activePowerPlan = Get-ActivePowerPlan + + if ($activePowerPlan -eq $desiredPowerPlan.Guid) + { + Write-Verbose -Message ($script:localizedData.PowerPlanIsActive -f $desiredPowerPlan.FriendlyName) + $isActive = $true + } + else + { + Write-Verbose -Message ($script:localizedData.PowerPlanIsNotActive -f $desiredPowerPlan.FriendlyName) + $isActive = $false + } + + return @{ + IsSingleInstance = $IsSingleInstance + Name = $Name + IsActive = $isActive + } + + } + else + { + New-InvalidOperationException ` + -Message ($script:localizedData.PowerPlanNotFound -f $Name) + } +} + +<# + .SYNOPSIS + Assign the power plan to the node. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER Name + Specifies the name or GUID of the power plan to assign to the node. + + .EXAMPLE + Set-TargetResource -IsSingleInstance 'Yes' -Name 'High performance' +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + # This is best practice when writing a single-instance DSC resource. + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name + ) + + Write-Verbose -Message ($script:localizedData.PowerPlanIsBeingActivated -f $Name) + + $desiredPowerPlan = Get-PowerPlan -PowerPlan $Name + + if ($desiredPowerPlan) + { + Set-ActivePowerPlan -PowerPlanGuid $desiredPowerPlan.Guid + } + else + { + New-InvalidOperationException ` + -Message ($script:localizedData.PowerPlanNotFound -f $Name) + } +} + +<# + .SYNOPSIS + Tests if the power plan is assigned to the node. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER Name + Specifies the name or GUID of the power plan to assign to the node. + + .EXAMPLE + Test-TargetResource -IsSingleInstance 'Yes' -Name 'High performance' +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + # This is best practice when writing a single-instance DSC resource. + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name + ) + + Write-Verbose -Message ($script:localizedData.PowerPlanIsBeingValidated -f $Name) + + $getTargetResourceResult = Get-TargetResource -IsSingleInstance $IsSingleInstance -Name $Name + + return $getTargetResourceResult.IsActive +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/DSC_PowerPlan.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/DSC_PowerPlan.schema.mof new file mode 100644 index 0000000..f8f0a62 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/DSC_PowerPlan.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.0.0"), FriendlyName("PowerPlan")] +class DSC_PowerPlan : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Required, Description("The name or GUID of the power plan to activate.")] String Name; + [Read, Description("Determines if the power plan is active.")] Boolean IsActive; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/README.md new file mode 100644 index 0000000..f7497b5 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/README.md @@ -0,0 +1,3 @@ +# Description + +The resource allows specifying a power plan to activate. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/en-US/DSC_PowerPlan.schema.mfl b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/en-US/DSC_PowerPlan.schema.mfl new file mode 100644 index 0000000..6cd3ff2 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/en-US/DSC_PowerPlan.schema.mfl @@ -0,0 +1,6 @@ +[Description("This resource is used to activate a power plan.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_PowerPlan : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'.") : Amended] String IsSingleInstance; + [Description("The name or GUID of the power plan to activate.") : Amended] String Name; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/en-US/DSC_PowerPlan.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/en-US/DSC_PowerPlan.strings.psd1 new file mode 100644 index 0000000..137cba7 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerPlan/en-US/DSC_PowerPlan.strings.psd1 @@ -0,0 +1,9 @@ +# Localized resources for WindowsOptionalFeature + +ConvertFrom-StringData @' + PowerPlanIsActive = The power plan '{0}' is the active plan. + PowerPlanIsNotActive = The power plan '{0}' is not the active plan. + PowerPlanNotFound = Unable to find the power plan '{0}'. + PowerPlanIsBeingActivated = Activating power plan '{0}'. + PowerPlanIsBeingValidated = Validating power plan '{0}'. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/DSC_PowerShellExecutionPolicy.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/DSC_PowerShellExecutionPolicy.psm1 new file mode 100644 index 0000000..b858d2f --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/DSC_PowerShellExecutionPolicy.psm1 @@ -0,0 +1,138 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current resource state. + + .PARAMETER ExecutionPolicy + Specifies the given Powershell Execution Policy + + .PARAMETER ExecutionPolicyScope + Specifies the given Powershell Execution Policy Scope +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('CurrentUser','LocalMachine','MachinePolicy','Process','UserPolicy')] + [System.String] + $ExecutionPolicyScope, + + [Parameter(Mandatory = $true)] + [ValidateSet('Bypass','Restricted','AllSigned','RemoteSigned','Unrestricted')] + [System.String] + $ExecutionPolicy + ) + + Write-Verbose -Message ($script:localizedData.GettingPowerShellExecutionPolicy -f $ExecutionPolicyScope, $ExecutionPolicy) + + # Gets the execution policies for the current session. + $returnValue = @{ + ExecutionPolicyScope = $ExecutionPolicyScope + ExecutionPolicy = $(Get-ExecutionPolicy -Scope $ExecutionPolicyScope) + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the desired resource state. + + .PARAMETER ExecutionPolicy + Specifies the given Powershell Execution Policy + + .PARAMETER ExecutionPolicyScope + Specifies the given Powershell Execution Policy Scope +#> + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('CurrentUser','LocalMachine','MachinePolicy','Process','UserPolicy')] + [System.String] + $ExecutionPolicyScope, + + [Parameter(Mandatory = $true)] + [ValidateSet('Bypass','Restricted','AllSigned','RemoteSigned','Unrestricted')] + [System.String] + $ExecutionPolicy + ) + + Write-Verbose -Message ($script:localizedData.SettingPowerShellExecutionPolicy -f $ExecutionPolicyScope, $ExecutionPolicy) + + try + { + Set-ExecutionPolicy -ExecutionPolicy $ExecutionPolicy -Scope $ExecutionPolicyScope -Force -ErrorAction Stop + Write-Verbose -Message ($script:localizedData.UpdatePowershellExecutionPolicySuccess -f $ExecutionPolicyScope, $ExecutionPolicy) + } + catch + { + if ($_.FullyQualifiedErrorId -eq 'ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand') + { + Write-Verbose -Message ($script:localizedData.UpdatePowershellExecutionPolicyFailed -f $ExecutionPolicyScope, $ExecutionPolicy) + } + else + { + throw + } + } +} + +<# + .SYNOPSIS + Tests if the current resource state matches the desired resource state. + + .PARAMETER ExecutionPolicy + Specifies the given Powershell Execution Policy + + .PARAMETER ExecutionPolicyScope + Specifies the given Powershell Execution Policy Scope +#> + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('CurrentUser','LocalMachine','MachinePolicy','Process','UserPolicy')] + [System.String] + $ExecutionPolicyScope, + + [Parameter(Mandatory = $true)] + [ValidateSet('Bypass','Restricted','AllSigned','RemoteSigned','Unrestricted')] + [System.String] + $ExecutionPolicy + ) + + Write-Verbose -Message ($script:localizedData.TestingPowerShellExecutionPolicy -f $ExecutionPolicyScope, $ExecutionPolicy) + + if ((Get-ExecutionPolicy -Scope $ExecutionPolicyScope) -eq $ExecutionPolicy) + { + return $true + } + else + { + return $false + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/DSC_PowerShellExecutionPolicy.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/DSC_PowerShellExecutionPolicy.schema.mof new file mode 100644 index 0000000..f0a9cef --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/DSC_PowerShellExecutionPolicy.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("PowerShellExecutionPolicy")] +class DSC_PowerShellExecutionPolicy : OMI_BaseResource +{ + [Key, Description("Defines the scope for the preference of the Windows PowerShell execution policy."), ValueMap{"CurrentUser","LocalMachine","MachinePolicy","Process","UserPolicy"},Values{"CurrentUser","LocalMachine","MachinePolicy","Process","UserPolicy"}] String ExecutionPolicyScope; + [Required, Description("Changes the preference for the Windows PowerShell execution policy."), ValueMap{"Bypass","Restricted","AllSigned","RemoteSigned","Unrestricted"}, Values{"Bypass","Restricted","AllSigned","RemoteSigned","Unrestricted"}] String ExecutionPolicy; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/README.md new file mode 100644 index 0000000..b2341ad --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/README.md @@ -0,0 +1,4 @@ +# Description + +This resource allows configuration of the PowerShell execution +policy for different execution scopes. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/en-US/DSC_PowerShellExecutionPolicy.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/en-US/DSC_PowerShellExecutionPolicy.strings.psd1 new file mode 100644 index 0000000..218bbb7 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_PowerShellExecutionPolicy/en-US/DSC_PowerShellExecutionPolicy.strings.psd1 @@ -0,0 +1,8 @@ +# culture="en-US" +ConvertFrom-StringData -StringData @' + GettingPowerShellExecutionPolicy = The current execution policy for '{0}' is '{1}'. + SettingPowerShellExecutionPolicy = Setting the execution policy for '{0}' to '{1}'. + UpdatePowershellExecutionPolicySuccess = Updating PowerShell Execution policy for '{0}' to '{1}' successfully. + UpdatePowershellExecutionPolicyFailed = Updating PowerShell Execution policy for '{0}' to '{1}' failed. + TestingPowerShellExecutionPolicy = Testing the current execution policy for '{0}' is '{1}'. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/DSC_RemoteDesktopAdmin.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/DSC_RemoteDesktopAdmin.psm1 new file mode 100644 index 0000000..98534e8 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/DSC_RemoteDesktopAdmin.psm1 @@ -0,0 +1,184 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +$script:tSRegistryKey = 'HKLM:\System\CurrentControlSet\Control\Terminal Server' +$script:winStationsRegistryKey = 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' + +<# + .SYNOPSIS + Returns the current Remote Desktop Admin Settings. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance + ) + + Write-Verbose -Message $script:localizedData.GettingRemoteDesktopAdminSettingsMessage + $fDenyTSConnectionsRegistry = (Get-ItemProperty -Path $script:tSRegistryKey -Name 'fDenyTSConnections').fDenyTSConnections + $UserAuthenticationRegistry = (Get-ItemProperty -Path $script:winStationsRegistryKey -Name 'UserAuthentication').UserAuthentication + + if ($fDenyTSConnectionsRegistry -eq 0) + { + $ensure = 'Present' + } + else + { + $ensure = 'Absent' + } + + if ($UserAuthenticationRegistry -eq 1) + { + $userAuthentication = 'Secure' + } + else + { + $userAuthentication = 'NonSecure' + } + + $targetResource = @{ + IsSingleInstance = $IsSingleInstance + Ensure = $ensure + UserAuthentication = $userAuthentication + } + + return $targetResource +} + +<# + .SYNOPSIS + Tests the state of the Remote Desktop Admin Settings. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER Ensure + Specifies whether Remote Desktop connections should be allowed (Present) or denied (Absent). + + .PARAMETER UserAuthentication + Specifies whether Remote Desktop connnections will require Network Level Authentication (Secure) + or not (NonSecure). +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [String] + $IsSingleInstance, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('NonSecure', 'Secure')] + [System.String] + $UserAuthentication + ) + + $targetResource = Get-TargetResource -IsSingleInstance 'Yes' + $inDesiredState = $true + + if ($targetResource.Ensure -ne $Ensure) + { + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage ` + -f $Ensure, $targetResource.Ensure) + + $inDesiredState = $false + } + + if ($PSBoundParameters.ContainsKey('UserAuthentication') -and $targetResource.UserAuthentication -ne $UserAuthentication) + { + Write-Verbose -Message ($script:localizedData.ParameterNeedsUpdateMessage ` + -f 'UserAuthentication', $UserAuthentication, $targetResource.UserAuthentication) + + $inDesiredState = $false + } + + return $inDesiredState +} + +<# + .SYNOPSIS + Sets the Remote Desktop Admin Settings. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER Ensure + Specifies whether Remote Desktop connections should be allowed (Present) or denied (Absent). + + .PARAMETER UserAuthentication + Specifies whether Remote Desktop connnections will require Network Level Authentication (Secure) + or not (NonSecure). +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [String] + $IsSingleInstance, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('NonSecure', 'Secure')] + [System.String] + $UserAuthentication + ) + + $fDenyTSConnectionsRegistry = @{ + Present = 0 + Absent = 1 + }[$Ensure] + + $UserAuthenticationRegistry = @{ + NonSecure = 0 + Secure = 1 + }[$UserAuthentication] + + $targetResource = Get-TargetResource -IsSingleInstance 'Yes' + + if ($Ensure -ne $targetResource.Ensure) + { + Write-Verbose -Message ($script:localizedData.SettingRemoteDesktopAdminMessage -f $Ensure) + Set-ItemProperty -Path $script:tSRegistryKey -Name "fDenyTSConnections" -Value $fDenyTSConnectionsRegistry + } + + if ($UserAuthentication -ne $targetResource.UserAuthentication) + { + Write-Verbose -Message ($script:localizedData.SettingUserAuthenticationMessage -f $UserAuthentication) + Set-ItemProperty -Path $script:winStationsRegistryKey -Name "UserAuthentication" -Value $UserAuthenticationRegistry + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/DSC_RemoteDesktopAdmin.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/DSC_RemoteDesktopAdmin.schema.mof new file mode 100644 index 0000000..6b2bac1 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/DSC_RemoteDesktopAdmin.schema.mof @@ -0,0 +1,8 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("RemoteDesktopAdmin")] +class DSC_RemoteDesktopAdmin : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'"), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Determines whether or not the computer should accept remote desktop connections. Present sets the value to Enabled and Absent sets the value to Disabled."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Setting this value to Secure configures the machine to require Network Level Authentication (NLA) for remote desktop connections."), ValueMap{"Secure","NonSecure"}, Values{"Secure","NonSecure"}] String UserAuthentication; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/README.md new file mode 100644 index 0000000..7de74ef --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/README.md @@ -0,0 +1,5 @@ +# Description + +This resource will manage the remote desktop administration settings on a computer. +This includes whether remote desktop connections are allowed or denied and whether +network level authentication is required. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/en-US/DSC_RemoteDesktopAdmin.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/en-US/DSC_RemoteDesktopAdmin.strings.psd1 new file mode 100644 index 0000000..7b4fd29 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_RemoteDesktopAdmin/en-US/DSC_RemoteDesktopAdmin.strings.psd1 @@ -0,0 +1,8 @@ +# culture="en-US" +ConvertFrom-StringData @' + ParameterNeedsUpdateMessage = Remote Desktop Admin setting '{0}' is '{1}' but should be '{2}'. Change required. + NotInDesiredStateMessage = Remote Desktop Admin is set to '{0}' but should be'{1}'. Change required. + GettingRemoteDesktopAdminSettingsMessage = Getting Remote Desktop Admin settings. + SettingRemoteDesktopAdminMessage = Setting Remote Desktop Admin to '{0}'. + SettingUserAuthenticationMessage = Setting Remote Desktop Admin user authentication to '{0}'. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/DSC_ScheduledTask.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/DSC_ScheduledTask.psm1 new file mode 100644 index 0000000..79b366e --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/DSC_ScheduledTask.psm1 @@ -0,0 +1,1996 @@ +Add-Type -TypeDefinition @' +namespace ScheduledTask +{ + public enum DaysOfWeek + { + Sunday = 1, + Monday = 2, + Tuesday = 4, + Wednesday = 8, + Thursday = 16, + Friday = 32, + Saturday = 64 + } +} +'@ + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current state of the resource. + + .PARAMETER TaskName + The name of the task. + + .PARAMETER TaskPath + The path to the task - defaults to the root directory. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TaskName, + + [Parameter()] + [System.String] + $TaskPath = '\' + ) + + $TaskPath = ConvertTo-NormalizedTaskPath -TaskPath $TaskPath + + Write-Verbose -Message ($script:localizedData.GetScheduledTaskMessage -f $TaskName, $TaskPath) + + return Get-CurrentResource @PSBoundParameters +} + +<# + .SYNOPSIS + Tests if the current resource state matches the desired resource state. + + .PARAMETER TaskName + The name of the task. + + .PARAMETER TaskPath + The path to the task - defaults to the root directory. + + .PARAMETER Description + The task description. + + .PARAMETER ActionExecutable + The path to the .exe for this task. + + .PARAMETER ActionArguments + The arguments to pass the executable. + + .PARAMETER ActionWorkingPath + The working path to specify for the executable. + + .PARAMETER ScheduleType + When should the task be executed. + + .PARAMETER RepeatInterval + How many units (minutes, hours, days) between each run of this task? + + .PARAMETER StartTime + The time of day this task should start at - defaults to 12:00 AM. Not valid for + AtLogon and AtStartup tasks. + + .PARAMETER SynchronizeAcrossTimeZone + Enable the scheduled task option to synchronize across time zones. This is enabled + by including the timezone offset in the scheduled task trigger. Defaults to false + which does not include the timezone offset. + + .PARAMETER Ensure + Present if the task should exist, Absent if it should be removed. + + .PARAMETER Enable + True if the task should be enabled, false if it should be disabled. + + .PARAMETER BuiltInAccount + Run the task as one of the built in service accounts. + When set ExecuteAsCredential will be ignored and LogonType will be set to 'ServiceAccount' + + .PARAMETER ExecuteAsCredential + The credential this task should execute as. If not specified defaults to running + as the local system account. Cannot be used in combination with ExecuteAsGMSA. + + .PARAMETER ExecuteAsGMSA + The gMSA (Group Managed Service Account) this task should execute as. Cannot be + used in combination with ExecuteAsCredential. + + .PARAMETER DaysInterval + Specifies the interval between the days in the schedule. An interval of 1 produces + a daily schedule. An interval of 2 produces an every-other day schedule. + + .PARAMETER RandomDelay + Specifies a random amount of time to delay the start time of the trigger. The + delay time is a random time between the time the task triggers and the time that + you specify in this setting. + + .PARAMETER RepetitionDuration + Specifies how long the repetition pattern repeats after the task starts. + + .PARAMETER DaysOfWeek + Specifies an array of the days of the week on which Task Scheduler runs the task. + + .PARAMETER WeeksInterval + Specifies the interval between the weeks in the schedule. An interval of 1 produces + a weekly schedule. An interval of 2 produces an every-other week schedule. + + .PARAMETER User + Specifies the identifier of the user for a trigger that starts a task when a + user logs on. + + .PARAMETER DisallowDemandStart + Indicates whether the task is prohibited to run on demand or not. Defaults + to $false. + + .PARAMETER DisallowHardTerminate + Indicates whether the task is prohibited to be terminated or not. Defaults + to $false. + + .PARAMETER Compatibility + The task compatibility level. Defaults to Vista. + + .PARAMETER AllowStartIfOnBatteries + Indicates whether the task should start if the machine is on batteries or not. + Defaults to $false. + + .PARAMETER Hidden + Indicates that the task is hidden in the Task Scheduler UI. + + .PARAMETER RunOnlyIfIdle + Indicates that Task Scheduler runs the task only when the computer is idle. + + .PARAMETER IdleWaitTimeout + Specifies the amount of time that Task Scheduler waits for an idle condition to occur. + + .PARAMETER NetworkName + Specifies the name of a network profile that Task Scheduler uses to determine + if the task can run. + The Task Scheduler UI uses this setting for display purposes. Specify a network + name if you specify the RunOnlyIfNetworkAvailable parameter. + + .PARAMETER DisallowStartOnRemoteAppSession + Indicates that the task does not start if the task is triggered to run in a Remote + Applications Integrated Locally (RAIL) session. + + .PARAMETER StartWhenAvailable + Indicates that Task Scheduler can start the task at any time after its scheduled + time has passed. + + .PARAMETER DontStopIfGoingOnBatteries + Indicates that the task does not stop if the computer switches to battery power. + + .PARAMETER WakeToRun + Indicates that Task Scheduler wakes the computer before it runs the task. + + .PARAMETER IdleDuration + Specifies the amount of time that the computer must be in an idle state before + Task Scheduler runs the task. + + .PARAMETER RestartOnIdle + Indicates that Task Scheduler restarts the task when the computer cycles into an + idle condition more than once. + + .PARAMETER DontStopOnIdleEnd + Indicates that Task Scheduler does not terminate the task if the idle condition + ends before the task is completed. + + .PARAMETER ExecutionTimeLimit + Specifies the amount of time that Task Scheduler is allowed to complete the task. + + .PARAMETER MultipleInstances + Specifies the policy that defines how Task Scheduler handles multiple instances + of the task. + + .PARAMETER Priority + Specifies the priority level of the task. Priority must be an integer from 0 (highest priority) + to 10 (lowest priority). The default value is 7. Priority levels 7 and 8 are + used for background tasks. Priority levels 4, 5, and 6 are used for interactive tasks. + + .PARAMETER RestartCount + Specifies the number of times that Task Scheduler attempts to restart the task. + + .PARAMETER RestartInterval + Specifies the amount of time that Task Scheduler attempts to restart the task. + + .PARAMETER RunOnlyIfNetworkAvailable + Indicates that Task Scheduler runs the task only when a network is available. Task + Scheduler uses the NetworkID parameter and NetworkName parameter that you specify + in this cmdlet to determine if the network is available.\ + + .PARAMETER RunLevel + Specifies the level of user rights that Task Scheduler uses to run the tasks that + are associated with the principal. Defaults to 'Limited'. + + .PARAMETER LogonType + Specifies the security logon method that Task Scheduler uses to run the tasks that + are associated with the principal. + + .PARAMETER EventSubscription + The event subscription in a string that can be parsed as valid XML. This parameter is only + valid in combination with the OnEvent Schedule Type. For the query schema please check: + https://docs.microsoft.com/en-us/windows/desktop/WES/queryschema-schema + + .PARAMETER Delay + The time to wait after an event based trigger was triggered. This parameter is only + valid in combination with the OnEvent Schedule Type. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TaskName, + + [Parameter()] + [System.String] + $TaskPath = '\', + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String] + $ActionExecutable, + + [Parameter()] + [System.String] + $ActionArguments, + + [Parameter()] + [System.String] + $ActionWorkingPath, + + [Parameter()] + [System.String] + [ValidateSet('Once', 'Daily', 'Weekly', 'AtStartup', 'AtLogOn', 'OnEvent')] + $ScheduleType, + + [Parameter()] + [System.String] + $RepeatInterval = '00:00:00', + + [Parameter()] + [System.DateTime] + $StartTime = [System.DateTime]::Today, + + [Parameter()] + [System.Boolean] + $SynchronizeAcrossTimeZone = $false, + + [Parameter()] + [System.String] + [ValidateSet('Present', 'Absent')] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $Enable = $true, + + [Parameter()] + [ValidateSet('SYSTEM', 'LOCAL SERVICE', 'NETWORK SERVICE')] + [System.String] + $BuiltInAccount, + + [Parameter()] + [System.Management.Automation.PSCredential] + $ExecuteAsCredential, + + [Parameter()] + [System.String] + $ExecuteAsGMSA, + + [Parameter()] + [System.UInt32] + $DaysInterval = 1, + + [Parameter()] + [System.String] + $RandomDelay = '00:00:00', + + [Parameter()] + [System.String] + $RepetitionDuration = '00:00:00', + + [Parameter()] + [System.String[]] + $DaysOfWeek, + + [Parameter()] + [System.UInt32] + $WeeksInterval = 1, + + [Parameter()] + [System.String] + $User, + + [Parameter()] + [System.Boolean] + $DisallowDemandStart = $false, + + [Parameter()] + [System.Boolean] + $DisallowHardTerminate = $false, + + [Parameter()] + [ValidateSet('AT', 'V1', 'Vista', 'Win7', 'Win8')] + [System.String] + $Compatibility = 'Vista', + + [Parameter()] + [System.Boolean] + $AllowStartIfOnBatteries = $false, + + [Parameter()] + [System.Boolean] + $Hidden = $false, + + [Parameter()] + [System.Boolean] + $RunOnlyIfIdle = $false, + + [Parameter()] + [System.String] + $IdleWaitTimeout = '02:00:00', + + [Parameter()] + [System.String] + $NetworkName, + + [Parameter()] + [System.Boolean] + $DisallowStartOnRemoteAppSession = $false, + + [Parameter()] + [System.Boolean] + $StartWhenAvailable = $false, + + [Parameter()] + [System.Boolean] + $DontStopIfGoingOnBatteries = $false, + + [Parameter()] + [System.Boolean] + $WakeToRun = $false, + + [Parameter()] + [System.String] + $IdleDuration = '01:00:00', + + [Parameter()] + [System.Boolean] + $RestartOnIdle = $false, + + [Parameter()] + [System.Boolean] + $DontStopOnIdleEnd = $false, + + [Parameter()] + [System.String] + $ExecutionTimeLimit = '08:00:00', + + [Parameter()] + [ValidateSet('IgnoreNew', 'Parallel', 'Queue', 'StopExisting')] + [System.String] + $MultipleInstances = 'Queue', + + [Parameter()] + [System.UInt32] + $Priority = 7, + + [Parameter()] + [System.UInt32] + $RestartCount = 0, + + [Parameter()] + [System.String] + $RestartInterval = '00:00:00', + + [Parameter()] + [System.Boolean] + $RunOnlyIfNetworkAvailable = $false, + + [Parameter()] + [ValidateSet('Limited', 'Highest')] + [System.String] + $RunLevel = 'Limited', + + [Parameter()] + [ValidateSet('Group', 'Interactive', 'InteractiveOrPassword', 'None', 'Password', 'S4U', 'ServiceAccount')] + [System.String] + $LogonType, + + [Parameter()] + [System.String] + $EventSubscription, + + [Parameter()] + [System.String] + $Delay = '00:00:00' + ) + + $TaskPath = ConvertTo-NormalizedTaskPath -TaskPath $TaskPath + + Write-Verbose -Message ($script:localizedData.SetScheduledTaskMessage -f $TaskName, $TaskPath) + + # Convert the strings containing time spans to TimeSpan Objects + [System.TimeSpan] $RepeatInterval = ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $RepeatInterval + [System.TimeSpan] $RandomDelay = ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $RandomDelay + [System.TimeSpan] $RepetitionDuration = ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $RepetitionDuration -AllowIndefinitely + [System.TimeSpan] $IdleWaitTimeout = ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $IdleWaitTimeout + [System.TimeSpan] $IdleDuration = ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $IdleDuration + [System.TimeSpan] $ExecutionTimeLimit = ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $ExecutionTimeLimit + [System.TimeSpan] $RestartInterval = ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $RestartInterval + + $currentValues = Get-CurrentResource -TaskName $TaskName -TaskPath $TaskPath + + if ($Ensure -eq 'Present') + { + <# + If the scheduled task already exists and is enabled but it needs to be disabled + and the action executable isn't specified then disable the task + #> + if ($currentValues.Ensure -eq 'Present' ` + -and $currentValues.Enable ` + -and -not $Enable ` + -and -not $PSBoundParameters.ContainsKey('ActionExecutable')) + { + Write-Verbose -Message ($script:localizedData.DisablingExistingScheduledTask -f $TaskName, $TaskPath) + Disable-ScheduledTask -TaskName $TaskName -TaskPath $TaskPath + + return + } + + if ($RepetitionDuration -lt $RepeatInterval) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.RepetitionDurationLessThanIntervalError -f $RepetitionDuration, $RepeatInterval) ` + -ArgumentName RepeatInterval + } + + if ($ScheduleType -eq 'Daily' -and $DaysInterval -eq 0) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.DaysIntervalError -f $DaysInterval) ` + -ArgumentName DaysInterval + } + + if ($ScheduleType -eq 'Weekly' -and $WeeksInterval -eq 0) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.WeeksIntervalError -f $WeeksInterval) ` + -ArgumentName WeeksInterval + } + + if ($ScheduleType -eq 'Weekly' -and $DaysOfWeek.Count -eq 0) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.WeekDayMissingError) ` + -ArgumentName DaysOfWeek + } + + if ($ScheduleType -eq 'OnEvent' -and -not ([xml]$EventSubscription)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.OnEventSubscriptionError) ` + -ArgumentName EventSubscription + } + + if ($ExecuteAsGMSA -and ($ExecuteAsCredential -or $BuiltInAccount)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.gMSAandCredentialError) ` + -ArgumentName ExecuteAsGMSA + } + + if ($SynchronizeAcrossTimeZone -and ($ScheduleType -notin @('Once', 'Daily', 'Weekly'))) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.SynchronizeAcrossTimeZoneInvalidScheduleType) ` + -ArgumentName SynchronizeAcrossTimeZone + } + + # Configure the action + $actionParameters = @{ + Execute = $ActionExecutable + } + + if ($ActionArguments) + { + $actionParameters.Add('Argument', $ActionArguments) + } + + if ($ActionWorkingPath) + { + $actionParameters.Add('WorkingDirectory', $ActionWorkingPath) + } + + $action = New-ScheduledTaskAction @actionParameters + + $scheduledTaskArguments += @{ + Action = $action + } + + # Configure the settings + $settingParameters = @{ + DisallowDemandStart = $DisallowDemandStart + DisallowHardTerminate = $DisallowHardTerminate + Compatibility = $Compatibility + AllowStartIfOnBatteries = $AllowStartIfOnBatteries + Disable = -not $Enable + Hidden = $Hidden + RunOnlyIfIdle = $RunOnlyIfIdle + DisallowStartOnRemoteAppSession = $DisallowStartOnRemoteAppSession + StartWhenAvailable = $StartWhenAvailable + DontStopIfGoingOnBatteries = $DontStopIfGoingOnBatteries + WakeToRun = $WakeToRun + RestartOnIdle = $RestartOnIdle + DontStopOnIdleEnd = $DontStopOnIdleEnd + Priority = $Priority + RestartCount = $RestartCount + RunOnlyIfNetworkAvailable = $RunOnlyIfNetworkAvailable + } + + if ($MultipleInstances -ne 'StopExisting') + { + $settingParameters.Add('MultipleInstances', $MultipleInstances) + } + + if ($IdleDuration -gt [System.TimeSpan] '00:00:00') + { + $settingParameters.Add('IdleDuration', $IdleDuration) + } + + if ($IdleWaitTimeout -gt [System.TimeSpan] '00:00:00') + { + $settingParameters.Add('IdleWaitTimeout', $IdleWaitTimeout) + } + + if ($PSBoundParameters.ContainsKey('ExecutionTimeLimit')) + { + $settingParameters.Add('ExecutionTimeLimit', $ExecutionTimeLimit) + } + + if ($RestartInterval -gt [System.TimeSpan] '00:00:00') + { + $settingParameters.Add('RestartInterval', $RestartInterval) + } + + if (-not [System.String]::IsNullOrWhiteSpace($NetworkName)) + { + $settingParameters.Add('NetworkName', $NetworkName) + } + + $setting = New-ScheduledTaskSettingsSet @settingParameters + + <# The following workaround is needed because the TASK_INSTANCES_STOP_EXISTING value of + https://docs.microsoft.com/en-us/windows/win32/taskschd/tasksettings-multipleinstances is missing + from the Microsoft.PowerShell.Cmdletization.GeneratedTypes.ScheduledTask.MultipleInstancesEnum, + which is used for the other values of $MultipleInstances. (at least currently, as of June, 2020) + #> + if ($MultipleInstances -eq 'StopExisting') + { + $setting.CimInstanceProperties.Item('MultipleInstances').Value = 3 + } + + $scheduledTaskArguments += @{ + Settings = $setting + } + + <# + On Windows Server 2012 R2 setting a blank timespan for ExecutionTimeLimit + does not result in the PT0S timespan value being set. So set this + if it has not been set. + #> + if ($PSBoundParameters.ContainsKey('ExecutionTimeLimit') -and ` + [System.String]::IsNullOrEmpty($setting.ExecutionTimeLimit)) + { + $setting.ExecutionTimeLimit = 'PT0S' + } + + # Configure the trigger + $triggerParameters = @{} + + # A random delay is not supported when the scheduleType is set to OnEvent + if ($RandomDelay -gt [System.TimeSpan]::FromSeconds(0) -and $ScheduleType -ne 'OnEvent') + { + $triggerParameters.Add('RandomDelay', $RandomDelay) + } + + switch ($ScheduleType) + { + 'Once' + { + $triggerParameters.Add('Once', $true) + $triggerParameters.Add('At', $StartTime) + + break + } + + 'Daily' + { + $triggerParameters.Add('Daily', $true) + $triggerParameters.Add('At', $StartTime) + $triggerParameters.Add('DaysInterval', $DaysInterval) + + break + } + + 'Weekly' + { + $triggerParameters.Add('Weekly', $true) + $triggerParameters.Add('At', $StartTime) + + if ($DaysOfWeek.Count -gt 0) + { + $triggerParameters.Add('DaysOfWeek', $DaysOfWeek) + } + + if ($WeeksInterval -gt 0) + { + $triggerParameters.Add('WeeksInterval', $WeeksInterval) + } + + break + } + + 'AtStartup' + { + $triggerParameters.Add('AtStartup', $true) + + break + } + + 'AtLogOn' + { + $triggerParameters.Add('AtLogOn', $true) + + if (-not [System.String]::IsNullOrWhiteSpace($User) -and $LogonType -ne 'Group') + { + $triggerParameters.Add('User', $User) + } + + break + } + + 'OnEvent' + { + Write-Verbose -Message ($script:localizedData.ConfigureTaskEventTrigger -f $TaskName) + + $cimTriggerClass = Get-CimClass -ClassName MSFT_TaskEventTrigger -Namespace Root/Microsoft/Windows/TaskScheduler:MSFT_TaskEventTrigger + $trigger = New-CimInstance -CimClass $cimTriggerClass -ClientOnly + $trigger.Enabled = $true + $trigger.Subscription = $EventSubscription + } + } + + if ($ScheduleType -ne 'OnEvent') + { + $trigger = New-ScheduledTaskTrigger @triggerParameters -ErrorAction SilentlyContinue + } + + if (-not $trigger) + { + New-InvalidOperationException ` + -Message ($script:localizedData.TriggerCreationError) ` + -ErrorRecord $_ + } + + if ($RepeatInterval -gt [System.TimeSpan]::Parse('0:0:0')) + { + # A repetition pattern is required so create it and attach it to the trigger object + Write-Verbose -Message ($script:localizedData.ConfigureTriggerRepetitionMessage) + + if ($RepetitionDuration -le $RepeatInterval) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.RepetitionIntervalError -f $RepeatInterval, $RepetitionDuration) ` + -ArgumentName RepetitionDuration + } + + $tempTriggerParameters = @{ + Once = $true + At = '6:6:6' + RepetitionInterval = $RepeatInterval + } + + Write-Verbose -Message ($script:localizedData.CreateRepetitionPatternMessage) + + switch ($trigger.GetType().FullName) + { + 'Microsoft.PowerShell.ScheduledJob.ScheduledJobTrigger' + { + # This is the type of trigger object returned in Windows Server 2012 R2/Windows 8.1 and below + Write-Verbose -Message ($script:localizedData.CreateTemporaryTaskMessage) + + $tempTriggerParameters.Add('RepetitionDuration', $RepetitionDuration) + + # Create a temporary trigger and task and copy the repetition CIM object from the temporary task + $tempTrigger = New-ScheduledTaskTrigger @tempTriggerParameters + $tempTask = New-ScheduledTask -Action $action -Trigger $tempTrigger + + # Store the repetition settings + $repetition = $tempTask.Triggers[0].Repetition + } + + 'Microsoft.Management.Infrastructure.CimInstance' + { + # This is the type of trigger object returned in Windows Server 2016/Windows 10 and above + Write-Verbose -Message ($script:localizedData.CreateTemporaryTriggerMessage) + + if ($RepetitionDuration -gt [System.TimeSpan]::Parse('0:0:0') -and $RepetitionDuration -lt [System.TimeSpan]::MaxValue) + { + $tempTriggerParameters.Add('RepetitionDuration', $RepetitionDuration) + } + + # Create a temporary trigger and copy the repetition CIM object from it to the actual trigger + $tempTrigger = New-ScheduledTaskTrigger @tempTriggerParameters + + # Store the repetition settings + $repetition = $tempTrigger.Repetition + } + + default + { + New-InvalidOperationException ` + -Message ($script:localizedData.TriggerUnexpectedTypeError -f $trigger.GetType().FullName) + } + } + } + + if ($trigger.GetType().FullName -eq 'Microsoft.Management.Infrastructure.CimInstance') + { + # On W2016+ / W10+ the Delay property is supported on the AtLogon, AtStartup and OnEvent trigger types + $triggerSupportsDelayProperty = @('AtLogon', 'AtStartup', 'OnEvent') + + if ($ScheduleType -in $triggerSupportsDelayProperty) + { + $trigger.Delay = [System.Xml.XmlConvert]::ToString([System.TimeSpan]$Delay) + } + } + + $scheduledTaskArguments += @{ + Trigger = $trigger + } + + # Prepare the register arguments + $registerArguments = @{} + $username = $null + + if ($PSBoundParameters.ContainsKey('BuiltInAccount')) + { + <# + The validateset on BuiltInAccount has already checked the + non-null value to be 'LOCAL SERVICE', 'NETWORK SERVICE' or + 'SYSTEM' + #> + $username = 'NT AUTHORITY\' + $BuiltInAccount + $registerArguments.Add('User', $username) + $LogonType = 'ServiceAccount' + } + elseif ($PSBoundParameters.ContainsKey('ExecuteAsGMSA')) + { + $username = $ExecuteAsGMSA + $LogonType = 'Password' + } + elseif ($PSBoundParameters.ContainsKey('ExecuteAsCredential')) + { + $username = $ExecuteAsCredential.UserName + + # If the LogonType is not specified then set it to password + if ([System.String]::IsNullOrEmpty($LogonType)) + { + $LogonType = 'Password' + } + + if ($LogonType -ne 'Group') + { + $registerArguments.Add('User', $username) + } + + if ($LogonType -notin ('Interactive', 'S4U', 'Group')) + { + # Only set the password if the LogonType is not interactive or S4U + $registerArguments.Add('Password', $ExecuteAsCredential.GetNetworkCredential().Password) + } + } + else + { + <# + 'NT AUTHORITY\SYSTEM' basically gives the schedule task admin + privileges, should we default to 'NT AUTHORITY\LOCAL SERVICE' + instead? + #> + $username = 'NT AUTHORITY\SYSTEM' + $registerArguments.Add('User', $username) + $LogonType = 'ServiceAccount' + } + + # Prepare the principal arguments + $principalArguments = @{ + Id = 'Author' + } + + if ($LogonType -eq 'Group') + { + $principalArguments.GroupId = $username + } + else + { + $principalArguments.LogonType = $LogonType + $principalArguments.UserId = $username + } + + # Set the Run Level if defined + if ($PSBoundParameters.ContainsKey('RunLevel')) + { + $principalArguments.Add('RunLevel', $RunLevel) + } + + # Create the principal object + Write-Verbose -Message ($script:localizedData.CreateScheduledTaskPrincipalMessage -f $username, $LogonType) + + $principal = New-ScheduledTaskPrincipal @principalArguments + + $scheduledTaskArguments += @{ + Principal = $principal + } + + $tempScheduledTask = New-ScheduledTask @scheduledTaskArguments -ErrorAction Stop + + if ($currentValues.Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.RetrieveScheduledTaskMessage -f $TaskName, $TaskPath) + $tempScheduledTask = New-ScheduledTask @scheduledTaskArguments -ErrorAction Stop + + $scheduledTask = ScheduledTasks\Get-ScheduledTask ` + -TaskName $currentValues.TaskName ` + -TaskPath $currentValues.TaskPath ` + -ErrorAction Stop + $scheduledTask.Actions = $action + $scheduledTask.Triggers = $tempScheduledTask.Triggers + $scheduledTask.Settings = $setting + $scheduledTask.Principal = $principal + } + else + { + $scheduledTask = $tempScheduledTask + } + + Write-Verbose -Message ($script:localizedData.CreateNewScheduledTaskMessage -f $TaskName, $TaskPath) + + if ($repetition) + { + Write-Verbose -Message ($script:localizedData.SetRepetitionTriggerMessage -f $TaskName, $TaskPath) + + $scheduledTask.Triggers[0].Repetition = $repetition + } + + if (-not [System.String]::IsNullOrWhiteSpace($Description)) + { + $scheduledTask.Description = $Description + } + + if ($scheduledTask.Triggers[0].StartBoundary) + { + <# + The way New-ScheduledTaskTrigger writes the StartBoundary has issues because it does not take + the setting "Synchronize across time zones" in consideration. What happens if synchronize across + time zone is enabled in the scheduled task GUI is that the time is written like this: + + 2018-09-27T18:45:08+02:00 + + When the setting synchronize across time zones is disabled, the time is written as: + + 2018-09-27T18:45:08 + + The problem in New-ScheduledTaskTrigger is that it always writes the time the format that + includes the full timezone offset (W2016 behaviour, W2012R2 does it the other way around). + Which means "Synchronize across time zones" is enabled by default on W2016 and disabled by + default on W2012R2. To prevent that, we are overwriting the StartBoundary here to insert + the time in the format we want it, so we can enable or disable "Synchronize across time zones". + #> + + $scheduledTask.Triggers[0].StartBoundary = Get-DateTimeString -Date $StartTime -SynchronizeAcrossTimeZone $SynchronizeAcrossTimeZone + } + + if ($currentValues.Ensure -eq 'Present') + { + # Updating the scheduled task + + Write-Verbose -Message ($script:localizedData.UpdateScheduledTaskMessage -f $TaskName, $TaskPath) + $null = Set-ScheduledTask -InputObject $scheduledTask @registerArguments + } + else + { + Write-Verbose -Message ($script:localizedData.CreateNewScheduledTaskMessage -f $TaskName, $TaskPath) + + # Register the scheduled task + + $registerArguments.Add('TaskName', $TaskName) + $registerArguments.Add('TaskPath', $TaskPath) + $registerArguments.Add('InputObject', $scheduledTask) + + $null = Register-ScheduledTask @registerArguments + } + } + + if ($Ensure -eq 'Absent') + { + Write-Verbose -Message ($script:localizedData.RemoveScheduledTaskMessage -f $TaskName, $TaskPath) + + Unregister-ScheduledTask -TaskName $TaskName -TaskPath $TaskPath -Confirm:$false -ErrorAction Stop + } +} + +<# + .SYNOPSIS + Tests if the current resource state matches the desired resource state. + + .PARAMETER TaskName + The name of the task. + + .PARAMETER TaskPath + The path to the task - defaults to the root directory. + + .PARAMETER Description + The task description. + + .PARAMETER ActionExecutable + The path to the .exe for this task. + + .PARAMETER ActionArguments + The arguments to pass the executable. + + .PARAMETER ActionWorkingPath + The working path to specify for the executable. + + .PARAMETER ScheduleType + When should the task be executed. + + .PARAMETER RepeatInterval + How many units (minutes, hours, days) between each run of this task? + + .PARAMETER StartTime + The time of day this task should start at - defaults to 12:00 AM. Not valid for + AtLogon and AtStartup tasks. + + .PARAMETER SynchronizeAcrossTimeZone + Enable the scheduled task option to synchronize across time zones. This is enabled + by including the timezone offset in the scheduled task trigger. Defaults to false + which does not include the timezone offset. + + .PARAMETER Ensure + Present if the task should exist, Absent if it should be removed. + + .PARAMETER Enable + True if the task should be enabled, false if it should be disabled. + + .PARAMETER BuiltInAccount + Run the task as one of the built in service accounts. + When set ExecuteAsCredential will be ignored and LogonType will be set to 'ServiceAccount' + + .PARAMETER ExecuteAsCredential + The credential this task should execute as. If not specified defaults to running + as the local system account. Cannot be used in combination with ExecuteAsGMSA. + + .PARAMETER ExecuteAsGMSA + The gMSA (Group Managed Service Account) this task should execute as. Cannot be + used in combination with ExecuteAsCredential. + + .PARAMETER DaysInterval + Specifies the interval between the days in the schedule. An interval of 1 produces + a daily schedule. An interval of 2 produces an every-other day schedule. + + .PARAMETER RandomDelay + Specifies a random amount of time to delay the start time of the trigger. The + delay time is a random time between the time the task triggers and the time that + you specify in this setting. + + .PARAMETER RepetitionDuration + Specifies how long the repetition pattern repeats after the task starts. + + .PARAMETER DaysOfWeek + Specifies an array of the days of the week on which Task Scheduler runs the task. + + .PARAMETER WeeksInterval + Specifies the interval between the weeks in the schedule. An interval of 1 produces + a weekly schedule. An interval of 2 produces an every-other week schedule. + + .PARAMETER User + Specifies the identifier of the user for a trigger that starts a task when a + user logs on. + + .PARAMETER DisallowDemandStart + Indicates whether the task is prohibited to run on demand or not. Defaults + to $false. + + .PARAMETER DisallowHardTerminate + Indicates whether the task is prohibited to be terminated or not. Defaults + to $false. + + .PARAMETER Compatibility + The task compatibility level. Defaults to Vista. + + .PARAMETER AllowStartIfOnBatteries + Indicates whether the task should start if the machine is on batteries or not. + Defaults to $false. + + .PARAMETER Hidden + Indicates that the task is hidden in the Task Scheduler UI. + + .PARAMETER RunOnlyIfIdle + Indicates that Task Scheduler runs the task only when the computer is idle. + + .PARAMETER IdleWaitTimeout + Specifies the amount of time that Task Scheduler waits for an idle condition to occur. + + .PARAMETER NetworkName + Specifies the name of a network profile that Task Scheduler uses to determine + if the task can run. + The Task Scheduler UI uses this setting for display purposes. Specify a network + name if you specify the RunOnlyIfNetworkAvailable parameter. + + .PARAMETER DisallowStartOnRemoteAppSession + Indicates that the task does not start if the task is triggered to run in a Remote + Applications Integrated Locally (RAIL) session. + + .PARAMETER StartWhenAvailable + Indicates that Task Scheduler can start the task at any time after its scheduled + time has passed. + + .PARAMETER DontStopIfGoingOnBatteries + Indicates that the task does not stop if the computer switches to battery power. + + .PARAMETER WakeToRun + Indicates that Task Scheduler wakes the computer before it runs the task. + + .PARAMETER IdleDuration + Specifies the amount of time that the computer must be in an idle state before + Task Scheduler runs the task. + + .PARAMETER RestartOnIdle + Indicates that Task Scheduler restarts the task when the computer cycles into an + idle condition more than once. + + .PARAMETER DontStopOnIdleEnd + Indicates that Task Scheduler does not terminate the task if the idle condition + ends before the task is completed. + + .PARAMETER ExecutionTimeLimit + Specifies the amount of time that Task Scheduler is allowed to complete the task. + + .PARAMETER MultipleInstances + Specifies the policy that defines how Task Scheduler handles multiple instances + of the task. + + .PARAMETER Priority + Specifies the priority level of the task. Priority must be an integer from 0 (highest priority) + to 10 (lowest priority). The default value is 7. Priority levels 7 and 8 are + used for background tasks. Priority levels 4, 5, and 6 are used for interactive tasks. + + .PARAMETER RestartCount + Specifies the number of times that Task Scheduler attempts to restart the task. + + .PARAMETER RestartInterval + Specifies the amount of time that Task Scheduler attempts to restart the task. + + .PARAMETER RunOnlyIfNetworkAvailable + Indicates that Task Scheduler runs the task only when a network is available. Task + Scheduler uses the NetworkID parameter and NetworkName parameter that you specify + in this cmdlet to determine if the network is available. + + .PARAMETER RunLevel + Specifies the level of user rights that Task Scheduler uses to run the tasks that + are associated with the principal. Defaults to 'Limited'. + + .PARAMETER LogonType + Specifies the security logon method that Task Scheduler uses to run the tasks that + are associated with the principal. + + .PARAMETER EventSubscription + The event subscription in a string that can be parsed as valid XML. This parameter is only + valid in combination with the OnEvent Schedule Type. For the query schema please check: + https://docs.microsoft.com/en-us/windows/desktop/WES/queryschema-schema + + .PARAMETER Delay + The time to wait after an event based trigger was triggered. This parameter is only + valid in combination with the OnEvent Schedule Type. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TaskName, + + [Parameter()] + [System.String] + $TaskPath = '\', + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String] + $ActionExecutable, + + [Parameter()] + [System.String] + $ActionArguments, + + [Parameter()] + [System.String] + $ActionWorkingPath, + + [Parameter()] + [System.String] + [ValidateSet('Once', 'Daily', 'Weekly', 'AtStartup', 'AtLogOn', 'OnEvent')] + $ScheduleType, + + [Parameter()] + [System.String] + $RepeatInterval = '00:00:00', + + [Parameter()] + [System.DateTime] + $StartTime = [System.DateTime]::Today, + + [Parameter()] + [System.Boolean] + $SynchronizeAcrossTimeZone = $false, + + [Parameter()] + [System.String] + [ValidateSet('Present', 'Absent')] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $Enable = $true, + + [Parameter()] + [ValidateSet('SYSTEM', 'LOCAL SERVICE', 'NETWORK SERVICE')] + [System.String] + $BuiltInAccount, + + [Parameter()] + [System.Management.Automation.PSCredential] + $ExecuteAsCredential, + + [Parameter()] + [System.String] + $ExecuteAsGMSA, + + [Parameter()] + [System.UInt32] + $DaysInterval = 1, + + [Parameter()] + [System.String] + $RandomDelay = '00:00:00', + + [Parameter()] + [System.String] + $RepetitionDuration = '00:00:00', + + [Parameter()] + [System.String[]] + $DaysOfWeek, + + [Parameter()] + [System.UInt32] + $WeeksInterval = 1, + + [Parameter()] + [System.String] + $User, + + [Parameter()] + [System.Boolean] + $DisallowDemandStart = $false, + + [Parameter()] + [System.Boolean] + $DisallowHardTerminate = $false, + + [Parameter()] + [ValidateSet('AT', 'V1', 'Vista', 'Win7', 'Win8')] + [System.String] + $Compatibility = 'Vista', + + [Parameter()] + [System.Boolean] + $AllowStartIfOnBatteries = $false, + + [Parameter()] + [System.Boolean] + $Hidden = $false, + + [Parameter()] + [System.Boolean] + $RunOnlyIfIdle = $false, + + [Parameter()] + [System.String] + $IdleWaitTimeout = '02:00:00', + + [Parameter()] + [System.String] + $NetworkName, + + [Parameter()] + [System.Boolean] + $DisallowStartOnRemoteAppSession = $false, + + [Parameter()] + [System.Boolean] + $StartWhenAvailable = $false, + + [Parameter()] + [System.Boolean] + $DontStopIfGoingOnBatteries = $false, + + [Parameter()] + [System.Boolean] + $WakeToRun = $false, + + [Parameter()] + [System.String] + $IdleDuration = '01:00:00', + + [Parameter()] + [System.Boolean] + $RestartOnIdle = $false, + + [Parameter()] + [System.Boolean] + $DontStopOnIdleEnd = $false, + + [Parameter()] + [System.String] + $ExecutionTimeLimit = '08:00:00', + + [Parameter()] + [ValidateSet('IgnoreNew', 'Parallel', 'Queue', 'StopExisting')] + [System.String] + $MultipleInstances = 'Queue', + + [Parameter()] + [System.UInt32] + $Priority = 7, + + [Parameter()] + [System.UInt32] + $RestartCount = 0, + + [Parameter()] + [System.String] + $RestartInterval = '00:00:00', + + [Parameter()] + [System.Boolean] + $RunOnlyIfNetworkAvailable = $false, + + [Parameter()] + [ValidateSet('Limited', 'Highest')] + [System.String] + $RunLevel = 'Limited', + + [Parameter()] + [ValidateSet('Group', 'Interactive', 'InteractiveOrPassword', 'None', 'Password', 'S4U', 'ServiceAccount')] + [System.String] + $LogonType, + + [Parameter()] + [System.String] + $EventSubscription, + + [Parameter()] + [System.String] + $Delay = '00:00:00' + ) + + $TaskPath = ConvertTo-NormalizedTaskPath -TaskPath $TaskPath + + Write-Verbose -Message ($script:localizedData.TestScheduledTaskMessage -f $TaskName, $TaskPath) + + $currentValues = Get-CurrentResource -TaskName $TaskName -TaskPath $TaskPath + + # Convert the strings containing time spans to TimeSpan Objects + if ($PSBoundParameters.ContainsKey('RepeatInterval')) + { + $PSBoundParameters['RepeatInterval'] = (ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $RepeatInterval).ToString() + } + + if ($PSBoundParameters.ContainsKey('RandomDelay')) + { + if ($ScheduleType -eq 'OnEvent') + { + # A random delay is not supported when the ScheduleType is set to OnEvent. + Write-Verbose -Message ($script:localizedData.IgnoreRandomDelayWithTriggerTypeOnEvent -f $TaskName) + $null = $PSBoundParameters.Remove('RandomDelay') + } + else + { + $PSBoundParameters['RandomDelay'] = (ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $RandomDelay).ToString() + } + } + + if ($PSBoundParameters.ContainsKey('RepetitionDuration')) + { + $RepetitionDuration = ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $RepetitionDuration -AllowIndefinitely + if ($RepetitionDuration -eq [System.TimeSpan]::MaxValue) + { + $PSBoundParameters['RepetitionDuration'] = 'Indefinitely' + } + else + { + $PSBoundParameters['RepetitionDuration'] = $RepetitionDuration.ToString() + } + } + + if ($PSBoundParameters.ContainsKey('IdleWaitTimeout')) + { + $PSBoundParameters['IdleWaitTimeout'] = (ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $IdleWaitTimeout).ToString() + } + + if ($PSBoundParameters.ContainsKey('IdleDuration')) + { + $PSBoundParameters['IdleDuration'] = (ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $IdleDuration).ToString() + } + + if ($PSBoundParameters.ContainsKey('ExecutionTimeLimit')) + { + $PSBoundParameters['ExecutionTimeLimit'] = (ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $ExecutionTimeLimit).ToString() + } + + if ($PSBoundParameters.ContainsKey('RestartInterval')) + { + $PSBoundParameters['RestartInterval'] = (ConvertTo-TimeSpanFromTimeSpanString -TimeSpanString $RestartInterval).ToString() + } + + if ($ScheduleType -in @('Once', 'Daily', 'Weekly')) + { + $PSBoundParameters['StartTime'] = Get-DateTimeString -Date $StartTime -SynchronizeAcrossTimeZone $SynchronizeAcrossTimeZone + <# + If the current StartTime is null then we need to set it to + the desired StartTime (which defaults to Today if not passed) + so that the test does not fail. + #> + if ($currentValues['StartTime']) + { + $currentValues['StartTime'] = Get-DateTimeString ` + -Date $currentValues['StartTime'] ` + -SynchronizeAcrossTimeZone $currentValues['SynchronizeAcrossTimeZone'] + } + else + { + $currentValues['StartTime'] = Get-DateTimeString ` + -Date $StartTime ` + -SynchronizeAcrossTimeZone $SynchronizeAcrossTimeZone + } + } + else + { + # Do not compare StartTime for triggers that aren't Once, Daily or Weekly. + $null = $PSBoundParameters.Remove('StartTime') + $null = $currentValues.Remove('StartTime') + } + + if ($Ensure -eq 'Absent' -and $currentValues.Ensure -eq 'Absent') + { + return $true + } + + if ($null -eq $currentValues) + { + Write-Verbose -Message ($script:localizedData.CurrentTaskValuesNullMessage) + + return $false + } + + if ($PSBoundParameters.ContainsKey('BuiltInAccount')) + { + $PSBoundParameters.User = $BuiltInAccount + $currentValues.User = $BuiltInAccount + + $PSBoundParameters.ExecuteAsCredential = $BuiltInAccount + $currentValues.ExecuteAsCredential = $BuiltInAccount + + $PSBoundParameters['LogonType'] = 'ServiceAccount' + $currentValues['LogonType'] = 'ServiceAccount' + + $PSBoundParameters['BuiltInAccount'] = 'NT AUTHORITY\' + $BuiltInAccount + } + elseif ($PSBoundParameters.ContainsKey('ExecuteAsCredential')) + { + # The password of the execution credential can not be compared + $username = $ExecuteAsCredential.UserName + $PSBoundParameters['ExecuteAsCredential'] = $username + } + else + { + # Must be running as System, login type is ServiceAccount + $PSBoundParameters['LogonType'] = 'ServiceAccount' + $currentValues['LogonType'] = 'ServiceAccount' + } + + if ($PSBoundParameters.ContainsKey('WeeksInterval') ` + -and ((-not $currentValues.ContainsKey('WeeksInterval')) -or ($null -eq $currentValues['WeeksInterval']))) + { + <# + The WeeksInterval parameter of this function defaults to 1, + even though the value of the WeeksInterval property maybe + unset/undefined in the object $currentValues returned from + Get-TargetResouce. To avoid Test-TargetResouce returning false + and generating spurious calls to Set-TargetResouce, default + an undefined $currentValues.WeeksInterval to the value of + $WeeksInterval. + #> + $currentValues.WeeksInterval = $PSBoundParameters['WeeksInterval'] + } + + if ($PSBoundParameters.ContainsKey('ExecuteAsGMSA')) + { + <# + There is a difference in W2012R2 and W2016 behaviour, + W2012R2 returns the gMSA including the DOMAIN prefix, + W2016 returns this without. So to be sure strip off the + domain part in Get & Test. This means we either need to + remove everything before \ in the case of the DOMAIN\User + format, or we need to remove everything after @ in case + when the UPN format (User@domain.fqdn) is used. + #> + $PSBoundParameters['ExecuteAsGMSA'] = $PSBoundParameters.ExecuteAsGMSA -replace '^.+\\|@.+', $null + } + + if ($PSBoundParameters.ContainsKey('Description')) + { + <# + All forms of whitespace is automatically trimmed from the description + when it is set, so we must not compare it here. See issue #258: + https://github.com/dsccommunity/ComputerManagementDsc/issues/258 + #> + $PSBoundParameters['Description'] = $PSBoundParameters.Description.Trim() + } + + $desiredValues = $PSBoundParameters + $desiredValues.TaskPath = $TaskPath + + if ($desiredValues.ContainsKey('Verbose')) + { + <# + Initialise a missing or null Verbose to avoid spurious + calls to Set-TargetResouce + #> + $currentValues.Add('Verbose', $desiredValues['Verbose']) + } + + Write-Verbose -Message ($script:localizedData.TestingDscParameterStateMessage) + + return Test-DscParameterState ` + -CurrentValues $currentValues ` + -DesiredValues $desiredValues ` + -Verbose:$VerbosePreference +} + +<# + .SYNOPSIS + Helper function to convert TaskPath to the right form + + .PARAMETER TaskPath + The path to the task +#> +function ConvertTo-NormalizedTaskPath +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TaskPath + ) + + $pathArray = $TaskPath.Split('\').Where( {$_}) + if ($pathArray.Count -gt 0) + { + $TaskPath = "\$($pathArray -join '\')\" + } + + return $TaskPath +} + +<# + .SYNOPSIS + Helper function convert a standard timespan string + into a TimeSpan object. It can support returning the + maximum timespan if the AllowIndefinitely switch is set + and the timespan is set to 'indefinte'. + + .PARAMETER TimeSpan + The standard timespan string to convert to a TimeSpan + object. + + .PARAMETER AllowIndefinitely + Allow the keyword 'Indefinitely' to be translated into + the maximum valid timespan. +#> +function ConvertTo-TimeSpanFromTimeSpanString +{ + [CmdletBinding()] + [OutputType([System.TimeSpan])] + param + ( + [Parameter()] + [System.String] + $TimeSpanString = '00:00:00', + + [Parameter()] + [Switch] + $AllowIndefinitely + ) + + if ($AllowIndefinitely -eq $True -and $TimeSpanString -eq 'Indefinitely') + { + return [System.TimeSpan]::MaxValue + } + + return [System.TimeSpan]::Parse($TimeSpanString) +} + +<# + .SYNOPSIS + Helper function convert a task schedule timespan string + into a TimeSpan string. If AllowIndefinitely is set to + true and the TimeSpan string is empty then return + 'Indefinitely'. + + .PARAMETER TimeSpan + The scheduled task timespan string to convert to a TimeSpan + string. + + .PARAMETER AllowIndefinitely + Allow an empty TimeSpan to return the keyword 'Indefinitely'. + +#> +function ConvertTo-TimeSpanStringFromScheduledTaskString +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter()] + [System.String] + $TimeSpan, + + [Parameter()] + [Switch] + $AllowIndefinitely + ) + + # If AllowIndefinitely is true and the timespan is empty then return Indefinitely + if ($AllowIndefinitely -eq $true -and [System.String]::IsNullOrEmpty($TimeSpan)) + { + return 'Indefinitely' + } + + $days = $hours = $minutes = $seconds = 0 + + if ($TimeSpan -match 'P(?\d{0,3})D') + { + $days = $matches.Days + } + + if ($TimeSpan -match '(?\d{0,2})H') + { + $hours = $matches.Hours + } + + if ($TimeSpan -match '(?\d{0,2})M') + { + $minutes = $matches.Minutes + } + + if ($TimeSpan -match '(?\d{0,2})S') + { + $seconds = $matches.Seconds + } + + return (New-TimeSpan -Days $days -Hours $hours -Minutes $minutes -Seconds $seconds).ToString() +} + +<# + .SYNOPSIS + Helper function to disable an existing scheduled task. + + .PARAMETER TaskName + The name of the task to disable. + + .PARAMETER TaskPath + The path to the task to disable. +#> +function Disable-ScheduledTask +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TaskName, + + [Parameter()] + [System.String] + $TaskPath = '\' + ) + + $existingTask = ScheduledTasks\Get-ScheduledTask @PSBoundParameters + $existingTask.Settings.Enabled = $false + $null = $existingTask | Register-ScheduledTask @PSBoundParameters -Force +} + +<# + .SYNOPSIS + Returns a formatted datetime string for use in ScheduledTask resource. + + .PARAMETER Date + The date to format. + + .PARAMETER SynchronizeAcrossTimeZone + Boolean to specifiy if the returned string is formatted in synchronize + across time zone format. +#> +function Get-DateTimeString +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.DateTime] + $Date, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $SynchronizeAcrossTimeZone + ) + + $format = (Get-Culture).DateTimeFormat.SortableDateTimePattern + + if ($SynchronizeAcrossTimeZone) + { + $returnDate = (Get-Date -Date $Date -Format $format) + (Get-Date -Format 'zzz') + } + else + { + $returnDate = Get-Date -Date $Date -Format $format + } + + return $returnDate +} + +<# + .SYNOPSIS + Returns the current values of the resource. + + .PARAMETER TaskName + The name of the task. + + .PARAMETER TaskPath + The path to the task - defaults to the root directory. +#> +function Get-CurrentResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TaskName, + + [Parameter()] + [System.String] + $TaskPath = '\' + ) + + $TaskPath = ConvertTo-NormalizedTaskPath -TaskPath $TaskPath + + Write-Verbose -Message ($script:localizedData.GettingCurrentTaskValuesMessage -f $TaskName, $TaskPath) + + $task = ScheduledTasks\Get-ScheduledTask -TaskName $TaskName -TaskPath $TaskPath -ErrorAction SilentlyContinue + + if ($null -eq $task) + { + Write-Verbose -Message ($script:localizedData.TaskNotFoundMessage -f $TaskName, $TaskPath) + + $result = @{ + TaskName = $TaskName + TaskPath = $TaskPath + Ensure = 'Absent' + } + } + else + { + Write-Verbose -Message ($script:localizedData.TaskFoundMessage -f $TaskName, $TaskPath) + + $action = $task.Actions | Select-Object -First 1 + $trigger = $task.Triggers | Select-Object -First 1 + $settings = $task.Settings + $returnScheduleType = 'Unknown' + + switch ($trigger.CimClass.CimClassName) + { + 'MSFT_TaskTimeTrigger' + { + $returnScheduleType = 'Once' + break + } + + 'MSFT_TaskDailyTrigger' + { + $returnScheduleType = 'Daily' + break + } + + 'MSFT_TaskWeeklyTrigger' + { + $returnScheduleType = 'Weekly' + break + } + + 'MSFT_TaskBootTrigger' + { + $returnScheduleType = 'AtStartup' + break + } + + 'MSFT_TaskLogonTrigger' + { + $returnScheduleType = 'AtLogon' + break + } + + 'MSFT_TaskEventTrigger' + { + $returnScheduleType = 'OnEvent' + break + } + + default + { + $returnScheduleType = '' + Write-Verbose -Message ($script:localizedData.TriggerTypeUnknown -f $trigger.CimClass.CimClassName) + } + } + + Write-Verbose -Message ($script:localizedData.DetectedScheduleTypeMessage -f $returnScheduleType) + + $daysOfWeek = @() + + foreach ($binaryAdductor in 1, 2, 4, 8, 16, 32, 64) + { + $day = $trigger.DaysOfWeek -band $binaryAdductor + + if ($day -ne 0) + { + $daysOfWeek += [System.String][ScheduledTask.DaysOfWeek] $day + } + } + + $startAt = $trigger.StartBoundary + + if ($startAt) + { + $synchronizeAcrossTimeZone = Test-DateStringContainsTimeZone -DateString $startAt + $startTime = [System.DateTime] $startAt + } + else + { + $startTime = $null + $synchronizeAcrossTimeZone = $false + } + + if ($task.Principal.LogonType -ieq 'Group') + { + $PrincipalId = 'GroupId' + } + else + { + $PrincipalId = 'UserId' + } + + <# The following workaround is needed because Get-StartedTask currently returns NULL for the value + of $settings.MultipleInstances when the started task is set to "Stop the existing instance". + https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/40685125-bug-get-scheduledtask-returns-null-for-value-of-m + #> + $MultipleInstances = [System.String] $settings.MultipleInstances + if ([System.String]::IsNullOrEmpty($MultipleInstances)) + { + if ($task.settings.CimInstanceProperties.Item('MultipleInstances').Value -eq 3) + { + $MultipleInstances = 'StopExisting' + } + } + + $result = @{ + TaskName = $task.TaskName + TaskPath = $task.TaskPath + StartTime = $startTime + SynchronizeAcrossTimeZone = $synchronizeAcrossTimeZone + Ensure = 'Present' + Description = $task.Description + ActionExecutable = $action.Execute + ActionArguments = $action.Arguments + ActionWorkingPath = $action.WorkingDirectory + ScheduleType = $returnScheduleType + RepeatInterval = ConvertTo-TimeSpanStringFromScheduledTaskString -TimeSpan $trigger.Repetition.Interval + ExecuteAsCredential = $task.Principal.$PrincipalId + ExecuteAsGMSA = $task.Principal.UserId -replace '^.+\\|@.+', $null + Enable = $settings.Enabled + DaysInterval = [System.Uint32] $trigger.DaysInterval + RandomDelay = ConvertTo-TimeSpanStringFromScheduledTaskString -TimeSpan $trigger.RandomDelay + RepetitionDuration = ConvertTo-TimeSpanStringFromScheduledTaskString -TimeSpan $trigger.Repetition.Duration -AllowIndefinitely + DaysOfWeek = [System.String[]] $daysOfWeek + WeeksInterval = [System.Uint32] $trigger.WeeksInterval + User = $task.Principal.UserId + DisallowDemandStart = -not $settings.AllowDemandStart + DisallowHardTerminate = -not $settings.AllowHardTerminate + Compatibility = [System.String] $settings.Compatibility + AllowStartIfOnBatteries = -not $settings.DisallowStartIfOnBatteries + Hidden = $settings.Hidden + RunOnlyIfIdle = $settings.RunOnlyIfIdle + IdleWaitTimeout = ConvertTo-TimeSpanStringFromScheduledTaskString -TimeSpan $settings.IdleSettings.WaitTimeout + NetworkName = $settings.NetworkSettings.Name + DisallowStartOnRemoteAppSession = $settings.DisallowStartOnRemoteAppSession + StartWhenAvailable = $settings.StartWhenAvailable + DontStopIfGoingOnBatteries = -not $settings.StopIfGoingOnBatteries + WakeToRun = $settings.WakeToRun + IdleDuration = ConvertTo-TimeSpanStringFromScheduledTaskString -TimeSpan $settings.IdleSettings.IdleDuration + RestartOnIdle = $settings.IdleSettings.RestartOnIdle + DontStopOnIdleEnd = -not $settings.IdleSettings.StopOnIdleEnd + ExecutionTimeLimit = ConvertTo-TimeSpanStringFromScheduledTaskString -TimeSpan $settings.ExecutionTimeLimit + MultipleInstances = $MultipleInstances + Priority = $settings.Priority + RestartCount = $settings.RestartCount + RestartInterval = ConvertTo-TimeSpanStringFromScheduledTaskString -TimeSpan $settings.RestartInterval + RunOnlyIfNetworkAvailable = $settings.RunOnlyIfNetworkAvailable + RunLevel = [System.String] $task.Principal.RunLevel + LogonType = [System.String] $task.Principal.LogonType + EventSubscription = $trigger.Subscription + Delay = ConvertTo-TimeSpanStringFromScheduledTaskString -TimeSpan $trigger.Delay + } + + if (($result.ContainsKey('LogonType')) -and ($result['LogonType'] -ieq 'ServiceAccount')) + { + $builtInAccount = Set-DomainNameInAccountName -AccountName $task.Principal.UserId -DomainName 'NT AUTHORITY' + $result.Add('BuiltInAccount', $builtInAccount) + } + } + + Write-Verbose -Message ($script:localizedData.CurrentTaskValuesRetrievedMessage -f $TaskName, $TaskPath) + + return $result +} + +<# + .SYNOPSIS + Test if a date string contains a time zone. + + .DESCRIPTION + This function returns true if the string contains a time + zone appended to it. This is used to determine if the + SynchronizeAcrossTimeZone parameter has been set in a + trigger. + + .PARAMETER DateString + The date string to test. +#> +function Test-DateStringContainsTimeZone +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DateString + ) + + return $DateString.Contains('+') +} + +<# + .SYNOPSIS + Set domain name in a down-level user or group name. + + .DESCRIPTION + Set the domain name in a down-level user or group name. + + .PARAMETER AccountName + The user or group name to set the domain name in. + + .PARAMETER DomainName + If the AccountName does not contain a domain name them prefix + it with this value. If the AccountName already contains a domain + name then it will only be updated if the Force switch is set. + + .PARAMETER Force + If the identity already contains a domain prefix then force + it to the value in Domain. + + .EXAMPLE + Set-DomainNameInAccountName -AccountName 'Users' -DomainName 'NT AUTHORITY' + + Returns 'NT AUTHORITY\Users'. + + .EXAMPLE + Set-DomainNameInAccountName -AccountName 'MyDomain\Users' -DomainName 'NT AUTHORITY' + + Returns 'MyDomain\Users'. + + .EXAMPLE + Set-DomainNameInAccountName -AccountName 'MyDomain\Users' -DomainName 'NT AUTHORITY' -Force + + Returns 'NT AUTHORITY\Users'. +#> +function Set-DomainNameInAccountName +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $AccountName, + + [Parameter(Mandatory = $true)] + [System.String] + $DomainName, + + [Parameter()] + [Switch] + $Force + ) + + if ($AccountName.Contains('\')) + { + $existingDomainName, $name = ($AccountName -Split '\\') + + if (-not [System.String]::IsNullOrEmpty($existingDomainName) -and -not $force.IsPresent) + { + # Keep the existing domain name if it is set and force is not specified + $DomainName = $existingDomainName + } + } + else + { + $name = $AccountName + } + + return "$DomainName\$name" +} diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/DSC_ScheduledTask.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/DSC_ScheduledTask.schema.mof new file mode 100644 index 0000000..941b833 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/DSC_ScheduledTask.schema.mof @@ -0,0 +1,50 @@ +[ClassVersion("1.0.0.0"), FriendlyName("ScheduledTask")] +class DSC_ScheduledTask : OMI_BaseResource +{ + [Key, Description("The name of the task.")] string TaskName; + [Write, Description("The path to the task - defaults to the root directory.")] string TaskPath; + [Write, Description("The task description.")] string Description; + [Write, Description("The path to the .exe for this task.")] string ActionExecutable; + [Write, Description("The arguments to pass the executable.")] string ActionArguments; + [Write, Description("The working path to specify for the executable.")] string ActionWorkingPath; + [Write, Description("When should the task be executed."), ValueMap{"Once", "Daily", "Weekly", "AtStartup", "AtLogOn", "OnEvent"}, Values{"Once", "Daily", "Weekly", "AtStartup", "AtLogOn", "OnEvent"}] string ScheduleType; + [Write, Description("How many units (minutes, hours, days) between each run of this task?")] String RepeatInterval; + [Write, Description("The time of day this task should start at - defaults to 12:00 AM. Not valid for AtLogon and AtStartup tasks.")] DateTime StartTime; + [Write, Description("Enable the scheduled task option to synchronize across time zones. This is enabled by including the timezone offset in the scheduled task trigger. Defaults to false which does not include the timezone offset.")] boolean SynchronizeAcrossTimeZone; + [Write, Description("Present if the task should exist, Absent if it should be removed."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] string Ensure; + [Write, Description("True if the task should be enabled, false if it should be disabled.")] boolean Enable; + [Write, Description("Run the task as one of the built in service accounts. When set ExecuteAsCredential will be ignored and LogonType will be set to 'ServiceAccount'."), ValueMap{"SYSTEM", "LOCAL SERVICE", "NETWORK SERVICE"}, Values{"SYSTEM", "LOCAL SERVICE", "NETWORK SERVICE"}] string BuiltInAccount; + [Write, Description("The credential this task should execute as. If not specified defaults to running as the local system account."), EmbeddedInstance("MSFT_Credential")] string ExecuteAsCredential; + [Write, Description("The gMSA (Group Managed Service Account) this task should execute as. Cannot be used in combination with ExecuteAsCredential or BuiltInAccount.")] string ExecuteAsGMSA; + [Write, Description("Specifies the interval between the days in the schedule. An interval of 1 produces a daily schedule. An interval of 2 produces an every-other day schedule.")] Uint32 DaysInterval; + [Write, Description("Specifies a random amount of time to delay the start time of the trigger. The delay time is a random time between the time the task triggers and the time that you specify in this setting.")] String RandomDelay; + [Write, Description("Specifies how long the repetition pattern repeats after the task starts. May be set to `Indefinitely` to specify an indefinite duration.")] String RepetitionDuration; + [Write, Description("Specifies an array of the days of the week on which Task Scheduler runs the task.")] String DaysOfWeek[]; + [Write, Description("Specifies the interval between the weeks in the schedule. An interval of 1 produces a weekly schedule. An interval of 2 produces an every-other week schedule.")] Uint32 WeeksInterval; + [Write, Description("Specifies the identifier of the user for a trigger that starts a task when a user logs on.")] String User; + [Write, Description("Indicates whether the task is prohibited to run on demand or not. Defaults to $false.")] Boolean DisallowDemandStart; + [Write, Description("Indicates whether the task is prohibited to be terminated or not. Defaults to $false.")] Boolean DisallowHardTerminate; + [Write, Description("The task compatibility level. Defaults to Vista."), ValueMap{"AT","V1","Vista","Win7","Win8"}, Values{"AT","V1","Vista","Win7","Win8"}] String Compatibility; + [Write, Description("Indicates whether the task should start if the machine is on batteries or not. Defaults to $false.")] Boolean AllowStartIfOnBatteries; + [Write, Description("Indicates that the task is hidden in the Task Scheduler UI.")] Boolean Hidden; + [Write, Description("Indicates that Task Scheduler runs the task only when the computer is idle.")] Boolean RunOnlyIfIdle; + [Write, Description("Specifies the amount of time that Task Scheduler waits for an idle condition to occur.")] String IdleWaitTimeout; + [Write, Description("Specifies the name of a network profile that Task Scheduler uses to determine if the task can run. The Task Scheduler UI uses this setting for display purposes. Specify a network name if you specify the RunOnlyIfNetworkAvailable parameter.")] String NetworkName; + [Write, Description("Indicates that the task does not start if the task is triggered to run in a Remote Applications Integrated Locally (RAIL) session.")] Boolean DisallowStartOnRemoteAppSession; + [Write, Description("Indicates that Task Scheduler can start the task at any time after its scheduled time has passed.")] Boolean StartWhenAvailable; + [Write, Description("Indicates that the task does not stop if the computer switches to battery power.")] Boolean DontStopIfGoingOnBatteries; + [Write, Description("Indicates that Task Scheduler wakes the computer before it runs the task.")] Boolean WakeToRun; + [Write, Description("Specifies the amount of time that the computer must be in an idle state before Task Scheduler runs the task.")] String IdleDuration; + [Write, Description("Indicates that Task Scheduler restarts the task when the computer cycles into an idle condition more than once.")] Boolean RestartOnIdle; + [Write, Description("Indicates that Task Scheduler does not terminate the task if the idle condition ends before the task is completed.")] Boolean DontStopOnIdleEnd; + [Write, Description("Specifies the amount of time that Task Scheduler is allowed to complete the task.")] String ExecutionTimeLimit; + [Write, Description("Specifies the policy that defines how Task Scheduler handles multiple instances of the task."), ValueMap{"IgnoreNew","Parallel","Queue", "StopExisting"}, Values{"IgnoreNew","Parallel","Queue", "StopExisting"}] String MultipleInstances; + [Write, Description("Specifies the priority level of the task. Priority must be an integer from 0 (highest priority) to 10 (lowest priority). The default value is 7. Priority levels 7 and 8 are used for background tasks. Priority levels 4, 5, and 6 are used for interactive tasks.")] Uint32 Priority; + [Write, Description("Specifies the number of times that Task Scheduler attempts to restart the task.")] Uint32 RestartCount; + [Write, Description("Specifies the amount of time that Task Scheduler attempts to restart the task.")] String RestartInterval; + [Write, Description("Indicates that Task Scheduler runs the task only when a network is available. Task Scheduler uses the NetworkID parameter and NetworkName parameter that you specify in this cmdlet to determine if the network is available.")] Boolean RunOnlyIfNetworkAvailable; + [Write, Description("Specifies the level of user rights that Task Scheduler uses to run the tasks that are associated with the principal. Defaults to 'Limited'."), ValueMap{"Limited","Highest"}, Values{"Limited","Highest"}] String RunLevel; + [Write, Description("Specifies the security logon method that Task Scheduler uses to run the tasks that are associated with the principal."), ValueMap{"Group","Interactive","InteractiveOrPassword","None","Password","S4U","ServiceAccount"}, Values{"Group","Interactive","InteractiveOrPassword","None","Password","S4U","ServiceAccount"}] String LogonType; + [Write, Description("Specifies the EventSubscription in XML. This can be easily generated using the Windows Eventlog Viewer. For the query schema please check: https://docs.microsoft.com/en-us/windows/desktop/WES/queryschema-schema. Can only be used in combination with ScheduleType OnEvent.")] String EventSubscription; + [Write, Description("Specifies a delay to the start of the trigger. The delay is a static delay before the task is executed. Can only be used in combination with ScheduleType OnEvent.")] String Delay; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/README.md new file mode 100644 index 0000000..efc6df4 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/README.md @@ -0,0 +1,39 @@ +# Description + +The resource is used to define basic run once or recurring scheduled tasks +on the local computer. It can also be used to delete or disable built-in +scheduled tasks. + +## Known Issues + +One of the values needed for the `MultipleInstances` parameter is missing from the +`Microsoft.PowerShell.Cmdletization.GeneratedTypes.ScheduledTask.MultipleInstancesEnum` +enumerator. There are four valid values defined for the `MultipleInstances` property of the +Task Settings ([TaskSettings.MultipleInstances Property](https://docs.microsoft.com/en-us/windows/win32/taskschd/tasksettings-multipleinstances "TaskSettings.MultipleInstances Property")). +The `MultipleInstancesEnum` enumerator has three values, which can be mapped to three +of the four valid values, but there is no value corresponding to `TASK_INSTANCES_STOP_EXISTING`. +The result of this omission is that a workaround is required to +accommodate the `StopExisting` value for the `MultipleInstances` parameter, +which would not be necessary if the enumerator had all four valid values. + +### ExecuteAsCredential + +#### When Using a BUILTIN Group + +When creating a scheduled task that uses an `ExecuteAsCredential` that +is one of the 'BUILTIN' groups (e.g. 'BUILTIN\Users'), specifying the +username to include the 'BUILTIN' domain name will result in the resource +never going into state. The same behavior will also occur if setting a +'BUILTIN' group in the UI. + +To prevent this issue, set the username in the `ExecuteAsCredential` to the +name of the group only (e.g. 'Users'). + +#### When Using a Domain User/Group + +When creating a scheduled task that uses an `ExecuteAsCredential` that +is a domain user or group, (e.g. 'CONTOSO\ServiceUser'), the domain +name must be included, otherwise the resource will not go into state. + +To prevent this issue, set the username in the `ExecuteAsCredential` to the +name of the group only (e.g. 'CONTOSO\ServiceUser'). diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/en-US/DSC_ScheduledTask.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/en-US/DSC_ScheduledTask.strings.psd1 new file mode 100644 index 0000000..8e6ef84 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_ScheduledTask/en-US/DSC_ScheduledTask.strings.psd1 @@ -0,0 +1,36 @@ +ConvertFrom-StringData @' + GetScheduledTaskMessage = Getting scheduled task '{0}' in '{1}'. + TaskNotFoundMessage = Task '{0}' not found in '{1}'. Returning an empty task with Ensure = "Absent". + TaskFoundMessage = Task '{0}' found in '{1}'. Retrieving settings, first action, first trigger and repetition settings. + TriggerTypeUnknown = Trigger type '{0}' not recognized. + DetectedScheduleTypeMessage = Detected schedule type '{0}' for first trigger. + SetScheduledTaskMessage = Setting scheduled task '{0}' in '{1}'. + DisablingExistingScheduledTask = Disabling existing scheduled task '{0}' in '{1}'. + RepetitionDurationLessThanIntervalError = Repetition duration '{0}' is less than repetition interval '{1}'. Please set RepeatInterval to a value lower or equal to RepetitionDuration. + DaysIntervalError = DaysInterval must be greater than zero (0) for Daily schedules. DaysInterval specified is '{0}'. + WeeksIntervalError = WeeksInterval must be greater than zero (0) for Weekly schedules. WeeksInterval specified is '{0}'. + WeekDayMissingError = At least one weekday must be selected for Weekly schedule. + OnEventSubscriptionError = No (valid) XML Event Subscription was provided. This is required when the scheduletype is OnEvent. + gMSAandCredentialError = Both ExecuteAsGMSA and (ExecuteAsCredential or BuiltInAccount) parameters have been specified. A task can run as a gMSA (Group Managed Service Account), a builtin service account or as a custom credential. Please modify your configuration to include just one of the three options. + SynchronizeAcrossTimeZoneInvalidScheduleType = Setting SynchronizeAcrossTimeZone to true when the ScheduleType is not Once, Daily or Weekly is not a valid configuration. Please keep the default value of false when using other schedule types. + TriggerCreationError = Error creating new scheduled task trigger. + ConfigureTriggerRepetitionMessage = Configuring trigger repetition. + RepetitionIntervalError = Repetition interval is set to '{0}' but repetition duration is '{1}'. + CreateRepetitionPatternMessage = Creating MSFT_TaskRepetitionPattern CIM instance to configure repetition in trigger. + CreateTemporaryTaskMessage = Creating temporary task and trigger to get MSFT_TaskRepetitionPattern CIM instance. + CreateTemporaryTriggerMessage = Creating temporary trigger to get MSFT_TaskRepetitionPattern CIM instance. + TriggerUnexpectedTypeError = Trigger object that was created was of unexpected type '{0}'. + CreateScheduledTaskPrincipalMessage = Creating scheduled task principal for account '{0}' using logon type '{1}'. + CreateNewScheduledTaskMessage = Creating new scheduled task '{0}' in '{1}'. + ConfigureTaskEventTrigger = Setting up an event based trigger on task {0}. + IgnoreRandomDelayWithTriggerTypeOnEvent = The parameter RandomDelay in task {0} is ignored. A random delay is not supported when the trigger type is set to OnEvent. + SetRepetitionTriggerMessage = Setting repetition trigger settings on task '{0}' in '{1}'. + RetrieveScheduledTaskMessage = Retrieving the scheduled task '{0}' from '{1}'. + RemoveScheduledTaskMessage = Removing scheduled task '{0}' from '{1}'. + UpdateScheduledTaskMessage = Updating scheduled task '{0}' in '{1}'. + TestScheduledTaskMessage = Testing scheduled task '{0}' in '{1}'. + GettingCurrentTaskValuesMessage = Getting current scheduled task values for task '{0}' in '{1}'. + CurrentTaskValuesRetrievedMessage = Current scheduled task values for task '{0}' in '{1}' retrieved. + CurrentTaskValuesNullMessage = Current scheduled values were null. + TestingDscParameterStateMessage = Testing DSC parameter state. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.data.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.data.psd1 new file mode 100644 index 0000000..dc2fb90 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.data.psd1 @@ -0,0 +1,46 @@ +@{ + smbServerSettings = @( + 'AnnounceComment' + 'AnnounceServer' + 'AsynchronousCredits' + 'AuditSmb1Access' + 'AutoDisconnectTimeout' + 'AutoShareServer' + 'AutoShareWorkstation' + 'CachedOpenLimit' + 'DurableHandleV2TimeoutInSeconds' + 'EnableAuthenticateUserSharing' + 'EnableDownlevelTimewarp' + 'EnableForcedLogoff' + 'EnableLeasing' + 'EnableMultiChannel' + 'EnableOplocks' + 'EnableSecuritySignature' + 'EnableSMB1Protocol' + 'EnableSMB2Protocol' + 'EnableStrictNameChecking' + 'EncryptData' + 'IrpStackSize' + 'KeepAliveTime' + 'MaxChannelPerSession' + 'MaxMpxCount' + 'MaxSessionPerConnection' + 'MaxThreadsPerQueue' + 'MaxWorkItems' + 'NullSessionPipes' + 'NullSessionShares' + 'OplockBreakWait' + 'PendingClientTimeoutInSeconds' + 'RejectUnencryptedAccess' + 'RequireSecuritySignature' + 'ServerHidden' + 'Smb2CreditsMax' + 'Smb2CreditsMin' + 'SmbServerNameHardeningLevel' + 'TreatHostAsStableStorage' + 'ValidateAliasNotCircular' + 'ValidateShareScope' + 'ValidateShareScopeNotAliased' + 'ValidateTargetName' + ) +} diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.psm1 new file mode 100644 index 0000000..2413bdf --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.psm1 @@ -0,0 +1,708 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) -Force + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +$resourceData = Import-LocalizedData ` + -BaseDirectory $PSScriptRoot ` + -FileName 'DSC_SmbServerConfiguration.data.psd1' + +$script:smbServerSettings = $resourceData.smbServerSettings + +<# + .SYNOPSIS + Returns the current state of the SMB Server. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance + ) + + Write-Verbose -Message ($script:localizedData.GetTargetResourceMessage -f $Name) + + $smbReturn = @{} + $smbServer = Get-SmbServerConfiguration -ErrorAction 'SilentlyContinue' + $smbReturn.Add('IsSingleInstance', $IsSingleInstance) + + foreach ($smbServerSetting in $script:smbServerSettings) + { + $smbReturn.Add($smbServerSetting, $smbServer.$smbServerSetting) + } + + return $smbReturn +} + +<# + .SYNOPSIS + Determines if the SMB Server is in the desired state. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER AnnounceComment + Specifies the announce comment string. + + .PARAMETER AnnounceServer + Indicates that this server announces itself by using browser announcements. + + .PARAMETER AsynchronousCredits + Specifies the asynchronous credits. + + .PARAMETER AuditSmb1Access + Enables auditing of SMB version 1 protocol in Windows Event Log. + + .PARAMETER AutoDisconnectTimeout + Specifies the auto disconnect time-out. + + .PARAMETER AutoShareServer + Specifies that the default server shares are shared out. + + .PARAMETER AutoShareWorkstation + Specifies whether the default workstation shares are shared out. + + .PARAMETER CachedOpenLimit + Specifies the maximum number of cached open files. + + .PARAMETER DurableHandleV2TimeoutInSeconds + Specifies the durable handle v2 time-out period, in seconds. + + .PARAMETER EnableAuthenticateUserSharing + Specifies whether authenticate user sharing is enabled. + + .PARAMETER EnableDownlevelTimewarp + Specifies whether down-level timewarp support is disabled. + + .PARAMETER EnableForcedLogoff + Specifies whether forced logoff is enabled. + + .PARAMETER EnableLeasing + Specifies whether leasing is disabled. + + .PARAMETER EnableMultiChannel + Specifies whether multi-channel is disabled. + + .PARAMETER EnableOplocks + Specifies whether the opportunistic locks are enabled. + + .PARAMETER EnableSMB1Protocol + Specifies whether the SMB1 protocol is enabled. + + .PARAMETER EnableSMB2Protocol + Specifies whether the SMB2 protocol is enabled. + + .PARAMETER EnableSecuritySignature + Specifies whether the security signature is enabled. + + .PARAMETER EnableStrictNameChecking + Specifies whether the server should perform strict name checking on incoming connects. + + .PARAMETER EncryptData + Specifies whether the sessions established on this server are encrypted. + + .PARAMETER IrpStackSize + Specifies the default IRP stack size. + + .PARAMETER KeepAliveTime + Specifies the keep alive time. + + .PARAMETER MaxChannelPerSession + Specifies the maximum channels per session. + + .PARAMETER MaxMpxCount + Specifies the maximum MPX count for SMB1. + + .PARAMETER MaxSessionPerConnection + Specifies the maximum sessions per connection. + + .PARAMETER MaxThreadsPerQueue + Specifies the maximum threads per queue. + + .PARAMETER MaxWorkItems + Specifies the maximum SMB1 work items. + + .PARAMETER NullSessionPipes + Specifies the null session pipes. + + .PARAMETER NullSessionShares + Specifies the null session shares. + + .PARAMETER OplockBreakWait + Specifies how long the create caller waits for an opportunistic lock break. + + .PARAMETER PendingClientTimeoutInSeconds + Specifies the pending client time-out period, in seconds. + + .PARAMETER RejectUnencryptedAccess + Specifies whether the client that does not support encryption is denied access if it attempts to connect to an encrypted share. + + .PARAMETER RequireSecuritySignature + Specifies whether the security signature is required. + + .PARAMETER ServerHidden + Specifies whether the server announces itself. + + .PARAMETER Smb2CreditsMax + Specifies the maximum SMB2 credits. + + .PARAMETER Smb2CreditsMin + Specifies the minimum SMB2 credits. + + .PARAMETER SmbServerNameHardeningLevel + Specifies the SMB Service name hardening level. + + .PARAMETER TreatHostAsStableStorage + Specifies whether the host is treated as the stable storage. + + .PARAMETER ValidateAliasNotCircular + Specifies whether the aliases that are not circular are validated. + + .PARAMETER ValidateShareScope + Specifies whether the existence of share scopes is checked during share creation. + + .PARAMETER ValidateShareScopeNotAliased + Specifies whether the share scope being aliased is validated. + + .PARAMETER ValidateTargetName + Specifies whether the target name is validated. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.String] + $AnnounceComment, + + [Parameter()] + [System.Boolean] + $AnnounceServer, + + [Parameter()] + [System.Uint32] + $AsynchronousCredits, + + [Parameter()] + [System.Boolean] + $AuditSmb1Access, + + [Parameter()] + [System.Uint32] + $AutoDisconnectTimeout, + + [Parameter()] + [System.Boolean] + $AutoShareServer, + + [Parameter()] + [System.Boolean] + $AutoShareWorkstation, + + [Parameter()] + [System.Uint32] + $CachedOpenLimit, + + [Parameter()] + [System.Uint32] + $DurableHandleV2TimeoutInSeconds, + + [Parameter()] + [System.Boolean] + $EnableAuthenticateUserSharing, + + [Parameter()] + [System.Boolean] + $EnableDownlevelTimewarp, + + [Parameter()] + [System.Boolean] + $EnableForcedLogoff, + + [Parameter()] + [System.Boolean] + $EnableLeasing, + + [Parameter()] + [System.Boolean] + $EnableMultiChannel, + + [Parameter()] + [System.Boolean] + $EnableOplocks, + + [Parameter()] + [System.Boolean] + $EnableSMB1Protocol, + + [Parameter()] + [System.Boolean] + $EnableSMB2Protocol, + + [Parameter()] + [System.Boolean] + $EnableSecuritySignature, + + [Parameter()] + [System.Boolean] + $EnableStrictNameChecking, + + [Parameter()] + [System.Boolean] + $EncryptData, + + [Parameter()] + [System.Uint32] + $IrpStackSize, + + [Parameter()] + [System.Uint32] + $KeepAliveTime, + + [Parameter()] + [System.Uint32] + $MaxChannelPerSession, + + [Parameter()] + [System.Uint32] + $MaxMpxCount, + + [Parameter()] + [System.Uint32] + $MaxSessionPerConnection, + + [Parameter()] + [System.Uint32] + $MaxThreadsPerQueue, + + [Parameter()] + [System.Uint32] + $MaxWorkItems, + + [Parameter()] + [System.String] + $NullSessionPipes, + + [Parameter()] + [System.String] + $NullSessionShares, + + [Parameter()] + [System.Uint32] + $OplockBreakWait, + + [Parameter()] + [System.Uint32] + $PendingClientTimeoutInSeconds, + + [Parameter()] + [System.Boolean] + $RejectUnencryptedAccess, + + [Parameter()] + [System.Boolean] + $RequireSecuritySignature, + + [Parameter()] + [System.Boolean] + $ServerHidden, + + [Parameter()] + [System.Uint32] + $Smb2CreditsMax, + + [Parameter()] + [System.Uint32] + $Smb2CreditsMin, + + [Parameter()] + [System.Uint32] + $SmbServerNameHardeningLevel, + + [Parameter()] + [System.Boolean] + $TreatHostAsStableStorage, + + [Parameter()] + [System.Boolean] + $ValidateAliasNotCircular, + + [Parameter()] + [System.Boolean] + $ValidateShareScope, + + [Parameter()] + [System.Boolean] + $ValidateShareScopeNotAliased, + + [Parameter()] + [System.Boolean] + $ValidateTargetName + ) + + $null = $PSBoundParameters.Remove('IsSingleInstance') + $null = $PSBoundParameters.Add('Confirm', $false) + + Write-Verbose -Message ($script:localizedData.UpdatingProperties) + + Set-SmbServerConfiguration @PSBoundParameters +} + +<# + .SYNOPSIS + Determines if the SMB Server is in the desired state. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER AnnounceComment + Specifies the announce comment string. + + .PARAMETER AnnounceServer + Indicates that this server announces itself by using browser announcements. + + .PARAMETER AsynchronousCredits + Specifies the asynchronous credits. + + .PARAMETER AuditSmb1Access + Enables auditing of SMB version 1 protocol in Windows Event Log. + + .PARAMETER AutoDisconnectTimeout + Specifies the auto disconnect time-out. + + .PARAMETER AutoShareServer + Specifies that the default server shares are shared out. + + .PARAMETER AutoShareWorkstation + Specifies whether the default workstation shares are shared out. + + .PARAMETER CachedOpenLimit + Specifies the maximum number of cached open files. + + .PARAMETER DurableHandleV2TimeoutInSeconds + Specifies the durable handle v2 time-out period, in seconds. + + .PARAMETER EnableAuthenticateUserSharing + Specifies whether authenticate user sharing is enabled. + + .PARAMETER EnableDownlevelTimewarp + Specifies whether down-level timewarp support is disabled. + + .PARAMETER EnableForcedLogoff + Specifies whether forced logoff is enabled. + + .PARAMETER EnableLeasing + Specifies whether leasing is disabled. + + .PARAMETER EnableMultiChannel + Specifies whether multi-channel is disabled. + + .PARAMETER EnableOplocks + Specifies whether the opportunistic locks are enabled. + + .PARAMETER EnableSMB1Protocol + Specifies whether the SMB1 protocol is enabled. + + .PARAMETER EnableSMB2Protocol + Specifies whether the SMB2 protocol is enabled. + + .PARAMETER EnableSecuritySignature + Specifies whether the security signature is enabled. + + .PARAMETER EnableStrictNameChecking + Specifies whether the server should perform strict name checking on incoming connects. + + .PARAMETER EncryptData + Specifies whether the sessions established on this server are encrypted. + + .PARAMETER IrpStackSize + Specifies the default IRP stack size. + + .PARAMETER KeepAliveTime + Specifies the keep alive time. + + .PARAMETER MaxChannelPerSession + Specifies the maximum channels per session. + + .PARAMETER MaxMpxCount + Specifies the maximum MPX count for SMB1. + + .PARAMETER MaxSessionPerConnection + Specifies the maximum sessions per connection. + + .PARAMETER MaxThreadsPerQueue + Specifies the maximum threads per queue. + + .PARAMETER MaxWorkItems + Specifies the maximum SMB1 work items. + + .PARAMETER NullSessionPipes + Specifies the null session pipes. + + .PARAMETER NullSessionShares + Specifies the null session shares. + + .PARAMETER OplockBreakWait + Specifies how long the create caller waits for an opportunistic lock break. + + .PARAMETER PendingClientTimeoutInSeconds + Specifies the pending client time-out period, in seconds. + + .PARAMETER RejectUnencryptedAccess + Specifies whether the client that does not support encryption is denied access if it attempts to connect to an encrypted share. + + .PARAMETER RequireSecuritySignature + Specifies whether the security signature is required. + + .PARAMETER ServerHidden + Specifies whether the server announces itself. + + .PARAMETER Smb2CreditsMax + Specifies the maximum SMB2 credits. + + .PARAMETER Smb2CreditsMin + Specifies the minimum SMB2 credits. + + .PARAMETER SmbServerNameHardeningLevel + Specifies the SMB Service name hardening level. + + .PARAMETER TreatHostAsStableStorage + Specifies whether the host is treated as the stable storage. + + .PARAMETER ValidateAliasNotCircular + Specifies whether the aliases that are not circular are validated. + + .PARAMETER ValidateShareScope + Specifies whether the existence of share scopes is checked during share creation. + + .PARAMETER ValidateShareScopeNotAliased + Specifies whether the share scope being aliased is validated. + + .PARAMETER ValidateTargetName + Specifies whether the target name is validated. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.String] + $AnnounceComment, + + [Parameter()] + [System.Boolean] + $AnnounceServer, + + [Parameter()] + [System.Uint32] + $AsynchronousCredits, + + [Parameter()] + [System.Boolean] + $AuditSmb1Access, + + [Parameter()] + [System.Uint32] + $AutoDisconnectTimeout, + + [Parameter()] + [System.Boolean] + $AutoShareServer, + + [Parameter()] + [System.Boolean] + $AutoShareWorkstation, + + [Parameter()] + [System.Uint32] + $CachedOpenLimit, + + [Parameter()] + [System.Uint32] + $DurableHandleV2TimeoutInSeconds, + + [Parameter()] + [System.Boolean] + $EnableAuthenticateUserSharing, + + [Parameter()] + [System.Boolean] + $EnableDownlevelTimewarp, + + [Parameter()] + [System.Boolean] + $EnableForcedLogoff, + + [Parameter()] + [System.Boolean] + $EnableLeasing, + + [Parameter()] + [System.Boolean] + $EnableMultiChannel, + + [Parameter()] + [System.Boolean] + $EnableOplocks, + + [Parameter()] + [System.Boolean] + $EnableSMB1Protocol, + + [Parameter()] + [System.Boolean] + $EnableSMB2Protocol, + + [Parameter()] + [System.Boolean] + $EnableSecuritySignature, + + [Parameter()] + [System.Boolean] + $EnableStrictNameChecking, + + [Parameter()] + [System.Boolean] + $EncryptData, + + [Parameter()] + [System.Uint32] + $IrpStackSize, + + [Parameter()] + [System.Uint32] + $KeepAliveTime, + + [Parameter()] + [System.Uint32] + $MaxChannelPerSession, + + [Parameter()] + [System.Uint32] + $MaxMpxCount, + + [Parameter()] + [System.Uint32] + $MaxSessionPerConnection, + + [Parameter()] + [System.Uint32] + $MaxThreadsPerQueue, + + [Parameter()] + [System.Uint32] + $MaxWorkItems, + + [Parameter()] + [System.String] + $NullSessionPipes, + + [Parameter()] + [System.String] + $NullSessionShares, + + [Parameter()] + [System.Uint32] + $OplockBreakWait, + + [Parameter()] + [System.Uint32] + $PendingClientTimeoutInSeconds, + + [Parameter()] + [System.Boolean] + $RejectUnencryptedAccess, + + [Parameter()] + [System.Boolean] + $RequireSecuritySignature, + + [Parameter()] + [System.Boolean] + $ServerHidden, + + [Parameter()] + [System.Uint32] + $Smb2CreditsMax, + + [Parameter()] + [System.Uint32] + $Smb2CreditsMin, + + [Parameter()] + [System.Uint32] + $SmbServerNameHardeningLevel, + + [Parameter()] + [System.Boolean] + $TreatHostAsStableStorage, + + [Parameter()] + [System.Boolean] + $ValidateAliasNotCircular, + + [Parameter()] + [System.Boolean] + $ValidateShareScope, + + [Parameter()] + [System.Boolean] + $ValidateShareScopeNotAliased, + + [Parameter()] + [System.Boolean] + $ValidateTargetName + ) + + Write-Verbose -Message ($script:localizedData.TestTargetResourceMessage) + + $resourceCompliant = $true + + $currentSmbServerConfiguration = Get-TargetResource -IsSingleInstance Yes + + foreach ($smbParameter in $script:smbServerSettings) + { + if ($PSBoundParameters.ContainsKey($smbParameter)) + { + Write-Verbose -Message ($script:localizedData.EvaluatingProperties ` + -f $smbParameter, $currentSmbServerConfiguration.$smbParameter, $PSBoundParameters.$smbParameter) + + if ($PSBoundParameters.$smbParameter -ne $currentSmbServerConfiguration.$smbParameter) + { + $resourceCompliant = $false + } + } + } + + return $resourceCompliant +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.schema.mof new file mode 100644 index 0000000..4c43458 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/DSC_SmbServerConfiguration.schema.mof @@ -0,0 +1,51 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("SmbServerConfiguration")] +class DSC_SmbServerConfiguration : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'"), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Specifies the announce comment string.")] String AnnounceComment; + [Write, Description("Specifies whether this server announces itself by using browser announcements.")] Boolean AnnounceServer; + [Write, Description("Specifies the asynchronous credits.")] UInt32 AsynchronousCredits; + [Write, Description("Enables auditing of SMB version 1 protocol in Windows Event Log.")] Boolean AuditSmb1Access; + [Write, Description("Specifies the auto disconnect time-out.")] UInt32 AutoDisconnectTimeout; + [Write, Description("Specifies that the default server shares are shared out.")] Boolean AutoShareServer; + [Write, Description("Specifies whether the default workstation shares are shared out.")] Boolean AutoShareWorkstation; + [Write, Description("Specifies the maximum number of cached open files.")] UInt32 CachedOpenLimit; + [Write, Description("Specifies the durable handle v2 time-out period, in seconds.")] UInt32 DurableHandleV2TimeoutInSeconds; + [Write, Description("Specifies whether authenticate user sharing is enabled.")] Boolean EnableAuthenticateUserSharing; + [Write, Description("Specifies whether down-level timewarp support is disabled.")] Boolean EnableDownlevelTimewarp; + [Write, Description("Specifies whether forced logoff is enabled.")] Boolean EnableForcedLogoff; + [Write, Description("Specifies whether leasing is disabled.")] Boolean EnableLeasing; + [Write, Description("Specifies whether multi-channel is disabled.")] Boolean EnableMultiChannel; + [Write, Description("Specifies whether the opportunistic locks are enabled.")] Boolean EnableOplocks; + [Write, Description("Specifies whether the SMB1 protocol is enabled.")] Boolean EnableSMB1Protocol; + [Write, Description("Specifies whether the SMB2 protocol is enabled.")] Boolean EnableSMB2Protocol; + [Write, Description("Specifies whether the security signature is enabled.")] Boolean EnableSecuritySignature; + [Write, Description("Specifies whether the server should perform strict name checking on incoming connects.")] Boolean EnableStrictNameChecking; + [Write, Description("Specifies whether the sessions established on this server are encrypted.")] Boolean EncryptData; + [Write, Description("Specifies the default IRP stack size.")] UInt32 IrpStackSize; + [Write, Description("Specifies the keep alive time.")] UInt32 KeepAliveTime; + [Write, Description("Specifies the maximum channels per session.")] UInt32 MaxChannelPerSession; + [Write, Description("Specifies the maximum MPX count for SMB1.")] UInt32 MaxMpxCount; + [Write, Description("Specifies the maximum sessions per connection.")] UInt32 MaxSessionPerConnection; + [Write, Description("Specifies the maximum threads per queue.")] UInt32 MaxThreadsPerQueue; + [Write, Description("Specifies the maximum SMB1 work items.")] UInt32 MaxWorkItems; + [Write, Description("Specifies the null session pipes.")] String NullSessionPipes; + [Write, Description("Specifies the null session shares.")] String NullSessionShares; + [Write, Description("Specifies how long the create caller waits for an opportunistic lock break.")] UInt32 OplockBreakWait; + [Write, Description("Specifies the pending client time-out period, in seconds.")] UInt32 PendingClientTimeoutInSeconds; + [Write, Description("Specifies whether the client that does not support encryption is denied access if it attempts to connect to an encrypted share.")] Boolean RejectUnencryptedAccess; + [Write, Description("Specifies whether the security signature is required.")] Boolean RequireSecuritySignature; + [Write, Description("Specifies whether the server announces itself.")] Boolean ServerHidden; + [Write, Description("Specifies the maximum SMB2 credits.")] UInt32 Smb2CreditsMax; + [Write, Description("Specifies the minimum SMB2 credits.")] UInt32 Smb2CreditsMin; + [Write, Description("Specifies the SMB Service name hardening level.")] UInt32 SmbServerNameHardeningLevel; + [Write, Description("Specifies whether the host is treated as the stable storage.")] Boolean TreatHostAsStableStorage; + [Write, Description("Specifies whether the aliases that are not circular are validated.")] Boolean ValidateAliasNotCircular; + [Write, Description("Specifies whether the existence of share scopes is checked during share creation.")] Boolean ValidateShareScope; + [Write, Description("Specifies whether the share scope being aliased is validated.")] Boolean ValidateShareScopeNotAliased; + [Write, Description("Specifies whether the target name is validated.")] Boolean ValidateTargetName; +}; + + + diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/README.md new file mode 100644 index 0000000..bad7af9 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/README.md @@ -0,0 +1,7 @@ +# Description + +The resource is used to manage SMB Server Settings. + +## Requirements + +Windows Server 2012 or newer. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/en-US/DSC_SmbServerConfiguration.schema.mfl b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/en-US/DSC_SmbServerConfiguration.schema.mfl new file mode 100644 index 0000000..6b862f4 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/en-US/DSC_SmbServerConfiguration.schema.mfl @@ -0,0 +1,47 @@ +[Write, Description("This resource is used to configure SMB Server.")] +class DSC_SmbServerConfiguration : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'"), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Specifies the announce comment string.")] String AnnounceComment; + [Write, Description("Specifies whether this server announces itself by using browser announcements.")] Boolean AnnounceServer; + [Write, Description("Specifies the asynchronous credits.")] UInt32 AsynchronousCredits; + [Write, Description("Enables auditing of SMB version 1 protocol in Windows Event Log.")] Boolean AuditSmb1Access; + [Write, Description("Specifies the auto disconnect time-out.")] UInt32 AutoDisconnectTimeout; + [Write, Description("Specifies that the default server shares are shared out.")] Boolean AutoShareServer; + [Write, Description("Specifies whether the default workstation shares are shared out.")] Boolean AutoShareWorkstation; + [Write, Description("Specifies the maximum number of cached open files.")] UInt32 CachedOpenLimit; + [Write, Description("Specifies the durable handle v2 time-out period, in seconds.")] UInt32 DurableHandleV2TimeoutInSeconds; + [Write, Description("Specifies whether authenticate user sharing is enabled.")] Boolean EnableAuthenticateUserSharing; + [Write, Description("Specifies whether down-level timewarp support is disabled.")] Boolean EnableDownlevelTimewarp; + [Write, Description("Specifies whether forced logoff is enabled.")] Boolean EnableForcedLogoff; + [Write, Description("Specifies whether leasing is disabled.")] Boolean EnableLeasing; + [Write, Description("Specifies whether multi-channel is disabled.")] Boolean EnableMultiChannel; + [Write, Description("Specifies whether the opportunistic locks are enabled.")] Boolean EnableOplocks; + [Write, Description("Specifies whether the SMB1 protocol is enabled.")] Boolean EnableSMB1Protocol; + [Write, Description("Specifies whether the SMB2 protocol is enabled.")] Boolean EnableSMB2Protocol; + [Write, Description("Specifies whether the security signature is enabled.")] Boolean EnableSecuritySignature; + [Write, Description("Specifies whether the server should perform strict name checking on incoming connects.")] Boolean EnableStrictNameChecking; + [Write, Description("Specifies whether the sessions established on this server are encrypted.")] Boolean EncryptData; + [Write, Description("Specifies the default IRP stack size.")] UInt32 IrpStackSize; + [Write, Description("Specifies the keep alive time.")] UInt32 KeepAliveTime; + [Write, Description("Specifies the maximum channels per session.")] UInt32 MaxChannelPerSession; + [Write, Description("Specifies the maximum MPX count for SMB1.")] UInt32 MaxMpxCount; + [Write, Description("Specifies the maximum sessions per connection.")] UInt32 MaxSessionPerConnection; + [Write, Description("Specifies the maximum threads per queue.")] UInt32 MaxThreadsPerQueue; + [Write, Description("Specifies the maximum SMB1 work items.")] UInt32 MaxWorkItems; + [Write, Description("Specifies the null session pipes.")] String NullSessionPipes; + [Write, Description("Specifies the null session shares.")] String NullSessionShares; + [Write, Description("Specifies how long the create caller waits for an opportunistic lock break.")] UInt32 OplockBreakWait; + [Write, Description("Specifies the pending client time-out period, in seconds.")] UInt32 PendingClientTimeoutInSeconds; + [Write, Description("Specifies whether the client that does not support encryption is denied access if it attempts to connect to an encrypted share.")] Boolean RejectUnencryptedAccess; + [Write, Description("Specifies whether the security signature is required.")] Boolean RequireSecuritySignature; + [Write, Description("Specifies whether the server announces itself.")] Boolean ServerHidden; + [Write, Description("Specifies the maximum SMB2 credits.")] UInt32 Smb2CreditsMax; + [Write, Description("Specifies the minimum SMB2 credits.")] UInt32 Smb2CreditsMin; + [Write, Description("Specifies the SMB Service name hardening level.")] UInt32 SmbServerNameHardeningLevel; + [Write, Description("Specifies whether the host is treated as the stable storage.")] Boolean TreatHostAsStableStorage; + [Write, Description("Specifies whether the aliases that are not circular are validated.")] Boolean ValidateAliasNotCircular; + [Write, Description("Specifies whether the existence of share scopes is checked during share creation.")] Boolean ValidateShareScope; + [Write, Description("Specifies whether the share scope being aliased is validated.")] Boolean ValidateShareScopeNotAliased; + [Write, Description("Specifies whether the target name is validated.")] Boolean ValidateTargetName; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/en-US/DSC_SmbServerConfiguration.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/en-US/DSC_SmbServerConfiguration.strings.psd1 new file mode 100644 index 0000000..3d3155d --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbServerConfiguration/en-US/DSC_SmbServerConfiguration.strings.psd1 @@ -0,0 +1,8 @@ +# Localized resources for WindowsOptionalFeature + +ConvertFrom-StringData @' + GetTargetResourceMessage = Getting the current state of the SMB Server. + TestTargetResourceMessage = Determining if the SMB Server is in the desired state. + EvaluatingProperties = Evaluating the '{0}' property of the SMB Server. Current value '{1}'. Requested value '{2}'. + UpdatingProperties = Updating properties on the SMB Server. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/DSC_SmbShare.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/DSC_SmbShare.psm1 new file mode 100644 index 0000000..06fd539 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/DSC_SmbShare.psm1 @@ -0,0 +1,853 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) -Force + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the SMB share. + + .PARAMETER Name + Specifies the name of the SMB share. + + .PARAMETER Path + Specifies the path of the SMB share. + + Not used in Get-TargetResource. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $Path + ) + + Write-Verbose -Message ($script:localizedData.GetTargetResourceMessage -f $Name) + + $returnValue = @{ + Ensure = 'Absent' + Name = $Name + Path = [System.String] $null + Description = [System.String] $null + ConcurrentUserLimit = 0 + EncryptData = $false + FolderEnumerationMode = [System.String] $null + CachingMode = [System.String] $null + ContinuouslyAvailable = $false + ShareState = [System.String] $null + ShareType = [System.String] $null + ShadowCopy = $false + Special = $false + ScopeName = [System.String] $null + } + + $accountsFullAccess = [system.string[]] @() + $accountsChangeAccess = [system.string[]] @() + $accountsReadAccess = [system.string[]] @() + $accountsNoAccess = [system.string[]] @() + + $smbShare = Get-SmbShare -Name $Name -ErrorAction 'SilentlyContinue' + + if ($smbShare) + { + $returnValue['Ensure'] = 'Present' + $returnValue['Name'] = $smbShare.Name + $returnValue['Path'] = $smbShare.Path + $returnValue['Description'] = $smbShare.Description + $returnValue['ConcurrentUserLimit'] = $smbShare.ConcurrentUserLimit + $returnValue['EncryptData'] = $smbShare.EncryptData + $returnValue['FolderEnumerationMode'] = $smbShare.FolderEnumerationMode.ToString() + $returnValue['CachingMode'] = $smbShare.CachingMode.ToString() + $returnValue['ContinuouslyAvailable'] = $smbShare.ContinuouslyAvailable + $returnValue['ShareState'] = $smbShare.ShareState.ToString() + $returnValue['ShareType'] = $smbShare.ShareType.ToString() + $returnValue['ShadowCopy'] = $smbShare.ShadowCopy + $returnValue['Special'] = $smbShare.Special + $returnValue['ScopeName'] = $smbShare.ScopeName + + $currentSmbShareAccessPermissions = Get-SmbShareAccess -Name $Name + + foreach ($access in $currentSmbShareAccessPermissions) + { + switch ($access.AccessRight) + { + 'Change' + { + if ($access.AccessControlType -eq 'Allow') + { + $accountsChangeAccess += @($access.AccountName) + } + } + + 'Read' + { + if ($access.AccessControlType -eq 'Allow') + { + $accountsReadAccess += @($access.AccountName) + } + } + + 'Full' + { + if ($access.AccessControlType -eq 'Allow') + { + $accountsFullAccess += @($access.AccountName) + } + + if ($access.AccessControlType -eq 'Deny') + { + $accountsNoAccess += @($access.AccountName) + } + } + } + } + } + else + { + Write-Verbose -Message ($script:localizedData.ShareNotFound -f $Name) + } + + <# + This adds either an empty array, or a populated array depending + if accounts with the respectively access was found. + #> + $returnValue['FullAccess'] = [System.String[]] $accountsFullAccess + $returnValue['ChangeAccess'] = [System.String[]] $accountsChangeAccess + $returnValue['ReadAccess'] = [System.String[]] $accountsReadAccess + $returnValue['NoAccess'] = [System.String[]] $accountsNoAccess + + return $returnValue +} + +<# + .SYNOPSIS + Creates or removes the SMB share. + + .PARAMETER Name + Specifies the name of the SMB share. + + .PARAMETER Path + Specifies the path of the SMB share. + + .PARAMETER Description + Specifies the description of the SMB share. + + .PARAMETER ConcurrentUserLimit + Specifies the maximum number of concurrently connected users that the + new SMB share may accommodate. If this parameter is set to zero (0), + then the number of users is unlimited. The default value is zero (0). + + .PARAMETER EncryptData + Indicates that the SMB share is encrypted. + + .PARAMETER FolderEnumerationMode + Specifies which files and folders in the new SMB share are visible to + users. { AccessBased | Unrestricted } + + .PARAMETER CachingMode + Specifies the caching mode of the offline files for the SMB share. + { 'None' | 'Manual' | 'Programs' | 'Documents' | 'BranchCache' } + + .PARAMETER ContinuouslyAvailable + Specifies whether the SMB share should be continuously available. + + .PARAMETER FullAccess + Specifies which accounts are granted full permission to access the + SMB share. + + .PARAMETER ChangeAccess + Specifies which accounts will be granted modify permission to access the + SMB share. + + .PARAMETER ReadAccess + Specifies which accounts is granted read permission to access the SMB share. + + .PARAMETER NoAccess + Specifies which accounts are denied access to the SMB share. + + .PARAMETER Ensure + Specifies if the SMB share should be added or removed. + + .PARAMETER ScopeName + Specifies the scope in which the share should be created. + + .PARAMETER Force + Specifies if the SMB share is allowed to be dropped and recreated (required + when the path changes). +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.UInt32] + $ConcurrentUserLimit, + + [Parameter()] + [System.Boolean] + $EncryptData, + + [Parameter()] + [ValidateSet('AccessBased', 'Unrestricted')] + [System.String] + $FolderEnumerationMode, + + [Parameter()] + [ValidateSet('None', 'Manual', 'Programs', 'Documents', 'BranchCache')] + [System.String] + $CachingMode, + + [Parameter()] + [System.Boolean] + $ContinuouslyAvailable, + + [Parameter()] + [System.String[]] + $FullAccess, + + [Parameter()] + [System.String[]] + $ChangeAccess, + + [Parameter()] + [System.String[]] + $ReadAccess, + + [Parameter()] + [System.String[]] + $NoAccess, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $ScopeName = '*', + + [Parameter()] + [System.Boolean] + $Force + ) + + Assert-AccessPermissionParameters @PSBoundParameters + + <# + Copy the $PSBoundParameters to a new hash table, so we have the + original intact. + #> + $smbShareParameters = @{} + $PSBoundParameters + + $currentSmbShareConfiguration = Get-TargetResource -Name $Name -Path $Path + + if ($currentSmbShareConfiguration.Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.IsPresent -f $Name) + + if ($Ensure -eq 'Present') + { + if ( + ($currentSmbShareConfiguration.Path -ne $Path -or + $currentSmbShareConfiguration.ScopeName -ne $ScopeName) -and + $Force + ) + { + Write-Verbose -Message ($script:localizedData.RecreateShare -f $Name) + + try + { + Remove-SmbShare -Name $Name -Force -ErrorAction Stop + New-SmbShare -Name $Name -Path $Path -ErrorAction Stop + } + catch + { + Write-Error -Message ($script:localizedData.RecreateShareError -f $Name, $_) + } + } + else + { + Write-Warning -Message ( + $script:localizedData.NoRecreateShare -f $Name, $currentSmbShareConfiguration.Path, $Path + ) + } + + Write-Verbose -Message $script:localizedData.UpdatingProperties + + $parametersToRemove = $smbShareParameters.Keys | + Where-Object -FilterScript { + $_ -in ('ChangeAccess','ReadAccess','FullAccess','NoAccess','Ensure','Path','Force') + } + + $parametersToRemove | ForEach-Object -Process { + $smbShareParameters.Remove($_) + } + + # Use Set-SmbShare for performing operations other than changing access + Set-SmbShare @smbShareParameters -Force -ErrorAction 'Stop' + + $smbShareAccessPermissionParameters = @{ + Name = $Name + } + + if ($PSBoundParameters.ContainsKey('FullAccess')) + { + $smbShareAccessPermissionParameters['FullAccess'] = $FullAccess + } + + if ($PSBoundParameters.ContainsKey('ChangeAccess')) + { + $smbShareAccessPermissionParameters['ChangeAccess'] = $ChangeAccess + } + + if ($PSBoundParameters.ContainsKey('ReadAccess')) + { + $smbShareAccessPermissionParameters['ReadAccess'] = $ReadAccess + } + + if ($PSBoundParameters.ContainsKey('NoAccess')) + { + $smbShareAccessPermissionParameters['NoAccess'] = $NoAccess + } + + # We should only pass the access collections that the user wants to enforce. + Remove-SmbShareAccessPermission @smbShareAccessPermissionParameters + + Add-SmbShareAccessPermission @smbShareAccessPermissionParameters + } + else + { + Write-Verbose -Message ($script:localizedData.RemoveShare -f $Name) + + Remove-SmbShare -name $Name -Force -ErrorAction 'Stop' + } + } + else + { + if ($Ensure -eq 'Present') + { + $smbShareParameters.Remove('Ensure') + $smbShareParameters.Remove('Force') + + Write-Verbose -Message ($script:localizedData.CreateShare -f $Name) + + <# + Remove access collections that are empty, since empty + collections are not allowed to be provided to the cmdlet + New-SmbShare. + #> + foreach ($accessProperty in ('ChangeAccess','ReadAccess','FullAccess','NoAccess')) + { + if ($smbShareParameters.ContainsKey($accessProperty) -and -not $smbShareParameters[$accessProperty]) + { + $smbShareParameters.Remove($accessProperty) + } + } + + New-SmbShare @smbShareParameters -ErrorAction 'Stop' + } + } +} + +<# + .SYNOPSIS + Determines if the SMB share is in the desired state. + + .PARAMETER Name + Specifies the name of the SMB share. + + .PARAMETER Path + Specifies the path of the SMB share. + + .PARAMETER Description + Specifies the description of the SMB share. + + .PARAMETER ConcurrentUserLimit + Specifies the maximum number of concurrently connected users that the + new SMB share may accommodate. If this parameter is set to zero (0), + then the number of users is unlimited. The default value is zero (0). + + .PARAMETER EncryptData + Indicates that the SMB share is encrypted. + + .PARAMETER FolderEnumerationMode + Specifies which files and folders in the new SMB share are visible to + users. { AccessBased | Unrestricted } + + .PARAMETER CachingMode + Specifies the caching mode of the offline files for the SMB share. + { 'None' | 'Manual' | 'Programs' | 'Documents' | 'BranchCache' } + + .PARAMETER ContinuouslyAvailable + Specifies whether the SMB share should be continuously available. + + .PARAMETER FullAccess + Specifies which accounts are granted full permission to access the + SMB share. + + .PARAMETER ChangeAccess + Specifies which accounts will be granted modify permission to access the + SMB share. + + .PARAMETER ReadAccess + Specifies which accounts is granted read permission to access the SMB share. + + .PARAMETER NoAccess + Specifies which accounts are denied access to the SMB share. + + .PARAMETER Ensure + Specifies if the SMB share should be added or removed. + + .PARAMETER ScopeName + Specifies the scope in which the share should be created. + + .PARAMETER Force + Specifies if the SMB share is allowed to be dropped and recreated (required + when the path changes). +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.UInt32] + $ConcurrentUserLimit, + + [Parameter()] + [System.Boolean] + $EncryptData, + + [Parameter()] + [ValidateSet('AccessBased', 'Unrestricted')] + [System.String] + $FolderEnumerationMode, + + [Parameter()] + [ValidateSet('None', 'Manual', 'Programs', 'Documents', 'BranchCache')] + [System.String] + $CachingMode, + + [Parameter()] + [System.Boolean] + $ContinuouslyAvailable, + + [Parameter()] + [System.String[]] + $FullAccess, + + [Parameter()] + [System.String[]] + $ChangeAccess, + + [Parameter()] + [System.String[]] + $ReadAccess, + + [Parameter()] + [System.String[]] + $NoAccess, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $ScopeName = '*', + + [Parameter()] + [System.Boolean] + $Force + ) + + $null = $PSBoundParameters.Remove('Force') + + Assert-AccessPermissionParameters @PSBoundParameters + + Write-Verbose -Message ($script:localizedData.TestTargetResourceMessage -f $Name) + + $resourceRequiresUpdate = $false + + $currentSmbShareConfiguration = Get-TargetResource -Name $Name -Path $Path + + if ($currentSmbShareConfiguration.Ensure -eq $Ensure) + { + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ( + '{0} {1}' -f ` + ($script:localizedData.IsPresent -f $Name), + $script:localizedData.EvaluatingProperties + ) + + <# + Using $VerbosePreference so that the verbose messages in + Test-DscParameterState is outputted, if the user requested + verbose messages. + #> + $resourceRequiresUpdate = Test-DscParameterState ` + -CurrentValues $currentSmbShareConfiguration ` + -DesiredValues $PSBoundParameters ` + -Verbose:$VerbosePreference + } + else + { + Write-Verbose -Message ($script:localizedData.IsAbsent -f $Name) + + $resourceRequiresUpdate = $true + } + } + + return $resourceRequiresUpdate +} + +<# + .SYNOPSIS + Removes the access permission for accounts that are no longer part + of the respectively access collections (FullAccess, ChangeAccess, + ReadAccess, and NoAccess). + + .PARAMETER Name + The name of the SMB share for which to remove access permission. + + .PARAMETER FullAccess + A string collection of account names that _should have_ full access + permission. The accounts not in this collection will be removed from + the SMB share. + + .PARAMETER ChangeAccess + A string collection of account names that _should have_ change access + permission. The accounts not in this collection will be removed from + the SMB share. + + .PARAMETER ReadAccess + A string collection of account names that _should have_ read access + permission. The accounts not in this collection will be removed from + the SMB share. + + .PARAMETER NoAccess + A string collection of account names that _should be_ denied access + to the SMB share. The accounts not in this collection will be removed + from the SMB share. + + .NOTES + The access permission is only removed if the parameter was passed + into the function. +#> +function Remove-SmbShareAccessPermission +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.String[]] + $FullAccess, + + [Parameter()] + [System.String[]] + $ChangeAccess, + + [Parameter()] + [System.String[]] + $ReadAccess, + + [Parameter()] + [System.String[]] + $NoAccess + ) + + $currentSmbShareAccessPermissions = Get-SmbShareAccess -Name $Name + + <# + First all access must be removed for accounts that should not + have permission, or should be unblocked (those that was denied + access). After that we can add new accounts using the function + Add-SmbShareAccessPermission. + #> + foreach ($smbShareAccess in $currentSmbShareAccessPermissions) + { + switch ($smbShareAccess.AccessControlType) + { + 'Allow' + { + $shouldRevokeAccess = $false + + foreach ($accessRight in 'Change','Read','Full') + { + $accessRightVariableName = '{0}Access' -f $accessRight + $shouldRevokeAccess = $shouldRevokeAccess ` + -or ( + $smbShareAccess.AccessRight -eq $accessRight ` + -and $PSBoundParameters.ContainsKey($accessRightVariableName) ` + -and $smbShareAccess.AccountName -notin $PSBoundParameters[$accessRightVariableName] + ) + } + + if ($shouldRevokeAccess) + { + Write-Verbose -Message ($script:localizedData.RevokeAccess -f $smbShareAccess.AccountName, $Name) + + Revoke-SmbShareAccess -Name $Name -AccountName $smbShareAccess.AccountName -Force -ErrorAction 'Stop' + } + } + + 'Deny' + { + if ($smbShareAccess.AccessRight -eq 'Full') + { + if ($PSBoundParameters.ContainsKey('NoAccess') -and $smbShareAccess.AccountName -notin $NoAccess) + { + Write-Verbose -Message ($script:localizedData.UnblockAccess -f $smbShareAccess.AccountName, $Name) + + Unblock-SmbShareAccess -Name $Name -AccountName $smbShareAccess.AccountName -Force -ErrorAction 'Stop' + } + } + } + } + } +} + +<# + .SYNOPSIS + Add the access permission to the SMB share for accounts, in the + respectively access collections (FullAccess, ChangeAccess, + ReadAccess, and NoAccess), that do not yet have access. + + .PARAMETER Name + The name of the SMB share to add access permission to. + + .PARAMETER FullAccess + A string collection of account names that should have full access + permission. The accounts in this collection will be added to the + SMB share. + + .PARAMETER ChangeAccess + A string collection of account names that should have change access + permission. The accounts in this collection will be added to the + SMB share. + + .PARAMETER ReadAccess + A string collection of account names that should have read access + permission. The accounts in this collection will be added to the + SMB share. + + .PARAMETER NoAccess + A string collection of account names that should be denied access + to the SMB share. The accounts in this collection will be added to + the SMB share. +#> +function Add-SmbShareAccessPermission +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.String[]] + $FullAccess, + + [Parameter()] + [System.String[]] + $ChangeAccess, + + [Parameter()] + [System.String[]] + $ReadAccess, + + [Parameter()] + [System.String[]] + $NoAccess + ) + + $currentSmbShareAccessPermissions = Get-SmbShareAccess -Name $Name + + $accessRights = @{ + ReadAccess = 'Read' + ChangeAccess = 'Change' + FullAccess = 'Full' + } + + foreach ($accessRight in $accessRights.GetEnumerator()) + { + if ($PSBoundParameters.ContainsKey($accessRight.Key)) + { + # Get already added account names. + $smbShareAccessObjects = $currentSmbShareAccessPermissions | Where-Object -FilterScript { + $_.AccessControlType -eq 'Allow' -and + $_.AccessRight -eq $accessRight.Value + } + + # Get a collection of just the account names. + $accessAccountNames = @($smbShareAccessObjects.AccountName) + + $newAccountsToHaveAccess = $PSBoundParameters[$accessRight.Key] | Where-Object -FilterScript { + $_ -notin $accessAccountNames + } + + # Add new accounts that should have permission. + $newAccountsToHaveAccess | ForEach-Object -Process { + Write-Verbose -Message ($script:localizedData.GrantAccess -f $accessRight.Value, $_, $Name) + + Grant-SmbShareAccess -Name $Name -AccountName $_ -AccessRight $accessRight.Value -Force -ErrorAction 'Stop' + } + } + } + + if ($PSBoundParameters.ContainsKey('NoAccess')) + { + # Get already added account names. + $smbShareNoAccessObjects = $currentSmbShareAccessPermissions | Where-Object -FilterScript { + $_.AccessControlType -eq 'Deny' -and + $_.AccessRight -eq 'Full' + } + + # Get a collection of just the account names. + $noAccessAccountNames = @($smbShareNoAccessObjects.AccountName) + + $newAccountsToHaveNoAccess = $NoAccess | Where-Object -FilterScript { + $_ -notin $noAccessAccountNames + } + + # Add new accounts that should be denied permission. + $newAccountsToHaveNoAccess | ForEach-Object -Process { + Write-Verbose -Message ($script:localizedData.DenyAccess -f $_, $Name) + + Block-SmbShareAccess -Name $Name -AccountName $_ -Force -ErrorAction 'Stop' + } + } +} + +<# + .SYNOPSIS + Assert that not only empty collections are passed in the + respectively access permission collections (FullAccess, + ChangeAccess, ReadAccess, and NoAccess). + + .PARAMETER Name + The name of the SMB share to add access permission to. + + .PARAMETER FullAccess + A string collection of account names that should have full access + permission. The accounts in this collection will be added to the + SMB share. + + .PARAMETER ChangeAccess + A string collection of account names that should have change access + permission. The accounts in this collection will be added to the + SMB share. + + .PARAMETER ReadAccess + A string collection of account names that should have read access + permission. The accounts in this collection will be added to the + SMB share. + + .PARAMETER NoAccess + A string collection of account names that should be denied access + to the SMB share. The accounts in this collection will be added to + the SMB share. + + .PARAMETER RemainingParameters + Container for the rest of the potentially splatted parameters from + the $PSBoundParameters object. + + .NOTES + The group 'Everyone' is automatically given read access by + the cmdlet New-SmbShare if all access permission parameters + (FullAccess, ChangeAccess, ReadAccess, NoAccess) is set to @(). + For that reason we need neither of the parameters, or at least + one to specify an account. +#> +function Assert-AccessPermissionParameters +{ + param + ( + [Parameter()] + [System.String[]] + $FullAccess, + + [Parameter()] + [System.String[]] + $ChangeAccess, + + [Parameter()] + [System.String[]] + $ReadAccess, + + [Parameter()] + [System.String[]] + $NoAccess, + + [Parameter(ValueFromRemainingArguments)] + [System.Collections.Generic.List`1[System.Object]] + $RemainingParameters + ) + + <# + First check if ReadAccess is monitored (part of the configuration). + If it is not monitored, then we don't need to worry if Everyone is + added. + #> + if ($PSBoundParameters.ContainsKey('ReadAccess') -and -not $ReadAccess) + { + $fullAccessIsEmpty = $PSBoundParameters.ContainsKey('FullAccess') -and -not $FullAccess + $changeAccessIsEmpty = $PSBoundParameters.ContainsKey('ChangeAccess') -and -not $ChangeAccess + $noAccessIsEmpty = $PSBoundParameters.ContainsKey('NoAccess') -and -not $NoAccess + + <# + If ReadAccess should have no members, then we need at least one + member in one of the other access permission collections. + #> + if ($fullAccessIsEmpty -and $changeAccessIsEmpty -and $noAccessIsEmpty) + { + New-InvalidArgumentException -Message $script:localizedData.InvalidAccessParametersCombination -ArgumentName 'FullAccess, ChangeAccess, ReadAccess, NoAccess' + } + } +} diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/DSC_SmbShare.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/DSC_SmbShare.schema.mof new file mode 100644 index 0000000..2c00fff --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/DSC_SmbShare.schema.mof @@ -0,0 +1,27 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("SmbShare")] +class DSC_SmbShare : OMI_BaseResource +{ + [Key, Description("Specifies the name of the SMB share.")] String Name; + [Required, Description("Specifies the path of the SMB share.")] String Path; + [Write, Description("Specifies the description of the SMB share.")] String Description; + [Write, Description("Specifies which accounts will be granted modify permission to access the SMB share.")] String ChangeAccess[]; + [Write, Description("Specifies the maximum number of concurrently connected users that the new SMB share may accommodate. If this parameter is set to zero (0), then the number of users is unlimited. The default value is zero (0).")] Uint32 ConcurrentUserLimit; + [Write, Description("Indicates that the SMB share is encrypted.")] Boolean EncryptData; + [Write, Description("Specifies which files and folders in the new SMB share are visible to users."), ValueMap{"AccessBased","Unrestricted"}, Values{"AccessBased","Unrestricted"}] String FolderEnumerationMode; + [Write, Description("Specifies the caching mode of the offline files for the SMB share."), ValueMap{"None","Manual","Programs","Documents","BranchCache"}, Values{"None","Manual","Programs","Documents","BranchCache"}] String CachingMode; + [Write, Description("Specifies whether the SMB share should be continuously available.")] Boolean ContinuouslyAvailable; + [Write, Description("Specifies which accounts are granted full permission to access the SMB share.")] String FullAccess[]; + [Write, Description("Specifies which accounts are denied access to the SMB share.")] String NoAccess[]; + [Write, Description("Specifies which accounts is granted read permission to access the SMB share.")] String ReadAccess[]; + [Write, Description("Specifies if the SMB share should be added or removed."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Specifies if the SMB share is allowed to be dropped and recreated (required when the path changes).")] Boolean Force; + [Write, Description("Specifies the scope in which the share should be created.")] String ScopeName; + [Read, Description("Specifies the state of the SMB share.")] String ShareState; + [Read, Description("Specifies the type of the SMB share.")] String ShareType; + [Read, Description("Specifies if this SMB share is a ShadowCopy.")] Boolean ShadowCopy; + [Read, Description("Specifies if this SMB share is a special share. E.g. an admin share, default shares, or IPC$ share.")] Boolean Special; +}; + + + diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/README.md new file mode 100644 index 0000000..064cc21 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/README.md @@ -0,0 +1,40 @@ +# Description + +The resource is used to manage SMB shares, and access permissions to +SMB shares. + +## Requirements + +### Cluster Shares + +The property `ContinuouslyAvailable` can only be set to `$true` when +the SMB share is a cluster share in a failover cluster. Also in the blog +[SMB Transparent Failover – making file shares continuously available](https://blogs.technet.microsoft.com/filecab/2016/03/25/smb-transparent-failover-making-file-shares-continuously-available-2) +by [Claus Joergensen](https://github.com/clausjor) it is mentioned that +SMB Transparent Failover does not support cluster disks with 8.3 name +generation enabled. + +### Access permissions + +It is not allowed to provide empty collections in the configuration for +the access permissions parameters. The configuration below will cause an +exception to be thrown. + +```powershell +SmbShare 'Integration_Test' +{ + Name = 'TestShare' + Path = 'C:\Temp' + FullAccess = @() + ChangeAccess = @() + ReadAccess = @() + NoAccess = @() +} +``` + +The access permission parameters must either be all removed to manage +the access permission manually, or add at least one member to one of +the access permission parameters. If all the access permission parameters +are removed, then by design, the cmdlet New-SmbShare will add +the *Everyone* group with read access permission to the SMB share. +To prevent that, add a member to either access permission parameters. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/en-US/DSC_SmbShare.schema.mfl b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/en-US/DSC_SmbShare.schema.mfl new file mode 100644 index 0000000..299a9d3 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/en-US/DSC_SmbShare.schema.mfl @@ -0,0 +1,21 @@ +[Description("This resource is used to configure SMB shares.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_SmbShare : OMI_BaseResource +{ + [Key, Description("Specifies the name of the SMB share.") : Amended] String Name; + [Description("Specifies the path of the SMB share.") : Amended] String Path; + [Description("Specifies the description of the SMB share.") : Amended] String Description; + [Description("Specifies which accounts will be granted modify permission to access the SMB share.") : Amended] String ChangeAccess[]; + [Description("Specifies the maximum number of concurrently connected users that the new SMB share may accommodate. If this parameter is set to zero (0), then the number of users is unlimited. The default value is zero (0).") : Amended] Uint32 ConcurrentUserLimit; + [Description("Indicates that the SMB share is encrypted.") : Amended] Boolean EncryptData; + [Description("Specifies which files and folders in the new SMB share are visible to users.") : Amended] String FolderEnumerationMode; + [Description("Specifies the caching mode of the offline files for the SMB share.") : Amended] String CachingMode; + [Description("Specifies whether the SMB share should be continuously available.") : Amended] Boolean ContinuouslyAvailable; + [Description("Specifies which accounts are granted full permission to access the SMB share.") : Amended] String FullAccess[]; + [Description("Specifies which accounts are denied access to the SMB share.") : Amended] String NoAccess[]; + [Description("Specifies which accounts is granted read permission to access the SMB share.") : Amended] String ReadAccess[]; + [Description("Specifies if the SMB share should be added or removed.") : Amended] String Ensure; + [Description("Specifies the state of the SMB share.") : Amended] String ShareState; + [Description("Specifies the type of the SMB share.") : Amended] String ShareType; + [Description("Specifies if this SMB share is a ShadowCopy.") : Amended] String ShadowCopy; + [Description("Specifies if this SMB share is a special share. E.g. an admin share, default shares, or IPC$ share.") : Amended] String Special; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/en-US/DSC_SmbShare.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/en-US/DSC_SmbShare.strings.psd1 new file mode 100644 index 0000000..74c4ef2 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SmbShare/en-US/DSC_SmbShare.strings.psd1 @@ -0,0 +1,21 @@ +# Localized resources for WindowsOptionalFeature + +ConvertFrom-StringData @' + GetTargetResourceMessage = Getting the current state of the SMB share '{0}'. + TestTargetResourceMessage = Determining if the SMB share '{0}' is in the desired state. + ShareNotFound = Unable to find a SMB share with the name '{0}'. + IsPresent = The SMB share with the name '{0}' exist. + IsAbsent = The SMB share with the name '{0}' does not exist. + EvaluatingProperties = Evaluating the properties of the SMB share. + UpdatingProperties = Updating properties on the SMB share that are not in desired state. + RemoveShare = Removing the SMB share with the name '{0}'. + CreateShare = Creating a SMB share with the name '{0}'. + RecreateShare = Dropping and recreating share with name '{0}' + RecreateShareError = Failed to recreate share with name '{0}'. The error was: '{1}'. + NoRecreateShare = The share with name '{0}' exists on path {1}, desired state is on path {2}. Set Force = $true to allow drop and recreate of the share. + RevokeAccess = Revoking granted permission for account '{0}' on the SMB share with the name '{1}'. + UnblockAccess = Revoking denied permission for account '{0}' on the SMB share with the name '{1}'. + GrantAccess = Granting '{0}' permission for account '{1}' on the SMB share with the name '{2}'. + DenyAccess = Denying permission for account '{0}' on the SMB share with the name '{1}'. + InvalidAccessParametersCombination = Not allowed to have all access permission parameters set to empty collections. Must either remove the access permission parameters completely, or add at least one member to one of the access permission parameters. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/DSC_SystemLocale.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/DSC_SystemLocale.psm1 new file mode 100644 index 0000000..0b40865 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/DSC_SystemLocale.psm1 @@ -0,0 +1,191 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) -Force + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current System Local on the node. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER SystemLocale + Specifies the System Locale. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [System.String] + $SystemLocale + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingSystemLocaleMessage) + ) -join '' ) + + # Get the current System Locale + $currentSystemLocale = Get-WinSystemLocale ` + -ErrorAction Stop + + # Generate the return object. + $returnValue = @{ + IsSingleInstance = $IsSingleInstance + SystemLocale = $currentSystemLocale.Name + } + + return $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Sets the current System Locale on the node. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER SystemLocale + Specifies the System Locale. +#> +function Set-TargetResource +{ + # Suppressing this rule because $global:DSCMachineStatus is used to trigger a reboot when there are pending changes. + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [System.String] + $SystemLocale + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingSystemLocaleMessage) + ) -join '' ) + + # Get the current System Locale + $currentSystemLocale = Get-WinSystemLocale ` + -ErrorAction Stop + + if ($currentSystemLocale.Name -ne $SystemLocale) + { + Set-WinSystemLocale ` + -SystemLocale $SystemLocale ` + -ErrorAction Stop + + $global:DSCMachineStatus = 1 + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SystemLocaleUpdatedMessage -f $SystemLocale) + ) -join '' ) + } +} # Set-TargetResource + +<# + .SYNOPSIS + Tests if the current System Locale on the node needs to be changed. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER SystemLocale + Specifies the System Locale. + + .OUTPUTS + Returns false if the System Locale needs to be changed or true if it is correct. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [System.String] + $SystemLocale + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingSystemLocaleMessage) + ) -join '' ) + + if (-not (Test-SystemLocaleValue -SystemLocale $SystemLocale)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidSystemLocaleError -f $SystemLocale) ` + -ArgumentName 'SystemLocale' + } # if + + # Get the current System Locale + $currentSystemLocale = Get-WinSystemLocale ` + -ErrorAction Stop + + if ($currentSystemLocale.Name -ne $SystemLocale) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SystemLocaleParameterNeedsUpdateMessage -f ` + $currentSystemLocale.Name,$SystemLocale) + ) -join '' ) + + return $false + } + return $true +} # Test-TargetResource + +<# + .SYNOPSIS + Checks the provided System Locale against the list of valid cultures. + + .PARAMETER SystemLocale + The System Locale to check the validitiy of. +#> +function Test-SystemLocaleValue +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $SystemLocale + ) + + $validCultures = [System.Globalization.CultureInfo]::GetCultures(` + [System.Globalization.CultureTypes]::AllCultures` + ).name + + return ($SystemLocale -in $validCultures) +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/DSC_SystemLocale.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/DSC_SystemLocale.schema.mof new file mode 100644 index 0000000..caaf3ee --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/DSC_SystemLocale.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("SystemLocale")] +class DSC_SystemLocale : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'"), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Required, Description("Specifies the System Locale.")] String SystemLocale; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/README.md new file mode 100644 index 0000000..e509055 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/README.md @@ -0,0 +1,10 @@ +# Description + +Ths resource is used set the system locale on a Windows machine. + +To get a list of valid Windows System Locales use the command: +`[System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures).name` + +If the System Locale is changed by this resource, it will require the node +to reboot. If the LCM is not configured to allow restarting, the configuration +will not be able to be applied until a manual restart occurs. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/en-US/DSC_SystemLocale.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/en-US/DSC_SystemLocale.strings.psd1 new file mode 100644 index 0000000..3923e6d --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_SystemLocale/en-US/DSC_SystemLocale.strings.psd1 @@ -0,0 +1,9 @@ +# culture="en-US" +ConvertFrom-StringData -StringData @' + GettingSystemLocaleMessage = Getting Windows system locale. + SettingSystemLocaleMessage = Setting Windows system locale. + SystemLocaleUpdatedMessage = Windows system locale updated to "{0}". A system restart is required. + TestingSystemLocaleMessage = Testing Windows system locale. + SystemLocaleParameterNeedsUpdateMessage = Windows system locale is "{0}" but should be "{1}". Change required. + InvalidSystemLocaleError = The Windows system locale "{0}" is invalid. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/DSC_TimeZone.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/DSC_TimeZone.psm1 new file mode 100644 index 0000000..d7aee5e --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/DSC_TimeZone.psm1 @@ -0,0 +1,125 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings. +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current time zone of the node. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER TimeZone + Specifies the time zone. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $TimeZone + ) + + Write-Verbose -Message ($script:localizedData.GettingTimeZoneMessage) + + # Get the current time zone Id. + $currentTimeZone = Get-TimeZoneId + + $returnValue = @{ + IsSingleInstance = 'Yes' + TimeZone = $currentTimeZone + } + + # Output the target resource. + return $returnValue +} + +<# + .SYNOPSIS + Sets the current time zone of the node. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER TimeZone + Specifies the time zone. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $TimeZone + ) + + $currentTimeZone = Get-TimeZoneId + + if ($currentTimeZone -ne $TimeZone) + { + Write-Verbose -Message ($script:localizedData.SettingTimeZoneMessage) + Set-TimeZoneId -TimeZone $TimeZone + } + else + { + Write-Verbose -Message ($script:localizedData.TimeZoneAlreadySetMessage -f $TimeZone) + } +} + +<# + .SYNOPSIS + Tests the current time zone of the node. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER TimeZone + Specifies the time zone. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $TimeZone + ) + + Write-Verbose -Message ($script:localizedData.TestingTimeZoneMessage) + + return Test-TimeZoneId -TimeZoneId $TimeZone +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/DSC_TimeZone.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/DSC_TimeZone.schema.mof new file mode 100644 index 0000000..e272ca8 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/DSC_TimeZone.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("TimeZone")] +class DSC_TimeZone : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Required, Description("Specifies the TimeZone.")] String TimeZone; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/README.md new file mode 100644 index 0000000..871a701 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/README.md @@ -0,0 +1,7 @@ +# Description + +The resource will use the `Get-TimeZone` cmdlet to get the current +time zone. If `Get-TimeZone` is not available them CIM will be used to retrieve +the current time zone. To update the time zone, .NET reflection will be used to +update the time zone if required. If .NET reflection is not supported on the node +(in the case of Nano Server) then tzutil.exe will be used to set the time zone. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/en-US/DSC_TimeZone.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/en-US/DSC_TimeZone.strings.psd1 new file mode 100644 index 0000000..896ca1d --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_TimeZone/en-US/DSC_TimeZone.strings.psd1 @@ -0,0 +1,7 @@ +# culture="en-US" +ConvertFrom-StringData -StringData @' + GettingTimeZoneMessage = Getting the time zone. + SettingTimeZoneMessage = Setting the time zone. + TimeZoneAlreadySetMessage = Time zone already set to {0}. + TestingTimeZoneMessage = Testing the time zone. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/DSC_UserAccountControl.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/DSC_UserAccountControl.psm1 new file mode 100644 index 0000000..b740d7c --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/DSC_UserAccountControl.psm1 @@ -0,0 +1,591 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +$script:registryKey = 'HKLM:\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System' + +$script:granularUserAccountControlParameterNames = @( + 'FilterAdministratorToken' + 'ConsentPromptBehaviorAdmin' + 'ConsentPromptBehaviorUser' + 'EnableInstallerDetection' + 'ValidateAdminCodeSignatures' + 'EnableLua' + 'PromptOnSecureDesktop' + 'EnableVirtualization' +) + +<# + .SYNOPSIS + Gets the current state of the User Account Control. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER SuppressRestart + Specifies if a restart of the node should be suppressed. By default the + node will be restarted if the value is changed. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + # This is best practice when writing a single-instance DSC resource. + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.Boolean] + $SuppressRestart = $false + ) + + Write-Verbose -Message $script:localizedData.GettingStateMessage + + $userAccountControlValues = Get-UserAccountControl + + $returnValue = @{ + IsSingleInstance = 'Yes' + NotificationLevel = Get-NotificationLevel + FilterAdministratorToken = $userAccountControlValues.FilterAdministratorToken + ConsentPromptBehaviorAdmin = $userAccountControlValues.ConsentPromptBehaviorAdmin + ConsentPromptBehaviorUser = $userAccountControlValues.ConsentPromptBehaviorUser + EnableInstallerDetection = $userAccountControlValues.EnableInstallerDetection + ValidateAdminCodeSignatures = $userAccountControlValues.ValidateAdminCodeSignatures + EnableLua = $userAccountControlValues.EnableLua + PromptOnSecureDesktop = $userAccountControlValues.PromptOnSecureDesktop + EnableVirtualization = $userAccountControlValues.EnableVirtualization + SuppressRestart = $SuppressRestart + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the current state of the User Account Control. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER NotificationLevel + Specifies the desired notification level for the User Account Control + setting. This parameter can not be used at the same time as any of the + granular parameters. + + .PARAMETER FilterAdministratorToken + Specifies the mode for the built-in administrator account (RID 500). + + .PARAMETER ConsentPromptBehaviorAdmin + Specifies the prompt behavior for the Consent Administrator. + + .PARAMETER ConsentPromptBehaviorUser + Specifies how the operations that requires elevation is handled for users. + + .PARAMETER EnableInstallerDetection + Specifies how package installations are handled. + + .PARAMETER ValidateAdminCodeSignatures + Specifies how cryptographic signatures on interactive applications are + handled. + + .PARAMETER EnableLua + Specifies how the 'administrator in Admin Approval Mode' user type are + handled. + + .PARAMETER PromptOnSecureDesktop + Specifies if secure desktop prompting are used. + + .PARAMETER EnableVirtualization + Specifies how redirection of legacy application File and Registry writes + are handled. + + .PARAMETER SuppressRestart + Specifies if a restart of the node should be suppressed. By default the + node will be restarted if the value is changed. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [ValidateSet('AlwaysNotify', 'AlwaysNotifyAndAskForCredentials', 'NotifyChanges', 'NotifyChangesWithoutDimming', 'NeverNotify', 'NeverNotifyAndDisableAll')] + [System.String] + $NotificationLevel, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $FilterAdministratorToken, + + [Parameter()] + [ValidateSet(0, 1, 2, 3, 4, 5)] + [System.UInt16] + $ConsentPromptBehaviorAdmin, + + [Parameter()] + [ValidateSet(0, 1, 3)] + [System.UInt16] + $ConsentPromptBehaviorUser, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $EnableInstallerDetection, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $ValidateAdminCodeSignatures, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $EnableLua, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $PromptOnSecureDesktop, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $EnableVirtualization, + + [Parameter()] + [System.Boolean] + $SuppressRestart = $false + ) + + $assertBoundParameterParameters = @{ + BoundParameterList = $PSBoundParameters + MutuallyExclusiveList1 = @( + 'NotificationLevel' + ) + MutuallyExclusiveList2 = $script:granularUserAccountControlParameterNames + } + + Assert-BoundParameter @assertBoundParameterParameters + + Write-Verbose -Message $script:localizedData.SettingStateMessage + + $needRestart = $false + + $getTargetResourceResult = Get-TargetResource -IsSingleInstance 'Yes' -SuppressRestart $SuppressRestart + + if ($PSBoundParameters.ContainsKey('NotificationLevel')) + { + if ($getTargetResourceResult.NotificationLevel -ne $NotificationLevel) + { + Write-Verbose -Message ( + $script:localizedData.SetNotificationLevel -f $NotificationLevel + ) + + Set-UserAccountControlToNotificationLevel -NotificationLevel $NotificationLevel + + $needRestart = $true + } + else + { + Write-Verbose -Message $script:localizedData.NotificationLevelInDesiredState + } + } + else + { + foreach ($parameterName in $script:granularUserAccountControlParameterNames) + { + if ($PSBoundParameters.ContainsKey($parameterName) -and $getTargetResourceResult.$parameterName -ne $PSBoundParameters.$parameterName) + { + Write-Verbose -Message ( + $script:localizedData.SetPropertyToValue ` + -f $parameterName, $PSBoundParameters.$parameterName + ) + + try + { + $setItemPropertyParameters = @{ + Path = $script:registryKey + Name = $parameterName + Value = $PSBoundParameters.$parameterName + ErrorAction = 'Stop' + } + + Set-ItemProperty @setItemPropertyParameters + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.FailedToSetGranularProperty -f $parameterName) ` + -ErrorRecord $_ + } + + $needRestart = $true + } + } + + if (-not $needRestart) + { + Write-Verbose -Message $script:localizedData.GranularPropertiesInDesiredState + } + } + + if ($needRestart) + { + if ($SuppressRestart) + { + Write-Warning -Message $script:localizedData.SuppressRestart + } + else + { + $global:DSCMachineStatus = 1 + } + } +} + +<# + .SYNOPSIS + Tests the current state of the User Account Control. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER NotificationLevel + Specifies the desired notification level for the User Account Control + setting. This parameter can not be used at the same time as any of the + granular parameters. + + .PARAMETER FilterAdministratorToken + Specifies the mode for the built-in administrator account (RID 500). + + .PARAMETER ConsentPromptBehaviorAdmin + Specifies the prompt behavior for the Consent Administrator. + + .PARAMETER ConsentPromptBehaviorUser + Specifies how the operations that requires elevation is handled for users. + + .PARAMETER EnableInstallerDetection + Specifies how package installations are handled. + + .PARAMETER ValidateAdminCodeSignatures + Specifies how cryptographic signatures on interactive applications are + handled. + + .PARAMETER EnableLua + Specifies how the 'administrator in Admin Approval Mode' user type are + handled. + + .PARAMETER PromptOnSecureDesktop + Specifies if secure desktop prompting are used. + + .PARAMETER EnableVirtualization + Specifies how redirection of legacy application File and Registry writes + are handled. + + .PARAMETER SuppressRestart + Specifies if a restart of the node should be suppressed. By default the + node will be restarted if the value is changed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [ValidateSet('AlwaysNotify', 'AlwaysNotifyAndAskForCredentials', 'NotifyChanges', 'NotifyChangesWithoutDimming', 'NeverNotify', 'NeverNotifyAndDisableAll')] + [System.String] + $NotificationLevel, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $FilterAdministratorToken, + + [Parameter()] + [ValidateSet(0, 1, 2, 3, 4, 5)] + [System.UInt16] + $ConsentPromptBehaviorAdmin, + + [Parameter()] + [ValidateSet(0, 1, 3)] + [System.UInt16] + $ConsentPromptBehaviorUser, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $EnableInstallerDetection, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $ValidateAdminCodeSignatures, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $EnableLua, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $PromptOnSecureDesktop, + + [Parameter()] + [ValidateSet(0, 1)] + [System.UInt16] + $EnableVirtualization, + + [Parameter()] + [System.Boolean] + $SuppressRestart = $false + ) + + Write-Verbose -Message $script:localizedData.TestingStateMessage + + $assertBoundParameterParameters = @{ + BoundParameterList = $PSBoundParameters + MutuallyExclusiveList1 = @( + 'NotificationLevel' + ) + MutuallyExclusiveList2 = $script:granularUserAccountControlParameterNames + } + + Assert-BoundParameter @assertBoundParameterParameters + + $getTargetResourceResult = Get-TargetResource -IsSingleInstance 'Yes' -SuppressRestart $SuppressRestart + + if ($PSBoundParameters.ContainsKey('NotificationLevel')) + { + if ($getTargetResourceResult.NotificationLevel -ne $NotificationLevel) + { + $testTargetResourceReturnValue = $false + + Write-Verbose -Message ($script:localizedData.NotificationLevelNoInDesiredState -f $getTargetResourceResult.NotificationLevel, $NotificationLevel) + } + else + { + $testTargetResourceReturnValue = $true + + Write-Verbose -Message $script:localizedData.NotificationLevelInDesiredState + } + } + else + { + $testTargetResourceReturnValue = $true + + foreach ($parameterName in $script:granularUserAccountControlParameterNames) + { + if ($PSBoundParameters.ContainsKey($parameterName) -and $getTargetResourceResult.$parameterName -ne $PSBoundParameters.$parameterName) + { + $testTargetResourceReturnValue = $false + + Write-Verbose -Message ($script:localizedData.GranularPropertyNoInDesiredState -f $parameterName, $getTargetResourceResult.$parameterName, $PSBoundParameters.$parameterName) + } + } + + if ($testTargetResourceReturnValue) + { + Write-Verbose -Message $script:localizedData.GranularPropertiesInDesiredState + } + } + + return $testTargetResourceReturnValue +} + +<# + .SYNOPSIS + Gets the current values of the User Account Control registry entries. + + .OUTPUTS + Returns a hashtable containing the values. +#> +function Get-UserAccountControl +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param () + + return @{ + FilterAdministratorToken = Get-RegistryPropertyValue -Path $script:registryKey -Name 'FilterAdministratorToken' + ConsentPromptBehaviorAdmin = Get-RegistryPropertyValue -Path $script:registryKey -Name 'ConsentPromptBehaviorAdmin' + ConsentPromptBehaviorUser = Get-RegistryPropertyValue -Path $script:registryKey -Name 'ConsentPromptBehaviorUser' + EnableInstallerDetection = Get-RegistryPropertyValue -Path $script:registryKey -Name 'EnableInstallerDetection' + ValidateAdminCodeSignatures = Get-RegistryPropertyValue -Path $script:registryKey -Name 'ValidateAdminCodeSignatures' + EnableLua = Get-RegistryPropertyValue -Path $script:registryKey -Name 'EnableLUA' + PromptOnSecureDesktop = Get-RegistryPropertyValue -Path $script:registryKey -Name 'PromptOnSecureDesktop' + EnableVirtualization = Get-RegistryPropertyValue -Path $script:registryKey -Name 'EnableVirtualization' + } +} + +<# + .SYNOPSIS + Gets the current notification level string value. + + .OUTPUTS + Returns the notification level string value. If the registry values does + not match a predefined notification level then $null is returned. +#> +function Get-NotificationLevel +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + $notificationLevelStringValue = $null + + $userAccountControlValues = Get-UserAccountControl + + if ($userAccountControlValues.ConsentPromptBehaviorAdmin -eq 2 ` + -and $userAccountControlValues.EnableLua -eq 1 ` + -and $userAccountControlValues.PromptOnSecureDesktop -eq 1 + ) + { + $notificationLevelStringValue = 'AlwaysNotify' + } + + if ($userAccountControlValues.ConsentPromptBehaviorAdmin -eq 1 ` + -and $userAccountControlValues.EnableLua -eq 1 ` + -and $userAccountControlValues.PromptOnSecureDesktop -eq 1 + ) + { + $notificationLevelStringValue = 'AlwaysNotifyAndAskForCredentials' + } + + if ($userAccountControlValues.ConsentPromptBehaviorAdmin -eq 5 ` + -and $userAccountControlValues.EnableLua -eq 1 ` + -and $userAccountControlValues.PromptOnSecureDesktop -eq 1 + ) + { + $notificationLevelStringValue = 'NotifyChanges' + } + + if ($userAccountControlValues.ConsentPromptBehaviorAdmin -eq 5 ` + -and $userAccountControlValues.EnableLua -eq 1 ` + -and $userAccountControlValues.PromptOnSecureDesktop -eq 0 + ) + { + $notificationLevelStringValue = 'NotifyChangesWithoutDimming' + } + + if ($userAccountControlValues.ConsentPromptBehaviorAdmin -eq 0 ` + -and $userAccountControlValues.EnableLua -eq 1 ` + -and $userAccountControlValues.PromptOnSecureDesktop -eq 0 + ) + { + $notificationLevelStringValue = 'NeverNotify' + } + + if ($userAccountControlValues.ConsentPromptBehaviorAdmin -eq 0 ` + -and $userAccountControlValues.EnableLua -eq 0 ` + -and $userAccountControlValues.PromptOnSecureDesktop -eq 0 + ) + { + $notificationLevelStringValue = 'NeverNotifyAndDisableAll' + } + + return $notificationLevelStringValue +} + +<# + .SYNOPSIS + Gets the current notification level string value. + + .OUTPUTS + Returns the notification level string value. If the registry values does + not match a predefined notification level then $null is returned. +#> +function Set-UserAccountControlToNotificationLevel +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('AlwaysNotify', 'AlwaysNotifyAndAskForCredentials', 'NotifyChanges', 'NotifyChangesWithoutDimming', 'NeverNotify', 'NeverNotifyAndDisableAll')] + [System.String] + $NotificationLevel + ) + + try + { + $defaultSetItemPropertyParameters = @{ + Path = $script:registryKey + ErrorAction = 'Stop' + } + + switch ($NotificationLevel) + { + 'AlwaysNotify' + { + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'ConsentPromptBehaviorAdmin' -Value 2 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'EnableLUA' -Value 1 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'PromptOnSecureDesktop' -Value 1 + } + + 'AlwaysNotifyAndAskForCredentials' + { + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'ConsentPromptBehaviorAdmin' -Value 1 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'EnableLUA' -Value 1 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'PromptOnSecureDesktop' -Value 1 + } + + + 'NotifyChanges' + { + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'ConsentPromptBehaviorAdmin' -Value 5 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'EnableLUA' -Value 1 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'PromptOnSecureDesktop' -Value 1 + } + + 'NotifyChangesWithoutDimming' + { + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'ConsentPromptBehaviorAdmin' -Value 5 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'EnableLUA' -Value 1 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'PromptOnSecureDesktop' -Value 0 + } + + 'NeverNotify' + { + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'ConsentPromptBehaviorAdmin' -Value 0 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'EnableLUA' -Value 1 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'PromptOnSecureDesktop' -Value 0 + } + + 'NeverNotifyAndDisableAll' + { + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'ConsentPromptBehaviorAdmin' -Value 0 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'EnableLUA' -Value 0 + Set-ItemProperty @defaultSetItemPropertyParameters -Name 'PromptOnSecureDesktop' -Value 0 + } + } + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.FailedToSetNotificationLevel -f $NotificationLevel) ` + -ErrorRecord $_ + } +} diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/DSC_UserAccountControl.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/DSC_UserAccountControl.schema.mof new file mode 100644 index 0000000..7d41303 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/DSC_UserAccountControl.schema.mof @@ -0,0 +1,15 @@ +[ClassVersion("1.0.0.0"), FriendlyName("UserAccountControl")] +class DSC_UserAccountControl : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Specifies the desired notification level for the User Account Control setting. This parameter can not be used at the same time as any of the granular parameters."), ValueMap{"AlwaysNotify", "AlwaysNotifyAndAskForCredentials", "NotifyChanges", "NotifyChangesWithoutDimming", "NeverNotify", "NeverNotifyAndDisableAll"}, Values{"AlwaysNotify", "AlwaysNotifyAndAskForCredentials", "NotifyChanges", "NotifyChangesWithoutDimming", "NeverNotify", "NeverNotifyAndDisableAll"}] String NotificationLevel; + [Write, Description("Specifies the mode for the built-in administrator account (RID 500)."), ValueMap{"0", "1"}, Values{"0", "1"}] UInt16 FilterAdministratorToken; + [Write, Description("Specifies the prompt behavior for the Consent Administrator."), ValueMap{"0", "1", "2", "3", "4", "5"}, Values{"0", "1", "2", "3", "4", "5"}] UInt16 ConsentPromptBehaviorAdmin; + [Write, Description("Specifies how the operations that requires elevation is handled for users."), ValueMap{"0", "1", "3"}, Values{"0", "1", "3"}] UInt16 ConsentPromptBehaviorUser; + [Write, Description("Specifies how package installations are handled."), ValueMap{"0", "1"}, Values{"0", "1"}] UInt16 EnableInstallerDetection; + [Write, Description("Specifies how cryptographic signatures on interactive applications are handled."), ValueMap{"0", "1"}, Values{"0", "1"}] UInt16 ValidateAdminCodeSignatures; + [Write, Description("Specifies how the 'administrator in Admin Approval Mode' user type are handled."), ValueMap{"0", "1"}, Values{"0", "1"}] UInt16 EnableLua; + [Write, Description("Specifies if secure desktop prompting are used."), ValueMap{"0", "1"}, Values{"0", "1"}] UInt16 PromptOnSecureDesktop; + [Write, Description("Specifies how redirection of legacy application File and Registry writes are handled."), ValueMap{"0", "1"}, Values{"0", "1"}] UInt16 EnableVirtualization; + [Write, Description("Specifies if a restart of the node should be suppressed. By default the node will be restarted if the value is changed.")] Boolean SuppressRestart; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/README.md new file mode 100644 index 0000000..e5b2609 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/README.md @@ -0,0 +1,96 @@ +# Description + +The resource allows you to configure the notification level or granularly +configure the User Account Control for the computer. + +The parameter `NotificationLevel` and any of the other granular parameters +are mutual exclusive and will throw an argument exception error. + +For the granular properties available in this resource, read more about +the possible values in the article [User Account Control Group Policy and registry key settings](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings). + +The values of the parameter `NotificationLevel` reflects the +levels available through the User Account Control Settings user interface; +AlwaysNotify, NotifyChanges, NotifyChangesWithoutDimming, and NeverNotify. +The other available values have been added to easier configure different +scenarios, but they can also be configured using the granular properties +of the resource. Available values for the parameter `NotificationLevel` is: + +- **AlwaysNotify**: You will be notified before programs make changes to your + computer or to Windows settings that require the permissions of an administrator. + When you're notified, your desktop will be dimmed, and you must either approve + or deny the request in the UAC dialog box before you can do anything else on + your computer. The dimming of your desktop is referred to as the secure desktop + because other programs can't run while it's dimmed. This is the most secure + setting. When you are notified, you should carefully read the contents of each + dialog box before allowing changes to be made to your computer. + This sets the values: + - `ConsentPromptBehaviorAdmin`: 2 + - `EnableLUA`: 1 + - `PromptOnSecureDesktop`: 1 +- **AlwaysNotifyAndAskForCredentials**: This is the same as the notification level + "AlwaysNotify" with the exception that when you're notified, your desktop will + be dimmed, and you must enter valid credentials to approve the request in the + UAC dialog box. + This sets the values: + - `ConsentPromptBehaviorAdmin`: 1 + - `EnableLUA`: 1 + - `PromptOnSecureDesktop`: 1 +- **NotifyChanges**: You will be notified before programs make changes to your + computer that require the permissions of an administrator. You will not be notified + if you try to make changes to Windows settings that require the permissions of + an administrator. You will be notified if a program outside of Windows tries + to make changes to a Windows setting. It's usually safe to allow changes to be + made to Windows settings without you being notified. However, certain programs + that come with Windows can have commands or data passed to them, and malicious + software can take advantage of this by using these programs to install files + or change settings on your computer. You should always be careful about which + programs you allow to run on your computer. + This sets the values: + - `ConsentPromptBehaviorAdmin`: 5 + - `EnableLUA`: 1 + - `PromptOnSecureDesktop`: 1 +- **NotifyChangesWithoutDimming**: You will be notified before programs make + changes to your computer that require the permissions of an administrator. + You will not be notified if you try to make changes to Windows settings that + require the permissions of an administrator. You will be notified if a program + outside of Windows tries to make changes to a Windows setting. This setting is + the same as "NotifyChanges" but you are not notified on the secure desktop. + Because the UAC dialog box isn't on the secure desktop with this setting, other + programs might be able to interfere with the dialog's visual appearance. This + is a small security risk if you already have a malicious program running on + your computer. + This sets the values: + - `ConsentPromptBehaviorAdmin`: 5 + - `EnableLUA`: 1 + - `PromptOnSecureDesktop`: 0 +- **NeverNotify**: You will not be notified before any changes are made to your + computer. If you are logged on as an administrator, programs can make changes + to your computer without you knowing about it. If you are logged on as a + standard user, any changes that require the permissions of an administrator will + automatically be denied. If you select this setting, you will need to restart + the computer to complete the process of turning off UAC. Once UAC is off, people + that log on as administrator will always have the permissions of an administrator. + This is the least secure setting. When you set UAC to never notify, you open + up your computer to potential security risks. If you set UAC to never notify, + you should be careful about which programs you run, because they will have the + same access to the computer as you do. This includes reading and making changes + to protected system areas, your personal data, saved files, and anything else + stored on the computer. Programs will also be able to communicate and transfer + information to and from anything your computer connects with, including the + Internet. + This sets the values: + - `ConsentPromptBehaviorAdmin`: 0 + - `EnableLUA`: 1 + - `PromptOnSecureDesktop`: 0 +- **NeverNotifyAndDisableAll**: This is the same as the notification level + "NeverNotify", but in addition EnableLUA registry key is disabled. + EnableLUA controls the behavior of all UAC policy settings for the computer. + If you change this policy setting, you must restart your computer. We + do not recommend using this setting, but it can be selected for systems + that use programs that are not certified for Windows 8, Windows Server 2012, + Windows 7 or Windows Server 2008 R2 because they do not support UAC. + This sets the values: + - `ConsentPromptBehaviorAdmin`: 0 + - `EnableLUA`: 0 + - `PromptOnSecureDesktop`: 0 diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/en-US/DSC_UserAccountControl.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/en-US/DSC_UserAccountControl.strings.psd1 new file mode 100644 index 0000000..558a382 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_UserAccountControl/en-US/DSC_UserAccountControl.strings.psd1 @@ -0,0 +1,14 @@ +ConvertFrom-StringData @' + GettingStateMessage = Getting the current notification level of the User Account Control. (UAC0001) + SettingStateMessage = Setting User Account Control state. (UAC0002) + TestingStateMessage = Testing User Account Control state. (UAC0003) + SuppressRestart = Suppressing the restart. For the change to come in affect the node must be restarted manually. (UAC0004) + NotificationLevelInDesiredState = The User Account Control notification level is in desired state. (UAC0005) + NotificationLevelNoInDesiredState = The User Account Control notification level was '{0}', but expected it to be '{1}'. (UAC0006) + GranularPropertiesInDesiredState = The User Account Control properties are in desired state. (UAC0007) + GranularPropertyNoInDesiredState = The User Account Control property '{0}' was '{1}', but expected it to be '{2}'. (UAC0008) + SetPropertyToValue = Setting the property '{0}' to the value '{1}'. (UAC0009) + SetNotificationLevel = Setting the notification level to '{0}'. (UAC0010) + FailedToSetNotificationLevel = Failed to set the notification level '{0}'. (UAC0011) + FailedToSetGranularProperty = Failed to set the property '{0}'. (UAC0012) +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/DSC_VirtualMemory.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/DSC_VirtualMemory.psm1 new file mode 100644 index 0000000..84cb785 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/DSC_VirtualMemory.psm1 @@ -0,0 +1,529 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidGlobalVars", "", Scope = "Function")] +param () + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the virtual memory configuration + + .PARAMETER Drive + The drive for which the virtual memory configuration needs to be returned + + .PARAMETER Type + The type of the virtual memory configuration +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Drive, + + [Parameter(Mandatory = $true)] + [ValidateSet('AutoManagePagingFile', 'CustomSize', 'SystemManagedSize', 'NoPagingFile')] + [System.String] + $Type + ) + + Write-Verbose -Message ($script:localizedData.GettingVirtualMemoryMessage) + + $returnValue = @{ + Drive = [string]::Empty + Type = [string]::Empty + InitialSize = 0 + MaximumSize = 0 + } + + [System.Boolean] $isSystemManaged = (Get-CimInstance -ClassName 'Win32_ComputerSystem').AutomaticManagedPagefile + + if ($isSystemManaged) + { + $returnValue.Type = 'AutoManagePagingFile' + return $returnValue + } + + $driveInfo = [System.IO.DriveInfo] $Drive + + $existingPageFileSetting = Get-PageFileSetting ` + -Drive $($driveInfo.Name.Substring(0,2)) + + if (-not $existingPageFileSetting) + { + $returnValue.Type = 'NoPagingFile' + } + else + { + if ($existingPageFileSetting.InitialSize -eq 0 -and $existingPageFileSetting.MaximumSize -eq 0) + { + $returnValue.Type = 'SystemManagedSize' + } + else + { + $returnValue.Type = 'CustomSize' + } + + $returnValue.Drive = $existingPageFileSetting.Name.Substring(0, 3) + $returnValue.InitialSize = $existingPageFileSetting.InitialSize + $returnValue.MaximumSize = $existingPageFileSetting.MaximumSize + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the virtual memory settings based on the parameters supplied + + .PARAMETER Drive + The drive for which the virtual memory configuration should be set. + + .PARAMETER Type + The paging type. When set to AutoManagePagingFile, drive letters are ignored + + .PARAMETER InitialSize + The initial page file size in megabyte + + .PARAMETER MaximumSize + The maximum page file size in megabyte. May not be smaller than InitialSize +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Drive, + + [Parameter(Mandatory = $true)] + [ValidateSet('AutoManagePagingFile', 'CustomSize', 'SystemManagedSize', 'NoPagingFile')] + [System.String] + $Type, + + [Parameter()] + [System.Int64] + $InitialSize, + + [Parameter()] + [System.Int64] + $MaximumSize + ) + + Write-Verbose -Message ($script:localizedData.SettingVirtualMemoryMessage) + + $systemInfo = Get-CimInstance -ClassName 'Win32_ComputerSystem' + + switch ($Type) + { + 'AutoManagePagingFile' + { + Set-AutoManagePaging -State Enable + + $global:DSCMachineStatus = 1 + + break + } + + 'CustomSize' + { + if ($systemInfo.AutomaticManagedPageFile) + { + # First Disable Automatic Managed Page File + Set-AutoManagePaging -State Disable + } + + $driveInfo = Get-DriveInfo -Drive $Drive + + $existingPageFileSetting = Get-PageFileSetting ` + -Drive $($driveInfo.Name.Substring(0,2)) + + if (-not $existingPageFileSetting) + { + $pageFileName = Join-Path ` + -Path $driveInfo.Name ` + -ChildPath 'pagefile.sys' + + New-PageFile -PageFileName $pageFileName + } + + Set-PageFileSetting ` + -Drive $driveInfo.Name.Substring(0,2) ` + -InitialSize $InitialSize ` + -MaximumSize $MaximumSize + + $global:DSCMachineStatus = 1 + + Write-Verbose -Message ($script:localizedData.EnabledCustomSizeMessage -f $Drive) + + break + } + + 'SystemManagedSize' + { + if ($systemInfo.AutomaticManagedPageFile) + { + # First Disable Automatic Managed Page File + Set-AutoManagePaging -State Disable + } + + $driveInfo = Get-DriveInfo -Drive $Drive + + $existingPageFileSetting = Get-PageFileSetting ` + -Drive $($driveInfo.Name.Substring(0,2)) + + if (-not $existingPageFileSetting) + { + $pageFileName = Join-Path ` + -Path $driveInfo.Name ` + -ChildPath 'pagefile.sys' + + New-PageFile -PageFileName $pageFileName + } + + Set-PageFileSetting ` + -Drive $driveInfo.Name.Substring(0,2) + + $global:DSCMachineStatus = 1 + + Write-Verbose -Message ($script:localizedData.EnabledSystemManagedSizeMessage -f $Drive) + + break + } + + 'NoPagingFile' + { + if ($systemInfo.AutomaticManagedPageFile) + { + # First Disable Automatic Managed Page File + Set-AutoManagePaging -State Disable + } + + $driveInfo = Get-DriveInfo -Drive $Drive + + $existingPageFileSetting = Get-PageFileSetting ` + -Drive $($driveInfo.Name.Substring(0,2)) + + if ($existingPageFileSetting) + { + Write-Verbose -Message ($script:localizedData.RemovePageFileMessage -f $existingPageFileSetting.Name) + + $null = Remove-CimInstance ` + -InputObject $existingPageFileSetting + + $global:DSCMachineStatus = 1 + } + + Write-Verbose -Message ($script:localizedData.DisabledPageFileMessage -f $Drive) + + break + } + } +} + +<# + .SYNOPSIS + Tests if virtual memory settings need to be applied based on the parameters supplied + + .PARAMETER Drive + The drive letter that should be tested + + .PARAMETER Type + The type of the virtual memory configuration + + .PARAMETER InitialSize + The initial page file size in megabyte + + .PARAMETER MaximumSize + The maximum page file size in megabyte +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Drive, + + [Parameter(Mandatory = $true)] + [ValidateSet('AutoManagePagingFile', 'CustomSize', 'SystemManagedSize', 'NoPagingFile')] + [System.String] + $Type, + + [Parameter()] + [System.Int64] + $InitialSize, + + [Parameter()] + [System.Int64] + $MaximumSize + ) + + Write-Verbose -Message ($script:localizedData.TestingVirtualMemoryMessage) + + $systemInfo = Get-CimInstance -ClassName 'Win32_ComputerSystem' + $inDesiredState = $false + + switch ($Type) + { + 'AutoManagePagingFile' + { + $inDesiredState = $systemInfo.AutomaticManagedPagefile + break + } + + 'CustomSize' + { + if ($systemInfo.AutomaticManagedPageFile) + { + break + } + + $driveInfo = [System.IO.DriveInfo] $Drive + + $existingPageFileSetting = Get-PageFileSetting ` + -Drive $($driveInfo.Name.Substring(0,2)) + + if (-not $existingPageFileSetting) + { + break + } + + if (-not ($existingPageFileSetting.InitialSize -eq $InitialSize -and $existingPageFileSetting.MaximumSize -eq $MaximumSize)) + { + break + } + + $inDesiredState = $true + break + } + + 'SystemManagedSize' + { + if ($systemInfo.AutomaticManagedPageFile) + { + break + } + + $driveInfo = [System.IO.DriveInfo] $Drive + + $existingPageFileSetting = Get-PageFileSetting ` + -Drive $($driveInfo.Name.Substring(0,2)) + + if (-not $existingPageFileSetting) + { + break + } + + if (-not ($existingPageFileSetting.InitialSize -eq 0 -and $existingPageFileSetting.MaximumSize -eq 0)) + { + break + } + + $inDesiredState = $true + break + } + + 'NoPagingFile' + { + if ($systemInfo.AutomaticManagedPageFile) + { + break + } + + $driveInfo = [System.IO.DriveInfo] $Drive + + $existingPageFileSetting = Get-PageFileSetting ` + -Drive $($driveInfo.Name.Substring(0,2)) + + if ($existingPageFileSetting) + { + break + } + + $inDesiredState = $true + break + } + } + + return $inDesiredState +} + +<# + .SYNOPSIS + Gets the settings for a page file assigned to a Drive. + + .PARAMETER State + The drive letter for the page file to return the settings of. +#> +function Get-PageFileSetting +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Drive + ) + + Write-Verbose -Message ($script:localizedData.GettingPageFileSettingsMessage -f $Drive) + + # Find existing page file settings by drive letter + return Get-CimInstance ` + -ClassName 'Win32_PageFileSetting' ` + -Filter "SettingID='pagefile.sys @ $Drive'" +} + +<# + .SYNOPSIS + Sets a new page file name. + + .PARAMETER Drive + The letter of the drive containing the page file + to change the settings of. + + .PARAMETER InitialSize + The initial size to set the page file to. + + .PARAMETER MaximumSize + The maximum size to set the page file to. +#> +function Set-PageFileSetting +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Drive, + + [Parameter()] + [System.Int64] + $InitialSize = 0, + + [Parameter()] + [System.Int64] + $MaximumSize = 0 + ) + + $setParams = @{ + Namespace = 'root\cimv2' + Query = "Select * from Win32_PageFileSetting where SettingID='pagefile.sys @ $Drive'" + Property = @{ + InitialSize = $InitialSize + MaximumSize = $MaximumSize + } + } + + Write-Verbose -Message ($script:localizedData.SettingPageFileSettingsMessage -f $Drive, $InitialSize, $MaximumSize) + + $null = Set-CimInstance @setParams +} + +<# + .SYNOPSIS + Enables or Disables Automatically Managed Paging. + + .PARAMETER State + Specifies if Automatically Managed Paging is enabled + or disabled. +#> +function Set-AutoManagePaging +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Enable', 'Disable')] + [System.String] + $State + ) + + $setParams = @{ + Namespace = 'root\cimv2' + Query = 'Select * from Win32_ComputerSystem' + Property = @{ + AutomaticManagedPageFile = ($State -eq 'Enable') + } + } + + Write-Verbose -Message ($script:localizedData.SetAutoManagePagingMessage -f $State) + + $null = Set-CimInstance @setParams +} + +<# + .SYNOPSIS + Sets a new page file name. + + .PARAMETER PageFileName + The name of the new page file. +#> +function New-PageFile +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $PageFileName + ) + + Write-Verbose -Message ($script:localizedData.NewPageFileMessage -f $State) + + $null = New-CimInstance ` + -Namespace 'root\cimv2' ` + -ClassName 'Win32_PageFileSetting' ` + -Property @{ + Name = $PageFileName + } +} + +<# + .SYNOPSIS + Gets the Drive info object for a specified + Drive. It will throw an exception if the drive + is invalid or does not exist. + + .PARAMETER Drive + The letter of the drive to get the drive info + for. +#> +function Get-DriveInfo +{ + [CmdletBinding()] + [OutputType([System.IO.DriveInfo])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Drive + ) + + $driveInfo = [System.IO.DriveInfo] $Drive + + if (-not $driveInfo.IsReady) + { + New-InvalidOperationException ` + -Message ($script:localizedData.DriveNotReadyError -f $driveInfo.Name) + } + + return $driveInfo +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/DSC_VirtualMemory.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/DSC_VirtualMemory.schema.mof new file mode 100644 index 0000000..11c4182 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/DSC_VirtualMemory.schema.mof @@ -0,0 +1,10 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("VirtualMemory")] +class DSC_VirtualMemory : OMI_BaseResource +{ + [Key, Description("The drive letter for which paging settings should be set. Can be letter only, letter and colon or letter with colon and trailing slash.")] String Drive; + [Key, Description("The type of the paging setting to use. If set to AutoManagePagingFile, the drive letter will be ignored. If set to SystemManagedSize, the values for InitialSize and MaximumSize will be ignored"), ValueMap{"AutoManagePagingFile","CustomSize","SystemManagedSize","NoPagingFile"}, Values{"AutoManagePagingFile","CustomSize","SystemManagedSize","NoPagingFile"}] String Type; + [Write, Description("The initial size of the page file in Megabyte")] Sint64 InitialSize; + [Write, Description("The maximum size of the page file in Megabyte")] Sint64 MaximumSize; +}; + diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/README.md new file mode 100644 index 0000000..0bdd7fd --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/README.md @@ -0,0 +1,4 @@ +# Description + +The resource allows configuration of properties of the paging file on +the local computer. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/en-US/DSC_VirtualMemory.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/en-US/DSC_VirtualMemory.strings.psd1 new file mode 100644 index 0000000..46fad83 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_VirtualMemory/en-US/DSC_VirtualMemory.strings.psd1 @@ -0,0 +1,14 @@ +ConvertFrom-StringData @' + GettingVirtualMemoryMessage = Getting Virtual Memory. + SettingVirtualMemoryMessage = Setting Virtual Memory. + SetAutoManagePagingMessage = {0} automatically managed page file. + GettingPageFileSettingsMessage = Getting page file settings for drive {0}. + SettingPageFileSettingsMessage = Setting page file settings for drive {0} with initial size of {1}MB and maximum size {2}MB. + NewPageFileMessage = Creating new page file '{0}'. + RemovePageFileMessage = Removing existing page file '{0}'. + DisabledPageFileMessage = Disabled page file for drive {0}. + EnabledSystemManagedSizeMessage = Enabled system managed page file for drive {0}. + EnabledCustomSizeMessage = Enabled custom size page file for drive {0}. + DriveNotReadyError = Drive {0} is not ready. Please ensure that the drive exists and is available. + TestingVirtualMemoryMessage = Testing Virtual Memory. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/DSC_WindowsCapability.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/DSC_WindowsCapability.psm1 new file mode 100644 index 0000000..64f8f48 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/DSC_WindowsCapability.psm1 @@ -0,0 +1,209 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current state of the Windows Capability. + + .PARAMETER Name + Specifies the name of the Windows Capability. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name + ) + + Write-Verbose -Message ($script:localizedData.GetTargetResourceStartMessage -f $Name) + $windowsCapability = Get-WindowsCapability -Online @PSBoundParameters + + if ([System.String]::IsNullOrEmpty($windowsCapability.Name)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.CapabilityNameNotFound -f $Name) ` + -ArgumentName 'Name' + } + else + { + Write-Verbose -Message ($script:localizedData.CapabilityNameFound -f $Name) + } + + if ($windowsCapability.State -eq 'Installed') + { + $Ensure = 'Present' + } + else + { + $Ensure = 'Absent' + } + + $returnValue = @{ + Name = $Name + LogLevel = $windowsCapability.LogLevel + LogPath = $windowsCapability.LogPath + Ensure = $Ensure + } + + Write-Verbose -Message ($script:localizedData.GetTargetResourceEndMessage -f $Name) + return $returnValue +} + +<# + .SYNOPSIS + Sets if the the current state of the Windows Capability is in the desired state. + + .PARAMETER Name + Specifies the name of the Windows Capability. + + .PARAMETER Ensure + Specifies whether the Windows Capability should be installed + or uninstalled. + + .PARAMETER LogLevel + Specifies the given Log Level of a Windows Capability. This is a write + only parameter that is used when updating the status of a Windows + Capability. If not specified, the default is 'WarningsInfo'. + + .PARAMETER LogPath + Specifies the full path and file name to log to. This is a write + only parameter that is used when updating the status of a Windows + Capability. If not specified, the default is '%WINDIR%\Logs\Dism\dism.log'. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('Errors', 'Warnings', 'WarningsInfo')] + [System.String] + $LogLevel, + + [Parameter()] + [System.String] + $LogPath + ) + + Write-Verbose -Message ($script:localizedData.SetTargetResourceStartMessage -f $Name) + $null = $PSBoundParameters.Remove('Ensure') + $currentState = Get-TargetResource -Name $Name + + switch ($Ensure) + { + 'Present' + { + if ($Ensure -ne $currentState.Ensure) + { + Write-Verbose -Message ($script:localizedData.SetTargetAddMessage -f $Name) + $null = Add-WindowsCapability -Online @PSBoundParameters + } + } + + 'Absent' + { + if ($Ensure -ne $currentState.Ensure) + { + Write-Verbose -Message ($script:localizedData.SetTargetRemoveMessage -f $Name) + $null = Remove-WindowsCapability -Online @PSBoundParameters + } + } + } +} + +<# + .SYNOPSIS + Tests if the the current state of the Windows Capability is in the desired state. + + .PARAMETER Name + Specifies the name of the Windows Capability. + + .PARAMETER Ensure + Specifies whether the Windows Capability should be installed + or uninstalled. + + .PARAMETER LogLevel + Specifies the given Log Level of a Windows Capability. This is a write + only parameter that is used when updating the status of a Windows + Capability. If not specified, the default is 'WarningsInfo'. + + .PARAMETER LogPath + Specifies the full path and file name to log to. This is a write + only parameter that is used when updating the status of a Windows + Capability. If not specified, the default is '%WINDIR%\Logs\Dism\dism.log'. + + .NOTES + Get-WindowsCapability will return the LogLevel and LogPath + properties, but these values don't reflect the values set + when calling Add-WindowsCapability or Remove-WindowsCapability. + + Therefore, these values can not be used to determine if the + resource is in state. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('Errors', 'Warnings', 'WarningsInfo')] + [System.String] + $LogLevel, + + [Parameter()] + [System.String] + $LogPath + ) + + $inDesiredState = $true + + Write-Verbose -Message ($script:localizedData.TestTargetResourceStartMessage -f $Name) + $currentState = Get-TargetResource -Name $Name + + if ($Ensure -ne $currentState.Ensure) + { + Write-Verbose -Message ($script:localizedData.SetResourceIsNotInDesiredState -f $Name) + $inDesiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.SetResourceIsInDesiredState -f $Name) + $inDesiredState = $true + } + + return $inDesiredState +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/DSC_WindowsCapability.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/DSC_WindowsCapability.schema.mof new file mode 100644 index 0000000..339247a --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/DSC_WindowsCapability.schema.mof @@ -0,0 +1,9 @@ + +[ClassVersion("1.0.0.1"), FriendlyName("WindowsCapability")] +class DSC_WindowsCapability : OMI_BaseResource +{ + [Key, Description("Specifies the name of the Windows Capability.")] String Name; + [Write, Description("Specifies whether the Windows Capability should be installed or uninstalled. To install the Windows Capability, set this property to Present. To uninstall the Windows Capability, set the property to Absent."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Write, Description("Specifies the given Log Level of a Windows Capability. This is a write only parameter that is used when updating the status of a Windows Capability. If not specified, the default is 'WarningsInfo'."), ValueMap{"Errors", "Warnings", "WarningsInfo"}, Values{"Errors", "Warnings", "WarningsInfo"}] String LogLevel; + [Write, Description("Specifies the full path and file name to log to. This is a write only parameter that is used when updating the status of a Windows Capability. If not specified, the default is '%WINDIR%\\Logs\\Dism\\dism.log'.")] String LogPath; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/README.md new file mode 100644 index 0000000..5be0f6d --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/README.md @@ -0,0 +1,10 @@ +# Description + +This resource enables installation or removal of a Windows Capability. + +The LogLevel and LogPath parameters can be passed to the resource but +are not used to determine if the resource is in the desired state. + +This is because the LogLevel and LogPath properties returned by +`Get-WindowsCapability` do not reflect the values that may have been +set with `Add-WindowsCapability` or `Remove-WindowsCapability`. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/en-US/DSC_WindowsCapability.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/en-US/DSC_WindowsCapability.strings.psd1 new file mode 100644 index 0000000..55dc805 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsCapability/en-US/DSC_WindowsCapability.strings.psd1 @@ -0,0 +1,13 @@ +# culture ="en-US" +ConvertFrom-StringData -StringData @' + SetResourceIsInDesiredState = Windows Capability '{0}' is in desired state. + SetResourceIsNotInDesiredState = Windows Capability '{0}' is not in desired state. + GetTargetResourceStartMessage = Begin executing Get functionality on Windows Capability '{0}'. + GetTargetResourceEndMessage = End executing Get functionality on Windows Capability '{0}'. + SetTargetResourceStartMessage = Begin executing Set functionality on Windows Capability '{0}'. + SetTargetRemoveMessage = Executing Remove functionality on Windows Capability '{0}'. + SetTargetAddMessage = Executing Add functionality on Windows Capability '{0}'. + TestTargetResourceStartMessage = Begin executing Test functionality on Windows Capability '{0}'. + CapabilityNameFound = Specified Windows Capability '{0}' found. + CapabilityNameNotFound = Specified Windows Capability '{0}' not found. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/DSC_WindowsEventLog.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/DSC_WindowsEventLog.psm1 new file mode 100644 index 0000000..813fd15 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/DSC_WindowsEventLog.psm1 @@ -0,0 +1,453 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the ComputerManagementDsc Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'ComputerManagementDsc.Common' ` + -ChildPath 'ComputerManagementDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current state of the Windows Event Log. + + .PARAMETER LogName + Specifies the given name of a Windows Event Log. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $LogName, + + [Parameter()] + [System.Boolean] + $IsEnabled + ) + + $log = Get-WindowsEventLog -LogName $LogName + + $LogRetentionDays = (Get-EventLog -List | Where-Object -Property Log -eq $LogName).minimumRetentionDays + + $returnValue = @{ + LogName = [System.String] $LogName + LogFilePath = [system.String] $log.LogFilePath + MaximumSizeInBytes = [System.Int64] $log.MaximumSizeInBytes + IsEnabled = [System.Boolean] $log.IsEnabled + LogMode = [System.String] $log.LogMode + SecurityDescriptor = [System.String] $log.SecurityDescriptor + LogRetentionDays = [System.Int32] $logRetentionDays + } + + Write-Verbose -Message ($script:localizedData.GettingEventlogName -f $LogName) + return $returnValue +} + +<# + .SYNOPSIS + Sets the current state of the Windows Event Log. + + .PARAMETER LogName + Specifies the given name of a Windows Event Log. + + .PARAMETER MaximumSizeInBytes + Specifies the given maximum size in bytes for a specified Windows Event Log. + + .PARAMETER LogMode + Specifies the given LogMode for a specified Windows Event Log. + + .PARAMETER LogRetentionDays + Specifies the given LogRetentionDays for the Logmode 'AutoBackup'. + + .PARAMETER SecurityDescriptor + Specifies the given SecurityDescriptor for a specified Windows Event Log. + + .PARAMETER IsEnabled + Specifies the given state of a Windows Event Log. + + .PARAMETER LogFilePath + Specifies the given LogFile path of a Windows Event Log. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $LogName, + + [Parameter()] + [System.Boolean] + $IsEnabled, + + [Parameter()] + [System.Int64] + $MaximumSizeInBytes, + + [Parameter()] + [ValidateSet('AutoBackup', 'Circular', 'Retain')] + [System.String] + $LogMode, + + [Parameter()] + [System.Int32] + $LogRetentionDays, + + [Parameter()] + [System.String] + $SecurityDescriptor, + + [Parameter()] + [System.String] + $LogFilePath + ) + + $log = Get-WindowsEventLog -LogName $LogName + + if ($null -eq $log) + { + return + } + + $shouldSaveLogFile = $false + + Write-Verbose -Message ($script:localizedData.GettingEventlogName -f $LogName) + + if ($IsEnabled -eq $true) + { + if ($PSBoundParameters.ContainsKey('IsEnabled') -and $IsEnabled -ne $log.IsEnabled) + { + Write-Verbose -Message ($script:localizedData.SettingEventlogIsEnabled -f $LogName, $IsEnabled) + $log.IsEnabled = $IsEnabled + $shouldSaveLogFile = $true + } + + if ($PSBoundParameters.ContainsKey('MaximumSizeInBytes') -and $MaximumSizeInBytes -ne $log.MaximumSizeInBytes) + { + Write-Verbose -Message ($script:localizedData.SettingEventlogLogSize -f $LogName, $MaximumSizeInBytes) + $log.MaximumSizeInBytes = $MaximumSizeInBytes + $shouldSaveLogFile = $true + } + + if ($PSBoundParameters.ContainsKey('LogMode') -and $LogMode -ne $log.LogMode) + { + Write-Verbose -Message ($script:localizedData.SettingEventlogLogMode -f $LogName, $LogMode) + $log.LogMode = $LogMode + $shouldSaveLogFile = $true + } + + if ($PSBoundParameters.ContainsKey('SecurityDescriptor') -and $SecurityDescriptor -ne $log.SecurityDescriptor) + { + Write-Verbose -Message ($script:localizedData.SettingEventlogSecurityDescriptor -f $LogName, $SecurityDescriptor) + $log.SecurityDescriptor = $SecurityDescriptor + $shouldSaveLogFile = $true + } + + if ($PSBoundParameters.ContainsKey('LogFilePath') -and $LogFilePath -ne $log.LogFilePath) + { + Write-Verbose -Message ($script:localizedData.SettingEventlogLogFilePath -f $LogName, $LogFilePath) + $log.LogFilePath = $LogFilePath + $shouldSaveLogFile = $true + } + } + else + { + Write-Verbose -Message ($script:localizedData.SettingEventlogIsEnabled -f $LogName, $IsEnabled) + $log.IsEnabled = $IsEnabled + $shouldSaveLogFile = $true + } + + if ($shouldSaveLogFile -eq $true) + { + Save-LogFile -Log $log + } + + if ($PSBoundParameters.ContainsKey('LogRetentionDays')) + { + if ($LogMode -eq 'AutoBackup' -and (Get-EventLog -List | Where-Object -FilterScript {$_.Log -like $LogName})) + { + $matchingEventLog = Get-EventLog -List | Where-Object -FilterScript { + $_.Log -eq $LogName + } + + $minimumRetentionDaysForLog = $matchingEventLog.minimumRetentionDays + + if ($LogRetentionDays -ne $minimumRetentionDaysForLog) + { + Set-LogRetentionDays -LogName $LogName -LogRetentionDays $LogRetentionDays + } + } + else + { + Write-Verbose -Message ($script:localizedData.EventlogLogRetentionDaysWrongMode -f $LogName) + } + } +} + +<# + .SYNOPSIS + Tests if the the current state of the Windows Event Log is in the desired state. + + .PARAMETER LogName + Specifies the given name of a Windows Event Log. + + .PARAMETER MaximumSizeInBytes + Specifies the given maximum size in bytes for a specified Windows Event Log. + + .PARAMETER LogMode + Specifies the given LogMode for a specified evWindows Event Logentlog. + + .PARAMETER LogRetentionDays + Specifies the given LogRetentionDays for the Logmode 'AutoBackup'. + + .PARAMETER SecurityDescriptor + Specifies the given SecurityDescriptor for a specified Windows Event Log. + + .PARAMETER IsEnabled + Specifies the given state of a Windows Event Log. + + .PARAMETER LogFilePath + Specifies the given LogFile path of a Windows Event Log. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $LogName, + + [Parameter()] + [System.Boolean] + $IsEnabled, + + [Parameter()] + [ValidateRange(1028kb, 18014398509481983kb)] + [System.Int64] + $MaximumSizeInBytes, + + [Parameter()] + [ValidateSet('AutoBackup', 'Circular', 'Retain')] + [System.String] + $LogMode, + + [Parameter()] + [ValidateRange(1, 365)] + [System.Int32] + $LogRetentionDays, + + [Parameter()] + [System.String] + $SecurityDescriptor, + + [Parameter()] + [System.String] + $LogFilePath + ) + + $log = Get-WindowsEventLog -LogName $LogName + + if ($null -eq $log) + { + return + } + + $desiredState = $true + + if ($IsEnabled -eq $true) + { + if ($PSBoundParameters.ContainsKey('IsEnabled') -and $log.IsEnabled -ne $IsEnabled) + { + Write-Verbose -Message ($script:localizedData.TestingEventlogIsEnabled -f $LogName, $IsEnabled) + $desiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.SetResourceIsInDesiredState -f $LogName, 'IsEnabled') + } + + if ($PSBoundParameters.ContainsKey('MaximumSizeInBytes') -and $log.MaximumSizeInBytes -ne $MaximumSizeInBytes) + { + Write-Verbose -Message ($script:localizedData.TestingEventlogMaximumSizeInBytes -f $LogName, $MaximumSizeInBytes) + $desiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.SetResourceIsInDesiredState -f $LogName, 'MaximumSizeInBytes') + } + + if ($PSBoundParameters.ContainsKey('LogMode') -and $log.LogMode -ne $LogMode) + { + Write-Verbose -Message ($script:localizedData.TestingEventlogLogMode -f $LogName, $LogMode) + $desiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.SetResourceIsInDesiredState -f $LogName, 'LogMode') + } + + if ($PSBoundParameters.ContainsKey('LogRetentionDays')) + { + if ($LogMode -eq 'AutoBackup') + { + $minimumRetentionDays = Get-EventLog -List | Where-Object -FilterScript { $_.Log -eq $LogName } + + if ($LogRetentionDays -ne $minimumRetentionDays.minimumRetentionDays) + { + Write-Verbose -Message ($script:localizedData.TestingEventlogLogRetentionDays -f $LogName, $LogRetentionDays) + $desiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.SetResourceIsInDesiredState -f $LogName, 'LogRetentionDays') + } + } + else + { + Write-Verbose -Message ($script:localizedData.EventlogLogRetentionDaysWrongMode -f $LogName) + $desiredState = $false + } + } + + if ($PSBoundParameters.ContainsKey('LogFilePath') -and $log.LogFilePath -ne $LogFilePath) + { + Write-Verbose -Message ($script:localizedData.TestingWindowsEventlogLogFilePath -f $LogName, $LogFilePath) + $desiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.SetResourceIsInDesiredState -f $LogName, 'LogFilePath') + } + + if ($PSBoundParameters.ContainsKey('SecurityDescriptor') -and $log.SecurityDescriptor -ne $SecurityDescriptor) + { + Write-Verbose -Message ($script:localizedData.TestingWindowsEventlogSecurityDescriptor -f $LogName, $SecurityDescriptor) + $desiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.SetResourceIsInDesiredState -f $LogName, 'SecurityDescriptor') + } + } + else + { + if ($PSBoundParameters.ContainsKey('IsEnabled') -and $log.IsEnabled -ne $IsEnabled) + { + Write-Verbose -Message ($script:localizedData.TestingEventlogIsEnabled -f $LogName, $IsEnabled) + $desiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.SetResourceIsInDesiredState -f $LogName, 'IsEnabled') + } + } + return $desiredState +} + +<# + .SYNOPSIS + Helper function for the Windows Event Log. + + .PARAMETER Log + Gets the specified Windows Event Log properties. +#> +function Get-WindowsEventLog +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $LogName + ) + + $log = Get-WinEvent -ListLog $LogName + + if (!$log) + { + Write-Warning ` + -Message ($script:localizedData.WindowsEventLogNotFound -f $LogName) + } + else + { + Write-Verbose -Message ($script:localizedData.WindowsEventLogFound -f $LogName) + return $log + } +} + +<# + .SYNOPSIS + Save the Windows Event Log properties. + + .PARAMETER Log + Specifies the given object of a Windows Event Log. +#> +function Save-LogFile +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $Log + ) + + try + { + $Log.SaveChanges() + Write-Verbose -Message ($script:localizedData.SaveWindowsEventlogSuccess) + } + catch + { + Write-Verbose -Message ($script:localizedData.SaveWindowsEventlogFailure) + } +} + +<# + .SYNOPSIS + Set the Log Retention for a Windows Event Log. + + .PARAMETER LogName + Specifies the given name of a Windows Event Log. + + .PARAMETER Retention + Specifies the given RetentionDays for LogMode Autobackup. +#> +function Set-LogRetentionDays +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $LogName, + + [Parameter(Mandatory = $true)] + [System.Int32] + $LogRetentionDays + ) + + Write-Verbose -Message ($script:localizedData.SettingEventlogLogRetentionDays -f $LogName, $LogRetentionDays) + + try + { + Limit-Eventlog -LogName $LogName -OverflowAction 'OverwriteOlder' -RetentionDays $LogRetentionDays + Write-Verbose -Message ($script:localizedData.SettingWindowsEventlogRetentionDaysSuccess -f $LogName, $LogRetentionDays) + } + catch + { + Write-Verbose -Message ($script:localizedData.SettingWindowsEventlogRetentionDaysFailed -f $LogName, $LogRetentionDays) + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/DSC_WindowsEventLog.schema.mof b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/DSC_WindowsEventLog.schema.mof new file mode 100644 index 0000000..379bfd7 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/DSC_WindowsEventLog.schema.mof @@ -0,0 +1,12 @@ + +[ClassVersion("1.0.0.1"), FriendlyName("WindowsEventLog")] +class DSC_WindowsEventLog : OMI_BaseResource +{ + [Key, Description("Specifies the given name of a Windows Event Log")] String LogName; + [Write, Description("Specifies the given state of a Windows Event Log")] Boolean IsEnabled; + [Write, Description("Specifies the given maximum size in bytes for a specified Windows Event Log")] Sint64 MaximumSizeInBytes; + [Write, Description("Specifies the given LogMode for a specified Windows Event Log"), ValueMap{"AutoBackup","Circular","Retain"}, Values{"AutoBackup","Circular","Retain"}] String LogMode; + [Write, Description("Specifies the given SecurityDescriptor for a specified Windows Event Log")] String SecurityDescriptor; + [Write, Description("Specifies the given LogFile path of a Windows Event Log")] String LogFilePath; + [Write, Description("Specifies the given LogRetentionDays for the Logmode 'AutoBackup'")] Sint32 LogRetentionDays; +}; diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/README.md b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/README.md new file mode 100644 index 0000000..3960eec --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/README.md @@ -0,0 +1,5 @@ +# Description + +This resource allows the configuration of the Logsize, Logmode, SecurityDescriptor, +RetentionDays and enabled/disabled the state of a specified Windows Event Log. +It is also possible to set the maximum size of the Windows Event Log. diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/en-US/DSC_WindowsEventLog.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/en-US/DSC_WindowsEventLog.strings.psd1 new file mode 100644 index 0000000..ef6fc6f --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/DSCResources/DSC_WindowsEventLog/en-US/DSC_WindowsEventLog.strings.psd1 @@ -0,0 +1,24 @@ +# culture ="en-US" +ConvertFrom-StringData -StringData @' + GettingEventlogName = Getting the Windows Event Log '{0}'. + TestingWindowsEventlogSecurityDescriptor = Setting the SecurityDescriptor for Windows Event Log '{0}' to '{1}'. + TestingWindowsEventlogLogFilePath = Setting the LogFilePath for Windows Event Log '{0}' to '{1}'. + TestingEventlogMaximumSizeInBytes = Testing the given LogSize '{1}' for Windows Event Log '{0}'. + TestingEventlogLogMode = Testing the given LogMode '{1}' for Windows Event Log '{0}'. + TestingEventlogLogRetentionDays = Testing the given Retention '{1}' days for Windows Event Log '{0}'. + TestingEventlogIsEnabled = Testing the given State '{1}' for Windows Event Log '{0}'. + SettingEventlogLogMode = Setting the LogMode for Windows Event Log '{0}' to '{1}'. + SettingEventlogLogRetentionDays = Setting the Log Retention for Windows Event Log '{0}' to '{1}' days. + SettingEventlogLogSize = Setting the LogSize for Windows Event Log '{0}' to '{1}'. + SettingEventlogLogFilePath = Setting the LogFilePath for Windows Event Log '{0}' to '{1}'. + SettingEventlogIsEnabled = Setting the IsEnabled configuration for Windows Event Log '{0}' to '{1}'. + SettingEventlogSecurityDescriptor = Setting the SecurityDescriptor configuration for Windows Event Log '{0}' to '{1}'. + SettingWindowsEventlogRetentionDaysSuccess = Updating Logfile Retention for Windows Event Log '{0}' successfully to '{1}' days. + SettingWindowsEventlogRetentionDaysFailed = Updating Logfile Retention for Windows Event Log '{0}' to '{1}' failed. + SetResourceIsInDesiredState = Windows Event Log '{0}' is in desired state for configuration '{1}'. + EventlogLogRetentionDaysWrongMode = Setting the Log Retention for Windows Event Log '{0}' failed. LogMode must be AutoBackup. + SaveWindowsEventlogSuccess = Saving Windows Event Log settings successful. + SaveWindowsEventlogFailure = Saving Windows Event Log settings failed. + WindowsEventLogNotFound = Windows Event Log '{0}' is not found. + WindowsEventLogFound = Windows Event Log '{0}' was found. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/ComputerManagementDsc.Common.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/ComputerManagementDsc.Common.psm1 new file mode 100644 index 0000000..9976f09 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/ComputerManagementDsc.Common.psm1 @@ -0,0 +1,635 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + This function tests if a cmdlet exists. + + .PARAMETER Name + The name of the cmdlet to check for. + + .PARAMETER Module + The module containing the command. +#> +function Test-Command +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $Module + ) + + return ($null -ne (Get-Command @PSBoundParameters -ErrorAction SilentlyContinue)) +} # function Test-Command + +<# + .SYNOPSIS + Get the of the current time zone Id. + + .NOTES + This function is also used by ScheduledTask integration tests. +#> +function Get-TimeZoneId +{ + [CmdletBinding()] + param + ( + ) + + if (Test-Command -Name 'Get-TimeZone' -Module 'Microsoft.PowerShell.Management') + { + Write-Verbose -Message ($script:localizedData.GettingTimeZoneMessage -f 'Cmdlets') + + $timeZone = (Get-TimeZone).StandardName + } + else + { + Write-Verbose -Message ($script:localizedData.GettingTimeZoneMessage -f 'CIM') + + $timeZone = (Get-CimInstance ` + -ClassName Win32_TimeZone ` + -Namespace root\cimv2).StandardName + } + + Write-Verbose -Message ($script:localizedData.CurrentTimeZoneMessage -f $timeZone) + + $timeZoneInfo = [System.TimeZoneInfo]::GetSystemTimeZones() | + Where-Object -Property StandardName -EQ $timeZone + + return $timeZoneInfo.Id +} # function Get-TimeZoneId + +<# + .SYNOPSIS + Compare a time zone Id with the current time zone Id. + + .PARAMETER TimeZoneId + The Id of the time zone to compare with the current time zone. + + .NOTES + This function is also used by ScheduledTask integration tests. +#> +function Test-TimeZoneId +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TimeZoneId + ) + + # Test if the expected value is the same as the current value. + $currentTimeZoneId = Get-TimeZoneId + + return $TimeZoneId -eq $currentTimeZoneId +} # function Test-TimeZoneId + +<# + .SYNOPSIS + Sets the current time zone using a time zone Id. + + .PARAMETER TimeZoneId + The Id of the time zone to set. + + .NOTES + This function is also used by ScheduledTask integration tests. +#> +function Set-TimeZoneId +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TimeZoneId + ) + + if (Test-Command -Name 'Set-TimeZone' -Module 'Microsoft.PowerShell.Management') + { + Set-TimeZone -Id $TimeZoneId + } + else + { + if (Test-Command -Name 'Add-Type' -Module 'Microsoft.Powershell.Utility') + { + # We can use reflection to modify the time zone. + Write-Verbose -Message ($script:localizedData.SettingTimeZoneMessage -f $TimeZoneId, '.NET') + + Set-TimeZoneUsingDotNet -TimeZoneId $TimeZoneId + } + else + { + # For anything else use TZUTIL.EXE. + Write-Verbose -Message ($script:localizedData.SettingTimeZoneMessage -f $TimeZoneId, 'TZUTIL.EXE') + + try + { + & tzutil.exe @('/s', $TimeZoneId) + } + catch + { + Write-Verbose -Message $_.Exception.Message + } # try + } # if + } # if + + Write-Verbose -Message ($script:localizedData.TimeZoneUpdatedMessage -f $TimeZoneId) +} # function Set-TimeZoneId + +<# + .SYNOPSIS + This function sets the time zone on the machine using .NET reflection. + It exists so that the ::Set method can be mocked by Pester. + + .PARAMETER TimeZoneId + The Id of the time zone to set using .NET. + + .NOTES + This function is also used by ScheduledTask integration tests. +#> +function Set-TimeZoneUsingDotNet +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $TimeZoneId + ) + + # Add the [TimeZoneHelper.TimeZone] type if it is not defined. + if (-not ([System.Management.Automation.PSTypeName] 'TimeZoneHelper.TimeZone').Type) + { + Write-Verbose -Message ($script:localizedData.AddingSetTimeZoneDotNetTypeMessage) + + $setTimeZoneCs = Get-Content ` + -Path (Join-Path -Path $PSScriptRoot -ChildPath 'SetTimeZone.cs') ` + -Raw + + Add-Type ` + -Language CSharp ` + -TypeDefinition $setTimeZoneCs + } # if + + [Microsoft.PowerShell.TimeZone.TimeZone]::Set($TimeZoneId) +} # function Set-TimeZoneUsingDotNet + +<# + .SYNOPSIS + This function gets a specific power plan or all available power plans. + The function returns one or more hashtable(s) containing + the friendly name and GUID of the power plan(s). + + .PARAMETER PowerPlan + Friendly name or GUID of a power plan to get. + When not specified the function will return all available power plans. + + .NOTES + This function is used by the PowerPlan resource. +#> +function Get-PowerPlan +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable[]])] + param + ( + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $PowerPlan + ) + + $ErrorActionPreference = 'Stop' + + # Get all available power plan(s) as a hashtable with friendly name and GUID + $allAvailablePowerPlans = Get-PowerPlanUsingPInvoke + + # If a specific power plan is specified filter for it otherwise return all + if ($PSBoundParameters.ContainsKey('PowerPlan')) + { + $selectedPowerPlan = $allAvailablePowerPlans | Where-Object -FilterScript { + ($_.FriendlyName -eq $PowerPlan) -or + ($_.Guid -eq $PowerPlan) + } + + return $selectedPowerPlan + } + else + { + return $allAvailablePowerPlans + } +} + +<# + .SYNOPSIS + This function gets the friendly name of a power plan specified by its GUID. + + .PARAMETER PowerPlanGuid + The GUID of a power plan. + + .NOTES + This function uses Platform Invoke (P/Invoke) mechanism to call native Windows APIs + because the Win32_PowerPlan WMI class has issues on some platforms or is unavailable at all. + e.g Server 2012 R2 core or Nano Server. + This function is used by the Get-PowerPlan function. +#> +function Get-PowerPlanFriendlyName +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Guid] + $PowerPlanGuid + ) + + $ErrorActionPreference = 'Stop' + + # Define C# signature of PowerReadFriendlyName function + $MethodDefinition = @' + [DllImport("powrprof.dll", CharSet = CharSet.Unicode)] + public static extern uint PowerReadFriendlyName( + IntPtr RootPowerKey, + Guid SchemeGuid, + IntPtr SubGroupOfPowerSettingGuid, + IntPtr PowerSettingGuid, + IntPtr Buffer, + ref uint BufferSize + ); +'@ + + # Create Win32PowerReadFriendlyName object with the static method PowerReadFriendlyName. + $powerprof = Add-Type ` + -MemberDefinition $MethodDefinition ` + -Name 'Win32PowerReadFriendlyName' ` + -Namespace 'Win32Functions' ` + -PassThru + + # Define variable for buffer size which whe have frist to figure out. + $bufferSize = 0 + $returnCode = 0 + + try + { + <# + Frist get needed buffer size by calling PowerReadFriendlyName + with NULL value for 'Buffer' parameter to get the required buffer size. + #> + $returnCode = $powerprof::PowerReadFriendlyName( + [System.IntPtr]::Zero, + $PowerPlanGuid, + [System.IntPtr]::Zero, + [System.IntPtr]::Zero, + [System.IntPtr]::Zero, + [ref]$bufferSize) + + if ($returnCode -eq 0) + { + try + { + # Now lets allocate the needed buffer size + $ptrName = [System.Runtime.InteropServices.Marshal]::AllocHGlobal([System.Int32]$bufferSize) + + <# + Get the actual friendly name of the powerlan by calling PowerReadFriendlyName again. + This time with the correct buffer size for the 'Buffer' parameter. + #> + $returnCode = $powerprof::PowerReadFriendlyName( + [System.IntPtr]::Zero, + $PowerPlanGuid, + [System.IntPtr]::Zero, + [System.IntPtr]::Zero, + $ptrName, + [ref]$bufferSize) + + if ($returnCode -eq 0) + { + # Create a managed String object form the unmanged memory block. + $friendlyName = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($ptrName) + return $friendlyName + } + else + { + throw [ComponentModel.Win32Exception]::new([System.Int32]$returnCode) + } + } + finally + { + # Make sure allocated memory is freed up again. + [System.Runtime.InteropServices.Marshal]::FreeHGlobal($ptrName) + } + } + else + { + throw [ComponentModel.Win32Exception]::new([System.Int32]$returnCode) + } + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.UnableToGetPowerSchemeFriendlyName -f $PowerPlanGuid, $_.Exception.NativeErrorCode, $_.Exception.Message) + } +} + +<# + .SYNOPSIS + This function gets the GUID of the currently active power plan. + + .NOTES + This function uses Platform Invoke (P/Invoke) mechanism to call native Windows APIs + because the Win32_PowerPlan WMI class has issues on some platforms or is unavailable at all. + e.g Server 2012 R2 core or Nano Server. + This function is used by the PowerPlan resource. +#> +function Get-ActivePowerPlan +{ + [CmdletBinding()] + [OutputType([System.Guid])] + param + ( + ) + + $ErrorActionPreference = 'Stop' + + # Define C# signature of PowerGetActiveScheme function + $powerGetActiveSchemeDefinition = @' + [DllImport("powrprof.dll", CharSet = CharSet.Unicode)] + public static extern uint PowerGetActiveScheme(IntPtr UserRootPowerKey, ref IntPtr ActivePolicyGuid); +'@ + + $returnCode = 0 + + # Create Win32PowerGetActiveScheme object with the static method PowerGetActiveScheme + $powrprof = Add-Type ` + -MemberDefinition $powerGetActiveSchemeDefinition ` + -Name 'Win32PowerGetActiveScheme' ` + -Namespace 'Win32Functions' ` + -PassThru + + try + { + # Get the GUID of the active power scheme + $activeSchemeGuid = [System.IntPtr]::Zero + $returnCode = $powrprof::PowerGetActiveScheme([System.IntPtr]::Zero, [ref]$activeSchemeGuid) + + # Check for non 0 return codes / errors form the native function + if ($returnCode -ne 0) + { + # Create a Win32Exception object out of the return code + $win32Exception = ([ComponentModel.Win32Exception]::new([System.Int32]$returnCode)) + New-InvalidOperationException ` + -Message ($script:localizedData.FailedToGetActivePowerScheme -f $win32Exception.NativeErrorCode, $win32Exception.Message) + } + + # Create a managed Guid object form the unmanged memory block and return it + return [System.Runtime.InteropServices.Marshal]::PtrToStructure($activeSchemeGuid, [System.Type][System.Guid]) + } + finally + { + # Make sure allocated memory is freed up again. + [System.Runtime.InteropServices.Marshal]::FreeHGlobal($activeSchemeGuid) + } +} + +<# + .SYNOPSIS + This function enumerates all available power plans/schemes. + The function returns one or more hashtable(s) containing + the friendly name and GUID of the power plan(s). + + .NOTES + This function uses Platform Invoke (P/Invoke) mechanism to call native Windows APIs + because the Win32_PowerPlan WMI class has issues on some platforms or is unavailable at all. + e.g Server 2012 R2 core or Nano Server. + This function is used by the PowerPlan resource. +#> +function Get-PowerPlanUsingPInvoke +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable[]])] + param + ( + ) + + $ErrorActionPreference = 'Stop' + + Write-Verbose -Message ($script:localizedData.EnumeratingPowerPlans) + + # Define C# signature of PowerEnumerate function + $powerEnumerateDefinition = @' + [DllImport("powrprof.dll", CharSet = CharSet.Unicode)] + public static extern uint PowerEnumerate( + IntPtr RootPowerKey, + IntPtr SchemeGuid, + IntPtr SubGroupOfPowerSetting, + int AccessFlags, + uint Index, + IntPtr rBuffer, + ref uint BufferSize + ); +'@ + + # Create Win32PowerEnumerate object with the static method PowerEnumerate + $powrprof = Add-Type ` + -MemberDefinition $powerEnumerateDefinition ` + -Name 'Win32PowerEnumerate' ` + -Namespace 'Win32Functions' ` + -PassThru + + $index = 0 + $returnCode = 0 + $allAvailablePowerPlans = [System.Collections.ArrayList]::new() + + # PowerEnumerate returns the GUID of the powerplan(s). Guid = 16 Bytes. + $bufferSize = 16 + + <# + The PowerEnumerate function returns only one guid at a time. + So we have to loop here until error code 259 (no more data) is returned to get all power plan GUIDs. + #> + while ($returnCode -ne 259) + { + try + { + # Allocate buffer + $readBuffer = [System.Runtime.InteropServices.Marshal]::AllocHGlobal([System.Int32]$bufferSize) + + # Get Guid of the power plan using the native PowerEnumerate function + $returnCode = $powrprof::PowerEnumerate([System.IntPtr]::Zero, [System.IntPtr]::Zero, [System.IntPtr]::Zero, 16, $index, $readBuffer, [ref]$bufferSize) + + # Return Code 259 means no more data so we stop here. + if ($returnCode -eq 259) + { + break + } + + # Check for non 0 return codes / errors form the native function. + if ($returnCode -ne 0) + { + # Create a Win32Exception object out of the return code + $win32Exception = ([ComponentModel.Win32Exception]::new([System.Int32]$returnCode)) + New-InvalidOperationException ` + -Message ($script:localizedData.UnableToEnumeratingPowerSchemes -f $win32Exception.NativeErrorCode, $win32Exception.Message) + } + + # Create a managed Guid object form the unmanaged memory block + $planGuid = [System.Runtime.InteropServices.Marshal]::PtrToStructure($readBuffer, [System.Type][System.Guid]) + + Write-Verbose -Message ($script:localizedData.PowerPlanFound -f $planGuid) + + # Now get the friendly name of to the power plan + $planFriendlyName = Get-PowerPlanFriendlyName -PowerPlanGuid $planGuid + + Write-Verbose -Message ($script:localizedData.PowerPlanFriendlyNameFound -f $planFriendlyName) + + $null = $allAvailablePowerPlans.Add( + @{ + FriendlyName = $planFriendlyName + Guid = $planGuid + } + ) + + $index++ + } + finally + { + # Free up memory + [System.Runtime.InteropServices.Marshal]::FreeHGlobal($readBuffer) + } + } + + Write-Verbose -Message ($script:localizedData.AllPowerPlansFound) + + return $allAvailablePowerPlans +} + +<# + .SYNOPSIS + This function activates a specific power plan (specified by its GUID). + + .PARAMETER Guid + GUID of a power plan to activate. + + .NOTES + This function uses Platform Invoke (P/Invoke) mechanism to call native Windows APIs + because the Win32_PowerPlan WMI class has on some platforms issues or is unavailable at all. + e.g Server 2012 R2 core or Nano Server. + This function is used by the Get-PowerPlan function respectively the PowerPlan resource. +#> +function Set-ActivePowerPlan +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Guid] + $PowerPlanGuid + ) + + $ErrorActionPreference = 'Stop' + + # Define C# signature of PowerSetActiveScheme function + $powerSetActiveSchemeDefinition = @' + [DllImport("powrprof.dll", CharSet = CharSet.Auto)] + public static extern uint PowerSetActiveScheme( + IntPtr RootPowerKey, + Guid SchemeGuid + ); +'@ + + # Create Win32PowerSetActiveScheme object with the static method PowerSetActiveScheme. + $powrprof = Add-Type ` + -MemberDefinition $powerSetActiveSchemeDefinition ` + -Name 'Win32PowerSetActiveScheme' ` + -Namespace 'Win32Functions' ` + -PassThru + + try + { + # Set the active power scheme with the native function + $returnCode = $powrprof::PowerSetActiveScheme([System.IntPtr]::Zero, $PowerPlanGuid) + + # Check for non 0 return codes / errors form the native function + if ($returnCode -ne 0) + { + throw [ComponentModel.Win32Exception]::new([int]$returnCode) + } + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.FailedToSetActivePowerScheme -f $PowerPlanGuid, $_.Exception.NativeErrorCode, $_.Exception.Message) + } +} + +<# + .SYNOPSIS + Returns the value of the provided in the Name parameter, at the registry + location provided in the Path parameter. + + .PARAMETER Path + String containing the path in the registry to the property name. + + .PARAMETER PropertyName + String containing the name of the property for which the value is returned. +#> +function Get-RegistryPropertyValue +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [System.String] + $Name + ) + + $getItemPropertyParameters = @{ + Path = $Path + Name = $Name + } + + <# + Using a try/catch block instead of 'SilentlyContinue' to be + able to unit test a failing registry path. + #> + try + { + $getItemPropertyResult = (Get-ItemProperty @getItemPropertyParameters -ErrorAction Stop).$Name + } + catch + { + $getItemPropertyResult = $null + } + + return $getItemPropertyResult +} + +Export-ModuleMember -Function @( + 'Test-Command' + 'Get-TimeZoneId' + 'Test-TimeZoneId' + 'Set-TimeZoneId' + 'Set-TimeZoneUsingDotNet' + 'Get-PowerPlan' + 'Get-ActivePowerPlan' + 'Set-ActivePowerPlan' + 'Get-RegistryPropertyValue' +) diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/SetTimeZone.cs b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/SetTimeZone.cs new file mode 100644 index 0000000..ab10181 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/SetTimeZone.cs @@ -0,0 +1,271 @@ +// This file enables setting of the machine time zone +// using .NET framework classes. +// It can be used to set the time zone when the +// PowerShell time zone cmdlets are not available. +// +// It creates a namespace Microsoft.PowerShell.TimeZone +// containing the classes and structures required to +// set the time zone. +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Security; +using System.Runtime.InteropServices; +using Microsoft.Win32; +namespace Microsoft.PowerShell.TimeZone +{ + [StructLayoutAttribute(LayoutKind.Sequential)] + public struct SystemTime + { + [MarshalAs(UnmanagedType.U2)] + public short Year; + [MarshalAs(UnmanagedType.U2)] + public short Month; + [MarshalAs(UnmanagedType.U2)] + public short DayOfWeek; + [MarshalAs(UnmanagedType.U2)] + public short Day; + [MarshalAs(UnmanagedType.U2)] + public short Hour; + [MarshalAs(UnmanagedType.U2)] + public short Minute; + [MarshalAs(UnmanagedType.U2)] + public short Second; + [MarshalAs(UnmanagedType.U2)] + public short Milliseconds; + } + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct TimeZoneInformation + { + [MarshalAs(UnmanagedType.I4)] + public int Bias; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)] + public string StandardName; + public SystemTime StandardDate; + [MarshalAs(UnmanagedType.I4)] + public int StandardBias; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)] + public string DaylightName; + public SystemTime DaylightDate; + [MarshalAs(UnmanagedType.I4)] + public int DaylightBias; + } + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct DynamicTimeZoneInformation + { + public int Bias; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string StandardName; + public SystemTime StandardDate; + public int StandardBias; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string DaylightName; + public SystemTime DaylightDate; + public int DaylightBias; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string TimeZoneKeyName; + [MarshalAs(UnmanagedType.U1)] + public bool DynamicDaylightTimeDisabled; + } + [StructLayout(LayoutKind.Sequential)] + public struct RegistryTimeZoneInformation + { + [MarshalAs(UnmanagedType.I4)] + public int Bias; + [MarshalAs(UnmanagedType.I4)] + public int StandardBias; + [MarshalAs(UnmanagedType.I4)] + public int DaylightBias; + public SystemTime StandardDate; + public SystemTime DaylightDate; + public RegistryTimeZoneInformation(TimeZoneInformation tzi) + { + this.Bias = tzi.Bias; + this.StandardDate = tzi.StandardDate; + this.StandardBias = tzi.StandardBias; + this.DaylightDate = tzi.DaylightDate; + this.DaylightBias = tzi.DaylightBias; + } + public RegistryTimeZoneInformation(byte[] bytes) + { + if ((bytes == null) || (bytes.Length != 0x2c)) + { + throw new ArgumentException("Argument_InvalidREG_TZI_FORMAT"); + } + this.Bias = BitConverter.ToInt32(bytes, 0); + this.StandardBias = BitConverter.ToInt32(bytes, 4); + this.DaylightBias = BitConverter.ToInt32(bytes, 8); + this.StandardDate.Year = BitConverter.ToInt16(bytes, 12); + this.StandardDate.Month = BitConverter.ToInt16(bytes, 14); + this.StandardDate.DayOfWeek = BitConverter.ToInt16(bytes, 0x10); + this.StandardDate.Day = BitConverter.ToInt16(bytes, 0x12); + this.StandardDate.Hour = BitConverter.ToInt16(bytes, 20); + this.StandardDate.Minute = BitConverter.ToInt16(bytes, 0x16); + this.StandardDate.Second = BitConverter.ToInt16(bytes, 0x18); + this.StandardDate.Milliseconds = BitConverter.ToInt16(bytes, 0x1a); + this.DaylightDate.Year = BitConverter.ToInt16(bytes, 0x1c); + this.DaylightDate.Month = BitConverter.ToInt16(bytes, 30); + this.DaylightDate.DayOfWeek = BitConverter.ToInt16(bytes, 0x20); + this.DaylightDate.Day = BitConverter.ToInt16(bytes, 0x22); + this.DaylightDate.Hour = BitConverter.ToInt16(bytes, 0x24); + this.DaylightDate.Minute = BitConverter.ToInt16(bytes, 0x26); + this.DaylightDate.Second = BitConverter.ToInt16(bytes, 40); + this.DaylightDate.Milliseconds = BitConverter.ToInt16(bytes, 0x2a); + } + } + public class TokenPrivilegesAccess + { + [DllImport("advapi32.dll", CharSet = CharSet.Auto)] + public static extern int OpenProcessToken(int ProcessHandle, int DesiredAccess, + ref int tokenhandle); + [DllImport("kernel32.dll", CharSet = CharSet.Auto)] + public static extern int GetCurrentProcess(); + [DllImport("advapi32.dll", CharSet = CharSet.Auto)] + public static extern int LookupPrivilegeValue(string lpsystemname, string lpname, + [MarshalAs(UnmanagedType.Struct)] ref LUID lpLuid); + [DllImport("advapi32.dll", CharSet = CharSet.Auto)] + public static extern int AdjustTokenPrivileges(int tokenhandle, int disableprivs, + [MarshalAs(UnmanagedType.Struct)]ref TOKEN_PRIVILEGE Newstate, int bufferlength, + int PreivousState, int Returnlength); + public const int TOKEN_ASSIGN_PRIMARY = 0x00000001; + public const int TOKEN_DUPLICATE = 0x00000002; + public const int TOKEN_IMPERSONATE = 0x00000004; + public const int TOKEN_QUERY = 0x00000008; + public const int TOKEN_QUERY_SOURCE = 0x00000010; + public const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; + public const int TOKEN_ADJUST_GROUPS = 0x00000040; + public const int TOKEN_ADJUST_DEFAULT = 0x00000080; + public const UInt32 SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001; + public const UInt32 SE_PRIVILEGE_ENABLED = 0x00000002; + public const UInt32 SE_PRIVILEGE_REMOVED = 0x00000004; + public const UInt32 SE_PRIVILEGE_USED_FOR_ACCESS = 0x80000000; + public static bool EnablePrivilege(string privilege) + { + try + { + int token = 0; + int retVal = 0; + TOKEN_PRIVILEGE TP = new TOKEN_PRIVILEGE(); + LUID LD = new LUID(); + retVal = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref token); + retVal = LookupPrivilegeValue(null, privilege, ref LD); + TP.PrivilegeCount = 1; + var luidAndAtt = new LUID_AND_ATTRIBUTES(); + luidAndAtt.Attributes = SE_PRIVILEGE_ENABLED; + luidAndAtt.Luid = LD; + TP.Privilege = luidAndAtt; + retVal = AdjustTokenPrivileges(token, 0, ref TP, 1024, 0, 0); + return true; + } + catch + { + return false; + } + } + public static bool DisablePrivilege(string privilege) + { + try + { + int token = 0; + int retVal = 0; + TOKEN_PRIVILEGE TP = new TOKEN_PRIVILEGE(); + LUID LD = new LUID(); + retVal = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref token); + retVal = LookupPrivilegeValue(null, privilege, ref LD); + TP.PrivilegeCount = 1; + // TP.Attributes should be none (not set) to disable privilege + var luidAndAtt = new LUID_AND_ATTRIBUTES(); + luidAndAtt.Luid = LD; + TP.Privilege = luidAndAtt; + retVal = AdjustTokenPrivileges(token, 0, ref TP, 1024, 0, 0); + return true; + } + catch + { + return false; + } + } + } + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct LUID + { + internal uint LowPart; + internal uint HighPart; + } + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct LUID_AND_ATTRIBUTES + { + internal LUID Luid; + internal uint Attributes; + } + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct TOKEN_PRIVILEGE + { + internal uint PrivilegeCount; + internal LUID_AND_ATTRIBUTES Privilege; + } + public class TimeZone + { + public const int ERROR_ACCESS_DENIED = 0x005; + public const int CORSEC_E_MISSING_STRONGNAME = -2146233317; + [DllImport("kernel32.dll", CharSet = CharSet.Auto)] + private static extern bool SetTimeZoneInformation([In] ref TimeZoneInformation lpTimeZoneInformation); + [DllImport("kernel32.dll", CharSet = CharSet.Auto)] + private static extern bool SetDynamicTimeZoneInformation([In] ref DynamicTimeZoneInformation lpTimeZoneInformation); + public static void Set(string name) + { + var regTimeZones = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones"); + var subKey = regTimeZones.GetSubKeyNames().Where(s => s == name).First(); + string daylightName = (string)regTimeZones.OpenSubKey(subKey).GetValue("Dlt"); + string standardName = (string)regTimeZones.OpenSubKey(subKey).GetValue("Std"); + byte[] tzi = (byte[])regTimeZones.OpenSubKey(subKey).GetValue("TZI"); + var regTzi = new RegistryTimeZoneInformation(tzi); + TokenPrivilegesAccess.EnablePrivilege("SeTimeZonePrivilege"); + bool didSet; + if (Environment.OSVersion.Version.Major < 6) + { + var tz = new TimeZoneInformation(); + tz.Bias = regTzi.Bias; + tz.DaylightBias = regTzi.DaylightBias; + tz.StandardBias = regTzi.StandardBias; + tz.DaylightDate = regTzi.DaylightDate; + tz.StandardDate = regTzi.StandardDate; + tz.DaylightName = daylightName; + tz.StandardName = standardName; + didSet = TimeZone.SetTimeZoneInformation(ref tz); + } + else + { + var tz = new DynamicTimeZoneInformation(); + tz.Bias = regTzi.Bias; + tz.DaylightBias = regTzi.DaylightBias; + tz.StandardBias = regTzi.StandardBias; + tz.DaylightDate = regTzi.DaylightDate; + tz.StandardDate = regTzi.StandardDate; + tz.DaylightName = daylightName; + tz.StandardName = standardName; + tz.TimeZoneKeyName = subKey; + tz.DynamicDaylightTimeDisabled = false; + didSet = TimeZone.SetDynamicTimeZoneInformation(ref tz); + } + int lastError = Marshal.GetLastWin32Error(); + TokenPrivilegesAccess.DisablePrivilege("SeTimeZonePrivilege"); + if (! didSet) + { + if (lastError == TimeZone.ERROR_ACCESS_DENIED) + { + throw new SecurityException("Access denied changing System TimeZone."); + } + else if (lastError == TimeZone.CORSEC_E_MISSING_STRONGNAME) + { + throw new SystemException("Application is not signed."); + } + else + { + throw new SystemException("Win32Error: " + lastError + "\nHRESULT: " + Marshal.GetHRForLastWin32Error()); + } + } + } + } +} diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/en-US/ComputerManagementDsc.Common.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/en-US/ComputerManagementDsc.Common.strings.psd1 new file mode 100644 index 0000000..54298d4 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/ComputerManagementDsc.Common/en-US/ComputerManagementDsc.Common.strings.psd1 @@ -0,0 +1,15 @@ +ConvertFrom-StringData @' + CurrentTimeZoneMessage = Current time zone is set to '{0}'. + GettingTimeZoneMessage = Getting current time zone using '{0}'. + SettingTimeZoneMessage = Setting time zone to '{0}' using '{1}'. + TimeZoneUpdatedMessage = Time zone has been updated to '{0}'. + AddingSetTimeZoneDotNetTypeMessage = Adding .NET Set time zone Type. + UnableToEnumeratingPowerSchemes = Error occurred while enumerating power schemes. Win32 error code: {0} - {1} + UnableToGetPowerSchemeFriendlyName = Error occurred while getting the friendly name of the power scheme with the GUID {0}. Win32 error code: {1} - {2} + FailedToGetActivePowerScheme = Error occurred while getting active power scheme. Win32 error code: {0} - {1} + FailedToSetActivePowerScheme = Error occurred while activating power scheme with the GUID {0}. Win32 error code: {1} - {2} + EnumeratingPowerPlans = Enumerating all available power plans/schemes on the system using native Win32 function 'PowerEnumerate'. + PowerPlanFound = Found power scheme '{0}'. Getting friendly name. + PowerPlanFriendlyNameFound = Friendly name is '{0}'. + AllPowerPlansFound = Enumerating of available power schemes done. +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 new file mode 100644 index 0000000..0c18ec0 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 @@ -0,0 +1,73 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'DscResource.Common.psm1' + + # Version number of this module. + ModuleVersion = '0.9.3' + + # ID used to uniquely identify this module + GUID = '9c9daa5b-5c00-472d-a588-c96e8e498450' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Common functions used in DSC Resources' + + # Minimum version of the PowerShell engine required by this module + PowerShellVersion = '4.0' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @('Assert-BoundParameter','Assert-IPAddress','Assert-Module','Compare-ResourcePropertyState','ConvertTo-CimInstance','ConvertTo-HashTable','Get-LocalizedData','Get-TemporaryFolder','New-InvalidArgumentException','New-InvalidDataException','New-InvalidOperationException','New-InvalidResultException','New-NotImplementedException','New-ObjectNotFoundException','Remove-CommonParameter','Set-DscMachineRebootRequired','Set-PSModulePath','Test-DscParameterState','Test-IsNanoServer') + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DSC', 'Localization') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/DscResource.Common/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/DscResource.Common' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [0.9.3] - 2020-07-25 + +## Fixed + +- Correction to `Test-DscParameterState` returning false positive when parameter + with an empty array is passed in `DesriedValues` or `CurrentValues` - fixes + [issue #53](https://github.com/dsccommunity/DscResource.Common/issues/53). + +' + + Prerelease = '' + } # End of PSData hashtable + + } # End of PrivateData hashtable +} + + + + diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 new file mode 100644 index 0000000..17d1159 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 @@ -0,0 +1,2179 @@ +#Region './prefix.ps1' 0 +$script:modulesFolderPath = Split-Path -Path $PSScriptRoot -Parent +#EndRegion './prefix.ps1' 1 +#Region './Private/Test-DscObjectHasProperty.ps1' 0 +<# + .SYNOPSIS + Tests if an object has a property. + + .DESCRIPTION + Tests if the specified object has the specified property and return + $true or $false. + + .PARAMETER Object + Specifies the object to test for the specified property. + + .PARAMETER PropertyName + Specifies the property name to test for. + + .EXAMPLE + Test-DscObjectHasProperty -Object 'AnyString' -PropertyName 'Length' +#> +function Test-DscObjectHasProperty +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $Object, + + [Parameter(Mandatory = $true)] + [System.String] + $PropertyName + ) + + if ($Object.PSObject.Properties.Name -contains $PropertyName) + { + return [System.Boolean] $Object.$PropertyName + } + + return $false +} +#EndRegion './Private/Test-DscObjectHasProperty.ps1' 39 +#Region './Private/Test-DscPropertyState.ps1' 0 +<# + .SYNOPSIS + Compares the current and the desired value of a property. + + .DESCRIPTION + This function is used to compare the current and the desired value of a + property. + + .PARAMETER Values + This is set to a hash table with the current value (the CurrentValue key) + and desired value (the DesiredValue key). + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 'John' + DesiredValue = 'Alice' + } + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 1 + DesiredValue = 2 + } + + .NOTES + This function is used by the cmdlet Compare-ResourcePropertyState. +#> +function Test-DscPropertyState +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Values + ) + + if ($null -eq $Values.CurrentValue -and $null -eq $Values.DesiredValue) + { + # Both values are $null so return $true + $returnValue = $true + } + elseif ($null -eq $Values.CurrentValue -or $null -eq $Values.DesiredValue) + { + # Either CurrentValue or DesiredValue are $null so return $false + $returnValue = $false + } + elseif ( + $Values.DesiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]] ` + -or $Values.DesiredValue -is [System.Array] -and $Values.DesiredValue[0] -is [Microsoft.Management.Infrastructure.CimInstance] + ) + { + if (-not $Values.ContainsKey('KeyProperties')) + { + $errorMessage = $script:localizedData.KeyPropertiesMissing + + New-InvalidOperationException -Message $errorMessage + } + + $propertyState = @() + + <# + It is a collection of CIM instances, then recursively call + Test-DscPropertyState for each CIM instance in the collection. + #> + foreach ($desiredCimInstance in $Values.DesiredValue) + { + $currentCimInstance = $Values.CurrentValue + + <# + Use the CIM instance Key properties to filter out the current + values if the exist. + #> + foreach ($keyProperty in $Values.KeyProperties) + { + $currentCimInstance = $currentCimInstance | + Where-Object -Property $keyProperty -EQ -Value $desiredCimInstance.$keyProperty + } + + if ($currentCimInstance.Count -gt 1) + { + $errorMessage = $script:localizedData.TooManyCimInstances + + New-InvalidOperationException -Message $errorMessage + } + + if ($currentCimInstance) + { + $keyCimInstanceProperties = $currentCimInstance.CimInstanceProperties | + Where-Object -FilterScript { + $_.Name -in $Values.KeyProperties + } + + <# + For each key property build a string representation of the + property name and its value. + #> + $keyPropertyValues = $keyCimInstanceProperties.ForEach({'{0}="{1}"' -f $_.Name, ($_.Value -join ',')}) + + Write-Debug -Message ( + $script:localizedData.TestingCimInstance -f @( + $currentCimInstance.CimClass.CimClassName, + ($keyPropertyValues -join ';') + ) + ) + } + else + { + $keyCimInstanceProperties = $desiredCimInstance.CimInstanceProperties | + Where-Object -FilterScript { + $_.Name -in $Values.KeyProperties + } + + <# + For each key property build a string representation of the + property name and its value. + #> + $keyPropertyValues = $keyCimInstanceProperties.ForEach({'{0}="{1}"' -f $_.Name, ($_.Value -join ',')}) + + Write-Debug -Message ( + $script:localizedData.MissingCimInstance -f @( + $desiredCimInstance.CimClass.CimClassName, + ($keyPropertyValues -join ';') + ) + ) + } + + # Recursively call Test-DscPropertyState with the CimInstance to evaluate. + $propertyState += Test-DscPropertyState -Values @{ + CurrentValue = $currentCimInstance + DesiredValue = $desiredCimInstance + } + } + + # Return $false if one property is found to not be in desired state. + $returnValue = -not ($false -in $propertyState) + } + elseif ($Values.DesiredValue -is [Microsoft.Management.Infrastructure.CimInstance]) + { + $propertyState = @() + + <# + It is a CIM instance, recursively call Test-DscPropertyState for each + CIM instance property. + #> + $desiredCimInstanceProperties = $Values.DesiredValue.CimInstanceProperties | + Select-Object -Property @('Name', 'Value') + + if ($desiredCimInstanceProperties) + { + foreach ($desiredCimInstanceProperty in $desiredCimInstanceProperties) + { + <# + Recursively call Test-DscPropertyState to evaluate each property + in the CimInstance. + #> + $propertyState += Test-DscPropertyState -Values @{ + CurrentValue = $Values.CurrentValue.($desiredCimInstanceProperty.Name) + DesiredValue = $desiredCimInstanceProperty.Value + } + } + } + else + { + if ($Values.CurrentValue.CimInstanceProperties.Count -gt 0) + { + # Current value did not have any CIM properties, but desired state has. + $propertyState += $false + } + } + + # Return $false if one property is found to not be in desired state. + $returnValue = -not ($false -in $propertyState) + } + elseif ($Values.DesiredValue -is [System.Array] -or $Values.CurrentValue -is [System.Array]) + { + $compareObjectParameters = @{ + ReferenceObject = $Values.CurrentValue + DifferenceObject = $Values.DesiredValue + } + + $arrayCompare = Compare-Object @compareObjectParameters + + if ($null -ne $arrayCompare) + { + Write-Debug -Message $script:localizedData.ArrayDoesNotMatch + + $arrayCompare | + ForEach-Object -Process { + if ($_.SideIndicator -eq '=>') + { + Write-Debug -Message ( + $script:localizedData.ArrayValueIsAbsent -f $_.InputObject + ) + } + else + { + Write-Debug -Message ( + $script:localizedData.ArrayValueIsPresent -f $_.InputObject + ) + } + } + + $returnValue = $false + } + else + { + $returnValue = $true + } + } + elseif ($Values.CurrentValue -ne $Values.DesiredValue) + { + $desiredType = $Values.DesiredValue.GetType() + + $returnValue = $false + + $supportedTypes = @( + 'String' + 'Int32' + 'UInt32' + 'Int16' + 'UInt16' + 'Single' + 'Boolean' + ) + + if ($desiredType.Name -notin $supportedTypes) + { + Write-Warning -Message ($script:localizedData.UnableToCompareType -f $desiredType.Name) + } + else + { + Write-Debug -Message ( + $script:localizedData.PropertyValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $Values.CurrentValue, $Values.DesiredValue + ) + } + } + else + { + $returnValue = $true + } + + return $returnValue +} +#EndRegion './Private/Test-DscPropertyState.ps1' 246 +#Region './Public/Assert-BoundParameter.ps1' 0 +<# + .SYNOPSIS + Throws an error if there is a bound parameter that exists in both the + mutually exclusive lists. + + .DESCRIPTION + Throws an error if there is a bound parameter that exists in both the + mutually exclusive lists. + + .PARAMETER BoundParameterList + The parameters that should be evaluated against the mutually exclusive + lists MutuallyExclusiveList1 and MutuallyExclusiveList2. This parameter is + normally set to the $PSBoundParameters variable. + + .PARAMETER MutuallyExclusiveList1 + An array of parameter names that are not allowed to be bound at the + same time as those in MutuallyExclusiveList2. + + .PARAMETER MutuallyExclusiveList2 + An array of parameter names that are not allowed to be bound at the + same time as those in MutuallyExclusiveList1. + + .EXAMPLE + $assertBoundParameterParameters = @{ + BoundParameterList = $PSBoundParameters + MutuallyExclusiveList1 = @( + 'Parameter1' + ) + MutuallyExclusiveList2 = @( + 'Parameter2' + ) + } + + Assert-BoundParameter @assertBoundParameterParameters + + This example throws an exception if `$PSBoundParameters` contains both + the parameters `Parameter1` and `Parameter2`. +#> +function Assert-BoundParameter +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyCollection()] + [System.Collections.Hashtable] + $BoundParameterList, + + [Parameter(Mandatory = $true)] + [System.String[]] + $MutuallyExclusiveList1, + + [Parameter(Mandatory = $true)] + [System.String[]] + $MutuallyExclusiveList2 + ) + + $itemFoundFromList1 = $BoundParameterList.Keys.Where({ $_ -in $MutuallyExclusiveList1 }) + $itemFoundFromList2 = $BoundParameterList.Keys.Where({ $_ -in $MutuallyExclusiveList2 }) + + if ($itemFoundFromList1.Count -gt 0 -and $itemFoundFromList2.Count -gt 0) + { + $errorMessage = ` + $script:localizedData.ParameterUsageWrong ` + -f ($MutuallyExclusiveList1 -join "','"), ($MutuallyExclusiveList2 -join "','") + + New-InvalidArgumentException -ArgumentName 'Parameters' -Message $errorMessage + } +} +#EndRegion './Public/Assert-BoundParameter.ps1' 69 +#Region './Public/Assert-IPAddress.ps1' 0 +<# + .SYNOPSIS + Asserts that the specified IP address is valid. + + .DESCRIPTION + Checks the IP address so that it is valid and do not conflict with address + family. If any problems are detected an exception will be thrown. + + .PARAMETER AddressFamily + IP address family that the supplied Address should be in. Valid values are + 'IPv4' or 'IPv6'. + + .PARAMETER Address + Specifies an IPv4 or IPv6 address. + + .EXAMPLE + Assert-IPAddress -Address '127.0.0.1' + + This will assert that the supplied address is a valid IPv4 address. + If it is not an exception will be thrown. + + .EXAMPLE + Assert-IPAddress -Address 'fe80:ab04:30F5:002b::1' + + This will assert that the supplied address is a valid IPv6 address. + If it is not an exception will be thrown. + + .EXAMPLE + Assert-IPAddress -Address 'fe80:ab04:30F5:002b::1' -AddressFamily 'IPv6' + + This will assert that address is valid and that it matches the + supplied address family. If the supplied address family does not match + the address an exception will be thrown. +#> +function Assert-IPAddress +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Address + ) + + [System.Net.IPAddress] $ipAddress = $null + + if (-not ([System.Net.IPAddress]::TryParse($Address, [ref] $ipAddress))) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressFormatError -f $Address) ` + -ArgumentName 'Address' + } + + if ($AddressFamily) + { + switch ($AddressFamily) + { + 'IPv4' + { + if ($ipAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork.ToString()) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressIPv6MismatchError -f $Address, $AddressFamily) ` + -ArgumentName 'AddressFamily' + } + } + + 'IPv6' + { + if ($ipAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetworkV6.ToString()) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressIPv4MismatchError -f $Address, $AddressFamily) ` + -ArgumentName 'AddressFamily' + } + } + } + } +} +#EndRegion './Public/Assert-IPAddress.ps1' 85 +#Region './Public/Assert-Module.ps1' 0 +<# + .SYNOPSIS + Assert if the specific module is available to be imported. + + .DESCRIPTION + Assert if the specific module is available to be imported. + + .PARAMETER ModuleName + Specifies the name of the module to assert. + + .PARAMETER ImportModule + Specfiies to import the module if it is asserted. + + .EXAMPLE + Assert-Module -ModuleName 'DhcpServer' + + This asserts that the module DhcpServer is available on the system. +#> +function Assert-Module +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ModuleName, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ImportModule + ) + + if (-not (Get-Module -Name $ModuleName -ListAvailable)) + { + $errorMessage = $script:localizedData.ModuleNotFound -f $ModuleName + New-ObjectNotFoundException -Message $errorMessage + } + + if ($ImportModule) + { + Import-Module -Name $ModuleName + } +} +#EndRegion './Public/Assert-Module.ps1' 43 +#Region './Public/Compare-ResourcePropertyState.ps1' 0 +<# + .SYNOPSIS + Compare current and desired property values for any DSC resource. + + .DESCRIPTION + This function is used to compare current and desired property values for any + DSC resource, and return a hashtable with the metadata from the comparison. + + .PARAMETER CurrentValues + The current values that should be compared to to desired values. Normally + the values returned from Get-TargetResource. + + .PARAMETER DesiredValues + The values set in the configuration and is provided in the call to the + functions *-TargetResource, and that will be compared against current + values. Normally set to $PSBoundParameters. + + .PARAMETER Properties + An array of property names, from the keys provided in DesiredValues, that + will be compared. If this parameter is left out, all the keys in the + DesiredValues will be compared. + + .PARAMETER IgnoreProperties + An array of property names, from the keys provided in DesiredValues, that + will be ignored in the comparison. If this parameter is left out, all the + keys in the DesiredValues will be compared. + + .PARAMETER CimInstanceKeyProperties + A hashtable containing a key for each property that contain a collection + of CimInstances and the value is an array of strings of the CimInstance + key properties. + @{ + Permission = @('State') + } + + .EXAMPLE + $compareTargetResourceStateParameters = @{ + CurrentValues = (Get-TargetResource $PSBoundParameters) + DesiredValues = $PSBoundParameters + } + + $propertyState = Compare-ResourcePropertyState @compareTargetResourceStateParameters + + This examples call Compare-ResourcePropertyState with the current state + and the desired state and returns a hashtable array of all the properties + that was evaluated based on the properties pass in the parameter DesiredValues. +#> +function Compare-ResourcePropertyState +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $DesiredValues, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Properties, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $IgnoreProperties, + + [Parameter()] + [ValidateNotNull()] + [System.Collections.Hashtable] + $CimInstanceKeyProperties = @{} + ) + + if ($PSBoundParameters.ContainsKey('Properties')) + { + # Filter out the parameters (keys) not specified in Properties + $desiredValuesToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -notin $Properties + } + + $desiredValuesToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + else + { + <# + Remove any common parameters that might be part of DesiredValues, + if it $PSBoundParameters was used to pass the desired values. + #> + $commonParametersToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -in [System.Management.Automation.PSCmdlet]::CommonParameters ` + -or $_ -in [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + } + + $commonParametersToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + + # Remove any properties that should be ignored. + if ($PSBoundParameters.ContainsKey('IgnoreProperties')) + { + $IgnoreProperties | + ForEach-Object -Process { + if ($DesiredValues.ContainsKey($_)) + { + $DesiredValues.Remove($_) + } + } + } + + $compareTargetResourceStateReturnValue = @() + + foreach ($parameterName in $DesiredValues.Keys) + { + Write-Debug -Message ($script:localizedData.EvaluatePropertyState -f $parameterName) + + $parameterState = @{ + ParameterName = $parameterName + Expected = $DesiredValues.$parameterName + Actual = $CurrentValues.$parameterName + } + + # Check if the parameter is in compliance. + $isPropertyInDesiredState = Test-DscPropertyState -Values @{ + CurrentValue = $CurrentValues.$parameterName + DesiredValue = $DesiredValues.$parameterName + KeyProperties = $CimInstanceKeyProperties.$parameterName + } + + if ($isPropertyInDesiredState) + { + Write-Verbose -Message ($script:localizedData.PropertyInDesiredState -f $parameterName) + + $parameterState['InDesiredState'] = $true + } + else + { + Write-Verbose -Message ($script:localizedData.PropertyNotInDesiredState -f $parameterName) + + $parameterState['InDesiredState'] = $false + } + + $compareTargetResourceStateReturnValue += $parameterState + } + + return $compareTargetResourceStateReturnValue +} +#EndRegion './Public/Compare-ResourcePropertyState.ps1' 157 +#Region './Public/ConvertTo-CimInstance.ps1' 0 +<# + .SYNOPSIS + Converts a hashtable into a CimInstance array. + + .DESCRIPTION + This function is used to convert a hashtable into MSFT_KeyValuePair objects. + These are stored as an CimInstance array. DSC cannot handle hashtables but + CimInstances arrays storing MSFT_KeyValuePair. + + .PARAMETER Hashtable + A hashtable with the values to convert. + + .OUTPUTS + An object array with CimInstance objects. + + .EXAMPLE + ConvertTo-CimInstance -Hashtable @{ + String = 'a string' + Bool = $true + Int = 99 + Array = 'a, b, c' + } + + This example returns an CimInstance with the provided hashtable values. +#> +function ConvertTo-CimInstance +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Hashtable')] + [System.Collections.Hashtable] + $Hashtable + ) + + process + { + foreach ($item in $Hashtable.GetEnumerator()) + { + New-CimInstance -ClassName 'MSFT_KeyValuePair' -Namespace 'root/microsoft/Windows/DesiredStateConfiguration' -Property @{ + Key = $item.Key + Value = if ($item.Value -is [array]) + { + $item.Value -join ',' + } + else + { + $item.Value + } + } -ClientOnly + } + } +} +#EndRegion './Public/ConvertTo-CimInstance.ps1' 54 +#Region './Public/ConvertTo-HashTable.ps1' 0 +<# + .SYNOPSIS + Converts CimInstances into a hashtable. + + .DESCRIPTION + This function is used to convert a CimInstance array containing + MSFT_KeyValuePair objects into a hashtable. + + .PARAMETER CimInstance + An array of CimInstances or a single CimInstance object to convert. + + .OUTPUTS + Hashtable + + .EXAMPLE + $newInstanceParameters = @{ + ClassName = 'MSFT_KeyValuePair' + Namespace = 'root/microsoft/Windows/DesiredStateConfiguration' + ClientOnly = $true + } + + $cimInstance = [Microsoft.Management.Infrastructure.CimInstance[]] ( + (New-CimInstance @newInstanceParameters -Property @{ + Key = 'FirstName' + Value = 'John' + }), + + (New-CimInstance @newInstanceParameters -Property @{ + Key = 'LastName' + Value = 'Smith' + }) + ) + + ConvertTo-HashTable -CimInstance $cimInstance + + This creates a array om CimInstances of the class name MSFT_KeyValuePair + and passes it to ConvertTo-HashTable which returns a hashtable. +#> +function ConvertTo-HashTable +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'CimInstance')] + [AllowEmptyCollection()] + [Microsoft.Management.Infrastructure.CimInstance[]] + $CimInstance + ) + + begin + { + $result = @{ } + } + + process + { + foreach ($ci in $CimInstance) + { + $result.Add($ci.Key, $ci.Value) + } + } + + end + { + $result + } +} +#EndRegion './Public/ConvertTo-HashTable.ps1' 68 +#Region './Public/Get-LocalizedData.ps1' 0 +<# + .SYNOPSIS + Gets language-specific data into scripts and functions based on the UI culture + that is selected for the operating system. + Similar to Import-LocalizedData, with extra parameter 'DefaultUICulture'. + + .DESCRIPTION + The Get-LocalizedData cmdlet dynamically retrieves strings from a subdirectory + whose name matches the UI language set for the current user of the operating system. + It is designed to enable scripts to display user messages in the UI language selected + by the current user. + + Get-LocalizedData imports data from .psd1 files in language-specific subdirectories + of the script directory and saves them in a local variable that is specified in the + command. The cmdlet selects the subdirectory and file based on the value of the + $PSUICulture automatic variable. When you use the local variable in the script to + display a user message, the message appears in the user's UI language. + + You can use the parameters of G-LocalizedData to specify an alternate UI culture, + path, and file name, to add supported commands, and to suppress the error message that + appears if the .psd1 files are not found. + + The G-LocalizedData cmdlet supports the script internationalization + initiative that was introduced in Windows PowerShell 2.0. This initiative + aims to better serve users worldwide by making it easy for scripts to display + user messages in the UI language of the current user. For more information + about this and about the format of the .psd1 files, see about_Script_Internationalization. + + .PARAMETER BindingVariable + Specifies the variable into which the text strings are imported. Enter a variable + name without a dollar sign ($). + + In Windows PowerShell 2.0, this parameter is required. In Windows PowerShell 3.0, + this parameter is optional. If you omit this parameter, Import-LocalizedData + returns a hash table of the text strings. The hash table is passed down the pipeline + or displayed at the command line. + + When using Import-LocalizedData to replace default text strings specified in the + DATA section of a script, assign the DATA section to a variable and enter the name + of the DATA section variable in the value of the BindingVariable parameter. Then, + when Import-LocalizedData saves the imported content in the BindingVariable, the + imported data will replace the default text strings. If you are not specifying + default text strings, you can select any variable name. + + .PARAMETER UICulture + Specifies an alternate UI culture. The default is the value of the $PsUICulture + automatic variable. Enter a UI culture in - format, such as + en-US, de-DE, or ar-SA. + + The value of the UICulture parameter determines the language-specific subdirectory + (within the base directory) from which Import-LocalizedData gets the .psd1 file + for the script. + + The cmdlet searches for a subdirectory with the same name as the value of the + UICulture parameter or the $PsUICulture automatic variable, such as de-DE or + ar-SA. If it cannot find the directory, or the directory does not contain a .psd1 + file for the script, it searches for a subdirectory with the name of the language + code, such as de or ar. If it cannot find the subdirectory or .psd1 file, the + command fails and the data is displayed in the default language specified in the + script. + + .PARAMETER BaseDirectory + Specifies the base directory where the .psd1 files are located. The default is + the directory where the script is located. Import-LocalizedData searches for + the .psd1 file for the script in a language-specific subdirectory of the base + directory. + + .PARAMETER FileName + Specifies the name of the data file (.psd1) to be imported. Enter a file name. + You can specify a file name that does not include its .psd1 file name extension, + or you can specify the file name including the .psd1 file name extension. + + The FileName parameter is required when Import-LocalizedData is not used in a + script. Otherwise, the parameter is optional and the default value is the base + name of the script. You can use this parameter to direct Import-LocalizedData + to search for a different .psd1 file. + + For example, if the FileName is omitted and the script name is FindFiles.ps1, + Import-LocalizedData searches for the FindFiles.psd1 data file. + + .PARAMETER SupportedCommand + Specifies cmdlets and functions that generate only data. + + Use this parameter to include cmdlets and functions that you have written or + tested. For more information, see about_Script_Internationalization. + + .PARAMETER DefaultUICulture + Specifies which UICulture to default to if current UI culture or its parents + culture don't have matching data file. + + For example, if you have a data file in 'en-US' but not in 'en' or 'en-GB' and + your current culture is 'en-GB', you can default back to 'en-US'. + + .NOTES + Before using Import-LocalizedData, localize your user messages. Format the messages + for each locale (UI culture) in a hash table of key/value pairs, and save the + hash table in a file with the same name as the script and a .psd1 file name extension. + Create a directory under the script directory for each supported UI culture, and + then save the .psd1 file for each UI culture in the directory with the UI + culture name. + + For example, localize your user messages for the de-DE locale and format them in + a hash table. Save the hash table in a .psd1 file. Then create a de-DE + subdirectory under the script directory, and save the de-DE .psd1 + file in the de-DE subdirectory. Repeat this method for each locale that you support. + + Import-LocalizedData performs a structured search for the localized user + messages for a script. + + Import-LocalizedData begins the search in the directory where the script file + is located (or the value of the BaseDirectory parameter). It then searches within + the base directory for a subdirectory with the same name as the value of the + $PsUICulture variable (or the value of the UICulture parameter), such as de-DE or + ar-SA. Then, it searches in that subdirectory for a .psd1 file with the same name + as the script (or the value of the FileName parameter). + + If Import-LocalizedData cannot find a subdirectory with the name of the UI culture, + or the subdirectory does not contain a .psd1 file for the script, it searches for + a .psd1 file for the script in a subdirectory with the name of the language code, + such as de or ar. If it cannot find the subdirectory or .psd1 file, the command + fails, the data is displayed in the default language in the script, and an error + message is displayed explaining that the data could not be imported. To suppress + the message and fail gracefully, use the ErrorAction common parameter with a value + of SilentlyContinue. + + If Import-LocalizedData finds the subdirectory and the .psd1 file, it imports the + hash table of user messages into the value of the BindingVariable parameter in the + command. Then, when you display a message from the hash table in the variable, the + localized message is displayed. + + For more information, see about_Script_Internationalization. + + .EXAMPLE + $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + This is an example that can be used in DSC resources to import the + localized strings and if the current UI culture localized folder does + not exist the UI culture 'en-US' is returned. +#> +function Get-LocalizedData +{ + [CmdletBinding(DefaultParameterSetName = 'DefaultUICulture')] + param + ( + [Parameter(Position = 0)] + [Alias('Variable')] + [ValidateNotNullOrEmpty()] + [System.String] + $BindingVariable, + + [Parameter(Position = 1, ParameterSetName = 'TargetedUICulture')] + [System.String] + $UICulture, + + [Parameter()] + [System.String] + $BaseDirectory, + + [Parameter()] + [System.String] + $FileName, + + [Parameter()] + [System.String[]] + $SupportedCommand, + + [Parameter(Position = 1, ParameterSetName = 'DefaultUICulture')] + [System.String] + $DefaultUICulture = 'en-US' + ) + + begin + { + <# + Because Proxy Command changes the Invocation origin, we need to be explicit + when handing the pipeline back to original command. + #> + if (!$PSBoundParameters.ContainsKey('FileName')) + { + if ($myInvocation.ScriptName) + { + $file = [System.IO.FileInfo] $myInvocation.ScriptName + } + else + { + $file = [System.IO.FileInfo] $myInvocation.MyCommand.Module.Path + } + + $FileName = $file.BaseName + + $PSBoundParameters.Add('FileName', $file.Name) + } + + if ($PSBoundParameters.ContainsKey('BaseDirectory')) + { + $callingScriptRoot = $BaseDirectory + } + else + { + $callingScriptRoot = $MyInvocation.PSScriptRoot + + $PSBoundParameters.Add('BaseDirectory', $callingScriptRoot) + } + + if ($PSBoundParameters.ContainsKey('DefaultUICulture') -and !$PSBoundParameters.ContainsKey('UICulture')) + { + <# + We don't want the resolution to eventually return the ModuleManifest + so we run the same GetFilePath() logic than here: + https://github.com/PowerShell/PowerShell/blob/master/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Import-LocalizedData.cs#L302-L333 + and if we see it will return the wrong thing, set the UICulture to DefaultUI culture, and return the logic to Import-LocalizedData + #> + $currentCulture = Get-UICulture + + $evaluateDefaultCulture = $true + + <# + If the LCID is 127 then use default UI culture instead. + + See more information in issue https://github.com/dsccommunity/DscResource.Common/issues/11. + #> + if ($currentCulture.LCID -eq 127) + { + $currentCulture = New-Object -TypeName 'System.Globalization.CultureInfo' -ArgumentList @($DefaultUICulture) + $PSBoundParameters['UICulture'] = $DefaultUICulture + + $evaluateDefaultCulture = $false + } + + $languageFile = $null + + $localizedFileNames = @( + $FileName + '.psd1' + $FileName + '.strings.psd1' + ) + + while ($null -ne $currentCulture -and $currentCulture.Name -and -not $languageFile) + { + foreach ($fullFileName in $localizedFileNames) + { + $filePath = [System.IO.Path]::Combine($callingScriptRoot, $CurrentCulture.Name, $fullFileName) + + if (Test-Path -Path $filePath) + { + Write-Debug -Message "Found $filePath" + + $languageFile = $filePath + + # Set the filename to the file we found. + $PSBoundParameters['FileName'] = $fullFileName + + # Exit loop if we find the first filename. + break + } + else + { + Write-Debug -Message "File $filePath not found" + } + } + + if (-not $languageFile) + { + <# + Evaluate the parent culture if there is one. + + If the parent culture is LCID 127 then move to the default culture. + See more information in issue https://github.com/dsccommunity/DscResource.Common/issues/11. + #> + if ($currentCulture.Parent -and $currentCulture.Parent.LCID -ne 127) + { + $currentCulture = $currentCulture.Parent + } + else + { + if ($evaluateDefaultCulture) + { + $evaluateDefaultCulture = $false + + <# + Could not find localized strings file for the the operating + system UI culture. Evaluating the default UI culture (which + defaults to 'en-US' if not specifically set). + #> + $currentCulture = New-Object -TypeName 'System.Globalization.CultureInfo' -ArgumentList @($DefaultUICulture) + $PSBoundParameters['UICulture'] = $DefaultUICulture + } + else + { + <# + Already evaluated everything we could, exit and let + Import-LocalizedData throw an exception. + #> + break + } + } + } + } + + <# + Removes the parameter DefaultUICulture so that isn't used when + calling Import-LocalizedData. + #> + $null = $PSBoundParameters.Remove('DefaultUICulture') + } + + try + { + $outBuffer = $null + + if ($PSBoundParameters.TryGetValue('OutBuffer', [ref] $outBuffer)) + { + $PSBoundParameters['OutBuffer'] = 1 + } + + $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Import-LocalizedData', [System.Management.Automation.CommandTypes]::Cmdlet) + $scriptCmd = { & $wrappedCmd @PSBoundParameters } + + $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) + $steppablePipeline.Begin($PSCmdlet) + } + catch + { + throw + } + } + + process + { + try + { + $steppablePipeline.Process($_) + } + catch + { + throw + } + } + + end + { + if ($BindingVariable -and ($valueToBind = Get-Variable -Name $BindingVariable -ValueOnly -ErrorAction 'Ignore')) + { + # Bringing the variable to the parent scope + Set-Variable -Scope 1 -Name $BindingVariable -Force -ErrorAction 'SilentlyContinue' -Value $valueToBind + } + + try + { + $steppablePipeline.End() + } + catch + { + throw + } + } +} +#EndRegion './Public/Get-LocalizedData.ps1' 356 +#Region './Public/Get-TemporaryFolder.ps1' 0 +<# + .SYNOPSIS + Returns the path of the current user's temporary folder. + + .DESCRIPTION + Returns the path of the current user's temporary folder. + + .NOTES + This is the same as doing the following + - Windows: $env:TEMP + - macOS: $env:TMPDIR + - Linux: /tmp/ + + .EXAMPLE + Get-TemporaryFolder + + Returns the current user temporary folder on the current operating system. +#> +function Get-TemporaryFolder +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + return [IO.Path]::GetTempPath() +} +#EndRegion './Public/Get-TemporaryFolder.ps1' 26 +#Region './Public/New-InvalidArgumentException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid argument exception. + + .DESCRIPTION + Creates and throws an invalid argument exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ArgumentName + The name of the invalid argument that is causing this error to be thrown. + + .EXAMPLE + $errorMessage = $script:localizedData.ActionCannotBeUsedInThisContextMessage ` + -f $Action, $Parameter + + New-InvalidArgumentException -ArgumentName 'Action' -Message $errorMessage +#> +function New-InvalidArgumentException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArgumentName + ) + + $argumentException = New-Object -TypeName 'ArgumentException' ` + -ArgumentList @($Message, $ArgumentName) + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @($argumentException, $ArgumentName, 'InvalidArgument', $null) + } + + $errorRecord = New-Object @newObjectParameters + + throw $errorRecord +} +#EndRegion './Public/New-InvalidArgumentException.ps1' 48 +#Region './Public/New-InvalidDataException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid data exception. + + .DESCRIPTION + Creates and throws an invalid data exception. + + .PARAMETER ErrorId + The error Id to assign to the exception. + + .PARAMETER ErrorMessage + The error message to assign to the exception. + + .EXAMPLE + if ( -not $resultOfEvaluation ) + { + $errorMessage = $script:localizedData.InvalidData -f $Action + + New-InvalidDataException -ErrorId 'InvalidDataError' -ErrorMessage $errorMessage + } +#> +function New-InvalidDataException +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage + ) + + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidData + $exception = New-Object ` + -TypeName System.InvalidOperationException ` + -ArgumentList $ErrorMessage + $errorRecord = New-Object ` + -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + + throw $errorRecord +} +#EndRegion './Public/New-InvalidDataException.ps1' 46 +#Region './Public/New-InvalidOperationException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid operation exception. + + .DESCRIPTION + Creates and throws an invalid operation exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + Start-Process @startProcessArguments + } + catch + { + $errorMessage = $script:localizedData.InstallationFailedMessage -f $Path, $processId + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-InvalidOperationException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'InvalidOperation', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-InvalidOperationException.ps1' 66 +#Region './Public/New-InvalidResultException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid result exception. + + .DESCRIPTION + Creates and throws an invalid result exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + $numberOfObjects = Get-ChildItem -Path $path + if ($numberOfObjects -eq 0) + { + throw 'To few files.' + } + } + catch + { + $errorMessage = $script:localizedData.TooFewFilesMessage -f $path + New-InvalidResultException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-InvalidResultException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'InvalidResult', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-InvalidResultException.ps1' 70 +#Region './Public/New-NotImplementedException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an not implemented exception. + + .DESCRIPTION + Creates and throws an not implemented exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + if ($runFeature) + { + $errorMessage = $script:localizedData.FeatureMissing -f $path + New-NotImplementedException -Message $errorMessage -ErrorRecord $_ + } + + Throws an not implemented exception if the variable $runFeature contains + a value. +#> +function New-NotImplementedException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'NotImplemented', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-NotImplementedException.ps1' 65 +#Region './Public/New-ObjectNotFoundException.ps1' 0 + +<# + .SYNOPSIS + Creates and throws an object not found exception. + + .DESCRIPTION + Creates and throws an object not found exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + Get-ChildItem -Path $path + } + catch + { + $errorMessage = $script:localizedData.PathNotFoundMessage -f $path + New-ObjectNotFoundException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-ObjectNotFoundException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'ObjectNotFound', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-ObjectNotFoundException.ps1' 67 +#Region './Public/Remove-CommonParameter.ps1' 0 +<# + .SYNOPSIS + Removes common parameters from a hashtable. + + .DESCRIPTION + This function serves the purpose of removing common parameters and option + common parameters from a parameter hashtable. + + .PARAMETER Hashtable + The parameter hashtable that should be pruned. + + .EXAMPLE + Remove-CommonParameter -Hashtable $PSBoundParameters + + Returns a new hashtable without the common and optional common parameters. +#> +function Remove-CommonParameter +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', + '', + Justification = 'ShouldProcess is not supported in DSC resources.' + )] + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Hashtable + ) + + $inputClone = $Hashtable.Clone() + + $commonParameters = [System.Management.Automation.PSCmdlet]::CommonParameters + $commonParameters += [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + + $Hashtable.Keys | Where-Object -FilterScript { + $_ -in $commonParameters + } | ForEach-Object -Process { + $inputClone.Remove($_) + } + + return $inputClone +} +#EndRegion './Public/Remove-CommonParameter.ps1' 45 +#Region './Public/Set-DscMachineRebootRequired.ps1' 0 +<# + .SYNOPSIS + Set the DSC reboot required status variable. + + .DESCRIPTION + Sets the global DSCMachineStatus variable to a value of 1. + This function is used to set the global variable that indicates + to the LCM that a reboot of the node is required. + + .EXAMPLE + PS C:\> Set-DscMachineRebootRequired + + Sets the $global:DSCMachineStatus variable to 1. + + .NOTES + This function is implemented so that individual resource modules + do not need to use and therefore suppress Global variables + directly. It also enables mocking to increase testability of + consumers. +#> +function Set-DscMachineRebootRequired +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + # Suppressing this rule because $global:DSCMachineStatus is used to trigger a reboot. + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + <# + Suppressing this rule because $global:DSCMachineStatus is only set, + never used (by design of Desired State Configuration). + #> + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '')] + [CmdletBinding()] + param + ( + ) + + $global:DSCMachineStatus = 1 +} +#EndRegion './Public/Set-DscMachineRebootRequired.ps1' 37 +#Region './Public/Set-PSModulePath.ps1' 0 + +<# + .SYNOPSIS + Set environment variable PSModulePath in the current session or machine + wide. + + .DESCRIPTION + This is a wrapper to set environment variable PSModulePath in current + session or machine wide. + + .PARAMETER Path + A string with all the paths separated by semi-colons. + + .PARAMETER Machine + If set the PSModulePath will be changed machine wide. If not set, only + the current session will be changed. + + .EXAMPLE + Set-PSModulePath -Path ';' + + .EXAMPLE + Set-PSModulePath -Path ';' -Machine +#> +function Set-PSModulePath +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', + '', + Justification = 'ShouldProcess is not supported in DSC resources.' + )] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Machine + ) + + if ($Machine.IsPresent) + { + [System.Environment]::SetEnvironmentVariable('PSModulePath', $Path, [System.EnvironmentVariableTarget]::Machine) + } + else + { + $env:PSModulePath = $Path + } +} +#EndRegion './Public/Set-PSModulePath.ps1' 52 +#Region './Public/Test-DscParameterState.ps1' 0 +<# + .SYNOPSIS + This method is used to compare current and desired values for any DSC resource. + + .DESCRIPTION + This function tests the parameter status of DSC resource parameters against + the current values present on the system. + + .PARAMETER CurrentValues + A hashtable with the current values on the system, obtained by e.g. + Get-TargetResource. + + .PARAMETER DesiredValues + The hashtable of desired values. For example $PSBoundParameters with the + desired values. + + .PARAMETER Properties + This is a list of properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER ExcludeProperties + This is a list of which properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER TurnOffTypeChecking + Indicates that the type of the parameter should not be checked. + + .PARAMETER ReverseCheck + Indicates that a reverse check should be done. The current and desired state + are swapped for another test. + + .PARAMETER SortArrayValues + If the sorting of array values does not matter, values are sorted internally + before doing the comparison. + + .EXAMPLE + $currentState = Get-TargetResource @PSBoundParameters + + $returnValue = Test-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters + + The function Get-TargetResource is called first using all bound parameters + to get the values in the current state. The result is then compared to the + desired state by calling `Test-DscParameterState`. + + .EXAMPLE + $getTargetResourceParameters = @{ + ServerName = $ServerName + InstanceName = $InstanceName + Name = $Name + } + + $returnValue = Test-DscParameterState ` + -CurrentValues (Get-TargetResource @getTargetResourceParameters) ` + -DesiredValues $PSBoundParameters ` + -ExcludeProperties @( + 'FailsafeOperator' + 'NotificationMethod' + ) + + This compares the values in the current state against the desires state. + The function Get-TargetResource is called using just the required parameters + to get the values in the current state. The parameter 'ExcludeProperties' + is used to exclude the properties 'FailsafeOperator' and + 'NotificationMethod' from the comparison. + + .EXAMPLE + $getTargetResourceParameters = @{ + ServerName = $ServerName + InstanceName = $InstanceName + Name = $Name + } + + $returnValue = Test-DscParameterState ` + -CurrentValues (Get-TargetResource @getTargetResourceParameters) ` + -DesiredValues $PSBoundParameters ` + -Properties ServerName, Name + + This compares the values in the current state against the desires state. + The function Get-TargetResource is called using just the required parameters + to get the values in the current state. The 'Properties' parameter is used + to to only compare the properties 'ServerName' and 'Name'. +#> +function Test-DscParameterState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Object] + $DesiredValues, + + [Parameter()] + [System.String[]] + [Alias('ValuesToCheck')] + $Properties, + + [Parameter()] + [System.String[]] + $ExcludeProperties, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $TurnOffTypeChecking, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ReverseCheck, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $SortArrayValues + ) + + $returnValue = $true + + if ($CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $CurrentValues = ConvertTo-HashTable -CimInstance $CurrentValues + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $DesiredValues = ConvertTo-HashTable -CimInstance $DesiredValues + } + + $types = 'System.Management.Automation.PSBoundParametersDictionary', 'System.Collections.Hashtable', 'Microsoft.Management.Infrastructure.CimInstance' + + if ($DesiredValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidDesiredValuesError -f $DesiredValues.GetType().FullName) ` + -ArgumentName 'DesiredValues' + } + + if ($CurrentValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidCurrentValuesError -f $CurrentValues.GetType().FullName) ` + -ArgumentName 'CurrentValues' + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -and -not $Properties) + { + New-InvalidArgumentException ` + -Message $script:localizedData.InvalidPropertiesError ` + -ArgumentName Properties + } + + $desiredValuesClean = Remove-CommonParameter -Hashtable $DesiredValues + + if (-not $Properties) + { + $keyList = $desiredValuesClean.Keys + } + else + { + $keyList = $Properties + } + if ($ExcludeProperties) + { + $keyList = $keyList | Where-Object -FilterScript { $_ -notin $ExcludeProperties } + } + + foreach ($key in $keyList) + { + $desiredValue = $desiredValuesClean.$key + $currentValue = $CurrentValues.$key + + if ($desiredValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $desiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $desiredValue = ConvertTo-HashTable -CimInstance $desiredValue + } + if ($currentValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $currentValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $currentValue = ConvertTo-HashTable -CimInstance $currentValue + } + + if ($null -ne $desiredValue) + { + $desiredType = $desiredValue.GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($null -ne $currentValue) + { + $currentType = $currentValue.GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if ($currentType.Name -ne 'Unknown' -and $desiredType.Name -eq 'PSCredential') + { + # This is a credential object. Compare only the user name + if ($currentType.Name -eq 'PSCredential' -and $currentValue.UserName -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + continue + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + $returnValue = $false + } + + # Assume the string is our username when the matching desired value is actually a credential + if ($currentType.Name -eq 'string' -and $currentValue -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + continue + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + $returnValue = $false + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchTypeMismatchMessage -f $key, $currentType.FullName, $desiredType.FullName) + $returnValue = $false + continue + } + } + + if ($currentValue -eq $desiredValue -and -not $desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + continue + } + + if ($desiredValuesClean.GetType().Name -in 'HashTable', 'PSBoundParametersDictionary') + { + $checkDesiredValue = $desiredValuesClean.ContainsKey($key) + } + else + { + $checkDesiredValue = Test-DscObjectHasProperty -Object $desiredValuesClean -PropertyName $key + } + + if (-not $checkDesiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + continue + } + + if ($desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.TestDscParameterCompareMessage -f $key, $desiredType.FullName) + + if (-not $currentValue -and -not $desiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, 'empty array', 'empty array') + continue + } + elseif (-not $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + $returnValue = $false + continue + } + elseif ($currentValue.Count -ne $desiredValue.Count) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueDifferentCountMessage -f $desiredType.FullName, $key, $currentValue.Count, $desiredValue.Count) + $returnValue = $false + continue + } + else + { + $desiredArrayValues = $desiredValue + $currentArrayValues = $currentValue + + if ($SortArrayValues) + { + $desiredArrayValues = @($desiredArrayValues | Sort-Object) + $currentArrayValues = @($currentArrayValues | Sort-Object) + } + + for ($i = 0; $i -lt $desiredArrayValues.Count; $i++) + { + if ($desiredArrayValues[$i]) + { + $desiredType = $desiredArrayValues[$i].GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($currentArrayValues[$i]) + { + $currentType = $currentArrayValues[$i].GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementTypeMismatchMessage -f $key, $i, $currentType.FullName, $desiredType.FullName) + $returnValue = $false + continue + } + } + + #Convert a scriptblock into a string as scriptblocks are not comparable + $wasCurrentArrayValuesConverted = $false + if ($currentArrayValues[$i] -is [scriptblock]) + { + $currentArrayValues[$i] = if ($desiredArrayValues[$i] -is [string]) + { + $currentArrayValues[$i] = $currentArrayValues[$i].Invoke() + } + else + { + $currentArrayValues[$i].ToString() + } + $wasCurrentArrayValuesConverted = $true + } + if ($desiredArrayValues[$i] -is [scriptblock]) + { + $desiredArrayValues[$i] = if ($currentArrayValues[$i] -is [string] -and -not $wasCurrentArrayValuesConverted) + { + $desiredArrayValues[$i].Invoke() + } + else + { + $desiredArrayValues[$i].ToString() + } + } + + if ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentArrayValues[$i] + $param.DesiredValues = $desiredArrayValues[$i] + + if ($returnValue) + { + $returnValue = Test-DscParameterState @param + } + else + { + Test-DscParameterState @param | Out-Null + } + continue + } + + if ($desiredArrayValues[$i] -ne $currentArrayValues[$i]) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementValueMismatchMessage -f $i, $desiredType.FullName, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + $returnValue = $false + continue + } + else + { + Write-Verbose -Message ($script:localizedData.MatchElementValueMessage -f $i, $desiredType.FullName, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + continue + } + } + + } + } + elseif ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentValue + $param.DesiredValues = $desiredValue + + if ($returnValue) + { + $returnValue = Test-DscParameterState @param + } + else + { + Test-DscParameterState @param | Out-Null + } + continue + } + else + { + #Convert a scriptblock into a string as scriptblocks are not comparable + $wasCurrentValue = $false + if ($currentValue -is [scriptblock]) + { + $currentValue = if ($desiredValue -is [string]) + { + $currentValue = $currentValue.Invoke() + } + else + { + $currentValue.ToString() + } + $wasCurrentValue = $true + } + if ($desiredValue -is [scriptblock]) + { + $desiredValue = if ($currentValue -is [string] -and -not $wasCurrentValue) + { + $desiredValue.Invoke() + } + else + { + $desiredValue.ToString() + } + } + + if ($desiredValue -ne $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + $returnValue = $false + } + } + } + + if ($ReverseCheck) + { + Write-Verbose -Message $script:localizedData.StartingReverseCheck + $reverseCheckParameters = $PSBoundParameters + $reverseCheckParameters.CurrentValues = $DesiredValues + $reverseCheckParameters.DesiredValues = $CurrentValues + $null = $reverseCheckParameters.Remove('ReverseCheck') + + if ($returnValue) + { + $returnValue = Test-DscParameterState @reverseCheckParameters + } + else + { + $null = Test-DscParameterState @reverseCheckParameters + } + } + + Write-Verbose -Message ($script:localizedData.TestDscParameterResultMessage -f $returnValue) + return $returnValue +} +#EndRegion './Public/Test-DscParameterState.ps1' 464 +#Region './Public/Test-IsNanoServer.ps1' 0 +<# + .SYNOPSIS + Tests if the current OS is a Nano server. + + .DESCRIPTION + Tests if the current OS is a Nano server. + + .EXAMPLE + Test-IsNanoServer + + Returns $true if the current operating system is Nano Server, if not $false + is returned. +#> +function Test-IsNanoServer +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param () + + $productDatacenterNanoServer = 143 + $productStandardNanoServer = 144 + + $operatingSystemSKU = (Get-CimInstance -ClassName Win32_OperatingSystem).OperatingSystemSKU + + Write-Verbose -Message ($script:localizedData.TestIsNanoServerOperatingSystemSku -f $operatingSystemSKU) + + return ($operatingSystemSKU -in ($productDatacenterNanoServer, $productStandardNanoServer)) +} +#EndRegion './Public/Test-IsNanoServer.ps1' 28 +#Region './suffix.ps1' 0 +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' +#EndRegion './suffix.ps1' 1 diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 new file mode 100644 index 0000000..fd8440b --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 @@ -0,0 +1,37 @@ +# Localized English (en-US) strings. + +ConvertFrom-StringData @' + TestIsNanoServerOperatingSystemSku = OperatingSystemSKU {0} was returned by Win32_OperatingSystem when detecting if operating system is Nano Server. (DRC0008) + ModuleNotFound = Please ensure that the PowerShell module '{0}' is installed. (DRC0009) + ParameterUsageWrong = None of the parameter(s) '{0}' may be used at the same time as any of the parameter(s) '{1}'. (DRC0010) + AddressFormatError = Address '{0}' is not in the correct format. Please correct the Address parameter in the configuration and try again. (DRC0011) + AddressIPv4MismatchError = Address '{0}' is in IPv4 format, which does not match server address family {1}. Please correct either of them in the configuration and try again. (DRC0012) + AddressIPv6MismatchError = Address '{0}' is in IPv6 format, which does not match server address family {1}. Please correct either of them in the configuration and try again. (DRC0013) + InvalidDesiredValuesError = Property 'DesiredValues' in Test-DscParameterState must be either a Hashtable or CimInstance. Type detected was '{0}'. (DRC0014) + InvalidCurrentValuesError = Property 'CurrentValues' in Test-DscParameterState must be either a Hashtable, CimInstance, or CimIntance[]. Type detected was '{0}'. (DRC0015) + InvalidPropertiesError = If 'DesiredValues' is a CimInstance then property 'Properties' must contain a value. (DRC0016) + MatchPsCredentialUsernameMessage = MATCH: PSCredential username match. Current state is '{0}' and desired state is '{1}'. (DRC0017) + NoMatchPsCredentialUsernameMessage = NOTMATCH: PSCredential username mismatch. Current state is '{0}' and desired state is '{1}'. (DRC0018) + NoMatchTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type is '{1}' and desired type is '{2}'. (DRC0019) + MatchValueMessage = MATCH: Value (type '{0}') for property '{1}' does match. Current state is '{2}' and desired state is '{3}'. (DRC0020) + NoMatchValueMessage = NOTMATCH: Value (type '{0}') for property '{1}' does not match. Current state is '{2}' and desired state is '{3}'. (DRC0021) + NoMatchValueDifferentCountMessage = NOTMATCH: Value (type '{0}') for property '{1}' does have a different count. Current state count is '{2}' and desired state count is '{3}'. (DRC0022) + NoMatchElementTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type of element [{1}] is '{2}' and desired type is '{3}'. (DRC0023) + NoMatchElementValueMismatchMessage = NOTMATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. (DRC0024) + MatchElementValueMessage = MATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. (DRC0025) + TestDscParameterResultMessage = Test-DscParameter result is '{0}'. (DRC0026) + StartingReverseCheck = Starting with a reverse check. (DRC0027) + TestDscParameterCompareMessage = Comparing values in property '{0}'. (DRC0028) + TooManyCimInstances = More than one CIM instance was returned from the current state. (DRC0029) + TestingCimInstance = Testing CIM instance '{0}' with the key properties '{1}'. (DRC0030) + MissingCimInstance = The CIM instance '{0}' with the key properties '{1}' is missing. (DRC0031) + ArrayValueIsAbsent = The array value '{0}' is absent. (DRC0032) + ArrayValueIsPresent = The array value '{0}' is present. (DRC0033) + KeyPropertiesMissing = The hashtable passed to function Test-DscPropertyState is missing the key 'KeyProperties'. This must be set to the property names that makes each instance in the CIM instance collection unique. (DRC0034) + ArrayDoesNotMatch = One or more values in an array does not match the desired state. Details of the changes are below. (DRC0035) + PropertyValueOfTypeDoesNotMatch = {0} value does not match. Current value is '{1}', but expected the value '{2}'. (DRC0036) + UnableToCompareType = Unable to compare the type {0} as it is not handled by the Test-DscPropertyState cmdlet. (DRC0037) + EvaluatePropertyState = Evaluating the state of the property '{0}'. (DRC0038) + PropertyInDesiredState = The parameter '{0}' is in desired state. (DRC0039) + PropertyNotInDesiredState = The parameter '{0}' is not in desired state. (DRC0040) +'@ diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt new file mode 100644 index 0000000..2a99677 --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt @@ -0,0 +1,26 @@ +TOPIC + about_DscResource.Common + +SHORT DESCRIPTION + Common functions used in DSC tesources. + +LONG DESCRIPTION + This module contains common functions that are used in DSC resources. + +EXAMPLES + PS C:\> Get-Command -Module DscResource.Common + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/DscResource.Common + +SEE ALSO + - https://github.com/dsccommunity/DscResource.Common + +KEYWORDS + DSC, Localization + diff --git a/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/en-US/about_ComputerManagementDsc.help.txt b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/en-US/about_ComputerManagementDsc.help.txt new file mode 100644 index 0000000..71a4fcb --- /dev/null +++ b/deployment/dsc/azshcihost/ComputerManagementDsc/8.4.0/en-US/about_ComputerManagementDsc.help.txt @@ -0,0 +1,34 @@ +TOPIC + about_ComputerManagementDsc + +SHORT DESCRIPTION + DSC resources for configuration of a Windows computer. These DSC resources + allow you to perform computer management tasks, such as renaming the computer, + joining a domain and scheduling tasks as well as configuring items such as + virtual memory, event logs, time zones and power settings. + +LONG DESCRIPTION + This module contains DSC resources for configuration of a Windows computer. + These DSC resources allow you to perform computer management tasks, such as + renaming the computer, joining a domain and scheduling tasks as well as + configuring items such as virtual memory, event logs, time zones and power + settings. + +EXAMPLES + PS C:\> Get-DscResource -Module ComputerManagementDsc + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/ComputerManagementDsc + +SEE ALSO + - https://github.com/dsccommunity/ComputerManagementDsc + +KEYWORDS + DSC, DscResource, Computer, OfflineDomainJoin, PendingReboot, PowerPlan, + PowerShellExecutionPolicy, RemoteDesktopAdmin, ScheduledTask, SmbServerConfiguration + SmbShare, SystemLocale, TimeZone, VirtualMemory, WindowsEventLog, WindowsCapability diff --git a/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCR_Shortcut.psd1 b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCR_Shortcut.psd1 new file mode 100644 index 0000000..b270a53 --- /dev/null +++ b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCR_Shortcut.psd1 @@ -0,0 +1,83 @@ +# +# モジュール 'DSCR_Shortcut' のモジュール マニフェスト +# +# 生成者: mkht +# +# 生成日: 2016/06/18 +# + +@{ + + # このマニフェストに関連付けられているスクリプト モジュール ファイルまたはバイナリ モジュール ファイル。 + # RootModule = '' + + # このモジュールのバージョン番号です。 + ModuleVersion = '2.1.1' + + # このモジュールを一意に識別するために使用される ID + GUID = 'dc24c0c9-ad6b-4fce-9ce4-2410f9ce4f7f' + + # このモジュールの作成者 + Author = 'mkht' + + # このモジュールの会社またはベンダー + CompanyName = '' + + # このモジュールの著作権情報 + Copyright = '(c) 2020 mkht. All rights reserved.' + + # このモジュールの機能の説明 + Description = 'PowerShell DSC Resource to create shortcut file.' + + # このモジュールに必要な Windows PowerShell エンジンの最小バージョン + PowerShellVersion = '5.0' + + # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # CLRVersion = '' + + # RootModule/ModuleToProcess に指定されているモジュールの入れ子になったモジュールとしてインポートするモジュール + # NestedModules = @() + + # このモジュールからエクスポートする関数です。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートする関数がない場合は、エントリを削除しないで空の配列を使用してください。 + FunctionsToExport = @() + + # このモジュールからエクスポートするコマンドレットです。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートするコマンドレットがない場合は、エントリを削除しないで空の配列を使用してください。 + CmdletsToExport = @() + + # このモジュールからエクスポートする変数 + VariablesToExport = '*' + + # このモジュールからエクスポートするエイリアスです。最適なパフォーマンスを得るには、ワイルドカードを使用せず、エクスポートするエイリアスがない場合は、エントリを削除しないで空の配列を使用してください。 + AliasesToExport = @() + + # このモジュールからエクスポートする DSC リソース + DscResourcesToExport = @('cShortcut') + + # このモジュールからエクスポートされたコマンドの既定のプレフィックス。既定のプレフィックスをオーバーライドする場合は、Import-Module -Prefix を使用します。 + # DefaultCommandPrefix = '' + + # RootModule/ModuleToProcess に指定されているモジュールに渡すプライベート データ。これには、PowerShell で使用される追加のモジュール メタデータを含む PSData ハッシュテーブルが含まれる場合もあります。 + PrivateData = @{ + + PSData = @{ + + # このモジュールに適用されているタグ。オンライン ギャラリーでモジュールを検出する際に役立ちます。 + Tags = ('DesiredStateConfiguration', 'DSC', 'DSCResource', 'Shortcut') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/mkht/DSCR_Shortcut/blob/master/LICENSE' + + # このプロジェクトのメイン Web サイトの URL。 + ProjectUri = 'https://github.com/mkht/DSCR_Shortcut' + + # このモジュールを表すアイコンの URL。 + # IconUri = '' + + # このモジュールの ReleaseNotes + # ReleaseNotes = '' + + } # PSData ハッシュテーブル終了 + + } # PrivateData ハッシュテーブル終了 + +} diff --git a/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCResources/cShortcut/cShortcut.psm1 b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCResources/cShortcut/cShortcut.psm1 new file mode 100644 index 0000000..57026d8 --- /dev/null +++ b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCResources/cShortcut/cShortcut.psm1 @@ -0,0 +1,861 @@ +# Import ShellLink class +$ShellLinkPath = Join-Path $PSScriptRoot '..\..\Libs\ShellLink\ShellLink.cs' +if (Test-Path -LiteralPath $ShellLinkPath -PathType Leaf) { + Add-Type -TypeDefinition (Get-Content -LiteralPath $ShellLinkPath -Raw -Encoding UTF8) -Language 'CSharp' -ErrorAction Stop +} + +# Import VKeyUtil class +$VKeyUtilPath = Join-Path $PSScriptRoot '..\..\Libs\VKeyUtil\VKeyUtil.cs' +if (Test-Path -LiteralPath $VKeyUtilPath -PathType Leaf) { + Add-Type -TypeDefinition (Get-Content -LiteralPath $VKeyUtilPath -Raw -Encoding UTF8) -Language 'CSharp' -ErrorAction Stop -ReferencedAssemblies System.Windows.Forms +} + +Enum Ensure { + Absent + Present +} + +Enum WindowStyle { + undefined = 0 + normal = 1 + maximized = 3 + minimized = 7 +} + +function Get-TargetResource { + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [string] + $Ensure = [Ensure]::Present, + + [Parameter(Mandatory)] + [string] + $Path, + + [Parameter(Mandatory)] + [string] + $Target, + + [Parameter()] + [string] + $WorkingDirectory, + + [Parameter()] + [string] + $Arguments, + + [Parameter()] + [string] + $Description, + + [Parameter()] + [string] + $Icon, + + [Parameter()] + [string] + $HotKey, + + [Parameter()] + [uint16] + $HotKeyCode = 0x0000, + + [ValidateSet('normal', 'maximized', 'minimized')] + [string] + $WindowStyle = [WindowStyle]::normal, + + [Parameter()] + [string]$AppUserModelID + ) + + if (-not $Path.EndsWith('.lnk')) { + Write-Verbose ("File extension is not 'lnk'. Automatically add extension") + $Path = $Path + '.lnk' + } + + $Ensure = [Ensure]::Present + + try { + # check file exists + if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) { + Write-Verbose 'File not found.' + $Ensure = [Ensure]::Absent + } + else { + $Shortcut = Get-Shortcut -Path $Path -ReadOnly -ErrorAction Continue + } + $returnValue = @{ + Ensure = $Ensure + Path = $Path + Target = $Shortcut.TargetPath + WorkingDirectory = $Shortcut.WorkingDirectory + Arguments = $Shortcut.Arguments + Description = $Shortcut.Description + Icon = $Shortcut.IconLocation + HotKey = ConvertTo-HotKeyString -HotKeyCode $Shortcut.Hotkey + HotKeyCode = $Shortcut.Hotkey + WindowStyle = [WindowStyle]::undefined + AppUserModelID = $Shortcut.AppUserModelID + } + + if ($Shortcut.WindowStyle -as [WindowStyle]) { + $returnValue.WindowStyle = [WindowStyle]$Shortcut.WindowStyle + } + + $returnValue + } + finally { + if ($Shortcut -is [IDisposable]) { + $Shortcut.Dispose() + $Shortcut = $null + } + } +} # end of Get-TargetResource + + +function Set-TargetResource { + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [string] + $Ensure = [Ensure]::Present, + + [Parameter(Mandatory)] + [string] + $Path, + + [Parameter(Mandatory)] + [string] + $Target, + + [Parameter()] + [string] + $WorkingDirectory, + + [Parameter()] + [string] + $Arguments, + + [Parameter()] + [string] + $Description, + + [Parameter()] + [string] + $Icon, + + [Parameter()] + [string] + $HotKey, + + [Parameter()] + [uint16] + $HotKeyCode = 0x0000, + + [ValidateSet('normal', 'maximized', 'minimized')] + [string] + $WindowStyle = [WindowStyle]::normal, + + [Parameter()] + [string]$AppUserModelID + ) + + $arg = [HashTable]$PSBoundParameters + + if (-not $Path.EndsWith('.lnk')) { + Write-Verbose ("File extension is not 'lnk'. Automatically add extension") + $arg.Path = $Path + '.lnk' + } + + if ($Icon -and ($Icon -notmatch ',\d+$')) { + $arg.Icon = $Icon + ',0' + } + + # Ensure = "Absent" + if ($Ensure -eq [Ensure]::Absent) { + Write-Verbose ('Remove shortcut file "{0}"' -f $arg.Path) + Remove-Item -LiteralPath $arg.Path -Force + } + else { + # Ensure = "Present" + $null = $arg.Remove('Ensure') + Update-Shortcut @arg -Force + } + +} # end of Set-TargetResource + + +function Test-TargetResource { + [CmdletBinding()] + [OutputType([bool])] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [string] + $Ensure = [Ensure]::Present, + + [Parameter(Mandatory)] + [string] + $Path, + + [Parameter(Mandatory)] + [string] + $Target, + + [Parameter()] + [string] + $WorkingDirectory, + + [Parameter()] + [string] + $Arguments, + + [Parameter()] + [string] + $Description, + + [Parameter()] + [string] + $Icon = ',0', + + [Parameter()] + [string] + $HotKey, + + [Parameter()] + [uint16] + $HotKeyCode = 0x0000, + + [ValidateSet('normal', 'maximized', 'minimized')] + [string] + $WindowStyle = [WindowStyle]::normal, + + [Parameter()] + [string]$AppUserModelID + ) + + <# 想定される状態パターンと返却するべき値 + 1. ショートカットがあるべき(Present) + 1-A. ショートカットなし => 更新の必要あり($false) + 1-B. ショートカットはあるがプロパティが正しくない => 更新の必要あり($false) + 1-C. ショートカットあり、プロパティ一致 => 何もする必要なし($true) + 2. ショートカットはあるべきではない(Absent) + 2-A. ショートカットなし => 何もする必要なし($true) + 2-B. ショートカットあり => 削除の必要あり($false) + #> + + # 拡張子つける + if (-not $Path.EndsWith('.lnk')) { + Write-Verbose ("File extension is not 'lnk'. Automatically add extension") + $Path = $Path + '.lnk' + } + + if ($Icon -and ($Icon -notmatch ',\d+$')) { + $Icon = $Icon + ',0' + } + + # HotKey文字列からHotKeyCode(数値表現)を取得 + if ($HotKey) { + # $HotKeyStr = Format-HotKeyString $HotKey + $HotKeyCode = ConvertFrom-HotKeyString -HotKey $HotKey + } + else { + # $HotKeyStr = [string]::Empty + $HotKeyCode = 0x0000 + } + + $ReturnValue = $false + switch ($Ensure) { + 'Absent' { + # ファイルがなければ$true あれば$false + $ReturnValue = (-not (Test-Path -LiteralPath $Path -PathType Leaf)) + } + 'Present' { + $Info = Get-TargetResource -Ensure $Ensure -Path $Path -Target $Target + if ($Info.Ensure -eq [Ensure]::Absent) { + $ReturnValue = $false + } + else { + # Tests whether the shortcut property is the same as the specified parameter. + $NotMatched = @() + if ($Info.Target -ne $Target) { + $NotMatched += 'Target' + } + + if ($PSBoundParameters.ContainsKey('WorkingDirectory') -and ($Info.WorkingDirectory -ne $WorkingDirectory)) { + $NotMatched += 'WorkingDirectory' + } + + if ($PSBoundParameters.ContainsKey('Arguments') -and ($Info.Arguments -ne $Arguments)) { + $NotMatched += 'Arguments' + } + + if ($PSBoundParameters.ContainsKey('Description') -and ($Info.Description -ne $Description)) { + $NotMatched += 'Description' + } + + if ($PSBoundParameters.ContainsKey('Icon') -and ($Info.Icon -ne $Icon)) { + $NotMatched += 'Icon' + } + + if ($PSBoundParameters.ContainsKey('HotKey') -and ($Info.HotKeyCode -ne $HotKeyCode)) { + $NotMatched += 'HotKey' + } + + if ($PSBoundParameters.ContainsKey('WindowStyle') -and ($Info.WindowStyle -ne $WindowStyle)) { + $NotMatched += 'WindowStyle' + } + + if ($PSBoundParameters.ContainsKey('AppUserModelID') -and ($Info.AppUserModelID -ne $AppUserModelID)) { + $NotMatched += 'AppUserModelID' + } + + $ReturnValue = ($NotMatched.Count -eq 0) + if (-not $ReturnValue) { + $NotMatched | ForEach-Object { + Write-Verbose ('{0} property does not match!' -f $_) + } + } + } + } + } + Write-Verbose "Test returns $ReturnValue" + return $ReturnValue +} # end of Test-TargetResource + + +function Get-Shortcut { + [CmdletBinding()] + [OutputType([ShellLink])] + param + ( + # Path of shortcut files + [Parameter(Position = 0, Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] + [Alias('FullName')] + [ValidateScript( { Test-Path -LiteralPath $_ -PathType Leaf } )] + [string]$Path, + + [switch]$ReadOnly + ) + + Begin { + if ($ReadOnly) { + [int]$flag = 0x00000000 #STGM_READ + } + else { + [int]$flag = 0x00000002 #STGM_READWRITE + } + } + + Process { + try { + $Shortcut = New-Object -TypeName ShellLink + $Shortcut.Load($Path, $flag) + return $Shortcut + } + catch { + if ($Shortcut -is [IDisposable]) { + $Shortcut.Dispose() + $Shortcut = $null + } + + Write-Error -Exception $_.Exception + return $null + } + } +} + + +function New-Shortcut { + [CmdletBinding()] + [OutputType([System.IO.FileSystemInfo])] + param + ( + # set file path to create shortcut. If the path not ends with '.lnk', extension will be add automatically. + [Parameter( + Position = 0, + Mandatory, + ValueFromPipelineByPropertyName)] + [Alias('FilePath')] + [string]$Path, + + # Set Target full path to create shortcut + [Parameter( + Position = 1, + Mandatory, + ValueFromPipelineByPropertyName)] + [Alias('Target')] + [string]$TargetPath, + + # Set Description for shortcut. + [Parameter(ValueFromPipelineByPropertyName)] + [Alias('Comment')] + [string]$Description, + + # Set Arguments for shortcut. + [Parameter(ValueFromPipelineByPropertyName)] + [string]$Arguments, + + # Set WorkingDirectory for shortcut. + [Parameter(ValueFromPipelineByPropertyName)] + [string]$WorkingDirectory, + + # Set IconLocation for shortcut. + [Parameter(ValueFromPipelineByPropertyName)] + [string]$Icon, + + [Parameter(ValueFromPipelineByPropertyName)] + [string]$HotKey, + + # Set WindowStyle for shortcut. + [Parameter(ValueFromPipelineByPropertyName)] + [ValidateSet('normal', 'maximized', 'minimized')] + [string]$WindowStyle = [WindowStyle]::normal, + + [Parameter(ValueFromPipelineByPropertyName)] + [string]$AppUserModelID, + + # set if you want to show create shortcut result + [switch]$PassThru, + + [switch]$Force + ) + + begin { + $extension = '.lnk' + } + + process { + # Set Path of a Shortcut + if (-not $Path.EndsWith($extension)) { + $Path = $Path + $extension + } + + if ($HotKey) { + $local:HotKeyCode = ConvertFrom-HotKeyString -HotKey $HotKey -ErrorAction Stop + } + else { + $local:HotKeyCode = 0x0000 + } + + if (-not (Test-Path -LiteralPath (Split-Path $Path -Parent))) { + Write-Verbose 'Create a parent folder' + $null = New-Item -Path (Split-Path $Path -Parent) -ItemType Directory -Force -ErrorAction Stop + } + + $fileName = Split-Path $Path -Leaf # Filename of shortcut + $Directory = Resolve-Path -Path (Split-Path $Path -Parent) # Directory of shortcut + $Path = Join-Path $Directory $fileName # Fullpath of shortcut + + #Remove existing shortcut (when the Force switch is specified) + if (Test-Path -LiteralPath $Path -PathType Leaf) { + if ($Force) { + Write-Verbose 'Remove existing shortcut file' + Remove-Item $Path -Force -ErrorAction SilentlyContinue + } + else { + Write-Error -Exception ([System.IO.IOException]::new("The file '$Path' is already exists.")) + return + } + } + + # Call IShellLink to create Shortcut + Write-Verbose ("Trying to create Shortcut to '{0}'" -f $Path) + try { + $Shortcut = New-Object -TypeName ShellLink + $Shortcut.TargetPath = $TargetPath + $Shortcut.Description = $Description + $Shortcut.WindowStyle = [int][WindowStyle]$WindowStyle + $Shortcut.Arguments = $Arguments + $Shortcut.WorkingDirectory = $WorkingDirectory + if ($PSBoundParameters.ContainsKey('Icon')) { + $Shortcut.IconLocation = $Icon + } + if ($PSBoundParameters.ContainsKey('AppUserModelID')) { + $Shortcut.AppUserModelID = $AppUserModelID + } + if ($PSBoundParameters.ContainsKey('Hotkey')) { + $Shortcut.Hotkey = $local:HotKeyCode + } + $Shortcut.Save($Path) + Write-Verbose 'Shortcut file created successfully.' + } + catch { + Write-Error -Exception $_.Exception + return + } + finally { + if ($Shortcut -is [System.IDisposable]) { + $Shortcut.Dispose() + $Shortcut = $null + } + } + + if ($PassThru) { + Get-Item -LiteralPath $Path + } + } + + end {} +} + +function Update-Shortcut { + [CmdletBinding(DefaultParameterSetName = 'ShellLink')] + [OutputType([System.IO.FileSystemInfo])] + param + ( + # Set file path to update shortcut. If the path not ends with '.lnk', extension will be add automatically. + [Parameter( + Position = 0, + Mandatory, + ValueFromPipeline, + ValueFromPipelineByPropertyName, + ParameterSetName = 'FilePath')] + [Alias('FilePath')] + [string]$Path, + + [Parameter( + Position = 0, + Mandatory, + ValueFromPipeline, + ParameterSetName = 'ShellLink')] + [ShellLink]$InputObject, + + # Set Target full path for shortcut + [Parameter(ParameterSetName = 'FilePath', ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ShellLink')] + [Alias('Target')] + [string]$TargetPath, + + # Set Description for shortcut. + [Parameter(ParameterSetName = 'FilePath', ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ShellLink')] + [Alias('Comment')] + [string]$Description, + + # Set Arguments for shortcut. + [Parameter(ParameterSetName = 'FilePath', ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ShellLink')] + [string]$Arguments, + + # Set WorkingDirectory for shortcut. + [Parameter(ParameterSetName = 'FilePath', ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ShellLink')] + [string]$WorkingDirectory, + + # Set IconLocation for shortcut. + [Parameter(ParameterSetName = 'FilePath', ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ShellLink')] + [string]$Icon, + + [Parameter(ParameterSetName = 'FilePath', ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ShellLink')] + [string]$HotKey, + + # Set WindowStyle for shortcut. + [Parameter(ParameterSetName = 'FilePath', ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ShellLink')] + [ValidateSet('normal', 'maximized', 'minimized')] + [string]$WindowStyle = [WindowStyle]::normal, + + [Parameter(ParameterSetName = 'FilePath', ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ShellLink')] + [string]$AppUserModelID, + + # set if you want to show create shortcut result + [switch]$PassThru, + + [switch]$Force + ) + + begin { + $extension = '.lnk' + } + + process { + if ($PSCmdlet.ParameterSetName -eq 'FilePath') { + if (-not $Path.EndsWith($extension)) { + $Path = $Path + $extension + } + + if (-not (Test-Path -LiteralPath $Path -PathType Leaf)) { + if ($Force -and $TargetPath) { + New-Shortcut @PSBoundParameters + return + } + else { + Write-Error -Exception ([System.IO.FileNotFoundException]::new("The file '$Path' does not exists.")) + return + } + } + } + elseif ($PSCmdlet.ParameterSetName -eq 'ShellLink') { + if (-not ($InputObject.FilePath)) { + Write-Error -Exception ([System.ArgumentException]::new("The InputObject does not valid.")) + return + } + } + + if ($HotKey) { + $local:HotKeyCode = ConvertFrom-HotKeyString -HotKey $HotKey -ErrorAction Stop + } + else { + $local:HotKeyCode = 0x0000 + } + + # Call IShellLink to update Shortcut + Write-Verbose ("Updating Shortcut for '{0}'" -f $Path) + try { + if ($PSCmdlet.ParameterSetName -eq 'FilePath') { + $InputObject = New-Object -TypeName ShellLink + $InputObject.Load($Path) + } + elseif ($PSCmdlet.ParameterSetName -eq 'ShellLink') { + $Path = $InputObject.FilePath + } + + $Shortcut = $InputObject + if ($PSBoundParameters.ContainsKey('TargetPath')) { + $Shortcut.TargetPath = $TargetPath + } + if ($PSBoundParameters.ContainsKey('Description')) { + $Shortcut.Description = $Description + } + if ($PSBoundParameters.ContainsKey('WindowStyle')) { + $Shortcut.WindowStyle = [int][WindowStyle]$WindowStyle + } + if ($PSBoundParameters.ContainsKey('Arguments')) { + $Shortcut.Arguments = $Arguments + } + if ($PSBoundParameters.ContainsKey('WorkingDirectory')) { + $Shortcut.WorkingDirectory = $WorkingDirectory + } + if ($PSBoundParameters.ContainsKey('Icon')) { + $Shortcut.IconLocation = $Icon + } + if ($PSBoundParameters.ContainsKey('AppUserModelID')) { + $Shortcut.AppUserModelID = $AppUserModelID + } + if ($PSBoundParameters.ContainsKey('Hotkey')) { + $Shortcut.Hotkey = $local:HotKeyCode + } + + $Shortcut.Save($Path) + Write-Verbose 'Shortcut file updated successfully.' + } + catch { + Write-Error -Exception $_.Exception + return + } + finally { + if ($Shortcut -is [System.IDisposable]) { + $Shortcut.Dispose() + $Shortcut = $null + } + } + + if ($PassThru) { + Get-Item -LiteralPath $Path + } + } + + end {} +} + + +function Format-HotKeyString { + [CmdletBinding()] + [OutputType([string])] + Param( + [Parameter(Mandatory, Position = 0)] + [AllowEmptyString()] + [string]$HotKey + ) + + if ([string]::IsNullOrWhiteSpace($HotKey)) { + return [string]::Empty + } + + [string[]]$local:HotKeyArray = $HotKey.split('+').Trim() + + if ($local:HotKeyArray.Count -eq 1 -and $local:HotKeyArray[0] -match '^F([1-9]|1[0-9]|2[0-4])$') { + # F1~F24は修飾キーを伴わず単体でもOK + } + elseif ($local:HotKeyArray.Count -notin (2..4)) { + #最短で修飾+キーの2要素、最長でAlt+Ctrl+Shift+キーの4要素 + Write-Error 'HotKey is not valid format.' + return [string]::Empty + } + elseif ($local:HotKeyArray[0] -notmatch '^(Ctrl|Alt|Shift)$') { + #修飾キーから始まっていないとダメ + Write-Error 'HotKey is not valid format.' + return [string]::Empty + } + + #優先順位付きソート + $local:sort = $local:HotKeyArray | ForEach-Object { + switch ($_) { + 'Ctrl' { 1 } + 'Shift' { 2 } + 'Alt' { 3 } + Default { 4 } + } + } + [Array]::Sort($local:sort, $local:HotKeyArray) + $local:HotKeyArray -join '+' +} + + +function ConvertFrom-HotKeyString { + [CmdletBinding()] + [OutputType([uint16])] + Param( + [Parameter(Mandatory, Position = 0, ValueFromPipeline)] + [AllowEmptyString()] + [string]$HotKey + ) + + begin { + [uint16]$HOTKEYF_SHIFT = 0x0100 + [uint16]$HOTKEYF_CONTROL = 0x0200 + [uint16]$HOTKEYF_ALT = 0x0400 + # [uint16]$HOTKEYF_EXT = 0x0800 #? + + Add-Type -AssemblyName System.Windows.Forms + $KeysConverter = New-Object -TypeName 'System.Windows.Forms.KeysConverter' + } + + Process { + if ([string]::IsNullOrWhiteSpace($HotKey)) { + return 0x0000 + } + + [uint16]$local:HotKeyCode = 0x0000 + $HotKey = Format-HotKeyString -HotKey $HotKey + [string[]]$local:HotKeyArray = $HotKey.split('+').Trim() + + switch ($local:HotKeyArray) { + 'Shift' { + $local:HotKeyCode = $local:HotKeyCode -bor $HOTKEYF_SHIFT + continue + } + + 'Ctrl' { + $local:HotKeyCode = $local:HotKeyCode -bor $HOTKEYF_CONTROL + continue + } + + 'Alt' { + $local:HotKeyCode = $local:HotKeyCode -bor $HOTKEYF_ALT + continue + } + + Default { + $local:KeyString = $_ + $local:KeyCode = $null + try { + $local:KeyCode = $KeysConverter.ConvertFromString($local:KeyString.ToUpper()) + } + catch [ArgumentException] { + try { + $local:KeyCode = [VKeyUtil]::GetKeyCodeFromChar($local:KeyString) -band 0x00ff + } + catch { + Write-Error 'HotKey is not valid format.' + return + } + } + catch { + Write-Error -Exception $_.Exception + return + } + + if ($null -ne $local:KeyCode) { + $local:HotKeyCode = $local:HotKeyCode -bor $local:KeyCode + } + } + } + + $local:HotKeyCode + } + + End { + $KeysConverter = $null + } +} + + +function ConvertTo-HotKeyString { + [CmdletBinding()] + [OutputType([string])] + Param( + [Parameter(Mandatory, Position = 0, ValueFromPipeline)] + [uint16]$HotKeyCode + ) + + begin { + [uint16]$HOTKEYF_SHIFT = 0x0100 + [uint16]$HOTKEYF_CONTROL = 0x0200 + [uint16]$HOTKEYF_ALT = 0x0400 + # [uint16]$HOTKEYF_EXT = 0x0800 #? + + Add-Type -AssemblyName System.Windows.Forms + $KeysConverter = New-Object -TypeName 'System.Windows.Forms.KeysConverter' + } + + Process { + if ($HotKeyCode -eq 0x0000) { + return [string]::Empty + } + + [string[]]$local:HotKeyArray = @() + + # Modifier Keys + if ($HotKeyCode -band $HOTKEYF_SHIFT) { + $local:HotKeyArray += 'Shift' + } + if ($HotKeyCode -band $HOTKEYF_CONTROL) { + $local:HotKeyArray += 'Ctrl' + } + if ($HotKeyCode -band $HOTKEYF_ALT) { + $local:HotKeyArray += 'Alt' + } + + # Key + [string]$local:Key = $null + try { $local:Key = [VKeyUtil]::GetCharsFromKeys($HotKeyCode -band 0x00ff) } catch {} + + if ([string]::IsNullOrWhiteSpace($local:Key)) { + try { + $local:Key = $KeysConverter.ConvertToString($HotKeyCode -band 0x00ff) + } + catch { + Write-Error -Exception $_.Exception + return + } + } + + if (-not [string]::IsNullOrWhiteSpace($local:Key)) { + $local:HotKeyArray += $local:Key.ToUpper() + # return formatted string + Format-HotKeyString -HotKey ([string]::Join('+', $local:HotKeyArray)) + } + else { + [string]::Empty + } + } + + End { + $KeysConverter = $null + } +} + + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCResources/cShortcut/cShortcut.schema.mof b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCResources/cShortcut/cShortcut.schema.mof new file mode 100644 index 0000000..bf47f8c --- /dev/null +++ b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/DSCResources/cShortcut/cShortcut.schema.mof @@ -0,0 +1,16 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("cShortcut")] +class cShortcut : OMI_BaseResource +{ + [Write, ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Required] String Target; + [Key] String Path; + [Write] String Arguments; + [Write] String WorkingDirectory; + [Write] String Description; + [Write] String Icon; + [Write] String HotKey; + [read] UInt16 HotKeyCode; + [Write, ValueMap{"normal","maximized","minimized"}, Values{"normal","maximized","minimized"}] String WindowStyle; + [Write] String AppUserModelID; +}; diff --git a/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/LICENSE b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/LICENSE new file mode 100644 index 0000000..056a509 --- /dev/null +++ b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 mkht + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/Libs/ShellLink/ShellLink.cs b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/Libs/ShellLink/ShellLink.cs new file mode 100644 index 0000000..0bb6a10 --- /dev/null +++ b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/Libs/ShellLink/ShellLink.cs @@ -0,0 +1,612 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using ComTypes = System.Runtime.InteropServices.ComTypes; + +// Original code is https://emoacht.wordpress.com/2012/11/14/csharp-appusermodelid/ +public class ShellLink : IDisposable +{ + #region Win32 and COM + + // IShellLink Interface + [ComImport] + [Guid("000214F9-0000-0000-C000-000000000046")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IShellLinkW + { + uint GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cch, ref WIN32_FIND_DATAW pfd, uint fFlags); + uint GetIDList(out IntPtr ppidl); + uint SetIDList(IntPtr pidl); + uint GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cch); + uint SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName); + uint GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cch); + uint SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir); + uint GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cch); + uint SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs); + uint GetHotKey(out ushort pwHotkey); + uint SetHotKey(ushort wHotKey); + uint GetShowCmd(out int piShowCmd); + uint SetShowCmd(int iShowCmd); + uint GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cch, out int piIcon); + uint SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); + uint SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, uint dwReserved); + uint Resolve(IntPtr hwnd, uint fFlags); + uint SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); + } + + // ShellLink CoClass (ShellLink object) + [ComImport] + [ClassInterface(ClassInterfaceType.None)] + [Guid("00021401-0000-0000-C000-000000000046")] + private class CShellLink { } + + // WIN32_FIND_DATAW Structure + [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)] + private struct WIN32_FIND_DATAW + { + public uint dwFileAttributes; + public ComTypes.FILETIME ftCreationTime; + public ComTypes.FILETIME ftLastAccessTime; + public ComTypes.FILETIME ftLastWriteTime; + public uint nFileSizeHigh; + public uint nFileSizeLow; + public uint dwReserved0; + public uint dwReserved1; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] + public string cFileName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] + public string cAlternateFileName; + } + + // IPropertyStore Interface + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99")] + private interface IPropertyStore + { + uint GetCount([Out] out uint cProps); + uint GetAt([In] uint iProp, out PropertyKey pkey); + uint GetValue([In] ref PropertyKey key, [Out] PropVariant pv); + uint SetValue([In] ref PropertyKey key, [In] PropVariant pv); + uint Commit(); + } + + // PropertyKey Structure + // Narrowed down from PropertyKey.cs of Windows API Code Pack 1.1 + [StructLayout(LayoutKind.Sequential, Pack = 4)] + private struct PropertyKey + { + #region Fields + + private Guid formatId; // Unique GUID for property + private Int32 propertyId; // Property identifier (PID) + + #endregion + + #region Public Properties + + public Guid FormatId + { + get { return formatId; } + } + + public Int32 PropertyId + { + get { return propertyId; } + } + + #endregion + + #region Constructor + + public PropertyKey(Guid formatId, Int32 propertyId) + { + this.formatId = formatId; + this.propertyId = propertyId; + } + + public PropertyKey(string formatId, Int32 propertyId) + { + this.formatId = new Guid(formatId); + this.propertyId = propertyId; + } + + #endregion + } + + // PropVariant Class (only for string value) + // Narrowed down from PropVariant.cs of Windows API Code Pack 1.1 + // Originally from http://blogs.msdn.com/b/adamroot/archive/2008/04/11 + // /interop-with-propvariants-in-net.aspx + [StructLayout(LayoutKind.Explicit)] + private sealed class PropVariant : IDisposable + { + #region Fields + + [FieldOffset(0)] + ushort valueType; // Value type + + // [FieldOffset(2)] + // ushort wReserved1; // Reserved field + // [FieldOffset(4)] + // ushort wReserved2; // Reserved field + // [FieldOffset(6)] + // ushort wReserved3; // Reserved field + + [FieldOffset(8)] + IntPtr ptr; // Value + + #endregion + + #region Public Properties + + // Value type (System.Runtime.InteropServices.VarEnum) + public VarEnum VarType + { + get { return (VarEnum)valueType; } + set { valueType = (ushort)value; } + } + + // Whether value is empty or null + public bool IsNullOrEmpty + { + get { return (valueType == (ushort)VarEnum.VT_EMPTY || valueType == (ushort)VarEnum.VT_NULL); } + } + + // Value (only for string value) + public string Value + { + get { return Marshal.PtrToStringUni(ptr); } + } + + #endregion + + #region Constructor + + public PropVariant() { } + + // Construct with string value + public PropVariant(string value) + { + if (value == null) + throw new ArgumentException("Failed to set value."); + + valueType = (ushort)VarEnum.VT_LPWSTR; + ptr = Marshal.StringToCoTaskMemUni(value); + } + + #endregion + + #region Destructor + + ~PropVariant() + { + Dispose(); + } + + public void Dispose() + { + PropVariantClear(this); + GC.SuppressFinalize(this); + } + + #endregion + } + + [DllImport("Ole32.dll", PreserveSig = false)] + private static extern void PropVariantClear([In, Out] PropVariant pvar); + + [DllImport("Shell32.dll", CharSet = CharSet.Unicode, PreserveSig = false)] + private static extern void SHGetNameFromIDList(IntPtr pidl, uint sigdnName, [Out, MarshalAs(UnmanagedType.LPTStr)] out string ppszName); + + [DllImport("Shell32.dll")] + private static extern void ILFree(IntPtr pidl); + + #endregion + + #region Private + + private IShellLinkW shellLinkW = null; + + private bool readOnly = false; + + private readonly PropertyKey AppUserModelIDKey = + new PropertyKey("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}", 5); + + private const int MAX_PATH = 260; + private const int INFOTIPSIZE = 1024; + + private const int SW_SHOWNORMAL = 1; + private const int SW_SHOWMINIMIZED = 2; + private const int SW_SHOWMAXIMIZED = 3; + private const int SW_SHOWMINNOACTIVE = 7; + + private const int STGM_READ = 0x00000000; + private const int STGM_READWRITE = 0x00000002; + private const uint SLGP_UNCPRIORITY = 0x0002; + private const uint SLGP_RAWPATH = 0x0004; + + private const uint SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000; + + + private IPersistFile PersistFile + { + get + { + IPersistFile PersistFile = (IPersistFile)shellLinkW; + if (PersistFile == null) + throw new COMException("Failed to create IPersistFile."); + else + return PersistFile; + } + } + + private IPropertyStore PropertyStore + { + get + { + IPropertyStore PropertyStore = (IPropertyStore)shellLinkW; + if (PropertyStore == null) + throw new COMException("Failed to create IPropertyStore."); + else + return PropertyStore; + } + } + + #endregion + + #region Public + + // Path of loaded shortcut file + public string FilePath + { + get + { + string shortcutFile; + PersistFile.GetCurFile(out shortcutFile); + return shortcutFile; + } + } + + // Path of target file + public string TargetPath + { + get + { + StringBuilder targetPath = new StringBuilder(MAX_PATH); + WIN32_FIND_DATAW data = new WIN32_FIND_DATAW(); + + VerifySucceeded(shellLinkW.GetPath(targetPath, targetPath.Capacity, ref data, SLGP_RAWPATH)); + return targetPath.ToString(); + } + set + { + VerifyReadOnly(); + VerifySucceeded(shellLinkW.SetPath(value)); + } + } + + // Shell item id list + public string IDList + { + get + { + string idList; + System.IntPtr pidl = IntPtr.Zero; + + try + { + VerifySucceeded(shellLinkW.GetIDList(out pidl)); + SHGetNameFromIDList(pidl, SIGDN_DESKTOPABSOLUTEPARSING, out idList); + return idList; + } + finally + { + ILFree(pidl); + } + } + } + + // Description + public string Description + { + get + { + StringBuilder description = new StringBuilder(INFOTIPSIZE); + + VerifySucceeded(shellLinkW.GetDescription(description, description.Capacity)); + return description.ToString(); + } + set + { + VerifyReadOnly(); + VerifySucceeded(shellLinkW.SetDescription(value)); + } + } + + // Arguments + public string Arguments + { + get + { + StringBuilder arguments = new StringBuilder(INFOTIPSIZE); + + VerifySucceeded(shellLinkW.GetArguments(arguments, arguments.Capacity)); + return arguments.ToString(); + } + set + { + VerifyReadOnly(); + VerifySucceeded(shellLinkW.SetArguments(value)); + } + } + + // WorkingDirectory + public string WorkingDirectory + { + get + { + StringBuilder workingDirectory = new StringBuilder(MAX_PATH); + + VerifySucceeded(shellLinkW.GetWorkingDirectory(workingDirectory, workingDirectory.Capacity)); + return workingDirectory.ToString(); + } + set + { + VerifyReadOnly(); + VerifySucceeded(shellLinkW.SetWorkingDirectory(value)); + } + } + + // IconLocation + public string IconLocation + { + get + { + StringBuilder iconLocation = new StringBuilder(MAX_PATH); + int iconIdx; + VerifySucceeded(shellLinkW.GetIconLocation(iconLocation, iconLocation.Capacity, out iconIdx)); + iconLocation.Append(","); + iconLocation.Append(iconIdx.ToString()); + return iconLocation.ToString(); + } + set + { + VerifyReadOnly(); + + int idx = value.LastIndexOf(","); + string iconLocation; + string strIdx; + int iconIdx; + if (idx >= 0) + { + strIdx = value.Substring(idx + 1); + if (Int32.TryParse(strIdx, out iconIdx)) + { + iconLocation = value.Substring(0, idx); + } + else + { + iconLocation = value; + iconIdx = 0; + } + } + else + { + iconLocation = value; + iconIdx = 0; + } + VerifySucceeded(shellLinkW.SetIconLocation(iconLocation, iconIdx)); + } + } + + // WindowStyle + public int WindowStyle + { + get + { + int windowStyle; + + VerifySucceeded(shellLinkW.GetShowCmd(out windowStyle)); + switch (windowStyle) + { + case SW_SHOWMINIMIZED: + case SW_SHOWMINNOACTIVE: + return SW_SHOWMINNOACTIVE; + + case SW_SHOWMAXIMIZED: + return SW_SHOWMAXIMIZED; + + case SW_SHOWNORMAL: + return SW_SHOWNORMAL; + + default: + return 0; + } + } + set + { + VerifyReadOnly(); + + int windowStyle; + switch (value) + { + case 0: + case 1: + windowStyle = SW_SHOWNORMAL; + break; + + case 3: + windowStyle = SW_SHOWMAXIMIZED; + break; + + case 7: + windowStyle = SW_SHOWMINNOACTIVE; + break; + + default: + throw new ArgumentException("Unsupported value."); + } + + VerifySucceeded(shellLinkW.SetShowCmd(windowStyle)); + } + } + + // Hotkey + public ushort Hotkey + { + get + { + ushort hotKey; + VerifySucceeded(shellLinkW.GetHotKey(out hotKey)); + return hotKey; + } + set + { + VerifyReadOnly(); + VerifySucceeded(shellLinkW.SetHotKey(value)); + } + } + + // AppUserModelID + // https://docs.microsoft.com/en-us/windows/win32/shell/appids + public string AppUserModelID + { + get + { + using (PropVariant pv = new PropVariant()) + { + VerifySucceeded(PropertyStore.GetValue(AppUserModelIDKey, pv)); + + if (pv.Value == null) + return string.Empty; + else + return pv.Value; + } + } + set + { + VerifyReadOnly(); + using (PropVariant pv = new PropVariant(value)) + { + VerifySucceeded(PropertyStore.SetValue(AppUserModelIDKey, pv)); + VerifySucceeded(PropertyStore.Commit()); + } + } + } + + #endregion + + #region Constructor + + public ShellLink() : this(null) { } + + // Construct with loading shortcut file. + public ShellLink(string file) + { + try + { + shellLinkW = (IShellLinkW)new CShellLink(); + } + catch + { + throw new COMException("Failed to create ShellLink object."); + } + + if (file != null) + Load(file); + } + + #endregion + + #region Destructor + + ~ShellLink() + { + Dispose(false); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (shellLinkW != null) + { + // Release all references. + Marshal.FinalReleaseComObject(shellLinkW); + shellLinkW = null; + } + } + + #endregion + + #region Methods + + // Save shortcut file. + public void Save() + { + VerifyReadOnly(); + + string file = FilePath; + if (file == null) + throw new InvalidOperationException("File name is not given."); + else + Save(file); + } + + public void Save(string file) + { + if (file == null) + { + throw new ArgumentNullException("File name is required."); + } + else + { + VerifyReadOnly(); + PersistFile.Save(file, true); + } + } + + // Load shortcut file. + public void Load(string file) + { + Load(file, STGM_READWRITE); + } + + public void Load(string file, int flags) + { + if (!File.Exists(file)) + { + throw new FileNotFoundException("File is not found.", file); + } + else + { + PersistFile.Load(file, flags); + if ((flags & 0x0000000f) == 0) + readOnly = true; + } + } + + // Verify if operation succeeded. + private static void VerifySucceeded(uint hresult) + { + if (hresult > 1) + throw new InvalidOperationException("Failed with HRESULT: " + + hresult.ToString("X")); + } + + // Verify if operation as read only. + private void VerifyReadOnly() + { + if (readOnly) + throw new UnauthorizedAccessException("This object is read-only."); + } + + #endregion +} diff --git a/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/Libs/VKeyUtil/VKeyUtil.cs b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/Libs/VKeyUtil/VKeyUtil.cs new file mode 100644 index 0000000..fa31b8f --- /dev/null +++ b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/Libs/VKeyUtil/VKeyUtil.cs @@ -0,0 +1,27 @@ +using System; +using System.Text; +using System.Windows.Forms; +using System.Runtime.InteropServices; + +public static class VKeyUtil +{ + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + private static extern short VkKeyScanW(char ch); + + [DllImport("user32.dll")] + private static extern int ToUnicode(uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags); + + public static short GetKeyCodeFromChar(char ch) + { + return VkKeyScanW(ch); + } + + public static string GetCharsFromKeys(Keys keys) + { + StringBuilder buf = new StringBuilder(10); + byte[] keyboardState = new byte[256]; + + ToUnicode((uint)keys, 0, keyboardState, buf, buf.Capacity, 0); + return buf.ToString(); + } +} diff --git a/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/README.md b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/README.md new file mode 100644 index 0000000..5646f85 --- /dev/null +++ b/deployment/dsc/azshcihost/DSCR_Shortcut/2.1.1/README.md @@ -0,0 +1,139 @@ +DSCR_Shortcut +==== + +PowerShell DSC Resource to create shortcut file (LNK file). + +## Install +You can install Resource through [PowerShell Gallery](https://www.powershellgallery.com/packages/DSCR_Shortcut/). +```PowerShell +Install-Module -Name DSCR_Shortcut +``` + +## Resources +* **cShortcut** +PowerShell DSC Resource to create shortcut file. + +## Properties +### cShortcut ++ [string] **Ensure** (Write): + + Specify whether or not a shortcut file exists + + The default value is `Present`. { Present | Absent } + ++ [string] **Path** (Key): + + The path of the shortcut file. + + If the path ends with something other than `.lnk`, The extension will be added automatically to the end of the path + ++ [string] **Target** (Required): + + The target path of the shortcut. + ++ [string] **Arguments** (Write): + + The arguments of the shortcut. + ++ [string] **WorkingDirectory** (Write): + + The working directory of the shortcut. + ++ [string] **WindowStyle** (Write): + + You can select window style. { normal | maximized | minimized } + + The default value is `normal` + ++ [string] **Description** (Write): + + The description of the shortcut. + ++ [string] **Icon** (Write): + + The path of the icon resource. + ++ [string] **HotKey** (Write): + + HotKey (Shortcut Key) of the shortcut + + HotKey works only for shortcuts on the desktop or in the Start menu. + + The syntax is: `"{KeyModifier} + {KeyName}"` ( e.g. `"Alt+Ctrl+Q"`, `"Shift+F9"` ) + + If the hotkey not working after configuration, try to reboot. + ++ [string] **AppUserModelID** (Write): + + Specifies AppUserModelID of the shortcut + + About AppUserModelID, See Microsoft Docs. + https://docs.microsoft.com/en-us/windows/win32/shell/appids + + +## Examples ++ **Example 1**: Create a shortcut to the Internet Explore InPrivate mode to the Administrator's desktop +```PowerShell +Configuration Example1 +{ + Import-DscResource -ModuleName DSCR_Shortcut + cShortcut IE_Desktop + { + Path = 'C:\Users\Administrator\Desktop\PrivateIE.lnk' + Target = "C:\Program Files\Internet Explorer\iexplore.exe" + Arguments = '-private' + } +} +``` + ++ **Example 2**: Specifies All Properties +```PowerShell +Configuration Example2 +{ + Import-DscResource -ModuleName DSCR_Shortcut + cShortcut IE_Desktop + { + Path = 'C:\Users\Administrator\Desktop\PrivateIE.lnk' + Target = 'C:\Program Files\Internet Explorer\iexplore.exe' + Arguments = '-private' + WindowStyle = 'maximized' + WorkingDirectory = 'C:\work' + Description = 'This is a shortcut to the IE' + Icon = 'shell32.dll,277' + HotKey = 'Ctrl+Shift+U' + AppUserModelID = 'Microsoft.InternetExplorer.Default' + } +} +``` + +## ChangeLog +### v2.1.1 + #### Improvements :zap: + - [Regression] Fixed an issue where environment variables in a shortcut file would be unintentionally expanded. + +### v2.1.0 + #### Improvements :zap: + - [Regression] Fixed an issue where environment variables in a shortcut file would be unintentionally expanded. + - Fixed an issue where `HotKey` would not be determined correctly between multiple different keyboard layouts. + - You can now specify the Fn-key for `HotKey` by itself. (In previous versions, it had to be combined with modifier keys.) + - Add Unit & Integration tests. + +### v2.0.0 + #### BREAKING CHANGES :boom: + - v1 of the module initializes properties not specified in the configuration when updating an existing shortcut file, but v2 preserves them. + + #### New Features :sparkles: + - Add `AppUserModelID` property. + You can use this to control the grouping of the taskbar. See Microsoft Docs for more information. + https://docs.microsoft.com/en-us/windows/win32/shell/appids + + #### Improvements :zap: + - For better performance and future scalability, The internal interface has been changed from `WshShortcut` to `IShellLink`. + - Avoid positional parameters. + - Fix minor issues. + +### v1.3.8 + + Changed not to test for properties not explicitly specified. + +### v1.3.7 + + Fix PSSA issues. + + Remove unnecessary files in the published data. + +### v1.3.6 ++ Fixed issue that the Test-TargetResource always fails when the Target contains environment variables. #9 ++ Fixed issue that the Test-TargetResource may fails when the Icon is specified. + +### v1.3.4 ++ Fixed issue that the Test-TargetResource always fails when the HotKey is not specified. #8 ++ Improved verbose messages. + +### v1.3.1 ++ Change type of `HotKey` to `[string]` + +### v1.3.0 ++ Add `Description` property #1 ++ Add `HotKey` property #2 ++ Add `Icon` property #3 diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/DSC_DnsServerADZone.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/DSC_DnsServerADZone.psm1 new file mode 100644 index 0000000..66294ef --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/DSC_DnsServerADZone.psm1 @@ -0,0 +1,340 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('None','NonSecureAndSecure','Secure')] + [System.String] + $DynamicUpdate = 'Secure', + + [Parameter(Mandatory = $true)] + [ValidateSet('Custom','Domain','Forest','Legacy')] + [System.String] + $ReplicationScope, + + [Parameter()] + [System.String] + $DirectoryPartitionName, + + [Parameter()] + [System.String] + $ComputerName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + Assert-Module -ModuleName 'DNSServer' + Write-Verbose ($script:localizedData.CheckingZoneMessage -f $Name, $Ensure) + + if (!$PSBoundParameters.ContainsKey('ComputerName') -and $PSBoundParameters.ContainsKey('Credential')) + { + throw $script:localizedData.CredentialRequiresComputerNameMessage + } + + $getParams = @{ + Name = $Name + ErrorAction = 'SilentlyContinue' + } + + if ($PSBoundParameters.ContainsKey('ComputerName')) + { + $cimSessionParams = @{ + ErrorAction = 'SilentlyContinue' + ComputerName = $ComputerName + } + if ($PSBoundParameters.ContainsKey('Credential')) + { + $cimSessionParams += @{ + Credential = $Credential + } + } + $getParams += @{ + CimSession = (New-CimSession @cimSessionParams) + } + } + + $dnsServerZone = Get-DnsServerZone @getParams + if ($getParams.CimSession) + { + Remove-CimSession -CimSession $getParams.CimSession + } + $targetResource = @{ + Name = $dnsServerZone.ZoneName + DynamicUpdate = $dnsServerZone.DynamicUpdate + ReplicationScope = $dnsServerZone.ReplicationScope + DirectoryPartitionName = $dnsServerZone.DirectoryPartitionName + Ensure = if ($null -eq $dnsServerZone) { 'Absent' } else { 'Present' } + } + return $targetResource +} #end function Get-TargetResource + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('None','NonSecureAndSecure','Secure')] + [System.String] + $DynamicUpdate = 'Secure', + + [Parameter(Mandatory = $true)] + [ValidateSet('Custom','Domain','Forest','Legacy')] + [System.String] + $ReplicationScope, + + [Parameter()] + [System.String] + $DirectoryPartitionName, + + [Parameter()] + [System.String] + $ComputerName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + $targetResource = Get-TargetResource @PSBoundParameters + + $targetResourceInCompliance = $true + + if ($Ensure -eq 'Present') + { + if ($targetResource.Ensure -eq 'Present') + { + if ($targetResource.DynamicUpdate -ne $DynamicUpdate) + { + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f ` + 'DynamicUpdate', $DynamicUpdate, $targetResource.DynamicUpdate) + + $targetResourceInCompliance = $false + } + + if ($targetResource.ReplicationScope -ne $ReplicationScope) + { + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f ` + 'ReplicationScope', $ReplicationScope, $targetResource.ReplicationScope) + + $targetResourceInCompliance = $false + } + + if ($DirectoryPartitionName -and $targetResource.DirectoryPartitionName -ne $DirectoryPartitionName) + { + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f ` + 'DirectoryPartitionName', $DirectoryPartitionName, $targetResource.DirectoryPartitionName) + + $targetResourceInCompliance = $false + } + } + else + { + # Dns zone is present and needs removing + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f 'Ensure', 'Present', 'Absent') + + $targetResourceInCompliance = $false + } + } + else + { + if ($targetResource.Ensure -eq 'Present') + { + ## Dns zone is absent and should be present + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f 'Ensure', 'Absent', 'Present') + + $targetResourceInCompliance = $false + } + } + + return $targetResourceInCompliance +} #end function Test-TargetResource + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('None','NonSecureAndSecure','Secure')] + [System.String] + $DynamicUpdate = 'Secure', + + [Parameter(Mandatory = $true)] + [ValidateSet('Custom','Domain','Forest','Legacy')] + [System.String] + $ReplicationScope, + + [Parameter()] + [System.String] + $DirectoryPartitionName, + + [Parameter()] + [System.String] + $ComputerName, + + [Parameter()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + Assert-Module -ModuleName 'DNSServer' + + $targetResource = Get-TargetResource @PSBoundParameters + + $params = @{ + Name = $Name + } + + if ($PSBoundParameters.ContainsKey('ComputerName')) + { + $cimSessionParams = @{ + ErrorAction = 'SilentlyContinue' + ComputerName = $ComputerName + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $cimSessionParams += @{ + Credential = $Credential + } + } + + $params += @{ + CimSession = (New-CimSession @cimSessionParams) + } + } + + if ($Ensure -eq 'Present') + { + if ($targetResource.Ensure -eq 'Present') + { + ## Update the existing zone + if ($targetResource.DynamicUpdate -ne $DynamicUpdate) + { + $params += @{ + DynamicUpdate = $DynamicUpdate + } + + Write-Verbose ($script:localizedData.SetPropertyMessage -f 'DynamicUpdate') + } + + if ($targetResource.ReplicationScope -ne $ReplicationScope) + { + $params += @{ + ReplicationScope = $ReplicationScope + } + + Write-Verbose ($LocalizedData.SetPropertyMessage -f 'ReplicationScope') + } + + if ($DirectoryPartitionName -and $targetResource.DirectoryPartitionName -ne $DirectoryPartitionName) + { + if ($ReplicationScope -ne 'Custom') + { + # ReplicationScope must be 'Custom' if a DirectoryPartitionName is specified + $errorMessage = $script:localizedData.DirectoryPartitionReplicationScopeError + + New-InvalidArgumentException -ArgumentName 'ReplicationScope' -Message $errorMessage + } + + # ReplicationScope is a required parameter if DirectoryPartitionName is specified + if ($params.keys -notcontains 'ReplicationScope') + { + $params += @{ + ReplicationScope = $ReplicationScope + } + } + + $params += @{ + DirectoryPartitionName = $DirectoryPartitionName + } + + Write-Verbose ($script:localizedData.SetPropertyMessage -f 'DirectoryPartitionName') + } + + Set-DnsServerPrimaryZone @params + } + elseif ($targetResource.Ensure -eq 'Absent') + { + # Create the zone + Write-Verbose ($script:localizedData.AddingZoneMessage -f $targetResource.Name) + + $params += @{ + DynamicUpdate = $DynamicUpdate + ReplicationScope = $ReplicationScope + } + + if ($DirectoryPartitionName) + { + if ($ReplicationScope -ne 'Custom') + { + # ReplicationScope must be 'Custom' if a DirectoryPartitionName is specified + $errorMessage = $script:localizedData.DirectoryPartitionReplicationScopeError + + New-InvalidArgumentException -ArgumentName 'ReplicationScope' -Message $errorMessage + } + + $params += @{ + DirectoryPartitionName = $DirectoryPartitionName + } + } + + Add-DnsServerPrimaryZone @params + } + } + elseif ($Ensure -eq 'Absent') + { + # Remove the DNS Server zone + Write-Verbose ($script:localizedData.RemovingZoneMessage -f $targetResource.Name) + + Remove-DnsServerZone @params -Force + } + + if ($params.CimSession) + { + Remove-CimSession -CimSession $params.CimSession + } +} #end function Set-TargetResource diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/DSC_DnsServerADZone.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/DSC_DnsServerADZone.schema.mof new file mode 100644 index 0000000..c80ae9e --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/DSC_DnsServerADZone.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerADZone")] +class DSC_DnsServerADZone : OMI_BaseResource +{ + [Key, Description("Name of the AD DNS zone")] String Name; + [Write, Description("AD zone dynamic DNS update option. Defaults to `'Secure'`."), ValueMap{"None","NonSecureAndSecure","Secure"}, Values{"None","NonSecureAndSecure","Secure"}] String DynamicUpdate; + [Required, Description("AD zone replication scope option."), ValueMap{"Custom","Domain","Forest","Legacy"}, Values{"Custom","Domain","Forest","Legacy"}] String ReplicationScope; + [Write, Description("Name of the directory partition on which to store the zone. Use this parameter when the ReplicationScope parameter has a value of Custom.")] String DirectoryPartitionName; + [Write, Description("Specifies a DNS server. If you do not specify this parameter, the command runs on the local system.")] String ComputerName; + [Write, Description("Specifies the credential to use to create the AD zone on a remote computer. This parameter can only be used when you also are passing a value for the `ComputerName` parameter."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Whether the DNS zone should be available or removed"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/README.md new file mode 100644 index 0000000..ce06877 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/README.md @@ -0,0 +1,3 @@ +# Description + +The DnsServerADZone DSC resource manages an AD integrated zone on a Domain Name System (DNS) server. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/en-US/DSC_DnsServerADZone.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/en-US/DSC_DnsServerADZone.strings.psd1 new file mode 100644 index 0000000..0bdcaf2 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/en-US/DSC_DnsServerADZone.strings.psd1 @@ -0,0 +1,10 @@ +# culture="en-US" +ConvertFrom-StringData @' + CheckingZoneMessage = Checking DNS server zone with name '{0}' is '{1}'... + AddingZoneMessage = Adding DNS server zone '{0}' ... + RemovingZoneMessage = Removing DNS server zone '{0}' ... + NotDesiredPropertyMessage = DNS server zone property '{0}' is not correct. Expected '{1}', actual '{2}' + SetPropertyMessage = DNS server zone property '{0}' is set + CredentialRequiresComputerNameMessage = The Credentials Parameter can only be used when ComputerName is also specified. + DirectoryPartitionReplicationScopeError = A Directory Partition can only be specified when the Replication Scope is set to 'Custom' +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/en-US/about_DnsServerADZone.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/en-US/about_DnsServerADZone.help.txt new file mode 100644 index 0000000..d438bad --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerADZone/en-US/about_DnsServerADZone.help.txt @@ -0,0 +1,86 @@ +.NAME + DnsServerADZone + +.DESCRIPTION + The DnsServerADZone DSC resource manages an AD integrated zone on a Domain Name System (DNS) server. + +.PARAMETER Name + Key - String + Name of the AD DNS zone + +.PARAMETER DynamicUpdate + Write - String + Allowed values: None, NonSecureAndSecure, Secure + AD zone dynamic DNS update option. Defaults to 'Secure'. + +.PARAMETER ReplicationScope + Required - String + Allowed values: Custom, Domain, Forest, Legacy + AD zone replication scope option. + +.PARAMETER DirectoryPartitionName + Write - String + Name of the directory partition on which to store the zone. Use this parameter when the ReplicationScope parameter has a value of Custom. + +.PARAMETER ComputerName + Write - String + Specifies a DNS server. If you do not specify this parameter, the command runs on the local system. + +.PARAMETER Credential + Write - Instance + Specifies the credential to use to create the AD zone on a remote computer. This parameter can only be used when you also are passing a value for the ComputerName parameter. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Whether the DNS zone should be available or removed + +.EXAMPLE 1 + +This configuration will manage an AD integrated DNS forward lookup zone + +Configuration DnsServerADZone_forward_config +{ + param + ( + [System.Management.Automation.PSCredential] + $Credential + ) + + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + + DnsServerADZone 'AddForwardADZone' + { + Name = 'MyDomainName.com' + DynamicUpdate = 'Secure' + ReplicationScope = 'Forest' + ComputerName = 'MyDnsServer.MyDomain.com' + Credential = $Credential + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will manage an AD integrated DNS reverse lookup zone + +Configuration DnsServerADZone_reverse_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerADZone 'addReverseADZone' + { + Name = '1.168.192.in-addr.arpa' + DynamicUpdate = 'Secure' + ReplicationScope = 'Forest' + Ensure = 'Present' + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/DSC_DnsServerClientSubnet.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/DSC_DnsServerClientSubnet.psm1 new file mode 100644 index 0000000..96cc5dd --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/DSC_DnsServerClientSubnet.psm1 @@ -0,0 +1,238 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + This will return the current state of the resource. + + .PARAMETER Name + Specifies the name of the client subnet. + + .PARAMETER IPv4Subnet + Specify an array (1 or more values) of IPv4 Subnet addresses in CIDR Notation. + + .PARAMETER IPv6Subnet + Specify an array (1 or more values) of IPv6 Subnet addresses in CIDR Notation. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name + + ) + + Write-Verbose -Message ($script:localizedData.GettingDnsServerClientSubnetMessage -f $Name) + $record = Get-DnsServerClientSubnet -Name $Name -ErrorAction SilentlyContinue + + if ($null -eq $record) + { + return @{ + Name = $Name + IPv4Subnet = $null + IPv6Subnet = $null + Ensure = 'Absent' + } + } + + return @{ + Name = $record.Name + IPv4Subnet = $record.IPv4Subnet + IPv6Subnet = $record.IPv6Subnet + Ensure = 'Present' + } +} #end function Get-TargetResource + +<# + .SYNOPSIS + This will configure the resource. + + .PARAMETER Name + Specifies the name of the client subnet. + + .PARAMETER IPv4Subnet + Specify an array (1 or more values) of IPv4 Subnet addresses in CIDR Notation. + + .PARAMETER IPv6Subnet + Specify an array (1 or more values) of IPv6 Subnet addresses in CIDR Notation. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.String[]] + $IPv4Subnet, + + [Parameter()] + [System.String[]] + $IPv6Subnet, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + $dnsServerClientSubnetParameters = @{ + Name = $Name + } + $clientSubnet = Get-DnsServerClientSubnet -Name $Name -ErrorAction SilentlyContinue + if ($Ensure -eq 'Present') + { + if ($IPv4Subnet) + { + $dnsServerClientSubnetParameters.Add('IPv4Subnet',$IPv4Subnet) + } + if ($IPv6Subnet) + { + $dnsServerClientSubnetParameters.Add('IPv6Subnet',$IPv6Subnet) + } + + if ($clientSubnet) + { + $dnsServerClientSubnetParameters.Add('Action', "REPLACE") + Write-Verbose -Message ($script:localizedData.UpdatingDnsServerClientSubnetMessage -f ` + $Name, "$IPv4Subnet", "$IPv6Subnet") + Set-DnsServerClientSubnet @dnsServerClientSubnetParameters + } + else + { + Write-Verbose -Message ($script:localizedData.CreatingDnsServerClientSubnetMessage -f ` + $Name, "$IPv4Subnet", "$IPv6Subnet") + Add-DnsServerClientSubnet @dnsServerClientSubnetParameters + } + } + elseif ($Ensure -eq 'Absent') + { + Write-Verbose -Message ($script:localizedData.RemovingDnsServerClientSubnetMessage -f $Name) + Remove-DnsServerClientSubnet -Name $Name + } +} #end function Set-TargetResource + +<# + .SYNOPSIS + This will return whether the resource is in desired state. + + .PARAMETER Name + Specifies the name of the client subnet. + + .PARAMETER IPv4Subnet + Specify an array (1 or more values) of IPv4 Subnet addresses in CIDR Notation. + + .PARAMETER IPv6Subnet + Specify an array (1 or more values) of IPv6 Subnet addresses in CIDR Notation. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.String[]] + $IPv4Subnet, + + [Parameter()] + [System.String[]] + $IPv6Subnet, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + $result = Get-TargetResource -Name $Name + + if ($Ensure -ne $result.Ensure) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f ` + 'Ensure', $Ensure, $result.Ensure) + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage -f $Name) + return $false + } + elseif ($Ensure -eq 'Present') + { + $IPv4SubnetResult = $result.IPv4Subnet + $IPv6SubnetResult = $result.IPv6Subnet + + if (($null -eq $IPv4Subnet) -and ($null -ne $IPv4SubnetResult)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f ` + 'IPv4Subnet', "$IPv4Subnet", "$IPv4SubnetResult") + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage -f $Name) + return $false + } + + if (($null -eq $IPv4SubnetResult) -and ($null -ne $IPv4Subnet)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f ` + 'IPv4Subnet', "$IPv4Subnet", "$IPv4SubnetResult") + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage -f $Name) + return $false + } + + if ($IPv4Subnet) + { + $IPv4Difference = Compare-Object -ReferenceObject $IPv4Subnet -DifferenceObject $IPv4SubnetResult + if ($IPv4Difference) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f ` + 'IPv4Subnet', "$IPv4Subnet", "$IPv4SubnetResult") + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage -f $Name) + return $false + } + } + + if (($null -eq $IPv6Subnet) -and ($null -ne $IPv6SubnetResult)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f ` + 'IPv6Subnet', "$IPv6Subnet", "$IPv6SubnetResult") + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage -f $Name) + return $false + } + + if (($null -eq $IPv6SubnetResult) -and ($null -ne $IPv6Subnet)) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f ` + 'IPv6Subnet', "$IPv6Subnet", "$IPv6SubnetResult") + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage -f $Name) + return $false + } + + if ($IPv6Subnet) + { + $IPv6Difference = Compare-Object -ReferenceObject $IPv6Subnet -DifferenceObject $IPv6SubnetResult + if ($IPv6Difference) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f ` + 'IPv6Subnet', "$IPv6Subnet", "$IPv6SubnetResult") + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage -f $Name) + return $false + } + } + } + Write-Verbose -Message ($script:localizedData.InDesiredStateMessage -f $Name) + return $true +} #end function Test-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/DSC_DnsServerClientSubnet.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/DSC_DnsServerClientSubnet.schema.mof new file mode 100644 index 0000000..ef4f9d1 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/DSC_DnsServerClientSubnet.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerClientSubnet")] +class DSC_DnsServerClientSubnet : OMI_BaseResource +{ + [Key, Description("Specifies the name of the client subnet.")] string Name; + [Write, Description("Specify an array (1 or more values) of IPv4 Subnet addresses in CIDR Notation.")] string IPv4Subnet[]; + [Write, Description("Specify an array (1 or more values) of IPv6 Subnet addresses in CIDR Notation.")] string IPv6Subnet[]; + [Write, Description("Should this DNS server client subnet be present or absent"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/README.md new file mode 100644 index 0000000..57aa375 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/README.md @@ -0,0 +1,7 @@ +# Description + +The DnsServerClientSubnet DSC resource manages DNS Client Subnets on a Domain Name System (DNS) server. A client subnet is a group of IP subnets that represent a logical group, for example, a geographical area, a datacenter, or a trusted resolver fleet. You can use client subnets in criteria in DNS policies. Multiple DNS policies can refer to the same client subnet. + +## Requirements + +- Target machine must be running Windows Server 2016 or later. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/en-US/DSC_DnsServerClientSubnet.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/en-US/DSC_DnsServerClientSubnet.strings.psd1 new file mode 100644 index 0000000..6da3c6d --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/en-US/DSC_DnsServerClientSubnet.strings.psd1 @@ -0,0 +1,10 @@ +# culture="en-US" +ConvertFrom-StringData @' + GettingDnsServerClientSubnetMessage = Getting DNS Server Client Subnet '{0}'. + CreatingDnsServerClientSubnetMessage = Creating DNS Server Client Subnet '{0}' IPv4 '{1}' and/or IPv6 '{2}'. + UpdatingDnsServerClientSubnetMessage = Updating DNS Server Client Subnet '{0}' IPv4 '{1}' and/or IPv6 '{2}'. + RemovingDnsServerClientSubnetMessage = Removing DNS Server Client Subnet '{0}'. + NotDesiredPropertyMessage = DNS Server Client Subnet property '{0}' is not correct. Expected '{1}', actual '{2}' + InDesiredStateMessage = DNS Server Client Subnet '{0}' is in the desired state. + NotInDesiredStateMessage = DNS Server Client Subnet '{0}' is NOT in the desired state. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/en-US/about_DnsServerClientSubnet.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/en-US/about_DnsServerClientSubnet.help.txt new file mode 100644 index 0000000..cf2f829 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerClientSubnet/en-US/about_DnsServerClientSubnet.help.txt @@ -0,0 +1,46 @@ +.NAME + DnsServerClientSubnet + +.DESCRIPTION + The DnsServerClientSubnet DSC resource manages DNS Client Subnets on a Domain Name System (DNS) server. A client subnet is a group of IP subnets that represent a logical group, for example, a geographical area, a datacenter, or a trusted resolver fleet. You can use client subnets in criteria in DNS policies. Multiple DNS policies can refer to the same client subnet. + + ## Requirements + + - Target machine must be running Windows Server 2016 or later. + +.PARAMETER Name + Key - String + Specifies the name of the client subnet. + +.PARAMETER IPv4Subnet + Write - StringArray + Specify an array (1 or more values) of IPv4 Subnet addresses in CIDR Notation. + +.PARAMETER IPv6Subnet + Write - StringArray + Specify an array (1 or more values) of IPv6 Subnet addresses in CIDR Notation. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Should this DNS server client subnet be present or absent + +.EXAMPLE 1 + +This configuration will manage a DNS client subnet + +Configuration DnsServerClientSubnet_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerClientSubnet 'ClientSubnet1' + { + Name = 'London' + IPv4Subnet = @('10.1.0.0/16', '10.8.0.0/16') + Ensure = 'Present' + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/DSC_DnsServerConditionalForwarder.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/DSC_DnsServerConditionalForwarder.psm1 new file mode 100644 index 0000000..a01a01e --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/DSC_DnsServerConditionalForwarder.psm1 @@ -0,0 +1,430 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Get the state of a conditional forwarder. + + .DESCRIPTION + DnsServerConditionalForwarder can be used to manage the state of a single conditional forwarder. + + .PARAMETER Ensure + Ensure whether the zone is absent or present. + + .PARAMETER Name + The name of the zone to manage. + + .PARAMETER MasterServers + The IP addresses the forwarder should use. Mandatory if Ensure is present. + + .PARAMETER ReplicationScope + Whether the conditional forwarder should be replicated in AD, and the scope of that replication. + + Valid values are: + + * None: (file based / not replicated) + * Custom: A user defined directory partition. DirectoryPartitionName is mandatory if Custom is set. + * Domain: DomainDnsZones + * Forest: ForestDnsZones + * Legacy: The domain partition (defaultNamingContext). + + .PARAMETER DirectoryPartitionName + The name of the directory partition to use when the ReplicationScope is Custom. This value is ignored for all other replication scopes. + +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name + ) + + $targetResource = @{ + Ensure = 'Absent' + Name = $Name + MasterServers = $null + ReplicationScope = $null + DirectoryPartitionName = $null + ZoneType = $null + } + + $zone = Get-DnsServerZone -Name $Name -ErrorAction SilentlyContinue + if ($zone) + { + Write-Verbose ($script:localizedData.FoundZone -f @( + $zone.ZoneType + $Name + )) + + $targetResource.ZoneType = $zone.ZoneType + } + if ($zone -and $zone.ZoneType -eq 'Forwarder') + { + $targetResource.Ensure = 'Present' + $targetResource.MasterServers = $zone.MasterServers + + if ($zone.IsDsIntegrated) + { + $targetResource.ReplicationScope = $zone.ReplicationScope + $targetResource.DirectoryPartitionName = $zone.DirectoryPartitionName + } + else + { + $targetResource.ReplicationScope = 'None' + } + } + else + { + Write-Verbose ($script:localizedData.CouldNotFindZone -f $Name) + } + + $targetResource +} + +<# + .SYNOPSIS + Set the state of a conditional forwarder. + + .DESCRIPTION + DnsServerConditionalForwarder can be used to manage the state of a single conditional forwarder. + + .PARAMETER Ensure + Ensure whether the zone is absent or present. + + .PARAMETER Name + The name of the zone to manage. + + .PARAMETER MasterServers + The IP addresses the forwarder should use. Mandatory if Ensure is present. + + .PARAMETER ReplicationScope + Whether the conditional forwarder should be replicated in AD, and the scope of that replication. + + Valid values are: + + * None: (file based / not replicated) + * Custom: A user defined directory partition. DirectoryPartitionName is mandatory if Custom is set. + * Domain: DomainDnsZones + * Forest: ForestDnsZones + * Legacy: The domain partition (defaultNamingContext). + + .PARAMETER DirectoryPartitionName + The name of the directory partition to use when the ReplicationScope is Custom. This value is ignored for all other replication scopes. + +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('Absent', 'Present')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [String[]] + $MasterServers, + + [Parameter()] + [ValidateSet('None', 'Custom', 'Domain', 'Forest', 'Legacy')] + [System.String] + $ReplicationScope = 'None', + + [Parameter()] + [System.String] + $DirectoryPartitionName + ) + + Test-DscDnsServerConditionalForwarderParameter + + $zone = Get-DnsServerZone -Name $Name -ErrorAction SilentlyContinue + if ($Ensure -eq 'Present') + { + $params = @{ + Name = $Name + MasterServers = $MasterServers + } + + if ($zone) + { + # File <--> DsIntegrated requires create and destroy + if ($zone.ZoneType -ne 'Forwarder' -or + ($zone.IsDsIntegrated -and $ReplicationScope -eq 'None') -or + (-not $zone.IsDsIntegrated -and $ReplicationScope -ne 'None')) + { + Remove-DnsServerZone -Name $Name + + Write-Verbose ($script:localizedData.RecreateZone -f @( + $zone.ZoneType + $Name + )) + + $zone = $null + } + else + { + if ("$($zone.MasterServers)" -ne "$MasterServers") + { + Write-Verbose ($script:localizedData.UpdatingMasterServers -f @( + $Name + ($MasterServers -join ', ') + )) + + $null = Set-DnsServerConditionalForwarderZone @params + } + } + } + + $params = @{ + Name = $Name + } + if ($ReplicationScope -ne 'None') + { + $params.ReplicationScope = $ReplicationScope + } + if ($ReplicationScope -eq 'Custom' -and + $DirectoryPartitionName -and + $zone.DirectoryPartitionName -ne $DirectoryPartitionName) + { + $params.ReplicationScope = 'Custom' + $params.DirectoryPartitionName = $DirectoryPartitionName + } + + if ($zone) + { + if (($params.ReplicationScope -and $params.ReplicationScope -ne $zone.ReplicationScope) -or $params.DirectoryPartitionName) + { + Write-Verbose ($script:localizedData.MoveADZone -f @( + $Name + $ReplicationScope + )) + + $null = Set-DnsServerConditionalForwarderZone @params + } + } + else + { + Write-Verbose ($script:localizedData.NewZone -f $Name) + + $params.MasterServers = $MasterServers + $null = Add-DnsServerConditionalForwarderZone @params + } + } + elseif ($Ensure -eq 'Absent') + { + if ($zone -and $zone.ZoneType -eq 'Forwarder') + { + Write-Verbose ($script:localizedData.RemoveZone -f $Name) + + Remove-DnsServerZone -Name $Name + } + } +} + +<# + .SYNOPSIS + Test the state of a conditional forwarder. + + .DESCRIPTION + DnsServerConditionalForwarder can be used to manage the state of a single conditional forwarder. + + .PARAMETER Ensure + Ensure whether the zone is absent or present. + + .PARAMETER Name + The name of the zone to manage. + + .PARAMETER MasterServers + The IP addresses the forwarder should use. Mandatory if Ensure is present. + + .PARAMETER ReplicationScope + Whether the conditional forwarder should be replicated in AD, and the scope of that replication. + + Valid values are: + + * None: (file based / not replicated) + * Custom: A user defined directory partition. DirectoryPartitionName is mandatory if Custom is set. + * Domain: DomainDnsZones + * Forest: ForestDnsZones + * Legacy: The domain partition (defaultNamingContext). + + .PARAMETER DirectoryPartitionName + The name of the directory partition to use when the ReplicationScope is Custom. This value is ignored for all other replication scopes. + +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([Boolean])] + param + ( + [Parameter()] + [ValidateSet('Absent', 'Present')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [String[]] + $MasterServers, + + [Parameter()] + [ValidateSet('None', 'Custom', 'Domain', 'Forest', 'Legacy')] + [System.String] + $ReplicationScope = 'None', + + [Parameter()] + [System.String] + $DirectoryPartitionName + ) + + Test-DscDnsServerConditionalForwarderParameter + + $zone = Get-DnsServerZone -Name $Name -ErrorAction SilentlyContinue + if ($Ensure -eq 'Present') + { + if (-not $zone) + { + Write-Verbose ($script:localizedData.ZoneDoesNotExist -f $Name) + + return $false + } + + if ($zone.ZoneType -ne 'Forwarder') + { + Write-Verbose ($script:localizedData.IncorrectZoneType -f @( + $Name + $zone.ZoneType + )) + + return $false + } + + if ($zone.IsDsIntegrated -and $ReplicationScope -eq 'None') + { + Write-Verbose ($script:localizedData.ZoneIsDsIntegrated -f $Name) + + return $false + } + + if (-not $zone.IsDsIntegrated -and $ReplicationScope -ne 'None') + { + Write-Verbose ($script:localizedData.ZoneIsFileBased -f $Name) + + return $false + } + + if ($ReplicationScope -ne 'None' -and $zone.ReplicationScope -ne $ReplicationScope) + { + Write-Verbose ($script:localizedData.ReplicationScopeDoesNotMatch -f @( + $Name + $zone.ReplicationScope + $ReplicationScope + )) + + return $false + } + + if ($ReplicationScope -eq 'Custom' -and $zone.DirectoryPartitionName -ne $DirectoryPartitionName) + { + Write-Verbose ($script:localizedData.DirectoryPartitionDoesNotMatch -f @( + $Name + $DirectoryPartitionName + )) + + return $false + } + + <# + Compares two joined arrays. Arrays are joined using the output field separator. + + If the elements are not in the same order the configuration is considered to be different. + + Equivalent to Compare-Object -SyncWindow 0 without the need for null checking of reference or difference. + + Element order is considered important as it affects name resolution. + + https://support.microsoft.com/en-us/help/2834250/net-dns-forwarders-and-conditional-forwarders-resolution-timeouts + #> + if ("$($zone.MasterServers)" -ne "$MasterServers") + { + Write-Verbose ($script:localizedData.MasterServersDoNotMatch -f @( + $Name + ($MasterServers -join ', ') + ($zone.MasterServers -join ', ') + )) + + return $false + } + } + elseif ($Ensure -eq 'Absent') + { + if ($zone -and $zone.ZoneType -eq 'Forwarder') + { + Write-Verbose ($script:localizedData.ZoneExists -f $Name) + + return $false + } + } + + return $true +} + +function Test-DscDnsServerConditionalForwarderParameter +{ + <# + .SYNOPSIS + Tests the parameter combinations required by this resource. + .DESCRIPTION + Tests the parameter combinations required by this resource. + #> + + [CmdletBinding()] + param () + + $invocationInfo = Get-Variable MyInvocation -Scope 1 -ValueOnly + + if (-not $invocationInfo.BoundParameters.ContainsKey('Ensure') -or $invocationInfo.BoundParameters['Ensure'] -eq 'Present') + { + if ($null -eq $invocationInfo.BoundParameters['MasterServers'] -or $invocationInfo.BoundParameters['MasterServers'].Count -eq 0) + { + $pscmdlet.ThrowTerminatingError(( + New-Object System.Management.Automation.ErrorRecord( + (New-Object System.ArgumentException($script:localizedData.MasterServersIsMandatory)), + 'MasterServersIsMandatory', + 'InvalidArgument', + $null + ) + )) + } + + if ($invocationInfo.BoundParameters['ReplicationScope'] -eq 'Custom' -and -not $invocationInfo.BoundParameters['DirectoryPartitionName']) + { + $pscmdlet.ThrowTerminatingError(( + New-Object System.Management.Automation.ErrorRecord( + (New-Object System.ArgumentException($script:localizedData.DirectoryPartitionNameIsMandatory)), + 'DirectoryPartitionNameIsMandatory', + 'InvalidArgument', + $null + ) + )) + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/DSC_DnsServerConditionalForwarder.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/DSC_DnsServerConditionalForwarder.schema.mof new file mode 100644 index 0000000..73bd3d4 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/DSC_DnsServerConditionalForwarder.schema.mof @@ -0,0 +1,10 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerConditionalForwarder")] +class DSC_DnsServerConditionalForwarder : OMI_BaseResource +{ + [Write, Description("Ensure whether the zone is absent or present."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Key, Description("The name of the zone to manage.")] String Name; + [Write, Description("The IP addresses the forwarder should use. Mandatory if Ensure is present.")] String MasterServers[]; + [Write, Description("Whether the conditional forwarder should be replicated in AD, and the scope of that replication. Default is `None`."), ValueMap{"None", "Custom", "Domain", "Forest", "Legacy"}, Values{"None", "Custom", "Domain", "Forest", "Legacy"}] String ReplicationScope; + [Write, Description("The name of the directory partition to use when the ReplicationScope is `Custom`. This value is ignored for all other replication scopes.")] String DirectoryPartitionName; + [Read, Description("The zone type")] String ZoneType; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/README.md new file mode 100644 index 0000000..7b861b0 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/README.md @@ -0,0 +1,5 @@ +# Description + +The DnsServerConditionalForwarder DSC resource manages a conditional forwarder on a Domain Name System (DNS) server. + +You can manage the master servers, forwarder time-out, recursion, recursion scope, and directory partition name for a conditional forwarder zone. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/en-US/DSC_DnsServerConditionalForwarder.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/en-US/DSC_DnsServerConditionalForwarder.strings.psd1 new file mode 100644 index 0000000..e5e76b0 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/en-US/DSC_DnsServerConditionalForwarder.strings.psd1 @@ -0,0 +1,20 @@ +# culture="en-US" +ConvertFrom-StringData @' + FoundZone = Found a {0} zone named {1}. + CouldNotFindZone = Unable to find a zone named {0}. + RecreateZone = The {0} zone {1} was removed pending recreation. The existing zone type or replication scope cannot be converted. + UpdatingMasterServers = The list of servers for the conditional forwarder, {0}, was updated to {1}. + MoveADZone = The conditional forwarder, {0}, was moved to {1} replication scope. + NewZone = The conditional forwarder, {0}, was created. + RemoveZone = The conditional forwarder, {0}, was removed. + ZoneDoesNotExist = The zone, {0}, does not exist. + IncorrectZoneType = The zone {0} is {1}. Expected forwarder. + ZoneIsDsIntegrated = The zone {0} is AD Integrated. Expected file. + ZoneIsFileBased = The zone {0} is file based. Expected AD Integrated. + ReplicationScopeDoesNotMatch = The zone {0} has replication scope {1}. Expected replication scope {2}. + DirectoryPartitionDoesNotMatch = The zone {0} is not stored in the partition {1}. + MasterServersDoNotMatch = Expected master servers for the zone {0} to be {1}. Found {2}. + ZoneExists = The zone, {0}, exists. + MasterServersIsMandatory = The MasterServers parameter is mandatory when ensuring a zone is present. + DirectoryPartitionNameIsMandatory = A DirectoryPartitionName is mandatory when the replication scope is custom. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/en-US/about_DnsServerConditionalForwarder.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/en-US/about_DnsServerConditionalForwarder.help.txt new file mode 100644 index 0000000..95548db --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerConditionalForwarder/en-US/about_DnsServerConditionalForwarder.help.txt @@ -0,0 +1,54 @@ +.NAME + DnsServerConditionalForwarder + +.DESCRIPTION + The DnsServerConditionalForwarder DSC resource manages a conditional forwarder on a Domain Name System (DNS) server. + + You can manage the master servers, forwarder time-out, recursion, recursion scope, and directory partition name for a conditional forwarder zone. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Ensure whether the zone is absent or present. + +.PARAMETER Name + Key - String + The name of the zone to manage. + +.PARAMETER MasterServers + Write - StringArray + The IP addresses the forwarder should use. Mandatory if Ensure is present. + +.PARAMETER ReplicationScope + Write - String + Allowed values: None, Custom, Domain, Forest, Legacy + Whether the conditional forwarder should be replicated in AD, and the scope of that replication. Default is None. + +.PARAMETER DirectoryPartitionName + Write - String + The name of the directory partition to use when the ReplicationScope is Custom. This value is ignored for all other replication scopes. + +.PARAMETER ZoneType + Read - String + The zone type + +.EXAMPLE 1 + +This configuration will manage a DNS server conditional forwarder + +Configuration DnsServerConditionalForwarder_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerConditionalForwarder 'Forwarder1' + { + Name = 'London' + MasterServers = @('10.0.1.10', '10.0.2.10') + ReplicationScope = 'Forest' + Ensure = 'Present' + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/DSC_DnsServerDiagnostics.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/DSC_DnsServerDiagnostics.psm1 new file mode 100644 index 0000000..e7da493 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/DSC_DnsServerDiagnostics.psm1 @@ -0,0 +1,533 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + This will return a hashtable of results about DNS Diagnostics + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer + ) + + Assert-Module -ModuleName 'DnsServer' + + Write-Verbose -Message $script:localizedData.GettingDnsServerDiagnosticsMessage + + $getDnsServerDiagnosticsParameters = @{ + ErrorAction = 'Stop' + } + + if ($DnsServer -ne 'localhost') + { + $getDnsServerDiagnosticsParameters['ComputerName'] = $DnsServer + } + + $dnsServerDiagnostics = Get-DnsServerDiagnostics @getDnsServerDiagnosticsParameters + + $returnValue = @{ + DnsServer = $DnsServer + Answers = $dnsServerDiagnostics.Answers + EnableLogFileRollover = $dnsServerDiagnostics.EnableLogFileRollover + EnableLoggingForLocalLookupEvent = $dnsServerDiagnostics.EnableLoggingForLocalLookupEvent + EnableLoggingForPluginDllEvent = $dnsServerDiagnostics.EnableLoggingForPluginDllEvent + EnableLoggingForRecursiveLookupEvent = $dnsServerDiagnostics.EnableLoggingForRecursiveLookupEvent + EnableLoggingForRemoteServerEvent = $dnsServerDiagnostics.EnableLoggingForRemoteServerEvent + EnableLoggingForServerStartStopEvent = $dnsServerDiagnostics.EnableLoggingForServerStartStopEvent + EnableLoggingForTombstoneEvent = $dnsServerDiagnostics.EnableLoggingForTombstoneEvent + EnableLoggingForZoneDataWriteEvent = $dnsServerDiagnostics.EnableLoggingForZoneDataWriteEvent + EnableLoggingForZoneLoadingEvent = $dnsServerDiagnostics.EnableLoggingForZoneLoadingEvent + EnableLoggingToFile = $dnsServerDiagnostics.EnableLoggingToFile + EventLogLevel = $dnsServerDiagnostics.EventLogLevel + FilterIPAddressList = $dnsServerDiagnostics.FilterIPAddressList + FullPackets = $dnsServerDiagnostics.FullPackets + LogFilePath = $dnsServerDiagnostics.LogFilePath + MaxMBFileSize = $dnsServerDiagnostics.MaxMBFileSize + Notifications = $dnsServerDiagnostics.Notifications + Queries = $dnsServerDiagnostics.Queries + QuestionTransactions = $dnsServerDiagnostics.QuestionTransactions + ReceivePackets = $dnsServerDiagnostics.ReceivePackets + SaveLogsToPersistentStorage = $dnsServerDiagnostics.SaveLogsToPersistentStorage + SendPackets = $dnsServerDiagnostics.SendPackets + TcpPackets = $dnsServerDiagnostics.TcpPackets + UdpPackets = $dnsServerDiagnostics.UdpPackets + UnmatchedResponse = $dnsServerDiagnostics.UnmatchedResponse + Update = $dnsServerDiagnostics.Update + UseSystemEventLog = $dnsServerDiagnostics.UseSystemEventLog + WriteThrough = $dnsServerDiagnostics.WriteThrough + } + + return $returnValue +} + +<# + .SYNOPSIS + This will set the desired state + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. + + .PARAMETER Answers + Specifies whether to enable the logging of DNS responses. + + .PARAMETER EnableLogFileRollover + Specifies whether to enable log file rollover. + + .PARAMETER EnableLoggingForLocalLookupEvent + Specifies whether the DNS server logs local lookup events. + + .PARAMETER EnableLoggingForPluginDllEvent + Specifies whether the DNS server logs dynamic link library (DLL) plug-in events. + + .PARAMETER EnableLoggingForRecursiveLookupEvent + Specifies whether the DNS server logs recursive lookup events. + + .PARAMETER EnableLoggingForRemoteServerEvent + Specifies whether the DNS server logs remote server events. + + .PARAMETER EnableLoggingForServerStartStopEvent + Specifies whether the DNS server logs server start and stop events. + + .PARAMETER EnableLoggingForTombstoneEvent + Specifies whether the DNS server logs tombstone events. + + .PARAMETER EnableLoggingForZoneDataWriteEvent + Specifies Controls whether the DNS server logs zone data write events. + + .PARAMETER EnableLoggingForZoneLoadingEvent + Specifies whether the DNS server logs zone load events. + + .PARAMETER EnableLoggingToFile + Specifies whether the DNS server logs logging-to-file. + + .PARAMETER EventLogLevel + Specifies an event log level. Valid values are Warning, Error, and None. + + .PARAMETER FilterIPAddressList + Specifies an array of IP addresses to filter. When you enable logging, traffic to and from these IP addresses is logged. If you do not specify any IP addresses, traffic to and from all IP addresses is logged. + + .PARAMETER FullPackets + Specifies whether the DNS server logs full packets. + + .PARAMETER LogFilePath + Specifies a log file path. + + .PARAMETER MaxMBFileSize + Specifies the maximum size of the log file. This parameter is relevant if you set EnableLogFileRollover and EnableLoggingToFile to $True. + + .PARAMETER Notifications + Specifies whether the DNS server logs notifications. + + .PARAMETER Queries + Specifies whether the DNS server allows query packet exchanges to pass through the content filter, such as the IPFilterList parameter. + + .PARAMETER QuestionTransactions + Specifies whether the DNS server logs queries. + + .PARAMETER ReceivePackets + Specifies whether the DNS server logs receive packets. + + .PARAMETER SaveLogsToPersistentStorage + Specifies whether the DNS server saves logs to persistent storage. + + .PARAMETER SendPackets + Specifies whether the DNS server logs send packets. + + .PARAMETER TcpPackets + Specifies whether the DNS server logs TCP packets. + + .PARAMETER UdpPackets + Specifies whether the DNS server logs UDP packets. + + .PARAMETER UnmatchedResponse + Specifies whether the DNS server logs unmatched responses. + + .PARAMETER Update + Specifies whether the DNS server logs updates. + + .PARAMETER UseSystemEventLog + Specifies whether the DNS server uses the system event log for logging. + + .PARAMETER WriteThrough + Specifies whether the DNS server logs write-throughs. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer, + + [Parameter()] + [Boolean] + $Answers, + + [Parameter()] + [Boolean] + $EnableLogFileRollover, + + [Parameter()] + [Boolean] + $EnableLoggingForLocalLookupEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForPluginDllEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForRecursiveLookupEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForRemoteServerEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForServerStartStopEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForTombstoneEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForZoneDataWriteEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForZoneLoadingEvent, + + [Parameter()] + [Boolean] + $EnableLoggingToFile, + + [Parameter()] + [UInt32] + $EventLogLevel, + + [Parameter()] + [String[]] + $FilterIPAddressList, + + [Parameter()] + [Boolean] + $FullPackets, + + [Parameter()] + [System.String] + $LogFilePath, + + [Parameter()] + [UInt32] + $MaxMBFileSize, + + [Parameter()] + [Boolean] + $Notifications, + + [Parameter()] + [Boolean] + $Queries, + + [Parameter()] + [Boolean] + $QuestionTransactions, + + [Parameter()] + [Boolean] + $ReceivePackets, + + [Parameter()] + [Boolean] + $SaveLogsToPersistentStorage, + + [Parameter()] + [Boolean] + $SendPackets, + + [Parameter()] + [Boolean] + $TcpPackets, + + [Parameter()] + [Boolean] + $UdpPackets, + + [Parameter()] + [Boolean] + $UnmatchedResponse, + + [Parameter()] + [Boolean] + $Update, + + [Parameter()] + [Boolean] + $UseSystemEventLog, + + [Parameter()] + [Boolean] + $WriteThrough + ) + + $PSBoundParameters.Remove('DnsServer') + + $setDnsServerDiagnosticsParameters = Remove-CommonParameter -Hashtable $PSBoundParameters + $setDnsServerDiagnosticsParameters['ErrorAction'] = 'Stop' + + if ($DnsServer -ne 'localhost') + { + $setDnsServerDiagnosticsParameters['ComputerName'] = $DnsServer + } + + Write-Verbose -Message $script:localizedData.SettingDnsServerDiagnosticsMessage + + Set-DnsServerDiagnostics @setDnsServerDiagnosticsParameters +} + +<# + .SYNOPSIS + This will set the desired state + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. + + .PARAMETER Answers + Specifies whether to enable the logging of DNS responses. + + .PARAMETER EnableLogFileRollover + Specifies whether to enable log file rollover. + + .PARAMETER EnableLoggingForLocalLookupEvent + Specifies whether the DNS server logs local lookup events. + + .PARAMETER EnableLoggingForPluginDllEvent + Specifies whether the DNS server logs dynamic link library (DLL) plug-in events. + + .PARAMETER EnableLoggingForRecursiveLookupEvent + Specifies whether the DNS server logs recursive lookup events. + + .PARAMETER EnableLoggingForRemoteServerEvent + Specifies whether the DNS server logs remote server events. + + .PARAMETER EnableLoggingForServerStartStopEvent + Specifies whether the DNS server logs server start and stop events. + + .PARAMETER EnableLoggingForTombstoneEvent + Specifies whether the DNS server logs tombstone events. + + .PARAMETER EnableLoggingForZoneDataWriteEvent + Specifies Controls whether the DNS server logs zone data write events. + + .PARAMETER EnableLoggingForZoneLoadingEvent + Specifies whether the DNS server logs zone load events. + + .PARAMETER EnableLoggingToFile + Specifies whether the DNS server logs logging-to-file. + + .PARAMETER EventLogLevel + Specifies an event log level. Valid values are Warning, Error, and None. + + .PARAMETER FilterIPAddressList + Specifies an array of IP addresses to filter. When you enable logging, traffic to and from these IP addresses is logged. If you do not specify any IP addresses, traffic to and from all IP addresses is logged. + + .PARAMETER FullPackets + Specifies whether the DNS server logs full packets. + + .PARAMETER LogFilePath + Specifies a log file path. + + .PARAMETER MaxMBFileSize + Specifies the maximum size of the log file. This parameter is relevant if you set EnableLogFileRollover and EnableLoggingToFile to $True. + + .PARAMETER Notifications + Specifies whether the DNS server logs notifications. + + .PARAMETER Queries + Specifies whether the DNS server allows query packet exchanges to pass through the content filter, such as the IPFilterList parameter. + + .PARAMETER QuestionTransactions + Specifies whether the DNS server logs queries. + + .PARAMETER ReceivePackets + Specifies whether the DNS server logs receive packets. + + .PARAMETER SaveLogsToPersistentStorage + Specifies whether the DNS server saves logs to persistent storage. + + .PARAMETER SendPackets + Specifies whether the DNS server logs send packets. + + .PARAMETER TcpPackets + Specifies whether the DNS server logs TCP packets. + + .PARAMETER UdpPackets + Specifies whether the DNS server logs UDP packets. + + .PARAMETER UnmatchedResponse + Specifies whether the DNS server logs unmatched responses. + + .PARAMETER Update + Specifies whether the DNS server logs updates. + + .PARAMETER UseSystemEventLog + Specifies whether the DNS server uses the system event log for logging. + + .PARAMETER WriteThrough + Specifies whether the DNS server logs write-throughs. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer, + + [Parameter()] + [Boolean] + $Answers, + + [Parameter()] + [Boolean] + $EnableLogFileRollover, + + [Parameter()] + [Boolean] + $EnableLoggingForLocalLookupEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForPluginDllEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForRecursiveLookupEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForRemoteServerEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForServerStartStopEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForTombstoneEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForZoneDataWriteEvent, + + [Parameter()] + [Boolean] + $EnableLoggingForZoneLoadingEvent, + + [Parameter()] + [Boolean] + $EnableLoggingToFile, + + [Parameter()] + [UInt32] + $EventLogLevel, + + [Parameter()] + [String[]] + $FilterIPAddressList, + + [Parameter()] + [Boolean] + $FullPackets, + + [Parameter()] + [System.String] + $LogFilePath, + + [Parameter()] + [UInt32] + $MaxMBFileSize, + + [Parameter()] + [Boolean] + $Notifications, + + [Parameter()] + [Boolean] + $Queries, + + [Parameter()] + [Boolean] + $QuestionTransactions, + + [Parameter()] + [Boolean] + $ReceivePackets, + + [Parameter()] + [Boolean] + $SaveLogsToPersistentStorage, + + [Parameter()] + [Boolean] + $SendPackets, + + [Parameter()] + [Boolean] + $TcpPackets, + + [Parameter()] + [Boolean] + $UdpPackets, + + [Parameter()] + [Boolean] + $UnmatchedResponse, + + [Parameter()] + [Boolean] + $Update, + + [Parameter()] + [Boolean] + $UseSystemEventLog, + + [Parameter()] + [Boolean] + $WriteThrough + ) + + Write-Verbose -Message $script:localizedData.EvaluatingDnsServerDiagnosticsMessage + + $currentState = Get-TargetResource -DnsServer $DnsServer + + $null = $PSBoundParameters.Remove('DnsServer') + + $result = Test-DscDnsParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters -TurnOffTypeChecking -Verbose:$VerbosePreference + + return $result +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/DSC_DnsServerDiagnostics.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/DSC_DnsServerDiagnostics.schema.mof new file mode 100644 index 0000000..c1d3c99 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/DSC_DnsServerDiagnostics.schema.mof @@ -0,0 +1,33 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerDiagnostics")] +class DSC_DnsServerDiagnostics : OMI_BaseResource +{ + [Key, Description("Specifies the DNS server to connect to, or use 'localhost' for the current node.")] String DnsServer; + [Write, Description("Specifies whether to enable the logging of DNS responses.")] Boolean Answers; + [Write, Description("Specifies whether to enable log file rollover.")] Boolean EnableLogFileRollover; + [Write, Description("Specifies whether the DNS server logs local lookup events.")] Boolean EnableLoggingForLocalLookupEvent; + [Write, Description("Specifies whether the DNS server logs dynamic link library (DLL) plug-in events.")] Boolean EnableLoggingForPluginDllEvent; + [Write, Description("Specifies whether the DNS server logs recursive lookup events.")] Boolean EnableLoggingForRecursiveLookupEvent; + [Write, Description("Specifies whether the DNS server logs remote server events.")] Boolean EnableLoggingForRemoteServerEvent; + [Write, Description("Specifies whether the DNS server logs server start and stop events.")] Boolean EnableLoggingForServerStartStopEvent; + [Write, Description("Specifies whether the DNS server logs tombstone events.")] Boolean EnableLoggingForTombstoneEvent; + [Write, Description("Specifies whether the DNS server logs zone data write events.")] Boolean EnableLoggingForZoneDataWriteEvent; + [Write, Description("Specifies whether the DNS server logs zone load events.")] Boolean EnableLoggingForZoneLoadingEvent; + [Write, Description("Specifies whether the DNS server logs logging-to-file.")] Boolean EnableLoggingToFile; + [Write, Description("Specifies an event log level. Valid values are Warning, Error, and None.")] Uint32 EventLogLevel; + [Write, Description("Specifies an array of IP addresses to filter. When you enable logging, traffic to and from these IP addresses is logged. If you do not specify any IP addresses, traffic to and from all IP addresses is logged.")] String FilterIPAddressList[]; + [Write, Description("Specifies whether the DNS server logs full packets.")] Boolean FullPackets; + [Write, Description("Specifies a log file path.")] String LogFilePath; + [Write, Description("Specifies the maximum size of the log file. This parameter is relevant if you set **EnableLogFileRollover** and **EnableLoggingToFile** to `$true`.")] Uint32 MaxMBFileSize; + [Write, Description("Specifies whether the DNS server logs notifications.")] Boolean Notifications; + [Write, Description("Specifies whether the DNS server allows query packet exchanges to pass through the content filter, such as the **FilterIPAddressList** parameter.")] Boolean Queries; + [Write, Description("Specifies whether the DNS server logs queries.")] Boolean QuestionTransactions; + [Write, Description("Specifies whether the DNS server logs receive packets.")] Boolean ReceivePackets; + [Write, Description("Specifies whether the DNS server saves logs to persistent storage.")] Boolean SaveLogsToPersistentStorage; + [Write, Description("Specifies whether the DNS server logs send packets.")] Boolean SendPackets; + [Write, Description("Specifies whether the DNS server logs TCP packets.")] Boolean TcpPackets; + [Write, Description("Specifies whether the DNS server logs UDP packets.")] Boolean UdpPackets; + [Write, Description("Specifies whether the DNS server logs unmatched responses.")] Boolean UnmatchedResponse; + [Write, Description("Specifies whether the DNS server logs updates.")] Boolean Update; + [Write, Description("Specifies whether the DNS server uses the system event log for logging.")] Boolean UseSystemEventLog; + [Write, Description("Specifies whether the DNS server logs write-throughs.")] Boolean WriteThrough; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/README.md new file mode 100644 index 0000000..20300f2 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/README.md @@ -0,0 +1,12 @@ +# Description + +The DnsServerDiagnostics DSC resource manages the debugging and logging +parameters on a Domain Name System (DNS) server. + +If the parameter **DnsServer** is set to `'localhost'` then the resource +can normally use the default credentials (SYSTEM) to configure the DNS server +settings. If using any other value for the parameter **DnsServer** make sure +that the credential the resource is run as have the correct permissions +at the target node and the necessary network traffic is permitted. +It is possible to run the resource with specific credentials using the +built-in parameter **PsDscRunAsCredential**. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/en-US/DSC_DnsServerDiagnostics.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/en-US/DSC_DnsServerDiagnostics.strings.psd1 new file mode 100644 index 0000000..17cdc47 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/en-US/DSC_DnsServerDiagnostics.strings.psd1 @@ -0,0 +1,6 @@ +# culture="en-US" +ConvertFrom-StringData @' + GettingDnsServerDiagnosticsMessage = Getting DNS Server diagnostics + SettingDnsServerDiagnosticsMessage = Setting DNS Server diagnostics + EvaluatingDnsServerDiagnosticsMessage = Evaluating the DNS Server Diagnostics +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/en-US/about_DnsServerDiagnostics.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/en-US/about_DnsServerDiagnostics.help.txt new file mode 100644 index 0000000..3a49856 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerDiagnostics/en-US/about_DnsServerDiagnostics.help.txt @@ -0,0 +1,221 @@ +.NAME + DnsServerDiagnostics + +.DESCRIPTION + The DnsServerDiagnostics DSC resource manages the debugging and logging + parameters on a Domain Name System (DNS) server. + + If the parameter DnsServer is set to 'localhost' then the resource + can normally use the default credentials (SYSTEM) to configure the DNS server + settings. If using any other value for the parameter DnsServer make sure + that the credential the resource is run as have the correct permissions + at the target node and the necessary network traffic is permitted. + It is possible to run the resource with specific credentials using the + built-in parameter PsDscRunAsCredential. + +.PARAMETER DnsServer + Key - String + Specifies the DNS server to connect to, or use 'localhost' for the current node. + +.PARAMETER Answers + Write - Boolean + Specifies whether to enable the logging of DNS responses. + +.PARAMETER EnableLogFileRollover + Write - Boolean + Specifies whether to enable log file rollover. + +.PARAMETER EnableLoggingForLocalLookupEvent + Write - Boolean + Specifies whether the DNS server logs local lookup events. + +.PARAMETER EnableLoggingForPluginDllEvent + Write - Boolean + Specifies whether the DNS server logs dynamic link library (DLL) plug-in events. + +.PARAMETER EnableLoggingForRecursiveLookupEvent + Write - Boolean + Specifies whether the DNS server logs recursive lookup events. + +.PARAMETER EnableLoggingForRemoteServerEvent + Write - Boolean + Specifies whether the DNS server logs remote server events. + +.PARAMETER EnableLoggingForServerStartStopEvent + Write - Boolean + Specifies whether the DNS server logs server start and stop events. + +.PARAMETER EnableLoggingForTombstoneEvent + Write - Boolean + Specifies whether the DNS server logs tombstone events. + +.PARAMETER EnableLoggingForZoneDataWriteEvent + Write - Boolean + Specifies whether the DNS server logs zone data write events. + +.PARAMETER EnableLoggingForZoneLoadingEvent + Write - Boolean + Specifies whether the DNS server logs zone load events. + +.PARAMETER EnableLoggingToFile + Write - Boolean + Specifies whether the DNS server logs logging-to-file. + +.PARAMETER EventLogLevel + Write - UInt32 + Specifies an event log level. Valid values are Warning, Error, and None. + +.PARAMETER FilterIPAddressList + Write - StringArray + Specifies an array of IP addresses to filter. When you enable logging, traffic to and from these IP addresses is logged. If you do not specify any IP addresses, traffic to and from all IP addresses is logged. + +.PARAMETER FullPackets + Write - Boolean + Specifies whether the DNS server logs full packets. + +.PARAMETER LogFilePath + Write - String + Specifies a log file path. + +.PARAMETER MaxMBFileSize + Write - UInt32 + Specifies the maximum size of the log file. This parameter is relevant if you set EnableLogFileRollover and EnableLoggingToFile to $true. + +.PARAMETER Notifications + Write - Boolean + Specifies whether the DNS server logs notifications. + +.PARAMETER Queries + Write - Boolean + Specifies whether the DNS server allows query packet exchanges to pass through the content filter, such as the FilterIPAddressList parameter. + +.PARAMETER QuestionTransactions + Write - Boolean + Specifies whether the DNS server logs queries. + +.PARAMETER ReceivePackets + Write - Boolean + Specifies whether the DNS server logs receive packets. + +.PARAMETER SaveLogsToPersistentStorage + Write - Boolean + Specifies whether the DNS server saves logs to persistent storage. + +.PARAMETER SendPackets + Write - Boolean + Specifies whether the DNS server logs send packets. + +.PARAMETER TcpPackets + Write - Boolean + Specifies whether the DNS server logs TCP packets. + +.PARAMETER UdpPackets + Write - Boolean + Specifies whether the DNS server logs UDP packets. + +.PARAMETER UnmatchedResponse + Write - Boolean + Specifies whether the DNS server logs unmatched responses. + +.PARAMETER Update + Write - Boolean + Specifies whether the DNS server logs updates. + +.PARAMETER UseSystemEventLog + Write - Boolean + Specifies whether the DNS server uses the system event log for logging. + +.PARAMETER WriteThrough + Write - Boolean + Specifies whether the DNS server logs write-throughs. + +.EXAMPLE 1 + +This configuration will manage a DNS server's diagnostics settings + +Configuration DnsServerDiagnostics_CurrentNode_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerDiagnostics 'Diagnostics' + { + DnsServer = 'localhost' + Answers = $true + EnableLogFileRollover = $true + EnableLoggingForLocalLookupEvent = $true + EnableLoggingForPluginDllEvent = $true + EnableLoggingForRecursiveLookupEvent = $true + EnableLoggingForRemoteServerEvent = $true + EnableLoggingForServerStartStopEvent = $true + EnableLoggingForTombstoneEvent = $true + EnableLoggingForZoneDataWriteEvent = $true + EnableLoggingForZoneLoadingEvent = $true + EnableLoggingToFile = $true + EventLogLevel = 7 + FilterIPAddressList = @('10.0.10.1', '10.0.10.2') + FullPackets = $false + LogFilePath = 'd:\dnslogs\dns.log' + MaxMBFileSize = 500000000 + Notifications = $true + Queries = $true + QuestionTransactions = $true + ReceivePackets = $false + SaveLogsToPersistentStorage = $true + SendPackets = $false + TcpPackets = $false + UdpPackets = $false + UnmatchedResponse = $false + Update = $true + UseSystemEventLog = $true + WriteThrough = $true + } + } +} + +.EXAMPLE 2 + +This configuration will manage a DNS server's diagnostics settings + +Configuration DnsServerDiagnostics_RemoteNode_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerDiagnostics 'Diagnostics' + { + DnsServer = 'dns1.company.local' + Answers = $true + EnableLogFileRollover = $true + EnableLoggingForLocalLookupEvent = $true + EnableLoggingForPluginDllEvent = $true + EnableLoggingForRecursiveLookupEvent = $true + EnableLoggingForRemoteServerEvent = $true + EnableLoggingForServerStartStopEvent = $true + EnableLoggingForTombstoneEvent = $true + EnableLoggingForZoneDataWriteEvent = $true + EnableLoggingForZoneLoadingEvent = $true + EnableLoggingToFile = $true + EventLogLevel = 7 + FilterIPAddressList = @('10.0.10.1', '10.0.10.2') + FullPackets = $false + LogFilePath = 'd:\dnslogs\dns.log' + MaxMBFileSize = 500000000 + Notifications = $true + Queries = $true + QuestionTransactions = $true + ReceivePackets = $false + SaveLogsToPersistentStorage = $true + SendPackets = $false + TcpPackets = $false + UdpPackets = $false + UnmatchedResponse = $false + Update = $true + UseSystemEventLog = $true + WriteThrough = $true + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/DSC_DnsServerForwarder.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/DSC_DnsServerForwarder.psm1 new file mode 100644 index 0000000..aa33af6 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/DSC_DnsServerForwarder.psm1 @@ -0,0 +1,189 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance + ) + + Write-Verbose -Message $script:localizedData.GettingDnsForwardersMessage + + $currentServerForwarders = Get-DnsServerForwarder + + $targetResource = @{ + IsSingleInstance = $IsSingleInstance + IPAddresses = @() + UseRootHint = $currentServerForwarders.UseRootHint + EnableReordering = $currentServerForwarders.EnableReordering + Timeout = $currentServerForwarders.Timeout + } + + [System.Array] $currentIPs = $currentServerForwarders.IPAddress + + if ($currentIPs) + { + $targetResource.IPAddresses = $currentIPs + } + + return $targetResource +} + +function Set-TargetResource +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [AllowEmptyCollection()] + [string[]] + $IPAddresses, + + [Parameter()] + [System.Boolean] + $UseRootHint, + + [Parameter()] + [System.Boolean] + $EnableReordering, + + [Parameter()] + [ValidateRange(0, 15)] + [System.UInt32] + $Timeout + ) + + $setDnsServerForwarderParameters = @{} + + if ($PSBoundParameters.ContainsKey('IPAddresses')) + { + if ($IPAddresses.Count -eq 0) + { + Write-Verbose -Message $script:localizedData.DeletingDnsForwardersMessage + + Get-DnsServerForwarder | Remove-DnsServerForwarder -Force + } + else + { + Write-Verbose -Message $script:localizedData.SettingDnsForwardersMessage + + $setDnsServerForwarderParameters['IPAddress'] = $IPAddresses + } + } + + if ($PSBoundParameters.ContainsKey('UseRootHint')) + { + Write-Verbose -Message ($script:localizedData.SettingUseRootHintProperty -f $UseRootHint) + + $setDnsServerForwarderParameters['UseRootHint'] = $UseRootHint + } + + if ($PSBoundParameters.ContainsKey('EnableReordering')) + { + Write-Verbose -Message ($script:localizedData.SettingEnableReorderingProperty -f $EnableReordering) + + $setDnsServerForwarderParameters['EnableReordering'] = $EnableReordering + } + + if ($PSBoundParameters.ContainsKey('Timeout')) + { + Write-Verbose -Message ($script:localizedData.SettingTimeoutProperty -f $Timeout) + + $setDnsServerForwarderParameters['Timeout'] = $Timeout + } + + # Only do set if there are any parameters values added to the hashtable. + if ($setDnsServerForwarderParameters.Count -gt 0) + { + Set-DnsServerForwarder @setDnsServerForwarderParameters -WarningAction 'SilentlyContinue' + } +} + +function Test-TargetResource +{ + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [AllowEmptyCollection()] + [string[]] + $IPAddresses, + + [Parameter()] + [System.Boolean] + $UseRootHint, + + [Parameter()] + [System.Boolean] + $EnableReordering, + + [Parameter()] + [ValidateRange(0, 15)] + [System.UInt32] + $Timeout + ) + + Write-Verbose -Message $script:localizedData.ValidatingIPAddressesMessage + + $currentConfiguration = Get-TargetResource -IsSingleInstance $IsSingleInstance + + [System.Array] $currentIPs = $currentConfiguration.IPAddresses + + if ($currentIPs.Count -ne $IPAddresses.Count) + { + return $false + } + + foreach ($ip in $IPAddresses) + { + if ($ip -notin $currentIPs) + { + return $false + } + } + + if ($PSBoundParameters.ContainsKey('UseRootHint')) + { + if ($currentConfiguration.UseRootHint -ne $UseRootHint) + { + return $false + } + } + + if ($PSBoundParameters.ContainsKey('EnableReordering')) + { + if ($currentConfiguration.EnableReordering -ne $EnableReordering) + { + return $false + } + } + + if ($PSBoundParameters.ContainsKey('Timeout')) + { + if ($currentConfiguration.Timeout -ne $Timeout) + { + return $false + } + } + + return $true +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/DSC_DnsServerForwarder.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/DSC_DnsServerForwarder.schema.mof new file mode 100644 index 0000000..8ddca06 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/DSC_DnsServerForwarder.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerForwarder")] +class DSC_DnsServerForwarder : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be `'Yes'`."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("IP addresses of the forwarders")] String IPAddresses[]; + [Write, Description("Specifies if you want to use root hint or not.")] Boolean UseRootHint; + [Write, Description("Specifies whether to enable the DNS server to reorder forwarders dynamically.")] Boolean EnableReordering; + [Write, Description("Specifies the number of seconds that the DNS server waits for a response from the forwarder. The minimum value is 0, and the maximum value is 15.")] UInt32 Timeout; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/README.md new file mode 100644 index 0000000..68f7868 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/README.md @@ -0,0 +1,6 @@ +# Description + +The DnsServerForwarder DSC resource manages the DNS forwarder list of a +Domain Name System (DNS) server. If the parameter `EnableReordering` is set +to `$false` then the preferred forwarder can be put in the series of forwarder +IP addresses. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/en-US/DSC_DnsServerForwarder.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/en-US/DSC_DnsServerForwarder.strings.psd1 new file mode 100644 index 0000000..c1224fd --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/en-US/DSC_DnsServerForwarder.strings.psd1 @@ -0,0 +1,10 @@ +# culture="en-US" +ConvertFrom-StringData @' + GettingDnsForwardersMessage = Getting current DNS forwarders. + SettingDnsForwardersMessage = Setting DNS forwarders. + ValidatingIPAddressesMessage = Validate IP addresses. + DeletingDnsForwardersMessage = Deleting DNS forwarders. + SettingUseRootHintProperty = Setting the use root hint property to {0}. + SettingEnableReorderingProperty = Setting the enable DNS reordering property to {0}. + SettingTimeoutProperty = Setting the timeout property to {0}. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/en-US/about_DnsServerForwarder.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/en-US/about_DnsServerForwarder.help.txt new file mode 100644 index 0000000..0a87be2 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerForwarder/en-US/about_DnsServerForwarder.help.txt @@ -0,0 +1,147 @@ +.NAME + DnsServerForwarder + +.DESCRIPTION + The DnsServerForwarder DSC resource manages the DNS forwarder list of a + Domain Name System (DNS) server. If the parameter EnableReordering is set + to $false then the preferred forwarder can be put in the series of forwarder + IP addresses. + +.PARAMETER IsSingleInstance + Key - String + Allowed values: Yes + Specifies the resource is a single instance, the value must be 'Yes'. + +.PARAMETER IPAddresses + Write - StringArray + IP addresses of the forwarders + +.PARAMETER UseRootHint + Write - Boolean + Specifies if you want to use root hint or not. + +.PARAMETER EnableReordering + Write - Boolean + Specifies whether to enable the DNS server to reorder forwarders dynamically. + +.PARAMETER Timeout + Write - UInt32 + Specifies the number of seconds that the DNS server waits for a response from the forwarder. The minimum value is 0, and the maximum value is 15. + +.EXAMPLE 1 + +This configuration will set the DNS forwarders + +Configuration DnsServerForwarder_set_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + + DnsServerForwarder 'SetForwarders' + { + IsSingleInstance = 'Yes' + IPAddresses = @('192.168.0.10', '192.168.0.11') + UseRootHint = $false + } + } +} + +.EXAMPLE 2 + +This configuration will remove all the DNS forwarders + +Configuration DnsServerForwarder_remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerForwarder 'SetForwarders' + { + IsSingleInstance = 'Yes' + IPAddresses = @() + UseRootHint = $false + } + } +} + +.EXAMPLE 3 + +This configuration will remove all the DNS forwarders + +Configuration DnsServerForwarder_SetUseRootHint_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerForwarder 'SetUseRootHints' + { + IsSingleInstance = 'Yes' + UseRootHint = $true + } + } +} + +.EXAMPLE 4 + +This configuration will set the DNS forwarders and enable dynamic reordering. + +Configuration DnsServerForwarder_EnableReordering_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerForwarder 'SetUseRootHints' + { + IsSingleInstance = 'Yes' + IPAddresses = @('192.168.0.10', '192.168.0.11') + UseRootHint = $false + EnableReordering = $true + } + } +} + +.EXAMPLE 5 + +This configuration will set the DNS forwarders and disable dynamic reordering. + +Configuration DnsServerForwarder_DisableReordering_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerForwarder 'SetUseRootHints' + { + IsSingleInstance = 'Yes' + IPAddresses = @('192.168.0.10', '192.168.0.11') + UseRootHint = $false + EnableReordering = $false + } + } +} + +.EXAMPLE 6 + +This configuration will set the DNS forwarders and disable dynamic reordering. + +Configuration DnsServerForwarder_SetTimeout_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerForwarder 'SetUseRootHints' + { + IsSingleInstance = 'Yes' + IPAddresses = @('192.168.0.10', '192.168.0.11') + UseRootHint = $false + Timeout = 10 + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/DSC_DnsServerPrimaryZone.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/DSC_DnsServerPrimaryZone.psm1 new file mode 100644 index 0000000..a2bdbd6 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/DSC_DnsServerPrimaryZone.psm1 @@ -0,0 +1,187 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ZoneFile = "$Name.dns", + + [Parameter()] + [ValidateSet('None','NonSecureAndSecure')] + [System.String] + $DynamicUpdate = 'None', + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + Assert-Module -ModuleName 'DNSServer' + + Write-Verbose ($script:localizedData.CheckingZoneMessage -f $Name, $Ensure) + + $dnsServerZone = Get-DnsServerZone -Name $Name -ErrorAction SilentlyContinue + + $targetResource = @{ + Name = $Name + ZoneFile = $dnsServerZone.ZoneFile + DynamicUpdate = $dnsServerZone.DynamicUpdate + Ensure = if ($null -eq $dnsServerZone) { 'Absent' } else { 'Present' } + } + + return $targetResource + +} #end function Get-TargetResource + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ZoneFile = "$Name.dns", + + [Parameter()] + [ValidateSet('None','NonSecureAndSecure')] + [System.String] + $DynamicUpdate = 'None', + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + $targetResource = Get-TargetResource @PSBoundParameters + + $targetResourceInCompliance = $true + + if ($Ensure -eq 'Present') + { + if ($targetResource.Ensure -eq 'Present') + { + if ($targetResource.ZoneFile -ne $ZoneFile) + { + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f 'ZoneFile', $targetResource.ZoneFile, $ZoneFile) + + $targetResourceInCompliance = $false + } + elseif ($targetResource.DynamicUpdate -ne $DynamicUpdate) + { + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f 'DynamicUpdate', $targetResource.DynamicUpdate, $DynamicUpdate) + + $targetResourceInCompliance = $false + } + } + else + { + # Dns zone is present and needs removing + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f 'Ensure', 'Absent', 'Present') + + $targetResourceInCompliance = $false + } + } + else + { + if ($targetResource.Ensure -eq 'Present') + { + # Dns zone is absent and should be present + Write-Verbose ($script:localizedData.NotDesiredPropertyMessage -f 'Ensure', 'Absent', 'Present') + + $targetResourceInCompliance = $false + } + } + + return $targetResourceInCompliance + +} #end function Test-TargetResource + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ZoneFile = "$Name.dns", + + [Parameter()] + [ValidateSet('None','NonSecureAndSecure')] + [System.String] + $DynamicUpdate = 'None', + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + Assert-Module -ModuleName 'DNSServer' + + if ($Ensure -eq 'Present') + { + Write-Verbose ($script:localizedData.CheckingZoneMessage -f $Name, $Ensure) + + $dnsServerZone = Get-DnsServerZone -Name $Name -ErrorAction SilentlyContinue + + if ($dnsServerZone) + { + ## Update the existing zone + if ($dnsServerZone.ZoneFile -ne $ZoneFile) + { + $dnsServerZone | Set-DnsServerPrimaryZone -ZoneFile $ZoneFile + + Write-Verbose ($script:localizedData.SetPropertyMessage -f 'ZoneFile') + } + if ($dnsServerZone.DynamicUpdate -ne $DynamicUpdate) + { + $dnsServerZone | Set-DnsServerPrimaryZone -DynamicUpdate $DynamicUpdate + + Write-Verbose ($script:localizedData.SetPropertyMessage -f 'DynamicUpdate') + } + } + elseif (-not $dnsServerZone) + { + # Create the zone + Write-Verbose ($script:localizedData.AddingZoneMessage -f $Name) + + Add-DnsServerPrimaryZone -Name $Name -ZoneFile $ZoneFile -DynamicUpdate $DynamicUpdate + } + } + elseif ($Ensure -eq 'Absent') + { + # Remove the DNS Server zone + Write-Verbose ($script:localizedData.RemovingZoneMessage -f $Name) + + Get-DnsServerZone -Name $Name | Remove-DnsServerZone -Force + } + +} #end function Set-TargetResource diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/DSC_DnsServerPrimaryZone.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/DSC_DnsServerPrimaryZone.schema.mof new file mode 100644 index 0000000..07dc2e2 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/DSC_DnsServerPrimaryZone.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerPrimaryZone")] +class DSC_DnsServerPrimaryZone : OMI_BaseResource +{ + [Key, Description("Name of the DNS Server primary zone")] String Name; + [Write, Description("Name of the DNS Server primary zone file. If not specified, defaults to 'ZoneName.dns'.")] String ZoneFile; + [Write, Description("Primary zone dynamic DNS update option. Defaults to `'None'`."), ValueMap{"None","NonSecureAndSecure"}, Values{"None","NonSecureAndSecure"}] String DynamicUpdate; + [Write, Description("Whether the DNS zone should be present or absent"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/README.md new file mode 100644 index 0000000..218a6b3 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/README.md @@ -0,0 +1,3 @@ +# Description + +The DnsServerPrimaryZone DSC resource manages a standalone file-backed Primary zone on a given Domain Name System (DNS) server. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/en-US/DSC_DnsServerPrimaryZone.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/en-US/DSC_DnsServerPrimaryZone.strings.psd1 new file mode 100644 index 0000000..8195b73 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/en-US/DSC_DnsServerPrimaryZone.strings.psd1 @@ -0,0 +1,8 @@ +# culture="en-US" +ConvertFrom-StringData @' + CheckingZoneMessage = Checking DNS server zone with name '{0}' is '{1}'... + AddingZoneMessage = Adding DNS server zone '{0}' ... + RemovingZoneMessage = Removing DNS server zone '{0}' ... + NotDesiredPropertyMessage = DNS server zone property '{0}' is not correct. Expected '{1}', actual '{2}' + SetPropertyMessage = DNS server zone property '{0}' is set +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/en-US/about_DnsServerPrimaryZone.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/en-US/about_DnsServerPrimaryZone.help.txt new file mode 100644 index 0000000..cfb17fb --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerPrimaryZone/en-US/about_DnsServerPrimaryZone.help.txt @@ -0,0 +1,135 @@ +.NAME + DnsServerPrimaryZone + +.DESCRIPTION + The DnsServerPrimaryZone DSC resource manages a standalone file-backed Primary zone on a given Domain Name System (DNS) server. + +.PARAMETER Name + Key - String + Name of the DNS Server primary zone + +.PARAMETER ZoneFile + Write - String + Name of the DNS Server primary zone file. If not specified, defaults to 'ZoneName.dns'. + +.PARAMETER DynamicUpdate + Write - String + Allowed values: None, NonSecureAndSecure + Primary zone dynamic DNS update option. Defaults to 'None'. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Whether the DNS zone should be present or absent + +.EXAMPLE 1 + +This configuration will add a file-backed classful reverse primary zone +using the resource default parameter values. + +Configuration DnsServerPrimaryZone_AddClassfulReversePrimaryZone_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerPrimaryZone 'AddPrimaryZone' + { + Name = '1.168.192.in-addr.arpa' + } + } +} + +.EXAMPLE 2 + +This configuration will add a file-backed classless reverse primary zone +using the resource default parameter values. + +Configuration DnsServerPrimaryZone_AddClasslessReversePrimaryZone_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerPrimaryZone 'AddPrimaryZone' + { + Name = '64-26.100.168.192.in-addr.arpa' + } + } +} + +.EXAMPLE 3 + +This configuration will add a file-backed primary zone using the resource +default parameter values. + +Configuration DnsServerPrimaryZone_AddPrimaryZoneUsingDefaults_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerPrimaryZone 'AddPrimaryZone' + { + Name = 'demo.contoso.com' + } + } +} + +.EXAMPLE 4 + +This configuration will add a file-backed primary zone using the resource +default parameter values. + +Configuration DnsServerPrimaryZone_AddPrimaryZoneWithSpecificValues_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerPrimaryZone 'AddPrimaryZone' + { + Ensure = 'Present' + Name = 'demo.contoso.com' + ZoneFile = 'demo.contoso.com.dns' + DynamicUpdate = 'NonSecureAndSecure' + } + } +} + +.EXAMPLE 5 + +This configuration will remove a file-backed primary zone. + +Configuration DnsServerPrimaryZone_RemovePrimaryZone_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerPrimaryZone 'RemovePrimaryZone' + { + Ensure = 'Absent' + Name = 'demo.contoso.com' + } + } +} + +.EXAMPLE 6 + +This configuration will remove a file-backed primary zone. + +Configuration DnsServerPrimaryZone_RemoveReversePrimaryZone_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerPrimaryZone 'RemovePrimaryZone' + { + Ensure = 'Absent' + Name = '1.168.192.in-addr.arpa' + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/DSC_DnsServerRootHint.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/DSC_DnsServerRootHint.psm1 new file mode 100644 index 0000000..440ac47 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/DSC_DnsServerRootHint.psm1 @@ -0,0 +1,124 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + + .SYNOPSIS + Get desired state + + .PARAMETER IsSingleInstance + Key for the resource. This value must be set to 'Yes' + +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [Microsoft.Management.Infrastructure.CimInstance[]] + [AllowEmptyCollection()] + $NameServer + ) + + Assert-Module -ModuleName 'DNSServer' + + Write-Verbose -Message $script:localizedData.GettingCurrentRootHintsMessage + + $result = @{ + IsSingleInstance = 'Yes' + NameServer = Convert-RootHintsToHashtable -RootHints @(Get-DnsServerRootHint) + } + + Write-Verbose -Message ($script:localizedData.FoundRootHintsMessage -f $result.NameServer.Count) + $result +} + +<# + + .SYNOPSIS + Set desired state + + .PARAMETER IsSingleInstance + Key for the resource. This value must be set to 'Yes' + + .PARAMETER NameServer + A list of names and IP addresses as a hashtable. This may look like this: NameServer = @{ 'rh1.vm.net.' = '20.1.1.1' } + +#> +function Set-TargetResource +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [Microsoft.Management.Infrastructure.CimInstance[]] + [AllowEmptyCollection()] + $NameServer + ) + + Write-Verbose -Message $script:localizedData.RemovingAllRootHintsMessage + Get-DnsServerRootHint | Remove-DnsServerRootHint -Force + + foreach ($item in $NameServer) + { + Write-Verbose -Message ($script:localizedData.AddingRootHintMessage -f $item.Key) + Add-DnsServerRootHint -NameServer $item.Key -IPAddress ($item.value -split ',' | ForEach-Object { $_.Trim() }) + } +} + +<# + + .SYNOPSIS + Test desired state + + .PARAMETER IsSingleInstance + Key for the resource. This value must be set to 'Yes' + + .PARAMETER NameServer + A list of names and IP addresses as a hashtable. This may look like this: NameServer = @{ 'rh1.vm.net.' = '20.1.1.1' } + +#> +function Test-TargetResource +{ + [OutputType([Bool])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter(Mandatory = $true)] + [Microsoft.Management.Infrastructure.CimInstance[]] + [AllowEmptyCollection()] + $NameServer + ) + + Write-Verbose -Message $script:localizedData.ValidatingRootHintsMessage + $currentState = Get-TargetResource @PSBoundParameters + $desiredState = $PSBoundParameters + + foreach ($entry in $desiredState.NameServer) + { + $entry.Value = $entry.Value -replace ' ', '' + } + + $result = Test-DscDnsParameterState -CurrentValues $currentState -DesiredValues $desiredState -TurnOffTypeChecking -ReverseCheck + + $result +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/DSC_DnsServerRootHint.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/DSC_DnsServerRootHint.schema.mof new file mode 100644 index 0000000..0a69aa7 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/DSC_DnsServerRootHint.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerRootHint")] +class DSC_DnsServerRootHint : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be `'Yes'`."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Required, Description("A hashtable that defines the name server. Key and value must be strings."), EmbeddedInstance("MSFT_KeyValuePair")] String NameServer[]; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/README.md new file mode 100644 index 0000000..e86dfeb --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/README.md @@ -0,0 +1,3 @@ +# Description + +The DnsServerRootHint DSC resource manages root hints on a Domain Name System (DNS) server. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/en-US/DSC_DnsServerRootHint.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/en-US/DSC_DnsServerRootHint.strings.psd1 new file mode 100644 index 0000000..013f0c9 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/en-US/DSC_DnsServerRootHint.strings.psd1 @@ -0,0 +1,8 @@ +# culture="en-US" +ConvertFrom-StringData @' + GettingCurrentRootHintsMessage = Getting current root hints. + FoundRootHintsMessage = Found {0} root hints. + RemovingAllRootHintsMessage = Removing all root hints. + AddingRootHintMessage = Adding root hint '{0}'. + ValidatingRootHintsMessage = Validating root hints. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/en-US/about_DnsServerRootHint.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/en-US/about_DnsServerRootHint.help.txt new file mode 100644 index 0000000..d1a40a6 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerRootHint/en-US/about_DnsServerRootHint.help.txt @@ -0,0 +1,65 @@ +.NAME + DnsServerRootHint + +.DESCRIPTION + The DnsServerRootHint DSC resource manages root hints on a Domain Name System (DNS) server. + +.PARAMETER IsSingleInstance + Key - String + Allowed values: Yes + Specifies the resource is a single instance, the value must be 'Yes'. + +.PARAMETER NameServer + Required - InstanceArray + A hashtable that defines the name server. Key and value must be strings. + +.EXAMPLE 1 + +This configuration will manage the DNS server root hints + +Configuration DnsServerRootHint_set_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerRootHint 'RootHints' + { + IsSingleInstance = 'Yes' + NameServer = @{ + 'A.ROOT-SERVERS.NET.' = '2001:503:ba3e::2:30' + 'B.ROOT-SERVERS.NET.' = '2001:500:84::b' + 'C.ROOT-SERVERS.NET.' = '2001:500:2::c' + 'D.ROOT-SERVERS.NET.' = '2001:500:2d::d' + 'E.ROOT-SERVERS.NET.' = '192.203.230.10' + 'F.ROOT-SERVERS.NET.' = '2001:500:2f::f' + 'G.ROOT-SERVERS.NET.' = '192.112.36.4' + 'H.ROOT-SERVERS.NET.' = '2001:500:1::53' + 'I.ROOT-SERVERS.NET.' = '2001:7fe::53' + 'J.ROOT-SERVERS.NET.' = '2001:503:c27::2:30' + 'K.ROOT-SERVERS.NET.' = '2001:7fd::1' + 'L.ROOT-SERVERS.NET.' = '2001:500:9f::42' + 'M.ROOT-SERVERS.NET.' = '2001:dc3::353' + } + } + } +} + +.EXAMPLE 2 + +This configuration will remove the DNS server root hints + +Configuration DnsServerRootHint_remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerRootHint 'RootHints' + { + IsSingleInstance = 'Yes' + NameServer = @{ } + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/DSC_DnsServerSecondaryZone.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/DSC_DnsServerSecondaryZone.psm1 new file mode 100644 index 0000000..54b669e --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/DSC_DnsServerSecondaryZone.psm1 @@ -0,0 +1,277 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [String[]] + $MasterServers + ) + +#region Input Validation + + # Check for DnsServer module/role + Assert-Module -ModuleName 'DnsServer' + +#endregion + + Write-Verbose -Message 'Getting DNS zone.' + $dnsZone = Get-DnsServerZone -Name $Name -ErrorAction SilentlyContinue + if ($dnsZone) + { + $Ensure = 'Present' + } + else + { + $Ensure = 'Absent' + } + + @{ + Name = $Name + Ensure = $Ensure + MasterServers = [string[]]$($dnsZone.MasterServers.IPAddressToString) + Type = $dnsZone.ZoneType + } +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [String[]] + $MasterServers, + + [Parameter()] + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = 'Present' + ) + Write-Verbose -Message 'Setting DNS zone.' + if ($PSBoundParameters.ContainsKey('Debug')) + { + $null = $PSBoundParameters.Remove('Debug') + } + Test-ResourceProperties @PSBoundParameters -Apply + + # Restart the DNS service + Restart-Service DNS +} + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [String[]] + $MasterServers, + + [Parameter()] + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = 'Present' + ) + +#region Input Validation + + # Check for DnsServer module/role + Assert-Module -ModuleName 'DnsServer' + +#endregion + Write-Verbose -Message 'Validating DNS zone.' + if ($PSBoundParameters.ContainsKey('Debug')) + { + $null = $PSBoundParameters.Remove('Debug') + } + Test-ResourceProperties @PSBoundParameters + +} + +#region Helper Functions +function Test-ResourceProperties +{ + [CmdletBinding()] + [OutputType([bool])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [String[]] + $MasterServers, + + [Parameter()] + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [Switch] + $Apply + ) + + $zoneMessage = $($script:localizedData.CheckingZoneMessage) -f $Name + Write-Verbose -Message $zoneMessage + + $dnsZone = Get-DnsServerZone -Name $Name -ErrorAction SilentlyContinue + + # Found DNS Zone + if ($dnsZone) + { + $testZoneMessage = $($script:localizedData.TestZoneMessage) -f 'present', $Ensure + Write-Verbose -Message $testZoneMessage + + # If the zone should be present + if ($Ensure -eq 'Present') + { + # Check if the zone is secondary + $secondaryZoneMessage = $script:localizedData.CheckingSecondaryZoneMessage + Write-Verbose -Message $secondaryZoneMessage + + # If the zone is already secondary zone + if ($dnsZone.ZoneType -eq "Secondary") + { + $correctZoneMessage = $($script:localizedData.AlreadySecondaryZoneMessage) -f $Name + Write-Verbose -Message $correctZoneMessage + + # Check the master server property + $checkPropertyMessage = $($script:localizedData.CheckPropertyMessage) -f 'master servers' + Write-Verbose -Message $checkPropertyMessage + + # Compare the master server property + if ((-not $dnsZone.MasterServers) -or (Compare-Object $($dnsZone.MasterServers.IPAddressToString) $MasterServers)) + { + $notDesiredPropertyMessage = $($script:localizedData.NotDesiredPropertyMessage) -f ` + 'master servers',$MasterServers,$dnsZone.MasterServers + Write-Verbose -Message $notDesiredPropertyMessage + + if ($Apply) + { + Set-DnsServerSecondaryZone -Name $Name -MasterServers $MasterServers + + $setPropertyMessage = $($script:localizedData.SetPropertyMessage) -f 'master servers' + Write-Verbose -Message $setPropertyMessage + } + else + { + return $false + } + } # end master server mismatch + else + { + $desiredPropertyMessage = $($script:localizedData.DesiredPropertyMessage) -f 'master servers' + Write-Verbose -Message $desiredPropertyMessage + if (-not $Apply) + { + return $true + } + } # end master servers match + + } # end zone is already secondary + + # If the zone is not secondary, make it so + else + { + $notCorrectZoneMessage = $($script:localizedData.NotSecondaryZoneMessage) -f $Name,$dnsZone.ZoneType + Write-Verbose -Message $notCorrectZoneMessage + + # Convert the zone to Secondary zone + if ($Apply) + { + ConvertTo-DnsServerSecondaryZone -Name $Name -MasterServers $MasterServers -ZoneFile $Name -Force + + $setZoneMessage = $($script:localizedData.SetSecondaryZoneMessage) -f $Name + Write-Verbose -Message $setZoneMessage + } + else + { + return $false + } + } # end zone is not secondary + + }# end ensure -eq present + + # If zone should be absent + else + { + if ($Apply) + { + $removingZoneMessage = $script:localizedData.RemovingZoneMessage + Write-Verbose -Message $removingZoneMessage + + Remove-DnsServerZone -Name $Name -Force + + $deleteZoneMessage = $($script:localizedData.DeleteZoneMessage) -f $Name + Write-Verbose -Message $deleteZoneMessage + } + else + { + return $false + } + } # end ensure -eq absent + + } # end found dns zone + + # Not found DNS Zone + else + { + $testZoneMessage = $($script:localizedData.TestZoneMessage) -f 'absent', $Ensure + Write-Verbose -Message $testZoneMessage + + if ($Ensure -eq 'Present') + { + if ($Apply) + { + $addingSecondaryZoneMessage = $script:localizedData.AddingSecondaryZoneMessage + Write-Verbose -Message $addingSecondaryZoneMessage + + # Add the zone and start the transfer + Add-DnsServerSecondaryZone -Name $Name -MasterServers $MasterServers -ZoneFile $Name + Start-DnsServerZoneTransfer -Name $Name -FullTransfer + + $newSecondaryZoneMessage = $($script:localizedData.NewSecondaryZoneMessage) -f $Name + Write-Verbose -Message $newSecondaryZoneMessage + } + else + { + return $false + } + } # end ensure -eq Present + else + { + if (-not $Apply) + { + return $true + } + } # end ensure -eq Absent + } +} +#endregion + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/DSC_DnsServerSecondaryZone.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/DSC_DnsServerSecondaryZone.schema.mof new file mode 100644 index 0000000..3f2651e --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/DSC_DnsServerSecondaryZone.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerSecondaryZone")] +class DSC_DnsServerSecondaryZone : OMI_BaseResource +{ + [Key, Description("Name of the secondary zone")] String Name; + [Required, Description("IP address or DNS name of the secondary DNS servers")] String MasterServers[]; + [Write, Description("Whether the secondary zone should be present or absent."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Read, Description("Type of the DNS server zone")] String Type; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/README.md new file mode 100644 index 0000000..db16a50 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/README.md @@ -0,0 +1,6 @@ +# Description + +The DnsServerSecondaryZone DSC resource manages a standalone file-backed +secondary zone on a Domain Name System (DNS) server. Secondary zones allow +client machine in primary DNS zones to do DNS resolution of machines in the +secondary DNS zone. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/en-US/DSC_DnsServerSecondaryZone.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/en-US/DSC_DnsServerSecondaryZone.strings.psd1 new file mode 100644 index 0000000..30664cd --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/en-US/DSC_DnsServerSecondaryZone.strings.psd1 @@ -0,0 +1,17 @@ +# culture="en-US" +ConvertFrom-StringData @' + CheckingZoneMessage = Checking DNS server zone with name {0} ... + TestZoneMessage = Named DNS server zone is {0} and it should be {1} + RemovingZoneMessage = Removing DNS server zone ... + DeleteZoneMessage = DNS server zone {0} is now absent + CheckingSecondaryZoneMessage = Checking if the DNS server zone is a secondary zone ... + AlreadySecondaryZoneMessage = DNS server zone {0} is already a secondary zone + NotSecondaryZoneMessage = DNS server zone {0} is not a secondary zone but {1} zone + AddingSecondaryZoneMessage = Adding secondary DNS server zone ... + NewSecondaryZoneMessage = DNS server secondary zone {0} is now present + SetSecondaryZoneMessage = DNS server zone {0} is now a secondary zone + CheckPropertyMessage = Checking DNS secondary server {0} ... + NotDesiredPropertyMessage = DNS server secondary zone {0} is not correct. Expected {1}, actual {2} + DesiredPropertyMessage = DNS server secondary zone {0} is correct + SetPropertyMessage = DNS server secondary zone {0} is set +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/en-US/about_DnsServerSecondaryZone.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/en-US/about_DnsServerSecondaryZone.help.txt new file mode 100644 index 0000000..f26d53c --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSecondaryZone/en-US/about_DnsServerSecondaryZone.help.txt @@ -0,0 +1,45 @@ +.NAME + DnsServerSecondaryZone + +.DESCRIPTION + The DnsServerSecondaryZone DSC resource manages a standalone file-backed + secondary zone on a Domain Name System (DNS) server. Secondary zones allow + client machine in primary DNS zones to do DNS resolution of machines in the + secondary DNS zone. + +.PARAMETER Name + Key - String + Name of the secondary zone + +.PARAMETER MasterServers + Required - StringArray + IP address or DNS name of the secondary DNS servers + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Whether the secondary zone should be present or absent. + +.PARAMETER Type + Read - String + Type of the DNS server zone + +.EXAMPLE 1 + +This configuration will manage a secondary standalone DNS zone + +Configuration DnsServerSecondaryZone_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerSecondaryZone 'sec' + { + Ensure = 'Present' + Name = 'demo.contoso.com' + MasterServers = '192.168.10.2' + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/DSC_DnsServerSetting.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/DSC_DnsServerSetting.psm1 new file mode 100644 index 0000000..e883959 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/DSC_DnsServerSetting.psm1 @@ -0,0 +1,1480 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +$script:timeSpanProperties = @( + 'LameDelegationTTL' + 'MaximumSignatureScanPeriod' + 'MaximumTrustAnchorActiveRefreshInterval' + 'ZoneWritebackInterval' +) + +<# + .SYNOPSIS + Returns the current state of the DNS server settings. + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer + ) + + Assert-Module -ModuleName 'DnsServer' + + Write-Verbose ($script:localizedData.GettingDnsServerSettings) + + $getDnsServerSettingParameters = @{ + All = $true + } + + if ($DnsServer -ne 'localhost') + { + $getDnsServerSettingParameters['ComputerName'] = $DnsServer + } + + $dnsServerInstance = Get-DnsServerSetting @getDnsServerSettingParameters + + $classProperties = @( + 'LocalNetPriority' + 'AutoConfigFileZones' + 'AddressAnswerLimit' + 'UpdateOptions' + 'DisableAutoReverseZone' + 'StrictFileParsing' + 'EnableDirectoryPartitions' + 'XfrConnectTimeout' + 'AllowUpdate' + 'BootMethod' + 'LooseWildcarding' + 'BindSecondaries' + 'AutoCacheUpdate' + 'EnableDnsSec' + 'NameCheckFlag' + 'SendPort' + 'WriteAuthorityNS' + 'ListeningIPAddress' + 'RpcProtocol' + 'RoundRobin' + 'ForwardDelegations' + 'EnableIPv6' + 'EnableOnlineSigning' + 'EnableDuplicateQuerySuppression' + 'AllowCnameAtNs' + 'EnableRsoForRodc' + 'OpenAclOnProxyUpdates' + 'NoUpdateDelegations' + 'EnableUpdateForwarding' + 'EnableWinsR' + 'DeleteOutsideGlue' + 'AppendMsZoneTransferTag' + 'AllowReadOnlyZoneTransfer' + 'EnableSendErrorSuppression' + 'SilentlyIgnoreCnameUpdateConflicts' + 'EnableIQueryResponseGeneration' + 'AdminConfigured' + 'PublishAutoNet' + 'ReloadException' + 'IgnoreServerLevelPolicies' + 'IgnoreAllPolicies' + 'EnableVersionQuery' + 'AutoCreateDelegation' + 'RemoteIPv4RankBoost' + 'RemoteIPv6RankBoost' + 'MaximumRodcRsoQueueLength' + 'MaximumRodcRsoAttemptsPerCycle' + 'MaxResourceRecordsInNonSecureUpdate' + 'LocalNetPriorityMask' + 'TcpReceivePacketSize' + 'SelfTest' + 'XfrThrottleMultiplier' + 'SocketPoolSize' + 'QuietRecvFaultInterval' + 'QuietRecvLogInterval' + 'SyncDsZoneSerial' + 'ScopeOptionValue' + 'VirtualizationInstanceOptionValue' + 'ServerLevelPluginDll' + 'RootTrustAnchorsURL' + 'SocketPoolExcludedPortRanges' + 'LameDelegationTTL' + 'MaximumSignatureScanPeriod' + 'MaximumTrustAnchorActiveRefreshInterval' + 'ZoneWritebackInterval' + + # Read-only properties + 'DsAvailable' + 'MajorVersion' + 'MinorVersion' + 'BuildNumber' + 'IsReadOnlyDC' + 'AllIPAddress' + 'ForestDirectoryPartitionBaseName' + 'DomainDirectoryPartitionBaseName' + 'MaximumUdpPacketSize' + ) + + $returnValue = @{} + + foreach ($property in $classProperties) + { + if ($property -in $script:timeSpanProperties) + { + $returnValue.Add($property, $dnsServerInstance.$property.ToString()) + } + else + { + $returnValue.Add($property, $dnsServerInstance.$property) + } + } + + $returnValue.DnsServer = $DnsServer + + return $returnValue +} + +<# + .SYNOPSIS + Set the desired state of the DNS server settings. + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. + + .PARAMETER AddressAnswerLimit + Specifies the maximum number of A (host IP address) resource records that + the DNS server can insert in the answer section of a response to an A record + query (a query for an IP address). The value of this entry also influences + the setting of the truncation bit. If the value of this entry can be between + 5 and 28, or 0. The truncation bit is not set on the response, even when the + packet space is exceeded. + + .PARAMETER AllowUpdate + Specifies whether the DNS Server accepts dynamic update requests. $true to + allow any DNS update operation; otherwise, $false. + + .PARAMETER AutoCacheUpdate + Specifies whether the DNS Server attempts to update its cache entries using + data from root servers. $true to cache delegation information; otherwise, + $false. + + .PARAMETER AutoConfigFileZones + Specifies the type of zones for which SOA and NS records will be automatically + configured with the DNS server's local host name as the primary DNS server for + the zone when the zone is loaded from file. + + .PARAMETER BindSecondaries + Specifies whether the server will permit send DNS zone transfer response + messages with more than one record in each response if the zone transfer + request did not have the characters MS appended to it. If set to $true, + the DNS server will include only one record in each response if the zone + transfer request did not have the characters MS appended to it. + + .PARAMETER BootMethod + Specifies the boot method used by the DNS server. + + .PARAMETER DisableAutoReverseZone + Specifies whether the DNS Server automatically creates standard reverse + look up zones. $true to disables automatic reverse zones; otherwise, $false. + + .PARAMETER EnableDirectoryPartitions + Specifies whether the DNS server will support application directory partitions. + + .PARAMETER EnableDnsSec + Specifies whether the DNS Server includes DNSSEC-specific RRs, KEY, SIG, + and NXT in a response. $true to enable DNSSEC validation on the DNS server; + otherwise, $false. + + .PARAMETER ForwardDelegations + Specifies how the DNS server will handle forwarding and delegations. If + set to $true, the DNS server MUST use forwarders instead of a cached + delegation when both are available. Otherwise, the DNS server MUST use a + cached delegation instead of forwarders when both are available. + + .PARAMETER ListeningIPAddress + Specifies the listening IP addresses of the DNS server. The list of IP + addresses on which the DNS Server can receive queries. + + .PARAMETER LocalNetPriority + Specifies whether the DNS Server gives priority to the local net address + when returning A records. $true to return A records in order of their + similarity to the IP address of the querying client.; otherwise, $false. + + .PARAMETER LooseWildcarding + Specifies he type of algorithm that the DNS server will use to locate a + wildcard node when using a DNS wildcard record RFC1034 to answer a query. + If true, the DNS server will use the first node it encounters with a record + of the same type as the query type. Otherwise, the DNS server will use the + first node it encounters that has records of any type. + + .PARAMETER NameCheckFlag + Specifies the level of domain name checking and validation on the DNS server, + the set of eligible characters to be used in DNS names. + + .PARAMETER RoundRobin + Specifies whether the DNS Server round robins multiple A records. $true to + enable Round-robin DNS on the DNS server; otherwise, $false. + + .PARAMETER RpcProtocol + Specifies the DNS_RPC_PROTOCOLS section 2.2.1.1.2 value corresponding to + the RPC protocols to which the DNS server will respond. If this value is + set to 0x00000000, the DNS server MUST NOT respond to RPC requests for + any protocol. + + .PARAMETER SendPort + Specifies the port number to use as the source port when sending UDP queries + to a remote DNS server. If set to zero, the DNS server allow the stack to + select a random port. + + .PARAMETER StrictFileParsing + Specifies whether the DNS server will treat errors encountered while reading + zones from a file as fatal. + + .PARAMETER UpdateOptions + Specifies the DNS update options used by the DNS server. + + .PARAMETER WriteAuthorityNS + Specifies whether the DNS server will include NS records for the root of a + zone in DNS responses that are answered using authoritative zone data. + + .PARAMETER XfrConnectTimeout + Specifies the time span, in seconds, in which a primary DNS server waits + for a transfer response from its secondary server. The default value is 30. + After the time-out value expires, the connection is terminated. + + .PARAMETER EnableIPv6 + Specifies whether IPv6 should be enabled on the DNS Server. $true to enable + IPv6 on the DNS server; otherwise, $false. + + .PARAMETER EnableOnlineSigning + Specifies whether online signing should be enabled on the DNS Server. $true + to enable online signing; otherwise, $false. + + .PARAMETER EnableDuplicateQuerySuppression + Specifies whether the DNS server will not send remote queries when there is + already a remote query with the same name and query type outstanding. + + .PARAMETER AllowCnameAtNs + Specifies whether the server will permit the target domain names of NS records + to resolve to CNAME records. If $true, this pattern of DNS records will be + allowed; otherwise, the DNS server will return errors when encountering this + pattern of DNS records while resolving queries. + + .PARAMETER EnableRsoForRodc + Specifies whether the DNS server will attempt to replicate single updated + DNS objects from remote directory servers ahead of normally scheduled replication + when operating on a directory server that does not support write operations. + + .PARAMETER OpenAclOnProxyUpdates + Specifies whether the DNS server allows sharing of DNS records with the + DnsUpdateProxy group when processing updates in secure zones that are stored + in the directory service. + + .PARAMETER NoUpdateDelegations + Specifies whether the DNS server will accept DNS updates to delegation + records of type NS. + + .PARAMETER EnableUpdateForwarding + Specifies whether the DNS server will forward updates received for secondary + zones to the primary DNS server for the zone. + + .PARAMETER EnableWinsR + Specifies whether the DNS server will perform NetBIOS name resolution in + order to map IP addresses to machine names while processing queries in zones + where WINS-R information has been configured. + + .PARAMETER DeleteOutsideGlue + Specifies whether the DNS server will delete DNS glue records found outside + a delegated subzone when reading records from persistent storage. + + .PARAMETER AppendMsZoneTransferTag + Specifies whether the DNS server will indicate to the remote DNS servers + that it supports multiple DNS records in each zone transfer response message + by appending the characters MS at the end of zone transfer requests. The + value SHOULD be limited to 0x00000000 and 0x0000000, but it MAY be any value. + + .PARAMETER AllowReadOnlyZoneTransfer + Specifies whether the DNS server will allow zone transfers for zones that + are stored in the directory server when the directory server does not support + write operations. + + .PARAMETER EnableSendErrorSuppression + Specifies whether the DNS server will attempt to suppress large volumes + of DNS error responses sent to remote IP addresses that may be attempting + to attack the DNS server. + + .PARAMETER SilentlyIgnoreCnameUpdateConflicts + Specifies whether the DNS server will ignore CNAME conflicts during DNS + update processing. + + .PARAMETER EnableIQueryResponseGeneration + Specifies whether the DNS server will fabricate IQUERY responses. If set + to $true, the DNS server MUST fabricate IQUERY responses when it receives + queries of type IQUERY. Otherwise, the DNS server will return an error when + such queries are received. + + .PARAMETER AdminConfigured + Specifies whether the server has been configured by an administrator. + + .PARAMETER PublishAutoNet + Specifies whether the DNS server will publish local IPv4 addresses in the + 169.254.x.x subnet as IPv4 addresses for the local machine's domain name. + + .PARAMETER ReloadException + Specifies whether the DNS server will perform an internal restart if an + unexpected fatal error is encountered. + + .PARAMETER IgnoreServerLevelPolicies + Specifies whether to ignore the server level policies on the DNS server. + $true to ignore the server level policies on the DNS server; otherwise, + $false. + + .PARAMETER IgnoreAllPolicies + Specifies whether to ignore all policies on the DNS server. $true to ignore + all policies on the DNS server; otherwise, $false. + + .PARAMETER EnableVersionQuery + Specifies what version information the DNS server will respond with when a + DNS query with class set to CHAOS and type set to TXT is received. + + .PARAMETER AutoCreateDelegation + Specifies possible settings for automatic delegation creation for new zones + on the DNS server. The value SHOULD be limited to the range from 0x00000000 + to 0x00000002, inclusive, but it MAY be any value. + + .PARAMETER RemoteIPv4RankBoost + Specifies the value to add to all IPv4 addresses for remote DNS servers when + selecting between IPv4 and IPv6 remote DNS server addresses. The value MUST + be limited to the range from 0x00000000 to 0x0000000A, inclusive. + + .PARAMETER RemoteIPv6RankBoost + Specifies the value to add to all IPv6 addresses for remote DNS servers when + selecting between IPv4 and IPv6 remote DNS server addresses. The value MUST + be limited to the range from 0x00000000 to 0x0000000A, inclusive. + + .PARAMETER MaximumRodcRsoQueueLength + Specifies the maximum number of single object replication operations that + may be queued at any given time by the DNS server. The value MUST be limited + to the range from 0x00000000 to 0x000F4240, inclusive. If the value is + 0x00000000 the DNS server MUST NOT enforce an upper bound on the number of + single object replication operations queued at any given time. + + .PARAMETER MaximumRodcRsoAttemptsPerCycle + Specifies the maximum number of queued single object replication operations + that should be attempted during each five minute interval of DNS server + operation. The value MUST be limited to the range from 0x00000001 to 0x000F4240, + inclusive. + + .PARAMETER MaxResourceRecordsInNonSecureUpdate + Specifies the maximum number of resource records that the DNS server will + accept in a single DNS update request. The value SHOULD be limited to the + range from 0x0000000A to 0x00000078, inclusive, but it MAY be any value. + + .PARAMETER LocalNetPriorityMask + Specifies the value which specifies the network mask the DNS server will + use to sort IPv4 addresses. A value of 0xFFFFFFFF indicates that the DNS + server MUST use traditional IPv4 network mask for the address. Any other + value is a network mask, in host byte order that the DNS server MUST use + to retrieve network masks from IP addresses for sorting purposes. + + .PARAMETER TcpReceivePacketSize + Specifies the maximum TCP packet size, in bytes, that the DNS server can + accept. The value MUST be limited to the range from 0x00004000 to 0x00010000, + inclusive. + + .PARAMETER SelfTest + Specifies the mask value indicating whether data consistency checking + should be performed once, each time the service starts. If the check fails, + the server posts an event log warning. If the least significant bit (regardless + of other bits) of this value is one, the DNS server will verify for each + active and update-allowing primary zone, that the IP address records are + present in the zone for the zone's SOA record's master server. If the + least significant bit (regardless of other bits) of this value is zero, + no data consistency checking will be performed. + + .PARAMETER XfrThrottleMultiplier + Specifies the multiple used to determine how long the DNS server should + refuse zone transfer requests after a successful zone transfer has been + completed. The total time for which a zone will refuse another zone + transfer request at the end of a successful zone transfer is computed as + this value multiplied by the number of seconds required for the zone + transfer that just completed. The server SHOULD refuse zone transfer + requests for no more than ten minutes. The value SHOULD be limited to + the range from 0x00000000 to 0x00000064, inclusive, but it MAY be any + value. + + .PARAMETER SocketPoolSize + Specifies the number of UDP sockets per address family that the DNS server + will use for sending remote queries. + + .PARAMETER QuietRecvFaultInterval + Specifies the minimum time interval, in seconds, starting when the server + begins waiting for the query to arrive on the network, after which the + server MAY log a debug message indicating that the server is to stop running. + If the value is zero or is less than the value of QuietRecvLogInterval*, + then the value of QuietRecvLogInterval MUST be used. If the value is + greater than or equal to the value of QuietRecvLogInterval, then the + literal value of QuietRecvFaultInterval MUST be used. Used to debug + reception of UDP traffic for a recursive query. + + .PARAMETER QuietRecvLogInterval + Specifies the minimum time interval, in seconds, starting when the server + begins waiting for the query to arrive on the network, or when the server + logs an eponymous debug message for the query, after which the server MUST + log a debug message indicating that the server is still waiting to receive + network traffic. If the value is zero, logging associated with the two + QuietRecv properties MUST be disabled, and the QuietRecvFaultInterval + property MUST be ignored. If the value is non-zero, logging associated with + the two QuietRecv properties MUST be enabled, and the QuietRecvFaultInterval + property MUST NOT be ignored. Used to debug reception of UDP traffic for a + recursive query. + + .PARAMETER SyncDsZoneSerial + Specifies the conditions under which the DNS server should immediately + commit uncommitted zone serial numbers to persistent storage. The value + SHOULD be limited to the range from 0x00000000 to 0x00000004, inclusive, + but it MAY be any value. + + .PARAMETER ScopeOptionValue + Specifies the extension mechanism for the DNS (ENDS0) scope setting on the + DNS server. + + .PARAMETER VirtualizationInstanceOptionValue + Specifies the virtualization instance option to be sent in ENDS0. + + .PARAMETER ServerLevelPluginDll + Specifies the path of a custom plug-in. When DllPath specifies the fully + qualified path name of a valid DNS server plug-in, the DNS server calls + functions in the plug-in to resolve name queries that are outside the + scope of all locally hosted zones. If a queried name is out of the scope + of the plug-in, the DNS server performs name resolution using forwarding + or recursion, as configured. If DllPath is not specified, the DNS server + ceases to use a custom plug-in if a custom plug-in was previously configured. + + .PARAMETER RootTrustAnchorsURL + Specifies the URL of the root trust anchor on the DNS server. + + .PARAMETER SocketPoolExcludedPortRanges + Specifies the port ranges that should be excluded. + + .PARAMETER LameDelegationTTL + Specifies the time span that must elapse before the DNS server will re-query + DNS servers of the parent zone when a lame delegation is encountered. The + value SHOULD be limited to the range from 0x00000000 to 0x00278D00 30 days, + inclusive, but it MAY be any value. + + .PARAMETER MaximumSignatureScanPeriod + Specifies the maximum period between zone scans to update DnsSec signatures + for resource records. + + .PARAMETER MaximumTrustAnchorActiveRefreshInterval + Specifies the maximum value for the active refresh interval for a trust + anchor. Must not be higher than 15 days. + + .PARAMETER ZoneWritebackInterval + Specifies the zone write back interval for file backed zones. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer, + + [Parameter()] + [System.UInt32] + $AddressAnswerLimit, + + [Parameter()] + [System.Boolean] + $AllowUpdate, + + [Parameter()] + [System.Boolean] + $AutoCacheUpdate, + + [Parameter()] + [System.UInt32] + $AutoConfigFileZones, + + [Parameter()] + [System.Boolean] + $BindSecondaries, + + [Parameter()] + [System.UInt32] + $BootMethod, + + [Parameter()] + [System.Boolean] + $DisableAutoReverseZone, + + [Parameter()] + [System.Boolean] + $EnableDirectoryPartitions, + + [Parameter()] + [System.Boolean] + $EnableDnsSec, + + [Parameter()] + [System.Boolean] + $ForwardDelegations, + + [Parameter()] + [System.String[]] + $ListeningIPAddress, + + [Parameter()] + [System.Boolean] + $LocalNetPriority, + + [Parameter()] + [System.Boolean] + $LooseWildcarding, + + [Parameter()] + [System.UInt32] + $NameCheckFlag, + + [Parameter()] + [System.Boolean] + $RoundRobin, + + [Parameter()] + [System.UInt32] + $RpcProtocol, + + [Parameter()] + [System.UInt32] + $SendPort, + + [Parameter()] + [System.Boolean] + $StrictFileParsing, + + [Parameter()] + [System.UInt32] + $UpdateOptions, + + [Parameter()] + [System.Boolean] + $WriteAuthorityNS, + + [Parameter()] + [System.UInt32] + $XfrConnectTimeout, + + [Parameter()] + [System.Boolean] + $EnableIPv6, + + [Parameter()] + [System.Boolean] + $EnableOnlineSigning, + + [Parameter()] + [System.Boolean] + $EnableDuplicateQuerySuppression, + + [Parameter()] + [System.Boolean] + $AllowCnameAtNs, + + [Parameter()] + [System.Boolean] + $EnableRsoForRodc, + + [Parameter()] + [System.Boolean] + $OpenAclOnProxyUpdates, + + [Parameter()] + [System.Boolean] + $NoUpdateDelegations, + + [Parameter()] + [System.Boolean] + $EnableUpdateForwarding, + + [Parameter()] + [System.Boolean] + $EnableWinsR, + + [Parameter()] + [System.Boolean] + $DeleteOutsideGlue, + + [Parameter()] + [System.Boolean] + $AppendMsZoneTransferTag, + + [Parameter()] + [System.Boolean] + $AllowReadOnlyZoneTransfer, + + [Parameter()] + [System.Boolean] + $EnableSendErrorSuppression, + + [Parameter()] + [System.Boolean] + $SilentlyIgnoreCnameUpdateConflicts, + + [Parameter()] + [System.Boolean] + $EnableIQueryResponseGeneration, + + [Parameter()] + [System.Boolean] + $AdminConfigured, + + [Parameter()] + [System.Boolean] + $PublishAutoNet, + + [Parameter()] + [System.Boolean] + $ReloadException, + + [Parameter()] + [System.Boolean] + $IgnoreServerLevelPolicies, + + [Parameter()] + [System.Boolean] + $IgnoreAllPolicies, + + [Parameter()] + [System.UInt32] + $EnableVersionQuery, + + [Parameter()] + [System.UInt32] + $AutoCreateDelegation, + + [Parameter()] + [System.UInt32] + $RemoteIPv4RankBoost, + + [Parameter()] + [System.UInt32] + $RemoteIPv6RankBoost, + + [Parameter()] + [System.UInt32] + $MaximumRodcRsoQueueLength, + + [Parameter()] + [System.UInt32] + $MaximumRodcRsoAttemptsPerCycle, + + [Parameter()] + [System.UInt32] + $MaxResourceRecordsInNonSecureUpdate, + + [Parameter()] + [System.UInt32] + $LocalNetPriorityMask, + + [Parameter()] + [System.UInt32] + $TcpReceivePacketSize, + + [Parameter()] + [System.UInt32] + $SelfTest, + + [Parameter()] + [System.UInt32] + $XfrThrottleMultiplier, + + [Parameter()] + [System.UInt32] + $SocketPoolSize, + + [Parameter()] + [System.UInt32] + $QuietRecvFaultInterval, + + [Parameter()] + [System.UInt32] + $QuietRecvLogInterval, + + [Parameter()] + [System.UInt32] + $SyncDsZoneSerial, + + [Parameter()] + [System.UInt32] + $ScopeOptionValue, + + [Parameter()] + [System.UInt32] + $VirtualizationInstanceOptionValue, + + [Parameter()] + [System.String] + $ServerLevelPluginDll, + + [Parameter()] + [System.String] + $RootTrustAnchorsURL, + + [Parameter()] + [System.String[]] + $SocketPoolExcludedPortRanges, + + [Parameter()] + [System.String] + $LameDelegationTTL, + + [Parameter()] + [System.String] + $MaximumSignatureScanPeriod, + + [Parameter()] + [System.String] + $MaximumTrustAnchorActiveRefreshInterval, + + [Parameter()] + [System.String] + $ZoneWritebackInterval + ) + + Assert-Module -ModuleName 'DnsServer' + + $PSBoundParameters.Remove('DnsServer') + + $dnsProperties = Remove-CommonParameter -Hashtable $PSBoundParameters + + $getDnServerSettingResult = Get-DnsServerSetting -All + + $propertiesInDesiredState = @() + + foreach ($property in $dnsProperties.keys) + { + if ($property -in ('ListeningIPAddress', 'SocketPoolExcludedPortRanges')) + { + # Compare array + + $compareObjectParameters = @{ + ReferenceObject = $dnsProperties.$property + DifferenceObject = $getDnServerSettingResult.$property + } + + $isPropertyInDesiredState = -not (Compare-Object @compareObjectParameters) + } + else + { + $isPropertyInDesiredState = $dnsProperties.$property -eq $getDnServerSettingResult.$property + } + + if ($isPropertyInDesiredState) + { + # Property in desired state. + + Write-Verbose -Message ($script:localizedData.PropertyInDesiredState -f $property) + + $propertiesInDesiredState += $property + + } + else + { + # Property not in desired state. + + Write-Verbose -Message ($script:localizedData.SetDnsServerSetting -f $property, ($dnsProperties[$property] -join ', ')) + } + } + + # Remove passed parameters that are in desired state. + $propertiesInDesiredState | ForEach-Object -Process { + $dnsProperties.Remove($_) + } + + if ($dnsProperties.Keys.Count -eq 0) + { + Write-Verbose -Message $script:localizedData.SettingsInDesiredState + } + else + { + # Set all desired values for the properties that were not in desired state. + $dnsProperties.Keys | ForEach-Object -Process { + $property = $_ + + if ($property -in $script:timeSpanProperties) + { + $timeSpan = New-TimeSpan + + <# + When this resource is converted to a class-based resource this should + be replaced by private function ConvertTo-TimeSpan. + #> + if (-not [System.TimeSpan]::TryParse($dnsProperties.$property, [ref] $timeSpan)) + { + throw ($script:localizedData.UnableToParseTimeSpan -f $dnsProperties.$property, $property ) + } + + $getDnServerSettingResult.$property = $timeSpan + } + else + { + $getDnServerSettingResult.$property = $dnsProperties.$property + } + } + + $setDnServerSettingParameters = @{ + ErrorAction = 'Stop' + } + + if ($DnsServer -ne 'localhost') + { + $setDnServerSettingParameters['ComputerName'] = $DnsServer + } + + $getDnServerSettingResult | Set-DnsServerSetting @setDnServerSettingParameters + } +} + +<# + .SYNOPSIS + Tests the desired state of the DNS server settings. + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. + + .PARAMETER AddressAnswerLimit + Specifies the maximum number of A (host IP address) resource records that + the DNS server can insert in the answer section of a response to an A record + query (a query for an IP address). The value of this entry also influences + the setting of the truncation bit. If the value of this entry can be between + 5 and 28, or 0. The truncation bit is not set on the response, even when the + packet space is exceeded. + + .PARAMETER AllowUpdate + Specifies whether the DNS Server accepts dynamic update requests. $true to + allow any DNS update operation; otherwise, $false. + + .PARAMETER AutoCacheUpdate + Specifies whether the DNS Server attempts to update its cache entries using + data from root servers. $true to cache delegation information; otherwise, + $false. + + .PARAMETER AutoConfigFileZones + Specifies the type of zones for which SOA and NS records will be automatically + configured with the DNS server's local host name as the primary DNS server for + the zone when the zone is loaded from file. + + .PARAMETER BindSecondaries + Specifies whether the server will permit send DNS zone transfer response + messages with more than one record in each response if the zone transfer + request did not have the characters MS appended to it. If set to $true, + the DNS server will include only one record in each response if the zone + transfer request did not have the characters MS appended to it. + + .PARAMETER BootMethod + Specifies the boot method used by the DNS server. + + .PARAMETER DisableAutoReverseZone + Specifies whether the DNS Server automatically creates standard reverse + look up zones. $true to disables automatic reverse zones; otherwise, $false. + + .PARAMETER EnableDirectoryPartitions + Specifies whether the DNS server will support application directory partitions. + + .PARAMETER EnableDnsSec + Specifies whether the DNS Server includes DNSSEC-specific RRs, KEY, SIG, + and NXT in a response. $true to enable DNSSEC validation on the DNS server; + otherwise, $false. + + .PARAMETER ForwardDelegations + Specifies how the DNS server will handle forwarding and delegations. If + set to $true, the DNS server MUST use forwarders instead of a cached + delegation when both are available. Otherwise, the DNS server MUST use a + cached delegation instead of forwarders when both are available. + + .PARAMETER ListeningIPAddress + Specifies the listening IP addresses of the DNS server. The list of IP + addresses on which the DNS Server can receive queries. + + .PARAMETER LocalNetPriority + Specifies whether the DNS Server gives priority to the local net address + when returning A records. $true to return A records in order of their + similarity to the IP address of the querying client.; otherwise, $false. + + .PARAMETER LooseWildcarding + Specifies he type of algorithm that the DNS server will use to locate a + wildcard node when using a DNS wildcard record RFC1034 to answer a query. + If true, the DNS server will use the first node it encounters with a record + of the same type as the query type. Otherwise, the DNS server will use the + first node it encounters that has records of any type. + + .PARAMETER NameCheckFlag + Specifies the level of domain name checking and validation on the DNS server, + the set of eligible characters to be used in DNS names. + + .PARAMETER RoundRobin + Specifies whether the DNS Server round robins multiple A records. $true to + enable Round-robin DNS on the DNS server; otherwise, $false. + + .PARAMETER RpcProtocol + Specifies the DNS_RPC_PROTOCOLS section 2.2.1.1.2 value corresponding to + the RPC protocols to which the DNS server will respond. If this value is + set to 0x00000000, the DNS server MUST NOT respond to RPC requests for + any protocol. + + .PARAMETER SendPort + Specifies the port number to use as the source port when sending UDP queries + to a remote DNS server. If set to zero, the DNS server allow the stack to + select a random port. + + .PARAMETER StrictFileParsing + Specifies whether the DNS server will treat errors encountered while reading + zones from a file as fatal. + + .PARAMETER UpdateOptions + Specifies the DNS update options used by the DNS server. + + .PARAMETER WriteAuthorityNS + Specifies whether the DNS server will include NS records for the root of a + zone in DNS responses that are answered using authoritative zone data. + + .PARAMETER XfrConnectTimeout + Specifies the time span, in seconds, in which a primary DNS server waits + for a transfer response from its secondary server. The default value is 30. + After the time-out value expires, the connection is terminated. + + .PARAMETER EnableIPv6 + Specifies whether IPv6 should be enabled on the DNS Server. $true to enable + IPv6 on the DNS server; otherwise, $false. + + .PARAMETER EnableOnlineSigning + Specifies whether online signing should be enabled on the DNS Server. $true + to enable online signing; otherwise, $false. + + .PARAMETER EnableDuplicateQuerySuppression + Specifies whether the DNS server will not send remote queries when there is + already a remote query with the same name and query type outstanding. + + .PARAMETER AllowCnameAtNs + Specifies whether the server will permit the target domain names of NS records + to resolve to CNAME records. If $true, this pattern of DNS records will be + allowed; otherwise, the DNS server will return errors when encountering this + pattern of DNS records while resolving queries. + + .PARAMETER EnableRsoForRodc + Specifies whether the DNS server will attempt to replicate single updated + DNS objects from remote directory servers ahead of normally scheduled replication + when operating on a directory server that does not support write operations. + + .PARAMETER OpenAclOnProxyUpdates + Specifies whether the DNS server allows sharing of DNS records with the + DnsUpdateProxy group when processing updates in secure zones that are stored + in the directory service. + + .PARAMETER NoUpdateDelegations + Specifies whether the DNS server will accept DNS updates to delegation + records of type NS. + + .PARAMETER EnableUpdateForwarding + Specifies whether the DNS server will forward updates received for secondary + zones to the primary DNS server for the zone. + + .PARAMETER EnableWinsR + Specifies whether the DNS server will perform NetBIOS name resolution in + order to map IP addresses to machine names while processing queries in zones + where WINS-R information has been configured. + + .PARAMETER DeleteOutsideGlue + Specifies whether the DNS server will delete DNS glue records found outside + a delegated subzone when reading records from persistent storage. + + .PARAMETER AppendMsZoneTransferTag + Specifies whether the DNS server will indicate to the remote DNS servers + that it supports multiple DNS records in each zone transfer response message + by appending the characters MS at the end of zone transfer requests. The + value SHOULD be limited to 0x00000000 and 0x0000000, but it MAY be any value. + + .PARAMETER AllowReadOnlyZoneTransfer + Specifies whether the DNS server will allow zone transfers for zones that + are stored in the directory server when the directory server does not support + write operations. + + .PARAMETER EnableSendErrorSuppression + Specifies whether the DNS server will attempt to suppress large volumes + of DNS error responses sent to remote IP addresses that may be attempting + to attack the DNS server. + + .PARAMETER SilentlyIgnoreCnameUpdateConflicts + Specifies whether the DNS server will ignore CNAME conflicts during DNS + update processing. + + .PARAMETER EnableIQueryResponseGeneration + Specifies whether the DNS server will fabricate IQUERY responses. If set + to $true, the DNS server MUST fabricate IQUERY responses when it receives + queries of type IQUERY. Otherwise, the DNS server will return an error when + such queries are received. + + .PARAMETER AdminConfigured + Specifies whether the server has been configured by an administrator. + + .PARAMETER PublishAutoNet + Specifies whether the DNS server will publish local IPv4 addresses in the + 169.254.x.x subnet as IPv4 addresses for the local machine's domain name. + + .PARAMETER ReloadException + Specifies whether the DNS server will perform an internal restart if an + unexpected fatal error is encountered. + + .PARAMETER IgnoreServerLevelPolicies + Specifies whether to ignore the server level policies on the DNS server. + $true to ignore the server level policies on the DNS server; otherwise, + $false. + + .PARAMETER IgnoreAllPolicies + Specifies whether to ignore all policies on the DNS server. $true to ignore + all policies on the DNS server; otherwise, $false. + + .PARAMETER EnableVersionQuery + Specifies what version information the DNS server will respond with when a + DNS query with class set to CHAOS and type set to TXT is received. + + .PARAMETER AutoCreateDelegation + Specifies possible settings for automatic delegation creation for new zones + on the DNS server. The value SHOULD be limited to the range from 0x00000000 + to 0x00000002, inclusive, but it MAY be any value. + + .PARAMETER RemoteIPv4RankBoost + Specifies the value to add to all IPv4 addresses for remote DNS servers when + selecting between IPv4 and IPv6 remote DNS server addresses. The value MUST + be limited to the range from 0x00000000 to 0x0000000A, inclusive. + + .PARAMETER RemoteIPv6RankBoost + Specifies the value to add to all IPv6 addresses for remote DNS servers when + selecting between IPv4 and IPv6 remote DNS server addresses. The value MUST + be limited to the range from 0x00000000 to 0x0000000A, inclusive. + + .PARAMETER MaximumRodcRsoQueueLength + Specifies the maximum number of single object replication operations that + may be queued at any given time by the DNS server. The value MUST be limited + to the range from 0x00000000 to 0x000F4240, inclusive. If the value is + 0x00000000 the DNS server MUST NOT enforce an upper bound on the number of + single object replication operations queued at any given time. + + .PARAMETER MaximumRodcRsoAttemptsPerCycle + Specifies the maximum number of queued single object replication operations + that should be attempted during each five minute interval of DNS server + operation. The value MUST be limited to the range from 0x00000001 to 0x000F4240, + inclusive. + + .PARAMETER MaxResourceRecordsInNonSecureUpdate + Specifies the maximum number of resource records that the DNS server will + accept in a single DNS update request. The value SHOULD be limited to the + range from 0x0000000A to 0x00000078, inclusive, but it MAY be any value. + + .PARAMETER LocalNetPriorityMask + Specifies the value which specifies the network mask the DNS server will + use to sort IPv4 addresses. A value of 0xFFFFFFFF indicates that the DNS + server MUST use traditional IPv4 network mask for the address. Any other + value is a network mask, in host byte order that the DNS server MUST use + to retrieve network masks from IP addresses for sorting purposes. + + .PARAMETER TcpReceivePacketSize + Specifies the maximum TCP packet size, in bytes, that the DNS server can + accept. The value MUST be limited to the range from 0x00004000 to 0x00010000, + inclusive. + + .PARAMETER SelfTest + Specifies the mask value indicating whether data consistency checking + should be performed once, each time the service starts. If the check fails, + the server posts an event log warning. If the least significant bit (regardless + of other bits) of this value is one, the DNS server will verify for each + active and update-allowing primary zone, that the IP address records are + present in the zone for the zone's SOA record's master server. If the + least significant bit (regardless of other bits) of this value is zero, + no data consistency checking will be performed. + + .PARAMETER XfrThrottleMultiplier + Specifies the multiple used to determine how long the DNS server should + refuse zone transfer requests after a successful zone transfer has been + completed. The total time for which a zone will refuse another zone + transfer request at the end of a successful zone transfer is computed as + this value multiplied by the number of seconds required for the zone + transfer that just completed. The server SHOULD refuse zone transfer + requests for no more than ten minutes. The value SHOULD be limited to + the range from 0x00000000 to 0x00000064, inclusive, but it MAY be any + value. + + .PARAMETER SocketPoolSize + Specifies the number of UDP sockets per address family that the DNS server + will use for sending remote queries. + + .PARAMETER QuietRecvFaultInterval + Specifies the minimum time interval, in seconds, starting when the server + begins waiting for the query to arrive on the network, after which the + server MAY log a debug message indicating that the server is to stop running. + If the value is zero or is less than the value of QuietRecvLogInterval*, + then the value of QuietRecvLogInterval MUST be used. If the value is + greater than or equal to the value of QuietRecvLogInterval, then the + literal value of QuietRecvFaultInterval MUST be used. Used to debug + reception of UDP traffic for a recursive query. + + .PARAMETER QuietRecvLogInterval + Specifies the minimum time interval, in seconds, starting when the server + begins waiting for the query to arrive on the network, or when the server + logs an eponymous debug message for the query, after which the server MUST + log a debug message indicating that the server is still waiting to receive + network traffic. If the value is zero, logging associated with the two + QuietRecv properties MUST be disabled, and the QuietRecvFaultInterval + property MUST be ignored. If the value is non-zero, logging associated with + the two QuietRecv properties MUST be enabled, and the QuietRecvFaultInterval + property MUST NOT be ignored. Used to debug reception of UDP traffic for a + recursive query. + + .PARAMETER SyncDsZoneSerial + Specifies the conditions under which the DNS server should immediately + commit uncommitted zone serial numbers to persistent storage. The value + SHOULD be limited to the range from 0x00000000 to 0x00000004, inclusive, + but it MAY be any value. + + .PARAMETER ScopeOptionValue + Specifies the extension mechanism for the DNS (ENDS0) scope setting on the + DNS server. + + .PARAMETER VirtualizationInstanceOptionValue + Specifies the virtualization instance option to be sent in ENDS0. + + .PARAMETER ServerLevelPluginDll + Specifies the path of a custom plug-in. When DllPath specifies the fully + qualified path name of a valid DNS server plug-in, the DNS server calls + functions in the plug-in to resolve name queries that are outside the + scope of all locally hosted zones. If a queried name is out of the scope + of the plug-in, the DNS server performs name resolution using forwarding + or recursion, as configured. If DllPath is not specified, the DNS server + ceases to use a custom plug-in if a custom plug-in was previously configured. + + .PARAMETER RootTrustAnchorsURL + Specifies the URL of the root trust anchor on the DNS server. + + .PARAMETER SocketPoolExcludedPortRanges + Specifies the port ranges that should be excluded. + + .PARAMETER LameDelegationTTL + Specifies the time span that must elapse before the DNS server will re-query + DNS servers of the parent zone when a lame delegation is encountered. The + value SHOULD be limited to the range from 0x00000000 to 0x00278D00 30 days, + inclusive, but it MAY be any value. + + .PARAMETER MaximumSignatureScanPeriod + Specifies the maximum period between zone scans to update DnsSec signatures + for resource records. + + .PARAMETER MaximumTrustAnchorActiveRefreshInterval + Specifies the maximum value for the active refresh interval for a trust + anchor. Must not be higher than 15 days. + + .PARAMETER ZoneWritebackInterval + Specifies the zone write back interval for file backed zones. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer, + + [Parameter()] + [System.UInt32] + $AddressAnswerLimit, + + [Parameter()] + [System.Boolean] + $AllowUpdate, + + [Parameter()] + [System.Boolean] + $AutoCacheUpdate, + + [Parameter()] + [System.UInt32] + $AutoConfigFileZones, + + [Parameter()] + [System.Boolean] + $BindSecondaries, + + [Parameter()] + [System.UInt32] + $BootMethod, + + [Parameter()] + [System.Boolean] + $DisableAutoReverseZone, + + [Parameter()] + [System.Boolean] + $EnableDirectoryPartitions, + + [Parameter()] + [System.Boolean] + $EnableDnsSec, + + [Parameter()] + [System.Boolean] + $ForwardDelegations, + + [Parameter()] + [System.String[]] + $ListeningIPAddress, + + [Parameter()] + [System.Boolean] + $LocalNetPriority, + + [Parameter()] + [System.Boolean] + $LooseWildcarding, + + [Parameter()] + [System.UInt32] + $NameCheckFlag, + + [Parameter()] + [System.Boolean] + $RoundRobin, + + [Parameter()] + [System.UInt32] + $RpcProtocol, + + [Parameter()] + [System.UInt32] + $SendPort, + + [Parameter()] + [System.Boolean] + $StrictFileParsing, + + [Parameter()] + [System.UInt32] + $UpdateOptions, + + [Parameter()] + [System.Boolean] + $WriteAuthorityNS, + + [Parameter()] + [System.UInt32] + $XfrConnectTimeout, + + [Parameter()] + [System.Boolean] + $EnableIPv6, + + [Parameter()] + [System.Boolean] + $EnableOnlineSigning, + + [Parameter()] + [System.Boolean] + $EnableDuplicateQuerySuppression, + + [Parameter()] + [System.Boolean] + $AllowCnameAtNs, + + [Parameter()] + [System.Boolean] + $EnableRsoForRodc, + + [Parameter()] + [System.Boolean] + $OpenAclOnProxyUpdates, + + [Parameter()] + [System.Boolean] + $NoUpdateDelegations, + + [Parameter()] + [System.Boolean] + $EnableUpdateForwarding, + + [Parameter()] + [System.Boolean] + $EnableWinsR, + + [Parameter()] + [System.Boolean] + $DeleteOutsideGlue, + + [Parameter()] + [System.Boolean] + $AppendMsZoneTransferTag, + + [Parameter()] + [System.Boolean] + $AllowReadOnlyZoneTransfer, + + [Parameter()] + [System.Boolean] + $EnableSendErrorSuppression, + + [Parameter()] + [System.Boolean] + $SilentlyIgnoreCnameUpdateConflicts, + + [Parameter()] + [System.Boolean] + $EnableIQueryResponseGeneration, + + [Parameter()] + [System.Boolean] + $AdminConfigured, + + [Parameter()] + [System.Boolean] + $PublishAutoNet, + + [Parameter()] + [System.Boolean] + $ReloadException, + + [Parameter()] + [System.Boolean] + $IgnoreServerLevelPolicies, + + [Parameter()] + [System.Boolean] + $IgnoreAllPolicies, + + [Parameter()] + [System.UInt32] + $EnableVersionQuery, + + [Parameter()] + [System.UInt32] + $AutoCreateDelegation, + + [Parameter()] + [System.UInt32] + $RemoteIPv4RankBoost, + + [Parameter()] + [System.UInt32] + $RemoteIPv6RankBoost, + + [Parameter()] + [System.UInt32] + $MaximumRodcRsoQueueLength, + + [Parameter()] + [System.UInt32] + $MaximumRodcRsoAttemptsPerCycle, + + [Parameter()] + [System.UInt32] + $MaxResourceRecordsInNonSecureUpdate, + + [Parameter()] + [System.UInt32] + $LocalNetPriorityMask, + + [Parameter()] + [System.UInt32] + $TcpReceivePacketSize, + + [Parameter()] + [System.UInt32] + $SelfTest, + + [Parameter()] + [System.UInt32] + $XfrThrottleMultiplier, + + [Parameter()] + [System.UInt32] + $SocketPoolSize, + + [Parameter()] + [System.UInt32] + $QuietRecvFaultInterval, + + [Parameter()] + [System.UInt32] + $QuietRecvLogInterval, + + [Parameter()] + [System.UInt32] + $SyncDsZoneSerial, + + [Parameter()] + [System.UInt32] + $ScopeOptionValue, + + [Parameter()] + [System.UInt32] + $VirtualizationInstanceOptionValue, + + [Parameter()] + [System.String] + $ServerLevelPluginDll, + + [Parameter()] + [System.String] + $RootTrustAnchorsURL, + + [Parameter()] + [System.String[]] + $SocketPoolExcludedPortRanges, + + [Parameter()] + [System.String] + $LameDelegationTTL, + + [Parameter()] + [System.String] + $MaximumSignatureScanPeriod, + + [Parameter()] + [System.String] + $MaximumTrustAnchorActiveRefreshInterval, + + [Parameter()] + [System.String] + $ZoneWritebackInterval + ) + + Write-Verbose -Message $script:localizedData.EvaluatingDnsServerSettings + + $currentState = Get-TargetResource -DnsServer $DnsServer + + $null = $PSBoundParameters.Remove('DnsServer') + + $result = $true + + # Returns an item for each property that is not in desired state. + if (Compare-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters -Verbose:$VerbosePreference) + { + $result = $false + } + + return $result +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/DSC_DnsServerSetting.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/DSC_DnsServerSetting.schema.mof new file mode 100644 index 0000000..c313e88 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/DSC_DnsServerSetting.schema.mof @@ -0,0 +1,79 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerSetting")] +class DSC_DnsServerSetting : OMI_BaseResource +{ + [Key, Description("Specifies the DNS server to connect to, or use 'localhost' for the current node.")] String DnsServer; + [Write, Description("Specifies the maximum number of A (host IP address) resource records that the DNS server can insert in the answer section of a response to an A record query (a query for an IP address). The value of this entry also influences the setting of the truncation bit. If the value of this entry can be between `5` and `28`, or `0`. The truncation bit is not set on the response, even when the packet space is exceeded.")] UInt32 AddressAnswerLimit; + [Write, Description("Specifies whether the DNS Server accepts dynamic update requests. `$true` to allow any DNS update operation; otherwise, `$false`.")] Boolean AllowUpdate; + [Write, Description("Specifies whether the DNS Server attempts to update its cache entries using data from root servers. `$true` to cache delegation information; otherwise, `$false`.")] Boolean AutoCacheUpdate; + [Write, Description("Specifies the type of zones for which SOA and NS records will be automatically configured with the DNS server's local host name as the primary DNS server for the zone when the zone is loaded from file.")] UInt32 AutoConfigFileZones; + [Write, Description("Specifies whether the server will permit send DNS zone transfer response messages with more than one record in each response if the zone transfer request did not have the characters MS appended to it. If set to `$true`, the DNS server will include only one record in each response if the zone transfer request did not have the characters MS appended to it.")] Boolean BindSecondaries; + [Write, Description("Specifies the boot method used by the DNS server.")] UInt32 BootMethod; + [Write, Description("Specifies whether the DNS Server automatically creates standard reverse look up zones. `$true` to disables automatic reverse zones; otherwise, `$false`.")] Boolean DisableAutoReverseZone; + [Write, Description("Specifies whether the DNS server will support application directory partitions.")] Boolean EnableDirectoryPartitions; + [Write, Description("Specifies whether the DNS Server includes DNSSEC-specific RRs, KEY, SIG, and NXT in a response. `$true` to enable DNSSEC validation on the DNS server; otherwise, `$false`.")] Boolean EnableDnsSec; + [Write, Description("Specifies how the DNS server will handle forwarding and delegations. If set to `$true`, the DNS server MUST use forwarders instead of a cached delegation when both are available. Otherwise, the DNS server MUST use a cached delegation instead of forwarders when both are available.")] Boolean ForwardDelegations; + [Write, Description("Specifies the listening IP addresses of the DNS server. The list of IP addresses on which the DNS Server can receive queries.")] String ListeningIPAddress[]; + [Write, Description("Specifies whether the DNS Server gives priority to the local net address when returning A records. `$true` to return A records in order of their similarity to the IP address of the querying client.; otherwise, `$false`.")] Boolean LocalNetPriority; + [Write, Description("Specifies he type of algorithm that the DNS server will use to locate a wildcard node when using a DNS wildcard record RFC1034 to answer a query. If true, the DNS server will use the first node it encounters with a record of the same type as the query type. Otherwise, the DNS server will use the first node it encounters that has records of any type.")] Boolean LooseWildcarding; + [Write, Description("Specifies the level of domain name checking and validation on the DNS server, the set of eligible characters to be used in DNS names.")] UInt32 NameCheckFlag; + [Write, Description("Specifies whether the DNS Server round robins multiple A records. `$true` to enable Round-robin DNS on the DNS server; otherwise, `$false`.")] Boolean RoundRobin; + [Write, Description("Specifies the DNS_RPC_PROTOCOLS section 2.2.1.1.2 value corresponding to the RPC protocols to which the DNS server will respond. If this value is set to `0x00000000`, the DNS server MUST NOT respond to RPC requests for any protocol.")] UInt32 RpcProtocol; + [Write, Description("Specifies the port number to use as the source port when sending UDP queries to a remote DNS server. If set to zero, the DNS server allow the stack to select a random port.")] UInt32 SendPort; + [Write, Description("Specifies whether the DNS server will treat errors encountered while reading zones from a file as fatal.")] Boolean StrictFileParsing; + [Write, Description("Specifies the DNS update options used by the DNS server.")] UInt32 UpdateOptions; + [Write, Description("Specifies whether the DNS server will include NS records for the root of a zone in DNS responses that are answered using authoritative zone data.")] Boolean WriteAuthorityNS; + [Write, Description("Specifies the time span, in seconds, in which a primary DNS server waits for a transfer response from its secondary server. The default value is `30`. After the time-out value expires, the connection is terminated.")] UInt32 XfrConnectTimeout; + [Write, Description("Specifies whether IPv6 should be enabled on the DNS Server. `$true` to enable IPv6 on the DNS server; otherwise, `$false`.")] Boolean EnableIPv6; + [Write, Description("Specifies whether online signing should be enabled on the DNS Server. `$true` to enable online signing; otherwise, `$false`.")] Boolean EnableOnlineSigning; + [Write, Description("Specifies whether the DNS server will not send remote queries when there is already a remote query with the same name and query type outstanding.")] Boolean EnableDuplicateQuerySuppression; + [Write, Description("Specifies whether the server will permit the target domain names of NS records to resolve to CNAME records. If `$true`, this pattern of DNS records will be allowed; otherwise, the DNS server will return errors when encountering this pattern of DNS records while resolving queries.")] Boolean AllowCnameAtNs; + [Write, Description("Specifies whether the DNS server will attempt to replicate single updated DNS objects from remote directory servers ahead of normally scheduled replication when operating on a directory server that does not support write operations.")] Boolean EnableRsoForRodc; + [Write, Description("Specifies whether the DNS server allows sharing of DNS records with the DnsUpdateProxy group when processing updates in secure zones that are stored in the directory service.")] Boolean OpenAclOnProxyUpdates; + [Write, Description("Specifies whether the DNS server will accept DNS updates to delegation records of type NS.")] Boolean NoUpdateDelegations; + [Write, Description("Specifies whether the DNS server will forward updates received for secondary zones to the primary DNS server for the zone.")] Boolean EnableUpdateForwarding; + [Write, Description("Specifies whether the DNS server will perform NetBIOS name resolution in order to map IP addresses to machine names while processing queries in zones where WINS-R information has been configured.")] Boolean EnableWinsR; + [Write, Description("Specifies whether the DNS server will delete DNS glue records found outside a delegated subzone when reading records from persistent storage.")] Boolean DeleteOutsideGlue; + [Write, Description("Specifies whether the DNS server will indicate to the remote DNS servers that it supports multiple DNS records in each zone transfer response message by appending the characters MS at the end of zone transfer requests. The value SHOULD be limited to `0x00000000` and `0x0000000`, but it MAY be any value.")] Boolean AppendMsZoneTransferTag; + [Write, Description("Specifies whether the DNS server will allow zone transfers for zones that are stored in the directory server when the directory server does not support write operations.")] Boolean AllowReadOnlyZoneTransfer; + [Write, Description("Specifies whether the DNS server will attempt to suppress large volumes of DNS error responses sent to remote IP addresses that may be attempting to attack the DNS server.")] Boolean EnableSendErrorSuppression; + [Write, Description("Specifies whether the DNS server will ignore CNAME conflicts during DNS update processing.")] Boolean SilentlyIgnoreCnameUpdateConflicts; + [Write, Description("Specifies whether the DNS server will fabricate IQUERY responses. If set to `$true`, the DNS server MUST fabricate IQUERY responses when it receives queries of type IQUERY. Otherwise, the DNS server will return an error when such queries are received.")] Boolean EnableIQueryResponseGeneration; + [Write, Description("Specifies whether the server has been configured by an administrator.")] Boolean AdminConfigured; + [Write, Description("Specifies whether the DNS server will publish local IPv4 addresses in the 169.254.x.x subnet as IPv4 addresses for the local machine's domain name.")] Boolean PublishAutoNet; + [Write, Description("Specifies whether the DNS server will perform an internal restart if an unexpected fatal error is encountered.")] Boolean ReloadException; + [Write, Description("Specifies whether to ignore the server level policies on the DNS server. `$true` to ignore the server level policies on the DNS server; otherwise, `$false`.")] Boolean IgnoreServerLevelPolicies; + [Write, Description("Specifies whether to ignore all policies on the DNS server. `$true` to ignore all policies on the DNS server; otherwise, `$false`.")] Boolean IgnoreAllPolicies; + [Write, Description("Specifies what version information the DNS server will respond with when a DNS query with class set to CHAOS and type set to TXT is received.")] UInt32 EnableVersionQuery; + [Write, Description("Specifies possible settings for automatic delegation creation for new zones on the DNS server. The value SHOULD be limited to the range from `0x00000000` to `0x00000002`, inclusive, but it MAY be any value.")] UInt32 AutoCreateDelegation; + [Write, Description("Specifies the value to add to all IPv4 addresses for remote DNS servers when selecting between IPv4 and IPv6 remote DNS server addresses. The value MUST be limited to the range from `0x00000000` to `0x0000000A`, inclusive.")] UInt32 RemoteIPv4RankBoost; + [Write, Description("Specifies the value to add to all IPv6 addresses for remote DNS servers when selecting between IPv4 and IPv6 remote DNS server addresses. The value MUST be limited to the range from `0x00000000` to `0x0000000A`, inclusive.")] UInt32 RemoteIPv6RankBoost; + [Write, Description("Specifies the maximum number of single object replication operations that may be queued at any given time by the DNS server. The value MUST be limited to the range from `0x00000000` to `0x000F4240`, inclusive. If the value is `0x00000000` the DNS server MUST NOT enforce an upper bound on the number of single object replication operations queued at any given time.")] UInt32 MaximumRodcRsoQueueLength; + [Write, Description("Specifies the maximum number of queued single object replication operations that should be attempted during each five minute interval of DNS server operation. The value MUST be limited to the range from `0x00000001` to `0x000F4240`, inclusive.")] UInt32 MaximumRodcRsoAttemptsPerCycle; + [Write, Description("Specifies the maximum number of resource records that the DNS server will accept in a single DNS update request. The value SHOULD be limited to the range from `0x0000000A` to `0x00000078`, inclusive, but it MAY be any value.")] UInt32 MaxResourceRecordsInNonSecureUpdate; + [Write, Description("Specifies the value which specifies the network mask the DNS server will use to sort IPv4 addresses. A value of `0xFFFFFFFF` indicates that the DNS server MUST use traditional IPv4 network mask for the address. Any other value is a network mask, in host byte order that the DNS server MUST use to retrieve network masks from IP addresses for sorting purposes.")] UInt32 LocalNetPriorityMask; + [Write, Description("Specifies the maximum TCP packet size, in bytes, that the DNS server can accept. The value MUST be limited to the range from `0x00004000` to `0x00010000`, inclusive.")] UInt32 TcpReceivePacketSize; + [Write, Description("Specifies the mask value indicating whether data consistency checking should be performed once, each time the service starts. If the check fails, the server posts an event log warning. If the least significant bit (regardless of other bits) of this value is one, the DNS server will verify for each active and update-allowing primary zone, that the IP address records are present in the zone for the zone's SOA record's master server. If the least significant bit (regardless of other bits) of this value is zero, no data consistency checking will be performed.")] UInt32 SelfTest; + [Write, Description("Specifies the multiple used to determine how long the DNS server should refuse zone transfer requests after a successful zone transfer has been completed. The total time for which a zone will refuse another zone transfer request at the end of a successful zone transfer is computed as this value multiplied by the number of seconds required for the zone transfer that just completed. The server SHOULD refuse zone transfer requests for no more than ten minutes. The value SHOULD be limited to the range from `0x00000000` to `0x00000064`, inclusive, but it MAY be any value.")] UInt32 XfrThrottleMultiplier; + [Write, Description("Specifies the number of UDP sockets per address family that the DNS server will use for sending remote queries.")] UInt32 SocketPoolSize; + [Write, Description("Specifies the minimum time interval, in seconds, starting when the server begins waiting for the query to arrive on the network, after which the server MAY log a debug message indicating that the server is to stop running. If the value is zero or is less than the value of **QuietRecvLogInterval*, then the value of **QuietRecvLogInterval** MUST be used. If the value is greater than or equal to the value of **QuietRecvLogInterval**, then the literal value of **QuietRecvFaultInterval** MUST be used. Used to debug reception of UDP traffic for a recursive query.")] UInt32 QuietRecvFaultInterval; + [Write, Description("Specifies the minimum time interval, in seconds, starting when the server begins waiting for the query to arrive on the network, or when the server logs an eponymous debug message for the query, after which the server MUST log a debug message indicating that the server is still waiting to receive network traffic. If the value is zero, logging associated with the two **QuietRecv** properties MUST be disabled, and the **QuietRecvFaultInterval** property MUST be ignored. If the value is non-zero, logging associated with the two **QuietRecv** properties MUST be enabled, and the **QuietRecvFaultInterval** property MUST NOT be ignored. Used to debug reception of UDP traffic for a recursive query.")] UInt32 QuietRecvLogInterval; + [Write, Description("Specifies the conditions under which the DNS server should immediately commit uncommitted zone serial numbers to persistent storage. The value SHOULD be limited to the range from `0x00000000` to `0x00000004`, inclusive, but it MAY be any value.")] UInt32 SyncDsZoneSerial; + [Write, Description("Specifies the extension mechanism for the DNS (ENDS0) scope setting on the DNS server.")] UInt32 ScopeOptionValue; + [Write, Description("Specifies the virtualization instance option to be sent in ENDS0.")] UInt32 VirtualizationInstanceOptionValue; + [Write, Description("Specifies the path of a custom plug-in. When DllPath specifies the fully qualified path name of a valid DNS server plug-in, the DNS server calls functions in the plug-in to resolve name queries that are outside the scope of all locally hosted zones. If a queried name is out of the scope of the plug-in, the DNS server performs name resolution using forwarding or recursion, as configured. If DllPath is not specified, the DNS server ceases to use a custom plug-in if a custom plug-in was previously configured.")] String ServerLevelPluginDll; + [Write, Description("Specifies the URL of the root trust anchor on the DNS server.")] String RootTrustAnchorsURL; + [Write, Description("Specifies the port ranges that should be excluded.")] String SocketPoolExcludedPortRanges[]; + [Write, Description("Specifies the time span that must elapse before the DNS server will re-query DNS servers of the parent zone when a lame delegation is encountered. The value SHOULD be limited to the range from `0x00000000` to `0x00278D00` 30 days, inclusive, but it MAY be any value.")] String LameDelegationTTL; + [Write, Description("Specifies the maximum period between zone scans to update DnsSec signatures for resource records.")] String MaximumSignatureScanPeriod; + [Write, Description("Specifies the maximum value for the active refresh interval for a trust anchor. Must not be higher than 15 days.")] String MaximumTrustAnchorActiveRefreshInterval; + [Write, Description("Specifies the zone write back interval for file backed zones.")] String ZoneWritebackInterval; + [Read, Description("Returns `$true` if the DNS server has Active Directory integrated DNS enabled; otherwise, `$false`.")] Boolean DsAvailable; + [Read, Description("Returns the major version of the OS of the DNS server.")] UInt32 MajorVersion; + [Read, Description("Returns the minor version of the OS of the DNS server.")] UInt32 MinorVersion; + [Read, Description("Returns the The build version of the OS of the DNS server.")] UInt32 BuildNumber; + [Read, Description("Returns `$true` if write operations are enabled on the directory server; otherwise, `$false`.")] Boolean IsReadOnlyDC; + [Read, Description("Returns all of the IP addresses managed by the DNS server.")] String AllIPAddress[]; + [Read, Description("Returns the application directory partition for the forest the DNS server belongs to. Applicable only for active directory integrated DNS server.")] String ForestDirectoryPartitionBaseName; + [Read, Description("Returns the application directory partition for the domain the DNS server belongs to. Applicable only for active directory integrated DNS server.")] String DomainDirectoryPartitionBaseName; + [Read, Description("Returns the maximum UDP packet size, in bytes, that the DNS server can accept.")] UInt32 MaximumUdpPacketSize; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/README.md new file mode 100644 index 0000000..67b1432 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/README.md @@ -0,0 +1,24 @@ +# Description + +The DnsServerSetting DSC resource manages the Domain Name System (DNS) server +settings and properties. + +If the parameter **DnsServer** is set to `'localhost'` then the resource +can normally use the default credentials (SYSTEM) to configure the DNS server +settings. If using any other value for the parameter **DnsServer** make sure +that the credential the resource is run as have the correct permissions +at the target node and the necessary network traffic is permitted (_WsMan_ +protocol). It is possible to run the resource with specific credentials using the +built-in parameter **PsDscRunAsCredential**. + +Please see [DnsServerSetting class](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/dnsserverpsprov/dnsserversetting) +for more information around the properties this resource supports. + +## Requirements + +- Target machine must be running Windows Server 2012 or later. + - Properties `RootTrustAnchorsURL` and `ZoneWritebackInterval` is not + supported by _Windows Server 2012_. + - Properties `IgnoreServerLevelPolicies`, `IgnoreAllPolicies`, + `ScopeOptionValue`, and `VirtualizationInstanceOptionValue` are not + supported by _Windows Server 2012_ and _Windows Server 2012 R2_. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/en-US/DSC_DnsServerSetting.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/en-US/DSC_DnsServerSetting.strings.psd1 new file mode 100644 index 0000000..aa0c0bf --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/en-US/DSC_DnsServerSetting.strings.psd1 @@ -0,0 +1,9 @@ +# culture="en-US" +ConvertFrom-StringData @' + GettingDnsServerSettings = Getting DNS Server Settings. (DSS0001) + SetDnsServerSetting = Setting DNS Server setting '{0}' to value '{1}'. (DSS0002) + EvaluatingDnsServerSettings = Evaluating the DNS Server settings. (DSS0003) + PropertyInDesiredState = The property '{0}' is already in desired state. (DSS0004) + SettingsInDesiredState = The DNS Server settings are in desired state. (DSS0005) + UnableToParseTimeSpan = Could not parse the value '{0}' of the property '{1}'. (DSS0006) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/en-US/about_DnsServerSetting.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/en-US/about_DnsServerSetting.help.txt new file mode 100644 index 0000000..eae80a8 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSetting/en-US/about_DnsServerSetting.help.txt @@ -0,0 +1,493 @@ +.NAME + DnsServerSetting + +.DESCRIPTION + The DnsServerSetting DSC resource manages the Domain Name System (DNS) server + settings and properties. + + If the parameter DnsServer is set to 'localhost' then the resource + can normally use the default credentials (SYSTEM) to configure the DNS server + settings. If using any other value for the parameter DnsServer make sure + that the credential the resource is run as have the correct permissions + at the target node and the necessary network traffic is permitted (WsMan + protocol). It is possible to run the resource with specific credentials using the + built-in parameter PsDscRunAsCredential. + + Please see https://docs.microsoft.com/en-us/previous-versions/windows/desktop/dnsserverpsprov/dnsserversetting + for more information around the properties this resource supports. + + ## Requirements + + - Target machine must be running Windows Server 2012 or later. + - Properties RootTrustAnchorsURL and ZoneWritebackInterval is not + supported by Windows Server 2012. + - Properties IgnoreServerLevelPolicies, IgnoreAllPolicies, + ScopeOptionValue, and VirtualizationInstanceOptionValue are not + supported by Windows Server 2012 and Windows Server 2012 R2. + +.PARAMETER DnsServer + Key - String + Specifies the DNS server to connect to, or use 'localhost' for the current node. + +.PARAMETER AddressAnswerLimit + Write - UInt32 + Specifies the maximum number of A (host IP address) resource records that the DNS server can insert in the answer section of a response to an A record query (a query for an IP address). The value of this entry also influences the setting of the truncation bit. If the value of this entry can be between 5 and 28, or 0. The truncation bit is not set on the response, even when the packet space is exceeded. + +.PARAMETER AllowUpdate + Write - Boolean + Specifies whether the DNS Server accepts dynamic update requests. $true to allow any DNS update operation; otherwise, $false. + +.PARAMETER AutoCacheUpdate + Write - Boolean + Specifies whether the DNS Server attempts to update its cache entries using data from root servers. $true to cache delegation information; otherwise, $false. + +.PARAMETER AutoConfigFileZones + Write - UInt32 + Specifies the type of zones for which SOA and NS records will be automatically configured with the DNS server's local host name as the primary DNS server for the zone when the zone is loaded from file. + +.PARAMETER BindSecondaries + Write - Boolean + Specifies whether the server will permit send DNS zone transfer response messages with more than one record in each response if the zone transfer request did not have the characters MS appended to it. If set to $true, the DNS server will include only one record in each response if the zone transfer request did not have the characters MS appended to it. + +.PARAMETER BootMethod + Write - UInt32 + Specifies the boot method used by the DNS server. + +.PARAMETER DisableAutoReverseZone + Write - Boolean + Specifies whether the DNS Server automatically creates standard reverse look up zones. $true to disables automatic reverse zones; otherwise, $false. + +.PARAMETER EnableDirectoryPartitions + Write - Boolean + Specifies whether the DNS server will support application directory partitions. + +.PARAMETER EnableDnsSec + Write - Boolean + Specifies whether the DNS Server includes DNSSEC-specific RRs, KEY, SIG, and NXT in a response. $true to enable DNSSEC validation on the DNS server; otherwise, $false. + +.PARAMETER ForwardDelegations + Write - Boolean + Specifies how the DNS server will handle forwarding and delegations. If set to $true, the DNS server MUST use forwarders instead of a cached delegation when both are available. Otherwise, the DNS server MUST use a cached delegation instead of forwarders when both are available. + +.PARAMETER ListeningIPAddress + Write - StringArray + Specifies the listening IP addresses of the DNS server. The list of IP addresses on which the DNS Server can receive queries. + +.PARAMETER LocalNetPriority + Write - Boolean + Specifies whether the DNS Server gives priority to the local net address when returning A records. $true to return A records in order of their similarity to the IP address of the querying client.; otherwise, $false. + +.PARAMETER LooseWildcarding + Write - Boolean + Specifies he type of algorithm that the DNS server will use to locate a wildcard node when using a DNS wildcard record RFC1034 to answer a query. If true, the DNS server will use the first node it encounters with a record of the same type as the query type. Otherwise, the DNS server will use the first node it encounters that has records of any type. + +.PARAMETER NameCheckFlag + Write - UInt32 + Specifies the level of domain name checking and validation on the DNS server, the set of eligible characters to be used in DNS names. + +.PARAMETER RoundRobin + Write - Boolean + Specifies whether the DNS Server round robins multiple A records. $true to enable Round-robin DNS on the DNS server; otherwise, $false. + +.PARAMETER RpcProtocol + Write - UInt32 + Specifies the DNSRPCPROTOCOLS section 2.2.1.1.2 value corresponding to the RPC protocols to which the DNS server will respond. If this value is set to 0x00000000, the DNS server MUST NOT respond to RPC requests for any protocol. + +.PARAMETER SendPort + Write - UInt32 + Specifies the port number to use as the source port when sending UDP queries to a remote DNS server. If set to zero, the DNS server allow the stack to select a random port. + +.PARAMETER StrictFileParsing + Write - Boolean + Specifies whether the DNS server will treat errors encountered while reading zones from a file as fatal. + +.PARAMETER UpdateOptions + Write - UInt32 + Specifies the DNS update options used by the DNS server. + +.PARAMETER WriteAuthorityNS + Write - Boolean + Specifies whether the DNS server will include NS records for the root of a zone in DNS responses that are answered using authoritative zone data. + +.PARAMETER XfrConnectTimeout + Write - UInt32 + Specifies the time span, in seconds, in which a primary DNS server waits for a transfer response from its secondary server. The default value is 30. After the time-out value expires, the connection is terminated. + +.PARAMETER EnableIPv6 + Write - Boolean + Specifies whether IPv6 should be enabled on the DNS Server. $true to enable IPv6 on the DNS server; otherwise, $false. + +.PARAMETER EnableOnlineSigning + Write - Boolean + Specifies whether online signing should be enabled on the DNS Server. $true to enable online signing; otherwise, $false. + +.PARAMETER EnableDuplicateQuerySuppression + Write - Boolean + Specifies whether the DNS server will not send remote queries when there is already a remote query with the same name and query type outstanding. + +.PARAMETER AllowCnameAtNs + Write - Boolean + Specifies whether the server will permit the target domain names of NS records to resolve to CNAME records. If $true, this pattern of DNS records will be allowed; otherwise, the DNS server will return errors when encountering this pattern of DNS records while resolving queries. + +.PARAMETER EnableRsoForRodc + Write - Boolean + Specifies whether the DNS server will attempt to replicate single updated DNS objects from remote directory servers ahead of normally scheduled replication when operating on a directory server that does not support write operations. + +.PARAMETER OpenAclOnProxyUpdates + Write - Boolean + Specifies whether the DNS server allows sharing of DNS records with the DnsUpdateProxy group when processing updates in secure zones that are stored in the directory service. + +.PARAMETER NoUpdateDelegations + Write - Boolean + Specifies whether the DNS server will accept DNS updates to delegation records of type NS. + +.PARAMETER EnableUpdateForwarding + Write - Boolean + Specifies whether the DNS server will forward updates received for secondary zones to the primary DNS server for the zone. + +.PARAMETER EnableWinsR + Write - Boolean + Specifies whether the DNS server will perform NetBIOS name resolution in order to map IP addresses to machine names while processing queries in zones where WINS-R information has been configured. + +.PARAMETER DeleteOutsideGlue + Write - Boolean + Specifies whether the DNS server will delete DNS glue records found outside a delegated subzone when reading records from persistent storage. + +.PARAMETER AppendMsZoneTransferTag + Write - Boolean + Specifies whether the DNS server will indicate to the remote DNS servers that it supports multiple DNS records in each zone transfer response message by appending the characters MS at the end of zone transfer requests. The value SHOULD be limited to 0x00000000 and 0x0000000, but it MAY be any value. + +.PARAMETER AllowReadOnlyZoneTransfer + Write - Boolean + Specifies whether the DNS server will allow zone transfers for zones that are stored in the directory server when the directory server does not support write operations. + +.PARAMETER EnableSendErrorSuppression + Write - Boolean + Specifies whether the DNS server will attempt to suppress large volumes of DNS error responses sent to remote IP addresses that may be attempting to attack the DNS server. + +.PARAMETER SilentlyIgnoreCnameUpdateConflicts + Write - Boolean + Specifies whether the DNS server will ignore CNAME conflicts during DNS update processing. + +.PARAMETER EnableIQueryResponseGeneration + Write - Boolean + Specifies whether the DNS server will fabricate IQUERY responses. If set to $true, the DNS server MUST fabricate IQUERY responses when it receives queries of type IQUERY. Otherwise, the DNS server will return an error when such queries are received. + +.PARAMETER AdminConfigured + Write - Boolean + Specifies whether the server has been configured by an administrator. + +.PARAMETER PublishAutoNet + Write - Boolean + Specifies whether the DNS server will publish local IPv4 addresses in the 169.254.x.x subnet as IPv4 addresses for the local machine's domain name. + +.PARAMETER ReloadException + Write - Boolean + Specifies whether the DNS server will perform an internal restart if an unexpected fatal error is encountered. + +.PARAMETER IgnoreServerLevelPolicies + Write - Boolean + Specifies whether to ignore the server level policies on the DNS server. $true to ignore the server level policies on the DNS server; otherwise, $false. + +.PARAMETER IgnoreAllPolicies + Write - Boolean + Specifies whether to ignore all policies on the DNS server. $true to ignore all policies on the DNS server; otherwise, $false. + +.PARAMETER EnableVersionQuery + Write - UInt32 + Specifies what version information the DNS server will respond with when a DNS query with class set to CHAOS and type set to TXT is received. + +.PARAMETER AutoCreateDelegation + Write - UInt32 + Specifies possible settings for automatic delegation creation for new zones on the DNS server. The value SHOULD be limited to the range from 0x00000000 to 0x00000002, inclusive, but it MAY be any value. + +.PARAMETER RemoteIPv4RankBoost + Write - UInt32 + Specifies the value to add to all IPv4 addresses for remote DNS servers when selecting between IPv4 and IPv6 remote DNS server addresses. The value MUST be limited to the range from 0x00000000 to 0x0000000A, inclusive. + +.PARAMETER RemoteIPv6RankBoost + Write - UInt32 + Specifies the value to add to all IPv6 addresses for remote DNS servers when selecting between IPv4 and IPv6 remote DNS server addresses. The value MUST be limited to the range from 0x00000000 to 0x0000000A, inclusive. + +.PARAMETER MaximumRodcRsoQueueLength + Write - UInt32 + Specifies the maximum number of single object replication operations that may be queued at any given time by the DNS server. The value MUST be limited to the range from 0x00000000 to 0x000F4240, inclusive. If the value is 0x00000000 the DNS server MUST NOT enforce an upper bound on the number of single object replication operations queued at any given time. + +.PARAMETER MaximumRodcRsoAttemptsPerCycle + Write - UInt32 + Specifies the maximum number of queued single object replication operations that should be attempted during each five minute interval of DNS server operation. The value MUST be limited to the range from 0x00000001 to 0x000F4240, inclusive. + +.PARAMETER MaxResourceRecordsInNonSecureUpdate + Write - UInt32 + Specifies the maximum number of resource records that the DNS server will accept in a single DNS update request. The value SHOULD be limited to the range from 0x0000000A to 0x00000078, inclusive, but it MAY be any value. + +.PARAMETER LocalNetPriorityMask + Write - UInt32 + Specifies the value which specifies the network mask the DNS server will use to sort IPv4 addresses. A value of 0xFFFFFFFF indicates that the DNS server MUST use traditional IPv4 network mask for the address. Any other value is a network mask, in host byte order that the DNS server MUST use to retrieve network masks from IP addresses for sorting purposes. + +.PARAMETER TcpReceivePacketSize + Write - UInt32 + Specifies the maximum TCP packet size, in bytes, that the DNS server can accept. The value MUST be limited to the range from 0x00004000 to 0x00010000, inclusive. + +.PARAMETER SelfTest + Write - UInt32 + Specifies the mask value indicating whether data consistency checking should be performed once, each time the service starts. If the check fails, the server posts an event log warning. If the least significant bit (regardless of other bits) of this value is one, the DNS server will verify for each active and update-allowing primary zone, that the IP address records are present in the zone for the zone's SOA record's master server. If the least significant bit (regardless of other bits) of this value is zero, no data consistency checking will be performed. + +.PARAMETER XfrThrottleMultiplier + Write - UInt32 + Specifies the multiple used to determine how long the DNS server should refuse zone transfer requests after a successful zone transfer has been completed. The total time for which a zone will refuse another zone transfer request at the end of a successful zone transfer is computed as this value multiplied by the number of seconds required for the zone transfer that just completed. The server SHOULD refuse zone transfer requests for no more than ten minutes. The value SHOULD be limited to the range from 0x00000000 to 0x00000064, inclusive, but it MAY be any value. + +.PARAMETER SocketPoolSize + Write - UInt32 + Specifies the number of UDP sockets per address family that the DNS server will use for sending remote queries. + +.PARAMETER QuietRecvFaultInterval + Write - UInt32 + Specifies the minimum time interval, in seconds, starting when the server begins waiting for the query to arrive on the network, after which the server MAY log a debug message indicating that the server is to stop running. If the value is zero or is less than the value of QuietRecvLogInterval, then the value of QuietRecvLogInterval MUST be used. If the value is greater than or equal to the value of QuietRecvLogInterval, then the literal value of QuietRecvFaultInterval* MUST be used. Used to debug reception of UDP traffic for a recursive query. + +.PARAMETER QuietRecvLogInterval + Write - UInt32 + Specifies the minimum time interval, in seconds, starting when the server begins waiting for the query to arrive on the network, or when the server logs an eponymous debug message for the query, after which the server MUST log a debug message indicating that the server is still waiting to receive network traffic. If the value is zero, logging associated with the two QuietRecv properties MUST be disabled, and the QuietRecvFaultInterval property MUST be ignored. If the value is non-zero, logging associated with the two QuietRecv properties MUST be enabled, and the QuietRecvFaultInterval property MUST NOT be ignored. Used to debug reception of UDP traffic for a recursive query. + +.PARAMETER SyncDsZoneSerial + Write - UInt32 + Specifies the conditions under which the DNS server should immediately commit uncommitted zone serial numbers to persistent storage. The value SHOULD be limited to the range from 0x00000000 to 0x00000004, inclusive, but it MAY be any value. + +.PARAMETER ScopeOptionValue + Write - UInt32 + Specifies the extension mechanism for the DNS (ENDS0) scope setting on the DNS server. + +.PARAMETER VirtualizationInstanceOptionValue + Write - UInt32 + Specifies the virtualization instance option to be sent in ENDS0. + +.PARAMETER ServerLevelPluginDll + Write - String + Specifies the path of a custom plug-in. When DllPath specifies the fully qualified path name of a valid DNS server plug-in, the DNS server calls functions in the plug-in to resolve name queries that are outside the scope of all locally hosted zones. If a queried name is out of the scope of the plug-in, the DNS server performs name resolution using forwarding or recursion, as configured. If DllPath is not specified, the DNS server ceases to use a custom plug-in if a custom plug-in was previously configured. + +.PARAMETER RootTrustAnchorsURL + Write - String + Specifies the URL of the root trust anchor on the DNS server. + +.PARAMETER SocketPoolExcludedPortRanges + Write - StringArray + Specifies the port ranges that should be excluded. + +.PARAMETER LameDelegationTTL + Write - String + Specifies the time span that must elapse before the DNS server will re-query DNS servers of the parent zone when a lame delegation is encountered. The value SHOULD be limited to the range from 0x00000000 to 0x00278D00 30 days, inclusive, but it MAY be any value. + +.PARAMETER MaximumSignatureScanPeriod + Write - String + Specifies the maximum period between zone scans to update DnsSec signatures for resource records. + +.PARAMETER MaximumTrustAnchorActiveRefreshInterval + Write - String + Specifies the maximum value for the active refresh interval for a trust anchor. Must not be higher than 15 days. + +.PARAMETER ZoneWritebackInterval + Write - String + Specifies the zone write back interval for file backed zones. + +.PARAMETER DsAvailable + Read - Boolean + Returns $true if the DNS server has Active Directory integrated DNS enabled; otherwise, $false. + +.PARAMETER MajorVersion + Read - UInt32 + Returns the major version of the OS of the DNS server. + +.PARAMETER MinorVersion + Read - UInt32 + Returns the minor version of the OS of the DNS server. + +.PARAMETER BuildNumber + Read - UInt32 + Returns the The build version of the OS of the DNS server. + +.PARAMETER IsReadOnlyDC + Read - Boolean + Returns $true if write operations are enabled on the directory server; otherwise, $false. + +.PARAMETER AllIPAddress + Read - StringArray + Returns all of the IP addresses managed by the DNS server. + +.PARAMETER ForestDirectoryPartitionBaseName + Read - String + Returns the application directory partition for the forest the DNS server belongs to. Applicable only for active directory integrated DNS server. + +.PARAMETER DomainDirectoryPartitionBaseName + Read - String + Returns the application directory partition for the domain the DNS server belongs to. Applicable only for active directory integrated DNS server. + +.PARAMETER MaximumUdpPacketSize + Read - UInt32 + Returns the maximum UDP packet size, in bytes, that the DNS server can accept. + +.EXAMPLE 1 + +This configuration will manage the DNS server settings on the current +node. + +Configuration DnsServerSetting_CurrentNode_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerSetting 'DnsServerProperties' + { + DnsServer = 'localhost' + LocalNetPriority = $true + RoundRobin = $true + RpcProtocol = 0 + NameCheckFlag = 2 + AutoConfigFileZones = 1 + AddressAnswerLimit = 0 + UpdateOptions = 783 + DisableAutoReverseZone = $false + StrictFileParsing = $false + EnableDirectoryPartitions = $false + XfrConnectTimeout = 30 + BootMethod = 3 + AllowUpdate = $true + LooseWildcarding = $false + BindSecondaries = $false + AutoCacheUpdate = $false + EnableDnsSec = $true + SendPort = 0 + WriteAuthorityNS = $false + ListeningIPAddress = @('192.168.1.10', '192.168.2.10') + ForwardDelegations = $false + EnableIPv6 = $true + EnableOnlineSigning = $true + EnableDuplicateQuerySuppression = $true + AllowCnameAtNs = $true + EnableRsoForRodc = $true + OpenAclOnProxyUpdates = $true + NoUpdateDelegations = $false + EnableUpdateForwarding = $false + EnableWinsR = $true + DeleteOutsideGlue = $false + AppendMsZoneTransferTag = $false + AllowReadOnlyZoneTransfer = $false + EnableSendErrorSuppression = $true + SilentlyIgnoreCnameUpdateConflicts = $false + EnableIQueryResponseGeneration = $false + AdminConfigured = $true + PublishAutoNet = $false + ReloadException = $false + IgnoreServerLevelPolicies = $false + IgnoreAllPolicies = $false + EnableVersionQuery = 0 + AutoCreateDelegation = 2 + RemoteIPv4RankBoost = 5 + RemoteIPv6RankBoost = 0 + MaximumRodcRsoQueueLength = 300 + MaximumRodcRsoAttemptsPerCycle = 100 + MaxResourceRecordsInNonSecureUpdate = 30 + LocalNetPriorityMask = 255 + TcpReceivePacketSize = 65536 + SelfTest = 4294967295 + XfrThrottleMultiplier = 10 + SocketPoolSize = 2500 + QuietRecvFaultInterval = 0 + QuietRecvLogInterval = 0 + SyncDsZoneSerial = 2 + ScopeOptionValue = 0 + VirtualizationInstanceOptionValue = 0 + ServerLevelPluginDll = 'C:\dns\plugin.dll' + RootTrustAnchorsURL = 'https://data.iana.org/root-anchors/oroot-anchors.xml' + SocketPoolExcludedPortRanges = @() + LameDelegationTTL = '00:00:00' + MaximumSignatureScanPeriod = '2.00:00:00' + MaximumTrustAnchorActiveRefreshInterval = '15.00:00:00' + ZoneWritebackInterval = '00:01:00' + } + } +} + +.EXAMPLE 2 + +This configuration will manage the DNS server settings on the current +node. + +Configuration DnsServerSetting_RemoteNode_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerSetting 'DnsServerProperties' + { + DnsServer = 'dns1.company.local' + LocalNetPriority = $true + RoundRobin = $true + RpcProtocol = 0 + NameCheckFlag = 2 + AutoConfigFileZones = 1 + AddressAnswerLimit = 0 + UpdateOptions = 783 + DisableAutoReverseZone = $false + StrictFileParsing = $false + EnableDirectoryPartitions = $false + XfrConnectTimeout = 30 + BootMethod = 3 + AllowUpdate = $true + LooseWildcarding = $false + BindSecondaries = $false + AutoCacheUpdate = $false + EnableDnsSec = $true + SendPort = 0 + WriteAuthorityNS = $false + ListeningIPAddress = @('192.168.1.10', '192.168.2.10') + ForwardDelegations = $false + EnableIPv6 = $true + EnableOnlineSigning = $true + EnableDuplicateQuerySuppression = $true + AllowCnameAtNs = $true + EnableRsoForRodc = $true + OpenAclOnProxyUpdates = $true + NoUpdateDelegations = $false + EnableUpdateForwarding = $false + EnableWinsR = $true + DeleteOutsideGlue = $false + AppendMsZoneTransferTag = $false + AllowReadOnlyZoneTransfer = $false + EnableSendErrorSuppression = $true + SilentlyIgnoreCnameUpdateConflicts = $false + EnableIQueryResponseGeneration = $false + AdminConfigured = $true + PublishAutoNet = $false + ReloadException = $false + IgnoreServerLevelPolicies = $false + IgnoreAllPolicies = $false + EnableVersionQuery = 0 + AutoCreateDelegation = 2 + RemoteIPv4RankBoost = 5 + RemoteIPv6RankBoost = 0 + MaximumRodcRsoQueueLength = 300 + MaximumRodcRsoAttemptsPerCycle = 100 + MaxResourceRecordsInNonSecureUpdate = 30 + LocalNetPriorityMask = 255 + TcpReceivePacketSize = 65536 + SelfTest = 4294967295 + XfrThrottleMultiplier = 10 + SocketPoolSize = 2500 + QuietRecvFaultInterval = 0 + QuietRecvLogInterval = 0 + SyncDsZoneSerial = 2 + ScopeOptionValue = 0 + VirtualizationInstanceOptionValue = 0 + ServerLevelPluginDll = 'C:\dns\plugin.dll' + RootTrustAnchorsURL = 'https://data.iana.org/root-anchors/oroot-anchors.xml' + SocketPoolExcludedPortRanges = @() + LameDelegationTTL = '00:00:00' + MaximumSignatureScanPeriod = '2.00:00:00' + MaximumTrustAnchorActiveRefreshInterval = '15.00:00:00' + ZoneWritebackInterval = '00:01:00' + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/DSC_DnsServerSettingLegacy.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/DSC_DnsServerSettingLegacy.psm1 new file mode 100644 index 0000000..c222c0e --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/DSC_DnsServerSettingLegacy.psm1 @@ -0,0 +1,260 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + This resource contains a references to an offensive word that we do not use + in the DSC community. But due to the underlying class MicrosoftDNS_Server is + using the offensive word this resource need to use it too. This will change + as soon as the underlying class changes, or we can remove the property + altogether, see https://docs.microsoft.com/en-us/windows/win32/dns/microsoftdns-server. +#> + +<# + .SYNOPSIS + Returns the current state of the DNS server settings. + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer + ) + + Assert-Module -ModuleName 'DnsServer' + + Write-Verbose -Message $script:localizedData.GettingDnsServerSettings + + $dnsServerInstance = Get-CimClassMicrosoftDnsServer -DnsServer $DnsServer + + $returnValue = @{} + + $classProperties = @( + 'DisjointNets' + 'LogLevel' + 'IsSlave' + ) + + foreach ($property in $classProperties) + { + $propertyName = $property + + if ($propertyName -eq 'IsSlave') + { + $propertyName = 'NoForwarderRecursion' + } + + $returnValue.Add($propertyName, $dnsServerInstance.$property) + } + + $returnValue.DnsServer = $DnsServer + + return $returnValue +} + +<# + .SYNOPSIS + Set the desired state of the DNS server legacy settings. + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. + + .PARAMETER DisjointNets + Indicates whether the default port binding for a socket used to send queries + to remote DNS Servers can be overridden. + + .PARAMETER NoForwarderRecursion + TRUE if the DNS server does not use recursion when name-resolution through + forwarders fails. + + .PARAMETER LogLevel + Indicates which policies are activated in the Event Viewer system log. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer, + + [Parameter()] + [System.Boolean] + $DisjointNets, + + [Parameter()] + [System.Boolean] + $NoForwarderRecursion, + + [Parameter()] + [System.UInt32] + $LogLevel + ) + + Assert-Module -ModuleName 'DnsServer' + + $getTargetResourceResult = Get-TargetResource -DnsServer $DnsServer + + $PSBoundParameters.Remove('DnsServer') + + $dnsProperties = Remove-CommonParameter -Hashtable $PSBoundParameters + + $dnsServerInstance = Get-CimClassMicrosoftDnsServer -DnsServer $DnsServer + + $propertiesInDesiredState = @() + + foreach ($property in $dnsProperties.keys) + { + if ($dnsProperties.$property -ne $getTargetResourceResult.$property) + { + # Property not in desired state. + + Write-Verbose -Message ($script:localizedData.SetDnsServerSetting -f $property, $dnsProperties[$property]) + } + else + { + # Property in desired state. + + Write-Verbose -Message ($script:localizedData.PropertyInDesiredState -f $property) + + $propertiesInDesiredState += $property + } + } + + # Remove passed parameters that are in desired state. + $propertiesInDesiredState | ForEach-Object -Process { + $dnsProperties.Remove($_) + } + + # Handle renaming properties to what the class expects. + if ($dnsProperties.ContainsKey('NoForwarderRecursion')) + { + $dnsProperties.IsSlave = $dnsProperties.NoForwarderRecursion + + $dnsProperties.Remove('NoForwarderRecursion') + } + + if ($dnsProperties.Keys.Count -eq 0) + { + Write-Verbose -Message $script:localizedData.LegacySettingsInDesiredState + } + else + { + $setCimInstanceParameters = @{ + InputObject = $dnsServerInstance + Property = $dnsProperties + ErrorAction = 'Stop' + } + + if ($DnsServer -ne 'localhost') + { + $setCimInstanceParameters['ComputerName'] = $DnsServer + } + + Set-CimInstance @setCimInstanceParameters + } +} + +<# + .SYNOPSIS + Tests the desired state of the DNS server settings. + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. + + .PARAMETER DnsServer + Specifies the DNS server to connect to, or use 'localhost' for the current + node. + + .PARAMETER DisjointNets + Indicates whether the default port binding for a socket used to send queries + to remote DNS Servers can be overridden. + + .PARAMETER NoForwarderRecursion + TRUE if the DNS server does not use recursion when name-resolution through + forwarders fails. + + .PARAMETER LogLevel + Indicates which policies are activated in the Event Viewer system log. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([bool])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer, + + [Parameter()] + [System.Boolean] + $DisjointNets, + + [Parameter()] + [System.Boolean] + $NoForwarderRecursion, + + [Parameter()] + [System.UInt32] + $LogLevel + ) + + Write-Verbose -Message $script:localizedData.EvaluatingDnsServerSettings + + $currentState = Get-TargetResource -DnsServer $DnsServer + + $null = $PSBoundParameters.Remove('DnsServer') + + $result = $true + + # Returns an item for each property that is not in desired state. + if (Compare-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters -Verbose:$VerbosePreference) + { + $result = $false + } + + return $result +} + +function Get-CimClassMicrosoftDnsServer +{ + [CmdletBinding()] + [OutputType([Microsoft.Management.Infrastructure.CimInstance])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DnsServer + ) + + $getCimInstanceParameters = @{ + NameSpace = 'root\MicrosoftDNS' + ClassName = 'MicrosoftDNS_Server' + ErrorAction = 'Stop' + } + + if ($DnsServer -ne 'localhost') + { + $getCimInstanceParameters['ComputerName'] = $DnsServer + } + + $dnsServerInstance = Get-CimInstance @getCimInstanceParameters + + return $dnsServerInstance +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/DSC_DnsServerSettingLegacy.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/DSC_DnsServerSettingLegacy.schema.mof new file mode 100644 index 0000000..e9496bd --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/DSC_DnsServerSettingLegacy.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerSettingLegacy")] +class DSC_DnsServerSettingLegacy : OMI_BaseResource +{ + [Key, Description("Specifies the DNS server to connect to, or use 'localhost' for the current node.")] String DnsServer; + [Write, Description("Indicates whether the default port binding for a socket used to send queries to remote DNS Servers can be overridden.")] Boolean DisjointNets; + [Write, Description("TRUE if the DNS server does not use recursion when name-resolution through forwarders fails.")] Boolean NoForwarderRecursion; + [Write, Description("Indicates which policies are activated in the Event Viewer system log.")] UInt32 LogLevel; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/README.md new file mode 100644 index 0000000..ac21bb7 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/README.md @@ -0,0 +1,12 @@ +# Description + +The DnsServerSettingLegacy DSC resource manages the Domain Name System (DNS) server +legacy settings. + +If the parameter **DnsServer** is set to `'localhost'` then the resource +can normally use the default credentials (SYSTEM) to configure the DNS server +settings. If using any other value for the parameter **DnsServer** make sure +that the credential the resource is run as have the correct permissions +at the target node and the necessary network traffic is permitted (_WsMan_ +protocol). It is possible to run the resource with specific credentials using the +built-in parameter **PsDscRunAsCredential**. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/en-US/DSC_DnsServerSettingLegacy.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/en-US/DSC_DnsServerSettingLegacy.strings.psd1 new file mode 100644 index 0000000..2977ce4 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/en-US/DSC_DnsServerSettingLegacy.strings.psd1 @@ -0,0 +1,8 @@ +# culture="en-US" +ConvertFrom-StringData @' + GettingDnsServerSettings = Getting DNS Server legacy settings. (DSSL0001) + SetDnsServerSetting = Setting DNS Server legacy setting '{0}' to value '{1}'. (DSSL0002) + EvaluatingDnsServerSettings = Evaluating the DNS Server legacy settings. (DSSL0003) + PropertyInDesiredState = The property '{0}' is already in desired state. (DSSL0004) + LegacySettingsInDesiredState = The DNS Server legacy settings are in desired state. (DSSL0005) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/en-US/about_DnsServerSettingLegacy.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/en-US/about_DnsServerSettingLegacy.help.txt new file mode 100644 index 0000000..20896d3 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerSettingLegacy/en-US/about_DnsServerSettingLegacy.help.txt @@ -0,0 +1,73 @@ +.NAME + DnsServerSettingLegacy + +.DESCRIPTION + The DnsServerSettingLegacy DSC resource manages the Domain Name System (DNS) server + legacy settings. + + If the parameter DnsServer is set to 'localhost' then the resource + can normally use the default credentials (SYSTEM) to configure the DNS server + settings. If using any other value for the parameter DnsServer make sure + that the credential the resource is run as have the correct permissions + at the target node and the necessary network traffic is permitted (WsMan + protocol). It is possible to run the resource with specific credentials using the + built-in parameter PsDscRunAsCredential. + +.PARAMETER DnsServer + Key - String + Specifies the DNS server to connect to, or use 'localhost' for the current node. + +.PARAMETER DisjointNets + Write - Boolean + Indicates whether the default port binding for a socket used to send queries to remote DNS Servers can be overridden. + +.PARAMETER NoForwarderRecursion + Write - Boolean + TRUE if the DNS server does not use recursion when name-resolution through forwarders fails. + +.PARAMETER LogLevel + Write - UInt32 + Indicates which policies are activated in the Event Viewer system log. + +.EXAMPLE 1 + +This configuration will manage the DNS server legacy settings on the current +node. + +Configuration DnsServerSettingLegacy_CurrentNode_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerSettingLegacy 'DnsServerLegacyProperties' + { + DnsServer = 'localhost' + DisjointNets = $false + NoForwarderRecursion = $true + LogLevel = 50393905 + } + } +} + +.EXAMPLE 2 + +This configuration will manage the DNS server legacy settings on the current +node. + +Configuration DnsServerSettingLegacy_RemoteNode_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerSettingLegacy 'DnsServerLegacyProperties' + { + DnsServer = 'dns1.company.local' + DisjointNets = $false + NoForwarderRecursion = $true + LogLevel = 50393905 + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/DSC_DnsServerZoneAging.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/DSC_DnsServerZoneAging.psm1 new file mode 100644 index 0000000..9cf80c7 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/DSC_DnsServerZoneAging.psm1 @@ -0,0 +1,196 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Get the DNS zone aging settings. + + .PARAMETER Name + Name of the DNS forward or reverse loookup zone. + + .PARAMETER Enabled + Option to enable scavenge stale resource records on the zone. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $Enabled + ) + + Write-Verbose -Message ($script:localizedData.GettingDnsZoneAgingMessage -f $Name) + + # Get the current zone aging from the local DNS server + $zoneAging = Get-DnsServerZoneAging -Name $Name + + return @{ + Name = $Name + Enabled = $zoneAging.AgingEnabled + RefreshInterval = $zoneAging.RefreshInterval.TotalHours + NoRefreshInterval = $zoneAging.NoRefreshInterval.TotalHours + } +} + +<# + .SYNOPSIS + Set the DNS zone aging settings. + + .PARAMETER Name + Name of the DNS forward or reverse loookup zone. + + .PARAMETER Enabled + Option to enable scavenge stale resource records on the zone. + + .PARAMETER RefreshInterval + Refresh interval for record scavencing in hours. Default value is 7 days. + + .PARAMETER NoRefreshInterval + No-refresh interval for record scavencing in hours. Default value is 7 days. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $Enabled, + + [Parameter()] + [System.UInt32] + $RefreshInterval = 168, + + [Parameter()] + [System.UInt32] + $NoRefreshInterval = 168 + ) + + $currentConfiguration = Get-TargetResource -Name $Name -Enabled $Enabled + + # Enable or disable zone aging + if ($currentConfiguration.Enabled -ne $Enabled) + { + if ($Enabled) + { + Write-Verbose -Message ($script:localizedData.EnableDnsZoneAgingMessage -f $Name) + } + else + { + Write-Verbose -Message ($script:localizedData.DisableDnsZoneAgingMessage -f $Name) + } + + Set-DnsServerZoneAging -Name $Name -Aging $Enabled -WarningAction 'SilentlyContinue' + } + + # Update the refresh interval + if ($PSBoundParameters.ContainsKey('RefreshInterval')) + { + if ($currentConfiguration.RefreshInterval -ne $RefreshInterval) + { + Write-Verbose -Message ($script:localizedData.SetDnsZoneRefreshIntervalMessage -f $RefreshInterval) + + $refreshIntervalTimespan = [System.TimeSpan]::FromHours($RefreshInterval) + + <# + Hide the following warning if aging is not enabled: Specified + parameters related to aging of records have been set. However, + aging was not enabled and hence the settings are ineffective. + #> + Set-DnsServerZoneAging -Name $Name -RefreshInterval $refreshIntervalTimespan -WarningAction 'SilentlyContinue' + } + } + + # Update the no refresh interval + if ($PSBoundParameters.ContainsKey('NoRefreshInterval')) + { + if ($currentConfiguration.NoRefreshInterval -ne $NoRefreshInterval) + { + Write-Verbose -Message ($script:localizedData.SetDnsZoneNoRefreshIntervalMessage -f $NoRefreshInterval) + + $noRefreshIntervalTimespan = [System.TimeSpan]::FromHours($NoRefreshInterval) + + <# + Hide the following warning if aging is not enabled: Specified + parameters related to aging of records have been set. However, + aging was not enabled and hence the settings are ineffective. + #> + Set-DnsServerZoneAging -Name $Name -NoRefreshInterval $noRefreshIntervalTimespan -WarningAction 'SilentlyContinue' + } + } +} + +<# + .SYNOPSIS + Test the DNS zone aging settings. + + .PARAMETER Name + Name of the DNS forward or reverse loookup zone. + + .PARAMETER Enabled + Option to enable scavenge stale resource records on the zone. + + .PARAMETER RefreshInterval + Refresh interval for record scavencing in hours. Default value is 7 days. + + .PARAMETER NoRefreshInterval + No-refresh interval for record scavencing in hours. Default value is 7 days. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $Enabled, + + [Parameter()] + [System.UInt32] + $RefreshInterval = 168, + + [Parameter()] + [System.UInt32] + $NoRefreshInterval = 168 + ) + + Write-Verbose -Message ($script:localizedData.TestingDnsZoneAgingMessage -f $Name) + + $currentConfiguration = Get-TargetResource -Name $Name -Enabled $Enabled + + $isDesiredState = $currentConfiguration.Enabled -eq $Enabled + + if ($PSBoundParameters.ContainsKey('RefreshInterval')) + { + $isDesiredState = $isDesiredState -and $currentConfiguration.RefreshInterval -eq $RefreshInterval + } + + if ($PSBoundParameters.ContainsKey('NoRefreshInterval')) + { + $isDesiredState = $isDesiredState -and $currentConfiguration.NoRefreshInterval -eq $NoRefreshInterval + } + + return $isDesiredState +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/DSC_DnsServerZoneAging.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/DSC_DnsServerZoneAging.schema.mof new file mode 100644 index 0000000..6914f4d --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/DSC_DnsServerZoneAging.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerZoneAging")] +class DSC_DnsServerZoneAging : OMI_BaseResource +{ + [Key, Description("Name of the DNS forward or reverse lookup zone.")] String Name; + [Required, Description("Option to enable scavenge stale resource records on the zone.")] Boolean Enabled; + [Write, Description("Refresh interval for record scavenging in hours. Default value is `168`, 7 days.")] UInt32 RefreshInterval; + [Write, Description("No-refresh interval for record scavenging in hours. Default value is `168`, 7 days.")] UInt32 NoRefreshInterval; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/README.md new file mode 100644 index 0000000..89130ae --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/README.md @@ -0,0 +1,5 @@ +# Description + +The DnsServerZoneAging DSC resource manages aging settings for a Domain Name System (DNS) server zone. + +A resource record can remain on a DNS server after the resource is no longer part of the network. Aging settings determine when a record can be removed, or scavenged, as a stale record. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/en-US/DSC_DnsServerZoneAging.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/en-US/DSC_DnsServerZoneAging.strings.psd1 new file mode 100644 index 0000000..b68f180 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/en-US/DSC_DnsServerZoneAging.strings.psd1 @@ -0,0 +1,9 @@ +# culture="en-US" +ConvertFrom-StringData @' + GettingDnsZoneAgingMessage = Getting the DNS zone aging for {0}. + EnableDnsZoneAgingMessage = Enable DNS zone aging on {0}. + DisableDnsZoneAgingMessage = Disable DNS zone aging on {0}. + SetDnsZoneRefreshIntervalMessage = Set DNS zone refresh interval to {0} hours. + SetDnsZoneNoRefreshIntervalMessage = Set DNS zone no refresh interval to {0} hours. + TestingDnsZoneAgingMessage = Testing the DNS zone aging for {0}. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/en-US/about_DnsServerZoneAging.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/en-US/about_DnsServerZoneAging.help.txt new file mode 100644 index 0000000..f1441fc --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneAging/en-US/about_DnsServerZoneAging.help.txt @@ -0,0 +1,64 @@ +.NAME + DnsServerZoneAging + +.DESCRIPTION + The DnsServerZoneAging DSC resource manages aging settings for a Domain Name System (DNS) server zone. + + A resource record can remain on a DNS server after the resource is no longer part of the network. Aging settings determine when a record can be removed, or scavenged, as a stale record. + +.PARAMETER Name + Key - String + Name of the DNS forward or reverse lookup zone. + +.PARAMETER Enabled + Required - Boolean + Option to enable scavenge stale resource records on the zone. + +.PARAMETER RefreshInterval + Write - UInt32 + Refresh interval for record scavenging in hours. Default value is 168, 7 days. + +.PARAMETER NoRefreshInterval + Write - UInt32 + No-refresh interval for record scavenging in hours. Default value is 168, 7 days. + +.EXAMPLE 1 + +This configuration will manage aging of a DNS forward zone + +Configuration DnsServerZoneAging_forward_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerZoneAging 'DnsServerZoneAging' + { + Name = 'contoso.com' + Enabled = $true + RefreshInterval = 120 # 5 days + NoRefreshInterval = 240 # 10 days + } + } +} + +.EXAMPLE 2 + +This configuration will manage aging of a DNS reverse zone + +Configuration DnsServerZoneAging_reverse_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerZoneAging 'DnsServerReverseZoneAging' + { + Name = '168.192.in-addr-arpa' + Enabled = $true + RefreshInterval = 168 # 7 days + NoRefreshInterval = 168 # 7 days + } + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/DSC_DnsServerZoneScope.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/DSC_DnsServerZoneScope.psm1 new file mode 100644 index 0000000..2825348 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/DSC_DnsServerZoneScope.psm1 @@ -0,0 +1,144 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + This will return the current state of the resource. + + .PARAMETER Name + Specifies the name of the Zone Scope. + + .PARAMETER ZoneName + Specify the existing DNS Zone to add a scope to. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $ZoneName + + ) + + Write-Verbose -Message ($script:localizedData.GettingDnsServerZoneScopeMessage -f $Name, $ZoneName) + $record = Get-DnsServerZoneScope -Name $Name -ZoneName $ZoneName -ErrorAction SilentlyContinue + + if ($null -eq $record) + { + return @{ + Name = $Name + ZoneName = $ZoneName + ZoneFile = $null + Ensure = 'Absent' + } + } + + return @{ + Name = $record.ZoneScope + ZoneName = $record.ZoneName + ZoneFile = $record.FileName + Ensure = 'Present' + } +} #end function Get-TargetResource + +<# + .SYNOPSIS + This will configure the resource. + + .PARAMETER Name + Specifies the name of the Zone Scope. + + .PARAMETER ZoneName + Specify the existing DNS Zone to add a scope to. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $ZoneName, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + $clientSubnet = Get-DnsServerZoneScope -Name $Name -ZoneName $ZoneName -ErrorAction SilentlyContinue + if ($Ensure -eq 'Present') + { + if (!$clientSubnet) + { + Write-Verbose -Message ($script:localizedData.CreatingDnsServerZoneScopeMessage -f $Name, $ZoneName) + Add-DnsServerZoneScope -ZoneName $ZoneName -Name $Name + } + } + elseif ($Ensure -eq 'Absent') + { + Write-Verbose -Message ($script:localizedData.RemovingDnsServerZoneScopeMessage -f $Name, $ZoneName) + Remove-DnsServerZoneScope -Name $Name -ZoneName $ZoneName + } +} #end function Set-TargetResource + +<# + .SYNOPSIS + This will return whether the resource is in desired state. + + .PARAMETER Name + Specifies the name of the Zone Scope. + + .PARAMETER ZoneName + Specify the existing DNS Zone to add a scope to. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $ZoneName, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + $result = Get-TargetResource -Name $Name -ZoneName $ZoneName + + if ($Ensure -ne $result.Ensure) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f 'Ensure', $Ensure, $result.Ensure) + Write-Verbose -Message ($script:localizedData.NotInDesiredStateMessage -f $Name) + return $false + } + + Write-Verbose -Message ($script:localizedData.InDesiredStateMessage -f $Name) + return $true +} #end function Test-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/DSC_DnsServerZoneScope.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/DSC_DnsServerZoneScope.schema.mof new file mode 100644 index 0000000..6c1b735 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/DSC_DnsServerZoneScope.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerZoneScope")] +class DSC_DnsServerZoneScope : OMI_BaseResource +{ + [Key, Description("Specifies the name of the Zone Scope.")] string Name; + [Key, Description("Specify the existing DNS Zone to add a scope to.")] string ZoneName; + [Write, Description("Should this DNS Server Zone Scope be present or absent"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Read, Description("Returns the zone scope filename.")] string ZoneFile; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/README.md new file mode 100644 index 0000000..394a94f --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/README.md @@ -0,0 +1,9 @@ +# Description + +The DnsServerZoneScope DSC resource manages the zone scope on an existing zone on the Domain Name System (DNS) server + +The name of the scope should adhere to the same conventions as the zone name. The scope name cannot be same as the zone name to which it is attached. + +## Requirements + +- Target machine must be running Windows Server 2016 or later. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/en-US/DSC_DnsServerZoneScope.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/en-US/DSC_DnsServerZoneScope.strings.psd1 new file mode 100644 index 0000000..37ddd46 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/en-US/DSC_DnsServerZoneScope.strings.psd1 @@ -0,0 +1,9 @@ +# culture="en-US" +ConvertFrom-StringData @' + GettingDnsServerZoneScopeMessage = Getting DNS Server Zone Scope '{0}' in '{1}'. + CreatingDnsServerZoneScopeMessage = Creating DNS Server Zone Scope '{0}' in '{1}'. + RemovingDnsServerZoneScopeMessage = Removing DNS Server Zone Scope '{0}' from '{1}'. + NotDesiredPropertyMessage = DNS Server Zone Scope property '{0}' is not correct. Expected '{1}', actual '{2}' + InDesiredStateMessage = DNS Server Zone Scope '{0}' is in the desired state. + NotInDesiredStateMessage = DNS Server Zone Scope '{0}' is NOT in the desired state. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/en-US/about_DnsServerZoneScope.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/en-US/about_DnsServerZoneScope.help.txt new file mode 100644 index 0000000..d2f52df --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneScope/en-US/about_DnsServerZoneScope.help.txt @@ -0,0 +1,45 @@ +.NAME + DnsServerZoneScope + +.DESCRIPTION + The DnsServerZoneScope DSC resource manages the zone scope on an existing zone on the Domain Name System (DNS) server + + The name of the scope should adhere to the same conventions as the zone name. The scope name cannot be same as the zone name to which it is attached. + + ## Requirements + + - Target machine must be running Windows Server 2016 or later. + +.PARAMETER Name + Key - String + Specifies the name of the Zone Scope. + +.PARAMETER ZoneName + Key - String + Specify the existing DNS Zone to add a scope to. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Should this DNS Server Zone Scope be present or absent + +.PARAMETER ZoneFile + Read - String + Returns the zone scope filename. + +.EXAMPLE 1 + +This configuration will manage a DNS zone scope + +Configuration DnsServerZoneScope_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + DnsServerZoneScope 'ZoneScope1' + { + Name = 'contoso_NorthAmerica' + ZoneName = 'contoso.com' + Ensure = 'Present' + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/DSC_DnsServerZoneTransfer.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/DSC_DnsServerZoneTransfer.psm1 new file mode 100644 index 0000000..1237f1f --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/DSC_DnsServerZoneTransfer.psm1 @@ -0,0 +1,238 @@ +$script:dscResourceCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' +$script:dnsServerDscCommonPath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DnsServerDsc.Common' + +Import-Module -Name $script:dscResourceCommonPath +Import-Module -Name $script:dnsServerDscCommonPath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +# Allow transfer to any server use 0, to one in name tab 1, specific one 2, no transfer 3 +$XferId2Name= @('Any','Named','Specific','None') + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("None","Any","Named","Specific")] + [System.String] + $Type + ) + +#region Input Validation + + # Check for DnsServer module/role + Assert-Module -ModuleName 'DnsServer' + +#endregion + Write-Verbose -Message 'Getting DNS zone.' + $currentZone = Get-CimInstance ` + -ClassName MicrosoftDNS_Zone ` + -Namespace root\MicrosoftDNS ` + -Verbose:$false | Where-Object -FilterScript {$_.Name -eq $Name} + + @{ + Name = $Name + Type = $XferId2Name[$currentZone.SecureSecondaries] + SecondaryServer = $currentZone.SecondaryServers + } +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("None","Any","Named","Specific")] + [System.String] + $Type, + + [Parameter()] + [String[]] + $SecondaryServer + ) + Write-Verbose -Message 'Setting DNS zone.' + if ($PSBoundParameters.ContainsKey('Debug')) + { + $null = $PSBoundParameters.Remove('Debug') + } + Test-ResourceProperties @PSBoundParameters -Apply + + # Restart the DNS service + Restart-Service -Name DNS +} + + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("None","Any","Named","Specific")] + [System.String] + $Type, + + [Parameter()] + [String[]] + $SecondaryServer + ) + +#region Input Validation + + # Check for DnsServer module/role + Assert-Module -ModuleName 'DnsServer' + +#endregion + Write-Verbose -Message 'Validating DNS zone.' + if ($PSBoundParameters.ContainsKey('Debug')) + { + $null = $PSBoundParameters.Remove('Debug') + } + Test-ResourceProperties @PSBoundParameters +} + +function Test-ResourceProperties +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("None","Any","Named","Specific")] + [System.String] + $Type, + + [Parameter()] + [String[]] + $SecondaryServer, + + [Parameter()] + [Switch] + $Apply + ) + + $checkZoneMessage = $($script:localizedData.CheckingZoneMessage) ` + -f $Name + Write-Verbose -Message $checkZoneMessage + + # Get the current value of transfer zone + $currentZone = Get-CimInstance ` + -ClassName MicrosoftDNS_Zone ` + -Namespace root\MicrosoftDNS ` + -Verbose:$false | Where-Object -FilterScript {$_.Name -eq $Name} + $currentZoneTransfer = $currentZone.SecureSecondaries + + # Hashtable with 2 keys: SecureSecondaries,SecondaryServers + $Arguments = @{} + + switch ($Type) + { + 'None' + { + $Arguments['SecureSecondaries'] = 3 + } + 'Any' + { + $Arguments['SecureSecondaries'] = 0 + } + 'Named' + { + $Arguments['SecureSecondaries'] = 1 + } + 'Specific' + { + $Arguments['SecureSecondaries'] = 2 + $Arguments['SecondaryServers']=$SecondaryServer + } + } + + # Check the current value against expected value + if ($currentZoneTransfer -eq $Arguments.SecureSecondaries) + { + $desiredZoneMessage = ($script:localizedData.DesiredZoneMessage) ` + -f $XferId2Name[$currentZoneTransfer] + Write-Verbose -Message $desiredZoneMessage + + # If the Type is specific, and SecondaryServer doesn't match + if (($currentZoneTransfer -eq 2) ` + -and (Compare-Object $currentZone.SecondaryServers $SecondaryServer)) + { + $notDesiredPropertyMessage = ($script:localizedData.NotDesiredPropertyMessage) ` + -f ($SecondaryServer -join ','),($currentZone.SecondaryServers -join ',') + Write-Verbose -Message $notDesiredPropertyMessage + + # Set the SecondaryServer property + if ($Apply) + { + $settingPropertyMessage = ($script:localizedData.SettingPropertyMessage) ` + -f ($SecondaryServer -join ',') + Write-Verbose -Message $settingPropertyMessage + + $null = Invoke-CimMethod ` + -InputObject $currentZone ` + -MethodName ResetSecondaries ` + -Arguments $Arguments ` + -Verbose:$false + + $setPropertyMessage = $script:localizedData.SetPropertyMessage + Write-Verbose -Message $setPropertyMessage + } + else + { + return $false + } + } # end SecondaryServer match + + if (-not $Apply) + { + return $true + } + } # end currentZoneTransfer -eq ExpectedZoneTransfer + else + { + $notDesiredZoneMessage = $($script:localizedData.NotDesiredZoneMessage) ` + -f $XferId2Name[$Arguments.SecureSecondaries], ` + $XferId2Name[$currentZoneTransfer] + Write-Verbose -Message $notDesiredZoneMessage + + if ($Apply) + { + $null = Invoke-CimMethod ` + -InputObject $currentZone ` + -MethodName ResetSecondaries ` + -Arguments $Arguments ` + -Verbose:$false + + $setZoneMessage = $($script:localizedData.SetZoneMessage) ` + -f $Name,$XferId2Name[$Arguments.SecureSecondaries] + Write-Verbose -Message $setZoneMessage + } + else + { + return $false + } + } # end currentZoneTransfer -ne ExpectedZoneTransfer +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/DSC_DnsServerZoneTransfer.schema.mof b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/DSC_DnsServerZoneTransfer.schema.mof new file mode 100644 index 0000000..cedda4b --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/DSC_DnsServerZoneTransfer.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsServerZoneTransfer")] +class DSC_DnsServerZoneTransfer : OMI_BaseResource +{ + [Key, Description("Name of the DNS zone")] String Name; + [Required, Description("Type of transfer allowed"), ValueMap{"None","Any","Named","Specific"}, Values{"None","Any","Named","Specific"}] String Type; + [Write, Description("IP address or DNS name of DNS servers where zone information can be transferred")] String SecondaryServer[]; +}; diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/README.md b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/README.md new file mode 100644 index 0000000..137fb2c --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/README.md @@ -0,0 +1,3 @@ +# Description + +The DnsServerZoneTransfer DSC resource manages the replication settings of DNS Server zone data between servers. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/en-US/DSC_DnsServerZoneTransfer.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/en-US/DSC_DnsServerZoneTransfer.strings.psd1 new file mode 100644 index 0000000..2f634c2 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/en-US/DSC_DnsServerZoneTransfer.strings.psd1 @@ -0,0 +1,10 @@ +# culture="en-US" +ConvertFrom-StringData @' + CheckingZoneMessage = Checking the current zone transfer for DNS server zone {0} ... + DesiredZoneMessage = Current zone transfer settings for the given DNS server zone is correctly set to {0} + NotDesiredZoneMessage = DNS server zone transfer settings is not correct. Expected {0}, actual {1} + SetZoneMessage = Current zone transfer setting for DNS server zone {0} is set to {1} + NotDesiredPropertyMessage = DNS server zone transfer secondary servers are not correct. Expected {0}, actual {1} + SettingPropertyMessage = Setting DNS server zone transfer secondary servers to {0} ... + SetPropertyMessage = DNS server zone transfer secondary servers are set +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/en-US/about_DnsServerZoneTransfer.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/en-US/about_DnsServerZoneTransfer.help.txt new file mode 100644 index 0000000..7013912 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DSCResources/DSC_DnsServerZoneTransfer/en-US/about_DnsServerZoneTransfer.help.txt @@ -0,0 +1,34 @@ +.NAME + DnsServerZoneTransfer + +.DESCRIPTION + The DnsServerZoneTransfer DSC resource manages the replication settings of DNS Server zone data between servers. + +.PARAMETER Name + Key - String + Name of the DNS zone + +.PARAMETER Type + Required - String + Allowed values: None, Any, Named, Specific + Type of transfer allowed + +.PARAMETER SecondaryServer + Write - StringArray + IP address or DNS name of DNS servers where zone information can be transferred + +.EXAMPLE 1 + +This configuration will manage a DNS zone transfer + +Configuration DnsServerZoneTransfer_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + DnsServerZoneTransfer 'TransferToAnyServer' + { + Name = 'demo.contoso.com' + Type = 'Any' + } +} + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DnsServerDsc.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DnsServerDsc.psd1 new file mode 100644 index 0000000..f035581 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DnsServerDsc.psd1 @@ -0,0 +1,192 @@ +@{ + # Version number of this module. + moduleVersion = '3.0.0' + + # ID used to uniquely identify this module + GUID = '5f70e6a1-f1b2-4ba0-8276-8967d43a7ec2' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'This module contains DSC resources for the management and configuration of Windows Server DNS Server.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '5.0' + + # Script module or binary module file associated with this manifest. + RootModule = 'DnsServerDsc.psm1' + + # Functions to export from this module + FunctionsToExport = @() + + # Cmdlets to export from this module + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module + AliasesToExport = @() + + DscResourcesToExport = @('DnsRecordCname','DnsRecordPtr','DnsRecordA','DnsRecordAaaa','DnsRecordCnameScoped','DnsRecordMx','DnsRecordNs','DnsRecordSrv','DnsServerCache','DnsServerDsSetting','DnsServerEDns','DnsServerRecursion','DnsServerScavenging','DnsRecordAaaaScoped','DnsRecordAScoped','DnsRecordMxScoped','DnsRecordNsScoped','DnsRecordSrvScoped','DnsServerADZone','DnsServerClientSubnet','DnsServerConditionalForwarder','DnsServerDiagnostics','DnsServerForwarder','DnsServerPrimaryZone','DnsServerRootHint','DnsServerSecondaryZone','DnsServerSetting','DnsServerSettingLegacy','DnsServerZoneAging','DnsServerZoneScope','DnsServerZoneTransfer') + + <# + Private data to pass to the module specified in RootModule/ModuleToProcess. + This may also contain a PSData hashtable with additional module metadata used by PowerShell. + #> + PrivateData = @{ + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/DnsServerDsc/blob/main/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/DnsServerDsc' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [3.0.0] - 2021-05-26 + +### Removed + +- xDnsRecord + - BREAKING CHANGE: The resource has been replaced by _DnsServerA_, _DnsServerPtr_, + and _DnsServerCName_ ([issue #221](https://github.com/dsccommunity/DnsServerDsc/issues/221)). +- xDnsServerMx + - BREAKING CHANGE: The resource has been replaced by _DnsServerMx_ ([issue #228](https://github.com/dsccommunity/DnsServerDsc/issues/228)). +- DnsServerSetting + - BREAKING CHANGE: The properties `Forwarders` and `ForwardingTimeout` has + been removed ([issue #192](https://github.com/dsccommunity/DnsServerDsc/issues/192)). + Use the resource _DnsServerForwarder_ to enforce these properties. + - BREAKING CHANGE: The properties `EnableEDnsProbes` and `EDnsCacheTimeout` has + been removed ([issue #195](https://github.com/dsccommunity/DnsServerDsc/issues/195)). + Use the resource _DnsServerEDns_ to enforce these properties. + - BREAKING CHANGE: The properties `SecureResponses`, `MaxCacheTTL`, and + `MaxNegativeCacheTTL` has been removed ([issue #197](https://github.com/dsccommunity/DnsServerDsc/issues/197)). + To enforce theses properties, use resource _DnsServerEDns_ using the + properties `EnablePollutionProtection`, `MaxTtl`, and `MaxNegativeTtl` + respectively. + - BREAKING CHANGE: The properties `DefaultAgingState`, `ScavengingInterval`, + `DefaultNoRefreshInterval`, and `DefaultRefreshInterval` have been removed. + Use the resource _DnsServerScavenging_ to enforce this properties ([issue #193](https://github.com/dsccommunity/DnsServerDsc/issues/193)). + - BREAKING CHANGE: The properties `NoRecursion`, `RecursionRetry`, and + `RecursionTimeout` has been removed ([issue #200](https://github.com/dsccommunity/DnsServerDsc/issues/200)). + To enforce theses properties, use resource _DnsServerRecursion_ using the + properties `Enable`, `RetryInterval`, and `Timeout` respectively. + - BREAKING CHANGE: A few properties that are not supported by any DNS + Server PowerShell cmdlet was moved to the new resource _DnsServerSettingLegacy_. + - BREAKING CHANGE: The properties `DsPollingInterval` and `DsTombstoneInterval` + has been removed ([issue #252](https://github.com/dsccommunity/DnsServerDsc/issues/252)). + Use the resource _DnsServerDsSetting_ to enforce these properties. + +- ResourceBase + - For the method `Get()` the overload that took a `[Microsoft.Management.Infrastructure.CimInstance]` + was removed as it is not the correct pattern going forward. + +### Added + +- DnsServerDsc + - Added new resource + - _DnsServerCache_ - resource to enforce cache settings ([issue #196](https://github.com/dsccommunity/DnsServerDsc/issues/196)). + - _DnsServerRecursion_ - resource to enforce recursion settings ([issue #198](https://github.com/dsccommunity/DnsServerDsc/issues/198)). + - Added new private function `Get-ClassName` that returns the class name + or optionally an array with the class name and all inherited base class + named. + - Added new private function `Get-LocalizedDataRecursive` that gathers + all localization strings from an array of class names. This can be used + in classes to be able to inherit localization strings from one or more + base class. If a localization string key exist in a parent class''s + localization string file it will override the localization string key + in any base class. + - Fixed code coverage in the pipeline ([issue #246](https://github.com/dsccommunity/DnsServerDsc/issues/246)). +- ResourceBase + - Added new method `Assert()` tha calls `Assert-Module` and `AssertProperties()`. +- DnsRecordNs + - Added new resource to manage NS records +- DnsRecordNsScoped + - Added new resource to manage scoped NS records +- DnsServerDsSetting + - Added new resource to manage AD-integrated DNS settings +- DnsServerSettingLegacy + - A new resource to manage legacy DNS Server settings that are not supported + by any DNS Server PowerShell cmdlet. + +### Changed + +- DnsServerDsc + - BREAKING CHANGE: Renamed the module to DnsServerDsc ([issue #179](https://github.com/dsccommunity/DnsServerDsc/issues/179)). + - BREAKING CHANGE: Removed the prefix ''x'' from all MOF-based resources + ([issue #179](https://github.com/dsccommunity/DnsServerDsc/issues/179)). + - Renamed a MOF-based resource to use the prefix ''DSC'' ([issue #225](https://github.com/dsccommunity/DnsServerDsc/issues/225)). + - Fix stub `Get-DnsServerResourceRecord` so it throws if it is not mocked + correctly ([issue #204](https://github.com/dsccommunity/DnsServerDsc/issues/204)). + - Switch the order in the deploy pipeline so that creating the GitHub release + is made after a successful release. + - Updated stub functions to throw if they are used (when missing a mock in + unit test) ([issue #235](https://github.com/dsccommunity/DnsServerDsc/issues/235)). +- ResourceBase + - Added support for inherit localization strings and also able to override + a localization string that exist in a base class. + - Moved more logic from the resources into the base class for the method + `Test()`, `Get()`, and `Set()`. The base class now have three methods + `AssertProperties()`, `Modify()`, and `GetCurrentState()` where the + two latter ones must be overridden by a resource if calling the base + methods `Set()` and `Get()`. + - Moved the `Assert-Module` from the constructor to a new method `Assert()` + that is called from `Get()`, `Test()`, and `Set()`. The method `Assert()` + also calls the method `AssertProperties()`. The method `Assert()` is not + meant to be overridden, but can if there is a reason not to run + `Assert-Module` and or `AssertProperties()`. +- Integration tests + - Added commands in the DnsRecord* integration tests to wait for the LCM + before moving to the next test. +- DnsServerCache + - Moved to the same coding pattern as _DnsServerRecursion_. +- DnsServerEDns + - Moved to the same coding pattern as _DnsServerRecursion_. +- DnsServerScavenging + - Moved to the same coding pattern as _DnsServerRecursion_. +- DnsServerSetting + - Changed to use `Get-DnsServerSetting` and `Set-DnsServerSetting` + ([issue #185](https://github.com/dsccommunity/xDnsServer/issues/185)). + - BREAKING CHANGE: The property `DisableAutoReverseZones` have been renamed + to `DisableAutoReverseZone`. + - BREAKING CHANGE: The property `ListenAddresses` have been renamed + to `ListeningIPAddress`. + - BREAKING CHANGE: The property `AllowUpdate` was changed to a boolean + value (`$true` or `$false`) since that is what the cmdlet `Set-DnsServerSetting` + is expecting (related to [issue #101](https://github.com/dsccommunity/xDnsServer/issues/101)). + - BREAKING CHANGE: The property `EnableDnsSec` was changed to a boolean + value (`$true` or `$false`) since that is what the cmdlet `Set-DnsServerSetting` + is expecting. + - BREAKING CHANGE: The property `ForwardDelegations` was changed to a boolean + value (`$true` or `$false`) since that is what the cmdlet `Set-DnsServerSetting` + is expecting. + +### Fixed + +- Logic bug in DnsRecordPtr.expandIPv6String($string) (#255) + - Supporting tests added + +' + } # End of PSData hashtable + } # End of PrivateData hashtable +} + + + + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DnsServerDsc.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DnsServerDsc.psm1 new file mode 100644 index 0000000..98e405f --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/DnsServerDsc.psm1 @@ -0,0 +1,3044 @@ +#Region './prefix.ps1' 0 +# Import nested, 'DscResource.Common' module +$script:dscResourceCommonModulePath = Join-Path -Path $PSScriptRoot -ChildPath 'Modules\DscResource.Common' +Import-Module -Name $script:dscResourceCommonModulePath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' +#EndRegion './prefix.ps1' 6 +#Region './Enum/1.Ensure.ps1' 0 +enum Ensure +{ + Present + Absent +} +#EndRegion './Enum/1.Ensure.ps1' 6 +#Region './Classes/001.ResourceBase.ps1' 0 +<# + .SYNOPSIS + A class with methods that are equal for all class-based resources. + + .DESCRIPTION + A class with methods that are equal for all class-based resources. + + .NOTES + This class should not contain any DSC properties. +#> + +class ResourceBase +{ + # Hidden property for holding localization strings + hidden [System.Collections.Hashtable] $localizedData = @{} + + # Default constructor + ResourceBase() + { + $this.localizedData = Get-LocalizedDataRecursive -ClassName ($this | Get-ClassName -Recurse) + } + + [ResourceBase] Get() + { + $this.Assert() + + Write-Verbose -Message ($this.localizedData.GetCurrentState -f $this.DnsServer, $this.GetType().Name) + + # Get all key properties. + $keyProperty = $this | + Get-Member -MemberType 'Property' | + Select-Object -ExpandProperty Name | + Where-Object -FilterScript { + $this.GetType().GetMember($_).CustomAttributes.Where( { $_.NamedArguments.MemberName -eq 'Key' }).NamedArguments.TypedValue.Value -eq $true + } + + $getParameters = @{} + + # Set each key property to its value (property DnsServer is handled below). + $keyProperty | + Where-Object -FilterScript { + $_ -ne 'DnsServer' + } | + ForEach-Object -Process { + $getParameters[$_] = $this.$_ + } + + # Set ComputerName depending on value of DnsServer. + if ($this.DnsServer -ne 'localhost') + { + $getParameters['ComputerName'] = $this.DnsServer + } + + $getCurrentStateResult = $this.GetCurrentState($getParameters) + + $dscResourceObject = [System.Activator]::CreateInstance($this.GetType()) + + foreach ($propertyName in $this.PSObject.Properties.Name) + { + if ($propertyName -in @($getCurrentStateResult.PSObject.Properties.Name)) + { + $dscResourceObject.$propertyName = $getCurrentStateResult.$propertyName + } + } + + # Always set this as it won't be in the $getCurrentStateResult + $dscResourceObject.DnsServer = $this.DnsServer + + # Return properties. + return $dscResourceObject + } + + [void] Set() + { + $this.Assert() + + Write-Verbose -Message ($this.localizedData.SetDesiredState -f $this.DnsServer, $this.GetType().Name) + + # Call the Compare method to get enforced properties that are not in desired state. + $propertiesNotInDesiredState = $this.Compare() + + if ($propertiesNotInDesiredState) + { + $propertiesToModify = $this.GetDesiredStateForSplatting($propertiesNotInDesiredState) + + $propertiesToModify.Keys | ForEach-Object -Process { + Write-Verbose -Message ($this.localizedData.SetProperty -f $_, $propertiesToModify.$_, $this.GetType().Name) + } + + if ($this.DnsServer -ne 'localhost') + { + $propertiesToModify['ComputerName'] = $this.DnsServer + } + + <# + Call the Modify() method with the properties that should be enforced + and was not in desired state. + #> + $this.Modify($propertiesToModify) + } + else + { + Write-Verbose -Message $this.localizedData.NoPropertiesToSet + } + } + + [System.Boolean] Test() + { + Write-Verbose -Message ($this.localizedData.TestDesiredState -f $this.DnsServer, $this.GetType().Name) + + $this.Assert() + + $isInDesiredState = $true + + <# + Returns all enforced properties not in desires state, or $null if + all enforced properties are in desired state. + #> + $propertiesNotInDesiredState = $this.Compare() + + if ($propertiesNotInDesiredState) + { + $isInDesiredState = $false + } + + if ($isInDesiredState) + { + Write-Verbose -Message ($this.localizedData.InDesiredState -f $this.DnsServer, $this.GetType().Name) + } + else + { + Write-Verbose -Message ($this.localizedData.NotInDesiredState -f $this.DnsServer, $this.GetType().Name) + } + + return $isInDesiredState + } + + <# + Returns a hashtable containing all properties that should be enforced. + This method should normally not be overridden. + #> + hidden [System.Collections.Hashtable[]] Compare() + { + $currentState = $this.Get() | ConvertTo-HashTableFromObject + $desiredState = $this | ConvertTo-HashTableFromObject + + <# + Remove properties that have $null as the value, and remove read + properties so that there is no chance to compare those. + #> + @($desiredState.Keys) | ForEach-Object -Process { + $isReadProperty = $this.GetType().GetMember($_).CustomAttributes.Where( { $_.NamedArguments.MemberName -eq 'NotConfigurable' }).NamedArguments.TypedValue.Value -eq $true + + if ($isReadProperty -or $null -eq $desiredState[$_]) + { + $desiredState.Remove($_) + } + } + + $CompareDscParameterState = @{ + CurrentValues = $currentState + DesiredValues = $desiredState + Properties = $desiredState.Keys + ExcludeProperties = @('DnsServer') + IncludeValue = $true + } + + <# + Returns all enforced properties not in desires state, or $null if + all enforced properties are in desired state. + #> + return (Compare-DscParameterState @CompareDscParameterState) + } + + # Returns a hashtable containing all properties that should be enforced. + hidden [System.Collections.Hashtable] GetDesiredStateForSplatting([System.Collections.Hashtable[]] $Properties) + { + $desiredState = @{} + + $Properties | ForEach-Object -Process { + $desiredState[$_.Property] = $_.ExpectedValue + } + + return $desiredState + } + + # This method should normally not be overridden. + hidden [void] Assert() + { + Assert-Module -ModuleName 'DnsServer' + + $this.AssertProperties() + } + + # This method can be overridden if resource specific asserts are needed. + hidden [void] AssertProperties() + { + } + + # This method must be overridden by a resource. + hidden [void] Modify([System.Collections.Hashtable] $properties) + { + throw $this.localizedData.ModifyMethodNotImplemented + } + + # This method must be overridden by a resource. + hidden [Microsoft.Management.Infrastructure.CimInstance] GetCurrentState([System.Collections.Hashtable] $properties) + { + throw $this.localizedData.GetCurrentStateMethodNotImplemented + } +} +#EndRegion './Classes/001.ResourceBase.ps1' 212 +#Region './Classes/001.ResourcePropertiesBase.ps1' 0 +<# + .SYNOPSIS + A class with DSC properties that are equal for all class-based resources. + + .DESCRIPTION + A class with DSC properties that are equal for all class-based resources. + + .PARAMETER DnsServer + The host name of the Domain Name System (DNS) server, or use 'localhost' + for the current node. Defaults to `'localhost'`. +#> + +class ResourcePropertiesBase +{ + [DscProperty()] + [System.String] + $DnsServer = 'localhost' +} +#EndRegion './Classes/001.ResourcePropertiesBase.ps1' 19 +#Region './Classes/002.DnsRecordBase.ps1' 0 +<# + .SYNOPSIS + A DSC Resource for MS DNS Server that is not exposed to end users representing the common fields available to all resource records. + + .DESCRIPTION + A DSC Resource for MS DNS Server that is not exposed to end users representing the common fields available to all resource records. + + .PARAMETER ZoneName + Specifies the name of a DNS zone. (Key Parameter) + + .PARAMETER TimeToLive + Specifies the TimeToLive value of the SRV record. Value must be in valid TimeSpan string format (i.e.: Days.Hours:Minutes:Seconds.Miliseconds or 30.23:59:59.999). + + .PARAMETER Ensure + Whether the host record should be present or removed. +#> + +class DnsRecordBase : ResourcePropertiesBase +{ + [DscProperty(Key)] + [System.String] + $ZoneName + + [DscProperty()] + [System.String] + $TimeToLive + + [DscProperty()] + [Ensure] + $Ensure = [Ensure]::Present + + # Hidden property to determine whether the class is a scoped version + hidden [System.Boolean] $isScoped + + # Hidden property for holding localization strings + hidden [System.Collections.Hashtable] $localizedData + + # Hidden method to integrate localized strings from classes up the inheritance stack + hidden [void] SetLocalizedData() + { + # Create a list of the inherited class names + $inheritedClasses = @(,$this.GetType().Name) + $parentClass = $this.GetType().BaseType + while ($parentClass -ne [System.Object]) + { + $inheritedClasses += $parentClass.Name + $parentClass = $parentClass.BaseType + } + + $this.localizedData = @{} + + foreach ($className in $inheritedClasses) + { + # Get localized data for the class + $localizationFile = "$($className).strings.psd1" + + try + { + $tmpData = Get-LocalizedData -DefaultUICulture 'en-US' -FileName $localizationFile -ErrorAction Stop + + # Append only previously unspecified keys in the localization data + foreach ($key in $tmpData.Keys) + { + if (-not $this.localizedData.ContainsKey($key)) + { + $this.localizedData[$key] = $tmpData[$key] + } + } + } + catch + { + if ($_.CategoryInfo.Category.ToString() -eq 'ObjectNotFound') + { + Write-Warning $_.Exception.Message + } + else + { + throw $_ + } + } + } + + Write-Debug ($this.localizedData | ConvertTo-JSON) + } + + # Default constructor sets the $isScoped variable and loads the localization strings + DnsRecordBase() + { + # Determine scope + $this.isScoped = $this.PSObject.Properties.Name -contains 'ZoneScope' + + # Import the localization strings + $this.SetLocalizedData() + } + + #region Generic DSC methods -- DO NOT OVERRIDE + + [DnsRecordBase] Get() + { + Write-Verbose -Message ($this.localizedData.GettingDscResourceObject -f $this.GetType().Name) + + $dscResourceObject = $null + + $record = $this.GetResourceRecord() + + if ($null -eq $record) + { + Write-Verbose -Message $this.localizedData.RecordNotFound + + <# + Create an object of the correct type (i.e.: the subclassed resource type) + and set its values to those specified in the object, but set Ensure to Absent + #> + $dscResourceObject = [System.Activator]::CreateInstance($this.GetType()) + + foreach ($propertyName in $this.PSObject.Properties.Name) + { + $dscResourceObject.$propertyName = $this.$propertyName + } + + $dscResourceObject.Ensure = 'Absent' + } + else + { + Write-Verbose -Message $this.localizedData.RecordFound + + # Build an object reflecting the current state based on the record found + $dscResourceObject = $this.NewDscResourceObjectFromRecord($record) + } + + return $dscResourceObject + } + + [void] Set() + { + # Initialize dns cmdlet Parameters for removing a record + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + } + + # Accomodate for scoped records as well + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = ($this.PSObject.Properties | Where-Object -FilterScript { $_.Name -eq 'ZoneScope' }).Value + } + + $existingRecord = $this.GetResourceRecord() + + if ($this.Ensure -eq 'Present') + { + if ($null -ne $existingRecord) + { + $currentState = $this.Get() | ConvertTo-HashTableFromObject + $desiredState = $this | ConvertTo-HashTableFromObject + + # Remove properties that have $null as the value + @($desiredState.Keys) | ForEach-Object -Process { + if ($null -eq $desiredState[$_]) + { + $desiredState.Remove($_) + } + } + + # Returns all enforced properties not in desires state, or $null if all enforced properties are in desired state + $propertiesNotInDesiredState = Compare-DscParameterState -CurrentValues $currentState -DesiredValues $desiredState -Properties $desiredState.Keys -IncludeValue + + if ($null -ne $propertiesNotInDesiredState) + { + Write-Verbose -Message $this.localizedData.ModifyingExistingRecord + + $this.ModifyResourceRecord($existingRecord, $propertiesNotInDesiredState) + } + } + else + { + Write-Verbose -Message ($this.localizedData.AddingNewRecord -f $this.GetType().Name) + + # Adding record + $this.AddResourceRecord() + } + } + elseif ($this.Ensure -eq 'Absent') + { + if ($null -ne $existingRecord) + { + Write-Verbose -Message $this.localizedData.RemovingExistingRecord + + # Removing existing record + $existingRecord | Remove-DnsServerResourceRecord @dnsParameters -Force + } + } + } + + [System.Boolean] Test() + { + $isInDesiredState = $true + + $currentState = $this.Get() | ConvertTo-HashTableFromObject + $desiredState = $this | ConvertTo-HashTableFromObject + + if ($this.Ensure -eq 'Present') + { + if ($currentState.Ensure -eq 'Present') + { + # Remove properties that have $null as the value + @($desiredState.Keys) | ForEach-Object -Process { + if ($null -eq $desiredState[$_]) + { + $desiredState.Remove($_) + } + } + + # Returns all enforced properties not in desires state, or $null if all enforced properties are in desired state + $propertiesNotInDesiredState = Compare-DscParameterState -CurrentValues $currentState -DesiredValues $desiredState -Properties $desiredState.Keys -ExcludeProperties @('Ensure') + + if ($propertiesNotInDesiredState) + { + $isInDesiredState = $false + } + } + else + { + Write-Verbose -Message ($this.localizedData.PropertyIsNotInDesiredState -f 'Ensure', $desiredState['Ensure'], $currentState['Ensure']) + + $isInDesiredState = $false + } + } + + if ($this.Ensure -eq 'Absent') + { + if ($currentState['Ensure'] -eq 'Present') + { + Write-Verbose -Message ($this.localizedData.PropertyIsNotInDesiredState -f 'Ensure', $desiredState['Ensure'], $currentState['Ensure']) + + $isInDesiredState = $false + } + } + + if ($isInDesiredState) + { + Write-Verbose -Message $this.localizedData.ObjectInDesiredState + } + else + { + Write-Verbose -Message $this.localizedData.ObjectNotInDesiredState + } + + return $isInDesiredState + } + + #endregion + + #region Methods to override + + # Using the values supplied to $this, query the DNS server for a resource record and return it + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + throw $this.localizedData.GetResourceRecordNotImplemented + } + + # Add a resource record using the properties of this object. + hidden [void] AddResourceRecord() + { + throw $this.localizedData.AddResourceRecordNotImplemented + } + + <# + Modifies a resource record using the properties of this object. + + The data in each hashtable will contain the following properties: + + - ActualType (System.RuntimeType) + - ExpectedType (System.RuntimeType) + - Property (String) + - ExpectedValue (the property's type) + - ActualValue (the property's type) + - InDesiredState (System.Boolean) + #> + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + throw $this.localizedData.ModifyResourceRecordNotImplemented + } + + # Given a resource record object, create an instance of this class with the appropriate data + hidden [DnsRecordBase] NewDscResourceObjectFromRecord($record) + { + throw $this.localizedData.NewResourceObjectFromRecordNotImplemented + } + + #endregion +} +#EndRegion './Classes/002.DnsRecordBase.ps1' 293 +#Region './Classes/002.DnsRecordCname.ps1' 0 +<# + .SYNOPSIS + The DnsRecordCname DSC resource manages CNAME DNS records against a specific zone on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordCname DSC resource manages CNAME DNS records against a specific zone on a Domain Name System (DNS) server. + + .PARAMETER Name + Specifies the name of a DNS server resource record object. (Key Parameter) + + .PARAMETER HostNameAlias + Specifies a a canonical name target for a CNAME record. This must be a fully qualified domain name (FQDN). (Key Parameter) +#> + +[DscResource()] +class DnsRecordCname : DnsRecordBase +{ + [DscProperty(Key)] + [System.String] + $Name + + [DscProperty(Key)] + [System.String] + $HostNameAlias + + [DnsRecordCname] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + Write-Verbose -Message ($this.localizedData.GettingDnsRecordMessage -f 'CNAME', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + RRType = 'CNAME' + Name = $this.Name + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + $record = Get-DnsServerResourceRecord @dnsParameters -ErrorAction SilentlyContinue | Where-Object -FilterScript { + $_.RecordData.HostNameAlias -eq "$($this.HostnameAlias)." + } + + return $record + } + + hidden [DnsRecordCname] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordCname] @{ + ZoneName = $this.ZoneName + Name = $this.Name + HostNameAlias = $this.HostNameAlias + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + CNAME = $true + Name = $this.Name + HostNameAlias = $this.HostNameAlias + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + if ($null -ne $this.TimeToLive) + { + $dnsParameters.Add('TimeToLive', $this.TimeToLive) + } + + Write-Verbose -Message ($this.localizedData.CreatingDnsRecordMessage -f 'CNAME', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + Add-DnsServerResourceRecord @dnsParameters + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + # Copy the existing record and modify values as appropriate + $newRecord = [Microsoft.Management.Infrastructure.CimInstance]::new($existingRecord) + + foreach ($propertyToChange in $propertiesNotInDesiredState) + { + switch ($propertyToChange.Property) + { + # Key parameters will never be affected, so only include Mandatory and Optional values in the switch statement + 'TimeToLive' + { + $newRecord.TimeToLive = [System.TimeSpan] $propertyToChange.ExpectedValue + } + + } + } + + Set-DnsServerResourceRecord @dnsParameters -OldInputObject $existingRecord -NewInputObject $newRecord -Verbose + } +} +#EndRegion './Classes/002.DnsRecordCname.ps1' 134 +#Region './Classes/002.DnsRecordPtr.ps1' 0 +<# + .SYNOPSIS + The DnsRecordPtr DSC resource manages PTR DNS records against a specific zone on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordPtr DSC resource manages PTR DNS records against a specific zone on a Domain Name System (DNS) server. + + .PARAMETER IpAddress + Specifies the IP address to which the record is associated (Can be either IPv4 or IPv6. (Key Parameter) + + .PARAMETER Name + Specifies the FQDN of the host when you add a PTR resource record. (Key Parameter) + + .NOTES + Reverse lookup zones do not support scopes, so there should be no DnsRecordPtrScoped subclass created. +#> + +[DscResource()] +class DnsRecordPtr : DnsRecordBase +{ + [DscProperty(Key)] + [System.String] + $IpAddress + + [DscProperty(Key)] + [System.String] + $Name + + hidden [System.String] $recordHostName + + [DnsRecordPtr] Get() + { + # Ensure $recordHostName is set + $this.recordHostName = $this.getRecordHostName($this.IpAddress) + + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + # Ensure $recordHostName is set + $this.recordHostName = $this.getRecordHostName($this.IpAddress) + + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + # Ensure $recordHostName is set + $this.recordHostName = $this.getRecordHostName($this.IpAddress) + + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + Write-Verbose -Message ($this.localizedData.GettingDnsRecordMessage -f 'Ptr', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + RRType = 'PTR' + Name = $this.recordHostName + } + + $record = Get-DnsServerResourceRecord @dnsParameters -ErrorAction SilentlyContinue | Where-Object -FilterScript { + $_.RecordData.PtrDomainName -eq "$($this.Name)." + } + + return $record + } + + hidden [DnsRecordPtr] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordPtr] @{ + ZoneName = $this.ZoneName + IpAddress = $this.IpAddress + Name = $this.Name + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + PTR = $true + Name = $this.recordHostName + PtrDomainName = $this.Name + } + + if ($null -ne $this.TimeToLive) + { + $dnsParameters.Add('TimeToLive', $this.TimeToLive) + } + + Write-Verbose -Message ($this.localizedData.CreatingDnsRecordMessage -f 'PTR', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + Add-DnsServerResourceRecord @dnsParameters + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + } + + # Copy the existing record and modify values as appropriate + $newRecord = [Microsoft.Management.Infrastructure.CimInstance]::new($existingRecord) + + foreach ($propertyToChange in $propertiesNotInDesiredState) + { + switch ($propertyToChange.Property) + { + # Key parameters will never be affected, so only include Mandatory and Optional values in the switch statement + 'TimeToLive' + { + $newRecord.TimeToLive = [System.TimeSpan] $propertyToChange.ExpectedValue + } + + } + } + + Set-DnsServerResourceRecord @dnsParameters -OldInputObject $existingRecord -NewInputObject $newRecord -Verbose + } + + # Take a compressed IPv6 string (i.e.: fd00::1) and expand it out to the full notation (i.e.: fd00:0000:0000:0000:0000:0000:0000:0001) + hidden [System.String] expandIPv6String($string) + { + # Split the string on the colons + $segments = [System.Collections.ArrayList]::new(($string -split ':')) + + # Determine how many segments need to be added to reach the 8 required + $blankSegmentCount = 8 - $segments.count + + # Hold the expanded segments + $newSegments = [System.Collections.ArrayList]::new() + + # Insert missing segments + foreach ($segment in $segments) + { + if ([System.String]::IsNullOrEmpty($segment)) + { + for ($i = 0; $i -le $blankSegmentCount; $i++) + { + $newSegments.Add('0000') + } + } else + { + $newSegments.Add($segment) + } + } + + # Pad out all segments with leading zeros + $paddedSegments = $newSegments | ForEach-Object { + $_.PadLeft(4, '0') + } + return ($paddedSegments -join ':') + } + + # Translate the IP address to the reverse notation used by the DNS server + hidden [System.String] getReverseNotation([System.Net.IpAddress] $ipAddressObj) + { + $significantData = [System.Collections.ArrayList]::New() + + switch ($ipAddressObj.AddressFamily) + { + 'InterNetwork' + { + $significantData.AddRange(($ipAddressObj.IPAddressToString -split '\.')) + break + } + + 'InterNetworkV6' + { + # Get the hex values into an ArrayList + $significantData.AddRange(($this.expandIPv6String($ipAddressObj.IPAddressToString) -replace ':', '' -split '')) + break + } + } + + $significantData.Reverse() + + # The reverse lookup notation puts a '.' between each hex value + return ($significantData -join '.').Trim('.') + } + + # Determine the record host name + hidden [System.String] getRecordHostName([System.Net.IpAddress] $ipAddressObj) + { + $reverseLookupAddressComponent = "" + + switch ($ipAddressObj.AddressFamily) + { + 'InterNetwork' + { + if (-not $this.ZoneName.ToLower().EndsWith('.in-addr.arpa')) + { + throw ($this.localizedData.NotAnIPv4Zone -f $this.ZoneName) + } + $reverseLookupAddressComponent = $this.ZoneName.Replace('.in-addr.arpa', '') + break + } + + 'InterNetworkV6' + { + if (-not $this.ZoneName.ToLower().EndsWith('.ip6.arpa')) + { + throw ($this.localizedData.NotAnIPv6Zone -f $this.ZoneName) + } + $reverseLookupAddressComponent = $this.ZoneName.Replace('.ip6.arpa', '') + break + } + } + + $reverseNotation = $this.getReverseNotation($ipAddressObj) + + # Check to make sure that the ip address actually belongs in this zone + if ($reverseNotation -notmatch "$($reverseLookupAddressComponent)`$") + { + throw $this.localizedData.WrongZone -f $ipAddressObj.IPAddressToString, $this.ZoneName + } + + # Strip the zone name from the reversed IP using a regular expression + $ptrRecordHostName = $reverseNotation -replace "\.$([System.Text.RegularExpressions.Regex]::Escape($reverseLookupAddressComponent))`$", "" + + return $ptrRecordHostName + } +} +#EndRegion './Classes/002.DnsRecordPtr.ps1' 236 +#Region './Classes/003.DnsRecordA.ps1' 0 +<# + .SYNOPSIS + The DnsRecordA DSC resource manages A DNS records against a specific zone on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordA DSC resource manages A DNS records against a specific zone on a Domain Name System (DNS) server. + + .PARAMETER Name + Specifies the name of a DNS server resource record object. (Key Parameter) + + .PARAMETER IPv4Address + Specifies the IPv4 address of a host. (Key Parameter) +#> + +[DscResource()] +class DnsRecordA : DnsRecordBase +{ + [DscProperty(Key)] + [System.String] + $Name + + [DscProperty(Key)] + [System.String] + $IPv4Address + + [DnsRecordA] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + Write-Verbose -Message ($this.localizedData.GettingDnsRecordMessage -f 'A', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + RRType = 'A' + Name = $this.Name + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + $record = Get-DnsServerResourceRecord @dnsParameters -ErrorAction SilentlyContinue | Where-Object { + $_.RecordData.IPv4Address -eq $this.IPv4Address + } + + return $record + } + + hidden [DnsRecordA] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordA] @{ + ZoneName = $this.ZoneName + Name = $this.Name + IPv4Address = $this.IPv4Address + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + A = $true + Name = $this.Name + IPv4Address = $this.IPv4Address + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + if ($null -ne $this.TimeToLive) + { + $dnsParameters.Add('TimeToLive', $this.TimeToLive) + } + + Write-Verbose -Message ($this.localizedData.CreatingDnsRecordMessage -f 'A', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + Add-DnsServerResourceRecord @dnsParameters + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + # Copy the existing record and modify values as appropriate + $newRecord = [Microsoft.Management.Infrastructure.CimInstance]::new($existingRecord) + + foreach ($propertyToChange in $propertiesNotInDesiredState) + { + switch ($propertyToChange.Property) + { + # Key parameters will never be affected, so only include Mandatory and Optional values in the switch statement + 'TimeToLive' + { + $newRecord.TimeToLive = [System.TimeSpan] $propertyToChange.ExpectedValue + } + + } + } + + Set-DnsServerResourceRecord @dnsParameters -OldInputObject $existingRecord -NewInputObject $newRecord -Verbose + } +} +#EndRegion './Classes/003.DnsRecordA.ps1' 134 +#Region './Classes/003.DnsRecordAaaa.ps1' 0 +<# + .SYNOPSIS + The DnsRecordAaaa DSC resource manages AAAA DNS records against a specific zone on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordAaaa DSC resource manages AAAA DNS records against a specific zone on a Domain Name System (DNS) server. + + .PARAMETER Name + Specifies the name of a DNS server resource record object. (Key Parameter) + + .PARAMETER IPv6Address + Specifies the IPv6 address of a host. (Key Parameter) +#> + +[DscResource()] +class DnsRecordAaaa : DnsRecordBase +{ + [DscProperty(Key)] + [System.String] + $Name + + [DscProperty(Key)] + [System.String] + $IPv6Address + + [DnsRecordAaaa] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + Write-Verbose -Message ($this.localizedData.GettingDnsRecordMessage -f 'Aaaa', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + RRType = 'AAAA' + Name = $this.Name + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + $record = Get-DnsServerResourceRecord @dnsParameters -ErrorAction SilentlyContinue | Where-Object -FilterScript { + $_.RecordData.IPv6Address -eq $this.IPv6Address + } + + return $record + } + + hidden [DnsRecordAaaa] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordAaaa] @{ + ZoneName = $this.ZoneName + Name = $this.Name + IPv6Address = $this.IPv6Address + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + AAAA = $true + Name = $this.name + IPv6Address = $this.IPv6Address + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + if ($null -ne $this.TimeToLive) + { + $dnsParameters.Add('TimeToLive', $this.TimeToLive) + } + + Write-Verbose -Message ($this.localizedData.CreatingDnsRecordMessage -f 'AAAA', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + Add-DnsServerResourceRecord @dnsParameters + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + # Copy the existing record and modify values as appropriate + $newRecord = [Microsoft.Management.Infrastructure.CimInstance]::new($existingRecord) + + foreach ($propertyToChange in $propertiesNotInDesiredState) + { + switch ($propertyToChange.Property) + { + # Key parameters will never be affected, so only include Mandatory and Optional values in the switch statement + 'TimeToLive' + { + $newRecord.TimeToLive = [System.TimeSpan] $propertyToChange.ExpectedValue + } + + } + } + + Set-DnsServerResourceRecord @dnsParameters -OldInputObject $existingRecord -NewInputObject $newRecord -Verbose + } +} +#EndRegion './Classes/003.DnsRecordAaaa.ps1' 134 +#Region './Classes/003.DnsRecordCnameScoped.ps1' 0 +<# + .SYNOPSIS + The DnsRecordCnameScoped DSC resource manages CNAME DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordCnameScoped DSC resource manages CNAME DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .PARAMETER ZoneScope + Specifies the name of a zone scope. (Key Parameter) +#> + +[DscResource()] +class DnsRecordCnameScoped : DnsRecordCname +{ + [DscProperty(Key)] + [System.String] + $ZoneScope + + [DnsRecordCnameScoped] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + return ([DnsRecordCname] $this).GetResourceRecord() + } + + hidden [DnsRecordCnameScoped] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordCnameScoped] @{ + ZoneName = $this.ZoneName + ZoneScope = $this.ZoneScope + Name = $this.Name + HostNameAlias = $this.HostNameAlias + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + ([DnsRecordCname] $this).AddResourceRecord() + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + ([DnsRecordCname] $this).ModifyResourceRecord($existingRecord, $propertiesNotInDesiredState) + } +} +#EndRegion './Classes/003.DnsRecordCnameScoped.ps1' 64 +#Region './Classes/003.DnsRecordMx.ps1' 0 +<# + .SYNOPSIS + The DnsRecordMx DSC resource manages MX DNS records against a specific zone on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordMx DSC resource manages MX DNS records against a specific zone on a Domain Name System (DNS) server. + + .PARAMETER EmailDomain + Everything after the '@' in the email addresses supported by this mail exchanger. It must be a subdomain the zone or the zone itself. To specify all subdomains, use the '*' character (i.e.: *.contoso.com). (Key Parameter) + + .PARAMETER MailExchange + FQDN of the server handling email for the specified email domain. When setting the value, this FQDN must resolve to an IP address and cannot reference a CNAME record. (Key Parameter) + + .PARAMETER Priority + Specifies the priority for this MX record among other MX records that belong to the same email domain, where a lower value has a higher priority. (Mandatory Parameter) +#> + +[DscResource()] +class DnsRecordMx : DnsRecordBase +{ + [DscProperty(Key)] + [System.String] + $EmailDomain + + [DscProperty(Key)] + [System.String] + $MailExchange + + [DscProperty(Mandatory)] + [System.UInt16] + $Priority + + hidden [System.String] $recordName + + [DnsRecordMx] Get() + { + $this.recordName = $this.getRecordName() + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + $this.recordName = $this.getRecordName() + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + $this.recordName = $this.getRecordName() + return ([DnsRecordBase] $this).Test() + } + + [System.String] getRecordName() + { + $aRecordName = $null + $regexMatch = $this.EmailDomain | Select-String -Pattern "^((.*?)\.){0,1}$($this.ZoneName)`$" + if ($null -eq $regexMatch) + { + throw ($this.localizedData.DomainZoneMismatch -f $this.EmailDomain, $this.ZoneName) + } + else + { + # Match group 2 contains the value in which we are interested. + $aRecordName = $regexMatch.Matches.Groups[2].Value + if ($aRecordName -eq '') + { + $aRecordName = '.' + } + } + return $aRecordName + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + Write-Verbose -Message ($this.localizedData.GettingDnsRecordMessage -f 'Mx', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + RRType = 'MX' + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + $record = Get-DnsServerResourceRecord @dnsParameters -ErrorAction SilentlyContinue | Where-Object -FilterScript { + $translatedRecordName = $this.getRecordName() + if ($translatedRecordName -eq '.') + { + $translatedRecordName = '@' + } + $_.HostName -eq $translatedRecordName -and + $_.RecordData.MailExchange -eq "$($this.MailExchange)." + } + + <# + It is technically possible, outside of this resource to have more than one record with the same target, but + different priorities. So, although the idea of doing so is nonsensical, we have to ensure we are selecting + only one record in this method. It doesn't matter which one. + #> + return $record | Select-Object -First 1 + } + + hidden [DnsRecordMx] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordMx] @{ + ZoneName = $this.ZoneName + EmailDomain = $this.EmailDomain + MailExchange = $this.MailExchange + Priority = $record.RecordData.Preference + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + MX = $true + Name = $this.getRecordName() + MailExchange = $this.MailExchange + Preference = $this.Priority + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + if ($null -ne $this.TimeToLive) + { + $dnsParameters.Add('TimeToLive', $this.TimeToLive) + } + + Write-Verbose -Message ($this.localizedData.CreatingDnsRecordMessage -f 'MX', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + Add-DnsServerResourceRecord @dnsParameters + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + # Copy the existing record and modify values as appropriate + $newRecord = [Microsoft.Management.Infrastructure.CimInstance]::new($existingRecord) + + foreach ($propertyToChange in $propertiesNotInDesiredState) + { + switch ($propertyToChange.Property) + { + # Key parameters will never be affected, so only include Mandatory and Optional values in the switch statement + + 'Priority' + { + $newRecord.RecordData.Preference = $propertyToChange.ExpectedValue + } + + 'TimeToLive' + { + $newRecord.TimeToLive = [System.TimeSpan] $propertyToChange.ExpectedValue + } + + } + } + + Set-DnsServerResourceRecord @dnsParameters -OldInputObject $existingRecord -NewInputObject $newRecord -Verbose + } +} +#EndRegion './Classes/003.DnsRecordMx.ps1' 184 +#Region './Classes/003.DnsRecordNs.ps1' 0 +<# + .SYNOPSIS + The DnsRecordNs DSC resource manages NS DNS records against a specific zone on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordNs DSC resource manages NS DNS records against a specific zone on a Domain Name System (DNS) server. + + .PARAMETER DomainName + Specifies the fully qualified DNS domain name for which the NameServer is authoritative. It must be a subdomain the zone or the zone itself. To specify all subdomains, use the '*' character (i.e.: *.contoso.com). (Key Parameter) + + .PARAMETER NameServer + Specifies the name server of a domain. This should be a fully qualified domain name, not an IP address (Key Parameter) +#> + +[DscResource()] +class DnsRecordNs : DnsRecordBase +{ + [DscProperty(Key)] + [System.String] + $DomainName + + [DscProperty(Key)] + [System.String] + $NameServer + + [DnsRecordNs] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + [System.String] getRecordName() + { + $aRecordName = $null + + # Use regex matching to determine if the domain name provided is a subdomain of the ZoneName (ends in ZoneName). + $regexMatch = $this.DomainName | Select-String -Pattern "^((.*?)\.){0,1}$($this.ZoneName)`$" + + if ($null -eq $regexMatch) + { + throw ($this.localizedData.DomainZoneMismatch -f $this.DomainName, $this.ZoneName) + } + else + { + # Match group 2 contains the value in which we are interested. + $aRecordName = $regexMatch.Matches.Groups[2].Value + if ($aRecordName -eq '') + { + $aRecordName = '.' + } + } + return $aRecordName + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + Write-Verbose -Message ($this.localizedData.GettingDnsRecordMessage -f 'Ns', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + RRType = 'NS' + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + $record = Get-DnsServerResourceRecord @dnsParameters -ErrorAction SilentlyContinue | Where-Object -FilterScript { + $translatedRecordName = $this.getRecordName() + if ($translatedRecordName -eq '.') + { + $translatedRecordName = '@' + } + $_.HostName -eq $translatedRecordName -and + $_.RecordData.NameServer -eq "$($this.NameServer)." + } + + return $record + } + + hidden [DnsRecordNs] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordNs] @{ + ZoneName = $this.ZoneName + DomainName = $this.DomainName + NameServer = $this.NameServer + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + NS = $true + Name = $this.getRecordName() + NameServer = $this.NameServer + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + if ($null -ne $this.TimeToLive) + { + $dnsParameters.Add('TimeToLive', $this.TimeToLive) + } + + Write-Verbose -Message ($this.localizedData.CreatingDnsRecordMessage -f 'NS', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + Add-DnsServerResourceRecord @dnsParameters + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + # Copy the existing record and modify values as appropriate + $newRecord = [Microsoft.Management.Infrastructure.CimInstance]::new($existingRecord) + + foreach ($propertyToChange in $propertiesNotInDesiredState) + { + switch ($propertyToChange.Property) + { + # Key parameters will never be affected, so only include Mandatory and Optional values in the switch statement + + 'TimeToLive' + { + $newRecord.TimeToLive = [System.TimeSpan] $propertyToChange.ExpectedValue + } + + } + } + + Set-DnsServerResourceRecord @dnsParameters -OldInputObject $existingRecord -NewInputObject $newRecord -Verbose + } +} +#EndRegion './Classes/003.DnsRecordNs.ps1' 163 +#Region './Classes/003.DnsRecordSrv.ps1' 0 +<# + .SYNOPSIS + The DnsRecordSrv DSC resource manages SRV DNS records against a specific zone on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordSrv DSC resource manages SRV DNS records against a specific zone on a Domain Name System (DNS) server. + + .PARAMETER SymbolicName + Service name for the SRV record. eg: xmpp, ldap, etc. (Key Parameter) + + .PARAMETER Protocol + Service transmission protocol ('TCP' or 'UDP') (Key Parameter) + + .PARAMETER Port + The TCP or UDP port on which the service is found (Key Parameter) + + .PARAMETER Target + Specifies the Target Hostname or IP Address. (Key Parameter) + + .PARAMETER Priority + Specifies the Priority value of the SRV record. (Mandatory Parameter) + + .PARAMETER Weight + Specifies the weight of the SRV record. (Mandatory Parameter) +#> + +[DscResource()] +class DnsRecordSrv : DnsRecordBase +{ + [DscProperty(Key)] + [System.String] + $SymbolicName + + [DscProperty(Key)] + [ValidateSet('TCP', 'UDP')] + [System.String] + $Protocol + + [DscProperty(Key)] + [ValidateRange(1, 65535)] + [System.UInt16] + $Port + + [DscProperty(Key)] + [System.String] + $Target + + [DscProperty(Mandatory)] + [System.UInt16] + $Priority + + [DscProperty(Mandatory)] + [System.UInt16] + $Weight + + hidden [System.String] getRecordHostName() + { + return $this.getRecordHostName($this.SymbolicName, $this.Protocol) + } + + hidden [System.String] getRecordHostName($aSymbolicName, $aProtocol) + { + return "_$($aSymbolicName)._$($aProtocol)".ToLower() + } + + [DnsRecordSrv] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + $recordHostName = $this.getRecordHostName() + + Write-Verbose -Message ($this.localizedData.GettingDnsRecordMessage -f $recordHostName, $this.target, 'SRV', $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + $dnsParameters = @{ + Name = $recordHostName + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + RRType = 'SRV' + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + $record = Get-DnsServerResourceRecord @dnsParameters -ErrorAction SilentlyContinue | Where-Object -FilterScript { + $_.HostName -eq $recordHostName -and + $_.RecordData.Port -eq $this.Port -and + $_.RecordData.DomainName -eq "$($this.Target)." + } + + return $record + } + + hidden [DnsRecordSrv] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordSrv] @{ + ZoneName = $this.ZoneName + SymbolicName = $this.SymbolicName + Protocol = $this.Protocol.ToLower() + Port = $this.Port + Target = ($record.RecordData.DomainName).TrimEnd('.') + Priority = $record.RecordData.Priority + Weight = $record.RecordData.Weight + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + $recordHostName = $this.getRecordHostName() + + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + Name = $recordHostName + Srv = $true + DomainName = $this.Target + Port = $this.Port + Priority = $this.Priority + Weight = $this.Weight + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + if ($null -ne $this.TimeToLive) + { + $dnsParameters.Add('TimeToLive', $this.TimeToLive) + } + + Write-Verbose -Message ($this.localizedData.CreatingDnsRecordMessage -f 'SRV', $recordHostName, $this.Target, $this.ZoneName, $this.ZoneScope, $this.DnsServer) + + Add-DnsServerResourceRecord @dnsParameters + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + $recordHostName = $this.getRecordHostName() + + $dnsParameters = @{ + ZoneName = $this.ZoneName + ComputerName = $this.DnsServer + } + + if ($this.isScoped) + { + $dnsParameters['ZoneScope'] = $this.ZoneScope + } + + # Copy the existing record and modify values as appropriate + $newRecord = [Microsoft.Management.Infrastructure.CimInstance]::new($existingRecord) + + foreach ($propertyToChange in $propertiesNotInDesiredState) + { + switch ($propertyToChange.Property) + { + # Key parameters will never be affected, so only include Mandatory and Optional values in the switch statement + 'Priority' + { + $newRecord.RecordData.Priority = $propertyToChange.ExpectedValue + } + + 'Weight' + { + $newRecord.RecordData.Weight = $propertyToChange.ExpectedValue + } + + 'TimeToLive' + { + $newRecord.TimeToLive = [System.TimeSpan] $propertyToChange.ExpectedValue + } + + } + } + + Set-DnsServerResourceRecord @dnsParameters -OldInputObject $existingRecord -NewInputObject $newRecord -Verbose + } +} +#EndRegion './Classes/003.DnsRecordSrv.ps1' 199 +#Region './Classes/003.DnsServerCache.ps1' 0 +<# + .SYNOPSIS + The DnsServerCache DSC resource manages cache settings on a Microsoft Domain + Name System (DNS) server. + + .DESCRIPTION + The DnsServerCache DSC resource manages cache settings on a Microsoft Domain + Name System (DNS) server. + + .PARAMETER DnsServer + The host name of the Domain Name System (DNS) server, or use `'localhost'` + for the current node. + + .PARAMETER IgnorePolicies + Specifies whether to ignore policies for this cache. + + .PARAMETER LockingPercent + Specifies a percentage of the original Time to Live (TTL) value that caching + can consume. Cache locking is configured as a percent value. For example, if + the cache locking value is set to `50`, the DNS server does not overwrite a + cached entry for half of the duration of the TTL. If the cache locking percent + is set to `100` that means the DNS server will not overwrite cached entries + for the entire duration of the TTL. + + .PARAMETER MaxKBSize + Specifies the maximum size, in kilobytes, of the memory cache of a DNS server. + If set to `0` there is no limit. + + .PARAMETER MaxNegativeTtl + Specifies how long an entry that records a negative answer to a query remains + stored in the DNS cache. Minimum value is `'00:00:01'` and maximum value is + `'30.00:00:00'` + + .PARAMETER MaxTtl + Specifies how long a record is saved in cache. Minimum value is `'00:00:00'` + and maximum value is `'30.00:00:00'`. If the TimeSpan is set to `'00:00:00'` + (0 seconds), the DNS server does not cache records. + + .PARAMETER EnablePollutionProtection + Specifies whether DNS filters name service (NS) resource records that are + cached. Valid values are False (`$false`), which caches all responses to name + queries; and True (`$true`), which caches only the records that belong to the + same DNS subtree. + + When you set this parameter value to False (`$false`), cache pollution + protection is disabled. A DNS server caches the Host (A) record and all queried + NS resources that are in the DNS server zone. In this case, DNS can also cache + the NS record of an unauthorized DNS server. This event causes name resolution + to fail or to be appropriated for subsequent queries in the specified domain. + + When you set the value for this parameter to True (`$true`), the DNS server + enables cache pollution protection and ignores the Host (A) record. The DNS + server performs a cache update query to resolve the address of the NS if the + NS is outside the zone of the DNS server. The additional query minimally + affects DNS server performance. + + .PARAMETER StoreEmptyAuthenticationResponse + Specifies whether a DNS server stores empty authoritative responses in the + cache (RFC-2308). +#> + +[DscResource()] +class DnsServerCache : ResourceBase +{ + [DscProperty(Key)] + [System.String] + $DnsServer + + [DscProperty()] + [Nullable[System.Boolean]] + $IgnorePolicies + + [DscProperty()] + [Nullable[System.UInt32]] + $LockingPercent + + [DscProperty()] + [Nullable[System.UInt32]] + $MaxKBSize + + [DscProperty()] + [System.String] + $MaxNegativeTtl + + [DscProperty()] + [System.String] + $MaxTtl + + [DscProperty()] + [Nullable[System.Boolean]] + $EnablePollutionProtection + + [DscProperty()] + [Nullable[System.Boolean]] + $StoreEmptyAuthenticationResponse + + [DnsServerCache] Get() + { + # Call the base method to return the properties. + return ([ResourceBase] $this).Get() + } + + # Base method Get() call this method to get the current state as a CimInstance. + [Microsoft.Management.Infrastructure.CimInstance] GetCurrentState([System.Collections.Hashtable] $properties) + { + return (Get-DnsServerCache @properties) + } + + [void] Set() + { + # Call the base method to enforce the properties. + ([ResourceBase] $this).Set() + } + + <# + Base method Set() call this method with the properties that should be + enforced and that are not in desired state. + #> + [void] Modify([System.Collections.Hashtable] $properties) + { + <# + If the property 'EnablePollutionProtection' was present and not in desired state, + then the property name must be change for the cmdlet Set-DnsServerCache. In the + cmdlet Get-DnsServerCache the property name is 'EnablePollutionProtection', but + in the cmdlet Set-DnsServerCache the parameter is 'PollutionProtection'. + #> + if ($properties.ContainsKey('EnablePollutionProtection')) + { + $properties['PollutionProtection'] = $properties.EnablePollutionProtection + + $properties.Remove('EnablePollutionProtection') + } + + Set-DnsServerCache @properties + } + + [System.Boolean] Test() + { + # Call the base method to test all of the properties that should be enforced. + return ([ResourceBase] $this).Test() + } + + hidden [void] AssertProperties() + { + if ($null -ne $this.MaxNegativeTtl) + { + Assert-TimeSpan -PropertyName 'MaxNegativeTtl' -Value $this.MaxNegativeTtl -Minimum '0.00:00:01' -Maximum '30.00:00:00' + } + + if ($null -ne $this.MaxTtl) + { + Assert-TimeSpan -PropertyName 'MaxTtl' -Value $this.MaxTtl -Minimum '0.00:00:00' -Maximum '30.00:00:00' + } + } +} +#EndRegion './Classes/003.DnsServerCache.ps1' 156 +#Region './Classes/003.DnsServerDsSetting.ps1' 0 +<# + .SYNOPSIS + The DnsServerDsSetting DSC resource manages DNS Active Directory settings + on a Microsoft Domain Name System (DNS) server. + + .DESCRIPTION + The DnsServerDsSetting DSC resource manages DNS Active Directory settings + on a Microsoft Domain Name System (DNS) server. + + .PARAMETER DnsServer + The host name of the Domain Name System (DNS) server, or use `'localhost'` + for the current node. + + .PARAMETER DirectoryPartitionAutoEnlistInterval + Specifies the interval, during which a DNS server tries to enlist itself + in a DNS domain partition and DNS forest partition, if it is not already + enlisted. We recommend that you limit this value to the range one hour to + 180 days, inclusive, but you can use any value. We recommend that you set + the default value to one day. You must set the value 0 (zero) as a flag + value for the default value. However, you can allow zero and treat it + literally. + + .PARAMETER LazyUpdateInterval + Specifies a value, in seconds, to determine how frequently the DNS server + submits updates to the directory server without specifying the + LDAP_SERVER_LAZY_COMMIT_OID control ([MS-ADTS] section 3.1.1.3.4.1.7) at + the same time that it processes DNS dynamic update requests. We recommend + that you limit this value to the range 0x00000000 to 0x0000003c. You must + set the default value to 0x00000003. You must set the value zero to + indicate that the DNS server does not specify the + LDAP_SERVER_LAZY_COMMIT_OID control at the same time that it processes + DNS dynamic update requests. For more information about + LDAP_SERVER_LAZY_COMMIT_OID, see LDAP_SERVER_LAZY_COMMIT_OID control + code. The LDAP_SERVER_LAZY_COMMIT_OID control instructs the DNS server + to return the results of a directory service modification command after + it is completed in memory but before it is committed to disk. In this + way, the server can return results quickly and save data to disk without + sacrificing performance. The DNS server must send this control only to + the directory server that is attached to an LDAP update that the DNS + server initiates in response to a DNS dynamic update request. If the + value is nonzero, LDAP updates that occur during the processing of DNS + dynamic update requests must not specify the LDAP_SERVER_LAZY_COMMIT_OID + control if a period of less than DsLazyUpdateInterval seconds has passed + since the last LDAP update that specifies this control. If a period that + is greater than DsLazyUpdateInterval seconds passes, during which time + the DNS server does not perform an LDAP update that specifies this + control, the DNS server must specify this control on the next update. + + .PARAMETER MinimumBackgroundLoadThreads + Specifies the minimum number of background threads that the DNS server + uses to load zone data from the directory service. You must limit this + value to the range 0x00000000 to 0x00000005, inclusive. You must set the + default value to 0x00000001, and you must treat the value zero as a flag + value for the default value. + + .PARAMETER PollingInterval + Specifies how frequently the DNS server polls Active Directory Domain + Services (AD DS) for changes in Active Directory-integrated zones. You + must limit the value to the range 30 seconds to 3,600 seconds, inclusive. + + .PARAMETER RemoteReplicationDelay + Specifies the minimum interval, in seconds, that the DNS server waits + between the time that it determines that a single object has changed on + a remote directory server, to the time that it tries to replicate a + single object change. You must limit the value to the range 0x00000005 + to 0x00000E10, inclusive. You must set the default value to 0x0000001E, + and you must treat the value zero as a flag value for the default value. + + .PARAMETER TombstoneInterval + Specifies the amount of time that DNS keeps tombstoned records alive in + Active Directory. We recommend that you limit this value to the range + three days to eight weeks, inclusive, but you can set it to any value in + the range 82 hours to 8 weeks. We recommend that you set the default + value to 14 days and treat the value zero as a flag value for the + default. However, you can allow the value zero and treat it literally. + At 2:00 A.M. local time every day, the DNS server must search all + directory service zones for nodes that have the Active Directory + dnsTombstoned attribute set to True, and for a directory service + EntombedTime (section 2.2.2.2.3.23 of MS-DNSP) value that is greater + than previous directory service DSTombstoneInterval seconds. You must + permanently delete all such nodes from the directory server. +#> + +[DscResource()] +class DnsServerDsSetting : ResourceBase +{ + [DscProperty(Key)] + [System.String] + $DnsServer + + [DscProperty()] + [System.String] + $DirectoryPartitionAutoEnlistInterval + + [DscProperty()] + [Nullable[System.UInt32]] + $LazyUpdateInterval + + [DscProperty()] + [Nullable[System.UInt32]] + $MinimumBackgroundLoadThreads + + [DscProperty()] + [System.String] + $PollingInterval + + [DscProperty()] + [Nullable[System.UInt32]] + $RemoteReplicationDelay + + [DscProperty()] + [System.String] + $TombstoneInterval + + [DnsServerDsSetting] Get() + { + # Call the base method to return the properties. + return ([ResourceBase] $this).Get() + } + + # Base method Get() call this method to get the current state as a CimInstance. + [Microsoft.Management.Infrastructure.CimInstance] GetCurrentState([System.Collections.Hashtable] $properties) + { + return (Get-DnsServerDsSetting @properties) + } + + [void] Set() + { + # Call the base method to enforce the properties. + ([ResourceBase] $this).Set() + } + + <# + Base method Set() call this method with the properties that should be + enforced and that are not in desired state. + #> + [void] Modify([System.Collections.Hashtable] $properties) + { + Set-DnsServerDsSetting @properties + } + + [System.Boolean] Test() + { + # Call the base method to test all of the properties that should be enforced. + return ([ResourceBase] $this).Test() + } + + hidden [void] AssertProperties() + { + @( + 'DirectoryPartitionAutoEnlistInterval', + 'TombstoneInterval' + ) | ForEach-Object -Process { + $valueToConvert = $this.$_ + + # Only evaluate properties that have a value. + if ($null -ne $valueToConvert) + { + Assert-TimeSpan -PropertyName $_ -Value $valueToConvert -Minimum '0.00:00:00' + } + } + } +} +#EndRegion './Classes/003.DnsServerDsSetting.ps1' 164 +#Region './Classes/003.DnsServerEDns.ps1' 0 +<# + .SYNOPSIS + The DnsServerEDns DSC resource manages _extension mechanisms for DNS (EDNS)_ + on a Microsoft Domain Name System (DNS) server. + + .DESCRIPTION + The DnsServerEDns DSC resource manages _extension mechanisms for DNS (EDNS)_ + on a Microsoft Domain Name System (DNS) server. + + .PARAMETER DnsServer + The host name of the Domain Name System (DNS) server, or use `'localhost'` + for the current node. + + .PARAMETER CacheTimeout + Specifies the number of seconds that the DNS server caches EDNS information. + + .PARAMETER EnableProbes + Specifies whether to enable the server to probe other servers to determine + whether they support EDNS. + + .PARAMETER EnableReception + Specifies whether the DNS server accepts queries that contain an EDNS record. +#> + +[DscResource()] +class DnsServerEDns : ResourceBase +{ + [DscProperty(Key)] + [System.String] + $DnsServer + + [DscProperty()] + [System.String] + $CacheTimeout + + [DscProperty()] + [Nullable[System.Boolean]] + $EnableProbes + + [DscProperty()] + [Nullable[System.Boolean]] + $EnableReception + + [DnsServerEDns] Get() + { + # Call the base method to return the properties. + return ([ResourceBase] $this).Get() + } + + # Base method Get() call this method to get the current state as a CimInstance. + [Microsoft.Management.Infrastructure.CimInstance] GetCurrentState([System.Collections.Hashtable] $properties) + { + return (Get-DnsServerEDns @properties) + } + + [void] Set() + { + # Call the base method to enforce the properties. + ([ResourceBase] $this).Set() + } + + <# + Base method Set() call this method with the properties that should be + enforced and that are not in desired state. + #> + [void] Modify([System.Collections.Hashtable] $properties) + { + Set-DnsServerEDns @properties + } + + [System.Boolean] Test() + { + # Call the base method to test all of the properties that should be enforced. + return ([ResourceBase] $this).Test() + } + + hidden [void] AssertProperties() + { + @( + 'CacheTimeout' + ) | ForEach-Object -Process { + $valueToConvert = $this.$_ + + # Only evaluate properties that have a value. + if ($null -ne $valueToConvert) + { + Assert-TimeSpan -PropertyName $_ -Value $valueToConvert -Minimum '0.00:00:00' + } + } + } +} +#EndRegion './Classes/003.DnsServerEDns.ps1' 92 +#Region './Classes/003.DnsServerRecursion.ps1' 0 +<# + .SYNOPSIS + The DnsServerRecursion DSC resource manages recursion settings on a Microsoft + Domain Name System (DNS) server. + + .DESCRIPTION + The DnsServerRecursion DSC resource manages recursion settings on a Microsoft + Domain Name System (DNS) server. Recursion occurs when a DNS server queries + other DNS servers on behalf of a requesting client, and then sends the answer + back to the client. + + The property `SecureResponse` that can be set by the cmdlet `Set-DnsServerRecursion` + changes the same value as `EnablePollutionProtection` in the resource _DnsServerCache_ + does. Use the property `EnablePollutionProtection` in the resource _DnsServerCache_ + to enforce pollution protection. + + .PARAMETER DnsServer + The host name of the Domain Name System (DNS) server, or use `'localhost'` + for the current node. + + .PARAMETER Enable + Specifies whether the server enables recursion. + + .PARAMETER AdditionalTimeout + Specifies the time interval, in seconds, that a DNS server waits as it uses + recursion to get resource records from a remote DNS server. Valid values are + in the range of `1` second to `15` seconds. See recommendation in the documentation + of [Set-DnsServerRecursion](https://docs.microsoft.com/en-us/powershell/module/dnsserver/set-dnsserverrecursion). + + .PARAMETER RetryInterval + Specifies elapsed seconds before a DNS server retries a recursive lookup. + Valid values are in the range of `1` second to `15` seconds. The + recommendation is that in general this value should not be change. However, + under a few circumstances it can be considered changing the value. For + example, if a DNS server contacts a remote DNS server over a slow link and + retries the lookup before it gets a response, it could help to raise the + retry interval to be slightly longer than the observed response time. + See recommendation in the documentation of [Set-DnsServerRecursion](https://docs.microsoft.com/en-us/powershell/module/dnsserver/set-dnsserverrecursion). + + .PARAMETER Timeout + Specifies the number of seconds that a DNS server waits before it stops + trying to contact a remote server. The valid value is in the range of `1` + second to `15` seconds. Recommendation is to increase this value when + recursion occurs over a slow link. See recommendation in the documentation + of [Set-DnsServerRecursion](https://docs.microsoft.com/en-us/powershell/module/dnsserver/set-dnsserverrecursion). + + .NOTES + The cmdlet Set-DsnServerRecursion allows to set the value 0 (zero) for the + properties AdditionalTimeout, RetryInterval, and Timeout, but setting the + value 0 reverts the property to its respectively default value. The default + value for the properties on Windows Server 2016 is 4 seconds for property + AdditionalTimeout, 3 seconds for RetryInterval, and 8 seconds for property + Timeout. If it was allowed to set 0 (zero) as the value in this resource + for these properties then the state would never become in desired state. +#> + +[DscResource()] +class DnsServerRecursion : ResourceBase +{ + [DscProperty(Key)] + [System.String] + $DnsServer + + [DscProperty()] + [Nullable[System.Boolean]] + $Enable + + [DscProperty()] + [Nullable[System.UInt32]] + $AdditionalTimeout + + [DscProperty()] + [Nullable[System.UInt32]] + $RetryInterval + + [DscProperty()] + [Nullable[System.UInt32]] + $Timeout + + [DnsServerRecursion] Get() + { + # Call the base method to return the properties. + return ([ResourceBase] $this).Get() + } + + # Base method Get() call this method to get the current state as a CimInstance. + [Microsoft.Management.Infrastructure.CimInstance] GetCurrentState([System.Collections.Hashtable] $properties) + { + return (Get-DnsServerRecursion @properties) + } + + [void] Set() + { + # Call the base method to enforce the properties. + ([ResourceBase] $this).Set() + } + + <# + Base method Set() call this method with the properties that should be + enforced and that are not in desired state. + #> + [void] Modify([System.Collections.Hashtable] $properties) + { + Set-DnsServerRecursion @properties + } + + [System.Boolean] Test() + { + # Call the base method to test all of the properties that should be enforced. + return ([ResourceBase] $this).Test() + } + + # Called by the base method Set() and Test() to assert that all properties are valid. + hidden [void] AssertProperties() + { + @( + 'AdditionalTimeout' + 'RetryInterval' + 'Timeout' + ) | ForEach-Object -Process { + $propertyValue = $this.$_ + + # Only evaluate properties that have a value. + if ($null -ne $propertyValue -and $propertyValue -notin (1..15)) + { + $errorMessage = $this.localizedData.PropertyIsNotInValidRange -f $_, $propertyValue + + New-InvalidOperationException -Message $errorMessage + } + } + } +} +#EndRegion './Classes/003.DnsServerRecursion.ps1' 133 +#Region './Classes/003.DnsServerScavenging.ps1' 0 +<# + .SYNOPSIS + The DnsServerScavenging DSC resource manages scavenging on a Microsoft + Domain Name System (DNS) server. + + .DESCRIPTION + The DnsServerScavenging DSC resource manages scavenging on a Microsoft + Domain Name System (DNS) server. + + .PARAMETER DnsServer + The host name of the Domain Name System (DNS) server, or use 'localhost' + for the current node. + + .PARAMETER ScavengingState + Specifies whether to Enable automatic scavenging of stale records. + `ScavengingState` determines whether the DNS scavenging feature is enabled + by default on newly created zones. + + .PARAMETER ScavengingInterval + Specifies a length of time as a value that can be converted to a `[TimeSpan]` + object. `ScavengingInterval` determines whether the scavenging feature for + the DNS server is enabled and sets the number of hours between scavenging + cycles. The value `0` disables scavenging for the DNS server. A setting + greater than `0` enables scavenging for the server and sets the number of + days, hours, minutes, and seconds (formatted as dd.hh:mm:ss) between + scavenging cycles. The minimum value is 0. The maximum value is 365.00:00:00 + (1 year). + + .PARAMETER RefreshInterval + Specifies the refresh interval as a value that can be converted to a `[TimeSpan]` + object (formatted as dd.hh:mm:ss). During this interval, a DNS server can + refresh a resource record that has a non-zero time stamp. Zones on the server + inherit this value automatically. If a DNS server does not refresh a resource + record that has a non-zero time stamp, the DNS server can remove that record + during the next scavenging. Do not select a value smaller than the longest + refresh period of a resource record registered in the zone. The minimum value + is `0`. The maximum value is 365.00:00:00 (1 year). + + .PARAMETER NoRefreshInterval + Specifies a length of time as a value that can be converted to a `[TimeSpan]` + object (formatted as dd.hh:mm:ss). `NoRefreshInterval` sets a period of time + in which no refreshes are accepted for dynamically updated records. Zones on + the server inherit this value automatically. This value is the interval between + the last update of a timestamp for a record and the earliest time when the + timestamp can be refreshed. The minimum value is 0. The maximum value is + 365.00:00:00 (1 year). + + .PARAMETER LastScavengeTime + The time when the last scavenging cycle was executed. +#> + +[DscResource()] +class DnsServerScavenging : ResourceBase +{ + [DscProperty(Key)] + [System.String] + $DnsServer + + [DscProperty()] + [Nullable[System.Boolean]] + $ScavengingState + + [DscProperty()] + [System.String] + $ScavengingInterval + + [DscProperty()] + [System.String] + $RefreshInterval + + [DscProperty()] + [System.String] + $NoRefreshInterval + + [DscProperty(NotConfigurable)] + [Nullable[System.DateTime]] + $LastScavengeTime + + [DnsServerScavenging] Get() + { + # Call the base method to return the properties. + return ([ResourceBase] $this).Get() + } + + # Base method Get() call this method to get the current state as a CimInstance. + [Microsoft.Management.Infrastructure.CimInstance] GetCurrentState([System.Collections.Hashtable] $properties) + { + return (Get-DnsServerScavenging @properties) + } + + [void] Set() + { + # Call the base method to enforce the properties. + ([ResourceBase] $this).Set() + } + + <# + Base method Set() call this method with the properties that should be + enforced and that are not in desired state. + #> + [void] Modify([System.Collections.Hashtable] $properties) + { + Set-DnsServerScavenging @properties + } + + [System.Boolean] Test() + { + # Call the base method to test all of the properties that should be enforced. + return ([ResourceBase] $this).Test() + } + + hidden [void] AssertProperties() + { + @( + 'ScavengingInterval' + 'RefreshInterval' + 'NoRefreshInterval' + ) | ForEach-Object -Process { + $valueToConvert = $this.$_ + + # Only evaluate properties that have a value. + if ($null -ne $valueToConvert) + { + Assert-TimeSpan -PropertyName $_ -Value $valueToConvert -Maximum '365.00:00:00' -Minimum '0.00:00:00' + } + } + } +} +#EndRegion './Classes/003.DnsServerScavenging.ps1' 129 +#Region './Classes/004.DnsRecordAaaaScoped.ps1' 0 +<# + .SYNOPSIS + The DnsRecordAaaaScoped DSC resource manages AAAA DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordAaaaScoped DSC resource manages AAAA DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .PARAMETER ZoneScope + Specifies the name of a zone scope. (Key Parameter) +#> + +[DscResource()] +class DnsRecordAaaaScoped : DnsRecordAaaa +{ + [DscProperty(Key)] + [System.String] + $ZoneScope + + [DnsRecordAaaaScoped] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + return ([DnsRecordAaaa] $this).GetResourceRecord() + } + + hidden [DnsRecordAaaaScoped] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordAaaaScoped] @{ + ZoneName = $this.ZoneName + ZoneScope = $this.ZoneScope + Name = $this.Name + IPv6Address = $this.IPv6Address + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + ([DnsRecordAaaa] $this).AddResourceRecord() + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + ([DnsRecordAaaa] $this).ModifyResourceRecord($existingRecord, $propertiesNotInDesiredState) + } +} +#EndRegion './Classes/004.DnsRecordAaaaScoped.ps1' 64 +#Region './Classes/004.DnsRecordAScoped.ps1' 0 +<# + .SYNOPSIS + The DnsRecordAScoped DSC resource manages A DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordAScoped DSC resource manages A DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .PARAMETER ZoneScope + Specifies the name of a zone scope. (Key Parameter) +#> + +[DscResource()] +class DnsRecordAScoped : DnsRecordA +{ + [DscProperty(Key)] + [System.String] + $ZoneScope + + [DnsRecordAScoped] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + return ([DnsRecordA] $this).GetResourceRecord() + } + + hidden [DnsRecordAScoped] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordAScoped] @{ + ZoneName = $this.ZoneName + ZoneScope = $this.ZoneScope + Name = $this.Name + IPv4Address = $this.IPv4Address + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + ([DnsRecordA] $this).AddResourceRecord() + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + ([DnsRecordA] $this).ModifyResourceRecord($existingRecord, $propertiesNotInDesiredState) + } +} +#EndRegion './Classes/004.DnsRecordAScoped.ps1' 64 +#Region './Classes/004.DnsRecordMxScoped.ps1' 0 +<# + .SYNOPSIS + The DnsRecordMxScoped DSC resource manages MX DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordMxScoped DSC resource manages MX DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .PARAMETER ZoneScope + Specifies the name of a zone scope. (Key Parameter) +#> + +[DscResource()] +class DnsRecordMxScoped : DnsRecordMx +{ + [DscProperty(Key)] + [System.String] + $ZoneScope + + [DnsRecordMxScoped] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + return ([DnsRecordMx] $this).GetResourceRecord() + } + + hidden [DnsRecordMxScoped] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordMxScoped] @{ + ZoneName = $this.ZoneName + ZoneScope = $this.ZoneScope + EmailDomain = $this.EmailDomain + MailExchange = $this.MailExchange + Priority = $record.RecordData.Preference + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + ([DnsRecordMx] $this).AddResourceRecord() + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + ([DnsRecordMx] $this).ModifyResourceRecord($existingRecord, $propertiesNotInDesiredState) + } +} +#EndRegion './Classes/004.DnsRecordMxScoped.ps1' 65 +#Region './Classes/004.DnsRecordNsScoped.ps1' 0 +<# + .SYNOPSIS + The DnsRecordNsScoped DSC resource manages NS DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordNsScoped DSC resource manages NS DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .PARAMETER ZoneScope + Specifies the name of a zone scope. (Key Parameter) +#> + +[DscResource()] +class DnsRecordNsScoped : DnsRecordNs +{ + [DscProperty(Key)] + [System.String] + $ZoneScope + + [DnsRecordNsScoped] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + return ([DnsRecordNs] $this).GetResourceRecord() + } + + hidden [DnsRecordNsScoped] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordNsScoped] @{ + ZoneName = $this.ZoneName + ZoneScope = $this.ZoneScope + DomainName = $this.DomainName + NameServer = $this.NameServer + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + ([DnsRecordNs] $this).AddResourceRecord() + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + ([DnsRecordNs] $this).ModifyResourceRecord($existingRecord, $propertiesNotInDesiredState) + } +} +#EndRegion './Classes/004.DnsRecordNsScoped.ps1' 64 +#Region './Classes/004.DnsRecordSrvScoped.ps1' 0 +<# + .SYNOPSIS + The DnsRecordSrvScoped DSC resource manages SRV DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .DESCRIPTION + The DnsRecordSrvScoped DSC resource manages SRV DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + + .PARAMETER ZoneScope + Specifies the name of a zone scope. (Key Parameter) +#> + +[DscResource()] +class DnsRecordSrvScoped : DnsRecordSrv +{ + [DscProperty(Key)] + [System.String] + $ZoneScope + + [DnsRecordSrvScoped] Get() + { + return ([DnsRecordBase] $this).Get() + } + + [void] Set() + { + ([DnsRecordBase] $this).Set() + } + + [System.Boolean] Test() + { + return ([DnsRecordBase] $this).Test() + } + + hidden [Microsoft.Management.Infrastructure.CimInstance] GetResourceRecord() + { + return ([DnsRecordSrv] $this).GetResourceRecord() + } + + hidden [DnsRecordSrvScoped] NewDscResourceObjectFromRecord([Microsoft.Management.Infrastructure.CimInstance] $record) + { + $dscResourceObject = [DnsRecordSrvScoped] @{ + ZoneName = $this.ZoneName + ZoneScope = $this.ZoneScope + SymbolicName = $this.SymbolicName + Protocol = $this.Protocol.ToLower() + Port = $this.Port + Target = ($record.RecordData.DomainName).TrimEnd('.') + Priority = $record.RecordData.Priority + Weight = $record.RecordData.Weight + TimeToLive = $record.TimeToLive.ToString() + DnsServer = $this.DnsServer + Ensure = 'Present' + } + + return $dscResourceObject + } + + hidden [void] AddResourceRecord() + { + ([DnsRecordSrv] $this).AddResourceRecord() + } + + hidden [void] ModifyResourceRecord([Microsoft.Management.Infrastructure.CimInstance] $existingRecord, [System.Collections.Hashtable[]] $propertiesNotInDesiredState) + { + ([DnsRecordSrv] $this).ModifyResourceRecord($existingRecord, $propertiesNotInDesiredState) + } +} +#EndRegion './Classes/004.DnsRecordSrvScoped.ps1' 68 +#Region './Private/Assert-TimeSpan.ps1' 0 +<# + .SYNOPSIS + Assert that the value provided can be converted to a TimeSpan object. + + .PARAMETER Value + The time value as a string that should be converted. +#> +function Assert-TimeSpan +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [System.String] + $Value, + + [Parameter(Mandatory = $true)] + [System.String] + $PropertyName, + + [Parameter()] + [System.TimeSpan] + $Maximum, + + [Parameter()] + [System.TimeSpan] + $Minimum + ) + + $timeSpanObject = $Value | ConvertTo-TimeSpan + + # If the conversion fails $null is returned. + if ($null -eq $timeSpanObject) + { + $errorMessage = $script:localizedData.PropertyHasWrongFormat -f $PropertyName, $Value + + New-InvalidOperationException -Message $errorMessage + } + + if ($PSBoundParameters.ContainsKey('Maximum') -and $timeSpanObject -gt $Maximum) + { + $errorMessage = $script:localizedData.TimeSpanExceedMaximumValue -f $PropertyName, $timeSpanObject.ToString(), $Maximum + + New-InvalidOperationException -Message $errorMessage + } + + if ($PSBoundParameters.ContainsKey('Minimum') -and $timeSpanObject -lt $Minimum) + { + $errorMessage = $script:localizedData.TimeSpanBelowMinimumValue -f $PropertyName, $timeSpanObject.ToString(), $Minimum + + New-InvalidOperationException -Message $errorMessage + } +} +#EndRegion './Private/Assert-TimeSpan.ps1' 54 +#Region './Private/ConvertTo-HashtableFromObject.ps1' 0 +<# + .SYNOPSIS + Convert any object to hashtable + + .PARAMETER InputObject + The object that should convert to hashtable. +#> +function ConvertTo-HashtableFromObject +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [PSObject] + $InputObject + ) + + $hashResult = @{} + + $InputObject.psobject.Properties | Foreach-Object { + $hashResult[$_.Name] = $_.Value + } + + return $hashResult +} +#EndRegion './Private/ConvertTo-HashtableFromObject.ps1' 27 +#Region './Private/ConvertTo-TimeSpan.ps1' 0 +<# + .SYNOPSIS + Converts a string value to a TimeSpan object. + + .PARAMETER Value + The time value as a string that should be converted. + + .OUTPUTS + Returns an TimeSpan object containing the converted value, or $null if + conversion was not possible. +#> +function ConvertTo-TimeSpan +{ + [CmdletBinding()] + [OutputType([System.TimeSpan])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [System.String] + $Value + ) + + $timeSpan = New-TimeSpan + + if (-not [System.TimeSpan]::TryParse($Value, [ref] $timeSpan)) + { + $timeSpan = $null + } + + return $timeSpan +} +#EndRegion './Private/ConvertTo-TimeSpan.ps1' 32 +#Region './Private/Get-ClassName.ps1' 0 +<# + .SYNOPSIS + Get the class name of the passed object, and optional an array with + all inherited classes. + + .PARAMETER InputObject + The object to be evaluated. + + .OUTPUTS + Returns a string array with at least one item. +#> +function Get-ClassName +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [PSObject] + $InputObject, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Recurse + ) + + # Create a list of the inherited class names + $class = @($InputObject.GetType().FullName) + + if ($Recurse.IsPresent) + { + $parentClass = $InputObject.GetType().BaseType + + while ($parentClass -ne [System.Object]) + { + $class += $parentClass.FullName + + $parentClass = $parentClass.BaseType + } + } + + return ,$class +} +#EndRegion './Private/Get-ClassName.ps1' 44 +#Region './Private/Get-LocalizedDataRecursive.ps1' 0 +<# + .SYNOPSIS + Get the localization strings data from one or more localization string files. + This can be used in classes to be able to inherit localization strings + from one or more parent (base) classes. + + The order of class names passed to parameter `ClassName` determines the order + of importing localization string files. First entry's localization string file + will be imported first, then next entry's localization string file, and so on. + If the second (or any consecutive) entry's localization string file contain a + localization string key that existed in a previous imported localization string + file that localization string key will be ignored. Making it possible for a + child class to override localization strings from one or more parent (base) + classes. + + .PARAMETER ClassName + An array of class names, normally provided by `Get-ClassName -Recurse`. + + .OUTPUTS + Returns a string array with at least one item. +#> +function Get-LocalizedDataRecursive +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [System.String[]] + $ClassName + ) + + begin + { + $localizedData = @{} + } + + process + { + foreach ($name in $ClassName) + { + if ($name -match '\.psd1') + { + # Assume we got full file name. + $localizationFileName = $name + } + else + { + # Assume we only got class name. + $localizationFileName = '{0}.strings.psd1' -f $name + } + + Write-Debug -Message ('Importing localization data from {0}' -f $localizationFileName) + + # Get localized data for the class + $classLocalizationStrings = Get-LocalizedData -DefaultUICulture 'en-US' -FileName $localizationFileName -ErrorAction 'Stop' + + # Append only previously unspecified keys in the localization data + foreach ($key in $classLocalizationStrings.Keys) + { + if (-not $localizedData.ContainsKey($key)) + { + $localizedData[$key] = $classLocalizationStrings[$key] + } + } + } + } + + end + { + Write-Debug -Message ('Localization data: {0}' -f ($localizedData | ConvertTo-JSON)) + + return $localizedData + } +} +#EndRegion './Private/Get-LocalizedDataRecursive.ps1' 76 diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/DnsServerDsc.Common.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/DnsServerDsc.Common.psd1 new file mode 100644 index 0000000..1e8f9c9 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/DnsServerDsc.Common.psd1 @@ -0,0 +1,47 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'DnsServerDsc.Common.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0' + + # ID used to uniquely identify this module + GUID = 'df2cccf3-f8bd-4142-9539-ed5486caebe1' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Functions used by the DSC resources in DnsServerDsc.' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @( + 'Remove-CommonParameter' + 'ConvertTo-CimInstance' + 'ConvertTo-FollowRfc1034' + 'ConvertTo-HashTable' + 'Convert-RootHintsToHashtable' + 'Test-DscDnsParameterState' + ) + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + PSData = @{ + } # End of PSData hashtable + } # End of PrivateData hashtable +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/DnsServerDsc.Common.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/DnsServerDsc.Common.psm1 new file mode 100644 index 0000000..d3e3232 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/DnsServerDsc.Common.psm1 @@ -0,0 +1,416 @@ +$script:resourceHelperModulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\..\Modules\DscResource.Common' + +Import-Module -Name $script:resourceHelperModulePath + +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Converts a string to a fully qualified DNS domain name, if its not already. + + .DESCRIPTION + This function is used to convert a string into a fully qualified DNS domain name by appending a '.' to the end. + + .PARAMETER Name + A string with the value to convert. + + .OUTPUTS + System.String +#> +function ConvertTo-FollowRfc1034 +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [System.String] + $Name + ) + + if (-not $Name.EndsWith('.')) + { + return "$Name." + } + + return $Name +} + +<# + .SYNOPSIS + Converts root hints like the DNS cmdlets are run. + + .DESCRIPTION + This function is used to convert a CimInstance array containing MSFT_KeyValuePair objects into a hashtable. + + .PARAMETER CimInstance + An array of CimInstances or a single CimInstance object to convert. + + .OUTPUTS + System.Collections.Hashtable +#> +function Convert-RootHintsToHashtable +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.Object[]] + [AllowEmptyCollection()] + $RootHints + ) + + $r = @{ } + + foreach ($rootHint in $RootHints) + { + if (-not $rootHint.IPAddress) + { + continue + } + + $ip = if ($rootHint.IPAddress.RecordData.IPv4Address) + { + $rootHint.IPAddress.RecordData.IPv4Address.IPAddressToString -join ',' + } + else + { + $rootHint.IPAddress.RecordData.IPv6Address.IPAddressToString -join ',' + } + + $r.Add($rootHint.NameServer.RecordData.NameServer, $ip) + } + + return $r +} + +<# + .SYNOPSIS + Tests the status of DSC resource parameters. + + .DESCRIPTION + This function tests the parameter status of DSC resource parameters against the current values present on the system. + + .PARAMETER CurrentValues + A hashtable with the current values on the system, obtained by e.g. Get-TargetResource. + + .PARAMETER DesiredValues + The hashtable of desired values. + + .PARAMETER ValuesToCheck + The values to check if not all values should be checked. + + .PARAMETER TurnOffTypeChecking + Indicates that the type of the parameter should not be checked. + + .PARAMETER ReverseCheck + Indicates that a reverse check should be done. The current and desired state are swapped for another test. + + .PARAMETER SortArrayValues + If the sorting of array values does not matter, values are sorted internally before doing the comparison. + + .NOTES + This function is enhanced with additional parameters compared to the function + Test-DscParameterState that is available in the module DscResource.Common. + These enhancements should be merged into DscResource.Common; + https://github.com/dsccommunity/DscResource.Common/blob/master/source/Public/Test-DscParameterState.ps1. +#> +function Test-DscDnsParameterState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Object] + $DesiredValues, + + [Parameter()] + [System.String[]] + $ValuesToCheck, + + [Parameter()] + [switch] + $TurnOffTypeChecking, + + [Parameter()] + [switch] + $ReverseCheck, + + [Parameter()] + [switch] + $SortArrayValues + ) + + $returnValue = $true + + if ($CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $CurrentValues = ConvertTo-HashTable -CimInstance $CurrentValues + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $DesiredValues = ConvertTo-HashTable -CimInstance $DesiredValues + } + + $types = 'System.Management.Automation.PSBoundParametersDictionary', 'System.Collections.Hashtable', 'Microsoft.Management.Infrastructure.CimInstance' + + if ($DesiredValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidDesiredValuesError -f $DesiredValues.GetType().FullName) ` + -ArgumentName 'DesiredValues' + } + + if ($CurrentValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidCurrentValuesError -f $CurrentValues.GetType().FullName) ` + -ArgumentName 'CurrentValues' + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -and -not $ValuesToCheck) + { + New-InvalidArgumentException ` + -Message $script:localizedData.InvalidValuesToCheckError ` + -ArgumentName 'ValuesToCheck' + } + + $desiredValuesClean = Remove-CommonParameter -Hashtable $DesiredValues + + if (-not $ValuesToCheck) + { + $keyList = $desiredValuesClean.Keys + } + else + { + $keyList = $ValuesToCheck + } + + foreach ($key in $keyList) + { + $desiredValue = $desiredValuesClean.$key + $currentValue = $CurrentValues.$key + + if ($desiredValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $desiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $desiredValue = ConvertTo-HashTable -CimInstance $desiredValue + } + if ($currentValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $currentValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $currentValue = ConvertTo-HashTable -CimInstance $currentValue + } + + if ($null -ne $desiredValue) + { + $desiredType = $desiredValue.GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($null -ne $currentValue) + { + $currentType = $currentValue.GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if ($currentType.Name -ne 'Unknown' -and $desiredType.Name -eq 'PSCredential') + { + # This is a credential object. Compare only the user name + if ($currentType.Name -eq 'PSCredential' -and $currentValue.UserName -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + continue + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + $returnValue = $false + } + + # Assume the string is our username when the matching desired value is actually a credential + if ($currentType.Name -eq 'string' -and $currentValue -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + continue + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + $returnValue = $false + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchTypeMismatchMessage -f $key, $currentType.Name, $desiredType.Name) + $returnValue = $false + continue + } + } + + if ($currentValue -eq $desiredValue -and -not $desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.Name, $key, $currentValue, $desiredValue) + continue + } + + if ($desiredValuesClean.GetType().Name -in 'HashTable', 'PSBoundParametersDictionary') + { + $checkDesiredValue = $desiredValuesClean.ContainsKey($key) + } + else + { + $checkDesiredValue = Test-DscObjectHasProperty -Object $desiredValuesClean -PropertyName $key + } + + if (-not $checkDesiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.Name, $key, $currentValue, $desiredValue) + continue + } + + if ($desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.TestDscParameterCompareMessage -f $key) + + if (-not $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.Name, $key, $currentValue, $desiredValue) + $returnValue = $false + continue + } + elseif ($currentValue.Count -ne $desiredValue.Count) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueDifferentCountMessage -f $desiredType.Name, $key, $currentValue.Count, $desiredValue.Count) + $returnValue = $false + continue + } + else + { + $desiredArrayValues = $desiredValue + $currentArrayValues = $currentValue + + if ($SortArrayValues) + { + $desiredArrayValues = $desiredArrayValues | Sort-Object + $currentArrayValues = $currentArrayValues | Sort-Object + } + + for ($i = 0; $i -lt $desiredArrayValues.Count; $i++) + { + if ($null -ne $desiredArrayValues[$i]) + { + $desiredType = $desiredArrayValues[$i].GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($null -ne $currentArrayValues[$i]) + { + $currentType = $currentArrayValues[$i].GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementTypeMismatchMessage -f $key, $i, $currentType.Name, $desiredType.Name) + $returnValue = $false + continue + } + } + + if ($desiredArrayValues[$i] -ne $currentArrayValues[$i]) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementValueMismatchMessage -f $i, $desiredType.Name, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + $returnValue = $false + continue + } + else + { + Write-Verbose -Message ($script:localizedData.MatchElementValueMessage -f $i, $desiredType.Name, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + continue + } + } + + } + } + elseif ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentValue + $param.DesiredValues = $desiredValue + [void]$param.Remove('ValuesToCheck') + if ($returnValue) + { + $returnValue = Test-DscDnsParameterState @param + } + else + { + Test-DscDnsParameterState @param | Out-Null + } + continue + } + else + { + if ($desiredValue -ne $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.Name, $key, $currentValue, $desiredValue) + $returnValue = $false + } + } + } + + if ($ReverseCheck) + { + Write-Verbose -Message $script:localizedData.StartingReverseCheck + $reverseCheckParameters = $PSBoundParameters + $reverseCheckParameters.CurrentValues = $DesiredValues + $reverseCheckParameters.DesiredValues = $CurrentValues + [void] $reverseCheckParameters.Remove('ReverseCheck') + if ($returnValue) + { + $returnValue = Test-DscDnsParameterState @reverseCheckParameters + } + else + { + Test-DscDnsParameterState @reverseCheckParameters | Out-Null + } + } + + Write-Verbose -Message ($script:localizedData.TestDscParameterResultMessage -f $returnValue) + return $returnValue +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/en-US/DnsServerDsc.Common.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/en-US/DnsServerDsc.Common.strings.psd1 new file mode 100644 index 0000000..81f9d66 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DnsServerDsc.Common/en-US/DnsServerDsc.Common.strings.psd1 @@ -0,0 +1,17 @@ +ConvertFrom-StringData @' + InvalidCurrentValuesError = Property 'CurrentValues' in Test-DscDnsParameterState must be either a Hashtable, CimInstance or CimIntance[]. Type detected was '{0}'. + InvalidDesiredValuesError = Property 'DesiredValues' in Test-DscDnsParameterState must be either a Hashtable or CimInstance. Type detected was '{0}'. + InvalidValuesToCheckError = If 'DesiredValues' is a CimInstance then property 'ValuesToCheck' must contain a value. + TestDscParameterCompareMessage = Comparing values in property '{0}'. + MatchPsCredentialUsernameMessage = MATCH: PSCredential username match. Current state is '{0}' and desired state is '{1}'. + NoMatchPsCredentialUsernameMessage = NOTMATCH: PSCredential username mismatch. Current state is '{0}' and desired state is '{1}'. + NoMatchTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type is '{1}' and desired type is '{2}'. + MatchValueMessage = MATCH: Value (type '{0}') for property '{1}' does match. Current state is '{2}' and desired state is '{3}'. + NoMatchValueMessage = NOTMATCH: Value (type '{0}') for property '{1}' does not match. Current state is '{2}' and desired state is '{3}'. + NoMatchValueDifferentCountMessage = NOTMATCH: Value (type '{0}') for property '{1}' does have a different count. Current state count is '{2}' and desired state count is '{3}'. + NoMatchElementTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type of element [{1}] is '{2}' and desired type is '{3}'. + NoMatchElementValueMismatchMessage = NOTMATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. + MatchElementValueMessage = MATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. + TestDscParameterResultMessage = Test-DscParameter result is '{0}'. + StartingReverseCheck = Starting with a reverse check. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/DscResource.Common.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/DscResource.Common.psd1 new file mode 100644 index 0000000..79e1735 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/DscResource.Common.psd1 @@ -0,0 +1,82 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'DscResource.Common.psm1' + + # Version number of this module. + ModuleVersion = '0.10.2' + + # ID used to uniquely identify this module + GUID = '9c9daa5b-5c00-472d-a588-c96e8e498450' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Common functions used in DSC Resources' + + # Minimum version of the PowerShell engine required by this module + PowerShellVersion = '4.0' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @('Assert-BoundParameter','Assert-IPAddress','Assert-Module','Compare-DscParameterState','Compare-ResourcePropertyState','ConvertTo-CimInstance','ConvertTo-HashTable','Get-ComputerName','Get-LocalizedData','Get-TemporaryFolder','New-InvalidArgumentException','New-InvalidDataException','New-InvalidOperationException','New-InvalidResultException','New-NotImplementedException','New-ObjectNotFoundException','Remove-CommonParameter','Set-DscMachineRebootRequired','Set-PSModulePath','Test-DscParameterState','Test-IsNanoServer') + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DSC', 'Localization') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/DscResource.Common/blob/main/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/DscResource.Common' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [0.10.2] - 2021-03-24 + +### Changed + +- DscResource.Common + - Renamed default branch to `main` - fixes [issue #62](https://github.com/dsccommunity/DscResource.Common/issues/62). + - Changed to use the new GitHub deploy tasks. +- `Assert-Module` + - Now it possible to forcibly import a module using `-ImportModule -Force` + - It no longer outputs verbose messages that is normally generated when + using `Get-Module -ListAvailable` if the module that is asserted is + already in the session ([issue #66](https://github.com/dsccommunity/DscResource.Common/issues/66)). +- `Compare-DscParameterState` + - Fix verbose message to only show when using parameter `IncludeInDesiredState`. + Also made the verbose message more intuitive when the value being compared + was a `[System.Boolean]`. + +' + + Prerelease = '' + } # End of PSData hashtable + + } # End of PrivateData hashtable +} + + + + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/DscResource.Common.psm1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/DscResource.Common.psm1 new file mode 100644 index 0000000..c691324 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/DscResource.Common.psm1 @@ -0,0 +1,2535 @@ +#Region './prefix.ps1' 0 +$script:modulesFolderPath = Split-Path -Path $PSScriptRoot -Parent +#EndRegion './prefix.ps1' 2 +#Region './Private/Test-DscObjectHasProperty.ps1' 0 +<# + .SYNOPSIS + Tests if an object has a property. + + .DESCRIPTION + Tests if the specified object has the specified property and return + $true or $false. + + .PARAMETER Object + Specifies the object to test for the specified property. + + .PARAMETER PropertyName + Specifies the property name to test for. + + .EXAMPLE + Test-DscObjectHasProperty -Object 'AnyString' -PropertyName 'Length' +#> +function Test-DscObjectHasProperty +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $Object, + + [Parameter(Mandatory = $true)] + [System.String] + $PropertyName + ) + + if ($Object.PSObject.Properties.Name -contains $PropertyName) + { + return [System.Boolean] $Object.$PropertyName + } + + return $false +} +#EndRegion './Private/Test-DscObjectHasProperty.ps1' 40 +#Region './Private/Test-DscPropertyState.ps1' 0 +<# + .SYNOPSIS + Compares the current and the desired value of a property. + + .DESCRIPTION + This function is used to compare the current and the desired value of a + property. + + .PARAMETER Values + This is set to a hash table with the current value (the CurrentValue key) + and desired value (the DesiredValue key). + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 'John' + DesiredValue = 'Alice' + } + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 1 + DesiredValue = 2 + } + + .NOTES + This function is used by the cmdlet Compare-ResourcePropertyState. +#> +function Test-DscPropertyState +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Values + ) + + if ($null -eq $Values.CurrentValue -and $null -eq $Values.DesiredValue) + { + # Both values are $null so return $true + $returnValue = $true + } + elseif ($null -eq $Values.CurrentValue -or $null -eq $Values.DesiredValue) + { + # Either CurrentValue or DesiredValue are $null so return $false + $returnValue = $false + } + elseif ( + $Values.DesiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]] ` + -or $Values.DesiredValue -is [System.Array] -and $Values.DesiredValue[0] -is [Microsoft.Management.Infrastructure.CimInstance] + ) + { + if (-not $Values.ContainsKey('KeyProperties')) + { + $errorMessage = $script:localizedData.KeyPropertiesMissing + + New-InvalidOperationException -Message $errorMessage + } + + $propertyState = @() + + <# + It is a collection of CIM instances, then recursively call + Test-DscPropertyState for each CIM instance in the collection. + #> + foreach ($desiredCimInstance in $Values.DesiredValue) + { + $currentCimInstance = $Values.CurrentValue + + <# + Use the CIM instance Key properties to filter out the current + values if the exist. + #> + foreach ($keyProperty in $Values.KeyProperties) + { + $currentCimInstance = $currentCimInstance | + Where-Object -Property $keyProperty -EQ -Value $desiredCimInstance.$keyProperty + } + + if ($currentCimInstance.Count -gt 1) + { + $errorMessage = $script:localizedData.TooManyCimInstances + + New-InvalidOperationException -Message $errorMessage + } + + if ($currentCimInstance) + { + $keyCimInstanceProperties = $currentCimInstance.CimInstanceProperties | + Where-Object -FilterScript { + $_.Name -in $Values.KeyProperties + } + + <# + For each key property build a string representation of the + property name and its value. + #> + $keyPropertyValues = $keyCimInstanceProperties.ForEach({'{0}="{1}"' -f $_.Name, ($_.Value -join ',')}) + + Write-Debug -Message ( + $script:localizedData.TestingCimInstance -f @( + $currentCimInstance.CimClass.CimClassName, + ($keyPropertyValues -join ';') + ) + ) + } + else + { + $keyCimInstanceProperties = $desiredCimInstance.CimInstanceProperties | + Where-Object -FilterScript { + $_.Name -in $Values.KeyProperties + } + + <# + For each key property build a string representation of the + property name and its value. + #> + $keyPropertyValues = $keyCimInstanceProperties.ForEach({'{0}="{1}"' -f $_.Name, ($_.Value -join ',')}) + + Write-Debug -Message ( + $script:localizedData.MissingCimInstance -f @( + $desiredCimInstance.CimClass.CimClassName, + ($keyPropertyValues -join ';') + ) + ) + } + + # Recursively call Test-DscPropertyState with the CimInstance to evaluate. + $propertyState += Test-DscPropertyState -Values @{ + CurrentValue = $currentCimInstance + DesiredValue = $desiredCimInstance + } + } + + # Return $false if one property is found to not be in desired state. + $returnValue = -not ($false -in $propertyState) + } + elseif ($Values.DesiredValue -is [Microsoft.Management.Infrastructure.CimInstance]) + { + $propertyState = @() + + <# + It is a CIM instance, recursively call Test-DscPropertyState for each + CIM instance property. + #> + $desiredCimInstanceProperties = $Values.DesiredValue.CimInstanceProperties | + Select-Object -Property @('Name', 'Value') + + if ($desiredCimInstanceProperties) + { + foreach ($desiredCimInstanceProperty in $desiredCimInstanceProperties) + { + <# + Recursively call Test-DscPropertyState to evaluate each property + in the CimInstance. + #> + $propertyState += Test-DscPropertyState -Values @{ + CurrentValue = $Values.CurrentValue.($desiredCimInstanceProperty.Name) + DesiredValue = $desiredCimInstanceProperty.Value + } + } + } + else + { + if ($Values.CurrentValue.CimInstanceProperties.Count -gt 0) + { + # Current value did not have any CIM properties, but desired state has. + $propertyState += $false + } + } + + # Return $false if one property is found to not be in desired state. + $returnValue = -not ($false -in $propertyState) + } + elseif ($Values.DesiredValue -is [System.Array] -or $Values.CurrentValue -is [System.Array]) + { + $compareObjectParameters = @{ + ReferenceObject = $Values.CurrentValue + DifferenceObject = $Values.DesiredValue + } + + $arrayCompare = Compare-Object @compareObjectParameters + + if ($null -ne $arrayCompare) + { + Write-Debug -Message $script:localizedData.ArrayDoesNotMatch + + $arrayCompare | + ForEach-Object -Process { + if ($_.SideIndicator -eq '=>') + { + Write-Debug -Message ( + $script:localizedData.ArrayValueIsAbsent -f $_.InputObject + ) + } + else + { + Write-Debug -Message ( + $script:localizedData.ArrayValueIsPresent -f $_.InputObject + ) + } + } + + $returnValue = $false + } + else + { + $returnValue = $true + } + } + elseif ($Values.CurrentValue -ne $Values.DesiredValue) + { + $desiredType = $Values.DesiredValue.GetType() + + $returnValue = $false + + $supportedTypes = @( + 'String' + 'Int32' + 'UInt32' + 'Int16' + 'UInt16' + 'Single' + 'Boolean' + ) + + if ($desiredType.Name -notin $supportedTypes) + { + Write-Warning -Message ($script:localizedData.UnableToCompareType -f $desiredType.Name) + } + else + { + Write-Debug -Message ( + $script:localizedData.PropertyValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $Values.CurrentValue, $Values.DesiredValue + ) + } + } + else + { + $returnValue = $true + } + + return $returnValue +} +#EndRegion './Private/Test-DscPropertyState.ps1' 247 +#Region './Public/Assert-BoundParameter.ps1' 0 +<# + .SYNOPSIS + Throws an error if there is a bound parameter that exists in both the + mutually exclusive lists. + + .DESCRIPTION + Throws an error if there is a bound parameter that exists in both the + mutually exclusive lists. + + .PARAMETER BoundParameterList + The parameters that should be evaluated against the mutually exclusive + lists MutuallyExclusiveList1 and MutuallyExclusiveList2. This parameter is + normally set to the $PSBoundParameters variable. + + .PARAMETER MutuallyExclusiveList1 + An array of parameter names that are not allowed to be bound at the + same time as those in MutuallyExclusiveList2. + + .PARAMETER MutuallyExclusiveList2 + An array of parameter names that are not allowed to be bound at the + same time as those in MutuallyExclusiveList1. + + .EXAMPLE + $assertBoundParameterParameters = @{ + BoundParameterList = $PSBoundParameters + MutuallyExclusiveList1 = @( + 'Parameter1' + ) + MutuallyExclusiveList2 = @( + 'Parameter2' + ) + } + + Assert-BoundParameter @assertBoundParameterParameters + + This example throws an exception if `$PSBoundParameters` contains both + the parameters `Parameter1` and `Parameter2`. +#> +function Assert-BoundParameter +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyCollection()] + [System.Collections.Hashtable] + $BoundParameterList, + + [Parameter(Mandatory = $true)] + [System.String[]] + $MutuallyExclusiveList1, + + [Parameter(Mandatory = $true)] + [System.String[]] + $MutuallyExclusiveList2 + ) + + $itemFoundFromList1 = $BoundParameterList.Keys.Where({ $_ -in $MutuallyExclusiveList1 }) + $itemFoundFromList2 = $BoundParameterList.Keys.Where({ $_ -in $MutuallyExclusiveList2 }) + + if ($itemFoundFromList1.Count -gt 0 -and $itemFoundFromList2.Count -gt 0) + { + $errorMessage = ` + $script:localizedData.ParameterUsageWrong ` + -f ($MutuallyExclusiveList1 -join "','"), ($MutuallyExclusiveList2 -join "','") + + New-InvalidArgumentException -ArgumentName 'Parameters' -Message $errorMessage + } +} +#EndRegion './Public/Assert-BoundParameter.ps1' 70 +#Region './Public/Assert-IPAddress.ps1' 0 +<# + .SYNOPSIS + Asserts that the specified IP address is valid. + + .DESCRIPTION + Checks the IP address so that it is valid and do not conflict with address + family. If any problems are detected an exception will be thrown. + + .PARAMETER AddressFamily + IP address family that the supplied Address should be in. Valid values are + 'IPv4' or 'IPv6'. + + .PARAMETER Address + Specifies an IPv4 or IPv6 address. + + .EXAMPLE + Assert-IPAddress -Address '127.0.0.1' + + This will assert that the supplied address is a valid IPv4 address. + If it is not an exception will be thrown. + + .EXAMPLE + Assert-IPAddress -Address 'fe80:ab04:30F5:002b::1' + + This will assert that the supplied address is a valid IPv6 address. + If it is not an exception will be thrown. + + .EXAMPLE + Assert-IPAddress -Address 'fe80:ab04:30F5:002b::1' -AddressFamily 'IPv6' + + This will assert that address is valid and that it matches the + supplied address family. If the supplied address family does not match + the address an exception will be thrown. +#> +function Assert-IPAddress +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Address + ) + + [System.Net.IPAddress] $ipAddress = $null + + if (-not ([System.Net.IPAddress]::TryParse($Address, [ref] $ipAddress))) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressFormatError -f $Address) ` + -ArgumentName 'Address' + } + + if ($AddressFamily) + { + switch ($AddressFamily) + { + 'IPv4' + { + if ($ipAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork.ToString()) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressIPv6MismatchError -f $Address, $AddressFamily) ` + -ArgumentName 'AddressFamily' + } + } + + 'IPv6' + { + if ($ipAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetworkV6.ToString()) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressIPv4MismatchError -f $Address, $AddressFamily) ` + -ArgumentName 'AddressFamily' + } + } + } + } +} +#EndRegion './Public/Assert-IPAddress.ps1' 86 +#Region './Public/Assert-Module.ps1' 0 +<# + .SYNOPSIS + Assert if the specific module is available to be imported. + + .DESCRIPTION + Assert if the specific module is available to be imported. + + .PARAMETER ModuleName + Specifies the name of the module to assert. + + .PARAMETER ImportModule + Specifies to import the module if it is asserted. + + .PARAMETER Force + Specifies to forcibly import the module even if it is already in the + session. This parameter is ignored unless parameter `ImportModule` is + also used. + + .EXAMPLE + Assert-Module -ModuleName 'DhcpServer' + + This asserts that the module DhcpServer is available on the system. + + .EXAMPLE + Assert-Module -ModuleName 'DhcpServer' -ImportModule + + This asserts that the module DhcpServer is available on the system and + imports it. + + .EXAMPLE + Assert-Module -ModuleName 'DhcpServer' -ImportModule -Force + + This asserts that the module DhcpServer is available on the system and + forcibly imports it. +#> +function Assert-Module +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ModuleName, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ImportModule, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Force + ) + + <# + If the module is already in the session there is no need to use -ListAvailable. + This is a fix for issue #66. + #> + if (-not (Get-Module -Name $ModuleName)) + { + if (-not (Get-Module -Name $ModuleName -ListAvailable)) + { + $errorMessage = $script:localizedData.ModuleNotFound -f $ModuleName + New-ObjectNotFoundException -Message $errorMessage + } + + # Only import it here if $Force is not set, otherwise it will be imported below. + if ($ImportModule -and -not $Force) + { + Import-Module -Name $ModuleName + } + } + + # Always import the module even if already in session. + if ($ImportModule -and $Force) + { + Import-Module -Name $ModuleName -Force + } +} +#EndRegion './Public/Assert-Module.ps1' 79 +#Region './Public/Compare-DscParameterState.ps1' 0 +<# + .SYNOPSIS + This method is used to compare current and desired values for any DSC resource. + + .DESCRIPTION + This function compare the parameter status of DSC resource parameters against + the current values present on the system, and return a hashtable with the metadata + from the comparison. + + .PARAMETER CurrentValues + A hashtable with the current values on the system, obtained by e.g. + Get-TargetResource. + + .PARAMETER DesiredValues + The hashtable of desired values. For example $PSBoundParameters with the + desired values. + + .PARAMETER Properties + This is a list of properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER ExcludeProperties + This is a list of which properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER TurnOffTypeChecking + Indicates that the type of the parameter should not be checked. + + .PARAMETER ReverseCheck + Indicates that a reverse check should be done. The current and desired state + are swapped for another test. + + .PARAMETER SortArrayValues + If the sorting of array values does not matter, values are sorted internally + before doing the comparison. + + .PARAMETER IncludeInDesiredState + Indicates that result adds the properties in the desired state. + By default, this command returns only the properties not in desired state. + + .PARAMETER IncludeValue + Indicates that result contains the ActualValue and ExcpectedValue properties. + + .EXAMPLE + $currentValues = @{ + String = 'This is a string' + Int = 1 + Bool = $true + } + + $desiredValues = @{ + String = 'This is a string' + Int = 99 + } + + Compare-DscParameterState -CurrentValues $currentValues -DesiredValues $desiredValues + + Name Value + ---- ----- + Property Int + InDesiredState False + ExpectedType System.Int32 + ActualType System.Int32 + ``` + + The function Compare-DscParameterState compare the value of each hashtable based + on the keys present in $desiredValues hashtable. The result indicates that Int + property is not in the desired state. + No information about Bool property, because it is not in $desiredValues hashtable. + + .EXAMPLE + $currentValues = @{ + String = 'This is a string' + Int = 1 + Bool = $true + } + + $desiredValues = @{ + String = 'This is a string' + Int = 99 + Bool = $false + } + + $excludeProperties = @('Bool') + + Compare-DscParameterState ` + -CurrentValues $currentValues ` + -DesiredValues $desiredValues ` + -ExcludeProperties $ExcludeProperties + + Name Value + ---- ----- + Property Int + InDesiredState False + ExpectedType System.Int32 + ActualType System.Int32 + ``` + + The function Compare-DscParameterState compare the value of each hashtable based + on the keys present in $desiredValues hashtable and without those in $excludeProperties. + The result indicates that Int property is not in the desired state. + No information about Bool property, because it is in $excludeProperties. + + .EXAMPLE + $serviceParameters = @{ + Name = $Name + } + + $returnValue = Compare-DscParameterState ` + -CurrentValues (Get-Service @serviceParameters) ` + -DesiredValues $PSBoundParameters ` + -Properties @( + 'Name' + 'Status' + 'StartType' + ) + + This compares the values in the current state against the desires state. + The command Get-Service is called using just the required parameters + to get the values in the current state. The parameter 'Properties' + is used to specify the properties 'Name','Status' and + 'StartType' for the comparison. + +#> +function Compare-DscParameterState +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Object] + $DesiredValues, + + [Parameter()] + [System.String[]] + [Alias('ValuesToCheck')] + $Properties, + + [Parameter()] + [System.String[]] + $ExcludeProperties, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $TurnOffTypeChecking, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ReverseCheck, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $SortArrayValues, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $IncludeInDesiredState, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $IncludeValue + ) + + $returnValue = @() + #region ConvertCIm to Hashtable + if ($CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $CurrentValues = ConvertTo-HashTable -CimInstance $CurrentValues + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $DesiredValues = ConvertTo-HashTable -CimInstance $DesiredValues + } + #endregion Endofconverion + #region CheckType of object + $types = 'System.Management.Automation.PSBoundParametersDictionary', + 'System.Collections.Hashtable', + 'Microsoft.Management.Infrastructure.CimInstance' + + if ($DesiredValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidDesiredValuesError -f $DesiredValues.GetType().FullName) ` + -ArgumentName 'DesiredValues' + } + + if ($CurrentValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidCurrentValuesError -f $CurrentValues.GetType().FullName) ` + -ArgumentName 'CurrentValues' + } + #endregion checktype + #region check if CimInstance and not have properties in parameters invoke exception + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -and -not $Properties) + { + New-InvalidArgumentException ` + -Message $script:localizedData.InvalidPropertiesError ` + -ArgumentName Properties + } + #endregion check cim and properties + #Clean value if there are a common parameters provide from Test/Get-TargetResource parameter + $desiredValuesClean = Remove-CommonParameter -Hashtable $DesiredValues + #region generate keyList based on $Properties and $excludeProperties value + if (-not $Properties) + { + $keyList = $desiredValuesClean.Keys + } + else + { + $keyList = $Properties + } + + if ($ExcludeProperties) + { + $keyList = $keyList | Where-Object -FilterScript { $_ -notin $ExcludeProperties } + } + #endregion + #region enumerate of each key in list + foreach ($key in $keyList) + { + #generate default value + $InDesiredStateTable = [ordered]@{ + Property = $key + InDesiredState = $true + } + $returnValue += $InDesiredStateTable + #get value of each key + $desiredValue = $desiredValuesClean.$key + $currentValue = $CurrentValues.$key + + #Check if IncludeValue parameter is used. + if ($IncludeValue) + { + $InDesiredStateTable['ExpectedValue'] = $desiredValue + $InDesiredStateTable['ActualValue'] = $currentValue + } + + #region convert to hashtable if value of key is CimInstance + if ($desiredValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $desiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $desiredValue = ConvertTo-HashTable -CimInstance $desiredValue + } + if ($currentValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $currentValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $currentValue = ConvertTo-HashTable -CimInstance $currentValue + } + #endregion converttohashtable + #region gettype of value to check if they are the same. + if ($null -ne $desiredValue) + { + $desiredType = $desiredValue.GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + $InDesiredStateTable['ExpectedType'] = $desiredType + + if ($null -ne $currentValue) + { + $currentType = $currentValue.GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + $InDesiredStateTable['ActualType'] = $currentType + + #endregion + #region check if the desiredtype if a credential object. Only if the current type isn't unknown. + if ($currentType.Name -ne 'Unknown' -and $desiredType.Name -eq 'PSCredential') + { + # This is a credential object. Compare only the user name + if ($currentType.Name -eq 'PSCredential' -and $currentValue.UserName -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + continue # pass to the next key + } + elseif ($currentType.Name -ne 'string') + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + $InDesiredStateTable.InDesiredState = $false + } + + # Assume the string is our username when the matching desired value is actually a credential + if ($currentType.Name -eq 'string' -and $currentValue -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + continue # pass to the next key + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + $InDesiredStateTable.InDesiredState = $false + } + } + #endregion test credential + #region Test type of object. And if they're not InDesiredState, generate en exception + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchTypeMismatchMessage -f $key, $currentType.FullName, $desiredType.FullName) + $InDesiredStateTable.InDesiredState = $false + continue # pass to the next key + } + } + #endregion TestType + #region Check if the value of Current and desired state is the same but only if they are not an array + if ($currentValue -eq $desiredValue -and -not $desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + continue # pass to the next key + } + #endregion check same value + #region Check if the DesiredValuesClean has the key and if it don't have, it's not necessary to check his value + if ($desiredValuesClean.GetType().Name -in 'HashTable', 'PSBoundParametersDictionary') + { + $checkDesiredValue = $desiredValuesClean.ContainsKey($key) + } + else + { + $checkDesiredValue = Test-DscObjectHasProperty -Object $desiredValuesClean -PropertyName $key + } + # if there no key, don't need to check + if (-not $checkDesiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + continue # pass to the next key + } + #endregion + #region Check if desired type is array, ifno Hashtable and currenttype hashtable to + if ($desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.TestDscParameterCompareMessage -f $key, $desiredType.FullName) + # Check if the currentValues and desiredValue are empty array. + if (-not $currentValue -and -not $desiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, 'empty array', 'empty array') + continue + } + elseif (-not $currentValue) + { + #If only currentvalue is empty, the configuration isn't compliant. + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + $InDesiredStateTable.InDesiredState = $false + continue + } + elseif ($currentValue.Count -ne $desiredValue.Count) + { + #If there is a difference between the number of objects in arrays, this isn't compliant. + Write-Verbose -Message ($script:localizedData.NoMatchValueDifferentCountMessage -f $desiredType.FullName, $key, $currentValue.Count, $desiredValue.Count) + $InDesiredStateTable.InDesiredState = $false + continue + } + else + { + $desiredArrayValues = $desiredValue + $currentArrayValues = $currentValue + # if the sortArrayValues parameter is using, sort value of array + if ($SortArrayValues) + { + $desiredArrayValues = @($desiredArrayValues | Sort-Object) + $currentArrayValues = @($currentArrayValues | Sort-Object) + } + <# + for all object in collection, check their type.ConvertoString if they are script block. + + #> + for ($i = 0; $i -lt $desiredArrayValues.Count; $i++) + { + if ($desiredArrayValues[$i]) + { + $desiredType = $desiredArrayValues[$i].GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($currentArrayValues[$i]) + { + $currentType = $currentArrayValues[$i].GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementTypeMismatchMessage -f $key, $i, $currentType.FullName, $desiredType.FullName) + $InDesiredStateTable.InDesiredState = $false + continue + } + } + + <# + Convert a scriptblock into a string as scriptblocks are not comparable + if currentvalue is scriptblock and if desired value is string, + we invoke the result of script block. Ifno, we convert to string. + if Desired value + #> + + $wasCurrentArrayValuesConverted = $false + if ($currentArrayValues[$i] -is [scriptblock]) + { + $currentArrayValues[$i] = if ($desiredArrayValues[$i] -is [string]) + { + $currentArrayValues[$i] = $currentArrayValues[$i].Invoke() + } + else + { + $currentArrayValues[$i].ToString() + } + $wasCurrentArrayValuesConverted = $true + } + + if ($desiredArrayValues[$i] -is [scriptblock]) + { + $desiredArrayValues[$i] = if ($currentArrayValues[$i] -is [string] -and -not $wasCurrentArrayValuesConverted) + { + $desiredArrayValues[$i].Invoke() + } + else + { + $desiredArrayValues[$i].ToString() + } + } + + if ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentArrayValues[$i] + $param.DesiredValues = $desiredArrayValues[$i] + + 'IncludeInDesiredState','IncludeValue' | ForEach-Object { + if ($param.ContainsKey($_)) + { + $null = $param.Remove($_) + } + } + + if ($InDesiredStateTable.InDesiredState) + { + $InDesiredStateTable.InDesiredState = Test-DscParameterState @param + } + else + { + Test-DscParameterState @param | Out-Null + } + continue + } + + if ($desiredArrayValues[$i] -ne $currentArrayValues[$i]) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementValueMismatchMessage -f $i, $desiredType.FullName, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + $InDesiredStateTable.InDesiredState = $false + continue + } + else + { + Write-Verbose -Message ($script:localizedData.MatchElementValueMessage -f $i, $desiredType.FullName, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + continue + } + } + + } + } + elseif ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentValue + $param.DesiredValues = $desiredValue + + 'IncludeInDesiredState','IncludeValue' | ForEach-Object { + if ($param.ContainsKey($_)) + { + $null = $param.Remove($_) + } + } + + if ($InDesiredStateTable.InDesiredState) + { + $InDesiredStateTable.InDesiredState = Test-DscParameterState @param + } + else + { + Test-DscParameterState @param | Out-Null + } + continue + } + else + { + #Convert a scriptblock into a string as scriptblocks are not comparable + $wasCurrentValue = $false + if ($currentValue -is [scriptblock]) + { + $currentValue = if ($desiredValue -is [string]) + { + $currentValue = $currentValue.Invoke() + } + else + { + $currentValue.ToString() + } + $wasCurrentValue = $true + } + if ($desiredValue -is [scriptblock]) + { + $desiredValue = if ($currentValue -is [string] -and -not $wasCurrentValue) + { + $desiredValue.Invoke() + } + else + { + $desiredValue.ToString() + } + } + + if ($desiredValue -ne $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + $InDesiredStateTable.InDesiredState = $false + } + } + #endregion check type + } + #endregion end of enumeration + if ($ReverseCheck) + { + Write-Verbose -Message $script:localizedData.StartingReverseCheck + $reverseCheckParameters = $PSBoundParameters + $reverseCheckParameters.CurrentValues = $DesiredValues + $reverseCheckParameters.DesiredValues = $CurrentValues + $null = $reverseCheckParameters.Remove('ReverseCheck') + + if ($returnValue) + { + $returnValue = Compare-DscParameterState @reverseCheckParameters + } + else + { + $null = Compare-DscParameterState @reverseCheckParameters + } + } + + # Remove in desired state value if IncludeDesirateState parameter is not use + if (-not $IncludeInDesiredState) + { + [array]$returnValue = $returnValue.where({$_.InDesiredState -eq $false}) + } + + #change verbose message + if ($IncludeInDesiredState.IsPresent) + { + $returnValue.ForEach({ + if ($_.InDesiredState) + { + $localizedString = $script:localizedData.PropertyInDesiredStateMessage + } + else + { + $localizedString = $script:localizedData.PropertyNotInDesiredStateMessage + } + + Write-Verbose -Message ($localizedString -f $_.Property) + }) + } + <# + If Compare-DscParameterState is used in precedent step, don't need to convert it + We use .foreach() method as we are sure that $returnValue is an array. + #> + [Array]$returnValue = @( + $returnValue.foreach( + { + if ($_ -is [System.Collections.Hashtable]) + { + [pscustomobject]$_ + } + else + { + $_ + } + } + ) + ) + + return $returnValue +} +#EndRegion './Public/Compare-DscParameterState.ps1' 616 +#Region './Public/Compare-ResourcePropertyState.ps1' 0 +<# + .SYNOPSIS + Compare current and desired property values for any DSC resource. + + .DESCRIPTION + This function is used to compare current and desired property values for any + DSC resource, and return a hashtable with the metadata from the comparison. + + .PARAMETER CurrentValues + The current values that should be compared to to desired values. Normally + the values returned from Get-TargetResource. + + .PARAMETER DesiredValues + The values set in the configuration and is provided in the call to the + functions *-TargetResource, and that will be compared against current + values. Normally set to $PSBoundParameters. + + .PARAMETER Properties + An array of property names, from the keys provided in DesiredValues, that + will be compared. If this parameter is left out, all the keys in the + DesiredValues will be compared. + + .PARAMETER IgnoreProperties + An array of property names, from the keys provided in DesiredValues, that + will be ignored in the comparison. If this parameter is left out, all the + keys in the DesiredValues will be compared. + + .PARAMETER CimInstanceKeyProperties + A hashtable containing a key for each property that contain a collection + of CimInstances and the value is an array of strings of the CimInstance + key properties. + @{ + Permission = @('State') + } + + .EXAMPLE + $compareTargetResourceStateParameters = @{ + CurrentValues = (Get-TargetResource $PSBoundParameters) + DesiredValues = $PSBoundParameters + } + + $propertyState = Compare-ResourcePropertyState @compareTargetResourceStateParameters + + This examples call Compare-ResourcePropertyState with the current state + and the desired state and returns a hashtable array of all the properties + that was evaluated based on the properties pass in the parameter DesiredValues. +#> +function Compare-ResourcePropertyState +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $DesiredValues, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Properties, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $IgnoreProperties, + + [Parameter()] + [ValidateNotNull()] + [System.Collections.Hashtable] + $CimInstanceKeyProperties = @{} + ) + + if ($PSBoundParameters.ContainsKey('Properties')) + { + # Filter out the parameters (keys) not specified in Properties + $desiredValuesToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -notin $Properties + } + + $desiredValuesToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + else + { + <# + Remove any common parameters that might be part of DesiredValues, + if it $PSBoundParameters was used to pass the desired values. + #> + $commonParametersToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -in [System.Management.Automation.PSCmdlet]::CommonParameters ` + -or $_ -in [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + } + + $commonParametersToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + + # Remove any properties that should be ignored. + if ($PSBoundParameters.ContainsKey('IgnoreProperties')) + { + $IgnoreProperties | + ForEach-Object -Process { + if ($DesiredValues.ContainsKey($_)) + { + $DesiredValues.Remove($_) + } + } + } + + $compareTargetResourceStateReturnValue = @() + + foreach ($parameterName in $DesiredValues.Keys) + { + Write-Debug -Message ($script:localizedData.EvaluatePropertyState -f $parameterName) + + $parameterState = @{ + ParameterName = $parameterName + Expected = $DesiredValues.$parameterName + Actual = $CurrentValues.$parameterName + } + + # Check if the parameter is in compliance. + $isPropertyInDesiredState = Test-DscPropertyState -Values @{ + CurrentValue = $CurrentValues.$parameterName + DesiredValue = $DesiredValues.$parameterName + KeyProperties = $CimInstanceKeyProperties.$parameterName + } + + if ($isPropertyInDesiredState) + { + Write-Verbose -Message ($script:localizedData.PropertyInDesiredState -f $parameterName) + + $parameterState['InDesiredState'] = $true + } + else + { + Write-Verbose -Message ($script:localizedData.PropertyNotInDesiredState -f $parameterName) + + $parameterState['InDesiredState'] = $false + } + + $compareTargetResourceStateReturnValue += $parameterState + } + + return $compareTargetResourceStateReturnValue +} +#EndRegion './Public/Compare-ResourcePropertyState.ps1' 158 +#Region './Public/ConvertTo-CimInstance.ps1' 0 +<# + .SYNOPSIS + Converts a hashtable into a CimInstance array. + + .DESCRIPTION + This function is used to convert a hashtable into MSFT_KeyValuePair objects. + These are stored as an CimInstance array. DSC cannot handle hashtables but + CimInstances arrays storing MSFT_KeyValuePair. + + .PARAMETER Hashtable + A hashtable with the values to convert. + + .OUTPUTS + An object array with CimInstance objects. + + .EXAMPLE + ConvertTo-CimInstance -Hashtable @{ + String = 'a string' + Bool = $true + Int = 99 + Array = 'a, b, c' + } + + This example returns an CimInstance with the provided hashtable values. +#> +function ConvertTo-CimInstance +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Hashtable')] + [System.Collections.Hashtable] + $Hashtable + ) + + process + { + foreach ($item in $Hashtable.GetEnumerator()) + { + New-CimInstance -ClassName 'MSFT_KeyValuePair' -Namespace 'root/microsoft/Windows/DesiredStateConfiguration' -Property @{ + Key = $item.Key + Value = if ($item.Value -is [array]) + { + $item.Value -join ',' + } + else + { + $item.Value + } + } -ClientOnly + } + } +} +#EndRegion './Public/ConvertTo-CimInstance.ps1' 55 +#Region './Public/ConvertTo-HashTable.ps1' 0 +<# + .SYNOPSIS + Converts CimInstances into a hashtable. + + .DESCRIPTION + This function is used to convert a CimInstance array containing + MSFT_KeyValuePair objects into a hashtable. + + .PARAMETER CimInstance + An array of CimInstances or a single CimInstance object to convert. + + .OUTPUTS + Hashtable + + .EXAMPLE + $newInstanceParameters = @{ + ClassName = 'MSFT_KeyValuePair' + Namespace = 'root/microsoft/Windows/DesiredStateConfiguration' + ClientOnly = $true + } + + $cimInstance = [Microsoft.Management.Infrastructure.CimInstance[]] ( + (New-CimInstance @newInstanceParameters -Property @{ + Key = 'FirstName' + Value = 'John' + }), + + (New-CimInstance @newInstanceParameters -Property @{ + Key = 'LastName' + Value = 'Smith' + }) + ) + + ConvertTo-HashTable -CimInstance $cimInstance + + This creates a array om CimInstances of the class name MSFT_KeyValuePair + and passes it to ConvertTo-HashTable which returns a hashtable. +#> +function ConvertTo-HashTable +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'CimInstance')] + [AllowEmptyCollection()] + [Microsoft.Management.Infrastructure.CimInstance[]] + $CimInstance + ) + + begin + { + $result = @{ } + } + + process + { + foreach ($ci in $CimInstance) + { + $result.Add($ci.Key, $ci.Value) + } + } + + end + { + $result + } +} +#EndRegion './Public/ConvertTo-HashTable.ps1' 69 +#Region './Public/Get-ComputerName.ps1' 0 +<# + .SYNOPSIS + Returns the computer name cross-plattform. + + .DESCRIPTION + The variable `$env:COMPUTERNAME` does not exist cross-platform which + hinders development and testing on macOS and Linux. Instead this cmdlet + can be used to get the computer name cross-plattform. + + .EXAMPLE + Get-ComputerName + + This example returns the computer name cross-plattform. +#> +function Get-ComputerName +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + $computerName = $null + + if ($IsLinux -or $IsMacOs) + { + $computerName = hostname + } + else + { + <# + We could run 'hostname' on Windows too, but $env:COMPUTERNAME + is more widely used. + #> + $computerName = $env:COMPUTERNAME + } + + return $computerName +} +#EndRegion './Public/Get-ComputerName.ps1' 38 +#Region './Public/Get-LocalizedData.ps1' 0 +<# + .SYNOPSIS + Gets language-specific data into scripts and functions based on the UI culture + that is selected for the operating system. + Similar to Import-LocalizedData, with extra parameter 'DefaultUICulture'. + + .DESCRIPTION + The Get-LocalizedData cmdlet dynamically retrieves strings from a subdirectory + whose name matches the UI language set for the current user of the operating system. + It is designed to enable scripts to display user messages in the UI language selected + by the current user. + + Get-LocalizedData imports data from .psd1 files in language-specific subdirectories + of the script directory and saves them in a local variable that is specified in the + command. The cmdlet selects the subdirectory and file based on the value of the + $PSUICulture automatic variable. When you use the local variable in the script to + display a user message, the message appears in the user's UI language. + + You can use the parameters of G-LocalizedData to specify an alternate UI culture, + path, and file name, to add supported commands, and to suppress the error message that + appears if the .psd1 files are not found. + + The G-LocalizedData cmdlet supports the script internationalization + initiative that was introduced in Windows PowerShell 2.0. This initiative + aims to better serve users worldwide by making it easy for scripts to display + user messages in the UI language of the current user. For more information + about this and about the format of the .psd1 files, see about_Script_Internationalization. + + .PARAMETER BindingVariable + Specifies the variable into which the text strings are imported. Enter a variable + name without a dollar sign ($). + + In Windows PowerShell 2.0, this parameter is required. In Windows PowerShell 3.0, + this parameter is optional. If you omit this parameter, Import-LocalizedData + returns a hash table of the text strings. The hash table is passed down the pipeline + or displayed at the command line. + + When using Import-LocalizedData to replace default text strings specified in the + DATA section of a script, assign the DATA section to a variable and enter the name + of the DATA section variable in the value of the BindingVariable parameter. Then, + when Import-LocalizedData saves the imported content in the BindingVariable, the + imported data will replace the default text strings. If you are not specifying + default text strings, you can select any variable name. + + .PARAMETER UICulture + Specifies an alternate UI culture. The default is the value of the $PsUICulture + automatic variable. Enter a UI culture in - format, such as + en-US, de-DE, or ar-SA. + + The value of the UICulture parameter determines the language-specific subdirectory + (within the base directory) from which Import-LocalizedData gets the .psd1 file + for the script. + + The cmdlet searches for a subdirectory with the same name as the value of the + UICulture parameter or the $PsUICulture automatic variable, such as de-DE or + ar-SA. If it cannot find the directory, or the directory does not contain a .psd1 + file for the script, it searches for a subdirectory with the name of the language + code, such as de or ar. If it cannot find the subdirectory or .psd1 file, the + command fails and the data is displayed in the default language specified in the + script. + + .PARAMETER BaseDirectory + Specifies the base directory where the .psd1 files are located. The default is + the directory where the script is located. Import-LocalizedData searches for + the .psd1 file for the script in a language-specific subdirectory of the base + directory. + + .PARAMETER FileName + Specifies the name of the data file (.psd1) to be imported. Enter a file name. + You can specify a file name that does not include its .psd1 file name extension, + or you can specify the file name including the .psd1 file name extension. + + The FileName parameter is required when Import-LocalizedData is not used in a + script. Otherwise, the parameter is optional and the default value is the base + name of the script. You can use this parameter to direct Import-LocalizedData + to search for a different .psd1 file. + + For example, if the FileName is omitted and the script name is FindFiles.ps1, + Import-LocalizedData searches for the FindFiles.psd1 data file. + + .PARAMETER SupportedCommand + Specifies cmdlets and functions that generate only data. + + Use this parameter to include cmdlets and functions that you have written or + tested. For more information, see about_Script_Internationalization. + + .PARAMETER DefaultUICulture + Specifies which UICulture to default to if current UI culture or its parents + culture don't have matching data file. + + For example, if you have a data file in 'en-US' but not in 'en' or 'en-GB' and + your current culture is 'en-GB', you can default back to 'en-US'. + + .NOTES + Before using Import-LocalizedData, localize your user messages. Format the messages + for each locale (UI culture) in a hash table of key/value pairs, and save the + hash table in a file with the same name as the script and a .psd1 file name extension. + Create a directory under the script directory for each supported UI culture, and + then save the .psd1 file for each UI culture in the directory with the UI + culture name. + + For example, localize your user messages for the de-DE locale and format them in + a hash table. Save the hash table in a .psd1 file. Then create a de-DE + subdirectory under the script directory, and save the de-DE .psd1 + file in the de-DE subdirectory. Repeat this method for each locale that you support. + + Import-LocalizedData performs a structured search for the localized user + messages for a script. + + Import-LocalizedData begins the search in the directory where the script file + is located (or the value of the BaseDirectory parameter). It then searches within + the base directory for a subdirectory with the same name as the value of the + $PsUICulture variable (or the value of the UICulture parameter), such as de-DE or + ar-SA. Then, it searches in that subdirectory for a .psd1 file with the same name + as the script (or the value of the FileName parameter). + + If Import-LocalizedData cannot find a subdirectory with the name of the UI culture, + or the subdirectory does not contain a .psd1 file for the script, it searches for + a .psd1 file for the script in a subdirectory with the name of the language code, + such as de or ar. If it cannot find the subdirectory or .psd1 file, the command + fails, the data is displayed in the default language in the script, and an error + message is displayed explaining that the data could not be imported. To suppress + the message and fail gracefully, use the ErrorAction common parameter with a value + of SilentlyContinue. + + If Import-LocalizedData finds the subdirectory and the .psd1 file, it imports the + hash table of user messages into the value of the BindingVariable parameter in the + command. Then, when you display a message from the hash table in the variable, the + localized message is displayed. + + For more information, see about_Script_Internationalization. + + .EXAMPLE + $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + This is an example that can be used in DSC resources to import the + localized strings and if the current UI culture localized folder does + not exist the UI culture 'en-US' is returned. +#> +function Get-LocalizedData +{ + [CmdletBinding(DefaultParameterSetName = 'DefaultUICulture')] + param + ( + [Parameter(Position = 0)] + [Alias('Variable')] + [ValidateNotNullOrEmpty()] + [System.String] + $BindingVariable, + + [Parameter(Position = 1, ParameterSetName = 'TargetedUICulture')] + [System.String] + $UICulture, + + [Parameter()] + [System.String] + $BaseDirectory, + + [Parameter()] + [System.String] + $FileName, + + [Parameter()] + [System.String[]] + $SupportedCommand, + + [Parameter(Position = 1, ParameterSetName = 'DefaultUICulture')] + [System.String] + $DefaultUICulture = 'en-US' + ) + + begin + { + <# + Because Proxy Command changes the Invocation origin, we need to be explicit + when handing the pipeline back to original command. + #> + if (!$PSBoundParameters.ContainsKey('FileName')) + { + if ($myInvocation.ScriptName) + { + $file = [System.IO.FileInfo] $myInvocation.ScriptName + } + else + { + $file = [System.IO.FileInfo] $myInvocation.MyCommand.Module.Path + } + + $FileName = $file.BaseName + + $PSBoundParameters.Add('FileName', $file.Name) + } + + if ($PSBoundParameters.ContainsKey('BaseDirectory')) + { + $callingScriptRoot = $BaseDirectory + } + else + { + $callingScriptRoot = $MyInvocation.PSScriptRoot + + $PSBoundParameters.Add('BaseDirectory', $callingScriptRoot) + } + + if ($PSBoundParameters.ContainsKey('DefaultUICulture') -and !$PSBoundParameters.ContainsKey('UICulture')) + { + <# + We don't want the resolution to eventually return the ModuleManifest + so we run the same GetFilePath() logic than here: + https://github.com/PowerShell/PowerShell/blob/master/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Import-LocalizedData.cs#L302-L333 + and if we see it will return the wrong thing, set the UICulture to DefaultUI culture, and return the logic to Import-LocalizedData + #> + $currentCulture = Get-UICulture + + $evaluateDefaultCulture = $true + + <# + If the LCID is 127 then use default UI culture instead. + + See more information in issue https://github.com/dsccommunity/DscResource.Common/issues/11. + #> + if ($currentCulture.LCID -eq 127) + { + $currentCulture = New-Object -TypeName 'System.Globalization.CultureInfo' -ArgumentList @($DefaultUICulture) + $PSBoundParameters['UICulture'] = $DefaultUICulture + + $evaluateDefaultCulture = $false + } + + $languageFile = $null + + $localizedFileNames = @( + $FileName + '.psd1' + $FileName + '.strings.psd1' + ) + + while ($null -ne $currentCulture -and $currentCulture.Name -and -not $languageFile) + { + foreach ($fullFileName in $localizedFileNames) + { + $filePath = [System.IO.Path]::Combine($callingScriptRoot, $CurrentCulture.Name, $fullFileName) + + if (Test-Path -Path $filePath) + { + Write-Debug -Message "Found $filePath" + + $languageFile = $filePath + + # Set the filename to the file we found. + $PSBoundParameters['FileName'] = $fullFileName + + # Exit loop if we find the first filename. + break + } + else + { + Write-Debug -Message "File $filePath not found" + } + } + + if (-not $languageFile) + { + <# + Evaluate the parent culture if there is one. + + If the parent culture is LCID 127 then move to the default culture. + See more information in issue https://github.com/dsccommunity/DscResource.Common/issues/11. + #> + if ($currentCulture.Parent -and $currentCulture.Parent.LCID -ne 127) + { + $currentCulture = $currentCulture.Parent + } + else + { + if ($evaluateDefaultCulture) + { + $evaluateDefaultCulture = $false + + <# + Could not find localized strings file for the the operating + system UI culture. Evaluating the default UI culture (which + defaults to 'en-US' if not specifically set). + #> + $currentCulture = New-Object -TypeName 'System.Globalization.CultureInfo' -ArgumentList @($DefaultUICulture) + $PSBoundParameters['UICulture'] = $DefaultUICulture + } + else + { + <# + Already evaluated everything we could, exit and let + Import-LocalizedData throw an exception. + #> + break + } + } + } + } + + <# + Removes the parameter DefaultUICulture so that isn't used when + calling Import-LocalizedData. + #> + $null = $PSBoundParameters.Remove('DefaultUICulture') + } + + try + { + $outBuffer = $null + + if ($PSBoundParameters.TryGetValue('OutBuffer', [ref] $outBuffer)) + { + $PSBoundParameters['OutBuffer'] = 1 + } + + $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Import-LocalizedData', [System.Management.Automation.CommandTypes]::Cmdlet) + $scriptCmd = { & $wrappedCmd @PSBoundParameters } + + $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) + $steppablePipeline.Begin($PSCmdlet) + } + catch + { + throw + } + } + + process + { + try + { + $steppablePipeline.Process($_) + } + catch + { + throw + } + } + + end + { + if ($BindingVariable -and ($valueToBind = Get-Variable -Name $BindingVariable -ValueOnly -ErrorAction 'Ignore')) + { + # Bringing the variable to the parent scope + Set-Variable -Scope 1 -Name $BindingVariable -Force -ErrorAction 'SilentlyContinue' -Value $valueToBind + } + + try + { + $steppablePipeline.End() + } + catch + { + throw + } + } +} +#EndRegion './Public/Get-LocalizedData.ps1' 357 +#Region './Public/Get-TemporaryFolder.ps1' 0 +<# + .SYNOPSIS + Returns the path of the current user's temporary folder. + + .DESCRIPTION + Returns the path of the current user's temporary folder. + + .NOTES + This is the same as doing the following + - Windows: $env:TEMP + - macOS: $env:TMPDIR + - Linux: /tmp/ + + .EXAMPLE + Get-TemporaryFolder + + Returns the current user temporary folder on the current operating system. +#> +function Get-TemporaryFolder +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + return [IO.Path]::GetTempPath() +} +#EndRegion './Public/Get-TemporaryFolder.ps1' 27 +#Region './Public/New-InvalidArgumentException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid argument exception. + + .DESCRIPTION + Creates and throws an invalid argument exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ArgumentName + The name of the invalid argument that is causing this error to be thrown. + + .EXAMPLE + $errorMessage = $script:localizedData.ActionCannotBeUsedInThisContextMessage ` + -f $Action, $Parameter + + New-InvalidArgumentException -ArgumentName 'Action' -Message $errorMessage +#> +function New-InvalidArgumentException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArgumentName + ) + + $argumentException = New-Object -TypeName 'ArgumentException' ` + -ArgumentList @($Message, $ArgumentName) + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @($argumentException, $ArgumentName, 'InvalidArgument', $null) + } + + $errorRecord = New-Object @newObjectParameters + + throw $errorRecord +} +#EndRegion './Public/New-InvalidArgumentException.ps1' 49 +#Region './Public/New-InvalidDataException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid data exception. + + .DESCRIPTION + Creates and throws an invalid data exception. + + .PARAMETER ErrorId + The error Id to assign to the exception. + + .PARAMETER ErrorMessage + The error message to assign to the exception. + + .EXAMPLE + if ( -not $resultOfEvaluation ) + { + $errorMessage = $script:localizedData.InvalidData -f $Action + + New-InvalidDataException -ErrorId 'InvalidDataError' -ErrorMessage $errorMessage + } +#> +function New-InvalidDataException +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage + ) + + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidData + $exception = New-Object ` + -TypeName System.InvalidOperationException ` + -ArgumentList $ErrorMessage + $errorRecord = New-Object ` + -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + + throw $errorRecord +} +#EndRegion './Public/New-InvalidDataException.ps1' 47 +#Region './Public/New-InvalidOperationException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid operation exception. + + .DESCRIPTION + Creates and throws an invalid operation exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + Start-Process @startProcessArguments + } + catch + { + $errorMessage = $script:localizedData.InstallationFailedMessage -f $Path, $processId + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-InvalidOperationException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'InvalidOperation', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-InvalidOperationException.ps1' 67 +#Region './Public/New-InvalidResultException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid result exception. + + .DESCRIPTION + Creates and throws an invalid result exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + $numberOfObjects = Get-ChildItem -Path $path + if ($numberOfObjects -eq 0) + { + throw 'To few files.' + } + } + catch + { + $errorMessage = $script:localizedData.TooFewFilesMessage -f $path + New-InvalidResultException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-InvalidResultException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'InvalidResult', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-InvalidResultException.ps1' 71 +#Region './Public/New-NotImplementedException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an not implemented exception. + + .DESCRIPTION + Creates and throws an not implemented exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + if ($runFeature) + { + $errorMessage = $script:localizedData.FeatureMissing -f $path + New-NotImplementedException -Message $errorMessage -ErrorRecord $_ + } + + Throws an not implemented exception if the variable $runFeature contains + a value. +#> +function New-NotImplementedException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'NotImplemented', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-NotImplementedException.ps1' 66 +#Region './Public/New-ObjectNotFoundException.ps1' 0 + +<# + .SYNOPSIS + Creates and throws an object not found exception. + + .DESCRIPTION + Creates and throws an object not found exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + Get-ChildItem -Path $path + } + catch + { + $errorMessage = $script:localizedData.PathNotFoundMessage -f $path + New-ObjectNotFoundException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-ObjectNotFoundException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'ObjectNotFound', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-ObjectNotFoundException.ps1' 68 +#Region './Public/Remove-CommonParameter.ps1' 0 +<# + .SYNOPSIS + Removes common parameters from a hashtable. + + .DESCRIPTION + This function serves the purpose of removing common parameters and option + common parameters from a parameter hashtable. + + .PARAMETER Hashtable + The parameter hashtable that should be pruned. + + .EXAMPLE + Remove-CommonParameter -Hashtable $PSBoundParameters + + Returns a new hashtable without the common and optional common parameters. +#> +function Remove-CommonParameter +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', + '', + Justification = 'ShouldProcess is not supported in DSC resources.' + )] + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Hashtable + ) + + $inputClone = $Hashtable.Clone() + + $commonParameters = [System.Management.Automation.PSCmdlet]::CommonParameters + $commonParameters += [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + + $Hashtable.Keys | Where-Object -FilterScript { + $_ -in $commonParameters + } | ForEach-Object -Process { + $inputClone.Remove($_) + } + + return $inputClone +} +#EndRegion './Public/Remove-CommonParameter.ps1' 46 +#Region './Public/Set-DscMachineRebootRequired.ps1' 0 +<# + .SYNOPSIS + Set the DSC reboot required status variable. + + .DESCRIPTION + Sets the global DSCMachineStatus variable to a value of 1. + This function is used to set the global variable that indicates + to the LCM that a reboot of the node is required. + + .EXAMPLE + PS C:\> Set-DscMachineRebootRequired + + Sets the $global:DSCMachineStatus variable to 1. + + .NOTES + This function is implemented so that individual resource modules + do not need to use and therefore suppress Global variables + directly. It also enables mocking to increase testability of + consumers. +#> +function Set-DscMachineRebootRequired +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + # Suppressing this rule because $global:DSCMachineStatus is used to trigger a reboot. + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + <# + Suppressing this rule because $global:DSCMachineStatus is only set, + never used (by design of Desired State Configuration). + #> + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '')] + [CmdletBinding()] + param + ( + ) + + $global:DSCMachineStatus = 1 +} +#EndRegion './Public/Set-DscMachineRebootRequired.ps1' 38 +#Region './Public/Set-PSModulePath.ps1' 0 + +<# + .SYNOPSIS + Set environment variable PSModulePath in the current session or machine + wide. + + .DESCRIPTION + This is a wrapper to set environment variable PSModulePath in current + session or machine wide. + + .PARAMETER Path + A string with all the paths separated by semi-colons. + + .PARAMETER Machine + If set the PSModulePath will be changed machine wide. If not set, only + the current session will be changed. + + .EXAMPLE + Set-PSModulePath -Path ';' + + .EXAMPLE + Set-PSModulePath -Path ';' -Machine +#> +function Set-PSModulePath +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', + '', + Justification = 'ShouldProcess is not supported in DSC resources.' + )] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Machine + ) + + if ($Machine.IsPresent) + { + [System.Environment]::SetEnvironmentVariable('PSModulePath', $Path, [System.EnvironmentVariableTarget]::Machine) + } + else + { + $env:PSModulePath = $Path + } +} +#EndRegion './Public/Set-PSModulePath.ps1' 53 +#Region './Public/Test-DscParameterState.ps1' 0 +<# + .SYNOPSIS + This method is used to test current and desired values for any DSC resource. + + .DESCRIPTION + This function tests the parameter status of DSC resource parameters against + the current values present on the system. + + .PARAMETER CurrentValues + A hashtable with the current values on the system, obtained by e.g. + Get-TargetResource. + + .PARAMETER DesiredValues + The hashtable of desired values. For example $PSBoundParameters with the + desired values. + + .PARAMETER Properties + This is a list of properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER ExcludeProperties + This is a list of which properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER TurnOffTypeChecking + Indicates that the type of the parameter should not be checked. + + .PARAMETER ReverseCheck + Indicates that a reverse check should be done. The current and desired state + are swapped for another test. + + .PARAMETER SortArrayValues + If the sorting of array values does not matter, values are sorted internally + before doing the comparison. + + .EXAMPLE + $currentState = Get-TargetResource @PSBoundParameters + + $returnValue = Test-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters + + The function Get-TargetResource is called first using all bound parameters + to get the values in the current state. The result is then compared to the + desired state by calling `Test-DscParameterState`. + + .EXAMPLE + $getTargetResourceParameters = @{ + ServerName = $ServerName + InstanceName = $InstanceName + Name = $Name + } + + $returnValue = Test-DscParameterState ` + -CurrentValues (Get-TargetResource @getTargetResourceParameters) ` + -DesiredValues $PSBoundParameters ` + -ExcludeProperties @( + 'FailsafeOperator' + 'NotificationMethod' + ) + + This compares the values in the current state against the desires state. + The function Get-TargetResource is called using just the required parameters + to get the values in the current state. The parameter 'ExcludeProperties' + is used to exclude the properties 'FailsafeOperator' and + 'NotificationMethod' from the comparison. + + .EXAMPLE + $getTargetResourceParameters = @{ + ServerName = $ServerName + InstanceName = $InstanceName + Name = $Name + } + + $returnValue = Test-DscParameterState ` + -CurrentValues (Get-TargetResource @getTargetResourceParameters) ` + -DesiredValues $PSBoundParameters ` + -Properties ServerName, Name + + This compares the values in the current state against the desires state. + The function Get-TargetResource is called using just the required parameters + to get the values in the current state. The 'Properties' parameter is used + to to only compare the properties 'ServerName' and 'Name'. +#> +function Test-DscParameterState +{ + [CmdletBinding()] + [OutputType([Bool])] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Object] + $DesiredValues, + + [Parameter()] + [System.String[]] + [Alias('ValuesToCheck')] + $Properties, + + [Parameter()] + [System.String[]] + $ExcludeProperties, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $TurnOffTypeChecking, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ReverseCheck, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $SortArrayValues + ) + + $returnValue = $true + + $resultCompare = Compare-DscParameterState @PSBoundParameters + + if ($resultCompare.InDesiredState -contains $false) + { + $returnValue = $false + } + + return $returnValue +} +#EndRegion './Public/Test-DscParameterState.ps1' 130 +#Region './Public/Test-IsNanoServer.ps1' 0 +<# + .SYNOPSIS + Tests if the current OS is a Nano server. + + .DESCRIPTION + Tests if the current OS is a Nano server. + + .EXAMPLE + Test-IsNanoServer + + Returns $true if the current operating system is Nano Server, if not $false + is returned. +#> +function Test-IsNanoServer +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param () + + $productDatacenterNanoServer = 143 + $productStandardNanoServer = 144 + + $operatingSystemSKU = (Get-CimInstance -ClassName Win32_OperatingSystem).OperatingSystemSKU + + Write-Verbose -Message ($script:localizedData.TestIsNanoServerOperatingSystemSku -f $operatingSystemSKU) + + return ($operatingSystemSKU -in ($productDatacenterNanoServer, $productStandardNanoServer)) +} +#EndRegion './Public/Test-IsNanoServer.ps1' 29 +#Region './suffix.ps1' 0 +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' +#EndRegion './suffix.ps1' 2 diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/en-US/DscResource.Common.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/en-US/DscResource.Common.strings.psd1 new file mode 100644 index 0000000..14c3a4f --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/en-US/DscResource.Common.strings.psd1 @@ -0,0 +1,38 @@ +# Localized English (en-US) strings. + +ConvertFrom-StringData @' + TestIsNanoServerOperatingSystemSku = OperatingSystemSKU {0} was returned by Win32_OperatingSystem when detecting if operating system is Nano Server. (DRC0008) + ModuleNotFound = Please ensure that the PowerShell module '{0}' is installed. (DRC0009) + ParameterUsageWrong = None of the parameter(s) '{0}' may be used at the same time as any of the parameter(s) '{1}'. (DRC0010) + AddressFormatError = Address '{0}' is not in the correct format. Please correct the Address parameter in the configuration and try again. (DRC0011) + AddressIPv4MismatchError = Address '{0}' is in IPv4 format, which does not match server address family {1}. Please correct either of them in the configuration and try again. (DRC0012) + AddressIPv6MismatchError = Address '{0}' is in IPv6 format, which does not match server address family {1}. Please correct either of them in the configuration and try again. (DRC0013) + InvalidDesiredValuesError = Property 'DesiredValues' in Test-DscParameterState must be either a Hashtable or CimInstance. Type detected was '{0}'. (DRC0014) + InvalidCurrentValuesError = Property 'CurrentValues' in Test-DscParameterState must be either a Hashtable, CimInstance, or CimIntance[]. Type detected was '{0}'. (DRC0015) + InvalidPropertiesError = If 'DesiredValues' is a CimInstance then property 'Properties' must contain a value. (DRC0016) + MatchPsCredentialUsernameMessage = MATCH: PSCredential username match. Current state is '{0}' and desired state is '{1}'. (DRC0017) + NoMatchPsCredentialUsernameMessage = NOTMATCH: PSCredential username mismatch. Current state is '{0}' and desired state is '{1}'. (DRC0018) + NoMatchTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type is '{1}' and desired type is '{2}'. (DRC0019) + MatchValueMessage = MATCH: Value (type '{0}') for property '{1}' does match. Current state is '{2}' and desired state is '{3}'. (DRC0020) + NoMatchValueMessage = NOTMATCH: Value (type '{0}') for property '{1}' does not match. Current state is '{2}' and desired state is '{3}'. (DRC0021) + NoMatchValueDifferentCountMessage = NOTMATCH: Value (type '{0}') for property '{1}' does have a different count. Current state count is '{2}' and desired state count is '{3}'. (DRC0022) + NoMatchElementTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type of element [{1}] is '{2}' and desired type is '{3}'. (DRC0023) + NoMatchElementValueMismatchMessage = NOTMATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. (DRC0024) + MatchElementValueMessage = MATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. (DRC0025) + PropertyInDesiredStateMessage = Property '{0}' is in desired state. (DRC0026) + StartingReverseCheck = Starting with a reverse check. (DRC0027) + TestDscParameterCompareMessage = Comparing values in property '{0}'. (DRC0028) + TooManyCimInstances = More than one CIM instance was returned from the current state. (DRC0029) + TestingCimInstance = Testing CIM instance '{0}' with the key properties '{1}'. (DRC0030) + MissingCimInstance = The CIM instance '{0}' with the key properties '{1}' is missing. (DRC0031) + ArrayValueIsAbsent = The array value '{0}' is absent. (DRC0032) + ArrayValueIsPresent = The array value '{0}' is present. (DRC0033) + KeyPropertiesMissing = The hashtable passed to function Test-DscPropertyState is missing the key 'KeyProperties'. This must be set to the property names that makes each instance in the CIM instance collection unique. (DRC0034) + ArrayDoesNotMatch = One or more values in an array does not match the desired state. Details of the changes are below. (DRC0035) + PropertyValueOfTypeDoesNotMatch = {0} value does not match. Current value is '{1}', but expected the value '{2}'. (DRC0036) + UnableToCompareType = Unable to compare the type {0} as it is not handled by the Test-DscPropertyState cmdlet. (DRC0037) + EvaluatePropertyState = Evaluating the state of the property '{0}'. (DRC0038) + PropertyInDesiredState = The parameter '{0}' is in desired state. (DRC0039) + PropertyNotInDesiredState = The parameter '{0}' is not in desired state. (DRC0040) + PropertyNotInDesiredStateMessage = Property '{0}' is not in desired state. (DRC0041) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/en-US/about_DscResource.Common.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/en-US/about_DscResource.Common.help.txt new file mode 100644 index 0000000..2a99677 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/Modules/DscResource.Common/0.10.2/en-US/about_DscResource.Common.help.txt @@ -0,0 +1,26 @@ +TOPIC + about_DscResource.Common + +SHORT DESCRIPTION + Common functions used in DSC tesources. + +LONG DESCRIPTION + This module contains common functions that are used in DSC resources. + +EXAMPLES + PS C:\> Get-Command -Module DscResource.Common + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/DscResource.Common + +SEE ALSO + - https://github.com/dsccommunity/DscResource.Common + +KEYWORDS + DSC, Localization + diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/PSGetModuleInfo.xml b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/PSGetModuleInfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..7242bf7fb2c1d6edb46babd55e9e55d4ba0c8423 GIT binary patch literal 62730 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 literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordA.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordA.strings.psd1 new file mode 100644 index 0000000..3f083ea --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordA.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordA. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' on '{3}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAScoped.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAScoped.strings.psd1 new file mode 100644 index 0000000..73d661a --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAScoped.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordAScoped. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' with the '{2}' scope, from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' with the '{2}' scope on '{3}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAaaa.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAaaa.strings.psd1 new file mode 100644 index 0000000..ee652e2 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAaaa.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordAaaa. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' on '{3}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAaaaScoped.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAaaaScoped.strings.psd1 new file mode 100644 index 0000000..9524359 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordAaaaScoped.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordAaaaScoped. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' with the '{2}' scope, from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' with the '{2}' scope on '{3}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordBase.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordBase.strings.psd1 new file mode 100644 index 0000000..fb9879b --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordBase.strings.psd1 @@ -0,0 +1,20 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + class DnsRecordBase. +#> + +ConvertFrom-StringData @' + GettingDscResourceObject = Calling GetResourceRecord() from the {0} class to get the object's current state. + RecordNotFound = A matching DNS resource record not found. + RecordFound = A matching DNS resource record was found. + ModifyingExistingRecord = Modifying existing record. + RemovingExistingRecord = Removing existing record. + AddingNewRecord = Calling AddResourceRecord() from the {0} class to create a new record. + PropertyIsNotInDesiredState = DNS record property '{0}' is not correct. Expected '{1}', actual '{2}'. + ObjectInDesiredState = DNS record is in the desired state. + ObjectNotInDesiredState = DNS record is NOT in the desired state. + GetResourceRecordNotImplemented = GetResourceRecord() not implemented. + AddResourceRecordNotImplemented = AddResourceRecord() not implemented. + NewResourceObjectFromRecordNotImplemented = NewDscResourceObjectFromRecord() not implemented. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordCname.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordCname.strings.psd1 new file mode 100644 index 0000000..a619bf0 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordCname.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordCname. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' on '{3}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordCnameScoped.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordCnameScoped.strings.psd1 new file mode 100644 index 0000000..058737e --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordCnameScoped.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordCnameScoped. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' with the '{2}' scope, from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' with the '{2}' scope on '{3}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordMx.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordMx.strings.psd1 new file mode 100644 index 0000000..7d23c5a --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordMx.strings.psd1 @@ -0,0 +1,11 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordMx. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' on '{3}'. + DomainZoneMismatch = Email domain '{0}' must be the same as the zone specified ('{1}') or a subdomain thereof. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordMxScoped.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordMxScoped.strings.psd1 new file mode 100644 index 0000000..a35fa4b --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordMxScoped.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordMxScoped. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' with the '{2}' scope, from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' with the '{2}' scope on '{3}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordNs.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordNs.strings.psd1 new file mode 100644 index 0000000..2977996 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordNs.strings.psd1 @@ -0,0 +1,11 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordNs. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' on '{3}'. + DomainZoneMismatch = Domain '{0}' must be the same as the zone specified ('{1}') or a subdomain thereof. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordNsScoped.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordNsScoped.strings.psd1 new file mode 100644 index 0000000..28d8aba --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordNsScoped.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordNsScoped. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' with the '{2}' scope, from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' with the '{2}' scope on '{3}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordPtr.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordPtr.strings.psd1 new file mode 100644 index 0000000..332d6be --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordPtr.strings.psd1 @@ -0,0 +1,13 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordPtr. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting specified DNS {0} record in zone '{1}' from '{3}'. + CreatingDnsRecordMessage = Creating {0} record specified in zone '{1}' on '{3}'. + NotAnIPv4Zone = The zone "{0}" is not an IPv4 reverse lookup zone. + NotAnIPv6Zone = The zone "{0}" is not an IPv6 reverse lookup zone. + WrongZone = "{0}" does not belong to the "{1}" zone. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordSrv.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordSrv.strings.psd1 new file mode 100644 index 0000000..739f372 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordSrv.strings.psd1 @@ -0,0 +1,10 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordSrvScoped. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting DNS record '{0}' with target of '{1}' ({2}) in zone '{3}' from '{5}'. + CreatingDnsRecordMessage = Creating {0} record for symbolic name '{1}' with target '{2}' in zone '{3}' on '{5}'. +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordSrvScoped.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordSrvScoped.strings.psd1 new file mode 100644 index 0000000..42a70d7 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsRecordSrvScoped.strings.psd1 @@ -0,0 +1,11 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsRecordSrvScoped. +#> + +ConvertFrom-StringData @' + GettingDnsRecordMessage = Getting DNS record '{0}' with target of '{1}' ({2}) in zone '{3}' with the '{4}' scope, from '{5}'. + CreatingDnsRecordMessage = Creating {0} record for symbolic name '{1}' with target '{2}' in zone '{3}' with the '{4}' scope on '{5}'. + +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerCache.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerCache.strings.psd1 new file mode 100644 index 0000000..fddeab9 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerCache.strings.psd1 @@ -0,0 +1,14 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsServerCache. +#> + +ConvertFrom-StringData @' + GetCurrentState = Getting the current state of the cache settings for the server '{0}'. (DSC0001) + TestDesiredState = Determining the current state of the cache settings for the server '{0}'. (DSC0002) + SetDesiredState = Setting the desired state for the cache settings for the server '{0}'. (DSC0003) + NotInDesiredState = The cache settings for the server '{0}' is not in desired state. (DSC0004) + InDesiredState = The cache settings for the server '{0}' is in desired state. (DSC0005) + SetProperty = The cache property '{0}' will be set to '{1}'. (DSC0006) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerDsSetting.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerDsSetting.strings.psd1 new file mode 100644 index 0000000..82c8af9 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerDsSetting.strings.psd1 @@ -0,0 +1,14 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsServerDsSetting. +#> + +ConvertFrom-StringData @' + GetCurrentState = Getting the current state of the directory services settings for the server '{0}'. (DSDS0001) + TestDesiredState = Determining the current state of the directory services settings for the server '{0}'. (DSDS0002) + SetDesiredState = Setting the desired state for the directory services settings for the server '{0}'. (DSDS0003) + NotInDesiredState = The directory services settings for the server '{0}' is not in desired state. (DSDS0004) + InDesiredState = The directory services settings for the server '{0}' is in desired state. (DSDS0005) + SetProperty = The directory services property '{0}' will be set to '{1}'. (DSDS0006) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerDsc.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerDsc.strings.psd1 new file mode 100644 index 0000000..3b4e73d --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerDsc.strings.psd1 @@ -0,0 +1,12 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsServerDsc module. This file should only contain + localized strings for private and public functions. +#> + +ConvertFrom-StringData @' + PropertyHasWrongFormat = The property '{0}' has the value '{1}' that cannot be converted to [System.TimeSpan]. (DS0001) + TimeSpanExceedMaximumValue = The property '{0}' has the value '{1}' that exceeds the maximum value of '{2}'. (DS0002) + TimeSpanBelowMinimumValue = The property '{0}' has the value '{1}' that is below the minimum value of '{2}'. (DS0003) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerEDns.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerEDns.strings.psd1 new file mode 100644 index 0000000..629d3b0 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerEDns.strings.psd1 @@ -0,0 +1,14 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsServerEDns. +#> + +ConvertFrom-StringData @' + GetCurrentState = Getting the current state of the extension mechanisms for DNS (EDNS) settings for the server '{0}'. (DSED0001) + TestDesiredState = Determining the current state of the extension mechanisms for DNS (EDNS) settings for the server '{0}'. (DSED0002) + SetDesiredState = Setting the desired state for the extension mechanisms for DNS (EDNS) settings for the server '{0}'. (DSED0003) + NotInDesiredState = The extension mechanisms for DNS (EDNS) settings for the server '{0}' is not in desired state. (DSED0004) + InDesiredState = The extension mechanisms for DNS (EDNS) settings for the server '{0}' is in desired state. (DSED0005) + SetProperty = The extension mechanisms for DNS (EDNS) property '{0}' will be set to '{1}'. (DSED0006) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerRecursion.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerRecursion.strings.psd1 new file mode 100644 index 0000000..5571875 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerRecursion.strings.psd1 @@ -0,0 +1,15 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsServerRecursion. +#> + +ConvertFrom-StringData @' + GetCurrentState = Getting the current state of the recursion settings for the server '{0}'. (DSR0001) + TestDesiredState = Determining the current state of the recursion settings for the server '{0}'. (DSR0002) + SetDesiredState = Setting the desired state for the recursion settings for the server '{0}'. (DSR0003) + NotInDesiredState = The recursion settings for the server '{0}' is not in desired state. (DSR0004) + InDesiredState = The recursion settings for the server '{0}' is in desired state. (DSR0005) + SetProperty = The recursion property '{0}' will be set to '{1}'. (DSR0006) + PropertyIsNotInValidRange = The property '{0}' has the value '{1}' that is not within the range of 1 seconds to 15 seconds. (DSR0007) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerScavenging.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerScavenging.strings.psd1 new file mode 100644 index 0000000..a74c392 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/DnsServerScavenging.strings.psd1 @@ -0,0 +1,14 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + resource DnsServerScavenging. +#> + +ConvertFrom-StringData @' + GetCurrentState = Getting the current state of the scavenging settings for the server '{0}'. (DSS0001) + TestDesiredState = Determining the current state of the scavenging settings for the server '{0}'. (DSS0002) + SetDesiredState = Setting the desired state for the scavenging settings for the server '{0}'. (DSS0003) + NotInDesiredState = The scavenging settings for the server '{0}' is not in desired state. (DSS0004) + InDesiredState = The scavenging settings for the server '{0}' is in desired state. (DSS0005) + SetProperty = The scavenging property '{0}' will be set to '{1}'. (DSS0006) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/ResourceBase.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/ResourceBase.strings.psd1 new file mode 100644 index 0000000..f73e82d --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/ResourceBase.strings.psd1 @@ -0,0 +1,17 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + class ResourceBase. +#> + +ConvertFrom-StringData @' + GetCurrentState = Getting the current state of {1} for the server '{0}'. (RB0001) + TestDesiredState = Determining the current state of {1} for the server '{0}'. (RB0002) + SetDesiredState = Setting the desired state of {1} for the server '{0}'. (RB0003) + NotInDesiredState = The {1} for the server '{0}' is not in desired state. (RB0004) + InDesiredState = The {1} for the server '{0}' is in desired state. (RB0005) + SetProperty = The {2} property '{0}' will be set to '{1}'. (RB0006) + NoPropertiesToSet = All properties are in desired state. (RB0007) + ModifyMethodNotImplemented = An override for the method Modify() is not implemented in the resource. (RB0008) + GetCurrentStateMethodNotImplemented = An override for the method GetCurrentState() is not implemented in the resource. (RB0009) +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/ResourcePropertiesBase.strings.psd1 b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/ResourcePropertiesBase.strings.psd1 new file mode 100644 index 0000000..20d13e8 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/ResourcePropertiesBase.strings.psd1 @@ -0,0 +1,14 @@ +<# + .SYNOPSIS + The localized resource strings in English (en-US) for the + class ResourcePropertiesBase. + + .NOTES + This should normally not have any strings since the base class is only meant + to have DSC properties that can be inherited. Though this localized string + file exist so that it possible to recursively look for strings in all inherited + classes (base classes). +#> + +ConvertFrom-StringData @' +'@ diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordA.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordA.help.txt new file mode 100644 index 0000000..b7b73da --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordA.help.txt @@ -0,0 +1,80 @@ +.NAME + DnsRecordA + +.SYNOPSIS + The DnsRecordA DSC resource manages A DNS records against a specific zone on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordA DSC resource manages A DNS records against a specific zone on a Domain Name System (DNS) server. + +.PARAMETER Name + Key - System.String + Specifies the name of a DNS server resource record object. (Key Parameter) + +.PARAMETER IPv4Address + Key - System.String + Specifies the IPv4 address of a host. (Key Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS A record exists when only the mandatory properties are specified. + +Configuration DnsRecordA_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordA 'TestRecord' + { + ZoneName = 'contoso.com' + Name = 'www' + IPv4Address = '192.168.50.10' + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS A record exists when all properties are specified. + +Configuration DnsRecordA_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordA 'TestRecord' + { + ZoneName = 'contoso.com' + Name = 'www' + IPv4Address = '192.168.50.10' + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS A record does not exist when mandatory properties are specified. + +Note that not all mandatory properties are necessarily key properties. Non-key property values will be ignored when determining whether the record is to be removed. + +Configuration DnsRecordA_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordA 'TestRecord' + { + ZoneName = 'contoso.com' + Name = 'www' + IPv4Address = '192.168.50.10' + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAScoped.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAScoped.help.txt new file mode 100644 index 0000000..1f84f01 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAScoped.help.txt @@ -0,0 +1,79 @@ +.NAME + DnsRecordAScoped + +.SYNOPSIS + The DnsRecordAScoped DSC resource manages A DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordAScoped DSC resource manages A DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.PARAMETER ZoneScope + Key - System.String + Specifies the name of a zone scope. (Key Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS A record exists when only the mandatory properties are specified. + +Configuration DnsRecordAScoped_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + Name = 'www' + IPv4Address = '192.168.50.10' + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS A record exists when all properties are specified. + +Configuration DnsRecordAScoped_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + Name = 'www' + IPv4Address = '192.168.50.10' + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS A record does not exist when mandatory properties are specified. + +Note that not all mandatory properties are necessarily key properties. Non-key property values will be ignored when determining whether the record is to be removed. + +Configuration DnsRecordAScoped_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + Name = 'www' + IPv4Address = '192.168.50.10' + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAaaa.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAaaa.help.txt new file mode 100644 index 0000000..f582638 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAaaa.help.txt @@ -0,0 +1,80 @@ +.NAME + DnsRecordAaaa + +.SYNOPSIS + The DnsRecordAaaa DSC resource manages AAAA DNS records against a specific zone on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordAaaa DSC resource manages AAAA DNS records against a specific zone on a Domain Name System (DNS) server. + +.PARAMETER Name + Key - System.String + Specifies the name of a DNS server resource record object. (Key Parameter) + +.PARAMETER IPv6Address + Key - System.String + Specifies the IPv6 address of a host. (Key Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS AAAA record exists when only the mandatory properties are specified. + +Configuration DnsRecordAaaa_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAaaa 'TestRecord' + { + ZoneName = 'contoso.com' + Name = 'www' + IPv6Address = '2001:db8:85a3::8a2e:370:7334' + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS AAAA record exists when all properties are specified. + +Configuration DnsRecordAaaa_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAaaa 'TestRecord' + { + ZoneName = 'contoso.com' + Name = 'www' + IPv6Address = '2001:db8:85a3::8a2e:370:7334' + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS AAAA record does not exist when mandatory properties are specified. + +Note that not all mandatory properties are necessarily key properties. Non-key property values will be ignored when determining whether the record is to be removed. + +Configuration DnsRecordAaaa_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAaaa 'TestRecord' + { + ZoneName = 'contoso.com' + Name = 'www' + IPv6Address = '2001:db8:85a3::8a2e:370:7334' + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAaaaScoped.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAaaaScoped.help.txt new file mode 100644 index 0000000..87de7af --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordAaaaScoped.help.txt @@ -0,0 +1,79 @@ +.NAME + DnsRecordAaaaScoped + +.SYNOPSIS + The DnsRecordAaaaScoped DSC resource manages AAAA DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordAaaaScoped DSC resource manages AAAA DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.PARAMETER ZoneScope + Key - System.String + Specifies the name of a zone scope. (Key Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS AAAA record exists when only the mandatory properties are specified. + +Configuration DnsRecordAaaaScoped_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAaaaScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + Name = 'www' + IPv6Address = '2001:db8:85a3::8a2e:370:7334' + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS AAAA record exists when all properties are specified. + +Configuration DnsRecordAaaaScoped_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAaaaScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + Name = 'www' + IPv6Address = '2001:db8:85a3::8a2e:370:7334' + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS AAAA record does not exist when mandatory properties are specified. + +Note that not all mandatory properties are necessarily key properties. Non-key property values will be ignored when determining whether the record is to be removed. + +Configuration DnsRecordAaaaScoped_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordAaaaScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + Name = 'www' + IPv6Address = '2001:db8:85a3::8a2e:370:7334' + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordCname.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordCname.help.txt new file mode 100644 index 0000000..954a7e9 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordCname.help.txt @@ -0,0 +1,16 @@ +.NAME + DnsRecordCname + +.SYNOPSIS + The DnsRecordCname DSC resource manages CNAME DNS records against a specific zone on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordCname DSC resource manages CNAME DNS records against a specific zone on a Domain Name System (DNS) server. + +.PARAMETER Name + Key - System.String + Specifies the name of a DNS server resource record object. (Key Parameter) + +.PARAMETER HostNameAlias + Key - System.String + Specifies a a canonical name target for a CNAME record. This must be a fully qualified domain name (FQDN). (Key Parameter) diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordCnameScoped.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordCnameScoped.help.txt new file mode 100644 index 0000000..7b0c83d --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordCnameScoped.help.txt @@ -0,0 +1,12 @@ +.NAME + DnsRecordCnameScoped + +.SYNOPSIS + The DnsRecordCnameScoped DSC resource manages CNAME DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordCnameScoped DSC resource manages CNAME DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.PARAMETER ZoneScope + Key - System.String + Specifies the name of a zone scope. (Key Parameter) diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordMx.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordMx.help.txt new file mode 100644 index 0000000..b284676 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordMx.help.txt @@ -0,0 +1,90 @@ +.NAME + DnsRecordMx + +.SYNOPSIS + The DnsRecordMx DSC resource manages MX DNS records against a specific zone on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordMx DSC resource manages MX DNS records against a specific zone on a Domain Name System (DNS) server. + +.PARAMETER EmailDomain + Key - System.String + Everything after the '@' in the email addresses supported by this mail exchanger. It must be a subdomain the zone or the zone itself. To specify all subdomains, use the '' character (i.e.: .contoso.com). (Key Parameter) + +.PARAMETER MailExchange + Key - System.String + FQDN of the server handling email for the specified email domain. When setting the value, this FQDN must resolve to an IP address and cannot reference a CNAME record. (Key Parameter) + +.PARAMETER Priority + Required - System.UInt16 + Specifies the priority for this MX record among other MX records that belong to the same email domain, where a lower value has a higher priority. (Mandatory Parameter) + +.PARAMETER recordName + Write - System.String + +.EXAMPLE 1 + +This configuration will ensure a DNS MX record exists when only the mandatory properties are specified. + +Configuration DnsRecordMx_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordMx 'TestRecord' + { + ZoneName = 'contoso.com' + EmailDomain = 'contoso.com' + MailExchange = 'mailserver1.contoso.com' + Priority = 20 + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS MX record exists when all properties are specified. + +Configuration DnsRecordMx_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordMx 'TestRecord' + { + ZoneName = 'contoso.com' + EmailDomain = 'contoso.com' + MailExchange = 'mailserver1.contoso.com' + Priority = 20 + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS MX record does not exist when mandatory properties are specified. + +Note that the 'Priority' property value will be ignored when determining whether the record is to be removed. + +Configuration DnsRecordMx_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordMx 'TestRecord' + { + ZoneName = 'contoso.com' + EmailDomain = 'contoso.com' + MailExchange = 'mailserver1.contoso.com' + Priority = 20 + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordMxScoped.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordMxScoped.help.txt new file mode 100644 index 0000000..45fa2a7 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordMxScoped.help.txt @@ -0,0 +1,82 @@ +.NAME + DnsRecordMxScoped + +.SYNOPSIS + The DnsRecordMxScoped DSC resource manages MX DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordMxScoped DSC resource manages MX DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.PARAMETER ZoneScope + Key - System.String + Specifies the name of a zone scope. (Key Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS MX record exists when only the mandatory properties are specified. + +Configuration DnsRecordMxScoped_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordMxScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + EmailDomain = 'contoso.com' + MailExchange = 'mailserver1.contoso.com' + Priority = 20 + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS MX record exists when all properties are specified. + +Configuration DnsRecordMxScoped_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordMxScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + EmailDomain = 'contoso.com' + MailExchange = 'mailserver1.contoso.com' + Priority = 20 + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS MX record does not exist when mandatory properties are specified. + +Note that the 'Priority' property value will be ignored when determining whether the record is to be removed. + +Configuration DnsRecordMxScoped_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordMxScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + EmailDomain = 'contoso.com' + MailExchange = 'mailserver1.contoso.com' + Priority = 20 + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordNs.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordNs.help.txt new file mode 100644 index 0000000..990d15e --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordNs.help.txt @@ -0,0 +1,80 @@ +.NAME + DnsRecordNs + +.SYNOPSIS + The DnsRecordNs DSC resource manages NS DNS records against a specific zone on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordNs DSC resource manages NS DNS records against a specific zone on a Domain Name System (DNS) server. + +.PARAMETER DomainName + Key - System.String + Specifies the fully qualified DNS domain name for which the NameServer is authoritative. It must be a subdomain the zone or the zone itself. To specify all subdomains, use the '' character (i.e.: .contoso.com). (Key Parameter) + +.PARAMETER NameServer + Key - System.String + Specifies the name server of a domain. This should be a fully qualified domain name, not an IP address (Key Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS NS record exists when only the mandatory properties are specified. + +Configuration DnsRecordNs_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordNs 'TestRecord' + { + ZoneName = 'contoso.com' + DomainName = 'contoso.com' + NameServer = 'ns.contoso.com' + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS NS record exists when all properties are specified. + +Configuration DnsRecordNs_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordNs 'TestRecord' + { + ZoneName = 'contoso.com' + DomainName = 'contoso.com' + NameServer = 'ns.contoso.com' + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS NS record does not exist when mandatory properties are specified. + +Note that not all mandatory properties are necessarily key properties. Non-key property values will be ignored when determining whether the record is to be removed. + +Configuration DnsRecordNs_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordNs 'TestRecord' + { + ZoneName = 'contoso.com' + DomainName = 'contoso.com' + NameServer = 'ns.contoso.com' + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordNsScoped.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordNsScoped.help.txt new file mode 100644 index 0000000..5fd2ef6 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordNsScoped.help.txt @@ -0,0 +1,79 @@ +.NAME + DnsRecordNsScoped + +.SYNOPSIS + The DnsRecordNsScoped DSC resource manages NS DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordNsScoped DSC resource manages NS DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.PARAMETER ZoneScope + Key - System.String + Specifies the name of a zone scope. (Key Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS NS record exists when only the mandatory properties are specified. + +Configuration DnsRecordNsScoped_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordNsScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + DomainName = 'contoso.com' + NameServer = 'ns.contoso.com' + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS NS record exists when all properties are specified. + +Configuration DnsRecordNsScoped_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordNsScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + DomainName = 'contoso.com' + NameServer = 'ns.contoso.com' + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS NS record does not exist when mandatory properties are specified. + +Note that not all mandatory properties are necessarily key properties. Non-key property values will be ignored when determining whether the record is to be removed. + +Configuration DnsRecordNsScoped_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordNsScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + DomainName = 'contoso.com' + NameServer = 'ns.contoso.com' + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordPtr.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordPtr.help.txt new file mode 100644 index 0000000..b4dd5ee --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordPtr.help.txt @@ -0,0 +1,143 @@ +.NAME + DnsRecordPtr + +.SYNOPSIS + The DnsRecordPtr DSC resource manages PTR DNS records against a specific zone on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordPtr DSC resource manages PTR DNS records against a specific zone on a Domain Name System (DNS) server. + +.PARAMETER IpAddress + Key - System.String + Specifies the IP address to which the record is associated (Can be either IPv4 or IPv6. (Key Parameter) + +.PARAMETER Name + Key - System.String + Specifies the FQDN of the host when you add a PTR resource record. (Key Parameter) + +.PARAMETER recordHostName + Write - System.String + +.EXAMPLE 1 + +This configuration will ensure a DNS PTR record exists when only the mandatory properties are specified. + +Configuration DnsRecordPtr_Mandatory_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordPtr 'TestRecord' + { + ZoneName = '0.168.192.in-addr.arpa' + IpAddress = '192.168.0.9' + Name = 'quarks.contoso.com' + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS PTR record exists when all properties are specified. + +Configuration DnsRecordPtr_Full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordPtr 'TestRecord' + { + ZoneName = '0.168.192.in-addr.arpa' + IpAddress = '192.168.0.9' + Name = 'quarks.contoso.com' + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will ensure a DNS PTR record does not exist when mandatory properties are specified. + +Configuration DnsRecordPtr_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordPtr 'TestRecord' + { + ZoneName = '0.168.192.in-addr.arpa' + IpAddress = '192.168.0.9' + Name = 'quarks.contoso.com' + Ensure = 'Absent' + } + } +} + +.EXAMPLE 4 + +This configuration will ensure a DNS PTR record exists for an IPv6 address when only the mandatory properties are specified. + +Configuration DnsRecordPtr_Mandatory_v6_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordPtr 'TestRecord' + { + ZoneName = '0.0.d.f.ip6.arpa' + IpAddress = 'fd00::515c:0:0:d59' + Name = 'quarks.contoso.com' + Ensure = 'Present' + } + } +} + +.EXAMPLE 5 + +This configuration will ensure a DNS PTR record exists for an IPv6 address when all properties are specified. + +Configuration DnsRecordPtr_Full_v6_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordPtr 'TestRecord' + { + ZoneName = '0.0.d.f.ip6.arpa' + IpAddress = 'fd00::515c:0:0:d59' + Name = 'quarks.contoso.com' + TimeToLive = '01:00:00' + DnsServer = 'localhost' + Ensure = 'Present' + } + } +} + +.EXAMPLE 6 + +This configuration will ensure a DNS PTR record does not exist for an IPv6 address when mandatory properties are specified. + +Configuration DnsRecordPtr_Remove_v6_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordPtr 'TestRecord' + { + ZoneName = '0.0.d.f.ip6.arpa' + IpAddress = 'fd00::515c:0:0:d59' + Name = 'quarks.contoso.com' + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordSrv.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordSrv.help.txt new file mode 100644 index 0000000..6f6384e --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordSrv.help.txt @@ -0,0 +1,112 @@ +.NAME + DnsRecordSrv + +.SYNOPSIS + The DnsRecordSrv DSC resource manages SRV DNS records against a specific zone on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordSrv DSC resource manages SRV DNS records against a specific zone on a Domain Name System (DNS) server. + +.PARAMETER SymbolicName + Key - System.String + Service name for the SRV record. eg: xmpp, ldap, etc. (Key Parameter) + +.PARAMETER Protocol + Key - System.String + Allowed values: TCP, UDP + Service transmission protocol ('TCP' or 'UDP') (Key Parameter) + +.PARAMETER Port + Key - System.UInt16 + The TCP or UDP port on which the service is found (Key Parameter) + +.PARAMETER Target + Key - System.String + Specifies the Target Hostname or IP Address. (Key Parameter) + +.PARAMETER Priority + Required - System.UInt16 + Specifies the Priority value of the SRV record. (Mandatory Parameter) + +.PARAMETER Weight + Required - System.UInt16 + Specifies the weight of the SRV record. (Mandatory Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS SRV record exists for +XMPP that points to chat.contoso.com with a priority +of 10, weight of 20. + +Configuration DnsRecordSrv_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordSrv 'TestRecord' + { + ZoneName = 'contoso.com' + SymbolicName = 'xmpp' + Protocol = 'tcp' + Port = 5222 + Target = 'chat.contoso.com' + Priority = 10 + Weight = 20 + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS SRV record exists for +XMPP that points to chat.contoso.com with a priority of 20, +weight of 50 and TTL of 5 hours. + +Configuration DnsRecordSrv_full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordSrv 'TestRecord Full' + { + ZoneName = 'contoso.com' + SymbolicName = 'xmpp' + Protocol = 'tcp' + Port = 5222 + Target = 'chat.contoso.com' + Priority = 20 + Weight = 50 + TimeToLive = '05:00:00' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will remove a specified DNS SRV record. Note that +Priority and Weight are mandatory attributes, but their values are not +used to determine which record to remove. + +Configuration DnsRecordSrv_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordSrv 'RemoveTestRecord' + { + ZoneName = 'contoso.com' + SymbolicName = 'xmpp' + Protocol = 'tcp' + Port = 5222 + Target = 'chat.contoso.com' + Priority = 0 + Weight = 0 + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordSrvScoped.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordSrvScoped.help.txt new file mode 100644 index 0000000..06bd7ab --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsRecordSrvScoped.help.txt @@ -0,0 +1,95 @@ +.NAME + DnsRecordSrvScoped + +.SYNOPSIS + The DnsRecordSrvScoped DSC resource manages SRV DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.DESCRIPTION + The DnsRecordSrvScoped DSC resource manages SRV DNS records against a specific zone and zone scope on a Domain Name System (DNS) server. + +.PARAMETER ZoneScope + Key - System.String + Specifies the name of a zone scope. (Key Parameter) + +.EXAMPLE 1 + +This configuration will ensure a DNS SRV record exists +in the external scope for XMPP that points to +chat.contoso.com with a priority of 10, weight of 20. + +Configuration DnsRecordSrvScoped_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordSrvScoped 'TestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + SymbolicName = 'xmpp' + Protocol = 'tcp' + Port = 5222 + Target = 'chat.contoso.com' + Priority = 10 + Weight = 20 + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +This configuration will ensure a DNS SRV record exists in the +external scope for XMPP that points to chat.contoso.com with +a priority of 20, weight of 50 and Time To Live of 5 hours. + +Configuration DnsRecordSrvScoped_full_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordSrvScoped 'TestRecord Full' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + SymbolicName = 'xmpp' + Protocol = 'tcp' + Port = 5222 + Target = 'chat.contoso.com' + Priority = 20 + Weight = 50 + TimeToLive = '05:00:00' + Ensure = 'Present' + } + } +} + +.EXAMPLE 3 + +This configuration will remove a specified DNS SRV record in the +external scope. Note that Priority and Weight are mandatory +attributes, but their values are not used to determine which +record to remove. + +Configuration DnsRecordSrvScoped_Remove_config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsRecordSrvScoped 'RemoveTestRecord' + { + ZoneName = 'contoso.com' + ZoneScope = 'external' + SymbolicName = 'xmpp' + Protocol = 'tcp' + Port = 5222 + Target = 'chat.contoso.com' + Priority = 0 + Weight = 0 + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerCache.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerCache.help.txt new file mode 100644 index 0000000..ee79d74 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerCache.help.txt @@ -0,0 +1,93 @@ +.NAME + DnsServerCache + +.SYNOPSIS + The DnsServerCache DSC resource manages cache settings on a Microsoft Domain + Name System (DNS) server. + +.DESCRIPTION + The DnsServerCache DSC resource manages cache settings on a Microsoft Domain + Name System (DNS) server. + +.PARAMETER DnsServer + Key - System.String + The host name of the Domain Name System (DNS) server, or use 'localhost' + for the current node. + +.PARAMETER IgnorePolicies + Write - Nullable[System.Boolean] + Specifies whether to ignore policies for this cache. + +.PARAMETER LockingPercent + Write - Nullable[System.UInt32] + Specifies a percentage of the original Time to Live (TTL) value that caching + can consume. Cache locking is configured as a percent value. For example, if + the cache locking value is set to 50, the DNS server does not overwrite a + cached entry for half of the duration of the TTL. If the cache locking percent + is set to 100 that means the DNS server will not overwrite cached entries + for the entire duration of the TTL. + +.PARAMETER MaxKBSize + Write - Nullable[System.UInt32] + Specifies the maximum size, in kilobytes, of the memory cache of a DNS server. + If set to 0 there is no limit. + +.PARAMETER MaxNegativeTtl + Write - System.String + Specifies how long an entry that records a negative answer to a query remains + stored in the DNS cache. Minimum value is '00:00:01' and maximum value is + '30.00:00:00' + +.PARAMETER MaxTtl + Write - System.String + Specifies how long a record is saved in cache. Minimum value is '00:00:00' + and maximum value is '30.00:00:00'. If the TimeSpan is set to '00:00:00' + (0 seconds), the DNS server does not cache records. + +.PARAMETER EnablePollutionProtection + Write - Nullable[System.Boolean] + Specifies whether DNS filters name service (NS) resource records that are + cached. Valid values are False ($false), which caches all responses to name + queries; and True ($true), which caches only the records that belong to the + same DNS subtree. + + When you set this parameter value to False ($false), cache pollution + protection is disabled. A DNS server caches the Host (A) record and all queried + NS resources that are in the DNS server zone. In this case, DNS can also cache + the NS record of an unauthorized DNS server. This event causes name resolution + to fail or to be appropriated for subsequent queries in the specified domain. + + When you set the value for this parameter to True ($true), the DNS server + enables cache pollution protection and ignores the Host (A) record. The DNS + server performs a cache update query to resolve the address of the NS if the + NS is outside the zone of the DNS server. The additional query minimally + affects DNS server performance. + +.PARAMETER StoreEmptyAuthenticationResponse + Write - Nullable[System.Boolean] + Specifies whether a DNS server stores empty authoritative responses in the + cache (RFC-2308). + +.EXAMPLE 1 + +This configuration will change the cache settings on the DNS server. + +Configuration DnsServerCache_SetCacheSettings_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerCache 'SetCacheSettings' + { + DnsServer = 'localhost' + EnablePollutionProtection = $true + StoreEmptyAuthenticationResponse = $true + IgnorePolicies = $false + LockingPercent = 100 + MaxKBSize = 0 + MaxNegativeTtl = '00:15:00' + MaxTtl = '1.00:00:00' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerDsSetting.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerDsSetting.help.txt new file mode 100644 index 0000000..4e13a33 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerDsSetting.help.txt @@ -0,0 +1,228 @@ +.NAME + DnsServerDsSetting + +.SYNOPSIS + The DnsServerDsSetting DSC resource manages DNS Active Directory settings + on a Microsoft Domain Name System (DNS) server. + +.DESCRIPTION + The DnsServerDsSetting DSC resource manages DNS Active Directory settings + on a Microsoft Domain Name System (DNS) server. + +.PARAMETER DnsServer + Key - System.String + The host name of the Domain Name System (DNS) server, or use 'localhost' + for the current node. + +.PARAMETER DirectoryPartitionAutoEnlistInterval + Write - System.String + Specifies the interval, during which a DNS server tries to enlist itself + in a DNS domain partition and DNS forest partition, if it is not already + enlisted. We recommend that you limit this value to the range one hour to + 180 days, inclusive, but you can use any value. We recommend that you set + the default value to one day. You must set the value 0 (zero) as a flag + value for the default value. However, you can allow zero and treat it + literally. + +.PARAMETER LazyUpdateInterval + Write - Nullable[System.UInt32] + Specifies a value, in seconds, to determine how frequently the DNS server + submits updates to the directory server without specifying the + LDAPSERVERLAZYCOMMITOID control ([MS-ADTS] section 3.1.1.3.4.1.7) at + the same time that it processes DNS dynamic update requests. We recommend + that you limit this value to the range 0x00000000 to 0x0000003c. You must + set the default value to 0x00000003. You must set the value zero to + indicate that the DNS server does not specify the + LDAPSERVERLAZYCOMMITOID control at the same time that it processes + DNS dynamic update requests. For more information about + LDAPSERVERLAZYCOMMITOID, see LDAPSERVERLAZYCOMMITOID control + code. The LDAPSERVERLAZYCOMMITOID control instructs the DNS server + to return the results of a directory service modification command after + it is completed in memory but before it is committed to disk. In this + way, the server can return results quickly and save data to disk without + sacrificing performance. The DNS server must send this control only to + the directory server that is attached to an LDAP update that the DNS + server initiates in response to a DNS dynamic update request. If the + value is nonzero, LDAP updates that occur during the processing of DNS + dynamic update requests must not specify the LDAPSERVERLAZYCOMMITOID + control if a period of less than DsLazyUpdateInterval seconds has passed + since the last LDAP update that specifies this control. If a period that + is greater than DsLazyUpdateInterval seconds passes, during which time + the DNS server does not perform an LDAP update that specifies this + control, the DNS server must specify this control on the next update. + +.PARAMETER MinimumBackgroundLoadThreads + Write - Nullable[System.UInt32] + Specifies the minimum number of background threads that the DNS server + uses to load zone data from the directory service. You must limit this + value to the range 0x00000000 to 0x00000005, inclusive. You must set the + default value to 0x00000001, and you must treat the value zero as a flag + value for the default value. + +.PARAMETER PollingInterval + Write - System.String + Specifies how frequently the DNS server polls Active Directory Domain + Services (AD DS) for changes in Active Directory-integrated zones. You + must limit the value to the range 30 seconds to 3,600 seconds, inclusive. + +.PARAMETER RemoteReplicationDelay + Write - Nullable[System.UInt32] + Specifies the minimum interval, in seconds, that the DNS server waits + between the time that it determines that a single object has changed on + a remote directory server, to the time that it tries to replicate a + single object change. You must limit the value to the range 0x00000005 + to 0x00000E10, inclusive. You must set the default value to 0x0000001E, + and you must treat the value zero as a flag value for the default value. + +.PARAMETER TombstoneInterval + Write - System.String + Specifies the amount of time that DNS keeps tombstoned records alive in + Active Directory. We recommend that you limit this value to the range + three days to eight weeks, inclusive, but you can set it to any value in + the range 82 hours to 8 weeks. We recommend that you set the default + value to 14 days and treat the value zero as a flag value for the + default. However, you can allow the value zero and treat it literally. + At 2:00 A.M. local time every day, the DNS server must search all + directory service zones for nodes that have the Active Directory + dnsTombstoned attribute set to True, and for a directory service + EntombedTime (section 2.2.2.2.3.23 of MS-DNSP) value that is greater + than previous directory service DSTombstoneInterval seconds. You must + permanently delete all such nodes from the directory server. + +.EXAMPLE 1 + +This configuration will change the Directory Partition Auto Enlist +Interval in Active Directory. + +configuration DnsServerDsSetting_DirectoryPartitionAutoEnlistInterval_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + node localhost + { + DnsServerDsSetting 'Integration_Test' + { + DnsServer = 'localhost' + DirectoryPartitionAutoEnlistInterval = '1.00:00:00' + } + } +} + +.EXAMPLE 2 + +This configuration will change the Lazy Update +Interval in Active Directory. + +configuration DnsServerDsSetting_LazyUpdateInterval_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + node localhost + { + DnsServerDsSetting 'Integration_Test' + { + DnsServer = 'localhost' + LazyUpdateInterval = 3 + } + } +} + +.EXAMPLE 3 + +This configuration will change the Minimum Background Load Threads +in Active Directory. + +configuration DnsServerDsSetting_MinimumBackgroundLoadThreads_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + node localhost + { + DnsServerDsSetting 'Integration_Test' + { + DnsServer = 'localhost' + MinimumBackgroundLoadThreads = 1 + } + } +} + +.EXAMPLE 4 + +This configuration will change the Polling +Interval in Active Directory. + +configuration DnsServerDsSetting_PollingInterval_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + node localhost + { + DnsServerDsSetting 'Integration_Test' + { + DnsServer = 'localhost' + PollingInterval = 180 + } + } +} + +.EXAMPLE 5 + +This configuration will change the Remote Replication Delay +in Active Directory. + +configuration DnsServerDsSetting_RemoteReplicationDelay_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + node localhost + { + DnsServerDsSetting 'Integration_Test' + { + DnsServer = 'localhost' + RemoteReplicationDelay = 30 + } + } +} + +.EXAMPLE 6 + +This configuration will change the DNS Tombstone +Interval in Active Directory. + +configuration DnsServerDsSetting_TombstoneInterval_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + node localhost + { + DnsServerDsSetting 'Integration_Test' + { + DnsServer = 'localhost' + TombstoneInterval = '14.00:00:00' + } + } +} + +.EXAMPLE 7 + +This configuration will set all Active Directory-based DNS settings on +the specified server. + +configuration DnsServerDsSetting_All_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + node localhost + { + DnsServerDsSetting 'Integration_Test' + { + DnsServer = 'localhost' + DirectoryPartitionAutoEnlistInterval = '1.00:00:00' + LazyUpdateInterval = 3 + MinimumBackgroundLoadThreads = 1 + PollingInterval = 180 + RemoteReplicationDelay = 30 + TombstoneInterval = '14.00:00:00' + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerDsc.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerDsc.help.txt new file mode 100644 index 0000000..766eef3 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerDsc.help.txt @@ -0,0 +1,25 @@ +TOPIC + about_DnsServerDsc + +SHORT DESCRIPTION + DSC resources for the management and configuration of Windows Server DNS Server. + +LONG DESCRIPTION + This module contains DSC resources for the management and configuration of Windows Server DNS Server. + +EXAMPLES + PS C:\> Get-DscResource -Module DnsServerDsc + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/DnsServerDsc + +SEE ALSO + - https://github.com/dsccommunity/DnsServerDsc + +KEYWORDS + DSC, DscResource, DNS diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerEDns.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerEDns.help.txt new file mode 100644 index 0000000..d5791aa --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerEDns.help.txt @@ -0,0 +1,85 @@ +.NAME + DnsServerEDns + +.SYNOPSIS + The DnsServerEDns DSC resource manages extension mechanisms for DNS (EDNS) + on a Microsoft Domain Name System (DNS) server. + +.DESCRIPTION + The DnsServerEDns DSC resource manages extension mechanisms for DNS (EDNS) + on a Microsoft Domain Name System (DNS) server. + +.PARAMETER DnsServer + Key - System.String + The host name of the Domain Name System (DNS) server, or use 'localhost' + for the current node. + +.PARAMETER CacheTimeout + Write - System.String + Specifies the number of seconds that the DNS server caches EDNS information. + +.PARAMETER EnableProbes + Write - Nullable[System.Boolean] + Specifies whether to enable the server to probe other servers to determine + whether they support EDNS. + +.PARAMETER EnableReception + Write - Nullable[System.Boolean] + Specifies whether the DNS server accepts queries that contain an EDNS record. + +.EXAMPLE 1 + +This configuration will change the cache timeout for +extension mechanisms for DNS (EDNS) on the DNS server. + +Configuration DnsServerEDns_SetCacheTimeout_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerEDns 'SetCacheTimeout' + { + DnsServer = 'localhost' + CacheTimeout = '00:15:00' + } + } +} + +.EXAMPLE 2 + +This configuration will enable probes for the extension mechanisms for DNS +(EDNS) on the DNS server. + +Configuration DnsServerEDns_EnableProbes_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerEDns 'EnableProbes' + { + DnsServer = 'localhost' + EnableProbes = $true + } + } +} + +.EXAMPLE 3 + +This configuration will allow to accepts queries for the extension mechanisms +for DNS (EDNS) on the DNS server. + +Configuration DnsServerEDns_EnableReception_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerEDns 'EnableReception' + { + DnsServer = 'localhost' + EnableReception = $true + } + } +} diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerRecursion.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerRecursion.help.txt new file mode 100644 index 0000000..4eb9c4a --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerRecursion.help.txt @@ -0,0 +1,52 @@ +.NAME + DnsServerRecursion + +.SYNOPSIS + The DnsServerRecursion DSC resource manages recursion settings on a Microsoft + Domain Name System (DNS) server. + +.DESCRIPTION + The DnsServerRecursion DSC resource manages recursion settings on a Microsoft + Domain Name System (DNS) server. Recursion occurs when a DNS server queries + other DNS servers on behalf of a requesting client, and then sends the answer + back to the client. + + The property SecureResponse that can be set by the cmdlet Set-DnsServerRecursion + changes the same value as EnablePollutionProtection in the resource DnsServerCache + does. Use the property EnablePollutionProtection in the resource DnsServerCache + to enforce pollution protection. + +.PARAMETER DnsServer + Key - System.String + The host name of the Domain Name System (DNS) server, or use 'localhost' + for the current node. + +.PARAMETER Enable + Write - Nullable[System.Boolean] + Specifies whether the server enables recursion. + +.PARAMETER AdditionalTimeout + Write - Nullable[System.UInt32] + Specifies the time interval, in seconds, that a DNS server waits as it uses + recursion to get resource records from a remote DNS server. Valid values are + in the range of 1 second to 15 seconds. See recommendation in the documentation + of https://docs.microsoft.com/en-us/powershell/module/dnsserver/set-dnsserverrecursion. + +.PARAMETER RetryInterval + Write - Nullable[System.UInt32] + Specifies elapsed seconds before a DNS server retries a recursive lookup. + Valid values are in the range of 1 second to 15 seconds. The + recommendation is that in general this value should not be change. However, + under a few circumstances it can be considered changing the value. For + example, if a DNS server contacts a remote DNS server over a slow link and + retries the lookup before it gets a response, it could help to raise the + retry interval to be slightly longer than the observed response time. + See recommendation in the documentation of https://docs.microsoft.com/en-us/powershell/module/dnsserver/set-dnsserverrecursion. + +.PARAMETER Timeout + Write - Nullable[System.UInt32] + Specifies the number of seconds that a DNS server waits before it stops + trying to contact a remote server. The valid value is in the range of 1 + second to 15 seconds. Recommendation is to increase this value when + recursion occurs over a slow link. See recommendation in the documentation + of https://docs.microsoft.com/en-us/powershell/module/dnsserver/set-dnsserverrecursion. diff --git a/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerScavenging.help.txt b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerScavenging.help.txt new file mode 100644 index 0000000..75712d4 --- /dev/null +++ b/deployment/dsc/azshcihost/DnsServerDsc/3.0.0/en-US/about_DnsServerScavenging.help.txt @@ -0,0 +1,137 @@ +.NAME + DnsServerScavenging + +.SYNOPSIS + The DnsServerScavenging DSC resource manages scavenging on a Microsoft + Domain Name System (DNS) server. + +.DESCRIPTION + The DnsServerScavenging DSC resource manages scavenging on a Microsoft + Domain Name System (DNS) server. + +.PARAMETER DnsServer + Key - System.String + The host name of the Domain Name System (DNS) server, or use 'localhost' + for the current node. + +.PARAMETER ScavengingState + Write - Nullable[System.Boolean] + Specifies whether to Enable automatic scavenging of stale records. + ScavengingState determines whether the DNS scavenging feature is enabled + by default on newly created zones. + +.PARAMETER ScavengingInterval + Write - System.String + Specifies a length of time as a value that can be converted to a [TimeSpan] + object. ScavengingInterval determines whether the scavenging feature for + the DNS server is enabled and sets the number of hours between scavenging + cycles. The value 0 disables scavenging for the DNS server. A setting + greater than 0 enables scavenging for the server and sets the number of + days, hours, minutes, and seconds (formatted as dd.hh:mm:ss) between + scavenging cycles. The minimum value is 0. The maximum value is 365.00:00:00 + (1 year). + +.PARAMETER RefreshInterval + Write - System.String + Specifies the refresh interval as a value that can be converted to a [TimeSpan] + object (formatted as dd.hh:mm:ss). During this interval, a DNS server can + refresh a resource record that has a non-zero time stamp. Zones on the server + inherit this value automatically. If a DNS server does not refresh a resource + record that has a non-zero time stamp, the DNS server can remove that record + during the next scavenging. Do not select a value smaller than the longest + refresh period of a resource record registered in the zone. The minimum value + is 0. The maximum value is 365.00:00:00 (1 year). + +.PARAMETER NoRefreshInterval + Write - System.String + Specifies a length of time as a value that can be converted to a [TimeSpan] + object (formatted as dd.hh:mm:ss). NoRefreshInterval sets a period of time + in which no refreshes are accepted for dynamically updated records. Zones on + the server inherit this value automatically. This value is the interval between + the last update of a timestamp for a record and the earliest time when the + timestamp can be refreshed. The minimum value is 0. The maximum value is + 365.00:00:00 (1 year). + +.PARAMETER LastScavengeTime + Read - Nullable[System.DateTime] + The time when the last scavenging cycle was executed. + +.EXAMPLE 1 + +This configuration will enable scavenging and change the scavenging intervals +on the DNS server. + +Configuration DnsServerScavenging_EnableAndChangeScavengingIntervals_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerScavenging 'EnableScavengingAndChangeIntervals' + { + DnsServer = 'localhost' + ScavengingState = $true + ScavengingInterval = '7.00:00:00' + RefreshInterval = '7.00:00:00' + NoRefreshInterval = '7.00:00:00' + } + } +} + +.EXAMPLE 2 + +This configuration will enable scavenging on the DNS server, using +the default interval values. + +Configuration DnsServerScavenging_EnableScavenging_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerScavenging 'EnableScavenging' + { + DnsServer = 'localhost' + ScavengingState = $true + } + } +} + +.EXAMPLE 3 + +This configuration will change scavenging intervals on the DNS server, but +does not enforce that scavenging is enabled. + +Configuration DnsServerScavenging_ChangeScavengingIntervals_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerScavenging 'ChangeScavengingIntervals' + { + DnsServer = 'localhost' + ScavengingInterval = '7.00:00:00' + RefreshInterval = '7.00:00:00' + NoRefreshInterval = '7.00:00:00' + } + } +} + +.EXAMPLE 4 + +This configuration will disable scavenging on the DNS server. + +Configuration DnsServerScavenging_DisableScavenging_Config +{ + Import-DscResource -ModuleName 'DnsServerDsc' + + Node localhost + { + DnsServerScavenging 'DisableScavenging' + { + DnsServer = 'localhost' + ScavengingState = $false + } + } +} diff --git a/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Convert-WindowsImage.ps1 b/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Convert-WindowsImage.ps1 new file mode 100644 index 0000000..43f4efa --- /dev/null +++ b/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Convert-WindowsImage.ps1 @@ -0,0 +1,4081 @@ + +function +Convert-WindowsImage +{ + <# + .NOTES + Copyright (c) Microsoft Corporation. All rights reserved. + + Use of this sample source code is subject to the terms of the Microsoft + license agreement under which you licensed this sample source code. If + you did not accept the terms of the license agreement, you are not + authorized to use this sample source code. For the terms of the license, + please see the license agreement between you and Microsoft or, if applicable, + see the LICENSE.RTF on your install media or the root of your tools installation. + THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. + + .SYNOPSIS + Creates a bootable VHD(X) based on Windows 7 or Windows 8 installation media. + + .DESCRIPTION + Creates a bootable VHD(X) based on Windows 7 or Windows 8 installation media. + + .PARAMETER SourcePath + The complete path to the WIM or ISO file that will be converted to a Virtual Hard Disk. + The ISO file must be valid Windows installation media to be recognized successfully. + + .PARAMETER CacheSource + If the source WIM/ISO was copied locally, we delete it by default. + Pass $true to cache the source image from the temp directory. + + .PARAMETER VHDPath + The name and path of the Virtual Hard Disk to create. + Omitting this parameter will create the Virtual Hard Disk is the current directory, (or, + if specified by the -WorkingDirectory parameter, the working directory) and will automatically + name the file in the following format: + + ....___. + i.e.: + 9200.0.amd64fre.winmain_win8rtm.120725-1247_client_professional_en-us.vhd(x) + + .PARAMETER WorkingDirectory + Specifies the directory where the VHD(X) file should be generated. + If specified along with -VHDPath, the -WorkingDirectory value is ignored. + The default value is the current directory ($pwd). + + .PARAMETER TempDirectory + Specifies the directory where the logs and ISO files should be placed. + The default value is the temp directory ($env:Temp). + + .PARAMETER SizeBytes + The size of the Virtual Hard Disk to create. + For fixed disks, the VHD(X) file will be allocated all of this space immediately. + For dynamic disks, this will be the maximum size that the VHD(X) can grow to. + The default value is 40GB. + + .PARAMETER VHDFormat + Specifies whether to create a VHD or VHDX formatted Virtual Hard Disk. + The default is AUTO, which will create a VHD if using the BIOS disk layout or + VHDX if using UEFI or WindowsToGo layouts. + + .PARAMETER DiskLayout + Specifies whether to build the image for BIOS (MBR), UEFI (GPT), or WindowsToGo (MBR). + Generation 1 VMs require BIOS (MBR) images. Generation 2 VMs require UEFI (GPT) images. + Windows To Go images will boot in UEFI or BIOS but are not technically supported (upgrade + doesn't work) + + .PARAMETER UnattendPath + The complete path to an unattend.xml file that can be injected into the VHD(X). + + .PARAMETER Edition + The name or image index of the image to apply from the WIM. + + .PARAMETER Passthru + Specifies that the full path to the VHD(X) that is created should be + returned on the pipeline. + + .PARAMETER BCDBoot + By default, the version of BCDBOOT.EXE that is present in \Windows\System32 + is used by Convert-WindowsImage. If you need to specify an alternate version, + use this parameter to do so. + + .PARAMETER MergeFolder + Specifies additional MergeFolder path to be added to the root of the VHD(X) + + .PARAMETER BCDinVHD + Specifies the purpose of the VHD(x). Use NativeBoot to skip cration of BCD store + inside the VHD(x). Use VirtualMachine (or do not specify this option) to ensure + the BCD store is created inside the VHD(x). + + .PARAMETER Driver + Full path to driver(s) (.inf files) to inject to the OS inside the VHD(x). + + .PARAMETER ExpandOnNativeBoot + Specifies whether to expand the VHD(x) to its maximum suze upon native boot. + The default is True. Set to False to disable expansion. + + .PARAMETER RemoteDesktopEnable + Enable Remote Desktop to connect to the OS inside the VHD(x) upon provisioning. + Does not include Windows Firewall rules (firewall exceptions). The default is False. + + .PARAMETER Feature + Enables specified Windows Feature(s). Note that you need to specify the Internal names + understood by DISM and DISM CMDLets (e.g. NetFx3) instead of the "Friendly" names + from Server Manager CMDLets (e.g. NET-Framework-Core). + + .PARAMETER Package + Injects specified Windows Package(s). Accepts path to either a directory or individual + CAB or MSU file. + + .PARAMETER ShowUI + Specifies that the Graphical User Interface should be displayed. + + .PARAMETER EnableDebugger + Configures kernel debugging for the VHD(X) being created. + EnableDebugger takes a single argument which specifies the debugging transport to use. + Valid transports are: None, Serial, 1394, USB, Network, Local. + + Depending on the type of transport selected, additional configuration parameters will become + available. + + Serial: + -ComPort - The COM port number to use while communicating with the debugger. + The default value is 1 (indicating COM1). + -BaudRate - The baud rate (in bps) to use while communicating with the debugger. + The default value is 115200, valid values are: + 9600, 19200, 38400, 56700, 115200 + + 1394: + -Channel - The 1394 channel used to communicate with the debugger. + The default value is 10. + + USB: + -Target - The target name used for USB debugging. + The default value is "debugging". + + Network: + -IPAddress - The IP address of the debugging host computer. + -Port - The port on which to connect to the debugging host. + The default value is 50000, with a minimum value of 49152. + -Key - The key used to encrypt the connection. Only [0-9] and [a-z] are allowed. + -nodhcp - Prevents the use of DHCP to obtain the target IP address. + -newkey - Specifies that a new encryption key should be generated for the connection. + + .PARAMETER DismPath + Full Path to an alternative version of the Dism.exe tool. The default is the current OS version. + + .PARAMETER ApplyEA + Specifies that any EAs captured in the WIM should be applied to the VHD. + The default is False. + + .EXAMPLE + .\Convert-WindowsImage.ps1 -SourcePath D:\foo\install.wim -Edition Professional -WorkingDirectory D:\foo + + This command will create a 40GB dynamically expanding VHD in the D:\foo folder. + The VHD will be based on the Professional edition from D:\foo\install.wim, + and will be named automatically. + + .EXAMPLE + .\Convert-WindowsImage.ps1 -SourcePath D:\foo\Win7SP1.iso -Edition Ultimate -VHDPath D:\foo\Win7_Ultimate_SP1.vhd + + This command will parse the ISO file D:\foo\Win7SP1.iso and try to locate + \sources\install.wim. If that file is found, it will be used to create a + dynamically-expanding 40GB VHD containing the Ultimate SKU, and will be + named D:\foo\Win7_Ultimate_SP1.vhd + + .EXAMPLE + .\Convert-WindowsImage.ps1 -SourcePath D:\foo\install.wim -Edition Professional -EnableDebugger Serial -ComPort 2 -BaudRate 38400 + + This command will create a VHD from D:\foo\install.wim of the Professional SKU. + Serial debugging will be enabled in the VHD via COM2 at a baud rate of 38400bps. + + .OUTPUTS + System.IO.FileInfo + #> + #Requires -Version 3.0 + [CmdletBinding(DefaultParameterSetName="SRC", + HelpURI="https://github.com/Microsoft/Virtualization-Documentation/tree/master/hyperv-tools/Convert-WindowsImage")] + + param( + [Parameter(ParameterSetName="SRC", Mandatory=$true, ValueFromPipeline=$true)] + [Alias("WIM")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path $(Resolve-Path $_) })] + $SourcePath, + + [Parameter(ParameterSetName="SRC")] + [switch] + $CacheSource = $false, + + [Parameter(ParameterSetName="SRC")] + [Alias("SKU")] + [string[]] + [ValidateNotNullOrEmpty()] + $Edition, + + [Parameter(ParameterSetName="SRC")] + [Alias("WorkDir")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path $_ })] + $WorkingDirectory = $pwd, + + [Parameter(ParameterSetName="SRC")] + [Alias("TempDir")] + [string] + [ValidateNotNullOrEmpty()] + $TempDirectory = $env:Temp, + + [Parameter(ParameterSetName="SRC")] + [Alias("VHD")] + [string] + [ValidateNotNullOrEmpty()] + $VHDPath, + + [Parameter(ParameterSetName="SRC")] + [Alias("Size")] + [UInt64] + [ValidateNotNullOrEmpty()] + [ValidateRange(512MB, 64TB)] + $SizeBytes = 25GB, + + [Parameter(ParameterSetName="SRC")] + [Alias("Format")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet("VHD", "VHDX", "AUTO")] + $VHDFormat = "AUTO", + + [Parameter(ParameterSetName="SRC")] + [Alias("MergeFolder")] + [string] + [ValidateNotNullOrEmpty()] + $MergeFolderPath = "", + + [Parameter(ParameterSetName="SRC", Mandatory=$true)] + [Alias("Layout")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet("BIOS", "UEFI", "WindowsToGo")] + $DiskLayout, + + [Parameter(ParameterSetName="SRC")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet("NativeBoot", "VirtualMachine")] + $BCDinVHD = "VirtualMachine", + + [Parameter(ParameterSetName="SRC")] + [Parameter(ParameterSetName="UI")] + [string] + $BCDBoot = "bcdboot.exe", + + [Parameter(ParameterSetName="SRC")] + [Parameter(ParameterSetName="UI")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet("None", "Serial", "1394", "USB", "Local", "Network")] + $EnableDebugger = "None", + + [Parameter(ParameterSetName="SRC")] + [string[]] + [ValidateNotNullOrEmpty()] + $Feature, + + [Parameter(ParameterSetName="SRC")] + [string[]] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path $(Resolve-Path $_) })] + $Driver, + + [Parameter(ParameterSetName="SRC")] + [string[]] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path $(Resolve-Path $_) })] + $Package, + + [Parameter(ParameterSetName="SRC")] + [switch] + $ExpandOnNativeBoot = $true, + + [Parameter(ParameterSetName="SRC")] + [switch] + $RemoteDesktopEnable = $false, + + [Parameter(ParameterSetName="SRC")] + [Alias("Unattend")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path $(Resolve-Path $_) })] + $UnattendPath, + + [Parameter(ParameterSetName="SRC")] + [Parameter(ParameterSetName="UI")] + [switch] + $Passthru, + + [Parameter(ParameterSetName="SRC")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path $(Resolve-Path $_) })] + $DismPath, + + [Parameter(ParameterSetName="SRC")] + [switch] + $ApplyEA = $false, + + [Parameter(ParameterSetName="UI")] + [switch] + $ShowUI + ) + #region Code + + # Begin Dynamic Parameters + # Create the parameters for the various types of debugging. + DynamicParam + { + Set-StrictMode -version 3 + + # Set up the dynamic parameters. + # Dynamic parameters are only available if certain conditions are met, so they'll only show up + # as valid parameters when those conditions apply. Here, the conditions are based on the value of + # the EnableDebugger parameter. Depending on which of a set of values is the specified argument + # for EnableDebugger, different parameters will light up, as outlined below. + + $parameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary + + if (!(Test-Path Variable:Private:EnableDebugger)) + { + return $parameterDictionary + } + + switch ($EnableDebugger) + { + "Serial" + { + #region ComPort + + $ComPortAttr = New-Object System.Management.Automation.ParameterAttribute + $ComPortAttr.ParameterSetName = "__AllParameterSets" + $ComPortAttr.Mandatory = $false + + $ComPortValidator = New-Object System.Management.Automation.ValidateRangeAttribute( + 1, + 10 # Is that a good maximum? + ) + + $ComPortNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $ComPortAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $ComPortAttrCollection.Add($ComPortAttr) + $ComPortAttrCollection.Add($ComPortValidator) + $ComPortAttrCollection.Add($ComPortNotNull) + + $ComPort = New-Object System.Management.Automation.RuntimeDefinedParameter( + "ComPort", + [UInt16], + $ComPortAttrCollection + ) + + # By default, use COM1 + $ComPort.Value = 1 + $parameterDictionary.Add("ComPort", $ComPort) + #endregion ComPort + + #region BaudRate + $BaudRateAttr = New-Object System.Management.Automation.ParameterAttribute + $BaudRateAttr.ParameterSetName = "__AllParameterSets" + $BaudRateAttr.Mandatory = $false + + $BaudRateValidator = New-Object System.Management.Automation.ValidateSetAttribute( + 9600, 19200,38400, 57600, 115200 + ) + + $BaudRateNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $BaudRateAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $BaudRateAttrCollection.Add($BaudRateAttr) + $BaudRateAttrCollection.Add($BaudRateValidator) + $BaudRateAttrCollection.Add($BaudRateNotNull) + + $BaudRate = New-Object System.Management.Automation.RuntimeDefinedParameter( + "BaudRate", + [UInt32], + $BaudRateAttrCollection + ) + + # By default, use 115,200. + $BaudRate.Value = 115200 + $parameterDictionary.Add("BaudRate", $BaudRate) + #endregion BaudRate + + break + } + + "1394" + { + $ChannelAttr = New-Object System.Management.Automation.ParameterAttribute + $ChannelAttr.ParameterSetName = "__AllParameterSets" + $ChannelAttr.Mandatory = $false + + $ChannelValidator = New-Object System.Management.Automation.ValidateRangeAttribute( + 0, + 62 + ) + + $ChannelNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $ChannelAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $ChannelAttrCollection.Add($ChannelAttr) + $ChannelAttrCollection.Add($ChannelValidator) + $ChannelAttrCollection.Add($ChannelNotNull) + + $Channel = New-Object System.Management.Automation.RuntimeDefinedParameter( + "Channel", + [UInt16], + $ChannelAttrCollection + ) + + # By default, use channel 10 + $Channel.Value = 10 + $parameterDictionary.Add("Channel", $Channel) + break + } + + "USB" + { + $TargetAttr = New-Object System.Management.Automation.ParameterAttribute + $TargetAttr.ParameterSetName = "__AllParameterSets" + $TargetAttr.Mandatory = $false + + $TargetNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $TargetAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $TargetAttrCollection.Add($TargetAttr) + $TargetAttrCollection.Add($TargetNotNull) + + $Target = New-Object System.Management.Automation.RuntimeDefinedParameter( + "Target", + [string], + $TargetAttrCollection + ) + + # By default, use target = "debugging" + $Target.Value = "Debugging" + $parameterDictionary.Add("Target", $Target) + break + } + + "Network" + { + #region IP + $IpAttr = New-Object System.Management.Automation.ParameterAttribute + $IpAttr.ParameterSetName = "__AllParameterSets" + $IpAttr.Mandatory = $true + + $IpValidator = New-Object System.Management.Automation.ValidatePatternAttribute( + "\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" + ) + $IpNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $IpAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $IpAttrCollection.Add($IpAttr) + $IpAttrCollection.Add($IpValidator) + $IpAttrCollection.Add($IpNotNull) + + $IP = New-Object System.Management.Automation.RuntimeDefinedParameter( + "IPAddress", + [string], + $IpAttrCollection + ) + + # There's no good way to set a default value for this. + $parameterDictionary.Add("IPAddress", $IP) + #endregion IP + + #region Port + $PortAttr = New-Object System.Management.Automation.ParameterAttribute + $PortAttr.ParameterSetName = "__AllParameterSets" + $PortAttr.Mandatory = $false + + $PortValidator = New-Object System.Management.Automation.ValidateRangeAttribute( + 49152, + 50039 + ) + + $PortNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $PortAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $PortAttrCollection.Add($PortAttr) + $PortAttrCollection.Add($PortValidator) + $PortAttrCollection.Add($PortNotNull) + + + $Port = New-Object System.Management.Automation.RuntimeDefinedParameter( + "Port", + [UInt16], + $PortAttrCollection + ) + + # By default, use port 50000 + $Port.Value = 50000 + $parameterDictionary.Add("Port", $Port) + #endregion Port + + #region Key + $KeyAttr = New-Object System.Management.Automation.ParameterAttribute + $KeyAttr.ParameterSetName = "__AllParameterSets" + $KeyAttr.Mandatory = $true + + $KeyValidator = New-Object System.Management.Automation.ValidatePatternAttribute( + "\b([A-Z0-9]+).([A-Z0-9]+).([A-Z0-9]+).([A-Z0-9]+)\b" + ) + + $KeyNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $KeyAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $KeyAttrCollection.Add($KeyAttr) + $KeyAttrCollection.Add($KeyValidator) + $KeyAttrCollection.Add($KeyNotNull) + + $Key = New-Object System.Management.Automation.RuntimeDefinedParameter( + "Key", + [string], + $KeyAttrCollection + ) + + # Don't set a default key. + $parameterDictionary.Add("Key", $Key) + #endregion Key + + #region NoDHCP + $NoDHCPAttr = New-Object System.Management.Automation.ParameterAttribute + $NoDHCPAttr.ParameterSetName = "__AllParameterSets" + $NoDHCPAttr.Mandatory = $false + + $NoDHCPAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $NoDHCPAttrCollection.Add($NoDHCPAttr) + + $NoDHCP = New-Object System.Management.Automation.RuntimeDefinedParameter( + "NoDHCP", + [switch], + $NoDHCPAttrCollection + ) + + $parameterDictionary.Add("NoDHCP", $NoDHCP) + #endregion NoDHCP + + #region NewKey + $NewKeyAttr = New-Object System.Management.Automation.ParameterAttribute + $NewKeyAttr.ParameterSetName = "__AllParameterSets" + $NewKeyAttr.Mandatory = $false + + $NewKeyAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $NewKeyAttrCollection.Add($NewKeyAttr) + + $NewKey = New-Object System.Management.Automation.RuntimeDefinedParameter( + "NewKey", + [switch], + $NewKeyAttrCollection + ) + + # Don't set a default key. + $parameterDictionary.Add("NewKey", $NewKey) + #endregion NewKey + + break + } + + # There's nothing to do for local debugging. + # Synthetic debugging is not yet implemented. + + default + { + break + } + } + + return $parameterDictionary + } + + Begin + { + ########################################################################################## + # Constants and Pseudo-Constants + ########################################################################################## + $PARTITION_STYLE_MBR = 0x00000000 # The default value + $PARTITION_STYLE_GPT = 0x00000001 # Just in case... + + # Version information that can be populated by timebuild. + $ScriptVersion = DATA + { + ConvertFrom-StringData -StringData @" + Major = 10 + Minor = 0 + Build = 14278 + Qfe = 1000 + Branch = rs1_es_media + Timestamp = 160201-1707 + Flavor = amd64fre +"@ +} + + $myVersion = "$($ScriptVersion.Major).$($ScriptVersion.Minor).$($ScriptVersion.Build).$($ScriptVersion.QFE).$($ScriptVersion.Flavor).$($ScriptVersion.Branch).$($ScriptVersion.Timestamp)" + $scriptName = "Convert-WindowsImage" # Name of the script, obviously. + $sessionKey = [Guid]::NewGuid().ToString() # Session key, used for keeping records unique between multiple runs. + $logFolder = "$($TempDirectory)\$($scriptName)\$($sessionKey)" # Log folder path. + $vhdMaxSize = 2040GB # Maximum size for VHD is ~2040GB. + $vhdxMaxSize = 64TB # Maximum size for VHDX is ~64TB. + $lowestSupportedVersion = New-Object Version "6.1" # The lowest supported *image* version; making sure we don't run against Vista/2k8. + $lowestSupportedBuild = 9200 # The lowest supported *host* build. Set to Win8 CP. + $transcripting = $false + + # Since we use the VHDFormat in output, make it uppercase. + # We'll make it lowercase again when we use it as a file extension. + $VHDFormat = $VHDFormat.ToUpper() + ########################################################################################## + # Here Strings + ########################################################################################## + + # Banner text displayed during each run. + $header = @" + +Windows(R) Image to Virtual Hard Disk Converter for Windows(R) 10 +Copyright (C) Microsoft Corporation. All rights reserved. +Version $myVersion + +"@ + + # Text used as the banner in the UI. + $uiHeader = @" +You can use the fields below to configure the VHD or VHDX that you want to create! +"@ + + #region Helper Functions + + ########################################################################################## + # Helper Functions + ########################################################################################## + + <# + Functions to mount and dismount registry hives. + These hives will automatically be accessible via the HKLM:\ registry PSDrive. + + It should be noted that I have more confidence in using the RegLoadKey and + RegUnloadKey Win32 APIs than I do using REG.EXE - it just seems like we should + do things ourselves if we can, instead of using yet another binary. + + Consider this a TODO for future versions. + #> + Function Mount-RegistryHive + { + [CmdletBinding()] + param( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)] + [System.IO.FileInfo] + [ValidateNotNullOrEmpty()] + [ValidateScript({ $_.Exists })] + $Hive + ) + + $mountKey = [System.Guid]::NewGuid().ToString() + $regPath = "REG.EXE" + + if (Test-Path HKLM:\$mountKey) + { + throw "The registry path already exists. I should just regenerate it, but I'm lazy." + } + + $regArgs = ( + "LOAD", + "HKLM\$mountKey", + $Hive.Fullname + ) + try + { + + Run-Executable -Executable $regPath -Arguments $regArgs + + } + catch + { + throw + } + + # Set a global variable containing the name of the mounted registry key + # so we can unmount it if there's an error. + $global:mountedHive = $mountKey + + return $mountKey + } + + ########################################################################################## + + Function Dismount-RegistryHive + { + [CmdletBinding()] + param( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)] + [string] + [ValidateNotNullOrEmpty()] + $HiveMountPoint + ) + + $regPath = "REG.EXE" + + $regArgs = ( + "UNLOAD", + "HKLM\$($HiveMountPoint)" + ) + + Run-Executable -Executable $regPath -Arguments $regArgs + + $global:mountedHive = $null + } + + ########################################################################################## + + function + Test-Admin + { + <# + .SYNOPSIS + Short function to determine whether the logged-on user is an administrator. + + .EXAMPLE + Do you honestly need one? There are no parameters! + + .OUTPUTS + $true if user is admin. + $false if user is not an admin. + #> + [CmdletBinding()] + param() + + $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent()) + $isAdmin = $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) + Write-W2VTrace "isUserAdmin? $isAdmin" + + return $isAdmin + } + + ########################################################################################## + + function + Get-WindowsBuildNumber + { + $os = Get-WmiObject -Class Win32_OperatingSystem + return [int]($os.BuildNumber) + } + + ########################################################################################## + + function + Test-WindowsVersion + { + $isWin8 = ((Get-WindowsBuildNumber) -ge [int]$lowestSupportedBuild) + + Write-W2VTrace "is Windows 8 or Higher? $isWin8" + return $isWin8 + } + + ########################################################################################## + + function + Write-W2VInfo + { + # Function to make the Write-Host output a bit prettier. + [CmdletBinding()] + param( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [string] + [ValidateNotNullOrEmpty()] + $text + ) + Write-Host "INFO : $($text)" + } + + ########################################################################################## + + function + Write-W2VTrace + { + # Function to make the Write-Verbose output... well... exactly the same as it was before. + [CmdletBinding()] + param( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [string] + [ValidateNotNullOrEmpty()] + $text + ) + Write-Verbose $text + } + + ########################################################################################## + + function + Write-W2VError + { + # Function to make the Write-Host (NOT Write-Error) output prettier in the case of an error. + [CmdletBinding()] + param( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [string] + [ValidateNotNullOrEmpty()] + $text + ) + Write-Host "ERROR : $($text)" -ForegroundColor (Get-Host).PrivateData.ErrorForegroundColor + } + + ########################################################################################## + + function + Write-W2VWarn + { + # Function to make the Write-Host (NOT Write-Warning) output prettier. + [CmdletBinding()] + param( + [Parameter(Mandatory = $true, ValueFromPipeline = $true)] + [string] + [ValidateNotNullOrEmpty()] + $text + ) + Write-Host "WARN : $($text)" -ForegroundColor (Get-Host).PrivateData.WarningForegroundColor + } + + ########################################################################################## + + function + Run-Executable + { + <# + .SYNOPSIS + Runs an external executable file, and validates the error level. + + .PARAMETER Executable + The path to the executable to run and monitor. + + .PARAMETER Arguments + An array of arguments to pass to the executable when it's executed. + + .PARAMETER SuccessfulErrorCode + The error code that means the executable ran successfully. + The default value is 0. + #> + + [CmdletBinding()] + param( + [Parameter(Mandatory=$true)] + [string] + [ValidateNotNullOrEmpty()] + $Executable, + + [Parameter(Mandatory=$true)] + [string[]] + [ValidateNotNullOrEmpty()] + $Arguments, + + [Parameter()] + [int] + [ValidateNotNullOrEmpty()] + $SuccessfulErrorCode = 0 + + ) + + Write-W2VTrace "Running $Executable $Arguments" + $ret = Start-Process ` + -FilePath $Executable ` + -ArgumentList $Arguments ` + -NoNewWindow ` + -Wait ` + -RedirectStandardOutput "$($TempDirectory)\$($scriptName)\$($sessionKey)\$($Executable)-StandardOutput.txt" ` + -RedirectStandardError "$($TempDirectory)\$($scriptName)\$($sessionKey)\$($Executable)-StandardError.txt" ` + -Passthru + + Write-W2VTrace "Return code was $($ret.ExitCode)." + + if ($ret.ExitCode -ne $SuccessfulErrorCode) + { + throw "$Executable failed with code $($ret.ExitCode)!" + } + } + + ########################################################################################## + Function Test-IsNetworkLocation + { + <# + .SYNOPSIS + Determines whether or not a given path is a network location or a local drive. + + .DESCRIPTION + Function to determine whether or not a specified path is a local path, a UNC path, + or a mapped network drive. + + .PARAMETER Path + The path that we need to figure stuff out about, + #> + + [CmdletBinding()] + param( + [Parameter(ValueFromPipeLine = $true)] + [string] + [ValidateNotNullOrEmpty()] + $Path + ) + + $result = $false + + if ([bool]([URI]$Path).IsUNC) + { + $result = $true + } + else + { + $driveInfo = [IO.DriveInfo]((Resolve-Path $Path).Path) + + if ($driveInfo.DriveType -eq "Network") + { + $result = $true + } + } + + return $result + } + ########################################################################################## + + #endregion Helper Functions + } + + Process + { + Write-Host $header + + $disk = $null + $openWim = $null + $openIso = $null + $openImage = $null + $vhdFinalName = $null + $vhdFinalPath = $null + $mountedHive = $null + $isoPath = $null + $tempSource = $null + + if (Get-Command Get-WindowsOptionalFeature -ErrorAction SilentlyContinue) + { + try + { + $hyperVEnabled = $((Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V).State -eq "Enabled") + } + catch + { + # WinPE DISM does not support online queries. This will throw on non-WinPE machines + $winpeVersion = (Get-ItemProperty -Path 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion\WinPE').Version + + Write-W2VInfo "Running WinPE version $winpeVersion" + + $hyperVEnabled = $false + } + } + else + { + $hyperVEnabled = $false + } + + $vhd = @() + + try + { + # Create log folder + if (Test-Path $logFolder) + { + $null = rd $logFolder -Force -Recurse + } + + $null = md $logFolder -Force + + # Try to start transcripting. If it's already running, we'll get an exception and swallow it. + try + { + $null = Start-Transcript -Path (Join-Path $logFolder "Convert-WindowsImageTranscript.txt") -Force -ErrorAction SilentlyContinue + $transcripting = $true + } + catch + { + Write-W2VWarn "Transcription is already running. No Convert-WindowsImage-specific transcript will be created." + $transcripting = $false + } + + # + # Add types + # + Add-WindowsImageTypes + + # Check to make sure we're running as Admin. + if (!(Test-Admin)) + { + throw "Images can only be applied by an administrator. Please launch PowerShell elevated and run this script again." + } + + # Check to make sure we're running on Win8. + if (!(Test-WindowsVersion)) + { + throw "$scriptName requires Windows 8 Consumer Preview or higher. Please use WIM2VHD.WSF (http://code.msdn.microsoft.com/wim2vhd) if you need to create VHDs from Windows 7." + } + + # Resolve the path for the unattend file. + if (![string]::IsNullOrEmpty($UnattendPath)) + { + $UnattendPath = (Resolve-Path $UnattendPath).Path + } + + if ($ShowUI) + { + + Write-W2VInfo "Launching UI..." + Add-Type -AssemblyName System.Drawing,System.Windows.Forms + + #region Form Objects + $frmMain = New-Object System.Windows.Forms.Form + $groupBox4 = New-Object System.Windows.Forms.GroupBox + $btnGo = New-Object System.Windows.Forms.Button + $groupBox3 = New-Object System.Windows.Forms.GroupBox + $txtVhdName = New-Object System.Windows.Forms.TextBox + $label6 = New-Object System.Windows.Forms.Label + $btnWrkBrowse = New-Object System.Windows.Forms.Button + $cmbVhdSizeUnit = New-Object System.Windows.Forms.ComboBox + $numVhdSize = New-Object System.Windows.Forms.NumericUpDown + $cmbVhdFormat = New-Object System.Windows.Forms.ComboBox + $label5 = New-Object System.Windows.Forms.Label + $txtWorkingDirectory = New-Object System.Windows.Forms.TextBox + $label4 = New-Object System.Windows.Forms.Label + $label3 = New-Object System.Windows.Forms.Label + $label2 = New-Object System.Windows.Forms.Label + $label7 = New-Object System.Windows.Forms.Label + $txtUnattendFile = New-Object System.Windows.Forms.TextBox + $btnUnattendBrowse = New-Object System.Windows.Forms.Button + $groupBox2 = New-Object System.Windows.Forms.GroupBox + $cmbSkuList = New-Object System.Windows.Forms.ComboBox + $label1 = New-Object System.Windows.Forms.Label + $groupBox1 = New-Object System.Windows.Forms.GroupBox + $txtSourcePath = New-Object System.Windows.Forms.TextBox + $btnBrowseWim = New-Object System.Windows.Forms.Button + $openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog + $openFolderDialog1 = New-Object System.Windows.Forms.FolderBrowserDialog + $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState + + #endregion Form Objects + + #region Event scriptblocks. + + $btnGo_OnClick = { + $frmMain.Close() + } + + $btnWrkBrowse_OnClick = { + $openFolderDialog1.RootFolder = "Desktop" + $openFolderDialog1.Description = "Select the folder you'd like your VHD(X) to be created in." + $openFolderDialog1.SelectedPath = $WorkingDirectory + + $ret = $openFolderDialog1.ShowDialog() + + if ($ret -ilike "ok") + { + $WorkingDirectory = $txtWorkingDirectory = $openFolderDialog1.SelectedPath + Write-W2VInfo "Selected Working Directory is $WorkingDirectory..." + } + } + + $btnUnattendBrowse_OnClick = { + $openFileDialog1.InitialDirectory = $pwd + $openFileDialog1.Filter = "XML files (*.xml)|*.XML|All files (*.*)|*.*" + $openFileDialog1.FilterIndex = 1 + $openFileDialog1.CheckFileExists = $true + $openFileDialog1.CheckPathExists = $true + $openFileDialog1.FileName = $null + $openFileDialog1.ShowHelp = $false + $openFileDialog1.Title = "Select an unattend file..." + + $ret = $openFileDialog1.ShowDialog() + + if ($ret -ilike "ok") + { + $UnattendPath = $txtUnattendFile.Text = $openFileDialog1.FileName + } + } + + $btnBrowseWim_OnClick = { + $openFileDialog1.InitialDirectory = $pwd + $openFileDialog1.Filter = "All compatible files (*.ISO, *.WIM)|*.ISO;*.WIM|All files (*.*)|*.*" + $openFileDialog1.FilterIndex = 1 + $openFileDialog1.CheckFileExists = $true + $openFileDialog1.CheckPathExists = $true + $openFileDialog1.FileName = $null + $openFileDialog1.ShowHelp = $false + $openFileDialog1.Title = "Select a source file..." + + $ret = $openFileDialog1.ShowDialog() + + if ($ret -ilike "ok") + { + + if (([IO.FileInfo]$openFileDialog1.FileName).Extension -ilike ".iso") + { + + if (Test-IsNetworkLocation $openFileDialog1.FileName) + { + Write-W2VInfo "Copying ISO $(Split-Path $openFileDialog1.FileName -Leaf) to temp folder..." + Write-W2VWarn "The UI may become non-responsive while this copy takes place..." + Copy-Item -Path $openFileDialog1.FileName -Destination $TempDirectory -Force + $openFileDialog1.FileName = "$($TempDirectory)\$(Split-Path $openFileDialog1.FileName -Leaf)" + } + + $txtSourcePath.Text = $isoPath = (Resolve-Path $openFileDialog1.FileName).Path + Write-W2VInfo "Opening ISO $(Split-Path $isoPath -Leaf)..." + + $openIso = Mount-DiskImage -ImagePath $isoPath -StorageType ISO -PassThru + + # Refresh the DiskImage object so we can get the real information about it. I assume this is a bug. + $openIso = Get-DiskImage -ImagePath $isoPath + $driveLetter = ($openIso | Get-Volume).DriveLetter + + $script:SourcePath = "$($driveLetter):\sources\install.wim" + + # Check to see if there's a WIM file we can muck about with. + Write-W2VInfo "Looking for $($SourcePath)..." + if (!(Test-Path $SourcePath)) + { + throw "The specified ISO does not appear to be valid Windows installation media." + } + } + else + { + $txtSourcePath.Text = $script:SourcePath = $openFileDialog1.FileName + } + + # Check to see if the WIM is local, or on a network location. If the latter, copy it locally. + if (Test-IsNetworkLocation $SourcePath) + { + Write-W2VInfo "Copying WIM $(Split-Path $SourcePath -Leaf) to temp folder..." + Write-W2VWarn "The UI may become non-responsive while this copy takes place..." + Copy-Item -Path $SourcePath -Destination $TempDirectory -Force + $txtSourcePath.Text = $script:SourcePath = "$($TempDirectory)\$(Split-Path $SourcePath -Leaf)" + } + + $script:SourcePath = (Resolve-Path $SourcePath).Path + + Write-W2VInfo "Scanning WIM metadata..." + + $tempOpenWim = $null + + try + { + $tempOpenWim = New-Object WIM2VHD.WimFile $SourcePath + + # Let's see if we're running against an unstaged build. If we are, we need to blow up. + if ($tempOpenWim.ImageNames.Contains("Windows Longhorn Client") -or + $tempOpenWim.ImageNames.Contains("Windows Longhorn Server") -or + $tempOpenWim.ImageNames.Contains("Windows Longhorn Server Core")) + { + [Windows.Forms.MessageBox]::Show( + "Convert-WindowsImage cannot run against unstaged builds. Please try again with a staged build.", + "WIM is incompatible!", + "OK", + "Error" + ) + + return + } + else + { + $tempOpenWim.Images | %{ $cmbSkuList.Items.Add($_.ImageFlags) } + $cmbSkuList.SelectedIndex = 0 + } + + } + catch + { + throw "Unable to load WIM metadata!" + } + finally + { + $tempOpenWim.Close() + Write-W2VTrace "Closing WIM metadata..." + } + } + } + + $OnLoadForm_StateCorrection = { + + # Correct the initial state of the form to prevent the .Net maximized form issue + $frmMain.WindowState = $InitialFormWindowState + } + + #endregion Event scriptblocks + + # Figure out VHD size and size unit. + $unit = $null + switch ([Math]::Round($SizeBytes.ToString().Length / 3)) + { + 3 { $unit = "MB"; break } + 4 { $unit = "GB"; break } + 5 { $unit = "TB"; break } + default { $unit = ""; break } + } + + $quantity = Invoke-Expression -Command "$($SizeBytes) / 1$($unit)" + + #region Form Code + #region frmMain + $frmMain.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 579 + $System_Drawing_Size.Width = 512 + $frmMain.ClientSize = $System_Drawing_Size + $frmMain.Font = New-Object System.Drawing.Font("Segoe UI",10,0,3,1) + $frmMain.FormBorderStyle = 1 + $frmMain.MaximizeBox = $False + $frmMain.MinimizeBox = $False + $frmMain.Name = "frmMain" + $frmMain.StartPosition = 1 + $frmMain.Text = "Convert-WindowsImage UI" + #endregion frmMain + + #region groupBox4 + $groupBox4.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 10 + $System_Drawing_Point.Y = 498 + $groupBox4.Location = $System_Drawing_Point + $groupBox4.Name = "groupBox4" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 69 + $System_Drawing_Size.Width = 489 + $groupBox4.Size = $System_Drawing_Size + $groupBox4.TabIndex = 8 + $groupBox4.TabStop = $False + $groupBox4.Text = "4. Make the VHD!" + + $frmMain.Controls.Add($groupBox4) + #endregion groupBox4 + + #region btnGo + $btnGo.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 39 + $System_Drawing_Point.Y = 24 + $btnGo.Location = $System_Drawing_Point + $btnGo.Name = "btnGo" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 33 + $System_Drawing_Size.Width = 415 + $btnGo.Size = $System_Drawing_Size + $btnGo.TabIndex = 0 + $btnGo.Text = "&Make my VHD" + $btnGo.UseVisualStyleBackColor = $True + $btnGo.DialogResult = "OK" + $btnGo.add_Click($btnGo_OnClick) + + $groupBox4.Controls.Add($btnGo) + $frmMain.AcceptButton = $btnGo + #endregion btnGo + + #region groupBox3 + $groupBox3.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 10 + $System_Drawing_Point.Y = 243 + $groupBox3.Location = $System_Drawing_Point + $groupBox3.Name = "groupBox3" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 245 + $System_Drawing_Size.Width = 489 + $groupBox3.Size = $System_Drawing_Size + $groupBox3.TabIndex = 7 + $groupBox3.TabStop = $False + $groupBox3.Text = "3. Choose configuration options" + + $frmMain.Controls.Add($groupBox3) + #endregion groupBox3 + + #region txtVhdName + $txtVhdName.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 150 + $txtVhdName.Location = $System_Drawing_Point + $txtVhdName.Name = "txtVhdName" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 418 + $txtVhdName.Size = $System_Drawing_Size + $txtVhdName.TabIndex = 10 + + $groupBox3.Controls.Add($txtVhdName) + #endregion txtVhdName + + #region txtUnattendFile + $txtUnattendFile.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 198 + $txtUnattendFile.Location = $System_Drawing_Point + $txtUnattendFile.Name = "txtUnattendFile" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 418 + $txtUnattendFile.Size = $System_Drawing_Size + $txtUnattendFile.TabIndex = 11 + + $groupBox3.Controls.Add($txtUnattendFile) + #endregion txtUnattendFile + + #region label7 + $label7.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 23 + $System_Drawing_Point.Y = 180 + $label7.Location = $System_Drawing_Point + $label7.Name = "label7" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 23 + $System_Drawing_Size.Width = 175 + $label7.Size = $System_Drawing_Size + $label7.Text = "Unattend File (Optional)" + + $groupBox3.Controls.Add($label7) + #endregion label7 + + #region label6 + $label6.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 23 + $System_Drawing_Point.Y = 132 + $label6.Location = $System_Drawing_Point + $label6.Name = "label6" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 23 + $System_Drawing_Size.Width = 175 + $label6.Size = $System_Drawing_Size + $label6.Text = "VHD Name (Optional)" + + $groupBox3.Controls.Add($label6) + #endregion label6 + + #region btnUnattendBrowse + $btnUnattendBrowse.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 449 + $System_Drawing_Point.Y = 199 + $btnUnattendBrowse.Location = $System_Drawing_Point + $btnUnattendBrowse.Name = "btnUnattendBrowse" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 27 + $btnUnattendBrowse.Size = $System_Drawing_Size + $btnUnattendBrowse.TabIndex = 9 + $btnUnattendBrowse.Text = "..." + $btnUnattendBrowse.UseVisualStyleBackColor = $True + $btnUnattendBrowse.add_Click($btnUnattendBrowse_OnClick) + + $groupBox3.Controls.Add($btnUnattendBrowse) + #endregion btnUnattendBrowse + + #region btnWrkBrowse + $btnWrkBrowse.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 449 + $System_Drawing_Point.Y = 98 + $btnWrkBrowse.Location = $System_Drawing_Point + $btnWrkBrowse.Name = "btnWrkBrowse" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 27 + $btnWrkBrowse.Size = $System_Drawing_Size + $btnWrkBrowse.TabIndex = 9 + $btnWrkBrowse.Text = "..." + $btnWrkBrowse.UseVisualStyleBackColor = $True + $btnWrkBrowse.add_Click($btnWrkBrowse_OnClick) + + $groupBox3.Controls.Add($btnWrkBrowse) + #endregion btnWrkBrowse + + #region cmbVhdSizeUnit + $cmbVhdSizeUnit.DataBindings.DefaultDataSourceUpdateMode = 0 + $cmbVhdSizeUnit.FormattingEnabled = $True + $cmbVhdSizeUnit.Items.Add("MB") | Out-Null + $cmbVhdSizeUnit.Items.Add("GB") | Out-Null + $cmbVhdSizeUnit.Items.Add("TB") | Out-Null + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 409 + $System_Drawing_Point.Y = 42 + $cmbVhdSizeUnit.Location = $System_Drawing_Point + $cmbVhdSizeUnit.Name = "cmbVhdSizeUnit" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 67 + $cmbVhdSizeUnit.Size = $System_Drawing_Size + $cmbVhdSizeUnit.TabIndex = 5 + $cmbVhdSizeUnit.Text = $unit + + $groupBox3.Controls.Add($cmbVhdSizeUnit) + #endregion cmbVhdSizeUnit + + #region numVhdSize + $numVhdSize.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 340 + $System_Drawing_Point.Y = 42 + $numVhdSize.Location = $System_Drawing_Point + $numVhdSize.Name = "numVhdSize" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 63 + $numVhdSize.Size = $System_Drawing_Size + $numVhdSize.TabIndex = 4 + $numVhdSize.Value = $quantity + + $groupBox3.Controls.Add($numVhdSize) + #endregion numVhdSize + + #region cmbVhdFormat + $cmbVhdFormat.DataBindings.DefaultDataSourceUpdateMode = 0 + $cmbVhdFormat.FormattingEnabled = $True + $cmbVhdFormat.Items.Add("VHD") | Out-Null + $cmbVhdFormat.Items.Add("VHDX") | Out-Null + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 42 + $cmbVhdFormat.Location = $System_Drawing_Point + $cmbVhdFormat.Name = "cmbVhdFormat" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 136 + $cmbVhdFormat.Size = $System_Drawing_Size + $cmbVhdFormat.TabIndex = 0 + $cmbVhdFormat.Text = $VHDFormat + + $groupBox3.Controls.Add($cmbVhdFormat) + #endregion cmbVhdFormat + + #region label5 + $label5.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 23 + $System_Drawing_Point.Y = 76 + $label5.Location = $System_Drawing_Point + $label5.Name = "label5" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 23 + $System_Drawing_Size.Width = 264 + $label5.Size = $System_Drawing_Size + $label5.TabIndex = 8 + $label5.Text = "Working Directory" + + $groupBox3.Controls.Add($label5) + #endregion label5 + + #region txtWorkingDirectory + $txtWorkingDirectory.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 99 + $txtWorkingDirectory.Location = $System_Drawing_Point + $txtWorkingDirectory.Name = "txtWorkingDirectory" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 418 + $txtWorkingDirectory.Size = $System_Drawing_Size + $txtWorkingDirectory.TabIndex = 7 + $txtWorkingDirectory.Text = $WorkingDirectory + + $groupBox3.Controls.Add($txtWorkingDirectory) + #endregion txtWorkingDirectory + + #region label4 + $label4.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 340 + $System_Drawing_Point.Y = 21 + $label4.Location = $System_Drawing_Point + $label4.Name = "label4" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 27 + $System_Drawing_Size.Width = 86 + $label4.Size = $System_Drawing_Size + $label4.TabIndex = 6 + $label4.Text = "VHD Size" + + $groupBox3.Controls.Add($label4) + #endregion label4 + + #region label3 + $label3.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 176 + $System_Drawing_Point.Y = 21 + $label3.Location = $System_Drawing_Point + $label3.Name = "label3" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 27 + $System_Drawing_Size.Width = 92 + $label3.Size = $System_Drawing_Size + $label3.TabIndex = 3 + $label3.Text = "VHD Type" + + $groupBox3.Controls.Add($label3) + #endregion label3 + + #region label2 + $label2.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 21 + $label2.Location = $System_Drawing_Point + $label2.Name = "label2" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 30 + $System_Drawing_Size.Width = 118 + $label2.Size = $System_Drawing_Size + $label2.TabIndex = 1 + $label2.Text = "VHD Format" + + $groupBox3.Controls.Add($label2) + #endregion label2 + + #region groupBox2 + $groupBox2.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 10 + $System_Drawing_Point.Y = 169 + $groupBox2.Location = $System_Drawing_Point + $groupBox2.Name = "groupBox2" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 68 + $System_Drawing_Size.Width = 490 + $groupBox2.Size = $System_Drawing_Size + $groupBox2.TabIndex = 6 + $groupBox2.TabStop = $False + $groupBox2.Text = "2. Choose a SKU from the list" + + $frmMain.Controls.Add($groupBox2) + #endregion groupBox2 + + #region cmbSkuList + $cmbSkuList.DataBindings.DefaultDataSourceUpdateMode = 0 + $cmbSkuList.FormattingEnabled = $True + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 24 + $cmbSkuList.Location = $System_Drawing_Point + $cmbSkuList.Name = "cmbSkuList" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 452 + $cmbSkuList.Size = $System_Drawing_Size + $cmbSkuList.TabIndex = 2 + + $groupBox2.Controls.Add($cmbSkuList) + #endregion cmbSkuList + + #region label1 + $label1.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 23 + $System_Drawing_Point.Y = 21 + $label1.Location = $System_Drawing_Point + $label1.Name = "label1" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 71 + $System_Drawing_Size.Width = 464 + $label1.Size = $System_Drawing_Size + $label1.TabIndex = 5 + $label1.Text = $uiHeader + + $frmMain.Controls.Add($label1) + #endregion label1 + + #region groupBox1 + $groupBox1.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 10 + $System_Drawing_Point.Y = 95 + $groupBox1.Location = $System_Drawing_Point + $groupBox1.Name = "groupBox1" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 68 + $System_Drawing_Size.Width = 490 + $groupBox1.Size = $System_Drawing_Size + $groupBox1.TabIndex = 4 + $groupBox1.TabStop = $False + $groupBox1.Text = "1. Choose a source" + + $frmMain.Controls.Add($groupBox1) + #endregion groupBox1 + + #region txtSourcePath + $txtSourcePath.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 24 + $txtSourcePath.Location = $System_Drawing_Point + $txtSourcePath.Name = "txtSourcePath" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 418 + $txtSourcePath.Size = $System_Drawing_Size + $txtSourcePath.TabIndex = 0 + + $groupBox1.Controls.Add($txtSourcePath) + #endregion txtSourcePath + + #region btnBrowseWim + $btnBrowseWim.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 449 + $System_Drawing_Point.Y = 24 + $btnBrowseWim.Location = $System_Drawing_Point + $btnBrowseWim.Name = "btnBrowseWim" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 28 + $btnBrowseWim.Size = $System_Drawing_Size + $btnBrowseWim.TabIndex = 1 + $btnBrowseWim.Text = "..." + $btnBrowseWim.UseVisualStyleBackColor = $True + $btnBrowseWim.add_Click($btnBrowseWim_OnClick) + + $groupBox1.Controls.Add($btnBrowseWim) + #endregion btnBrowseWim + + $openFileDialog1.FileName = "openFileDialog1" + $openFileDialog1.ShowHelp = $True + + #endregion Form Code + + # Save the initial state of the form + $InitialFormWindowState = $frmMain.WindowState + + # Init the OnLoad event to correct the initial state of the form + $frmMain.add_Load($OnLoadForm_StateCorrection) + + # Return the constructed form. + $ret = $frmMain.ShowDialog() + + if (!($ret -ilike "OK")) + { + throw "Form session has been cancelled." + } + + if ([string]::IsNullOrEmpty($SourcePath)) + { + throw "No source path specified." + } + + # VHD Format + $VHDFormat = $cmbVhdFormat.SelectedItem + + # VHD Size + $SizeBytes = Invoke-Expression "$($numVhdSize.Value)$($cmbVhdSizeUnit.SelectedItem)" + + # Working Directory + $WorkingDirectory = $txtWorkingDirectory.Text + + # VHDPath + if (![string]::IsNullOrEmpty($txtVhdName.Text)) + { + $VHDPath = "$($WorkingDirectory)\$($txtVhdName.Text)" + } + + # Edition + if (![string]::IsNullOrEmpty($cmbSkuList.SelectedItem)) + { + $Edition = $cmbSkuList.SelectedItem + } + + # Because we used ShowDialog, we need to manually dispose of the form. + # This probably won't make much of a difference, but let's free up all of the resources we can + # before we start the conversion process. + + $frmMain.Dispose() + } + + if ($VHDFormat -ilike "AUTO") + { + if ($DiskLayout -eq "BIOS") + { + $VHDFormat = "VHD" + } + else + { + $VHDFormat = "VHDX" + } + } + + # + # Choose smallest supported block size for dynamic VHD(X) + # + $BlockSizeBytes = 1MB + + # There's a difference between the maximum sizes for VHDs and VHDXs. Make sure we follow it. + if ("VHD" -ilike $VHDFormat) + { + if ($SizeBytes -gt $vhdMaxSize) + { + Write-W2VWarn "For the VHD file format, the maximum file size is ~2040GB. We're automatically setting the size to 2040GB for you." + $SizeBytes = 2040GB + } + + $BlockSizeBytes = 512KB + } + + # Check if -VHDPath and -WorkingDirectory were both specified. + if ((![String]::IsNullOrEmpty($VHDPath)) -and (![String]::IsNullOrEmpty($WorkingDirectory))) + { + if ($WorkingDirectory -ne $pwd) + { + # If the WorkingDirectory is anything besides $pwd, tell people that the WorkingDirectory is being ignored. + Write-W2VWarn "Specifying -VHDPath and -WorkingDirectory at the same time is contradictory." + Write-W2VWarn "Ignoring the WorkingDirectory specification." + $WorkingDirectory = Split-Path $VHDPath -Parent + } + } + + if ($VHDPath) + { + # Check to see if there's a conflict between the specified file extension and the VHDFormat being used. + $ext = ([IO.FileInfo]$VHDPath).Extension + + if (!($ext -ilike ".$($VHDFormat)")) + { + throw "There is a mismatch between the VHDPath file extension ($($ext.ToUpper())), and the VHDFormat (.$($VHDFormat)). Please ensure that these match and try again." + } + } + + # Create a temporary name for the VHD(x). We'll name it properly at the end of the script. + if ([String]::IsNullOrEmpty($VHDPath)) + { + $VHDPath = Join-Path $WorkingDirectory "$($sessionKey).$($VHDFormat.ToLower())" + } + else + { + # Since we can't do Resolve-Path against a file that doesn't exist, we need to get creative in determining + # the full path that the user specified (or meant to specify if they gave us a relative path). + # Check to see if the path has a root specified. If it doesn't, use the working directory. + if (![IO.Path]::IsPathRooted($VHDPath)) + { + $VHDPath = Join-Path $WorkingDirectory $VHDPath + } + + $vhdFinalName = Split-Path $VHDPath -Leaf + $VHDPath = Join-Path (Split-Path $VHDPath -Parent) "$($sessionKey).$($VHDFormat.ToLower())" + } + + Write-W2VTrace "Temporary $VHDFormat path is : $VHDPath" + + # If we're using an ISO, mount it and get the path to the WIM file. + if (([IO.FileInfo]$SourcePath).Extension -ilike ".ISO") + { + # If the ISO isn't local, copy it down so we don't have to worry about resource contention + # or about network latency. + if (Test-IsNetworkLocation $SourcePath) + { + Write-W2VInfo "Copying ISO $(Split-Path $SourcePath -Leaf) to temp folder..." + robocopy $(Split-Path $SourcePath -Parent) $TempDirectory $(Split-Path $SourcePath -Leaf) | Out-Null + $SourcePath = "$($TempDirectory)\$(Split-Path $SourcePath -Leaf)" + + $tempSource = $SourcePath + } + + $isoPath = (Resolve-Path $SourcePath).Path + + Write-W2VInfo "Opening ISO $(Split-Path $isoPath -Leaf)..." + $openIso = Mount-DiskImage -ImagePath $isoPath -StorageType ISO -PassThru + # Refresh the DiskImage object so we can get the real information about it. I assume this is a bug. + $openIso = Get-DiskImage -ImagePath $isoPath + $driveLetter = ($openIso | Get-Volume).DriveLetter + + $SourcePath = "$($driveLetter):\sources\install.wim" + + # Check to see if there's a WIM file we can muck about with. + Write-W2VInfo "Looking for $($SourcePath)..." + if (!(Test-Path $SourcePath)) + { + throw "The specified ISO does not appear to be valid Windows installation media." + } + } + + # Check to see if the WIM is local, or on a network location. If the latter, copy it locally. + if (Test-IsNetworkLocation $SourcePath) + { + Write-W2VInfo "Copying WIM $(Split-Path $SourcePath -Leaf) to temp folder..." + robocopy $(Split-Path $SourcePath -Parent) $TempDirectory $(Split-Path $SourcePath -Leaf) | Out-Null + $SourcePath = "$($TempDirectory)\$(Split-Path $SourcePath -Leaf)" + + $tempSource = $SourcePath + } + + $SourcePath = (Resolve-Path $SourcePath).Path + + #################################################################################################### + # QUERY WIM INFORMATION AND EXTRACT THE INDEX OF TARGETED IMAGE + #################################################################################################### + + Write-W2VInfo "Looking for the requested Windows image in the WIM file" + $WindowsImage = Get-WindowsImage -ImagePath $SourcePath + + if (-not $WindowsImage -or ($WindowsImage -is [System.Array])) + { + # + # WIM may have multiple images. Filter on Edition (can be index or name) and try to find a unique image + # + $EditionIndex = 0; + if ([Int32]::TryParse($Edition, [ref]$EditionIndex)) + { + $WindowsImage = Get-WindowsImage -ImagePath $SourcePath -Index $EditionIndex + } + else + { + $WindowsImage = Get-WindowsImage -ImagePath $SourcePath | Where-Object {$_.ImageName -ilike "*$($Edition)"} + } + + if (-not $WindowsImage) + { + throw "Requested windows Image was not found on the WIM file!" + } + if ($WindowsImage -is [System.Array]) + { + Write-W2VInfo "WIM file has the following $($WindowsImage.Count) images that match filter *$($Edition)" + Get-WindowsImage -ImagePath $SourcePath + + Write-W2VError "You must specify an Edition or SKU index, since the WIM has more than one image." + throw "There are more than one images that match ImageName filter *$($Edition)" + } + } + + $ImageIndex = $WindowsImage[0].ImageIndex + + # We're good. Open the WIM container. + # NOTE: this is only required because we want to get the XML-based meta-data at the end. Is there a better way? + # If we can get this information from DISM cmdlets, we can remove the openWim constructs + $openWim = New-Object WIM2VHD.WimFile $SourcePath + + $openImage = $openWim[[Int32]$ImageIndex] + + if ($null -eq $openImage) + { + Write-W2VError "The specified edition does not appear to exist in the specified WIM." + Write-W2VError "Valid edition names are:" + $openWim.Images | %{ Write-W2VError " $($_.ImageFlags)" } + throw + } + + Write-W2VInfo "Image $($openImage.ImageIndex) selected ($($openImage.ImageFlags))..." + + # Check to make sure that the image we're applying is Windows 7 or greater. + if ($openImage.ImageVersion -lt $lowestSupportedVersion) + { + if ($openImage.ImageVersion -eq "0.0.0.0") + { + Write-W2VWarn "The specified WIM does not encode the Windows version." + } + else + { + throw "Convert-WindowsImage only supports Windows 7 and Windows 8 WIM files. The specified image (version $($openImage.ImageVersion)) does not appear to contain one of those operating systems." + } + } + + if ($hyperVEnabled) + { + Write-W2VInfo "Creating sparse disk..." + $newVhd = New-VHD -Path $VHDPath -SizeBytes $SizeBytes -BlockSizeBytes $BlockSizeBytes -Dynamic + + Write-W2VInfo "Mounting $VHDFormat..." + $disk = $newVhd | Mount-VHD -PassThru | Get-Disk + } + else + { + <# + Create the VHD using the VirtDisk Win32 API. + So, why not use the New-VHD cmdlet here? + + New-VHD depends on the Hyper-V Cmdlets, which aren't installed by default. + Installing those cmdlets isn't a big deal, but they depend on the Hyper-V WMI + APIs, which in turn depend on Hyper-V. In order to prevent Convert-WindowsImage + from being dependent on Hyper-V (and thus, x64 systems only), we're using the + VirtDisk APIs directly. + #> + + Write-W2VInfo "Creating sparse disk..." + [WIM2VHD.VirtualHardDisk]::CreateSparseDisk( + $VHDFormat, + $VHDPath, + $SizeBytes, + $true + ) + + # Attach the VHD.\ + Write-W2VInfo "Attaching $VHDFormat..." + $disk = Mount-DiskImage -ImagePath $VHDPath -PassThru | Get-DiskImage | Get-Disk + } + + switch ($DiskLayout) + { + "BIOS" + { + Write-W2VInfo "Initializing disk..." + Initialize-Disk -Number $disk.Number -PartitionStyle MBR + + # + # Create the Windows/system partition + # + Write-W2VInfo "Creating single partition..." + $systemPartition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -MbrType IFS -IsActive + $windowsPartition = $systemPartition + + Write-W2VInfo "Formatting windows volume..." + $systemVolume = Format-Volume -Partition $systemPartition -FileSystem NTFS -Force -Confirm:$false + $windowsVolume = $systemVolume + } + + "UEFI" + { + Write-W2VInfo "Initializing disk..." + Initialize-Disk -Number $disk.Number -PartitionStyle GPT + + if ((Get-WindowsBuildNumber) -ge 10240) + { + # + # Create the system partition. Create a data partition so we can format it, then change to ESP + # + Write-W2VInfo "Creating EFI system partition..." + $systemPartition = New-Partition -DiskNumber $disk.Number -Size 200MB -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' + + Write-W2VInfo "Formatting system volume..." + $systemVolume = Format-Volume -Partition $systemPartition -FileSystem FAT32 -Force -Confirm:$false + + Write-W2VInfo "Setting system partition as ESP..." + $systemPartition | Set-Partition -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' + $systemPartition | Add-PartitionAccessPath -AssignDriveLetter + } + else + { + # + # Create the system partition + # + Write-W2VInfo "Creating EFI system partition (ESP)..." + $systemPartition = New-Partition -DiskNumber $disk.Number -Size 200MB -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' -AssignDriveLetter + + Write-W2VInfo "Formatting ESP..." + $formatArgs = @( + "$($systemPartition.DriveLetter):", # Partition drive letter + "/FS:FAT32", # File system + "/Q", # Quick format + "/Y" # Suppress prompt + ) + + Run-Executable -Executable format -Arguments $formatArgs + } + + # + # Create the reserved partition + # + Write-W2VInfo "Creating MSR partition..." + $reservedPartition = New-Partition -DiskNumber $disk.Number -Size 128MB -GptType '{e3c9e316-0b5c-4db8-817d-f92df00215ae}' + + # + # Create the Windows partition + # + Write-W2VInfo "Creating windows partition..." + $windowsPartition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' + + Write-W2VInfo "Formatting windows volume..." + $windowsVolume = Format-Volume -Partition $windowsPartition -FileSystem NTFS -Force -Confirm:$false + } + + "WindowsToGo" + { + Write-W2VInfo "Initializing disk..." + Initialize-Disk -Number $disk.Number -PartitionStyle MBR + + # + # Create the system partition + # + Write-W2VInfo "Creating system partition..." + $systemPartition = New-Partition -DiskNumber $disk.Number -Size 350MB -MbrType FAT32 -IsActive + + Write-W2VInfo "Formatting system volume..." + $systemVolume = Format-Volume -Partition $systemPartition -FileSystem FAT32 -Force -Confirm:$false + + # + # Create the Windows partition + # + Write-W2VInfo "Creating windows partition..." + $windowsPartition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -MbrType IFS + + Write-W2VInfo "Formatting windows volume..." + $windowsVolume = Format-Volume -Partition $windowsPartition -FileSystem NTFS -Force -Confirm:$false + } + } + + # + # Assign drive letter to Windows partition. This is required for bcdboot + # + + $attempts = 1 + $assigned = $false + + do + { + $windowsPartition | Add-PartitionAccessPath -AssignDriveLetter + $windowsPartition = $windowsPartition | Get-Partition + if($windowsPartition.DriveLetter -ne 0) + { + $assigned = $true + } + else + { + #sleep for up to 10 seconds and retry + Get-Random -Minimum 1 -Maximum 10 | Start-Sleep + + $attempts++ + } + } + while ($attempts -le 100 -and -not($assigned)) + + if (-not($assigned)) + { + throw "Unable to get Partition after retry" + } + + $windowsDrive = $(Get-Partition -Volume $windowsVolume).AccessPaths[0].substring(0,2) + Write-W2VInfo "Windows path ($windowsDrive) has been assigned." + Write-W2VInfo "Windows path ($windowsDrive) took $attempts attempts to be assigned." + + # + # Refresh access paths (we have now formatted the volume) + # + $systemPartition = $systemPartition | Get-Partition + $systemDrive = $systemPartition.AccessPaths[0].trimend("\").replace("\?", "??") + Write-W2VInfo "System volume location: $systemDrive" + + #################################################################################################### + # APPLY IMAGE FROM WIM TO THE NEW VHD + #################################################################################################### + + Write-W2VInfo "Applying image to $VHDFormat. This could take a while..." + if ((Get-Command Expand-WindowsImage -ErrorAction SilentlyContinue) -and ((-not $ApplyEA) -and ([string]::IsNullOrEmpty($DismPath)))) + { + Expand-WindowsImage -ApplyPath $windowsDrive -ImagePath $SourcePath -Index $ImageIndex -LogPath "$($logFolder)\DismLogs.log" | Out-Null + } + else + { + if (![string]::IsNullOrEmpty($DismPath)) + { + $dismPath = $DismPath + } + else + { + $dismPath = $(Join-Path (get-item env:\windir).value "system32\dism.exe") + } + + $applyImage = "/Apply-Image" + if ($ApplyEA) + { + $applyImage = $applyImage + " /EA" + } + + $dismArgs = @("$applyImage /ImageFile:`"$SourcePath`" /Index:$ImageIndex /ApplyDir:$windowsDrive /LogPath:`"$($logFolder)\DismLogs.log`"") + Write-W2VInfo "Applying image: $dismPath $dismArgs" + $process = Start-Process -Passthru -Wait -NoNewWindow -FilePath $dismPath ` + -ArgumentList $dismArgs ` + + if ($process.ExitCode -ne 0) + { + throw "Image Apply failed! See DismImageApply logs for details" + } + } + Write-W2VInfo "Image was applied successfully. " + + # + # Here we copy in the unattend file (if specified by the command line) + # + if (![string]::IsNullOrEmpty($UnattendPath)) + { + Write-W2VInfo "Applying unattend file ($(Split-Path $UnattendPath -Leaf))..." + Copy-Item -Path $UnattendPath -Destination (Join-Path $windowsDrive "unattend.xml") -Force + } + + if (![string]::IsNullOrEmpty($MergeFolderPath)) + { + Write-W2VInfo "Applying merge folder ($MergeFolderPath)..." + Copy-Item -Recurse -Path (Join-Path $MergeFolderPath "*") -Destination $windowsDrive -Force #added to handle merge folders + } + + if (($openImage.ImageArchitecture -ne "ARM") -and # No virtualization platform for ARM images + ($openImage.ImageArchitecture -ne "ARM64") -and # No virtualization platform for ARM64 images + ($BCDinVHD -ne "NativeBoot")) # User asked for a non-bootable image + { + if (Test-Path "$($systemDrive)\boot\bcd") + { + Write-W2VInfo "Image already has BIOS BCD store..." + } + elseif (Test-Path "$($systemDrive)\efi\microsoft\boot\bcd") + { + Write-W2VInfo "Image already has EFI BCD store..." + } + else + { + Write-W2VInfo "Making image bootable..." + $bcdBootArgs = @( + "$($windowsDrive)\Windows", # Path to the \Windows on the VHD + "/s $systemDrive", # Specifies the volume letter of the drive to create the \BOOT folder on. + "/v" # Enabled verbose logging. + ) + + switch ($DiskLayout) + { + "BIOS" + { + $bcdBootArgs += "/f BIOS" # Specifies the firmware type of the target system partition + } + + "UEFI" + { + $bcdBootArgs += "/f UEFI" # Specifies the firmware type of the target system partition + } + + "WindowsToGo" + { + # Create entries for both UEFI and BIOS if possible + if (Test-Path "$($windowsDrive)\Windows\boot\EFI\bootmgfw.efi") + { + $bcdBootArgs += "/f ALL" + } + } + } + + Run-Executable -Executable $BCDBoot -Arguments $bcdBootArgs + + # The following is added to mitigate the VMM diff disk handling + # We're going to change from MBRBootOption to LocateBootOption. + + if ($DiskLayout -eq "BIOS") + { + Write-W2VInfo "Fixing the Device ID in the BCD store on $($VHDFormat)..." + Run-Executable -Executable "BCDEDIT.EXE" -Arguments ( + "/store $($systemDrive)\boot\bcd", + "/set `{bootmgr`} device locate" + ) + Run-Executable -Executable "BCDEDIT.EXE" -Arguments ( + "/store $($systemDrive)\boot\bcd", + "/set `{default`} device locate" + ) + Run-Executable -Executable "BCDEDIT.EXE" -Arguments ( + "/store $($systemDrive)\boot\bcd", + "/set `{default`} osdevice locate" + ) + } + } + + Write-W2VInfo "Drive is bootable. Cleaning up..." + + # Are we turning the debugger on? + if ($EnableDebugger -inotlike "None") + { + $bcdEditArgs = $null; + + # Configure the specified debugging transport and other settings. + switch ($EnableDebugger) + { + "Serial" + { + $bcdEditArgs = @( + "/dbgsettings SERIAL", + "DEBUGPORT:$($ComPort.Value)", + "BAUDRATE:$($BaudRate.Value)" + ) + } + + "1394" + { + $bcdEditArgs = @( + "/dbgsettings 1394", + "CHANNEL:$($Channel.Value)" + ) + } + + "USB" + { + $bcdEditArgs = @( + "/dbgsettings USB", + "TARGETNAME:$($Target.Value)" + ) + } + + "Local" + { + $bcdEditArgs = @( + "/dbgsettings LOCAL" + ) + } + + "Network" + { + $bcdEditArgs = @( + "/dbgsettings NET", + "HOSTIP:$($IP.Value)", + "PORT:$($Port.Value)", + "KEY:$($Key.Value)" + ) + } + } + + $bcdStores = @( + "$($systemDrive)\boot\bcd", + "$($systemDrive)\efi\microsoft\boot\bcd" + ) + + foreach ($bcdStore in $bcdStores) + { + if (Test-Path $bcdStore) + { + Write-W2VInfo "Turning kernel debugging on in the $($VHDFormat) for $($bcdStore)..." + Run-Executable -Executable "BCDEDIT.EXE" -Arguments ( + "/store $($bcdStore)", + "/set `{default`} debug on" + ) + + $bcdEditArguments = @("/store $($bcdStore)") + $bcdEditArgs + + Run-Executable -Executable "BCDEDIT.EXE" -Arguments $bcdEditArguments + } + } + } + } + else + { + # Don't bother to check on debugging. We can't boot WoA VHDs in VMs, and + # if we're native booting, the changes need to be made to the BCD store on the + # physical computer's boot volume. + + Write-W2VInfo "Image applied. It is not bootable." + } + + if ($RemoteDesktopEnable -or (-not $ExpandOnNativeBoot)) + { + $hive = Mount-RegistryHive -Hive (Join-Path $windowsDrive "Windows\System32\Config\System") + + if ($RemoteDesktopEnable) + { + Write-W2VInfo -text "Enabling Remote Desktop" + Set-ItemProperty -Path "HKLM:\$($hive)\ControlSet001\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0 + } + + if (-not $ExpandOnNativeBoot) + { + Write-W2VInfo -text "Disabling automatic $VHDFormat expansion for Native Boot" + Set-ItemProperty -Path "HKLM:\$($hive)\ControlSet001\Services\FsDepends\Parameters" -Name "VirtualDiskExpandOnMount" -Value 4 + } + + Dismount-RegistryHive -HiveMountPoint $hive + } + + if ($Driver) + { + Write-W2VInfo -text "Adding Windows Drivers to the Image" + $Driver | ForEach-Object -Process { + Write-W2VInfo -text "Driver path: $PSItem" + Add-WindowsDriver -Path $windowsDrive -Recurse -Driver $PSItem -Verbose | Out-Null + } + } + + If ($Feature) + { + Write-W2VInfo -text "Installing Windows Feature(s) $Feature to the Image" + $FeatureSourcePath = Join-Path -Path "$($driveLetter):" -ChildPath "sources\sxs" + Write-W2VInfo -text "From $FeatureSourcePath" + Enable-WindowsOptionalFeature -FeatureName $Feature -Source $FeatureSourcePath -Path $windowsDrive -All | Out-Null + } + + if ($Package) + { + Write-W2VInfo -text "Adding Windows Packages to the Image" + + $Package | ForEach-Object -Process { + Write-W2VInfo -text "Package path: $PSItem" + Add-WindowsPackage -Path $windowsDrive -PackagePath $PSItem | Out-Null + } + } + + # + # Remove system partition access path, if necessary + # + if ($DiskLayout -eq "UEFI") + { + $systemPartition | Remove-PartitionAccessPath -AccessPath $systemPartition.AccessPaths[0] + } + + if ([String]::IsNullOrEmpty($vhdFinalName)) + { + # We need to generate a file name. + Write-W2VInfo "Generating name for $($VHDFormat)..." + $hive = Mount-RegistryHive -Hive (Join-Path $windowsDrive "Windows\System32\Config\Software") + + $buildLabEx = (Get-ItemProperty "HKLM:\$($hive)\Microsoft\Windows NT\CurrentVersion").BuildLabEx + $installType = (Get-ItemProperty "HKLM:\$($hive)\Microsoft\Windows NT\CurrentVersion").InstallationType + $editionId = (Get-ItemProperty "HKLM:\$($hive)\Microsoft\Windows NT\CurrentVersion").EditionID + $skuFamily = $null + + Dismount-RegistryHive -HiveMountPoint $hive + + # Is this ServerCore? + # Since we're only doing this string comparison against the InstallType key, we won't get + # false positives with the Core SKU. + if ($installType.ToUpper().Contains("CORE")) + { + $editionId += "Core" + } + + # What type of SKU are we? + if ($installType.ToUpper().Contains("SERVER")) + { + $skuFamily = "Server" + } + elseif ($installType.ToUpper().Contains("CLIENT")) + { + $skuFamily = "Client" + } + else + { + $skuFamily = "Unknown" + } + + # + # ISSUE - do we want VL here? + # + $vhdFinalName = "$($buildLabEx)_$($skuFamily)_$($editionId)_$($openImage.ImageDefaultLanguage).$($VHDFormat.ToLower())" + Write-W2VTrace "$VHDFormat final name is : $vhdFinalName" + } + + if ($hyperVEnabled) + { + Write-W2VInfo "Dismounting $VHDFormat..." + Dismount-VHD -Path $VHDPath + } + else + { + Write-W2VInfo "Closing $VHDFormat..." + Dismount-DiskImage -ImagePath $VHDPath + } + + $vhdFinalPath = Join-Path (Split-Path $VHDPath -Parent) $vhdFinalName + Write-W2VTrace "$VHDFormat final path is : $vhdFinalPath" + + if (Test-Path $vhdFinalPath) + { + Write-W2VInfo "Deleting pre-existing $VHDFormat : $(Split-Path $vhdFinalPath -Leaf)..." + Remove-Item -Path $vhdFinalPath -Force + } + + Write-W2VTrace -Text "Renaming $VHDFormat at $VHDPath to $vhdFinalName" + Rename-Item -Path (Resolve-Path $VHDPath).Path -NewName $vhdFinalName -Force + $vhd += Get-DiskImage -ImagePath $vhdFinalPath + + $vhdFinalName = $null + } + catch + { + Write-W2VError $_ + Write-W2VInfo "Log folder is $logFolder" + } + finally + { + # If we still have a WIM image open, close it. + if ($openWim -ne $null) + { + Write-W2VInfo "Closing Windows image..." + $openWim.Close() + } + + # If we still have a registry hive mounted, dismount it. + if ($mountedHive -ne $null) + { + Write-W2VInfo "Closing registry hive..." + Dismount-RegistryHive -HiveMountPoint $mountedHive + } + + # If VHD is mounted, unmount it + if (Test-Path $VHDPath) + { + if ($hyperVEnabled) + { + if ((Get-VHD -Path $VHDPath).Attached) + { + Dismount-VHD -Path $VHDPath + } + } + else + { + Dismount-DiskImage -ImagePath $VHDPath + } + } + + # If we still have an ISO open, close it. + if ($openIso -ne $null) + { + Write-W2VInfo "Closing ISO..." + Dismount-DiskImage $ISOPath + } + + if (-not $CacheSource) + { + if ($tempSource -and (Test-Path $tempSource)) + { + Remove-Item -Path $tempSource -Force + } + } + + # Close out the transcript and tell the user we're done. + Write-W2VInfo "Done." + if ($transcripting) + { + $null = Stop-Transcript + } + } + } + + End + { + if ($Passthru) + { + return $vhd + } + } + #endregion Code + +} + + +function +Add-WindowsImageTypes +{ + $code = @" +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Xml.Linq; +using System.Xml.XPath; +using Microsoft.Win32.SafeHandles; + +namespace WIM2VHD +{ + +///

+/// P/Invoke methods and associated enums, flags, and structs. +/// +public class +NativeMethods +{ + + #region Delegates and Callbacks + #region WIMGAPI + + /// + ///User-defined function used with the RegisterMessageCallback or UnregisterMessageCallback function. + /// + ///Specifies the message being sent. + ///Specifies additional message information. The contents of this parameter depend on the value of the + ///MessageId parameter. + ///Specifies additional message information. The contents of this parameter depend on the value of the + ///MessageId parameter. + ///Specifies the user-defined value passed to RegisterCallback. + /// + ///To indicate success and to enable other subscribers to process the message return WIM_MSG_SUCCESS. + ///To prevent other subscribers from receiving the message, return WIM_MSG_DONE. + ///To cancel an image apply or capture, return WIM_MSG_ABORT_IMAGE when handling the WIM_MSG_PROCESS message. + /// + public delegate uint + WimMessageCallback( + uint MessageId, + IntPtr wParam, + IntPtr lParam, + IntPtr UserData + ); + + public static void + RegisterMessageCallback( + WimFileHandle hWim, + WimMessageCallback callback) + { + + uint _callback = NativeMethods.WimRegisterMessageCallback(hWim, callback, IntPtr.Zero); + int rc = Marshal.GetLastWin32Error(); + if (0 != rc) + { + // Throw an exception if something bad happened on the Win32 end. + throw + new InvalidOperationException( + string.Format( + CultureInfo.CurrentCulture, + "Unable to register message callback." + )); + } + } + + public static void + UnregisterMessageCallback( + WimFileHandle hWim, + WimMessageCallback registeredCallback) + { + + bool status = NativeMethods.WimUnregisterMessageCallback(hWim, registeredCallback); + int rc = Marshal.GetLastWin32Error(); + if (!status) + { + throw + new InvalidOperationException( + string.Format( + CultureInfo.CurrentCulture, + "Unable to unregister message callback." + )); + } + } + + #endregion WIMGAPI + #endregion Delegates and Callbacks + + #region Constants + + #region VDiskInterop + + /// + /// The default depth in a VHD parent chain that this library will search through. + /// If you want to go more than one disk deep into the parent chain, provide a different value. + /// + public const uint OPEN_VIRTUAL_DISK_RW_DEFAULT_DEPTH = 0x00000001; + + public const uint DEFAULT_BLOCK_SIZE = 0x00080000; + public const uint DISK_SECTOR_SIZE = 0x00000200; + + internal const uint ERROR_VIRTDISK_NOT_VIRTUAL_DISK = 0xC03A0015; + internal const uint ERROR_NOT_FOUND = 0x00000490; + internal const uint ERROR_IO_PENDING = 0x000003E5; + internal const uint ERROR_INSUFFICIENT_BUFFER = 0x0000007A; + internal const uint ERROR_ERROR_DEV_NOT_EXIST = 0x00000037; + internal const uint ERROR_BAD_COMMAND = 0x00000016; + internal const uint ERROR_SUCCESS = 0x00000000; + + public const uint GENERIC_READ = 0x80000000; + public const uint GENERIC_WRITE = 0x40000000; + public const short FILE_ATTRIBUTE_NORMAL = 0x00000080; + public const uint CREATE_NEW = 0x00000001; + public const uint CREATE_ALWAYS = 0x00000002; + public const uint OPEN_EXISTING = 0x00000003; + public const short INVALID_HANDLE_VALUE = -1; + + internal static Guid VirtualStorageTypeVendorUnknown = new Guid("00000000-0000-0000-0000-000000000000"); + internal static Guid VirtualStorageTypeVendorMicrosoft = new Guid("EC984AEC-A0F9-47e9-901F-71415A66345B"); + + #endregion VDiskInterop + + #region WIMGAPI + + public const uint WIM_FLAG_VERIFY = 0x00000002; + public const uint WIM_FLAG_INDEX = 0x00000004; + + public const uint WM_APP = 0x00008000; + + #endregion WIMGAPI + + #endregion Constants + + #region Enums and Flags + + #region VDiskInterop + + /// + /// Indicates the version of the virtual disk to create. + /// + public enum CreateVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + public enum OpenVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + /// + /// Contains the version of the virtual hard disk (VHD) ATTACH_VIRTUAL_DISK_PARAMETERS structure to use in calls to VHD functions. + /// + public enum AttachVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + public enum CompactVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001 + } + + /// + /// Contains the type and provider (vendor) of the virtual storage device. + /// + public enum VirtualStorageDeviceType : int + { + /// + /// The storage type is unknown or not valid. + /// + Unknown = 0x00000000, + /// + /// For internal use only. This type is not supported. + /// + ISO = 0x00000001, + /// + /// Virtual Hard Disk device type. + /// + VHD = 0x00000002, + /// + /// Virtual Hard Disk v2 device type. + /// + VHDX = 0x00000003 + } + + /// + /// Contains virtual hard disk (VHD) open request flags. + /// + [Flags] + public enum OpenVirtualDiskFlags + { + /// + /// No flags. Use system defaults. + /// + None = 0x00000000, + /// + /// Open the VHD file (backing store) without opening any differencing-chain parents. Used to correct broken parent links. + /// + NoParents = 0x00000001, + /// + /// Reserved. + /// + BlankFile = 0x00000002, + /// + /// Reserved. + /// + BootDrive = 0x00000004, + } + + /// + /// Contains the bit mask for specifying access rights to a virtual hard disk (VHD). + /// + [Flags] + public enum VirtualDiskAccessMask + { + /// + /// Only Version2 of OpenVirtualDisk API accepts this parameter + /// + None = 0x00000000, + /// + /// Open the virtual disk for read-only attach access. The caller must have READ access to the virtual disk image file. + /// + /// + /// If used in a request to open a virtual disk that is already open, the other handles must be limited to either + /// VIRTUAL_DISK_ACCESS_DETACH or VIRTUAL_DISK_ACCESS_GET_INFO access, otherwise the open request with this flag will fail. + /// + AttachReadOnly = 0x00010000, + /// + /// Open the virtual disk for read-write attaching access. The caller must have (READ | WRITE) access to the virtual disk image file. + /// + /// + /// If used in a request to open a virtual disk that is already open, the other handles must be limited to either + /// VIRTUAL_DISK_ACCESS_DETACH or VIRTUAL_DISK_ACCESS_GET_INFO access, otherwise the open request with this flag will fail. + /// If the virtual disk is part of a differencing chain, the disk for this request cannot be less than the readWriteDepth specified + /// during the prior open request for that differencing chain. + /// + AttachReadWrite = 0x00020000, + /// + /// Open the virtual disk to allow detaching of an attached virtual disk. The caller must have + /// (FILE_READ_ATTRIBUTES | FILE_READ_DATA) access to the virtual disk image file. + /// + Detach = 0x00040000, + /// + /// Information retrieval access to the virtual disk. The caller must have READ access to the virtual disk image file. + /// + GetInfo = 0x00080000, + /// + /// Virtual disk creation access. + /// + Create = 0x00100000, + /// + /// Open the virtual disk to perform offline meta-operations. The caller must have (READ | WRITE) access to the virtual + /// disk image file, up to readWriteDepth if working with a differencing chain. + /// + /// + /// If the virtual disk is part of a differencing chain, the backing store (host volume) is opened in RW exclusive mode up to readWriteDepth. + /// + MetaOperations = 0x00200000, + /// + /// Reserved. + /// + Read = 0x000D0000, + /// + /// Allows unrestricted access to the virtual disk. The caller must have unrestricted access rights to the virtual disk image file. + /// + All = 0x003F0000, + /// + /// Reserved. + /// + Writable = 0x00320000 + } + + /// + /// Contains virtual hard disk (VHD) creation flags. + /// + [Flags] + public enum CreateVirtualDiskFlags + { + /// + /// Contains virtual hard disk (VHD) creation flags. + /// + None = 0x00000000, + /// + /// Pre-allocate all physical space necessary for the size of the virtual disk. + /// + /// + /// The CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION flag is used for the creation of a fixed VHD. + /// + FullPhysicalAllocation = 0x00000001 + } + + /// + /// Contains virtual disk attach request flags. + /// + [Flags] + public enum AttachVirtualDiskFlags + { + /// + /// No flags. Use system defaults. + /// + None = 0x00000000, + /// + /// Attach the virtual disk as read-only. + /// + ReadOnly = 0x00000001, + /// + /// No drive letters are assigned to the disk's volumes. + /// + /// Oddly enough, this doesn't apply to NTFS mount points. + NoDriveLetter = 0x00000002, + /// + /// Will decouple the virtual disk lifetime from that of the VirtualDiskHandle. + /// The virtual disk will be attached until the Detach() function is called, even if all open handles to the virtual disk are closed. + /// + PermanentLifetime = 0x00000004, + /// + /// Reserved. + /// + NoLocalHost = 0x00000008 + } + + [Flags] + public enum DetachVirtualDiskFlag + { + None = 0x00000000 + } + + [Flags] + public enum CompactVirtualDiskFlags + { + None = 0x00000000, + NoZeroScan = 0x00000001, + NoBlockMoves = 0x00000002 + } + + #endregion VDiskInterop + + #region WIMGAPI + + [FlagsAttribute] + internal enum + WimCreateFileDesiredAccess : uint + { + WimQuery = 0x00000000, + WimGenericRead = 0x80000000 + } + + public enum WimMessage : uint + { + WIM_MSG = WM_APP + 0x1476, + WIM_MSG_TEXT, + /// + ///Indicates an update in the progress of an image application. + /// + WIM_MSG_PROGRESS, + /// + ///Enables the caller to prevent a file or a directory from being captured or applied. + /// + WIM_MSG_PROCESS, + /// + ///Indicates that volume information is being gathered during an image capture. + /// + WIM_MSG_SCANNING, + /// + ///Indicates the number of files that will be captured or applied. + /// + WIM_MSG_SETRANGE, + /// + ///Indicates the number of files that have been captured or applied. + /// + WIM_MSG_SETPOS, + /// + ///Indicates that a file has been either captured or applied. + /// + WIM_MSG_STEPIT, + /// + ///Enables the caller to prevent a file resource from being compressed during a capture. + /// + WIM_MSG_COMPRESS, + /// + ///Alerts the caller that an error has occurred while capturing or applying an image. + /// + WIM_MSG_ERROR, + /// + ///Enables the caller to align a file resource on a particular alignment boundary. + /// + WIM_MSG_ALIGNMENT, + WIM_MSG_RETRY, + /// + ///Enables the caller to align a file resource on a particular alignment boundary. + /// + WIM_MSG_SPLIT, + WIM_MSG_SUCCESS = 0x00000000, + WIM_MSG_ABORT_IMAGE = 0xFFFFFFFF + } + + internal enum + WimCreationDisposition : uint + { + WimOpenExisting = 0x00000003, + } + + internal enum + WimActionFlags : uint + { + WimIgnored = 0x00000000 + } + + internal enum + WimCompressionType : uint + { + WimIgnored = 0x00000000 + } + + internal enum + WimCreationResult : uint + { + WimCreatedNew = 0x00000000, + WimOpenedExisting = 0x00000001 + } + + #endregion WIMGAPI + + #endregion Enums and Flags + + #region Structs + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct CreateVirtualDiskParameters + { + /// + /// A CREATE_VIRTUAL_DISK_VERSION enumeration that specifies the version of the CREATE_VIRTUAL_DISK_PARAMETERS structure being passed to or from the virtual hard disk (VHD) functions. + /// + public CreateVirtualDiskVersion Version; + + /// + /// Unique identifier to assign to the virtual disk object. If this member is set to zero, a unique identifier is created by the system. + /// + public Guid UniqueId; + + /// + /// The maximum virtual size of the virtual disk object. Must be a multiple of 512. + /// If a ParentPath is specified, this value must be zero. + /// If a SourcePath is specified, this value can be zero to specify the size of the source VHD to be used, otherwise the size specified must be greater than or equal to the size of the source disk. + /// + public ulong MaximumSize; + + /// + /// Internal size of the virtual disk object blocks. + /// The following are predefined block sizes and their behaviors. For a fixed VHD type, this parameter must be zero. + /// + public uint BlockSizeInBytes; + + /// + /// Internal size of the virtual disk object sectors. Must be set to 512. + /// + public uint SectorSizeInBytes; + + /// + /// Optional path to a parent virtual disk object. Associates the new virtual disk with an existing virtual disk. + /// If this parameter is not NULL, SourcePath must be NULL. + /// + public string ParentPath; + + /// + /// Optional path to pre-populate the new virtual disk object with block data from an existing disk. This path may refer to a VHD or a physical disk. + /// If this parameter is not NULL, ParentPath must be NULL. + /// + public string SourcePath; + + /// + /// Flags for opening the VHD + /// + public OpenVirtualDiskFlags OpenFlags; + + /// + /// GetInfoOnly flag for V2 handles + /// + public bool GetInfoOnly; + + /// + /// Virtual Storage Type of the parent disk + /// + public VirtualStorageType ParentVirtualStorageType; + + /// + /// Virtual Storage Type of the source disk + /// + public VirtualStorageType SourceVirtualStorageType; + + /// + /// A GUID to use for fallback resiliency over SMB. + /// + public Guid ResiliencyGuid; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct VirtualStorageType + { + public VirtualStorageDeviceType DeviceId; + public Guid VendorId; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct SecurityDescriptor + { + public byte revision; + public byte size; + public short control; + public IntPtr owner; + public IntPtr group; + public IntPtr sacl; + public IntPtr dacl; + } + + #endregion Structs + + #region VirtDisk.DLL P/Invoke + + [DllImport("virtdisk.dll", CharSet = CharSet.Unicode)] + public static extern uint + CreateVirtualDisk( + [In, Out] ref VirtualStorageType VirtualStorageType, + [In] string Path, + [In] VirtualDiskAccessMask VirtualDiskAccessMask, + [In, Out] ref SecurityDescriptor SecurityDescriptor, + [In] CreateVirtualDiskFlags Flags, + [In] uint ProviderSpecificFlags, + [In, Out] ref CreateVirtualDiskParameters Parameters, + [In] IntPtr Overlapped, + [Out] out SafeFileHandle Handle); + + #endregion VirtDisk.DLL P/Invoke + + #region Win32 P/Invoke + + [DllImport("advapi32", SetLastError = true)] + public static extern bool InitializeSecurityDescriptor( + [Out] out SecurityDescriptor pSecurityDescriptor, + [In] uint dwRevision); + + #endregion Win32 P/Invoke + + #region WIMGAPI P/Invoke + + #region SafeHandle wrappers for WimFileHandle and WimImageHandle + + public sealed class WimFileHandle : SafeHandle + { + + public WimFileHandle( + string wimPath) + : base(IntPtr.Zero, true) + { + + if (String.IsNullOrEmpty(wimPath)) + { + throw new ArgumentNullException("wimPath"); + } + + if (!File.Exists(Path.GetFullPath(wimPath))) + { + throw new FileNotFoundException((new FileNotFoundException()).Message, wimPath); + } + + NativeMethods.WimCreationResult creationResult; + + this.handle = NativeMethods.WimCreateFile( + wimPath, + NativeMethods.WimCreateFileDesiredAccess.WimGenericRead, + NativeMethods.WimCreationDisposition.WimOpenExisting, + NativeMethods.WimActionFlags.WimIgnored, + NativeMethods.WimCompressionType.WimIgnored, + out creationResult + ); + + // Check results. + if (creationResult != NativeMethods.WimCreationResult.WimOpenedExisting) + { + throw new Win32Exception(); + } + + if (this.handle == IntPtr.Zero) + { + throw new Win32Exception(); + } + + // Set the temporary path. + NativeMethods.WimSetTemporaryPath( + this, + Environment.ExpandEnvironmentVariables("%TEMP%") + ); + } + + protected override bool ReleaseHandle() + { + return NativeMethods.WimCloseHandle(this.handle); + } + + public override bool IsInvalid + { + get { return this.handle == IntPtr.Zero; } + } + } + + public sealed class WimImageHandle : SafeHandle + { + public WimImageHandle( + WimFile Container, + uint ImageIndex) + : base(IntPtr.Zero, true) + { + + if (null == Container) + { + throw new ArgumentNullException("Container"); + } + + if ((Container.Handle.IsClosed) || (Container.Handle.IsInvalid)) + { + throw new ArgumentNullException("The handle to the WIM file has already been closed, or is invalid.", "Container"); + } + + if (ImageIndex > Container.ImageCount) + { + throw new ArgumentOutOfRangeException("ImageIndex", "The index does not exist in the specified WIM file."); + } + + this.handle = NativeMethods.WimLoadImage( + Container.Handle.DangerousGetHandle(), + ImageIndex); + } + + protected override bool ReleaseHandle() + { + return NativeMethods.WimCloseHandle(this.handle); + } + + public override bool IsInvalid + { + get { return this.handle == IntPtr.Zero; } + } + } + + #endregion SafeHandle wrappers for WimFileHandle and WimImageHandle + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMCreateFile")] + internal static extern IntPtr + WimCreateFile( + [In, MarshalAs(UnmanagedType.LPWStr)] string WimPath, + [In] WimCreateFileDesiredAccess DesiredAccess, + [In] WimCreationDisposition CreationDisposition, + [In] WimActionFlags FlagsAndAttributes, + [In] WimCompressionType CompressionType, + [Out, Optional] out WimCreationResult CreationResult + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMCloseHandle")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimCloseHandle( + [In] IntPtr Handle + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMLoadImage")] + internal static extern IntPtr + WimLoadImage( + [In] IntPtr Handle, + [In] uint ImageIndex + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMGetImageCount")] + internal static extern uint + WimGetImageCount( + [In] WimFileHandle Handle + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMGetImageInformation")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimGetImageInformation( + [In] SafeHandle Handle, + [Out] out StringBuilder ImageInfo, + [Out] out uint SizeOfImageInfo + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMSetTemporaryPath")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimSetTemporaryPath( + [In] WimFileHandle Handle, + [In] string TempPath + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMRegisterMessageCallback", CallingConvention = CallingConvention.StdCall)] + internal static extern uint + WimRegisterMessageCallback( + [In, Optional] WimFileHandle hWim, + [In] WimMessageCallback MessageProc, + [In, Optional] IntPtr ImageInfo + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMUnregisterMessageCallback", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimUnregisterMessageCallback( + [In, Optional] WimFileHandle hWim, + [In] WimMessageCallback MessageProc + ); + + + #endregion WIMGAPI P/Invoke +} + +#region WIM Interop + +public class WimFile +{ + + internal XDocument m_xmlInfo; + internal List m_imageList; + + private static NativeMethods.WimMessageCallback wimMessageCallback; + + #region Events + + /// + /// DefaultImageEvent handler + /// + public delegate void DefaultImageEventHandler(object sender, DefaultImageEventArgs e); + + /// + ///ProcessFileEvent handler + /// + public delegate void ProcessFileEventHandler(object sender, ProcessFileEventArgs e); + + /// + ///Enable the caller to prevent a file resource from being compressed during a capture. + /// + public event ProcessFileEventHandler ProcessFileEvent; + + /// + ///Indicate an update in the progress of an image application. + /// + public event DefaultImageEventHandler ProgressEvent; + + /// + ///Alert the caller that an error has occurred while capturing or applying an image. + /// + public event DefaultImageEventHandler ErrorEvent; + + /// + ///Indicate that a file has been either captured or applied. + /// + public event DefaultImageEventHandler StepItEvent; + + /// + ///Indicate the number of files that will be captured or applied. + /// + public event DefaultImageEventHandler SetRangeEvent; + + /// + ///Indicate the number of files that have been captured or applied. + /// + public event DefaultImageEventHandler SetPosEvent; + + #endregion Events + + private + enum + ImageEventMessage : uint + { + /// + ///Enables the caller to prevent a file or a directory from being captured or applied. + /// + Progress = NativeMethods.WimMessage.WIM_MSG_PROGRESS, + /// + ///Notification sent to enable the caller to prevent a file or a directory from being captured or applied. + ///To prevent a file or a directory from being captured or applied, call WindowsImageContainer.SkipFile(). + /// + Process = NativeMethods.WimMessage.WIM_MSG_PROCESS, + /// + ///Enables the caller to prevent a file resource from being compressed during a capture. + /// + Compress = NativeMethods.WimMessage.WIM_MSG_COMPRESS, + /// + ///Alerts the caller that an error has occurred while capturing or applying an image. + /// + Error = NativeMethods.WimMessage.WIM_MSG_ERROR, + /// + ///Enables the caller to align a file resource on a particular alignment boundary. + /// + Alignment = NativeMethods.WimMessage.WIM_MSG_ALIGNMENT, + /// + ///Enables the caller to align a file resource on a particular alignment boundary. + /// + Split = NativeMethods.WimMessage.WIM_MSG_SPLIT, + /// + ///Indicates that volume information is being gathered during an image capture. + /// + Scanning = NativeMethods.WimMessage.WIM_MSG_SCANNING, + /// + ///Indicates the number of files that will be captured or applied. + /// + SetRange = NativeMethods.WimMessage.WIM_MSG_SETRANGE, + /// + ///Indicates the number of files that have been captured or applied. + /// + SetPos = NativeMethods.WimMessage.WIM_MSG_SETPOS, + /// + ///Indicates that a file has been either captured or applied. + /// + StepIt = NativeMethods.WimMessage.WIM_MSG_STEPIT, + /// + ///Success. + /// + Success = NativeMethods.WimMessage.WIM_MSG_SUCCESS, + /// + ///Abort. + /// + Abort = NativeMethods.WimMessage.WIM_MSG_ABORT_IMAGE + } + + /// + ///Event callback to the Wimgapi events + /// + private + uint + ImageEventMessagePump( + uint MessageId, + IntPtr wParam, + IntPtr lParam, + IntPtr UserData) + { + + uint status = (uint) NativeMethods.WimMessage.WIM_MSG_SUCCESS; + + DefaultImageEventArgs eventArgs = new DefaultImageEventArgs(wParam, lParam, UserData); + + switch ((ImageEventMessage)MessageId) + { + + case ImageEventMessage.Progress: + ProgressEvent(this, eventArgs); + break; + + case ImageEventMessage.Process: + if (null != ProcessFileEvent) + { + string fileToImage = Marshal.PtrToStringUni(wParam); + ProcessFileEventArgs fileToProcess = new ProcessFileEventArgs(fileToImage, lParam); + ProcessFileEvent(this, fileToProcess); + + if (fileToProcess.Abort == true) + { + status = (uint)ImageEventMessage.Abort; + } + } + break; + + case ImageEventMessage.Error: + if (null != ErrorEvent) + { + ErrorEvent(this, eventArgs); + } + break; + + case ImageEventMessage.SetRange: + if (null != SetRangeEvent) + { + SetRangeEvent(this, eventArgs); + } + break; + + case ImageEventMessage.SetPos: + if (null != SetPosEvent) + { + SetPosEvent(this, eventArgs); + } + break; + + case ImageEventMessage.StepIt: + if (null != StepItEvent) + { + StepItEvent(this, eventArgs); + } + break; + + default: + break; + } + return status; + + } + + /// + /// Constructor. + /// + /// Path to the WIM container. + public + WimFile(string wimPath) + { + if (string.IsNullOrEmpty(wimPath)) + { + throw new ArgumentNullException("wimPath"); + } + + if (!File.Exists(Path.GetFullPath(wimPath))) + { + throw new FileNotFoundException((new FileNotFoundException()).Message, wimPath); + } + + Handle = new NativeMethods.WimFileHandle(wimPath); + + // Hook up the events before we return. + //wimMessageCallback = new NativeMethods.WimMessageCallback(ImageEventMessagePump); + //NativeMethods.RegisterMessageCallback(this.Handle, wimMessageCallback); + } + + /// + /// Closes the WIM file. + /// + public void + Close() + { + foreach (WimImage image in Images) + { + image.Close(); + } + + if (null != wimMessageCallback) + { + NativeMethods.UnregisterMessageCallback(this.Handle, wimMessageCallback); + wimMessageCallback = null; + } + + if ((!Handle.IsClosed) && (!Handle.IsInvalid)) + { + Handle.Close(); + } + } + + /// + /// Provides a list of WimImage objects, representing the images in the WIM container file. + /// + public List + Images + { + get + { + if (null == m_imageList) + { + + int imageCount = (int)ImageCount; + m_imageList = new List(imageCount); + for (int i = 0; i < imageCount; i++) + { + + // Load up each image so it's ready for us. + m_imageList.Add( + new WimImage(this, (uint)i + 1)); + } + } + + return m_imageList; + } + } + + /// + /// Provides a list of names of the images in the specified WIM container file. + /// + public List + ImageNames + { + get + { + List nameList = new List(); + foreach (WimImage image in Images) + { + nameList.Add(image.ImageName); + } + return nameList; + } + } + + /// + /// Indexer for WIM images inside the WIM container, indexed by the image number. + /// The list of Images is 0-based, but the WIM container is 1-based, so we automatically compensate for that. + /// this[1] returns the 0th image in the WIM container. + /// + /// The 1-based index of the image to retrieve. + /// WinImage object. + public WimImage + this[int ImageIndex] + { + get { return Images[ImageIndex - 1]; } + } + + /// + /// Indexer for WIM images inside the WIM container, indexed by the image name. + /// WIMs created by different processes sometimes contain different information - including the name. + /// Some images have their name stored in the Name field, some in the Flags field, and some in the EditionID field. + /// We take all of those into account in while searching the WIM. + /// + /// + /// + public WimImage + this[string ImageName] + { + get + { + return + Images.Where(i => ( + i.ImageName.ToUpper() == ImageName.ToUpper() || + i.ImageFlags.ToUpper() == ImageName.ToUpper() )) + .DefaultIfEmpty(null) + .FirstOrDefault(); + } + } + + /// + /// Returns the number of images in the WIM container. + /// + internal uint + ImageCount + { + get { return NativeMethods.WimGetImageCount(Handle); } + } + + /// + /// Returns an XDocument representation of the XML metadata for the WIM container and associated images. + /// + internal XDocument + XmlInfo + { + get + { + + if (null == m_xmlInfo) + { + StringBuilder builder; + uint bytes; + if (!NativeMethods.WimGetImageInformation(Handle, out builder, out bytes)) + { + throw new Win32Exception(); + } + + // Ensure the length of the returned bytes to avoid garbage characters at the end. + int charCount = (int)bytes / sizeof(char); + if (null != builder) + { + // Get rid of the unicode file marker at the beginning of the XML. + builder.Remove(0, 1); + builder.EnsureCapacity(charCount - 1); + builder.Length = charCount - 1; + + // This isn't likely to change while we have the image open, so cache it. + m_xmlInfo = XDocument.Parse(builder.ToString().Trim()); + } + else + { + m_xmlInfo = null; + } + } + + return m_xmlInfo; + } + } + + public NativeMethods.WimFileHandle Handle + { + get; + private set; + } +} + +public class +WimImage +{ + + internal XDocument m_xmlInfo; + + public + WimImage( + WimFile Container, + uint ImageIndex) + { + + if (null == Container) + { + throw new ArgumentNullException("Container"); + } + + if ((Container.Handle.IsClosed) || (Container.Handle.IsInvalid)) + { + throw new ArgumentNullException("The handle to the WIM file has already been closed, or is invalid.", "Container"); + } + + if (ImageIndex > Container.ImageCount) + { + throw new ArgumentOutOfRangeException("ImageIndex", "The index does not exist in the specified WIM file."); + } + + Handle = new NativeMethods.WimImageHandle(Container, ImageIndex); + } + + public enum + Architectures : uint + { + x86 = 0x0, + ARM = 0x5, + IA64 = 0x6, + AMD64 = 0x9, + ARM64 = 0xC + } + + public void + Close() + { + if ((!Handle.IsClosed) && (!Handle.IsInvalid)) + { + Handle.Close(); + } + } + + public NativeMethods.WimImageHandle + Handle + { + get; + private set; + } + + internal XDocument + XmlInfo + { + get + { + + if (null == m_xmlInfo) + { + StringBuilder builder; + uint bytes; + if (!NativeMethods.WimGetImageInformation(Handle, out builder, out bytes)) + { + throw new Win32Exception(); + } + + // Ensure the length of the returned bytes to avoid garbage characters at the end. + int charCount = (int)bytes / sizeof(char); + if (null != builder) + { + // Get rid of the unicode file marker at the beginning of the XML. + builder.Remove(0, 1); + builder.EnsureCapacity(charCount - 1); + builder.Length = charCount - 1; + + // This isn't likely to change while we have the image open, so cache it. + m_xmlInfo = XDocument.Parse(builder.ToString().Trim()); + } + else + { + m_xmlInfo = null; + } + } + + return m_xmlInfo; + } + } + + public string + ImageIndex + { + get { return XmlInfo.Element("IMAGE").Attribute("INDEX").Value; } + } + + public string + ImageName + { + get { return XmlInfo.XPathSelectElement("/IMAGE/NAME").Value; } + } + + public string + ImageEditionId + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/EDITIONID").Value; } + } + + public string + ImageFlags + { + get + { + string flagValue = String.Empty; + + try + { + flagValue = XmlInfo.XPathSelectElement("/IMAGE/FLAGS").Value; + } + catch + { + + // Some WIM files don't contain a FLAGS element in the metadata. + // In an effort to support those WIMs too, inherit the EditionId if there + // are no Flags. + + if (String.IsNullOrEmpty(flagValue)) + { + flagValue = this.ImageEditionId; + + // Check to see if the EditionId is "ServerHyper". If so, + // tweak it to be "ServerHyperCore" instead. + + if (0 == String.Compare("serverhyper", flagValue, true)) + { + flagValue = "ServerHyperCore"; + } + } + + } + + return flagValue; + } + } + + public string + ImageProductType + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/PRODUCTTYPE").Value; } + } + + public string + ImageInstallationType + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/INSTALLATIONTYPE").Value; } + } + + public string + ImageDescription + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DESCRIPTION").Value; } + } + + public ulong + ImageSize + { + get { return ulong.Parse(XmlInfo.XPathSelectElement("/IMAGE/TOTALBYTES").Value); } + } + + public Architectures + ImageArchitecture + { + get + { + int arch = -1; + try + { + arch = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/ARCH").Value); + } + catch { } + + return (Architectures)arch; + } + } + + public string + ImageDefaultLanguage + { + get + { + string lang = null; + try + { + lang = XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/LANGUAGES/DEFAULT").Value; + } + catch { } + + return lang; + } + } + + public Version + ImageVersion + { + get + { + int major = 0; + int minor = 0; + int build = 0; + int revision = 0; + + try + { + major = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/MAJOR").Value); + minor = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/MINOR").Value); + build = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/BUILD").Value); + revision = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/SPBUILD").Value); + } + catch { } + + return (new Version(major, minor, build, revision)); + } + } + + public string + ImageDisplayName + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DISPLAYNAME").Value; } + } + + public string + ImageDisplayDescription + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DISPLAYDESCRIPTION").Value; } + } +} + +/// +///Describes the file that is being processed for the ProcessFileEvent. +/// +public class +DefaultImageEventArgs : EventArgs +{ + /// + ///Default constructor. + /// + public + DefaultImageEventArgs( + IntPtr wideParameter, + IntPtr leftParameter, + IntPtr userData) + { + + WideParameter = wideParameter; + LeftParameter = leftParameter; + UserData = userData; + } + + /// + ///wParam + /// + public IntPtr WideParameter + { + get; + private set; + } + + /// + ///lParam + /// + public IntPtr LeftParameter + { + get; + private set; + } + + /// + ///UserData + /// + public IntPtr UserData + { + get; + private set; + } +} + +/// +///Describes the file that is being processed for the ProcessFileEvent. +/// +public class +ProcessFileEventArgs : EventArgs +{ + /// + ///Default constructor. + /// + ///Fully qualified path and file name. For example: c:\file.sys. + ///Default is false - skip file and continue. + ///Set to true to abort the entire image capture. + public + ProcessFileEventArgs( + string file, + IntPtr skipFileFlag) + { + + m_FilePath = file; + m_SkipFileFlag = skipFileFlag; + } + + /// + ///Skip file from being imaged. + /// + public void + SkipFile() + { + byte[] byteBuffer = + { + 0 + }; + int byteBufferSize = byteBuffer.Length; + Marshal.Copy(byteBuffer, 0, m_SkipFileFlag, byteBufferSize); + } + + /// + ///Fully qualified path and file name. + /// + public string + FilePath + { + get + { + string stringToReturn = ""; + if (m_FilePath != null) + { + stringToReturn = m_FilePath; + } + return stringToReturn; + } + } + + /// + ///Flag to indicate if the entire image capture should be aborted. + ///Default is false - skip file and continue. Setting to true will + ///abort the entire image capture. + /// + public bool Abort + { + set { m_Abort = value; } + get { return m_Abort; } + } + + private string m_FilePath; + private bool m_Abort; + private IntPtr m_SkipFileFlag; + +} + +#endregion WIM Interop + +#region VHD Interop +// Based on code written by the Hyper-V Test team. +/// +/// The Virtual Hard Disk class provides methods for creating and manipulating Virtual Hard Disk files. +/// +public class +VirtualHardDisk +{ + #region Static Methods + + #region Sparse Disks + + /// + /// Abbreviated signature of CreateSparseDisk so it's easier to use from WIM2VHD. + /// + /// The type of disk to create, VHD or VHDX. + /// The path of the disk to create. + /// The maximum size of the disk to create. + /// Overwrite the VHD if it already exists. + public static void + CreateSparseDisk( + NativeMethods.VirtualStorageDeviceType virtualStorageDeviceType, + string path, + ulong size, + bool overwrite) + { + + CreateSparseDisk( + path, + size, + overwrite, + null, + IntPtr.Zero, + (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.DEFAULT_BLOCK_SIZE + : 0, + virtualStorageDeviceType, + NativeMethods.DISK_SECTOR_SIZE); + } + + /// + /// Creates a new sparse (dynamically expanding) virtual hard disk (.vhd). Supports both sync and async modes. + /// The VHD image file uses only as much space on the backing store as needed to store the actual data the VHD currently contains. + /// + /// The path and name of the VHD to create. + /// The size of the VHD to create in bytes. + /// When creating this type of VHD, the VHD API does not test for free space on the physical backing store based on the maximum size requested, + /// therefore it is possible to successfully create a dynamic VHD with a maximum size larger than the available physical disk free space. + /// The maximum size of a dynamic VHD is 2,040 GB. The minimum size is 3 MB. + /// Optional path to pre-populate the new virtual disk object with block data from an existing disk + /// This path may refer to a VHD or a physical disk. Use NULL if you don't want a source. + /// If the VHD exists, setting this parameter to 'True' will delete it and create a new one. + /// If not null, the operation runs in async mode + /// Block size for the VHD. + /// VHD format version (VHD1 or VHD2) + /// Sector size for the VHD. + /// Thrown when an invalid size is specified + /// Thrown when source VHD is not found. + /// Thrown when there was an error while creating the default security descriptor. + /// Thrown when an error occurred while creating the VHD. + public static void + CreateSparseDisk( + string path, + ulong size, + bool overwrite, + string source, + IntPtr overlapped, + uint blockSizeInBytes, + NativeMethods.VirtualStorageDeviceType virtualStorageDeviceType, + uint sectorSizeInBytes) + { + + // Validate the virtualStorageDeviceType + if (virtualStorageDeviceType != NativeMethods.VirtualStorageDeviceType.VHD && virtualStorageDeviceType != NativeMethods.VirtualStorageDeviceType.VHDX) + { + + throw ( + new ArgumentOutOfRangeException( + "virtualStorageDeviceType", + virtualStorageDeviceType, + "VirtualStorageDeviceType must be VHD or VHDX." + )); + } + + // Validate size. It needs to be a multiple of DISK_SECTOR_SIZE (512)... + if ((size % NativeMethods.DISK_SECTOR_SIZE) != 0) + { + + throw ( + new ArgumentOutOfRangeException( + "size", + size, + "The size of the virtual disk must be a multiple of 512." + )); + } + + if ((!String.IsNullOrEmpty(source)) && (!System.IO.File.Exists(source))) + { + + throw ( + new System.IO.FileNotFoundException( + "Unable to find the source file.", + source + )); + } + + if ((overwrite) && (System.IO.File.Exists(path))) + { + + System.IO.File.Delete(path); + } + + NativeMethods.CreateVirtualDiskParameters createParams = new NativeMethods.CreateVirtualDiskParameters(); + + // Select the correct version. + createParams.Version = (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.CreateVirtualDiskVersion.Version1 + : NativeMethods.CreateVirtualDiskVersion.Version2; + + createParams.UniqueId = Guid.NewGuid(); + createParams.MaximumSize = size; + createParams.BlockSizeInBytes = blockSizeInBytes; + createParams.SectorSizeInBytes = sectorSizeInBytes; + createParams.ParentPath = null; + createParams.SourcePath = source; + createParams.OpenFlags = NativeMethods.OpenVirtualDiskFlags.None; + createParams.GetInfoOnly = false; + createParams.ParentVirtualStorageType = new NativeMethods.VirtualStorageType(); + createParams.SourceVirtualStorageType = new NativeMethods.VirtualStorageType(); + + // + // Create and init a security descriptor. + // Since we're creating an essentially blank SD to use with CreateVirtualDisk + // the VHD will take on the security values from the parent directory. + // + + NativeMethods.SecurityDescriptor securityDescriptor; + if (!NativeMethods.InitializeSecurityDescriptor(out securityDescriptor, 1)) + { + + throw ( + new SecurityException( + "Unable to initialize the security descriptor for the virtual disk." + )); + } + + NativeMethods.VirtualStorageType virtualStorageType = new NativeMethods.VirtualStorageType(); + virtualStorageType.DeviceId = virtualStorageDeviceType; + virtualStorageType.VendorId = NativeMethods.VirtualStorageTypeVendorMicrosoft; + + SafeFileHandle vhdHandle; + + uint returnCode = NativeMethods.CreateVirtualDisk( + ref virtualStorageType, + path, + (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.VirtualDiskAccessMask.All + : NativeMethods.VirtualDiskAccessMask.None, + ref securityDescriptor, + NativeMethods.CreateVirtualDiskFlags.None, + 0, + ref createParams, + overlapped, + out vhdHandle); + + vhdHandle.Close(); + + if (NativeMethods.ERROR_SUCCESS != returnCode && NativeMethods.ERROR_IO_PENDING != returnCode) + { + + throw ( + new Win32Exception( + (int)returnCode + )); + } + } + + #endregion Sparse Disks + + #endregion Static Methods + +} +#endregion VHD Interop +} +"@ + + Add-Type -TypeDefinition $code -ReferencedAssemblies "System.Xml","System.Linq","System.Xml.Linq" -ErrorAction SilentlyContinue +} diff --git a/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Hyper-ConvertImage.psd1 b/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Hyper-ConvertImage.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..63fe5f259a24fc53b27a86fa0e1fabaad7e2a059 GIT binary patch literal 7426 zcmc(kTTfd@6ou!NO8pO3T?twh2nmUrN|j;-C`cqlT++V!25|$}wM`(c`0H)gH=AK* z&V|?zR9S~}o3m%_+uD1EfB*T~edS)cza3|ehJH;Q2d?YJZs104s=G5cbUkNdAS;nQf+;k$Y_Mr_Oy@ z5(^KccVADZ-bOsB#)NhY?iY6??U8Krcl7nTd*)sWM^D~ZmbHJ>(bLtsbnQy^vYzzZ z3yoQp&d)WvtKYGn_BCcrZ=O})ZwVtvEGq7@mLbc>8@iT!M{Jx4@1Cyl!$5PtcOP`d zC&UJkv!%BKZ-<^NR`wB=0i@x{hQ2mTcli=DMOkLICE4gZNqH)-;-7|Mtl?UUm{XnO+~n6-a}r}? zpB+7oETi7=V`AoqjEG*v3dcS=yTWhp+nSAh#@-{zA8H1RRy@}6&+GLgyZP14ji%oy z!-$8}<_%dDb~%?GSaKv(9gk$9H^xR_S zQeQ+yDYBx)=_kp76DQsihmvdTW`Em~50~N#^9Xrokzkw^SZGB$7kLUBkQZmtluXIL zNSO-hId1Z5DBi{Y2VPr?5oSN}aswhb2TPcpKIgrKO1ae>_*^!5QW14Azw$VnO#_&R z%rbkZr2K_Kn<#&T_7tHILz!$JVOaL-*CKDmz!)Tes;BWnDPi81&M|{)Y$o zYC|%nlHJ$evg9wTm+?YF%tKWnbE!qA(uS*3$Df+)K55+eu*o(Gf`;T78su}*gOLw%Qk2Ai0 zEd14|>b1z%4`DrkCQGUU^x|ti!lF-!)tF28lw1qm>w3SjrWmV&Am=eW7}p$4&5-Ia z5t9vXdee|&cX{zpT@Py#x+Pl+<+@+Vzo$1Apx?JR&V705>oiulUknBe^J3rf@y~jU z4Ez7^r#R--p_p&wT!tO-2^%-g&pN#D}X<6%~|*vP)OsNL6h#ntL+wn{8V zQ_3Dxw}7drNqx?3`6?9qa`2npeRp-sk9ZW;qk|;7!s8m#cQGHDG#XS4?%0JyP&F@%B#cseMJxYPSF7Kw>|3y&LuPFw_QL}mN^e1R&n5A z&Gsd1lgpb2$*zwPxWKZ33Q7%4vjK#xy1QDjTUW%|uX>*+kF-!R(>RYa)<=6BlcP%c z>S2hsq&Kk{X98{HpmxX`q&<{0)V4t;$izFEt&&o$CjjG5dnJs*X1 z;vY5Eb{&mv>EM_ZCT|Ff#V2Dx!b-e|J7P8l+tIi5#zlyZ@?t=-P%#!R6bYwAG zFHk8$CmiYo{pHa8p>b4(GCtxgzR$6-3pSOHC+;V=svr9fLxAo@fv9 zTu-JtQ)gioe7QQ)Ztpx+U@b?7#r$01bF^eO+nd2Q^<9722KZ>_MqX}#dR+UO3$8J~ zXKhAD0$0Qiq`FdvxZ_+e#q!+d4|~xK*_PG$Ks7zh*tkkJixl@^4m8?!5yw8WOx~Jg zA&*?buhcH81l<8^XP$)_i7IvhOt-F9n=duGt^MV;m$<045jk7T+orxD!k9m`m+h^R z@8+p_Y*sJRxS`%>Thb5i3pvj0uoP<*ya$)TYsT}oqU1iWoW&gid~Q95afR8<{y$)A zdUoZBQ8I-N4T&LB!9eF|9Js378r{^PzH(=x=dfp$U5TBzV$C_GrCG{zVxMm{GjowE zbsnQ<#2#Z|vzTDDO7D!lEXQ)2%p3Pj-EN%js-%?3P=W6~$FJnRKnAsbkY) z43U~wM%#ae)k4=8?0TKq0y*27k@`k<;47;SJ37x2t5p)HFMMAWrHn^we8Ye3$UNgT zx}z)Ig?KU6r2^oK7<=hn%IDS#)bd|%sxmo V_l7@mZdud7H>OegRoPb8?my0ipKSmD literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Hyper-ConvertImage.psm1 b/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Hyper-ConvertImage.psm1 new file mode 100644 index 0000000..8bb5095 --- /dev/null +++ b/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/Hyper-ConvertImage.psm1 @@ -0,0 +1,4550 @@ +<# + This is PS Module — the new long-term home for Convert-WindowsImage and sister functions. + + Copyright (c) Microsoft Corporation. All rights reserved. + + .NOTES + Use of this sample source code is subject to the terms of the Microsoft + license agreement under which you licensed this sample source code. If + you did not accept the terms of the license agreement, you are not + authorized to use this sample source code. For the terms of the license, + please see the license agreement between you and Microsoft or, if applicable, + see the LICENSE.RTF on your install media or the root of your tools installation. + THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES. + + .SYNOPSIS + Creates a bootable VHD(X) based on Windows 7,8, 10 or Windows Server 2012, 2012R2, 2016, 2019 installation media. + + .DESCRIPTION + Creates a bootable VHD(X) based on Windows 7,8, 10 or Windows Server 2012, 2012R2, 2016, 2019 installation media. + + .PARAMETER SourcePath + The complete path to the WIM or ISO file that will be converted to a Virtual Hard Disk. + The ISO file must be valid Windows installation media to be recognized successfully. + + .PARAMETER CacheSource + If the source WIM/ISO was copied locally, we delete it by default. + Pass $true to cache the source image from the temp directory. + + .PARAMETER VHDPath + The name and path of the Virtual Hard Disk to create. + Omitting this parameter will create the Virtual Hard Disk is the current directory, (or, + if specified by the -WorkingDirectory parameter, the working directory) and will automatically + name the file in the following format: + + ....___. + i.e.: + 9200.0.amd64fre.winmain_win8rtm.120725-1247_client_professional_en-us.vhd(x) + + .PARAMETER WorkingDirectory + Specifies the directory where the VHD(X) file should be generated. + If specified along with -VHDPath, the -WorkingDirectory value is ignored. + The default value is the current directory ($pwd). + + .PARAMETER TempDirectory + Specifies the directory where the logs and ISO files should be placed. + The default value is the temp directory ($env:Temp). + + .PARAMETER SizeBytes + The size of the Virtual Hard Disk to create. + For fixed disks, the VHD(X) file will be allocated all of this space immediately. + For dynamic disks, this will be the maximum size that the VHD(X) can grow to. + The default value is 40GB. + + .PARAMETER VhdFormat + Specifies whether to create a VHD or VHDX formatted Virtual Hard Disk. + The default is AUTO, which will create a VHD if using the BIOS disk layout or + VHDX if using UEFI or WindowsToGo layouts. + + .PARAMETER DiskLayout + Specifies whether to build the image for BIOS (MBR), UEFI (GPT), or WindowsToGo (MBR). + Generation 1 VMs require BIOS (MBR) images. Generation 2 VMs require UEFI (GPT) images. + Windows To Go images will boot in UEFI or BIOS but are not technically supported (upgrade + doesn't work) + + .PARAMETER UnattendPath + The complete path to an unattend.xml file that can be injected into the VHD(X). + + .PARAMETER Edition + The name or image index of the image to apply from the WIM. + + .PARAMETER Passthru + Specifies that the full path to the VHD(X) that is created should be + returned on the pipeline. + + .PARAMETER BCDBoot + By default, the version of BCDBOOT.EXE that is present in \Windows\System32 + is used by Convert-WindowsImage. If you need to specify an alternate version, + use this parameter to do so. + + .PARAMETER MergeFolder + Specifies additional MergeFolder path to be added to the root of the VHD(X) + + .PARAMETER BCDinVHD + Specifies the purpose of the VHD(x). Use NativeBoot to skip cration of BCD store + inside the VHD(x). Use VirtualMachine (or do not specify this option) to ensure + the BCD store is created inside the VHD(x). + + .PARAMETER Driver + Full path to driver(s) (.inf files) to inject to the OS inside the VHD(x). + + .PARAMETER ExpandOnNativeBoot + Specifies whether to expand the VHD(x) to its maximum suze upon native boot. + The default is True. Set to False to disable expansion. + + .PARAMETER RemoteDesktopEnable + Enable Remote Desktop to connect to the OS inside the VHD(x) upon provisioning. + Does not include Windows Firewall rules (firewall exceptions). The default is False. + + .PARAMETER Feature + Enables specified Windows Feature(s). Note that you need to specify the Internal names + understood by DISM and DISM CMDLets (e.g. NetFx3) instead of the "Friendly" names + from Server Manager CMDLets (e.g. NET-Framework-Core). + + .PARAMETER Package + Injects specified Windows Package(s). Accepts path to either a directory or individual + CAB or MSU file. + + .PARAMETER ShowUI + Specifies that the Graphical User Interface should be displayed. + + .PARAMETER EnableDebugger + Configures kernel debugging for the VHD(X) being created. + EnableDebugger takes a single argument which specifies the debugging transport to use. + Valid transports are: None, Serial, 1394, USB, Network, Local. + + Depending on the type of transport selected, additional configuration parameters will become + available. + + Serial: + -ComPort - The COM port number to use while communicating with the debugger. + The default value is 1 (indicating COM1). + -BaudRate - The baud rate (in bps) to use while communicating with the debugger. + The default value is 115200, valid values are: + 9600, 19200, 38400, 56700, 115200 + + 1394: + -Channel - The 1394 channel used to communicate with the debugger. + The default value is 10. + + USB: + -Target - The target name used for USB debugging. + The default value is "debugging". + + Network: + -IPAddress - The IP address of the debugging host computer. + -Port - The port on which to connect to the debugging host. + The default value is 50000, with a minimum value of 49152. + -Key - The key used to encrypt the connection. Only [0-9] and [a-z] are allowed. + -nodhcp - Prevents the use of DHCP to obtain the target IP address. + -newkey - Specifies that a new encryption key should be generated for the connection. + + .PARAMETER DismPath + Full Path to an alternative version of the Dism.exe tool. The default is the current OS version. + + .PARAMETER ApplyEA + Specifies that any EAs captured in the WIM should be applied to the VHD. + The default is False. + + .EXAMPLE + Convert-WindowsImage -SourcePath D:\foo\install.wim -Edition Professional -WorkingDirectory D:\foo + + This command will create a 40GB dynamically expanding VHD in the D:\foo folder. + The VHD will be based on the Professional edition from D:\foo\install.wim, + and will be named automatically. + + .EXAMPLE + Convert-WindowsImage -SourcePath D:\foo\Win7SP1.iso -Edition Ultimate -VHDPath D:\foo\Win7_Ultimate_SP1.vhd + + This command will parse the ISO file D:\foo\Win7SP1.iso and try to locate + \sources\install.wim. If that file is found, it will be used to create a + dynamically-expanding 40GB VHD containing the Ultimate SKU, and will be + named D:\foo\Win7_Ultimate_SP1.vhd + + .EXAMPLE + Convert-WindowsImage -SourcePath D:\foo\install.wim -Edition Professional -EnableDebugger Serial -ComPort 2 -BaudRate 38400 + + This command will create a VHD from D:\foo\install.wim of the Professional SKU. + Serial debugging will be enabled in the VHD via COM2 at a baud rate of 38400bps. + + .OUTPUTS + System.IO.FileInfo +#> + +function +Convert-WindowsImage { + [CmdletBinding( + + DefaultParameterSetName = "DiskLayout", + HelpURI = + "https://github.com/Microsoft/Virtualization-Documentation/tree/master/hyperv-tools/Convert-WindowsImage" + )] + + param( + [Parameter( + ParameterSetName = "DiskLayout", + Mandatory = $True, + ValueFromPipeline = $True)] + [Parameter( + ParameterSetName = "PartitionStyle", + Mandatory = $True, + ValueFromPipeline = $True)] + [Alias("WIM")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateScript( + { + + # This helps to work around the issue when PowerShell does not immediately + # recognize newly mounted drives + $Drive = Get-PSDrive + Test-Path -Path ( Resolve-Path -Path $PSItem ).Path + } + )] + $SourcePath, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [switch] + $CacheSource = $false, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("SKU")] + [string[]] + [ValidateNotNullOrEmpty()] + $Edition = 1, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("WorkDir")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateScript( + { Test-Path -Path $PSItem } + )] + $WorkingDirectory = $pwd, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("TempDir")] + [string] + [ValidateNotNullOrEmpty()] + $TempDirectory = $env:Temp, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("VHD")] + [string] + [ValidateNotNullOrEmpty()] + $VhdPath, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("Size")] + [UInt64] + [ValidateNotNullOrEmpty()] + [ValidateRange( 512MB, 64TB )] + $SizeBytes = 25GB, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("Format")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet( + "VHD", + "VHDX", + "AUTO" + )] + $VhdFormat = "AUTO", + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("DiskType")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet("Dynamic", "Fixed")] + $VhdType = "Dynamic", + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("MergeFolder")] + [string] + [ValidateNotNullOrEmpty()] + $MergeFolderPath = "", + + [Parameter( + ParameterSetName = "DiskLayout", + Mandatory = $True + )] + [Alias("Layout")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet( + "BIOS", + "UEFI", + "WindowsToGo" + )] + $DiskLayout, + + [Parameter( + ParameterSetName = "PartitionStyle", + Mandatory = $True + )] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet( + "MBR", + "GPT", + "MBRforWindowsToGo" + )] + $VhdPartitionStyle, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet( "NativeBoot", "VirtualMachine" )] + $BcdInVhd = "VirtualMachine", + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Parameter(ParameterSetName = "UI")] + [string] + $BcdBoot = "bcdboot.exe", + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Parameter(ParameterSetName = "UI")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet( + "None", + "Serial", + "1394", + "USB", + "Local", + "Network" + )] + $EnableDebugger = "None", + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [string[]] + [ValidateNotNullOrEmpty()] + $Feature, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [string[]] + [ValidateNotNullOrEmpty()] + [ValidateScript( + { Test-Path -Path ( Resolve-Path -Path $PSItem ).Path } + )] + $Driver, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [string[]] + [ValidateNotNullOrEmpty()] + [ValidateScript( + { Test-Path -Path ( Resolve-Path -Path $PSItem ).Path } + )] + $Package, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [switch] + $ExpandOnNativeBoot = $true, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [switch] + $RemoteDesktopEnable = $false, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Alias("Unattend")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateScript( + { Test-Path -Path ( Resolve-Path -Path $PSItem ).Path } + )] + $UnattendPath, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [Parameter(ParameterSetName = "UI")] + [switch] + $Passthru, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [string] + [ValidateNotNullOrEmpty()] + [ValidateScript( + { Test-Path -Path ( Resolve-Path -Path $PSItem ).Path } + )] + $DismPath, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [switch] + $ApplyEA = $false, + + [Parameter(ParameterSetName = "UI")] + [switch] + $ShowUI, + + [Parameter(ParameterSetName = "DiskLayout")] + [Parameter(ParameterSetName = "PartitionStyle")] + [System.Globalization.CultureInfo] + [ValidateNotNullOrEmpty()] + $BcdLocale + ) + + #region Code + + # Begin Dynamic Parameters + # Create the parameters for the various types of debugging. + + DynamicParam { + + # Set up the dynamic parameters. + # Dynamic parameters are only available if certain conditions are met, so they'll only show up + # as valid parameters when those conditions apply. Here, the conditions are based on the value of + # the EnableDebugger parameter. Depending on which of a set of values is the specified argument + # for EnableDebugger, different parameters will light up, as outlined below. + + $parameterDictionary = New-Object -TypeName "System.Management.Automation.RuntimeDefinedParameterDictionary" + + If (Test-Path -Path "Variable:\EnableDebugger") { + Switch ($EnableDebugger) { + "Serial" { + #region ComPort + + $ComPortAttr = New-Object System.Management.Automation.ParameterAttribute + $ComPortAttr.ParameterSetName = "__AllParameterSets" + $ComPortAttr.Mandatory = $false + + $ComPortValidator = New-Object System.Management.Automation.ValidateRangeAttribute( + 1, + 10 # Is that a good maximum? + ) + + $ComPortNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $ComPortAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $ComPortAttrCollection.Add($ComPortAttr) + $ComPortAttrCollection.Add($ComPortValidator) + $ComPortAttrCollection.Add($ComPortNotNull) + + $ComPort = New-Object System.Management.Automation.RuntimeDefinedParameter( + "ComPort", + [UInt16], + $ComPortAttrCollection + ) + + # By default, use COM1 + $ComPort.Value = 1 + $parameterDictionary.Add("ComPort", $ComPort) + #endregion ComPort + + #region BaudRate + $BaudRateAttr = New-Object System.Management.Automation.ParameterAttribute + $BaudRateAttr.ParameterSetName = "__AllParameterSets" + $BaudRateAttr.Mandatory = $false + + $BaudRateValidator = New-Object System.Management.Automation.ValidateSetAttribute( + 9600, 19200, 38400, 57600, 115200 + ) + + $BaudRateNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $BaudRateAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $BaudRateAttrCollection.Add($BaudRateAttr) + $BaudRateAttrCollection.Add($BaudRateValidator) + $BaudRateAttrCollection.Add($BaudRateNotNull) + + $BaudRate = New-Object System.Management.Automation.RuntimeDefinedParameter( + "BaudRate", + [UInt32], + $BaudRateAttrCollection + ) + + # By default, use 115,200. + $BaudRate.Value = 115200 + $parameterDictionary.Add("BaudRate", $BaudRate) + #endregion BaudRate + + break + } + + "1394" { + $ChannelAttr = New-Object System.Management.Automation.ParameterAttribute + $ChannelAttr.ParameterSetName = "__AllParameterSets" + $ChannelAttr.Mandatory = $false + + $ChannelValidator = New-Object System.Management.Automation.ValidateRangeAttribute( + 0, + 62 + ) + + $ChannelNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $ChannelAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $ChannelAttrCollection.Add($ChannelAttr) + $ChannelAttrCollection.Add($ChannelValidator) + $ChannelAttrCollection.Add($ChannelNotNull) + + $Channel = New-Object System.Management.Automation.RuntimeDefinedParameter( + "Channel", + [UInt16], + $ChannelAttrCollection + ) + + # By default, use channel 10 + $Channel.Value = 10 + $parameterDictionary.Add("Channel", $Channel) + break + } + + "USB" { + $TargetAttr = New-Object System.Management.Automation.ParameterAttribute + $TargetAttr.ParameterSetName = "__AllParameterSets" + $TargetAttr.Mandatory = $false + + $TargetNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $TargetAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $TargetAttrCollection.Add($TargetAttr) + $TargetAttrCollection.Add($TargetNotNull) + + $Target = New-Object System.Management.Automation.RuntimeDefinedParameter( + "Target", + [string], + $TargetAttrCollection + ) + + # By default, use target = "debugging" + $Target.Value = "Debugging" + $parameterDictionary.Add("Target", $Target) + break + } + + "Network" { + #region IP + $IpAttr = New-Object System.Management.Automation.ParameterAttribute + $IpAttr.ParameterSetName = "__AllParameterSets" + $IpAttr.Mandatory = $true + + $IpValidator = New-Object System.Management.Automation.ValidatePatternAttribute( + "\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" + ) + $IpNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $IpAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $IpAttrCollection.Add($IpAttr) + $IpAttrCollection.Add($IpValidator) + $IpAttrCollection.Add($IpNotNull) + + $IP = New-Object System.Management.Automation.RuntimeDefinedParameter( + "IPAddress", + [string], + $IpAttrCollection + ) + + # There's no good way to set a default value for this. + $parameterDictionary.Add("IPAddress", $IP) + #endregion IP + + #region Port + $PortAttr = New-Object System.Management.Automation.ParameterAttribute + $PortAttr.ParameterSetName = "__AllParameterSets" + $PortAttr.Mandatory = $false + + $PortValidator = New-Object System.Management.Automation.ValidateRangeAttribute( + 49152, + 50039 + ) + + $PortNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $PortAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $PortAttrCollection.Add($PortAttr) + $PortAttrCollection.Add($PortValidator) + $PortAttrCollection.Add($PortNotNull) + + + $Port = New-Object System.Management.Automation.RuntimeDefinedParameter( + "Port", + [UInt16], + $PortAttrCollection + ) + + # By default, use port 50000 + $Port.Value = 50000 + $parameterDictionary.Add("Port", $Port) + #endregion Port + + #region Key + $KeyAttr = New-Object System.Management.Automation.ParameterAttribute + $KeyAttr.ParameterSetName = "__AllParameterSets" + $KeyAttr.Mandatory = $true + + $KeyValidator = New-Object System.Management.Automation.ValidatePatternAttribute( + "\b([A-Z0-9]+).([A-Z0-9]+).([A-Z0-9]+).([A-Z0-9]+)\b" + ) + + $KeyNotNull = New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute + + $KeyAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $KeyAttrCollection.Add($KeyAttr) + $KeyAttrCollection.Add($KeyValidator) + $KeyAttrCollection.Add($KeyNotNull) + + $Key = New-Object System.Management.Automation.RuntimeDefinedParameter( + "Key", + [string], + $KeyAttrCollection + ) + + # Don't set a default key. + $parameterDictionary.Add("Key", $Key) + #endregion Key + + #region NoDHCP + $NoDHCPAttr = New-Object System.Management.Automation.ParameterAttribute + $NoDHCPAttr.ParameterSetName = "__AllParameterSets" + $NoDHCPAttr.Mandatory = $false + + $NoDHCPAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $NoDHCPAttrCollection.Add($NoDHCPAttr) + + $NoDHCP = New-Object System.Management.Automation.RuntimeDefinedParameter( + "NoDHCP", + [switch], + $NoDHCPAttrCollection + ) + + $parameterDictionary.Add("NoDHCP", $NoDHCP) + #endregion NoDHCP + + #region NewKey + $NewKeyAttr = New-Object System.Management.Automation.ParameterAttribute + $NewKeyAttr.ParameterSetName = "__AllParameterSets" + $NewKeyAttr.Mandatory = $false + + $NewKeyAttrCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute] + $NewKeyAttrCollection.Add($NewKeyAttr) + + $NewKey = New-Object System.Management.Automation.RuntimeDefinedParameter( + "NewKey", + [switch], + $NewKeyAttrCollection + ) + + # Don't set a default key. + $parameterDictionary.Add("NewKey", $NewKey) + #endregion NewKey + + break + } + + # There's nothing to do for local debugging. + # Synthetic debugging is not yet implemented. + + default { + break + } + } + } + return $parameterDictionary + } + + Begin { + + Set-StrictMode -Version 3 + $Module = Import-ModuleEx -Name "Dism" + $Module = Import-ModuleEx -Name "Storage" + + #region Constants and Pseudo-Constants + + # Name of the script, obviously. + $scriptName = "Convert-WindowsImage" + + # Session key, used for keeping records unique between multiple runs. + $sessionKey = [Guid]::NewGuid().ToString() + + # Log folder path. + $logFolder = [io.path]::Combine( $TempDirectory, $scriptName, $sessionKey ) + + # Maximum size for VHD is ~2040GB. + $vhdMaxSize = 2040GB + + # Maximum size for VHDX is ~64TB. + $vhdxMaxSize = 64TB + + # The lowest supported *image* version; making sure we don't run against Vista/2k8. + $lowestSupportedVersion = New-Object -TypeName "Version" -ArgumentList "6.1" + + # The lowest supported *host* build. Set to Win8 CP. + $lowestSupportedBuild = 9200 + + # Keeps track on whether the script itself enabled Transcript + # (vs. it was enabled by user) + $Transcripting = $false + + # Since we use the VhdFormat in output, make it uppercase. + # We'll make it lowercase again when we use it as a file extension. + $VhdFormat = $VhdFormat.ToUpper() + + If (Test-Path -Path "Variable:\VhdPartitionStyle") { + Switch ($VhdPartitionStyle) { + "Mbr" { + $DiskLayout = "Bios" + } + + "Gpt" { + $DiskLayout = "Uefi" + } + + "MBRforWindowsToGo" { + $DiskLayout = "WindowsToGo" + } + } + } + + If (Get-Command -Name "Get-WindowsOptionalFeature" -ErrorAction "SilentlyContinue") { + Try { + $OSVersion = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ProductName).ProductName + if ($OSVersion -like "Windows Server*") { + $hyperVEnabled = + [bool]( Get-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V" -Verbose:$False ).State -and + [bool]( Get-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-Management-PowerShell" -Verbose:$False ).State + } + else { + $hyperVEnabled = + [bool]( Get-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-Services" -Verbose:$False ).State -and + [bool]( Get-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-Management-PowerShell" -Verbose:$False ).State + } + } + Catch { + + # WinPE DISM does not support online queries. This will throw on non-WinPE machines + + $winpeVersion = (Get-ItemProperty -Path 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion\WinPE').Version + + Write-Verbose -Message "Running WinPE version $winpeVersion" + + $hyperVEnabled = $False + } + } + Else { + $hyperVEnabled = $False + } + + #endregion Constants and Pseudo-Constants + + #region Here Strings + + # Banner text displayed during each run. + $Header = @" + +Windows(R) Image to Virtual Hard Disk Converter for Windows(R) 10 +Copyright (C) Microsoft Corporation. All rights reserved. + +"@ + + # Text used as the banner in the UI. + $UiHeader = @" +You can use the fields below to configure the VHD or VHDX that you want to create! +"@ + + #endregion Here Strings + } + + Process { + + $disk = $null + $openWim = $null + $openIso = $null + $openImage = $null + $vhdFinalName = $null + $vhdFinalPath = $null + $mountedHive = $null + $IsoPath = $null + $tempSource = $null + $vhd = @() + + Write-Information -MessageData $header + + Try { + #region Prepare variables + + # Create log folder + If (Test-Path -Path $logFolder) { + $Item = Remove-Item -Path $logFolder -Force -Recurse + } + + $Item = New-Item -Path $logFolder -ItemType "Directory" -Force + + # Try to start transcripting. If it's already running, we'll get an exception and swallow it. + Try { + $TranscriptPath = Join-Path -Path $logFolder -ChildPath "Convert-WindowsImageTranscript.txt" + $Transcript = Start-Transcript -Path $TranscriptPath -Force -ErrorAction "SilentlyContinue" + $Transcripting = $True + } + catch { + Write-Warning -Message "Transcription is already running. No Convert-WindowsImage-specific transcript will be created." + $Transcripting = $Talse + } + + # Add types + Add-WindowsImageTypes + + # Check to make sure we're running as Admin. + If (-Not ( Test-Admin )) { + Throw "Images can only be applied by an administrator. Please launch PowerShell elevated and run this script again." + } + + # Check to make sure we're running (at least) on Win8. + If (-Not ( Test-WindowsVersion )) { + Throw "$scriptName requires Windows 8 Consumer Preview or higher. Please use WIM2VHD.WSF (http://code.msdn.microsoft.com/wim2vhd) if you need to create VHDs from Windows 7." + } + + # Resolve the path for the unattend file. + If (-Not [string]::IsNullOrEmpty( $UnattendPath )) { + $UnattendPath = ( Resolve-Path -Path $UnattendPath ).Path + } + + # Note: UI code is deprecated and not maintained anymore. + If ($ShowUI) { + Write-Verbose -Message "Launching UI..." + Add-Type -AssemblyName System.Drawing, System.Windows.Forms + + #region Form Objects + $frmMain = New-Object System.Windows.Forms.Form + $groupBox4 = New-Object System.Windows.Forms.GroupBox + $btnGo = New-Object System.Windows.Forms.Button + $groupBox3 = New-Object System.Windows.Forms.GroupBox + $txtVhdName = New-Object System.Windows.Forms.TextBox + $label6 = New-Object System.Windows.Forms.Label + $btnWrkBrowse = New-Object System.Windows.Forms.Button + $cmbVhdSizeUnit = New-Object System.Windows.Forms.ComboBox + $numVhdSize = New-Object System.Windows.Forms.NumericUpDown + $cmbVhdFormat = New-Object System.Windows.Forms.ComboBox + $label5 = New-Object System.Windows.Forms.Label + $txtWorkingDirectory = New-Object System.Windows.Forms.TextBox + $label4 = New-Object System.Windows.Forms.Label + $label3 = New-Object System.Windows.Forms.Label + $label2 = New-Object System.Windows.Forms.Label + $label7 = New-Object System.Windows.Forms.Label + $txtUnattendFile = New-Object System.Windows.Forms.TextBox + $btnUnattendBrowse = New-Object System.Windows.Forms.Button + $groupBox2 = New-Object System.Windows.Forms.GroupBox + $cmbSkuList = New-Object System.Windows.Forms.ComboBox + $label1 = New-Object System.Windows.Forms.Label + $groupBox1 = New-Object System.Windows.Forms.GroupBox + $txtSourcePath = New-Object System.Windows.Forms.TextBox + $btnBrowseWim = New-Object System.Windows.Forms.Button + $openFileDialog1 = New-Object System.Windows.Forms.OpenFileDialog + $openFolderDialog1 = New-Object System.Windows.Forms.FolderBrowserDialog + $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState + + #endregion Form Objects + + #region Event scriptblocks. + + $btnGo_OnClick = { + $frmMain.Close() + } + + $btnWrkBrowse_OnClick = { + $openFolderDialog1.RootFolder = "Desktop" + $openFolderDialog1.Description = "Select the folder you'd like your VHD(X) to be created in." + $openFolderDialog1.SelectedPath = $WorkingDirectory + + $ret = $openFolderDialog1.ShowDialog() + + if ($ret -ilike "ok") { + $WorkingDirectory = $txtWorkingDirectory = $openFolderDialog1.SelectedPath + Write-Verbose -Message "Selected Working Directory is $WorkingDirectory..." + } + } + + $btnUnattendBrowse_OnClick = { + $openFileDialog1.InitialDirectory = $pwd + $openFileDialog1.Filter = "XML files (*.xml)|*.XML|All files (*.*)|*.*" + $openFileDialog1.FilterIndex = 1 + $openFileDialog1.CheckFileExists = $true + $openFileDialog1.CheckPathExists = $true + $openFileDialog1.FileName = $null + $openFileDialog1.ShowHelp = $false + $openFileDialog1.Title = "Select an unattend file..." + + $ret = $openFileDialog1.ShowDialog() + + if ($ret -ilike "ok") { + $UnattendPath = $txtUnattendFile.Text = $openFileDialog1.FileName + } + } + + $btnBrowseWim_OnClick = { + $openFileDialog1.InitialDirectory = $pwd + $openFileDialog1.Filter = "All compatible files (*.ISO, *.WIM)|*.ISO;*.WIM|All files (*.*)|*.*" + $openFileDialog1.FilterIndex = 1 + $openFileDialog1.CheckFileExists = $true + $openFileDialog1.CheckPathExists = $true + $openFileDialog1.FileName = $null + $openFileDialog1.ShowHelp = $false + $openFileDialog1.Title = "Select a source file..." + + $ret = $openFileDialog1.ShowDialog() + + if ($ret -ilike "ok") { + + if (([IO.FileInfo]$openFileDialog1.FileName).Extension -ilike ".iso") { + + if (Test-IsNetworkLocation $openFileDialog1.FileName) { + Write-Verbose -Message "Copying ISO $(Split-Path $openFileDialog1.FileName -Leaf) to temp folder..." + Write-Warning -Message "The UI may become non-responsive while this copy takes place..." + Copy-Item -Path $openFileDialog1.FileName -Destination $TempDirectory -Force + $openFileDialog1.FileName = "$($TempDirectory)\$(Split-Path $openFileDialog1.FileName -Leaf)" + } + + $txtSourcePath.Text = $IsoPath = (Resolve-Path $openFileDialog1.FileName).Path + Write-Verbose -Message "Opening ISO $(Split-Path $IsoPath -Leaf)..." + + $openIso = Mount-DiskImage -ImagePath $IsoPath -StorageType ISO -PassThru + + # Refresh the DiskImage and Drive object so we can get the real information about it. I assume this is a bug. + Get-PSDrive -PSProvider FileSystem | Out-Null + $openIso = Get-DiskImage -ImagePath $IsoPath + $driveLetter = ( Get-Volume -DiskImage $openIso ).DriveLetter + + $script:SourcePath = "$($driveLetter):\sources\install.wim" + + # Check to see if there's a WIM file we can muck about with. + Write-Verbose -Message "Looking for $($SourcePath)..." + if (!(Test-Path $SourcePath)) { + throw "The specified ISO does not appear to be valid Windows installation media." + } + } + else { + $txtSourcePath.Text = $script:SourcePath = $openFileDialog1.FileName + } + + # Check to see if the WIM is local, or on a network location. If the latter, copy it locally. + if (Test-IsNetworkLocation $SourcePath) { + Write-Verbose -Message "Copying WIM $(Split-Path $SourcePath -Leaf) to temp folder..." + Write-Warning -Message "The UI may become non-responsive while this copy takes place..." + Copy-Item -Path $SourcePath -Destination $TempDirectory -Force + $txtSourcePath.Text = $script:SourcePath = "$($TempDirectory)\$(Split-Path $SourcePath -Leaf)" + } + + $script:SourcePath = (Resolve-Path $SourcePath).Path + + Write-Verbose -Message "Scanning WIM metadata..." + + $tempOpenWim = $null + + try { + $tempOpenWim = New-Object WIM2VHD.WimFile $SourcePath + + # Let's see if we're running against an unstaged build. If we are, we need to blow up. + if ($tempOpenWim.ImageNames.Contains("Windows Longhorn Client") -or + $tempOpenWim.ImageNames.Contains("Windows Longhorn Server") -or + $tempOpenWim.ImageNames.Contains("Windows Longhorn Server Core")) { + [Windows.Forms.MessageBox]::Show( + "Convert-WindowsImage cannot run against unstaged builds. Please try again with a staged build.", + "WIM is incompatible!", + "OK", + "Error" + ) + + return + } + else { + $tempOpenWim.Images | % { $cmbSkuList.Items.Add($_.ImageFlags) } + $cmbSkuList.SelectedIndex = 0 + } + + } + catch { + throw "Unable to load WIM metadata!" + } + finally { + $tempOpenWim.Close() + Write-Debug -Message " Closing WIM metadata..." + } + } + } + + $OnLoadForm_StateCorrection = { + + # Correct the initial state of the form to prevent the .Net maximized form issue + $frmMain.WindowState = $InitialFormWindowState + } + + #endregion Event scriptblocks + + # Figure out VHD size and size unit. + $unit = $null + switch ([Math]::Round($SizeBytes.ToString().Length / 3)) { + 3 { $unit = "MB"; break } + 4 { $unit = "GB"; break } + 5 { $unit = "TB"; break } + default { $unit = ""; break } + } + + $quantity = Invoke-Expression -Command "$($SizeBytes) / 1$($unit)" + + #region Form Code + #region frmMain + $frmMain.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 579 + $System_Drawing_Size.Width = 512 + $frmMain.ClientSize = $System_Drawing_Size + $frmMain.Font = New-Object System.Drawing.Font("Segoe UI", 10, 0, 3, 1) + $frmMain.FormBorderStyle = 1 + $frmMain.MaximizeBox = $False + $frmMain.MinimizeBox = $False + $frmMain.Name = "frmMain" + $frmMain.StartPosition = 1 + $frmMain.Text = "Convert-WindowsImage UI" + #endregion frmMain + + #region groupBox4 + $groupBox4.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 10 + $System_Drawing_Point.Y = 498 + $groupBox4.Location = $System_Drawing_Point + $groupBox4.Name = "groupBox4" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 69 + $System_Drawing_Size.Width = 489 + $groupBox4.Size = $System_Drawing_Size + $groupBox4.TabIndex = 8 + $groupBox4.TabStop = $False + $groupBox4.Text = "4. Make the VHD!" + + $frmMain.Controls.Add($groupBox4) + #endregion groupBox4 + + #region btnGo + $btnGo.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 39 + $System_Drawing_Point.Y = 24 + $btnGo.Location = $System_Drawing_Point + $btnGo.Name = "btnGo" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 33 + $System_Drawing_Size.Width = 415 + $btnGo.Size = $System_Drawing_Size + $btnGo.TabIndex = 0 + $btnGo.Text = "&Make my VHD" + $btnGo.UseVisualStyleBackColor = $True + $btnGo.DialogResult = "OK" + $btnGo.add_Click($btnGo_OnClick) + + $groupBox4.Controls.Add($btnGo) + $frmMain.AcceptButton = $btnGo + #endregion btnGo + + #region groupBox3 + $groupBox3.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 10 + $System_Drawing_Point.Y = 243 + $groupBox3.Location = $System_Drawing_Point + $groupBox3.Name = "groupBox3" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 245 + $System_Drawing_Size.Width = 489 + $groupBox3.Size = $System_Drawing_Size + $groupBox3.TabIndex = 7 + $groupBox3.TabStop = $False + $groupBox3.Text = "3. Choose configuration options" + + $frmMain.Controls.Add($groupBox3) + #endregion groupBox3 + + #region txtVhdName + $txtVhdName.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 150 + $txtVhdName.Location = $System_Drawing_Point + $txtVhdName.Name = "txtVhdName" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 418 + $txtVhdName.Size = $System_Drawing_Size + $txtVhdName.TabIndex = 10 + + $groupBox3.Controls.Add($txtVhdName) + #endregion txtVhdName + + #region txtUnattendFile + $txtUnattendFile.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 198 + $txtUnattendFile.Location = $System_Drawing_Point + $txtUnattendFile.Name = "txtUnattendFile" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 418 + $txtUnattendFile.Size = $System_Drawing_Size + $txtUnattendFile.TabIndex = 11 + + $groupBox3.Controls.Add($txtUnattendFile) + #endregion txtUnattendFile + + #region label7 + $label7.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 23 + $System_Drawing_Point.Y = 180 + $label7.Location = $System_Drawing_Point + $label7.Name = "label7" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 23 + $System_Drawing_Size.Width = 175 + $label7.Size = $System_Drawing_Size + $label7.Text = "Unattend File (Optional)" + + $groupBox3.Controls.Add($label7) + #endregion label7 + + #region label6 + $label6.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 23 + $System_Drawing_Point.Y = 132 + $label6.Location = $System_Drawing_Point + $label6.Name = "label6" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 23 + $System_Drawing_Size.Width = 175 + $label6.Size = $System_Drawing_Size + $label6.Text = "VHD Name (Optional)" + + $groupBox3.Controls.Add($label6) + #endregion label6 + + #region btnUnattendBrowse + $btnUnattendBrowse.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 449 + $System_Drawing_Point.Y = 199 + $btnUnattendBrowse.Location = $System_Drawing_Point + $btnUnattendBrowse.Name = "btnUnattendBrowse" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 27 + $btnUnattendBrowse.Size = $System_Drawing_Size + $btnUnattendBrowse.TabIndex = 9 + $btnUnattendBrowse.Text = "..." + $btnUnattendBrowse.UseVisualStyleBackColor = $True + $btnUnattendBrowse.add_Click($btnUnattendBrowse_OnClick) + + $groupBox3.Controls.Add($btnUnattendBrowse) + #endregion btnUnattendBrowse + + #region btnWrkBrowse + $btnWrkBrowse.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 449 + $System_Drawing_Point.Y = 98 + $btnWrkBrowse.Location = $System_Drawing_Point + $btnWrkBrowse.Name = "btnWrkBrowse" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 27 + $btnWrkBrowse.Size = $System_Drawing_Size + $btnWrkBrowse.TabIndex = 9 + $btnWrkBrowse.Text = "..." + $btnWrkBrowse.UseVisualStyleBackColor = $True + $btnWrkBrowse.add_Click($btnWrkBrowse_OnClick) + + $groupBox3.Controls.Add($btnWrkBrowse) + #endregion btnWrkBrowse + + #region cmbVhdSizeUnit + $cmbVhdSizeUnit.DataBindings.DefaultDataSourceUpdateMode = 0 + $cmbVhdSizeUnit.FormattingEnabled = $True + $cmbVhdSizeUnit.Items.Add("MB") | Out-Null + $cmbVhdSizeUnit.Items.Add("GB") | Out-Null + $cmbVhdSizeUnit.Items.Add("TB") | Out-Null + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 409 + $System_Drawing_Point.Y = 42 + $cmbVhdSizeUnit.Location = $System_Drawing_Point + $cmbVhdSizeUnit.Name = "cmbVhdSizeUnit" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 67 + $cmbVhdSizeUnit.Size = $System_Drawing_Size + $cmbVhdSizeUnit.TabIndex = 5 + $cmbVhdSizeUnit.Text = $unit + + $groupBox3.Controls.Add($cmbVhdSizeUnit) + #endregion cmbVhdSizeUnit + + #region numVhdSize + $numVhdSize.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 340 + $System_Drawing_Point.Y = 42 + $numVhdSize.Location = $System_Drawing_Point + $numVhdSize.Name = "numVhdSize" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 63 + $numVhdSize.Size = $System_Drawing_Size + $numVhdSize.TabIndex = 4 + $numVhdSize.Value = $quantity + + $groupBox3.Controls.Add($numVhdSize) + #endregion numVhdSize + + #region cmbVhdFormat + $cmbVhdFormat.DataBindings.DefaultDataSourceUpdateMode = 0 + $cmbVhdFormat.FormattingEnabled = $True + $cmbVhdFormat.Items.Add("VHD") | Out-Null + $cmbVhdFormat.Items.Add("VHDX") | Out-Null + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 42 + $cmbVhdFormat.Location = $System_Drawing_Point + $cmbVhdFormat.Name = "cmbVhdFormat" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 136 + $cmbVhdFormat.Size = $System_Drawing_Size + $cmbVhdFormat.TabIndex = 0 + $cmbVhdFormat.Text = $VhdFormat + + $groupBox3.Controls.Add($cmbVhdFormat) + #endregion cmbVhdFormat + + #region label5 + $label5.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 23 + $System_Drawing_Point.Y = 76 + $label5.Location = $System_Drawing_Point + $label5.Name = "label5" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 23 + $System_Drawing_Size.Width = 264 + $label5.Size = $System_Drawing_Size + $label5.TabIndex = 8 + $label5.Text = "Working Directory" + + $groupBox3.Controls.Add($label5) + #endregion label5 + + #region txtWorkingDirectory + $txtWorkingDirectory.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 99 + $txtWorkingDirectory.Location = $System_Drawing_Point + $txtWorkingDirectory.Name = "txtWorkingDirectory" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 418 + $txtWorkingDirectory.Size = $System_Drawing_Size + $txtWorkingDirectory.TabIndex = 7 + $txtWorkingDirectory.Text = $WorkingDirectory + + $groupBox3.Controls.Add($txtWorkingDirectory) + #endregion txtWorkingDirectory + + #region label4 + $label4.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 340 + $System_Drawing_Point.Y = 21 + $label4.Location = $System_Drawing_Point + $label4.Name = "label4" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 27 + $System_Drawing_Size.Width = 86 + $label4.Size = $System_Drawing_Size + $label4.TabIndex = 6 + $label4.Text = "VHD Size" + + $groupBox3.Controls.Add($label4) + #endregion label4 + + #region label3 + $label3.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 176 + $System_Drawing_Point.Y = 21 + $label3.Location = $System_Drawing_Point + $label3.Name = "label3" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 27 + $System_Drawing_Size.Width = 92 + $label3.Size = $System_Drawing_Size + $label3.TabIndex = 3 + $label3.Text = "VHD Type" + + $groupBox3.Controls.Add($label3) + #endregion label3 + + #region label2 + $label2.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 21 + $label2.Location = $System_Drawing_Point + $label2.Name = "label2" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 30 + $System_Drawing_Size.Width = 118 + $label2.Size = $System_Drawing_Size + $label2.TabIndex = 1 + $label2.Text = "VHD Format" + + $groupBox3.Controls.Add($label2) + #endregion label2 + + #region groupBox2 + $groupBox2.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 10 + $System_Drawing_Point.Y = 169 + $groupBox2.Location = $System_Drawing_Point + $groupBox2.Name = "groupBox2" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 68 + $System_Drawing_Size.Width = 490 + $groupBox2.Size = $System_Drawing_Size + $groupBox2.TabIndex = 6 + $groupBox2.TabStop = $False + $groupBox2.Text = "2. Choose a SKU from the list" + + $frmMain.Controls.Add($groupBox2) + #endregion groupBox2 + + #region cmbSkuList + $cmbSkuList.DataBindings.DefaultDataSourceUpdateMode = 0 + $cmbSkuList.FormattingEnabled = $True + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 24 + $cmbSkuList.Location = $System_Drawing_Point + $cmbSkuList.Name = "cmbSkuList" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 452 + $cmbSkuList.Size = $System_Drawing_Size + $cmbSkuList.TabIndex = 2 + + $groupBox2.Controls.Add($cmbSkuList) + #endregion cmbSkuList + + #region label1 + $label1.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 23 + $System_Drawing_Point.Y = 21 + $label1.Location = $System_Drawing_Point + $label1.Name = "label1" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 71 + $System_Drawing_Size.Width = 464 + $label1.Size = $System_Drawing_Size + $label1.TabIndex = 5 + $label1.Text = $uiHeader + + $frmMain.Controls.Add($label1) + #endregion label1 + + #region groupBox1 + $groupBox1.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 10 + $System_Drawing_Point.Y = 95 + $groupBox1.Location = $System_Drawing_Point + $groupBox1.Name = "groupBox1" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 68 + $System_Drawing_Size.Width = 490 + $groupBox1.Size = $System_Drawing_Size + $groupBox1.TabIndex = 4 + $groupBox1.TabStop = $False + $groupBox1.Text = "1. Choose a source" + + $frmMain.Controls.Add($groupBox1) + #endregion groupBox1 + + #region txtSourcePath + $txtSourcePath.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 25 + $System_Drawing_Point.Y = 24 + $txtSourcePath.Location = $System_Drawing_Point + $txtSourcePath.Name = "txtSourcePath" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 418 + $txtSourcePath.Size = $System_Drawing_Size + $txtSourcePath.TabIndex = 0 + + $groupBox1.Controls.Add($txtSourcePath) + #endregion txtSourcePath + + #region btnBrowseWim + $btnBrowseWim.DataBindings.DefaultDataSourceUpdateMode = 0 + $System_Drawing_Point = New-Object System.Drawing.Point + $System_Drawing_Point.X = 449 + $System_Drawing_Point.Y = 24 + $btnBrowseWim.Location = $System_Drawing_Point + $btnBrowseWim.Name = "btnBrowseWim" + $System_Drawing_Size = New-Object System.Drawing.Size + $System_Drawing_Size.Height = 25 + $System_Drawing_Size.Width = 28 + $btnBrowseWim.Size = $System_Drawing_Size + $btnBrowseWim.TabIndex = 1 + $btnBrowseWim.Text = "..." + $btnBrowseWim.UseVisualStyleBackColor = $True + $btnBrowseWim.add_Click($btnBrowseWim_OnClick) + + $groupBox1.Controls.Add($btnBrowseWim) + #endregion btnBrowseWim + + $openFileDialog1.FileName = "openFileDialog1" + $openFileDialog1.ShowHelp = $True + + #endregion Form Code + + # Save the initial state of the form + $InitialFormWindowState = $frmMain.WindowState + + # Init the OnLoad event to correct the initial state of the form + $frmMain.add_Load($OnLoadForm_StateCorrection) + + # Return the constructed form. + $ret = $frmMain.ShowDialog() + + if (!($ret -ilike "OK")) { + throw "Form session has been cancelled." + } + + if ([string]::IsNullOrEmpty($SourcePath)) { + throw "No source path specified." + } + + # VHD Format + $VhdFormat = $cmbVhdFormat.SelectedItem + + # VHD Size + $SizeBytes = Invoke-Expression "$($numVhdSize.Value)$($cmbVhdSizeUnit.SelectedItem)" + + # Working Directory + $WorkingDirectory = $txtWorkingDirectory.Text + + # VHDPath + if (![string]::IsNullOrEmpty($txtVhdName.Text)) { + $VhdPath = "$($WorkingDirectory)\$($txtVhdName.Text)" + } + + # Edition + if (![string]::IsNullOrEmpty($cmbSkuList.SelectedItem)) { + $Edition = $cmbSkuList.SelectedItem + } + + # Because we used ShowDialog, we need to manually dispose of the form. + # This probably won't make much of a difference, but let's free up all of the resources we can + # before we start the conversion process. + + $frmMain.Dispose() + } + + If ($VhdFormat -ilike "AUTO") { + If ($DiskLayout -eq "Bios") { + $VhdFormat = "VHD" + } + Else { + $VhdFormat = "VHDX" + } + } + + # Choose smallest supported block size for dynamic VHD(X) + $BlockSizeBytes = 1MB + + # There's a difference between the maximum sizes for VHDs and VHDXs. Make sure we follow it. + If ("VHD" -ilike $VhdFormat) { + If ($SizeBytes -gt $vhdMaxSize) { + Write-Warning -Message "For the VHD file format, the maximum file size is ~2040GB. We're automatically setting the size to 2040GB for you." + $SizeBytes = 2040GB + } + $BlockSizeBytes = 512KB + } + + # Check if -VHDPath and -WorkingDirectory were both specified. + If (-Not [String]::IsNullOrEmpty( $VhdPath ) -And + -Not [String]::IsNullOrEmpty( $WorkingDirectory )) { + If ($WorkingDirectory -ne $pwd) { + + # If the WorkingDirectory is anything besides $pwd, tell people that the WorkingDirectory is being ignored. + Write-Warning -Message "Specifying -VHDPath and -WorkingDirectory at the same time is contradictory." + Write-Warning -Message "Ignoring the WorkingDirectory specification." + $WorkingDirectory = Split-Path $VhdPath -Parent + } + } + + If ($VhdPath) { + + # Check to see if there's a conflict between the specified file extension and the VhdFormat being used. + $Ext = ( [IO.FileInfo]$VhdPath ).Extension + + If (-Not ( $Ext -ilike ".$( $VhdFormat )" )) { + Throw "There is a mismatch between the VHDPath file extension ($($ext.ToUpper())), and the VhdFormat (.$($VhdFormat)). Please ensure that these match and try again." + } + } + + # Create a temporary name for the VHD(x). We'll name it properly at the end of the script. + If ([String]::IsNullOrEmpty( $VhdPath )) { + $vhdNameTemp = [system.string]( $sessionKey + "." + $VhdFormat.ToLower() ) + $VhdPath = Join-Path -Path $WorkingDirectory -ChildPath $vhdNameTemp + } + + Else { + + # Since we can't do Resolve-Path against a file that doesn't exist, we need to get creative in determining + # the full path that the user specified (or meant to specify if they gave us a relative path). + # Check to see if the path has a root specified. If it doesn't, use the working directory. + + If (-Not [IO.Path]::IsPathRooted( $VhdPath )) { + $VhdPath = Join-Path -Path $WorkingDirectory -ChildPath $VhdPath + } + + $vhdFinalName = Split-Path -Path $VhdPath -Leaf + $VhdPath = Split-Path -Path $VhdPath -Parent + $vhdNameTemp = [system.string]( $sessionKey + "." + $VhdFormat.ToLower() ) + $VhdPath = Join-Path -Path $VhdPath -ChildPath $vhdNameTemp + } + + Write-Debug -Message " Temporary $VhdFormat path is: `"$VhdPath`"" + + #endregion Prepare variables + + #region Mount source images + + # If we're using an ISO, mount it and get the path to the WIM file. + If (( [IO.FileInfo]$SourcePath ).Extension -ilike ".ISO") { + + # If the ISO isn't local, copy it down so we don't have to worry about resource contention + # or about network latency. + If (Test-IsNetworkLocation -Path $SourcePath) { + $IsoFileName = Split-Path -Path $SourcePath -Leaf + + Write-Verbose -Message "Copying ISO `"$IsoFileName`" to temp folder..." + + # Robocopy.exe $(Split-Path $SourcePath -Parent) $TempDirectory $(Split-Path $SourcePath -Leaf) | Out-Null + $Item = Copy-Item -Path $SourcePath -Destination $TempDirectory -PassThru + + $SourcePath = Join-Path -Path $TempDirectory -ChildPath $IsoFileName + + $tempSource = $SourcePath + } + + $IsoPath = ( Resolve-Path $SourcePath ).Path + $IsoFileName = Split-Path $IsoPath -Leaf + + Write-Verbose -Message "Opening ISO `"$IsoFileName`"..." + $openIso = Mount-DiskImage -ImagePath $IsoPath -StorageType "ISO" -PassThru + + # Refresh the DiskImage and Drive object so we can get the real information about it. I assume this is a bug. + Get-PSDrive -PSProvider FileSystem | Out-Null + $openIso = Get-DiskImage -ImagePath $IsoPath + $driveLetter = ( Get-Volume -DiskImage $openIso ).DriveLetter + + $SourcePath = "$($driveLetter):\sources\install.wim" + + # Check to see if there's a WIM file we can muck about with. + Write-Verbose -Message "Looking for `"$SourcePath`"..." + + If (-Not ( Test-Path -Path $SourcePath )) { + Throw "The specified ISO does not appear to be valid Windows installation media." + } + } + + # Check to see if the WIM is local, or on a network location. If the latter, copy it locally. + If (Test-IsNetworkLocation -Path $SourcePath) { + $WimFileName = Split-Path -Path $SourcePath -Leaf + + Write-Verbose -Message "Copying WIM $WimFileName to temp folder..." + + # robocopy $(Split-Path $SourcePath -Parent) $TempDirectory $(Split-Path $SourcePath -Leaf) | Out-Null + $Item = Copy-Item -Path $SourcePath -Destination $TempDirectory -PassThru + + $SourcePath = Join-Path -Path $TempDirectory -ChildPath $WimFileName + + $tempSource = $SourcePath + } + + $SourcePath = ( Resolve-Path $SourcePath ).Path + + # QUERY WIM INFORMATION AND EXTRACT THE INDEX OF TARGETED IMAGE + + Write-Verbose -Message "Looking for the requested Windows image in the WIM file" + + $WindowsImage = Get-WindowsImage -ImagePath $SourcePath -Verbose:$False + + # We're good. Open the WIM container. + + # NOTE: this is only required because we want to get the XML-based meta-data at the end. Is there a better way? + # If we can get this information from DISM cmdlets, we can remove the openWim constructs + + $openWim = New-Object -TypeName "WIM2VHD.WimFile" -ArgumentList $SourcePath + + #endregion Mount source images + + $Edition | ForEach-Object -Process { + + #region Select Image + + $Edition = $PSItem + + # WIM may have multiple images. Filter on Edition (can be index or name) and try to find a unique image + + Write-Verbose -Message ( [system.string]::Empty ) + + $EditionIndex = 0; + + If ([Int32]::TryParse( $Edition, [ref]$EditionIndex )) { + $WindowsImage = Get-WindowsImage -ImagePath $SourcePath -Index $EditionIndex -Verbose:$False + } + Else { + $WindowsImage = Get-WindowsImage -ImagePath $SourcePath -Verbose:$False | Where-Object { $PSItem.ImageName -ilike "*$($Edition)" } + } + + If (-Not $WindowsImage) { + Throw "Requested windows Image was not found on the WIM file!" + } + + If ($WindowsImage -is [System.Array]) { + $ImageCount = $($WindowsImage.Count) + + Write-Verbose -Message "WIM file has the following $ImageCount images that match filter *$Edition" + Get-WindowsImage -ImagePath $SourcePath -Verbose:$False + + Write-Error -Message "You must specify an Edition or SKU index, since the WIM has more than one image." + Throw "There are more than one images that match ImageName filter *$Edition" + } + + $ImageIndex = $WindowsImage[0].ImageIndex + + $openImage = $openWim[[Int32]$ImageIndex] + + If ($Null -eq $openImage) { + Write-Error -Message "The specified edition does not appear to exist in the specified WIM." + Write-Error -Message "Valid edition names are:" + + $openWim.Images | ForEach-Object -Process { Write-Error -Message "$PSItem.ImageFlags" } + Throw + } + + $OpenImageIndex = $openImage.ImageIndex + $OpenImageFlags = $openImage.ImageFlags + $OpenImageVersion = $openImage.ImageVersion + + Write-Verbose -Message "Image $OpenImageIndex selected: `"$OpenImageFlags`"..." + + # Check to make sure that the image we're applying is Windows 7 or greater. + If ($OpenImageVersion -lt $lowestSupportedVersion) { + If ($OpenImageVersion -eq "0.0.0.0") { + Write-Warning -Message "The specified WIM does not encode the Windows version." + } + Else { + Throw "Convert-WindowsImage only supports Windows 7 and Windows 8 WIM files. The specified image (version $OpenImageVersion) does not appear to contain one of those operating systems." + } + } + + #endregion Select Image + + #region Create and partition VHD + + If ($hyperVEnabled) { + Write-Verbose -Message "Creating sparse disk..." + + $NewVhdParam = @{ + + Path = $VhdPath + SizeBytes = $SizeBytes + BlockSizeBytes = $BlockSizeBytes + } + + Switch ($VhdType) { + "Dynamic" { + $NewVhdParam.Add( + "Dynamic", $True + ) + } + + "Fixed" + {} + } + + $newVhd = New-VHD @NewVhdParam + + Write-Verbose -Message "Mounting $VhdFormat..." + $disk = $newVhd | Mount-VHD -Passthru | Get-Disk + } + Else { + <# + Create the VHD using the VirtDisk Win32 API. + So, why not use the New-VHD cmdlet here? + + New-VHD depends on the Hyper-V Cmdlets, which aren't installed by default. + Installing those cmdlets isn't a big deal, but they depend on the Hyper-V WMI + APIs, which in turn depend on Hyper-V. In order to prevent Convert-WindowsImage + from being dependent on Hyper-V (and thus, x64 systems only), we're using the + VirtDisk APIs directly. + #> + + Switch ($VhdType) { + "Dynamic" { + Write-Verbose -Message "Creating sparse disk..." + + [WIM2VHD.VirtualHardDisk]::CreateSparseDisk( + $VhdFormat, + $VhdPath, + $SizeBytes, + $true + ) + } + + "Fixed" { + Write-Verbose -Message "Creating fixed disk..." + + [WIM2VHD.VirtualHardDisk]::CreateFixedDisk( + $VhdFormat, + $VhdPath, + $SizeBytes, + $true + ) + } + } + + # Attach the VHD. + + Write-Verbose -Message "Attaching $VhdFormat..." + $disk = Mount-DiskImage -ImagePath $VhdPath -PassThru | Get-DiskImage | Get-Disk + } + + Switch ($DiskLayout) { + "BIOS" { + Write-Verbose -Message "Initializing disk..." + Initialize-Disk -Number $disk.Number -PartitionStyle MBR + + # Create the Windows/system partition + Write-Verbose -Message "Creating single partition..." + + $systemPartition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -MbrType IFS -IsActive + $windowsPartition = $systemPartition + + Write-Verbose -Message "Formatting windows volume..." + + $systemVolume = Format-Volume -Partition $systemPartition -FileSystem NTFS -Force -Confirm:$false + $windowsVolume = $systemVolume + } + + "UEFI" { + Write-Verbose -Message "Initializing disk..." + Initialize-Disk -Number $disk.Number -PartitionStyle GPT + + If ($BcdInVhd -eq "VirtualMachine") { + If (( Get-WindowsBuildNumber ) -ge 10240) { + + # Create the system partition. Create a data partition so we can format it, then change to ESP + # Size should be at least 260 MB to accomodate for Native 4K drives. + Write-Verbose -Message "Creating EFI System partition (ESP)..." + $systemPartition = New-Partition -DiskNumber $disk.Number -Size 260MB -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' + + Write-Verbose -Message " Formatting System volume..." + $systemVolume = Format-Volume -Partition $systemPartition -FileSystem FAT32 -Force -Confirm:$false + + Write-Verbose -Message " Setting partition type to ESP..." + $systemPartition | Set-Partition -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' + $systemPartition | Add-PartitionAccessPath -AssignDriveLetter + } + else { + + # Create the system partition + Write-Verbose -Message "Creating EFI system partition (ESP)..." + $systemPartition = New-Partition -DiskNumber $disk.Number -Size 260MB -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' -AssignDriveLetter + + Write-Verbose -Message " Formatting ESP..." + $formatArgs = @( + "$($systemPartition.DriveLetter):", # Partition drive letter + "/FS:FAT32", # File system + "/Q", # Quick format + "/Y" # Suppress prompt + ) + + Start-Executable -Executable format -Arguments $formatArgs + } + } + Else { + Write-Verbose -Message "The disk is intended for Native Boot. There will be no EFI System partition (ESP)." + } + + # Create the Windows partition + Write-Verbose -Message "Creating Boot (`"Windows`") partition..." + $windowsPartition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' + + Write-Verbose -Message " Formatting Boot (`"Windows`") volume..." + $windowsVolume = Format-Volume -Partition $windowsPartition -FileSystem NTFS -Force -Confirm:$false + } + + "WindowsToGo" { + Write-Verbose -Message "Initializing disk..." + Initialize-Disk -Number $disk.Number -PartitionStyle MBR + + # Create the system partition + Write-Verbose -Message "Creating system partition..." + $systemPartition = New-Partition -DiskNumber $disk.Number -Size 260MB -MbrType FAT32 -IsActive + + Write-Verbose -Message " Formatting system volume..." + $systemVolume = Format-Volume -Partition $systemPartition -FileSystem FAT32 -Force -Confirm:$false + + # Create the Windows partition + Write-Verbose -Message "Creating windows partition..." + $windowsPartition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -MbrType IFS + + Write-Verbose -Message " Formatting windows volume..." + $windowsVolume = Format-Volume -Partition $windowsPartition -FileSystem NTFS -Force -Confirm:$false + } + } + + If (( $DiskLayout -eq "UEFI" -and $BcdInVhd -eq "VirtualMachine" ) -or + ( $DiskLayout -eq "WindowsToGo") -or + ( $DiskLayout -eq "BIOS")) { + # Retreive access path for System partition. + $systemPartition = Get-Partition -UniqueId $systemPartition.UniqueId + $systemDrive = $systemPartition.AccessPaths[0].trimend("\").replace("\?", "??") + Write-Verbose -Message "System volume path: `"$systemDrive`"" + } + + # Assign drive letter to Boot partition. This is required for bcdboot + $attempts = 1 + $assigned = $false + + Do { + $windowsPartition | Add-PartitionAccessPath -AssignDriveLetter + $windowsPartition = $windowsPartition | Get-Partition + + If ($windowsPartition.DriveLetter -ne 0) { + $assigned = $true + } + else { + + # sleep for up to 10 seconds and retry + Get-Random -Minimum 1 -Maximum 10 | Start-Sleep + + $attempts++ + } + } + While ($attempts -le 100 -and -not $assigned) + + If (-Not $assigned) { + Throw "Unable to get Partition after retry" + } + + $windowsDrive = ( Get-Partition -Volume $windowsVolume ).AccessPaths[0].substring(0, 2) + + # This is to workaround "No such drive exists" error in PowerShell + $Drive = Get-PSDrive + + $windowsDrive = ( Resolve-Path -Path $windowsDrive ).Path + + Write-Verbose -Message "Boot volume path: `"$windowsDrive`". (Took $attempts attempt(s) to assign.)" + + #endregion Create and partition VHD + + #region APPLY IMAGE FROM WIM TO THE NEW VHD + + Write-Verbose -Message "Applying image to $VhdFormat. This could take a while..." + + If (( Get-Command -Name "Expand-WindowsImage" -ErrorAction "SilentlyContinue" ) -and + ( -not $ApplyEA -and [string]::IsNullOrEmpty( $DismPath ) )) { + Expand-WindowsImage -ApplyPath $windowsDrive -ImagePath $SourcePath -Index $ImageIndex -LogPath "$($logFolder)\DismLogs.log" -Verbose:$False | Out-Null + } + Else { + If ([string]::IsNullOrEmpty( $DismPath )) { + $DismPath = Join-Path -Path $env:windir -ChildPath "system32\dism.exe" + } + + $applyImage = "/Apply-Image" + + If ($ApplyEA) { + $applyImage = $applyImage + " /EA" + } + + $dismArgs = @("$applyImage /ImageFile:`"$SourcePath`" /Index:$ImageIndex /ApplyDir:$windowsDrive /LogPath:`"$($logFolder)\DismLogs.log`"") + + Write-Verbose -Message "Applying image: $dismPath $dismArgs" + + $process = Start-Process -PassThru -Wait -NoNewWindow -FilePath $dismPath -ArgumentList $dismArgs + + If ($process.ExitCode -ne 0) { + Throw "Image Apply failed! See DismImageApply logs for details" + } + } + Write-Verbose -Message "Image was applied successfully. " + + # Here we copy in the unattend file (if specified by the command line) + + If (-Not [string]::IsNullOrEmpty( $UnattendPath )) { + Write-Verbose -Message "Applying unattend file ($(Split-Path $UnattendPath -Leaf))..." + + $UnattendDestination = Join-Path -Path $windowsDrive -ChildPath "unattend.xml" + Copy-Item -Path $UnattendPath -Destination $UnattendDestination -Force + } + + # Added to handle merge folders + + If (-Not [string]::IsNullOrEmpty( $MergeFolderPath )) { + Write-Verbose -Message "Applying merge folder ($MergeFolderPath)..." + + $MergeSourcePath = Join-Path -Path $MergeFolderPath -ChildPath "*" + + Copy-Item -Recurse -Path $MergeFolderPath -Destination $windowsDrive -Force + } + + #endregion APPLY IMAGE FROM WIM TO THE NEW VHD + + #region BCD manipulation + + If (( $openImage.ImageArchitecture -ne "ARM" ) -and # No virtualization platform for ARM images + ( $BcdInVhd -ne "NativeBoot" )) { # User asked for a non-bootable image + If (Test-Path -Path "$($systemDrive)\boot\bcd") { + Write-Verbose -Message "Image already has BIOS BCD store..." + } + ElseIf (Test-Path -Path "$($systemDrive)\efi\microsoft\boot\bcd") { + Write-Verbose -Message "Image already has EFI BCD store..." + } + Else { + Write-Verbose -Message "Making image bootable..." + + $WindowsPath = Join-Path -Path $windowsDrive -ChildPath "Windows" + + $bcdBootArgs = @( + + "$WindowsPath", # Path to the \Windows on the VHD + "/s $systemDrive", # Specifies the volume letter of the drive to create the \BOOT folder on. + "/v" # Enabled verbose logging. + ) + + $bcdPath = @() + + Switch ($DiskLayout) { + "BIOS" { + $bcdBootArgs += "/f BIOS" # Specifies the firmware type of the target system partition + $bcdPath += Join-Path -Path $systemDrive -ChildPath "boot\bcd" + } + + "UEFI" { + $bcdBootArgs += "/f UEFI" # Specifies the firmware type of the target system partition + $bcdPath += Join-Path -Path $systemDrive -ChildPath "efi\microsoft\boot\bcd" + } + + "WindowsToGo" { + + # Create entries for both UEFI and BIOS if possible + + If (Test-Path -Path "$($windowsDrive)\Windows\boot\EFI\bootmgfw.efi") { + $bcdBootArgs += "/f ALL" + $bcdPath += Join-Path -Path $systemDrive -ChildPath "boot\bcd" + $bcdPath += Join-Path -Path $systemDrive -ChildPath "efi\microsoft\boot\bcd" + } + Else { + $bcdBootArgs += "/f BIOS" # Specifies the firmware type of the target system partition + $bcdPath += Join-Path -Path $systemDrive -ChildPath "boot\bcd" + } + } + } + + If (Test-Path -Path "Variable:\BcdLocale") { + $bcdBootArgs += "/l $BcdLocale.Name" + } + + Start-Executable -Executable $BCDBoot -Arguments $bcdBootArgs + + # The following is added to mitigate the VMM diff disk handling + # We're going to change from MBRBootOption to LocateBootOption. + + Write-Verbose -Message "Fixing the Device ID in the BCD store on $($VhdFormat)..." + + $bcdPath | ForEach-Object -Process { + + Start-Executable -Executable "BCDEDIT.EXE" -Arguments ( + "/store $PSItem", + "/set `{bootmgr`} device locate" + ) + Start-Executable -Executable "BCDEDIT.EXE" -Arguments ( + "/store $PSItem", + "/set `{default`} device locate" + ) + Start-Executable -Executable "BCDEDIT.EXE" -Arguments ( + "/store $PSItem", + "/set `{default`} osdevice locate" + ) + } + } + + Write-Verbose -Message "Drive is bootable." + + # Are we turning the debugger on? + If ($EnableDebugger -inotlike "None") { + $bcdEditArgs = $null; + + # Configure the specified debugging transport and other settings. + Switch ($EnableDebugger) { + "Serial" { + $bcdEditArgs = @( + + "/dbgsettings SERIAL", + "DEBUGPORT:$($ComPort.Value)", + "BAUDRATE:$($BaudRate.Value)" + ) + } + + "1394" { + $bcdEditArgs = @( + + "/dbgsettings 1394", + "CHANNEL:$($Channel.Value)" + ) + } + + "USB" { + $bcdEditArgs = @( + + "/dbgsettings USB", + "TARGETNAME:$($Target.Value)" + ) + } + + "Local" { + $bcdEditArgs = @( + + "/dbgsettings LOCAL" + ) + } + + "Network" { + $bcdEditArgs = @( + + "/dbgsettings NET", + "HOSTIP:$($IP.Value)", + "PORT:$($Port.Value)", + "KEY:$($Key.Value)" + ) + } + } + + $bcdStores = @( + + "$($systemDrive)\boot\bcd", + "$($systemDrive)\efi\microsoft\boot\bcd" + ) + + Foreach ($bcdStore In $bcdStores) { + If (Test-Path -Path $bcdStore) { + Write-Verbose -Message "Turning kernel debugging on in the $VhdFormat for $bcdStore..." + + Start-Executable -Executable "BCDEDIT.EXE" -Arguments ( + + "/store $($bcdStore)", + "/set `{default`} debug on" + ) + + $bcdEditArguments = @("/store $($bcdStore)") + $bcdEditArgs + + Start-Executable -Executable "BCDEDIT.EXE" -Arguments $bcdEditArguments + } + } + } + } + + Else { + + # Don't bother to check on debugging. We can't boot WoA VHDs in VMs, and + # if we're native booting, the changes need to be made to the BCD store on the + # physical computer's boot volume. + + Write-Verbose -Message "Image applied. It is not bootable." + } + + #endregion BCD manipulation + + #region Additional image enhancements + + If ($RemoteDesktopEnable -or -not $ExpandOnNativeBoot) { + $hivePath = Join-Path -Path $windowsDrive -ChildPath "Windows\System32\Config\System" + + $hive = Mount-RegistryHive -Hive $hivePath + + If ($RemoteDesktopEnable) { + Write-Verbose -Message "Enabling Remote Desktop" + + Set-ItemProperty -Path "HKLM:\$($hive)\ControlSet001\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0 + } + + If (-not $ExpandOnNativeBoot) { + Write-Verbose -Message "Disabling automatic $VhdFormat expansion for Native Boot" + + Set-ItemProperty -Path "HKLM:\$($hive)\ControlSet001\Services\FsDepends\Parameters" -Name "VirtualDiskExpandOnMount" -Value 4 + } + + Dismount-RegistryHive -HiveMountPoint $hive + } + + If ($Driver) { + Write-Verbose -Message "Adding Windows Drivers to the Image" + + $Driver | ForEach-Object -Process { + + Write-Verbose -Message "Driver path: $PSItem" + Add-WindowsDriver -Path $windowsDrive -Recurse -Driver $PSItem -Verbose:$False | Out-Null + } + } + + If ($Feature) { + Write-Verbose -Message "Installing Windows Feature(s) $Feature to the Image" + + $FeatureSourcePath = Join-Path -Path "$($driveLetter):" -ChildPath "sources\sxs" + Write-Verbose -Message "From $FeatureSourcePath" + Enable-WindowsOptionalFeature -FeatureName $Feature -Source $FeatureSourcePath -Path $windowsDrive -All -Verbose:$False | Out-Null + } + + If ($Package) { + Write-Verbose -Message "Adding Windows Packages to the Image" + + $Package | ForEach-Object -Process { + + Write-Verbose -Message "Package path: $PSItem" + Add-WindowsPackage -Path $windowsDrive -PackagePath $PSItem -Verbose:$False | Out-Null + } + } + + #endregion Additional image enhancements + + #region Dispose paths and dismount VHD + + # Remove system partition access path, if necessary + If ($DiskLayout -eq "UEFI" -and $BcdInVhd -eq "VirtualMachine") { + Remove-PartitionAccessPath -InputObject $systemPartition -AccessPath $systemPartition.AccessPaths[0] -PassThru | Out-Null + } + + If ([String]::IsNullOrEmpty( $vhdFinalName )) { + + # We need to generate a file name. + + Write-Verbose -Message "Generating name for $VhdFormat..." + + $HivePath = Join-Path -Path $windowsDrive -ChildPath "Windows\System32\Config\Software" + + $hive = Mount-RegistryHive -Hive $hivePath + + $buildLabEx = ( Get-ItemProperty "HKLM:\$($hive)\Microsoft\Windows NT\CurrentVersion" ).BuildLabEx + $installType = ( Get-ItemProperty "HKLM:\$($hive)\Microsoft\Windows NT\CurrentVersion" ).InstallationType + $editionId = ( Get-ItemProperty "HKLM:\$($hive)\Microsoft\Windows NT\CurrentVersion" ).EditionID + $skuFamily = $null + + Dismount-RegistryHive -HiveMountPoint $hive + + # Is this ServerCore? + # Since we're only doing this string comparison against the InstallType key, we won't get + # false positives with the Core SKU. + + If ($installType.ToUpper().Contains("CORE")) { + $editionId += "Core" + } + + # What type of SKU are we? + + If ($installType.ToUpper().Contains("SERVER")) { + $skuFamily = "Server" + } + ElseIf ($installType.ToUpper().Contains("CLIENT")) { + $skuFamily = "Client" + } + Else { + $skuFamily = "Unknown" + } + + # ISSUE - do we want VL here? + + $vhdFinalName = "$($buildLabEx)_$($skuFamily)_$($editionId)_$($openImage.ImageDefaultLanguage).$($VhdFormat.ToLower())" + Write-Debug -Message " $VhdFormat final name is: `"$vhdFinalName`"" + } + + If ($hyperVEnabled) { + Write-Verbose -Message "Dismounting $VhdFormat..." + Dismount-VHD -Path $VhdPath + } + Else { + Write-Verbose -Message "Closing $VhdFormat..." + If ((Get-Command Dismount-DiskImage).parameters.Keys.Contains("PassThru")) { + $DismountDiskImage = Dismount-DiskImage -ImagePath $VhdPath -PassThru + } + Else { + $DismountDiskImage = Dismount-DiskImage -ImagePath $VhdPath + } + } + + $vhdParentPath = Split-Path -Path $VhdPath -Parent + $vhdFinalPath = Join-Path -Path $vhdParentPath -ChildPath $vhdFinalName + + Write-Debug -Message " $VhdFormat final path is: `"$vhdFinalPath`"" + + If (Test-Path -Path $vhdFinalPath) { + $VhdNameOld = Split-Path -Path $vhdFinalPath -Leaf + + Write-Verbose -Message "Deleting pre-existing $($VhdFormat): `"$VhdNameOld`"..." + + Remove-Item -Path $vhdFinalPath -Force + } + + Write-Debug -Message " Renaming $VhdFormat at `"$VhdPath`"." + + $VhdPathFull = ( Resolve-Path -Path $VhdPath ).Path + + $RenameItem = Rename-Item -Path $VhdPathFull -NewName $vhdFinalName -Force -PassThru + + $vhd += Get-DiskImage -ImagePath $vhdFinalPath + + $vhdFinalName = $null + + #endregion Dispose paths and dismount images + } + } + Catch { + Write-Verbose -Message ( [system.string]::Empty ) + Write-Error -Message $PSItem + Write-Verbose -Message "Log folder is `"$logFolder`"" + } + Finally { + Write-Verbose -Message ( [system.string]::Empty ) + + # If we still have a WIM image open, close it. + If ($openWim -ne $null) { + Write-Verbose -Message "Closing Windows image..." + + $openWim.Close() + } + + # If we still have a registry hive mounted, dismount it. + If ($mountedHive -ne $null) { + Write-Verbose -Message "Closing registry hive..." + + Dismount-RegistryHive -HiveMountPoint $mountedHive + } + + # If VHD is mounted, unmount it + If (Test-Path -Path $VhdPath) { + If ($hyperVEnabled) { + If (( Get-VHD -Path $VhdPath ).Attached) { + Dismount-VHD -Path $VhdPath + } + } + Else { + If ((Get-Command Dismount-DiskImage).parameters.Keys.Contains("PassThru")) { + $DismountDiskImage = Dismount-DiskImage -ImagePath $VhdPath -PassThru + } + Else { + $DismountDiskImage = Dismount-DiskImage -ImagePath $VhdPath + } + } + } + + # If we still have an ISO open, close it. + If ($openIso -ne $Null) { + Write-Verbose -Message "Closing ISO..." + If ((Get-Command Dismount-DiskImage).parameters.Keys.Contains("PassThru")) { + $DismountDiskImage = Dismount-DiskImage -ImagePath $IsoPath -PassThru + } + Else { + $DismountDiskImage = Dismount-DiskImage -ImagePath $IsoPath + } + } + + If (-not $CacheSource) { + If ($tempSource -and ( Test-Path -Path $tempSource )) { + $Item = Remove-Item -Path $tempSource -Force + } + } + + # Close out the transcript and tell the user we're done. + Write-Verbose -Message "Done." + + If ($transcripting) { + $Null = Stop-Transcript + } + } + } + End { + + If ($Passthru) { + Return $vhd + } + } + + #endregion Code +} + +# Helper functions. Not intended to be called outside of Convert-WindowsImage. + +Function +Add-WindowsImageTypes { + $Code = @" + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Xml.Linq; +using System.Xml.XPath; +using Microsoft.Win32.SafeHandles; + +namespace WIM2VHD +{ + +/// +/// P/Invoke methods and associated enums, flags, and structs. +/// +public class +NativeMethods +{ + + #region Delegates and Callbacks + #region WIMGAPI + + /// + ///User-defined function used with the RegisterMessageCallback or UnregisterMessageCallback function. + /// + ///Specifies the message being sent. + ///Specifies additional message information. The contents of this parameter depend on the value of the + ///MessageId parameter. + ///Specifies additional message information. The contents of this parameter depend on the value of the + ///MessageId parameter. + ///Specifies the user-defined value passed to RegisterCallback. + /// + ///To indicate success and to enable other subscribers to process the message return WIM_MSG_SUCCESS. + ///To prevent other subscribers from receiving the message, return WIM_MSG_DONE. + ///To cancel an image apply or capture, return WIM_MSG_ABORT_IMAGE when handling the WIM_MSG_PROCESS message. + /// + public delegate uint + WimMessageCallback( + uint MessageId, + IntPtr wParam, + IntPtr lParam, + IntPtr UserData + ); + + public static void + RegisterMessageCallback( + WimFileHandle hWim, + WimMessageCallback callback) + { + + uint _callback = NativeMethods.WimRegisterMessageCallback(hWim, callback, IntPtr.Zero); + int rc = Marshal.GetLastWin32Error(); + if (0 != rc) + { + // Throw an exception if something bad happened on the Win32 end. + throw + new InvalidOperationException( + string.Format( + CultureInfo.CurrentCulture, + "Unable to register message callback." + )); + } + } + + public static void + UnregisterMessageCallback( + WimFileHandle hWim, + WimMessageCallback registeredCallback) + { + + bool status = NativeMethods.WimUnregisterMessageCallback(hWim, registeredCallback); + int rc = Marshal.GetLastWin32Error(); + if (!status) + { + throw + new InvalidOperationException( + string.Format( + CultureInfo.CurrentCulture, + "Unable to unregister message callback." + )); + } + } + + #endregion WIMGAPI + #endregion Delegates and Callbacks + + #region Constants + + #region VDiskInterop + + /// + /// The default depth in a VHD parent chain that this library will search through. + /// If you want to go more than one disk deep into the parent chain, provide a different value. + /// + public const uint OPEN_VIRTUAL_DISK_RW_DEFAULT_DEPTH = 0x00000001; + + public const uint DEFAULT_BLOCK_SIZE = 0x00080000; + public const uint DISK_SECTOR_SIZE = 0x00000200; + + internal const uint ERROR_VIRTDISK_NOT_VIRTUAL_DISK = 0xC03A0015; + internal const uint ERROR_NOT_FOUND = 0x00000490; + internal const uint ERROR_IO_PENDING = 0x000003E5; + internal const uint ERROR_INSUFFICIENT_BUFFER = 0x0000007A; + internal const uint ERROR_ERROR_DEV_NOT_EXIST = 0x00000037; + internal const uint ERROR_BAD_COMMAND = 0x00000016; + internal const uint ERROR_SUCCESS = 0x00000000; + + public const uint GENERIC_READ = 0x80000000; + public const uint GENERIC_WRITE = 0x40000000; + public const short FILE_ATTRIBUTE_NORMAL = 0x00000080; + public const uint CREATE_NEW = 0x00000001; + public const uint CREATE_ALWAYS = 0x00000002; + public const uint OPEN_EXISTING = 0x00000003; + public const short INVALID_HANDLE_VALUE = -1; + + internal static Guid VirtualStorageTypeVendorUnknown = new Guid("00000000-0000-0000-0000-000000000000"); + internal static Guid VirtualStorageTypeVendorMicrosoft = new Guid("EC984AEC-A0F9-47e9-901F-71415A66345B"); + + #endregion VDiskInterop + + #region WIMGAPI + + public const uint WIM_FLAG_VERIFY = 0x00000002; + public const uint WIM_FLAG_INDEX = 0x00000004; + + public const uint WM_APP = 0x00008000; + + #endregion WIMGAPI + + #endregion Constants + + #region Enums and Flags + + #region VDiskInterop + + /// + /// Indicates the version of the virtual disk to create. + /// + public enum CreateVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + public enum OpenVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + /// + /// Contains the version of the virtual hard disk (VHD) ATTACH_VIRTUAL_DISK_PARAMETERS structure to use in calls to VHD functions. + /// + public enum AttachVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + public enum CompactVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001 + } + + /// + /// Contains the type and provider (vendor) of the virtual storage device. + /// + public enum VirtualStorageDeviceType : int + { + /// + /// The storage type is unknown or not valid. + /// + Unknown = 0x00000000, + /// + /// For internal use only. This type is not supported. + /// + ISO = 0x00000001, + /// + /// Virtual Hard Disk device type. + /// + VHD = 0x00000002, + /// + /// Virtual Hard Disk v2 device type. + /// + VHDX = 0x00000003 + } + + /// + /// Contains virtual hard disk (VHD) open request flags. + /// + [Flags] + public enum OpenVirtualDiskFlags + { + /// + /// No flags. Use system defaults. + /// + None = 0x00000000, + /// + /// Open the VHD file (backing store) without opening any differencing-chain parents. Used to correct broken parent links. + /// + NoParents = 0x00000001, + /// + /// Reserved. + /// + BlankFile = 0x00000002, + /// + /// Reserved. + /// + BootDrive = 0x00000004, + } + + /// + /// Contains the bit mask for specifying access rights to a virtual hard disk (VHD). + /// + [Flags] + public enum VirtualDiskAccessMask + { + /// + /// Only Version2 of OpenVirtualDisk API accepts this parameter + /// + None = 0x00000000, + /// + /// Open the virtual disk for read-only attach access. The caller must have READ access to the virtual disk image file. + /// + /// + /// If used in a request to open a virtual disk that is already open, the other handles must be limited to either + /// VIRTUAL_DISK_ACCESS_DETACH or VIRTUAL_DISK_ACCESS_GET_INFO access, otherwise the open request with this flag will fail. + /// + AttachReadOnly = 0x00010000, + /// + /// Open the virtual disk for read-write attaching access. The caller must have (READ | WRITE) access to the virtual disk image file. + /// + /// + /// If used in a request to open a virtual disk that is already open, the other handles must be limited to either + /// VIRTUAL_DISK_ACCESS_DETACH or VIRTUAL_DISK_ACCESS_GET_INFO access, otherwise the open request with this flag will fail. + /// If the virtual disk is part of a differencing chain, the disk for this request cannot be less than the readWriteDepth specified + /// during the prior open request for that differencing chain. + /// + AttachReadWrite = 0x00020000, + /// + /// Open the virtual disk to allow detaching of an attached virtual disk. The caller must have + /// (FILE_READ_ATTRIBUTES | FILE_READ_DATA) access to the virtual disk image file. + /// + Detach = 0x00040000, + /// + /// Information retrieval access to the virtual disk. The caller must have READ access to the virtual disk image file. + /// + GetInfo = 0x00080000, + /// + /// Virtual disk creation access. + /// + Create = 0x00100000, + /// + /// Open the virtual disk to perform offline meta-operations. The caller must have (READ | WRITE) access to the virtual + /// disk image file, up to readWriteDepth if working with a differencing chain. + /// + /// + /// If the virtual disk is part of a differencing chain, the backing store (host volume) is opened in RW exclusive mode up to readWriteDepth. + /// + MetaOperations = 0x00200000, + /// + /// Reserved. + /// + Read = 0x000D0000, + /// + /// Allows unrestricted access to the virtual disk. The caller must have unrestricted access rights to the virtual disk image file. + /// + All = 0x003F0000, + /// + /// Reserved. + /// + Writable = 0x00320000 + } + + /// + /// Contains virtual hard disk (VHD) creation flags. + /// + [Flags] + public enum CreateVirtualDiskFlags + { + /// + /// Contains virtual hard disk (VHD) creation flags. + /// + None = 0x00000000, + /// + /// Pre-allocate all physical space necessary for the size of the virtual disk. + /// + /// + /// The CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION flag is used for the creation of a fixed VHD. + /// + FullPhysicalAllocation = 0x00000001 + } + + /// + /// Contains virtual disk attach request flags. + /// + [Flags] + public enum AttachVirtualDiskFlags + { + /// + /// No flags. Use system defaults. + /// + None = 0x00000000, + /// + /// Attach the virtual disk as read-only. + /// + ReadOnly = 0x00000001, + /// + /// No drive letters are assigned to the disk's volumes. + /// + /// Oddly enough, this doesn't apply to NTFS mount points. + NoDriveLetter = 0x00000002, + /// + /// Will decouple the virtual disk lifetime from that of the VirtualDiskHandle. + /// The virtual disk will be attached until the Detach() function is called, even if all open handles to the virtual disk are closed. + /// + PermanentLifetime = 0x00000004, + /// + /// Reserved. + /// + NoLocalHost = 0x00000008 + } + + [Flags] + public enum DetachVirtualDiskFlag + { + None = 0x00000000 + } + + [Flags] + public enum CompactVirtualDiskFlags + { + None = 0x00000000, + NoZeroScan = 0x00000001, + NoBlockMoves = 0x00000002 + } + + #endregion VDiskInterop + + #region WIMGAPI + + [FlagsAttribute] + internal enum + WimCreateFileDesiredAccess : uint + { + WimQuery = 0x00000000, + WimGenericRead = 0x80000000 + } + + public enum WimMessage : uint + { + WIM_MSG = WM_APP + 0x1476, + WIM_MSG_TEXT, + /// + ///Indicates an update in the progress of an image application. + /// + WIM_MSG_PROGRESS, + /// + ///Enables the caller to prevent a file or a directory from being captured or applied. + /// + WIM_MSG_PROCESS, + /// + ///Indicates that volume information is being gathered during an image capture. + /// + WIM_MSG_SCANNING, + /// + ///Indicates the number of files that will be captured or applied. + /// + WIM_MSG_SETRANGE, + /// + ///Indicates the number of files that have been captured or applied. + /// + WIM_MSG_SETPOS, + /// + ///Indicates that a file has been either captured or applied. + /// + WIM_MSG_STEPIT, + /// + ///Enables the caller to prevent a file resource from being compressed during a capture. + /// + WIM_MSG_COMPRESS, + /// + ///Alerts the caller that an error has occurred while capturing or applying an image. + /// + WIM_MSG_ERROR, + /// + ///Enables the caller to align a file resource on a particular alignment boundary. + /// + WIM_MSG_ALIGNMENT, + WIM_MSG_RETRY, + /// + ///Enables the caller to align a file resource on a particular alignment boundary. + /// + WIM_MSG_SPLIT, + WIM_MSG_SUCCESS = 0x00000000, + WIM_MSG_ABORT_IMAGE = 0xFFFFFFFF + } + + internal enum + WimCreationDisposition : uint + { + WimOpenExisting = 0x00000003, + } + + internal enum + WimActionFlags : uint + { + WimIgnored = 0x00000000 + } + + internal enum + WimCompressionType : uint + { + WimIgnored = 0x00000000 + } + + internal enum + WimCreationResult : uint + { + WimCreatedNew = 0x00000000, + WimOpenedExisting = 0x00000001 + } + + #endregion WIMGAPI + + #endregion Enums and Flags + + #region Structs + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct CreateVirtualDiskParameters + { + /// + /// A CREATE_VIRTUAL_DISK_VERSION enumeration that specifies the version of the CREATE_VIRTUAL_DISK_PARAMETERS structure being passed to or from the virtual hard disk (VHD) functions. + /// + public CreateVirtualDiskVersion Version; + + /// + /// Unique identifier to assign to the virtual disk object. If this member is set to zero, a unique identifier is created by the system. + /// + public Guid UniqueId; + + /// + /// The maximum virtual size of the virtual disk object. Must be a multiple of 512. + /// If a ParentPath is specified, this value must be zero. + /// If a SourcePath is specified, this value can be zero to specify the size of the source VHD to be used, otherwise the size specified must be greater than or equal to the size of the source disk. + /// + public ulong MaximumSize; + + /// + /// Internal size of the virtual disk object blocks. + /// The following are predefined block sizes and their behaviors. For a fixed VHD type, this parameter must be zero. + /// + public uint BlockSizeInBytes; + + /// + /// Internal size of the virtual disk object sectors. Must be set to 512. + /// + public uint SectorSizeInBytes; + + /// + /// Optional path to a parent virtual disk object. Associates the new virtual disk with an existing virtual disk. + /// If this parameter is not NULL, SourcePath must be NULL. + /// + public string ParentPath; + + /// + /// Optional path to pre-populate the new virtual disk object with block data from an existing disk. This path may refer to a VHD or a physical disk. + /// If this parameter is not NULL, ParentPath must be NULL. + /// + public string SourcePath; + + /// + /// Flags for opening the VHD + /// + public OpenVirtualDiskFlags OpenFlags; + + /// + /// GetInfoOnly flag for V2 handles + /// + public bool GetInfoOnly; + + /// + /// Virtual Storage Type of the parent disk + /// + public VirtualStorageType ParentVirtualStorageType; + + /// + /// Virtual Storage Type of the source disk + /// + public VirtualStorageType SourceVirtualStorageType; + + /// + /// A GUID to use for fallback resiliency over SMB. + /// + public Guid ResiliencyGuid; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct VirtualStorageType + { + public VirtualStorageDeviceType DeviceId; + public Guid VendorId; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct SecurityDescriptor + { + public byte revision; + public byte size; + public short control; + public IntPtr owner; + public IntPtr group; + public IntPtr sacl; + public IntPtr dacl; + } + + #endregion Structs + + #region VirtDisk.DLL P/Invoke + + [DllImport("virtdisk.dll", CharSet = CharSet.Unicode)] + public static extern uint + CreateVirtualDisk( + [In, Out] ref VirtualStorageType VirtualStorageType, + [In] string Path, + [In] VirtualDiskAccessMask VirtualDiskAccessMask, + [In, Out] ref SecurityDescriptor SecurityDescriptor, + [In] CreateVirtualDiskFlags Flags, + [In] uint ProviderSpecificFlags, + [In, Out] ref CreateVirtualDiskParameters Parameters, + [In] IntPtr Overlapped, + [Out] out SafeFileHandle Handle); + + #endregion VirtDisk.DLL P/Invoke + + #region Win32 P/Invoke + + [DllImport("advapi32", SetLastError = true)] + public static extern bool InitializeSecurityDescriptor( + [Out] out SecurityDescriptor pSecurityDescriptor, + [In] uint dwRevision); + + #endregion Win32 P/Invoke + + #region WIMGAPI P/Invoke + + #region SafeHandle wrappers for WimFileHandle and WimImageHandle + + public sealed class WimFileHandle : SafeHandle + { + + public WimFileHandle( + string wimPath) + : base(IntPtr.Zero, true) + { + + if (String.IsNullOrEmpty(wimPath)) + { + throw new ArgumentNullException("wimPath"); + } + + if (!File.Exists(Path.GetFullPath(wimPath))) + { + throw new FileNotFoundException((new FileNotFoundException()).Message, wimPath); + } + + NativeMethods.WimCreationResult creationResult; + + this.handle = NativeMethods.WimCreateFile( + wimPath, + NativeMethods.WimCreateFileDesiredAccess.WimGenericRead, + NativeMethods.WimCreationDisposition.WimOpenExisting, + NativeMethods.WimActionFlags.WimIgnored, + NativeMethods.WimCompressionType.WimIgnored, + out creationResult + ); + + // Check results. + if (creationResult != NativeMethods.WimCreationResult.WimOpenedExisting) + { + throw new Win32Exception(); + } + + if (this.handle == IntPtr.Zero) + { + throw new Win32Exception(); + } + + // Set the temporary path. + NativeMethods.WimSetTemporaryPath( + this, + Environment.ExpandEnvironmentVariables("%TEMP%") + ); + } + + protected override bool ReleaseHandle() + { + return NativeMethods.WimCloseHandle(this.handle); + } + + public override bool IsInvalid + { + get { return this.handle == IntPtr.Zero; } + } + } + + public sealed class WimImageHandle : SafeHandle + { + public WimImageHandle( + WimFile Container, + uint ImageIndex) + : base(IntPtr.Zero, true) + { + + if (null == Container) + { + throw new ArgumentNullException("Container"); + } + + if ((Container.Handle.IsClosed) || (Container.Handle.IsInvalid)) + { + throw new ArgumentNullException("The handle to the WIM file has already been closed, or is invalid.", "Container"); + } + + if (ImageIndex > Container.ImageCount) + { + throw new ArgumentOutOfRangeException("ImageIndex", "The index does not exist in the specified WIM file."); + } + + this.handle = NativeMethods.WimLoadImage( + Container.Handle.DangerousGetHandle(), + ImageIndex); + } + + protected override bool ReleaseHandle() + { + return NativeMethods.WimCloseHandle(this.handle); + } + + public override bool IsInvalid + { + get { return this.handle == IntPtr.Zero; } + } + } + + #endregion SafeHandle wrappers for WimFileHandle and WimImageHandle + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMCreateFile")] + internal static extern IntPtr + WimCreateFile( + [In, MarshalAs(UnmanagedType.LPWStr)] string WimPath, + [In] WimCreateFileDesiredAccess DesiredAccess, + [In] WimCreationDisposition CreationDisposition, + [In] WimActionFlags FlagsAndAttributes, + [In] WimCompressionType CompressionType, + [Out, Optional] out WimCreationResult CreationResult + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMCloseHandle")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimCloseHandle( + [In] IntPtr Handle + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMLoadImage")] + internal static extern IntPtr + WimLoadImage( + [In] IntPtr Handle, + [In] uint ImageIndex + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMGetImageCount")] + internal static extern uint + WimGetImageCount( + [In] WimFileHandle Handle + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMGetImageInformation")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimGetImageInformation( + [In] SafeHandle Handle, + [Out] out StringBuilder ImageInfo, + [Out] out uint SizeOfImageInfo + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMSetTemporaryPath")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimSetTemporaryPath( + [In] WimFileHandle Handle, + [In] string TempPath + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMRegisterMessageCallback", CallingConvention = CallingConvention.StdCall)] + internal static extern uint + WimRegisterMessageCallback( + [In, Optional] WimFileHandle hWim, + [In] WimMessageCallback MessageProc, + [In, Optional] IntPtr ImageInfo + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMUnregisterMessageCallback", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimUnregisterMessageCallback( + [In, Optional] WimFileHandle hWim, + [In] WimMessageCallback MessageProc + ); + + + #endregion WIMGAPI P/Invoke +} + +#region WIM Interop + +public class WimFile +{ + + internal XDocument m_xmlInfo; + internal List m_imageList; + + private static NativeMethods.WimMessageCallback wimMessageCallback; + + #region Events + + /// + /// DefaultImageEvent handler + /// + public delegate void DefaultImageEventHandler(object sender, DefaultImageEventArgs e); + + /// + ///ProcessFileEvent handler + /// + public delegate void ProcessFileEventHandler(object sender, ProcessFileEventArgs e); + + /// + ///Enable the caller to prevent a file resource from being compressed during a capture. + /// + public event ProcessFileEventHandler ProcessFileEvent; + + /// + ///Indicate an update in the progress of an image application. + /// + public event DefaultImageEventHandler ProgressEvent; + + /// + ///Alert the caller that an error has occurred while capturing or applying an image. + /// + public event DefaultImageEventHandler ErrorEvent; + + /// + ///Indicate that a file has been either captured or applied. + /// + public event DefaultImageEventHandler StepItEvent; + + /// + ///Indicate the number of files that will be captured or applied. + /// + public event DefaultImageEventHandler SetRangeEvent; + + /// + ///Indicate the number of files that have been captured or applied. + /// + public event DefaultImageEventHandler SetPosEvent; + + #endregion Events + + private + enum + ImageEventMessage : uint + { + /// + ///Enables the caller to prevent a file or a directory from being captured or applied. + /// + Progress = NativeMethods.WimMessage.WIM_MSG_PROGRESS, + /// + ///Notification sent to enable the caller to prevent a file or a directory from being captured or applied. + ///To prevent a file or a directory from being captured or applied, call WindowsImageContainer.SkipFile(). + /// + Process = NativeMethods.WimMessage.WIM_MSG_PROCESS, + /// + ///Enables the caller to prevent a file resource from being compressed during a capture. + /// + Compress = NativeMethods.WimMessage.WIM_MSG_COMPRESS, + /// + ///Alerts the caller that an error has occurred while capturing or applying an image. + /// + Error = NativeMethods.WimMessage.WIM_MSG_ERROR, + /// + ///Enables the caller to align a file resource on a particular alignment boundary. + /// + Alignment = NativeMethods.WimMessage.WIM_MSG_ALIGNMENT, + /// + ///Enables the caller to align a file resource on a particular alignment boundary. + /// + Split = NativeMethods.WimMessage.WIM_MSG_SPLIT, + /// + ///Indicates that volume information is being gathered during an image capture. + /// + Scanning = NativeMethods.WimMessage.WIM_MSG_SCANNING, + /// + ///Indicates the number of files that will be captured or applied. + /// + SetRange = NativeMethods.WimMessage.WIM_MSG_SETRANGE, + /// + ///Indicates the number of files that have been captured or applied. + /// + SetPos = NativeMethods.WimMessage.WIM_MSG_SETPOS, + /// + ///Indicates that a file has been either captured or applied. + /// + StepIt = NativeMethods.WimMessage.WIM_MSG_STEPIT, + /// + ///Success. + /// + Success = NativeMethods.WimMessage.WIM_MSG_SUCCESS, + /// + ///Abort. + /// + Abort = NativeMethods.WimMessage.WIM_MSG_ABORT_IMAGE + } + + /// + ///Event callback to the Wimgapi events + /// + private + uint + ImageEventMessagePump( + uint MessageId, + IntPtr wParam, + IntPtr lParam, + IntPtr UserData) + { + + uint status = (uint) NativeMethods.WimMessage.WIM_MSG_SUCCESS; + + DefaultImageEventArgs eventArgs = new DefaultImageEventArgs(wParam, lParam, UserData); + + switch ((ImageEventMessage)MessageId) + { + + case ImageEventMessage.Progress: + ProgressEvent(this, eventArgs); + break; + + case ImageEventMessage.Process: + if (null != ProcessFileEvent) + { + string fileToImage = Marshal.PtrToStringUni(wParam); + ProcessFileEventArgs fileToProcess = new ProcessFileEventArgs(fileToImage, lParam); + ProcessFileEvent(this, fileToProcess); + + if (fileToProcess.Abort == true) + { + status = (uint)ImageEventMessage.Abort; + } + } + break; + + case ImageEventMessage.Error: + if (null != ErrorEvent) + { + ErrorEvent(this, eventArgs); + } + break; + + case ImageEventMessage.SetRange: + if (null != SetRangeEvent) + { + SetRangeEvent(this, eventArgs); + } + break; + + case ImageEventMessage.SetPos: + if (null != SetPosEvent) + { + SetPosEvent(this, eventArgs); + } + break; + + case ImageEventMessage.StepIt: + if (null != StepItEvent) + { + StepItEvent(this, eventArgs); + } + break; + + default: + break; + } + return status; + + } + + /// + /// Constructor. + /// + /// Path to the WIM container. + public + WimFile(string wimPath) + { + if (string.IsNullOrEmpty(wimPath)) + { + throw new ArgumentNullException("wimPath"); + } + + if (!File.Exists(Path.GetFullPath(wimPath))) + { + throw new FileNotFoundException((new FileNotFoundException()).Message, wimPath); + } + + Handle = new NativeMethods.WimFileHandle(wimPath); + + // Hook up the events before we return. + //wimMessageCallback = new NativeMethods.WimMessageCallback(ImageEventMessagePump); + //NativeMethods.RegisterMessageCallback(this.Handle, wimMessageCallback); + } + + /// + /// Closes the WIM file. + /// + public void + Close() + { + foreach (WimImage image in Images) + { + image.Close(); + } + + if (null != wimMessageCallback) + { + NativeMethods.UnregisterMessageCallback(this.Handle, wimMessageCallback); + wimMessageCallback = null; + } + + if ((!Handle.IsClosed) && (!Handle.IsInvalid)) + { + Handle.Close(); + } + } + + /// + /// Provides a list of WimImage objects, representing the images in the WIM container file. + /// + public List + Images + { + get + { + if (null == m_imageList) + { + + int imageCount = (int)ImageCount; + m_imageList = new List(imageCount); + for (int i = 0; i < imageCount; i++) + { + + // Load up each image so it's ready for us. + m_imageList.Add( + new WimImage(this, (uint)i + 1)); + } + } + + return m_imageList; + } + } + + /// + /// Provides a list of names of the images in the specified WIM container file. + /// + public List + ImageNames + { + get + { + List nameList = new List(); + foreach (WimImage image in Images) + { + nameList.Add(image.ImageName); + } + return nameList; + } + } + + /// + /// Indexer for WIM images inside the WIM container, indexed by the image number. + /// The list of Images is 0-based, but the WIM container is 1-based, so we automatically compensate for that. + /// this[1] returns the 0th image in the WIM container. + /// + /// The 1-based index of the image to retrieve. + /// WinImage object. + public WimImage + this[int ImageIndex] + { + get { return Images[ImageIndex - 1]; } + } + + /// + /// Indexer for WIM images inside the WIM container, indexed by the image name. + /// WIMs created by different processes sometimes contain different information - including the name. + /// Some images have their name stored in the Name field, some in the Flags field, and some in the EditionID field. + /// We take all of those into account in while searching the WIM. + /// + /// + /// + public WimImage + this[string ImageName] + { + get + { + return + Images.Where(i => ( + i.ImageName.ToUpper() == ImageName.ToUpper() || + i.ImageFlags.ToUpper() == ImageName.ToUpper() )) + .DefaultIfEmpty(null) + .FirstOrDefault(); + } + } + + /// + /// Returns the number of images in the WIM container. + /// + internal uint + ImageCount + { + get { return NativeMethods.WimGetImageCount(Handle); } + } + + /// + /// Returns an XDocument representation of the XML metadata for the WIM container and associated images. + /// + internal XDocument + XmlInfo + { + get + { + + if (null == m_xmlInfo) + { + StringBuilder builder; + uint bytes; + if (!NativeMethods.WimGetImageInformation(Handle, out builder, out bytes)) + { + throw new Win32Exception(); + } + + // Ensure the length of the returned bytes to avoid garbage characters at the end. + int charCount = (int)bytes / sizeof(char); + if (null != builder) + { + // Get rid of the unicode file marker at the beginning of the XML. + builder.Remove(0, 1); + builder.EnsureCapacity(charCount - 1); + builder.Length = charCount - 1; + + // This isn't likely to change while we have the image open, so cache it. + m_xmlInfo = XDocument.Parse(builder.ToString().Trim()); + } + else + { + m_xmlInfo = null; + } + } + + return m_xmlInfo; + } + } + + public NativeMethods.WimFileHandle Handle + { + get; + private set; + } +} + +public class +WimImage +{ + + internal XDocument m_xmlInfo; + + public + WimImage( + WimFile Container, + uint ImageIndex) + { + + if (null == Container) + { + throw new ArgumentNullException("Container"); + } + + if ((Container.Handle.IsClosed) || (Container.Handle.IsInvalid)) + { + throw new ArgumentNullException("The handle to the WIM file has already been closed, or is invalid.", "Container"); + } + + if (ImageIndex > Container.ImageCount) + { + throw new ArgumentOutOfRangeException("ImageIndex", "The index does not exist in the specified WIM file."); + } + + Handle = new NativeMethods.WimImageHandle(Container, ImageIndex); + } + + public enum + Architectures : uint + { + x86 = 0x0, + ARM = 0x5, + IA64 = 0x6, + AMD64 = 0x9, + ARM64 = 0xC + } + + public void + Close() + { + if ((!Handle.IsClosed) && (!Handle.IsInvalid)) + { + Handle.Close(); + } + } + + public NativeMethods.WimImageHandle + Handle + { + get; + private set; + } + + internal XDocument + XmlInfo + { + get + { + + if (null == m_xmlInfo) + { + StringBuilder builder; + uint bytes; + if (!NativeMethods.WimGetImageInformation(Handle, out builder, out bytes)) + { + throw new Win32Exception(); + } + + // Ensure the length of the returned bytes to avoid garbage characters at the end. + int charCount = (int)bytes / sizeof(char); + if (null != builder) + { + // Get rid of the unicode file marker at the beginning of the XML. + builder.Remove(0, 1); + builder.EnsureCapacity(charCount - 1); + builder.Length = charCount - 1; + + // This isn't likely to change while we have the image open, so cache it. + m_xmlInfo = XDocument.Parse(builder.ToString().Trim()); + } + else + { + m_xmlInfo = null; + } + } + + return m_xmlInfo; + } + } + + public string + ImageIndex + { + get { return XmlInfo.Element("IMAGE").Attribute("INDEX").Value; } + } + + public string + ImageName + { + get { return XmlInfo.XPathSelectElement("/IMAGE/NAME").Value; } + } + + public string + ImageEditionId + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/EDITIONID").Value; } + } + + public string + ImageFlags + { + get + { + string flagValue = String.Empty; + + try + { + flagValue = XmlInfo.XPathSelectElement("/IMAGE/FLAGS").Value; + } + catch + { + + // Some WIM files don't contain a FLAGS element in the metadata. + // In an effort to support those WIMs too, inherit the EditionId if there + // are no Flags. + + if (String.IsNullOrEmpty(flagValue)) + { + flagValue = this.ImageEditionId; + + // Check to see if the EditionId is "ServerHyper". If so, + // tweak it to be "ServerHyperCore" instead. + + if (0 == String.Compare("serverhyper", flagValue, true)) + { + flagValue = "ServerHyperCore"; + } + } + + } + + return flagValue; + } + } + + public string + ImageProductType + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/PRODUCTTYPE").Value; } + } + + public string + ImageInstallationType + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/INSTALLATIONTYPE").Value; } + } + + public string + ImageDescription + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DESCRIPTION").Value; } + } + + public ulong + ImageSize + { + get { return ulong.Parse(XmlInfo.XPathSelectElement("/IMAGE/TOTALBYTES").Value); } + } + + public Architectures + ImageArchitecture + { + get + { + int arch = -1; + try + { + arch = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/ARCH").Value); + } + catch { } + + return (Architectures)arch; + } + } + + public string + ImageDefaultLanguage + { + get + { + string lang = null; + try + { + lang = XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/LANGUAGES/DEFAULT").Value; + } + catch { } + + return lang; + } + } + + public Version + ImageVersion + { + get + { + int major = 0; + int minor = 0; + int build = 0; + int revision = 0; + + try + { + major = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/MAJOR").Value); + minor = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/MINOR").Value); + build = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/BUILD").Value); + revision = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/SPBUILD").Value); + } + catch { } + + return (new Version(major, minor, build, revision)); + } + } + + public string + ImageDisplayName + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DISPLAYNAME").Value; } + } + + public string + ImageDisplayDescription + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DISPLAYDESCRIPTION").Value; } + } +} + +/// +///Describes the file that is being processed for the ProcessFileEvent. +/// +public class +DefaultImageEventArgs : EventArgs +{ + /// + ///Default constructor. + /// + public + DefaultImageEventArgs( + IntPtr wideParameter, + IntPtr leftParameter, + IntPtr userData) + { + + WideParameter = wideParameter; + LeftParameter = leftParameter; + UserData = userData; + } + + /// + ///wParam + /// + public IntPtr WideParameter + { + get; + private set; + } + + /// + ///lParam + /// + public IntPtr LeftParameter + { + get; + private set; + } + + /// + ///UserData + /// + public IntPtr UserData + { + get; + private set; + } +} + +/// +///Describes the file that is being processed for the ProcessFileEvent. +/// +public class +ProcessFileEventArgs : EventArgs +{ + /// + ///Default constructor. + /// + ///Fully qualified path and file name. For example: c:\file.sys. + ///Default is false - skip file and continue. + ///Set to true to abort the entire image capture. + public + ProcessFileEventArgs( + string file, + IntPtr skipFileFlag) + { + + m_FilePath = file; + m_SkipFileFlag = skipFileFlag; + } + + /// + ///Skip file from being imaged. + /// + public void + SkipFile() + { + byte[] byteBuffer = + { + 0 + }; + int byteBufferSize = byteBuffer.Length; + Marshal.Copy(byteBuffer, 0, m_SkipFileFlag, byteBufferSize); + } + + /// + ///Fully qualified path and file name. + /// + public string + FilePath + { + get + { + string stringToReturn = ""; + if (m_FilePath != null) + { + stringToReturn = m_FilePath; + } + return stringToReturn; + } + } + + /// + ///Flag to indicate if the entire image capture should be aborted. + ///Default is false - skip file and continue. Setting to true will + ///abort the entire image capture. + /// + public bool Abort + { + set { m_Abort = value; } + get { return m_Abort; } + } + + private string m_FilePath; + private bool m_Abort; + private IntPtr m_SkipFileFlag; + +} + +#endregion WIM Interop + +#region VHD Interop +// Based on code written by the Hyper-V Test team. +/// +/// The Virtual Hard Disk class provides methods for creating and manipulating Virtual Hard Disk files. +/// +public class +VirtualHardDisk +{ + #region Static Methods + + #region Sparse Disks + + /// + /// Abbreviated signature of CreateSparseDisk so it's easier to use from WIM2VHD. + /// + /// The type of disk to create, VHD or VHDX. + /// The path of the disk to create. + /// The maximum size of the disk to create. + /// Overwrite the VHD if it already exists. + public static void + CreateSparseDisk( + NativeMethods.VirtualStorageDeviceType virtualStorageDeviceType, + string path, + ulong size, + bool overwrite) + { + + CreateSparseDisk( + path, + size, + overwrite, + null, + IntPtr.Zero, + (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.DEFAULT_BLOCK_SIZE + : 0, + virtualStorageDeviceType, + NativeMethods.DISK_SECTOR_SIZE); + } + + /// + /// Creates a new sparse (dynamically expanding) virtual hard disk (.vhd). Supports both sync and async modes. + /// The VHD image file uses only as much space on the backing store as needed to store the actual data the VHD currently contains. + /// + /// The path and name of the VHD to create. + /// The size of the VHD to create in bytes. + /// When creating this type of VHD, the VHD API does not test for free space on the physical backing store based on the maximum size requested, + /// therefore it is possible to successfully create a dynamic VHD with a maximum size larger than the available physical disk free space. + /// The maximum size of a dynamic VHD is 2,040 GB. The minimum size is 3 MB. + /// Optional path to pre-populate the new virtual disk object with block data from an existing disk + /// This path may refer to a VHD or a physical disk. Use NULL if you don't want a source. + /// If the VHD exists, setting this parameter to 'True' will delete it and create a new one. + /// If not null, the operation runs in async mode + /// Block size for the VHD. + /// VHD format version (VHD1 or VHD2) + /// Sector size for the VHD. + /// Thrown when an invalid size is specified + /// Thrown when source VHD is not found. + /// Thrown when there was an error while creating the default security descriptor. + /// Thrown when an error occurred while creating the VHD. + public static void + CreateSparseDisk( + string path, + ulong size, + bool overwrite, + string source, + IntPtr overlapped, + uint blockSizeInBytes, + NativeMethods.VirtualStorageDeviceType virtualStorageDeviceType, + uint sectorSizeInBytes) + { + + // Validate the virtualStorageDeviceType + if (virtualStorageDeviceType != NativeMethods.VirtualStorageDeviceType.VHD && virtualStorageDeviceType != NativeMethods.VirtualStorageDeviceType.VHDX) + { + + throw ( + new ArgumentOutOfRangeException( + "virtualStorageDeviceType", + virtualStorageDeviceType, + "VirtualStorageDeviceType must be VHD or VHDX." + )); + } + + // Validate size. It needs to be a multiple of DISK_SECTOR_SIZE (512)... + if ((size % NativeMethods.DISK_SECTOR_SIZE) != 0) + { + + throw ( + new ArgumentOutOfRangeException( + "size", + size, + "The size of the virtual disk must be a multiple of 512." + )); + } + + if ((!String.IsNullOrEmpty(source)) && (!System.IO.File.Exists(source))) + { + + throw ( + new System.IO.FileNotFoundException( + "Unable to find the source file.", + source + )); + } + + if ((overwrite) && (System.IO.File.Exists(path))) + { + + System.IO.File.Delete(path); + } + + NativeMethods.CreateVirtualDiskParameters createParams = new NativeMethods.CreateVirtualDiskParameters(); + + // Select the correct version. + createParams.Version = (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.CreateVirtualDiskVersion.Version1 + : NativeMethods.CreateVirtualDiskVersion.Version2; + + createParams.UniqueId = Guid.NewGuid(); + createParams.MaximumSize = size; + createParams.BlockSizeInBytes = blockSizeInBytes; + createParams.SectorSizeInBytes = sectorSizeInBytes; + createParams.ParentPath = null; + createParams.SourcePath = source; + createParams.OpenFlags = NativeMethods.OpenVirtualDiskFlags.None; + createParams.GetInfoOnly = false; + createParams.ParentVirtualStorageType = new NativeMethods.VirtualStorageType(); + createParams.SourceVirtualStorageType = new NativeMethods.VirtualStorageType(); + + // + // Create and init a security descriptor. + // Since we're creating an essentially blank SD to use with CreateVirtualDisk + // the VHD will take on the security values from the parent directory. + // + + NativeMethods.SecurityDescriptor securityDescriptor; + if (!NativeMethods.InitializeSecurityDescriptor(out securityDescriptor, 1)) + { + + throw ( + new SecurityException( + "Unable to initialize the security descriptor for the virtual disk." + )); + } + + NativeMethods.VirtualStorageType virtualStorageType = new NativeMethods.VirtualStorageType(); + virtualStorageType.DeviceId = virtualStorageDeviceType; + virtualStorageType.VendorId = NativeMethods.VirtualStorageTypeVendorMicrosoft; + + SafeFileHandle vhdHandle; + + uint returnCode = NativeMethods.CreateVirtualDisk( + ref virtualStorageType, + path, + (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.VirtualDiskAccessMask.All + : NativeMethods.VirtualDiskAccessMask.None, + ref securityDescriptor, + NativeMethods.CreateVirtualDiskFlags.None, + 0, + ref createParams, + overlapped, + out vhdHandle); + + vhdHandle.Close(); + + if (NativeMethods.ERROR_SUCCESS != returnCode && NativeMethods.ERROR_IO_PENDING != returnCode) + { + + throw ( + new Win32Exception( + (int)returnCode + )); + } + } + + #endregion Sparse Disks + + #region Fixed Disks + + /// + /// Abbreviated signature of CreateFixedDisk so it's easier to use from WIM2VHD. + /// + /// The type of disk to create, VHD or VHDX. + /// The path of the disk to create. + /// The maximum size of the disk to create. + /// Overwrite the VHD if it already exists. + public static void + CreateFixedDisk( + NativeMethods.VirtualStorageDeviceType virtualStorageDeviceType, + string path, + ulong size, + bool overwrite) + { + + CreateFixedDisk( + path, + size, + overwrite, + null, + IntPtr.Zero, + 0, + virtualStorageDeviceType, + NativeMethods.DISK_SECTOR_SIZE); + } + + /// + /// Creates a fixed-size Virtual Hard Disk. Supports both sync and async modes. This methods always calls the V2 version of the + /// CreateVirtualDisk API, and creates VHD2. + /// + /// The path and name of the VHD to create. + /// The size of the VHD to create in bytes. + /// The VHD image file is pre-allocated on the backing store for the maximum size requested. + /// The maximum size of a dynamic VHD is 2,040 GB. The minimum size is 3 MB. + /// Optional path to pre-populate the new virtual disk object with block data from an existing disk + /// This path may refer to a VHD or a physical disk. Use NULL if you don't want a source. + /// If the VHD exists, setting this parameter to 'True' will delete it and create a new one. + /// If not null, the operation runs in async mode + /// Block size for the VHD. + /// Virtual storage device type: VHD1 or VHD2. + /// Sector size for the VHD. + /// Creating a fixed disk can be a time consuming process! + /// Thrown when an invalid size or wrong virtual storage device type is specified. + /// Thrown when source VHD is not found. + /// Thrown when there was an error while creating the default security descriptor. + /// Thrown when an error occurred while creating the VHD. + public static void + CreateFixedDisk( + string path, + ulong size, + bool overwrite, + string source, + IntPtr overlapped, + uint blockSizeInBytes, + NativeMethods.VirtualStorageDeviceType virtualStorageDeviceType, + uint sectorSizeInBytes) + { + + // Validate the virtualStorageDeviceType + if (virtualStorageDeviceType != NativeMethods.VirtualStorageDeviceType.VHD && virtualStorageDeviceType != NativeMethods.VirtualStorageDeviceType.VHDX) + { + + throw ( + new ArgumentOutOfRangeException( + "virtualStorageDeviceType", + virtualStorageDeviceType, + "VirtualStorageDeviceType must be VHD or VHDX." + )); + } + + // Validate size. It needs to be a multiple of DISK_SECTOR_SIZE (512)... + if ((size % NativeMethods.DISK_SECTOR_SIZE) != 0) + { + + throw ( + new ArgumentOutOfRangeException( + "size", + size, + "The size of the virtual disk must be a multiple of 512." + )); + } + + if ((!String.IsNullOrEmpty(source)) && (!System.IO.File.Exists(source))) + { + + throw ( + new System.IO.FileNotFoundException( + "Unable to find the source file.", + source + )); + } + + if ((overwrite) && (System.IO.File.Exists(path))) + { + + System.IO.File.Delete(path); + } + + NativeMethods.CreateVirtualDiskParameters createParams = new NativeMethods.CreateVirtualDiskParameters(); + + // Select the correct version. + createParams.Version = (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.CreateVirtualDiskVersion.Version1 + : NativeMethods.CreateVirtualDiskVersion.Version2; + + createParams.UniqueId = Guid.NewGuid(); + createParams.MaximumSize = size; + createParams.BlockSizeInBytes = blockSizeInBytes; + createParams.SectorSizeInBytes = sectorSizeInBytes; + createParams.ParentPath = null; + createParams.SourcePath = source; + createParams.OpenFlags = NativeMethods.OpenVirtualDiskFlags.None; + createParams.GetInfoOnly = false; + createParams.ParentVirtualStorageType = new NativeMethods.VirtualStorageType(); + createParams.SourceVirtualStorageType = new NativeMethods.VirtualStorageType(); + + // + // Create and init a security descriptor. + // Since we're creating an essentially blank SD to use with CreateVirtualDisk + // the VHD will take on the security values from the parent directory. + // + + NativeMethods.SecurityDescriptor securityDescriptor; + if (!NativeMethods.InitializeSecurityDescriptor(out securityDescriptor, 1)) + { + throw ( + new SecurityException( + "Unable to initialize the security descriptor for the virtual disk." + )); + } + + NativeMethods.VirtualStorageType virtualStorageType = new NativeMethods.VirtualStorageType(); + virtualStorageType.DeviceId = virtualStorageDeviceType; + virtualStorageType.VendorId = NativeMethods.VirtualStorageTypeVendorMicrosoft; + + SafeFileHandle vhdHandle; + + uint returnCode = NativeMethods.CreateVirtualDisk( + ref virtualStorageType, + path, + (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.VirtualDiskAccessMask.All + : NativeMethods.VirtualDiskAccessMask.None, + ref securityDescriptor, + NativeMethods.CreateVirtualDiskFlags.FullPhysicalAllocation, + 0, + ref createParams, + overlapped, + out vhdHandle); + + vhdHandle.Close(); + + if (NativeMethods.ERROR_SUCCESS != returnCode && NativeMethods.ERROR_IO_PENDING != returnCode) + { + + throw ( + new Win32Exception( + (int)returnCode + )); + } + } + + #endregion Fixed Disks + + #endregion Static Methods + +} +#endregion VHD Interop +} +"@ + + Add-Type -TypeDefinition $code -ReferencedAssemblies "System.Xml", "System.Linq", "System.Xml.Linq" -ErrorAction SilentlyContinue +} + +# This is required for renewed "Mount-RegistryHive" and "Dismount-RegistryHive" +# functions using Windows API. Code borrowed from +# http://www.leeholmes.com/blog/2010/09/24/adjusting-token-privileges-in-powershell/ + +Function +Set-TokenPrivilege { + param( + + # The privilege to adjust. This set is taken from + # http://msdn.microsoft.com/library/bb530716 + + [ValidateSet( + + "SeAssignPrimaryTokenPrivilege", + "SeAuditPrivilege", + "SeBackupPrivilege", + "SeChangeNotifyPrivilege", + "SeCreateGlobalPrivilege", + "SeCreatePagefilePrivilege", + "SeCreatePermanentPrivilege", + "SeCreateSymbolicLinkPrivilege", + "SeCreateTokenPrivilege", + "SeDebugPrivilege", + "SeEnableDelegationPrivilege", + "SeImpersonatePrivilege", + "SeIncreaseBasePriorityPrivilege", + "SeIncreaseQuotaPrivilege", + "SeIncreaseWorkingSetPrivilege", + "SeLoadDriverPrivilege", + "SeLockMemoryPrivilege", + "SeMachineAccountPrivilege", + "SeManageVolumePrivilege", + "SeProfileSingleProcessPrivilege", + "SeRelabelPrivilege", + "SeRemoteShutdownPrivilege", + "SeRestorePrivilege", + "SeSecurityPrivilege", + "SeShutdownPrivilege", + "SeSyncAgentPrivilege", + "SeSystemEnvironmentPrivilege", + "SeSystemProfilePrivilege", + "SeSystemtimePrivilege", + "SeTakeOwnershipPrivilege", + "SeTcbPrivilege", + "SeTimeZonePrivilege", + "SeTrustedCredManAccessPrivilege", + "SeUndockPrivilege", + "SeUnsolicitedInputPrivilege" + )] + $Privilege, + + # The process on which to adjust the privilege. Defaults to the current process. + $ProcessId = $pid, + + # Switch to disable the privilege, rather than enable it. + [Switch] + $Disable + ) + + # Taken from P/Invoke.NET with minor adjustments. + $Definition = @' + + using System; + + using System.Runtime.InteropServices; + public class AdjPriv + + { + + [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] + + internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, + + ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen); + [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] + + internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok); + [DllImport("advapi32.dll", SetLastError = true)] + + internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid); + [StructLayout(LayoutKind.Sequential, Pack = 1)] + + internal struct TokPriv1Luid + + { + public int Count; + public long Luid; + public int Attr; + } + + internal const int SE_PRIVILEGE_ENABLED = 0x00000002; + internal const int SE_PRIVILEGE_DISABLED = 0x00000000; + internal const int TOKEN_QUERY = 0x00000008; + + internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; + public static bool EnablePrivilege(long processHandle, string privilege, bool disable) + + { + + bool retVal; + TokPriv1Luid tp; + IntPtr hproc = new IntPtr(processHandle); + IntPtr htok = IntPtr.Zero; + retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok); + tp.Count = 1; + tp.Luid = 0; + if(disable) + + { + tp.Attr = SE_PRIVILEGE_DISABLED; + } + + else + + { + tp.Attr = SE_PRIVILEGE_ENABLED; + } + + retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid); + retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero); + return retVal; + } + } +'@ + + $processHandle = ( Get-Process -Id $ProcessId ).Handle + + $Type = Add-Type -TypeDefinition $Definition -PassThru + + $Type[0]::EnablePrivilege( $ProcessHandle, $Privilege, $Disable ) +} + +# In version 10.0.14300.1000, the below two functions were changed from leveraging +# reg.exe to native Windows API. + +Function +Mount-RegistryHive { + [CmdletBinding()] + param( + [Parameter( + Mandatory = $True, + ValueFromPipeline = $True, + Position = 0 + )] + [System.IO.FileInfo] + [ValidateNotNullOrEmpty()] + [ValidateScript( + { $_.Exists } + )] + $Hive + ) + + $mountKey = [System.Guid]::NewGuid().ToString() + + Try { + $Definition = @" + +[DllImport("advapi32.dll", SetLastError=true)] +public static extern long RegLoadKey(int hKey, String lpSubKey, String lpFile); + +"@ + + $TokenPrivilege = Set-TokenPrivilege -Privilege "SeBackupPrivilege" + $TokenPrivilege = Set-TokenPrivilege -Privilege "SeRestorePrivilege" + + $HKLM = 0x80000002 + + $Reg = Add-Type -MemberDefinition $Definition -Name "ClassLoad" -Namespace "Win32Functions" -PassThru + + $Result = $Reg::RegLoadKey( $HKLM, $mountKey, $Hive ) + + } + Catch { + Throw + } + + # Set a global variable containing the name of the mounted registry key + # so we can unmount it if there's an error. + $global:mountedHive = $mountKey + + return $mountKey +} + +Function +Dismount-RegistryHive { + [CmdletBinding()] + param( + [Parameter( + Mandatory = $True, + ValueFromPipeline = $True, + Position = 0 + )] + [string] + [ValidateNotNullOrEmpty()] + $HiveMountPoint + ) + + Try { + $Definition = @" + +[DllImport("advapi32.dll", SetLastError=true)] +public static extern int RegUnLoadKey(Int32 hKey,string lpSubKey); + +"@ + + $TokenPrivilege = Set-TokenPrivilege -Privilege "SeBackupPrivilege" + $TokenPrivilege = Set-TokenPrivilege -Privilege "SeRestorePrivilege" + + $HKLM = 0x80000002 + + $Reg = Add-Type -MemberDefinition $Definition -Name "ClassUnload" -Namespace "Win32Functions" -PassThru + + $Result = $Reg::RegUnLoadKey( $HKLM, $HiveMountPoint ) + + } + Catch { + Throw + } + + $global:mountedHive = $null +} + +<# + .SYNOPSIS + Short function to determine whether the logged-on user is an administrator. + + .EXAMPLE + Do you honestly need one? There are no parameters! + + .OUTPUTS + $true if user is admin. + $false if user is not an admin. +#> + +Function +Test-Admin { + [CmdletBinding()] + param() + + $currentUser = New-Object -TypeName "Security.Principal.WindowsPrincipal" -ArgumentList $( [Security.Principal.WindowsIdentity]::GetCurrent() ) + + $isAdmin = $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) + + Write-Debug -Message " is current user Admin? $isAdmin" + + Return $isAdmin +} + +Function +Get-WindowsBuildNumber { + $os = Get-CimInstance -ClassName "Win32_OperatingSystem" -Verbose:$False + Return [int]($os.BuildNumber) +} + +Function +Test-WindowsVersion { + $isWin8 = ( Get-WindowsBuildNumber ) -ge [int]$lowestSupportedBuild + + Write-Debug -Message " is current OS supported? $isWin8" + + Return $isWin8 +} + +<# + .SYNOPSIS + Runs an external executable file, and validates the error level. + + .PARAMETER Executable + The path to the executable to run and monitor. + + .PARAMETER Arguments + An array of arguments to pass to the executable when it's executed. + + .PARAMETER SuccessfulErrorCode + The error code that means the executable ran successfully. + The default value is 0. +#> + +Function +Start-Executable { + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [string] + [ValidateNotNullOrEmpty()] + $Executable, + + [Parameter(Mandatory = $true)] + [string[]] + [ValidateNotNullOrEmpty()] + $Arguments, + + [Parameter()] + [int] + [ValidateNotNullOrEmpty()] + $SuccessfulErrorCode = 0 + ) + + Write-Debug -Message " Running `"$Executable`" with parameters: `"$Arguments`"" + + $StartProcessParam = @{ + + FilePath = $Executable + ArgumentList = $Arguments + NoNewWindow = $True + Wait = $True + RedirectStandardOutput = [io.path]::combine( $TempDirectory, $scriptName, $sessionKey, "$Executable-StandardOutput.txt" ) + RedirectStandardError = [io.path]::combine( $TempDirectory, $scriptName, $sessionKey, "$Executable-StandardError.txt" ) + Passthru = $True + } + $ret = Start-Process @StartProcessParam + + Write-Debug -Message " Return code was $($ret.ExitCode)." + + If ($ret.ExitCode -ne $SuccessfulErrorCode) { + throw "$Executable failed with code $($ret.ExitCode)!" + } +} + +<# + .SYNOPSIS + Determines whether or not a given path is a network location or a local drive. + + .DESCRIPTION + Function to determine whether or not a specified path is a local path, a UNC path, + or a mapped network drive. + + .PARAMETER Path + The path that we need to figure stuff out about, +#> + +Function +Test-IsNetworkLocation { + [CmdletBinding()] + param( + [Parameter(ValueFromPipeLine = $true)] + [string] + [ValidateNotNullOrEmpty()] + $Path + ) + + $Result = $False + + If ([Bool]( [URI]$Path ).IsUNC) { + $Result = $True + } + else { + $driveInfo = [IO.DriveInfo]( ( Resolve-Path -Path $Path ).Path ) + + If ($driveInfo.DriveType -eq "Network") { + $Result = $True + } + } + + Return $Result +} + +# Import module silently + +Function +Import-ModuleEx { + + #region Data + + [cmdletbinding()] + + Param( + + [parameter( + ParameterSetName = "Name", + Mandatory = $True + )] + [System.String] + $Name, + [parameter( + ParameterSetName = "ModuleInfo", + Mandatory = $True + )] + [System.Management.Automation.PSModuleInfo] + $ModuleInfo + ) + + #endregion Data + + #region Code + + # When we have $VerbosePreference defined as "Continue" and import + # a module (either implicitly, by firt use, or explictily, calling + # "Import-Module"), there's a lot of Verbose output listing every cmdlet + # and every function. This output provides no value, thus we need + # to suppress it. Unfortunately, even if we pass "-Verobse:$False" + # to "Import-Module", it only helps to swallow the list of cmdlets. + # The list of functions is still thrown to output. (This is probably + # a bug). Thus, we need to temporary change $VerbosePreference. + + $VerbosePreferenceCurrent = $VerbosePreference + $Global:VerbosePreference = "SilentlyContinue" + + If (Test-Path -Path "Variable:\ModuleInternal") { + # $Item = Remove-Item -Path "Variable:\ModuleInternal" -Confirm:$false + + # Remove-Variable -Name "Module" -Scope "Global" + # Remove-Variable -Name "Module" -Scope "Local" + Remove-Variable -Name "Module" -Scope "Script" + } + + Switch ($PsCmdlet.ParameterSetName) { + "Name" { + If (( Get-Module -Name $Name -ListAvailable ) -Or + ( Test-Path -Path $Name )) { + $ModuleInternal = Import-Module -Name $Name -PassThru -WarningAction Ignore + } + } + + "ModuleInfo" { + $ModuleInternal = Import-Module -ModuleInfo $ModuleInfo -PassThru -WarningAction Ignore + } + } + + $Global:VerbosePreference = $VerbosePreferenceCurrent + + If (Test-Path -Path "Variable:\ModuleInternal") { + Return $ModuleInternal + } + + #endregion Code + +} diff --git a/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/PSGetModuleInfo.xml b/deployment/dsc/azshcihost/Hyper-ConvertImage/10.2/PSGetModuleInfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..b56eecf91d50dd33a194d3da8fb5edf2ec171f29 GIT binary patch literal 11062 zcmeHNZEqS!5Z=#~`X5gD(pD8190$LMA|bnRP;J)=B$3)w7U9Jq#h7w9uA}_+w$HP} zX7BcPkGllLl@cM2<92s;-e-2^{{5$^epRp38x^ZaJy#>Oz}-Y$tC{*qJy3O3)!&-_ zeSkTCt1C6dXspLyt0g{jb)dHJiPb>828=7!$9)yQ6FgY}T8!@)GpqQ2jptifbFFSy z`*F<_pDnemYWVEnj@JjOrM^|)VAn_)JR|iKv&X8Vh8lxfYL?9GsWYrtH_yy%sZ$T0 z=O6IvYMO{&RUK;VN#6|nlg4w^)jN?Ma&C#=g}MWNOU;Q6W{&Z!37UEddbqpApoY6v6TlXGo#qoH&6pT;x zx}fe%OXv*vUV#!y^9ksj<9?wknwK;6R{vXqU!;o^b08ISK4(+Kzmk236 zYW2zT-(uQZVMiFJ;N}o~o#tX>*B)UW^?w1$%s|SEE^A%5%`k3@W70pT7c~O{i@Qk=zV&zin_xHf~ z2XKUbtgafkBQM*4ImNG?OOBG0F}{nHWb^oT1bG;JKhJ2(5hx??$VcwXZw225uG?xK zYwP$uz;#bwYwAag)^N`&sU>`$ZHQMeJJXlZ&-67t)JD6r>u>8Bzicf|b`wnN8q*zp z-31o(`v>Zw#&k#Rf`5CUU9hZIvM{eK+J_W{etvxr;)=glvE^1|| zBK2+*%g*Y-|8yaJTI>w=-TI*EJv?DF6CSv;Ot#`e6pnVF!`s?Mx!U{-t>GM@FKd|s zZz~vm!z-JhexkjRMCWJF_~FWbr0sdj>k-ncPXJ5e06p0=%`aMvf9*3wu1>;_(aXQV zI_4^7ZA<%7=9Dq~0JF+V?7=9<7-{oIdZAaCQ-OT0F<#NO+t=8{SXDIB5S+3ccKOr+ zWX2?eXNbnMPw4^6OJJ7uA`gRJq^UKuoY&!+7Bn`QMJ8?IclF0wtM$QPR9=9FyN_C( z#30XS$XLiKo9YCV<@v0p&KDV-me7*f$~t{Hq_Im`(N^y;pK+KN6q%pRz>BTqDWOP4 zY3w>gF?S331badf%O*btu=E?)H#3c_4yI37hBtzPFM@@2)~s=LkeL^AAF**cS2DkR z0-a*6D^_fB?0gyLYq;o8){YHF!(P7$-+s78zZm)aunpI!Q6^9N1@zu&`+ltTk^W6+ zU#BgCZQ6&}h?$k(qo5ZtcnL&OFXv&OU-A30Bm{vH(n@!x%%(k2{`QO)K9LmRi$L94 z>kZ7jkewK8xo5syn`_1momsg*)p|by{e46-Mk>Z!#xe1vdA>%V7T1BsJ?OxCjUjjM zQv!14GnJYm`sMo1JiFVy2cGBqAFI`0vfUjastmNJW5toNo!RN8rN4I%(*OTk+zW7g zfojbdo{kl#O>=$!E7v_4#vx9lL!Dtsy?2w5g>_WcltL#|>vJ}lUwjTtr*4L_K8}SV zmwPJobqS8)ah9l3(i)^zpRPfN&&M`{WUj`nm|5}&xf@TolEd5Tc7!u8tDzJ0WTZ08 z4nPFU6FW2&;&c@_LY``Bjtg~xwX6Zwz>SNT`Bqq9T6x;3u@?C3we)PZ40JLL@hF&VEpZTht^UpLb7 zb2~y^$i+mY6WkBL6>}~i9j2FN>K?a{x(hA8GjK(0CcH;F8*XFu z5HJk)$ct0J<7rZAS$#luPdcoD=j)5RB78oU96fs?_0hb^&Rx>ux@T?SQGVx7@Xo7& zhB|t7XRGA{Xz}Ojf%x{9y2jU@+YBBcWIH~-Enq8u!RpvG9N|2jtl_p{!OWT2!=(N4 zo>uc1|E4+`mEGyfh+{rJv!8SVzDev}I=yIewFe2X7gC0&gxc1%Z`RgWk)#Yay$id| z_Fa%8So$rrftfvhETcawth2_EY6O74|P9xyt`8^=~0sJld#vZ`8P^@9=-#sVNOe5 znLM#^|1tEse8lW%%fAA*4s%FQokycH2QL*oSTnL0JV7+QWB + + + + MSCatalogUpdate + + MSCatalogUpdate + + + + + + + + + + + + + + + + + + + + + + + + Title + + + Products + + + Classification + + + Get-Date -Date $_.LastUpdated -Format "yyyy/MM/dd" + + + Size + + + + + + + + \ No newline at end of file diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/MSCatalog.psd1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/MSCatalog.psd1 new file mode 100644 index 0000000..3608bdc --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/MSCatalog.psd1 @@ -0,0 +1,122 @@ +# +# Module manifest for module 'MSCatalog' +# + +@{ + + # Script module or binary module file associated with this manifest. + RootModule = 'MSCatalog.psm1' + + # Version number of this module. + ModuleVersion = '0.21.0' + + # Supported PSEditions + # CompatiblePSEditions = @() + + # ID used to uniquely identify this module + GUID = 'e30d3bed-1a89-41f0-b058-339a17dffd69' + + # Author of this module + Author = 'Ryan Kowalewski' + + # Company or vendor of this module + CompanyName = '' + + # Copyright statement for this module + Copyright = '(c) 2019 Ryan Kowalewski. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'PowerShell module for searching and downloading offline updates from https://www.catalog.update.microsoft.com' + + # Minimum version of the Windows PowerShell engine required by this module + # PowerShellVersion = '' + + # Name of the Windows PowerShell host required by this module + # PowerShellHostName = '' + + # Minimum version of the Windows PowerShell host required by this module + # PowerShellHostVersion = '' + + # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # DotNetFrameworkVersion = '' + + # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # CLRVersion = '' + + # Processor architecture (None, X86, Amd64) required by this module + # ProcessorArchitecture = '' + + # Modules that must be imported into the global environment prior to importing this module + # RequiredModules = @() + + # Assemblies that must be loaded prior to importing this module + # RequiredAssemblies = @() + + # Script files (.ps1) that are run in the caller's environment prior to importing this module. + # ScriptsToProcess = @() + + # Type files (.ps1xml) to be loaded when importing this module + # TypesToProcess = @() + + # Format files (.ps1xml) to be loaded when importing this module + FormatsToProcess = @( + '.\Format\MSCatalogUpdate.Format.ps1xml' + ) + + # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess + # NestedModules = @() + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @( + 'Get-MSCatalogUpdate', + 'Save-MSCatalogUpdate' + ) + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + #CmdletsToExport = '*' + + # Variables to export from this module + #VariablesToExport = '*' + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + #AliasesToExport = '*' + + # DSC resources to export from this module + # DscResourcesToExport = @() + + # List of all modules packaged with this module + # ModuleList = @() + + # List of all files packaged with this module + # FileList = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + # Tags = @() + + # A URL to the license for this module. + # LicenseUri = '' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/ryan-jan/MSCatalog' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + # ReleaseNotes = '' + + } # End of PSData hashtable + + } # End of PrivateData hashtable + + # HelpInfo URI of this module + # HelpInfoURI = '' + + # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. + # DefaultCommandPrefix = '' +} diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/MSCatalog.psm1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/MSCatalog.psm1 new file mode 100644 index 0000000..24f8478 --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/MSCatalog.psm1 @@ -0,0 +1,27 @@ + +try { + if (!([System.Management.Automation.PSTypeName]'HtmlAgilityPack.HtmlDocument').Type) { + if ($PSVersionTable.PSEdition -eq "Desktop") { + Add-Type -Path "$PSScriptRoot\Types\Net45\HtmlAgilityPack.dll" + } else { + Add-Type -Path "$PSScriptRoot\Types\netstandard2.0\HtmlAgilityPack.dll" + } + } +} catch { + $Err = $_ + throw $Err +} + +$Public = @(Get-ChildItem -Path $PSScriptRoot\Public\*.ps1) +$Private = @(Get-ChildItem -Path $PSScriptRoot\Private\*.ps1) +$Classes = @(Get-ChildItem -Path $PSScriptRoot\Classes\*.ps1) + +foreach ($Module in ($Public + $Private + $Classes)) { + try { + . $Module.FullName + } catch { + Write-Error -Message "Failed to import function $($Module.FullName): $_" + } +} + +Export-ModuleMember -Function $Public.BaseName diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/PSGetModuleInfo.xml b/deployment/dsc/azshcihost/MSCatalog/0.21.0/PSGetModuleInfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb2c5373fa09c453caec5d1ac12340943a190474 GIT binary patch literal 11148 zcmeHNTTdHD6h6&MzcjnBw&$-OM|J3AHIhS`bmXf@ZzKn2pB?GyYpXHHMrEI?I=JyfC z{4F#8Op9y@EJ>2-U7yrbZ}qB?-ibm0Bwx#1xA+fe}Lx|%o)i0*?OFF zjZZ~3WF4PP-0}KI_T+o{4y%^L;#rbYjJ}Yj^b7{;-Y6Z}mSfCVG|rCQlcNBhCv*H- zh9=@ymVJXg>AS`Hr13;rW+l=?&Q0(;l6&AcF`Q^(v@l~ln^6Wn zgx`@%1EG(5a;`2@1D&f+W-`+C_wk0a$yt?VAAFuHwdSIEivMwnf*NpbrJgBOEl_uC zBy8 z6nOP>uyS)77)OmCK^DWgM2JyHcS_)agI_W_F#?aqfYJdBTFwc8@V-{ z>foP!Pg}acQ~vK`{1of=3|EN}VbkVraA)mvJhRaEfcGB!>UuILdl2&MHZCp47uD0Z zz+hx#ehMCwqLREY^icABU@?|IK|v9SYIQ>c6*ze4>D6Ao7QEHclKa|)H z;K+}_kp8DCPjQ!zbr~b-pyL|94ib4kGFm}DdWX9ncpb;80gqty`UEmKH!>X?f76o& zXrd1xe#DF4HDFi8bzOEaw<=E{*T=wj7jJjuCp=%rJ+EAq@I(5qwr*FZhobkOTqv33 z%4siJ&3Id9Rl1sDsyJ>MOt*mrxw?z*Hm;laR|eLP@w+KohKgdCt7i#&9EXQbT?29+ z!#=J--@QCHHZuVgY05UDlsU+ueI?EjJ5RBuBtB=K3DaTy7o{DNbrJ`MhriqW0{Ktj zEj|avE2BMAXwNDzTC^8ssUr31y(v4Y4gb@Erqg2SY4_$f*2WX=QObk#C>w*MAu30k z(ButcqnvI3#pZB~(wDVNg;$C0sqvXLP=5s-w>JGUu_O5QTnTyvfA%3@b-@k#g}%Hr z{G!E#=e~rmY|d9c!RP_}u|^@B}DJy3` z_ek1(Sk7_1P`tBpW=x~|EhBZ!xR_5ohujzea6e`|V0}_n*DY3GQicsg>-jR|?h(gL zsdusA3(#|KZ0G>orxYyhlwT+huv97}-%j1Gla=6B)KYzj+&45+4B2kjUnC(YUNNmq zkJQnm^BFiXL41_Wh?2g$2v_VHYELcb4I|H0K_&)8sLQiIhhatX^`*Apz2%?X=bS#B z8hh%S?2?(nx!Di7$J`qqx=P*JegNHCtcedT0lzj_TyYunpvf0&wyCf~}!us|@+-qH0vmw$Et6vjNx_fj9{%S_WDuSyibg=3bG~o_a znwTeJ>}+Go5T3+^nd&odjUv!aFry1!s@#DI){*-%W@deh&{w|->kICjK*RWA z*QI10$l4COEbLr8L6>J48q!@)AKv!T@K_CS9=HXWewazFYPwKc=t?bz;Slusy*g6L zy|;ocoStG}AFPD#RjLW@AoUxBV1vmpq}M+LP@QZ^7efN89PpZ%cU&M%E)x zKn&H&djY?iJ}*+#`jY1w*fZE$a7JJm88l&Ij05Rcleq#{xiIuFb65@{y~GW8y4(qu z&|Y-_ZZd!2en?+Htg?0MGJHPIAu&_w%E#b{A>Q9W%JH{7^L8KW(eIGzv77~9otihy z1GG!Yvsrdd890m!!b$qIFpOmW7sAAckQ{CC&@*!%Az{03bU{;5o3~KX^NV#5lC#A?=?T1>((^lk(#(&JJM%afpfZsaaKF4#OjjUtW zqP=ME!RCKujAVBDac+@>cx)i@6im_i%lLq2*tMIWiT2tz=WTkpp5wj;iB*CB4)*Ca z?ATR!8J;dW$8`%&*Gy#e6eH-7dw6?+>o!K`tT=__AFAUDzJ|T z;|#P>VwBq%@caO6q3@&z;?pyukzM@fxeo4V9QWGjhDMn5xVDPm&Un(oT{oI@vYze? XT=LHxruUF6C(;~n|HqIH>vI1A{mZ{9 literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Get-UpdateLinks.ps1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Get-UpdateLinks.ps1 new file mode 100644 index 0000000..d5b52b3 --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Get-UpdateLinks.ps1 @@ -0,0 +1,26 @@ +function Get-UpdateLinks { + [CmdLetBinding()] + param ( + [Parameter( + Mandatory = $true, + Position = 0 + )] + [String] $Guid + ) + + $Post = @{size = 0; updateID = $Guid; uidInfo = $Guid} | ConvertTo-Json -Compress + $Body = @{updateIDs = "[$Post]"} + + $Params = @{ + Uri = "https://www.catalog.update.microsoft.com/DownloadDialog.aspx" + Method = "Post" + Body = $Body + ContentType = "application/x-www-form-urlencoded" + UseBasicParsing = $true + } + $DownloadDialog = Invoke-WebRequest @Params + $Links = $DownloadDialog.Content.Replace("www.download.windowsupdate", "download.windowsupdate") + $Regex = "(http[s]?\://dl\.delivery\.mp\.microsoft\.com\/[^\'\""]*)|(http[s]?\://download\.windowsupdate\.com\/[^\'\""]*)" + $Links = $Links | Select-String -AllMatches -Pattern $Regex + $Links +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-CatalogRequest.ps1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-CatalogRequest.ps1 new file mode 100644 index 0000000..66897f7 --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-CatalogRequest.ps1 @@ -0,0 +1,61 @@ +function Invoke-CatalogRequest { + [CmdletBinding()] + param ( + [parameter(Mandatory = $true)] + [string] $Uri, + + [Parameter(Mandatory = $false)] + [string] $Method = "Get", + + [Parameter(Mandatory = $false)] + [string] $EventArgument, + + [Parameter(Mandatory = $false)] + [string] $EventTarget, + + [Parameter(Mandatory = $false)] + [string] $EventValidation, + + [Parameter(Mandatory = $false)] + [string] $ViewState, + + [Parameter(Mandatory = $false)] + [string] $ViewStateGenerator + ) + + try { + if ($Method -eq "Post") { + $ReqBody = @{ + "__EVENTARGUMENT" = $EventArgument + "__EVENTTARGET" = $EventTarget + "__EVENTVALIDATION" = $EventValidation + "__VIEWSTATE" = $ViewState + "__VIEWSTATEGENERATOR" = $ViewStateGenerator + } + } + $Params = @{ + Uri = [Uri]::EscapeUriString($Uri) + Method = $Method + Body = $ReqBody + ContentType = "application/x-www-form-urlencoded" + UseBasicParsing = $true + ErrorAction = "Stop" + } + $Results = Invoke-WebRequest @Params + $HtmlDoc = [HtmlAgilityPack.HtmlDocument]::new() + $HtmlDoc.LoadHtml($Results.RawContent.ToString()) + $NoResults = $HtmlDoc.GetElementbyId("ctl00_catalogBody_noResultText") + if ($null -eq $NoResults) { + [MSCatalogResponse]::new($HtmlDoc) + } else { + throw "No results found." + } + } catch { + if ($_.Exception.Message -eq "No results found.") { + Write-Warning "$($NoResults.InnerText)$($Uri.Split("q=")[-1])" + break + } else { + throw $_ + } + } +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-DownloadFile.ps1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-DownloadFile.ps1 new file mode 100644 index 0000000..333ba76 --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-DownloadFile.ps1 @@ -0,0 +1,24 @@ +function Invoke-DownloadFile { + [CmdLetBinding()] + param ( + [uri] $Uri, + [string] $Path, + [switch] $UseBits + ) + + try { + if ($UseBits) { + Start-BitsTransfer -Source $Uri -Destination $Path + } else { + $WebClient = [System.Net.WebClient]::new() + $WebClient.DownloadFile($Uri, $Path) + $WebClient.Dispose() + } + } catch { + $Err = $_ + if ($WebClient) { + $WebClient.Dispose() + } + throw $Err + } +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-ParseDate.ps1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-ParseDate.ps1 new file mode 100644 index 0000000..1b9370d --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Invoke-ParseDate.ps1 @@ -0,0 +1,8 @@ +function Invoke-ParseDate { + param ( + [String] $DateString + ) + + $Array = $DateString.Split("/") + Get-Date -Year $Array[2] -Month $Array[0] -Day $Array[1] +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Sort-CatalogResults.ps1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Sort-CatalogResults.ps1 new file mode 100644 index 0000000..8696e8f --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Private/Sort-CatalogResults.ps1 @@ -0,0 +1,76 @@ +function Sort-CatalogResults { + [CmdletBinding()] + param ( + [Parameter(Mandatory = $true)] + [string] $Uri, + + [Parameter(Mandatory = $false)] + [ValidateSet("Title", "Products", "Classification", "LastUpdated", "Size")] + [string] $SortBy, + + [Parameter(Mandatory = $false)] + [switch] $Descending, + + [Parameter(DontShow)] + [string] $EventArgument, + + [Parameter(DontShow)] + [string] $EventValidation, + + [Parameter(DontShow)] + [string] $ViewState, + + [Parameter(DontShow)] + [string] $ViewStateGenerator + ) + + $EventTarget = switch ($SortBy) { + {$_ -eq "Title"} {'ctl00$catalogBody$updateMatches$ctl02$titleHeaderLink'} + {$_ -eq "Products"} {'ctl00$catalogBody$updateMatches$ctl02$productsHeaderLink'} + {$_ -eq "Classification"} {'ctl00$catalogBody$updateMatches$ctl02$classHeaderLink'} + {$_ -eq "LastUpdated"} {'ctl00$catalogBody$updateMatches$ctl02$dateHeaderLink'} + {$_ -eq "Size"} {'ctl00$catalogBody$updateMatches$ctl02$sizeHeaderLink'} + } + + $Params = @{ + Uri = $Uri + Method = "Post" + EventArgument = $EventArgument + EventTarget = $EventTarget + EventValidation = $EventValidation + ViewState = $ViewState + ViewStateGenerator = $ViewStateGenerator + } + $Res = Invoke-CatalogRequest @Params + + # By default the LastUpdated field is sorted in descending order from the catalog website the first time you + # issue the sort POST request. All the other fields are sorted in ascending order first as you would expect. + # To ensure that this sort function is predictable we re-request the sorted request if the SortBy parameter is LastUpdated + # and the Descending parameter is $false in order to return the results sorted in ascending order which is what would + # be expected. + if (($SortBy -eq "LastUpdated") -and -not $Descending) { + $Params = @{ + Uri = $Uri + Method = "Post" + EventArgument = $Res.EventArgument + EventTarget = $EventTarget + EventValidation = $Res.EventValidation + ViewState = $Res.ViewState + ViewStateGenerator = $Res.ViewStateGenerator + } + $Res = Invoke-CatalogRequest @Params + } elseif (($SortBy -ne "LastUpdated") -and $Descending) { + $Params = @{ + Uri = $Uri + Method = "Post" + EventArgument = $Res.EventArgument + EventTarget = $EventTarget + EventValidation = $Res.EventValidation + ViewState = $Res.ViewState + ViewStateGenerator = $Res.ViewStateGenerator + } + $Res = Invoke-CatalogRequest @Params + } + + $Res +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Public/Get-MSCatalogUpdate.ps1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Public/Get-MSCatalogUpdate.ps1 new file mode 100644 index 0000000..2f1b45d --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Public/Get-MSCatalogUpdate.ps1 @@ -0,0 +1,161 @@ +function Get-MSCatalogUpdate { + <# + .SYNOPSIS + Query catalog.update.micrsosoft.com for available updates. + + .DESCRIPTION + Given that there is currently no public API available for the catalog.update.micrsosoft.com site, this + command makes HTTP requests to the site and parses the returned HTML for the required data. + + .PARAMETER Search + Specify a string to search for. + + .PARAMETER SortBy + Specify a field to sort the results by. The default sort is by LastUpdated and in descending order. + + .PARAMETER Descending + Switch the sort order to descending. + + .PARAMETER Strict + Force a Search paramater with multiple words to be treated as a single string. + + .PARAMETER IncludeFileNames + Include the filenames for the files as they would be downloaded from catalog.update.micrsosoft.com. + This option will cause an extra web request for each update included in the results. It is best to only + use this option with a very narrow search term. + + .PARAMETER AllPages + By default the Get-MSCatalogUpdate command returns the first page of results from catalog.update.micrsosoft.com, which is + limited to 25 updates. If you specify this switch the command will instead return all pages of search results. + This can result in a significant increase in the number of HTTP requests to the catalog.update.micrsosoft.com endpoint. + + .EXAMPLE + Get-MSCatalogUpdate -Search "Cumulative for Windows Server, version 1903" + + .EXAMPLE + Get-MSCatalogUpdate -Search "Cumulative for Windows Server, version 1903" -SortBy "Title" -Descending + + .EXAMPLE + Get-MSCatalogUpdate -Search "Cumulative for Windows Server, version 1903" -Strict + + .EXAMPLE + Get-MSCatalogUpdate -Search "Cumulative for Windows Server, version 1903" -IncludeFileNames + + .EXAMPLE + Get-MSCatalogUpdate -Search "Cumulative for Windows Server, version 1903" -AllPages + #> + + [CmdLetBinding()] + param ( + [Parameter(Mandatory = $true)] + [string] $Search, + + [Parameter(Mandatory = $false)] + [ValidateSet("Title", "Products", "Classification", "LastUpdated", "Size")] + [string] $SortBy, + + [Parameter(Mandatory = $false)] + [switch] $Descending, + + [Parameter(Mandatory = $false)] + [switch] $Strict, + + [Parameter(Mandatory = $false)] + [switch] $IncludeFileNames, + + [Parameter(Mandatory = $false)] + [switch] $AllPages + ) + + try { + $ProgPref = $ProgressPreference + $ProgressPreference = "SilentlyContinue" + + $Uri = "https://www.catalog.update.microsoft.com/Search.aspx?q=$Search" + $Res = Invoke-CatalogRequest -Uri $Uri + + if ($PSBoundParameters.ContainsKey("SortBy")) { + $SortParams = @{ + Uri = $Uri + SortBy = $SortBy + Descending = $Descending + EventArgument = $Res.EventArgument + EventValidation = $Res.EventValidation + ViewState = $Res.ViewState + ViewStateGenerator = $Res.ViewStateGenerator + } + $Res = Sort-CatalogResults @SortParams + } else { + # Default sort is by LastUpdated and in descending order. + $SortParams = @{ + Uri = $Uri + SortBy = "LastUpdated" + Descending = $true + EventArgument = $Res.EventArgument + EventValidation = $Res.EventValidation + ViewState = $Res.ViewState + ViewStateGenerator = $Res.ViewStateGenerator + } + $Res = Sort-CatalogResults @SortParams + } + + $Rows = $Res.Rows + + if ($Strict -and -not $AllPages) { + $StrictRows = $Rows.Where({ + $_.SelectNodes("td")[1].innerText.Trim() -like "*$Search*" + }) + # If $NextPage is $null then there are more pages to collect. It is arse backwards but trust me. + while (($StrictRows.Count -lt 25) -and ($Res.NextPage -eq "")) { + $NextParams = @{ + Uri = $Uri + EventArgument = $Res.EventArgument + EventTarget = 'ctl00$catalogBody$nextPageLinkText' + EventValidation = $Res.EventValidation + ViewState = $Res.ViewState + ViewStateGenerator = $Res.ViewStateGenerator + Method = "Post" + } + $Res = Invoke-CatalogRequest @NextParams + $StrictRows += $Rows.Where({ + $_.SelectNodes("td")[1].innerText.Trim() -like "*$Search*" + }) + } + $Rows = $StrictRows[0..24] + } elseif ($AllPages) { + # If $NextPage is $null then there are more pages to collect. It is arse backwards but trust me. + while ($Res.NextPage -eq "") { + $NextParams = @{ + Uri = $Uri + EventArgument = $Res.EventArgument + EventTarget = 'ctl00$catalogBody$nextPageLinkText' + EventValidation = $Res.EventValidation + ViewState = $Res.ViewState + ViewStateGenerator = $Res.ViewStateGenerator + Method = "Post" + } + $Res = Invoke-CatalogRequest @NextParams + $Rows += $Res.Rows + } + if ($Strict) { + $Rows = $Rows.Where({ + $_.SelectNodes("td")[1].innerText.Trim() -like "*$Search*" + }) + } + } + + if ($Rows.Count -gt 0) { + foreach ($Row in $Rows) { + if ($Row.Id -ne "headerRow") { + [MSCatalogUpdate]::new($Row, $IncludeFileNames) + } + } + } else { + Write-Warning "No updates found matching the search term." + } + $ProgressPreference = $ProgPref + } catch { + $ProgressPreference = $ProgPref + throw $_ + } +} diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Public/Save-MSCatalogUpdate.ps1 b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Public/Save-MSCatalogUpdate.ps1 new file mode 100644 index 0000000..afacf93 --- /dev/null +++ b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Public/Save-MSCatalogUpdate.ps1 @@ -0,0 +1,146 @@ +function Save-MSCatalogUpdate { + <# + .SYNOPSIS + Download an update file from catalog.update.micrsosoft.com. + + .PARAMETER Update + Specify the update to be downloaded. + The update object is retrieved using the Get-MSCatalogUpdate function. + + .PARAMETER Guid + Specify the Guid for the update to be downloaded. + The Guid is retrieved using the Get-MSCatalogUpdate function. + + .PARAMETER Destination + Specify the destination directory to download the update to. + + .PARAMETER Language + Some updates are available in multiple languages. By default this function will list all available + files for a specific update and prompt you to select the one to download. If you wish to remove + this prompt you can specify a language-country code combination e.g. "en-us". + + .PARAMETER UseBits + If using a Windows system you can use this parameter to download the update using BITS. + + .EXAMPLE + $Update = Get-MSCatalogUpdate -Search "KB4515384" + Save-MSCatalogUpdate -Update $Update -Destination C:\Windows\Temp\ + + .EXAMPLE + Save-MSCatalogUpdate -Guid "5570183b-a0b7-4478-b0af-47a6e65417ca" -Destination C:\Windows\Temp\ + + .EXAMPLE + $Update = Get-MSCatalogUpdate -Search "KB4515384" + Save-MSCatalogUpdate -Update $Update -Destination C:\Windows\Temp\ -Language "en-us" + + .EXAMPLE + $Update = Get-MSCatalogUpdate -Search "KB4515384" + Save-MSCatalogUpdate -Update $Update -Destination C:\Windows\Temp\ -UseBits + #> + + param ( + [Parameter( + Mandatory = $true, + Position = 0, + ParameterSetName = "ByObject" + )] + [Object] $Update, + + [Parameter( + Mandatory = $true, + Position = 0, + ValueFromPipelineByPropertyName = "Guid", + ParameterSetName = "ByGuid" + )] + [String] $Guid, + + [Parameter( + Mandatory = $true, + Position = 1, + ParameterSetName = "ByObject" + )] + [Parameter( + Mandatory = $true, + Position = 1, + ParameterSetName = "ByGuid" + )] + [String] $Destination, + + [Parameter( + Mandatory = $false, + Position = 2, + ParameterSetName = "ByObject" + )] + [Parameter( + Mandatory = $false, + Position = 2, + ParameterSetName = "ByGuid" + )] + [String] $Language, + + [Parameter( + Mandatory = $false, + Position = 3, + ParameterSetName = "ByObject" + )] + [Parameter( + Mandatory = $false, + Position = 3, + ParameterSetName = "ByGuid" + )] + [Switch] $UseBits + ) + + if ($Update) { + $Guid = $Update.Guid + } + + $Links = Get-UpdateLinks -Guid $Guid + if ($Links.Matches.Count -eq 1) { + $Link = $Links.Matches[0] + $OutFile = Join-Path -Path (Get-Item -Path $Destination) -ChildPath $Link.Value.Split('/')[-1] + if ($UseBits) { + Invoke-DownloadFile -Uri $Link.Value -Path $OutFile -UseBits + } else { + Invoke-DownloadFile -Uri $Link.Value -Path $OutFile + } + } elseif ($Language) { + $Link = $Links.Matches.Where({$_.Value -match $Language})[0] + $OutFile = Join-Path -Path (Get-Item -Path $Destination) -ChildPath $Link.Value.Split('/')[-1] + if ($UseBits) { + Invoke-DownloadFile -Uri $Link.Value -Path $OutFile -UseBits + } else { + Invoke-DownloadFile -Uri $Link.Value -Path $OutFile + } + } else { + Write-Host "Id FileName`r" + Write-Host "-- --------" + foreach ($Link in $Links.Matches) { + $Id = $Links.Matches.IndexOf($Link) + $FileName = $Link.Value.Split('/')[-1] + if ($Id -lt 10) { + Write-Host " $Id $FileName`r" + } else { + Write-Host "$Id $FileName`r" + } + } + $SelectedId = Read-Host "Multiple files exist for this update. Enter the Id of the file to download or 'A' to download all files." + $ToDownload = @() + if ($SelectedId -like "A") { + foreach ($Link in $Links.Matches) { + $ToDownload += $Link.Value + } + } else { + $ToDownload += $Links.Matches[$SelectedId].Value + } + + foreach ($Item in $ToDownload) { + $OutFile = Join-Path -Path (Get-Item -Path $Destination) -ChildPath $Item.Split('/')[-1] + if ($UseBits) { + Invoke-DownloadFile -Uri $Item -Path $OutFile -UseBits + } else { + Invoke-DownloadFile -Uri $Item -Path $OutFile + } + } + } +} diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Types/Net45/HtmlAgilityPack.dll b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Types/Net45/HtmlAgilityPack.dll new file mode 100644 index 0000000000000000000000000000000000000000..ed3c716946a151c9b7f51d8fbf903b8e0ff6b295 GIT binary patch literal 162816 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 A00000 literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/MSCatalog/0.21.0/Types/netstandard2.0/HtmlAgilityPack.dll b/deployment/dsc/azshcihost/MSCatalog/0.21.0/Types/netstandard2.0/HtmlAgilityPack.dll new file mode 100644 index 0000000000000000000000000000000000000000..072653e83da6c868eff99e273184a6896e47da83 GIT binary patch literal 157184 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 ^>Ce0>S8t6gZmEDL%4^bRK|Iew7v;r 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 literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/DSC_DefaultGatewayAddress.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/DSC_DefaultGatewayAddress.psm1 new file mode 100644 index 0000000..d103472 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/DSC_DefaultGatewayAddress.psm1 @@ -0,0 +1,376 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the Default Gateway for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the default gateway address is set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER Address + The desired default gateway address - if not provided default gateway will be removed. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter()] + [System.String] + $Address + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.GettingDefaultGatewayAddressMessage) + ) -join '' ) + + $destinationPrefix = Get-NetDefaultGatewayDestinationPrefix ` + -AddressFamily $AddressFamily + + $defaultRoutes = Get-NetDefaultRoute ` + -InterfaceAlias $InterfaceAlias ` + -AddressFamily $AddressFamily + + $returnValue = @{ + AddressFamily = $AddressFamily + InterfaceAlias = $InterfaceAlias + } + + <# + If there is a Default Gateway defined for this interface/address family add it + to the return value. + #> + if ($defaultRoutes) + { + $returnValue += @{ + Address = $defaultRoutes.NextHop + } + } + else + { + $returnValue += @{ + Address = $null + } + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the Default Gateway for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the default gateway address is set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER Address + The desired default gateway address - if not provided default gateway will be removed. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter()] + [System.String] + $Address + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingDefaultGatewayAddressMessage) + ) -join '' ) + + $defaultRoutes = @(Get-NetDefaultRoute ` + -InterfaceAlias $InterfaceAlias ` + -AddressFamily $AddressFamily) + + # Remove any existing default routes + foreach ($defaultRoute in $defaultRoutes) + { + Remove-NetRoute ` + -DestinationPrefix $defaultRoute.DestinationPrefix ` + -NextHop $defaultRoute.NextHop ` + -InterfaceIndex $defaultRoute.InterfaceIndex ` + -AddressFamily $defaultRoute.AddressFamily ` + -Confirm:$false -ErrorAction Stop + } + + if ($Address) + { + $destinationPrefix = Get-NetDefaultGatewayDestinationPrefix ` + -AddressFamily $AddressFamily + + # Set the correct Default Route + $newNetRouteParameters = @{ + DestinationPrefix = $destinationPrefix + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + NextHop = $Address + } + + New-NetRoute @newNetRouteParameters -ErrorAction Stop + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DefaultGatewayAddressSetToDesiredStateMessage) + ) -join '' ) + } + else + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DefaultGatewayRemovedMessage) + ) -join '' ) + } +} + +<# + .SYNOPSIS + Tests the state of the Default Gateway for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the default gateway address is set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER Address + The desired default gateway address - if not provided default gateway will be removed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter()] + [System.String] + $Address + ) + + # Flag to signal whether settings are correct + $desiredConfigurationMatch = $true + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingDefaultGatewayAddressMessage) + ) -join '' ) + + Assert-ResourceProperty @PSBoundParameters + + $defaultRoutes = @(Get-NetDefaultRoute ` + -InterfaceAlias $InterfaceAlias ` + -AddressFamily $AddressFamily) + + # Test if the Default Gateway passed is equal to the current default gateway + if ($Address) + { + if ($defaultRoutes) + { + $nextHopRoute = $defaultRoutes.Where( { + $_.NextHop -eq $Address + } ) + + if ($nextHopRoute) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DefaultGatewayCorrectMessage) + ) -join '' ) + } + else + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DefaultGatewayNotMatchMessage) -f $Address, $defaultRoutes.NextHop + ) -join '' ) + $desiredConfigurationMatch = $false + } + } + else + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DefaultGatewayDoesNotExistMessage) -f $Address + ) -join '' ) + $desiredConfigurationMatch = $false + } + } + else + { + # Is a default gateway address set? + if ($defaultRoutes) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DefaultGatewayExistsButShouldNotMessage) + ) -join '' ) + $desiredConfigurationMatch = $false + } + else + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DefaultGatewayExistsAndShouldMessage) + ) -join '' ) + } + } + + return $desiredConfigurationMatch +} + +<# + .SYNOPSIS + Check the Address details are valid and do not conflict with Address family. + Ensures interface exists. If any problems are detected an exception will be thrown. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the default gateway address is set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER Address + The desired default gateway address - if not provided default gateway will be removed. +#> +function Assert-ResourceProperty +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily = 'IPv4', + + [Parameter()] + [System.String] + $Address + ) + + if (-not (Get-NetAdapter | Where-Object -Property Name -EQ $InterfaceAlias )) + { + New-InvalidOperationException ` + -Message ($script:localizedData.InterfaceNotAvailableError -f $InterfaceAlias) + } + + if ($Address) + { + Assert-IPAddress -Address $Address -AddressFamily $AddressFamily + } +} # Assert-ResourceProperty + +<# + .SYNOPSIS + Get the default gateway destination prefix for the IP address family. + + .PARAMETER AddressFamily + IP address family. +#> +function Get-NetDefaultGatewayDestinationPrefix +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily = 'IPv4' + ) + + if ($AddressFamily -eq 'IPv4') + { + $destinationPrefix = '0.0.0.0/0' + } + else + { + $destinationPrefix = '::/0' + } + + return $destinationPrefix +} # Get-NetDefaultGatewayDestinationPrefix + +<# + .SYNOPSIS + Get the default network routes assigned to the interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the default gateway address is set. + + .PARAMETER AddressFamily + IP address family. +#> +function Get-NetDefaultRoute +{ + [CmdletBinding()] + [OutputType([System.String[]])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily = 'IPv4' + ) + + $destinationPrefix = Get-NetDefaultGatewayDestinationPrefix ` + -AddressFamily $AddressFamily + + return @(Get-NetRoute ` + -InterfaceAlias $InterfaceAlias ` + -AddressFamily $AddressFamily ` + -ErrorAction Stop).Where({ + $_.DestinationPrefix -eq $destinationPrefix + }) +} # Get-NetDefaultRoute + +Export-ModuleMember -function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/DSC_DefaultGatewayAddress.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/DSC_DefaultGatewayAddress.schema.mof new file mode 100644 index 0000000..a7a6306 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/DSC_DefaultGatewayAddress.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.0"), FriendlyName("DefaultGatewayAddress")] +class DSC_DefaultGatewayAddress : OMI_BaseResource +{ + [Key, Description("Alias of the network interface for which the default gateway address is set.")] string InterfaceAlias; + [Key, Description("IP address family."), ValueMap{"IPv4", "IPv6"},Values{"IPv4", "IPv6"}] string AddressFamily; + [Write, Description("The desired default gateway address - if not provided default gateway will be removed.")] string Address; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/README.md b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/README.md new file mode 100644 index 0000000..5d8f1fa --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/README.md @@ -0,0 +1,4 @@ +# Description + +The resource is responsible for creating and managing the Default Gateway for +an interface on a node. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/en-US/DSC_DefaultGatewayAddress.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/en-US/DSC_DefaultGatewayAddress.strings.psd1 new file mode 100644 index 0000000..66f757a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/en-US/DSC_DefaultGatewayAddress.strings.psd1 @@ -0,0 +1,15 @@ +# Localized resources for DSC_DefaultGatewayAddress + +ConvertFrom-StringData @' + GettingDefaultGatewayAddressMessage = Getting the Default Gateway Address. + ApplyingDefaultGatewayAddressMessage = Applying the Default Gateway Address. + DefaultGatewayAddressSetToDesiredStateMessage = Default Gateway address was set to the desired state. + DefaultGatewayRemovedMessage = Default Gateway address has been removed. + CheckingDefaultGatewayAddressMessage = Checking the Default Gateway Address. + DefaultGatewayNotMatchMessage = Default gateway does NOT match desired state. Expected "{0}", actual "{1}". + DefaultGatewayCorrectMessage = Default gateway is correct. + DefaultGatewayDoesNotExistMessage = Default gateway does not exist. Expected "{0}". + DefaultGatewayExistsButShouldNotMessage = Default gateway exists but it should not. + DefaultGatewayExistsAndShouldMessage = Default Gateway does not exist which is correct. + InterfaceNotAvailableError = Interface "{0}" is not available. Please select a valid interface and try again. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/en-US/about_DefaultGatewayAddress.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/en-US/about_DefaultGatewayAddress.help.txt new file mode 100644 index 0000000..b6c01c5 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DefaultGatewayAddress/en-US/about_DefaultGatewayAddress.help.txt @@ -0,0 +1,60 @@ +.NAME + DefaultGatewayAddress + +.DESCRIPTION + The resource is responsible for creating and managing the Default Gateway for + an interface on a node. + +.PARAMETER InterfaceAlias + Key - String + Alias of the network interface for which the default gateway address is set. + +.PARAMETER AddressFamily + Key - String + Allowed values: IPv4, IPv6 + IP address family. + +.PARAMETER Address + Write - String + The desired default gateway address - if not provided default gateway will be removed. + +.EXAMPLE 1 + +Remove the IPv4 default gateway from the network interface +'Ethernet'. + +Configuration DefaultGatewayAddress_RemoveDefaultGateway_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + DefaultGatewayAddress RemoveDefaultGateway + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + } + } +} + +.EXAMPLE 2 + +Set the IPv4 default gateway of the network interface 'Ethernet' +to '192.168.1.1'. + +Configuration DefaultGatewayAddress_SetDefaultGateway_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + DefaultGatewayAddress SetDefaultGateway + { + Address = '192.168.1.1' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.data.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.data.psd1 new file mode 100644 index 0000000..b0447e1 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.data.psd1 @@ -0,0 +1,16 @@ +@{ + ParameterList = @( + @{ + Name = 'SuffixSearchList' + Type = 'Array' + }, + @{ + Name = 'UseDevolution' + Type = 'Boolean' + }, + @{ + Name = 'DevolutionLevel' + Type = 'Integer' + } + ) +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.psm1 new file mode 100644 index 0000000..fc86745 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.psm1 @@ -0,0 +1,267 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + This is an array of all the parameters used by this resource. +#> +$resourceData = Import-LocalizedData ` + -BaseDirectory $PSScriptRoot ` + -FileName 'DSC_DnsClientGlobalSetting.data.psd1' + +# This must be a script parameter so that it is accessible +$script:parameterList = $resourceData.ParameterList + +<# + .SYNOPSIS + Returns the current DNS Client Global Settings. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingDnsClientGlobalSettingMessage) + ) -join '' ) + + # Get the current Dns Client Global Settings + $dnsClientGlobalSetting = Get-DnsClientGlobalSetting ` + -ErrorAction Stop + + # Generate the return object. + $returnValue = @{ + IsSingleInstance = 'Yes' + } + + foreach ($parameter in $script:parameterList) + { + $returnValue += @{ + $parameter.Name = $dnsClientGlobalSetting.$($parameter.name) + } + } # foreach + + return $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Sets the DNS Client Global Settings. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER SuffixSearchList + Specifies a list of global suffixes that can be used in the specified order by the DNS client + for resolving the IP address of the computer name. + + .PARAMETER UseDevolution. + Specifies that devolution is activated. + + .PARAMETER DevolutionLevel + Specifies the number of labels up to which devolution should occur. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.String[]] + $SuffixSearchList, + + [Parameter()] + [System.Boolean] + $UseDevolution, + + [Parameter()] + [System.Uint32] + $DevolutionLevel + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingDnsClientGlobalSettingMessage) + ) -join '' ) + + # Get the current Dns Client Global Settings + $dnsClientGlobalSetting = Get-DnsClientGlobalSetting ` + -ErrorAction Stop + + # Generate a list of parameters that will need to be changed. + $changeParameters = @{} + + foreach ($parameter in $script:parameterList) + { + $parameterSourceValue = $dnsClientGlobalSetting.$($parameter.name) + $parameterNewValue = (Get-Variable -Name ($parameter.name)).Value + + if ($PSBoundParameters.ContainsKey($parameter.Name) ` + -and (Compare-Object -ReferenceObject $parameterSourceValue -DifferenceObject $parameterNewValue -SyncWindow 0)) + { + $changeParameters += @{ + $($parameter.name) = $parameterNewValue + } + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DnsClientGlobalSettingUpdateParameterMessage) ` + -f $parameter.Name,($parameterNewValue -join ',') + ) -join '' ) + } # if + } # foreach + + if ($changeParameters.Count -gt 0) + { + # Update any parameters that were identified as different + $null = Set-DnsClientGlobalSetting ` + @ChangeParameters ` + -ErrorAction Stop + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DnsClientGlobalSettingUpdatedMessage) + ) -join '' ) + } # if +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the state of DNS Client Global Settings. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER SuffixSearchList + Specifies a list of global suffixes that can be used in the specified order by the DNS client + for resolving the IP address of the computer name. + + .PARAMETER UseDevolution. + Specifies that devolution is activated. + + .PARAMETER DevolutionLevel + Specifies the number of labels up to which devolution should occur. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.String[]] + $SuffixSearchList, + + [Parameter()] + [System.Boolean] + $UseDevolution, + + [Parameter()] + [System.Uint32] + $DevolutionLevel + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingDnsClientGlobalSettingMessage) + ) -join '' ) + + # Flag to signal whether settings are correct + $desiredConfigurationMatch = $true + + # Get the current Dns Client Global Settings + $dnsClientGlobalSetting = Get-DnsClientGlobalSetting ` + -ErrorAction Stop + + # Check each parameter + foreach ($parameter in $script:parameterList) + { + $parameterSourceValue = $dnsClientGlobalSetting.$($parameter.name) + $parameterNewValue = (Get-Variable -Name ($parameter.name)).Value + $parameterValueMatch = $true + + switch ($parameter.Type) + { + 'Integer' + { + # Perform a plain integer comparison. + if ($PSBoundParameters.ContainsKey($parameter.Name) -and $parameterSourceValue -ne $parameterNewValue) + { + $parameterValueMatch = $false + } + } + + 'Boolean' + { + # Perform a boolean comparison. + if ($PSBoundParameters.ContainsKey($parameter.Name) -and $parameterSourceValue -ne $parameterNewValue) + { + $parameterValueMatch = $false + } + } + + 'Array' + { + # Array comparison uses Compare-Object + if ([System.String]::IsNullOrEmpty($parameterSourceValue)) + { + $parameterSourceValue = @() + } + + if ([System.String]::IsNullOrEmpty($parameterNewValue)) + { + $parameterNewValue = @() + } + + if ($PSBoundParameters.ContainsKey($parameter.Name) ` + -and ((Compare-Object ` + -ReferenceObject $parameterSourceValue ` + -DifferenceObject $parameterNewValue -SyncWindow 0).Count -ne 0)) + { + $parameterValueMatch = $false + } + } + } + if ($parameterValueMatch -eq $false) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.DnsClientGlobalSettingParameterNeedsUpdateMessage) ` + -f $parameter.Name, ($parameterSourceValue -join ','), ($parameterNewValue -join ',') + ) -join '') + $desiredConfigurationMatch = $false + } + } # foreach + + return $desiredConfigurationMatch +} # Test-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.schema.mof new file mode 100644 index 0000000..feaae16 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/DSC_DnsClientGlobalSetting.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DnsClientGlobalSetting")] +class DSC_DnsClientGlobalSetting : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Specifies a list of global suffixes that can be used in the specified order by the DNS client for resolving the IP address of the computer name.")] String SuffixSearchList[]; + [Write, Description("Specifies that devolution is activated.")] Boolean UseDevolution; + [Write, Description("Specifies the number of labels up to which devolution should occur.")] Uint32 DevolutionLevel; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/README.MD new file mode 100644 index 0000000..bc84bb3 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to control global DNS client settings for a node. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/en-US/DSC_DnsClientGlobalSetting.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/en-US/DSC_DnsClientGlobalSetting.strings.psd1 new file mode 100644 index 0000000..572e86a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/en-US/DSC_DnsClientGlobalSetting.strings.psd1 @@ -0,0 +1,10 @@ +# Localized resources for DSC_DnsClientGlobalSetting + +ConvertFrom-StringData @' + GettingDnsClientGlobalSettingMessage = Getting DNS Client Global Settings. + SettingDnsClientGlobalSettingMessage = Setting DNS Client Global Settings. + DnsClientGlobalSettingUpdateParameterMessage = Setting DNS Client Global Settings parameter {0} to "{1}". + DnsClientGlobalSettingUpdatedMessage = Setting DNS Client Global Settings updated. + TestingDnsClientGlobalSettingMessage = Testing DNS Client Global Settings. + DnsClientGlobalSettingParameterNeedsUpdateMessage = DNS Client Global Setting "{0}" is "{1}" but should be "{2}". Change required. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/en-US/about_DnsClientGlobalSetting.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/en-US/about_DnsClientGlobalSetting.help.txt new file mode 100644 index 0000000..7a79cd6 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsClientGlobalSetting/en-US/about_DnsClientGlobalSetting.help.txt @@ -0,0 +1,64 @@ +.NAME + DnsClientGlobalSetting + +.DESCRIPTION + This resource is used to control global DNS client settings for a node. + +.PARAMETER IsSingleInstance + Key - String + Allowed values: Yes + Specifies the resource is a single instance, the value must be 'Yes'. + +.PARAMETER SuffixSearchList + Write - StringArray + Specifies a list of global suffixes that can be used in the specified order by the DNS client for resolving the IP address of the computer name. + +.PARAMETER UseDevolution + Write - Boolean + Specifies that devolution is activated. + +.PARAMETER DevolutionLevel + Write - UInt32 + Specifies the number of labels up to which devolution should occur. + +.EXAMPLE 1 + +Configure only contoso.com for the DNS Suffix. + +Configuration DnsClientGlobalSetting_ConfigureSuffixSearchListSingle_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + DnsClientGlobalSetting ConfigureSuffixSearchListSingle + { + IsSingleInstance = 'Yes' + SuffixSearchList = 'contoso.com' + UseDevolution = $true + DevolutionLevel = 0 + } + } +} + +.EXAMPLE 2 + +Configure fabrikam.com and fourthcoffee.com for the DNS SuffixSearchList. + +Configuration DnsClientGlobalSetting_ConfigureSuffixSearchListMultiple_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + DnsClientGlobalSetting ConfigureSuffixSearchListMultiple + { + IsSingleInstance = 'Yes' + SuffixSearchList = ('fabrikam.com', 'fourthcoffee.com') + UseDevolution = $true + DevolutionLevel = 0 + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/DSC_DnsConnectionSuffix.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/DSC_DnsConnectionSuffix.psm1 new file mode 100644 index 0000000..cb6aad4 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/DSC_DnsConnectionSuffix.psm1 @@ -0,0 +1,268 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current DNS Connection Suffix for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the DNS server address is set. + + .PARAMETER ConnectionSpecificSuffix + DNS connection-specific suffix to assign to the network interface. + + .PARAMETER RegisterThisConnectionsAddress + Specifies that the IP address for this connection is to be registered. + + .PARAMETER UseSuffixWhenRegistering + Specifies that this host name and the connection specific suffix for this connection are to + be registered. + + .PARAMETER Ensure + Ensure that the network interface connection-specific suffix is present or not. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ConnectionSpecificSuffix, + + [Parameter()] + [System.Boolean] + $RegisterThisConnectionsAddress = $true, + + [Parameter()] + [System.Boolean] + $UseSuffixWhenRegistering = $false, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $dnsClient = Get-DnsClient -InterfaceAlias $InterfaceAlias -ErrorAction SilentlyContinue + + $targetResource = @{ + InterfaceAlias = $dnsClient.InterfaceAlias + ConnectionSpecificSuffix = $dnsClient.ConnectionSpecificSuffix + RegisterThisConnectionsAddress = $dnsClient.RegisterThisConnectionsAddress + UseSuffixWhenRegistering = $dnsClient.UseSuffixWhenRegistering + } + + if ($Ensure -eq 'Present') + { + # Test to see if the connection-specific suffix matches + Write-Verbose -Message ($script:localizedData.CheckingConnectionSuffix -f $ConnectionSpecificSuffix) + + if ($dnsClient.ConnectionSpecificSuffix -eq $ConnectionSpecificSuffix) + { + $Ensure = 'Present' + } + else + { + $Ensure = 'Absent' + } + } + else + { + # ($Ensure -eq 'Absent'). Test to see if there is a connection-specific suffix + Write-Verbose -Message ($script:localizedData.CheckingConnectionSuffix -f '') + + if ([System.String]::IsNullOrEmpty($dnsClient.ConnectionSpecificSuffix)) + { + $Ensure = 'Absent' + } + else + { + $Ensure = 'Present' + } + } + + $targetResource['Ensure'] = $Ensure + + return $targetResource +} + +<# + .SYNOPSIS + Sets the DNS Connection Suffix for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the DNS server address is set. + + .PARAMETER ConnectionSpecificSuffix + DNS connection-specific suffix to assign to the network interface. + + .PARAMETER RegisterThisConnectionsAddress + Specifies that the IP address for this connection is to be registered. + + .PARAMETER UseSuffixWhenRegistering + Specifies that this host name and the connection specific suffix for this connection are to + be registered. + + .PARAMETER Ensure + Ensure that the network interface connection-specific suffix is present or not. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ConnectionSpecificSuffix, + + [Parameter()] + [System.Boolean] + $RegisterThisConnectionsAddress = $true, + + [Parameter()] + [System.Boolean] + $UseSuffixWhenRegistering = $false, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $setDnsClientParams = @{ + InterfaceAlias = $InterfaceAlias + RegisterThisConnectionsAddress = $RegisterThisConnectionsAddress + UseSuffixWhenRegistering = $UseSuffixWhenRegistering + } + + if ($Ensure -eq 'Present') + { + $setDnsClientParams['ConnectionSpecificSuffix'] = $ConnectionSpecificSuffix + + Write-Verbose -Message ($script:localizedData.SettingConnectionSuffix ` + -f $ConnectionSpecificSuffix, $InterfaceAlias) + } + else + { + $setDnsClientParams['ConnectionSpecificSuffix'] = '' + + Write-Verbose -Message ($script:localizedData.RemovingConnectionSuffix ` + -f $ConnectionSpecificSuffix, $InterfaceAlias) + } + + Set-DnsClient @setDnsClientParams +} + +<# + .SYNOPSIS + Tests the current state of a DNS Connection Suffix for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the DNS server address is set. + + .PARAMETER ConnectionSpecificSuffix + DNS connection-specific suffix to assign to the network interface. + + .PARAMETER RegisterThisConnectionsAddress + Specifies that the IP address for this connection is to be registered. + + .PARAMETER UseSuffixWhenRegistering + Specifies that this host name and the connection specific suffix for this connection are to + be registered. + + .PARAMETER Ensure + Ensure that the network interface connection-specific suffix is present or not. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ConnectionSpecificSuffix, + + [Parameter()] + [System.Boolean] + $RegisterThisConnectionsAddress = $true, + + [Parameter()] + [System.Boolean] + $UseSuffixWhenRegistering = $false, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $targetResource = Get-TargetResource @PSBoundParameters + $inDesiredState = $true + + if ($targetResource.Ensure -ne $Ensure) + { + Write-Verbose -Message ($script:localizedData.PropertyMismatch ` + -f 'Ensure', $Ensure, $targetResource.Ensure) + + $inDesiredState = $false + } + + if ($targetResource.RegisterThisConnectionsAddress -ne $RegisterThisConnectionsAddress) + { + Write-Verbose -Message ($script:localizedData.PropertyMismatch ` + -f 'RegisterThisConnectionsAddress', $RegisterThisConnectionsAddress, $targetResource.RegisterThisConnectionsAddress) + + $inDesiredState = $false + } + + if ($targetResource.UseSuffixWhenRegistering -ne $UseSuffixWhenRegistering) + { + Write-Verbose -Message ($script:localizedData.PropertyMismatch ` + -f 'UseSuffixWhenRegistering', $UseSuffixWhenRegistering, $targetResource.UseSuffixWhenRegistering) + + $inDesiredState = $false + } + + if ($inDesiredState) + { + Write-Verbose -Message $script:localizedData.ResourceInDesiredState + } + else + { + Write-Verbose -Message $script:localizedData.ResourceNotInDesiredState + } + + return $inDesiredState +} + +Export-ModuleMember -function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/DSC_DnsConnectionSuffix.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/DSC_DnsConnectionSuffix.schema.mof new file mode 100644 index 0000000..471be54 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/DSC_DnsConnectionSuffix.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0"), FriendlyName("DnsConnectionSuffix")] +class DSC_DnsConnectionSuffix : OMI_BaseResource +{ + [Key, Description("Alias of the network interface for which the DNS server address is set.")] String InterfaceAlias; + [Required, Description("DNS connection-specific suffix to assign to the network interface.")] String ConnectionSpecificSuffix; + [Write, Description("Specifies that the IP address for this connection is to be registered.")] Boolean RegisterThisConnectionsAddress; + [Write, Description("Specifies that this host name and the connection specific suffix for this connection are to be registered.")] Boolean UseSuffixWhenRegistering; + [Write, Description("Ensure that the network interface connection-specific suffix is present or not."), ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/README.MD new file mode 100644 index 0000000..e279908 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to control interface-specific DNS client configurations on a node. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/en-US/DSC_DnsConnectionSuffix.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/en-US/DSC_DnsConnectionSuffix.strings.psd1 new file mode 100644 index 0000000..838f53a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/en-US/DSC_DnsConnectionSuffix.strings.psd1 @@ -0,0 +1,10 @@ +# Localized resources for DSC_DnsConnectionSuffix + +ConvertFrom-StringData @' + PropertyMismatch = Property '{0}' does NOT match. Expected '{1}', actual '{2}'. + CheckingConnectionSuffix = Checking connection suffix matches '{0}'. + ResourceInDesiredState = Resource is in the desired state. + ResourceNotInDesiredState = Resource is NOT in the desired state. + SettingConnectionSuffix = Setting connection suffix '{0}' on interface '{1}'. + RemovingConnectionSuffix = Removing connection suffix '{0}' on interface '{1}'. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/en-US/about_DnsConnectionSuffix.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/en-US/about_DnsConnectionSuffix.help.txt new file mode 100644 index 0000000..834fb0a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsConnectionSuffix/en-US/about_DnsConnectionSuffix.help.txt @@ -0,0 +1,47 @@ +.NAME + DnsConnectionSuffix + +.DESCRIPTION + This resource is used to control interface-specific DNS client configurations on a node. + +.PARAMETER InterfaceAlias + Key - String + Alias of the network interface for which the DNS server address is set. + +.PARAMETER ConnectionSpecificSuffix + Required - String + DNS connection-specific suffix to assign to the network interface. + +.PARAMETER RegisterThisConnectionsAddress + Write - Boolean + Specifies that the IP address for this connection is to be registered. + +.PARAMETER UseSuffixWhenRegistering + Write - Boolean + Specifies that this host name and the connection specific suffix for this connection are to be registered. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Ensure that the network interface connection-specific suffix is present or not. + +.EXAMPLE 1 + +This configuration will set a DNS connection-specific suffix on a network interface that +is identified by its alias. + +Configuration DnsConnectionSuffix_AddSpecificSuffix_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + DnsConnectionSuffix AddSpecificSuffix + { + InterfaceAlias = 'Ethernet' + ConnectionSpecificSuffix = 'contoso.com' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/DSC_DnsServerAddress.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/DSC_DnsServerAddress.psm1 new file mode 100644 index 0000000..9980c3b --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/DSC_DnsServerAddress.psm1 @@ -0,0 +1,327 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current DNS Server Addresses for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the DNS server address is set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER Address + The desired DNS Server address(es). Exclude to enable DHCP. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $Address + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingDnsServerAddressesMessage) + ) -join '') + + # Remove the parameters we don't want to splat + $null = $PSBoundParameters.Remove('Address') + + # Get the current DNS Server Addresses based on the parameters given. + [String[]] $currentAddress = Get-DnsClientServerStaticAddress ` + @PSBoundParameters ` + -ErrorAction Stop + + $returnValue = @{ + Address = $currentAddress + AddressFamily = $AddressFamily + InterfaceAlias = $InterfaceAlias + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the DNS Server Address for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the DNS server address is set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER Address + The desired DNS Server address(es). Exclude to enable DHCP. + + .PARAMETER Validate + Requires that the DNS Server addresses be validated if they are updated. + It will cause the resource to throw a 'A general error occurred that is not covered by a more + specific error code.' error if set to True and specified DNS Servers are not accessible. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $Address, + + [Parameter()] + [Boolean] + $Validate = $false + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingDnsServerAddressesMessage) + ) -join '') + + # If address not passed, set to an empty array + if (-not $PSBoundParameters.ContainsKey('Address')) + { + [String[]] $Address = @() + } + + # Remove the parameters we don't want to splat + $null = $PSBoundParameters.Remove('Address') + $null = $PSBoundParameters.Remove('Validate') + + # Get the current DNS Server Addresses based on the parameters given. + [String[]] $currentAddress = @(Get-DnsClientServerStaticAddress ` + @PSBoundParameters ` + -ErrorAction Stop) + + # Check if the Server addresses are the same as the desired addresses. + [Boolean] $addressDifferent = (@(Compare-Object ` + -ReferenceObject $currentAddress ` + -DifferenceObject $Address ` + -SyncWindow 0).Length -gt 0) + + if ($addressDifferent) + { + $dnsServerAddressSplat = @{ + InterfaceAlias = $InterfaceAlias + } + + if ($Address.Count -eq 0) + { + # Reset the DNS server address to DHCP + $dnsServerAddressSplat += @{ + ResetServerAddresses = $true + } + + Set-DnsClientServerAddress @dnsServerAddressSplat ` + -ErrorAction Stop + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.DNSServersHaveBeenSetToDHCPMessage) + ) -join '' ) + } + else + { + # Set the DNS server address to static + $dnsServerAddressSplat += @{ + Address = $Address + Validate = $Validate + } + + Set-DnsClientServerAddress @dnsServerAddressSplat ` + -ErrorAction Stop + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.DNSServersHaveBeenSetCorrectlyMessage) + ) -join '' ) + } + } + else + { + # Test will return true in this case + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.DNSServersAlreadySetMessage) + ) -join '' ) + } +} + +<# + .SYNOPSIS + Tests the current state of a DNS Server Address for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the DNS server address is set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER Address + The desired DNS Server address(es). Exclude to enable DHCP. + + .PARAMETER Validate + Requires that the DNS Server addresses be validated if they are updated. + It will cause the resource to throw a 'A general error occurred that is not covered by a more + specific error code.' error if set to True and specified DNS Servers are not accessible. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $Address, + + [Parameter()] + [Boolean] + $Validate = $false + ) + # Flag to signal whether settings are correct + $desiredConfigurationMatch = $true + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingDnsServerAddressesMessage) + ) -join '' ) + + # Validate the Address passed or set to empty array if not passed + if ($PSBoundParameters.ContainsKey('Address')) + { + foreach ($ServerAddress in $Address) + { + Assert-ResourceProperty ` + -Address $ServerAddress ` + -AddressFamily $AddressFamily ` + -InterfaceAlias $InterfaceAlias + } # foreach + } + else + { + [String[]] $Address = @() + } # if + + # Remove the parameters we don't want to splat + $null = $PSBoundParameters.Remove('Address') + $null = $PSBoundParameters.Remove('Validate') + + # Get the current DNS Server Addresses based on the parameters given. + [String[]] $currentAddress = @(Get-DnsClientServerStaticAddress ` + @PSBoundParameters ` + -ErrorAction Stop) + + # Check if the Server addresses are the same as the desired addresses. + [Boolean] $addressDifferent = (@(Compare-Object ` + -ReferenceObject $currentAddress ` + -DifferenceObject $Address ` + -SyncWindow 0).Length -gt 0) + + if ($addressDifferent) + { + $desiredConfigurationMatch = $false + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.DNSServersNotCorrectMessage) ` + -f ($Address -join ','),($currentAddress -join ',') + ) -join '' ) + } + else + { + # Test will return true in this case + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.DNSServersSetCorrectlyMessage) + ) -join '' ) + } + return $desiredConfigurationMatch +} + +<# + .SYNOPSIS + Checks the Address details are valid and do not conflict with Address family. + Ensures interface exists. If any problems are detected an exception will be thrown. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the DNS server address is set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER Address + The desired DNS Server address. Set to empty to enable DHCP. +#> +function Assert-ResourceProperty +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Address + ) + + if ( -not (Get-NetAdapter | Where-Object -Property Name -EQ $InterfaceAlias )) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InterfaceNotAvailableError -f $InterfaceAlias) ` + -ArgumentName 'InterfaceAlias' + } + + Assert-IPAddress -Address $Address -AddressFamily $AddressFamily +} # Assert-ResourceProperty + +Export-ModuleMember -function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/DSC_DnsServerAddress.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/DSC_DnsServerAddress.schema.mof new file mode 100644 index 0000000..7ebd6b1 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/DSC_DnsServerAddress.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0"), FriendlyName("DnsServerAddress")] +class DSC_DnsServerAddress : OMI_BaseResource +{ + [Key, Description("Alias of the network interface for which the DNS server address is set.")] string InterfaceAlias; + [Key, Description("IP address family."), ValueMap{"IPv4", "IPv6"},Values{"IPv4", "IPv6"}] string AddressFamily; + [Write, Description("The desired DNS Server address(es). Exclude to enable DHCP.")] string Address[]; + [Write, Description("Requires that the DNS Server addresses be validated if they are updated. It will cause the resource to throw a 'A general error occurred that is not covered by a more specific error code.' error if set to True and specified DNS Servers are not accessible.")] boolean Validate; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/README.MD new file mode 100644 index 0000000..cbccb2f --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to control a node's DNS Server address(s). diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/en-US/DSC_DnsServerAddress.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/en-US/DSC_DnsServerAddress.strings.psd1 new file mode 100644 index 0000000..b331456 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/en-US/DSC_DnsServerAddress.strings.psd1 @@ -0,0 +1,13 @@ +# Localized resources for DSC_DnsServerAddress + +ConvertFrom-StringData @' + GettingDnsServerAddressesMessage = Getting the DNS server addresses. + ApplyingDnsServerAddressesMessage = Applying the DNS server addresses. + DNSServersSetCorrectlyMessage = DNS server addresses are set correctly. + DNSServersAlreadySetMessage = DNS server addresses are already set correctly. + CheckingDnsServerAddressesMessage = Checking the DNS server addresses. + DNSServersNotCorrectMessage = DNS server addresses are not correct. Expected "{0}", actual "{1}". + DNSServersHaveBeenSetCorrectlyMessage = DNS server addresses were set to the desired state. + DNSServersHaveBeenSetToDHCPMessage = DNS server addresses were set to the desired state of DHCP. + InterfaceNotAvailableError = Interface "{0}" is not available. Please select a valid interface and try again. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/en-US/about_DnsServerAddress.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/en-US/about_DnsServerAddress.help.txt new file mode 100644 index 0000000..e6a9681 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_DnsServerAddress/en-US/about_DnsServerAddress.help.txt @@ -0,0 +1,89 @@ +.NAME + DnsServerAddress + +.DESCRIPTION + This resource is used to control a node's DNS Server address(s). + +.PARAMETER InterfaceAlias + Key - String + Alias of the network interface for which the DNS server address is set. + +.PARAMETER AddressFamily + Key - String + Allowed values: IPv4, IPv6 + IP address family. + +.PARAMETER Address + Write - StringArray + The desired DNS Server address(es). Exclude to enable DHCP. + +.PARAMETER Validate + Write - Boolean + Requires that the DNS Server addresses be validated if they are updated. It will cause the resource to throw a 'A general error occurred that is not covered by a more specific error code.' error if set to True and specified DNS Servers are not accessible. + +.EXAMPLE 1 + +Configure DNS Server for the Ethernet adapter. + +Configuration DnsServerAddress_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + DnsServerAddress DnsServerAddress + { + Address = '127.0.0.1' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + Validate = $true + } + } +} + +.EXAMPLE 2 + +Configure primary and secondary DNS Server addresses on the Ethernet adapter. + +Configuration DnsServerAddress_PrimaryAndSecondary_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + DnsServerAddress PrimaryAndSecondary + { + Address = '10.0.0.2','10.0.0.40' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + Validate = $true + } + } +} + +.EXAMPLE 3 + +Enabling DHCP for the IPv4 Address and DNS on the adapter with alias 'Ethernet'. + +Configuration DnsServerAddress_EnableDHCP_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface EnableDhcp + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + Dhcp = 'Enabled' + } + + DnsServerAddress EnableDhcpDNS + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.data.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.data.psd1 new file mode 100644 index 0000000..73bc7da --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.data.psd1 @@ -0,0 +1,36 @@ +@{ + ParameterList = @( + @{ Name = 'Name'; Variable = 'FirewallRule'; Type = 'String' } + @{ Name = 'DisplayName'; Variable = 'FirewallRule'; Type = 'String' } + @{ Name = 'Group'; Variable = 'FirewallRule'; Type = 'String' } + @{ Name = 'DisplayGroup'; Variable = 'FirewallRule'; Type = '' } + @{ Name = 'Enabled'; Variable = 'FirewallRule'; Type = 'String' } + @{ Name = 'Action'; Variable = 'FirewallRule'; Type = 'String' } + @{ Name = 'Profile'; Variable = 'FirewallRule'; Type = 'Array'; Delimiter = ', ' } + @{ Name = 'Direction'; Variable = 'FirewallRule'; Type = 'String' } + @{ Name = 'Description'; Variable = 'FirewallRule'; Type = 'String' } + @{ Name = 'RemotePort'; Variable = 'properties'; Property = 'PortFilters'; Type = 'Array' } + @{ Name = 'LocalPort'; Variable = 'properties'; Property = 'PortFilters'; Type = 'Array' } + @{ Name = 'Protocol'; Variable = 'properties'; Property = 'PortFilters'; Type = 'String' } + @{ Name = 'Program'; Variable = 'properties'; Property = 'ApplicationFilters'; Type = 'String' } + @{ Name = 'Service'; Variable = 'properties'; Property = 'ServiceFilters'; Type = 'String' } + @{ Name = 'Authentication'; Variable = 'properties'; Property = 'SecurityFilters'; Type = 'String' } + @{ Name = 'Encryption'; Variable = 'properties'; Property = 'SecurityFilters'; Type = 'String' } + @{ Name = 'InterfaceAlias'; Variable = 'properties'; Property = 'InterfaceFilters'; Type = 'Array' } + @{ Name = 'InterfaceType'; Variable = 'properties'; Property = 'InterfaceTypeFilters'; Type = 'String' } + @{ Name = 'LocalAddress'; Variable = 'properties'; Property = 'AddressFilters'; Type = 'ArrayIP' } + @{ Name = 'LocalUser'; Variable = 'properties'; Property = 'SecurityFilters'; Type = 'String' } + @{ Name = 'Package'; Variable = 'properties'; Property = 'ApplicationFilters'; Type = 'String' } + @{ Name = 'Platform'; Variable = 'FirewallRule'; Type = 'Array' } + @{ Name = 'RemoteAddress'; Variable = 'properties'; Property = 'AddressFilters'; Type = 'ArrayIP' } + @{ Name = 'RemoteMachine'; Variable = 'properties'; Property = 'SecurityFilters'; Type = 'String' } + @{ Name = 'RemoteUser'; Variable = 'properties'; Property = 'SecurityFilters'; Type = 'String' } + @{ Name = 'DynamicTransport'; Variable = 'properties'; Property = 'PortFilters'; Type = 'String' } + @{ Name = 'EdgeTraversalPolicy'; Variable = 'FirewallRule'; Type = 'String' } + @{ Name = 'IcmpType'; Variable = 'properties'; Property = 'PortFilters'; Type = 'Array' } + @{ Name = 'LocalOnlyMapping'; Variable = 'FirewallRule'; Type = 'Boolean' } + @{ Name = 'LooseSourceMapping'; Variable = 'FirewallRule'; Type = 'Boolean' } + @{ Name = 'OverrideBlockRules'; Variable = 'properties'; Property = 'SecurityFilters'; Type = 'Boolean' } + @{ Name = 'Owner'; Variable = 'FirewallRule'; Type = 'String' } + ) +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.psm1 new file mode 100644 index 0000000..f5dd463 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.psm1 @@ -0,0 +1,1377 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + This is an array of all the parameters used by this resource + It can be used by several of the functions to reduce the amount of code required + Each element contains 3 properties: + Name: The parameter name + Source: The source where the existing parameter can be pulled from + Type: This is the content type of the paramater (it is either array or string or blank) + A blank type means it will not be compared + data ParameterList + Delimiter: Only required for Profile parameter, because Get-NetFirewall rule doesn't + return the profile as an array, but a comma delimited string. Setting this value causes + the functions to first split the parameter into an array. +#> +$script:resourceData = Import-LocalizedData ` + -BaseDirectory $PSScriptRoot ` + -FileName 'DSC_Firewall.data.psd1' +$script:parameterList = $script:resourceData.ParameterList + +<# + .SYNOPSIS + Returns the current state of the Firewall Rule. + + .PARAMETER Name + Name of the firewall rule. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + # Name of the Firewall Rule + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Name + ) + + $ErrorActionPreference = 'Stop' + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingFirewallRuleMessage) -f $Name + ) -join '') + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FindFirewallRuleMessage) -f $Name + ) -join '') + + $firewallRule = Get-FirewallRule -Name $Name + + if (-not $firewallRule) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleDoesNotExistMessage) -f $Name + ) -join '') + return @{ + Ensure = 'Absent' + Name = $Name + } + } + + $properties = Get-FirewallRuleProperty -FirewallRule $firewallRule + + $result = @{ + Ensure = 'Present' + } + + <# + Populate the properties for get target resource by looping through + the parameter array list and adding the values to + #> + foreach ($parameter in $script:parameterList) + { + if ($parameter.Type -in @('Array', 'ArrayIP')) + { + $parameterValue = @(Get-FirewallPropertyValue ` + -FirewallRule $firewallRule ` + -Properties $properties ` + -Parameter $parameter) + if ($parameter.Delimiter) + { + $parameterValue = $parameterValue -split $parameter.Delimiter + } + + $result += @{ + $parameter.Name = $parameterValue + } + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallParameterValueMessage) -f ` + $Name, $parameter.Name, ($parameterValue -join ',') + ) -join '') + } + else + { + $parameterValue = Get-FirewallPropertyValue ` + -FirewallRule $firewallRule ` + -Properties $properties ` + -Parameter $parameter + + $result += @{ + $parameter.Name = $parameterValue + } + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallParameterValueMessage) -f ` + $Name, $parameter.Name, $parameterValue + ) -join '') + } + } + return $result +} + +<# + .SYNOPSIS + Create, update or delete the Firewall Rule. + + .PARAMETER Name + Name of the firewall rule. + + .PARAMETER DisplayName + Localized, user-facing name of the firewall rule being created. + + .PARAMETER Group + Name of the firewall group where we want to put the firewall rule. + + .PARAMETER Ensure + Ensure that the firewall rule exists. + + .PARAMETER Enabled + Enable or Disable the supplied configuration. + + .PARAMETER Action + Allow or Block the supplied configuration. + + .PARAMETER Profile + Specifies one or more profiles to which the rule is assigned. + + .PARAMETER Direction + Direction of the connection. + + .PARAMETER RemotePort + Specific port used for filter. Specified by port number, range, or keyword. + + .PARAMETER LocalPort + Local port used for the filter. + + .PARAMETER Protocol + Specific protocol for filter. Specified by name, number, or range. + + .PARAMETER Description + Documentation for the rule. + + .PARAMETER Program + Path and filename of the program for which the rule is applied. + + .PARAMETER Service + Specifies the short name of a Windows service to which the firewall rule applies. + + .PARAMETER Authentication + Specifies that authentication is required on firewall rules. + + .PARAMETER Encryption + Specifies that encryption in authentication is required on firewall rules. + + .PARAMETER InterfaceAlias + Specifies the alias of the interface that applies to the traffic. + + .PARAMETER InterfaceType + Specifies that only network connections made through the indicated interface types are subject + to the requirements of this rule. + + .PARAMETER LocalAddress + Specifies that network packets with matching IP addresses match this rule. This parameter value + is the first end point of an IPsec rule and specifies the computers that are subject to the + requirements of this rule. This parameter value is an IPv4 or IPv6 address, hostname, subnet, + range, or the following keyword: Any. + + .PARAMETER LocalUser + Specifies the principals to which network traffic this firewall rule applies. The principals, + represented by security identifiers (SIDs) in the security descriptor definition language (SDDL) + string, are services, users, application containers, or any SID to which network traffic is + associated. + + .PARAMETER Package + Specifies the Windows Store application to which the firewall rule applies. This parameter is + specified as a security identifier (SID). + + .PARAMETER Platform + Specifies which version of Windows the associated rule applies. + + .PARAMETER RemoteAddress + Specifies that network packets with matching IP addresses match this rule. This parameter value + is the second end point of an IPsec rule and specifies the computers that are subject to the + requirements of this rule. This parameter value is an IPv4 or IPv6 address, hostname, subnet, + range, or the following keyword: Any + + .PARAMETER RemoteMachine + Specifies that matching IPsec rules of the indicated computer accounts are created. This + parameter specifies that only network packets that are authenticated as incoming from or + outgoing to a computer identified in the list of computer accounts (SID) match this rule. + This parameter value is specified as an SDDL string. + + .PARAMETER RemoteUser + Specifies that matching IPsec rules of the indicated user accounts are created. This parameter + specifies that only network packets that are authenticated as incoming from or outgoing to a + user identified in the list of user accounts match this rule. This parameter value is specified + as an SDDL string. + + .PARAMETER DynamicTransport + Specifies a dynamic transport. + + .PARAMETER EdgeTraversalPolicy + Specifies that matching firewall rules of the indicated edge traversal policy are created. + + .PARAMETER IcmpType + Specifies the ICMP type codes. + + .PARAMETER LocalOnlyMapping + Indicates that matching firewall rules of the indicated value are created. + + .PARAMETER LooseSourceMapping + Indicates that matching firewall rules of the indicated value are created. + + .PARAMETER OverrideBlockRules + Indicates that matching network traffic that would otherwise be blocked are allowed. + + .PARAMETER Owner + Specifies that matching firewall rules of the indicated owner are created. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Name, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $DisplayName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Group, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('True', 'False')] + [String] + $Enabled, + + [Parameter()] + [ValidateSet('NotConfigured', 'Allow', 'Block')] + [String] + $Action, + + [Parameter()] + [String[]] + $Profile, + + [Parameter()] + [ValidateSet('Inbound', 'Outbound')] + [String] + $Direction, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $RemotePort, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $LocalPort, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Protocol, + + [Parameter()] + [String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Program, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Service, + + [Parameter()] + [ValidateSet('NotRequired', 'Required', 'NoEncap')] + [String] + $Authentication, + + [Parameter()] + [ValidateSet('NotRequired', 'Required', 'Dynamic')] + [String] + $Encryption, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('Any', 'Wired', 'Wireless', 'RemoteAccess')] + [String] + $InterfaceType, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $LocalAddress, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $LocalUser, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Package, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $Platform, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $RemoteAddress, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $RemoteMachine, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $RemoteUser, + + [Parameter()] + [ValidateSet('Any', 'ProximityApps', 'ProximitySharing', 'WifiDirectPrinting', 'WifiDirectDisplay', 'WifiDirectDevices')] + [String] + $DynamicTransport, + + [Parameter()] + [ValidateSet('Block', 'Allow', 'DeferToUser', 'DeferToApp')] + [String] + $EdgeTraversalPolicy, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $IcmpType, + + [Parameter()] + [Boolean] + $LocalOnlyMapping, + + [Parameter()] + [Boolean] + $LooseSourceMapping, + + [Parameter()] + [Boolean] + $OverrideBlockRules, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Owner + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingFirewallRuleMessage) -f $Name + ) -join '') + + # Remove any parameters not used in Splats + $null = $PSBoundParameters.Remove('Ensure') + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FindFirewallRuleMessage) -f $Name + ) -join '') + $firewallRule = Get-FirewallRule -Name $Name + + $exists = ($null -ne $firewallRule) + + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleShouldExistMessage) -f $Name, $Ensure + ) -join '') + + if ($exists) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleShouldExistAndDoesMessage) -f $Name + ) -join '') + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckFirewallRuleParametersMessage) -f $Name + ) -join '') + + if (-not (Test-RuleProperties -FirewallRule $firewallRule @PSBoundParameters)) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.UpdatingExistingFirewallMessage) -f $Name + ) -join '') + + # If the Group is being changed the the rule needs to be recreated + if ($PSBoundParameters.ContainsKey('Group') ` + -and ($Group -ne $FirewallRule.Group)) + { + Remove-NetFirewallRule -Name (ConvertTo-FirewallRuleNameEscapedString -Name $Name) + + <# + Merge the existing rule values into the PSBoundParameters + so that it can be splatted. + #> + $properties = Get-FirewallRuleProperty -FirewallRule $firewallRule + + <# + Loop through each possible property and if it is not passed as a parameter + then set the PSBoundParameter property to the exiting rule value. + #> + foreach ($parameter in $ParametersList) + { + if (-not $PSBoundParameters.ContainsKey($parameter.Name)) + { + $parameterValue = Get-FirewallPropertyValue ` + -FirewallRule $firewallRule ` + -Properties $properties ` + -Parameter $parameter + + if ($ParameterValue) + { + $null = $PSBoundParameters.Add($parameter.Name, $ParameterValue) + } + } + } + + New-NetFirewallRule @PSBoundParameters + } + else + { + # Group is a lookup key parameter that cannot be used in conjunction with Name + $null = $PSBoundParameters.Remove('Group') + + <# + If the DisplayName is provided then need to remove it + And change it to NewDisplayName if it is different. + #> + if ($PSBoundParameters.ContainsKey('DisplayName')) + { + $null = $PSBoundParameters.Remove('DisplayName') + if ($DisplayName -ne $FirewallRule.DisplayName) + { + $null = $PSBoundParameters.Add('NewDisplayName', $DisplayName) + } + } + + # Escape firewall rule name to ensure that wildcard update is not used + $PSBoundParameters['Name'] = ConvertTo-FirewallRuleNameEscapedString -Name $Name + + # Set the existing Firewall rule based on specified parameters + Set-NetFirewallRule @PSBoundParameters + } + } + } + else + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleShouldExistAndDoesNotMessage) -f $Name + ) -join '') + + # Set any default parameter values + if (-not $DisplayName) + { + if (-not $PSBoundParameters.ContainsKey('DisplayName')) + { + $null = $PSBoundParameters.Add('DisplayName', $Name) + } + else + { + $PSBoundParameters.DisplayName = $Name + } + } + + # Add the new Firewall rule based on specified parameters + New-NetFirewallRule @PSBoundParameters + } + } + else + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleShouldNotExistMessage) -f $Name, $Ensure + ) -join '') + + if ($exists) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleShouldNotExistButDoesMessage) -f $Name + ) -join '') + + # Remove the existing Firewall rule + Remove-NetFirewallRule -Name (ConvertTo-FirewallRuleNameEscapedString -Name $Name) + } + else + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleShouldNotExistAndDoesNotMessage) -f $Name + ) -join '') + # Do Nothing + } + } +} + +<# + .SYNOPSIS + Test if Firewall Rule is in the required state. + + .PARAMETER Name + Name of the firewall rule. + + .PARAMETER DisplayName + Localized, user-facing name of the firewall rule being created. + + .PARAMETER Group + Name of the firewall group where we want to put the firewall rule. + + .PARAMETER Ensure + Ensure that the firewall rule exists. + + .PARAMETER Enabled + Enable or Disable the supplied configuration. + + .PARAMETER Action + Allow or Block the supplied configuration. + + .PARAMETER Profile + Specifies one or more profiles to which the rule is assigned. + + .PARAMETER Direction + Direction of the connection. + + .PARAMETER RemotePort + Specific port used for filter. Specified by port number, range, or keyword. + + .PARAMETER LocalPort + Local port used for the filter. + + .PARAMETER Protocol + Specific protocol for filter. Specified by name, number, or range. + + .PARAMETER Description + Documentation for the rule. + + .PARAMETER Program + Path and filename of the program for which the rule is applied. + + .PARAMETER Service + Specifies the short name of a Windows service to which the firewall rule applies. + + .PARAMETER Authentication + Specifies that authentication is required on firewall rules. + + .PARAMETER Encryption + Specifies that encryption in authentication is required on firewall rules. + + .PARAMETER InterfaceAlias + Specifies the alias of the interface that applies to the traffic. + + .PARAMETER InterfaceType + Specifies that only network connections made through the indicated interface types are subject + to the requirements of this rule. + + .PARAMETER LocalAddress + Specifies that network packets with matching IP addresses match this rule. This parameter value + is the first end point of an IPsec rule and specifies the computers that are subject to the + requirements of this rule. This parameter value is an IPv4 or IPv6 address, hostname, subnet, + range, or the following keyword: Any. + + .PARAMETER LocalUser + Specifies the principals to which network traffic this firewall rule applies. The principals, + represented by security identifiers (SIDs) in the security descriptor definition language (SDDL) + string, are services, users, application containers, or any SID to which network traffic is + associated. + + .PARAMETER Package + Specifies the Windows Store application to which the firewall rule applies. This parameter is + specified as a security identifier (SID). + + .PARAMETER Platform + Specifies which version of Windows the associated rule applies. + + .PARAMETER RemoteAddress + Specifies that network packets with matching IP addresses match this rule. This parameter value + is the second end point of an IPsec rule and specifies the computers that are subject to the + requirements of this rule. This parameter value is an IPv4 or IPv6 address, hostname, subnet, + range, or the following keyword: Any + + .PARAMETER RemoteMachine + Specifies that matching IPsec rules of the indicated computer accounts are created. This + parameter specifies that only network packets that are authenticated as incoming from or + outgoing to a computer identified in the list of computer accounts (SID) match this rule. + This parameter value is specified as an SDDL string. + + .PARAMETER RemoteUser + Specifies that matching IPsec rules of the indicated user accounts are created. This parameter + specifies that only network packets that are authenticated as incoming from or outgoing to a + user identified in the list of user accounts match this rule. This parameter value is specified + as an SDDL string. + + .PARAMETER DynamicTransport + Specifies a dynamic transport. + + .PARAMETER EdgeTraversalPolicy + Specifies that matching firewall rules of the indicated edge traversal policy are created. + + .PARAMETER IcmpType + Specifies the ICMP type codes. + + .PARAMETER LocalOnlyMapping + Indicates that matching firewall rules of the indicated value are created. + + .PARAMETER LooseSourceMapping + Indicates that matching firewall rules of the indicated value are created. + + .PARAMETER OverrideBlockRules + Indicates that matching network traffic that would otherwise be blocked are allowed. + + .PARAMETER Owner + Specifies that matching firewall rules of the indicated owner are created. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Name, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $DisplayName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Group, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('True', 'False')] + [String] + $Enabled, + + [Parameter()] + [ValidateSet('NotConfigured', 'Allow', 'Block')] + [String] + $Action, + + [Parameter()] + [String[]] + $Profile, + + [Parameter()] + [ValidateSet('Inbound', 'Outbound')] + [String] + $Direction, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $RemotePort, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $LocalPort, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Protocol, + + [Parameter()] + [String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Program, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Service, + + [Parameter()] + [ValidateSet('NotRequired', 'Required', 'NoEncap')] + [String] + $Authentication, + + [Parameter()] + [ValidateSet('NotRequired', 'Required', 'Dynamic')] + [String] + $Encryption, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('Any', 'Wired', 'Wireless', 'RemoteAccess')] + [String] + $InterfaceType, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $LocalAddress, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $LocalUser, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Package, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $Platform, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $RemoteAddress, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $RemoteMachine, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $RemoteUser, + + [Parameter()] + [ValidateSet('Any', 'ProximityApps', 'ProximitySharing', 'WifiDirectPrinting', 'WifiDirectDisplay', 'WifiDirectDevices')] + [String] + $DynamicTransport, + + [Parameter()] + [ValidateSet('Block', 'Allow', 'DeferToUser', 'DeferToApp')] + [String] + $EdgeTraversalPolicy, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $IcmpType, + + [Parameter()] + [Boolean] + $LocalOnlyMapping, + + [Parameter()] + [Boolean] + $LooseSourceMapping, + + [Parameter()] + [Boolean] + $OverrideBlockRules, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $Owner + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingFirewallRuleMessage) -f $Name + ) -join '') + + # Remove any parameters not used in Splats + $null = $PSBoundParameters.Remove('Ensure') + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FindFirewallRuleMessage) -f $Name + ) -join '') + + $firewallRule = Get-FirewallRule -Name $Name + + $exists = ($null -ne $firewallRule) + + if (-not $exists) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleDoesNotExistMessage) -f $Name + ) -join '') + + # Returns whether complies with $Ensure + $returnValue = ($false -eq ($Ensure -eq 'Present')) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingFirewallReturningMessage) -f $Name, $returnValue + ) -join '') + + return $returnValue + } + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckFirewallRuleParametersMessage) -f $Name + ) -join '') + + $desiredConfigurationMatch = Test-RuleProperties -FirewallRule $firewallRule @PSBoundParameters + + # Returns whether or not $exists complies with $Ensure + $returnValue = ($desiredConfigurationMatch -and $exists -eq ($Ensure -eq 'Present')) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingFirewallReturningMessage) -f $Name, $returnValue + ) -join '') + + return $returnValue +} + +<# + .SYNOPSIS + Tests if the properties in the supplied Firewall Rule match the expected parameters passed. + + .PARAMETER FirewallRule + The firewall rule object to compare the properties of. + + .PARAMETER Name + Name of the firewall rule. + + .PARAMETER DisplayName + Localized, user-facing name of the firewall rule being created. + + .PARAMETER Group + Name of the firewall group where we want to put the firewall rule. + + .PARAMETER Ensure + Ensure that the firewall rule exists. + + .PARAMETER Enabled + Enable or Disable the supplied configuration. + + .PARAMETER Action + Allow or Block the supplied configuration. + + .PARAMETER Profile + Specifies one or more profiles to which the rule is assigned. + + .PARAMETER Direction + Direction of the connection. + + .PARAMETER RemotePort + Specific port used for filter. Specified by port number, range, or keyword. + + .PARAMETER LocalPort + Local port used for the filter. + + .PARAMETER Protocol + Specific protocol for filter. Specified by name, number, or range. + + .PARAMETER Description + Documentation for the rule. + + .PARAMETER Program + Path and filename of the program for which the rule is applied. + + .PARAMETER Service + Specifies the short name of a Windows service to which the firewall rule applies. + + .PARAMETER Authentication + Specifies that authentication is required on firewall rules. + + .PARAMETER Encryption + Specifies that encryption in authentication is required on firewall rules. + + .PARAMETER InterfaceAlias + Specifies the alias of the interface that applies to the traffic. + + .PARAMETER InterfaceType + Specifies that only network connections made through the indicated interface types are subject + to the requirements of this rule. + + .PARAMETER LocalAddress + Specifies that network packets with matching IP addresses match this rule. This parameter value + is the first end point of an IPsec rule and specifies the computers that are subject to the + requirements of this rule. This parameter value is an IPv4 or IPv6 address, hostname, subnet, + range, or the following keyword: Any. + + .PARAMETER LocalUser + Specifies the principals to which network traffic this firewall rule applies. The principals, + represented by security identifiers (SIDs) in the security descriptor definition language (SDDL) + string, are services, users, application containers, or any SID to which network traffic is + associated. + + .PARAMETER Package + Specifies the Windows Store application to which the firewall rule applies. This parameter is + specified as a security identifier (SID). + + .PARAMETER Platform + Specifies which version of Windows the associated rule applies. + + .PARAMETER RemoteAddress + Specifies that network packets with matching IP addresses match this rule. This parameter value + is the second end point of an IPsec rule and specifies the computers that are subject to the + requirements of this rule. This parameter value is an IPv4 or IPv6 address, hostname, subnet, + range, or the following keyword: Any + + .PARAMETER RemoteMachine + Specifies that matching IPsec rules of the indicated computer accounts are created. This + parameter specifies that only network packets that are authenticated as incoming from or + outgoing to a computer identified in the list of computer accounts (SID) match this rule. + This parameter value is specified as an SDDL string. + + .PARAMETER RemoteUser + Specifies that matching IPsec rules of the indicated user accounts are created. This parameter + specifies that only network packets that are authenticated as incoming from or outgoing to a + user identified in the list of user accounts match this rule. This parameter value is specified + as an SDDL string. + + .PARAMETER DynamicTransport + Specifies a dynamic transport. + + .PARAMETER EdgeTraversalPolicy + Specifies that matching firewall rules of the indicated edge traversal policy are created. + + .PARAMETER IcmpType + Specifies the ICMP type codes. + + .PARAMETER LocalOnlyMapping + Indicates that matching firewall rules of the indicated value are created. + + .PARAMETER LooseSourceMapping + Indicates that matching firewall rules of the indicated value are created. + + .PARAMETER OverrideBlockRules + Indicates that matching network traffic that would otherwise be blocked are allowed. + + .PARAMETER Owner + Specifies that matching firewall rules of the indicated owner are created. +#> +function Test-RuleProperties +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + $FirewallRule, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Name, + + [Parameter()] + [String] + $DisplayName, + + [Parameter()] + [String] + $Group, + + [Parameter()] + [String] + $DisplayGroup, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('True', 'False')] + [String] + $Enabled, + + [Parameter()] + [ValidateSet('NotConfigured', 'Allow', 'Block')] + [String] + $Action, + + [Parameter()] + [String[]] + $Profile, + + [Parameter()] + [ValidateSet('Inbound', 'Outbound')] + [String] + $Direction, + + [Parameter()] + [String[]] + $RemotePort, + + [Parameter()] + [String[]] + $LocalPort, + + [Parameter()] + [String] + $Protocol, + + [Parameter()] + [String] + $Description, + + [Parameter()] + [String] + $Program, + + [Parameter()] + [String] + $Service, + + [Parameter()] + [ValidateSet('NotRequired', 'Required', 'NoEncap')] + [String] + $Authentication, + + [Parameter()] + [ValidateSet('NotRequired', 'Required', 'Dynamic')] + [String] + $Encryption, + + [Parameter()] + [String[]] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('Any', 'Wired', 'Wireless', 'RemoteAccess')] + [String] + $InterfaceType, + + [Parameter()] + [String[]] + $LocalAddress, + + [Parameter()] + [String] + $LocalUser, + + [Parameter()] + [String] + $Package, + + [Parameter()] + [String[]] + $Platform, + + [Parameter()] + [String[]] + $RemoteAddress, + + [Parameter()] + [String] + $RemoteMachine, + + [Parameter()] + [String] + $RemoteUser, + + [Parameter()] + [ValidateSet('Any', 'ProximityApps', 'ProximitySharing', 'WifiDirectPrinting', 'WifiDirectDisplay', 'WifiDirectDevices')] + [String] + $DynamicTransport, + + [Parameter()] + [ValidateSet('Block', 'Allow', 'DeferToUser', 'DeferToApp')] + [String] + $EdgeTraversalPolicy, + + [Parameter()] + [String[]] + $IcmpType, + + [Parameter()] + [Boolean] + $LocalOnlyMapping, + + [Parameter()] + [Boolean] + $LooseSourceMapping, + + [Parameter()] + [Boolean] + $OverrideBlockRules, + + [Parameter()] + [String] + $Owner + ) + + $properties = Get-FirewallRuleProperty -FirewallRule $FirewallRule + $desiredConfigurationMatch = $true + + <# + Loop through the $script:parameterList array and compare the source + with the value of each parameter. If different then set $desiredConfigurationMatch + to false. + #> + foreach ($parameter in $script:parameterList) + { + $parameterValue = Get-FirewallPropertyValue ` + -FirewallRule $firewallRule ` + -Properties $properties ` + -Parameter $parameter + + $parameterNew = (Get-Variable -Name ($parameter.Name)).Value + + switch -Wildcard ($parameter.Type) + { + 'String' + { + # Perform a plain string comparison. + if ($parameterNew -and ($parameterValue -ne $parameterNew)) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.PropertyNoMatchMessage) ` + -f $parameter.Name, $parameterValue, $parameterNew + ) -join '') + + $desiredConfigurationMatch = $false + } + } + + 'Boolean' + { + # Perform a boolean comparison. + if ($parameterNew -and ($parameterValue -ne $parameterNew)) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.PropertyNoMatchMessage) ` + -f $parameter.Name, $parameterValue, $parameterNew + ) -join '') + $desiredConfigurationMatch = $false + } + } + + 'Array*' + { + # Array comparison uses Compare-Object + if ($null -eq $parameterValue) + { + $parameterValue = @() + } + + if ($parameter.Delimiter) + { + $parameterValue = $parameterValue -split $parameter.Delimiter + } + + if ($parameter.Type -eq 'ArrayIP') + { + <# + IPArray comparison uses Compare-Object, except needs to convert any IP addresses + that use CIDR notation to use Subnet Mask notification because this is the + format that the Get-NetFirewallAddressFilter will return the IP addresses in + even if they were set using CIDR notation. + #> + if ($null -ne $parameterNew) + { + $parameterNew = Convert-CIDRToSubhetMask -Address $parameterNew + } + } + + if ($parameterNew ` + -and ((Compare-Object ` + -ReferenceObject $parameterValue ` + -DifferenceObject $parameterNew).Count -ne 0)) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.PropertyNoMatchMessage) ` + -f $parameter.Name, ($parameterValue -join ','), ($parameterNew -join ',') + ) -join '') + $desiredConfigurationMatch = $false + } + } + } + } + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.TestFirewallRuleReturningMessage) -f $Name, $desiredConfigurationMatch + ) -join '') + return $desiredConfigurationMatch +} + +<# + .SYNOPSIS + Returns a Firewall object matching the specified name. + + .PARAMETER Name + The name of the Firewall Rule to Retrieve. +#> +function Get-FirewallRule +{ + [CmdletBinding()] + [OutputType([Microsoft.Management.Infrastructure.CimInstance])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Name + ) + + $firewallRule = @(Get-NetFirewallRule -Name (ConvertTo-FirewallRuleNameEscapedString -Name $Name) -ErrorAction SilentlyContinue) + + if (-not $firewallRule) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallRuleNotFoundMessage) -f $Name + ) -join '') + return $null + } + + <# + If more than one rule is returned for a name, then throw an exception + because this should not be possible. + #> + if ($firewallRule.Count -gt 1) + { + New-InvalidOperationException ` + -Message ($script:localizedData.RuleNotUniqueError -f $firewallRule.Count, $Name) + } + + # The array will only contain a single rule so only return the first one (not the array) + return $firewallRule[0] +} + +<# + .SYNOPSIS + Returns a Hashtable containing the component Firewall objects for the specified Firewall Rule. + + .PARAMETER FirewallRule + The firewall rule object to pull the additional firewall objects for. +#> +function Get-FirewallRuleProperty +{ + [CmdletBinding()] + [OutputType([HashTable])] + param + ( + [Parameter(Mandatory = $true)] + $FirewallRule + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GetAllPropertiesMessage) + ) -join '') + + return @{ + AddressFilters = @(Get-NetFirewallAddressFilter -AssociatedNetFirewallRule $FirewallRule) + ApplicationFilters = @(Get-NetFirewallApplicationFilter -AssociatedNetFirewallRule $FirewallRule) + InterfaceFilters = @(Get-NetFirewallInterfaceFilter -AssociatedNetFirewallRule $FirewallRule) + InterfaceTypeFilters = @(Get-NetFirewallInterfaceTypeFilter -AssociatedNetFirewallRule $FirewallRule) + PortFilters = @(Get-NetFirewallPortFilter -AssociatedNetFirewallRule $FirewallRule) + Profile = @(Get-NetFirewallProfile -AssociatedNetFirewallRule $FirewallRule) + SecurityFilters = @(Get-NetFirewallSecurityFilter -AssociatedNetFirewallRule $FirewallRule) + ServiceFilters = @(Get-NetFirewallServiceFilter -AssociatedNetFirewallRule $FirewallRule) + } +} + +<# + .SYNOPSIS + Looks up a Firewall Property value using the specified parameterList entry. + + .PARAMETER FirewallRule + The firewall rule object to pull the property from. + + .PARAMETER Properties + The additional firewall objects to pull the property from. + + .PARAMETER Parameter + The entry from the ParameterList table used to retireve the parameter for. +#> +function Get-FirewallPropertyValue +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + $FirewallRule, + + [Parameter(Mandatory = $true)] + $Properties, + + [Parameter(Mandatory = $true)] + $Parameter + ) + + if ($Parameter.Property) + { + return (Get-Variable ` + -Name ($Parameter.Variable)).value.$($Parameter.Property).$($Parameter.Name) + } + else + { + return (Get-Variable ` + -Name ($Parameter.Variable)).value.$($Parameter.Name) + } +} + +<# + .SYNOPSIS + Convert Firewall Rule name to Escape Wildcard Characters. + + It will append '[', ']' and '*' with a backtick. + + .PARAMETER Name + The firewall rule name to escape. +#> +function ConvertTo-FirewallRuleNameEscapedString +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + $Name + ) + + return $Name.Replace('[','`[').Replace(']','`]').Replace('*','`*') +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.schema.mof new file mode 100644 index 0000000..ab75049 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/DSC_Firewall.schema.mof @@ -0,0 +1,37 @@ +[ClassVersion("1.0.0"), FriendlyName("Firewall")] +class DSC_Firewall : OMI_BaseResource +{ + [Key, Description("Name of the Firewall Rule.")] String Name; + [Write, Description("Localized, user-facing name of the Firewall Rule being created.")] String DisplayName; + [Write, Description("Name of the Firewall Group where we want to put the Firewall Rule.")] string Group; + [Write, Description("Ensure the presence/absence of the resource."), ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [Write, Description("Enable or disable the supplied configuration."), ValueMap{"True", "False"},Values{"True", "False"}] string Enabled; + [Write, Description("Allow or Block the supplied configuration."), ValueMap{"NotConfigured", "Allow", "Block"}, Values{"NotConfigured", "Allow", "Block"}] String Action; + [Write, Description("Specifies one or more profiles to which the rule is assigned.")] String Profile[]; + [Write, Description("Direction of the connection."), ValueMap{"Inbound","Outbound"}, Values{"Inbound","Outbound"}] String Direction; + [Write, Description("Specific Port used for filter. Specified by port number, range, or keyword")] String RemotePort[]; + [Write, Description("Local Port used for the filter.")] String LocalPort[]; + [Write, Description("Specific Protocol for filter. Specified by name, number, or range.")] String Protocol; + [Write, Description("Documentation for the Rule.")] String Description; + [Write, Description("Path and file name of the program for which the rule is applied.")] String Program; + [Write, Description("Specifies the short name of a Windows service to which the firewall rule applies.")] String Service; + [Write, Description("Specifies that authentication is required on firewall rules."), ValueMap{"NotRequired", "Required", "NoEncap"}, Values{"NotRequired", "Required", "NoEncap"}] String Authentication; + [Write, Description("Specifies that encryption in authentication is required on firewall rules."), ValueMap{"NotRequired", "Required", "Dynamic"}, Values{"NotRequired", "Required", "Dynamic"}] String Encryption; + [Write, Description("Specifies the alias of the interface that applies to the traffic.")] String InterfaceAlias[]; + [Write, Description("Specifies that only network connections made through the indicated interface types are subject to the requirements of this rule."), ValueMap{"Any", "Wired", "Wireless", "RemoteAccess"}, Values{"Any", "Wired", "Wireless", "RemoteAccess"}] String InterfaceType; + [Write, Description("Specifies that network packets with matching IP addresses match this rule.")] String LocalAddress[]; + [Write, Description("Specifies the principals to which network traffic this firewall rule applies.")] String LocalUser; + [Write, Description("Specifies the Windows Store application to which the firewall rule applies.")] String Package; + [Write, Description("Specifies which version of Windows the associated rule applies.")] String Platform[]; + [Write, Description("Specifies that network packets with matching IP addresses match this rule.")] String RemoteAddress[]; + [Write, Description("Specifies that matching IPsec rules of the indicated computer accounts are created.")] String RemoteMachine; + [Write, Description("Specifies that matching IPsec rules of the indicated user accounts are created.")] String RemoteUser; + [Write, Description("Specifies a dynamic transport."), ValueMap{"Any","ProximityApps","ProximitySharing","WifiDirectPrinting","WifiDirectDisplay","WifiDirectDevices"},Values{"Any","ProximityApps","ProximitySharing","WifiDirectPrinting","WifiDirectDisplay","WifiDirectDevices"}] String DynamicTransport; + [Write, Description("Specifies that matching firewall rules of the indicated edge traversal policy are created."), ValueMap{"Block","Allow","DeferToUser","DeferToApp"},Values{"Block","Allow","DeferToUser","DeferToApp"}] String EdgeTraversalPolicy; + [Write, Description("Specifies the ICMP type codes.")] String IcmpType[]; + [Write, Description("Indicates that matching firewall rules of the indicated value are created.")] Boolean LocalOnlyMapping; + [Write, Description("Indicates that matching firewall rules of the indicated value are created.")] Boolean LooseSourceMapping; + [Write, Description("Indicates that matching network traffic that would otherwise be blocked are allowed.")] Boolean OverrideBlockRules; + [Write, Description("Specifies that matching firewall rules of the indicated owner are created.")] String Owner; + [Read, Description("The current value of the Display Group of the Firewall Rule.")] string DisplayGroup; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/README.MD new file mode 100644 index 0000000..86b89a8 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to control firewall rules for a node. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/en-US/DSC_Firewall.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/en-US/DSC_Firewall.strings.psd1 new file mode 100644 index 0000000..9bc0265 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/en-US/DSC_Firewall.strings.psd1 @@ -0,0 +1,24 @@ +# Localized resources for DSC_Firewall + +ConvertFrom-StringData @' + GettingFirewallRuleMessage = Getting firewall rule with Name '{0}'. + FirewallRuleDoesNotExistMessage = Firewall rule with Name '{0}' does not exist. + FirewallParameterValueMessage = Firewall rule with Name '{0}' parameter {1} is '{2}'. + ApplyingFirewallRuleMessage = Applying settings for firewall rule with Name '{0}'. + FindFirewallRuleMessage = Find firewall rule with Name '{0}'. + FirewallRuleShouldExistMessage = We want the firewall rule with Name '{0}' to exist since Ensure is set to {1}. + FirewallRuleShouldExistAndDoesMessage = We want the firewall rule with Name '{0}' to exist and it does. Check for valid properties. + CheckFirewallRuleParametersMessage = Check each defined parameter against the existing firewall rule with Name '{0}'. + UpdatingExistingFirewallMessage = Updating existing firewall rule with Name '{0}'. + FirewallRuleShouldExistAndDoesNotMessage = We want the firewall rule with Name '{0}' to exist, but it does not. + FirewallRuleShouldNotExistMessage = We do not want the firewall rule with Name '{0}' to exist since Ensure is set to {1}. + FirewallRuleShouldNotExistButDoesMessage = We do not want the firewall rule with Name '{0}' to exist, but it does. Removing it. + FirewallRuleShouldNotExistAndDoesNotMessage = We do not want the firewall rule with Name '{0}' to exist, and it does not. + CheckingFirewallRuleMessage = Checking settings for firewall rule with Name '{0}'. + CheckingFirewallReturningMessage = Check Firewall rule with Name '{0}' returning {1}. + PropertyNoMatchMessage = {0} property value '{1}' does not match desired state '{2}'. + TestFirewallRuleReturningMessage = Test Firewall rule with Name '{0}' returning {1}. + FirewallRuleNotFoundMessage = No Firewall Rule found with Name '{0}'. + GetAllPropertiesMessage = Get all the properties and add filter info to rule map. + RuleNotUniqueError = {0} Firewall Rules with the Name '{1}' were found. Only one expected. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/en-US/about_Firewall.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/en-US/about_Firewall.help.txt new file mode 100644 index 0000000..8e07d04 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Firewall/en-US/about_Firewall.help.txt @@ -0,0 +1,275 @@ +.NAME + Firewall + +.DESCRIPTION + This resource is used to control firewall rules for a node. + +.PARAMETER Name + Key - String + Name of the Firewall Rule. + +.PARAMETER DisplayName + Write - String + Localized, user-facing name of the Firewall Rule being created. + +.PARAMETER Group + Write - String + Name of the Firewall Group where we want to put the Firewall Rule. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Ensure the presence/absence of the resource. + +.PARAMETER Enabled + Write - String + Allowed values: True, False + Enable or disable the supplied configuration. + +.PARAMETER Action + Write - String + Allowed values: NotConfigured, Allow, Block + Allow or Block the supplied configuration. + +.PARAMETER Profile + Write - StringArray + Specifies one or more profiles to which the rule is assigned. + +.PARAMETER Direction + Write - String + Allowed values: Inbound, Outbound + Direction of the connection. + +.PARAMETER RemotePort + Write - StringArray + Specific Port used for filter. Specified by port number, range, or keyword + +.PARAMETER LocalPort + Write - StringArray + Local Port used for the filter. + +.PARAMETER Protocol + Write - String + Specific Protocol for filter. Specified by name, number, or range. + +.PARAMETER Description + Write - String + Documentation for the Rule. + +.PARAMETER Program + Write - String + Path and file name of the program for which the rule is applied. + +.PARAMETER Service + Write - String + Specifies the short name of a Windows service to which the firewall rule applies. + +.PARAMETER Authentication + Write - String + Allowed values: NotRequired, Required, NoEncap + Specifies that authentication is required on firewall rules. + +.PARAMETER Encryption + Write - String + Allowed values: NotRequired, Required, Dynamic + Specifies that encryption in authentication is required on firewall rules. + +.PARAMETER InterfaceAlias + Write - StringArray + Specifies the alias of the interface that applies to the traffic. + +.PARAMETER InterfaceType + Write - String + Allowed values: Any, Wired, Wireless, RemoteAccess + Specifies that only network connections made through the indicated interface types are subject to the requirements of this rule. + +.PARAMETER LocalAddress + Write - StringArray + Specifies that network packets with matching IP addresses match this rule. + +.PARAMETER LocalUser + Write - String + Specifies the principals to which network traffic this firewall rule applies. + +.PARAMETER Package + Write - String + Specifies the Windows Store application to which the firewall rule applies. + +.PARAMETER Platform + Write - StringArray + Specifies which version of Windows the associated rule applies. + +.PARAMETER RemoteAddress + Write - StringArray + Specifies that network packets with matching IP addresses match this rule. + +.PARAMETER RemoteMachine + Write - String + Specifies that matching IPsec rules of the indicated computer accounts are created. + +.PARAMETER RemoteUser + Write - String + Specifies that matching IPsec rules of the indicated user accounts are created. + +.PARAMETER DynamicTransport + Write - String + Allowed values: Any, ProximityApps, ProximitySharing, WifiDirectPrinting, WifiDirectDisplay, WifiDirectDevices + Specifies a dynamic transport. + +.PARAMETER EdgeTraversalPolicy + Write - String + Allowed values: Block, Allow, DeferToUser, DeferToApp + Specifies that matching firewall rules of the indicated edge traversal policy are created. + +.PARAMETER IcmpType + Write - StringArray + Specifies the ICMP type codes. + +.PARAMETER LocalOnlyMapping + Write - Boolean + Indicates that matching firewall rules of the indicated value are created. + +.PARAMETER LooseSourceMapping + Write - Boolean + Indicates that matching firewall rules of the indicated value are created. + +.PARAMETER OverrideBlockRules + Write - Boolean + Indicates that matching network traffic that would otherwise be blocked are allowed. + +.PARAMETER Owner + Write - String + Specifies that matching firewall rules of the indicated owner are created. + +.PARAMETER DisplayGroup + Read - String + The current value of the Display Group of the Firewall Rule. + +.EXAMPLE 1 + +Allow notepad to access ports on the Domain and Private Profiles. + +Configuration Firewall_AddFirewallRule_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + Firewall AddFirewallRule + { + Name = 'NotePadFirewallRule' + DisplayName = 'Firewall Rule for Notepad.exe' + Group = 'NotePad Firewall Rule Group' + Ensure = 'Present' + Enabled = 'True' + Profile = ('Domain', 'Private') + Direction = 'OutBound' + RemotePort = ('8080', '8081') + LocalPort = ('9080', '9081') + Protocol = 'TCP' + Description = 'Firewall Rule for Notepad.exe' + Program = 'c:\windows\system32\notepad.exe' + Service = 'WinRM' + } + } + } + +.EXAMPLE 2 + +Configure a network firewall rule using all parameters. +Note: This configuration sample uses all Firewall rule parameters. +It is only used to show example usage and should not be created. + +Configuration Firewall_AddFirewallRule_AllParameters_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + Firewall AddFirewallRuleAllParameters + { + Name = 'NotePadFirewallRule' + DisplayName = 'Firewall Rule for Notepad.exe' + Group = 'NotePad Firewall Rule Group' + Ensure = 'Present' + Enabled = 'True' + Profile = ('Domain', 'Private') + Direction = 'OutBound' + RemotePort = ('8080', '8081') + LocalPort = ('9080', '9081') + Protocol = 'TCP' + Description = 'Firewall Rule for Notepad.exe' + Program = 'c:\windows\system32\notepad.exe' + Service = 'WinRM' + Authentication = 'Required' + Encryption = 'Required' + InterfaceAlias = 'Ethernet' + InterfaceType = 'Wired' + LocalAddress = ('192.168.2.0-192.168.2.128','192.168.1.0/255.255.255.0','10.0.0.0/8') + LocalUser = 'O:LSD:(D;;CC;;;S-1-15-3-4)(A;;CC;;;S-1-5-21-3337988176-3917481366-464002247-1001)' + Package = 'S-1-15-2-3676279713-3632409675-756843784-3388909659-2454753834-4233625902-1413163418' + Platform = '6.1' + RemoteAddress = ('192.168.2.0-192.168.2.128','192.168.1.0/255.255.255.0','10.0.0.0/8') + RemoteMachine = 'O:LSD:(D;;CC;;;S-1-5-21-1915925333-479612515-2636650677-1621)(A;;CC;;;S-1-5-21-1915925333-479612515-2636650677-1620)' + RemoteUser = 'O:LSD:(D;;CC;;;S-1-15-3-4)(A;;CC;;;S-1-5-21-3337988176-3917481366-464002247-1001)' + DynamicTransport = 'ProximitySharing' + EdgeTraversalPolicy = 'Block' + IcmpType = ('51','52') + LocalOnlyMapping = $true + LooseSourceMapping = $true + OverrideBlockRules = $true + Owner = 'S-1-5-21-3337988176-3917481366-464002247-500' + } + } +} + +.EXAMPLE 3 + +Adding a firewall to an existing Firewall group 'My Firewall Rule'. + +Configuration Firewall_AddFirewallRuleToExistingGroup_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + Firewall AddFirewallRuleToExistingGroup + { + Name = 'MyFirewallRule' + DisplayName = 'My Firewall Rule' + Group = 'My Firewall Rule Group' + } + + Firewall Firewall1 + { + Name = 'MyFirewallRule1' + DisplayName = 'My Firewall Rule' + Group = 'My Firewall Rule Group' + Ensure = 'Present' + Enabled = 'True' + Profile = ('Domain', 'Private') + } + } +} + +.EXAMPLE 4 + +DSC configuration that enables the built-in Firewall Rule +'World Wide Web Services (HTTP Traffic-In)'. + +Configuration Firewall_EnableBuiltInFirewallRule_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + Firewall EnableBuiltInFirewallRule + { + Name = 'IIS-WebServerRole-HTTP-In-TCP' + Ensure = 'Present' + Enabled = 'True' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.data.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.data.psd1 new file mode 100644 index 0000000..6c01212 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.data.psd1 @@ -0,0 +1,72 @@ +@{ + ParameterList = @( + @{ + Name = 'AllowInboundRules' + Type = 'String' + }, + @{ + Name = 'AllowLocalFirewallRules' + Type = 'String' + }, + @{ + Name = 'AllowLocalIPsecRules' + Type = 'String' + }, + @{ + Name = 'AllowUnicastResponseToMulticast' + Type = 'String' + }, + @{ + Name = 'AllowUserApps' + Type = 'String' + }, + @{ + Name = 'AllowUserPorts' + Type = 'String' + }, + @{ + Name = 'DefaultInboundAction' + Type = 'String' + }, + @{ + Name = 'DefaultOutboundAction' + Type = 'String' + }, + @{ + Name = 'DisabledInterfaceAliases' + Type = 'Array' + }, + @{ + Name = 'Enabled' + Type = 'String' + }, + @{ + Name = 'EnableStealthModeForIPsec' + Type = 'String' + }, + @{ + Name = 'LogAllowed' + Type = 'String' + }, + @{ + Name = 'LogBlocked' + Type = 'String' + }, + @{ + Name = 'LogFileName' + Type = 'String' + }, + @{ + Name = 'LogIgnored' + Type = 'String' + }, + @{ + Name = 'LogMaxSizeKilobytes' + Type = 'Uint64' + } + @{ + Name = 'NotifyOnListen' + Type = 'String' + } + ) +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.psm1 new file mode 100644 index 0000000..9e0a3c7 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.psm1 @@ -0,0 +1,470 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + This is an array of all the parameters used by this resource. +#> +$resourceData = Import-LocalizedData ` + -BaseDirectory $PSScriptRoot ` + -FileName 'DSC_FirewallProfile.data.psd1' + +# This must be a script parameter so that it is accessible +$script:parameterList = $resourceData.ParameterList + +<# + .SYNOPSIS + Returns the current Firewall Profile. + + .PARAMETER Name + The name of the firewall profile to configure. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Domain', 'Public', 'Private')] + [System.String] + $Name + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingFirewallProfileMessage) ` + -f $Name + ) -join '' ) + + # Get the current Dns Client Global Settings + $netFirewallProfile = Get-NetFirewallProfile -Name $Name ` + -ErrorAction Stop + + # Generate the return object. + $returnValue = @{ + Name = $Name + } + + foreach ($parameter in $script:parameterList) + { + $returnValue += @{ + $parameter.Name = $netFirewallProfile.$($parameter.name) + } + } # foreach + + return $returnValue +} # Get-TargetResource + + +<# + .SYNOPSIS + Sets the Firewall Profile. + + .PARAMETER Name + The name of the firewall profile to configure. + + .PARAMETER AllowInboundRules + Specifies that the firewall blocks inbound traffic. + + .PARAMETER AllowLocalFirewallRules + Specifies that the local firewall rules should be merged into the effective policy + along with Group Policy settings. + + .PARAMETER AllowLocalIPsecRules + Specifies that the local IPsec rules should be merged into the effective policy + along with Group Policy settings. + + .PARAMETER AllowUnicastResponseToMulticast + Allows unicast responses to multi-cast traffic. + + .PARAMETER AllowUserApps + Specifies that traffic from local user applications is allowed through the firewall. + + .PARAMETER AllowUserPorts + Specifies that traffic is allowed through local user ports. + + .PARAMETER DefaultInboundAction + Specifies how to filter inbound traffic. + + .PARAMETER DefaultOutboundAction + Specifies how to filter outbound traffic. + + .PARAMETER DisabledInterfaceAliases + Specifies a list of interfaces on which firewall settings are excluded. + + .PARAMETER Enabled + Specifies that devolution is activated. + + .PARAMETER EnableStealthModeForIPsec + Enables stealth mode for IPsec traffic. + + .PARAMETER LogAllowed + Specifies how to log the allowed packets in the location specified by the + LogFileName parameter. + + .PARAMETER LogBlocked + Specifies how to log the dropped packets in the location specified by the + LogFileName parameter. + + .PARAMETER LogFileName + Specifies the path and filename of the file to which Windows Server writes log entries. + + .PARAMETER LogIgnored + Specifies how to log the ignored packets in the location specified by the LogFileName + parameter. + + .PARAMETER LogMaxSizeKilobytes + Specifies the maximum file size of the log, in kilobytes. The acceptable values for + this parameter are: 1 through 32767. + + .PARAMETER NotifyOnListen + Allows the notification of listening for inbound connections by a service. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Domain', 'Public', 'Private')] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowInboundRules, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowLocalFirewallRules, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowLocalIPsecRules, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowUnicastResponseToMulticast, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowUserApps, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowUserPorts, + + [Parameter()] + [ValidateSet('Block', 'Allow', 'NotConfigured')] + [System.String] + $DefaultInboundAction, + + [Parameter()] + [ValidateSet('Block', 'Allow', 'NotConfigured')] + [System.String] + $DefaultOutboundAction, + + [Parameter()] + [System.String[]] + $DisabledInterfaceAliases, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $Enabled, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $EnableStealthModeForIPsec, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $LogAllowed, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $LogBlocked, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogFileName, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $LogIgnored, + + [Parameter()] + [ValidateRange(1,32767)] + [System.Uint64] + $LogMaxSizeKilobytes, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $NotifyOnListen + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingFirewallProfileMessage) ` + -f $Name + ) -join '' ) + + # Get the current Firewall Profile Settings + $netFirewallProfile = Get-NetFirewallProfile -Name $Name ` + -ErrorAction Stop + + # Generate a list of parameters that will need to be changed. + $changeParameters = @{} + + foreach ($parameter in $script:parameterList) + { + $parameterSourceValue = $netFirewallProfile.$($parameter.name) + $parameterNewValue = (Get-Variable -Name ($parameter.name)).Value + + if ($PSBoundParameters.ContainsKey($parameter.Name) ` + -and (Compare-Object -ReferenceObject $parameterSourceValue -DifferenceObject $parameterNewValue -SyncWindow 0)) + { + $changeParameters += @{ + $($parameter.name) = $parameterNewValue + } + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallProfileUpdateParameterMessage) ` + -f $Name,$parameter.Name,$parameterNewValue + ) -join '' ) + } # if + } # foreach + + if ($changeParameters.Count -gt 0) + { + # Update any parameters that were identified as different + $null = Set-NetFirewallProfile -Name $Name ` + @ChangeParameters ` + -ErrorAction Stop + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallProfileUpdatedMessage) ` + -f $Name + ) -join '' ) + } # if +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the state of Firewall Profile. + + .PARAMETER Name + The name of the firewall profile to configure. + + .PARAMETER AllowInboundRules + Specifies that the firewall blocks inbound traffic. + + .PARAMETER AllowLocalFirewallRules + Specifies that the local firewall rules should be merged into the effective policy + along with Group Policy settings. + + .PARAMETER AllowLocalIPsecRules + Specifies that the local IPsec rules should be merged into the effective policy + along with Group Policy settings. + + .PARAMETER AllowUnicastResponseToMulticast + Allows unicast responses to multi-cast traffic. + + .PARAMETER AllowUserApps + Specifies that traffic from local user applications is allowed through the firewall. + + .PARAMETER AllowUserPorts + Specifies that traffic is allowed through local user ports. + + .PARAMETER DefaultInboundAction + Specifies how to filter inbound traffic. + + .PARAMETER DefaultOutboundAction + Specifies how to filter outbound traffic. + + .PARAMETER DisabledInterfaceAliases + Specifies a list of interfaces on which firewall settings are excluded. + + .PARAMETER Enabled + Specifies that devolution is activated. + + .PARAMETER EnableStealthModeForIPsec + Enables stealth mode for IPsec traffic. + + .PARAMETER LogAllowed + Specifies how to log the allowed packets in the location specified by the + LogFileName parameter. + + .PARAMETER LogBlocked + Specifies how to log the dropped packets in the location specified by the + LogFileName parameter. + + .PARAMETER LogFileName + Specifies the path and filename of the file to which Windows Server writes log entries. + + .PARAMETER LogIgnored + Specifies how to log the ignored packets in the location specified by the LogFileName + parameter. + + .PARAMETER LogMaxSizeKilobytes + Specifies the maximum file size of the log, in kilobytes. The acceptable values for + this parameter are: 1 through 32767. + + .PARAMETER NotifyOnListen + Allows the notification of listening for inbound connections by a service. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Domain', 'Public', 'Private')] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowInboundRules, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowLocalFirewallRules, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowLocalIPsecRules, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowUnicastResponseToMulticast, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowUserApps, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $AllowUserPorts, + + [Parameter()] + [ValidateSet('Block', 'Allow', 'NotConfigured')] + [System.String] + $DefaultInboundAction, + + [Parameter()] + [ValidateSet('Block', 'Allow', 'NotConfigured')] + [System.String] + $DefaultOutboundAction, + + [Parameter()] + [System.String[]] + $DisabledInterfaceAliases, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $Enabled, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $EnableStealthModeForIPsec, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $LogAllowed, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $LogBlocked, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogFileName, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $LogIgnored, + + [Parameter()] + [ValidateRange(1,32767)] + [System.Uint64] + $LogMaxSizeKilobytes, + + [Parameter()] + [ValidateSet('True', 'False', 'NotConfigured')] + [System.String] + $NotifyOnListen + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingFirewallProfileMessage) ` + -f $Name + ) -join '' ) + + # Flag to signal whether settings are correct + $desiredConfigurationMatch = $true + + # Get the current Dns Client Global Settings + $netFirewallProfile = Get-NetFirewallProfile -Name $Name ` + -ErrorAction Stop + + # Check each parameter + foreach ($parameter in $script:parameterList) + { + $parameterSourceValue = $netFirewallProfile.$($parameter.name) + $parameterNewValue = (Get-Variable -Name ($parameter.name)).Value + + if ($PSBoundParameters.ContainsKey($parameter.Name) ` + -and (Compare-Object -ReferenceObject $parameterSourceValue -DifferenceObject $parameterNewValue -SyncWindow 0)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FirewallProfileParameterNeedsUpdateMessage) ` + -f $Name,$parameter.Name,$parameterSourceValue,$parameterNewValue + ) -join '' ) + + $desiredConfigurationMatch = $false + } # if + } # foreach + + return $desiredConfigurationMatch +} # Test-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.schema.mof new file mode 100644 index 0000000..a8133a5 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/DSC_FirewallProfile.schema.mof @@ -0,0 +1,22 @@ +[ClassVersion("1.0.0.0"), FriendlyName("FirewallProfile")] +class DSC_FirewallProfile : OMI_BaseResource +{ + [Key, Description("The name of the firewall profile to configure."), ValueMap{"Domain", "Public", "Private"}, Values{"Domain", "Public", "Private"}] String Name; + [Write, Description("Specifies that the firewall blocks inbound traffic."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String AllowInboundRules; + [Write, Description("Specifies that the local firewall rules should be merged into the effective policy along with Group Policy settings."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String AllowLocalFirewallRules; + [Write, Description("Specifies that the local IPsec rules should be merged into the effective policy along with Group Policy settings."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String AllowLocalIPsecRules; + [Write, Description("Allows unicast responses to multi-cast traffic."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String AllowUnicastResponseToMulticast; + [Write, Description("Specifies that traffic from local user applications is allowed through the firewall."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String AllowUserApps; + [Write, Description("Specifies that traffic is allowed through local user ports."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String AllowUserPorts; + [Write, Description("Specifies how to filter inbound traffic."), ValueMap{"Block", "Allow", "NotConfigured"}, Values{"Block", "Allow", "NotConfigured"}] String DefaultInboundAction; + [Write, Description("Specifies how to filter outbound traffic."), ValueMap{"Block", "Allow", "NotConfigured"}, Values{"Block", "Allow", "NotConfigured"}] String DefaultOutboundAction; + [Write, Description("Specifies a list of interfaces on which firewall settings are excluded.")] String DisabledInterfaceAliases[]; + [Write, Description("Specifies that devolution is activated."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String Enabled; + [Write, Description("Enables stealth mode for IPsec traffic."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String EnableStealthModeForIPsec; + [Write, Description("Specifies how to log the allowed packets in the location specified by the LogFileName parameter."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String LogAllowed; + [Write, Description("Specifies how to log the dropped packets in the location specified by the LogFileName parameter."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String LogBlocked; + [Write, Description("Specifies the path and filename of the file to which Windows Server writes log entries.")] String LogFileName; + [Write, Description("Specifies how to log the ignored packets in the location specified by the LogFileName parameter."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String LogIgnored; + [Write, Description("Specifies the maximum file size of the log, in kilobytes. The acceptable values for this parameter are: 1 through 32767.")] UInt64 LogMaxSizeKilobytes; + [Write, Description("Allows the notification of listening for inbound connections by a service."), ValueMap{"True", "False", "NotConfigured"}, Values{"True", "False", "NotConfigured"}] String NotifyOnListen; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/README.MD new file mode 100644 index 0000000..019952d --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/README.MD @@ -0,0 +1,4 @@ +# Description + +This resource is used to enable or disable and configure Windows Firewall with +Advanced Security profiles. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/en-US/DSC_FirewallProfile.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/en-US/DSC_FirewallProfile.strings.psd1 new file mode 100644 index 0000000..b856938 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/en-US/DSC_FirewallProfile.strings.psd1 @@ -0,0 +1,10 @@ +# Localized resources for DSC_FirewallProfile + +ConvertFrom-StringData @' + GettingFirewallProfileMessage = Getting Firewall {0} Profile. + SettingFirewallProfileMessage = Setting Firewall {0} Profile. + FirewallProfileUpdateParameterMessage = Setting Firewall {0} Profile parameter {1} to "{1}". + FirewallProfileUpdatedMessage = Setting Firewall {0} Profile updated. + TestingFirewallProfileMessage = Testing Firewall {0} Profile. + FirewallProfileParameterNeedsUpdateMessage = Firewall {0} Profile "{1}" is "{2}" but should be "{3}". Change required. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/en-US/about_FirewallProfile.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/en-US/about_FirewallProfile.help.txt new file mode 100644 index 0000000..e74b09c --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_FirewallProfile/en-US/about_FirewallProfile.help.txt @@ -0,0 +1,124 @@ +.NAME + FirewallProfile + +.DESCRIPTION + This resource is used to enable or disable and configure Windows Firewall with + Advanced Security profiles. + +.PARAMETER Name + Key - String + Allowed values: Domain, Public, Private + The name of the firewall profile to configure. + +.PARAMETER AllowInboundRules + Write - String + Allowed values: True, False, NotConfigured + Specifies that the firewall blocks inbound traffic. + +.PARAMETER AllowLocalFirewallRules + Write - String + Allowed values: True, False, NotConfigured + Specifies that the local firewall rules should be merged into the effective policy along with Group Policy settings. + +.PARAMETER AllowLocalIPsecRules + Write - String + Allowed values: True, False, NotConfigured + Specifies that the local IPsec rules should be merged into the effective policy along with Group Policy settings. + +.PARAMETER AllowUnicastResponseToMulticast + Write - String + Allowed values: True, False, NotConfigured + Allows unicast responses to multi-cast traffic. + +.PARAMETER AllowUserApps + Write - String + Allowed values: True, False, NotConfigured + Specifies that traffic from local user applications is allowed through the firewall. + +.PARAMETER AllowUserPorts + Write - String + Allowed values: True, False, NotConfigured + Specifies that traffic is allowed through local user ports. + +.PARAMETER DefaultInboundAction + Write - String + Allowed values: Block, Allow, NotConfigured + Specifies how to filter inbound traffic. + +.PARAMETER DefaultOutboundAction + Write - String + Allowed values: Block, Allow, NotConfigured + Specifies how to filter outbound traffic. + +.PARAMETER DisabledInterfaceAliases + Write - StringArray + Specifies a list of interfaces on which firewall settings are excluded. + +.PARAMETER Enabled + Write - String + Allowed values: True, False, NotConfigured + Specifies that devolution is activated. + +.PARAMETER EnableStealthModeForIPsec + Write - String + Allowed values: True, False, NotConfigured + Enables stealth mode for IPsec traffic. + +.PARAMETER LogAllowed + Write - String + Allowed values: True, False, NotConfigured + Specifies how to log the allowed packets in the location specified by the LogFileName parameter. + +.PARAMETER LogBlocked + Write - String + Allowed values: True, False, NotConfigured + Specifies how to log the dropped packets in the location specified by the LogFileName parameter. + +.PARAMETER LogFileName + Write - String + Specifies the path and filename of the file to which Windows Server writes log entries. + +.PARAMETER LogIgnored + Write - String + Allowed values: True, False, NotConfigured + Specifies how to log the ignored packets in the location specified by the LogFileName parameter. + +.PARAMETER LogMaxSizeKilobytes + Write - UInt64 + Specifies the maximum file size of the log, in kilobytes. The acceptable values for this parameter are: 1 through 32767. + +.PARAMETER NotifyOnListen + Write - String + Allowed values: True, False, NotConfigured + Allows the notification of listening for inbound connections by a service. + +.EXAMPLE 1 + +Configure the Private Firewall Profile. + +Configuration FirewallProfile_ConfigurePrivateFirewallProfile_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + FirewallProfile ConfigurePrivateFirewallProfile + { + Name = 'Private' + Enabled = 'True' + DefaultInboundAction = 'Block' + DefaultOutboundAction = 'Allow' + AllowInboundRules = 'True' + AllowLocalFirewallRules = 'False' + AllowLocalIPsecRules = 'False' + NotifyOnListen = 'True' + LogFileName = '%systemroot%\system32\LogFiles\Firewall\pfirewall.log' + LogMaxSizeKilobytes = 16384 + LogAllowed = 'False' + LogBlocked = 'True' + LogIgnored = 'NotConfigured' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/DSC_HostsFile.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/DSC_HostsFile.psm1 new file mode 100644 index 0000000..279af66 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/DSC_HostsFile.psm1 @@ -0,0 +1,278 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of a hosts file entry. + + .PARAMETER HostName + Specifies the name of the computer that will be mapped to an IP address. + + .PARAMETER IPAddress + Specifies the IP Address that should be mapped to the host name. + + .PARAMETER Ensure + Specifies if the hosts file entry should be created or deleted. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $HostName, + + [Parameter()] + [System.String] + $IPAddress, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ($script:localizedData.StartingGet -f $HostName) + + $result = Get-HostEntry -HostName $HostName + + if ($null -ne $result) + { + return @{ + HostName = $result.HostName + IPAddress = $result.IPAddress + Ensure = 'Present' + } + } + else + { + return @{ + HostName = $HostName + IPAddress = $null + Ensure = 'Absent' + } + } +} + +<# + .SYNOPSIS + Adds, updates or removes a hosts file entry. + + .PARAMETER HostName + Specifies the name of the computer that will be mapped to an IP address. + + .PARAMETER IPAddress + Specifies the IP Address that should be mapped to the host name. + + .PARAMETER Ensure + Specifies if the hosts file entry should be created or deleted. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $HostName, + + [Parameter()] + [System.String] + $IPAddress, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $hostPath = "$env:windir\System32\drivers\etc\hosts" + $currentValues = Get-TargetResource @PSBoundParameters + + Write-Verbose -Message ($script:localizedData.StartingSet -f $HostName) + + if ($Ensure -eq 'Present' -and $PSBoundParameters.ContainsKey('IPAddress') -eq $false) + { + New-InvalidArgumentException ` + -Message $($($script:localizedData.UnableToEnsureWithoutIP) -f $Address, $AddressFamily) ` + -ArgumentName 'IPAddress' + } + + if ($currentValues.Ensure -eq 'Absent' -and $Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.CreateNewEntry -f $HostName) + Add-Content -Path $hostPath -Value "`r`n$IPAddress`t$HostName" + } + else + { + $hosts = Get-Content -Path $hostPath + $replace = $hosts | Where-Object -FilterScript { + [System.String]::IsNullOrEmpty($_) -eq $false -and $_.StartsWith('#') -eq $false -and $_ -like "*$HostName*" + } + + $multiLineEntry = $false + $data = $replace -split '\s+' + + if ($data.Length -gt 2) + { + $multiLineEntry = $true + } + + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.UpdateExistingEntry -f $HostName) + + if ($multiLineEntry -eq $true) + { + $newReplaceLine = $replace -replace $HostName, '' + $hosts = $hosts -replace $replace, $newReplaceLine + $hosts += "$IPAddress`t$HostName" + } + else + { + $hosts = $hosts -replace $replace, "$IPAddress`t$HostName" + } + } + else + { + Write-Verbose -Message ($script:localizedData.RemoveEntry -f $HostName) + + if ($multiLineEntry -eq $true) + { + $newReplaceLine = $replace -replace $HostName, '' + $hosts = $hosts -replace $replace, $newReplaceLine + } + else + { + $hosts = $hosts -replace $replace, '' + } + } + + Set-Content -Path $hostPath -Value $hosts + } +} + +<# + .SYNOPSIS + Tests the current state of a hosts file entry. + + .PARAMETER HostName + Specifies the name of the computer that will be mapped to an IP address. + + .PARAMETER IPAddress + Specifies the IP Address that should be mapped to the host name. + + .PARAMETER Ensure + Specifies if the hosts file entry should be created or deleted. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $HostName, + + [Parameter()] + [System.String] + $IPAddress, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $currentValues = Get-TargetResource @PSBoundParameters + + Write-Verbose -Message ($script:localizedData.StartingTest -f $HostName) + + if ($Ensure -ne $currentValues.Ensure) + { + return $false + } + + if ($Ensure -eq 'Present' -and $IPAddress -ne $currentValues.IPAddress) + { + return $false + } + + return $true +} + +function Get-HostEntry +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $HostName + ) + + $hostPath = "$env:windir\System32\drivers\etc\hosts" + + $allHosts = Get-Content -Path $hostPath | Where-Object -FilterScript { + [System.String]::IsNullOrEmpty($_) -eq $false -and $_.StartsWith('#') -eq $false + } + + foreach ($hosts in $allHosts) + { + $data = $hosts -split '\s+' + + if ($data.Length -gt 2) + { + # Account for host entries that have multiple entries on a single line + $result = @() + $array = @() + + for ($i = 1; $i -lt $data.Length; $i++) + { + <# + Filter commments on the line. + Example: 0.0.0.0 s.gateway.messenger.live.com # breaks Skype GH-183 + becomes: + 0.0.0.0 s.gateway.messenger.live.com + #> + if ($data[$i] -eq '#') + { + break + } + + $array += $data[$i] + } + + $result = @{ + Host = $array + IPAddress = $data[0] + } + } + else + { + $result = @{ + Host = $data[1] + IPAddress = $data[0] + } + } + + if ($result.Host -eq $HostName) + { + return @{ + HostName = $result.Host + IPAddress = $result.IPAddress + } + } + } +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/DSC_HostsFile.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/DSC_HostsFile.schema.mof new file mode 100644 index 0000000..a2dcf86 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/DSC_HostsFile.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.0.0"), FriendlyName("HostsFile")] +class DSC_HostsFile : OMI_BaseResource +{ + [Key, Description("Specifies the name of the computer that will be mapped to an IP address.")] string HostName; + [Write, Description("Specifies the IP Address that should be mapped to the host name.")] string IPAddress; + [Write, Description("Specifies if the hosts file entry should be created or deleted."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] string Ensure; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/README.MD new file mode 100644 index 0000000..da0b687 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to control entries on a the host file for a node. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/en-US/DSC_HostsFile.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/en-US/DSC_HostsFile.strings.psd1 new file mode 100644 index 0000000..d1eb880 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/en-US/DSC_HostsFile.strings.psd1 @@ -0,0 +1,11 @@ +# Localized resources for DSC_HostFile + +ConvertFrom-StringData @' + UnableToEnsureWithoutIP = Unable to ensure a host entry is present without a corresponding IP address. Please add the IPAddress property and run this resource again. + CreateNewEntry = Creating new host entry for {0}. + UpdateExistingEntry = Updating existing host entry for {0}. + RemoveEntry = Removing host entry for {0}. + StartingGet = Looking up host entry for {0}. + StartingSet = Setting host entry for {0}. + StartingTest = Testing host entry for {0}. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/en-US/about_HostsFile.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/en-US/about_HostsFile.help.txt new file mode 100644 index 0000000..5d3459a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_HostsFile/en-US/about_HostsFile.help.txt @@ -0,0 +1,58 @@ +.NAME + HostsFile + +.DESCRIPTION + This resource is used to control entries on a the host file for a node. + +.PARAMETER HostName + Key - String + Specifies the name of the computer that will be mapped to an IP address. + +.PARAMETER IPAddress + Write - String + Specifies the IP Address that should be mapped to the host name. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if the hosts file entry should be created or deleted. + +.EXAMPLE 1 + +Add a new host to the host file. + +Configuration HostsFile_AddEntry_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + HostsFile HostsFileAddEntry + { + HostName = 'Host01' + IPAddress = '192.168.0.1' + Ensure = 'Present' + } + } +} + +.EXAMPLE 2 + +Remove a host from the hosts file. + +Configuration HostsFile_RemoveEntry_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + HostsFile HostsFileRemoveEntry + { + HostName = 'Host01' + IPAddress = '192.168.0.1' + Ensure = 'Absent' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/DSC_IPAddress.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/DSC_IPAddress.psm1 new file mode 100644 index 0000000..a715f64 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/DSC_IPAddress.psm1 @@ -0,0 +1,505 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of an IP address assigned to an interface. + + .PARAMETER IPAddress + The desired IP address. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the IP address should be set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER KeepExistingAddress + Indicates whether or not existing IP addresses on an interface will be retained. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $IPAddress, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily = 'IPv4', + + [Parameter()] + [System.Boolean] + $KeepExistingAddress = $false + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingIPAddressMessage) + ) -join '') + + $getNetIPAddressParameters = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + } + + $currentIPAddress = Get-NetIPAddress @getNetIPAddressParameters + + $currentIPAddressWithPrefix = $currentIPAddress | + Foreach-Object { + "$($_.IPAddress)/$($_.prefixLength)" + } + + $returnValue = @{ + IPAddress = @($currentIPAddressWithPrefix) + AddressFamily = $AddressFamily + InterfaceAlias = $InterfaceAlias + KeepExistingAddress = $KeepExistingAddress + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets an IP address on an interface. + + .PARAMETER IPAddress + The desired IP address. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the IP address should be set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER KeepExistingAddress + Indicates whether or not existing IP addresses on an interface will be retained. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $IPAddress, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily = 'IPv4', + + [Parameter()] + [System.Boolean] + $KeepExistingAddress = $false + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingIPAddressMessage) + ) -join '') + + # Use $AddressFamily to select the IPv4 or IPv6 destination prefix + $destinationPrefix = '0.0.0.0/0' + + if ($AddressFamily -eq 'IPv6') + { + $destinationPrefix = '::/0' + $prefixLength = 64 + } + + # Get all the default routes - this has to be done in case the IP Address is being Removed + $getNetRouteParameters = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + ErrorAction = 'Stop' + } + + $defaultRoutes = @(Get-NetRoute @getNetRouteParameters).Where( + { + $_.DestinationPrefix -eq $destinationPrefix + } + ) + + <# + Remove any default routes on the specified interface -- it is important to do + this *before* removing the IP address, particularly in the case where the IP + address was auto-configured by DHCP + #> + if ($defaultRoutes) + { + foreach ($defaultRoute in $defaultRoutes) + { + $removeNetRouteParameters = @{ + DestinationPrefix = $defaultRoute.DestinationPrefix + NextHop = $defaultRoute.NextHop + InterfaceIndex = $defaultRoute.InterfaceIndex + AddressFamily = $defaultRoute.AddressFamily + Confirm = $false + ErrorAction = 'Stop' + } + Remove-NetRoute @removeNetRouteParameters + } + } + + # Get the current IP Address based on the parameters given. + $getNetIPAddressParameters = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + ErrorAction = 'Stop' + } + + $currentIPs = @(Get-NetIPAddress @getNetIPAddressParameters) + + # Remove any IP addresses on the specified interface + if ($currentIPs) + { + foreach ($currentIP in $currentIPs) + { + $removeIP = $false + + if ($currentIP.IPAddress -notin ($IPAddress -replace '\/\S*', '') -and -not $KeepExistingAddress) + { + $removeIP = $true + } + elseif ($currentIP.IPAddress -in ($IPAddress -replace '\/\S*', '')) + { + $existingIP = $IPAddress | Where-Object { + $_ -match $currentIP.IPAddress + } + + if ($existingIP -ne "$($currentIP.IPAddress)/$($currentIP.prefixLength)") + { + $removeIP = $true + } + } + + if ($removeIP) + { + $removeNetIPAddressParameters = @{ + IPAddress = $currentIP.IPAddress + InterfaceIndex = $currentIP.InterfaceIndex + AddressFamily = $currentIP.AddressFamily + prefixLength = $currentIP.prefixLength + Confirm = $false + ErrorAction = 'Stop' + } + + Remove-NetIPAddress @removeNetIPAddressParameters + } + } + } + + $ipAddressObject = Get-IPAddressPrefix -IPAddress $IPAddress -AddressFamily $AddressFamily + + foreach ($singleIP in $ipAddressObject) + { + # Build parameter hash table + $newNetIPAddressParameters = @{ + IPAddress = $singleIP.IPAddress + prefixLength = $singleIP.prefixLength + InterfaceAlias = $InterfaceAlias + } + + try + { + # Apply the specified IP configuration + New-NetIPAddress @newNetIPAddressParameters -ErrorAction Stop + } + catch [Microsoft.Management.Infrastructure.CimException] + { + $verifyNetIPAddressAdapterParam = @{ + IPAddress = $singleIP.IPAddress + prefixLength = $singleIP.prefixLength + } + <# + Setting New-NetIPaddress will throw [Microsoft.Management.Infrastructure.CimException] if + the IP address is already set. Need to check to make sure the IP is set on correct interface + #> + $verifyNetIPAddressAdapter = Get-NetIPAddress @verifyNetIPAddressAdapterParam -ErrorAction SilentlyContinue + + if ($verifyNetIPAddressAdapter.InterfaceAlias -eq $InterfaceAlias) + { + # The IP Address is already set on the correct interface + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.IPAddressMatchMessage) + ) -join '' ) + } + else + { + Write-Error -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.IPAddressDoesNotMatchInterfaceAliasMessage) -f $InterfaceAlias,$verifyNetIPAddressAdapter.InterfaceAlias + ) -join '' ) + } + continue + } + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.IPAddressSetStateMessage) + ) -join '' ) + } +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the IP address on the interface. + + .PARAMETER IPAddress + The desired IP address. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the IP address should be set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER KeepExistingAddress + Indicates whether or not existing IP addresses on an interface will be retained. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $IPAddress, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily = 'IPv4', + + [Parameter()] + [System.Boolean] + $KeepExistingAddress = $false + ) + + # Flag to signal whether settings are correct + [System.Boolean] $desiredConfigurationMatch = $true + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingIPAddressMessage) + ) -join '') + + Assert-ResourceProperty @PSBoundParameters + + <# + Get the current IP Address based on the parameters given. + First make sure that adapter is available + #> + [System.Boolean] $adapterBindingReady = $false + [System.DateTime] $startTime = Get-Date + + while (-not $adapterBindingReady -and (((Get-Date) - $startTime).TotalSeconds) -lt 30) + { + $getNetIPAddressParameters = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + ErrorAction = 'SilentlyContinue' + } + + $currentIPs = @(Get-NetIPAddress @getNetIPAddressParameters) + + if ($currentIPs) + { + $adapterBindingReady = $true + } + else + { + Start-Sleep -Milliseconds 200 + } + } # while + + $ipAddressObject = Get-IPAddressPrefix -IPAddress $IPAddress -AddressFamily $AddressFamily + + # Test if the IP Address passed is present + foreach ($singleIP in $ipAddressObject) + { + $prefixLength = $singleIP.prefixLength + + if ($singleIP.IPAddress -notin $currentIPs.IPAddress) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.IPAddressDoesNotMatchMessage) -f $singleIP, $currentIPs.IPAddress + ) -join '' ) + + $desiredConfigurationMatch = $false + } + else + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.IPAddressMatchMessage) + ) -join '') + + # Filter the IP addresses for the IP address to check + $filterIP = $currentIPs.Where( + { + $_.IPAddress -eq $singleIP.IPAddress + } + ) + + # Only test the Prefix Length if the IP address is present + if (-not $filterIP.prefixLength.Equals([System.Byte] $prefixLength)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.prefixLengthDoesNotMatchMessage) -f $prefixLength, $currentIPs.prefixLength + ) -join '' ) + + $desiredConfigurationMatch = $false + } + else + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.prefixLengthMatchMessage) + ) -join '' ) + } + } + } + return $desiredConfigurationMatch +} # Test-TargetResource + +<# + .SYNOPSIS + Check the IP Address details are valid and do not conflict with Address family. + Also checks the prefix length and ensures the interface exists. + If any problems are detected an exception will be thrown. + + .PARAMETER IPAddress + The desired IP address. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the IP address should be set. + + .PARAMETER AddressFamily + IP address family. + + .PARAMETER KeepExistingAddress + Indicates whether or not existing IP addresses on an interface will be retained. +#> +function Assert-ResourceProperty +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $IPAddress, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily = 'IPv4', + + [Parameter()] + [System.Boolean] + $KeepExistingAddress = $false + ) + + $prefixLengthArray = ($IPAddress -split '/')[1] + + if ($prefixLengthArray.Count -ne $IPAddress.Count) + { + # Return the prefix length of each IP address specified + $prefixLengthArray = $IPAddress | Foreach-Object { + if ($_ -match '\/\d{1,3}') + { + ($_ -split '/')[1] + } + else + { + if ($_.split('.')[0] -in (0..127)) + { + $prefixLength = 8 + } + elseif ($_.split('.')[0] -in (128..191)) + { + $prefixLength = 16 + } + elseif ($_.split('.')[0] -in (192..223)) + { + $prefixLength = 24 + } + if ($AddressFamily -eq 'IPv6') + { + $prefixLength = 64 + } + $prefixLength + } + } + } + + if (-not (Get-NetAdapter | Where-Object -Property Name -EQ $InterfaceAlias )) + { + New-InvalidArgumentException ` + -Message $($($script:localizedData.InterfaceNotAvailableError) -f $InterfaceAlias) ` + -ArgumentName 'InterfaceAlias' + } + + foreach ($singleIPAddress in $IPAddress) + { + $singleIP = ($singleIPAddress -split '/')[0] + + Assert-IPAddress -Address $singleIP -AddressFamily $AddressFamily + } + + foreach ($prefixLength in $prefixLengthArray) + { + $prefixLength = [uint32]::Parse($prefixLength) + + if (( + ($AddressFamily -eq 'IPv4') ` + -and (($prefixLength -lt [uint32]0) -or ($prefixLength -gt [uint32]32)) + ) -or ( + ($AddressFamily -eq 'IPv6') ` + -and (($prefixLength -lt [uint32]0) -or ($prefixLength -gt [uint32]128)) + )) + { + New-InvalidArgumentException ` + -Message $($($script:localizedData.PrefixLengthError) -f $prefixLength, $AddressFamily) ` + -ArgumentName 'IPAddress' + } + } +} # Assert-ResourceProperty + +Export-ModuleMember -function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/DSC_IPAddress.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/DSC_IPAddress.schema.mof new file mode 100644 index 0000000..1e5beda --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/DSC_IPAddress.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("IPAddress")] +class DSC_IPAddress : OMI_BaseResource +{ + [Write, Description("The desired IP address, optionally including prefix length using CIDR notation.")] string IPAddress[]; + [Key, Description("Alias of the network interface for which the IP address should be set.")] string InterfaceAlias; + [Key, Description("IP address family.") ,ValueMap{"IPv4", "IPv6"},Values{"IPv4", "IPv6"}] string AddressFamily; + [Write, Description("Indicates whether or not existing IP addresses on an interface will be retained.")] boolean KeepExistingAddress; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/README.MD new file mode 100644 index 0000000..f3226df --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/README.MD @@ -0,0 +1,4 @@ +# Description + +This resource is used to control a node's IP address. This can be used in +conjunction with disabling DHCP to set static IP addresses. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/en-US/DSC_IPAddress.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/en-US/DSC_IPAddress.strings.psd1 new file mode 100644 index 0000000..a0ea455 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/en-US/DSC_IPAddress.strings.psd1 @@ -0,0 +1,15 @@ +# Localized resources for DSC_IPAddress + +ConvertFrom-StringData @' + GettingIPAddressMessage = Getting the IP Address. + ApplyingIPAddressMessage = Applying the IP Address. + IPAddressSetStateMessage = IP Interface was set to the desired state. + CheckingIPAddressMessage = Checking the IP Address. + IPAddressDoesNotMatchMessage = IP Address does NOT match desired state. Expected {0}, actual {1}. + IPAddressMatchMessage = IP Address is in desired state. + IPAddressDoesNotMatchInterfaceAliasMessage = IP Address set on different InterfaceAlias. Expected {0}, actual {1}. + PrefixLengthDoesNotMatchMessage = Prefix Length does NOT match desired state. Expected {0}, actual {1}. + PrefixLengthMatchMessage = Prefix Length is in desired state. + InterfaceNotAvailableError = Interface "{0}" is not available. Please select a valid interface and try again. + PrefixLengthError = A Prefix Length of {0} is not valid for {1} addresses. Please correct the Prefix Length and try again. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/en-US/about_IPAddress.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/en-US/about_IPAddress.help.txt new file mode 100644 index 0000000..f8c227a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddress/en-US/about_IPAddress.help.txt @@ -0,0 +1,177 @@ +.NAME + IPAddress + +.DESCRIPTION + This resource is used to control a node's IP address. This can be used in + conjunction with disabling DHCP to set static IP addresses. + +.PARAMETER IPAddress + Write - StringArray + The desired IP address, optionally including prefix length using CIDR notation. + +.PARAMETER InterfaceAlias + Key - String + Alias of the network interface for which the IP address should be set. + +.PARAMETER AddressFamily + Key - String + Allowed values: IPv4, IPv6 + IP address family. + +.PARAMETER KeepExistingAddress + Write - Boolean + Indicates whether or not existing IP addresses on an interface will be retained. + +.EXAMPLE 1 + +Disabling DHCP and adding a static IP Address for IPv6 and IPv4 +using default prefix lengths for the matching address classes. + +Configuration IPAddress_AddingStaticIP_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface DisableDhcp + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + Dhcp = 'Disabled' + } + + # If no prefix is supplied IPv6 will default to /64. + IPAddress NewIPv6Address + { + IPAddress = '2001:4898:200:7:6c71:a102:ebd8:f482' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPV6' + } + + <# + If no prefix is supplied then IPv4 will default to class based: + - Class A - /8 + - Class B - /16 + - Class C - /24 + #> + IPAddress NewIPv4Address + { + IPAddress = '192.168.10.5' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPV4' + } + } +} + +.EXAMPLE 2 + +Disabling DHCP and adding multiple static IP Addresses for IPv4 and IPv6. + +Configuration IPAddress_AddingMultipleStaticIP_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface DisableDhcp + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv6' + Dhcp = 'Disabled' + } + + IPAddress NewIPv6Address + { + IPAddress = '2001:4898:200:7:6c71:a102:ebd8:f482/64','2001:4598:210:7:6d71:a102:ebe8:f483/64' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPV6' + } + + IPAddress NewIPv4Address + { + IPAddress = '192.168.10.5/24','192.168.10.6/24' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPV4' + } + } +} + +.EXAMPLE 3 + +Disabling DHCP and adding a static IP Address for IPv6 and IPv4 +using specified prefixes in CIDR notation. + +Configuration IPAddress_AddingStaticIPWithPrefix_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface DisableDhcp + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv6' + Dhcp = 'Disabled' + } + + IPAddress NewIPv6Address + { + IPAddress = '2001:4898:200:7:6c71:a102:ebd8:f482/64' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPV6' + } + + IPAddress NewIPv4Address + { + IPAddress = '192.168.10.5/24' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPV4' + } + } +} + +.EXAMPLE 4 + +Disabling DHCP and adding a static IP Address for IPv6 and IPv4 +using default prefix lengths for the matching address classes. +Any existing IP addresses will be retained on the network adapter. + +Configuration IPAddress_AddingStaticIPKeepSettings_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface DisableDhcp + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + Dhcp = 'Disabled' + } + + # If no prefix is supplied IPv6 will default to /64. + IPAddress NewIPv6Address + { + IPAddress = '2001:4898:200:7:6c71:a102:ebd8:f482' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPV6' + KeepExistingAddress = $true + } + + <# + If no prefix is supplied then IPv4 will default to class based: + - Class A - /8 + - Class B - /16 + - Class C - /24 + #> + IPAddress NewIPv4Address + { + IPAddress = '192.168.10.5' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPV4' + KeepExistingAddress = $true + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/DSC_IPAddressOption.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/DSC_IPAddressOption.psm1 new file mode 100644 index 0000000..8c90074 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/DSC_IPAddressOption.psm1 @@ -0,0 +1,131 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of an IP address option. + + .PARAMETER IPAddress + The desired IP address. + + .PARAMETER SkipAsSource + The skip as source option. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $IPAddress, + + [Parameter()] + [System.Boolean] + $SkipAsSource = $false + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingIPAddressOptionMessage -f $IPAddress) + ) -join '') + + $currentIPAddress = Get-NetIPAddress -IPAddress $IPAddress + + $returnValue = @{ + IPAddress = $IPAddress + SkipAsSource = $currentIPAddress.SkipAsSource + } + + return $returnValue +} + +<# + .SYNOPSIS + Set the IP address options. + + .PARAMETER IPAddress + The desired IP address. + + .PARAMETER SkipAsSource + The skip as source option. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $IPAddress, + + [Parameter()] + [System.Boolean] + $SkipAsSource = $false + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingIPAddressOptionMessage -f $IPAddress) + ) -join '') + + $currentConfig = Get-TargetResource @PSBoundParameters + + if ($currentConfig.SkipAsSource -ne $SkipAsSource) + { + Set-NetIPAddress -IPAddress $IPAddress -SkipAsSource $SkipAsSource + } +} + +<# + .SYNOPSIS + Tests the IP address options. + + .PARAMETER IPAddress + The desired IP address. + + .PARAMETER SkipAsSource + The skip as source option. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $IPAddress, + + [Parameter()] + [System.Boolean] + $SkipAsSource = $false + ) + + # Flag to signal whether settings are correct + $desiredConfigurationMatch = $true + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingIPAddressOptionMessage -f $IPAddress) + ) -join '') + + $currentConfig = Get-TargetResource @PSBoundParameters + + $desiredConfigurationMatch = $desiredConfigurationMatch -and + $currentConfig.SkipAsSource -eq $SkipAsSource + + return $desiredConfigurationMatch +} + +Export-ModuleMember -function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/DSC_IPAddressOption.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/DSC_IPAddressOption.schema.mof new file mode 100644 index 0000000..c046bdb --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/DSC_IPAddressOption.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("IPAddressOption")] +class DSC_IPAddressOption : OMI_BaseResource +{ + [Key, Description("The target IP address, must already be configured on the system.")] string IPAddress; + [Write, Description("Skip as source option of the ip address.")] boolean SkipAsSource; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/README.MD new file mode 100644 index 0000000..6c37c0e --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/README.MD @@ -0,0 +1,8 @@ +# Description + +This resource is used to control a node's IP address options. This can be used +to enable or disable the SkipAsSource option of an IP address. + +This resource is used in addition to xIPAddress to set the SkipAsSource for a +single IP address when an adapter has more than one address assigned. When using +this resource it allows the options of a single IP address to be set. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/en-US/DSC_IPAddressOption.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/en-US/DSC_IPAddressOption.strings.psd1 new file mode 100644 index 0000000..4ae29ce --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/en-US/DSC_IPAddressOption.strings.psd1 @@ -0,0 +1,7 @@ +# Localized resources for DSC_IPAddressOption + +ConvertFrom-StringData @' + GettingIPAddressOptionMessage = Getting the options of the IP address {0}. + ApplyingIPAddressOptionMessage = Applying the options of the IP address {0}. + CheckingIPAddressOptionMessage = Checking the options of the IP address {0}. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/en-US/about_IPAddressOption.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/en-US/about_IPAddressOption.help.txt new file mode 100644 index 0000000..6ca9002 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_IPAddressOption/en-US/about_IPAddressOption.help.txt @@ -0,0 +1,38 @@ +.NAME + IPAddressOption + +.DESCRIPTION + This resource is used to control a node's IP address options. This can be used + to enable or disable the SkipAsSource option of an IP address. + + This resource is used in addition to xIPAddress to set the SkipAsSource for a + single IP address when an adapter has more than one address assigned. When using + this resource it allows the options of a single IP address to be set. + +.PARAMETER IPAddress + Key - String + The target IP address, must already be configured on the system. + +.PARAMETER SkipAsSource + Write - Boolean + Skip as source option of the ip address. + +.EXAMPLE 1 + +Change the SkipAsSource option for a single IP address. + +Configuration IPAddressOption_SetSkipAsSource_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + IPAddressOption SetSkipAsSource + { + IPAddress = '192.168.10.5' + SkipAsSource = $true + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/DSC_NetAdapterAdvancedProperty.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/DSC_NetAdapterAdvancedProperty.psm1 new file mode 100644 index 0000000..b9034af --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/DSC_NetAdapterAdvancedProperty.psm1 @@ -0,0 +1,221 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current value of an advanced property. + + .PARAMETER NetworkAdapterName + Specifies the name of the network adapter to set the advanced property for. + + .PARAMETER RegistryKeyword + Specifies the registry keyword that should be in desired state. + + .PARAMETER RegistryValue + Specifies the value of the registry keyword. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $NetworkAdapterName, + + [Parameter(Mandatory = $true)] + [System.String] + $RegistryKeyword, + + [Parameter(Mandatory = $true)] + [System.String] + $RegistryValue + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapterAdvancedProperty = Get-NetAdapterAdvancedProperty ` + -Name $networkAdapterName ` + -RegistryKeyword $RegistryKeyword ` + -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapterAdvancedProperty) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $NetworkAdapterName, $RegistryKeyword) + ) -join '') + + $result = @{ + NetworkAdapterName = $NetworkAdapterName + RegistryKeyword = $RegistryKeyword + DisplayValue = $netAdapterAdvancedProperty.DisplayValue + RegistryValue = $netAdapterAdvancedProperty.RegistryValue + } + + return $result + } +} + +<# + .SYNOPSIS + Sets the current value of an advanced property. + + .PARAMETER NetworkAdapterName + Specifies the name of the network adapter to set the advanced property for. + + .PARAMETER RegistryKeyword + Specifies the registry keyword that should be in desired state. + + .PARAMETER RegistryValue + Specifies the value of the registry keyword. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $NetworkAdapterName, + + [Parameter(Mandatory = $true)] + [System.String] + $RegistryKeyword, + + [Parameter(Mandatory = $true)] + [System.String] + $RegistryValue + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapterAdvancedProperty = Get-NetAdapterAdvancedProperty ` + -Name $networkAdapterName ` + -RegistryKeyword $RegistryKeyword ` + -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapterAdvancedProperty) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $NetworkAdapterName, $RegistryKeyword) + ) -join '') + + if ($RegistryValue -ne $netAdapterAdvancedProperty.RegistryValue) + { + $netadapterRegistryValue = $netAdapterAdvancedProperty.RegistryValue + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterApplyingChangesMessage -f ` + $NetworkAdapterName, $RegistryKeyword, "$netadapterRegistryValue", $RegistryValue ) + ) -join '') + + Set-NetAdapterAdvancedProperty ` + -RegistryValue $RegistryValue ` + -Name $networkAdapterName ` + -RegistryKeyword $RegistryKeyword + } + } +} + +<# + .SYNOPSIS + Tests the current value of an advanced property. + + .PARAMETER NetworkAdapterName + Specifies the name of the network adapter to set the advanced property for. + + .PARAMETER RegistryKeyword + Specifies the registry keyword that should be in desired state. + + .PARAMETER RegistryValue + Specifies the value of the registry keyword. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $NetworkAdapterName, + + [Parameter(Mandatory = $true)] + [System.String] + $RegistryKeyword, + + [Parameter(Mandatory = $true)] + [System.String] + $RegistryValue + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapterAdvancedProperty = Get-NetAdapterAdvancedProperty ` + -Name $networkAdapterName ` + -RegistryKeyword $RegistryKeyword ` + -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapterAdvancedProperty) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.NetAdapterTestingStateMessage -f ` + $NetworkAdapterName, $RegistryKeyword + ) -join '') + + if ($RegistryValue -eq $netAdapterAdvancedProperty.RegistryValue) + { + return $true + } + else + { + return $false + } + } +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/DSC_NetAdapterAdvancedProperty.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/DSC_NetAdapterAdvancedProperty.schema.mof new file mode 100644 index 0000000..4030093 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/DSC_NetAdapterAdvancedProperty.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0.0"), FriendlyName("NetAdapterAdvancedProperty")] +class DSC_NetAdapterAdvancedProperty : OMI_BaseResource +{ + [Key, Description("Specifies the name of the network adapter to set the advanced property for.")] String NetworkAdapterName; + [Key, Description("Specifies the registry keyword that should be in desired state.")] String RegistryKeyword; + [Required, Description("Specifies the value of the registry keyword.")] String RegistryValue; + [Read, Description("Output Display value of selected RegistryKeyword.")] String DisplayValue; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/README.MD new file mode 100644 index 0000000..9413f89 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/README.MD @@ -0,0 +1,59 @@ +# Description + +This resource is used to set advanced properties on a network adapter +by setting the value of a registry keyword. +The list of available registry keywords will be dependent on the network +adapter driver. +**Please check the supported registry keywords for your adapter before +creating a configuration.** + +The following is a list of common registry keywords that may apply to +your network adapter: + +- AdaptiveIFS +- ITR +- LogLinkStateEvent +- MasterSlave +- NetworkAddress +- MaxRxRing1Length +- NumRxBuffersSmall +- RxIntModeration +- RxIntModerationProfile +- TxIntModerationProfile +- VlanID +- WaitAutoNegComplete +- *DcbxMode +- *EncapsulatedPacketTaskOffload +- *FlowControl +- *InterruptModeration +- *IPChecksumOffloadIPv4 +- *JumboPacket +- *LsoV2IPv4 +- *LsoV2IPv6 +- *MaxRssProcessors +- *NetworkDirect +- *NumaNodeId +- *NumRssQueues +- *PacketDirect +- *PriorityVLANTag +- *QOS +- *ReceiveBuffers +- *RecvCompletionMethod +- *RoceMaxFrameSize +- *RscIPv4 +- *RSS +- *RssBaseProcNumber +- *RssMaxProcNumber +- *RssOnHostVPorts +- *RSSProfile +- *SpeedDuplex +- *Sriov +- *TCPChecksumOffloadIPv4 +- *TCPChecksumOffloadIPv6 +- *TCPUDPChecksumOffloadIPv4 +- *TCPUDPChecksumOffloadIPv6 +- *TransmitBuffers +- *UDPChecksumOffloadIPv4 +- *UDPChecksumOffloadIPv6 +- *VMQ +- *VMQVlanFiltering diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/en-US/DSC_NetAdapterAdvancedProperty.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/en-US/DSC_NetAdapterAdvancedProperty.strings.psd1 new file mode 100644 index 0000000..3af81a3 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/en-US/DSC_NetAdapterAdvancedProperty.strings.psd1 @@ -0,0 +1,8 @@ +# Localized resources for DSC_NetAdapterAdvancedProperty + +ConvertFrom-StringData @' + CheckingNetAdapterMessage = Checking if network adapter exists or not. + NetAdapterNotFoundMessage = Network adapter not found. + NetAdapterTestingStateMessage = Checking if adapter {0} '{1}' is in desired state. + NetAdapterApplyingChangesMessage = Network adapter {0} '{1}' was '{2}', should be '{3}', applying changes. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/en-US/about_NetAdapterAdvancedProperty.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/en-US/about_NetAdapterAdvancedProperty.help.txt new file mode 100644 index 0000000..e350ea3 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterAdvancedProperty/en-US/about_NetAdapterAdvancedProperty.help.txt @@ -0,0 +1,98 @@ +.NAME + NetAdapterAdvancedProperty + +.DESCRIPTION + This resource is used to set advanced properties on a network adapter + by setting the value of a registry keyword. + The list of available registry keywords will be dependent on the network + adapter driver. + **Please check the supported registry keywords for your adapter before + creating a configuration.** + + The following is a list of common registry keywords that may apply to + your network adapter: + + - AdaptiveIFS + - ITR + - LogLinkStateEvent + - MasterSlave + - NetworkAddress + - MaxRxRing1Length + - NumRxBuffersSmall + - RxIntModeration + - RxIntModerationProfile + - TxIntModerationProfile + - VlanID + - WaitAutoNegComplete + - *DcbxMode + - *EncapsulatedPacketTaskOffload + - *FlowControl + - *InterruptModeration + - *IPChecksumOffloadIPv4 + - *JumboPacket + - *LsoV2IPv4 + - *LsoV2IPv6 + - *MaxRssProcessors + - *NetworkDirect + - *NumaNodeId + - *NumRssQueues + - *PacketDirect + - *PriorityVLANTag + - *QOS + - *ReceiveBuffers + - *RecvCompletionMethod + - *RoceMaxFrameSize + - *RscIPv4 + - *RSS + - *RssBaseProcNumber + - *RssMaxProcNumber + - *RssOnHostVPorts + - *RSSProfile + - *SpeedDuplex + - *Sriov + - *TCPChecksumOffloadIPv4 + - *TCPChecksumOffloadIPv6 + - *TCPUDPChecksumOffloadIPv4 + - *TCPUDPChecksumOffloadIPv6 + - *TransmitBuffers + - *UDPChecksumOffloadIPv4 + - *UDPChecksumOffloadIPv6 + - *VMQ + - *VMQVlanFiltering + +.PARAMETER NetworkAdapterName + Key - String + Specifies the name of the network adapter to set the advanced property for. + +.PARAMETER RegistryKeyword + Key - String + Specifies the registry keyword that should be in desired state. + +.PARAMETER RegistryValue + Required - String + Specifies the value of the registry keyword. + +.PARAMETER DisplayValue + Read - String + Output Display value of selected RegistryKeyword. + +.EXAMPLE 1 + +This configuration changes the JumboPacket Size. + +Configuration NetAdapterAdvancedProperty_JumboPacket_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterAdvancedProperty JumboPacket9014 + { + NetworkAdapterName = 'Ethernet' + RegistryKeyword = "*JumboPacket" + RegistryValue = 9014 + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/DSC_NetAdapterBinding.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/DSC_NetAdapterBinding.psm1 new file mode 100644 index 0000000..b57d30d --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/DSC_NetAdapterBinding.psm1 @@ -0,0 +1,278 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of an Adapter Binding on an interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. Supports the use of '*'. + + .PARAMETER ComponentId + Specifies the underlying name of the transport or filter in the following + form - ms_xxxx, such as ms_tcpip. + + .PARAMETER State + Specifies if the component ID for the Interface should be Enabled or Disabled. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ComponentId, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $State = 'Enabled' + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingNetAdapterBindingMessage -f ` + $InterfaceAlias, $ComponentId) + ) -join '') + + $currentNetAdapterBinding = Get-Binding @PSBoundParameters + + $adapterState = $currentNetAdapterBinding.Enabled | + Sort-Object -Unique + + if ( $adapterState.Count -eq 2) + { + $currentEnabled = 'Mixed' + } + elseif ( $adapterState -eq $true ) + { + $currentEnabled = 'Enabled' + } + else + { + $currentEnabled = 'Disabled' + } + + $returnValue = @{ + InterfaceAlias = $InterfaceAlias + ComponentId = $ComponentId + State = $State + CurrentState = $currentEnabled + } + + return $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Sets the Adapter Binding on a specific interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. Supports the use of '*'. + + .PARAMETER ComponentId + Specifies the underlying name of the transport or filter in the following + form - ms_xxxx, such as ms_tcpip. + + .PARAMETER State + Specifies if the component ID for the Interface should be Enabled or Disabled. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ComponentId, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $State = 'Enabled' + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingNetAdapterBindingMessage -f ` + $InterfaceAlias, $ComponentId) + ) -join '') + + $null = Get-Binding @PSBoundParameters + + # Remove the State so we can splat + $null = $PSBoundParameters.Remove('State') + + if ($State -eq 'Enabled') + { + Enable-NetAdapterBinding @PSBoundParameters + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterBindingEnabledMessage -f ` + $InterfaceAlias, $ComponentId) + ) -join '' ) + } + else + { + Disable-NetAdapterBinding @PSBoundParameters + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterBindingDisabledMessage -f ` + $InterfaceAlias, $ComponentId) + ) -join '' ) + } # if +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the current state of an Adapter Binding on an interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. Supports the use of '*'. + + .PARAMETER ComponentId + Specifies the underlying name of the transport or filter in the following + form - ms_xxxx, such as ms_tcpip. + + .PARAMETER State + Specifies if the component ID for the Interface should be Enabled or Disabled. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ComponentId, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $State = 'Enabled' + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingNetAdapterBindingMessage -f ` + $InterfaceAlias, $ComponentId) + ) -join '') + + $currentNetAdapterBinding = Get-Binding @PSBoundParameters + + $adapterState = $currentNetAdapterBinding.Enabled | + Sort-Object -Unique + + if ( $adapterState.Count -eq 2) + { + $currentEnabled = 'Mixed' + } + elseif ( $adapterState -eq $true ) + { + $currentEnabled = 'Enabled' + } + else + { + $currentEnabled = 'Disabled' + } + + # Test if the binding is in the correct state + if ($currentEnabled -ne $State) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterBindingDoesNotMatchMessage -f ` + $InterfaceAlias, $ComponentId, $State, $currentEnabled) + ) -join '' ) + + return $false + } + else + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterBindingMatchMessage -f ` + $InterfaceAlias, $ComponentId) + ) -join '' ) + + return $true + } # if +} # Test-TargetResource + +<# + .SYNOPSIS + Ensures the interface and component Id exists and returns the Net Adapter binding object. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. Supports the use of '*'. + + .PARAMETER ComponentId + Specifies the underlying name of the transport or filter in the following + form - ms_xxxx, such as ms_tcpip. + + .PARAMETER State + Specifies if the component ID for the Interface should be Enabled or Disabled. +#> +function Get-Binding +{ + [CmdletBinding()] + [OutputType([Microsoft.Management.Infrastructure.CimInstance])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ComponentId, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $State = 'Enabled' + ) + + if (-not (Get-NetAdapter -Name $InterfaceAlias -ErrorAction SilentlyContinue)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InterfaceNotAvailableError -f $InterfaceAlias) ` + -ArgumentName 'InterfaceAlias' + } # if + + $binding = Get-NetAdapterBinding ` + -InterfaceAlias $InterfaceAlias ` + -ComponentId $ComponentId ` + -ErrorAction Stop + + return $binding +} # Get-Binding + +Export-ModuleMember -function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/DSC_NetAdapterBinding.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/DSC_NetAdapterBinding.schema.mof new file mode 100644 index 0000000..6bf53d4 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/DSC_NetAdapterBinding.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0"), FriendlyName("NetAdapterBinding")] +class DSC_NetAdapterBinding : OMI_BaseResource +{ + [Key, Description("Specifies the alias of a network interface. Supports the use of '*'.")] string InterfaceAlias; + [Key, Description("Specifies the underlying name of the transport or filter in the following form - ms_xxxx, such as ms_tcpip.")] string ComponentId; + [Write, Description("Specifies if the component ID for the Interface should be Enabled or Disabled."), ValueMap{"Enabled", "Disabled"}, Values{"Enabled", "Disabled"}] string State; + [Read, Description("Returns the current state of the component ID for the Interfaces."), ValueMap{"Enabled", "Disabled","Mixed"}, Values{"Enabled", "Disabled","Mixed"}] string CurrentState; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/README.MD new file mode 100644 index 0000000..54cd030 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to bind or unbind transport or filters to a network interface. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/en-US/DSC_NetAdapterBinding.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/en-US/DSC_NetAdapterBinding.strings.psd1 new file mode 100644 index 0000000..d920a08 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/en-US/DSC_NetAdapterBinding.strings.psd1 @@ -0,0 +1,12 @@ +# Localized resources for DSC_NetAdapterBinding + +ConvertFrom-StringData @' + GettingNetAdapterBindingMessage = Getting the '{0}' Inerface '{1}' Binding. + ApplyingNetAdapterBindingMessage = Applying the '{0}' Inerface '{1}' Binding. + NetAdapterBindingEnabledMessage = '{0}' Inerface '{1}' Binding was Enabled. + NetAdapterBindingDisabledMessage = '{0}' Inerface '{1}' Binding was Disabled. + CheckingNetAdapterBindingMessage = Checking the '{0}' Inerface '{1}' Binding. + NetAdapterBindingDoesNotMatchMessage = '{0}' Inerface '{1}' Binding does NOT match desired state. Expected '{2}', actual '{3}'. + NetAdapterBindingMatchMessage = '{0}' Inerface '{1}' Binding is in desired state. + InterfaceNotAvailableError = Interface '{0}' is not available. Please select a valid interface and try again. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/en-US/about_NetAdapterBinding.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/en-US/about_NetAdapterBinding.help.txt new file mode 100644 index 0000000..60997b7 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterBinding/en-US/about_NetAdapterBinding.help.txt @@ -0,0 +1,44 @@ +.NAME + NetAdapterBinding + +.DESCRIPTION + This resource is used to bind or unbind transport or filters to a network interface. + +.PARAMETER InterfaceAlias + Key - String + Specifies the alias of a network interface. Supports the use of '*'. + +.PARAMETER ComponentId + Key - String + Specifies the underlying name of the transport or filter in the following form - ms_xxxx, such as ms_tcpip. + +.PARAMETER State + Write - String + Allowed values: Enabled, Disabled + Specifies if the component ID for the Interface should be Enabled or Disabled. + +.PARAMETER CurrentState + Read - String + Allowed values: Enabled, Disabled, Mixed + Returns the current state of the component ID for the Interfaces. + +.EXAMPLE 1 + +Disabling IPv6 for the Ethernet adapter. + +Configuration NetAdapterBinding_DisableIPv6_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterBinding DisableIPv6 + { + InterfaceAlias = 'Ethernet' + ComponentId = 'ms_tcpip6' + State = 'Disabled' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/DSC_NetAdapterLso.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/DSC_NetAdapterLso.psm1 new file mode 100644 index 0000000..839e2d3 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/DSC_NetAdapterLso.psm1 @@ -0,0 +1,256 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current state of NetAdapterLso for a adapter. + + .PARAMETER Name + Specifies the name of the network adapter to check. + + .PARAMETER Protocol + Specifies which protocol to target. + + .PARAMETER State + Specifies the LSO state for the protocol. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('V1IPv4', 'IPv4', 'IPv6')] + [System.String] + $Protocol, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterLso -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $Name, $Protocol) + ) -join '') + + $result = @{ + Name = $Name + Protocol = $Protocol + } + + switch ($Protocol) + { + 'V1IPv4' + { + $result.add('State', $netAdapter.V1IPv4Enabled) + } + + 'IPv4' + { + $result.add('State', $netAdapter.IPv4Enabled) + } + + 'IPv6' + { + $result.add('State', $netAdapter.IPv6Enabled) + } + } + + return $result + } +} + +<# + .SYNOPSIS + Sets the NetAdapterLso resource state. + + .PARAMETER Name + Specifies the name of the network adapter to check. + + .PARAMETER Protocol + Specifies which protocol to target. + + .PARAMETER State + Specifies the LSO state for the protocol. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('V1IPv4', 'IPv4', 'IPv6')] + [System.String] + $Protocol, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterLso -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $Name, $Protocol) + ) -join '') + + if ($Protocol -eq 'V1IPv4' -and $State -ne $netAdapter.V1IPv4Enabled) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterApplyingChangesMessage -f ` + $Name, $Protocol, $($netAdapter.V1IPv4Enabled.ToString()), $($State.ToString()) ) + ) -join '') + + Set-NetAdapterLso -Name $Name -V1IPv4Enabled $State + } + elseif ($Protocol -eq 'IPv4' -and $State -ne $netAdapter.IPv4Enabled) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterApplyingChangesMessage -f ` + $Name, $Protocol, $($netAdapter.IPv4Enabled.ToString()), $($State.ToString()) ) + ) -join '') + + Set-NetAdapterLso -Name $Name -IPv4Enabled $State + } + elseif ($Protocol -eq 'IPv6' -and $State -ne $netAdapter.IPv6Enabled) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterApplyingChangesMessage -f ` + $Name, $Protocol, $($netAdapter.IPv6Enabled.ToString()), $($State.ToString()) ) + ) -join '') + + Set-NetAdapterLso -Name $Name -IPv6Enabled $State + } + } +} + +<# + .SYNOPSIS + Tests if the NetAdapterLso resource state is desired state. + + .PARAMETER Name + Specifies the name of the network adapter to check. + + .PARAMETER Protocol + Specifies which protocol to target. + + .PARAMETER State + Specifies the LSO state for the protocol. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('V1IPv4', 'IPv4', 'IPv6')] + [System.String] + $Protocol, + + [Parameter(Mandatory = $true)] + [System.Boolean] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterLso -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.NetAdapterTestingStateMessage -f ` + $Name, $Protocol + ) -join '') + + switch ($Protocol) + { + 'V1IPv4' + { + return ($State -eq $netAdapter.V1IPv4Enabled) + } + + 'IPv4' + { + return ($State -eq $netAdapter.IPv4Enabled) + } + + 'IPv6' + { + return ($State -eq $netAdapter.IPv6Enabled) + } + } + } +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/DSC_NetAdapterLso.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/DSC_NetAdapterLso.schema.mof new file mode 100644 index 0000000..783953a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/DSC_NetAdapterLso.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.0.0"), FriendlyName("NetAdapterLso")] +class DSC_NetAdapterLso : OMI_BaseResource +{ + [Key, Description("Specifies the name of network adapter.")] String Name; + [Required, Description("Specifies which protocol to make changes to."), ValueMap{"V1IPv4","IPv4","IPv6"}, Values{"V1IPv4","IPv4","IPv6"}] String Protocol; + [Required, Description("Specifies whether LSO should be enabled or disabled.")] Boolean State; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/README.MD new file mode 100644 index 0000000..5a4f473 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/README.MD @@ -0,0 +1,4 @@ +# Description + +This resource is used to enable or disable LSO for specific protocols on a +network adapter. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/en-US/DSC_NetAdapterLso.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/en-US/DSC_NetAdapterLso.strings.psd1 new file mode 100644 index 0000000..b0c6e30 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/en-US/DSC_NetAdapterLso.strings.psd1 @@ -0,0 +1,8 @@ +# Localized resources for DSC_NetAdapterLso + +ConvertFrom-StringData @' + CheckingNetAdapterMessage = Checking if network adapter exists or not. + NetAdapterNotFoundMessage = Network adapter not found. + NetAdapterTestingStateMessage = Checking if adapter '{0}' '{1}' is in desired state. + NetAdapterApplyingChangesMessage = Network adapter '{0}' '{1}' was '{2}', should be '{3}', applying changes. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/en-US/about_NetAdapterLso.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/en-US/about_NetAdapterLso.help.txt new file mode 100644 index 0000000..3ee9fbf --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterLso/en-US/about_NetAdapterLso.help.txt @@ -0,0 +1,59 @@ +.NAME + NetAdapterLso + +.DESCRIPTION + This resource is used to enable or disable LSO for specific protocols on a + network adapter. + +.PARAMETER Name + Key - String + Specifies the name of network adapter. + +.PARAMETER Protocol + Required - String + Allowed values: V1IPv4, IPv4, IPv6 + Specifies which protocol to make changes to. + +.PARAMETER State + Required - Boolean + Specifies whether LSO should be enabled or disabled. + +.EXAMPLE 1 + +This configuration disables LSO for IPv6 on the network adapter. + +Configuration NetAdapterLso_DisableLsoIPv6_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterLso DisableLsoIPv6 + { + Name = 'Ethernet' + Protocol = 'IPv6' + State = $false + } + } +} + +.EXAMPLE 2 + +This configuration disables LSO for IPv4 on the network adapter. + +Configuration NetAdapterLso_DisableLsoIPv4_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterLso DisableLsoIPv4 + { + Name = 'Ethernet' + Protocol = 'IPv4' + State = $false + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/DSC_NetAdapterName.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/DSC_NetAdapterName.psm1 new file mode 100644 index 0000000..cb61f39 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/DSC_NetAdapterName.psm1 @@ -0,0 +1,399 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + This function will get the network adapter based on the provided + parameters. + + .PARAMETER NewName + Specifies the new name of the network adapter. + + .PARAMETER Name + This is the name of the network adapter to find. + + .PARAMETER PhysicalMediaType + This is the media type of the network adapter to find. + + .PARAMETER Status + This is the status of the network adapter to find. + + .PARAMETER MacAddress + This is the MAC address of the network adapter to find. + + .PARAMETER InterfaceDescription + This is the interface description of the network adapter to find. + + .PARAMETER InterfaceIndex + This is the interface index of the network adapter to find. + + .PARAMETER InterfaceGuid + This is the interface GUID of the network adapter to find. + + .PARAMETER DriverDescription + This is the driver description of the network adapter. + + .PARAMETER InterfaceNumber + This is the interface number of the network adapter if more than one + are returned by the parameters. + + .PARAMETER IgnoreMultipleMatchingAdapters + This switch will suppress an error occurring if more than one matching + adapter matches the parameters passed. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NewName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [System.String] + $PhysicalMediaType, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [ValidateSet('Up', 'Disconnected', 'Disabled')] + [System.String] + $Status = 'Up', + + [Parameter()] + [System.String] + $MacAddress, + + [Parameter()] + [System.String] + $InterfaceDescription, + + [Parameter()] + [System.UInt32] + $InterfaceIndex, + + [Parameter()] + [System.String] + $InterfaceGuid, + + [Parameter()] + [System.String] + $DriverDescription, + + [Parameter()] + [System.UInt32] + $InterfaceNumber = 1, + + [Parameter()] + [System.Boolean] + $IgnoreMultipleMatchingAdapters = $false + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.GettingNetAdapterNameMessage -f $NewName) + ) -join '') + + $adapter = Find-NetworkAdapter ` + -Name $NewName ` + -ErrorAction SilentlyContinue + + if (-not $adapter) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FindNetAdapterMessage) + ) -join '') + + $null = $PSBoundParameters.Remove('NewName') + + $adapter = Find-NetworkAdapter ` + @PSBoundParameters ` + -ErrorAction Stop + } + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterNameFoundMessage -f $adapter.Name) + ) -join '') + + $returnValue = @{ + Name = $adapter.Name + PhysicalMediaType = $adapter.PhysicalMediaType + Status = $adapter.Status + MacAddress = $adapter.MacAddress + InterfaceDescription = $adapter.InterfaceDescription + InterfaceIndex = $adapter.InterfaceIndex + InterfaceGuid = $adapter.InterfaceGuid + DriverDescription = $adapter.DriverDescription + InterfaceNumber = $InterfaceNumber + IgnoreMultipleMatchingAdapters = $IgnoreMultipleMatchingAdapters + } + + return $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + This function will rename a network adapter that matches the parameters. + + .PARAMETER NewName + Specifies the new name of the network adapter. + + .PARAMETER Name + This is the name of the network adapter to find. + + .PARAMETER PhysicalMediaType + This is the media type of the network adapter to find. + + .PARAMETER Status + This is the status of the network adapter to find. + + .PARAMETER MacAddress + This is the MAC address of the network adapter to find. + + .PARAMETER InterfaceDescription + This is the interface description of the network adapter to find. + + .PARAMETER InterfaceIndex + This is the interface index of the network adapter to find. + + .PARAMETER InterfaceGuid + This is the interface GUID of the network adapter to find. + + .PARAMETER DriverDescription + This is the driver description of the network adapter. + + .PARAMETER InterfaceNumber + This is the interface number of the network adapter if more than one + are returned by the parameters. + + .PARAMETER IgnoreMultipleMatchingAdapters + This switch will suppress an error occurring if more than one matching + adapter matches the parameters passed. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NewName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [System.String] + $PhysicalMediaType, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [ValidateSet('Up', 'Disconnected', 'Disabled')] + [System.String] + $Status = 'Up', + + [Parameter()] + [System.String] + $MacAddress, + + [Parameter()] + [System.String] + $InterfaceDescription, + + [Parameter()] + [System.UInt32] + $InterfaceIndex, + + [Parameter()] + [System.String] + $InterfaceGuid, + + [Parameter()] + [System.String] + $DriverDescription, + + [Parameter()] + [System.UInt32] + $InterfaceNumber = 1, + + [Parameter()] + [System.Boolean] + $IgnoreMultipleMatchingAdapters = $false + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingNetAdapterNameMessage -f $NewName) + ) -join '') + + $null = $PSBoundParameters.Remove('NewName') + + $adapter = Find-NetworkAdapter ` + @PSBoundParameters ` + -ErrorAction Stop + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.RenamingNetAdapterNameMessage -f $adapter.Name, $NewName) + ) -join '') + + $adapter | Rename-NetAdapter -NewName $NewName + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterNameRenamedMessage -f $NewName) + ) -join '') +} # Set-TargetResource + +<# + .SYNOPSIS + This will check if the network adapter that matches the parameters needs + to be returned. + + .PARAMETER NewName + Specifies the new name of the network adapter. + + .PARAMETER Name + This is the name of the network adapter to find. + + .PARAMETER PhysicalMediaType + This is the media type of the network adapter to find. + + .PARAMETER Status + This is the status of the network adapter to find. + + .PARAMETER MacAddress + This is the MAC address of the network adapter to find. + + .PARAMETER InterfaceDescription + This is the interface description of the network adapter to find. + + .PARAMETER InterfaceIndex + This is the interface index of the network adapter to find. + + .PARAMETER InterfaceGuid + This is the interface GUID of the network adapter to find. + + .PARAMETER DriverDescription + This is the driver description of the network adapter. + + .PARAMETER InterfaceNumber + This is the interface number of the network adapter if more than one + are returned by the parameters. + + .PARAMETER IgnoreMultipleMatchingAdapters + This switch will suppress an error occurring if more than one matching + adapter matches the parameters passed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NewName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [System.String] + $PhysicalMediaType, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [ValidateSet('Up', 'Disconnected', 'Disabled')] + [System.String] + $Status = 'Up', + + [Parameter()] + [System.String] + $MacAddress, + + [Parameter()] + [System.String] + $InterfaceDescription, + + [Parameter()] + [System.UInt32] + $InterfaceIndex, + + [Parameter()] + [System.String] + $InterfaceGuid, + + [Parameter()] + [System.String] + $DriverDescription, + + [Parameter()] + [System.UInt32] + $InterfaceNumber = 1, + + [Parameter()] + [System.Boolean] + $IgnoreMultipleMatchingAdapters = $false + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.TestingNetAdapterNameMessage -f $NewName) + ) -join '') + + $null = $PSBoundParameters.Remove('NewName') + + # Can an adapter be found with the new name? + $adapterWithNewName = Find-NetworkAdapter ` + -Name $NewName ` + -Verbose:$Verbose ` + -ErrorAction SilentlyContinue + + if ($adapterWithNewName) + { + # An adapter was found matching the new name + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterWithNewNameExistsMessage -f $adapterWithNewName.Name) + ) -join '') + + return $true + } + else + { + # Find an adapter matching the parameters - throw if none can be found + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.FindNetAdapterMessage) + ) -join '') + + $adapter = Find-NetworkAdapter ` + @PSBoundParameters ` + -ErrorAction Stop + + # An adapter was found that needs to be changed to the new name + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterNameNotMatchMessage -f $adapter.Name, $NewName) + ) -join '') + + return $false + } # if +} # Test-TargetResource + +Export-ModuleMember -function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/DSC_NetAdapterName.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/DSC_NetAdapterName.schema.mof new file mode 100644 index 0000000..aa27f02 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/DSC_NetAdapterName.schema.mof @@ -0,0 +1,15 @@ +[ClassVersion("1.0.0"), FriendlyName("NetAdapterName")] +class DSC_NetAdapterName : OMI_BaseResource +{ + [Key, Description("Specifies the new name of the network adapter.")] String NewName; + [Write, Description("This is the name of the network adapter to find.")] String Name; + [Write, Description("This is the media type of the network adapter to find.")] String PhysicalMediaType; + [Write, Description("This is the status of the network adapter to find."), ValueMap{"Up", "Disconnected", "Disabled"}, Values{"Up", "Disconnected", "Disabled"}] String Status; + [Write, Description("This is the MAC address of the network adapter to find.")] String MacAddress; + [Write, Description("This is the interface description of the network adapter to find.")] String InterfaceDescription; + [Write, Description("This is the interface index of the network adapter to find.")] UInt32 InterfaceIndex; + [Write, Description("This is the interface GUID of the network adapter to find.")] String InterfaceGuid; + [Write, Description("This is the driver description of the network adapter.")] String DriverDescription; + [Write, Description("This is the interface number of the network adapter if more than one are returned by the parameters.")] UInt32 InterfaceNumber; + [Write, Description("This switch will suppress an error occurring if more than one matching adapter matches the parameters passed.")] Boolean IgnoreMultipleMatchingAdapters; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/README.MD new file mode 100644 index 0000000..8ca22ad --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to rename a network interface that matches the search parameters passed in. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/en-US/DSC_NetAdapterName.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/en-US/DSC_NetAdapterName.strings.psd1 new file mode 100644 index 0000000..5c925d6 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/en-US/DSC_NetAdapterName.strings.psd1 @@ -0,0 +1,11 @@ +ConvertFrom-StringData @' + GettingNetAdapterNameMessage = Getting the network adapter Name '{0}'. + FindNetAdapterMessage = Finding network adapter matching search criteria. + NetAdapterNameFoundMessage = network adapter '{0}' found. + SettingNetAdapterNameMessage = Setting the network adapter Name '{0}'. + RenamingNetAdapterNameMessage = Renaming network adapter '{0}' to '{1}'. + NetAdapterNameRenamedMessage = network adapter renamed to '{0}'. + TestingNetAdapterNameMessage = Testing the network adapter Name '{0}'. + NetAdapterWithNewNameExistsMessage = A network adapter was found with the intended new name '{0}' of the Adapter. No rename required. + NetAdapterNameNotMatchMessage = network adapter Name '{0}' does not match the adapter '{1}' that was found. Rename required. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/en-US/about_NetAdapterName.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/en-US/about_NetAdapterName.help.txt new file mode 100644 index 0000000..a250fb5 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterName/en-US/about_NetAdapterName.help.txt @@ -0,0 +1,160 @@ +.NAME + NetAdapterName + +.DESCRIPTION + This resource is used to rename a network interface that matches the search parameters passed in. + +.PARAMETER NewName + Key - String + Specifies the new name of the network adapter. + +.PARAMETER Name + Write - String + This is the name of the network adapter to find. + +.PARAMETER PhysicalMediaType + Write - String + This is the media type of the network adapter to find. + +.PARAMETER Status + Write - String + Allowed values: Up, Disconnected, Disabled + This is the status of the network adapter to find. + +.PARAMETER MacAddress + Write - String + This is the MAC address of the network adapter to find. + +.PARAMETER InterfaceDescription + Write - String + This is the interface description of the network adapter to find. + +.PARAMETER InterfaceIndex + Write - UInt32 + This is the interface index of the network adapter to find. + +.PARAMETER InterfaceGuid + Write - String + This is the interface GUID of the network adapter to find. + +.PARAMETER DriverDescription + Write - String + This is the driver description of the network adapter. + +.PARAMETER InterfaceNumber + Write - UInt32 + This is the interface number of the network adapter if more than one are returned by the parameters. + +.PARAMETER IgnoreMultipleMatchingAdapters + Write - Boolean + This switch will suppress an error occurring if more than one matching adapter matches the parameters passed. + +.EXAMPLE 1 + +Rename three network adapters identified by MAC addresses to +Cluster, Management and SMB and then enable DHCP on them. + +Configuration NetAdapterName_RenameNetAdapterMacAddress_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterName RenameNetAdapterCluster + { + NewName = 'Cluster' + MacAddress = '9C-D2-1E-61-B5-DA' + } + + NetIPInterface EnableDhcpClientCluster + { + InterfaceAlias = 'Cluster' + AddressFamily = 'IPv4' + Dhcp = 'Enabled' + } + + NetAdapterName RenameNetAdapterManagement + { + NewName = 'Management' + MacAddress = '9C-D2-1E-61-B5-DB' + } + + NetIPInterface EnableDhcpClientManagement + { + InterfaceAlias = 'Management' + AddressFamily = 'IPv4' + Dhcp = 'Enabled' + } + + NetAdapterName RenameNetAdapterSMB + { + NewName = 'SMB' + MacAddress = '9C-D2-1E-61-B5-DC' + } + + NetIPInterface EnableDhcpClientSMB + { + InterfaceAlias = 'SMB' + AddressFamily = 'IPv4' + Dhcp = 'Enabled' + } + } +} + +.EXAMPLE 2 + +Rename the first three network adapters with Driver Description matching +'Hyper-V Virtual Ethernet Adapter' in consequtive order to Cluster, Management +and SMB and then enable DHCP on them. + +Configuration NetAdapterName_RenameNetAdapterDriver_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterName RenameNetAdapterCluster + { + NewName = 'Cluster' + DriverDescription = 'Hyper-V Virtual Ethernet Adapter' + InterfaceNumber = 1 + } + + NetIPInterface EnableDhcpClientCluster + { + InterfaceAlias = 'Cluster' + AddressFamily = 'IPv4' + Dhcp = 'Enabled' + } + + NetAdapterName RenameNetAdapterManagement + { + NewName = 'Management' + DriverDescription = 'Hyper-V Virtual Ethernet Adapter' + InterfaceNumber = 2 + } + + NetIPInterface EnableDhcpClientManagement + { + InterfaceAlias = 'Management' + AddressFamily = 'IPv4' + Dhcp = 'Enabled' + } + + NetAdapterName RenameNetAdapterSMB + { + NewName = 'SMB' + DriverDescription = 'Hyper-V Virtual Ethernet Adapter' + InterfaceNumber = 3 + } + + NetIPInterface EnableDhcpClientSMB + { + InterfaceAlias = 'SMB' + AddressFamily = 'IPv4' + Dhcp = 'Enabled' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/DSC_NetAdapterRdma.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/DSC_NetAdapterRdma.psm1 new file mode 100644 index 0000000..26d4c3c --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/DSC_NetAdapterRdma.psm1 @@ -0,0 +1,165 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the state of the network adapter RDMA. + + .PARAMETER Name + Specifies the name of network adapter for which RDMA needs + to be configured. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name + ) + + $configuration = @{ + Name = $Name + } + + try + { + Write-Verbose -Message ($script:localizedData.GetNetAdapterRdmaMessage -f $Name) + + $netAdapterRdma = Get-NetAdapterRdma -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundError -f $Name) + } + + if ($netAdapterRdma) + { + Write-Verbose -Message ($script:localizedData.CheckNetAdapterRdmaMessage -f $Name) + + $configuration.Add('Enabled', $netAdapterRdma.Enabled) + } + + return $configuration +} + +<# + .SYNOPSIS + Sets the state of the network adapter RDMA. + + .PARAMETER Name + Specifies the name of network adapter for which RDMA needs + to be configured. + + .PARAMETER Enabled + Specifies if the RDMA configuration should be enabled or disabled. + Defaults to $true. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $Enabled = $true + ) + + try + { + Write-Verbose -Message ($script:localizedData.GetNetAdapterRdmaMessage -f $Name) + + $netAdapterRdma = Get-NetAdapterRdma -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundError -f $Name) + } + + if ($netAdapterRdma) + { + Write-Verbose -Message ($script:localizedData.CheckNetAdapterRdmaMessage -f $Name) + + if ($netAdapterRdma.Enabled -ne $Enabled) + { + Write-Verbose -Message ($script:localizedData.SetNetAdapterRdmaMessage -f $Name, $Enabled) + + Set-NetAdapterRdma -Name $Name -Enabled $Enabled + } + } +} + +<# + .SYNOPSIS + Tests the state of the network adapter RDMA. + + .PARAMETER Name + Specifies the name of network adapter for which RDMA needs + to be configured. + + .PARAMETER Enabled + Specifies if the RDMA configuration should be enabled or disabled. + Defaults to $true. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.Boolean] + $Enabled = $true + ) + + try + { + Write-Verbose -Message ($script:localizedData.GetNetAdapterRdmaMessage -f $Name) + + $netAdapterRdma = Get-NetAdapterRdma -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundError -f $Name) + } + + if ($netAdapterRdma) + { + Write-Verbose -Message ($script:localizedData.CheckNetAdapterRdmaMessage -f $Name) + + if ($netAdapterRdma.Enabled -ne $Enabled) + { + Write-Verbose -Message ($script:localizedData.NetAdapterRdmaDifferentMessage -f $Name) + + return $false + } + else + { + Write-Verbose -Message ($script:localizedData.NetAdapterRdmaMatchesMessage -f $Name) + + return $true + } + } +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/DSC_NetAdapterRdma.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/DSC_NetAdapterRdma.schema.mof new file mode 100644 index 0000000..1eb259d --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/DSC_NetAdapterRdma.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("NetAdapterRdma")] +class DSC_NetAdapterRdma : OMI_BaseResource +{ + [Key, Description("Specifies the name of network adapter for which RDMA needs to be configured.")] String Name; + [Write, Description("Specifies if the RDMA configuration should be enabled or disabled. Defaults to $true.")] Boolean Enabled; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/README.MD new file mode 100644 index 0000000..3aace01 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to enable or disable RDMA on a network adapter. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/en-US/DSC_NetAdapterRdma.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/en-US/DSC_NetAdapterRdma.strings.psd1 new file mode 100644 index 0000000..70b6c78 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/en-US/DSC_NetAdapterRdma.strings.psd1 @@ -0,0 +1,10 @@ +# Localized resources for DSC_NetAdapterRdma + +ConvertFrom-StringData @' + GetNetAdapterRdmaMessage = Getting network adapter '{0}' RDMA setting. + NetAdapterNotFoundError = Network adapter '{0}' not found. + CheckNetAdapterRdmaMessage = Checking the RDMA enabled state for network adapter '{0}'. + SetNetAdapterRdmaMessage = Setting network adapter '{0}' RDMA enabled to '{1}'. + NetAdapterRdmaDifferentMessage = RDMA setting for network adapter '{0}' is not in desired state. This will be configured. + NetAdapterRdmaMatchesMessage = RDMA setting for network adapter '{0}' is in desired state. No action needed. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/en-US/about_NetAdapterRdma.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/en-US/about_NetAdapterRdma.help.txt new file mode 100644 index 0000000..df6b501 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRdma/en-US/about_NetAdapterRdma.help.txt @@ -0,0 +1,51 @@ +.NAME + NetAdapterRdma + +.DESCRIPTION + This resource is used to enable or disable RDMA on a network adapter. + +.PARAMETER Name + Key - String + Specifies the name of network adapter for which RDMA needs to be configured. + +.PARAMETER Enabled + Write - Boolean + Specifies if the RDMA configuration should be enabled or disabled. Defaults to $true. + +.EXAMPLE 1 + +This configuration disables RDMA setting on the network adapter. + +Configuration NetAdapterRdma_DisableRdmaSettings_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterRdma DisableRdmaSettings + { + Name = 'SMB1_1' + Enabled = $false + } + } +} + +.EXAMPLE 2 + +This configuration enables RDMA setting on the network adapter. + +Configuration NetAdapterRdma_EnableRdmaSettings_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterRdma EnableRdmaSettings + { + Name = 'SMB1_1' + Enabled = $true + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/DSC_NetAdapterRSC.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/DSC_NetAdapterRSC.schema.mof new file mode 100644 index 0000000..15eb704 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/DSC_NetAdapterRSC.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0.0"), FriendlyName("NetAdapterRsc")] +class DSC_NetAdapterRsc : OMI_BaseResource +{ + [Key, Description("Specifies the Name of network adapter.")] String Name; + [Required, Description("Specifies which protocol to make changes to."), ValueMap{"IPv4","IPv6","All"}, Values{"IPv4","IPv6","All"}] String Protocol; + [Required, Description("Specifies whether RSC should be enabled or disabled.")] Boolean State; + [Read, Description("Returns the current state of RSC for IPv4")] String StateIPv4; + [Read, Description("Returns the current state of RSC for IPv6")] String StateIPv6; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/DSC_NetAdapterRsc.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/DSC_NetAdapterRsc.psm1 new file mode 100644 index 0000000..4246dc6 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/DSC_NetAdapterRsc.psm1 @@ -0,0 +1,245 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current state of NetAdapterRSC for a adapter. + + .PARAMETER Name + Specifies the Name of the network adapter to check. + + .PARAMETER Protocol + Specifies which protocol to target. + + .PARAMETER State + Specifies the RSC state for the protocol. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("IPv4", "IPv6", "All")] + [String] + $Protocol, + + [Parameter(Mandatory = $true)] + [Boolean] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterRsc -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $Name, $Protocol) + ) -join '') + + $result = @{ + Name = $Name + Protocol = $Protocol + } + switch ($Protocol) + { + 'IPv4' + { + $result.add('State', $netAdapter.IPv4Enabled) + $result.add('StateIPv4', $netAdapter.IPv4Enabled) + } + 'IPv6' + { + $result.add('State', $netAdapter.IPv6Enabled) + $result.add('StateIPv6', $netAdapter.IPv6Enabled) + } + 'All' + { + $result.add('State', $netAdapter.IPv4Enabled) + $result.add('StateIPv4', $netAdapter.IPv4Enabled) + $result.add('StateIPv6', $netAdapter.IPv6Enabled) + } + } + + return $result + } +} + +<# + .SYNOPSIS + Sets the NetAdapterRSC resource state. + + .PARAMETER Name + Specifies the Name of the network adapter to check. + + .PARAMETER Protocol + Specifies which protocol to target. + + .PARAMETER State + Specifies the RSC state for the protocol. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("IPv4", "IPv6", "All")] + [String] + $Protocol, + + [Parameter(Mandatory = $true)] + [Boolean] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterRsc -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $Name, $Protocol) + ) -join '') + + if ($Protocol -in ('IPv4', 'All') -and $State -ne $netAdapter.IPv4Enabled) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterApplyingChangesMessage -f ` + $Name, $Protocol, $($netAdapter.IPv4Enabled.ToString()), $($State.ToString()) ) + ) -join '') + + Set-NetAdapterRsc -Name $Name -IPv4Enabled $State + } + if ($Protocol -in ('IPv6', 'All') -and $State -ne $netAdapter.IPv6Enabled) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterApplyingChangesMessage -f ` + $Name, $Protocol, $($netAdapter.IPv6Enabled.ToString()), $($State.ToString()) ) + ) -join '') + + Set-NetAdapterRsc -Name $Name -IPv6Enabled $State + } + } +} + +<# + .SYNOPSIS + Tests if the NetAdapterRsc resource state is desired state. + + .PARAMETER Name + Specifies the Name of the network adapter to check. + + .PARAMETER Protocol + Specifies which protocol to target. + + .PARAMETER State + Specifies the RSC state for the protocol. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("IPv4", "IPv6", "All")] + [String] + $Protocol, + + [Parameter(Mandatory = $true)] + [Boolean] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterRsc -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.NetAdapterTestingStateMessage -f ` + $Name, $Protocol + ) -join '') + + switch ($Protocol) + { + 'IPv4' + { + return ($State -eq $netAdapter.IPv4Enabled) + } + 'IPv6' + { + return ($State -eq $netAdapter.IPv6Enabled) + } + 'All' + { + return ($State -eq $netAdapter.IPv4Enabled -and $State -eq $netAdapter.IPv6Enabled) + } + } + } +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/README.MD new file mode 100644 index 0000000..f32bee7 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to enable or disable RSC (Recv Segment Coalescing) for specific protocols on a network adapter. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/en-US/DSC_NetAdapterRsc.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/en-US/DSC_NetAdapterRsc.strings.psd1 new file mode 100644 index 0000000..fba0b5f --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/en-US/DSC_NetAdapterRsc.strings.psd1 @@ -0,0 +1,8 @@ +# Localized resources for DSC_NetAdapterRsc + +ConvertFrom-StringData @' + CheckingNetAdapterMessage = Checking if network adapter exists or not. + NetAdapterNotFoundMessage = Network adapter not found. + NetAdapterTestingStateMessage = Checking if adapter {0} {1} is in desired state. + NetAdapterApplyingChangesMessage = Network adapter {0} {1} was {2}, should be {3}, applying changes. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/en-US/about_NetAdapterRsc.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/en-US/about_NetAdapterRsc.help.txt new file mode 100644 index 0000000..ae66f43 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRsc/en-US/about_NetAdapterRsc.help.txt @@ -0,0 +1,85 @@ +.NAME + NetAdapterRsc + +.DESCRIPTION + This resource is used to enable or disable RSC (Recv Segment Coalescing) for specific protocols on a network adapter. + +.PARAMETER Name + Key - String + Specifies the Name of network adapter. + +.PARAMETER Protocol + Required - String + Allowed values: IPv4, IPv6, All + Specifies which protocol to make changes to. + +.PARAMETER State + Required - Boolean + Specifies whether RSC should be enabled or disabled. + +.PARAMETER StateIPv4 + Read - String + Returns the current state of RSC for IPv4 + +.PARAMETER StateIPv6 + Read - String + Returns the current state of RSC for IPv6 + +.EXAMPLE 1 + +This configuration disables RSC for IPv6 on the network adapter. + +Configuration NetAdapterRsc_DisableRscIPv6_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterRsc DisableRscIPv6 + { + Name = 'Ethernet' + Protocol = 'IPv6' + State = $false + } + } +} + +.EXAMPLE 2 + +This configuration disables RSC for IPv4 on the network adapter. + +Configuration NetAdapterRsc_DisableRscIPv4_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterRsc DisableRscIPv4 + { + Name = 'Ethernet' + Protocol = 'IPv4' + State = $false + } + } +} + +.EXAMPLE 3 + +This configuration disables RSC on the network adapter. + +Configuration NetAdapterRsc_DisableRscAll_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterRsc DisableRscAll + { + Name = 'Ethernet' + Protocol = 'All' + State = $false + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/DSC_NetAdapterRss.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/DSC_NetAdapterRss.psm1 new file mode 100644 index 0000000..09b43f9 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/DSC_NetAdapterRss.psm1 @@ -0,0 +1,178 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current state of NetAdapterRss for a adapter. + + .PARAMETER Name + Specifies the Name of the network adapter to check. + + .PARAMETER State + Specifies the Rss state for the protocol. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [Boolean] + $Enabled + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterRss -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $Name, $Enabled) + ) -join '') + + $result = @{ + Name = $Name + Enabled = $netAdapter.Enabled + } + + return $result + } +} + +<# + .SYNOPSIS + Sets the NetAdapterRss resource state. + + .PARAMETER Name + Specifies the Name of the network adapter to check. + + .PARAMETER State + Specifies the Rss state for the protocol. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [Boolean] + $Enabled + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterRss -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $Name, $Enabled) + ) -join '') + + if ($Enabled -ne $netAdapter.Enabled) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterApplyingChangesMessage -f ` + $Name, $Enabled, $($netAdapter.Enabled.ToString()), $($Enabled.ToString()) ) + ) -join '') + + Set-NetAdapterRss -Name $Name -Enabled:$Enabled + } + } +} + +<# + .SYNOPSIS + Tests if the NetAdapterRss resource state is desired state. + + .PARAMETER Name + Specifies the Name of the network adapter to check. + + .PARAMETER State + Specifies the Rss state for the protocol. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [Boolean] + $Enabled + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapterRss -Name $Name -ErrorAction Stop + } + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundMessage) + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.NetAdapterTestingStateMessage -f ` + $Name, $Enabled + ) -join '') + + return ($Enabled -eq $netAdapter.Enabled) + } +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/DSC_NetAdapterRss.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/DSC_NetAdapterRss.schema.mof new file mode 100644 index 0000000..e2b2779 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/DSC_NetAdapterRss.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("NetAdapterRss")] +class DSC_NetAdapterRss : OMI_BaseResource +{ + [Key, Description("Specifies the Name of network adapter.")] String Name; + [Required, Description("Specifies whether RSS should be enabled or disabled.")] Boolean Enabled; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/README.MD new file mode 100644 index 0000000..c8fb92e --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/README.MD @@ -0,0 +1,5 @@ +# Description + +This resource is used to enable or disable RSS (Receive Side Scaling) on a network adapter. +Not all adapters support RSS so there may be no option for this and it will throw an exception that the network adapter is not found. + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/en-US/DSC_NetAdapterRss.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/en-US/DSC_NetAdapterRss.strings.psd1 new file mode 100644 index 0000000..cfd5e86 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/en-US/DSC_NetAdapterRss.strings.psd1 @@ -0,0 +1,8 @@ +# Localized resources for DSC_NetAdapterRss + +ConvertFrom-StringData @' + CheckingNetAdapterMessage = Checking if network adapter exists or not. + NetAdapterNotFoundMessage = Network adapter not found. + NetAdapterTestingStateMessage = Checking if adapter {0} {1} is in desired state. + NetAdapterApplyingChangesMessage = Network adapter {0} {1} was {2}, should be {3}, applying changes. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/en-US/about_NetAdapterRss.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/en-US/about_NetAdapterRss.help.txt new file mode 100644 index 0000000..90009ca --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterRss/en-US/about_NetAdapterRss.help.txt @@ -0,0 +1,35 @@ +.NAME + NetAdapterRss + +.DESCRIPTION + This resource is used to enable or disable RSS (Receive Side Scaling) on a network adapter. + Not all adapters support RSS so there may be no option for this and it will throw an exception that the network adapter is not found. + + +.PARAMETER Name + Key - String + Specifies the Name of network adapter. + +.PARAMETER Enabled + Required - Boolean + Specifies whether RSS should be enabled or disabled. + +.EXAMPLE 1 + +This configuration disables RSS on the network adapter. + +Configuration NetAdapterRss_EnableRss_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterRss EnableRss + { + Name = 'Ethernet' + Enabled = $True + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/DSC_NetAdapterState.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/DSC_NetAdapterState.psm1 new file mode 100644 index 0000000..1f14ea7 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/DSC_NetAdapterState.psm1 @@ -0,0 +1,195 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Gets the current state of a network adapter. + + .PARAMETER Name + Specifies the name of the network adapter. + + .PARAMETER State + Specifies the desired state for the network adapter. + Not used in Get-TargetResource. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapter -Name $Name -ErrorAction Stop + } + catch + { + Write-Warning -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.NetAdapterNotFoundMessage -f $Name + ) -join '') + } + + if ($netAdapter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $Name) + ) -join '') + + <# + Using NET_IF_ADMIN_STATUS as documented here: + https://docs.microsoft.com/en-us/windows/desktop/api/ifdef/ne-ifdef-net_if_admin_status + #> + + $enabled = [Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetAdapter.NET_IF_ADMIN_STATUS]::Up + $disabled = [Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetAdapter.NET_IF_ADMIN_STATUS]::Down + + $result = @{ + Name = $Name + State = switch ($netAdapter.AdminStatus) + { + $enabled { 'Enabled' } + $disabled { 'Disabled' } + default { 'Unsupported' } + } + } + + return $result + } +} + +<# + .SYNOPSIS + Sets the NetAdapterState resource state. + + .PARAMETER Name + Specifies the name of the network adapter. + + .PARAMETER State + Specifies the desired state for the network adapter. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.CheckingNetAdapterMessage + ) -join '') + + try + { + $netAdapter = Get-NetAdapter -Name $Name -ErrorAction Stop + } + catch + { + Write-Error -Message ( @( + "$($MyInvocation.MyCommand): " + $script:localizedData.NetAdapterNotFoundMessage -f $Name + ) -join '') + } + + if ($netAdapter) + { + try + { + if ($State -eq 'Disabled') + { + Disable-NetAdapter -Name $Name -Confirm:$false -ErrorAction Stop + } + else + { + Enable-NetAdapter -Name $Name -ErrorAction Stop + } + } + catch + { + Write-Error -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterSetFailedMessage -f $Name, $State, $_) + ) -join '') + } + } +} + +<# + .SYNOPSIS + Tests if the NetAdapterState resource state is desired state. + + .PARAMETER Name + Specifies the name of the network adapter. + + .PARAMETER State + Specifies the state of the network adapter. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $State + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterTestingStateMessage -f $Name) + ) -join '') + + $currentState = Get-TargetResource @PSBoundParameters + + if ($currentState) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterStateMessage -f $Name, $currentState.State) + ) -join '') + + return $currentState.State -eq $State + } + + return $false +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/DSC_NetAdapterState.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/DSC_NetAdapterState.schema.mof new file mode 100644 index 0000000..96aec7a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/DSC_NetAdapterState.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0.0"), FriendlyName("NetAdapterState")] +class DSC_NetAdapterState : OMI_BaseResource +{ + [Key, Description("Specifies the name of network adapter.")] String Name; + [Required, Description("Specifies the desired state of the network adapter"), ValueMap{"Enabled","Disabled"}, Values{"Enabled","Disabled"}] String State; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/README.MD new file mode 100644 index 0000000..0c674b9 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to enable or disable a network adapter. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/en-US/DSC_NetAdapterState.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/en-US/DSC_NetAdapterState.strings.psd1 new file mode 100644 index 0000000..7c7533f --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/en-US/DSC_NetAdapterState.strings.psd1 @@ -0,0 +1,9 @@ +# Localized resources for DSC_NetAdapterState + +ConvertFrom-StringData @' + CheckingNetAdapterMessage = Checking if network adapter exists or not. + NetAdapterNotFoundMessage = Network adapter '{0}' not found. + NetAdapterTestingStateMessage = Checking if adapter '{0}' is in desired state. + NetAdapterStateMessage = Network adapter '{0}' returned state '{1}'. + NetAdapterSetFailedMessage = Failed to set network adapter '{0}' to state '{1}'. Error: '{2}'. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/en-US/about_NetAdapterState.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/en-US/about_NetAdapterState.help.txt new file mode 100644 index 0000000..9edd15f --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetAdapterState/en-US/about_NetAdapterState.help.txt @@ -0,0 +1,52 @@ +.NAME + NetAdapterState + +.DESCRIPTION + This resource is used to enable or disable a network adapter. + +.PARAMETER Name + Key - String + Specifies the name of network adapter. + +.PARAMETER State + Required - String + Allowed values: Enabled, Disabled + Specifies the desired state of the network adapter + +.EXAMPLE 1 + +This configuration enables the network adapter named Ethernet. + +Configuration NetAdapterState_Enable_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterState EnableEthernet + { + Name = 'Ethernet' + State = 'Enabled' + } + } +} + +.EXAMPLE 2 + +This configuration disables the network adapter named Ethernet. + +Configuration NetAdapterState_Disable_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetAdapterState EnableEthernet + { + Name = 'Ethernet' + State = 'Disabled' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/DSC_NetBios.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/DSC_NetBios.psm1 new file mode 100644 index 0000000..064580b --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/DSC_NetBios.psm1 @@ -0,0 +1,236 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +#region check NetBiosSetting enum loaded, if not load +try +{ + [void][System.Reflection.Assembly]::GetAssembly([NetBiosSetting]) +} +catch +{ + Add-Type -TypeDefinition @' + public enum NetBiosSetting + { + Default, + Enable, + Disable + } +'@ +} +#endregion + +<# + .SYNOPSIS + Returns the current state of the Net Bios on an interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. Supports the use of '*' and '%'. + + .PARAMETER Setting + Specifies if NetBIOS should be enabled or disabled or obtained from + the DHCP server (Default). If static IP, Enable NetBIOS. + + Parameter value is ignored. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('Default', 'Enable', 'Disable')] + [System.String] + $Setting + ) + + Write-Verbose -Message ($script:localizedData.GettingNetBiosSettingMessage -f $InterfaceAlias) + + $win32NetworkAdapterFilter = Format-Win32NetworkAdapterFilterByNetConnectionId -InterfaceAlias $InterfaceAlias + + $netAdapter = Get-CimInstance ` + -ClassName Win32_NetworkAdapter ` + -Filter $win32NetworkAdapterFilter + + if ($netAdapter) + { + Write-Verbose -Message ($script:localizedData.InterfaceDetectedMessage -f $InterfaceAlias, ($netAdapter.InterfaceIndex -Join ',')) + } + else + { + New-InvalidOperationException ` + -Message ($script:localizedData.InterfaceNotFoundError -f $InterfaceAlias) + } + + <# + If a wildcard was specified for the InterfaceAlias then + more than one adapter may be returned. If more than one + adapter is returned then the NetBiosSetting value should + be returned for the first adapter that does not match + the desired value. This is to ensure that when testing + the resource state it will return a mismatch if any adapters + don't have the correct setting. + #> + foreach ($netAdapterItem in $netAdapter) + { + $netAdapterConfig = $netAdapterItem | Get-CimAssociatedInstance ` + -ResultClassName Win32_NetworkAdapterConfiguration ` + -ErrorAction Stop + + $tcpipNetbiosOptions = $netAdapterConfig.TcpipNetbiosOptions + + if ($tcpipNetbiosOptions) + { + $interfaceSetting = $([NetBiosSetting].GetEnumValues()[$tcpipNetbiosOptions]) + } + else + { + $interfaceSetting = 'Default' + } + + Write-Verbose -Message ($script:localizedData.CurrentNetBiosSettingMessage -f $netAdapterItem.Name, $interfaceSetting) + + if ($interfaceSetting -ne $Setting) + { + $Setting = $interfaceSetting + break + } + } + + return @{ + InterfaceAlias = $InterfaceAlias + Setting = $Setting + } +} + +<# + .SYNOPSIS + Sets the state of the Net Bios on an interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. Supports the use of '*' and '%'. + + .PARAMETER Setting + Specifies if NetBIOS should be enabled or disabled or obtained from + the DHCP server (Default). If static IP, Enable NetBIOS. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('Default', 'Enable', 'Disable')] + [System.String] + $Setting + ) + + Write-Verbose -Message ($script:localizedData.SettingNetBiosSettingMessage -f $InterfaceAlias) + + $win32NetworkAdapterFilter = Format-Win32NetworkAdapterFilterByNetConnectionId -InterfaceAlias $InterfaceAlias + + $netAdapter = Get-CimInstance ` + -ClassName Win32_NetworkAdapter ` + -Filter $win32NetworkAdapterFilter + + if ($netAdapter) + { + Write-Verbose -Message ($script:localizedData.InterfaceDetectedMessage -f $InterfaceAlias, ($netAdapter.InterfaceIndex -Join ',')) + } + else + { + New-InvalidOperationException ` + -Message ($script:localizedData.InterfaceNotFoundError -f $InterfaceAlias) + } + + foreach ($netAdapterItem in $netAdapter) + { + $netAdapterConfig = $netAdapterItem | Get-CimAssociatedInstance ` + -ResultClassName Win32_NetworkAdapterConfiguration ` + -ErrorAction Stop + + if ($Setting -eq [NetBiosSetting]::Default) + { + Write-Verbose -Message ($script:localizedData.ResetToDefaultMessage -f $netAdapterItem.Name) + + # If DHCP is not enabled, SetTcpipNetbios CIM Method won't take 0 so overwrite registry entry instead. + $setItemPropertyParameters = @{ + Path = "HKLM:\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_$($NetAdapterConfig.SettingID)" + Name = 'NetbiosOptions' + Value = 0 + } + $null = Set-ItemProperty @setItemPropertyParameters + } + else + { + Write-Verbose -Message ($script:localizedData.SetNetBiosMessage -f $netAdapterItem.Name, $Setting) + + $result = $netAdapterConfig | + Invoke-CimMethod ` + -MethodName SetTcpipNetbios ` + -ErrorAction Stop ` + -Arguments @{ + TcpipNetbiosOptions = [uint32][NetBiosSetting]::$Setting.value__ + } + + if ($result.ReturnValue -ne 0) + { + New-InvalidOperationException ` + -Message ($script:localizedData.FailedUpdatingNetBiosError -f $netAdapterItem.Name, $result.ReturnValue, $Setting) + } + } + } +} + +<# + .SYNOPSIS + Tests the current state the Net Bios on an interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. Supports the use of '*' and '%'. + + .PARAMETER Setting + Specifies if NetBIOS should be enabled or disabled or obtained from + the DHCP server (Default). If static IP, Enable NetBIOS. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('Default', 'Enable', 'Disable')] + [System.String] + $Setting + ) + + Write-Verbose -Message ($script:localizedData.TestingNetBiosSettingMessage -f $InterfaceAlias) + + $currentState = Get-TargetResource @PSBoundParameters + + return Test-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/DSC_NetBios.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/DSC_NetBios.schema.mof new file mode 100644 index 0000000..c456006 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/DSC_NetBios.schema.mof @@ -0,0 +1,7 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("NetBios")] +class DSC_NetBios : OMI_BaseResource +{ + [Key, Description("Specifies the alias of a network interface. Supports the use of '*' and '%'")] String InterfaceAlias; + [Required, Description("Specifies if NetBIOS should be enabled or disabled or obtained from the DHCP server (Default). If static IP, Enable NetBIOS."), ValueMap{"Default","Enable","Disable"}, Values{"Default","Enable","Disable"}] String Setting; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/README.MD new file mode 100644 index 0000000..6dc0164 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to enable or disable the NetBios on a network interface. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/en-US/DSC_NetBios.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/en-US/DSC_NetBios.strings.psd1 new file mode 100644 index 0000000..cb43c73 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/en-US/DSC_NetBios.strings.psd1 @@ -0,0 +1,13 @@ +# Localized resources for DSC_NetBIOS + +ConvertFrom-StringData @' + GettingNetBiosSettingMessage = Getting NetBIOS configuration for Interface '{0}'. + InterfaceDetectedMessage = Interface '{0}' detected with Index number {1}. + SettingNetBiosSettingMessage = Setting NetBIOS configuration for Interface '{0}'. + ResetToDefaultMessage = NetBIOS configuration for Interface '{0}' will be reset to default. + SetNetBiosMessage = NetBIOS configuration for Interface '{0}' will be set to '{1}'. + TestingNetBiosSettingMessage = Testing NetBIOS configuration for Interface '{0}'. + CurrentNetBiosSettingMessage = Current NetBIOS configuration for Interface '{0}' is '{1}'. + InterfaceNotFoundError = Interface '{0}' was not found. + FailedUpdatingNetBiosError = An error result of '{1}' was returned when attemting to set NetBIOS for Interface '{0}' configuration to '{2}'. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/en-US/about_NetBios.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/en-US/about_NetBios.help.txt new file mode 100644 index 0000000..9519a09 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetBios/en-US/about_NetBios.help.txt @@ -0,0 +1,52 @@ +.NAME + NetBios + +.DESCRIPTION + This resource is used to enable or disable the NetBios on a network interface. + +.PARAMETER InterfaceAlias + Key - String + Specifies the alias of a network interface. Supports the use of '*' and '%' + +.PARAMETER Setting + Required - String + Allowed values: Default, Enable, Disable + Specifies if NetBIOS should be enabled or disabled or obtained from the DHCP server (Default). If static IP, Enable NetBIOS. + +.EXAMPLE 1 + +Disable NetBios on Adapter. + +Configuration NetBios_DisableNetBios_Config +{ + Import-DscResource -ModuleName NetworkingDsc + + Node localhost + { + NetBios DisableNetBios + { + InterfaceAlias = 'Ethernet' + Setting = 'Disable' + } + } +} + +.EXAMPLE 2 + +Disable NetBios on all adapters. + +Configuration NetBios_DisableNetBios_Config_Wildcard +{ + Import-DscResource -ModuleName NetworkingDsc + + Node localhost + { + NetBios DisableNetBios + { + InterfaceAlias = '*' + Setting = 'Disable' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/DSC_NetConnectionProfile.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/DSC_NetConnectionProfile.psm1 new file mode 100644 index 0000000..9f9144a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/DSC_NetConnectionProfile.psm1 @@ -0,0 +1,230 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current Networking Connection Profile for the specified interface. + + .PARAMETER InterfaceAlias + Specifies the alias for the Interface that is being changed. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Position = 0, Mandatory = $true)] + [System.String] + $InterfaceAlias + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingNetConnectionProfile) -f $InterfaceAlias + ) -join '') + + $result = Get-NetConnectionProfile -InterfaceAlias $InterfaceAlias + + return @{ + InterfaceAlias = $result.InterfaceAlias + NetworkCategory = $result.NetworkCategory + IPv4Connectivity = $result.IPv4Connectivity + IPv6Connectivity = $result.IPv6Connectivity + } +} + +<# + .SYNOPSIS + Sets the Network Connection Profile for a specified interface. + + .PARAMETER InterfaceAlias + Specifies the alias for the Interface that is being changed. + + .PARAMETER IPv4Connectivity + Specifies the IPv4 Connection Value. + + .PARAMETER IPv6Connectivity + Specifies the IPv6 Connection Value. + + .PARAMETER NetworkCategory + Sets the Network Category for the interface +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('Disconnected', 'NoTraffic', 'Subnet', 'LocalNetwork', 'Internet')] + [System.String] + $IPv4Connectivity, + + [Parameter()] + [ValidateSet('Disconnected', 'NoTraffic', 'Subnet', 'LocalNetwork', 'Internet')] + [System.String] + $IPv6Connectivity, + + [Parameter()] + [ValidateSet('Public', 'Private')] + [System.String] + $NetworkCategory + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.SetNetConnectionProfile) -f $InterfaceAlias + ) -join '') + + Assert-ResourceProperty @PSBoundParameters + + Set-NetConnectionProfile @PSBoundParameters +} + +<# + .SYNOPSIS + Tests is the Network Connection Profile for the specified interface is in the correct state. + + .PARAMETER InterfaceAlias + Specifies the alias for the Interface that is being changed. + + .PARAMETER IPv4Connectivity + Specifies the IPv4 Connection Value. + + .PARAMETER IPv6Connectivity + Specifies the IPv6 Connection Value. + + .PARAMETER NetworkCategory + Sets the NetworkCategory for the interface +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('Disconnected', 'NoTraffic', 'Subnet', 'LocalNetwork', 'Internet')] + [System.String] + $IPv4Connectivity, + + [Parameter()] + [ValidateSet('Disconnected', 'NoTraffic', 'Subnet', 'LocalNetwork', 'Internet')] + [System.String] + $IPv6Connectivity, + + [Parameter()] + [ValidateSet('Public', 'Private')] + [System.String] + $NetworkCategory + ) + + Assert-ResourceProperty @PSBoundParameters + + $current = Get-TargetResource -InterfaceAlias $InterfaceAlias + + if (-not [System.String]::IsNullOrEmpty($IPv4Connectivity) -and ` + ($IPv4Connectivity -ne $current.IPv4Connectivity)) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.TestIPv4Connectivity) -f $IPv4Connectivity, $current.IPv4Connectivity + ) -join '') + + return $false + } + + if (-not [System.String]::IsNullOrEmpty($IPv6Connectivity) -and ` + ($IPv6Connectivity -ne $current.IPv6Connectivity)) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.TestIPv6Connectivity) -f $IPv6Connectivity, $current.IPv6Connectivity + ) -join '') + + return $false + } + + if (-not [System.String]::IsNullOrEmpty($NetworkCategory) -and ` + ($NetworkCategory -ne $current.NetworkCategory)) + { + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.TestNetworkCategory) -f $NetworkCategory, $current.NetworkCategory + ) -join '') + + return $false + } + + return $true +} + +<# + .SYNOPSIS + Check the parameter combination that was passed was valid. + Ensures interface exists. If any problems are detected an + exception will be thrown. + + .PARAMETER InterfaceAlias + Specifies the alias for the Interface that is being changed. + + .PARAMETER IPv4Connectivity + Specifies the IPv4 Connection Value. + + .PARAMETER IPv6Connectivity + Specifies the IPv6 Connection Value. + + .PARAMETER NetworkCategory + Sets the NetworkCategory for the interface +#> +function Assert-ResourceProperty +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $InterfaceAlias, + + [Parameter()] + [ValidateSet('Disconnected', 'NoTraffic', 'Subnet', 'LocalNetwork', 'Internet')] + [System.String] + $IPv4Connectivity, + + [Parameter()] + [ValidateSet('Disconnected', 'NoTraffic', 'Subnet', 'LocalNetwork', 'Internet')] + [System.String] + $IPv6Connectivity, + + [Parameter()] + [ValidateSet('Public', 'Private')] + [System.String] + $NetworkCategory + ) + + if (-not (Get-NetAdapter | Where-Object -Property Name -EQ $InterfaceAlias )) + { + New-InvalidOperationException ` + -Message ($script:localizedData.InterfaceNotAvailableError -f $InterfaceAlias) + } + + if ([System.String]::IsNullOrEmpty($IPv4Connectivity) -and ` + [System.String]::IsNullOrEmpty($IPv6Connectivity) -and ` + [System.String]::IsNullOrEmpty($NetworkCategory)) + { + New-InvalidOperationException ` + -Message ($script:localizedData.ParameterCombinationError) + } +} # Assert-ResourceProperty diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/DSC_NetConnectionProfile.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/DSC_NetConnectionProfile.schema.mof new file mode 100644 index 0000000..a84a438 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/DSC_NetConnectionProfile.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0"), FriendlyName("NetConnectionProfile")] +class DSC_NetConnectionProfile : OMI_BaseResource +{ + [Key, Description("Specifies the alias for the Interface that is being changed.")] string InterfaceAlias; + [Write, Description("Sets the Network Category for the interface."), ValueMap{"Disconnected", "NoTraffic", "Subnet", "LocalNetwork", "Internet"}, Values{"Disconnected", "NoTraffic", "Subnet", "LocalNetwork", "Internet"}] string IPv4Connectivity; + [Write, Description("Specifies the IPv4 Connection Value."), ValueMap{"Disconnected", "NoTraffic", "Subnet", "LocalNetwork", "Internet"}, Values{"Disconnected", "NoTraffic", "Subnet", "LocalNetwork", "Internet"}] string IPv6Connectivity; + [Write, Description("Specifies the IPv6 Connection Value."), ValueMap{"Public", "Private"}, Values{"Public", "Private"}] string NetworkCategory; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/README.MD new file mode 100644 index 0000000..ffa5f5a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to set a node's connection profile. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/en-US/DSC_NetConnectionProfile.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/en-US/DSC_NetConnectionProfile.strings.psd1 new file mode 100644 index 0000000..e3fe160 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/en-US/DSC_NetConnectionProfile.strings.psd1 @@ -0,0 +1,11 @@ +# Localized resources for DSC_NetConnectionProfile + +ConvertFrom-StringData @' + GettingNetConnectionProfile = Getting NetConnectionProfile from interface '{0}'. + TestIPv4Connectivity = IPv4Connectivity '{0}' does not match set IPv4Connectivity '{1}' + TestIPv6Connectivity = IPv6Connectivity '{0}' does not match set IPv6Connectivity '{1}' + TestNetworkCategory = NetworkCategory '{0}' does not match set NetworkCategory '{1}' + SetNetConnectionProfile = Setting NetConnectionProfile on interface '{0}' + InterfaceNotAvailableError = Interface "{0}" is not available. Please select a valid interface and try again. + ParameterCombinationError = At least one of the parameters IPv4Connectivity, IPv6Connectivity or NetworkCategory must be set. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/en-US/about_NetConnectionProfile.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/en-US/about_NetConnectionProfile.help.txt new file mode 100644 index 0000000..050d68b --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetConnectionProfile/en-US/about_NetConnectionProfile.help.txt @@ -0,0 +1,65 @@ +.NAME + NetConnectionProfile + +.DESCRIPTION + This resource is used to set a node's connection profile. + +.PARAMETER InterfaceAlias + Key - String + Specifies the alias for the Interface that is being changed. + +.PARAMETER IPv4Connectivity + Write - String + Allowed values: Disconnected, NoTraffic, Subnet, LocalNetwork, Internet + Sets the Network Category for the interface. + +.PARAMETER IPv6Connectivity + Write - String + Allowed values: Disconnected, NoTraffic, Subnet, LocalNetwork, Internet + Specifies the IPv4 Connection Value. + +.PARAMETER NetworkCategory + Write - String + Allowed values: Public, Private + Specifies the IPv6 Connection Value. + +.EXAMPLE 1 + +Sets the Ethernet adapter to Public and IPv4/6 to Internet Connectivity. + +Configuration NetConnectionProfile_SetPublicEnableInternet_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetConnectionProfile SetPublicEnableInternet + { + InterfaceAlias = 'Ethernet' + NetworkCategory = 'Public' + IPv4Connectivity = 'Internet' + IPv6Connectivity = 'Internet' + } + } +} + +.EXAMPLE 2 + +Sets the Ethernet adapter to Private but does not change +IPv4 or IPv6 connectivity. + +Configuration NetConnectionProfile_SetPrivate_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetConnectionProfile SetPrivate + { + InterfaceAlias = 'Ethernet' + NetworkCategory = 'Private' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.data.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.data.psd1 new file mode 100644 index 0000000..b533a0d --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.data.psd1 @@ -0,0 +1,72 @@ +@{ + ParameterList = @( + @{ + ParameterName = 'AdvertiseDefaultRoute' + PropertyName = 'AdvertiseDefaultRoute' + }, + @{ + ParameterName = 'Advertising' + PropertyName = 'Advertising' + }, + @{ + ParameterName = 'AutomaticMetric' + PropertyName = 'AutomaticMetric' + }, + @{ + ParameterName = 'DirectedMacWolPattern' + PropertyName = 'DirectedMacWolPattern' + }, + @{ + ParameterName = 'Dhcp' + PropertyName = 'Dhcp' + }, + @{ + ParameterName = 'EcnMarking' + PropertyName = 'EcnMarking' + }, + @{ + ParameterName = 'ForceArpNdWolPattern' + PropertyName = 'ForceArpNdWolPattern' + }, + @{ + ParameterName = 'Forwarding' + PropertyName = 'Forwarding' + }, + @{ + ParameterName = 'IgnoreDefaultRoutes' + PropertyName = 'IgnoreDefaultRoutes' + }, + @{ + ParameterName = 'ManagedAddressConfiguration' + PropertyName = 'ManagedAddressConfiguration' + }, + @{ + ParameterName = 'NeighborUnreachabilityDetection' + PropertyName = 'NeighborUnreachabilityDetection' + }, + @{ + ParameterName = 'OtherStatefulConfiguration' + PropertyName = 'OtherStatefulConfiguration' + }, + @{ + ParameterName = 'RouterDiscovery' + PropertyName = 'RouterDiscovery' + }, + @{ + ParameterName = 'WeakHostReceive' + PropertyName = 'WeakHostReceive' + }, + @{ + ParameterName = 'WeakHostSend' + PropertyName = 'WeakHostSend' + }, + @{ + ParameterName = 'NlMtuBytes' + PropertyName = 'NlMtu' + }, + @{ + ParameterName = 'InterfaceMetric' + PropertyName = 'InterfaceMetric' + } + ) +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.psm1 new file mode 100644 index 0000000..5cb3caa --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.psm1 @@ -0,0 +1,519 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + This is an array of all the parameters used by this resource. + The PropertyName is the name of the property that is returned when + getting the object. The ParameterName is the parameter name when + setting the value. These are usually the same, but do differ in + some cases. +#> +$script:resourceData = Import-LocalizedData ` + -BaseDirectory $PSScriptRoot ` + -FileName 'DSC_NetIPInterface.data.psd1' +$script:parameterList = $script:resourceData.ParameterList + +<# + .SYNOPSIS + Returns the current state of the Network Interface. + + .PARAMETER InterfaceAlias + Alias of the network interface to configure. + + .PARAMETER AddressFamily + IP address family on the interface to configure. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingNetIPInterfaceMessage) -f $InterfaceAlias, $AddressFamily + ) -join '') + + $getNetworkIPInterfaceParameters = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + } + + return Get-NetworkIPInterface @getNetworkIPInterfaceParameters +} + +<# + .SYNOPSIS + Sets the current state of the Network Interface. + + .PARAMETER InterfaceAlias + Alias of the network interface to configure. + + .PARAMETER AddressFamily + IP address family on the interface to configure. + + .PARAMETER AdvertiseDefaultRoute + Specifies the default router advertisement for an interface. + + .PARAMETER Advertising + Specifies the router advertisement value for the IP interface. + + .PARAMETER AutomaticMetric + Specifies the value for automatic metric calculation. + + .PARAMETER Dhcp + Specifies the Dynamic Host Configuration Protocol (DHCP) value for an IP interface. + + .PARAMETER DirectedMacWolPattern + Specifies the wake-up packet value for an IP interface. + + .PARAMETER EcnMarking + Specifies the value for Explicit Congestion Notification (ECN) marking. + + .PARAMETER ForceArpNdWolPattern + Specifies the Wake On LAN (WOL) value for the IP interface. + + .PARAMETER Forwarding + Specifies the packet forwarding value for the IP interface. + + .PARAMETER IgnoreDefaultRoutes + Specifies a value for Default Route advertisements. + + .PARAMETER ManagedAddressConfiguration + Specifies the value for managed address configuration. + + .PARAMETER NeighborUnreachabilityDetection + Specifies the value for Neighbor Unreachability Detection (NUD). + + .PARAMETER OtherStatefulConfiguration + Specifies the value for configuration other than addresses. + + .PARAMETER RouterDiscovery + Specifies the value for router discovery for an IP interface. + + .PARAMETER WeakHostReceive + Specifies the receive value for a weak host model. + + .PARAMETER WeakHostSend + Specifies the send value for a weak host model. + + .PARAMETER NlMtu + Specifies the network layer Maximum Transmission Unit (MTU) value, in bytes, for an IP interface. + + .PARAMETER InterfaceMetric + Specifies the metric for an IP interface. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $AdvertiseDefaultRoute, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $Advertising, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $AutomaticMetric, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $Dhcp, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $DirectedMacWolPattern, + + [Parameter()] + [ValidateSet('Disabled', 'UseEct1', 'UseEct0', 'AppDecide')] + [System.String] + $EcnMarking, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $ForceArpNdWolPattern, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $Forwarding, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $IgnoreDefaultRoutes, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $ManagedAddressConfiguration, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $NeighborUnreachabilityDetection, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $OtherStatefulConfiguration, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled', 'ControlledByDHCP')] + [System.String] + $RouterDiscovery, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $WeakHostReceive, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $WeakHostSend, + + [Parameter()] + [System.UInt32] + $NlMtu, + + [Parameter()] + [System.UInt32] + $InterfaceMetric + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingNetIPInterfaceMessage) ` + -f $InterfaceAlias, $AddressFamily + ) -join '') + + $getTargetResourceParameters = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + } + + $currentState = Get-TargetResource @getTargetResourceParameters + + <# + Loop through each possible property and if it is passed to the resource + and the current value of the property is different then add it to the + netIPInterfaceParameters array that will be used to update the + net IP interface settings. + #> + $parameterUpdated = $false + $setNetIPInterfaceParameters = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + } + + foreach ($parameter in $script:parameterList) + { + if ($PSBoundParameters.ContainsKey($parameter.PropertyName)) + { + $currentPropertyValue = $currentState.$($parameter.PropertyName) + $newParameterValue = (Get-Variable -Name ($parameter.PropertyName)).Value + + if ($newParameterValue -and ($currentPropertyValue -ne $newParameterValue)) + { + $null = $setNetIPInterfaceParameters.Add($parameter.ParameterName, $newParameterValue) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingNetIPInterfaceParameterValueMessage) ` + -f $InterfaceAlias, $AddressFamily, $parameter.ParameterName, $newParameterValue + ) -join '') + + $parameterUpdated = $true + } + } + } + + if ($parameterUpdated) + { + $null = Set-NetIPInterface @setNetIPInterfaceParameters + } +} + +<# + .SYNOPSIS + Sets the current state of the Network Interface. + + .PARAMETER InterfaceAlias + Alias of the network interface to configure. + + .PARAMETER AddressFamily + IP address family on the interface to configure. + + .PARAMETER AdvertiseDefaultRoute + Specifies the default router advertisement for an interface. + + .PARAMETER Advertising + Specifies the router advertisement value for the IP interface. + + .PARAMETER AutomaticMetric + Specifies the value for automatic metric calculation. + + .PARAMETER Dhcp + Specifies the Dynamic Host Configuration Protocol (DHCP) value for an IP interface. + + .PARAMETER DirectedMacWolPattern + Specifies the wake-up packet value for an IP interface. + + .PARAMETER EcnMarking + Specifies the value for Explicit Congestion Notification (ECN) marking. + + .PARAMETER ForceArpNdWolPattern + Specifies the Wake On LAN (WOL) value for the IP interface. + + .PARAMETER Forwarding + Specifies the packet forwarding value for the IP interface. + + .PARAMETER IgnoreDefaultRoutes + Specifies a value for Default Route advertisements. + + .PARAMETER ManagedAddressConfiguration + Specifies the value for managed address configuration. + + .PARAMETER NeighborUnreachabilityDetection + Specifies the value for Neighbor Unreachability Detection (NUD). + + .PARAMETER OtherStatefulConfiguration + Specifies the value for configuration other than addresses. + + .PARAMETER RouterDiscovery + Specifies the value for router discovery for an IP interface. + + .PARAMETER WeakHostReceive + Specifies the receive value for a weak host model. + + .PARAMETER WeakHostSend + Specifies the send value for a weak host model. + + .PARAMETER NlMtu + Specifies the network layer Maximum Transmission Unit (MTU) value, in bytes, for an IP interface. + + .PARAMETER InterfaceMetric + Specifies the metric for an IP interface. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $AdvertiseDefaultRoute, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $Advertising, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $AutomaticMetric, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $Dhcp, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $DirectedMacWolPattern, + + [Parameter()] + [ValidateSet('Disabled', 'UseEct1', 'UseEct0', 'AppDecide')] + [System.String] + $EcnMarking, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $ForceArpNdWolPattern, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $Forwarding, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $IgnoreDefaultRoutes, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $ManagedAddressConfiguration, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $NeighborUnreachabilityDetection, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $OtherStatefulConfiguration, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled', 'ControlledByDHCP')] + [System.String] + $RouterDiscovery, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $WeakHostReceive, + + [Parameter()] + [ValidateSet('Enabled', 'Disabled')] + [System.String] + $WeakHostSend, + + [Parameter()] + [System.UInt32] + $NlMtu, + + [Parameter()] + [System.UInt32] + $InterfaceMetric + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingNetIPInterfaceMessage) -f $InterfaceAlias, $AddressFamily + ) -join '') + + $getTargetResourceParameters = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + } + + $currentState = Get-TargetResource @getTargetResourceParameters + + return Test-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters -TurnOffTypeChecking +} + +<# + .SYNOPSIS + Get the network IP interface for the address family. + If the network interface is not found or the address family + is not bound to the inerface then an exception will be thrown. + + It will return an hash table with only the parameters in found + in the $script:parameterList array and the InterfaceAlias and + AddressFamily parameters. + + .PARAMETER InterfaceAlias + Alias of the network interface to configure. + + .PARAMETER AddressFamily + IP address family on the interface to configure. +#> +function Get-NetworkIPInterface +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily + ) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingNetIPInterfaceMessage) -f $InterfaceAlias, $AddressFamily + ) -join '') + + $netIPInterface = Get-NetIPInterface @PSBoundParameters -ErrorAction SilentlyContinue + + if (-not $netIPInterface) + { + # The Net IP Interface does not exist or address family is not bound + New-InvalidOperationException ` + -Message ($script:localizedData.NetworkIPInterfaceDoesNotExistMessage -f $InterfaceAlias, $AddressFamily) + } + + <# + Populate the properties for get target resource by looping through + the parameter array list and adding the values to the result array + #> + $networkIPInterface = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + } + + foreach ($parameter in $script:parameterList) + { + $propertyValue = $netIPInterface.$($parameter.PropertyName) + $null = $networkIPInterface.Add($parameter.PropertyName, $propertyValue) + + Write-Verbose -Message ( @( "$($MyInvocation.MyCommand): " + $($script:localizedData.NetworkIPInterfaceParameterValueMessage) -f ` + $InterfaceAlias, $AddressFamily, $parameter.PropertyName, $propertyValue + ) -join '') + } + + return $networkIPInterface +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.schema.mof new file mode 100644 index 0000000..35dd679 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/DSC_NetIPInterface.schema.mof @@ -0,0 +1,23 @@ +[ClassVersion("1.0.0"), FriendlyName("NetIPInterface")] +class DSC_NetIPInterface : OMI_BaseResource +{ + [Key, Description("Alias of the network interface to configure.")] String InterfaceAlias; + [Key, Description("IP address family on the interface to configure."), ValueMap{"IPv4", "IPv6"}, Values{"IPv4", "IPv6"}] String AddressFamily; + [Write, Description("Specifies the default router advertisement for an interface."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String AdvertiseDefaultRoute; + [Write, Description("Specifies the router advertisement value for the IP interface."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String Advertising; + [Write, Description("Specifies the value for automatic metric calculation."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String AutomaticMetric; + [Write, Description("Specifies the Dynamic Host Configuration Protocol (DHCP) value for an IP interface."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String Dhcp; + [Write, Description("Specifies the wake-up packet value for an IP interface."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String DirectedMacWolPattern; + [Write, Description("Specifies the value for Explicit Congestion Notification (ECN) marking."), ValueMap{"Disabled", "UseEct1", "UseEct0", "AppDecide"},Values{"Disabled", "UseEct1", "UseEct0", "AppDecide"}] String EcnMarking; + [Write, Description("Specifies the Wake On LAN (WOL) value for the IP interface."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String ForceArpNdWolPattern; + [Write, Description("Specifies the packet forwarding value for the IP interface."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String Forwarding; + [Write, Description("Specifies a value for Default Route advertisements."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String IgnoreDefaultRoutes; + [Write, Description("Specifies the value for managed address configuration."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String ManagedAddressConfiguration; + [Write, Description("Specifies the value for Neighbor Unreachability Detection (NUD)."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String NeighborUnreachabilityDetection; + [Write, Description("Specifies the value for configuration other than addresses."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String OtherStatefulConfiguration; + [Write, Description("Specifies the value for router discovery for an IP interface."), ValueMap{"Enabled", "Disabled", "ControlledByDHCP"},Values{"Enabled", "Disabled", "ControlledByDHCP"}] String RouterDiscovery; + [Write, Description("Specifies the receive value for a weak host model."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String WeakHostReceive; + [Write, Description("Specifies the send value for a weak host model."), ValueMap{"Enabled", "Disabled"},Values{"Enabled", "Disabled"}] String WeakHostSend; + [Write, Description("Specifies the network layer Maximum Transmission Unit (MTU) value, in bytes, for an IP interface.")] UInt32 NlMtu; + [Write, Description("Specifies the metric for an IP interface.")] UInt32 InterfaceMetric; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/README.MD new file mode 100644 index 0000000..5d936d1 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/README.MD @@ -0,0 +1,9 @@ +# Description + +This resource is used to configure the IP interface settings for a network interface. + +## Known Issues + +- If you define a value for `InterfaceMetric`, the `AutomaticMetric` +setting is ignored. PowerShell ignores `AutomaticMetric` when you +use both arguments with the `Set-NetIPInterface` cmdlet. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/en-US/DSC_NetIPInterface.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/en-US/DSC_NetIPInterface.strings.psd1 new file mode 100644 index 0000000..6cd55b8 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/en-US/DSC_NetIPInterface.strings.psd1 @@ -0,0 +1,10 @@ +# Localized resources for DSC_NetIPInterface + +ConvertFrom-StringData @' + GettingNetIPInterfaceMessage = Getting settings for net IP interface for alias '{0}' and address family '{1}'. + NetworkIPInterfaceDoesNotExistMessage = Net IP interface for alias '{0}' and address family '{1}' does not exist. + NetworkIPInterfaceParameterValueMessage = Net IP interface for alias '{0}' and address family '{1}' parameter '{2}' is '{3}'. + ApplyingNetIPInterfaceMessage = Applying settings to net IP interface for alias '{0}' and address family '{1}'. + SettingNetIPInterfaceParameterValueMessage = Setting Net IP interface for alias '{0}' and address family '{1}' parameter '{2}' to '{3}'. + CheckingNetIPInterfaceMessage = Checking settings on net IP interface for alias '{0}' and address family '{1}'. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/en-US/about_NetIPInterface.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/en-US/about_NetIPInterface.help.txt new file mode 100644 index 0000000..3233dc8 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetIPInterface/en-US/about_NetIPInterface.help.txt @@ -0,0 +1,241 @@ +.NAME + NetIPInterface + +.DESCRIPTION + This resource is used to configure the IP interface settings for a network interface. + + ## Known Issues + + - If you define a value for `InterfaceMetric`, the `AutomaticMetric` + setting is ignored. PowerShell ignores `AutomaticMetric` when you + use both arguments with the `Set-NetIPInterface` cmdlet. + +.PARAMETER InterfaceAlias + Key - String + Alias of the network interface to configure. + +.PARAMETER AddressFamily + Key - String + Allowed values: IPv4, IPv6 + IP address family on the interface to configure. + +.PARAMETER AdvertiseDefaultRoute + Write - String + Allowed values: Enabled, Disabled + Specifies the default router advertisement for an interface. + +.PARAMETER Advertising + Write - String + Allowed values: Enabled, Disabled + Specifies the router advertisement value for the IP interface. + +.PARAMETER AutomaticMetric + Write - String + Allowed values: Enabled, Disabled + Specifies the value for automatic metric calculation. + +.PARAMETER Dhcp + Write - String + Allowed values: Enabled, Disabled + Specifies the Dynamic Host Configuration Protocol (DHCP) value for an IP interface. + +.PARAMETER DirectedMacWolPattern + Write - String + Allowed values: Enabled, Disabled + Specifies the wake-up packet value for an IP interface. + +.PARAMETER EcnMarking + Write - String + Allowed values: Disabled, UseEct1, UseEct0, AppDecide + Specifies the value for Explicit Congestion Notification (ECN) marking. + +.PARAMETER ForceArpNdWolPattern + Write - String + Allowed values: Enabled, Disabled + Specifies the Wake On LAN (WOL) value for the IP interface. + +.PARAMETER Forwarding + Write - String + Allowed values: Enabled, Disabled + Specifies the packet forwarding value for the IP interface. + +.PARAMETER IgnoreDefaultRoutes + Write - String + Allowed values: Enabled, Disabled + Specifies a value for Default Route advertisements. + +.PARAMETER ManagedAddressConfiguration + Write - String + Allowed values: Enabled, Disabled + Specifies the value for managed address configuration. + +.PARAMETER NeighborUnreachabilityDetection + Write - String + Allowed values: Enabled, Disabled + Specifies the value for Neighbor Unreachability Detection (NUD). + +.PARAMETER OtherStatefulConfiguration + Write - String + Allowed values: Enabled, Disabled + Specifies the value for configuration other than addresses. + +.PARAMETER RouterDiscovery + Write - String + Allowed values: Enabled, Disabled, ControlledByDHCP + Specifies the value for router discovery for an IP interface. + +.PARAMETER WeakHostReceive + Write - String + Allowed values: Enabled, Disabled + Specifies the receive value for a weak host model. + +.PARAMETER WeakHostSend + Write - String + Allowed values: Enabled, Disabled + Specifies the send value for a weak host model. + +.PARAMETER NlMtu + Write - UInt32 + Specifies the network layer Maximum Transmission Unit (MTU) value, in bytes, for an IP interface. + +.PARAMETER InterfaceMetric + Write - UInt32 + Specifies the metric for an IP interface. + +.EXAMPLE 1 + +This example enables the following settings on the IPv4 network interface with alias +'Ethernet': +- AdvertiseDefaultRoute +- Avertising +- AutomaticMetric +- DirectedMacWolPattern +- ForceArpNdWolPattern +- Forwarding +- IgnoreDefaultRoute +- ManagedAddressConfiguration +- NeighborUnreachabilityDetection +- OtherStatefulConfiguration +- RouterDiscovery +- NlMtu +The EcnMarking parameter will be set to AppDecide. + +Configuration NetIPInterface_MultipleSettings_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface MultipleSettings + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + AdvertiseDefaultRoute = 'Enabled' + Advertising = 'Enabled' + AutomaticMetric = 'Enabled' + DirectedMacWolPattern = 'Enabled' + EcnMarking = 'AppDecide' + ForceArpNdWolPattern = 'Enabled' + Forwarding = 'Enabled' + IgnoreDefaultRoutes = 'Enabled' + ManagedAddressConfiguration = 'Enabled' + NeighborUnreachabilityDetection = 'Enabled' + OtherStatefulConfiguration = 'Enabled' + RouterDiscovery = 'Enabled' + NlMtu = 1576 + } + } +} + +.EXAMPLE 2 + +Enabling DHCP for the IPv4 Address and DNS on the adapter with alias 'Ethernet'. + +Configuration NetIPInterface_EnableDHCP_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface EnableDhcp + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + Dhcp = 'Enabled' + } + + DnsServerAddress EnableDhcpDNS + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + } + } +} + +.EXAMPLE 3 + +Disable the weak host receive IPv4 setting for the network adapter with alias 'Ethernet'. + +Configuration NetIPInterface_DisableWeakHostReceive_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface DisableWeakHostReceiving + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + WeakHostReceive = 'Disabled' + } + } +} + +.EXAMPLE 4 + +Disable the weak host send IPv4 setting for the network adapter with alias 'Ethernet'. + +Configuration NetIPInterface_DisableWeakHostSend_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface DisableWeakHostSend + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + WeakHostSend = 'Disabled' + } + } +} + +.EXAMPLE 5 + +Set a specified interface metrics for the network adapters with alias 'Ethernet' and 'Ethernet 2'. + +Configuration NetIPInterface_SetInterfaceMetric +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + NetIPInterface EthernetMetric + { + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + AutomaticMetric = 'Disabled' + InterfaceMetric = 10 + } + + NetIPInterface Ethernet2Metric + { + InterfaceAlias = 'Ethernet 2' + AddressFamily = 'IPv4' + AutomaticMetric = 'Disabled' + InterfaceMetric = 20 + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/DSC_NetworkTeam.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/DSC_NetworkTeam.psm1 new file mode 100644 index 0000000..c533558 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/DSC_NetworkTeam.psm1 @@ -0,0 +1,327 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of a Network Team. + + .PARAMETER Name + Specifies the name of the network team to create. + + .PARAMETER TeamMembers + Specifies the network interfaces that should be a part of the network team. + This is a comma-separated list. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String[]] + $TeamMembers + ) + + $configuration = @{ + Name = $Name + TeamMembers = $TeamMembers + Ensure = 'Absent' + } + + Write-Verbose -Message ($script:localizedData.GetTeamInfo -f $Name) + $networkTeam = Get-NetLBFOTeam -Name $Name -ErrorAction SilentlyContinue + + if ($networkTeam) + { + Write-Verbose -Message ($script:localizedData.FoundTeam -f $Name) + $configuration.Add('LoadBalancingAlgorithm', $networkTeam.LoadBalancingAlgorithm) + $configuration.Add('TeamingMode', $networkTeam.TeamingMode) + $configuration.Ensure = 'Present' + + if ($null -eq (Compare-Object -ReferenceObject $TeamMembers -DifferenceObject $networkTeam.Members)) + { + Write-Verbose -Message ($script:localizedData.TeamMembersMatch -f $Name) + } + else + { + $configuration.TeamMembers = $networkTeam.Members + Write-Verbose -Message ($script:localizedData.TeamMembersNotMatch -f $Name) + } + } + else + { + Write-Verbose -Message ($script:localizedData.TeamNotFound -f $Name) + } + + return $configuration +} + +<# + .SYNOPSIS + Adds, updates or removes a Network Team. + + .PARAMETER Name + Specifies the name of the network team to create. + + .PARAMETER TeamMembers + Specifies the network interfaces that should be a part of the network team. + This is a comma-separated list. + + .PARAMETER TeamingMode + Specifies the teaming mode configuration. + + .PARAMETER LoadBalancingAlgorithm + Specifies the load balancing algorithm for the network team. + + .PARAMETER Ensure + Specifies if the network team should be created or deleted. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String[]] + $TeamMembers, + + [Parameter()] + [ValidateSet('SwitchIndependent', 'LACP', 'Static')] + [System.String] + $TeamingMode = 'SwitchIndependent', + + [Parameter()] + [ValidateSet('Dynamic', 'HyperVPort', 'IPAddresses', 'MacAddresses', 'TransportPorts')] + [System.String] + $LoadBalancingAlgorithm = 'HyperVPort', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ($script:localizedData.GetTeamInfo -f $Name) + + $networkTeam = Get-NetLBFOTeam -Name $Name -ErrorAction SilentlyContinue + + if ($Ensure -eq 'Present') + { + if ($networkTeam) + { + Write-Verbose -Message ($script:localizedData.FoundTeam -f $Name) + + $setArguments = @{ + Name = $Name + } + + if ($networkTeam.loadBalancingAlgorithm -ne $LoadBalancingAlgorithm) + { + Write-Verbose -Message ($script:localizedData.LoadBalancingAlgorithmDifferent -f $LoadBalancingAlgorithm) + + $setArguments.Add('LoadBalancingAlgorithm', $LoadBalancingAlgorithm) + $isNetModifyRequired = $true + } + + if ($networkTeam.TeamingMode -ne $TeamingMode) + { + Write-Verbose -Message ($script:localizedData.TeamingModeDifferent -f $TeamingMode) + + $setArguments.Add('TeamingMode', $TeamingMode) + $isNetModifyRequired = $true + } + + if ($isNetModifyRequired) + { + Write-Verbose -Message ($script:localizedData.ModifyTeam -f $Name) + + Set-NetLbfoTeam @setArguments -ErrorAction Stop -Confirm:$false + } + + $netTeamMembers = Compare-Object ` + -ReferenceObject $TeamMembers ` + -DifferenceObject $networkTeam.Members + + if ($null -ne $netTeamMembers) + { + Write-Verbose -Message ($script:localizedData.MembersDifferent -f $Name) + + $membersToRemove = ($netTeamMembers | Where-Object -FilterScript { + $_.SideIndicator -eq '=>' + }).InputObject + + if ($membersToRemove) + { + Write-Verbose -Message ($script:localizedData.RemovingMembers -f ($membersToRemove -join ',')) + + $null = Remove-NetLbfoTeamMember -Name $membersToRemove ` + -Team $Name ` + -ErrorAction Stop ` + -Confirm:$false + } + + $membersToAdd = ($netTeamMembers | Where-Object -FilterScript { + $_.SideIndicator -eq '<=' + }).InputObject + + if ($membersToAdd) + { + Write-Verbose -Message ($script:localizedData.AddingMembers -f ($membersToAdd -join ',')) + + $null = Add-NetLbfoTeamMember -Name $membersToAdd ` + -Team $Name ` + -ErrorAction Stop ` + -Confirm:$false + } + } + } + else + { + Write-Verbose -Message ($script:localizedData.CreateTeam -f $Name) + + try + { + $null = New-NetLbfoTeam ` + -Name $Name ` + -TeamMembers $teamMembers ` + -TeamingMode $TeamingMode ` + -LoadBalancingAlgorithm $loadBalancingAlgorithm ` + -ErrorAction Stop ` + -Confirm:$false + + Write-Verbose -Message $script:localizedData.CreatedNetTeam + } + + catch + { + New-InvalidOperationException ` + -Message ($script:localizedData.failedToCreateTeam -f $_.Exception.Message) + } + } + } + else + { + Write-Verbose -Message ($script:localizedData.RemoveTeam -f $Name) + + $null = Remove-NetLbfoTeam -Name $name -ErrorAction Stop -Confirm:$false + } +} + +<# + .SYNOPSIS + Tests is a specified Network Team is in the correct state. + + .PARAMETER Name + Specifies the name of the network team to create. + + .PARAMETER TeamMembers + Specifies the network interfaces that should be a part of the network team. + This is a comma-separated list. + + .PARAMETER TeamingMode + Specifies the teaming mode configuration. + + .PARAMETER LoadBalancingAlgorithm + Specifies the load balancing algorithm for the network team. + + .PARAMETER Ensure + Specifies if the network team should be created or deleted. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String[]] + $TeamMembers, + + [Parameter()] + [ValidateSet('SwitchIndependent', 'LACP', 'Static')] + [System.String] + $TeamingMode = 'SwitchIndependent', + + [Parameter()] + [ValidateSet('Dynamic', 'HyperVPort', 'IPAddresses', 'MacAddresses', 'TransportPorts')] + [System.String] + $LoadBalancingAlgorithm = 'HyperVPort', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ($script:localizedData.GetTeamInfo -f $Name) + + $networkTeam = Get-NetLbfoTeam -Name $Name -ErrorAction SilentlyContinue + + if ($ensure -eq 'Present') + { + if ($networkTeam) + { + Write-Verbose -Message ($script:localizedData.FoundTeam -f $Name) + + if ( + ($networkTeam.LoadBalancingAlgorithm -eq $LoadBalancingAlgorithm) -and + ($networkTeam.teamingMode -eq $TeamingMode) -and + ($null -eq (Compare-Object -ReferenceObject $TeamMembers -DifferenceObject $networkTeam.Members)) + ) + { + Write-Verbose -Message ($script:localizedData.TeamExistsNoAction -f $Name) + + return $true + } + else + { + Write-Verbose -Message ($script:localizedData.TeamExistsWithDifferentConfig -f $Name) + + return $false + } + } + else + { + Write-Verbose -Message ($script:localizedData.TeamDoesNotExistShouldCreate -f $Name) + + return $false + } + } + else + { + if ($networkTeam) + { + Write-Verbose -Message ($script:localizedData.TeamExistsShouldRemove -f $Name) + + return $false + } + else + { + Write-Verbose -Message ($script:localizedData.TeamDoesNotExistNoAction -f $Name) + + return $true + } + } +} diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/DSC_NetworkTeam.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/DSC_NetworkTeam.schema.mof new file mode 100644 index 0000000..d28cfa7 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/DSC_NetworkTeam.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.1"), FriendlyName("NetworkTeam")] +class DSC_NetworkTeam : OMI_BaseResource +{ + [Key, Description("Specifies the name of the network team to create.")] String Name; + [Required, Description("Specifies the network interfaces that should be a part of the network team. This is a comma-separated list.")] String TeamMembers[]; + [Write, Description("Specifies the teaming mode configuration."), ValueMap{"SwitchIndependent","LACP","Static"}, Values{"SwitchIndependent","LACP","Static"}] String TeamingMode; + [Write, Description("Specifies the load balancing algorithm for the network team."), ValueMap{"Dynamic","HyperVPort","IPAddresses","MacAddresses","TransportPorts"}, Values{"Dynamic","HyperVPort","IPAddresses","MacAddresses","TransportPorts"}] String LoadBalancingAlgorithm; + [Write, Description("Specifies if the network team should be created or deleted. Defaults to 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/README.MD new file mode 100644 index 0000000..8653475 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to setup network teams on a node. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/en-US/DSC_NetworkTeam.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/en-US/DSC_NetworkTeam.strings.psd1 new file mode 100644 index 0000000..01c922c --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/en-US/DSC_NetworkTeam.strings.psd1 @@ -0,0 +1,24 @@ +# Localized resources for DSC_NetworkTeam + +ConvertFrom-StringData @' + GetTeamInfo = Getting network team information for '{0}'. + FoundTeam = Found a network team with name '{0}'. + TeamMembersMatch = Members in the network team '{0}' exist as per the configuration. + TeamMembersNotMatch = Members in the network team '{0}' do not match configuration. + TeamNotFound = Network team with name '{0}' not found. + LoadBalancingAlgorithmDifferent = Load Balancing algorithm is different from the requested '{0}' algorithm. + TeamingModeDifferent = Teaming mode is different from the requested '{0}' mode. + ModifyTeam = Modifying the network team named '{0}'. + MembersDifferent = Members within the team named '{0}' are different from that requested in the configuration. + RemovingMembers = Removing members '{0}' not specified in the configuration. + AddingMembers = Adding members '{0}' that are not a part of the team configuration. + CreateTeam = Creating a network team with the name '{0}'. + RemoveTeam = Removing a network team with the name '{0}'. + TeamExistsNoAction = Network team with name '{0}' exists. No action needed. + TeamExistsWithDifferentConfig = Network team with name '{0}' exists but with different configuration. This will be modified. + TeamDoesNotExistShouldCreate = Network team with name '{0}' does not exist. It will be created. + TeamExistsShouldRemove = Network team with name '{0}' exists. It will be removed. + TeamDoesNotExistNoAction = Network team with name '{0}' does not exist. No action needed. + CreatedNetTeam = Network Team was created successfully. + FailedToCreateTeam = Failed to create the network team with specific configuration: {0}. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/en-US/about_NetworkTeam.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/en-US/about_NetworkTeam.help.txt new file mode 100644 index 0000000..8c700d9 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeam/en-US/about_NetworkTeam.help.txt @@ -0,0 +1,78 @@ +.NAME + NetworkTeam + +.DESCRIPTION + This resource is used to setup network teams on a node. + +.PARAMETER Name + Key - String + Specifies the name of the network team to create. + +.PARAMETER TeamMembers + Required - StringArray + Specifies the network interfaces that should be a part of the network team. This is a comma-separated list. + +.PARAMETER TeamingMode + Write - String + Allowed values: SwitchIndependent, LACP, Static + Specifies the teaming mode configuration. + +.PARAMETER LoadBalancingAlgorithm + Write - String + Allowed values: Dynamic, HyperVPort, IPAddresses, MacAddresses, TransportPorts + Specifies the load balancing algorithm for the network team. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if the network team should be created or deleted. Defaults to 'Present'. + +.EXAMPLE 1 + +Creates the switch independent Network Team 'HostTeam' using the NIC1 +and NIC2 interfaces. It sets the load balacing algorithm to 'HyperVPort'. +The config will then wait for the 'HostTeam' to achieve the 'Up' status. + +Configuration NetworkTeam_AddNetworkTeam_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetworkTeam AddNetworkTeam + { + Name = 'HostTeam' + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'HyperVPort' + TeamMembers = 'NIC1', 'NIC2' + Ensure = 'Present' + } + + WaitForNetworkTeam WaitForHostTeam + { + Name = 'HostTeam' + DependsOn = '[NetworkTeam]AddNetworkTeam' + } + } +} + +.EXAMPLE 2 + +Removes the NIC Team 'HostTeam' from the interfaces NIC1, NIC2 and NIC3. + +Configuration NetworkTeam_RemoveNetworkTeam_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetworkTeam RemoveNetworkTeam + { + Name = 'HostTeam' + Ensure = 'Absent' + TeamMembers = 'NIC1', 'NIC2', 'NIC3' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/DSC_NetworkTeamInterface.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/DSC_NetworkTeamInterface.psm1 new file mode 100644 index 0000000..7495e66 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/DSC_NetworkTeamInterface.psm1 @@ -0,0 +1,307 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of a network team interface in a Network Team. + + .PARAMETER Name + Specifies the name of the network team interface to create. + + .PARAMETER TeamName + Specifies the name of the network team on which this particular interface should exist. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $TeamName + ) + + $configuration = @{ + Name = $Name + TeamName = $TeamName + } + + Write-Verbose -Message ($script:localizedData.GetTeamNicInfo -f $Name) + + $getNetLbfoTeamNicParameters = @{ + Name = $Name + Team = $TeamName + ErrorAction = 'SilentlyContinue' + } + $teamNic = Get-NetLbfoTeamNic @getNetLbfoTeamNicParameters + + if ($teamNic) + { + Write-Verbose -Message ($script:localizedData.FoundTeamNic -f $Name) + + $configuration.Add('VlanId', $teamNic.VlanId) + $configuration.Add('Ensure', 'Present') + } + else + { + Write-Verbose -Message ($script:localizedData.TeamNicNotFound -f $Name) + + $configuration.Add('Ensure', 'Absent') + } + + return $configuration +} + +<# + .SYNOPSIS + Adds, updates or removes a network team interface from a Network Team. + + .PARAMETER Name + Specifies the name of the network team interface to create. + + .PARAMETER TeamName + Specifies the name of the network team on which this particular interface should exist. + + .PARAMETER VlanId + Specifies VlanId to be set on network team interface. + + .PARAMETER Ensure + Specifies if the network team interface should be created or deleted. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $TeamName, + + [Parameter()] + [System.UInt32] + $VlanId, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ($script:localizedData.GetTeamNicInfo -f $Name) + + $getNetLbfoTeamNicParameters = @{ + Name = $Name + Team = $TeamName + ErrorAction = 'SilentlyContinue' + } + $teamNic = Get-NetLbfoTeamNic @getNetLbfoTeamNicParameters + + if ($Ensure -eq 'Present') + { + if ($teamNic) + { + Write-Verbose -Message ($script:localizedData.FoundTeamNic -f $Name) + + if ($teamNic.VlanId -ne $VlanId) + { + Write-Verbose -Message ($script:localizedData.TeamNicVlanMismatch -f $VlanId) + + $isNetModifyRequired = $true + } + + if ($isNetModifyRequired) + { + Write-Verbose -Message ($script:localizedData.ModifyTeamNic -f $Name) + + if ($VlanId -eq 0) + { + $setNetLbfoTeamNicParameters = @{ + Name = $Name + Team = $TeamName + Default = $true + ErrorAction = 'Stop' + Confirm = $false + } + Set-NetLbfoTeamNic @setNetLbfoTeamNicParameters + } + else + { + <# + Required in case of primary interface, whose name gets changed + to include VLAN ID, if specified + #> + $setNetLbfoTeamNicParameters = @{ + Name = $Name + Team = $TeamName + VlanId = $VlanId + ErrorAction = 'Stop' + Confirm = $false + } + $renameNetAdapterParameters = @{ + NewName = $Name + ErrorAction = 'SilentlyContinue' + Confirm = $false + } + $null = Set-NetLbfoTeamNic @setNetLbfoTeamNicParameters | + Rename-NetAdapter @renameNetAdapterParameters + } + } + } + else + { + Write-Verbose -Message ($script:localizedData.CreateTeamNic -f $Name) + + if ($VlanId -ne 0) + { + $addNetLbfoTeamNicParameters = @{ + Name = $Name + Team = $TeamName + VlanId = $VlanId + ErrorAction = 'Stop' + Confirm = $false + } + $null = Add-NetLbfoTeamNic @addNetLbfoTeamNicParameters + + Write-Verbose -Message ($script:localizedData.CreatedNetTeamNic -f $Name) + } + else + { + New-InvalidOperationException ` + -Message ($script:localizedData.FailedToCreateTeamNic) + } + } + } + else + { + Write-Verbose -Message ($script:localizedData.RemoveTeamNic -f $Name) + + $removeNetLbfoTeamNicParameters = @{ + Team = $teamNic.Team + VlanId = $teamNic.VlanId + ErrorAction = 'Stop' + Confirm = $false + } + $null = Remove-NetLbfoTeamNic @removeNetLbfoTeamNicParameters + } +} + +<# + .SYNOPSIS + Tests is a specified Network Team Interface is in the correct state. + + .PARAMETER Name + Specifies the name of the network team interface to create. + + .PARAMETER TeamName + Specifies the name of the network team on which this particular interface should exist. + + .PARAMETER VlanId + Specifies VlanId to be set on network team interface. + + .PARAMETER Ensure + Specifies if the network team interface should be created or deleted. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $TeamName, + + [Parameter()] + [System.UInt32] + $VlanId, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ($script:localizedData.GetTeamNicInfo -f $Name) + + $getNetLbfoTeamNicParameters = @{ + Name = $Name + Team = $TeamName + ErrorAction = 'SilentlyContinue' + } + $teamNic = Get-NetLbfoTeamNic @getNetLbfoTeamNicParameters + + if ($VlanId -eq 0) + { + $VlanValue = $null + } + else + { + $VlanValue = $VlanId + } + + if ($Ensure -eq 'Present') + { + if ($teamNic) + { + Write-Verbose -Message ($script:localizedData.FoundTeamNic -f $Name) + + if ($teamNic.VlanId -eq $VlanValue) + { + Write-Verbose -Message ($script:localizedData.TeamNicExistsNoAction -f $Name) + + return $true + } + else + { + Write-Verbose -Message ($script:localizedData.TeamNicExistsWithDifferentConfig -f $Name) + + return $false + } + } + else + { + Write-Verbose -Message ($script:localizedData.TeamNicDoesNotExistShouldCreate -f $Name) + + return $false + } + } + else + { + if ($teamNic) + { + Write-Verbose -Message ($script:localizedData.TeamNicExistsShouldRemove -f $Name) + + return $false + } + else + { + Write-Verbose -Message ($script:localizedData.TeamNicExistsNoAction -f $Name) + + return $true + } + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/DSC_NetworkTeamInterface.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/DSC_NetworkTeamInterface.schema.mof new file mode 100644 index 0000000..b7b3641 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/DSC_NetworkTeamInterface.schema.mof @@ -0,0 +1,9 @@ + +[ClassVersion("1.0"), FriendlyName("NetworkTeamInterface")] +class DSC_NetworkTeamInterface : OMI_BaseResource +{ + [Key, Description("Specifies the name of the network team interface to create.")] String Name; + [Required, Description("Specifies the name of the network team on which this particular interface should exist.")] String TeamName; + [Write, Description("Specifies VLAN ID to be set on network team interface.")] Uint32 VlanId; + [Write, Description("Specifies if the network team interface should be created or deleted. Defaults to 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/README.MD new file mode 100644 index 0000000..1caa55c --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to add network interfaces to a network team. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/en-US/DSC_NetworkTeamInterface.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/en-US/DSC_NetworkTeamInterface.strings.psd1 new file mode 100644 index 0000000..1fcff91 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/en-US/DSC_NetworkTeamInterface.strings.psd1 @@ -0,0 +1,17 @@ +# Localized resources for DSC_NetwrkTeamInterface + +ConvertFrom-StringData @" + GetTeamNicInfo = Getting network team interface information for '{0}'. + FoundTeamNic = Found a network team interface with name '{0}'. + TeamNicNotFound = Network team interface with name '{0}' not found. + TeamNicVlanMismatch = Vlan ID is different from the requested ID of '{0}'. + ModifyTeamNic = Modifying the network team interface named '{0}'. + CreateTeamNic = Creating a network team interface with the name '{0}'. + RemoveTeamNic = Removing a network team interface with the name '{0}'. + TeamNicExistsNoAction = Network team interface with name '{0}' exists. No action needed. + TeamNicExistsWithDifferentConfig = Network team interface with name '{0}' exists but with different configuration. This will be modified. + TeamNicDoesNotExistShouldCreate = Network team interface with name '{0}' does not exist. It will be created. + TeamNicExistsShouldRemove = Network team interface with name '{0}' exists. It will be removed. + CreatedNetTeamNic = Network Team Interface was created successfully. + FailedToCreateTeamNic = Failed to create the network team interface with specific configuration. +"@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/en-US/about_NetworkTeamInterface.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/en-US/about_NetworkTeamInterface.help.txt new file mode 100644 index 0000000..234f3bf --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_NetworkTeamInterface/en-US/about_NetworkTeamInterface.help.txt @@ -0,0 +1,83 @@ +.NAME + NetworkTeamInterface + +.DESCRIPTION + This resource is used to add network interfaces to a network team. + +.PARAMETER Name + Key - String + Specifies the name of the network team interface to create. + +.PARAMETER TeamName + Required - String + Specifies the name of the network team on which this particular interface should exist. + +.PARAMETER VlanId + Write - UInt32 + Specifies VLAN ID to be set on network team interface. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if the network team interface should be created or deleted. Defaults to 'Present'. + +.EXAMPLE 1 + +Add New Network Team Interface. + +Configuration NetworkTeamInterface_AddInterface_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetworkTeam HostTeam + { + Name = 'HostTeam' + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'HyperVPort' + TeamMembers = 'NIC1','NIC2' + Ensure = 'Present' + } + + NetworkTeamInterface NewInterface + { + Name = 'NewInterface' + TeamName = 'HostTeam' + VlanID = 100 + Ensure = 'Present' + DependsOn = '[NetworkTeam]HostTeam' + } + } +} + +.EXAMPLE 2 + +Remove a Network Team Interface. + +Configuration NetworkTeamInterface_RemoveInterface_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetworkTeam HostTeam + { + Name = 'HostTeam' + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'HyperVPort' + TeamMembers = 'NIC1','NIC2' + Ensure = 'Present' + } + + NetworkTeamInterface NewInterface + { + Name = 'NewInterface' + TeamName = 'HostTeam' + Ensure = 'Absent' + DependsOn = '[NetworkTeam]HostTeam' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/DSC_ProxySettings.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/DSC_ProxySettings.psm1 new file mode 100644 index 0000000..a9472a8 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/DSC_ProxySettings.psm1 @@ -0,0 +1,853 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + +# Registry key paths for proxy settings +$script:connectionsRegistryKeyPath = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Connections' + +<# + .SYNOPSIS + Returns the current state of the proxy settings for + the computer. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the + value must be 'Yes'. Not used in Get-TargetResource. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.GettingProxySettingsMessage) + ) -join '') + + $returnValue = @{} + + # Get the registry values in the Connections registry key + $connectionsRegistryValues = Get-ItemProperty ` + -Path "HKLM:\$($script:connectionsRegistryKeyPath)" ` + -ErrorAction SilentlyContinue + + $proxySettingsRegistryBinary = $null + + if ($connectionsRegistryValues.DefaultConnectionSettings) + { + $proxySettingsRegistryBinary = $connectionsRegistryValues.DefaultConnectionSettings + } + elseif ($connectionsRegistryValues.SavedLegacySettings) + { + $proxySettingsRegistryBinary = $connectionsRegistryValues.SavedLegacySettings + } + + if ($proxySettingsRegistryBinary) + { + $returnValue.Add('Ensure','Present') + + $proxySettings = ConvertFrom-ProxySettingsBinary -ProxySettings $proxySettingsRegistryBinary + + $returnValue.Add('EnableManualProxy',$proxySettings.EnableManualProxy) + $returnValue.Add('EnableAutoConfiguration',$proxySettings.EnableAutoConfiguration) + $returnValue.Add('EnableAutoDetection',$proxySettings.EnableAutoDetection) + $returnValue.Add('ProxyServer',$proxySettings.ProxyServer) + $returnValue.Add('ProxyServerBypassLocal',$proxySettings.ProxyServerBypassLocal) + $returnValue.Add('ProxyServerExceptions',$proxySettings.ProxyServerExceptions) + $returnValue.Add('AutoConfigURL',$proxySettings.AutoConfigURL) + } + else + { + $returnValue.Add('Ensure','Absent') + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the current state of the proxy settings for + the computer. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the + value must be 'Yes'. + + .PARAMETER Ensure + Specifies if computer proxy settings should be set. + Defaults to 'Present'. + + .PARAMETER ConnectionType + Defines if the proxy settings should be configured + for default connections, legacy connections or all + connections. Defaults to 'All'. + + .PARAMETER EnableAutoDetection + Enable automatic detection of the proxy settings. Defaults + to 'False'. + + .PARAMETER EnableAutoConfiguration + Use automatic configuration script for specifying proxy + settings. Defaults to 'False'. + + .PARAMETER EnableManualProxy + Use manual proxy server settings. Defaults to 'False'. + + .PARAMETER AutoConfigURL + The URL of the automatic configuration script to specify + the proxy settings. Should be specified if 'EnableAutoConfiguration' + is 'True'. + + .PARAMETER ProxyServer + The address and port of the manual proxy server to use. + Should be specified if 'EnableManualProxy' is 'True'. + + .PARAMETER ProxyServerExceptions + Bypass proxy server for addresses starting with addresses + in this list. + + .PARAMETER ProxyServerBypassLocal + Bypass proxy server for local addresses. Defaults to 'False'. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('All','Default','Legacy')] + [System.String] + $ConnectionType = 'All', + + [Parameter()] + [System.Boolean] + $EnableAutoDetection = $false, + + [Parameter()] + [System.Boolean] + $EnableAutoConfiguration = $false, + + [Parameter()] + [System.Boolean] + $EnableManualProxy = $false, + + [Parameter()] + [System.String] + $AutoConfigURL, + + [Parameter()] + [System.String] + $ProxyServer, + + [Parameter()] + [System.String[]] + $ProxyServerExceptions = @(), + + [Parameter()] + [System.Boolean] + $ProxyServerBypassLocal = $false + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ApplyingProxySettingsMessage -f $Ensure) + ) -join '') + + if ($Ensure -eq 'Absent') + { + # Remove all the Proxy Settings + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DisablingComputerProxyMessage) + ) -join '') + + if ($ConnectionType -in ('All','Default')) + { + Remove-ItemProperty ` + -Path "HKLM:\$($script:connectionsRegistryKeyPath)" ` + -Name 'DefaultConnectionSettings' ` + -ErrorAction SilentlyContinue + } + + if ($ConnectionType -in ('All','Legacy')) + { + Remove-ItemProperty ` + -Path "HKLM:\$($script:connectionsRegistryKeyPath)" ` + -Name 'SavedLegacySettings' ` + -ErrorAction SilentlyContinue + } + } + else + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.EnablingComputerProxyMessage) + ) -join '') + + # Generate the Proxy Settings binary value + $convertToProxySettingsBinaryParameters = @{} + $PSBoundParameters + + $convertToProxySettingsBinaryParameters.Remove('IsSingleInstance') + $convertToProxySettingsBinaryParameters.Remove('Ensure') + $convertToProxySettingsBinaryParameters.Remove('ConnectionType') + + $proxySettings = ConvertTo-ProxySettingsBinary @convertToProxySettingsBinaryParameters + + if ($ConnectionType -in ('All','Default')) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.WritingComputerProxyBinarySettingsMessage -f 'DefaultConnectionSettings',($proxySettings -join ',')) + ) -join '') + + Set-BinaryRegistryValue ` + -Path "HKEY_LOCAL_MACHINE\$($script:connectionsRegistryKeyPath)" ` + -Name 'DefaultConnectionSettings' ` + -Value $proxySettings + } + + if ($ConnectionType -in ('All','Legacy')) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.WritingComputerProxyBinarySettingsMessage -f 'SavedLegacySettings',($proxySettings -join ',')) + ) -join '') + + Set-BinaryRegistryValue ` + -Path "HKEY_LOCAL_MACHINE\$($script:connectionsRegistryKeyPath)" ` + -Name 'SavedLegacySettings' ` + -Value $proxySettings + } + } +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the current state of the proxy settings for + the computer. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the + value must be 'Yes'. + + .PARAMETER Ensure + Specifies if computer proxy settings should be set. + Defaults to 'Present'. + + .PARAMETER ConnectionType + Defines if the proxy settings should be configured + for default connections, legacy connections or all + connections. Defaults to 'All'. + + .PARAMETER EnableAutoDetection + Enable automatic detection of the proxy settings. Defaults + to 'False'. + + .PARAMETER EnableAutoConfiguration + Use automatic configuration script for specifying proxy + settings. Defaults to 'False'. + + .PARAMETER EnableManualProxy + Use manual proxy server settings. Defaults to 'False'. + + .PARAMETER AutoConfigURL + The URL of the automatic configuration script to specify + the proxy settings. Should be specified if 'EnableAutoConfiguration' + is 'True'. + + .PARAMETER ProxyServer + The address and port of the manual proxy server to use. + Should be specified if 'EnableManualProxy' is 'True'. + + .PARAMETER ProxyServerExceptions + Bypass proxy server for addresses starting with addresses + in this list. + + .PARAMETER ProxyServerBypassLocal + Bypass proxy server for local addresses. Defaults to 'False'. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateSet('All','Default','Legacy')] + [System.String] + $ConnectionType = 'All', + + [Parameter()] + [System.Boolean] + $EnableAutoDetection = $false, + + [Parameter()] + [System.Boolean] + $EnableAutoConfiguration = $false, + + [Parameter()] + [System.Boolean] + $EnableManualProxy = $false, + + [Parameter()] + [System.String] + $AutoConfigURL, + + [Parameter()] + [System.String] + $ProxyServer, + + [Parameter()] + [System.String[]] + $ProxyServerExceptions = @(), + + [Parameter()] + [System.Boolean] + $ProxyServerBypassLocal = $false + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingProxySettingsMessage -f $Ensure) + ) -join '') + + [System.Boolean] $desiredConfigurationMatch = $true + + # Get the registry values in the Connections registry key + $connectionsRegistryValues = Get-ItemProperty ` + -Path "HKLM:\$($script:connectionsRegistryKeyPath)" ` + -ErrorAction SilentlyContinue + + if ($Ensure -eq 'Absent') + { + # Check if any of the Proxy Settings need to be removed + if ($ConnectionType -in ('All','Default')) + { + # Does the Default Connection Settings need to be removed? + if ($connectionsRegistryValues.DefaultConnectionSettings) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ComputerProxyBinarySettingsRequiresRemovalMessage -f 'DefaultConnectionSettings') + ) -join '') + + $desiredConfigurationMatch = $false + } + } + + # Does the Saved Legacy Settings need to be removed? + if ($ConnectionType -in ('All','Legacy')) + { + if ($connectionsRegistryValues.SavedLegacySettings) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ComputerProxyBinarySettingsRequiresRemovalMessage -f 'SavedLegacySettings') + ) -join '') + + $desiredConfigurationMatch = $false + } + } + } + else + { + $desiredValues = @{} + $PSBoundParameters + + $desiredValues.Remove('IsSingleInstance') + $desiredValues.Remove('Ensure') + $desiredValues.Remove('ConnectionType') + + if ($ConnectionType -in ('All','Default')) + { + # Check if the Default Connection proxy settings are in the desired state + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingComputerProxyBinarySettingsMessage -f 'DefaultConnectionSettings') + ) -join '') + + if ($connectionsRegistryValues.DefaultConnectionSettings) + { + $defaultConnectionSettings = ConvertFrom-ProxySettingsBinary -ProxySettings $connectionsRegistryValues.DefaultConnectionSettings + } + else + { + $defaultConnectionSettings = @{} + } + + $inDesiredState = Test-ProxySettings -CurrentValues $defaultConnectionSettings -DesiredValues $desiredValues + + if (-not $inDesiredState) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ComputerProxyBinarySettingsNoMatchMessage -f 'DefaultConnectionSettings') + ) -join '') + + $desiredConfigurationMatch = $false + } + } + + if ($ConnectionType -in ('All','Legacy')) + { + # Check if the Saved Legacy proxy settings are in the desired state + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingComputerProxyBinarySettingsMessage -f 'SavedLegacySettings') + ) -join '') + + if ($connectionsRegistryValues.SavedLegacySettings) + { + $savedLegacySettings = ConvertFrom-ProxySettingsBinary -ProxySettings $connectionsRegistryValues.SavedLegacySettings + } + else + { + $savedLegacySettings = @{} + } + + $inDesiredState = Test-ProxySettings -CurrentValues $savedLegacySettings -DesiredValues $desiredValues + + if (-not $inDesiredState) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ComputerProxyBinarySettingsNoMatchMessage -f 'SavedLegacySettings') + ) -join '') + + $desiredConfigurationMatch = $false + } + } + } + + return $desiredConfigurationMatch +} # Test-TargetResource + +<# + .SYNOPSIS + Sets a binary value in a Registry Key. + + .PARAMETER Path + The path to the registry key containing the value. + + .PARAMETER Name + The name of the registry value. + + .PARAMETER Value + The value to put into the binary registry value. +#> +function Set-BinaryRegistryValue +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.Byte[]] + $Value + ) + + $null = [Microsoft.Win32.Registry]::SetValue($Path, $Name, $Value, 'Binary') +} + +<# + .SYNOPSIS + Checks if the current proxy setting values are in the desired + state. Returns $true if in the desired state. + + .PARAMETER CurrentValues + An object containing the current values of the Proxy Settings. + + .PARAMETER DesiredValues + An object containing the desired values of the Proxy Settings. +#> +function Test-ProxySettings +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Object] + $DesiredValues + ) + + [System.Boolean] $inState = $true + + $proxySettingsToCompare = @( + 'EnableManualProxy' + 'EnableAutoConfiguration' + 'EnableAutoDetection' + 'ProxyServer' + 'ProxyServerBypassLocal' + 'AutoConfigURL' + ) + + # Test the string and boolean values + foreach ($proxySetting in $proxySettingsToCompare) + { + if ($DesiredValues.ContainsKey($proxySetting) -and ($DesiredValues.$proxySetting -ne $CurrentValues.$proxySetting)) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ProxySettingMismatchMessage -f $proxySetting,$CurrentValues.$proxySetting,$DesiredValues.$proxySetting) + ) -join '') + + $inState = $false + } + } + + # Test the array value + if ($DesiredValues.ContainsKey('ProxyServerExceptions') ` + -and $CurrentValues.ProxyServerExceptions ` + -and @(Compare-Object ` + -ReferenceObject $DesiredValues.ProxyServerExceptions ` + -DifferenceObject $CurrentValues.ProxyServerExceptions).Count -gt 0) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.ProxySettingMismatchMessage -f 'ProxyServerExceptions',($CurrentValues.ProxyServerExceptions -join ';'),($DesiredValues.ProxyServerExceptions -join ';')) + ) -join '') + + $inState = $false + } + + return $inState +} + +<# + .SYNOPSIS + Get the length of a string in the format of an array + of hexidecimal format strings. + + .PARAMETER Value + The string to return the length for. +#> +function Get-StringLengthInHexBytes +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $Value + ) + + $hex = '{0:x8}' -f $Value.Length + $stringLength = @() + $stringLength += @('0x' + $hex.Substring(6,2)) + $stringLength += @('0x' + $hex.Substring(4,2)) + $stringLength += @('0x' + $hex.Substring(2,2)) + $stringLength += @('0x' + $hex.Substring(0,2)) + + return $stringLength +} + +<# + .SYNOPSIS + Gets an int32 from 4 little endian bytes containing in a + byte array. + + .PARAMETER Bytes + The bytes containing the little endian int32. +#> +function Get-Int32FromByteArray +{ + [CmdletBinding()] + [OutputType([System.Int32])] + param + ( + [Parameter(Mandatory = $true)] + [System.Byte[]] + $Byte, + + [Parameter(Mandatory = $true)] + [System.Int32] + $StartByte + ) + + $value = [System.Int32] 0 + $value += [System.Int32] $Byte[$StartByte] + $value += [System.Int32] $Byte[$StartByte + 1] -shl 8 + $value += [System.Int32] $Byte[$StartByte + 2] -shl 16 + $value += [System.Int32] $Byte[$StartByte + 3] -shl 24 + + return $value +} + +<# + .SYNOPSIS + Convert the proxy settings parameters to a Byte Array that + can be used to populate the DefaultConnectionSettings and + SavedLegacySettings registry settings. + + .PARAMETER EnableAutoDetection + Enable automatic detection of the proxy settings. Defaults + to 'False'. + + .PARAMETER EnableAutoConfiguration + Use automatic configuration script for specifying proxy + settings. Defaults to 'False'. + + .PARAMETER EnableManualProxy + Use manual proxy server settings. Defaults to 'False'. + + .PARAMETER AutoConfigURL + The URL of the automatic configuration script to specify + the proxy settings. Should be specified if 'EnableAutoConfiguration' + is 'True'. + + .PARAMETER ProxyServer + The address and port of the manual proxy server to use. + Should be specified if 'EnableManualProxy' is 'True'. + + .PARAMETER ProxyServerExceptions + Bypass proxy server for addresses starting with addresses + in this list. + + .PARAMETER ProxyServerBypassLocal + Bypass proxy server for local addresses. Defaults to 'False'. +#> +function ConvertTo-ProxySettingsBinary +{ + [CmdletBinding()] + [OutputType([System.Byte[]])] + param + ( + [Parameter()] + [System.Boolean] + $EnableAutoDetection = $false, + + [Parameter()] + [System.Boolean] + $EnableAutoConfiguration = $false, + + [Parameter()] + [System.Boolean] + $EnableManualProxy = $false, + + [Parameter()] + [System.String] + $AutoConfigURL, + + [Parameter()] + [System.String] + $ProxyServer, + + [Parameter()] + [System.String[]] + $ProxyServerExceptions = @(), + + [Parameter()] + [System.Boolean] + $ProxyServerBypassLocal = $false + ) + + [System.Byte[]] $proxySettings = @(0x46, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0) + + if ($EnableManualProxy) + { + $proxySettings[8] = $proxySettings[8] + 2 + } + + if ($EnableAutoConfiguration) + { + $proxySettings[8] = $proxySettings[8] + 4 + } + + if ($EnableAutoDetection) + { + $proxySettings[8] = $proxySettings[8] + 8 + } + + if ($PSBoundParameters.ContainsKey('ProxyServer')) + { + $proxySettings += Get-StringLengthInHexBytes -Value $ProxyServer + $proxySettings += [Byte[]][Char[]] $ProxyServer + } + else + { + $proxySettings += @(0x0, 0x0, 0x0, 0x0) + } + + if ($ProxyServerBypassLocal -eq $true) + { + $ProxyServerExceptions += @('') + } + + if ($ProxyServerExceptions.Count -gt 0) + { + $proxyServerExceptionsString = $ProxyServerExceptions -join ';' + $proxySettings += Get-StringLengthInHexBytes -Value $proxyServerExceptionsString + $proxySettings += [Byte[]][Char[]] $proxyServerExceptionsString + } + else + { + $proxySettings += @(0x0, 0x0, 0x0, 0x0) + } + + if ($PSBoundParameters.ContainsKey('AutoConfigURL')) + { + $proxySettings += Get-StringLengthInHexBytes -Value $AutoConfigURL + $proxySettings += [Byte[]][Char[]] $AutoConfigURL + } + + $proxySettings += @(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) + $proxySettings += @(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) + + return [System.Byte[]] $proxySettings +} + +<# + .SYNOPSIS + Convert from a Byte Array pulled from the proxy settings + DefaultConnectionSettings and SavedLegacySettings in the + registry into an object. + + .PARAMETER ProxySettings + The binary extracted from the registry key + DefaultConnectionSettings or SavedLegacySettings. + +#> +function ConvertFrom-ProxySettingsBinary +{ + [CmdletBinding()] + [OutputType([PSObject])] + param + ( + [Parameter(Mandatory = $true)] + [System.Byte[]] + $ProxySettings + ) + + $proxyParameters = @{} + + if ($ProxySettings.Count -gt 0) + { + # Do a smoke test on the binary to check it looks valid + if ($ProxySettings[0] -ne 0x46) + { + New-InvalidOperationException ` + -Message ($script:localizedData.ProxySettingsBinaryInvalidError -f $ProxySettings[0]) + } + + # Figure out the proxy settings that are enabled + $proxyBits = $ProxySettings[8] + + $enableManualProxy = $false + $enableAutoConfiguration = $false + $enableAutoDetection = $false + + if (($proxyBits -band 0x2) -gt 0) + { + $enableManualProxy = $true + } + + if (($proxyBits -band 0x4) -gt 0) + { + $enableAutoConfiguration = $true + } + + if (($proxyBits -band 0x8) -gt 0) + { + $enableAutoDetection = $true + } + + $proxyParameters.Add('EnableManualProxy',$enableManualProxy) + $proxyParameters.Add('EnableAutoConfiguration',$enableAutoConfiguration) + $proxyParameters.Add('EnableAutoDetection',$enableAutoDetection) + + $stringPointer = 12 + + # Extract the Proxy Server string + $proxyServer = '' + $stringLength = Get-Int32FromByteArray -Byte $ProxySettings -StartByte $stringPointer + $stringPointer += 4 + + if ($stringLength -gt 0) + { + $stringBytes = New-Object -TypeName Byte[] -ArgumentList $stringLength + $null = [System.Buffer]::BlockCopy($ProxySettings,$stringPointer,$stringBytes,0,$stringLength) + $proxyServer = [System.Text.Encoding]::ASCII.GetString($stringBytes) + $stringPointer += $stringLength + } + + $proxyParameters.Add('ProxyServer',$proxyServer) + + # Extract the Proxy Server Exceptions string + $proxyServerExceptions = @() + $stringLength = Get-Int32FromByteArray -Byte $ProxySettings -StartByte $stringPointer + $stringPointer += 4 + + if ($stringLength -gt 0) + { + $stringBytes = New-Object -TypeName Byte[] -ArgumentList $stringLength + $null = [System.Buffer]::BlockCopy($ProxySettings,$stringPointer,$stringBytes,0,$stringLength) + $proxyServerExceptionsString = [System.Text.Encoding]::ASCII.GetString($stringBytes) + $stringPointer += $stringLength + $proxyServerExceptions = [System.String[]] ($proxyServerExceptionsString -split ';') + } + + if ($proxyServerExceptions.Contains('')) + { + $proxyServerExceptions = $proxyServerExceptions | Where-Object -FilterScript { $_ -ne '' } + $proxyParameters.Add('ProxyServerBypassLocal',$true) + } + else + { + $proxyParameters.Add('ProxyServerBypassLocal',$false) + } + + $proxyParameters.Add('ProxyServerExceptions',$proxyServerExceptions) + + # Extract the Auto Config URL string + $autoConfigURL = '' + $stringLength = Get-Int32FromByteArray -Byte $ProxySettings -StartByte $stringPointer + $stringPointer += 4 + + if ($stringLength -gt 0) + { + $stringBytes = New-Object -TypeName Byte[] -ArgumentList $stringLength + $null = [System.Buffer]::BlockCopy($ProxySettings,$stringPointer,$stringBytes,0,$stringLength) + $autoConfigURL = [System.Text.Encoding]::ASCII.GetString($stringBytes) + $stringPointer += $stringLength + } + + $proxyParameters.Add('AutoConfigURL',$autoConfigURL) + } + + return [PSObject] $proxyParameters +} + +Export-ModuleMember -function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/DSC_ProxySettings.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/DSC_ProxySettings.schema.mof new file mode 100644 index 0000000..8c270af --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/DSC_ProxySettings.schema.mof @@ -0,0 +1,14 @@ +[ClassVersion("1.0.0"), FriendlyName("ProxySettings")] +class DSC_ProxySettings : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Specifies if computer proxy settings should be set. Defaults to 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Defines if the proxy settings should be configured for default connections, legacy connections or all connections. Defaults to 'All'."), ValueMap{"All","Default","Legacy"}, Values{"All","Default","Legacy"}] String ConnectionType; + [Write, Description("Enable automatic detection of the proxy settings. Defaults to 'False'.")] Boolean EnableAutoDetection; + [Write, Description("Use automatic configuration script for specifying proxy settings. Defaults to 'False'.")] Boolean EnableAutoConfiguration; + [Write, Description("Use manual proxy server settings. Defaults to 'False'.")] Boolean EnableManualProxy; + [Write, Description("The URL of the automatic configuration script to specify the proxy settings. Should be specified if 'EnableAutoConfiguration' is 'True'.")] String AutoConfigURL; + [Write, Description("The address and port of the manual proxy server to use. Should be specified if 'EnableManualProxy' is 'True'.")] String ProxyServer; + [Write, Description("Bypass proxy server for addresses starting with addresses in this list.")] String ProxyServerExceptions[]; + [Write, Description("Bypass proxy server for local addresses. Defaults to 'False'.")] Boolean ProxyServerBypassLocal; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/README.md b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/README.md new file mode 100644 index 0000000..208f811 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/README.md @@ -0,0 +1,3 @@ +# Description + +The resource is used to configure internet proxy settings for a computer. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/en-US/DSC_ProxySettings.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/en-US/DSC_ProxySettings.strings.psd1 new file mode 100644 index 0000000..3bea22a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/en-US/DSC_ProxySettings.strings.psd1 @@ -0,0 +1,15 @@ +# Localized resources for DSC_ProxySettings + +ConvertFrom-StringData @' + GettingProxySettingsMessage = Getting the computer proxy settings. + ApplyingProxySettingsMessage = Applying the computer proxy settings to ensure '{0}'. + CheckingProxySettingsMessage = Checking the computer proxy settings to ensure '{0}'. + ComputerProxyBinarySettingsRequiresRemovalMessage = The computer proxy settings '{0}' need to be removed. + CheckingComputerProxyBinarySettingsMessage = Checking that the computer proxy settings '{0}' are in the desired state. + ComputerProxyBinarySettingsNoMatchMessage = Computer proxy settings '{0}' are not in the desired state. + DisablingComputerProxyMessage = Disabling computer proxy settings. + EnablingComputerProxyMessage = Enabling computer proxy settings. + ProxySettingMismatchMessage = The proxy setting '{0}' value '{1}' does not match the desired value '{2}'. + WritingComputerProxyBinarySettingsMessage = Writing computer proxy settings '{0}' binary '{1}'. + ProxySettingsBinaryInvalidError = The first byte of the proxy settings binary was '{0}' but should have been 0x46. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/en-US/about_ProxySettings.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/en-US/about_ProxySettings.help.txt new file mode 100644 index 0000000..411717a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_ProxySettings/en-US/about_ProxySettings.help.txt @@ -0,0 +1,121 @@ +.NAME + ProxySettings + +.DESCRIPTION + The resource is used to configure internet proxy settings for a computer. + +.PARAMETER IsSingleInstance + Key - String + Allowed values: Yes + Specifies the resource is a single instance, the value must be 'Yes'. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies if computer proxy settings should be set. Defaults to 'Present'. + +.PARAMETER ConnectionType + Write - String + Allowed values: All, Default, Legacy + Defines if the proxy settings should be configured for default connections, legacy connections or all connections. Defaults to 'All'. + +.PARAMETER EnableAutoDetection + Write - Boolean + Enable automatic detection of the proxy settings. Defaults to 'False'. + +.PARAMETER EnableAutoConfiguration + Write - Boolean + Use automatic configuration script for specifying proxy settings. Defaults to 'False'. + +.PARAMETER EnableManualProxy + Write - Boolean + Use manual proxy server settings. Defaults to 'False'. + +.PARAMETER AutoConfigURL + Write - String + The URL of the automatic configuration script to specify the proxy settings. Should be specified if 'EnableAutoConfiguration' is 'True'. + +.PARAMETER ProxyServer + Write - String + The address and port of the manual proxy server to use. Should be specified if 'EnableManualProxy' is 'True'. + +.PARAMETER ProxyServerExceptions + Write - StringArray + Bypass proxy server for addresses starting with addresses in this list. + +.PARAMETER ProxyServerBypassLocal + Write - Boolean + Bypass proxy server for local addresses. Defaults to 'False'. + +.EXAMPLE 1 + +Sets the computer to automatically detect the proxy settings. + +Configuration ProxySettings_AutoDetectProxy_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + ProxySettings AutoDetectProxy + { + IsSingleInstance = 'Yes' + Ensure = 'Present' + EnableAutoDetection = $true + EnableAutoConfiguration = $false + EnableManualProxy = $false + } + } +} + +.EXAMPLE 2 + +Sets the computer to use an automatic WPAD configuration script that will +be downloaded from the URL 'http://wpad.contoso.com/wpad.dat'. + +Configuration ProxySettings_AutoConfigurationProxy_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + ProxySettings AutoConfigurationProxy + { + IsSingleInstance = 'Yes' + Ensure = 'Present' + EnableAutoDetection = $false + EnableAutoConfiguration = $true + EnableManualProxy = $false + AutoConfigURL = 'http://wpad.contoso.com/wpad.dat' + } + } +} + +.EXAMPLE 3 + +Sets the computer to use a manually configured proxy server +with the address 'proxy.contoso.com' on port 8888. Traffic to addresses +starting with 'web1' or 'web2' or any local addresses will not be sent +to the proxy. + +Configuration ProxySettings_ManualProxy_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + ProxySettings ManualProxy + { + IsSingleInstance = 'Yes' + Ensure = 'Present' + EnableAutoDetection = $false + EnableAutoConfiguration = $false + EnableManualProxy = $true + ProxyServer = 'proxy.contoso.com:8888' + ProxyServerExceptions = 'web1', 'web2' + ProxyServerBypassLocal = $true + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/DSC_Route.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/DSC_Route.psm1 new file mode 100644 index 0000000..fbdc1c2 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/DSC_Route.psm1 @@ -0,0 +1,633 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of a Route for an interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. + + .PARAMETER AddressFamily + Specify the IP address family. + + .PARAMETER DestinationPrefix + Specifies a destination prefix of an IP route. + A destination prefix consists of an IP address prefix + and a prefix length, separated by a slash (/). + + .PARAMETER NextHop + Specifies the next hop for the IP route. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPrefix, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NextHop + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingRouteMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + # Lookup the existing Route + $route = Get-Route @PSBoundParameters + + $returnValue = @{ + InterfaceAlias = $InterfaceAlias + AddressFamily = $AddressFamily + DestinationPrefix = $DestinationPrefix + NextHop = $NextHop + } + + if ($route) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RouteExistsMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + $returnValue += @{ + Ensure = 'Present' + RouteMetric = [System.Uint16] $route.RouteMetric + Publish = $route.Publish + PreferredLifetime = [System.Double] $route.PreferredLifetime.TotalSeconds + } + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RouteDoesNotExistMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + $returnValue += @{ + Ensure = 'Absent' + } + } + + return $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Sets a Route for an interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. + + .PARAMETER AddressFamily + Specify the IP address family. + + .PARAMETER DestinationPrefix + Specifies a destination prefix of an IP route. + A destination prefix consists of an IP address prefix + and a prefix length, separated by a slash (/). + + .PARAMETER NextHop + Specifies the next hop for the IP route. + + .PARAMETER Ensure + Specifies whether the route should exist. + Defaults to 'Present'. + + .PARAMETER RouteMetric + Specifies an integer route metric for an IP route. + Defaults to 256. + + .PARAMETER Publish + Specifies the publish setting of an IP route. + Defaults to 'No'. + + .PARAMETER PreferredLifetime + Specifies a preferred lifetime in seconds of an IP route. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPrefix, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NextHop, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Uint16] + $RouteMetric = 256, + + [Parameter()] + [ValidateSet('No', 'Yes', 'Age')] + [System.String] + $Publish = 'No', + + [Parameter()] + [System.Double] + $PreferredLifetime + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingRouteMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + # Remove any parameters that can't be splatted. + $null = $PSBoundParameters.Remove('Ensure') + + # Lookup the existing Route + $route = Get-Route @PSBoundParameters + + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.EnsureRouteExistsMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + if ($route) + { + # The Route exists - update it + Set-NetRoute @PSBoundParameters ` + -Confirm:$false ` + -ErrorAction Stop + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RouteUpdatedMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + } + else + { + # The Route does not exit - create it + New-NetRoute @PSBoundParameters ` + -ErrorAction Stop + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RouteCreatedMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + } + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.EnsureRouteDoesNotExistMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + if ($route) + { + <# + The Route exists - remove it + Use the parameters passed to Set-TargetResource to delete the appropriate route. + Clear the Publish and PreferredLifetime parameters so they aren't passed to the + Remove-NetRoute cmdlet. + #> + + $null = $PSBoundParameters.Remove('Publish') + $null = $PSBoundParameters.Remove('PreferredLifetime') + + Remove-NetRoute @PSBoundParameters ` + -Confirm:$false ` + -ErrorAction Stop + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RouteRemovedMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + } # if + } # if +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the state of a Route on an interface. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. + + .PARAMETER AddressFamily + Specify the IP address family. + + .PARAMETER DestinationPrefix + Specifies a destination prefix of an IP route. + A destination prefix consists of an IP address prefix + and a prefix length, separated by a slash (/). + + .PARAMETER NextHop + Specifies the next hop for the IP route. + + .PARAMETER Ensure + Specifies whether the route should exist. + Defaults to 'Present'. + + .PARAMETER RouteMetric + Specifies an integer route metric for an IP route. + Defaults to 256. + + .PARAMETER Publish + Specifies the publish setting of an IP route. + Defaults to 'No'. + + .PARAMETER PreferredLifetime + Specifies a preferred lifetime in seconds of an IP route. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPrefix, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NextHop, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Uint16] + $RouteMetric = 256, + + [Parameter()] + [ValidateSet('No', 'Yes', 'Age')] + [System.String] + $Publish = 'No', + + [Parameter()] + [System.Double] + $PreferredLifetime + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingRouteMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + # Flag to signal whether settings are correct + [System.Boolean] $desiredConfigurationMatch = $true + + # Remove any parameters that can't be splatted. + $null = $PSBoundParameters.Remove('Ensure') + + # Check the parameters + Assert-ResourceProperty @PSBoundParameters + + # Lookup the existing Route + $route = Get-Route @PSBoundParameters + + if ($Ensure -eq 'Present') + { + # The route should exist + if ($route) + { + # The route exists and does - but check the parameters + if (($PSBoundParameters.ContainsKey('RouteMetric')) ` + -and ($route.RouteMetric -ne $RouteMetric)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RoutePropertyNeedsUpdateMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop, 'RouteMetric' ` + ) -join '' ) + + $desiredConfigurationMatch = $false + } + + if (($PSBoundParameters.ContainsKey('Publish')) ` + -and ($route.Publish -ne $Publish)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RoutePropertyNeedsUpdateMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop, 'Publish' ` + ) -join '' ) + + $desiredConfigurationMatch = $false + } + + if (($PSBoundParameters.ContainsKey('PreferredLifetime')) ` + -and ($route.PreferredLifetime.TotalSeconds -ne $PreferredLifetime)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RoutePropertyNeedsUpdateMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop, 'PreferredLifetime' ` + ) -join '' ) + + $desiredConfigurationMatch = $false + } + } + else + { + # The route doesn't exist but should + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RouteDoesNotExistButShouldMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + $desiredConfigurationMatch = $false + } + } + else + { + # The route should not exist + if ($route) + { + # The route exists but should not + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RouteExistsButShouldNotMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + + $desiredConfigurationMatch = $false + } + else + { + # The route does not exist and should not + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.RouteDoesNotExistAndShouldNotMessage) ` + -f $AddressFamily, $InterfaceAlias, $DestinationPrefix, $NextHop ` + ) -join '' ) + } + } # if + + return $desiredConfigurationMatch +} # Test-TargetResource + +<# + .SYNOPSIS + This function looks up the route using the parameters and returns + it. If the route is not found $null is returned. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. + + .PARAMETER AddressFamily + Specify the IP address family. + + .PARAMETER DestinationPrefix + Specifies a destination prefix of an IP route. + A destination prefix consists of an IP address prefix + and a prefix length, separated by a slash (/). + + .PARAMETER NextHop + Specifies the next hop for the IP route. + + .PARAMETER Ensure + Specifies whether the route should exist. + Defaults to 'Present'. + + .PARAMETER RouteMetric + Specifies an integer route metric for an IP route. + Defaults to 256. + + .PARAMETER Publish + Specifies the publish setting of an IP route. + Defaults to 'No'. + + .PARAMETER PreferredLifetime + Specifies a preferred lifetime in seconds of an IP route. +#> +function Get-Route +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPrefix, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NextHop, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Uint16] + $RouteMetric = 256, + + [Parameter()] + [ValidateSet('No', 'Yes', 'Age')] + [System.String] + $Publish = 'No', + + [Parameter()] + [System.Double] + $PreferredLifetime + ) + + try + { + $route = Get-NetRoute ` + -InterfaceAlias $InterfaceAlias ` + -AddressFamily $AddressFamily ` + -DestinationPrefix $DestinationPrefix ` + -NextHop $NextHop ` + -ErrorAction Stop + } + catch [Microsoft.PowerShell.Cmdletization.Cim.CimJobException] + { + $route = $null + } + catch + { + throw $_ + } + + return $route +} + +<# + .SYNOPSIS + This function validates the parameters passed. Called by Test-Resource. + Will throw an error if any parameters are invalid. + + .PARAMETER InterfaceAlias + Specifies the alias of a network interface. + + .PARAMETER AddressFamily + Specify the IP address family. + + .PARAMETER DestinationPrefix + Specifies a destination prefix of an IP route. + A destination prefix consists of an IP address prefix + and a prefix length, separated by a slash (/). + + .PARAMETER NextHop + Specifies the next hop for the IP route. + + .PARAMETER Ensure + Specifies whether the route should exist. + Defaults to 'Present'. + + .PARAMETER RouteMetric + Specifies an integer route metric for an IP route. + Defaults to 256. + + .PARAMETER Publish + Specifies the publish setting of an IP route. + Defaults to 'No'. + + .PARAMETER PreferredLifetime + Specifies a preferred lifetime in seconds of an IP route. +#> +function Assert-ResourceProperty +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPrefix, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NextHop, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Uint16] + $RouteMetric = 256, + + [Parameter()] + [ValidateSet('No', 'Yes', 'Age')] + [System.String] + $Publish = 'No', + + [Parameter()] + [System.Double] + $PreferredLifetime + ) + + # Validate the Adapter exists + if (-not (Get-NetAdapter | Where-Object -Property Name -EQ $InterfaceAlias )) + { + New-InvalidArgumentException ` + -Message $($($script:localizedData.InterfaceNotAvailableError) -f $InterfaceAlias) ` + -ArgumentName 'InterfaceAlias' + } + + # Validate the DestinationPrefix Parameter + $components = $DestinationPrefix -split '/' + $prefix = $components[0] + + Assert-IPAddress -Address $prefix -AddressFamily $AddressFamily + + # Validate the NextHop Parameter + Assert-IPAddress -Address $NextHop -AddressFamily $AddressFamily +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/DSC_Route.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/DSC_Route.schema.mof new file mode 100644 index 0000000..9739a3e --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/DSC_Route.schema.mof @@ -0,0 +1,12 @@ +[ClassVersion("1.0.0.0"), FriendlyName("Route")] +class DSC_Route : OMI_BaseResource +{ + [Key, Description("Specifies the alias of a network interface.")] string InterfaceAlias; + [Key, Description("Specifies the IP address family."), ValueMap{"IPv4", "IPv6"},Values{"IPv4", "IPv6"}] string AddressFamily; + [Key, Description("Specifies a destination prefix of an IP route. A destination prefix consists of an IP address prefix and a prefix length, separated by a slash (/).")] String DestinationPrefix; + [Key, Description("Specifies the next hop for the IP route.")] String NextHop; + [Write, Description("Specifies whether the route should exist. Defaults to 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Specifies an integer route metric for an IP route. Defaults to 256.")] Uint16 RouteMetric; + [Write, Description("Specifies the publish setting of an IP route. Defaults to 'No'."), ValueMap{"No","Yes","Age"}, Values{"No","Yes","Age"}] String Publish; + [Write, Description("Specifies a preferred lifetime in seconds of an IP route.")] Real64 PreferredLifetime; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/README.MD new file mode 100644 index 0000000..5ae942d --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to control static routes on an interface for a node. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/en-US/DSC_Route.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/en-US/DSC_Route.strings.psd1 new file mode 100644 index 0000000..256a7fa --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/en-US/DSC_Route.strings.psd1 @@ -0,0 +1,19 @@ +# Localized resources for DSC_Route + +ConvertFrom-StringData @' + GettingRouteMessage = Getting '{0}' route on '{1}' destination '{2}' nexthop '{3}'. + RouteExistsMessage = '{0}' route on '{1}' destination '{2}' nexthop '{3}' exists. + RouteDoesNotExistMessage = '{0}' route on '{1}' destination '{2}' nexthop '{3}' does not exist. + SettingRouteMessage = Setting '{0}' route on '{1}' destination '{2}' nexthop '{3}'. + EnsureRouteExistsMessage = Ensuring '{0}' route on '{1}' destination '{2}' nexthop '{3}' exists. + EnsureRouteDoesNotExistMessage = Ensuring '{0}' route on '{1}' destination '{2}' nexthop '{3}' does not exist. + RouteCreatedMessage = '{0}' route on '{1}' destination '{2}' nexthop '{3}' has been created. + RouteUpdatedMessage = '{0}' route on '{1}' destination '{2}' nexthop '{3}' has been updated. + RouteRemovedMessage = '{0}' route on '{1}' destination '{2}' nexthop '{3}' has been removed. + TestingRouteMessage = Testing '{0}' route on '{1}' destination '{2}' nexthop '{3}'. + RoutePropertyNeedsUpdateMessage = '{4}' property on '{0}' route on '{1}' destination '{2}' nexthop '{3}' is different. Change required. + RouteDoesNotExistButShouldMessage = '{0}' route on '{1}' destination '{2}' nexthop '{3}' does not exist but should. Change required. + RouteExistsButShouldNotMessage = '{0}' route on '{1}' destination '{2}' nexthop '{3}' exists but should not. Change required. + RouteDoesNotExistAndShouldNotMessage = '{0}' route on '{1}' destination '{2}' nexthop '{3}' does not exist and should not. Change not required. + InterfaceNotAvailableError = Interface '{0}' is not available. Please select a valid interface and try again. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/en-US/about_Route.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/en-US/about_Route.help.txt new file mode 100644 index 0000000..3e1c96e --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_Route/en-US/about_Route.help.txt @@ -0,0 +1,64 @@ +.NAME + Route + +.DESCRIPTION + This resource is used to control static routes on an interface for a node. + +.PARAMETER InterfaceAlias + Key - String + Specifies the alias of a network interface. + +.PARAMETER AddressFamily + Key - String + Allowed values: IPv4, IPv6 + Specifies the IP address family. + +.PARAMETER DestinationPrefix + Key - String + Specifies a destination prefix of an IP route. A destination prefix consists of an IP address prefix and a prefix length, separated by a slash (/). + +.PARAMETER NextHop + Key - String + Specifies the next hop for the IP route. + +.PARAMETER Ensure + Write - String + Allowed values: Present, Absent + Specifies whether the route should exist. Defaults to 'Present'. + +.PARAMETER RouteMetric + Write - UInt16 + Specifies an integer route metric for an IP route. Defaults to 256. + +.PARAMETER Publish + Write - String + Allowed values: No, Yes, Age + Specifies the publish setting of an IP route. Defaults to 'No'. + +.PARAMETER PreferredLifetime + Write - Real64 + Specifies a preferred lifetime in seconds of an IP route. + +.EXAMPLE 1 + +Add a net route to the Ethernet interface. + +Configuration Route_AddRoute_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + Route NetRoute1 + { + Ensure = 'Present' + InterfaceAlias = 'Ethernet' + AddressFamily = 'IPv4' + DestinationPrefix = '192.168.0.0/16' + NextHop = '192.168.120.0' + RouteMetric = 200 + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/DSC_WaitForNetworkTeam.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/DSC_WaitForNetworkTeam.psm1 new file mode 100644 index 0000000..7e2ce40 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/DSC_WaitForNetworkTeam.psm1 @@ -0,0 +1,223 @@ +# Suppressed as per PSSA Rule Severity guidelines for unit/integration tests: +# https://github.com/PowerShell/DscResources/blob/master/PSSARuleSeverities.md +[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] +param () + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the wait for network team resource. + + .PARAMETER Name + Specifies the name of the network team to wait for. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingWaitForNetworkTeamStatusMessage -f $Name) + ) -join '' ) + + + $null = Get-NetLbfoTeamStatus -Name $Name + + $returnValue = @{ + Name = $Name + RetryIntervalSec = $null + RetryCount = $null + } + + return $returnValue +} # function Get-TargetResource + +<# + .SYNOPSIS + Sets the current state of the wait for network team resource. + + .PARAMETER Name + Specifies the name of the network team to wait for. + + .PARAMETER RetryIntervalSec + Specifies the number of seconds to wait for the network team to become available. + + .PARAMETER RetryCount + The number of times to loop the retry interval while waiting for the network team. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.UInt32] + $RetryIntervalSec = 10, + + [Parameter()] + [System.UInt32] + $RetryCount = 60 + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingWaitForNetworkTeamStatusMessage -f $Name) + ) -join '' ) + + $lbfoTeamUp = $false + + for ($count = 0; $count -lt $RetryCount; $count++) + { + $lbfoTeamStatus = Get-NetLbfoTeamStatus -Name $Name + + if ($lbfoTeamStatus -eq 'Up') + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetworkTeamUpMessage -f $Name) + ) -join '' ) + + $lbfoTeamUp = $true + break + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetworkTeamNotUpRetryingMessage -f $Name, $RetryIntervalSec) + ) -join '' ) + + Start-Sleep -Seconds $RetryIntervalSec + } # if + } # for + + if ($lbfoTeamUp -eq $false) + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetworkTeamNotUpAfterError -f $Name, $RetryCount) + } # if +} # function Set-TargetResource + +<# + .SYNOPSIS + Tests the current state of the wait for network team resource. + + .PARAMETER Name + Specifies the name of the network team to wait for. + + .PARAMETER RetryIntervalSec + Specifies the number of seconds to wait for the network team to become available. + + .PARAMETER RetryCount + The number of times to loop the retry interval while waiting for the network team. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [System.UInt32] + $RetryIntervalSec = 10, + + [Parameter()] + [System.UInt32] + $RetryCount = 60 + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingWaitForNetworkTeamStatusMessage -f $Name) + ) -join '' ) + + $lbfoTeamStatus = Get-NetLbfoTeamStatus -Name $Name + + if ($lbfoTeamStatus -eq 'Up') + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetworkTeamUpMessage -f $Name) + ) -join '' ) + + return $true + } + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetworkTeamNotUpMessage -f $Name) + ) -join '' ) + + return $false +} # function Test-TargetResource + +<# + .SYNOPSIS + Returns the current status of a network team. + 'Up' indicates that the network team is acive. + 'Degraded' indicates that the network team is not yet + available. + If the network team does not exist an exception will be + thrown. + + .PARAMETER Name + Specifies the name of the network team to get the status of. +#> + +function Get-NetLbfoTeamStatus +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name + ) + + try + { + $lbfoTeam = Get-NetLbfoTeam -Name $Name + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NetworkTeamFoundMessage -f $Name) + ) -join '' ) + + } + catch [Microsoft.PowerShell.Cmdletization.Cim.CimJobException] + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetworkTeamNotFoundMessage -f $Name) + } + + return $lbfoTeam.Status +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/DSC_WaitForNetworkTeam.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/DSC_WaitForNetworkTeam.schema.mof new file mode 100644 index 0000000..3034cf9 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/DSC_WaitForNetworkTeam.schema.mof @@ -0,0 +1,8 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("WaitForNetworkTeam")] +class DSC_WaitForNetworkTeam : OMI_BaseResource +{ + [Key, Description("Specifies the name of the network team to wait for.")] String Name; + [Write, Description("Specifies the number of seconds to wait for the network team to become available.")] Uint32 RetryIntervalSec; + [Write, Description("The number of times to loop the retry interval while waiting for the network team.")] Uint32 RetryCount; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/README.md b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/README.md new file mode 100644 index 0000000..64ef036 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/README.md @@ -0,0 +1,3 @@ +# Description + +The resource is used to wait for a network team to achieve the 'Up' status. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/en-US/DSC_WaitForNetworkTeam.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/en-US/DSC_WaitForNetworkTeam.strings.psd1 new file mode 100644 index 0000000..ab57234 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/en-US/DSC_WaitForNetworkTeam.strings.psd1 @@ -0,0 +1,11 @@ +ConvertFrom-StringData @' + GettingWaitForNetworkTeamStatusMessage = Getting Network Team status '{0}'. + SettingWaitForNetworkTeamStatusMessage = Waiting for Network Team '{0}' to become 'Up'. + NetworkTeamFoundMessage = Found Network Team '{0}'. + NetworkTeamNotFoundMessage = Network Team '{0}' not found. + NetworkTeamUpMessage = Network Team '{0}' is 'Up'. + NetworkTeamNotUpMessage = Network Team '{0}' not 'Up'. + NetworkTeamNotUpRetryingMessage = Network Team '{0}' not 'Up', retrying in {1} seconds. + NetworkTeamNotUpAfterError = Network Team '{0}' not 'Up' after {1} counts. + TestingWaitForNetworkTeamStatusMessage = Testing Network Team status '{0}'. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/en-US/about_WaitForNetworkTeam.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/en-US/about_WaitForNetworkTeam.help.txt new file mode 100644 index 0000000..c88d4c4 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WaitForNetworkTeam/en-US/about_WaitForNetworkTeam.help.txt @@ -0,0 +1,48 @@ +.NAME + WaitForNetworkTeam + +.DESCRIPTION + The resource is used to wait for a network team to achieve the 'Up' status. + +.PARAMETER Name + Key - String + Specifies the name of the network team to wait for. + +.PARAMETER RetryIntervalSec + Write - UInt32 + Specifies the number of seconds to wait for the network team to become available. + +.PARAMETER RetryCount + Write - UInt32 + The number of times to loop the retry interval while waiting for the network team. + +.EXAMPLE 1 + +Creates the switch independent Network Team 'HostTeam' using the NIC1 +and NIC2 interfaces. It sets the load balacing algorithm to 'HyperVPort'. +The config will then wait for the 'HostTeam' to achieve the 'Up' status. + +Configuration WaitForNetworkTeam_AddNetworkTeam_Config +{ + Import-DSCResource -ModuleName NetworkingDsc + + Node localhost + { + NetworkTeam AddNetworkTeam + { + Name = 'HostTeam' + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'HyperVPort' + TeamMembers = 'NIC1', 'NIC2' + Ensure = 'Present' + } + + WaitForNetworkTeam WaitForHostTeam + { + Name = 'HostTeam' + DependsOn = '[NetworkTeam]AddNetworkTeam' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/DSC_WinsServerAddress.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/DSC_WinsServerAddress.psm1 new file mode 100644 index 0000000..e8598e3 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/DSC_WinsServerAddress.psm1 @@ -0,0 +1,168 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current WINS Server Addresses for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the WINS server address is set. + + .PARAMETER Address + The desired WINS Server address(es). Exclude to remove existing servers. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $InterfaceAlias + ) + + Assert-ResourceProperty @PSBoundParameters + + Write-Verbose -Message "$($MyInvocation.MyCommand): $($script:localizedData.GettingWinsServerAddressesMessage)" + + # Get the current WINS Server Addresses based on the parameters given. + $currentAddress = [string[]]@(Get-WinsClientServerStaticAddress -InterfaceAlias $InterfaceAlias -ErrorAction Stop) + + $returnValue = @{ + InterfaceAlias = $InterfaceAlias + Address = $currentAddress + } + + return $returnValue +} + +<# + .SYNOPSIS + Sets the WINS Server Address(es) for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the WINS server address is set. + + .PARAMETER Address + The desired WINS Server address(es). Exclude to remove existing servers. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter()] + [AllowEmptyCollection()] + [System.String[]] + $Address + ) + + Assert-ResourceProperty @PSBoundParameters + + Write-Verbose -Message "$($MyInvocation.MyCommand): $($script:localizedData.ApplyingWinsServerAddressesMessage)" + + Set-WinsClientServerStaticAddress -InterfaceAlias $InterfaceAlias -Address $Address -ErrorAction Stop + +} + +<# + .SYNOPSIS + Tests the current state of a WINS Server Address for an interface. + + .PARAMETER InterfaceAlias + Alias of the network interface for which the WINS server address is set. + + .PARAMETER Address + The desired WINS Server address(es). Exclude to remove existing servers. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter()] + [AllowEmptyCollection()] + [System.String[]] + $Address + ) + + Write-Verbose -Message "$($MyInvocation.MyCommand): $($script:localizedData.CheckingWinsServerAddressesMessage)" + + Assert-ResourceProperty @PSBoundParameters + + $currentState = Get-TargetResource -InterfaceAlias $InterfaceAlias + $desiredState = $PSBoundParameters + + $result = Test-DscParameterState -CurrentValues $currentState -DesiredValues $desiredState + + if ($result) + { + Write-Verbose -Message "$($MyInvocation.MyCommand): $($script:localizedData.WinsServersSetCorrectlyMessage)" + } + else + { + $message = "$($MyInvocation.MyCommand): $($script:localizedData.WinsServersNotCorrectMessage -f + ($currentState.Address -join ', '), ($desiredState.Address -join ', '))" + Write-Verbose -Message $message + } + + return $result +} + +function Assert-ResourceProperty +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter()] + [AllowEmptyCollection()] + [System.String[]] + $Address + ) + + if (-not (Get-NetAdapter | Where-Object Name -EQ $InterfaceAlias)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InterfaceNotAvailableError -f $InterfaceAlias) ` + -ArgumentName 'InterfaceAlias' + } + + foreach ($ip in $Address) + { + if (-not ([System.Net.IPAddress]::TryParse($ip, [ref]0))) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressFormatError -f $ip) + -ArgumentName 'Address' + } + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/DSC_WinsServerAddress.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/DSC_WinsServerAddress.schema.mof new file mode 100644 index 0000000..1d92e0d --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/DSC_WinsServerAddress.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0"), FriendlyName("WinsServerAddress")] +class DSC_WinsServerAddress : OMI_BaseResource +{ + [Key, Description("Alias of the network interface for which the WINS server address is set.")] string InterfaceAlias; + [Write, Description("The desired WINS Server address(es). Exclude to remove all WINS servers.")] string Address[]; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/README.MD new file mode 100644 index 0000000..e5bcd34 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/README.MD @@ -0,0 +1,3 @@ +# Description + +This resource is used to control a node's WINS Server address(s) for the given network interface. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/en-US/DSC_WinsServerAddress.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/en-US/DSC_WinsServerAddress.strings.psd1 new file mode 100644 index 0000000..933f2a0 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/en-US/DSC_WinsServerAddress.strings.psd1 @@ -0,0 +1,11 @@ +# Localized resources for DSC_DnsServerAddress + +ConvertFrom-StringData @' + GettingWinsServerAddressesMessage = Getting the WINS server addresses. + ApplyingWinsServerAddressesMessage = Applying the WINS server addresses. + WinsServersSetCorrectlyMessage = WINS server addresses are set correctly. + WinsServersNotCorrectMessage = WINS server addresses are not correct. Expected "{0}", actual "{1}". + InterfaceNotAvailableError = Interface "{0}" is not available. Please select a valid interface and try again. + AddressFormatError = Address "{0}" is not in the correct format. Please correct the Address parameter in the configuration and try again. + CheckingWinsServerAddressesMessage = Checking the WINS server addresses. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/en-US/about_WinsServerAddress.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/en-US/about_WinsServerAddress.help.txt new file mode 100644 index 0000000..3d8e72a --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsServerAddress/en-US/about_WinsServerAddress.help.txt @@ -0,0 +1,51 @@ +.NAME + WinsServerAddress + +.DESCRIPTION + This resource is used to control a node's WINS Server address(s) for the given network interface. + +.PARAMETER InterfaceAlias + Key - String + Alias of the network interface for which the WINS server address is set. + +.PARAMETER Address + Write - StringArray + The desired WINS Server address(es). Exclude to remove all WINS servers. + +.EXAMPLE 1 + +Configure WINS Server for the Ethernet adapter. + +Configuration WinsServerAddress_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + WinsServerAddress WinsServerAddress + { + Address = '192.168.0.1' + InterfaceAlias = 'Ethernet' + } + } +} + +.EXAMPLE 2 + +Configure primary and secondary WINS Server addresses on the Ethernet adapter. + +Configuration WinsServerAddress_PrimaryAndSecondary_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + WinsServerAddress PrimaryAndSecondary + { + Address = '192.168.0.1', '192.168.0.2' + InterfaceAlias = 'Ethernet' + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/DSC_WinsSetting.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/DSC_WinsSetting.psm1 new file mode 100644 index 0000000..2dd213f --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/DSC_WinsSetting.psm1 @@ -0,0 +1,186 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Networking Common Modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'NetworkingDsc.Common' ` + -ChildPath 'NetworkingDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current WINS settings. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingWinsSettingMessage) + ) -join '' ) + + # 0 equals off, 1 equals on + $enableLmHostsRegistryKey = Get-ItemProperty ` + -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NetBT\Parameters' ` + -Name EnableLMHOSTS ` + -ErrorAction SilentlyContinue + + $enableLmHosts = ($enableLmHostsRegistryKey.EnableLMHOSTS -eq 1) + + # 0 equals off, 1 equals on + $enableDnsRegistryKey = Get-ItemProperty ` + -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NetBT\Parameters' ` + -Name EnableDNS ` + -ErrorAction SilentlyContinue + + if ($enableDnsRegistryKey) + { + $enableDns = ($enableDnsRegistryKey.EnableDNS -eq 1) + } + else + { + # if the key does not exist, then set the default which is enabled. + $enableDns = $true + } + + return @{ + IsSingleInstance = 'Yes' + EnableLmHosts = $enableLmHosts + EnableDns = $enableDns + } +} # Get-TargetResource + +<# + .SYNOPSIS + Sets the current configuration for the LMHOSTS Lookup setting. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER EnableLmHosts + Specifies if LMHOSTS lookup should be enabled for all network + adapters with TCP/IP enabled. + + .PARAMETER EnableDns + Specifies if DNS is enabled for name resolution over WINS for + all network adapters with TCP/IP enabled. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.Boolean] + $EnableLmHosts, + + [Parameter()] + [System.Boolean] + $EnableDns + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingWinsSettingMessage) + ) -join '' ) + + # Get the current values of the WINS settings + $currentState = Get-TargetResource -IsSingleInstance 'Yes' + + if (-not $PSBoundParameters.ContainsKey('EnableLmHosts')) + { + $EnableLmHosts = $currentState.EnableLmHosts + } + + if (-not $PSBoundParameters.ContainsKey('EnableDns')) + { + $EnableDns = $currentState.EnableDNS + } + + $result = Invoke-CimMethod ` + -ClassName Win32_NetworkAdapterConfiguration ` + -MethodName EnableWins ` + -Arguments @{ + DNSEnabledForWINSResolution = $EnableDns + WINSEnableLMHostsLookup = $EnableLmHosts + } + + if ($result.ReturnValue -ne 0) + { + New-InvalidOperationException ` + -Message ($script:localizedData.FailedUpdatingWinsSettingError -f $result.ReturnValue) + } + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.WinsSettingUpdatedMessage) + ) -join '' ) +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the current configuration for the LMHOSTS Lookup setting. + + .PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + + .PARAMETER EnableLmHosts + Specifies if LMHOSTS lookup should be enabled for all network + adapters with TCP/IP enabled. + + .PARAMETER EnableDns + Specifies if DNS is enabled for name resolution over WINS for + all network adapters with TCP/IP enabled. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.Boolean] + $EnableLmHosts, + + [Parameter()] + [System.Boolean] + $EnableDns + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingWinsSettingMessage) + ) -join '' ) + + # Get the current values of the WINS settings + $currentState = Get-TargetResource -IsSingleInstance 'Yes' + + return Test-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters +} # Test-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/DSC_WinsSetting.schema.mof b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/DSC_WinsSetting.schema.mof new file mode 100644 index 0000000..3e6f015 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/DSC_WinsSetting.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.0.0"), FriendlyName("WinsSetting")] +class DSC_WinsSetting : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Specifies if LMHOSTS lookup should be enabled for all network adapters with TCP/IP enabled.")] Boolean EnableLmHosts; + [Write, Description("Specifies if DNS is enabled for name resolution over WINS for all network adapters with TCP/IP enabled.")] Boolean EnableDns; +}; diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/README.MD b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/README.MD new file mode 100644 index 0000000..1cd6db5 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/README.MD @@ -0,0 +1,4 @@ +# Description + +This resource is used to configure the WINS settings that enable or disable +LMHOSTS lookups and enable or disable DNS for name resolution over WINS. diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/en-US/DSC_WinsSetting.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/en-US/DSC_WinsSetting.strings.psd1 new file mode 100644 index 0000000..91ac9da --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/en-US/DSC_WinsSetting.strings.psd1 @@ -0,0 +1,9 @@ +# Localized resources for DSC_WinsSetting + +ConvertFrom-StringData @' + GettingWinsSettingMessage = Getting WINS settings. + SettingWinsSettingMessage = Setting WINS settings. + WinsSettingUpdatedMessage = WINS settings updated. + TestingWinsSettingMessage = Testing WINS settings. + FailedUpdatingWinsSettingError = An error code of '{0}' was returned when attemting to update WINS settings. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/en-US/about_WinsSetting.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/en-US/about_WinsSetting.help.txt new file mode 100644 index 0000000..f697512 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/DSCResources/DSC_WinsSetting/en-US/about_WinsSetting.help.txt @@ -0,0 +1,40 @@ +.NAME + WinsSetting + +.DESCRIPTION + This resource is used to configure the WINS settings that enable or disable + LMHOSTS lookups and enable or disable DNS for name resolution over WINS. + +.PARAMETER IsSingleInstance + Key - String + Allowed values: Yes + Specifies the resource is a single instance, the value must be 'Yes'. + +.PARAMETER EnableLmHosts + Write - Boolean + Specifies if LMHOSTS lookup should be enabled for all network adapters with TCP/IP enabled. + +.PARAMETER EnableDns + Write - Boolean + Specifies if DNS is enabled for name resolution over WINS for all network adapters with TCP/IP enabled. + +.EXAMPLE 1 + +Disable LMHOSTS lookup and disable using DNS for WINS name resolution. + +Configuration WinSetting_ConfigureWinsSetting_Config +{ + Import-DscResource -Module NetworkingDsc + + Node localhost + { + WinsSetting ConfigureWinsSettings + { + IsSingleInstance = 'Yes' + EnableLMHOSTS = $false + EnableDNS = $false + } + } +} + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 new file mode 100644 index 0000000..0c18ec0 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 @@ -0,0 +1,73 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'DscResource.Common.psm1' + + # Version number of this module. + ModuleVersion = '0.9.3' + + # ID used to uniquely identify this module + GUID = '9c9daa5b-5c00-472d-a588-c96e8e498450' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Common functions used in DSC Resources' + + # Minimum version of the PowerShell engine required by this module + PowerShellVersion = '4.0' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @('Assert-BoundParameter','Assert-IPAddress','Assert-Module','Compare-ResourcePropertyState','ConvertTo-CimInstance','ConvertTo-HashTable','Get-LocalizedData','Get-TemporaryFolder','New-InvalidArgumentException','New-InvalidDataException','New-InvalidOperationException','New-InvalidResultException','New-NotImplementedException','New-ObjectNotFoundException','Remove-CommonParameter','Set-DscMachineRebootRequired','Set-PSModulePath','Test-DscParameterState','Test-IsNanoServer') + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DSC', 'Localization') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/DscResource.Common/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/DscResource.Common' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [0.9.3] - 2020-07-25 + +## Fixed + +- Correction to `Test-DscParameterState` returning false positive when parameter + with an empty array is passed in `DesriedValues` or `CurrentValues` - fixes + [issue #53](https://github.com/dsccommunity/DscResource.Common/issues/53). + +' + + Prerelease = '' + } # End of PSData hashtable + + } # End of PrivateData hashtable +} + + + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 new file mode 100644 index 0000000..17d1159 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 @@ -0,0 +1,2179 @@ +#Region './prefix.ps1' 0 +$script:modulesFolderPath = Split-Path -Path $PSScriptRoot -Parent +#EndRegion './prefix.ps1' 1 +#Region './Private/Test-DscObjectHasProperty.ps1' 0 +<# + .SYNOPSIS + Tests if an object has a property. + + .DESCRIPTION + Tests if the specified object has the specified property and return + $true or $false. + + .PARAMETER Object + Specifies the object to test for the specified property. + + .PARAMETER PropertyName + Specifies the property name to test for. + + .EXAMPLE + Test-DscObjectHasProperty -Object 'AnyString' -PropertyName 'Length' +#> +function Test-DscObjectHasProperty +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $Object, + + [Parameter(Mandatory = $true)] + [System.String] + $PropertyName + ) + + if ($Object.PSObject.Properties.Name -contains $PropertyName) + { + return [System.Boolean] $Object.$PropertyName + } + + return $false +} +#EndRegion './Private/Test-DscObjectHasProperty.ps1' 39 +#Region './Private/Test-DscPropertyState.ps1' 0 +<# + .SYNOPSIS + Compares the current and the desired value of a property. + + .DESCRIPTION + This function is used to compare the current and the desired value of a + property. + + .PARAMETER Values + This is set to a hash table with the current value (the CurrentValue key) + and desired value (the DesiredValue key). + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 'John' + DesiredValue = 'Alice' + } + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 1 + DesiredValue = 2 + } + + .NOTES + This function is used by the cmdlet Compare-ResourcePropertyState. +#> +function Test-DscPropertyState +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Values + ) + + if ($null -eq $Values.CurrentValue -and $null -eq $Values.DesiredValue) + { + # Both values are $null so return $true + $returnValue = $true + } + elseif ($null -eq $Values.CurrentValue -or $null -eq $Values.DesiredValue) + { + # Either CurrentValue or DesiredValue are $null so return $false + $returnValue = $false + } + elseif ( + $Values.DesiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]] ` + -or $Values.DesiredValue -is [System.Array] -and $Values.DesiredValue[0] -is [Microsoft.Management.Infrastructure.CimInstance] + ) + { + if (-not $Values.ContainsKey('KeyProperties')) + { + $errorMessage = $script:localizedData.KeyPropertiesMissing + + New-InvalidOperationException -Message $errorMessage + } + + $propertyState = @() + + <# + It is a collection of CIM instances, then recursively call + Test-DscPropertyState for each CIM instance in the collection. + #> + foreach ($desiredCimInstance in $Values.DesiredValue) + { + $currentCimInstance = $Values.CurrentValue + + <# + Use the CIM instance Key properties to filter out the current + values if the exist. + #> + foreach ($keyProperty in $Values.KeyProperties) + { + $currentCimInstance = $currentCimInstance | + Where-Object -Property $keyProperty -EQ -Value $desiredCimInstance.$keyProperty + } + + if ($currentCimInstance.Count -gt 1) + { + $errorMessage = $script:localizedData.TooManyCimInstances + + New-InvalidOperationException -Message $errorMessage + } + + if ($currentCimInstance) + { + $keyCimInstanceProperties = $currentCimInstance.CimInstanceProperties | + Where-Object -FilterScript { + $_.Name -in $Values.KeyProperties + } + + <# + For each key property build a string representation of the + property name and its value. + #> + $keyPropertyValues = $keyCimInstanceProperties.ForEach({'{0}="{1}"' -f $_.Name, ($_.Value -join ',')}) + + Write-Debug -Message ( + $script:localizedData.TestingCimInstance -f @( + $currentCimInstance.CimClass.CimClassName, + ($keyPropertyValues -join ';') + ) + ) + } + else + { + $keyCimInstanceProperties = $desiredCimInstance.CimInstanceProperties | + Where-Object -FilterScript { + $_.Name -in $Values.KeyProperties + } + + <# + For each key property build a string representation of the + property name and its value. + #> + $keyPropertyValues = $keyCimInstanceProperties.ForEach({'{0}="{1}"' -f $_.Name, ($_.Value -join ',')}) + + Write-Debug -Message ( + $script:localizedData.MissingCimInstance -f @( + $desiredCimInstance.CimClass.CimClassName, + ($keyPropertyValues -join ';') + ) + ) + } + + # Recursively call Test-DscPropertyState with the CimInstance to evaluate. + $propertyState += Test-DscPropertyState -Values @{ + CurrentValue = $currentCimInstance + DesiredValue = $desiredCimInstance + } + } + + # Return $false if one property is found to not be in desired state. + $returnValue = -not ($false -in $propertyState) + } + elseif ($Values.DesiredValue -is [Microsoft.Management.Infrastructure.CimInstance]) + { + $propertyState = @() + + <# + It is a CIM instance, recursively call Test-DscPropertyState for each + CIM instance property. + #> + $desiredCimInstanceProperties = $Values.DesiredValue.CimInstanceProperties | + Select-Object -Property @('Name', 'Value') + + if ($desiredCimInstanceProperties) + { + foreach ($desiredCimInstanceProperty in $desiredCimInstanceProperties) + { + <# + Recursively call Test-DscPropertyState to evaluate each property + in the CimInstance. + #> + $propertyState += Test-DscPropertyState -Values @{ + CurrentValue = $Values.CurrentValue.($desiredCimInstanceProperty.Name) + DesiredValue = $desiredCimInstanceProperty.Value + } + } + } + else + { + if ($Values.CurrentValue.CimInstanceProperties.Count -gt 0) + { + # Current value did not have any CIM properties, but desired state has. + $propertyState += $false + } + } + + # Return $false if one property is found to not be in desired state. + $returnValue = -not ($false -in $propertyState) + } + elseif ($Values.DesiredValue -is [System.Array] -or $Values.CurrentValue -is [System.Array]) + { + $compareObjectParameters = @{ + ReferenceObject = $Values.CurrentValue + DifferenceObject = $Values.DesiredValue + } + + $arrayCompare = Compare-Object @compareObjectParameters + + if ($null -ne $arrayCompare) + { + Write-Debug -Message $script:localizedData.ArrayDoesNotMatch + + $arrayCompare | + ForEach-Object -Process { + if ($_.SideIndicator -eq '=>') + { + Write-Debug -Message ( + $script:localizedData.ArrayValueIsAbsent -f $_.InputObject + ) + } + else + { + Write-Debug -Message ( + $script:localizedData.ArrayValueIsPresent -f $_.InputObject + ) + } + } + + $returnValue = $false + } + else + { + $returnValue = $true + } + } + elseif ($Values.CurrentValue -ne $Values.DesiredValue) + { + $desiredType = $Values.DesiredValue.GetType() + + $returnValue = $false + + $supportedTypes = @( + 'String' + 'Int32' + 'UInt32' + 'Int16' + 'UInt16' + 'Single' + 'Boolean' + ) + + if ($desiredType.Name -notin $supportedTypes) + { + Write-Warning -Message ($script:localizedData.UnableToCompareType -f $desiredType.Name) + } + else + { + Write-Debug -Message ( + $script:localizedData.PropertyValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $Values.CurrentValue, $Values.DesiredValue + ) + } + } + else + { + $returnValue = $true + } + + return $returnValue +} +#EndRegion './Private/Test-DscPropertyState.ps1' 246 +#Region './Public/Assert-BoundParameter.ps1' 0 +<# + .SYNOPSIS + Throws an error if there is a bound parameter that exists in both the + mutually exclusive lists. + + .DESCRIPTION + Throws an error if there is a bound parameter that exists in both the + mutually exclusive lists. + + .PARAMETER BoundParameterList + The parameters that should be evaluated against the mutually exclusive + lists MutuallyExclusiveList1 and MutuallyExclusiveList2. This parameter is + normally set to the $PSBoundParameters variable. + + .PARAMETER MutuallyExclusiveList1 + An array of parameter names that are not allowed to be bound at the + same time as those in MutuallyExclusiveList2. + + .PARAMETER MutuallyExclusiveList2 + An array of parameter names that are not allowed to be bound at the + same time as those in MutuallyExclusiveList1. + + .EXAMPLE + $assertBoundParameterParameters = @{ + BoundParameterList = $PSBoundParameters + MutuallyExclusiveList1 = @( + 'Parameter1' + ) + MutuallyExclusiveList2 = @( + 'Parameter2' + ) + } + + Assert-BoundParameter @assertBoundParameterParameters + + This example throws an exception if `$PSBoundParameters` contains both + the parameters `Parameter1` and `Parameter2`. +#> +function Assert-BoundParameter +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyCollection()] + [System.Collections.Hashtable] + $BoundParameterList, + + [Parameter(Mandatory = $true)] + [System.String[]] + $MutuallyExclusiveList1, + + [Parameter(Mandatory = $true)] + [System.String[]] + $MutuallyExclusiveList2 + ) + + $itemFoundFromList1 = $BoundParameterList.Keys.Where({ $_ -in $MutuallyExclusiveList1 }) + $itemFoundFromList2 = $BoundParameterList.Keys.Where({ $_ -in $MutuallyExclusiveList2 }) + + if ($itemFoundFromList1.Count -gt 0 -and $itemFoundFromList2.Count -gt 0) + { + $errorMessage = ` + $script:localizedData.ParameterUsageWrong ` + -f ($MutuallyExclusiveList1 -join "','"), ($MutuallyExclusiveList2 -join "','") + + New-InvalidArgumentException -ArgumentName 'Parameters' -Message $errorMessage + } +} +#EndRegion './Public/Assert-BoundParameter.ps1' 69 +#Region './Public/Assert-IPAddress.ps1' 0 +<# + .SYNOPSIS + Asserts that the specified IP address is valid. + + .DESCRIPTION + Checks the IP address so that it is valid and do not conflict with address + family. If any problems are detected an exception will be thrown. + + .PARAMETER AddressFamily + IP address family that the supplied Address should be in. Valid values are + 'IPv4' or 'IPv6'. + + .PARAMETER Address + Specifies an IPv4 or IPv6 address. + + .EXAMPLE + Assert-IPAddress -Address '127.0.0.1' + + This will assert that the supplied address is a valid IPv4 address. + If it is not an exception will be thrown. + + .EXAMPLE + Assert-IPAddress -Address 'fe80:ab04:30F5:002b::1' + + This will assert that the supplied address is a valid IPv6 address. + If it is not an exception will be thrown. + + .EXAMPLE + Assert-IPAddress -Address 'fe80:ab04:30F5:002b::1' -AddressFamily 'IPv6' + + This will assert that address is valid and that it matches the + supplied address family. If the supplied address family does not match + the address an exception will be thrown. +#> +function Assert-IPAddress +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Address + ) + + [System.Net.IPAddress] $ipAddress = $null + + if (-not ([System.Net.IPAddress]::TryParse($Address, [ref] $ipAddress))) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressFormatError -f $Address) ` + -ArgumentName 'Address' + } + + if ($AddressFamily) + { + switch ($AddressFamily) + { + 'IPv4' + { + if ($ipAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork.ToString()) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressIPv6MismatchError -f $Address, $AddressFamily) ` + -ArgumentName 'AddressFamily' + } + } + + 'IPv6' + { + if ($ipAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetworkV6.ToString()) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressIPv4MismatchError -f $Address, $AddressFamily) ` + -ArgumentName 'AddressFamily' + } + } + } + } +} +#EndRegion './Public/Assert-IPAddress.ps1' 85 +#Region './Public/Assert-Module.ps1' 0 +<# + .SYNOPSIS + Assert if the specific module is available to be imported. + + .DESCRIPTION + Assert if the specific module is available to be imported. + + .PARAMETER ModuleName + Specifies the name of the module to assert. + + .PARAMETER ImportModule + Specfiies to import the module if it is asserted. + + .EXAMPLE + Assert-Module -ModuleName 'DhcpServer' + + This asserts that the module DhcpServer is available on the system. +#> +function Assert-Module +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ModuleName, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ImportModule + ) + + if (-not (Get-Module -Name $ModuleName -ListAvailable)) + { + $errorMessage = $script:localizedData.ModuleNotFound -f $ModuleName + New-ObjectNotFoundException -Message $errorMessage + } + + if ($ImportModule) + { + Import-Module -Name $ModuleName + } +} +#EndRegion './Public/Assert-Module.ps1' 43 +#Region './Public/Compare-ResourcePropertyState.ps1' 0 +<# + .SYNOPSIS + Compare current and desired property values for any DSC resource. + + .DESCRIPTION + This function is used to compare current and desired property values for any + DSC resource, and return a hashtable with the metadata from the comparison. + + .PARAMETER CurrentValues + The current values that should be compared to to desired values. Normally + the values returned from Get-TargetResource. + + .PARAMETER DesiredValues + The values set in the configuration and is provided in the call to the + functions *-TargetResource, and that will be compared against current + values. Normally set to $PSBoundParameters. + + .PARAMETER Properties + An array of property names, from the keys provided in DesiredValues, that + will be compared. If this parameter is left out, all the keys in the + DesiredValues will be compared. + + .PARAMETER IgnoreProperties + An array of property names, from the keys provided in DesiredValues, that + will be ignored in the comparison. If this parameter is left out, all the + keys in the DesiredValues will be compared. + + .PARAMETER CimInstanceKeyProperties + A hashtable containing a key for each property that contain a collection + of CimInstances and the value is an array of strings of the CimInstance + key properties. + @{ + Permission = @('State') + } + + .EXAMPLE + $compareTargetResourceStateParameters = @{ + CurrentValues = (Get-TargetResource $PSBoundParameters) + DesiredValues = $PSBoundParameters + } + + $propertyState = Compare-ResourcePropertyState @compareTargetResourceStateParameters + + This examples call Compare-ResourcePropertyState with the current state + and the desired state and returns a hashtable array of all the properties + that was evaluated based on the properties pass in the parameter DesiredValues. +#> +function Compare-ResourcePropertyState +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $DesiredValues, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Properties, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $IgnoreProperties, + + [Parameter()] + [ValidateNotNull()] + [System.Collections.Hashtable] + $CimInstanceKeyProperties = @{} + ) + + if ($PSBoundParameters.ContainsKey('Properties')) + { + # Filter out the parameters (keys) not specified in Properties + $desiredValuesToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -notin $Properties + } + + $desiredValuesToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + else + { + <# + Remove any common parameters that might be part of DesiredValues, + if it $PSBoundParameters was used to pass the desired values. + #> + $commonParametersToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -in [System.Management.Automation.PSCmdlet]::CommonParameters ` + -or $_ -in [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + } + + $commonParametersToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + + # Remove any properties that should be ignored. + if ($PSBoundParameters.ContainsKey('IgnoreProperties')) + { + $IgnoreProperties | + ForEach-Object -Process { + if ($DesiredValues.ContainsKey($_)) + { + $DesiredValues.Remove($_) + } + } + } + + $compareTargetResourceStateReturnValue = @() + + foreach ($parameterName in $DesiredValues.Keys) + { + Write-Debug -Message ($script:localizedData.EvaluatePropertyState -f $parameterName) + + $parameterState = @{ + ParameterName = $parameterName + Expected = $DesiredValues.$parameterName + Actual = $CurrentValues.$parameterName + } + + # Check if the parameter is in compliance. + $isPropertyInDesiredState = Test-DscPropertyState -Values @{ + CurrentValue = $CurrentValues.$parameterName + DesiredValue = $DesiredValues.$parameterName + KeyProperties = $CimInstanceKeyProperties.$parameterName + } + + if ($isPropertyInDesiredState) + { + Write-Verbose -Message ($script:localizedData.PropertyInDesiredState -f $parameterName) + + $parameterState['InDesiredState'] = $true + } + else + { + Write-Verbose -Message ($script:localizedData.PropertyNotInDesiredState -f $parameterName) + + $parameterState['InDesiredState'] = $false + } + + $compareTargetResourceStateReturnValue += $parameterState + } + + return $compareTargetResourceStateReturnValue +} +#EndRegion './Public/Compare-ResourcePropertyState.ps1' 157 +#Region './Public/ConvertTo-CimInstance.ps1' 0 +<# + .SYNOPSIS + Converts a hashtable into a CimInstance array. + + .DESCRIPTION + This function is used to convert a hashtable into MSFT_KeyValuePair objects. + These are stored as an CimInstance array. DSC cannot handle hashtables but + CimInstances arrays storing MSFT_KeyValuePair. + + .PARAMETER Hashtable + A hashtable with the values to convert. + + .OUTPUTS + An object array with CimInstance objects. + + .EXAMPLE + ConvertTo-CimInstance -Hashtable @{ + String = 'a string' + Bool = $true + Int = 99 + Array = 'a, b, c' + } + + This example returns an CimInstance with the provided hashtable values. +#> +function ConvertTo-CimInstance +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Hashtable')] + [System.Collections.Hashtable] + $Hashtable + ) + + process + { + foreach ($item in $Hashtable.GetEnumerator()) + { + New-CimInstance -ClassName 'MSFT_KeyValuePair' -Namespace 'root/microsoft/Windows/DesiredStateConfiguration' -Property @{ + Key = $item.Key + Value = if ($item.Value -is [array]) + { + $item.Value -join ',' + } + else + { + $item.Value + } + } -ClientOnly + } + } +} +#EndRegion './Public/ConvertTo-CimInstance.ps1' 54 +#Region './Public/ConvertTo-HashTable.ps1' 0 +<# + .SYNOPSIS + Converts CimInstances into a hashtable. + + .DESCRIPTION + This function is used to convert a CimInstance array containing + MSFT_KeyValuePair objects into a hashtable. + + .PARAMETER CimInstance + An array of CimInstances or a single CimInstance object to convert. + + .OUTPUTS + Hashtable + + .EXAMPLE + $newInstanceParameters = @{ + ClassName = 'MSFT_KeyValuePair' + Namespace = 'root/microsoft/Windows/DesiredStateConfiguration' + ClientOnly = $true + } + + $cimInstance = [Microsoft.Management.Infrastructure.CimInstance[]] ( + (New-CimInstance @newInstanceParameters -Property @{ + Key = 'FirstName' + Value = 'John' + }), + + (New-CimInstance @newInstanceParameters -Property @{ + Key = 'LastName' + Value = 'Smith' + }) + ) + + ConvertTo-HashTable -CimInstance $cimInstance + + This creates a array om CimInstances of the class name MSFT_KeyValuePair + and passes it to ConvertTo-HashTable which returns a hashtable. +#> +function ConvertTo-HashTable +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'CimInstance')] + [AllowEmptyCollection()] + [Microsoft.Management.Infrastructure.CimInstance[]] + $CimInstance + ) + + begin + { + $result = @{ } + } + + process + { + foreach ($ci in $CimInstance) + { + $result.Add($ci.Key, $ci.Value) + } + } + + end + { + $result + } +} +#EndRegion './Public/ConvertTo-HashTable.ps1' 68 +#Region './Public/Get-LocalizedData.ps1' 0 +<# + .SYNOPSIS + Gets language-specific data into scripts and functions based on the UI culture + that is selected for the operating system. + Similar to Import-LocalizedData, with extra parameter 'DefaultUICulture'. + + .DESCRIPTION + The Get-LocalizedData cmdlet dynamically retrieves strings from a subdirectory + whose name matches the UI language set for the current user of the operating system. + It is designed to enable scripts to display user messages in the UI language selected + by the current user. + + Get-LocalizedData imports data from .psd1 files in language-specific subdirectories + of the script directory and saves them in a local variable that is specified in the + command. The cmdlet selects the subdirectory and file based on the value of the + $PSUICulture automatic variable. When you use the local variable in the script to + display a user message, the message appears in the user's UI language. + + You can use the parameters of G-LocalizedData to specify an alternate UI culture, + path, and file name, to add supported commands, and to suppress the error message that + appears if the .psd1 files are not found. + + The G-LocalizedData cmdlet supports the script internationalization + initiative that was introduced in Windows PowerShell 2.0. This initiative + aims to better serve users worldwide by making it easy for scripts to display + user messages in the UI language of the current user. For more information + about this and about the format of the .psd1 files, see about_Script_Internationalization. + + .PARAMETER BindingVariable + Specifies the variable into which the text strings are imported. Enter a variable + name without a dollar sign ($). + + In Windows PowerShell 2.0, this parameter is required. In Windows PowerShell 3.0, + this parameter is optional. If you omit this parameter, Import-LocalizedData + returns a hash table of the text strings. The hash table is passed down the pipeline + or displayed at the command line. + + When using Import-LocalizedData to replace default text strings specified in the + DATA section of a script, assign the DATA section to a variable and enter the name + of the DATA section variable in the value of the BindingVariable parameter. Then, + when Import-LocalizedData saves the imported content in the BindingVariable, the + imported data will replace the default text strings. If you are not specifying + default text strings, you can select any variable name. + + .PARAMETER UICulture + Specifies an alternate UI culture. The default is the value of the $PsUICulture + automatic variable. Enter a UI culture in - format, such as + en-US, de-DE, or ar-SA. + + The value of the UICulture parameter determines the language-specific subdirectory + (within the base directory) from which Import-LocalizedData gets the .psd1 file + for the script. + + The cmdlet searches for a subdirectory with the same name as the value of the + UICulture parameter or the $PsUICulture automatic variable, such as de-DE or + ar-SA. If it cannot find the directory, or the directory does not contain a .psd1 + file for the script, it searches for a subdirectory with the name of the language + code, such as de or ar. If it cannot find the subdirectory or .psd1 file, the + command fails and the data is displayed in the default language specified in the + script. + + .PARAMETER BaseDirectory + Specifies the base directory where the .psd1 files are located. The default is + the directory where the script is located. Import-LocalizedData searches for + the .psd1 file for the script in a language-specific subdirectory of the base + directory. + + .PARAMETER FileName + Specifies the name of the data file (.psd1) to be imported. Enter a file name. + You can specify a file name that does not include its .psd1 file name extension, + or you can specify the file name including the .psd1 file name extension. + + The FileName parameter is required when Import-LocalizedData is not used in a + script. Otherwise, the parameter is optional and the default value is the base + name of the script. You can use this parameter to direct Import-LocalizedData + to search for a different .psd1 file. + + For example, if the FileName is omitted and the script name is FindFiles.ps1, + Import-LocalizedData searches for the FindFiles.psd1 data file. + + .PARAMETER SupportedCommand + Specifies cmdlets and functions that generate only data. + + Use this parameter to include cmdlets and functions that you have written or + tested. For more information, see about_Script_Internationalization. + + .PARAMETER DefaultUICulture + Specifies which UICulture to default to if current UI culture or its parents + culture don't have matching data file. + + For example, if you have a data file in 'en-US' but not in 'en' or 'en-GB' and + your current culture is 'en-GB', you can default back to 'en-US'. + + .NOTES + Before using Import-LocalizedData, localize your user messages. Format the messages + for each locale (UI culture) in a hash table of key/value pairs, and save the + hash table in a file with the same name as the script and a .psd1 file name extension. + Create a directory under the script directory for each supported UI culture, and + then save the .psd1 file for each UI culture in the directory with the UI + culture name. + + For example, localize your user messages for the de-DE locale and format them in + a hash table. Save the hash table in a .psd1 file. Then create a de-DE + subdirectory under the script directory, and save the de-DE .psd1 + file in the de-DE subdirectory. Repeat this method for each locale that you support. + + Import-LocalizedData performs a structured search for the localized user + messages for a script. + + Import-LocalizedData begins the search in the directory where the script file + is located (or the value of the BaseDirectory parameter). It then searches within + the base directory for a subdirectory with the same name as the value of the + $PsUICulture variable (or the value of the UICulture parameter), such as de-DE or + ar-SA. Then, it searches in that subdirectory for a .psd1 file with the same name + as the script (or the value of the FileName parameter). + + If Import-LocalizedData cannot find a subdirectory with the name of the UI culture, + or the subdirectory does not contain a .psd1 file for the script, it searches for + a .psd1 file for the script in a subdirectory with the name of the language code, + such as de or ar. If it cannot find the subdirectory or .psd1 file, the command + fails, the data is displayed in the default language in the script, and an error + message is displayed explaining that the data could not be imported. To suppress + the message and fail gracefully, use the ErrorAction common parameter with a value + of SilentlyContinue. + + If Import-LocalizedData finds the subdirectory and the .psd1 file, it imports the + hash table of user messages into the value of the BindingVariable parameter in the + command. Then, when you display a message from the hash table in the variable, the + localized message is displayed. + + For more information, see about_Script_Internationalization. + + .EXAMPLE + $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + This is an example that can be used in DSC resources to import the + localized strings and if the current UI culture localized folder does + not exist the UI culture 'en-US' is returned. +#> +function Get-LocalizedData +{ + [CmdletBinding(DefaultParameterSetName = 'DefaultUICulture')] + param + ( + [Parameter(Position = 0)] + [Alias('Variable')] + [ValidateNotNullOrEmpty()] + [System.String] + $BindingVariable, + + [Parameter(Position = 1, ParameterSetName = 'TargetedUICulture')] + [System.String] + $UICulture, + + [Parameter()] + [System.String] + $BaseDirectory, + + [Parameter()] + [System.String] + $FileName, + + [Parameter()] + [System.String[]] + $SupportedCommand, + + [Parameter(Position = 1, ParameterSetName = 'DefaultUICulture')] + [System.String] + $DefaultUICulture = 'en-US' + ) + + begin + { + <# + Because Proxy Command changes the Invocation origin, we need to be explicit + when handing the pipeline back to original command. + #> + if (!$PSBoundParameters.ContainsKey('FileName')) + { + if ($myInvocation.ScriptName) + { + $file = [System.IO.FileInfo] $myInvocation.ScriptName + } + else + { + $file = [System.IO.FileInfo] $myInvocation.MyCommand.Module.Path + } + + $FileName = $file.BaseName + + $PSBoundParameters.Add('FileName', $file.Name) + } + + if ($PSBoundParameters.ContainsKey('BaseDirectory')) + { + $callingScriptRoot = $BaseDirectory + } + else + { + $callingScriptRoot = $MyInvocation.PSScriptRoot + + $PSBoundParameters.Add('BaseDirectory', $callingScriptRoot) + } + + if ($PSBoundParameters.ContainsKey('DefaultUICulture') -and !$PSBoundParameters.ContainsKey('UICulture')) + { + <# + We don't want the resolution to eventually return the ModuleManifest + so we run the same GetFilePath() logic than here: + https://github.com/PowerShell/PowerShell/blob/master/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Import-LocalizedData.cs#L302-L333 + and if we see it will return the wrong thing, set the UICulture to DefaultUI culture, and return the logic to Import-LocalizedData + #> + $currentCulture = Get-UICulture + + $evaluateDefaultCulture = $true + + <# + If the LCID is 127 then use default UI culture instead. + + See more information in issue https://github.com/dsccommunity/DscResource.Common/issues/11. + #> + if ($currentCulture.LCID -eq 127) + { + $currentCulture = New-Object -TypeName 'System.Globalization.CultureInfo' -ArgumentList @($DefaultUICulture) + $PSBoundParameters['UICulture'] = $DefaultUICulture + + $evaluateDefaultCulture = $false + } + + $languageFile = $null + + $localizedFileNames = @( + $FileName + '.psd1' + $FileName + '.strings.psd1' + ) + + while ($null -ne $currentCulture -and $currentCulture.Name -and -not $languageFile) + { + foreach ($fullFileName in $localizedFileNames) + { + $filePath = [System.IO.Path]::Combine($callingScriptRoot, $CurrentCulture.Name, $fullFileName) + + if (Test-Path -Path $filePath) + { + Write-Debug -Message "Found $filePath" + + $languageFile = $filePath + + # Set the filename to the file we found. + $PSBoundParameters['FileName'] = $fullFileName + + # Exit loop if we find the first filename. + break + } + else + { + Write-Debug -Message "File $filePath not found" + } + } + + if (-not $languageFile) + { + <# + Evaluate the parent culture if there is one. + + If the parent culture is LCID 127 then move to the default culture. + See more information in issue https://github.com/dsccommunity/DscResource.Common/issues/11. + #> + if ($currentCulture.Parent -and $currentCulture.Parent.LCID -ne 127) + { + $currentCulture = $currentCulture.Parent + } + else + { + if ($evaluateDefaultCulture) + { + $evaluateDefaultCulture = $false + + <# + Could not find localized strings file for the the operating + system UI culture. Evaluating the default UI culture (which + defaults to 'en-US' if not specifically set). + #> + $currentCulture = New-Object -TypeName 'System.Globalization.CultureInfo' -ArgumentList @($DefaultUICulture) + $PSBoundParameters['UICulture'] = $DefaultUICulture + } + else + { + <# + Already evaluated everything we could, exit and let + Import-LocalizedData throw an exception. + #> + break + } + } + } + } + + <# + Removes the parameter DefaultUICulture so that isn't used when + calling Import-LocalizedData. + #> + $null = $PSBoundParameters.Remove('DefaultUICulture') + } + + try + { + $outBuffer = $null + + if ($PSBoundParameters.TryGetValue('OutBuffer', [ref] $outBuffer)) + { + $PSBoundParameters['OutBuffer'] = 1 + } + + $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Import-LocalizedData', [System.Management.Automation.CommandTypes]::Cmdlet) + $scriptCmd = { & $wrappedCmd @PSBoundParameters } + + $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) + $steppablePipeline.Begin($PSCmdlet) + } + catch + { + throw + } + } + + process + { + try + { + $steppablePipeline.Process($_) + } + catch + { + throw + } + } + + end + { + if ($BindingVariable -and ($valueToBind = Get-Variable -Name $BindingVariable -ValueOnly -ErrorAction 'Ignore')) + { + # Bringing the variable to the parent scope + Set-Variable -Scope 1 -Name $BindingVariable -Force -ErrorAction 'SilentlyContinue' -Value $valueToBind + } + + try + { + $steppablePipeline.End() + } + catch + { + throw + } + } +} +#EndRegion './Public/Get-LocalizedData.ps1' 356 +#Region './Public/Get-TemporaryFolder.ps1' 0 +<# + .SYNOPSIS + Returns the path of the current user's temporary folder. + + .DESCRIPTION + Returns the path of the current user's temporary folder. + + .NOTES + This is the same as doing the following + - Windows: $env:TEMP + - macOS: $env:TMPDIR + - Linux: /tmp/ + + .EXAMPLE + Get-TemporaryFolder + + Returns the current user temporary folder on the current operating system. +#> +function Get-TemporaryFolder +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + return [IO.Path]::GetTempPath() +} +#EndRegion './Public/Get-TemporaryFolder.ps1' 26 +#Region './Public/New-InvalidArgumentException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid argument exception. + + .DESCRIPTION + Creates and throws an invalid argument exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ArgumentName + The name of the invalid argument that is causing this error to be thrown. + + .EXAMPLE + $errorMessage = $script:localizedData.ActionCannotBeUsedInThisContextMessage ` + -f $Action, $Parameter + + New-InvalidArgumentException -ArgumentName 'Action' -Message $errorMessage +#> +function New-InvalidArgumentException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArgumentName + ) + + $argumentException = New-Object -TypeName 'ArgumentException' ` + -ArgumentList @($Message, $ArgumentName) + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @($argumentException, $ArgumentName, 'InvalidArgument', $null) + } + + $errorRecord = New-Object @newObjectParameters + + throw $errorRecord +} +#EndRegion './Public/New-InvalidArgumentException.ps1' 48 +#Region './Public/New-InvalidDataException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid data exception. + + .DESCRIPTION + Creates and throws an invalid data exception. + + .PARAMETER ErrorId + The error Id to assign to the exception. + + .PARAMETER ErrorMessage + The error message to assign to the exception. + + .EXAMPLE + if ( -not $resultOfEvaluation ) + { + $errorMessage = $script:localizedData.InvalidData -f $Action + + New-InvalidDataException -ErrorId 'InvalidDataError' -ErrorMessage $errorMessage + } +#> +function New-InvalidDataException +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage + ) + + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidData + $exception = New-Object ` + -TypeName System.InvalidOperationException ` + -ArgumentList $ErrorMessage + $errorRecord = New-Object ` + -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + + throw $errorRecord +} +#EndRegion './Public/New-InvalidDataException.ps1' 46 +#Region './Public/New-InvalidOperationException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid operation exception. + + .DESCRIPTION + Creates and throws an invalid operation exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + Start-Process @startProcessArguments + } + catch + { + $errorMessage = $script:localizedData.InstallationFailedMessage -f $Path, $processId + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-InvalidOperationException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'InvalidOperation', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-InvalidOperationException.ps1' 66 +#Region './Public/New-InvalidResultException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid result exception. + + .DESCRIPTION + Creates and throws an invalid result exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + $numberOfObjects = Get-ChildItem -Path $path + if ($numberOfObjects -eq 0) + { + throw 'To few files.' + } + } + catch + { + $errorMessage = $script:localizedData.TooFewFilesMessage -f $path + New-InvalidResultException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-InvalidResultException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'InvalidResult', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-InvalidResultException.ps1' 70 +#Region './Public/New-NotImplementedException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an not implemented exception. + + .DESCRIPTION + Creates and throws an not implemented exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + if ($runFeature) + { + $errorMessage = $script:localizedData.FeatureMissing -f $path + New-NotImplementedException -Message $errorMessage -ErrorRecord $_ + } + + Throws an not implemented exception if the variable $runFeature contains + a value. +#> +function New-NotImplementedException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'NotImplemented', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-NotImplementedException.ps1' 65 +#Region './Public/New-ObjectNotFoundException.ps1' 0 + +<# + .SYNOPSIS + Creates and throws an object not found exception. + + .DESCRIPTION + Creates and throws an object not found exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + Get-ChildItem -Path $path + } + catch + { + $errorMessage = $script:localizedData.PathNotFoundMessage -f $path + New-ObjectNotFoundException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-ObjectNotFoundException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'ObjectNotFound', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-ObjectNotFoundException.ps1' 67 +#Region './Public/Remove-CommonParameter.ps1' 0 +<# + .SYNOPSIS + Removes common parameters from a hashtable. + + .DESCRIPTION + This function serves the purpose of removing common parameters and option + common parameters from a parameter hashtable. + + .PARAMETER Hashtable + The parameter hashtable that should be pruned. + + .EXAMPLE + Remove-CommonParameter -Hashtable $PSBoundParameters + + Returns a new hashtable without the common and optional common parameters. +#> +function Remove-CommonParameter +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', + '', + Justification = 'ShouldProcess is not supported in DSC resources.' + )] + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Hashtable + ) + + $inputClone = $Hashtable.Clone() + + $commonParameters = [System.Management.Automation.PSCmdlet]::CommonParameters + $commonParameters += [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + + $Hashtable.Keys | Where-Object -FilterScript { + $_ -in $commonParameters + } | ForEach-Object -Process { + $inputClone.Remove($_) + } + + return $inputClone +} +#EndRegion './Public/Remove-CommonParameter.ps1' 45 +#Region './Public/Set-DscMachineRebootRequired.ps1' 0 +<# + .SYNOPSIS + Set the DSC reboot required status variable. + + .DESCRIPTION + Sets the global DSCMachineStatus variable to a value of 1. + This function is used to set the global variable that indicates + to the LCM that a reboot of the node is required. + + .EXAMPLE + PS C:\> Set-DscMachineRebootRequired + + Sets the $global:DSCMachineStatus variable to 1. + + .NOTES + This function is implemented so that individual resource modules + do not need to use and therefore suppress Global variables + directly. It also enables mocking to increase testability of + consumers. +#> +function Set-DscMachineRebootRequired +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + # Suppressing this rule because $global:DSCMachineStatus is used to trigger a reboot. + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + <# + Suppressing this rule because $global:DSCMachineStatus is only set, + never used (by design of Desired State Configuration). + #> + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '')] + [CmdletBinding()] + param + ( + ) + + $global:DSCMachineStatus = 1 +} +#EndRegion './Public/Set-DscMachineRebootRequired.ps1' 37 +#Region './Public/Set-PSModulePath.ps1' 0 + +<# + .SYNOPSIS + Set environment variable PSModulePath in the current session or machine + wide. + + .DESCRIPTION + This is a wrapper to set environment variable PSModulePath in current + session or machine wide. + + .PARAMETER Path + A string with all the paths separated by semi-colons. + + .PARAMETER Machine + If set the PSModulePath will be changed machine wide. If not set, only + the current session will be changed. + + .EXAMPLE + Set-PSModulePath -Path ';' + + .EXAMPLE + Set-PSModulePath -Path ';' -Machine +#> +function Set-PSModulePath +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', + '', + Justification = 'ShouldProcess is not supported in DSC resources.' + )] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Machine + ) + + if ($Machine.IsPresent) + { + [System.Environment]::SetEnvironmentVariable('PSModulePath', $Path, [System.EnvironmentVariableTarget]::Machine) + } + else + { + $env:PSModulePath = $Path + } +} +#EndRegion './Public/Set-PSModulePath.ps1' 52 +#Region './Public/Test-DscParameterState.ps1' 0 +<# + .SYNOPSIS + This method is used to compare current and desired values for any DSC resource. + + .DESCRIPTION + This function tests the parameter status of DSC resource parameters against + the current values present on the system. + + .PARAMETER CurrentValues + A hashtable with the current values on the system, obtained by e.g. + Get-TargetResource. + + .PARAMETER DesiredValues + The hashtable of desired values. For example $PSBoundParameters with the + desired values. + + .PARAMETER Properties + This is a list of properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER ExcludeProperties + This is a list of which properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER TurnOffTypeChecking + Indicates that the type of the parameter should not be checked. + + .PARAMETER ReverseCheck + Indicates that a reverse check should be done. The current and desired state + are swapped for another test. + + .PARAMETER SortArrayValues + If the sorting of array values does not matter, values are sorted internally + before doing the comparison. + + .EXAMPLE + $currentState = Get-TargetResource @PSBoundParameters + + $returnValue = Test-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters + + The function Get-TargetResource is called first using all bound parameters + to get the values in the current state. The result is then compared to the + desired state by calling `Test-DscParameterState`. + + .EXAMPLE + $getTargetResourceParameters = @{ + ServerName = $ServerName + InstanceName = $InstanceName + Name = $Name + } + + $returnValue = Test-DscParameterState ` + -CurrentValues (Get-TargetResource @getTargetResourceParameters) ` + -DesiredValues $PSBoundParameters ` + -ExcludeProperties @( + 'FailsafeOperator' + 'NotificationMethod' + ) + + This compares the values in the current state against the desires state. + The function Get-TargetResource is called using just the required parameters + to get the values in the current state. The parameter 'ExcludeProperties' + is used to exclude the properties 'FailsafeOperator' and + 'NotificationMethod' from the comparison. + + .EXAMPLE + $getTargetResourceParameters = @{ + ServerName = $ServerName + InstanceName = $InstanceName + Name = $Name + } + + $returnValue = Test-DscParameterState ` + -CurrentValues (Get-TargetResource @getTargetResourceParameters) ` + -DesiredValues $PSBoundParameters ` + -Properties ServerName, Name + + This compares the values in the current state against the desires state. + The function Get-TargetResource is called using just the required parameters + to get the values in the current state. The 'Properties' parameter is used + to to only compare the properties 'ServerName' and 'Name'. +#> +function Test-DscParameterState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Object] + $DesiredValues, + + [Parameter()] + [System.String[]] + [Alias('ValuesToCheck')] + $Properties, + + [Parameter()] + [System.String[]] + $ExcludeProperties, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $TurnOffTypeChecking, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ReverseCheck, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $SortArrayValues + ) + + $returnValue = $true + + if ($CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $CurrentValues = ConvertTo-HashTable -CimInstance $CurrentValues + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $DesiredValues = ConvertTo-HashTable -CimInstance $DesiredValues + } + + $types = 'System.Management.Automation.PSBoundParametersDictionary', 'System.Collections.Hashtable', 'Microsoft.Management.Infrastructure.CimInstance' + + if ($DesiredValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidDesiredValuesError -f $DesiredValues.GetType().FullName) ` + -ArgumentName 'DesiredValues' + } + + if ($CurrentValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidCurrentValuesError -f $CurrentValues.GetType().FullName) ` + -ArgumentName 'CurrentValues' + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -and -not $Properties) + { + New-InvalidArgumentException ` + -Message $script:localizedData.InvalidPropertiesError ` + -ArgumentName Properties + } + + $desiredValuesClean = Remove-CommonParameter -Hashtable $DesiredValues + + if (-not $Properties) + { + $keyList = $desiredValuesClean.Keys + } + else + { + $keyList = $Properties + } + if ($ExcludeProperties) + { + $keyList = $keyList | Where-Object -FilterScript { $_ -notin $ExcludeProperties } + } + + foreach ($key in $keyList) + { + $desiredValue = $desiredValuesClean.$key + $currentValue = $CurrentValues.$key + + if ($desiredValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $desiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $desiredValue = ConvertTo-HashTable -CimInstance $desiredValue + } + if ($currentValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $currentValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $currentValue = ConvertTo-HashTable -CimInstance $currentValue + } + + if ($null -ne $desiredValue) + { + $desiredType = $desiredValue.GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($null -ne $currentValue) + { + $currentType = $currentValue.GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if ($currentType.Name -ne 'Unknown' -and $desiredType.Name -eq 'PSCredential') + { + # This is a credential object. Compare only the user name + if ($currentType.Name -eq 'PSCredential' -and $currentValue.UserName -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + continue + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + $returnValue = $false + } + + # Assume the string is our username when the matching desired value is actually a credential + if ($currentType.Name -eq 'string' -and $currentValue -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + continue + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + $returnValue = $false + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchTypeMismatchMessage -f $key, $currentType.FullName, $desiredType.FullName) + $returnValue = $false + continue + } + } + + if ($currentValue -eq $desiredValue -and -not $desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + continue + } + + if ($desiredValuesClean.GetType().Name -in 'HashTable', 'PSBoundParametersDictionary') + { + $checkDesiredValue = $desiredValuesClean.ContainsKey($key) + } + else + { + $checkDesiredValue = Test-DscObjectHasProperty -Object $desiredValuesClean -PropertyName $key + } + + if (-not $checkDesiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + continue + } + + if ($desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.TestDscParameterCompareMessage -f $key, $desiredType.FullName) + + if (-not $currentValue -and -not $desiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, 'empty array', 'empty array') + continue + } + elseif (-not $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + $returnValue = $false + continue + } + elseif ($currentValue.Count -ne $desiredValue.Count) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueDifferentCountMessage -f $desiredType.FullName, $key, $currentValue.Count, $desiredValue.Count) + $returnValue = $false + continue + } + else + { + $desiredArrayValues = $desiredValue + $currentArrayValues = $currentValue + + if ($SortArrayValues) + { + $desiredArrayValues = @($desiredArrayValues | Sort-Object) + $currentArrayValues = @($currentArrayValues | Sort-Object) + } + + for ($i = 0; $i -lt $desiredArrayValues.Count; $i++) + { + if ($desiredArrayValues[$i]) + { + $desiredType = $desiredArrayValues[$i].GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($currentArrayValues[$i]) + { + $currentType = $currentArrayValues[$i].GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementTypeMismatchMessage -f $key, $i, $currentType.FullName, $desiredType.FullName) + $returnValue = $false + continue + } + } + + #Convert a scriptblock into a string as scriptblocks are not comparable + $wasCurrentArrayValuesConverted = $false + if ($currentArrayValues[$i] -is [scriptblock]) + { + $currentArrayValues[$i] = if ($desiredArrayValues[$i] -is [string]) + { + $currentArrayValues[$i] = $currentArrayValues[$i].Invoke() + } + else + { + $currentArrayValues[$i].ToString() + } + $wasCurrentArrayValuesConverted = $true + } + if ($desiredArrayValues[$i] -is [scriptblock]) + { + $desiredArrayValues[$i] = if ($currentArrayValues[$i] -is [string] -and -not $wasCurrentArrayValuesConverted) + { + $desiredArrayValues[$i].Invoke() + } + else + { + $desiredArrayValues[$i].ToString() + } + } + + if ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentArrayValues[$i] + $param.DesiredValues = $desiredArrayValues[$i] + + if ($returnValue) + { + $returnValue = Test-DscParameterState @param + } + else + { + Test-DscParameterState @param | Out-Null + } + continue + } + + if ($desiredArrayValues[$i] -ne $currentArrayValues[$i]) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementValueMismatchMessage -f $i, $desiredType.FullName, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + $returnValue = $false + continue + } + else + { + Write-Verbose -Message ($script:localizedData.MatchElementValueMessage -f $i, $desiredType.FullName, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + continue + } + } + + } + } + elseif ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentValue + $param.DesiredValues = $desiredValue + + if ($returnValue) + { + $returnValue = Test-DscParameterState @param + } + else + { + Test-DscParameterState @param | Out-Null + } + continue + } + else + { + #Convert a scriptblock into a string as scriptblocks are not comparable + $wasCurrentValue = $false + if ($currentValue -is [scriptblock]) + { + $currentValue = if ($desiredValue -is [string]) + { + $currentValue = $currentValue.Invoke() + } + else + { + $currentValue.ToString() + } + $wasCurrentValue = $true + } + if ($desiredValue -is [scriptblock]) + { + $desiredValue = if ($currentValue -is [string] -and -not $wasCurrentValue) + { + $desiredValue.Invoke() + } + else + { + $desiredValue.ToString() + } + } + + if ($desiredValue -ne $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + $returnValue = $false + } + } + } + + if ($ReverseCheck) + { + Write-Verbose -Message $script:localizedData.StartingReverseCheck + $reverseCheckParameters = $PSBoundParameters + $reverseCheckParameters.CurrentValues = $DesiredValues + $reverseCheckParameters.DesiredValues = $CurrentValues + $null = $reverseCheckParameters.Remove('ReverseCheck') + + if ($returnValue) + { + $returnValue = Test-DscParameterState @reverseCheckParameters + } + else + { + $null = Test-DscParameterState @reverseCheckParameters + } + } + + Write-Verbose -Message ($script:localizedData.TestDscParameterResultMessage -f $returnValue) + return $returnValue +} +#EndRegion './Public/Test-DscParameterState.ps1' 464 +#Region './Public/Test-IsNanoServer.ps1' 0 +<# + .SYNOPSIS + Tests if the current OS is a Nano server. + + .DESCRIPTION + Tests if the current OS is a Nano server. + + .EXAMPLE + Test-IsNanoServer + + Returns $true if the current operating system is Nano Server, if not $false + is returned. +#> +function Test-IsNanoServer +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param () + + $productDatacenterNanoServer = 143 + $productStandardNanoServer = 144 + + $operatingSystemSKU = (Get-CimInstance -ClassName Win32_OperatingSystem).OperatingSystemSKU + + Write-Verbose -Message ($script:localizedData.TestIsNanoServerOperatingSystemSku -f $operatingSystemSKU) + + return ($operatingSystemSKU -in ($productDatacenterNanoServer, $productStandardNanoServer)) +} +#EndRegion './Public/Test-IsNanoServer.ps1' 28 +#Region './suffix.ps1' 0 +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' +#EndRegion './suffix.ps1' 1 diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 new file mode 100644 index 0000000..fd8440b --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 @@ -0,0 +1,37 @@ +# Localized English (en-US) strings. + +ConvertFrom-StringData @' + TestIsNanoServerOperatingSystemSku = OperatingSystemSKU {0} was returned by Win32_OperatingSystem when detecting if operating system is Nano Server. (DRC0008) + ModuleNotFound = Please ensure that the PowerShell module '{0}' is installed. (DRC0009) + ParameterUsageWrong = None of the parameter(s) '{0}' may be used at the same time as any of the parameter(s) '{1}'. (DRC0010) + AddressFormatError = Address '{0}' is not in the correct format. Please correct the Address parameter in the configuration and try again. (DRC0011) + AddressIPv4MismatchError = Address '{0}' is in IPv4 format, which does not match server address family {1}. Please correct either of them in the configuration and try again. (DRC0012) + AddressIPv6MismatchError = Address '{0}' is in IPv6 format, which does not match server address family {1}. Please correct either of them in the configuration and try again. (DRC0013) + InvalidDesiredValuesError = Property 'DesiredValues' in Test-DscParameterState must be either a Hashtable or CimInstance. Type detected was '{0}'. (DRC0014) + InvalidCurrentValuesError = Property 'CurrentValues' in Test-DscParameterState must be either a Hashtable, CimInstance, or CimIntance[]. Type detected was '{0}'. (DRC0015) + InvalidPropertiesError = If 'DesiredValues' is a CimInstance then property 'Properties' must contain a value. (DRC0016) + MatchPsCredentialUsernameMessage = MATCH: PSCredential username match. Current state is '{0}' and desired state is '{1}'. (DRC0017) + NoMatchPsCredentialUsernameMessage = NOTMATCH: PSCredential username mismatch. Current state is '{0}' and desired state is '{1}'. (DRC0018) + NoMatchTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type is '{1}' and desired type is '{2}'. (DRC0019) + MatchValueMessage = MATCH: Value (type '{0}') for property '{1}' does match. Current state is '{2}' and desired state is '{3}'. (DRC0020) + NoMatchValueMessage = NOTMATCH: Value (type '{0}') for property '{1}' does not match. Current state is '{2}' and desired state is '{3}'. (DRC0021) + NoMatchValueDifferentCountMessage = NOTMATCH: Value (type '{0}') for property '{1}' does have a different count. Current state count is '{2}' and desired state count is '{3}'. (DRC0022) + NoMatchElementTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type of element [{1}] is '{2}' and desired type is '{3}'. (DRC0023) + NoMatchElementValueMismatchMessage = NOTMATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. (DRC0024) + MatchElementValueMessage = MATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. (DRC0025) + TestDscParameterResultMessage = Test-DscParameter result is '{0}'. (DRC0026) + StartingReverseCheck = Starting with a reverse check. (DRC0027) + TestDscParameterCompareMessage = Comparing values in property '{0}'. (DRC0028) + TooManyCimInstances = More than one CIM instance was returned from the current state. (DRC0029) + TestingCimInstance = Testing CIM instance '{0}' with the key properties '{1}'. (DRC0030) + MissingCimInstance = The CIM instance '{0}' with the key properties '{1}' is missing. (DRC0031) + ArrayValueIsAbsent = The array value '{0}' is absent. (DRC0032) + ArrayValueIsPresent = The array value '{0}' is present. (DRC0033) + KeyPropertiesMissing = The hashtable passed to function Test-DscPropertyState is missing the key 'KeyProperties'. This must be set to the property names that makes each instance in the CIM instance collection unique. (DRC0034) + ArrayDoesNotMatch = One or more values in an array does not match the desired state. Details of the changes are below. (DRC0035) + PropertyValueOfTypeDoesNotMatch = {0} value does not match. Current value is '{1}', but expected the value '{2}'. (DRC0036) + UnableToCompareType = Unable to compare the type {0} as it is not handled by the Test-DscPropertyState cmdlet. (DRC0037) + EvaluatePropertyState = Evaluating the state of the property '{0}'. (DRC0038) + PropertyInDesiredState = The parameter '{0}' is in desired state. (DRC0039) + PropertyNotInDesiredState = The parameter '{0}' is not in desired state. (DRC0040) +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt new file mode 100644 index 0000000..2a99677 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt @@ -0,0 +1,26 @@ +TOPIC + about_DscResource.Common + +SHORT DESCRIPTION + Common functions used in DSC tesources. + +LONG DESCRIPTION + This module contains common functions that are used in DSC resources. + +EXAMPLES + PS C:\> Get-Command -Module DscResource.Common + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/DscResource.Common + +SEE ALSO + - https://github.com/dsccommunity/DscResource.Common + +KEYWORDS + DSC, Localization + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/NetworkingDsc.Common/NetworkingDsc.Common.psm1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/NetworkingDsc.Common/NetworkingDsc.Common.psm1 new file mode 100644 index 0000000..d9347fa --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/NetworkingDsc.Common/NetworkingDsc.Common.psm1 @@ -0,0 +1,582 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Converts any IP Addresses containing CIDR notation filters in an array to use Subnet Mask + notation. + + .PARAMETER Address + The array of addresses to that need to be converted. +#> +function Convert-CIDRToSubhetMask +{ + [CmdletBinding()] + [OutputType([ Microsoft.Management.Infrastructure.CimInstance])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Address + ) + + $results = @() + + foreach ($entry in $Address) + { + if (-not $entry.Contains(':') -and -not $entry.Contains('-')) + { + $entrySplit = $entry -split '/' + + if (-not [String]::IsNullOrEmpty($entrySplit[1])) + { + # There was a / so this contains a Subnet Mask or CIDR + $prefix = $entrySplit[0] + $postfix = $entrySplit[1] + + if ($postfix -match '^[0-9]*$') + { + # The postfix contains CIDR notation so convert this to Subnet Mask + $cidr = [System.Int32] $postfix + $subnetMaskInt64 = ([convert]::ToInt64(('1' * $cidr + '0' * (32 - $cidr)), 2)) + $subnetMask = @( + ([math]::Truncate($subnetMaskInt64 / 16777216)) + ([math]::Truncate(($subnetMaskInt64 % 16777216) / 65536)) + ([math]::Truncate(($subnetMaskInt64 % 65536) / 256)) + ([math]::Truncate($subnetMaskInt64 % 256)) + ) + } + else + { + $subnetMask = $postfix -split '\.' + } + + <# + Apply the Subnet Mast to the IP Address so that we end up with a correctly + masked IP Address that will match what the Firewall rule returns. + #> + $maskedIp = $prefix -split '\.' + + for ([System.Int32] $Octet = 0; $octet -lt 4; $octet++) + { + $maskedIp[$Octet] = $maskedIp[$octet] -band $SubnetMask[$octet] + } + + $entry = '{0}/{1}' -f ($maskedIp -join '.'), ($subnetMask -join '.') + } + } + + $results += $entry + } + + return $results +} # Convert-CIDRToSubhetMask + +<# + .SYNOPSIS + This function will find a network adapter based on the provided + search parameters. + + .PARAMETER Name + This is the name of network adapter to find. + + .PARAMETER PhysicalMediaType + This is the media type of the network adapter to find. + + .PARAMETER Status + This is the status of the network adapter to find. + + .PARAMETER MacAddress + This is the MAC address of the network adapter to find. + + .PARAMETER InterfaceDescription + This is the interface description of the network adapter to find. + + .PARAMETER InterfaceIndex + This is the interface index of the network adapter to find. + + .PARAMETER InterfaceGuid + This is the interface GUID of the network adapter to find. + + .PARAMETER DriverDescription + This is the driver description of the network adapter. + + .PARAMETER InterfaceNumber + This is the interface number of the network adapter if more than one + are returned by the parameters. + + .PARAMETER IgnoreMultipleMatchingAdapters + This switch will suppress an error occurring if more than one matching + adapter matches the parameters passed. +#> +function Find-NetworkAdapter +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter()] + [System.String] + $Name, + + [Parameter()] + [System.String] + $PhysicalMediaType, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [ValidateSet('Up', 'Disconnected', 'Disabled')] + [System.String] + $Status = 'Up', + + [Parameter()] + [System.String] + $MacAddress, + + [Parameter()] + [System.String] + $InterfaceDescription, + + [Parameter()] + [System.UInt32] + $InterfaceIndex, + + [Parameter()] + [System.String] + $InterfaceGuid, + + [Parameter()] + [System.String] + $DriverDescription, + + [Parameter()] + [System.UInt32] + $InterfaceNumber = 1, + + [Parameter()] + [System.Boolean] + $IgnoreMultipleMatchingAdapters = $false + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.FindingNetAdapterMessage) + ) -join '') + + $adapterFilters = @() + + if ($PSBoundParameters.ContainsKey('Name')) + { + $adapterFilters += @('($_.Name -eq $Name)') + } # if + + if ($PSBoundParameters.ContainsKey('PhysicalMediaType')) + { + $adapterFilters += @('($_.PhysicalMediaType -eq $PhysicalMediaType)') + } # if + + if ($PSBoundParameters.ContainsKey('Status')) + { + $adapterFilters += @('($_.Status -eq $Status)') + } # if + + if ($PSBoundParameters.ContainsKey('MacAddress')) + { + $adapterFilters += @('($_.MacAddress -eq $MacAddress)') + } # if + + if ($PSBoundParameters.ContainsKey('InterfaceDescription')) + { + $adapterFilters += @('($_.InterfaceDescription -eq $InterfaceDescription)') + } # if + + if ($PSBoundParameters.ContainsKey('InterfaceIndex')) + { + $adapterFilters += @('($_.InterfaceIndex -eq $InterfaceIndex)') + } # if + + if ($PSBoundParameters.ContainsKey('InterfaceGuid')) + { + $adapterFilters += @('($_.InterfaceGuid -eq $InterfaceGuid)') + } # if + + if ($PSBoundParameters.ContainsKey('DriverDescription')) + { + $adapterFilters += @('($_.DriverDescription -eq $DriverDescription)') + } # if + + if ($adapterFilters.Count -eq 0) + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.AllNetAdaptersFoundMessage) + ) -join '') + + $matchingAdapters = @(Get-NetAdapter) + } + else + { + # Join all the filters together + $adapterFilterScript = '(' + ($adapterFilters -join ' -and ') + ')' + $matchingAdapters = @(Get-NetAdapter | + Where-Object -FilterScript ([ScriptBlock]::Create($adapterFilterScript))) + } + + # Were any adapters found matching the criteria? + if ($matchingAdapters.Count -eq 0) + { + New-InvalidOperationException ` + -Message ($script:localizedData.NetAdapterNotFoundError) + + # Return a null so that ErrorAction SilentlyContinue works correctly + return $null + } + else + { + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.NetAdapterFoundMessage -f $matchingAdapters.Count) + ) -join '') + + if ($matchingAdapters.Count -gt 1) + { + if ($IgnoreMultipleMatchingAdapters) + { + # Was the number of matching adapters found matching the adapter number? + if (($InterfaceNumber -gt 1) -and ($InterfaceNumber -gt $matchingAdapters.Count)) + { + New-InvalidOperationException ` + -Message ($script:localizedData.InvalidNetAdapterNumberError ` + -f $matchingAdapters.Count, $InterfaceNumber) + + # Return a null so that ErrorAction SilentlyContinue works correctly + return $null + } # if + } + else + { + New-InvalidOperationException ` + -Message ($script:localizedData.MultipleMatchingNetAdapterFound ` + -f $matchingAdapters.Count) + + # Return a null so that ErrorAction SilentlyContinue works correctly + return $null + } # if + } # if + } # if + + # Identify the exact adapter from the adapters that match + $exactAdapter = $matchingAdapters[$InterfaceNumber - 1] + + $returnValue = [PSCustomObject] @{ + Name = $exactAdapter.Name + PhysicalMediaType = $exactAdapter.PhysicalMediaType + Status = $exactAdapter.Status + MacAddress = $exactAdapter.MacAddress + InterfaceDescription = $exactAdapter.InterfaceDescription + InterfaceIndex = $exactAdapter.InterfaceIndex + InterfaceGuid = $exactAdapter.InterfaceGuid + MatchingAdapterCount = $matchingAdapters.Count + } + + return $returnValue +} # Find-NetworkAdapter + +<# + .SYNOPSIS + Returns the DNS Client Server static address that are assigned to a network + adapter. This is required because Get-DnsClientServerAddress always returns + the currently assigned server addresses whether regardless if they were + assigned as static or by DHCP. + + The only way that could be found to do this is to query the registry. + + .PARAMETER InterfaceAlias + Alias of the network interface to get the static DNS Server addresses from. + + .PARAMETER AddressFamily + IP address family. +#> +function Get-DnsClientServerStaticAddress +{ + [CmdletBinding()] + [OutputType([System.String[]])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily + ) + + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.GettingDNSServerStaticAddressMessage) -f $AddressFamily, $InterfaceAlias + ) -join '') + + # Look up the interface Guid + $adapter = Get-NetAdapter ` + -InterfaceAlias $InterfaceAlias ` + -ErrorAction SilentlyContinue + + if (-not $adapter) + { + New-InvalidOperationException ` + -Message ($script:localizedData.InterfaceAliasNotFoundError ` + -f $InterfaceAlias) + + # Return null to support ErrorAction Silently Continue + return $null + } # if + + $interfaceGuid = $adapter.InterfaceGuid.ToLower() + + if ($AddressFamily -eq 'IPv4') + { + $interfaceRegKeyPath = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\$interfaceGuid\" + } + else + { + $interfaceRegKeyPath = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\Interfaces\$interfaceGuid\" + } # if + + $interfaceInformation = Get-ItemProperty ` + -Path $interfaceRegKeyPath ` + -ErrorAction SilentlyContinue + $nameServerAddressString = $interfaceInformation.NameServer + + # Are any statically assigned addresses for this adapter? + if ([System.String]::IsNullOrWhiteSpace($nameServerAddressString)) + { + # Static DNS Server addresses not found so return empty array + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DNSServerStaticAddressNotSetMessage) -f $AddressFamily, $InterfaceAlias + ) -join '') + + return $null + } + else + { + # Static DNS Server addresses found so split them into an array using comma + Write-Verbose -Message ( @("$($MyInvocation.MyCommand): " + $($script:localizedData.DNSServerStaticAddressFoundMessage) -f $AddressFamily, $InterfaceAlias, $nameServerAddressString + ) -join '') + + return @($nameServerAddressString -split ',') + } # if +} # Get-DnsClientServerStaticAddress + +<# + .SYNOPSIS + Returns the WINS Client Server static address that are assigned to a network + adapter. The CIM class Win32_NetworkAdapterConfiguration unfortunately only supports + the primary and secondary WINS server. The registry gives more flexibility. + + .PARAMETER InterfaceAlias + Alias of the network interface to get the static WINS Server addresses from. +#> +function Get-WinsClientServerStaticAddress +{ + [CmdletBinding()] + [OutputType([System.String[]])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias + ) + + Write-Verbose -Message ("$($MyInvocation.MyCommand): $($script:localizedData.GettingWinsServerStaticAddressMessage -f $InterfaceAlias)") + + # Look up the interface Guid + $adapter = Get-NetAdapter -InterfaceAlias $InterfaceAlias -ErrorAction SilentlyContinue + + if (-not $adapter) + { + New-InvalidOperationException -Message ($script:localizedData.InterfaceAliasNotFoundError -f $InterfaceAlias) + + # Return null to support ErrorAction Silently Continue + return $null + } + + $interfaceGuid = $adapter.InterfaceGuid.ToLower() + + $interfaceRegKeyPath = "HKLM:\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_$interfaceGuid\" + + $interfaceInformation = Get-ItemProperty -Path $interfaceRegKeyPath -ErrorAction SilentlyContinue + $nameServerAddressString = $interfaceInformation.NameServerList + + # Are any statically assigned addresses for this adapter? + if (-not $nameServerAddressString) + { + # Static DNS Server addresses not found so return empty array + Write-Verbose -Message ("$($MyInvocation.MyCommand): $($script:localizedData.WinsServerStaticAddressNotSetMessage -f $InterfaceAlias)") + return $null + } + else + { + # Static DNS Server addresses found so split them into an array using comma + Write-Verbose -Message ("$($MyInvocation.MyCommand): $($script:localizedData.WinsServerStaticAddressFoundMessage -f + $InterfaceAlias, ($nameServerAddressString -join ','))") + + return $nameServerAddressString + } +} # Get-WinsClientServerStaticAddress + +<# + .SYNOPSIS + Sets the WINS Client Server static address on a network adapter. The CIM class + Win32_NetworkAdapterConfiguration unfortunately only supports the primary and + secondary WINS server. The registry gives more flexibility. + + .PARAMETER InterfaceAlias + Alias of the network interface to set the static WINS Server addresses on. +#> +function Set-WinsClientServerStaticAddress +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $InterfaceAlias, + + [Parameter(Mandatory = $true)] + [AllowEmptyCollection()] + [System.String[]] + $Address + ) + + Write-Verbose -Message ("$($MyInvocation.MyCommand): $($script:localizedData.SettingWinsServerStaticAddressMessage -f $InterfaceAlias, ($Address -join ', '))") + + # Look up the interface Guid + $adapter = Get-NetAdapter -InterfaceAlias $InterfaceAlias -ErrorAction SilentlyContinue + + if (-not $adapter) + { + New-InvalidOperationException -Message ($script:localizedData.InterfaceAliasNotFoundError -f $InterfaceAlias) + } + + $interfaceGuid = $adapter.InterfaceGuid.ToLower() + + $interfaceRegKeyPath = "HKLM:\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_$interfaceGuid\" + + Set-ItemProperty -Path $interfaceRegKeyPath -Name NameServerList -Value $Address + +} # Set-WinsClientServerStaticAddress + +<# + .SYNOPSIS + Gets the IP Address prefix from a provided IP Address in CIDR notation. + + .PARAMETER IPAddress + IP Address to get prefix for, can be in CIDR notation. + + .PARAMETER AddressFamily + Address family for provided IP Address, defaults to IPv4. + +#> +function Get-IPAddressPrefix +{ + [cmdletbinding()] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipeline)] + [System.String[]] + $IPAddress, + + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily = 'IPv4' + ) + + process + { + foreach ($singleIP in $IPAddress) + { + $prefixLength = ($singleIP -split '/')[1] + + if (-not ($prefixLength) -and $AddressFamily -eq 'IPv4') + { + if ($singleIP.split('.')[0] -in (0..127)) + { + $prefixLength = 8 + } + elseif ($singleIP.split('.')[0] -in (128..191)) + { + $prefixLength = 16 + } + elseif ($singleIP.split('.')[0] -in (192..223)) + { + $prefixLength = 24 + } + } + elseif (-not ($prefixLength) -and $AddressFamily -eq 'IPv6') + { + $prefixLength = 64 + } + + [PSCustomObject]@{ + IPAddress = $singleIP.split('/')[0] + prefixLength = $prefixLength + } + } + } +} + +<# +.SYNOPSIS + Returns a filter string for the net adapter CIM instances. Wildcards supported. + +.PARAMETER InterfaceAlias + Specifies the alias of a network interface. Supports the use of '*' or '%'. +#> +function Format-Win32NetworkAdapterFilterByNetConnectionId +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $InterfaceAlias + ) + + if ($InterfaceAlias.Contains('*')) + { + $InterfaceAlias = $InterfaceAlias.Replace('*','%') + } + + if ($InterfaceAlias.Contains('%')) + { + $operator = ' LIKE ' + } + else + { + $operator = '=' + } + + $returnNetAdapaterFilter = 'NetConnectionID{0}"{1}"' -f $operator, $InterfaceAlias + + return $returnNetAdapaterFilter +} + +Export-ModuleMember -Function @( + 'Convert-CIDRToSubhetMask' + 'Find-NetworkAdapter' + 'Get-DnsClientServerStaticAddress' + 'Get-WinsClientServerStaticAddress' + 'Set-WinsClientServerStaticAddress' + 'Get-IPAddressPrefix' + 'Format-Win32NetworkAdapterFilterByNetConnectionId' +) diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/NetworkingDsc.Common/en-US/NetworkingDsc.Common.strings.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/NetworkingDsc.Common/en-US/NetworkingDsc.Common.strings.psd1 new file mode 100644 index 0000000..3c8b51d --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/Modules/NetworkingDsc.Common/en-US/NetworkingDsc.Common.strings.psd1 @@ -0,0 +1,16 @@ +ConvertFrom-StringData @' + FindingNetAdapterMessage = Finding network adapters matching the parameters. + AllNetAdaptersFoundMessage = Found all network adapters because no filter parameters provided. + NetAdapterFoundMessage = {0} network adapters were found matching the parameters. + NetAdapterNotFoundError = A network adapter matching the parameters was not found. Please correct the properties and try again. + InterfaceAliasNotFoundError = A network adapter with the alias '{0}' could not be found. + MultipleMatchingNetAdapterFound = Please adjust the parameters or specify IgnoreMultipleMatchingAdapters to only use the first and try again. + InvalidNetAdapterNumberError = network adapter interface number {0} was specified but only {1} was found. Please correct the interface number and try again. + GettingDNSServerStaticAddressMessage = Getting staticly assigned DNS server {0} address for interface alias '{1}'. + GettingWinsServerStaticAddressMessage = Getting staticly assigned WINS server address for interface alias '{0}'. + SettingWinsServerStaticAddressMessage = Setting staticly assigned WINS server address for interface alias '{0}' to '{1}'. + DNSServerStaticAddressNotSetMessage = Statically assigned DNS server {0} address for interface alias '{1}' is not set. + WinsServerStaticAddressNotSetMessage = Statically assigned WINS server address for interface alias '{0}' is not set. + DNSServerStaticAddressFoundMessage = Statically assigned DNS server {0} address for interface alias '{1}' is '{2}'. + WinsServerStaticAddressFoundMessage = Statically assigned WINS server address for interface alias '{0}' is '{1}'. +'@ diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/NetworkingDsc.psd1 b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/NetworkingDsc.psd1 new file mode 100644 index 0000000..9928ca0 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/NetworkingDsc.psd1 @@ -0,0 +1,114 @@ +@{ + # Version number of this module. + moduleVersion = '8.2.0' + + # ID used to uniquely identify this module + GUID = 'e6647cc3-ce9c-4c86-9eb8-2ee8919bf358' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'DSC resources for configuring settings related to networking.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' + + # Minimum version of the common language runtime (CLR) required by this module + CLRVersion = '4.0' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @() + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # DSC resources to export from this module + DscResourcesToExport = @( + 'DefaultGatewayAddress', + 'DnsClientGlobalSetting', + 'DnsConnectionSuffix', + 'DNSServerAddress', + 'Firewall', + 'FirewallProfile', + 'HostsFile', + 'IPAddress', + 'IPAddressOption', + 'NetAdapterAdvancedProperty', + 'NetAdapterBinding', + 'NetAdapterLso', + 'NetAdapterName', + 'NetAdapterRDMA', + 'NetAdapterRsc', + 'NetAdapterRss', + 'NetAdapterState', + 'NetBIOS', + 'NetConnectionProfile', + 'NetIPInterface', + 'NetworkTeam', + 'NetworkTeamInterface', + 'ProxySettings', + 'Route', + 'WINSSetting' + ) + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/NetworkingDsc/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/NetworkingDsc' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [8.2.0] - 2020-10-16 + +### Changed + +- IPAddress + - Improved integration test structure. + +### Added + +- NetIPInterface + - Added `InterfaceMetric` parameter- fixes [Issue #473](https://github.com/PowerShell/xNetworking/issues/473). + +### Fixed + +- NetIPInterface + - Fix ''type mismatch for property'' issue when setting ''AdvertiseDefaultRoute'', + ''Advertising'', ''AutomaticMetric'', ''Dhcp'', ''DirectedMacWolPattern'', ''EcnMarking'', + ''ForceArpNdWolPattern'', ''Forwarding'', ''IgnoreDefaultRoutes'', ''ManagedAddressConfiguration'', + ''NeighborUnreachabilityDetection'', ''OtherStatefulConfiguration'', ''RouterDiscovery'', + ''WeakHostReceive'' or ''WeakHostSend'' - Fixes [Issue #470](https://github.com/dsccommunity/NetworkingDsc/issues/470). + +' + } # End of PSData hashtable + } # End of PrivateData hashtable +} + + + diff --git a/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/en-US/about_NetworkingDsc.help.txt b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/en-US/about_NetworkingDsc.help.txt new file mode 100644 index 0000000..d847656 --- /dev/null +++ b/deployment/dsc/azshcihost/NetworkingDsc/8.2.0/en-US/about_NetworkingDsc.help.txt @@ -0,0 +1,29 @@ +TOPIC + about_NetworkingDsc + +SHORT DESCRIPTION + DSC resources for configuring common operating systems features, files and + settings. + +LONG DESCRIPTION + This module contains DSC resources for configuring common operating systems + features, files and settings. + +EXAMPLES + PS C:\> Get-DscResource -Module NetworkingDsc + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/NetworkingDsc + +SEE ALSO + - https://github.com/dsccommunity/NetworkingDsc + +KEYWORDS + DSC, DscResource, Archive, Environment, Group, MSI, Package, File, + RemoteFile, Registry, Script, Service, User, + WindowsFeature, WindowsOptionalFeature, WindowsPackageCab, WindowsProcess diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/DSC_Disk.psm1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/DSC_Disk.psm1 new file mode 100644 index 0000000..fc1ec50 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/DSC_Disk.psm1 @@ -0,0 +1,923 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Storage Common Module. +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'StorageDsc.Common' ` + -ChildPath 'StorageDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings. +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the Disk and Partition. + + .PARAMETER DriveLetter + Specifies the preferred letter to assign to the disk volume. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to modify. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER PartitionStyle + Specifies the partition style of the disk. Defaults to GPT. + This parameter is not used in Get-TargetResource. + + .PARAMETER Size + Specifies the size of new volume (use all available space on disk if not provided). + This parameter is not used in Get-TargetResource. + + .PARAMETER FSLabel + Specifies the volume label to assign to the volume. + This parameter is not used in Get-TargetResource. + + .PARAMETER AllocationUnitSize + Specifies the allocation unit size to use when formatting the volume. + This parameter is not used in Get-TargetResource. + + .PARAMETER FSFormat + Specifies the file system format of the new volume. + This parameter is not used in Get-TargetResource. + + .PARAMETER AllowDestructive + Specifies if potentially destructive operations may occur. + This parameter is not used in Get-TargetResource. + + .PARAMETER ClearDisk + Specifies if the disks partition schema should be removed entirely, even if data and OEM + partitions are present. Only possible with AllowDestructive enabled. + This parameter is not used in Get-TargetResource. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DriveLetter, + + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number', 'UniqueId', 'Guid', 'Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [ValidateSet('GPT', 'MBR')] + [System.String] + $PartitionStyle = 'GPT', + + [Parameter()] + [System.UInt64] + $Size, + + [Parameter()] + [System.String] + $FSLabel, + + [Parameter()] + [System.UInt32] + $AllocationUnitSize, + + [Parameter()] + [ValidateSet('NTFS', 'ReFS')] + [System.String] + $FSFormat = 'NTFS', + + [Parameter()] + [System.Boolean] + $AllowDestructive, + + [Parameter()] + [System.Boolean] + $ClearDisk + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingDiskMessage -f $DiskIdType, $DiskId, $DriveLetter) + ) -join '' ) + + # Validate the DriveLetter parameter + $DriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + # Get the Disk using the identifiers supplied + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + + $partition = Get-Partition ` + -DriveLetter $DriveLetter ` + -ErrorAction SilentlyContinue | Select-Object -First 1 + + $volume = Get-Volume ` + -DriveLetter $DriveLetter ` + -ErrorAction SilentlyContinue + + $blockSize = (Get-CimInstance ` + -Query "SELECT BlockSize from Win32_Volume WHERE DriveLetter = '$($DriveLetter):'" ` + -ErrorAction SilentlyContinue).BlockSize + + return @{ + DiskId = $DiskId + DiskIdType = $DiskIdType + DriveLetter = $partition.DriveLetter + PartitionStyle = $disk.PartitionStyle + Size = $partition.Size + FSLabel = $volume.FileSystemLabel + AllocationUnitSize = $blockSize + FSFormat = $volume.FileSystem + } +} # Get-TargetResource + +<# + .SYNOPSIS + Initializes the Disk and Partition and assigns the drive letter. + + .PARAMETER DriveLetter + Specifies the preferred letter to assign to the disk volume. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to modify. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER PartitionStyle + Specifies the partition style of the disk. Defaults to GPT. + + .PARAMETER Size + Specifies the size of new volume. Leave empty to use the remaining free space. + + .PARAMETER FSLabel + Specifies the volume label to assign to the volume. + + .PARAMETER AllocationUnitSize + Specifies the allocation unit size to use when formatting the volume. + + .PARAMETER FSFormat + Specifies the file system format of the new volume. + + .PARAMETER AllowDestructive + Specifies if potentially destructive operations may occur. + + .PARAMETER ClearDisk + Specifies if the disks partition schema should be removed entirely, even if data and OEM + partitions are present. Only possible with AllowDestructive enabled. +#> +function Set-TargetResource +{ + # Should process is called in a helper functions but not directly in Set-TargetResource + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')] + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DriveLetter, + + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number', 'UniqueId', 'Guid', 'Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [ValidateSet('GPT', 'MBR')] + [System.String] + $PartitionStyle = 'GPT', + + [Parameter()] + [System.UInt64] + $Size, + + [Parameter()] + [System.String] + $FSLabel, + + [Parameter()] + [System.UInt32] + $AllocationUnitSize, + + [Parameter()] + [ValidateSet('NTFS', 'ReFS')] + [System.String] + $FSFormat = 'NTFS', + + [Parameter()] + [System.Boolean] + $AllowDestructive, + + [Parameter()] + [System.Boolean] + $ClearDisk + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingDiskMessage -f $DiskIdType, $DiskId, $DriveLetter) + ) -join '' ) + + # Validate the DriveLetter parameter + $DriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + # Get the Disk using the identifiers supplied + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + + if ($disk.IsOffline) + { + # Disk is offline, so bring it online + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SetDiskOnlineMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + $disk | Set-Disk -IsOffline $false + } # if + + if ($disk.IsReadOnly) + { + # Disk is read-only, so make it read/write + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SetDiskReadWriteMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + $disk | Set-Disk -IsReadOnly $false + } # if + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingDiskPartitionStyleMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + if ($AllowDestructive -and $ClearDisk -and $disk.PartitionStyle -ne 'RAW') + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ClearingDiskMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + $disk | Clear-Disk -RemoveData -RemoveOEM -Confirm:$true + + # Requery the disk + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + } + + if ($disk.PartitionStyle -eq 'RAW') + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.InitializingDiskMessage -f $DiskIdType, $DiskId, $PartitionStyle) + ) -join '' ) + + $disk | Initialize-Disk -PartitionStyle $PartitionStyle + } + else + { + if ($disk.PartitionStyle -eq $PartitionStyle) + { + # The disk partition is already initialized with the correct partition style + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskAlreadyInitializedMessage ` + -f $DiskIdType, $DiskId, $disk.PartitionStyle) + ) -join '' ) + + } + else + { + # This disk is initialized but with the incorrect partition style + New-InvalidOperationException ` + -Message ($script:localizedData.DiskInitializedWithWrongPartitionStyleError ` + -f $DiskIdType, $DiskId, $disk.PartitionStyle, $PartitionStyle) + } + } + + # Get the partitions on the disk + $partition = $disk | Get-Partition -ErrorAction SilentlyContinue + + # Check if the disk has an existing partition assigned to the drive letter + $assignedPartition = $partition | + Where-Object -Property DriveLetter -eq $DriveLetter + + # Check if existing partition already has file system on it + if ($null -eq $assignedPartition) + { + # There is no partiton with this drive letter + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DriveNotFoundOnPartitionMessage ` + -f $DiskIdType, $DiskId, $DriveLetter) + ) -join '' ) + + # Are there any partitions defined on this disk? + if ($partition) + { + # There are partitions defined - identify if one matches the size required + if ($Size) + { + # Find the first basic partition matching the size + $partition = $partition | + Where-Object -FilterScript { $_.Type -eq 'Basic' -and $_.Size -eq $Size } | + Select-Object -First 1 + + if ($partition) + { + # A partition matching the required size was found + Write-Verbose -Message ($script:localizedData.MatchingPartitionFoundMessage ` + -f $DiskIdType, $DiskId, $partition.PartitionNumber) + } + else + { + # A partition matching the required size was not found + Write-Verbose -Message ($script:localizedData.MatchingPartitionNotFoundMessage ` + -f $DiskIdType, $DiskId) + } # if + } + else + { + <# + No size specified, so see if there is a partition that has a volume + matching the file system type that is not assigned to a drive letter. + #> + Write-Verbose -Message ($script:localizedData.MatchingPartitionNoSizeMessage ` + -f $DiskIdType, $DiskId) + + $searchPartitions = $partition | Where-Object -FilterScript { + $_.Type -eq 'Basic' -and -not [System.Char]::IsLetter($_.DriveLetter) + } + + $partition = $null + + foreach ($searchPartition in $searchPartitions) + { + # Look for the volume in the partition. + Write-Verbose -Message ($script:localizedData.SearchForVolumeMessage ` + -f $DiskIdType, $DiskId, $searchPartition.PartitionNumber, $FSFormat) + + $searchVolumes = $searchPartition | Get-Volume + + $volumeMatch = $searchVolumes | Where-Object -FilterScript { + $_.FileSystem -eq $FSFormat + } + + if ($volumeMatch) + { + <# + Found a partition with a volume that matches file system + type and not assigned a drive letter. + #> + $partition = $searchPartition + + Write-Verbose -Message ($script:localizedData.VolumeFoundMessage ` + -f $DiskIdType, $DiskId, $searchPartition.PartitionNumber, $FSFormat) + + break + } # if + } # foreach + } # if + } # if + + # Do we need to create a new partition? + if (-not $partition) + { + # Attempt to create a new partition + $partitionParams = @{ + DriveLetter = $DriveLetter + } + + if ($Size) + { + # Use only a specific size + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CreatingPartitionMessage ` + -f $DiskIdType, $DiskId, $DriveLetter, "$($Size/1KB) KB") + ) -join '' ) + + $partitionParams['Size'] = $Size + } + else + { + # Use the entire disk + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CreatingPartitionMessage ` + -f $DiskIdType, $DiskId, $DriveLetter, 'all free space') + ) -join '' ) + + $partitionParams['UseMaximumSize'] = $true + } # if + + # Create the partition. + $partition = $disk | New-Partition @partitionParams + + <# + After creating the partition it can take a few seconds for it to become writeable + Wait for up to 30 seconds for the parition to become writeable + #> + $timeAtStart = Get-Date + $minimumTimeToWait = $timeAtStart + (New-Timespan -Second 3) + $maximumTimeToWait = $timeAtStart + (New-Timespan -Second 30) + + while (($partitionstate.IsReadOnly -and (Get-Date) -lt $maximumTimeToWait) ` + -or ((Get-Date) -lt $minimumTimeToWait)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + ($script:localizedData.NewPartitionIsReadOnlyMessage ` + -f $DiskIdType, $DiskId, $partition.PartitionNumber) + ) -join '' ) + + Start-Sleep -Seconds 1 + + # Pull the partition details again to check if it is readonly + $partitionstate = $partition | Get-Partition + } # while + } # if + + if ($partition.IsReadOnly) + { + # The partition is still readonly - throw an exception + New-InvalidOperationException ` + -Message ($script:localizedData.NewParitionIsReadOnlyError ` + -f $DiskIdType, $DiskId, $partition.PartitionNumber) + } # if + + $assignDriveLetter = $true + } + else + { + # The disk already has a partition on it that is assigned to the Drive Letter + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.PartitionAlreadyAssignedMessage ` + -f $DriveLetter, $assignedPartition.PartitionNumber) + ) -join '' ) + + $assignDriveLetter = $false + + $supportedSize = $assignedPartition | Get-PartitionSupportedSize + + <# + If the parition size was not specified then try and make the partition + use all possible space on the disk. + #> + if (-not ($PSBoundParameters.ContainsKey('Size'))) + { + $Size = $supportedSize.SizeMax + } + + if ($assignedPartition.Size -ne $Size) + { + # A patition resize is required + if ($AllowDestructive) + { + if ($FSFormat -eq 'ReFS') + { + Write-Warning -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ResizeRefsNotPossibleMessage ` + -f $DriveLetter, $assignedPartition.Size, $Size) + ) -join '' ) + + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SizeMismatchCorrectionMessage ` + -f $DriveLetter, $assignedPartition.Size, $Size) + ) -join '' ) + + if ($Size -gt $supportedSize.SizeMax) + { + New-InvalidArgumentException -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FreeSpaceViolationError ` + -f $DriveLetter, $assignedPartition.Size, $Size, $supportedSize.SizeMax) + ) -join '' ) -ArgumentName 'Size' -ErrorAction Stop + } + + $assignedPartition | Resize-Partition -Size $Size + } + } + else + { + # A partition resize was required but is not allowed + Write-Warning -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ResizeNotAllowedMessage ` + -f $DriveLetter, $assignedPartition.Size, $Size) + ) -join '' ) + } + } + } + + # Get the Volume on the partition + $volume = $partition | Get-Volume + + # Is the volume already formatted? + if ($volume.FileSystem -eq '') + { + # The volume is not formatted + $formatVolumeParameters = @{ + FileSystem = $FSFormat + Confirm = $false + } + + if ($FSLabel) + { + # Set the File System label on the new volume + $formatVolumeParameters['NewFileSystemLabel'] = $FSLabel + } # if + + if ($AllocationUnitSize) + { + # Set the Allocation Unit Size on the new volume + $formatVolumeParameters['AllocationUnitSize'] = $AllocationUnitSize + } # if + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FormattingVolumeMessage -f $formatVolumeParameters.FileSystem) + ) -join '' ) + + # Format the volume + $volume = $partition | Format-Volume @formatVolumeParameters + } + else + { + # The volume is already formatted + if ($PSBoundParameters.ContainsKey('FSFormat')) + { + # Check the filesystem format + $fileSystem = $volume.FileSystem + if ($fileSystem -ne $FSFormat) + { + # The file system format does not match + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FileSystemFormatMismatch ` + -f $DriveLetter, $fileSystem, $FSFormat) + ) -join '' ) + + if ($AllowDestructive) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.VolumeFormatInProgressMessage ` + -f $DriveLetter, $fileSystem, $FSFormat) + ) -join '' ) + + $formatParam = @{ + FileSystem = $FSFormat + Force = $true + } + + if ($PSBoundParameters.ContainsKey('AllocationUnitSize')) + { + $formatParam.Add('AllocationUnitSize', $AllocationUnitSize) + } + + $Volume | Format-Volume @formatParam + } + } # if + } # if + + # Check the volume label + if ($PSBoundParameters.ContainsKey('FSLabel')) + { + # The volume should have a label assigned + if ($volume.FileSystemLabel -ne $FSLabel) + { + # The volume lable needs to be changed because it is different. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ChangingVolumeLabelMessage ` + -f $DriveLetter, $FSLabel) + ) -join '' ) + + $volume | Set-Volume -NewFileSystemLabel $FSLabel + } # if + } # if + } # if + + # Assign the Drive Letter if it isn't assigned + if ($assignDriveLetter -and ($partition.DriveLetter -ne $DriveLetter)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.AssigningDriveLetterMessage -f $DriveLetter) + ) -join '' ) + + $null = $partition | Set-Partition -NewDriveLetter $DriveLetter + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SuccessfullyInitializedMessage -f $DriveLetter) + ) -join '' ) + } # if +} # Set-TargetResource + +<# + .SYNOPSIS + Tests if the disk is initialized, the partion exists and the drive letter is assigned. + + .PARAMETER DriveLetter + Specifies the preferred letter to assign to the disk volume. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to modify. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER PartitionStyle + Specifies the partition style of the disk. Defaults to GPT. + + .PARAMETER Size + Specifies the size of new volume. Leave empty to use the remaining free space. + + .PARAMETER FSLabel + Specifies the volume label to assign to the volume. + + .PARAMETER AllocationUnitSize + Specifies the allocation unit size to use when formatting the volume. + + .PARAMETER FSFormat + Specifies the file system format of the new volume. + + .PARAMETER AllowDestructive + Specifies if potentially destructive operations may occur. + + .PARAMETER ClearDisk + Specifies if the disks partition schema should be removed entirely, even if data and OEM + partitions are present. Only possible with AllowDestructive enabled. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DriveLetter, + + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number', 'UniqueId', 'Guid', 'Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [ValidateSet('GPT', 'MBR')] + [System.String] + $PartitionStyle = 'GPT', + + [Parameter()] + [System.UInt64] + $Size, + + [Parameter()] + [System.String] + $FSLabel, + + [Parameter()] + [System.UInt32] + $AllocationUnitSize, + + [Parameter()] + [ValidateSet('NTFS', 'ReFS')] + [System.String] + $FSFormat = 'NTFS', + + [Parameter()] + [System.Boolean] + $AllowDestructive, + + [Parameter()] + [System.Boolean] + $ClearDisk + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingDiskMessage -f $DiskIdType, $DiskId, $DriveLetter) + ) -join '' ) + + # Validate the DriveLetter parameter + $DriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckDiskInitializedMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + # Get the Disk using the identifiers supplied + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + + if (-not $disk) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskNotFoundMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + return $false + } # if + + if ($disk.IsOffline) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskNotOnlineMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + return $false + } # if + + if ($disk.IsReadOnly) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskReadOnlyMessage ` + -f $DiskIdType, $DiskId) + ) -join '' ) + + return $false + } # if + + if ($disk.PartitionStyle -ne $PartitionStyle) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskPartitionStyleNotMatchMessage ` + -f $DiskIdType, $DiskId, $disk.PartitionStyle, $PartitionStyle) + ) -join '' ) + + if ($disk.PartitionStyle -eq 'RAW' -or ($AllowDestructive -and $ClearDisk)) + { + return $false + } + else + { + # This disk is initialized but with the incorrect partition style + New-InvalidOperationException ` + -Message ($script:localizedData.DiskInitializedWithWrongPartitionStyleError ` + -f $DiskIdType, $DiskId, $disk.PartitionStyle, $PartitionStyle) + } + } # if + + $partition = Get-Partition ` + -DriveLetter $DriveLetter ` + -ErrorAction SilentlyContinue | Select-Object -First 1 + + if ($partition.DriveLetter -ne $DriveLetter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DriveLetterNotFoundMessage -f $DriveLetter) + ) -join '' ) + + return $false + } # if + + # Check the partition size + if ($partition -and -not ($PSBoundParameters.ContainsKey('Size'))) + { + $supportedSize = ($partition | Get-PartitionSupportedSize) + + <# + If the difference in size between the supported partition size + and the current partition size is less than 1MB then set the + desired partition size to the current size. This will prevent + any size difference less than 1MB from trying to contiuously + resize. See https://github.com/dsccommunity/StorageDsc/issues/181 + #> + if (($supportedSize.SizeMax - $partition.Size) -lt 1MB) + { + $Size = $partition.Size + } + else + { + $Size = $supportedSize.SizeMax + } + } + + if ($Size) + { + if ($partition.Size -ne $Size) + { + # The partition size mismatches + if ($AllowDestructive) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SizeMismatchWithAllowDestructiveMessage ` + -f $DriveLetter, $Partition.Size, $Size) + ) -join '' ) + + return $false + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SizeMismatchMessage ` + -f $DriveLetter, $Partition.Size, $Size) + ) -join '' ) + } + } # if + } # if + + $blockSize = (Get-CimInstance ` + -Query "SELECT BlockSize from Win32_Volume WHERE DriveLetter = '$($DriveLetter):'" ` + -ErrorAction SilentlyContinue).BlockSize + + if ($blockSize -gt 0 -and $AllocationUnitSize -ne 0) + { + if ($AllocationUnitSize -ne $blockSize) + { + # The allocation unit size mismatches + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.AllocationUnitSizeMismatchMessage ` + -f $DriveLetter, $($blockSize.BlockSize / 1KB), $($AllocationUnitSize / 1KB)) + ) -join '' ) + + if ($AllowDestructive) + { + return $false + } + } # if + } # if + + # Get the volume so the properties can be checked + $volume = Get-Volume ` + -DriveLetter $DriveLetter ` + -ErrorAction SilentlyContinue + + if ($PSBoundParameters.ContainsKey('FSFormat')) + { + # Check the filesystem format + $fileSystem = $volume.FileSystem + if ($fileSystem -ne $FSFormat) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FileSystemFormatMismatch ` + -f $DriveLetter, $fileSystem, $FSFormat) + ) -join '' ) + + if ($AllowDestructive) + { + return $false + } + } # if + } # if + + if ($PSBoundParameters.ContainsKey('FSLabel')) + { + # Check the volume label + $label = $volume.FileSystemLabel + if ($label -ne $FSLabel) + { + # The assigned volume label is different and needs updating + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DriveLabelMismatch ` + -f $DriveLetter, $label, $FSLabel) + ) -join '' ) + + return $false + } # if + } # if + + return $true +} # Test-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/DSC_Disk.schema.mof b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/DSC_Disk.schema.mof new file mode 100644 index 0000000..39bc860 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/DSC_Disk.schema.mof @@ -0,0 +1,15 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("Disk")] +class DSC_Disk : OMI_BaseResource +{ + [Key, Description("Specifies the identifier for which disk to modify.")] String DriveLetter; + [Required, Description("Specifies the disk identifier for the disk to modify.")] String DiskId; + [Write, Description("Specifies the identifier type the DiskId contains. Defaults to Number."), ValueMap{"Number","UniqueId","Guid","Location"}, Values{"Number","UniqueId","Guid","Location"}] String DiskIdType; + [Write, Description("Specifies the partition style of the disk. Defaults to GPT."), ValueMap{"MBR","GPT"}, Values{"MBR","GPT"}] String PartitionStyle; + [Write, Description("Specifies the size of new volume. Leave empty to use the remaining free space.")] Uint64 Size; + [Write, Description("Define volume label if required.")] String FSLabel; + [Write, Description("Specifies the allocation unit size to use when formatting the volume.")] Uint32 AllocationUnitSize; + [Write, Description("Specifies the file system format of the new volume."), ValueMap{"NTFS","ReFS"}, Values{"NTFS","ReFS"}] String FSFormat; + [Write, Description("Specifies if potentially destructive operations may occur.")] Boolean AllowDestructive; + [Write, Description("Specifies if the disks partition schema should be removed entirely, even if data and OEM partitions are present. Only possible with AllowDestructive enabled.")] Boolean ClearDisk; +}; diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/README.md b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/README.md new file mode 100644 index 0000000..882fc26 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/README.md @@ -0,0 +1,68 @@ +# Description + +The resource is used to initialize, format and mount the partition/volume as a drive +letter. +The disk to add the partition/volume to is selected by specifying the _DiskId_ and +optionally _DiskIdType_. +The _DiskId_ value can be a _Disk Number_, _Unique Id_, _Guid_ or _Location_. + +**Important: The _Disk Number_ is not a reliable method of selecting a disk because +it has been shown to change between reboots in some environments. +It is recommended to use the _Unique Id_ if possible.** + +The _Disk Number_, _Unique Id_, _Guid_ and _Location_ can be identified for a +disk by using the PowerShell command: + +```powershell +Get-Disk | Select-Object -Property FriendlyName,DiskNumber,UniqueId,Guid,Location +``` + +Note: The _Guid_ identifier method of specifying disks is only supported as an +identifier for disks with `GPT` partition table format. If the disk is `RAW` +(e.g. the disk has been initialized) then the _Guid_ identifier method can not +be used. This is because the _Guid_ for a disk is only assigned once the partition +table for the disk has been created. + +## Known Issues + +### Defragsvc Conflict + +The 'defragsvc' service ('Optimize Drives') may cause the following errors when +enabled with this resource. The following error may occur when testing the state +of the resource: + +```text +PartitionSupportedSize ++ CategoryInfo : NotSpecified: (StorageWMI:) [], CimException ++ FullyQualifiedErrorId : StorageWMI 4,Get-PartitionSupportedSize ++ PSComputerName : localhost +``` + +The 'defragsvc' service should be stopped and set to manual start up to prevent +this error. Use the `Service` resource in either the 'xPSDesiredStateConfgiuration' +or 'PSDSCResources' resource module to set the 'defragsvc' service is always +stopped and set to manual start up. + +### Null Location + +The _Location_ for a disk may be `null` for some types of disk, +e.g. file-based virtual disks. Physical disks or Virtual disks provided via a +hypervisor or other hardware virtualization platform should not be affected. + +### Maximum Supported Partition Size + +On some disks the _maximum supported partition size_ may differ from the actual +size of a partition created when specifying the maximum size. This difference +in reported size is always less than **1MB**, so if the reported _maximum supported +partition size_ is less than **1MB** then the partition will be considered to be +in the correct state. This is a work around for [this issue](https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/36967870-get-partitionsupportedsize-and-msft-partition-clas) +that has been reported on user voice and also discussed in [issue #181](https://github.com/dsccommunity/StorageDsc/issues/181). + +### ReFS on Windows Server 2019 + +On Windows Server 2019 (build 17763 and above), `Format-Volume` throws an +'Invalid Parameter' exception when called with `ReFS` as the `FileSystem` +parameter. This results in an 'Invalid Parameter' exception being thrown +in the `Set` in the 'Disk' resource. +There is currently no known work around for this issue. It is being tracked +in [issue #227](https://github.com/dsccommunity/StorageDsc/issues/227). diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/en-US/DSC_Disk.strings.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/en-US/DSC_Disk.strings.psd1 new file mode 100644 index 0000000..257c42d --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_Disk/en-US/DSC_Disk.strings.psd1 @@ -0,0 +1,42 @@ +ConvertFrom-StringData @' + GettingDiskMessage = Getting disk with {0} '{1}' status for drive letter '{2}'. + SettingDiskMessage = Setting disk with {0} '{1}' status for drive letter '{2}'. + SetDiskOnlineMessage = Setting disk with {0} '{1}' online. + SetDiskReadWriteMessage = Setting disk with {0} '{1}' to read/write. + CheckingDiskPartitionStyleMessage = Checking disk with {0} '{1}' partition style. + InitializingDiskMessage = Initializing disk with {0} '{1}' as '{2}'. + DiskAlreadyInitializedMessage = Disk with {0} '{1}' is already initialized with '{2}'. + CreatingPartitionMessage = Creating partition on disk with {0} '{1}' with drive letter '{2}' using {3}. + FormattingVolumeMessage = Formatting the volume as '{0}'. + SuccessfullyInitializedMessage = Successfully initialized '{0}'. + AssigningDriveLetterMessage = Assigning drive letter '{0}'. + ChangingVolumeLabelMessage = Changing volume '{0}' label to '{1}'. + NewPartitionIsReadOnlyMessage = New partition '{2}' on disk with {0} '{1}' is readonly. Waiting for it to become writable. + TestingDiskMessage = Testing disk with {0} '{1}' status for drive letter '{2}'. + CheckDiskInitializedMessage = Checking if disk with {0} '{1}' is initialized. + DiskNotFoundMessage = Disk with {0} '{1}' was not found. + DiskNotOnlineMessage = Disk with {0} '{1}' is not online. + DiskReadOnlyMessage = Disk with {0} '{1}' is readonly. + DiskPartitionStyleNotMatchMessage = Disk with {0} '{1}' is initialized with partition style '{2}' but '{3}' is required. + DiskInitializedWithWrongPartitionStyleError = Disk with {0} '{1}' is already initialized with partition style '{2}' but '{3}' is required. Set AllowDestructive and ClearDisk to $true to allow disk to be reinitialized. + DriveLetterNotFoundMessage = Drive {0} was not found. + SizeMismatchMessage = Partition assigned to drive {0} has size {1}, which does not match expected size {2}. Set AllowDestructive to $true to enable resizing of partition. + SizeMismatchWithAllowDestructiveMessage = Partition assigned to drive {0} has size {1}, which does not match expected size {2}. + AllocationUnitSizeMismatchMessage = Volume assigned to drive {0} has allocation unit size {1} KB does not match expected allocation unit size {2} KB. + FileSystemFormatMismatch = Volume assigned to drive {0} filesystem format '{1}' does not match expected format '{2}'. + DriveLabelMismatch = Volume assigned to drive {0} label '{1}' does not match expected label '{2}'. + PartitionAlreadyAssignedMessage = Partition '{1}' is already assigned as drive {0}. + MatchingPartitionNotFoundMessage = Disk with {0} '{1}' already contains partitions, but none match required size. + MatchingPartitionNoSizeMessage = Disk with {0} '{1}' already contains partitions, but size parameter is not specified. + SearchForVolumeMessage = Searching for {3} volume with no drive letter on partition '{2}' disk with {0} '{1}'. + VolumeFoundMessage = Found {3} volume with no drive letter on partition '{2}' disk with {0} '{1}'. + MatchingPartitionFoundMessage = Disk with {0} '{1}' already contains partitions, and partition '{2}' matches required size. + DriveNotFoundOnPartitionMessage = Disk with {0} '{1}' does not contain a partition assigned to drive letter '{2}'. + ClearingDiskMessage = Clearing disk with {0} '{1}' of all existing partitions and volumes. + NewParitionIsReadOnlyError = New partition '{2}' on disk with {0} '{1}' did not become writable in the expected time. + VolumeFormatInProgressMessage = Switch AllowDestructive is specified. Attempting to format volume on {0} with '{2}', was '{1}'. + SizeMismatchCorrectionMessage = Switch AllowDestructive is specified. Attempting to resize partition {0} from {1} to {2}. + FreeSpaceViolationError = Attempted to resize partition {0} from {1} to {2} while maximum allowed size was {3}. + ResizeRefsNotPossibleMessage = Skipping resize of {0} from {1} to {2}. Resizing ReFS partitions is currently not possible. + ResizeNotAllowedMessage = Skipping resize of {0} from {1} to {2}. AllowDestructive is not set to $true. +'@ diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/DSC_DiskAccessPath.psm1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/DSC_DiskAccessPath.psm1 new file mode 100644 index 0000000..3d78b4a --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/DSC_DiskAccessPath.psm1 @@ -0,0 +1,835 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Storage Common Module. +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'StorageDsc.Common' ` + -ChildPath 'StorageDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings. +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the Disk and Partition. + + .PARAMETER AccessPath + Specifies the access path folder to the assign the disk volume to + + .PARAMETER NoDefaultDriveLetter + Prevents a default drive letter from being assigned to a newly created partition. Defaults to True. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to modify. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER Size + Specifies the size of new volume (use all available space on disk if not provided). + + .PARAMETER FSLabel + Specifies the volume label to assign to the volume. + + .PARAMETER AllocationUnitSize + Specifies the allocation unit size to use when formatting the volume. + + .PARAMETER FSFormat + Specifies the file system format of the new volume. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $AccessPath, + + [Parameter()] + [System.Boolean] + $NoDefaultDriveLetter = $true, + + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number', 'UniqueId', 'Guid', 'Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [System.UInt64] + $Size, + + [Parameter()] + [System.String] + $FSLabel, + + [Parameter()] + [System.UInt32] + $AllocationUnitSize, + + [Parameter()] + [ValidateSet('NTFS', 'ReFS')] + [System.String] + $FSFormat = 'NTFS' + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingDiskMessage -f $DiskIdType, $DiskId, $AccessPath) + ) -join '' ) + + # Validate the AccessPath parameter adding a trailing slash + $AccessPath = Assert-AccessPathValid -AccessPath $AccessPath -Slash + + # Get the Disk using the identifiers supplied + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + + # Get the partitions on the disk + $partition = $disk | Get-Partition -ErrorAction SilentlyContinue + + # Check if the disk has an existing partition assigned to the access path + $assignedPartition = $partition | + Where-Object -Property AccessPaths -Contains -Value $AccessPath + + $volume = $assignedPartition | Get-Volume + + $fileSystem = $volume.FileSystem + $FSLabel = $volume.FileSystemLabel + + # Prepare the AccessPath used in the CIM query (replaces '\' with '\\') + $queryAccessPath = $AccessPath -replace '\\', '\\' + + $blockSize = (Get-CimInstance ` + -Query "SELECT BlockSize from Win32_Volume WHERE Name = '$queryAccessPath'" ` + -ErrorAction SilentlyContinue).BlockSize + + $returnValue = @{ + DiskId = $DiskId + DiskIdType = $DiskIdType + AccessPath = $AccessPath + NoDefaultDriveLetter = $assignedPartition.NoDefaultDriveLetter + Size = $assignedPartition.Size + FSLabel = $FSLabel + AllocationUnitSize = $blockSize + FSFormat = $fileSystem + } + + return $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Initializes the Disk and Partition and assigns the access path. + + .PARAMETER AccessPath + Specifies the access path folder to the assign the disk volume to + + .PARAMETER NoDefaultDriveLetter + Prevents a default drive letter from being assigned to a newly created partition. Defaults to True. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to modify. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER Size + Specifies the size of new volume (use all available space on disk if not provided). + + .PARAMETER FSLabel + Specifies the volume label to assign to the volume. + + .PARAMETER AllocationUnitSize + Specifies the allocation unit size to use when formatting the volume. + + .PARAMETER FSFormat + Specifies the file system format of the new volume. +#> +function Set-TargetResource +{ + # Should process is called in a helper functions but not directly in Set-TargetResource + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')] + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $AccessPath, + + [Parameter()] + [System.Boolean] + $NoDefaultDriveLetter = $true, + + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number', 'UniqueId', 'Guid', 'Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [System.UInt64] + $Size, + + [Parameter()] + [System.String] + $FSLabel, + + [Parameter()] + [System.UInt32] + $AllocationUnitSize, + + [Parameter()] + [ValidateSet('NTFS', 'ReFS')] + [System.String] + $FSFormat = 'NTFS' + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingDiskMessage -f $DiskIdType, $DiskId, $AccessPath) + ) -join '' ) + + <# + This call is required to force a refresh of the list of drives in + the disk subsystem. If this refresh does not occur then the list of + disks may not be up-to-date, resulting in an error occuring when the + access path is mounted. The result of the test is not used and is discarded. + #> + $null = Test-AccessPathInPSDrive -AccessPath $AccessPath + + # Validate the AccessPath parameter adding a trailing slash + $AccessPath = Assert-AccessPathValid -AccessPath $AccessPath -Slash + + # Get the Disk using the identifiers supplied + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + + if ($disk.IsOffline) + { + # Disk is offline, so bring it online + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SetDiskOnlineMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + $disk | Set-Disk -IsOffline $false + } # if + + if ($disk.IsReadOnly) + { + # Disk is read-only, so make it read/write + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SetDiskReadWriteMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + $disk | Set-Disk -IsReadOnly $false + } # if + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingDiskPartitionStyleMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + switch ($disk.PartitionStyle) + { + 'RAW' + { + # The disk partition table is not yet initialized, so initialize it with GPT + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.InitializingDiskMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + $disk | Initialize-Disk ` + -PartitionStyle 'GPT' + break + } # 'RAW' + + 'GPT' + { + # The disk partition is already initialized with GPT. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskAlreadyInitializedMessage -f $DiskIdType, $DiskId) + ) -join '' ) + break + } # 'GPT' + + default + { + # This disk is initialized but not as GPT - so raise an exception. + New-InvalidOperationException ` + -Message ($script:localizedData.DiskAlreadyInitializedError -f ` + $DiskIdType, $DiskId, $Disk.PartitionStyle) + } # default + } # switch + + # Get the partitions on the disk + $partition = $disk | Get-Partition -ErrorAction SilentlyContinue + + # Check if the disk has an existing partition assigned to the access path + $assignedPartition = $partition | + Where-Object -Property AccessPaths -Contains -Value $AccessPath + + if ($null -eq $assignedPartition) + { + # There is no partiton with this access path + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.AccessPathNotFoundOnPartitionMessage -f $DiskIdType, $DiskId, $AccessPath) + ) -join '' ) + + # Are there any partitions defined on this disk? + if ($partition) + { + # There are partitions defined - identify if one matches the size required + if ($Size) + { + # Find the first basic partition matching the size + $partition = $partition | + Where-Object -Filter { $_.Type -eq 'Basic' -and $_.Size -eq $Size } | + Select-Object -First 1 + + if ($partition) + { + # A partition matching the required size was found + Write-Verbose -Message ($script:localizedData.MatchingPartitionFoundMessage -f ` + $DiskIdType, $DiskId, $partition.PartitionNumber) + } + else + { + # A partition matching the required size was not found + Write-Verbose -Message ($script:localizedData.MatchingPartitionNotFoundMessage -f ` + $DiskIdType, $DiskId) + } # if + } + else + { + <# + No size specified, so see if there is a partition that has a volume + matching the file system type that is not assigned to an access path. + #> + Write-Verbose -Message ($script:localizedData.MatchingPartitionNoSizeMessage -f ` + $DiskIdType, $DiskId) + + $searchPartitions = $partition | Where-Object -FilterScript { + $_.Type -eq 'Basic' -and -not (Test-AccessPathAssignedToLocal -AccessPath $_.AccessPaths) + } + + $partition = $null + + foreach ($searchPartition in $searchPartitions) + { + # Look for the volume in the partition. + Write-Verbose -Message ($script:localizedData.SearchForVolumeMessage -f ` + $DiskIdType, $DiskId, $searchPartition.PartitionNumber, $FSFormat) + + $searchVolumes = $searchPartition | Get-Volume + + $volumeMatch = $searchVolumes | Where-Object -FilterScript { + $_.FileSystem -eq $FSFormat + } + + if ($volumeMatch) + { + <# + Found a partition with a volume that matches file system + type and not assigned an access path. + #> + $partition = $searchPartition + + Write-Verbose -Message ($script:localizedData.VolumeFoundMessage -f ` + $DiskIdType, $DiskId, $searchPartition.PartitionNumber, $FSFormat) + + break + } # if + } # foreach + } # if + } # if + + # Do we need to create a new partition? + if (-not $partition) + { + # Attempt to create a new partition + $partitionParams = @{} + + if ($Size) + { + # Use only a specific size + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CreatingPartitionMessage ` + -f $DiskIdType, $DiskId, "$($Size/1KB) KB") + ) -join '' ) + $partitionParams['Size'] = $Size + } + else + { + # Use the entire disk + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CreatingPartitionMessage ` + -f $DiskIdType, $DiskId, 'all free space') + ) -join '' ) + $partitionParams['UseMaximumSize'] = $true + } # if + + # Create the partition + $partition = $disk | New-Partition @partitionParams + + <# + After creating the partition it can take a few seconds for it to become writeable + Wait for up to 30 seconds for the partition to become writeable + #> + $timeout = (Get-Date) + (New-Timespan -Second 30) + while ($partition.IsReadOnly -and (Get-Date) -lt $timeout) + { + Write-Verbose -Message ($script:localizedData.NewPartitionIsReadOnlyMessage -f ` + $DiskIdType, $DiskId, $partition.PartitionNumber) + + Start-Sleep -Seconds 1 + + # Pull the partition details again to check if it is readonly + $partition = $partition | Get-Partition + } # while + } # if + + if ($partition.IsReadOnly) + { + # The partition is still readonly - throw an exception + New-InvalidOperationException ` + -Message ($script:localizedData.NewParitionIsReadOnlyError -f ` + $DiskIdType, $DiskId, $partition.PartitionNumber) + } # if + + $assignAccessPath = $true + } + else + { + # The disk already has a partition on it that is assigned to the access path + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.PartitionAlreadyAssignedMessage -f ` + $AccessPath, $assignedPartition.PartitionNumber) + ) -join '' ) + + $assignAccessPath = $false + } + + # Get the Volume on the partition + $volume = $partition | Get-Volume + + # Is the volume already formatted? + if ($volume.FileSystem -eq '') + { + # The volume is not formatted + $volParams = @{ + FileSystem = $FSFormat + Confirm = $false + } + + if ($FSLabel) + { + # Set the File System label on the new volume + $volParams["NewFileSystemLabel"] = $FSLabel + } # if + + if ($AllocationUnitSize) + { + # Set the Allocation Unit Size on the new volume + $volParams["AllocationUnitSize"] = $AllocationUnitSize + } # if + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FormattingVolumeMessage -f $volParams.FileSystem) + ) -join '' ) + + # Format the volume + $volume = $partition | Format-Volume @VolParams + } + else + { + # The volume is already formatted + if ($PSBoundParameters.ContainsKey('FSFormat')) + { + # Check the filesystem format + $fileSystem = $volume.FileSystem + if ($fileSystem -ne $FSFormat) + { + # The file system format does not match + # There is nothing we can do to resolve this (yet) + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FileSystemFormatMismatch -f ` + $AccessPath, $fileSystem, $FSFormat) + ) -join '' ) + } # if + } # if + + # Check the volume label + if ($PSBoundParameters.ContainsKey('FSLabel')) + { + # The volume should have a label assigned + if ($volume.FileSystemLabel -ne $FSLabel) + { + # The volume lable needs to be changed because it is different. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ChangingVolumeLabelMessage ` + -f $AccessPath, $FSLabel) + ) -join '' ) + + $volume | Set-Volume -NewFileSystemLabel $FSLabel + } # if + } # if + } # if + + # Assign the access path if it isn't assigned + if ($assignAccessPath) + { + <# + Add the partition access path, but do not pipe $disk to + Add-PartitionAccessPath because it is not supported in + Windows Server 2012 R2 + #> + $null = Add-PartitionAccessPath ` + -AccessPath $AccessPath ` + -DiskNumber $disk.Number ` + -PartitionNumber $partition.PartitionNumber + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SuccessfullyInitializedMessage -f $AccessPath) + ) -join '' ) + } # if + + # Get the partitions on the disk + $partition = $disk | Get-Partition -ErrorAction SilentlyContinue + + # Get the current partition state for NoDefaultDriveLetter + $assignedPartition = $partition | + Where-Object -Property AccessPaths -Contains -Value $AccessPath + + if ($assignedPartition.NoDefaultDriveLetter -ne $NoDefaultDriveLetter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + "$($script:localizedData.NoDefaultDriveLetterMismatchMessage -f $assignedPartition.NoDefaultDriveLetter, $NoDefaultDriveLetter)" + ) -join '' ) + + # Setting the partition property NoDefaultDriveLetter + Set-Partition -PartitionNumber $assignedPartition.PartitionNumber ` + -DiskNumber $disk.Number ` + -NoDefaultDriveLetter $NoDefaultDriveLetter + } # if +} # Set-TargetResource + +<# + .SYNOPSIS + Tests if the disk is initialized, the partion exists and the access path is assigned. + + .PARAMETER AccessPath + Specifies the access path folder to the assign the disk volume to + + .PARAMETER NoDefaultDriveLetter + Prevents a default drive letter from being assigned to a newly created partition. Defaults to True. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to modify. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER Size + Specifies the size of new volume (use all available space on disk if not provided). + + .PARAMETER FSLabel + Specifies the volume label to assign to the volume. + + .PARAMETER AllocationUnitSize + Specifies the allocation unit size to use when formatting the volume. + + .PARAMETER FSFormat + Specifies the file system format of the new volume. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $AccessPath, + + [Parameter()] + [System.Boolean] + $NoDefaultDriveLetter = $true, + + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number', 'UniqueId', 'Guid', 'Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [System.UInt64] + $Size, + + [Parameter()] + [System.String] + $FSLabel, + + [Parameter()] + [System.UInt32] + $AllocationUnitSize, + + [Parameter()] + [ValidateSet('NTFS', 'ReFS')] + [System.String] + $FSFormat = 'NTFS' + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingDiskMessage -f $DiskIdType, $DiskId, $AccessPath) + ) -join '' ) + + # Validate the AccessPath parameter adding a trailing slash + $AccessPath = Assert-AccessPathValid -AccessPath $AccessPath -Slash + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckDiskInitializedMessage -f $DiskIdType, $DiskId) + ) -join '' ) + + # Get the Disk using the identifiers supplied + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + + if (-not $disk) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskNotFoundMessage -f $DiskIdType, $DiskId) + ) -join '' ) + return $false + } # if + + if ($disk.IsOffline) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskNotOnlineMessage -f $DiskIdType, $DiskId) + ) -join '' ) + return $false + } # if + + if ($disk.IsReadOnly) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskReadOnlyMessage -f $DiskIdType, $DiskId) + ) -join '' ) + return $false + } # if + + if ($disk.PartitionStyle -ne 'GPT') + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskNotGPTMessage -f $DiskIdType, $DiskId, $Disk.PartitionStyle) + ) -join '' ) + return $false + } # if + + # Get the partitions on the disk + $partition = $disk | Get-Partition -ErrorAction SilentlyContinue + + # Check if the disk has an existing partition assigned to the access path + $assignedPartition = $partition | + Where-Object -Property AccessPaths -Contains -Value $AccessPath + + if (-not $assignedPartition) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.AccessPathNotFoundMessage -f $AccessPath) + ) -join '' ) + return $false + } # if + + # Check if the partition NoDefaultDriveLetter parameter is correct + if ($assignedPartition.NoDefaultDriveLetter -ne $NoDefaultDriveLetter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.NoDefaultDriveLetterMismatchMessage -f $assignedPartition.NoDefaultDriveLetter, $NoDefaultDriveLetter) + ) -join '' ) + return $false + } # if + + # Partition size was passed so check it + if ($Size) + { + if ($assignedPartition.Size -ne $Size) + { + # The partition size mismatches but can't be changed (yet) + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SizeMismatchMessage -f ` + $AccessPath, $assignedPartition.Size, $Size) + ) -join '' ) + } # if + } # if + + # Prepare the AccessPath used in the CIM query (replaces '\' with '\\') + $queryAccessPath = $AccessPath -replace '\\', '\\' + + $blockSize = (Get-CimInstance ` + -Query "SELECT BlockSize from Win32_Volume WHERE Name = '$queryAccessPath'" ` + -ErrorAction SilentlyContinue).BlockSize + + if ($blockSize -gt 0 -and $AllocationUnitSize -ne 0) + { + if ($AllocationUnitSize -ne $blockSize) + { + # The allocation unit size mismatches but can't be changed (yet) + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.AllocationUnitSizeMismatchMessage -f ` + $AccessPath, $($blockSize.BlockSize / 1KB), $($AllocationUnitSize / 1KB)) + ) -join '' ) + } # if + } # if + + # Get the volume so the properties can be checked + $volume = $assignedPartition | Get-Volume + + if ($PSBoundParameters.ContainsKey('FSFormat')) + { + # Check the filesystem format + $fileSystem = $volume.FileSystem + if ($fileSystem -ne $FSFormat) + { + # The file system format does not match but can't be changed (yet) + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.FileSystemFormatMismatch -f ` + $AccessPath, $fileSystem, $FSFormat) + ) -join '' ) + } # if + } # if + + if ($PSBoundParameters.ContainsKey('FSLabel')) + { + # Check the volume label + $label = $volume.FileSystemLabel + if ($label -ne $FSLabel) + { + # The assigned volume label is different and needs updating + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DriveLabelMismatch -f ` + $AccessPAth, $label, $FSLabel) + ) -join '' ) + return $false + } # if + } # if + + return $true +} # Test-TargetResource + +<# + .SYNOPSIS + Check access path is found in PSDrives. + + .DESCRIPTION + Check if the access path is found in the list of PSDrives and if not + then forces a full refresh of the list and searches that. + + .PARAMETER AccessPath + Specifies the access path folder. + + .NOTES + The full refresh of PSDrive without any parameters is required because + this is the only way to completely force a refresh of disks and other + related CIM objects. + + If the refresh is not forced then there is a risk that the drive will + appear to not be mounted, causing an error when the resource attempts + to remount it. + + See https://github.com/dsccommunity/StorageDsc/issues/121 +#> +function Test-AccessPathInPSDrive +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $AccessPath + ) + + try + { + $accessPathDisk = $AccessPath.Split(':')[0] + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingPSDriveMessage -f $AccessPath, $accessPathDisk) + ) -join '' ) + + $accessPathDrive = Get-PSDrive -Name $accessPathDisk -ErrorAction Stop + } + catch + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.UnavailablePSDriveMessage -f $AccessPath, $accessPathDisk) + ) -join '' ) + + $accessPathDrive = Get-PSDrive + $accessPathDrive = $accessPathDrive | Where-Object -Property Name -eq $accessPathDisk + } + + $accessPathFound = ($null -ne $accessPathDrive) + + if ($accessPathFound) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.PSDriveFoundMessage -f $AccessPath, $accessPathDisk) + ) -join '' ) + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.PSDriveNotFoundMessage -f $AccessPath, $accessPathDisk) + ) -join '' ) + } + + return $accessPathFound +} # Test-AccessPathInPSDrive + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/DSC_DiskAccessPath.schema.mof b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/DSC_DiskAccessPath.schema.mof new file mode 100644 index 0000000..a4832e4 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/DSC_DiskAccessPath.schema.mof @@ -0,0 +1,13 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("DiskAccessPath")] +class DSC_DiskAccessPath : OMI_BaseResource +{ + [Key, Description("Specifies the access path folder to the assign the disk volume to.")] String AccessPath; + [Write, Description("Specifies no automatic drive letter assignment to the partition: Defaults to True")] Boolean NoDefaultDriveLetter; + [Required, Description("Specifies the disk identifier for the disk to modify.")] String DiskId; + [Write, Description("Specifies the identifier type the DiskId contains. Defaults to Number."), ValueMap{"Number","UniqueId","Guid","Location"}, Values{"Number","UniqueId","Guid","Location"}] String DiskIdType; + [Write, Description("Specifies the size of new volume.")] Uint64 Size; + [Write, Description("Define volume label if required.")] String FSLabel; + [Write, Description("Specifies the allocation unit size to use when formatting the volume.")] Uint32 AllocationUnitSize; + [Write, Description("Specifies the file system format of the new volume."), ValueMap{"NTFS","ReFS"}, Values{"NTFS","ReFS"}] String FSFormat; +}; diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/README.md b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/README.md new file mode 100644 index 0000000..72592f3 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/README.md @@ -0,0 +1,30 @@ +# Description + +The resource is used to initialize, format and mount the partition/volume to a folder +access path. +The disk to add the partition/volume to is selected by specifying the _DiskId_ and +optionally _DiskIdType_. +The _DiskId_ value can be a _Disk Number_, _Unique Id_, _Guid_ or _Location_. + +**Important: The _Disk Number_ is not a reliable method of selecting a disk because +it has been shown to change between reboots in some environments. +It is recommended to use the _Unique Id_ if possible.** + +The _Disk Number_, _Unique Id_, _Guid_ and _Location_ can be identified for a +disk by using the PowerShell command: + +```powershell +Get-Disk | Select-Object -Property FriendlyName,DiskNumber,UniqueId,Guid,Location +``` + +Note: The _Guid_ for a disk is only assigned once the partition table for the disk +has been created (e.g. the disk has been initialized). Therefore to use this method +of disk selection the disk must have been initialized by some other method. + +## Known Issues + +### Null Location + +The _Location_ for a disk may be `null` for some types of disk, +e.g. file-based virtual disks. Physical disks or Virtual disks provided via a +hypervisor or other hardware virtualization platform should not be affected. diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/en-US/DSC_DiskAccessPath.strings.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/en-US/DSC_DiskAccessPath.strings.psd1 new file mode 100644 index 0000000..4728c77 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_DiskAccessPath/en-US/DSC_DiskAccessPath.strings.psd1 @@ -0,0 +1,39 @@ +ConvertFrom-StringData @' + GettingDiskMessage = Getting disk with {0} '{1}' status for access path '{2}'. + SettingDiskMessage = Setting disk with {0} '{1}' status for access path '{2}'. + SetDiskOnlineMessage = Setting disk with {0} '{1}' online. + SetDiskReadWriteMessage = Setting disk with {0} '{1}' to read/write. + CheckingDiskPartitionStyleMessage = Checking disk with {0} '{1}' partition style. + InitializingDiskMessage = Initializing disk with {0} '{1}'. + DiskAlreadyInitializedMessage = Disk with {0} '{1}' is already initialized with GPT. + CreatingPartitionMessage = Creating partition on disk with {0} '{1}' using {2}. + FormattingVolumeMessage = Formatting the volume as '{0}'. + SuccessfullyInitializedMessage = Successfully initialized volume and assigned to access path '{0}'. + ChangingVolumeLabelMessage = Changing Volume assigned to access path '{0}' label to '{1}'. + NewPartitionIsReadOnlyMessage = New partition '{1}' on disk with {0} '{1}' is readonly. Waiting for it to become writable. + TestingDiskMessage = Testing disk with {0} '{1}' status for access path '{2}'. + CheckDiskInitializedMessage = Checking if disk with {0} '{1}' is initialized. + DiskNotFoundMessage = Disk with {0} '{1}' was not found. + DiskNotOnlineMessage = Disk with {0} '{1}' is not online. + DiskReadOnlyMessage = Disk with {0} '{1}'is readonly. + DiskNotGPTMessage = Disk with {0} '{1}' is initialised with '{2}' partition style. GPT required. + AccessPathNotFoundMessage = A volume assigned to access path '{0}' was not found. + NoDefaultDriveLetterMismatchMessage = Partition default drive letter assigmemt parameter '{0}' does not match '{1}'. + SizeMismatchMessage = Partition assigned to access path '{0}' has size {1}, which does not match expected size {2}. + AllocationUnitSizeMismatchMessage = Volume assigned to access path '{0}' has allocation unit size {1} KB does not match expected allocation unit size {2} KB. + FileSystemFormatMismatch = Volume assigned to access path '{0}' filesystem format '{1}' does not match expected format '{2}'. + DriveLabelMismatch = Volume assigned to access path '{0}' label '{1}' does not match expected label '{2}'. + PartitionAlreadyAssignedMessage = Partition '{1}' is already assigned to access path '{0}'. + MatchingPartitionNotFoundMessage = Disk with {0} '{1}' already contains paritions, but none match required size. + MatchingPartitionNoSizeMessage = Disk with {0} '{1}' already contains partitions, but size parameter is not specified. + SearchForVolumeMessage = Searching for {3} volume not assigned to path on partition '{2}' disk with {0} '{1}'. + VolumeFoundMessage = Found {3} volume not assigned to path on partition '{2}' disk with {0} '{1}'. + MatchingPartitionFoundMessage = Disk with {0} '{1}' already contains paritions, and partition '{2}' matches required size. + AccessPathNotFoundOnPartitionMessage = Disk with {0} '{1}' does not contain a partition assigned to access path '{2}'. + CheckingPSDriveMessage = Checking access path '{0}' is available as PSDrive '{1}'. + UnavailablePSDriveMessage = Access path '{0}' is unavailable as PSDrive '{1}', refreshing PSDrives list. + PSDriveFoundMessage = Access path '{0}' found as PSDrive '{1}'. + PSDriveNotFoundMessage = Access path '{0}' not found as PSDrive '{1}'. + DiskAlreadyInitializedError = Disk with {0} '{1}' is already initialized with {2}. + NewParitionIsReadOnlyError = New partition '{2}' on disk with {0} '{1}' did not become writable in the expected time. +'@ diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/DSC_MountImage.psm1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/DSC_MountImage.psm1 new file mode 100644 index 0000000..bc85389 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/DSC_MountImage.psm1 @@ -0,0 +1,594 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Storage Common Module. +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'StorageDsc.Common' ` + -ChildPath 'StorageDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings. +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current mount state of the VHD or ISO file. + + .PARAMETER ImagePath + Specifies the path of the VHD or ISO file. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ImagePath + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingMountedImageMessage ` + -f $ImagePath) + ) -join '' ) + + $diskImage = Get-DiskImage -ImagePath $ImagePath + + if ($diskImage.Attached) + { + $returnValue = @{ + ImagePath = $ImagePath + DriveLetter = '' + StorageType = [Microsoft.PowerShell.Cmdletization.GeneratedTypes.DiskImage.StorageType] $diskImage.StorageType + Access = 'ReadOnly' + Ensure = 'Present' + } + + # Determine the Disk Image Access mode + if ($diskImage.StorageType ` + -eq [Microsoft.PowerShell.Cmdletization.GeneratedTypes.DiskImage.StorageType]::ISO) + { + # Get the Drive Letter the ISO is mounted as + $volume = $diskImage | Get-Volume + $returnValue.Driveletter = $volume.DriveLetter + } + else + { + # Look up the disk and find out if it is readwrite. + $disk = Get-Disk -Number $diskImage.Number + if (-not $disk.IsReadOnly) + { + $returnValue.Access = 'ReadWrite' + } # if + + # Find the first 'Basic' partition + $partitions = $disk | Get-Partition + $partition = $partitions | Where-Object -Property Type -EQ 'Basic' + + # Find the first volume in the partition and get the mounted Drive Letter + $volumes = $partition | Get-Volume + $volume = $volumes | Select-Object -First 1 + + $returnValue.Driveletter = $volume.DriveLetter + } # if + } + else + { + $returnValue = @{ + ImagePath = $ImagePath + Ensure = 'Absent' + } + } # if + + $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Mounts or dismounts the ISO or VHD. + + .PARAMETER ImagePath + Specifies the path of the VHD or ISO file. + + .PARAMETER DriveLetter + Specifies the drive letter to mount this VHD or ISO to. + + .PARAMETER StorageType + Specifies the storage type of a file. If the StorageType parameter is not specified, then the storage type is determined by file extension. + + .PARAMETER Access + Allows a VHD file to be mounted in read-only or read-write mode. ISO files are mounted in read-only mode regardless of what parameter value you provide. + + .PARAMETER Ensure + Determines whether the setting should be applied or removed. +#> +function Set-TargetResource +{ + # Should process is called in a helper functions but not directly in Set-TargetResource + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')] + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ImagePath, + + [Parameter()] + [System.String] + $DriveLetter, + + [Parameter()] + [ValidateSet('ISO','VHD','VHDx','VHDSet')] + [System.String] + $StorageType, + + [Parameter()] + [ValidateSet('ReadOnly','ReadWrite')] + [System.String] + $Access, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.SettingMountedImageMessage ` + -f $ImagePath) + ) -join '' ) + + # Check the parameter combo passed is valid, and throw if not. + $null = Test-ParameterValid @PSBoundParameters + + # Get the current mount state of this disk image + $currentState = Get-TargetResource -ImagePath $ImagePath + + # Remove Ensure from PSBoundParameters so it can be splatted + $null = $PSBoundParameters.Remove('Ensure') + + if ($Ensure -eq 'Present') + { + # Get the normalized DriveLetter (colon removed) + $normalizedDriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + # The Disk Image should be mounted + $needsMount = $false + if ($currentState.Ensure -eq 'Absent') + { + $needsMount = $true + } + else + { + if ($currentState.DriveLetter -ne $normalizedDriveLetter) + { + # The disk image is mounted to the wrong DriveLetter -remount disk + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DismountingImageMessage ` + -f $ImagePath,$currentState.DriveLetter) + ) -join '' ) + + Dismount-DiskImage -ImagePath $ImagePath + $needsMount = $true + } # if + } # if + + if ($currentState.StorageType -ne 'ISO') + { + if ($PSBoundParameters.ContainsKey('Access')) + { + # For VHD/VHDx/VHDSet disks check the access mode + if ($currentState.Access -ne $Access) + { + # The access mode is wrong -remount disk + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DismountingImageMessage ` + -f $ImagePath,$currentState.DriveLetter) + ) -join '' ) + + Dismount-DiskImage -ImagePath $ImagePath + $needsMount = $true + } # if + } # if + } # if + + if ($needsMount) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.MountingImageMessage ` + -f $ImagePath,$normalizedDriveLetter) + ) -join '' ) + + Mount-DiskImageToLetter @PSBoundParameters + } # if + } + else + { + # The Disk Image should not be mounted + if ($currentState.Ensure -eq 'Present') + { + # It is mounted so dismount it + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DismountingImageMessage ` + -f $ImagePath,$currentState.DriveLetter) + ) -join '' ) + + Dismount-DiskImage -ImagePath $ImagePath + } + } # if +} # Set-TargetResource + +<# + .SYNOPSIS + Tests if the ISO or VHD file mount is in the correct state. + + .PARAMETER ImagePath + Specifies the path of the VHD or ISO file. + + .PARAMETER DriveLetter + Specifies the drive letter to mount this VHD or ISO to. + + .PARAMETER StorageType + Specifies the storage type of a file. If the StorageType parameter is not + specified, then the storage type is determined by file extension. + + .PARAMETER Access + Allows a VHD file to be mounted in read-only or read-write mode. ISO files + are mounted in read-only mode regardless of what parameter value you provide. + + .PARAMETER Ensure + Determines whether the setting should be applied or removed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ImagePath, + + [Parameter()] + [System.String] + $DriveLetter, + + [Parameter()] + [ValidateSet('ISO','VHD','VHDx','VHDSet')] + [System.String] + $StorageType, + + [Parameter()] + [ValidateSet('ReadOnly','ReadWrite')] + [System.String] + $Access, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.TestingMountedImageMessage ` + -f $DriveLetter) + ) -join '' ) + + # Check the parameter combo passed is valid, and throw if not. + $null = Test-ParameterValid @PSBoundParameters + + # Get the current mount state of this disk image + $currentState = Get-TargetResource -ImagePath $ImagePath + + if ($Ensure -eq 'Present') + { + # Get the normalized DriveLetter (colon removed) + $normalizedDriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + # The Disk Image should be mounted + if ($currentState.Ensure -eq 'Absent') + { + # The disk image isn't mounted + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ImageIsNotMountedButShouldBeMessage ` + -f $ImagePath,$normalizedDriveLetter) + ) -join '' ) + return $false + } # if + + if ($currentState.DriveLetter -ne $normalizedDriveLetter) + { + # The disk image is mounted to the wrong DriveLetter + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ImageIsMountedToTheWrongDriveLetterMessage ` + -f $ImagePath,$currentState.DriveLetter,$normalizedDriveLetter) + ) -join '' ) + return $false + } # if + + if ($currentState.StorageType -ne 'ISO') + { + if ($PSBoundParameters.ContainsKey('Access')) + { + # For VHD/VHDx/VHDSet disks check the access mode + if ($currentState.Access -ne $Access) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.VHDAccessModeMismatchMessage ` + -f $ImagePath,$normalizedDriveLetter,$currentState.Access,$Access) + ) -join '' ) + return $false + } # if + } # if + } # if + + # The Disk Image is mounted to the expected Drive - nothing to change. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ImageIsMountedAndShouldBeMessage ` + -f $ImagePath,$normalizedDriveLetter) + ) -join '' ) + } + else + { + # The Disk Image should not be mounted + if ($currentState.Ensure -eq 'Present') + { + # The disk image is mounted + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ImageIsMountedButShouldNotBeMessage ` + -f $ImagePath,$currentState.DriveLetter) + ) -join '' ) + return $false + } # if + + # The image is not mounted and should not be + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ImageIsNotMountedAndShouldNotBeMessage ` + -f $ImagePath) + ) -join '' ) + } # if + + # No changes are needed + return $true +} # Test-TargetResource + +<# + .SYNOPSIS + Validates that the parameters passed are valid. If the parameter combination + is invalid then an exception will be thrown. Also validates the DriveLetter + value that is passed is valid. + + .PARAMETER ImagePath + Specifies the path of the VHD or ISO file. + + .PARAMETER DriveLetter + Specifies the drive letter to mount this VHD or ISO to. + + .PARAMETER StorageType + Specifies the storage type of a file. If the StorageType parameter is not + specified, then the storage type is determined by file extension. + + .PARAMETER Access + Allows a VHD file to be mounted in read-only or read-write mode. ISO files + are mounted in read-only mode regardless of what parameter value you provide. + + .PARAMETER Ensure + Determines whether the setting should be applied or removed. + + .OUTPUTS + If ensure is present then returns a normalized array of Drive Letters. +#> +function Test-ParameterValid +{ + [CmdletBinding()] + [OutputType([String[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ImagePath, + + [Parameter()] + [System.String] + $DriveLetter, + + [Parameter()] + [ValidateSet('ISO','VHD','VHDx','VHDSet')] + [System.String] + $StorageType, + + [Parameter()] + [ValidateSet('ReadOnly','ReadWrite')] + [System.String] + $Access, + + [Parameter()] + [ValidateSet('Present','Absent')] + [System.String] + $Ensure = 'Present' + ) + + if ($Ensure -eq 'Absent') + { + if ($PSBoundParameters.ContainsKey('DriveLetter')) + { + # The DriveLetter should not be set if Ensure is Absent + New-InvalidOperationException ` + -Message ($script:localizedData.InvalidParameterSpecifiedError -f ` + 'Absent','DriveLetter') + } # if + + if ($PSBoundParameters.ContainsKey('StorageType')) + { + # The StorageType should not be set if Ensure is Absent + New-InvalidOperationException ` + -Message ($script:localizedData.InvalidParameterSpecifiedError -f ` + 'Absent','StorageType') + } # if + + if ($PSBoundParameters.ContainsKey('Access')) + { + # The Access should not be set if Ensure is Absent + New-InvalidOperationException ` + -Message ($script:localizedData.InvalidParameterSpecifiedError -f ` + 'Absent','Access') + } # if + } + else + { + if (-not (Test-Path -Path $ImagePath)) + { + # The file specified by ImagePath should be found + New-InvalidOperationException ` + -Message ($script:localizedData.DiskImageFileNotFoundError -f ` + $ImagePath) + } # if + + if ($PSBoundParameters.ContainsKey('DriveLetter')) + { + # Test the Drive Letter to ensure it is valid + $normalizedDriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + } + else + { + # Drive letter is not specified but Ensure is present. + New-InvalidOperationException ` + -Message ($script:localizedData.InvalidParameterNotSpecifiedError -f ` + 'Present','DriveLetter') + } # if + } # if +} # Test-ParameterValid + +<# + .SYNOPSIS + Mounts a Disk Image to a specific Drive Letter. + + .PARAMETER ImagePath + Specifies the path of the VHD or ISO file. + + .PARAMETER DriveLetter + Specifies the drive letter to mount this VHD or ISO to. + + .PARAMETER StorageType + Specifies the storage type of a file. If the StorageType parameter is not + specified, then the storage type is determined by file extension. + + .PARAMETER Access + Allows a VHD file to be mounted in read-only or read-write mode. ISO files + are mounted in read-only mode regardless of what parameter value you provide. +#> +function Mount-DiskImageToLetter +{ + [CmdletBinding()] + [OutputType([String[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ImagePath, + + [Parameter()] + [System.String] + $DriveLetter, + + [Parameter()] + [ValidateSet('ISO','VHD','VHDx','VHDSet')] + [System.String] + $StorageType, + + [Parameter()] + [ValidateSet('ReadOnly','ReadWrite')] + [System.String] + $Access + ) + + # Get the normalized DriveLetter (colon removed) + $normalizedDriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + # Mount the Diskimage + $mountParams = @{ + ImagePath = $ImagePath + } + + if ($PSBoundParameters.ContainsKey('Access')) + { + $mountParams += @{ + Access = $Access + } + } # if + $null = Mount-DiskImage @mountParams + + # Get the DiskImage object + $diskImage = Get-DiskImage -ImagePath $ImagePath + + # Determine the Storage Type expected + if (-not $PSBoundParameters.ContainsKey('StorageType')) + { + $StorageType = [Microsoft.PowerShell.Cmdletization.GeneratedTypes.DiskImage.StorageType] $diskImage.StorageType + } # if + + # Different StorageType images require different methods of getting the Volume object. + if ($StorageType -eq [Microsoft.PowerShell.Cmdletization.GeneratedTypes.DiskImage.StorageType]::ISO) + { + # This is a ISO diskimage + $volume = $diskImage | Get-Volume + } + else + { + # This is a VHD/VHDx/VHDSet diskimage + $disk = Get-Disk -Number $diskImage.Number + + # Find the first 'Basic' partition to mount + $partitions = $disk | Get-Partition + $partition = $partitions | Where-Object -Property Type -EQ 'Basic' + + # Find the first volume in the partition and get the mounted Drive Letter + $volumes = $partition | Get-Volume + $volume = $volumes | Select-Object -First 1 + } # if + + $currentDriveLetter = $volume.DriveLetter + + # Verify that the drive letter assigned to the drive is the one needed. + if ($currentDriveLetter -ne $normalizedDriveLetter) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.ChangingImageDriveLetterMessage ` + -f $ImagePath,$currentDriveLetter,$normalizedDriveLetter) + ) -join '' ) + + <# + Use CIM to change the DriveLetter. + The Win32_Volume must be looked up using the ObjectId found in the Volume object + ObjectId is more verbose than DeviceId in Windows 10 Anniversary Edition, look for + DeviceId in the ObjectId string to match volumes. + #> + $cimVolume = Get-CimInstance -ClassName Win32_Volume | + Where-Object -FilterScript { + $volume.ObjectId.IndexOf($_.DeviceId) -ne -1 + } + + Set-CimInstance ` + -InputObject $cimVolume ` + -Property @{ + DriveLetter = "$($normalizedDriveLetter):" + } + } # if +} # Mount-DiskImageToLetter + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/DSC_MountImage.schema.mof b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/DSC_MountImage.schema.mof new file mode 100644 index 0000000..682fe2b --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/DSC_MountImage.schema.mof @@ -0,0 +1,11 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("MountImage")] +class DSC_MountImage : OMI_BaseResource +{ + [Key, Description("Specifies the path of the VHD or ISO file.")] String ImagePath; + [Write, Description("Specifies the drive letter to mount this VHD or ISO to.")] String DriveLetter; + [Write, Description("Specifies the storage type of a file. If the StorageType parameter is not specified, then the storage type is determined by file extension."), ValueMap{"ISO","VHD","VHDx","VHDSet"}, Values{"ISO","VHD","VHDx","VHDSet"}] String StorageType; + [Write, Description("Allows a VHD file to be mounted in read-only or read-write mode. ISO files are mounted in read-only mode regardless of what parameter value you provide."), ValueMap{"ReadOnly","ReadWrite"}, Values{"ReadOnly","ReadWrite"}] String Access; + [Write, Description("Determines whether the VHD or ISO should be mounted or not."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; + diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/README.md b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/README.md new file mode 100644 index 0000000..094f10d --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/README.md @@ -0,0 +1,4 @@ +# Description + +The resource is used to mount or unmount an ISO/VHD disk image. It can be +mounted as read-only (ISO, VHD, VHDx) or read/write (VHD, VHDx). diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/en-US/DSC_MountImage.strings.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/en-US/DSC_MountImage.strings.psd1 new file mode 100644 index 0000000..ca888cf --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_MountImage/en-US/DSC_MountImage.strings.psd1 @@ -0,0 +1,17 @@ +ConvertFrom-StringData @' + GettingMountedImageMessage = Getting Mounted Drive for image file '{0}'. + SettingMountedImageMessage = Setting Mounted Drive for image file '{0}'. + DismountingImageMessage = The image file '{0}' is being dismounted from drive '{1}'. + TestingMountedImageMessage = Testing Mounted Drive for image file '{0}'. + ImageIsNotMountedButShouldBeMessage = The image file '{0}' is not mounted to drive '{1}' but should be. Change required. + ImageIsMountedToTheWrongDriveLetterMessage = The image file '{0}' is mounted as drive '{1}' but should be mounted as drive '{2}'. Change required. + VHDAccessModeMismatchMessage = The image file '{0}' is mounted to drive '{1}' but the access is '{2}' and should be '{3}'. Change required. + ImageIsMountedAndShouldBeMessage = The image file '{0}' is mounted to drive '{1}' and should be. + ImageIsMountedButShouldNotBeMessage = The image file '{0}' is mounted to drive '{1}' but should not be. Change required. + ImageIsNotMountedAndShouldNotBeMessage = The image file '{0}' is not mounted and should not be. + InvalidParameterSpecifiedError = Ensure is '{0}' but '{1}' was specified. + InvalidParameterNotSpecifiedError = Ensure is '{0}' but '{1}' was not specified. + DiskImageFileNotFoundError = The image file '{0}' could not be found. + MountingImageMessage = The image file '{0}' is being mounted as drive '{1}'. + ChangingImageDriveLetterMessage = The image file '{0}' mounted as drive '{1}' will be changed to '{2}'. +'@ diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/DSC_OpticalDiskDriveLetter.psm1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/DSC_OpticalDiskDriveLetter.psm1 new file mode 100644 index 0000000..01c7a34 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/DSC_OpticalDiskDriveLetter.psm1 @@ -0,0 +1,390 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Storage Common Module. +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'StorageDsc.Common' ` + -ChildPath 'StorageDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings. +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + This helper function returns a hashtable containing the current + drive letter assigned to the optical disk in the system matching + the disk number. + + If the drive exists but is not mounted to a drive letter then + the DriveLetter will be empty, but the DeviceId will contain the + DeviceId representing the optical disk. + + If there are no optical disks found in the system an exception + will be thrown. + + .PARAMETER DiskId + Specifies the optical disk number for the disk to return the drive + letter of. + + .NOTES + The Caption and DeviceID properties are checked to avoid + mounted ISO images in Windows 2012+ and Windows 10. The + device ID is required because a CD/DVD in a Hyper-V virtual + machine has the same caption as a mounted ISO. + + Example DeviceID for a virtual drive in a Hyper-V VM - SCSI\CDROM&VEN_MSFT&PROD_VIRTUAL_DVD-ROM\000006 + Example DeviceID for a mounted ISO in a Hyper-V VM - SCSI\CDROM&VEN_MSFT&PROD_VIRTUAL_DVD-ROM\2&1F4ADFFE&0&000002 +#> +function Get-OpticalDiskDriveLetter +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DiskId + ) + + $driveLetter = $null + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.UsingGetCimInstanceToFetchDriveLetter -f $DiskId) + ) -join '' ) + + # Get the optical disk matching the Id + $opticalDisks = Get-CimInstance -ClassName Win32_CDROMDrive | + Where-Object -FilterScript { + -not ( + $_.Caption -eq 'Microsoft Virtual DVD-ROM' -and + ($_.DeviceID.Split('\')[-1]).Length -gt 10 + ) + } + + if ($opticalDisks) + { + <# + To behave in a similar fashion to the other xStorage resources the + DiskId represents the number of the optical disk in the system. + However as these are returned as an array of 0..x elements then + subtract one from the DiskId to get the actual optical disk number + that is required. + #> + $opticalDisk = $opticalDisks[$DiskId - 1] + + if ($opticalDisk) + { + try + { + # Make sure the current DriveLetter is an actual drive letter + $driveLetter = Assert-DriveLetterValid -DriveLetter $opticalDisk.Drive -Colon + } + catch + { + # Optical drive exists but is not mounted to a drive letter + $driveLetter = '' + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.OpticalDiskNotAssignedDriveLetter -f $DiskId) + ) -join '' ) + } + + $deviceId = $opticalDisk.Drive + } + } + + if ([System.String]::IsNullOrEmpty($deviceId)) + { + # The requested optical drive does not exist in the system + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.OpticalDiskDriveDoesNotExist -f $DiskId) + ) -join '' ) + } + + return @{ + DriveLetter = $driveLetter + DeviceId = $deviceId + } +} + +<# + .SYNOPSIS + Returns the current drive letter assigned to the optical disk. + + .PARAMETER DiskId + Specifies the optical disk number for the disk to assign the drive + letter to. + + .PARAMETER DriveLetter + Specifies the drive letter to assign to the optical disk. Can be a + single letter, optionally followed by a colon. This value is ignored + if Ensure is set to Absent. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter(Mandatory = $true)] + [System.String] + $DriveLetter + ) + + $ensure = 'Absent' + + # Get the drive letter assigned to the optical disk + $currentDriveInfo = Get-OpticalDiskDriveLetter -DiskId $DiskId + + if ([System.String]::IsNullOrEmpty($currentDriveInfo.DeviceId)) + { + $currentDriveLetter = '' + } + else + { + $currentDriveLetter = $currentDriveInfo.DriveLetter + + if ([System.String]::IsNullOrWhiteSpace($currentDriveLetter)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.OpticalDiskNotAssignedDriveLetter -f $DiskId) + ) -join '' ) + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.OpticalDiskAssignedDriveLetter -f $DiskId, $DriveLetter) + ) -join '' ) + + $ensure = 'Present' + } + } + + $returnValue = @{ + DiskId = $DiskId + DriveLetter = $currentDriveLetter + Ensure = $ensure + } + + return $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Sets the drive letter of an optical disk. + + .PARAMETER DiskId + Specifies the optical disk number for the disk to assign the drive + letter to. + + .PARAMETER DriveLetter + Specifies the drive letter to assign to the optical disk. Can be a + single letter, optionally followed by a colon. This value is ignored + if Ensure is set to Absent. + + .PARAMETER Ensure + Determines whether a drive letter should be assigned to the + optical disk. Defaults to 'Present'. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter(Mandatory = $true)] + [System.String] + $DriveLetter, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + # Allow use of drive letter without colon + $DriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter -Colon + + # Get the drive letter assigned to the optical disk + $currentDriveInfo = Get-OpticalDiskDriveLetter -DiskId $DiskId + $currentDriveLetter = $currentDriveInfo.DriveLetter + + if ([System.String]::IsNullOrWhiteSpace($currentDriveLetter)) + { + <# + If the current drive letter is empty then the volume must be looked up by DeviceId + The DeviceId in the volume will show as \\?\Volume{bba1802b-e7a1-11e3-824e-806e6f6e6963}\ + So we need to change the currentDriveLetter to match this value when we set the drive letter + #> + $deviceId = $currentDriveInfo.DeviceId + + $volume = Get-CimInstance ` + -ClassName Win32_Volume ` + -Filter "DeviceId = '\\\\?\\$deviceId\\'" + } + else + { + $volume = Get-CimInstance ` + -ClassName Win32_Volume ` + -Filter "DriveLetter = '$currentDriveLetter'" + } + + # Does the Drive Letter need to be added or removed + if ($Ensure -eq 'Absent') + { + if (-not [System.String]::IsNullOrEmpty($currentDriveInfo.DeviceId)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.AttemptingToRemoveDriveLetter -f $diskId, $currentDriveLetter) + ) -join '' ) + + $volume | Set-CimInstance -Property @{ + DriveLetter = $null + } + } + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.AttemptingToSetDriveLetter -f $diskId, $currentDriveLetter, $DriveLetter) + ) -join '' ) + + $volume | Set-CimInstance -Property @{ + DriveLetter = $DriveLetter + } + } +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the disk letter assigned to an optical disk is correct. + + .PARAMETER DiskId + Specifies the optical disk number for the disk to assign the drive + letter to. + + .PARAMETER DriveLetter + Specifies the drive letter to assign to the optical disk. Can be a + single letter, optionally followed by a colon. This value is ignored + if Ensure is set to Absent. + + .PARAMETER Ensure + Determines whether a drive letter should be assigned to the + optical disk. Defaults to 'Present'. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter(Mandatory = $true)] + [System.String] + $DriveLetter, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $desiredConfigurationMatch = $true + + # Allow use of drive letter without colon + $DriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter -Colon + + # Get the drive letter assigned to the optical disk + $currentDriveInfo = Get-OpticalDiskDriveLetter -DiskId $DiskId + $currentDriveLetter = $currentDriveInfo.DriveLetter + + if ($Ensure -eq 'Absent') + { + if (-not [System.String]::IsNullOrEmpty($currentDriveInfo.DeviceId)) + { + # The Drive Letter should be absent from the optical disk + if ([System.String]::IsNullOrWhiteSpace($currentDriveLetter)) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DriveLetterDoesNotExistAndShouldNot -f $DiskId) + ) -join '' ) + } + else + { + # The Drive Letter needs to be dismounted + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DriveLetterExistsButShouldNot -f $DiskId, $currentDriveLetter) + ) -join '' ) + + $desiredConfigurationMatch = $false + } + } + } + else + { + # Throw an exception if the desired optical disk does not exist + if ([System.String]::IsNullOrEmpty($currentDriveInfo.DeviceId)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.NoOpticalDiskDriveError -f $DiskId) ` + -ArgumentName 'DiskId' + } + + if ($currentDriveLetter -eq $DriveLetter) + { + # The optical disk drive letter is already set correctly + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DriverLetterExistsAndIsCorrect -f $DiskId, $DriveLetter) + ) -join '' ) + } + else + { + # Is a desired drive letter already assigned to a different drive? + $existingVolume = Get-CimInstance ` + -ClassName Win32_Volume ` + -Filter "DriveLetter = '$DriveLetter'" + + if ($existingVolume) + { + # The desired drive letter is already assigned to another drive - can't proceed + New-InvalidOperationException ` + -Message $($script:localizedData.DriveLetterAssignedToAnotherDrive -f $DriveLetter) + } + else + { + # The optical drive letter needs to be changed + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DriverLetterExistsAndIsNotCorrect -f $DiskId, $currentDriveLetter, $DriveLetter) + ) -join '' ) + + $desiredConfigurationMatch = $false + } + } + } + + return $desiredConfigurationMatch +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/DSC_OpticalDiskDriveLetter.schema.mof b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/DSC_OpticalDiskDriveLetter.schema.mof new file mode 100644 index 0000000..1b92027 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/DSC_OpticalDiskDriveLetter.schema.mof @@ -0,0 +1,8 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("OpticalDiskDriveLetter")] +class DSC_OpticalDiskDriveLetter : OMI_BaseResource +{ + [Key, Description("Specifies the optical disk number for the disk to assign the drive letter to.")] String DiskId; + [Required, Description("Specifies the drive letter to assign to the optical disk. Can be a single letter, optionally followed by a colon. This value is ignored if Ensure is set to Absent.")] String DriveLetter; + [Write, Description("Determines whether a drive letter should be assigned to the optical disk. Defaults to 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/README.md b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/README.md new file mode 100644 index 0000000..aba1f40 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/README.md @@ -0,0 +1,39 @@ +# Description + +The resource is used to set the drive letter of an optical disk drive (e.g. +a CDROM or DVD drive). + +It can be used to set the drive letter of a specific optical disk drive if +there are multiple in the system by specifying a value greater than 1 for +the `DiskId` parameter. + +In a system with a single optical disk drive then the `DiskId` should +be set to 1. + +In systems with multiple optical disks, the `DiskId` should be set to +the ordinal number of the required optical disk found in the list +returned when executing the following cmdlet: + +```powershell +Get-CimInstance -ClassName Win32_CDROMDrive +``` + +Warning: Adding and removing optical drive devices to a system may cause the +order the optical drives appear in the system to change. Therefore, the +drive ordinal number may be affected in these situations. + +It is designed to ignore _temporary_ optical disk drives that are created +when mounting ISOs on Windows Server 2012+. + +With the Device ID, we look for the length of the string after the final +backslash (crude, but appears to work so far). + +Example: + +```powershell +# DeviceID for a virtual drive in a Hyper-V VM +"SCSI\CDROM&VEN_MSFT&PROD_VIRTUAL_DVD-ROM\**000006**" + +# DeviceID for a mounted ISO in a Hyper-V VM +"SCSI\CDROM&VEN_MSFT&PROD_VIRTUAL_DVD-ROM\**2&1F4ADFFE&0&000002**" +``` diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/en-US/DSC_OpticalDiskDriveLetter.strings.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/en-US/DSC_OpticalDiskDriveLetter.strings.psd1 new file mode 100644 index 0000000..e380ede --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_OpticalDiskDriveLetter/en-US/DSC_OpticalDiskDriveLetter.strings.psd1 @@ -0,0 +1,16 @@ +ConvertFrom-StringData @' + UsingGetCimInstanceToFetchDriveLetter = Using Get-CimInstance to get the drive letter of optical disk {0} in the system. + OpticalDiskAssignedDriveLetter = The optical disk {0} is currently assigned drive letter '{1}'. + OpticalDiskNotAssignedDriveLetter = The optical disk {0} is not currently assigned a drive letter. + OpticalDiskDriveDoesNotExist = The optical disk {0} could not be found in the system. + NoOpticalDiskDriveError = The optical disk {0} could not be found in the system, so this resource has nothing to do. This resource does not change the drive letter of mounted ISOs. + + AttemptingToSetDriveLetter = The optical disk {0} drive letter is '{1}', attempting to set to '{2}'. + AttemptingToRemoveDriveLetter = The optical disk {0} drive letter is '{1}', attempting to remove it. + + DriveLetterDoesNotExistAndShouldNot = The optical disk {0} does not have a drive letter assigned. Change not required. + DriveLetterExistsButShouldNot = The optical disk {0} is assigned the drive letter '{1}' which should be removed. Change required. + DriverLetterExistsAndIsCorrect = The optical disk {0} is assigned the drive letter '{1}' which is correct. Change not required. + DriveLetterAssignedToAnotherDrive = Drive letter '{0}' is already present but assigned to a another volume. Change can not proceed. + DriverLetterExistsAndIsNotCorrect = The optical disk {0} is assigned the drive letter '{1}' but should be '{2}'. Change required. +'@ diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/DSC_WaitForDisk.psm1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/DSC_WaitForDisk.psm1 new file mode 100644 index 0000000..6fd425c --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/DSC_WaitForDisk.psm1 @@ -0,0 +1,220 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Storage Common Module. +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'StorageDsc.Common' ` + -ChildPath 'StorageDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings. +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the wait for disk resource. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to wait for. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER RetryIntervalSec + Specifies the number of seconds to wait for the disk to become available. + + .PARAMETER RetryCount + The number of times to loop the retry interval while waiting for the disk. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number','UniqueId','Guid','Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [System.UInt32] + $RetryIntervalSec = 10, + + [Parameter()] + [System.UInt32] + $RetryCount = 60 + ) + + $isAvailable = Test-TargetResource @PSBoundParameters + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingWaitForDiskStatusMessage -f $DiskIdType,$DiskId) + ) -join '' ) + + $returnValue = @{ + DiskId = $DiskId + DiskIdType = $DiskIdType + RetryIntervalSec = $RetryIntervalSec + RetryCount = $RetryCount + IsAvailable = $isAvailable + } + + return $returnValue +} # function Get-TargetResource + +<# + .SYNOPSIS + Sets the current state of the wait for disk resource. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to wait for. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER RetryIntervalSec + Specifies the number of seconds to wait for the disk to become available. + + .PARAMETER RetryCount + The number of times to loop the retry interval while waiting for the disk. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number','UniqueId','Guid','Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [System.UInt32] + $RetryIntervalSec = 10, + + [Parameter()] + [System.UInt32] + $RetryCount = 60 + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingForDiskStatusMessage -f $DiskIdType,$DiskId) + ) -join '' ) + + $diskFound = $false + + for ($count = 0; $count -lt $RetryCount; $count++) + { + # Get the Disk using the identifiers supplied + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + + if ($disk) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskFoundMessage -f $DiskIdType,$DiskId,$disk.FriendlyName) + ) -join '' ) + + $diskFound = $true + break + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskNotFoundRetryingMessage -f $DiskIdType,$DiskId,$RetryIntervalSec) + ) -join '' ) + + Start-Sleep -Seconds $RetryIntervalSec + } # if + } # for + + if (-not $diskFound) + { + New-InvalidOperationException ` + -Message $($script:localizedData.DiskNotFoundAfterError -f $DiskIdType,$DiskId,$RetryCount) + } # if +} # function Set-TargetResource + +<# + .SYNOPSIS + Tests the current state of the wait for disk resource. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to wait for. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. + + .PARAMETER RetryIntervalSec + Specifies the number of seconds to wait for the disk to become available. + + .PARAMETER RetryCount + The number of times to loop the retry interval while waiting for the disk. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number','UniqueId','Guid','Location')] + [System.String] + $DiskIdType = 'Number', + + [Parameter()] + [System.UInt32] + $RetryIntervalSec = 10, + + [Parameter()] + [System.UInt32] + $RetryCount = 60 + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingForDiskStatusMessage -f $DiskIdType,$DiskId) + ) -join '' ) + + # Get the Disk using the identifiers supplied + $disk = Get-DiskByIdentifier ` + -DiskId $DiskId ` + -DiskIdType $DiskIdType + + if ($disk) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskFoundMessage -f $DiskIdType,$DiskId,$disk.FriendlyName) + ) -join '' ) + + return $true + } + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.DiskNotFoundMessage -f $DiskIdType,$DiskId) + ) -join '' ) + + return $false +} # function Test-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/DSC_WaitForDisk.schema.mof b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/DSC_WaitForDisk.schema.mof new file mode 100644 index 0000000..0ce2f8c --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/DSC_WaitForDisk.schema.mof @@ -0,0 +1,10 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("WaitForDisk")] +class DSC_WaitForDisk : OMI_BaseResource +{ + [Key, Description("Specifies the disk identifier for the disk to wait for.")] String DiskId; + [Write, Description("Specifies the identifier type the DiskId contains. Defaults to Number."), ValueMap{"Number","UniqueId","Guid","Location"}, Values{"Number","UniqueId","Guid","Location"}] String DiskIdType; + [Write, Description("Specifies the number of seconds to wait for the disk to become available.")] Uint32 RetryIntervalSec; + [Write, Description("The number of times to loop the retry interval while waiting for the disk.")] Uint32 RetryCount; + [Read, Description("Will indicate whether Disk is available.")] Boolean IsAvailable; +}; diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/README.md b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/README.md new file mode 100644 index 0000000..242e0d9 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/README.md @@ -0,0 +1,29 @@ +# Description + +This resource is used to wait for a disk to become available. +The disk to wait for is selected by specifying the _DiskId_ and optionally +_DiskIdType_. +The _DiskId_ value can be a _Disk Number_, _Unique Id_, _Guid_ or _Location_. + +**Important: The _Disk Number_ is not a reliable method of selecting a disk because +it has been shown to change between reboots in some environments. +It is recommended to use the _Unique Id_ if possible.** + +The _Disk Number_, _Unique Id_, _Guid_ and _Location_ can be identified for a +disk by using the PowerShell command: + +```powershell +Get-Disk | Select-Object -Property FriendlyName,DiskNumber,UniqueId,Guid,Location +``` + +Note: The _Guid_ for a disk is only assigned once the partition table for the disk +has been created (e.g. the disk has been initialized). Therefore to use this method +of disk selection the disk must have been initialized by some other method. + +## Known Issues + +### Null Location + +The _Location_ for a disk may be `null` for some types of disk, +e.g. file-based virtual disks. Physical disks or Virtual disks provided via a +hypervisor or other hardware virtualization platform should not be affected. diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/en-US/DSC_WaitForDisk.strings.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/en-US/DSC_WaitForDisk.strings.psd1 new file mode 100644 index 0000000..b7fb73b --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForDisk/en-US/DSC_WaitForDisk.strings.psd1 @@ -0,0 +1,8 @@ +ConvertFrom-StringData @' + GettingWaitForDiskStatusMessage = Getting Wait for Disk status for disk with {0} '{1}'. + CheckingForDiskStatusMessage = Checking for disk with {0} '{1}'. + DiskFoundMessage = Found disk with {0} '{1}' named '{2}'. + DiskNotFoundRetryingMessage = Disk with {0} '{1}' not found, retrying in {2} seconds. + DiskNotFoundAfterError = Disk with {0} '{1}' not found after {2} counts. + DiskNotFoundMessage = Disk with {0} '{1}' not found. +'@ diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/DSC_WaitForVolume.psm1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/DSC_WaitForVolume.psm1 new file mode 100644 index 0000000..1cd6b28 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/DSC_WaitForVolume.psm1 @@ -0,0 +1,205 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the Storage Common Module. +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'StorageDsc.Common' ` + -ChildPath 'StorageDsc.Common.psm1')) + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings. +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Returns the current state of the wait for drive resource. + + .PARAMETER DriveLetter + Specifies the name of the drive to wait for. + + .PARAMETER RetryIntervalSec + Specifies the number of seconds to wait for the drive to become available. + + .PARAMETER RetryCount + The number of times to loop the retry interval while waiting for the drive. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $DriveLetter, + + [Parameter()] + [UInt32] + $RetryIntervalSec = 10, + + [Parameter()] + [UInt32] + $RetryCount = 60 + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.GettingWaitForVolumeStatusMessage -f $DriveLetter) + ) -join '' ) + + # Validate the DriveLetter parameter + $DriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + $returnValue = @{ + DriveLetter = $DriveLetter + RetryIntervalSec = $RetryIntervalSec + RetryCount = $RetryCount + } + return $returnValue +} # function Get-TargetResource + +<# + .SYNOPSIS + Sets the current state of the wait for drive resource. + + .PARAMETER DriveLetter + Specifies the name of the drive to wait for. + + .PARAMETER RetryIntervalSec + Specifies the number of seconds to wait for the drive to become available. + + .PARAMETER RetryCount + The number of times to loop the retry interval while waiting for the drive. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $DriveLetter, + + [Parameter()] + [UInt32] + $RetryIntervalSec = 10, + + [Parameter()] + [UInt32] + $RetryCount = 60 + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingForVolumeStatusMessage -f $DriveLetter) + ) -join '' ) + + # Validate the DriveLetter parameter + $DriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + $volumeFound = $false + + for ($count = 0; $count -lt $RetryCount; $count++) + { + $volume = Get-Volume -DriveLetter $DriveLetter -ErrorAction SilentlyContinue + if ($volume) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.VolumeFoundMessage -f $DriveLetter) + ) -join '' ) + + $volumeFound = $true + break + } + else + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.VolumeNotFoundRetryingMessage -f $DriveLetter,$RetryIntervalSec) + ) -join '' ) + + Start-Sleep -Seconds $RetryIntervalSec + + <# + This command forces a refresh of the PS Drive subsystem. + So triggers any "missing" drives to show up. + #> + $null = Get-PSDrive + } # if + } # for + + if (-not $volumeFound) + { + New-InvalidOperationException ` + -Message $($script:localizedData.VolumeNotFoundAfterError -f $DriveLetter,$RetryCount) + } # if +} # function Set-TargetResource + +<# + .SYNOPSIS + Tests the current state of the wait for drive resource. + + .PARAMETER DriveLetter + Specifies the name of the drive to wait for. + + .PARAMETER RetryIntervalSec + Specifies the number of seconds to wait for the drive to become available. + + .PARAMETER RetryCount + The number of times to loop the retry interval while waiting for the drive. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $DriveLetter, + + [Parameter()] + [UInt32] + $RetryIntervalSec = 10, + + [Parameter()] + [UInt32] + $RetryCount = 60 + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.CheckingForVolumeStatusMessage -f $DriveLetter) + ) -join '' ) + + # Validate the DriveLetter parameter + $DriveLetter = Assert-DriveLetterValid -DriveLetter $DriveLetter + + <# + This command forces a refresh of the PS Drive subsystem. + So triggers any "missing" drives to show up. + #> + $null = Get-PSDrive + + $volume = Get-Volume -DriveLetter $DriveLetter -ErrorAction SilentlyContinue + + if ($volume) + { + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.VolumeFoundMessage -f $DriveLetter) + ) -join '' ) + + return $true + } + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($script:localizedData.VolumeNotFoundMessage -f $DriveLetter) + ) -join '' ) + + return $false +} # function Test-TargetResource + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/DSC_WaitForVolume.schema.mof b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/DSC_WaitForVolume.schema.mof new file mode 100644 index 0000000..28b79f5 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/DSC_WaitForVolume.schema.mof @@ -0,0 +1,8 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("WaitForVolume")] +class DSC_WaitForVolume : OMI_BaseResource +{ + [Key, Description("Specifies the drive letter of the volume to wait for.")] String DriveLetter; + [Write, Description("Specifies the number of seconds to wait for the volume to become available.")] Uint32 RetryIntervalSec; + [Write, Description("The number of times to loop the retry interval while waiting for the volume.")] Uint32 RetryCount; +}; diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/README.md b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/README.md new file mode 100644 index 0000000..7eede33 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/README.md @@ -0,0 +1,3 @@ +# Description + +The resource is used to wait for a drive to be mounted and become available. diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/en-US/DSC_WaitForVolume.strings.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/en-US/DSC_WaitForVolume.strings.psd1 new file mode 100644 index 0000000..0a8342a --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/DSCResources/DSC_WaitForVolume/en-US/DSC_WaitForVolume.strings.psd1 @@ -0,0 +1,8 @@ +ConvertFrom-StringData @' + GettingWaitForVolumeStatusMessage = Getting Wait for Volume status for volume '{0}'. + CheckingForVolumeStatusMessage = Checking for volume '{0}'. + VolumeFoundMessage = Found volume '{0}'. + VolumeNotFoundRetryingMessage = Volume '{0}' not found, retrying in {1} seconds. + VolumeNotFoundAfterError = Volume '{0}' not found after {1} counts. + VolumeNotFoundMessage = Volume '{0}' not found. +'@ diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 new file mode 100644 index 0000000..0c18ec0 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/DscResource.Common.psd1 @@ -0,0 +1,73 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'DscResource.Common.psm1' + + # Version number of this module. + ModuleVersion = '0.9.3' + + # ID used to uniquely identify this module + GUID = '9c9daa5b-5c00-472d-a588-c96e8e498450' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Common functions used in DSC Resources' + + # Minimum version of the PowerShell engine required by this module + PowerShellVersion = '4.0' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @('Assert-BoundParameter','Assert-IPAddress','Assert-Module','Compare-ResourcePropertyState','ConvertTo-CimInstance','ConvertTo-HashTable','Get-LocalizedData','Get-TemporaryFolder','New-InvalidArgumentException','New-InvalidDataException','New-InvalidOperationException','New-InvalidResultException','New-NotImplementedException','New-ObjectNotFoundException','Remove-CommonParameter','Set-DscMachineRebootRequired','Set-PSModulePath','Test-DscParameterState','Test-IsNanoServer') + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DSC', 'Localization') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/DscResource.Common/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/DscResource.Common' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [0.9.3] - 2020-07-25 + +## Fixed + +- Correction to `Test-DscParameterState` returning false positive when parameter + with an empty array is passed in `DesriedValues` or `CurrentValues` - fixes + [issue #53](https://github.com/dsccommunity/DscResource.Common/issues/53). + +' + + Prerelease = '' + } # End of PSData hashtable + + } # End of PrivateData hashtable +} + + + + diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 new file mode 100644 index 0000000..17d1159 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/DscResource.Common.psm1 @@ -0,0 +1,2179 @@ +#Region './prefix.ps1' 0 +$script:modulesFolderPath = Split-Path -Path $PSScriptRoot -Parent +#EndRegion './prefix.ps1' 1 +#Region './Private/Test-DscObjectHasProperty.ps1' 0 +<# + .SYNOPSIS + Tests if an object has a property. + + .DESCRIPTION + Tests if the specified object has the specified property and return + $true or $false. + + .PARAMETER Object + Specifies the object to test for the specified property. + + .PARAMETER PropertyName + Specifies the property name to test for. + + .EXAMPLE + Test-DscObjectHasProperty -Object 'AnyString' -PropertyName 'Length' +#> +function Test-DscObjectHasProperty +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $Object, + + [Parameter(Mandatory = $true)] + [System.String] + $PropertyName + ) + + if ($Object.PSObject.Properties.Name -contains $PropertyName) + { + return [System.Boolean] $Object.$PropertyName + } + + return $false +} +#EndRegion './Private/Test-DscObjectHasProperty.ps1' 39 +#Region './Private/Test-DscPropertyState.ps1' 0 +<# + .SYNOPSIS + Compares the current and the desired value of a property. + + .DESCRIPTION + This function is used to compare the current and the desired value of a + property. + + .PARAMETER Values + This is set to a hash table with the current value (the CurrentValue key) + and desired value (the DesiredValue key). + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 'John' + DesiredValue = 'Alice' + } + + .EXAMPLE + Test-DscPropertyState -Values @{ + CurrentValue = 1 + DesiredValue = 2 + } + + .NOTES + This function is used by the cmdlet Compare-ResourcePropertyState. +#> +function Test-DscPropertyState +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Values + ) + + if ($null -eq $Values.CurrentValue -and $null -eq $Values.DesiredValue) + { + # Both values are $null so return $true + $returnValue = $true + } + elseif ($null -eq $Values.CurrentValue -or $null -eq $Values.DesiredValue) + { + # Either CurrentValue or DesiredValue are $null so return $false + $returnValue = $false + } + elseif ( + $Values.DesiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]] ` + -or $Values.DesiredValue -is [System.Array] -and $Values.DesiredValue[0] -is [Microsoft.Management.Infrastructure.CimInstance] + ) + { + if (-not $Values.ContainsKey('KeyProperties')) + { + $errorMessage = $script:localizedData.KeyPropertiesMissing + + New-InvalidOperationException -Message $errorMessage + } + + $propertyState = @() + + <# + It is a collection of CIM instances, then recursively call + Test-DscPropertyState for each CIM instance in the collection. + #> + foreach ($desiredCimInstance in $Values.DesiredValue) + { + $currentCimInstance = $Values.CurrentValue + + <# + Use the CIM instance Key properties to filter out the current + values if the exist. + #> + foreach ($keyProperty in $Values.KeyProperties) + { + $currentCimInstance = $currentCimInstance | + Where-Object -Property $keyProperty -EQ -Value $desiredCimInstance.$keyProperty + } + + if ($currentCimInstance.Count -gt 1) + { + $errorMessage = $script:localizedData.TooManyCimInstances + + New-InvalidOperationException -Message $errorMessage + } + + if ($currentCimInstance) + { + $keyCimInstanceProperties = $currentCimInstance.CimInstanceProperties | + Where-Object -FilterScript { + $_.Name -in $Values.KeyProperties + } + + <# + For each key property build a string representation of the + property name and its value. + #> + $keyPropertyValues = $keyCimInstanceProperties.ForEach({'{0}="{1}"' -f $_.Name, ($_.Value -join ',')}) + + Write-Debug -Message ( + $script:localizedData.TestingCimInstance -f @( + $currentCimInstance.CimClass.CimClassName, + ($keyPropertyValues -join ';') + ) + ) + } + else + { + $keyCimInstanceProperties = $desiredCimInstance.CimInstanceProperties | + Where-Object -FilterScript { + $_.Name -in $Values.KeyProperties + } + + <# + For each key property build a string representation of the + property name and its value. + #> + $keyPropertyValues = $keyCimInstanceProperties.ForEach({'{0}="{1}"' -f $_.Name, ($_.Value -join ',')}) + + Write-Debug -Message ( + $script:localizedData.MissingCimInstance -f @( + $desiredCimInstance.CimClass.CimClassName, + ($keyPropertyValues -join ';') + ) + ) + } + + # Recursively call Test-DscPropertyState with the CimInstance to evaluate. + $propertyState += Test-DscPropertyState -Values @{ + CurrentValue = $currentCimInstance + DesiredValue = $desiredCimInstance + } + } + + # Return $false if one property is found to not be in desired state. + $returnValue = -not ($false -in $propertyState) + } + elseif ($Values.DesiredValue -is [Microsoft.Management.Infrastructure.CimInstance]) + { + $propertyState = @() + + <# + It is a CIM instance, recursively call Test-DscPropertyState for each + CIM instance property. + #> + $desiredCimInstanceProperties = $Values.DesiredValue.CimInstanceProperties | + Select-Object -Property @('Name', 'Value') + + if ($desiredCimInstanceProperties) + { + foreach ($desiredCimInstanceProperty in $desiredCimInstanceProperties) + { + <# + Recursively call Test-DscPropertyState to evaluate each property + in the CimInstance. + #> + $propertyState += Test-DscPropertyState -Values @{ + CurrentValue = $Values.CurrentValue.($desiredCimInstanceProperty.Name) + DesiredValue = $desiredCimInstanceProperty.Value + } + } + } + else + { + if ($Values.CurrentValue.CimInstanceProperties.Count -gt 0) + { + # Current value did not have any CIM properties, but desired state has. + $propertyState += $false + } + } + + # Return $false if one property is found to not be in desired state. + $returnValue = -not ($false -in $propertyState) + } + elseif ($Values.DesiredValue -is [System.Array] -or $Values.CurrentValue -is [System.Array]) + { + $compareObjectParameters = @{ + ReferenceObject = $Values.CurrentValue + DifferenceObject = $Values.DesiredValue + } + + $arrayCompare = Compare-Object @compareObjectParameters + + if ($null -ne $arrayCompare) + { + Write-Debug -Message $script:localizedData.ArrayDoesNotMatch + + $arrayCompare | + ForEach-Object -Process { + if ($_.SideIndicator -eq '=>') + { + Write-Debug -Message ( + $script:localizedData.ArrayValueIsAbsent -f $_.InputObject + ) + } + else + { + Write-Debug -Message ( + $script:localizedData.ArrayValueIsPresent -f $_.InputObject + ) + } + } + + $returnValue = $false + } + else + { + $returnValue = $true + } + } + elseif ($Values.CurrentValue -ne $Values.DesiredValue) + { + $desiredType = $Values.DesiredValue.GetType() + + $returnValue = $false + + $supportedTypes = @( + 'String' + 'Int32' + 'UInt32' + 'Int16' + 'UInt16' + 'Single' + 'Boolean' + ) + + if ($desiredType.Name -notin $supportedTypes) + { + Write-Warning -Message ($script:localizedData.UnableToCompareType -f $desiredType.Name) + } + else + { + Write-Debug -Message ( + $script:localizedData.PropertyValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $Values.CurrentValue, $Values.DesiredValue + ) + } + } + else + { + $returnValue = $true + } + + return $returnValue +} +#EndRegion './Private/Test-DscPropertyState.ps1' 246 +#Region './Public/Assert-BoundParameter.ps1' 0 +<# + .SYNOPSIS + Throws an error if there is a bound parameter that exists in both the + mutually exclusive lists. + + .DESCRIPTION + Throws an error if there is a bound parameter that exists in both the + mutually exclusive lists. + + .PARAMETER BoundParameterList + The parameters that should be evaluated against the mutually exclusive + lists MutuallyExclusiveList1 and MutuallyExclusiveList2. This parameter is + normally set to the $PSBoundParameters variable. + + .PARAMETER MutuallyExclusiveList1 + An array of parameter names that are not allowed to be bound at the + same time as those in MutuallyExclusiveList2. + + .PARAMETER MutuallyExclusiveList2 + An array of parameter names that are not allowed to be bound at the + same time as those in MutuallyExclusiveList1. + + .EXAMPLE + $assertBoundParameterParameters = @{ + BoundParameterList = $PSBoundParameters + MutuallyExclusiveList1 = @( + 'Parameter1' + ) + MutuallyExclusiveList2 = @( + 'Parameter2' + ) + } + + Assert-BoundParameter @assertBoundParameterParameters + + This example throws an exception if `$PSBoundParameters` contains both + the parameters `Parameter1` and `Parameter2`. +#> +function Assert-BoundParameter +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyCollection()] + [System.Collections.Hashtable] + $BoundParameterList, + + [Parameter(Mandatory = $true)] + [System.String[]] + $MutuallyExclusiveList1, + + [Parameter(Mandatory = $true)] + [System.String[]] + $MutuallyExclusiveList2 + ) + + $itemFoundFromList1 = $BoundParameterList.Keys.Where({ $_ -in $MutuallyExclusiveList1 }) + $itemFoundFromList2 = $BoundParameterList.Keys.Where({ $_ -in $MutuallyExclusiveList2 }) + + if ($itemFoundFromList1.Count -gt 0 -and $itemFoundFromList2.Count -gt 0) + { + $errorMessage = ` + $script:localizedData.ParameterUsageWrong ` + -f ($MutuallyExclusiveList1 -join "','"), ($MutuallyExclusiveList2 -join "','") + + New-InvalidArgumentException -ArgumentName 'Parameters' -Message $errorMessage + } +} +#EndRegion './Public/Assert-BoundParameter.ps1' 69 +#Region './Public/Assert-IPAddress.ps1' 0 +<# + .SYNOPSIS + Asserts that the specified IP address is valid. + + .DESCRIPTION + Checks the IP address so that it is valid and do not conflict with address + family. If any problems are detected an exception will be thrown. + + .PARAMETER AddressFamily + IP address family that the supplied Address should be in. Valid values are + 'IPv4' or 'IPv6'. + + .PARAMETER Address + Specifies an IPv4 or IPv6 address. + + .EXAMPLE + Assert-IPAddress -Address '127.0.0.1' + + This will assert that the supplied address is a valid IPv4 address. + If it is not an exception will be thrown. + + .EXAMPLE + Assert-IPAddress -Address 'fe80:ab04:30F5:002b::1' + + This will assert that the supplied address is a valid IPv6 address. + If it is not an exception will be thrown. + + .EXAMPLE + Assert-IPAddress -Address 'fe80:ab04:30F5:002b::1' -AddressFamily 'IPv6' + + This will assert that address is valid and that it matches the + supplied address family. If the supplied address family does not match + the address an exception will be thrown. +#> +function Assert-IPAddress +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('IPv4', 'IPv6')] + [System.String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Address + ) + + [System.Net.IPAddress] $ipAddress = $null + + if (-not ([System.Net.IPAddress]::TryParse($Address, [ref] $ipAddress))) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressFormatError -f $Address) ` + -ArgumentName 'Address' + } + + if ($AddressFamily) + { + switch ($AddressFamily) + { + 'IPv4' + { + if ($ipAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork.ToString()) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressIPv6MismatchError -f $Address, $AddressFamily) ` + -ArgumentName 'AddressFamily' + } + } + + 'IPv6' + { + if ($ipAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetworkV6.ToString()) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.AddressIPv4MismatchError -f $Address, $AddressFamily) ` + -ArgumentName 'AddressFamily' + } + } + } + } +} +#EndRegion './Public/Assert-IPAddress.ps1' 85 +#Region './Public/Assert-Module.ps1' 0 +<# + .SYNOPSIS + Assert if the specific module is available to be imported. + + .DESCRIPTION + Assert if the specific module is available to be imported. + + .PARAMETER ModuleName + Specifies the name of the module to assert. + + .PARAMETER ImportModule + Specfiies to import the module if it is asserted. + + .EXAMPLE + Assert-Module -ModuleName 'DhcpServer' + + This asserts that the module DhcpServer is available on the system. +#> +function Assert-Module +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ModuleName, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ImportModule + ) + + if (-not (Get-Module -Name $ModuleName -ListAvailable)) + { + $errorMessage = $script:localizedData.ModuleNotFound -f $ModuleName + New-ObjectNotFoundException -Message $errorMessage + } + + if ($ImportModule) + { + Import-Module -Name $ModuleName + } +} +#EndRegion './Public/Assert-Module.ps1' 43 +#Region './Public/Compare-ResourcePropertyState.ps1' 0 +<# + .SYNOPSIS + Compare current and desired property values for any DSC resource. + + .DESCRIPTION + This function is used to compare current and desired property values for any + DSC resource, and return a hashtable with the metadata from the comparison. + + .PARAMETER CurrentValues + The current values that should be compared to to desired values. Normally + the values returned from Get-TargetResource. + + .PARAMETER DesiredValues + The values set in the configuration and is provided in the call to the + functions *-TargetResource, and that will be compared against current + values. Normally set to $PSBoundParameters. + + .PARAMETER Properties + An array of property names, from the keys provided in DesiredValues, that + will be compared. If this parameter is left out, all the keys in the + DesiredValues will be compared. + + .PARAMETER IgnoreProperties + An array of property names, from the keys provided in DesiredValues, that + will be ignored in the comparison. If this parameter is left out, all the + keys in the DesiredValues will be compared. + + .PARAMETER CimInstanceKeyProperties + A hashtable containing a key for each property that contain a collection + of CimInstances and the value is an array of strings of the CimInstance + key properties. + @{ + Permission = @('State') + } + + .EXAMPLE + $compareTargetResourceStateParameters = @{ + CurrentValues = (Get-TargetResource $PSBoundParameters) + DesiredValues = $PSBoundParameters + } + + $propertyState = Compare-ResourcePropertyState @compareTargetResourceStateParameters + + This examples call Compare-ResourcePropertyState with the current state + and the desired state and returns a hashtable array of all the properties + that was evaluated based on the properties pass in the parameter DesiredValues. +#> +function Compare-ResourcePropertyState +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable[]])] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $DesiredValues, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Properties, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $IgnoreProperties, + + [Parameter()] + [ValidateNotNull()] + [System.Collections.Hashtable] + $CimInstanceKeyProperties = @{} + ) + + if ($PSBoundParameters.ContainsKey('Properties')) + { + # Filter out the parameters (keys) not specified in Properties + $desiredValuesToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -notin $Properties + } + + $desiredValuesToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + else + { + <# + Remove any common parameters that might be part of DesiredValues, + if it $PSBoundParameters was used to pass the desired values. + #> + $commonParametersToRemove = $DesiredValues.Keys | + Where-Object -FilterScript { + $_ -in [System.Management.Automation.PSCmdlet]::CommonParameters ` + -or $_ -in [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + } + + $commonParametersToRemove | + ForEach-Object -Process { + $DesiredValues.Remove($_) + } + } + + # Remove any properties that should be ignored. + if ($PSBoundParameters.ContainsKey('IgnoreProperties')) + { + $IgnoreProperties | + ForEach-Object -Process { + if ($DesiredValues.ContainsKey($_)) + { + $DesiredValues.Remove($_) + } + } + } + + $compareTargetResourceStateReturnValue = @() + + foreach ($parameterName in $DesiredValues.Keys) + { + Write-Debug -Message ($script:localizedData.EvaluatePropertyState -f $parameterName) + + $parameterState = @{ + ParameterName = $parameterName + Expected = $DesiredValues.$parameterName + Actual = $CurrentValues.$parameterName + } + + # Check if the parameter is in compliance. + $isPropertyInDesiredState = Test-DscPropertyState -Values @{ + CurrentValue = $CurrentValues.$parameterName + DesiredValue = $DesiredValues.$parameterName + KeyProperties = $CimInstanceKeyProperties.$parameterName + } + + if ($isPropertyInDesiredState) + { + Write-Verbose -Message ($script:localizedData.PropertyInDesiredState -f $parameterName) + + $parameterState['InDesiredState'] = $true + } + else + { + Write-Verbose -Message ($script:localizedData.PropertyNotInDesiredState -f $parameterName) + + $parameterState['InDesiredState'] = $false + } + + $compareTargetResourceStateReturnValue += $parameterState + } + + return $compareTargetResourceStateReturnValue +} +#EndRegion './Public/Compare-ResourcePropertyState.ps1' 157 +#Region './Public/ConvertTo-CimInstance.ps1' 0 +<# + .SYNOPSIS + Converts a hashtable into a CimInstance array. + + .DESCRIPTION + This function is used to convert a hashtable into MSFT_KeyValuePair objects. + These are stored as an CimInstance array. DSC cannot handle hashtables but + CimInstances arrays storing MSFT_KeyValuePair. + + .PARAMETER Hashtable + A hashtable with the values to convert. + + .OUTPUTS + An object array with CimInstance objects. + + .EXAMPLE + ConvertTo-CimInstance -Hashtable @{ + String = 'a string' + Bool = $true + Int = 99 + Array = 'a, b, c' + } + + This example returns an CimInstance with the provided hashtable values. +#> +function ConvertTo-CimInstance +{ + [CmdletBinding()] + [OutputType([System.Object[]])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Hashtable')] + [System.Collections.Hashtable] + $Hashtable + ) + + process + { + foreach ($item in $Hashtable.GetEnumerator()) + { + New-CimInstance -ClassName 'MSFT_KeyValuePair' -Namespace 'root/microsoft/Windows/DesiredStateConfiguration' -Property @{ + Key = $item.Key + Value = if ($item.Value -is [array]) + { + $item.Value -join ',' + } + else + { + $item.Value + } + } -ClientOnly + } + } +} +#EndRegion './Public/ConvertTo-CimInstance.ps1' 54 +#Region './Public/ConvertTo-HashTable.ps1' 0 +<# + .SYNOPSIS + Converts CimInstances into a hashtable. + + .DESCRIPTION + This function is used to convert a CimInstance array containing + MSFT_KeyValuePair objects into a hashtable. + + .PARAMETER CimInstance + An array of CimInstances or a single CimInstance object to convert. + + .OUTPUTS + Hashtable + + .EXAMPLE + $newInstanceParameters = @{ + ClassName = 'MSFT_KeyValuePair' + Namespace = 'root/microsoft/Windows/DesiredStateConfiguration' + ClientOnly = $true + } + + $cimInstance = [Microsoft.Management.Infrastructure.CimInstance[]] ( + (New-CimInstance @newInstanceParameters -Property @{ + Key = 'FirstName' + Value = 'John' + }), + + (New-CimInstance @newInstanceParameters -Property @{ + Key = 'LastName' + Value = 'Smith' + }) + ) + + ConvertTo-HashTable -CimInstance $cimInstance + + This creates a array om CimInstances of the class name MSFT_KeyValuePair + and passes it to ConvertTo-HashTable which returns a hashtable. +#> +function ConvertTo-HashTable +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'CimInstance')] + [AllowEmptyCollection()] + [Microsoft.Management.Infrastructure.CimInstance[]] + $CimInstance + ) + + begin + { + $result = @{ } + } + + process + { + foreach ($ci in $CimInstance) + { + $result.Add($ci.Key, $ci.Value) + } + } + + end + { + $result + } +} +#EndRegion './Public/ConvertTo-HashTable.ps1' 68 +#Region './Public/Get-LocalizedData.ps1' 0 +<# + .SYNOPSIS + Gets language-specific data into scripts and functions based on the UI culture + that is selected for the operating system. + Similar to Import-LocalizedData, with extra parameter 'DefaultUICulture'. + + .DESCRIPTION + The Get-LocalizedData cmdlet dynamically retrieves strings from a subdirectory + whose name matches the UI language set for the current user of the operating system. + It is designed to enable scripts to display user messages in the UI language selected + by the current user. + + Get-LocalizedData imports data from .psd1 files in language-specific subdirectories + of the script directory and saves them in a local variable that is specified in the + command. The cmdlet selects the subdirectory and file based on the value of the + $PSUICulture automatic variable. When you use the local variable in the script to + display a user message, the message appears in the user's UI language. + + You can use the parameters of G-LocalizedData to specify an alternate UI culture, + path, and file name, to add supported commands, and to suppress the error message that + appears if the .psd1 files are not found. + + The G-LocalizedData cmdlet supports the script internationalization + initiative that was introduced in Windows PowerShell 2.0. This initiative + aims to better serve users worldwide by making it easy for scripts to display + user messages in the UI language of the current user. For more information + about this and about the format of the .psd1 files, see about_Script_Internationalization. + + .PARAMETER BindingVariable + Specifies the variable into which the text strings are imported. Enter a variable + name without a dollar sign ($). + + In Windows PowerShell 2.0, this parameter is required. In Windows PowerShell 3.0, + this parameter is optional. If you omit this parameter, Import-LocalizedData + returns a hash table of the text strings. The hash table is passed down the pipeline + or displayed at the command line. + + When using Import-LocalizedData to replace default text strings specified in the + DATA section of a script, assign the DATA section to a variable and enter the name + of the DATA section variable in the value of the BindingVariable parameter. Then, + when Import-LocalizedData saves the imported content in the BindingVariable, the + imported data will replace the default text strings. If you are not specifying + default text strings, you can select any variable name. + + .PARAMETER UICulture + Specifies an alternate UI culture. The default is the value of the $PsUICulture + automatic variable. Enter a UI culture in - format, such as + en-US, de-DE, or ar-SA. + + The value of the UICulture parameter determines the language-specific subdirectory + (within the base directory) from which Import-LocalizedData gets the .psd1 file + for the script. + + The cmdlet searches for a subdirectory with the same name as the value of the + UICulture parameter or the $PsUICulture automatic variable, such as de-DE or + ar-SA. If it cannot find the directory, or the directory does not contain a .psd1 + file for the script, it searches for a subdirectory with the name of the language + code, such as de or ar. If it cannot find the subdirectory or .psd1 file, the + command fails and the data is displayed in the default language specified in the + script. + + .PARAMETER BaseDirectory + Specifies the base directory where the .psd1 files are located. The default is + the directory where the script is located. Import-LocalizedData searches for + the .psd1 file for the script in a language-specific subdirectory of the base + directory. + + .PARAMETER FileName + Specifies the name of the data file (.psd1) to be imported. Enter a file name. + You can specify a file name that does not include its .psd1 file name extension, + or you can specify the file name including the .psd1 file name extension. + + The FileName parameter is required when Import-LocalizedData is not used in a + script. Otherwise, the parameter is optional and the default value is the base + name of the script. You can use this parameter to direct Import-LocalizedData + to search for a different .psd1 file. + + For example, if the FileName is omitted and the script name is FindFiles.ps1, + Import-LocalizedData searches for the FindFiles.psd1 data file. + + .PARAMETER SupportedCommand + Specifies cmdlets and functions that generate only data. + + Use this parameter to include cmdlets and functions that you have written or + tested. For more information, see about_Script_Internationalization. + + .PARAMETER DefaultUICulture + Specifies which UICulture to default to if current UI culture or its parents + culture don't have matching data file. + + For example, if you have a data file in 'en-US' but not in 'en' or 'en-GB' and + your current culture is 'en-GB', you can default back to 'en-US'. + + .NOTES + Before using Import-LocalizedData, localize your user messages. Format the messages + for each locale (UI culture) in a hash table of key/value pairs, and save the + hash table in a file with the same name as the script and a .psd1 file name extension. + Create a directory under the script directory for each supported UI culture, and + then save the .psd1 file for each UI culture in the directory with the UI + culture name. + + For example, localize your user messages for the de-DE locale and format them in + a hash table. Save the hash table in a .psd1 file. Then create a de-DE + subdirectory under the script directory, and save the de-DE .psd1 + file in the de-DE subdirectory. Repeat this method for each locale that you support. + + Import-LocalizedData performs a structured search for the localized user + messages for a script. + + Import-LocalizedData begins the search in the directory where the script file + is located (or the value of the BaseDirectory parameter). It then searches within + the base directory for a subdirectory with the same name as the value of the + $PsUICulture variable (or the value of the UICulture parameter), such as de-DE or + ar-SA. Then, it searches in that subdirectory for a .psd1 file with the same name + as the script (or the value of the FileName parameter). + + If Import-LocalizedData cannot find a subdirectory with the name of the UI culture, + or the subdirectory does not contain a .psd1 file for the script, it searches for + a .psd1 file for the script in a subdirectory with the name of the language code, + such as de or ar. If it cannot find the subdirectory or .psd1 file, the command + fails, the data is displayed in the default language in the script, and an error + message is displayed explaining that the data could not be imported. To suppress + the message and fail gracefully, use the ErrorAction common parameter with a value + of SilentlyContinue. + + If Import-LocalizedData finds the subdirectory and the .psd1 file, it imports the + hash table of user messages into the value of the BindingVariable parameter in the + command. Then, when you display a message from the hash table in the variable, the + localized message is displayed. + + For more information, see about_Script_Internationalization. + + .EXAMPLE + $script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + + This is an example that can be used in DSC resources to import the + localized strings and if the current UI culture localized folder does + not exist the UI culture 'en-US' is returned. +#> +function Get-LocalizedData +{ + [CmdletBinding(DefaultParameterSetName = 'DefaultUICulture')] + param + ( + [Parameter(Position = 0)] + [Alias('Variable')] + [ValidateNotNullOrEmpty()] + [System.String] + $BindingVariable, + + [Parameter(Position = 1, ParameterSetName = 'TargetedUICulture')] + [System.String] + $UICulture, + + [Parameter()] + [System.String] + $BaseDirectory, + + [Parameter()] + [System.String] + $FileName, + + [Parameter()] + [System.String[]] + $SupportedCommand, + + [Parameter(Position = 1, ParameterSetName = 'DefaultUICulture')] + [System.String] + $DefaultUICulture = 'en-US' + ) + + begin + { + <# + Because Proxy Command changes the Invocation origin, we need to be explicit + when handing the pipeline back to original command. + #> + if (!$PSBoundParameters.ContainsKey('FileName')) + { + if ($myInvocation.ScriptName) + { + $file = [System.IO.FileInfo] $myInvocation.ScriptName + } + else + { + $file = [System.IO.FileInfo] $myInvocation.MyCommand.Module.Path + } + + $FileName = $file.BaseName + + $PSBoundParameters.Add('FileName', $file.Name) + } + + if ($PSBoundParameters.ContainsKey('BaseDirectory')) + { + $callingScriptRoot = $BaseDirectory + } + else + { + $callingScriptRoot = $MyInvocation.PSScriptRoot + + $PSBoundParameters.Add('BaseDirectory', $callingScriptRoot) + } + + if ($PSBoundParameters.ContainsKey('DefaultUICulture') -and !$PSBoundParameters.ContainsKey('UICulture')) + { + <# + We don't want the resolution to eventually return the ModuleManifest + so we run the same GetFilePath() logic than here: + https://github.com/PowerShell/PowerShell/blob/master/src/Microsoft.PowerShell.Commands.Utility/commands/utility/Import-LocalizedData.cs#L302-L333 + and if we see it will return the wrong thing, set the UICulture to DefaultUI culture, and return the logic to Import-LocalizedData + #> + $currentCulture = Get-UICulture + + $evaluateDefaultCulture = $true + + <# + If the LCID is 127 then use default UI culture instead. + + See more information in issue https://github.com/dsccommunity/DscResource.Common/issues/11. + #> + if ($currentCulture.LCID -eq 127) + { + $currentCulture = New-Object -TypeName 'System.Globalization.CultureInfo' -ArgumentList @($DefaultUICulture) + $PSBoundParameters['UICulture'] = $DefaultUICulture + + $evaluateDefaultCulture = $false + } + + $languageFile = $null + + $localizedFileNames = @( + $FileName + '.psd1' + $FileName + '.strings.psd1' + ) + + while ($null -ne $currentCulture -and $currentCulture.Name -and -not $languageFile) + { + foreach ($fullFileName in $localizedFileNames) + { + $filePath = [System.IO.Path]::Combine($callingScriptRoot, $CurrentCulture.Name, $fullFileName) + + if (Test-Path -Path $filePath) + { + Write-Debug -Message "Found $filePath" + + $languageFile = $filePath + + # Set the filename to the file we found. + $PSBoundParameters['FileName'] = $fullFileName + + # Exit loop if we find the first filename. + break + } + else + { + Write-Debug -Message "File $filePath not found" + } + } + + if (-not $languageFile) + { + <# + Evaluate the parent culture if there is one. + + If the parent culture is LCID 127 then move to the default culture. + See more information in issue https://github.com/dsccommunity/DscResource.Common/issues/11. + #> + if ($currentCulture.Parent -and $currentCulture.Parent.LCID -ne 127) + { + $currentCulture = $currentCulture.Parent + } + else + { + if ($evaluateDefaultCulture) + { + $evaluateDefaultCulture = $false + + <# + Could not find localized strings file for the the operating + system UI culture. Evaluating the default UI culture (which + defaults to 'en-US' if not specifically set). + #> + $currentCulture = New-Object -TypeName 'System.Globalization.CultureInfo' -ArgumentList @($DefaultUICulture) + $PSBoundParameters['UICulture'] = $DefaultUICulture + } + else + { + <# + Already evaluated everything we could, exit and let + Import-LocalizedData throw an exception. + #> + break + } + } + } + } + + <# + Removes the parameter DefaultUICulture so that isn't used when + calling Import-LocalizedData. + #> + $null = $PSBoundParameters.Remove('DefaultUICulture') + } + + try + { + $outBuffer = $null + + if ($PSBoundParameters.TryGetValue('OutBuffer', [ref] $outBuffer)) + { + $PSBoundParameters['OutBuffer'] = 1 + } + + $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Import-LocalizedData', [System.Management.Automation.CommandTypes]::Cmdlet) + $scriptCmd = { & $wrappedCmd @PSBoundParameters } + + $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) + $steppablePipeline.Begin($PSCmdlet) + } + catch + { + throw + } + } + + process + { + try + { + $steppablePipeline.Process($_) + } + catch + { + throw + } + } + + end + { + if ($BindingVariable -and ($valueToBind = Get-Variable -Name $BindingVariable -ValueOnly -ErrorAction 'Ignore')) + { + # Bringing the variable to the parent scope + Set-Variable -Scope 1 -Name $BindingVariable -Force -ErrorAction 'SilentlyContinue' -Value $valueToBind + } + + try + { + $steppablePipeline.End() + } + catch + { + throw + } + } +} +#EndRegion './Public/Get-LocalizedData.ps1' 356 +#Region './Public/Get-TemporaryFolder.ps1' 0 +<# + .SYNOPSIS + Returns the path of the current user's temporary folder. + + .DESCRIPTION + Returns the path of the current user's temporary folder. + + .NOTES + This is the same as doing the following + - Windows: $env:TEMP + - macOS: $env:TMPDIR + - Linux: /tmp/ + + .EXAMPLE + Get-TemporaryFolder + + Returns the current user temporary folder on the current operating system. +#> +function Get-TemporaryFolder +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + return [IO.Path]::GetTempPath() +} +#EndRegion './Public/Get-TemporaryFolder.ps1' 26 +#Region './Public/New-InvalidArgumentException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid argument exception. + + .DESCRIPTION + Creates and throws an invalid argument exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ArgumentName + The name of the invalid argument that is causing this error to be thrown. + + .EXAMPLE + $errorMessage = $script:localizedData.ActionCannotBeUsedInThisContextMessage ` + -f $Action, $Parameter + + New-InvalidArgumentException -ArgumentName 'Action' -Message $errorMessage +#> +function New-InvalidArgumentException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArgumentName + ) + + $argumentException = New-Object -TypeName 'ArgumentException' ` + -ArgumentList @($Message, $ArgumentName) + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @($argumentException, $ArgumentName, 'InvalidArgument', $null) + } + + $errorRecord = New-Object @newObjectParameters + + throw $errorRecord +} +#EndRegion './Public/New-InvalidArgumentException.ps1' 48 +#Region './Public/New-InvalidDataException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid data exception. + + .DESCRIPTION + Creates and throws an invalid data exception. + + .PARAMETER ErrorId + The error Id to assign to the exception. + + .PARAMETER ErrorMessage + The error message to assign to the exception. + + .EXAMPLE + if ( -not $resultOfEvaluation ) + { + $errorMessage = $script:localizedData.InvalidData -f $Action + + New-InvalidDataException -ErrorId 'InvalidDataError' -ErrorMessage $errorMessage + } +#> +function New-InvalidDataException +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage + ) + + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidData + $exception = New-Object ` + -TypeName System.InvalidOperationException ` + -ArgumentList $ErrorMessage + $errorRecord = New-Object ` + -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + + throw $errorRecord +} +#EndRegion './Public/New-InvalidDataException.ps1' 46 +#Region './Public/New-InvalidOperationException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid operation exception. + + .DESCRIPTION + Creates and throws an invalid operation exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + Start-Process @startProcessArguments + } + catch + { + $errorMessage = $script:localizedData.InstallationFailedMessage -f $Path, $processId + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-InvalidOperationException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'InvalidOperation', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-InvalidOperationException.ps1' 66 +#Region './Public/New-InvalidResultException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an invalid result exception. + + .DESCRIPTION + Creates and throws an invalid result exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + $numberOfObjects = Get-ChildItem -Path $path + if ($numberOfObjects -eq 0) + { + throw 'To few files.' + } + } + catch + { + $errorMessage = $script:localizedData.TooFewFilesMessage -f $path + New-InvalidResultException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-InvalidResultException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'InvalidResult', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-InvalidResultException.ps1' 70 +#Region './Public/New-NotImplementedException.ps1' 0 +<# + .SYNOPSIS + Creates and throws an not implemented exception. + + .DESCRIPTION + Creates and throws an not implemented exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + if ($runFeature) + { + $errorMessage = $script:localizedData.FeatureMissing -f $path + New-NotImplementedException -Message $errorMessage -ErrorRecord $_ + } + + Throws an not implemented exception if the variable $runFeature contains + a value. +#> +function New-NotImplementedException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'NotImplemented', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-NotImplementedException.ps1' 65 +#Region './Public/New-ObjectNotFoundException.ps1' 0 + +<# + .SYNOPSIS + Creates and throws an object not found exception. + + .DESCRIPTION + Creates and throws an object not found exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. + + .EXAMPLE + try + { + Get-ChildItem -Path $path + } + catch + { + $errorMessage = $script:localizedData.PathNotFoundMessage -f $path + New-ObjectNotFoundException -Message $errorMessage -ErrorRecord $_ + } +#> +function New-ObjectNotFoundException +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'ObjectNotFound', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} +#EndRegion './Public/New-ObjectNotFoundException.ps1' 67 +#Region './Public/Remove-CommonParameter.ps1' 0 +<# + .SYNOPSIS + Removes common parameters from a hashtable. + + .DESCRIPTION + This function serves the purpose of removing common parameters and option + common parameters from a parameter hashtable. + + .PARAMETER Hashtable + The parameter hashtable that should be pruned. + + .EXAMPLE + Remove-CommonParameter -Hashtable $PSBoundParameters + + Returns a new hashtable without the common and optional common parameters. +#> +function Remove-CommonParameter +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', + '', + Justification = 'ShouldProcess is not supported in DSC resources.' + )] + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Hashtable + ) + + $inputClone = $Hashtable.Clone() + + $commonParameters = [System.Management.Automation.PSCmdlet]::CommonParameters + $commonParameters += [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + + $Hashtable.Keys | Where-Object -FilterScript { + $_ -in $commonParameters + } | ForEach-Object -Process { + $inputClone.Remove($_) + } + + return $inputClone +} +#EndRegion './Public/Remove-CommonParameter.ps1' 45 +#Region './Public/Set-DscMachineRebootRequired.ps1' 0 +<# + .SYNOPSIS + Set the DSC reboot required status variable. + + .DESCRIPTION + Sets the global DSCMachineStatus variable to a value of 1. + This function is used to set the global variable that indicates + to the LCM that a reboot of the node is required. + + .EXAMPLE + PS C:\> Set-DscMachineRebootRequired + + Sets the $global:DSCMachineStatus variable to 1. + + .NOTES + This function is implemented so that individual resource modules + do not need to use and therefore suppress Global variables + directly. It also enables mocking to increase testability of + consumers. +#> +function Set-DscMachineRebootRequired +{ + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] + # Suppressing this rule because $global:DSCMachineStatus is used to trigger a reboot. + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + <# + Suppressing this rule because $global:DSCMachineStatus is only set, + never used (by design of Desired State Configuration). + #> + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '')] + [CmdletBinding()] + param + ( + ) + + $global:DSCMachineStatus = 1 +} +#EndRegion './Public/Set-DscMachineRebootRequired.ps1' 37 +#Region './Public/Set-PSModulePath.ps1' 0 + +<# + .SYNOPSIS + Set environment variable PSModulePath in the current session or machine + wide. + + .DESCRIPTION + This is a wrapper to set environment variable PSModulePath in current + session or machine wide. + + .PARAMETER Path + A string with all the paths separated by semi-colons. + + .PARAMETER Machine + If set the PSModulePath will be changed machine wide. If not set, only + the current session will be changed. + + .EXAMPLE + Set-PSModulePath -Path ';' + + .EXAMPLE + Set-PSModulePath -Path ';' -Machine +#> +function Set-PSModulePath +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSUseShouldProcessForStateChangingFunctions', + '', + Justification = 'ShouldProcess is not supported in DSC resources.' + )] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Machine + ) + + if ($Machine.IsPresent) + { + [System.Environment]::SetEnvironmentVariable('PSModulePath', $Path, [System.EnvironmentVariableTarget]::Machine) + } + else + { + $env:PSModulePath = $Path + } +} +#EndRegion './Public/Set-PSModulePath.ps1' 52 +#Region './Public/Test-DscParameterState.ps1' 0 +<# + .SYNOPSIS + This method is used to compare current and desired values for any DSC resource. + + .DESCRIPTION + This function tests the parameter status of DSC resource parameters against + the current values present on the system. + + .PARAMETER CurrentValues + A hashtable with the current values on the system, obtained by e.g. + Get-TargetResource. + + .PARAMETER DesiredValues + The hashtable of desired values. For example $PSBoundParameters with the + desired values. + + .PARAMETER Properties + This is a list of properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER ExcludeProperties + This is a list of which properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. + + .PARAMETER TurnOffTypeChecking + Indicates that the type of the parameter should not be checked. + + .PARAMETER ReverseCheck + Indicates that a reverse check should be done. The current and desired state + are swapped for another test. + + .PARAMETER SortArrayValues + If the sorting of array values does not matter, values are sorted internally + before doing the comparison. + + .EXAMPLE + $currentState = Get-TargetResource @PSBoundParameters + + $returnValue = Test-DscParameterState -CurrentValues $currentState -DesiredValues $PSBoundParameters + + The function Get-TargetResource is called first using all bound parameters + to get the values in the current state. The result is then compared to the + desired state by calling `Test-DscParameterState`. + + .EXAMPLE + $getTargetResourceParameters = @{ + ServerName = $ServerName + InstanceName = $InstanceName + Name = $Name + } + + $returnValue = Test-DscParameterState ` + -CurrentValues (Get-TargetResource @getTargetResourceParameters) ` + -DesiredValues $PSBoundParameters ` + -ExcludeProperties @( + 'FailsafeOperator' + 'NotificationMethod' + ) + + This compares the values in the current state against the desires state. + The function Get-TargetResource is called using just the required parameters + to get the values in the current state. The parameter 'ExcludeProperties' + is used to exclude the properties 'FailsafeOperator' and + 'NotificationMethod' from the comparison. + + .EXAMPLE + $getTargetResourceParameters = @{ + ServerName = $ServerName + InstanceName = $InstanceName + Name = $Name + } + + $returnValue = Test-DscParameterState ` + -CurrentValues (Get-TargetResource @getTargetResourceParameters) ` + -DesiredValues $PSBoundParameters ` + -Properties ServerName, Name + + This compares the values in the current state against the desires state. + The function Get-TargetResource is called using just the required parameters + to get the values in the current state. The 'Properties' parameter is used + to to only compare the properties 'ServerName' and 'Name'. +#> +function Test-DscParameterState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Object] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Object] + $DesiredValues, + + [Parameter()] + [System.String[]] + [Alias('ValuesToCheck')] + $Properties, + + [Parameter()] + [System.String[]] + $ExcludeProperties, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $TurnOffTypeChecking, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $ReverseCheck, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $SortArrayValues + ) + + $returnValue = $true + + if ($CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $CurrentValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $CurrentValues = ConvertTo-HashTable -CimInstance $CurrentValues + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -or + $DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $DesiredValues = ConvertTo-HashTable -CimInstance $DesiredValues + } + + $types = 'System.Management.Automation.PSBoundParametersDictionary', 'System.Collections.Hashtable', 'Microsoft.Management.Infrastructure.CimInstance' + + if ($DesiredValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidDesiredValuesError -f $DesiredValues.GetType().FullName) ` + -ArgumentName 'DesiredValues' + } + + if ($CurrentValues.GetType().FullName -notin $types) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidCurrentValuesError -f $CurrentValues.GetType().FullName) ` + -ArgumentName 'CurrentValues' + } + + if ($DesiredValues -is [Microsoft.Management.Infrastructure.CimInstance] -and -not $Properties) + { + New-InvalidArgumentException ` + -Message $script:localizedData.InvalidPropertiesError ` + -ArgumentName Properties + } + + $desiredValuesClean = Remove-CommonParameter -Hashtable $DesiredValues + + if (-not $Properties) + { + $keyList = $desiredValuesClean.Keys + } + else + { + $keyList = $Properties + } + if ($ExcludeProperties) + { + $keyList = $keyList | Where-Object -FilterScript { $_ -notin $ExcludeProperties } + } + + foreach ($key in $keyList) + { + $desiredValue = $desiredValuesClean.$key + $currentValue = $CurrentValues.$key + + if ($desiredValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $desiredValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $desiredValue = ConvertTo-HashTable -CimInstance $desiredValue + } + if ($currentValue -is [Microsoft.Management.Infrastructure.CimInstance] -or + $currentValue -is [Microsoft.Management.Infrastructure.CimInstance[]]) + { + $currentValue = ConvertTo-HashTable -CimInstance $currentValue + } + + if ($null -ne $desiredValue) + { + $desiredType = $desiredValue.GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($null -ne $currentValue) + { + $currentType = $currentValue.GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if ($currentType.Name -ne 'Unknown' -and $desiredType.Name -eq 'PSCredential') + { + # This is a credential object. Compare only the user name + if ($currentType.Name -eq 'PSCredential' -and $currentValue.UserName -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + continue + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue.UserName, $desiredValue.UserName) + $returnValue = $false + } + + # Assume the string is our username when the matching desired value is actually a credential + if ($currentType.Name -eq 'string' -and $currentValue -eq $desiredValue.UserName) + { + Write-Verbose -Message ($script:localizedData.MatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + continue + } + else + { + Write-Verbose -Message ($script:localizedData.NoMatchPsCredentialUsernameMessage -f $currentValue, $desiredValue.UserName) + $returnValue = $false + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchTypeMismatchMessage -f $key, $currentType.FullName, $desiredType.FullName) + $returnValue = $false + continue + } + } + + if ($currentValue -eq $desiredValue -and -not $desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + continue + } + + if ($desiredValuesClean.GetType().Name -in 'HashTable', 'PSBoundParametersDictionary') + { + $checkDesiredValue = $desiredValuesClean.ContainsKey($key) + } + else + { + $checkDesiredValue = Test-DscObjectHasProperty -Object $desiredValuesClean -PropertyName $key + } + + if (-not $checkDesiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + continue + } + + if ($desiredType.IsArray) + { + Write-Verbose -Message ($script:localizedData.TestDscParameterCompareMessage -f $key, $desiredType.FullName) + + if (-not $currentValue -and -not $desiredValue) + { + Write-Verbose -Message ($script:localizedData.MatchValueMessage -f $desiredType.FullName, $key, 'empty array', 'empty array') + continue + } + elseif (-not $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + $returnValue = $false + continue + } + elseif ($currentValue.Count -ne $desiredValue.Count) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueDifferentCountMessage -f $desiredType.FullName, $key, $currentValue.Count, $desiredValue.Count) + $returnValue = $false + continue + } + else + { + $desiredArrayValues = $desiredValue + $currentArrayValues = $currentValue + + if ($SortArrayValues) + { + $desiredArrayValues = @($desiredArrayValues | Sort-Object) + $currentArrayValues = @($currentArrayValues | Sort-Object) + } + + for ($i = 0; $i -lt $desiredArrayValues.Count; $i++) + { + if ($desiredArrayValues[$i]) + { + $desiredType = $desiredArrayValues[$i].GetType() + } + else + { + $desiredType = @{ + Name = 'Unknown' + } + } + + if ($currentArrayValues[$i]) + { + $currentType = $currentArrayValues[$i].GetType() + } + else + { + $currentType = @{ + Name = 'Unknown' + } + } + + if (-not $TurnOffTypeChecking) + { + if (($desiredType.Name -ne 'Unknown' -and $currentType.Name -ne 'Unknown') -and + $desiredType.FullName -ne $currentType.FullName) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementTypeMismatchMessage -f $key, $i, $currentType.FullName, $desiredType.FullName) + $returnValue = $false + continue + } + } + + #Convert a scriptblock into a string as scriptblocks are not comparable + $wasCurrentArrayValuesConverted = $false + if ($currentArrayValues[$i] -is [scriptblock]) + { + $currentArrayValues[$i] = if ($desiredArrayValues[$i] -is [string]) + { + $currentArrayValues[$i] = $currentArrayValues[$i].Invoke() + } + else + { + $currentArrayValues[$i].ToString() + } + $wasCurrentArrayValuesConverted = $true + } + if ($desiredArrayValues[$i] -is [scriptblock]) + { + $desiredArrayValues[$i] = if ($currentArrayValues[$i] -is [string] -and -not $wasCurrentArrayValuesConverted) + { + $desiredArrayValues[$i].Invoke() + } + else + { + $desiredArrayValues[$i].ToString() + } + } + + if ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentArrayValues[$i] + $param.DesiredValues = $desiredArrayValues[$i] + + if ($returnValue) + { + $returnValue = Test-DscParameterState @param + } + else + { + Test-DscParameterState @param | Out-Null + } + continue + } + + if ($desiredArrayValues[$i] -ne $currentArrayValues[$i]) + { + Write-Verbose -Message ($script:localizedData.NoMatchElementValueMismatchMessage -f $i, $desiredType.FullName, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + $returnValue = $false + continue + } + else + { + Write-Verbose -Message ($script:localizedData.MatchElementValueMessage -f $i, $desiredType.FullName, $key, $currentArrayValues[$i], $desiredArrayValues[$i]) + continue + } + } + + } + } + elseif ($desiredType -eq [System.Collections.Hashtable] -and $currentType -eq [System.Collections.Hashtable]) + { + $param = $PSBoundParameters + $param.CurrentValues = $currentValue + $param.DesiredValues = $desiredValue + + if ($returnValue) + { + $returnValue = Test-DscParameterState @param + } + else + { + Test-DscParameterState @param | Out-Null + } + continue + } + else + { + #Convert a scriptblock into a string as scriptblocks are not comparable + $wasCurrentValue = $false + if ($currentValue -is [scriptblock]) + { + $currentValue = if ($desiredValue -is [string]) + { + $currentValue = $currentValue.Invoke() + } + else + { + $currentValue.ToString() + } + $wasCurrentValue = $true + } + if ($desiredValue -is [scriptblock]) + { + $desiredValue = if ($currentValue -is [string] -and -not $wasCurrentValue) + { + $desiredValue.Invoke() + } + else + { + $desiredValue.ToString() + } + } + + if ($desiredValue -ne $currentValue) + { + Write-Verbose -Message ($script:localizedData.NoMatchValueMessage -f $desiredType.FullName, $key, $currentValue, $desiredValue) + $returnValue = $false + } + } + } + + if ($ReverseCheck) + { + Write-Verbose -Message $script:localizedData.StartingReverseCheck + $reverseCheckParameters = $PSBoundParameters + $reverseCheckParameters.CurrentValues = $DesiredValues + $reverseCheckParameters.DesiredValues = $CurrentValues + $null = $reverseCheckParameters.Remove('ReverseCheck') + + if ($returnValue) + { + $returnValue = Test-DscParameterState @reverseCheckParameters + } + else + { + $null = Test-DscParameterState @reverseCheckParameters + } + } + + Write-Verbose -Message ($script:localizedData.TestDscParameterResultMessage -f $returnValue) + return $returnValue +} +#EndRegion './Public/Test-DscParameterState.ps1' 464 +#Region './Public/Test-IsNanoServer.ps1' 0 +<# + .SYNOPSIS + Tests if the current OS is a Nano server. + + .DESCRIPTION + Tests if the current OS is a Nano server. + + .EXAMPLE + Test-IsNanoServer + + Returns $true if the current operating system is Nano Server, if not $false + is returned. +#> +function Test-IsNanoServer +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param () + + $productDatacenterNanoServer = 143 + $productStandardNanoServer = 144 + + $operatingSystemSKU = (Get-CimInstance -ClassName Win32_OperatingSystem).OperatingSystemSKU + + Write-Verbose -Message ($script:localizedData.TestIsNanoServerOperatingSystemSku -f $operatingSystemSKU) + + return ($operatingSystemSKU -in ($productDatacenterNanoServer, $productStandardNanoServer)) +} +#EndRegion './Public/Test-IsNanoServer.ps1' 28 +#Region './suffix.ps1' 0 +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' +#EndRegion './suffix.ps1' 1 diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 new file mode 100644 index 0000000..fd8440b --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/en-US/DscResource.Common.strings.psd1 @@ -0,0 +1,37 @@ +# Localized English (en-US) strings. + +ConvertFrom-StringData @' + TestIsNanoServerOperatingSystemSku = OperatingSystemSKU {0} was returned by Win32_OperatingSystem when detecting if operating system is Nano Server. (DRC0008) + ModuleNotFound = Please ensure that the PowerShell module '{0}' is installed. (DRC0009) + ParameterUsageWrong = None of the parameter(s) '{0}' may be used at the same time as any of the parameter(s) '{1}'. (DRC0010) + AddressFormatError = Address '{0}' is not in the correct format. Please correct the Address parameter in the configuration and try again. (DRC0011) + AddressIPv4MismatchError = Address '{0}' is in IPv4 format, which does not match server address family {1}. Please correct either of them in the configuration and try again. (DRC0012) + AddressIPv6MismatchError = Address '{0}' is in IPv6 format, which does not match server address family {1}. Please correct either of them in the configuration and try again. (DRC0013) + InvalidDesiredValuesError = Property 'DesiredValues' in Test-DscParameterState must be either a Hashtable or CimInstance. Type detected was '{0}'. (DRC0014) + InvalidCurrentValuesError = Property 'CurrentValues' in Test-DscParameterState must be either a Hashtable, CimInstance, or CimIntance[]. Type detected was '{0}'. (DRC0015) + InvalidPropertiesError = If 'DesiredValues' is a CimInstance then property 'Properties' must contain a value. (DRC0016) + MatchPsCredentialUsernameMessage = MATCH: PSCredential username match. Current state is '{0}' and desired state is '{1}'. (DRC0017) + NoMatchPsCredentialUsernameMessage = NOTMATCH: PSCredential username mismatch. Current state is '{0}' and desired state is '{1}'. (DRC0018) + NoMatchTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type is '{1}' and desired type is '{2}'. (DRC0019) + MatchValueMessage = MATCH: Value (type '{0}') for property '{1}' does match. Current state is '{2}' and desired state is '{3}'. (DRC0020) + NoMatchValueMessage = NOTMATCH: Value (type '{0}') for property '{1}' does not match. Current state is '{2}' and desired state is '{3}'. (DRC0021) + NoMatchValueDifferentCountMessage = NOTMATCH: Value (type '{0}') for property '{1}' does have a different count. Current state count is '{2}' and desired state count is '{3}'. (DRC0022) + NoMatchElementTypeMismatchMessage = NOTMATCH: Type mismatch for property '{0}' Current state type of element [{1}] is '{2}' and desired type is '{3}'. (DRC0023) + NoMatchElementValueMismatchMessage = NOTMATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. (DRC0024) + MatchElementValueMessage = MATCH: Value [{0}] (type '{1}') for property '{2}' does match. Current state is '{3}' and desired state is '{4}'. (DRC0025) + TestDscParameterResultMessage = Test-DscParameter result is '{0}'. (DRC0026) + StartingReverseCheck = Starting with a reverse check. (DRC0027) + TestDscParameterCompareMessage = Comparing values in property '{0}'. (DRC0028) + TooManyCimInstances = More than one CIM instance was returned from the current state. (DRC0029) + TestingCimInstance = Testing CIM instance '{0}' with the key properties '{1}'. (DRC0030) + MissingCimInstance = The CIM instance '{0}' with the key properties '{1}' is missing. (DRC0031) + ArrayValueIsAbsent = The array value '{0}' is absent. (DRC0032) + ArrayValueIsPresent = The array value '{0}' is present. (DRC0033) + KeyPropertiesMissing = The hashtable passed to function Test-DscPropertyState is missing the key 'KeyProperties'. This must be set to the property names that makes each instance in the CIM instance collection unique. (DRC0034) + ArrayDoesNotMatch = One or more values in an array does not match the desired state. Details of the changes are below. (DRC0035) + PropertyValueOfTypeDoesNotMatch = {0} value does not match. Current value is '{1}', but expected the value '{2}'. (DRC0036) + UnableToCompareType = Unable to compare the type {0} as it is not handled by the Test-DscPropertyState cmdlet. (DRC0037) + EvaluatePropertyState = Evaluating the state of the property '{0}'. (DRC0038) + PropertyInDesiredState = The parameter '{0}' is in desired state. (DRC0039) + PropertyNotInDesiredState = The parameter '{0}' is not in desired state. (DRC0040) +'@ diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt new file mode 100644 index 0000000..2a99677 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/DscResource.Common/0.9.3/en-US/about_DscResource.Common.help.txt @@ -0,0 +1,26 @@ +TOPIC + about_DscResource.Common + +SHORT DESCRIPTION + Common functions used in DSC tesources. + +LONG DESCRIPTION + This module contains common functions that are used in DSC resources. + +EXAMPLES + PS C:\> Get-Command -Module DscResource.Common + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/DscResource.Common + +SEE ALSO + - https://github.com/dsccommunity/DscResource.Common + +KEYWORDS + DSC, Localization + diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/StorageDsc.Common/StorageDsc.Common.psm1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/StorageDsc.Common/StorageDsc.Common.psm1 new file mode 100644 index 0000000..d04dc93 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/StorageDsc.Common/StorageDsc.Common.psm1 @@ -0,0 +1,231 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +Import-Module -Name (Join-Path -Path $modulePath -ChildPath 'DscResource.Common') + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -DefaultUICulture 'en-US' + +<# + .SYNOPSIS + Restarts a System Service + + .PARAMETER Name + Name of the service to be restarted. +#> +function Restart-ServiceIfExists +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $Name + ) + + Write-Verbose -Message ($script:localizedData.GetServiceInformation -f $Name) -Verbose + $servicesService = Get-Service @PSBoundParameters -ErrorAction Continue + + if ($servicesService) + { + Write-Verbose -Message ($script:localizedData.RestartService -f $Name) -Verbose + $servicesService | Restart-Service -Force -ErrorAction Stop -Verbose + } + else + { + Write-Verbose -Message ($script:localizedData.UnknownService -f $Name) -Verbose + } +} + +<# + .SYNOPSIS + Validates a Drive Letter, removing or adding the trailing colon if required. + + .PARAMETER DriveLetter + The Drive Letter string to validate. + + .PARAMETER Colon + Will ensure the returned string will include or exclude a colon. +#> +function Assert-DriveLetterValid +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DriveLetter, + + [Parameter()] + [Switch] + $Colon + ) + + $matches = @([regex]::matches($DriveLetter, '^([A-Za-z]):?$', 'IgnoreCase')) + + if (-not $matches) + { + # DriveLetter format is invalid + New-InvalidArgumentException ` + -Message $($script:localizedData.InvalidDriveLetterFormatError -f $DriveLetter) ` + -ArgumentName 'DriveLetter' + } + + # This is the drive letter without a colon + $DriveLetter = $matches.Groups[1].Value + + if ($Colon) + { + $DriveLetter = $DriveLetter + ':' + } # if + + return $DriveLetter +} # end function Assert-DriveLetterValid + +<# + .SYNOPSIS + Validates an Access Path, removing or adding the trailing slash if required. + If the Access Path does not exist or is not a folder then an exception will + be thrown. + + .PARAMETER AccessPath + The Access Path string to validate. + + .PARAMETER Slash + Will ensure the returned path will include or exclude a slash. +#> +function Assert-AccessPathValid +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $AccessPath, + + [Parameter()] + [Switch] + $Slash + ) + + if (-not (Test-Path -Path $AccessPath -PathType Container)) + { + # AccessPath is invalid + New-InvalidArgumentException ` + -Message $($script:localizedData.InvalidAccessPathError -f $AccessPath) ` + -ArgumentName 'AccessPath' + } # if + + # Remove or Add the trailing slash + if ($AccessPath.EndsWith('\')) + { + if (-not $Slash) + { + $AccessPath = $AccessPath.TrimEnd('\') + } # if + } + else + { + if ($Slash) + { + $AccessPath = "$AccessPath\" + } # if + } # if + + return $AccessPath +} # end function Assert-AccessPathValid + +<# + .SYNOPSIS + Retrieves a Disk object matching the disk Id and Id type + provided. + + .PARAMETER DiskId + Specifies the disk identifier for the disk to retrieve. + + .PARAMETER DiskIdType + Specifies the identifier type the DiskId contains. Defaults to Number. +#> +function Get-DiskByIdentifier +{ + [CmdletBinding()] + [OutputType([Microsoft.Management.Infrastructure.CimInstance])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $DiskId, + + [Parameter()] + [ValidateSet('Number','UniqueId','Guid','Location')] + [System.String] + $DiskIdType = 'Number' + ) + + switch -regex ($DiskIdType) + { + 'Number|UniqueId' # for filters supported by the Get-Disk CmdLet + { + $diskIdParameter = @{ + $DiskIdType = $DiskId + } + + $disk = Get-Disk ` + @diskIdParameter ` + -ErrorAction SilentlyContinue + break + } + + default # for filters requiring Where-Object + { + $disk = Get-Disk -ErrorAction SilentlyContinue | + Where-Object -Property $DiskIdType -EQ $DiskId + } + } + + return $disk +} # end function Get-DiskByIdentifier + +<# + .SYNOPSIS + Tests if any of the access paths from a partition are assigned + to a local path. + + .PARAMETER AccessPath + Specifies the access paths that are assigned to the partition. +#> +function Test-AccessPathAssignedToLocal +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String[]] + $AccessPath + ) + + $accessPathAssigned = $false + + foreach ($path in $AccessPath) + { + if ($path -match '[a-zA-Z]:\\') + { + $accessPathAssigned = $true + break + } + } + + return $accessPathAssigned +} # end function Test-AccessPathLocal + +Export-ModuleMember -Function @( + 'Restart-ServiceIfExists', + 'Assert-DriveLetterValid', + 'Assert-AccessPathValid', + 'Get-DiskByIdentifier', + 'Test-AccessPathAssignedToLocal' +) diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/StorageDsc.Common/en-US/StorageDsc.Common.strings.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/StorageDsc.Common/en-US/StorageDsc.Common.strings.psd1 new file mode 100644 index 0000000..bb3dde1 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/Modules/StorageDsc.Common/en-US/StorageDsc.Common.strings.psd1 @@ -0,0 +1,7 @@ +ConvertFrom-StringData @' + GetServiceInformation = Retrieving {0} service information. + RestartService = Restarting the {0} service. + UnknownService = Unable to find the desired service. + InvalidDriveLetterFormatError = Drive Letter format '{0}' is not valid. + InvalidAccessPathError = Access Path '{0}' is not found. +'@ diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/PSGetModuleInfo.xml b/deployment/dsc/azshcihost/StorageDsc/5.0.1/PSGetModuleInfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..fdb2ecb2974d06a9fe7cc1870beac3325e813407 GIT binary patch literal 20704 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 HNwxm~`r`SX literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/StorageDsc.psd1 b/deployment/dsc/azshcihost/StorageDsc/5.0.1/StorageDsc.psd1 new file mode 100644 index 0000000..32ea4fb --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/StorageDsc.psd1 @@ -0,0 +1,95 @@ +@{ + # Version number of this module. + moduleVersion = '5.0.1' + + # ID used to uniquely identify this module + GUID = '00d73ca1-58b5-46b7-ac1a-5bfcf5814faf' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'DSC resources for managing storage on Windows Servers.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' + + # Minimum version of the common language runtime (CLR) required by this module + CLRVersion = '4.0' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @() + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # DSC resources to export from this module + DscResourcesToExport = @( + 'DiskAccessPath', + 'MountImage', + 'OpticalDiskDriveLetter', + 'WaitForDisk', + 'WaitForVolume', + 'Disk' + ) + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResource', 'Disk', 'Storage', 'Partition', 'Volume') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/StorageDsc/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/StorageDsc' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [5.0.1] - 2020-08-03 + +### Changed + +- Fixed build failures caused by changes in `ModuleBuilder` module v1.7.0 + by changing `CopyDirectories` to `CopyPaths` - Fixes [Issue #237](https://github.com/dsccommunity/StorageDsc/issues/237). +- Updated to use the common module _DscResource.Common_ - Fixes [Issue #234](https://github.com/dsccommunity/StorageDsc/issues/234). +- Pin `Pester` module to 4.10.1 because Pester 5.0 is missing code + coverage - Fixes [Issue #238](https://github.com/dsccommunity/StorageDsc/issues/238). +- OpticalDiskDriveLetter: + - Removed integration test that tests when a disk is not in the + system as it is not a useful test, does not work correctly + and is covered by unit tests - Fixes [Issue #240](https://github.com/dsccommunity/StorageDsc/issues/240). +- StorageDsc + - Automatically publish documentation to GitHub Wiki - Fixes [Issue #241](https://github.com/dsccommunity/StorageDsc/issues/241). + +### Fixed + +- Disk: + - Fix bug when multiple partitions with the same drive letter are + reported by the disk subsystem - Fixes [Issue #210](https://github.com/dsccommunity/StorageDsc/issues/210). + +' + } # End of PSData hashtable + } # End of PrivateData hashtable +} + + + diff --git a/deployment/dsc/azshcihost/StorageDsc/5.0.1/en-US/about_StorageDsc.help.txt b/deployment/dsc/azshcihost/StorageDsc/5.0.1/en-US/about_StorageDsc.help.txt new file mode 100644 index 0000000..db25595 --- /dev/null +++ b/deployment/dsc/azshcihost/StorageDsc/5.0.1/en-US/about_StorageDsc.help.txt @@ -0,0 +1,25 @@ +TOPIC + about_StorageDsc + +SHORT DESCRIPTION + DSC resources for managing storage on Windows Servers. + +LONG DESCRIPTION + This module contains DSC resources for managing storage on Windows Servers. + +EXAMPLES + PS C:\> Get-DscResource -Module StorageDsc + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/StorageDsc + +SEE ALSO + - https://github.com/dsccommunity/StorageDsc + +KEYWORDS + DSC, DscResource, Storage, Disk, Partition, Volume diff --git a/deployment/dsc/azshcihost/WindowsDeploymentHelper/0.0.1/WindowsDeploymentHelper.psd1 b/deployment/dsc/azshcihost/WindowsDeploymentHelper/0.0.1/WindowsDeploymentHelper.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..7cb5d9773fb76d7e2b07966175ab4d9081318f53 GIT binary patch literal 8890 zcmeI2Yfl?T6o%(>rTzy?d@!jR5@?d9l`4foNRVh65lB<1UyN^c3z%XPf~x%Ww(m2? zCp)uVdyOGcRaMAY@9xZ*bA8Xn`TMVx@Ok(wtb|7RAq+z&T!iD$)!j*Gh0`zyJ>8AM zSWkL-e;(hY>zd&wtvc1tVYt-FZLL2OjbXSFjjrB|!*gAa^|Y(~&B=Lw>a)0pH!ZE~ zicTXOY45kXUg=q1R4(*(w7|ZhPGjGCxED6!=f1A%$xcpv68?-&_}-ZOA^)q;);R<5 ziL@t~HcaxPC}~TpuBKM>^v*Qb60aleZtF=Q)1~gl;aBbB-+@+4>v%2lqp9}3eiccGQ)+m9L;vsd?hx;3`m6xZ-(-aXH@DX;l1 z&P*NovC( z_m@<@743rBnRo&Z`jQ1i00k|c9oGs>thaC#Mbq7?IJ+bI8;SSf&7l>K%%8B-&JMv4l zHuCJ&5Q32B*zrn!LCkYD{PZJTGzi}y!XSRTj+UyZSEJ{{h@SK9T|_}{;l*SE7cBEH zFAuR)CDZc>?Sez|gZc7&49k5ADXT4b8?sL0T0?&ELb>rkn%|NC84g}b-{;}?Yx^eH za}cqd$RzsleD`i*hFB!$@&2t&11s=&k7AIK6;)o)h}Ggqe347fw2Fu>aysaLDvDQ< zsf^IudN-D&UHv;P=f~5y%hT5RC;GE0=~$A302jLUqrB%4MZr+ZL#xUudtpB!eW5|V z)#1ax(*`C@wVod=fK4yuN7TqG~Eqf>h6sypGWcA zrnKA9_XkVpwd_&T9Bt0zXEC%YYCWO@&mntJ_ftjkjk=oXp-x2yUf+_TtiE)A>nje1 zT2F*oz99>v!_(+tthWdykD*Q5pVIa`3Qg}o3LeY)*cWeU7E3F7B}wN7h2dSqd9d>dOEE?{%IE4OYt+LaE4 z4jBzmQQWqLr%^POV3a8V!T-3@3!f5*YvTeQxW^m?_Z8@;>W) z+(ee07(dKEh^T7YekyrVUTz{&Id-S90rbW1z*w-!;*b31Ga=sQb!7UM{s<3X>VeK| zzj^t-_LV0Y_p-UhwC9!4h)nN%m8DrMW_MynF8Uh7A$s_3c=rK+u{aSxXHbokWFW6@ z@MA-An{L^2o1Kx{Sj%J#y`ll1A2ifMFfZyzUm!zARImVDO?d}c2r^iu<%j`3jJ5MB zo?%l7qkuf*6YJQZP8DdA37_6r6=xZjsD(SEVwzE>p&Uh~wTdmDW*T+-G-JJXsmaCn z(c9?B%RSv2`Nf_vaQ-Z2OA>Y_TKV6OWjnTOwUgU0*XC^d&9}+x=*i4HZPvD|UDC*( zrdiEhGkj6g^)o?%H|8bFa`xYieCylhX(#uXT$|N4sjm&UHAC4F?ob)g15oW-N8okB z^^iIBoE6dC7S*+I6xRchr}II4Q7v){&N&tGdPEjE>OnJ>R7|zU^8g z@36_coE`nLUkk3Vxl>Gdi&-VM=}^&V5EW%{|@yF#M)<)SUAz!>QJr`uf}DpW2(w(_-Cn z68xD@68%WUuMo>>e|JLrCVZ32=mjiOGZO + + + $Domain + $domainJoinerPasswordClearText + $username + + $joinDomain + + +"@ + } + else + { + $domainJoinXMLString = $null + } + + $PowerShellStartupCmd = "%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File $PowerShellScriptFullPath" + + if ($AutoLogonCount -gt 0) + { + Write-Warning -Message '-AutoLogonCount places the Administrator password in plain txt' + $autoLogonXMLString = @" + + + + $LocalAdministratorPasswordClearText + + $AutoLogonCount + Administrator + true + +"@ + } + else + { + $autoLogonXMLString = $null + } + if ($IpCidr){ + $IPAddressXMLString = @" + + + + + $NicNameForIPandDNSAssignments + + $IpCidr + + + + 1 + 0.0.0.0/0 + 10 + $DefaultGateway + + + + false + + + + +"@ + } + else + { + $IPAddressXMLString = $null + } + if ($DnsServer) + { + $DnsAddressXMLString = @" + + + + + $NicNameForIPandDNSAssignments + + $DnsServer + + true + false + + + +"@ + } + else + { + $DnsAddressXMLString = $null + } + + if ($PowerShellScriptFullPath) + { + $logonScriptXMLString = @" + + + + PowerShell First logon script + 1 + $PowerShellStartupCmd + false + + +"@ + } + else + { + $logonScriptXMLString = $null + } + + $unattend = @" + + + + + + + + + $computerName + + + $computerName + $IPAddressXMLString$DnsAddressXMLString$domainJoinXMLString + + + + $InputLocale + $SystemLocale + $UILanguage + $UserLocale + + + $InputLocale + $SystemLocale + $UILanguage + $UserLocale + + + + $HideEULAPage + true + Work + 1 + true + true + + $TimeZone + + + $encodedAdministratorPassword + false</PlainText> + </AdministratorPassword> + </UserAccounts> + <RegisteredOrganization>$RegisteredOrganization</RegisteredOrganization> + <RegisteredOwner>$RegisteredOrganization</RegisteredOwner>$autoLogonXMLString$logonScriptXMLString + </component> + <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <OOBE> + <HideEULAPage>$HideEULAPage</HideEULAPage> + <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> + <NetworkLocation>Work</NetworkLocation> + <ProtectYourPC>1</ProtectYourPC> + <SkipUserOOBE>true</SkipUserOOBE> + <SkipMachineOOBE>true</SkipMachineOOBE> + </OOBE> + <TimeZone>$TimeZone</TimeZone> + <UserAccounts> + <AdministratorPassword> + <Value>$encodedAdministratorPassword</Value> + <PlainText>false</PlainText> + </AdministratorPassword> + </UserAccounts> + <RegisteredOrganization>$RegisteredOrganization</RegisteredOrganization> + <RegisteredOwner>$RegisteredOrganization</RegisteredOwner>$autoLogonXMLString$logonScriptXMLString + </component> + </settings> +</unattend> +"@ + + + try + { + $path = Resolve-Path -Path $OutputPath -ErrorAction Stop + $file = (Join-Path -Path $path -ChildPath 'Unattend.xml') + + $fileExist = Test-Path -Path $file + if ($fileExist -and $Force) + { + Write-Verbose -Message "Overwriting $file, Force switch was enabled." + $confirm = $false + $operation = 'Overridden' + } + elseif ($fileExist) + { + Write-Verbose -Message "$file deletion will be prompted." + $confirm = $true + $operation = 'Overridden' + } + else + { + Write-Verbose -Message "Creating Unattend.xml file in $OutputPath" + $confirm = $false + $operation = 'created' + } + if ($PrintScreenOnly) + { + return $unattend + } + Remove-Item -Path $file -Confirm:$confirm -ErrorAction SilentlyContinue + Set-Content -Path $file -Value $unattend + Write-Output "File $($operation): $file" + } + finally + { + Remove-Variable -Name unattend, LocalAdministratorPasswordClearText, encodedAdministratorPassword, domainJoinerPasswordClearText -ErrorAction SilentlyContinue + } + +} +Export-ModuleMember -Function New-BasicUnattendXML \ No newline at end of file diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Add-UpdateImage.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Add-UpdateImage.ps1 new file mode 100644 index 0000000..ae2acc8 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Add-UpdateImage.ps1 @@ -0,0 +1,277 @@ +function Add-UpdateImage +{ + <# + .Synopsis + Add a Windows Image to a Windows Image Tools Update Directory + .DESCRIPTION + This command will convert a .ISO or .WIM into a VHD populated with an unattend.xml and first boot script + .EXAMPLE + Add-WitUpdateImage -Path c:\WitTools + .EXAMPLE + Another example of how to use this cmdlet + .INPUTS + System.IO.DirectoryInfo + .OUTPUTS + Custom object containing String -Path and String -Name + #> + [CmdletBinding(SupportsShouldProcess = $true)] + #[OutputType([String])] + Param + ( + # Path to the Windows Image Tools Update Folders (created via New-WindowsImageToolsExample) + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [ValidateScript({ + if (Test-Path $_) + { + $true + } + else + { + throw "Path $_ does not exist" + } + })] + [Alias('FullName')] + $Path, + + # Friendly name for for Base VHD used for filenames and targeting in Invoke-WindwosImageUpdate + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [string] + $FriendlyName, + + # Administrator Password for Base VHD + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [PSCredential] + $AdminCredential, + + # Product Key for sorce image (Not required for volume licence media) + [ValidateNotNullOrEmpty()] + [ValidateScript({ + if ($_ -imatch '^[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{5}$') + { + $true + } + else + { + throw "$_ not a valid key format" + } + })] + [String] + $ProductKey, + + # Size in Bytes (Default 40B) + [ValidateRange(25GB,64TB)] + [uint64]$Size = 40GB, + + # Create Dynamic disk + [switch]$Dynamic, + + # Specifies whether to build the image for BIOS (MBR), UEFI (GPT), or WindowsToGo (MBR). + # Generation 1 VMs require BIOS (MBR) images. Generation 2 VMs require UEFI (GPT) images. + # Windows To Go images will boot in UEFI or BIOS + [Parameter(Mandatory = $true)] + [Alias('Layout')] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet('BIOS', 'UEFI', 'WindowsToGo')] + $DiskLayout, + + # Path to WIM or ISO used to populate VHDX + [parameter(Position = 1,Mandatory = $true, + HelpMessage = 'Enter the path to the WIM/ISO file')] + [ValidateScript({ + Test-Path -Path (Get-FullFilePath -Path $_ ) + })] + [string]$SourcePath, + + # Index of image inside of WIM (Default 1) + [int]$Index = 1, + + # Add payload for all removed features + [switch]$AddPayloadForRemovedFeature, + + # Features to turn on (in DISM format) + [ValidateNotNullOrEmpty()] + [string[]]$Feature, + + # Feature to remove (in DISM format) + [ValidateNotNullOrEmpty()] + [string[]]$RemoveFeature, + + # Feature Source path. If not provided, all ISO and WIM images in $sourcePath searched + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string[]]$FeatureSource, + + # Feature Source index. If the source is a .wim provide an index Default =1 + [int]$FeatureSourceIndex, + + # Path to drivers to inject + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string[]]$Driver, + + # Path of packages to install via DSIM + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string[]]$Package, + + # Files/Folders to copy to root of Winodws Drive (to place files in directories mimic the direcotry structure off of C:\) + [ValidateNotNullOrEmpty()] + [ValidateScript({ + foreach ($Path in $_) + { + Test-Path -Path $(Resolve-Path $Path) + } + })] + [string[]]$filesToInject, + + # Force the overwrite of existing Image + [switch]$force + + ) + + $target = "$Path\BaseImage\$($FriendlyName)_base.vhdx" + + if ($pscmdlet.ShouldProcess("$target", 'Add Windows Image Tools Update Image')) + { + $ParametersToPass = @{} + foreach ($key in ('Whatif', 'Verbose', 'Debug')) + { + if ($PSBoundParameters.ContainsKey($key)) + { + $ParametersToPass[$key] = $PSBoundParameters[$key] + } + } + + #region Validate Input + try + { + $null = Test-Path -Path "$Path\BaseImage" -ErrorAction Stop + $null = Test-Path -Path "$Path\Resource" -ErrorAction Stop + } + catch + { + Throw "$Path missing required folder structure use New-WindowsImagetoolsExample to create example" + } + if ((Test-Path -Path "$Path\BaseImage\$($FriendlyName)_Base.vhdx") -and (-not ($force))) + { + Throw "BaseImage $Path\BaseImage\$($FriendlyName)_Base.vhdx allready exists. use -force to overwrite " + } + #endregion + + #region Unattend + $unattentParam = @{ + FirstBootScriptPath = 'c:\pstemp\FirstBoot.ps1' + AdminCredential = $AdminCredential + EnableAdministrator = $true + } + if ($ProductKey) + { + $unattentParam.add('ProductKey',$ProductKey) + } + + $UnattendPath = New-UnattendXml @unattentParam @ParametersToPass + #endregion + + + #region Create Base VHD + $convertParm = @{ + DiskLayout = $DiskLayout + SourcePath = $SourcePath + Index = $Index + Unattend = $UnattendPath + Path = $target + } + if ($Dynamic) + { + $convertParm.add('Dynamic',$Dynamic) + } + if ($AddPayloadForRemovedFeature) + { + $convertParm.add('AddPayloadForRemovedFeature', $AddPayloadForRemovedFeature) + } + if ($Feature) + { + $convertParm.add('Feature',$Feature) + } + if ($RemoveFeature) + { + $SetVHDPartitionParam.add('RemoveFeature', $RemoveFeature) + } + if ($FeatureSource) + { + $SetVHDPartitionParam.add('FeatureSource', $FeatureSource) + } + if ($FeatureSourceIndex) + { + $SetVHDPartitionParam.add('FeatureSourceIndex', $FeatureSourceIndex) + } + if ($Driver) + { + $convertParm.add('Driver',$Driver) + } + if ($Package) + { + $convertParm.add('Package',$Package) + } + if ($filesToInject) + { + $convertParm.add('filesToInject',$filesToInject) + } + if ($force) + { + $convertParm.add('force',$true) + } + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : $target : Creating " + Convert-Wim2VHD @convertParm @ParametersToPass + #endregion + + #region add firstboot script + $FirstBootContent = { + Start-Transcript -Path $PSScriptRoot\FirstBoot.log + + Get-Service Schedule | Start-Service + Start-Sleep -Seconds 20 + schtasks.exe /Create /TN 'AtStartup' /RU 'SYSTEM' /SC ONSTART /TR "'%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe' -NoProfile -ExecutionPolicy Bypass -File C:\PsTemp\AtStartup.ps1" + Start-Sleep -Seconds 20 + + # Restart-Computer does not have -force in 2008/win7 WMF2 + if ((Get-Command Restart-Computer -Syntax) -like '*[force]*') + { + Restart-Computer -Verbose -Force + } + else + { + shutdown.exe /r /t 0 /f + } + Stop-Transcript + } + + $AddScriptFilesBlock = { + if (-not (Test-Path "$($driveLetter):\PsTemp")) + { + $null = mkdir "$($driveLetter):\PsTemp" -ErrorAction SilentlyContinue + } + $null = New-Item -Path "$($driveLetter):\PsTemp" -Name FirstBoot.ps1 -ItemType 'file' -Value $FirstBootContent + } + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : $target : Adding First Boot Script " + MountVHDandRunBlock -vhd $target -block $AddScriptFilesBlock @ParametersToPass + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : $target : Finished " + #endregion + } +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Convert-Wim2VHD.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Convert-Wim2VHD.ps1 new file mode 100644 index 0000000..edda387 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Convert-Wim2VHD.ps1 @@ -0,0 +1,242 @@ +function Convert-Wim2VHD +{ + <# + .Synopsis + Create a VHDX and populate it from a WIM + .DESCRIPTION + This command will create a VHD or VHDX formated for UEFI (Gen 2/GPT) or BIOS (Gen 1/MBR) + You must supply the path to the VHD/VHDX file and a valid WIM/ISO. You should also + include the index number for the Windows Edition to install. + .EXAMPLE + Convert-WIM2VHDX -Path c:\windows8.vhdx -WimPath d:\Source\install.wim -Recovery -DiskLayout UEFI + .EXAMPLE + Convert-WIM2VHDX -Path c:\windowsServer.vhdx -WimPath d:\Source\install.wim -index 3 -Size 40GB -force -DiskLayout UEFI + #> + [CmdletBinding(SupportsShouldProcess = $true, + PositionalBinding = $false, + ConfirmImpact = 'Medium')] + Param + ( + # Path to the new VHDX file (Must end in .vhdx) + [Parameter(Position = 0,Mandatory = $true, + HelpMessage = 'Enter the path for the new VHDX file')] + [ValidateNotNullorEmpty()] + [ValidatePattern(".\.vhdx?$")] + [ValidateScript({ + if (Get-FullFilePath -Path $_ | + Split-Path | + Resolve-Path ) + { + $true + } + else + { + Throw "Parent folder for $_ does not exist." + } + })] + [string]$Path, + + # Size in Bytes (Default 40B) + [ValidateRange(25GB,64TB)] + [long]$Size = 40GB, + + # Create Dynamic disk + [switch]$Dynamic, + + # Specifies whether to build the image for BIOS (MBR), UEFI (GPT), or WindowsToGo (MBR). + # Generation 1 VMs require BIOS (MBR) images. Generation 2 VMs require UEFI (GPT) images. + # Windows To Go images will boot in UEFI or BIOS + [Parameter(Mandatory = $true)] + [Alias('Layout')] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet('BIOS', 'UEFI', 'WindowsToGo')] + $DiskLayout, + + # Create the Recovery Environment Tools Partition. Only valid on UEFI layout + [switch]$RecoveryTools, + + # Create the Recovery Environment Tools and Recovery Image Partitions. Only valid on UEFI layout + [switch]$RecoveryImage, + + # Force the overwrite of existing files + [switch]$force, + + # Path to WIM or ISO used to populate VHDX + [parameter(Position = 1,Mandatory = $true, + HelpMessage = 'Enter the path to the WIM/ISO file')] + [ValidateScript({ + Test-Path -Path (Get-FullFilePath -Path $_ ) + })] + [string]$SourcePath, + + # Index of image inside of WIM (Default 1) + [int]$Index = 1, + + # Path to file to copy inside of VHD(X) as C:\unattent.xml + [ValidateScript({ + if ($_) + { + Test-Path -Path $_ + } + else + { + $true + } + })] + [string]$Unattend, + + # Native Boot does not have the boot code inside the VHD(x) it must exist on the physical disk. + [switch]$NativeBoot, + + # Features to turn on (in DISM format) + [ValidateNotNullOrEmpty()] + [string[]]$Feature, + + # Feature to remove (in DISM format) + [ValidateNotNullOrEmpty()] + [string[]]$RemoveFeature, + + # Feature Source path. If not provided, all ISO and WIM images in $sourcePath searched + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string]$FeatureSource, + + # Feature Source index. If the source is a .wim provide an index Default =1 + [int]$FeatureSourceIndex = 1, + + # Path to drivers to inject + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string[]]$Driver, + + # Add payload for all removed features + [switch]$AddPayloadForRemovedFeature, + + # Path of packages to install via DSIM + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string[]]$Package, + # Files/Folders to copy to root of Winodws Drive (to place files in directories mimic the direcotry structure off of C:\) + [ValidateNotNullOrEmpty()] + [ValidateScript({ + foreach ($Path in $_) + { + Test-Path -Path $(Resolve-Path $Path) + } + })] + [string[]]$filesToInject + + ) + $Path = $Path | Get-FullFilePath + $SourcePath = $SourcePath | Get-FullFilePath + + $VhdxFileName = Split-Path -Leaf -Path $Path + + if ($pscmdlet.ShouldProcess("[$($MyInvocation.MyCommand)] : Overwrite partitions inside [$Path] with content of [$SourcePath]", + "Overwrite partitions inside [$Path] with contentce of [$SourcePath]? ", + 'Overwrite WARNING!')) + { + if((-not (Test-Path $Path)) -Or $force -Or $pscmdlet.ShouldContinue('Are you sure? Any existin data will be lost!', 'Warning')) + { + $ParametersToPass = @{} + foreach ($key in ('Whatif', 'Verbose', 'Debug')) + { + if ($PSBoundParameters.ContainsKey($key)) + { + $ParametersToPass[$key] = $PSBoundParameters[$key] + } + } + + $InitializeVHDPartitionParam = @{ + 'Size' = $Size + 'Path' = $Path + 'force' = $true + 'DiskLayout' = $DiskLayout + } + if ($RecoveryTools) + { + $InitializeVHDPartitionParam.add('RecoveryTools', $true) + } + if ($RecoveryImage) + { + $InitializeVHDPartitionParam.add('RecoveryImage', $true) + } + if ($Dynamic) + { + $InitializeVHDPartitionParam.add('Dynamic', $true) + } + $SetVHDPartitionParam = @{ + 'SourcePath' = $SourcePath + 'Path' = $Path + 'Index' = $Index + 'force' = $true + 'Confirm' = $false + } + if ($Unattend) + { + $SetVHDPartitionParam.add('Unattend', $Unattend) + } + if ($NativeBoot) + { + $SetVHDPartitionParam.add('NativeBoot', $NativeBoot) + } + if ($Feature) + { + $SetVHDPartitionParam.add('Feature', $Feature) + } + if ($RemoveFeature) + { + $SetVHDPartitionParam.add('RemoveFeature', $RemoveFeature) + } + if ($FeatureSource) + { + $SetVHDPartitionParam.add('FeatureSource', $FeatureSource) + } + if ($FeatureSourceIndex) + { + $SetVHDPartitionParam.add('FeatureSourceIndex', $FeatureSourceIndex) + } + if ($AddPayloadForRemovedFeature) + { + $SetVHDPartitionParam.add('AddPayloadForRemovedFeature', $AddPayloadForRemovedFeature) + } + if ($Driver) + { + $SetVHDPartitionParam.add('Driver', $Driver) + } + if ($Package) + { + $SetVHDPartitionParam.add('Package', $Package) + } + if ($filesToInject) + { + $SetVHDPartitionParam.add('filesToInject', $filesToInject) + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : InitializeVHDPartitionParam" + Write-Verbose -Message ($InitializeVHDPartitionParam | Out-String) + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : SetVHDPartitionParam" + Write-Verbose -Message ($SetVHDPartitionParam | Out-String) + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : ParametersToPass" + Write-Verbose -Message ($ParametersToPass | Out-String) + + Try + { + Initialize-VHDPartition @InitializeVHDPartitionParam @ParametersToPass + Set-VHDPartition @SetVHDPartitionParam @ParametersToPass + } + Catch + { + throw "$($_.Exception.Message) at $($_.Exception.InvocationInfo.ScriptLineNumber)" + } + } + } +} + + diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Get-VhdPartitionStyle.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Get-VhdPartitionStyle.ps1 new file mode 100644 index 0000000..d5487bb --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Get-VhdPartitionStyle.ps1 @@ -0,0 +1,24 @@ +Function Get-VhdPartitionStyle +{ + <# + .Synopsis + Gets partition style of a VHD(x) + .DESCRIPTION + Returns the partition Style of the provided VHD(x) ei. GPT or MBR + .EXAMPLE + $partitionStyle = Get-VhdPartitionStyle -Vhd C:\win10.vhdx + #> + param + ( + # Path to VHD(x) file + [Parameter(Mandatory,HelpMessage = 'Path to VHD(x)')] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [string] + $vhd + ) + $PartitionStyle = (Mount-VHD -Path $vhd -ReadOnly -Passthru | Get-Disk).PartitionStyle + Dismount-VHD $vhd + Start-Sleep -Seconds 2 + return $PartitionStyle +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/HelperFunctions.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/HelperFunctions.ps1 new file mode 100644 index 0000000..e4d3005 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/HelperFunctions.ps1 @@ -0,0 +1,321 @@ +function Get-FullFilePath +{ + <# + .Synopsis + Get Absolute path from relative path + .DESCRIPTION + Takes a relative path like .\file.txt and returns the full path. + Parent folder must exist, but target file does not. + The target file does not have to exist, but the parent folder must exist + .EXAMPLE + $path = Get-AbsoluteFilePath -Path .\file.txt + #> + [CmdletBinding()] + [OutputType([string])] + Param + ( + # Path to file + [Parameter(Mandatory,HelpMessage = 'Path to file', + ValueFromPipeline, + Position = 0)] + [String]$Path + ) + + if (-not (Test-Path -Path $Path)) + { + if (Test-Path -Path (Split-Path -Path $Path -Parent )) + { + $Parent = Resolve-Path -Path (Split-Path -Path $Path -Parent ) + $Leaf = Split-Path -Path $Path -Leaf + + if ($Parent.path[-1] -eq '\') + { + $Path = "$Parent" + "$Leaf" + } + else + { + $Path = "$Parent" + "\$Leaf" + } + } + else + { + throw "Parent [$(Split-Path -Path $Path -Parent)] does not exist" + } + } + else + { + $Path = Resolve-Path -Path $Path + } + + return $Path +} + +function +Test-Admin +{ + <# + .SYNOPSIS + Short function to determine whether the logged-on user is an administrator. + + .EXAMPLE + Do you honestly need one? There are no parameters! + + .OUTPUTS + $true if user is admin. + $false if user is not an admin. + #> + [CmdletBinding()] + param() + + $currentUser = New-Object -TypeName Security.Principal.WindowsPrincipal -ArgumentList $([Security.Principal.WindowsIdentity]::GetCurrent()) + $isAdmin = $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : is User Admin? [$isAdmin]" + + return $isAdmin +} + + +function +Run-Executable +{ + <# + .SYNOPSIS + Runs an external executable file, and validates the error level. + + .PARAMETER Executable + The path to the executable to run and monitor. + + .PARAMETER Arguments + An array of arguments to pass to the executable when it's executed. + + .PARAMETER SuccessfulErrorCode + The error code that means the executable ran successfully. + The default value is 0. + #> + + [CmdletBinding()] + param( + [Parameter(Mandatory,HelpMessage = 'Path to Executable')] + [string] + [ValidateNotNullOrEmpty()] + $Executable, + + [Parameter(Mandatory,HelpMessage = 'aray of arguments to pass to executable')] + [string[]] + [ValidateNotNullOrEmpty()] + $Arguments, + + [Parameter()] + [int] + $SuccessfulErrorCode = 0 + + ) + + $exeName = Split-Path -Path $Executable -Leaf + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Running [$Executable] [$Arguments]" + $Params = @{ + 'FilePath' = $Executable + 'ArgumentList' = $Arguments + 'NoNewWindow' = $true + 'Wait' = $true + 'RedirectStandardOutput' = "$($env:temp)\$($exeName)-StandardOutput.txt" + 'RedirectStandardError' = "$($env:temp)\$($exeName)-StandardError.txt" + 'PassThru' = $true + } + + Write-Verbose -Message ($Params | Out-String) + $ret = Start-Process @Params -ErrorAction SilentlyContinue + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Return code was [$($ret.ExitCode)]" + + if ($ret.ExitCode -ne $SuccessfulErrorCode) + { + throw "$Executable failed with code $($ret.ExitCode)!" + } +} + +Function Test-IsNetworkLocation +{ + <# + .SYNOPSIS + Determines whether or not a given path is a network location or a local drive. + + .DESCRIPTION + Function to determine whether or not a specified path is a local path, a UNC path, + or a mapped network drive. + + .PARAMETER Path + The path that we need to figure stuff out about, + #> + + [CmdletBinding()] + param( + [Parameter(ValueFromPipeLine)] + [string] + [ValidateNotNullOrEmpty()] + $Path + ) + + $result = $false + + if ([bool]([URI]$Path).IsUNC) + { + $result = $true + } + else + { + $driveInfo = [IO.DriveInfo]((Resolve-Path -Path $Path).Path) + + if ($driveInfo.DriveType -eq 'Network') + { + $result = $true + } + } + + return $result +} + +function New-TemporaryDirectory +{ + <# + .Synopsis + Create a new Temporary Directory + .DESCRIPTION + Creates a new Directory in the $env:temp and returns the System.IO.DirectoryInfo (dir) + .EXAMPLE + $TempDirPath = NewTemporaryDirectory + #> + [CmdletBinding(SupportsShouldProcess)] + [OutputType([System.IO.DirectoryInfo])] + Param + ( + ) + + #return [System.IO.Directory]::CreateDirectory((Join-Path $env:Temp -Ch ([System.IO.Path]::GetRandomFileName().split('.')[0]))) + + Begin + { + try + { + if($PSCmdlet.ShouldProcess($env:temp)) + { + $tempDirPath = [System.IO.Directory]::CreateDirectory((Join-Path -Path $env:temp -ChildPath ([System.IO.Path]::GetRandomFileName().split('.')[0]))) + } + } + catch + { + $errorRecord = [System.Management.Automation.ErrorRecord]::new($_.Exception,'NewTemporaryDirectoryWriteError', 'WriteError', $env:temp) + Write-Error -ErrorRecord $errorRecord + return + } + + if($tempDirPath) + { + Get-Item -Path $env:temp\$tempDirPath + } + } +} + +function MountVHDandRunBlock +{ + param + ( + [string]$vhd, + [scriptblock]$block, + [switch]$ReadOnly + ) + + # This function mounts a VHD, runs a script block and unmounts the VHD. + # Drive letter of the mounted VHD is stored in $driveLetter - can be used by script blocks + if($ReadOnly) + { + $virtualDisk = Mount-VHD -Path $vhd -ReadOnly -Passthru + } + else + { + $virtualDisk = Mount-VHD -Path $vhd -Passthru + } + # Workarround for new drive letters in script modules + $null = Get-PSDrive + $driveLetter = ($virtualDisk | + Get-Disk | + Get-Partition | + Get-Volume).DriveLetter + & $block + + Dismount-VHD -Path $vhd + + # Wait 2 seconds for activity to clean up + Start-Sleep -Seconds 2 +} + +Function GetVHDPartitionStyle +{ + param + ( + [string]$vhd + ) + $PartitionStyle = (Mount-VHD -Path $vhd -ReadOnly -Passthru | Get-Disk).PartitionStyle + Dismount-VHD -Path $vhd + Start-Sleep -Seconds 2 + return $PartitionStyle +} + +function createRunAndWaitVM +{ + [CmdletBinding()] + param + ( + [string] $vhdPath, + [string] $vmGeneration, + [Hashtable] $configData + ) + + $vmName = [System.IO.Path]::GetRandomFileName().split('.')[0] + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Creating VM $vmName at $(Get-Date)" + $null = New-VM -Name $vmName -MemoryStartupBytes 2048mb -VHDPath $vhdPath -Generation $vmGeneration -SwitchName $configData.vmSwitch -ErrorAction Stop + + If($configData.vLan -ne 0) + { + Get-VMNetworkAdapter -VMName $vmName | Set-VMNetworkAdapterVlan -Access -VlanId $configData.vLan + } + + Set-VM -Name $vmName -ProcessorCount 2 + Start-VM -Name $vmName + + # Give the VM a moment to start before we start checking for it to stop + Start-Sleep -Seconds 10 + + # Wait for the VM to be stopped for a good solid 5 seconds + do + { + $state1 = (Get-VM | Where-Object name -EQ -Value $vmName).State + Start-Sleep -Seconds 5 + + $state2 = (Get-VM | Where-Object name -EQ -Value $vmName).State + Start-Sleep -Seconds 5 + } + until (($state1 -eq 'Off') -and ($state2 -eq 'Off')) + + # Clean up the VM + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : VM $vmName Stoped" + Remove-VM -Name $vmName -Force + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : VM $vmName Deleted at $(Get-Date)" +} + +function cleanupFile +{ + param + ( + [string[]] $file + ) + + foreach ($target in $file) + { + if (Test-Path -Path $target) + { + Remove-Item -Path $target -Recurse -Force + } + } +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Initialize-VHDPartition.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Initialize-VHDPartition.ps1 new file mode 100644 index 0000000..ed02a26 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Initialize-VHDPartition.ps1 @@ -0,0 +1,346 @@ +function Initialize-VHDPartition +{ + <# + .Synopsis + Create VHD(X) with partitions needed to be bootable + .DESCRIPTION + This command will create a VHD or VHDX file. Supported layours are: BIOS, UEFO or WindowsToGo. + + To create a recovery partitions use -RecoveryTools and -RecoveryImage + + .EXAMPLE + Initialize-VHDPartition d:\disks\disk001.vhdx -dynamic -size 30GB -DiskLayout BIOS + .EXAMPLE + Initialize-VHDPartition d:\disks\disk001.vhdx -dynamic -size 40GB -DiskLayout UEFI -RecoveryTools + .NOTES + General notes + #> + [CmdletBinding(SupportsShouldProcess, + PositionalBinding = $false, + ConfirmImpact = 'Medium')] + Param + ( + # Path to the new VHDX file (Must end in .vhdx) + [Parameter(Position = 0,Mandatory, + HelpMessage = 'Enter the path for the new VHD/VHDX file')] + [ValidateNotNullorEmpty()] + [ValidatePattern(".\.vhdx?$")] + [ValidateScript({ + if (Get-FullFilePath -Path $_ | + Split-Path | + Resolve-Path ) + { + $true + } + else + { + Throw "Parent folder for $_ does not exist." + } + })] + [string]$Path, + + # Size in Bytes (Default 40B) + [ValidateRange(25GB,64TB)] + [uint64]$Size = 40GB, + + # Create Dynamic disk + [switch]$Dynamic, + + # Specifies whether to build the image for BIOS (MBR), UEFI (GPT), or WindowsToGo (MBR). + # Generation 1 VMs require BIOS (MBR) images. Generation 2 VMs require UEFI (GPT) images. + # Windows To Go images will boot in UEFI or BIOS + [Parameter(Mandatory)] + [Alias('Layout')] + [string] + [ValidateNotNullOrEmpty()] + [ValidateSet('BIOS', 'UEFI', 'WindowsToGo')] + $DiskLayout, + + # Output the disk image object + [switch]$Passthru, + + # Create the Recovery Environment Tools Partition. Only valid on UEFI layout + [switch]$RecoveryTools, + + # Create the Recovery Environment Tools and Recovery Image Partitions. Only valid on UEFI layout + [switch]$RecoveryImage, + + # Force the overwrite of existing files + [switch]$force + ) + Begin { + + + if ($pscmdlet.ShouldProcess("[$($MyInvocation.MyCommand)] Create partition structure for Bootable vhd(x) on [$Path]", + "Replace existing file [$Path] ? ", + 'Overwrite WARNING!')) + { + if((-not (Test-Path $Path)) -Or + $force -Or + ((Test-Path $Path) -and $pscmdlet.ShouldContinue("TargetFile [$Path] exists! Any existin data will be lost!", 'Warning'))) + { + #region Validate input + + # Recovery Image requires the Recovery Tools + if ($RecoveryImage) + { + $RecoveryTools = $true + } + + $VHDFormat = ([IO.FileInfo]$Path).Extension.split('.')[-1] + + if (($DiskLayout -eq 'UEFI')-and ($VHDFormat -eq 'VHD')) + { + throw 'UEFI disks must be in VHDX format. Please change the path to end in VHDX' + } + + # Choose smallest supported block size for dynamic VHD(X) + $BlockSize = 1MB + + # Enforce max VHD size. + if ('VHD' -ilike $VHDFormat) + { + if ($Size -gt 2040GB) + { + Write-Warning -Message 'For the VHD file format, the maximum file size is ~2040GB. Reseting size to 2040GB.' + $Size = 2040GB + } + + $BlockSize = 512KB + } + + $SysSize = 200MB + $MSRSize = 128MB + $RESize = 0 + $RecoverySize = 0 + if ($RecoveryTools) + { + $RESize = 350MB + } + if ($RecoveryImage) + { + $RecoverySize = 15GB + } + $fileName = Split-Path -Leaf -Path $Path + + # make paths absolute + $Path = $Path | Get-FullFilePath + #endregion + + # if we get this far it's ok to delete existing files + if (Test-Path -Path $Path) + { + Remove-Item -Path $Path + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Creating" + + #region Create VHD + Try + { + if ($VHDCmdlets) + { + $vhdParams = @{ + ErrorAction = 'Stop' + Path = $Path + SizeBytes = $Size + Dynamic = $Dynamic + BlockSizeBytes = $BlockSize + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : @vhdParms" + Write-Verbose -Message ($vhdParams | Out-String) + $null = New-VHD @vhdParams + } + else + { + $vhdParams = @{ + VHDFormat = $VHDFormat + Path = $Path + SizeBytes = $Size + } + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Params for [WIM2VHD.VirtualHardDisk]::CreateSparseDisk()" + Write-Verbose -Message ($vhdParams | Out-String) + + [WIM2VHD.VirtualHardDisk]::CreateSparseDisk( + $VHDFormat, + $Path, + $Size, + $true + ) + } + } + catch + { + Throw "Failed to create $Path. $($_.Exception.Message)" + } + + #endregion + + if (Test-Path -Path $Path) + { + #region Mount Image + try + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Mounting disk image" + $disk = Mount-DiskImage -ImagePath $Path -PassThru | + Get-DiskImage | + Get-Disk + } + catch + { + throw $_.Exception.Message + } + #endregion + + #region create partitions + try + { + $disknumber = $disk.Number + + switch ($DiskLayout) + { + 'BIOS' + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Initializing disk [$disknumber] as MBR" + Initialize-Disk -Number $disknumber -PartitionStyle MBR + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Clearing disk partitions to start all over" + Get-Disk -Number $disknumber -ErrorAction Stop | + Get-Partition -ErrorAction Stop | + Remove-Partition -Confirm:$false -ErrorAction Stop + + # Create the Windows/system partition + # Refresh $disk to update free space + $disk = Get-DiskImage -ImagePath $Path | Get-Disk + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Creating single partition of [$($disk.LargestFreeExtent)] bytes" + $windowsPartition = New-Partition -DiskNumber $disknumber -UseMaximumSize -MbrType IFS -IsActive #-Size $disk.LargestFreeExtent + $systemPartition = $windowsPartition + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Formatting windows volume" + $null = Format-Volume -Partition $windowsPartition -FileSystem NTFS -Force -Confirm:$false + } + + 'UEFI' + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Initializing disk [$disknumber] as GPT" + Initialize-Disk -Number $disk.Number -PartitionStyle GPT + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Clearing disk partitions to start all over" + Get-Disk -Number $disknumber -ErrorAction Stop | + Get-Partition -ErrorAction Stop | + Remove-Partition -Confirm:$false -ErrorAction Stop + + if ($RecoveryTools) + { + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : Recovery tools : Creating partition of [$RESize] bytes" + $recoveryToolsPartition = New-Partition -DiskNumber $disk.Number -Size $RESize -GptType '{de94bba4-06d1-4d40-a16a-bfd50179d6ac}' + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : Recovery tools : Formatting NTFS" + $null = Format-Volume -Partition $recoveryToolsPartition -FileSystem NTFS -NewFileSystemLabel 'Windows RE Tools' -Force -Confirm:$false + #run diskpart to set GPT attribute to prevent partition removal + #the here string must be left justified + $null = @" +select disk $($disk.Number) +select partition $($recoveryToolsPartition.partitionNumber) +gpt attributes=0x8000000000000001 +exit +"@ | + diskpart.exe + } + + + # Create the system partition. Create a data partition so we can format it, then change to ESP + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : EFI system : Creating partition of [$SysSize] bytes" + $systemPartition = New-Partition -DiskNumber $disk.Number -Size $SysSize -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' + + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : EFI system : Formatting FAT32" + $null = Format-Volume -Partition $systemPartition -FileSystem FAT32 -Force -Confirm:$false + + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : EFI system : Setting system partition as ESP" + $systemPartition | Set-Partition -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' + + # Create the reserved partition + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : MSR : Creating partition of [$MSRSize] bytes" + $null = New-Partition -DiskNumber $disk.Number -Size $MSRSize -GptType '{e3c9e316-0b5c-4db8-817d-f92df00215ae}' + + + # Create the Windows partition + # Refresh $disk to update free space + $disk = Get-DiskImage -ImagePath $Path | Get-Disk + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : Windows : Creating partition of [$($disk.LargestFreeExtent - $RecoverySize)] bytes" + $windowsPartition = New-Partition -DiskNumber $disk.Number -Size ($disk.LargestFreeExtent - $RecoverySize) -GptType '{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}' + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : Windows : Formatting volume NTFS" + $null = Format-Volume -Partition $windowsPartition -NewFileSystemLabel 'OS' -FileSystem NTFS -Force -Confirm:$false + + if ($RecoveryImage) + { + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : Recovery Image : Creating partition using remaing free space" + $recoveryImagePartition = New-Partition -DiskNumber $disk.Number -UseMaximumSize -GptType '{de94bba4-06d1-4d40-a16a-bfd50179d6ac}' + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : Recovery Image : Formatting volume NTFS" + $null = Format-Volume -Partition $recoveryImagePartition -NewFileSystemLabel 'Windows Recovery' -FileSystem NTFS -Force -Confirm:$false + #run diskpart to set GPT attribute to prevent partition removal + #the here string must be left justified + $null = @" +select disk $($disk.Number) +select partition $($recoveryImagePartition.partitionNumber) +gpt attributes=0x8000000000000001 +exit +"@ | + diskpart.exe + } + } + + 'WindowsToGo' + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Initializing disk [$disknumber] as MBR" + Initialize-Disk -Number $disk.Number -PartitionStyle MBR + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Clearing disk partitions to start all over" + Get-Disk -Number $disknumber -ErrorAction Stop | + Get-Partition -ErrorAction Stop | + Remove-Partition -Confirm:$false -ErrorAction Stop + + # Create the system partition + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : System : Creating partition of [$SysSize] bytes" + $systemPartition = New-Partition -DiskNumber $disk.Number -Size $SysSize -MbrType FAT32 -IsActive + + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : EFI system : Formatting FAT32" + $null = Format-Volume -Partition $systemPartition -FileSystem FAT32 -Force -Confirm:$false + + # Create the Windows partition + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : Windows : Creating partition useing remaning space" + $windowsPartition = New-Partition -DiskNumber $disk.Number -Size $disk.LargestFreeExtent -MbrType IFS + + Write-Verbose "[$($MyInvocation.MyCommand)] [$fileName] : Windows : Formatting volume NTFS" + $null = Format-Volume -Partition $windowsPartition -FileSystem NTFS -Force -Confirm:$false + } + } + } + catch + { + Write-Error -Message "[$($MyInvocation.MyCommand)] [$fileName] : Creating Partitions" + throw $_.Exception.Message + } + #endregion create partitions + + #region Dismount + finally + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$fileName] : Dismounting disk image" + Dismount-DiskImage -ImagePath $Path + } + #endregion + + if ($Passthru) + { + #write the new disk object to the pipeline + Get-DiskImage -ImagePath $Path + } + }#end if disk + else + { + throw "Unable to create or mount $Path" + } + } + } + } +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Invoke-CreateVmRunAndWait.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Invoke-CreateVmRunAndWait.ps1 new file mode 100644 index 0000000..db7f820 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Invoke-CreateVmRunAndWait.ps1 @@ -0,0 +1,80 @@ +function Invoke-CreateVmRunAndWait +{ + <# + .Synopsis + Create a temp vm with a random name and wait for it to stop + .DESCRIPTION + This Command quickly test changes to a VHD by creating a temporary VM and ataching it to the network. VM is deleted when it enters a stoped state. + .EXAMPLE + Invoke-CreateVMRunAndWait -VhdPath c:\test.vhdx -VmGeneration 2 -VmSwitch 'testlab' + .EXAMPLE + Invoke-CreateVMRunAndWait -VhdPath c:\test.vhdx -VmGeneration 2 -VmSwitch 'testlab' -vLan 16023 -ProcessorCount 1 -MemorySTartupBytes 512mb + #> + [CmdletBinding()] + param + ( + # Path to VHD(x) + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [string] + $VhdPath, + + # VM Generation (1 = BIOS/MBR, 2 = uEFI/GPT) + [Parameter(Mandatory = $true)] + [ValidateSet(1, 2)] + [int] + $VmGeneration, + + # name of VM switch to attach to + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [string] + $VmSwitch, + + # vLAN to use default = 0 (dont use vLAN) + [int] + $vLan = 0, + + # ProcessorCount default = 2 + [int] + $ProcessorCount = 2, + + # MemoryStartupBytes default = 2Gig + [long] + $MemoryStartupBytess = 2GB + ) + + $vmName = [System.IO.Path]::GetRandomFileName().split('.')[0] + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Creating VM $vmName at $(Get-Date)" + $null = New-VM -Name $vmName -MemoryStartupBytes $MemoryStartupBytess -VHDPath $VhdPath -Generation $VmGeneration -SwitchName $VmSwitch -ErrorAction Stop + + If($vLan -ne 0) + { + Get-VMNetworkAdapter -VMName $vmName | Set-VMNetworkAdapterVlan -Access -VlanId $vLan + } + + Set-VM -Name $vmName -ProcessorCount $ProcessorCount + Start-VM $vmName + + # Give the VM a moment to start before we start checking for it to stop + Start-Sleep -Seconds 10 + + # Wait for the VM to be stopped for a good solid 5 seconds + do + { + $state1 = (Get-VM | Where-Object -Property name -EQ -Value $vmName).State + Start-Sleep -Seconds 5 + + $state2 = (Get-VM | Where-Object -Property name -EQ -Value $vmName).State + Start-Sleep -Seconds 5 + } + until (($state1 -eq 'Off') -and ($state2 -eq 'Off')) + + # Clean up the VM + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : VM $vmName Stoped" + Remove-VM $vmName -Force + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : VM $vmName Deleted at $(Get-Date)" +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Invoke-WindowsImageUpdate.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Invoke-WindowsImageUpdate.ps1 new file mode 100644 index 0000000..1e2e731 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Invoke-WindowsImageUpdate.ps1 @@ -0,0 +1,489 @@ +function Invoke-WindowsImageUpdate +{ + <# + .Synopsis + Starts the process of applying updates to all (or selected) images in a Windows Image Tools BaseImages Folder + .DESCRIPTION + This Command updates all (or selected) the images created via Add-UpdateImage in a Windows Image Tools BaseImages folder + New-WindowsImageToolsExample can be use to create the structrure + .EXAMPLE + Invoke-WindowsImageUpdate -Path C:\WITExample + Update all the Images created with Add-UpdateImage located in C:\WITExample\BaseImages and place the resulting VHD and WIM in c:\WITExample\UpdatedImageShare + .EXAMPLE + Invoke-WindowsImageUpdate -Path C:\WITExample -Name 2012r2Wmf5 + Update Image named 2012r2Wmf5_Base.vhdx in C:\WITExample\BaseImages and place the resulting VHD and WIM in c:\WITExample\UpdatedImageShare + #> + [CmdletBinding(SupportsShouldProcess = $true)] + [OutputType([bool])] + Param + ( + # Path to the Windows Image Tools Update Folders (created via New-WindowsImageToolsExample) + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [ValidateScript({ + if (Test-Path $_) + { + $true + } + else + { + throw "Path $_ does not exist" + } + })] + [Alias('FullName')] + $Path, + # Name of the Image to update + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [Alias('FriendlyName')] + [string[]] + $ImageName, + + # Reduce output file by removing feature sources + [switch] + $ReduceImageSize, + + # what files to export if upates are added : NONE, WIM, Both (wim and vhdx) default = both + [ValidateSet('NONE', 'WIM', 'Both')] + [string] + $output = 'Both' + + ) + + $ParametersToPass = @{} + foreach ($key in ('Whatif', 'Verbose', 'Debug')) + { + if ($PSBoundParameters.ContainsKey($key)) + { + $ParametersToPass[$key] = $PSBoundParameters[$key] + } + } + + #region validate input + try + { + $null = Test-Path -Path "$Path\BaseImage" -ErrorAction Stop + $null = Test-Path -Path "$Path\Resource" -ErrorAction Stop + $null = Test-Path -Path "$Path\UpdatedImageShare" -ErrorAction Stop + $null = Test-Path -Path "$Path\config.xml" -ErrorAction Stop + } + catch + { + throw "$Path folder structure incorrect, see New-WindowsImageToolsExample for an example" + } + + if ($ImageName) + { + foreach ($testpath in $ImageName) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Validateing [$testpath]" + if (-not (Test-Path -Path "$Path\BaseImage\$($testpath)_base.vhdx" )) + + { + throw "$Path\BaseImage\$($testpath)_base.vhdx" + } + } + $ImageList = $ImageName + } + else + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Colecting List of Images" + $ImageList = (Get-ChildItem -Path $Path\BaseImage\*_Base.vhdx).Name -replace '_Base.vhdx', '' + } + + $configData = Import-Clixml -Path "$Path\config.xml" + + try + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Validateing VM switch config" + $null = Get-VMSwitch -Name $configData.VmSwitch -ErrorAction Stop + } + catch + { + throw "VM Switch Configuration in $Path incorrect Set-UpdateConfig" + } + + #endregion + + #region update resorces folder + if ($pscmdlet.ShouldProcess('PowerShell Gallery', 'Download required Modules')) + { + if (-not (Test-Path -Path $Path\Resource\Modules)) + { + $null = mkdir -Path $Path\Resource\Modules + } + if (-not (Get-Command Save-Module)) + { + Write-Warning -Message 'PowerShellGet missing. you will need to download required modules from PowerShell Gallery manualy' + Write-Warning -Message 'Required Modules : PSWindowsUpdate' + } + else + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Geting latest PSWindowsUpdate" + try + { + # if nuget needs updating this prompts + ### To-Do find a way to silenty update nuget ### + $null = Save-Module -Name PSWindowsUpdate -Path $Path\Resource\Modules -Force -ErrorAction Stop @ParametersToPass + } + catch + { + if (Test-Path -Path $Path\Resource\Modules\PSWindowsUpdate) + { + Write-Warning -Message "[$($MyInvocation.MyCommand)] : PSwindowsUpdate present, but unable to download latest" + } + else + { + throw "unable to download PSWindowsUpdate from PowerShellGalary.com, download manualy and place in $Path\Resource\Modules " + } + } + } + } + #endregion + + #region Process Images + foreach ($TargetImage in $ImageList) + { + if ($pscmdlet.ShouldProcess($TargetImage, 'Invoke Windows Updates on Image')) + { + #region setup enviroment + $BaseImage = "$Path\BaseImage\$($TargetImage)_base.vhdx" + $UpdateImage = "$Path\BaseImage\$($TargetImage)_Update.vhdx" + $SysprepImage = "$Path\BaseImage\$($TargetImage)_Sysprep.vhdx" + $OutputVhd = "$Path\UpdatedImageShare\$($TargetImage).vhdx" + $OutputWim = "$Path\UpdatedImageShare\$($TargetImage).wim" + + $vmGeneration = 1 + $PartitionStyle = GetVHDPartitionStyle -vhd $BaseImage + if ($PartitionStyle -eq 'GPT') + { + $vmGeneration = 2 + } + $configData = Get-UpdateConfig -Path $Path + + $vhdData = Get-VHD -Path $BaseImage + #endregion + + #region create Diff disk + try + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Windows Update : New Diff Disk : Creating $UpdateImage from $BaseImage" + $null = New-VHD -Path $UpdateImage -ParentPath $BaseImage -ErrorAction Stop @ParametersToPass + } + catch + { + throw "error creating differencing disk $UpdateImage from $BaseImage" + } + #endregion + + #region Inject files + $RunWindowsUpdateAtStartup = { + Start-Transcript -Path $PSScriptRoot\AtStartup.log -Append + + $IpType = 'IPTYPEPLACEHOLDER' + $IPAddress = 'IPADDRESSPLACEHOLDER' + $SubnetMask = 'SUBNETMASKPLACEHOLDER' + $Gateway = 'GATEWAYPLACEHOLDER' + $DnsServer = 'DNSPLACEHOLDER' + + if (-not ($IpType -eq 'DHCP')) + { + Write-Verbose -Message 'Set Network : Getting network adaptor' -Verbose + $adapter = Get-NetAdapter | Where-Object -FilterScript { + $_.Status -eq 'up' + } + + Write-Verbose -Message "Set Network : removing existing config on $($adaptor.Name)" -Verbose + If (($adapter | Get-NetIPConfiguration).IPv4Address.IPAddress) + { + $adapter | Remove-NetIPAddress -AddressFamily $IpType -Confirm:$false + } + If (($adapter | Get-NetIPConfiguration).Ipv4DefaultGateway) + { + $adapter | Remove-NetRoute -AddressFamily $IpType -Confirm:$false + } + + $params = { + AddressFamily = $IpType + IPAddress = $IPAddress + PrefixLength = $SubnetMask + DefaultGateway = $Gateway + } + Write-Verbose -Message 'Set Network : Adding settings to adaptor' + Write-Verbose -Message $params -Verbose + $adapter | New-NetIPAddress @params + + Write-Verbose "Set Network : Set DNS to $DnsServer" -Verbose + $adapter | Set-DnsClientServerAddress -ServerAddresses $DnsServer + } + + try + { + Import-Module "$env:SystemDrive\PsTemp\Modules\PSWindowsUpdate" -Force -ErrorAction Stop + } + catch + { + Write-Error 'Unable to import update module' + Stop-Transcript + Stop-Computer -Force + } + + # Run pre-update script if it exists + if (Test-Path "$env:SystemDrive\PsTemp\PreUpdateScript.ps1") + { + Write-Verbose "Pre-Upate script : found $env:SystemDrive\PsTemp\PreUpdateScript.ps1" + & "$env:SystemDrive\PsTemp\PreUpdateScript.ps1" + } + + if ((Get-WUList -verbose -NotCategory 'Language packs').Count -gt 0) + { + Write-Verbose 'Windows updates : Updates needed, flaging drive as changed' -Verbose + Get-Date | Out-File $env:SystemDrive\PsTemp\changesMade.txt -Force + } + else + { + Write-Verbose 'Windows updates : No further updates' -Verbose + + if(-not ($IpType -eq 'DHCP')) + { + $adapter = Get-NetAdapter | Where-Object { + $_.Status -eq 'up' + } + $interface = $adapter | Get-NetIPInterface -AddressFamily $IpType + + Write-Verbose 'Set Network : Removing static config' -Verbose + If ($interface.Dhcp -eq 'Disabled') + { + If (($interface | Get-NetIPConfiguration).Ipv4DefaultGateway) + { + $interface | Remove-NetRoute -Confirm:$false + } + $interface | Set-NetIPInterface -Dhcp Enabled + $interface | Set-DnsClientServerAddress -ResetServerAddresses + } + } + Write-Verbose 'Shuting down' -Verbose + ## remove self so as to not triger updates if manual mantinance required + Remove-Item "$env:SystemDrive\PsTemp\AtStartup.ps1" + Stop-Transcript + Stop-Computer + } + + # Apply all non-language updates + Write-Verbose 'Windows updates : installing updates' -Verbose + Get-WUInstall -AcceptAll -IgnoreReboot -IgnoreUserInput -NotCategory 'Language packs' -Verbose + + # Run post-update script if it exists + if (Test-Path "$env:SystemDrive\PsTemp\PostUpdateScript.ps1") + { + Write-Verbose "Post-Update script : found $env:SystemDrive\PsTemp\PostUpdateScript.ps1" + & "$env:SystemDrive\PsTemp\PostUpdateScript.ps1" + } + + + if (Get-WURebootStatus -Silent) + { + Write-Verbose 'Windows updates : Reboot required to finish restarting' -Verbose + } + else + { + Write-Verbose 'Windows updates : Restarting to check for additional updates' -Verbose + } + Stop-Transcript + Restart-Computer -Force + } + + #region add configuration data into block + $block = $RunWindowsUpdateAtStartup | Out-String -Width 400 + + $block = $block.Replace('IPTYPEPLACEHOLDER', $configData.IpType) + $block = $block.Replace('IPADDRESSPLACEHOLDER', $configData.IPAddress) + $block = $block.Replace('SUBNETMASKPLACEHOLDER', $configData.SubnetMask) + $block = $block.Replace('GATEWAYPLACEHOLDER', $configData.Gateway) + $block = $block.Replace('DNSPLACEHOLDER', $configData.DnsServer) + + $RunWindowsUpdateAtStartup = [scriptblock]::Create($block) + #endregion + + $CopyInUpdateFilesBlock = { + if (-not (Test-Path -Path "$($driveLetter):\PsTemp")) + { + $null = mkdir -Path "$($driveLetter):\PsTemp" + } + if (-not (Test-Path -Path "$($driveLetter):\PsTemp\Modules")) + { + $null = mkdir -Path "$($driveLetter):\PsTemp\Modules" + } + $null = New-Item -Path "$($driveLetter):\PsTemp" -Name AtStartup.ps1 -ItemType 'file' -Value $RunWindowsUpdateAtStartup -Force + cleanupFile "$($driveLetter):\PsTemp\Modules\*" + $null = Copy-Item -Path "$Path\Resource\Modules\*" -Destination "$($driveLetter):\PsTemp\Modules\" -Recurse + + if ((Get-ChildItem "$($driveLetter):\PsTemp\Modules\PSWindowsUpdate" -File).count -eq 0) + { + Write-Verbose -Message 'Sidebyside detected in PSWindowsUpdate : switching to v4 compatability' + $newest = (Get-ChildItem "$($driveLetter):\PsTemp\Modules\PSWindowsUpdate" -Directory | Sort-Object LastWriteTime)[0] + Copy-Item -Path $newest.fullname -Destination "$($driveLetter):\PsTemp\Modules\PSWindowsUpdate_temp" -Recurse + cleanupFile "$($driveLetter):\PsTemp\Modules\PSWindowsUpdate" + Rename-Item -Path "$($driveLetter):\PsTemp\Modules\PSWindowsUpdate_temp" -NewName "$($driveLetter):\PsTemp\Modules\PSWindowsUpdate" + } + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Windows Update : Adding PSWindowsUpdate Module to $UpdateImage" + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Windows Update : updateting AtStartup script" + MountVHDandRunBlock -vhd $UpdateImage -block $CopyInUpdateFilesBlock + #endregion + + #region create vm and run updates + createRunAndWaitVM -vhdPath $UpdateImage -vmGeneration $vmGeneration -configData $configData @ParametersToPass + #endregion + + #region Detect results - Merge or discard. + $checkresultsBlock = { + Test-Path -Path "$($driveLetter):\PsTemp\ChangesMade.txt" + Remove-Item "$($driveLetter):\PsTemp\ChangesMade.txt" -ErrorAction SilentlyContinue + } + $ChangesMade = MountVHDandRunBlock -vhd $UpdateImage -block $checkresultsBlock + if ($ChangesMade) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Windows Update : Changes detected : Merging $UpdateImage into $BaseImage" + Merge-VHD -Path $UpdateImage -DestinationPath $BaseImage @ParametersToPass + } + else + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Windows Update : No changes, discarding $UpdateImage" + cleanupFile $UpdateImage + } + #endregion + + if ($output -ne 'none') + { + #region Sysprep if changes or missing output vhd + if (($ChangesMade) -or (-not (Test-Path $OutputVhd))) + { + try + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : SysPrep : New Diff Disk : Creating $SysprepImage from $BaseImage" + cleanupFile $SysprepImage + $null = New-VHD -Path $SysprepImage -ParentPath $BaseImage -ErrorAction Stop @ParametersToPass + } + catch + { + throw "error creating differencing disk $SysprepImage from $BaseImage" + } + + + $sysprepAtStartup = { + Start-Transcript -Path $PSScriptRoot\AtStartup.log -Append + # Run pre-sysprep script if it exists + if (Test-Path "$env:SystemDrive\PsTemp\PreSysprepScript.ps1") + { + & "$env:SystemDrive\PsTemp\PreSysprepScript.ps1" + } + + + # Remove Scedualed task + Write-Verbose -Message 'SysPrep : Removeing AtStartup task' -Verbose + if (Get-Command -Name Unregister-ScheduledTask -ErrorAction SilentlyContinue) + { + Unregister-ScheduledTask -TaskName AtStartup -Confirm:$false -Verbose + } + else + { + schtasks.exe /delete /TN 'AtStartup' /f + } + $params = @{ + 'FilePath' = "$ENV:SystemRoot\System32\Sysprep\Sysprep.exe" + 'ArgumentList' = '/generalize', '/oobe', '/shutdown' + 'NoNewWindow' = $true + 'Wait' = $true + 'RedirectStandardOutput' = "$($env:temp)\$($exeName)-StandardOutput.txt" + 'RedirectStandardError' = "$($env:temp)\$($exeName)-StandardError.txt" + 'PassThru' = $true + } + + Write-Verbose -Message 'SysPrep : starting Sysprep' -Verbose + $ret = Start-Process @params + Start-Sleep -Seconds 30 + Get-Date | Out-File c:\sysprepfail.txt + } + + $CopyInSysprepFilesBlock = { + $null = New-Item -Path "$($driveLetter):\PsTemp" -Name AtStartup.ps1 -ItemType 'file' -Value $sysprepAtStartup -Force + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : SysPrep : updateting AtStartup script" + MountVHDandRunBlock -vhd $SysprepImage -block $CopyInSysprepFilesBlock + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : SysPrep : Creating temp vm and waiting" + createRunAndWaitVM -vhdPath $SysprepImage -vmGeneration $vmGeneration -configData $configData @ParametersToPass + + MountVHDandRunBlock -vhd $SysprepImage -block { + if (Test-Path "$($driveLetter):\sysprepfail.txt") + { + throw 'Sysprep Failed!' + } + } + + $CleanupVhdBlock = { + cleanupFile "$($driveLetter):\Unattend.xml" + cleanupFile "$($driveLetter):\PsTemp" + attrib.exe -s -h "$($driveLetter):\pagefile.sys" + cleanupFile "$($driveLetter):\pagefile.sys" + if ($ReduceImageSize) + { + $null = Dism.exe /image:$($driveLetter):\ /Cleanup-Image /StartComponentCleanup /ResetBase + $null = Get-WindowsOptionalFeature -Path "$($driveLetter):\" | + Where-Object State -EQ -Value 'Disabled' | + Disable-WindowsOptionalFeature -Remove -Path "$($driveLetter):\" @ParametersToPass + } + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : SysPrep : Removing PageFile and PsTemp" + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : SysPrep : Cleaning SxS" + MountVHDandRunBlock -vhd $SysprepImage -block $CleanupVhdBlock + } + #endregion + + #region export WIM + if (($ChangesMade) -or (-not (Test-Path $OutputWim)) -or (-not (Test-Path $OutputVhd))) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : WIM : Creating $OutputWim" + cleanupFile $OutputWim + MountVHDandRunBlock -ReadOnly $SysprepImage -block { + $nul = New-WindowsImage -CapturePath "$($driveLetter):" -ImagePath $OutputWim -Name "$TargetImage Updated $(Get-Date)" @ParametersToPass + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : WIM : removing $SysprepImage" + cleanupFile $SysprepImage + } + + #endregion + + #region create output VHD + if ((($ChangesMade) -or (-not (Test-Path $OutputVhd))) -and $output -eq 'both') + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : VHD : Creating $OutputVhd from $OutputWim" + cleanupFile $OutputVhd + $layout = 'BIOS' + if ($PartitionStyle -eq 'GPT') + { + $layout = 'UEFI' + } + $dynamic = $false + if ($vhdData.VhdType -eq 'Dynamic') + { + $dynamic = $true + } + $param = @{ + Path = "$OutputVhd" + Size = $vhdData.Size + dynamic = $dynamic + DiskLayout = $layout + force = $true + SourcePath = "$OutputWim" + } + $nul = Convert-Wim2VHD @param @ParametersToPass + } + #endregion + } + } + } + #endregion +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Mount-VhdAndRunBlock.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Mount-VhdAndRunBlock.ps1 new file mode 100644 index 0000000..b195035 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Mount-VhdAndRunBlock.ps1 @@ -0,0 +1,55 @@ +function Mount-VhdAndRunBlock +{ + <# + .Synopsis + Mount a VHD(x), runs a script block and unmounts the VHD(x) driveleter stored in $driveLetter + .DESCRIPTION + Us this function to read / write files inside a vhd. Any objects emited by the scriptblock are returned by this function. + .EXAMPLE + Mount-VhdAndRunBlock -Vhd c:\win10.vhdx -Block { Copy-Item -Path 'c:\myfiles\unattend.xml' -Destination "$($driveletter):\unattend.xml"} + .EXAMPLE + $fileFound = Mount-VhdAndRunBlock -Vhd c:\lab.vhdx -ReadOnly { test-path "$($driveletter):\scripts\changesmade.log" } + #> + param + ( + # Path to VHD(x) file + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [string] + $vhd, + + # Script block to execute (Drive letter stored in $driveletter) + [Parameter(Mandatory = $true)] + [scriptblock] + $block, + + # Mount the VHD(x) readonly, This is faster. Use when only reading files. + [switch] + $ReadOnly + ) + + # This function mounts a VHD, runs a script block and unmounts the VHD. + # Drive letter of the mounted VHD is stored in $driveLetter - can be used by script blocks + if($ReadOnly) + { + $virtualDisk = Mount-VHD -Path $vhd -ReadOnly -Passthru + } + else + { + $virtualDisk = Mount-VHD -Path $vhd -Passthru + } + # Workarround for new drive letters in script modules + $null = Get-PSDrive + $global:driveLetter = ($virtualDisk | + Get-Disk | + Get-Partition | + Get-Volume).DriveLetter + $newScriptBlock = [scriptblock]::Create($block.ToString()) + & $newScriptBlock + + Dismount-VHD $vhd + + # Wait 2 seconds for activity to clean up + Start-Sleep -Seconds 2 +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/New-Unattend.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/New-Unattend.ps1 new file mode 100644 index 0000000..54fe38c --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/New-Unattend.ps1 @@ -0,0 +1,971 @@ +function New-UnattendXml +{ + <# + .Synopsis + Create a new Unattend.xml + .DESCRIPTION + This Command Creates a new Unattend.xml that skips any prompts, and sets the administrator password + Has options for: Adding user accounts + Auto logon a set number of times + Set the Computer Name + First Boot or First Logon powersrhell script + Product Key + TimeZone + Input, System and User Locals + UI Language + Registered Owner and Orginization + First Boot, First Logon and Every Logon Commands + Enable Administrator account without autologon (client OS) + + If no Path is provided a the file will be created in a temp folder and the path returned. + .EXAMPLE + New-UnattendXml -AdminPassword 'P@ssword' -logonCount 1 + .EXAMPLE + New-UnattendXml -Path c:\temp\Unattent.xml -AdminPassword 'P@ssword' -logonCount 100 -FirstLogonScriptPath c:\pstemp\firstrun.ps1 + #> + [CmdletBinding(DefaultParameterSetName = 'Basic_FirstLogonScript', + SupportsShouldProcess = $true)] + [OutputType([System.IO.FileInfo])] + Param + ( + # The password to have unattnd.xml set the local Administrator to (minimum lenght 8) + [Parameter(Mandatory = $true, + ValueFromPipeline = $true, + ValueFromPipelineByPropertyName = $true, + Position = 0)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [Alias('AdminPassword')] + [PSCredential] + $AdminCredential, + + # User account/password to create and add to Administators group + [PSCredential[]] + $UserAccount, + + # Output Path + [Alias('FilePath', 'FullName', 'pspath', 'outfile')] + [string] + $Path = "$(New-TemporaryDirectory)\unattend.xml", + + # Number of times that the local Administrator account should automaticaly login (default 0) + [ValidateRange(0,1000)] + [int] + $LogonCount, + + # ComputerName (default = *) + [ValidateLength(1,15)] + [string] + $ComputerName = '*', + + # PowerShell Script to run on FirstLogon (ie. %SystemDrive%\PSTemp\FirstRun.ps1 ) + [Parameter(ParameterSetName = 'Basic_FirstLogonScript')] + [string] + $FirstLogonScriptPath, + + # PowerShell Script to run on FirstBoot (ie.: %SystemDrive%\PSTemp\FirstRun.ps1 ) Executed in system context dureing specialize phase + [Parameter(ParameterSetName = 'Basic_FirstBootScript')] + [string] + $FirstBootScriptPath, + + # The product key to use for the unattended installation. + [ValidatePattern('^[A-Z0-9]{5,5}-[A-Z0-9]{5,5}-[A-Z0-9]{5,5}-[A-Z0-9]{5,5}-[A-Z0-9]{5,5}$')] + [string] + $ProductKey, + + # Timezone (default: Central Standard Time) + [ValidateSet('Dateline Standard Time', + 'UTC-11', + 'Hawaiian Standard Time', + 'Alaskan Standard Time', + 'Pacific Standard Time (Mexico)', + 'Pacific Standard Time', + 'US Mountain Standard Time', + 'Mountain Standard Time (Mexico)', + 'Mountain Standard Time', + 'Central America Standard Time', + 'Central Standard Time', + 'Central Standard Time (Mexico)', + 'Canada Central Standard Time', + 'SA Pacific Standard Time', + 'Eastern Standard Time (Mexico)', + 'Eastern Standard Time', + 'US Eastern Standard Time', + 'Venezuela Standard Time', + 'Paraguay Standard Time', + 'Atlantic Standard Time', + 'Central Brazilian Standard Time', + 'SA Western Standard Time', + 'Newfoundland Standard Time', + 'E. South America Standard Time', + 'SA Eastern Standard Time', + 'Argentina Standard Time', + 'Greenland Standard Time', + 'Montevideo Standard Time', + 'Bahia Standard Time', + 'Pacific SA Standard Time', + 'UTC-02', + 'Mid-Atlantic Standard Time', + 'Azores Standard Time', + 'Cape Verde Standard Time', + 'Morocco Standard Time', + 'UTC', + 'GMT Standard Time', + 'Greenwich Standard Time', + 'W. Europe Standard Time', + 'Central Europe Standard Time', + 'Romance Standard Time', + 'Central European Standard Time', + 'W. Central Africa Standard Time', + 'Namibia Standard Time', + 'Jordan Standard Time', + 'GTB Standard Time', + 'Middle East Standard Time', + 'Egypt Standard Time', + 'Syria Standard Time', + 'E. Europe Standard Time', + 'South Africa Standard Time', + 'FLE Standard Time', + 'Turkey Standard Time', + 'Israel Standard Time', + 'Kaliningrad Standard Time', + 'Libya Standard Time', + 'Arabic Standard Time', + 'Arab Standard Time', + 'Belarus Standard Time', + 'Russian Standard Time', + 'E. Africa Standard Time', + 'Iran Standard Time', + 'Arabian Standard Time', + 'Azerbaijan Standard Time', + 'Russia Time Zone 3', + 'Mauritius Standard Time', + 'Georgian Standard Time', + 'Caucasus Standard Time', + 'Afghanistan Standard Time', + 'West Asia Standard Time', + 'Ekaterinburg Standard Time', + 'Pakistan Standard Time', + 'India Standard Time', + 'Sri Lanka Standard Time', + 'Nepal Standard Time', + 'Central Asia Standard Time', + 'Bangladesh Standard Time', + 'N. Central Asia Standard Time', + 'Myanmar Standard Time', + 'SE Asia Standard Time', + 'North Asia Standard Time', + 'China Standard Time', + 'North Asia East Standard Time', + 'Singapore Standard Time', + 'W. Australia Standard Time', + 'Taipei Standard Time', + 'Ulaanbaatar Standard Time', + 'North Korea Standard Time', + 'Tokyo Standard Time', + 'Korea Standard Time', + 'Yakutsk Standard Time', + 'Cen. Australia Standard Time', + 'AUS Central Standard Time', + 'E. Australia Standard Time', + 'AUS Eastern Standard Time', + 'West Pacific Standard Time', + 'Tasmania Standard Time', + 'Magadan Standard Time', + 'Vladivostok Standard Time', + 'Russia Time Zone 10', + 'Central Pacific Standard Time', + 'Russia Time Zone 11', + 'New Zealand Standard Time', + 'UTC+12', + 'Fiji Standard Time', + 'Kamchatka Standard Time', + 'Tonga Standard Time', + 'Samoa Standard Time', + 'Line Islands Standard Time')] + [string] + $TimeZone, + + # Specifies the system input locale and the keyboard layout (default: en-US) + [Parameter(ValueFromPipelineByPropertyName)] + [ValidateSet('en-US', + 'nl-NL', + 'fr-FR', + 'de-DE', + 'it-IT', + 'ja-JP', + 'es-ES', + 'ar-SA', + 'zh-CN', + 'zh-HK', + 'zh-TW', + 'cs-CZ', + 'da-DK', + 'fi-FI', + 'el-GR', + 'he-IL', + 'hu-HU', + 'ko-KR', + 'nb-NO', + 'pl-PL', + 'pt-BR', + 'pt-PT', + 'ru-RU', + 'sv-SE', + 'tr-TR', + 'bg-BG', + 'hr-HR', + 'et-EE', + 'lv-LV', + 'lt-LT', + 'ro-RO', + 'sr-Latn-CS', + 'sk-SK', + 'sl-SI', + 'th-TH', + 'uk-UA', + 'af-ZA', + 'sq-AL', + 'am-ET', + 'hy-AM', + 'as-IN', + 'az-Latn-AZ', + 'eu-ES', + 'be-BY', + 'bn-BD', + 'bn-IN', + 'bs-Cyrl-BA', + 'bs-Latn-BA', + 'ca-ES', + 'fil-PH', + 'gl-ES', + 'ka-GE', + 'gu-IN', + 'ha-Latn-NG', + 'hi-IN', + 'is-IS', + 'ig-NG', + 'id-ID', + 'iu-Latn-CA', + 'ga-IE', + 'xh-ZA', + 'zu-ZA', + 'kn-IN', + 'kk-KZ', + 'km-KH', + 'rw-RW', + 'sw-KE', + 'kok-IN', + 'ky-KG', + 'lo-LA', + 'lb-LU', + 'mk-MK', + 'ms-BN', + 'ms-MY', + 'ml-IN', + 'mt-MT', + 'mi-NZ', + 'mr-IN', + 'ne-NP', + 'nn-NO', + 'or-IN', + 'ps-AF', + 'fa-IR', + 'pa-IN', + 'quz-PE', + 'sr-Cyrl-CS', + 'nso-ZA', + 'tn-ZA', + 'si-LK', + 'ta-IN', + 'tt-RU', + 'te-IN', + 'ur-PK', + 'uz-Latn-UZ', + 'vi-VN', + 'cy-GB', + 'wo-SN', + 'yo-NG')] + [Alias('keyboardlayout')] + [String] + $InputLocale, + + # Specifies the language for non-Unicode programs (default: en-US) + [ValidateSet('en-US', + 'nl-NL', + 'fr-FR', + 'de-DE', + 'it-IT', + 'ja-JP', + 'es-ES', + 'ar-SA', + 'zh-CN', + 'zh-HK', + 'zh-TW', + 'cs-CZ', + 'da-DK', + 'fi-FI', + 'el-GR', + 'he-IL', + 'hu-HU', + 'ko-KR', + 'nb-NO', + 'pl-PL', + 'pt-BR', + 'pt-PT', + 'ru-RU', + 'sv-SE', + 'tr-TR', + 'bg-BG', + 'hr-HR', + 'et-EE', + 'lv-LV', + 'lt-LT', + 'ro-RO', + 'sr-Latn-CS', + 'sk-SK', + 'sl-SI', + 'th-TH', + 'uk-UA', + 'af-ZA', + 'sq-AL', + 'am-ET', + 'hy-AM', + 'as-IN', + 'az-Latn-AZ', + 'eu-ES', + 'be-BY', + 'bn-BD', + 'bn-IN', + 'bs-Cyrl-BA', + 'bs-Latn-BA', + 'ca-ES', + 'fil-PH', + 'gl-ES', + 'ka-GE', + 'gu-IN', + 'ha-Latn-NG', + 'hi-IN', + 'is-IS', + 'ig-NG', + 'id-ID', + 'iu-Latn-CA', + 'ga-IE', + 'xh-ZA', + 'zu-ZA', + 'kn-IN', + 'kk-KZ', + 'km-KH', + 'rw-RW', + 'sw-KE', + 'kok-IN', + 'ky-KG', + 'lo-LA', + 'lb-LU', + 'mk-MK', + 'ms-BN', + 'ms-MY', + 'ml-IN', + 'mt-MT', + 'mi-NZ', + 'mr-IN', + 'ne-NP', + 'nn-NO', + 'or-IN', + 'ps-AF', + 'fa-IR', + 'pa-IN', + 'quz-PE', + 'sr-Cyrl-CS', + 'nso-ZA', + 'tn-ZA', + 'si-LK', + 'ta-IN', + 'tt-RU', + 'te-IN', + 'ur-PK', + 'uz-Latn-UZ', + 'vi-VN', + 'cy-GB', + 'wo-SN', + 'yo-NG')] + [Parameter(ValueFromPipelineByPropertyName)] + [String] + $SystemLocale, + + # Specifies the per-user settings used for formatting dates, times, currency and numbers (default: en-US) + [ValidateSet('en-US', + 'nl-NL', + 'fr-FR', + 'de-DE', + 'it-IT', + 'ja-JP', + 'es-ES', + 'ar-SA', + 'zh-CN', + 'zh-HK', + 'zh-TW', + 'cs-CZ', + 'da-DK', + 'fi-FI', + 'el-GR', + 'he-IL', + 'hu-HU', + 'ko-KR', + 'nb-NO', + 'pl-PL', + 'pt-BR', + 'pt-PT', + 'ru-RU', + 'sv-SE', + 'tr-TR', + 'bg-BG', + 'hr-HR', + 'et-EE', + 'lv-LV', + 'lt-LT', + 'ro-RO', + 'sr-Latn-CS', + 'sk-SK', + 'sl-SI', + 'th-TH', + 'uk-UA', + 'af-ZA', + 'sq-AL', + 'am-ET', + 'hy-AM', + 'as-IN', + 'az-Latn-AZ', + 'eu-ES', + 'be-BY', + 'bn-BD', + 'bn-IN', + 'bs-Cyrl-BA', + 'bs-Latn-BA', + 'ca-ES', + 'fil-PH', + 'gl-ES', + 'ka-GE', + 'gu-IN', + 'ha-Latn-NG', + 'hi-IN', + 'is-IS', + 'ig-NG', + 'id-ID', + 'iu-Latn-CA', + 'ga-IE', + 'xh-ZA', + 'zu-ZA', + 'kn-IN', + 'kk-KZ', + 'km-KH', + 'rw-RW', + 'sw-KE', + 'kok-IN', + 'ky-KG', + 'lo-LA', + 'lb-LU', + 'mk-MK', + 'ms-BN', + 'ms-MY', + 'ml-IN', + 'mt-MT', + 'mi-NZ', + 'mr-IN', + 'ne-NP', + 'nn-NO', + 'or-IN', + 'ps-AF', + 'fa-IR', + 'pa-IN', + 'quz-PE', + 'sr-Cyrl-CS', + 'nso-ZA', + 'tn-ZA', + 'si-LK', + 'ta-IN', + 'tt-RU', + 'te-IN', + 'ur-PK', + 'uz-Latn-UZ', + 'vi-VN', + 'cy-GB', + 'wo-SN', + 'yo-NG')] + [Parameter(ValueFromPipelineByPropertyName)] + [String] + $UserLocale, + + # Specifies the system default user interface (UI) language (default: en-US) + [ValidateSet('en-US', + 'nl-NL', + 'fr-FR', + 'de-DE', + 'it-IT', + 'ja-JP', + 'es-ES', + 'ar-SA', + 'zh-CN', + 'zh-HK', + 'zh-TW', + 'cs-CZ', + 'da-DK', + 'fi-FI', + 'el-GR', + 'he-IL', + 'hu-HU', + 'ko-KR', + 'nb-NO', + 'pl-PL', + 'pt-BR', + 'pt-PT', + 'ru-RU', + 'sv-SE', + 'tr-TR', + 'bg-BG', + 'hr-HR', + 'et-EE', + 'lv-LV', + 'lt-LT', + 'ro-RO', + 'sr-Latn-CS', + 'sk-SK', + 'sl-SI', + 'th-TH', + 'uk-UA', + 'af-ZA', + 'sq-AL', + 'am-ET', + 'hy-AM', + 'as-IN', + 'az-Latn-AZ', + 'eu-ES', + 'be-BY', + 'bn-BD', + 'bn-IN', + 'bs-Cyrl-BA', + 'bs-Latn-BA', + 'ca-ES', + 'fil-PH', + 'gl-ES', + 'ka-GE', + 'gu-IN', + 'ha-Latn-NG', + 'hi-IN', + 'is-IS', + 'ig-NG', + 'id-ID', + 'iu-Latn-CA', + 'ga-IE', + 'xh-ZA', + 'zu-ZA', + 'kn-IN', + 'kk-KZ', + 'km-KH', + 'rw-RW', + 'sw-KE', + 'kok-IN', + 'ky-KG', + 'lo-LA', + 'lb-LU', + 'mk-MK', + 'ms-BN', + 'ms-MY', + 'ml-IN', + 'mt-MT', + 'mi-NZ', + 'mr-IN', + 'ne-NP', + 'nn-NO', + 'or-IN', + 'ps-AF', + 'fa-IR', + 'pa-IN', + 'quz-PE', + 'sr-Cyrl-CS', + 'nso-ZA', + 'tn-ZA', + 'si-LK', + 'ta-IN', + 'tt-RU', + 'te-IN', + 'ur-PK', + 'uz-Latn-UZ', + 'vi-VN', + 'cy-GB', + 'wo-SN', + 'yo-NG')] + [Parameter(ValueFromPipelineByPropertyName)] + [String] + $UILanguage, + + # Registered Owner (default: 'Valued Customer') + [Parameter(ValueFromPipelineByPropertyName)] + [ValidateNotNull()] + [String] + $RegisteredOwner, + + # Registered Organization (default: 'Valued Customer') + [Parameter(ValueFromPipelineByPropertyName)] + [ValidateNotNull()] + [String] + $RegisteredOrganization, + + # Array of hashtables with Description, Order, and Path keys, and optional Domain, Password(plain text), username keys. Executed by in the system context + [Parameter(ValueFromPipelineByPropertyName = $true, + ParameterSetName = 'Advanced')] + [Hashtable[]] + $FirstBootExecuteCommand, + + # Array of hashtables with Description, Order and CommandLine keys. Execuded at first logon of an Administrator, will auto elivate + [Parameter(ValueFromPipelineByPropertyName = $true, + ParameterSetName = 'Advanced')] + [Hashtable[]] + $FirstLogonExecuteCommand, + + # Array of hashtables with Description, Order and CommandLine keys. Executed at every logon, does not elivate. + [Parameter(ValueFromPipelineByPropertyName = $true, + ParameterSetName = 'Advanced')] + [Hashtable[]] + $EveryLogonExecuteCommand, + + # Enable Local Administrator account (default $true) this is needed for client OS if your not useing autologon or adding aditional admin users. + [switch] + $enableAdministrator + ) + + Begin + { + $templateUnattendXml = [xml] @' +<?xml version="1.0" encoding="utf-8"?> +<unattend xmlns="urn:schemas-microsoft-com:unattend"> + <settings pass="specialize"> + <component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></component> + <component name="Microsoft-Windows-Deployment" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></component> + <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></component> + <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></component> + </settings> + <settings pass="oobeSystem"> + <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <InputLocale>en-US</InputLocale> + <SystemLocale>en-US</SystemLocale> + <UILanguage>en-US</UILanguage> + <UserLocale>en-US</UserLocale> + </component> + <component name="Microsoft-Windows-International-Core" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <InputLocale>en-US</InputLocale> + <SystemLocale>en-US</SystemLocale> + <UILanguage>en-US</UILanguage> + <UserLocale>en-US</UserLocale> + </component> + <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <OOBE> + <HideEULAPage>true</HideEULAPage> + <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> + <NetworkLocation>Work</NetworkLocation> + <ProtectYourPC>1</ProtectYourPC> + <SkipUserOOBE>true</SkipUserOOBE> + <SkipMachineOOBE>true</SkipMachineOOBE> + </OOBE> + <TimeZone>GMT Standard Time</TimeZone> + <UserAccounts> + <AdministratorPassword> + <Value></Value> + <PlainText>false</PlainText> + </AdministratorPassword> + </UserAccounts> + <RegisteredOrganization>Generic Organization</RegisteredOrganization> + <RegisteredOwner>Generic Owner</RegisteredOwner> + </component> + <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <OOBE> + <HideEULAPage>true</HideEULAPage> + <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> + <NetworkLocation>Work</NetworkLocation> + <ProtectYourPC>1</ProtectYourPC> + <SkipUserOOBE>true</SkipUserOOBE> + <SkipMachineOOBE>true</SkipMachineOOBE> + </OOBE> + <TimeZone>GMT Standard Time</TimeZone> + <UserAccounts> + <AdministratorPassword> + <Value></Value> + <PlainText>false</PlainText> + </AdministratorPassword> + </UserAccounts> + <RegisteredOrganization>Generic Organization</RegisteredOrganization> + <RegisteredOwner>Generic Owner</RegisteredOwner> + </component> + </settings> +</unattend> +'@ + + $PowerShellStartupCmd = '%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File' + + if ($LogonCount -gt 0) + { + Write-Warning -Message '-Autologon places the Administrator password in plain txt' + } + } + Process + { + if ($pscmdlet.ShouldProcess('$path', 'Create new Unattended.xml')) + { + if ($FirstBootScriptPath) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding PowerShell script to First boot command" + $FirstBootExecuteCommand = @(@{ + Description = 'PowerShell First boot script' + order = 1 + path = "%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"$FirstBootScriptPath`"" + }) + } + + if ($FirstLogonScriptPath) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding PowerShell script to First Logon command" + $FirstLogonExecuteCommand = @(@{ + Description = 'PowerShell First logon script' + order = 1 + CommandLine = "%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File `"$FirstBootScriptPath`"" + }) + } + + if ($enableAdministrator) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Enabeling Administrator via First boot command" + if ($FirstBootExecuteCommand) + { + $FirstBootExecuteCommand = $FirstBootExecuteCommand + @{ + Description = 'Enable Administrator' + order = 0 + path = 'net user administrator /active:yes' + } + } + else + { + $FirstBootExecuteCommand = @{ + Description = 'Enable Administrator' + order = 0 + path = 'net user administrator /active:yes' + } + } + } + else + { + if (-not ($UserAccount) ) + { + Write-Warning -Message "$Path only usable on a server SKU, for a client OS, use either -EnableAdministrator or -UserAccount" + } + } + + [xml] $unattendXml = $templateUnattendXml + foreach ($setting in $unattendXml.Unattend.Settings) + { + foreach($component in $setting.Component) + { + if ($setting.'Pass' -eq 'specialize' -and $component.'Name' -eq 'Microsoft-Windows-Deployment' ) + { + if (($FirstBootExecuteCommand -ne $null -or $FirstBootExecuteCommand.Length -gt 0) -and $component.'processorArchitecture' -eq 'x86') + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding first boot command(s)" + $commandOrder = 1 + $runSynchronousElement = $component.AppendChild($unattendXml.CreateElement('RunSynchronous','urn:schemas-microsoft-com:unattend')) + foreach ($synchronousCommand in ($FirstBootExecuteCommand | Sort-Object -Property { + $_.order + })) + { + $syncCommandElement = $runSynchronousElement.AppendChild($unattendXml.CreateElement('RunSynchronousCommand','urn:schemas-microsoft-com:unattend')) + $null = $syncCommandElement.SetAttribute('action','http://schemas.microsoft.com/WMIConfig/2002/State','add') + $syncCommandDescriptionElement = $syncCommandElement.AppendChild($unattendXml.CreateElement('Description','urn:schemas-microsoft-com:unattend')) + $syncCommandDescriptionTextNode = $syncCommandDescriptionElement.AppendChild($unattendXml.CreateTextNode($synchronousCommand['Description'])) + $syncCommandOrderElement = $syncCommandElement.AppendChild($unattendXml.CreateElement('Order','urn:schemas-microsoft-com:unattend')) + $syncCommandOrderTextNode = $syncCommandOrderElement.AppendChild($unattendXml.CreateTextNode($commandOrder)) + $syncCommandPathElement = $syncCommandElement.AppendChild($unattendXml.CreateElement('Path','urn:schemas-microsoft-com:unattend')) + $syncCommandPathTextNode = $syncCommandPathElement.AppendChild($unattendXml.CreateTextNode($synchronousCommand['Path'])) + $commandOrder++ + } + } + } + if (($setting.'Pass' -eq 'specialize') -and ($component.'Name' -eq 'Microsoft-Windows-Shell-Setup')) + { + if ($ComputerName) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding custom computername for $($component.'processorArchitecture') Architecture" + $computerNameElement = $component.AppendChild($unattendXml.CreateElement('ComputerName','urn:schemas-microsoft-com:unattend')) + $computerNameTextNode = $computerNameElement.AppendChild($unattendXml.CreateTextNode($ComputerName)) + } + if ($ProductKey) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding Product key for $($component.'processorArchitecture') Architecture" + $productKeyElement = $component.AppendChild($unattendXml.CreateElement('ProductKey','urn:schemas-microsoft-com:unattend')) + $productKeyTextNode = $productKeyElement.AppendChild($unattendXml.CreateTextNode($ProductKey.ToUpper())) + } + } + + if (($setting.'Pass' -eq 'oobeSystem') -and ($component.'Name' -eq 'Microsoft-Windows-International-Core')) + { + if ($InputLocale) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding Input Locale for $($component.'processorArchitecture') Architecture" + $component.InputLocale = $InputLocale + } + if ($SystemLocale) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding System Locale for $($component.'processorArchitecture') Architecture" + $component.SystemLocale = $SystemLocale + } + if ($UILanguage) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding UI Language for $($component.'processorArchitecture') Architecture" + $component.UILanguage = $UILanguage + } + if ($UserLocale) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding User Locale for $($component.'processorArchitecture') Architecture" + $component.UserLocale = $UserLocale + } + } + + if (($setting.'Pass' -eq 'oobeSystem') -and ($component.'Name' -eq 'Microsoft-Windows-Shell-Setup')) + { + if ($TimeZone) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding Time Zone for $($component.'processorArchitecture') Architecture" + $component.TimeZone = $TimeZone + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding Administrator Passwords for $($component.'processorArchitecture') Architecture" + $concatenatedPassword = '{0}AdministratorPassword' -f $AdminCredential.GetNetworkCredential().password + $component.UserAccounts.AdministratorPassword.Value = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($concatenatedPassword)) + if ($RegisteredOrganization) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding Registred Organization for $($component.'processorArchitecture') Architecture" + $component.RegisteredOrganization = $RegisteredOrganization + } + if ($RegisteredOwner) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding Registered Owner for $($component.'processorArchitecture') Architecture" + $component.RegisteredOwner = $RegisteredOwner + } + if ($UserAccount) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding User Account(s) for $($component.'processorArchitecture') Architecture" + $UserAccountsElement = $component.UserAccounts + $LocalAccountsElement = $UserAccountsElement.AppendChild($unattendXml.CreateElement('LocalAccounts','urn:schemas-microsoft-com:unattend')) + foreach ($Account in $UserAccount) + { + $LocalAccountElement = $LocalAccountsElement.AppendChild($unattendXml.CreateElement('LocalAccount','urn:schemas-microsoft-com:unattend')) + $LocalAccountPasswordElement = $LocalAccountElement.AppendChild($unattendXml.CreateElement('Password','urn:schemas-microsoft-com:unattend')) + $LocalAccountPasswordValueElement = $LocalAccountPasswordElement.AppendChild($unattendXml.CreateElement('Value','urn:schemas-microsoft-com:unattend')) + $LocalAccountPasswordPlainTextElement = $LocalAccountPasswordElement.AppendChild($unattendXml.CreateElement('PlainText','urn:schemas-microsoft-com:unattend')) + $LocalAccountDisplayNameElement = $LocalAccountElement.AppendChild($unattendXml.CreateElement('DisplayName','urn:schemas-microsoft-com:unattend')) + $LocalAccountGroupElement = $LocalAccountElement.AppendChild($unattendXml.CreateElement('Group','urn:schemas-microsoft-com:unattend')) + $LocalAccountNameElement = $LocalAccountElement.AppendChild($unattendXml.CreateElement('Name','urn:schemas-microsoft-com:unattend')) + + $null = $LocalAccountElement.SetAttribute('action','http://schemas.microsoft.com/WMIConfig/2002/State','add') + $concatenatedPassword = '{0}Password' -f $Account.GetNetworkCredential().password + $null = $LocalAccountPasswordValueElement.AppendChild($unattendXml.CreateTextNode([System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($concatenatedPassword)))) + $null = $LocalAccountPasswordPlainTextElement.AppendChild($unattendXml.CreateTextNode('false')) + $null = $LocalAccountDisplayNameElement.AppendChild($unattendXml.CreateTextNode($Account.UserName)) + $null = $LocalAccountGroupElement.AppendChild($unattendXml.CreateTextNode('Administrators')) + $null = $LocalAccountNameElement.AppendChild($unattendXml.CreateTextNode($Account.UserName)) + } + } + + if ($LogonCount) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding Autologon for $($component.'processorArchitecture') Architecture" + $autoLogonElement = $component.AppendChild($unattendXml.CreateElement('AutoLogon','urn:schemas-microsoft-com:unattend')) + $autoLogonPasswordElement = $autoLogonElement.AppendChild($unattendXml.CreateElement('Password','urn:schemas-microsoft-com:unattend')) + $autoLogonPasswordValueElement = $autoLogonPasswordElement.AppendChild($unattendXml.CreateElement('Value','urn:schemas-microsoft-com:unattend')) + $autoLogonCountElement = $autoLogonElement.AppendChild($unattendXml.CreateElement('LogonCount','urn:schemas-microsoft-com:unattend')) + $autoLogonUsernameElement = $autoLogonElement.AppendChild($unattendXml.CreateElement('Username','urn:schemas-microsoft-com:unattend')) + $autoLogonEnabledElement = $autoLogonElement.AppendChild($unattendXml.CreateElement('Enabled','urn:schemas-microsoft-com:unattend')) + + $null = $autoLogonPasswordValueElement.AppendChild($unattendXml.CreateTextNode($AdminCredential.GetNetworkCredential().password)) + $null = $autoLogonCountElement.AppendChild($unattendXml.CreateTextNode($LogonCount)) + $null = $autoLogonUsernameElement.AppendChild($unattendXml.CreateTextNode('administrator')) + $null = $autoLogonEnabledElement.AppendChild($unattendXml.CreateTextNode('true')) + } + + if (($FirstLogonExecuteCommand -ne $null -or $FirstBootExecuteCommand.Length -gt 0) -and $component.'processorArchitecture' -eq 'x86') + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding First Logon Commands" + $commandOrder = 1 + $FirstLogonCommandsElement = $component.AppendChild($unattendXml.CreateElement('FirstLogonCommands','urn:schemas-microsoft-com:unattend')) + foreach ($command in ($FirstLogonExecuteCommand | Sort-Object -Property { + $_.order + })) + { + $CommandElement = $FirstLogonCommandsElement.AppendChild($unattendXml.CreateElement('SynchronousCommand','urn:schemas-microsoft-com:unattend')) + $CommandDescriptionElement = $CommandElement.AppendChild($unattendXml.CreateElement('Description','urn:schemas-microsoft-com:unattend')) + $CommandOrderElement = $CommandElement.AppendChild($unattendXml.CreateElement('Order','urn:schemas-microsoft-com:unattend')) + $CommandCommandLineElement = $CommandElement.AppendChild($unattendXml.CreateElement('CommandLine','urn:schemas-microsoft-com:unattend')) + $CommandRequireInputlement = $CommandElement.AppendChild($unattendXml.CreateElement('RequiresUserInput','urn:schemas-microsoft-com:unattend')) + + $null = $CommandElement.SetAttribute('action','http://schemas.microsoft.com/WMIConfig/2002/State','add') + $null = $CommandDescriptionElement.AppendChild($unattendXml.CreateTextNode($command['Description'])) + $null = $CommandOrderElement.AppendChild($unattendXml.CreateTextNode($commandOrder)) + $null = $CommandCommandLineElement.AppendChild($unattendXml.CreateTextNode($command['CommandLine'])) + $null = $CommandRequireInputlement.AppendChild($unattendXml.CreateTextNode('false')) + $commandOrder++ + } + } + if (($EveryLogonExecuteCommand -ne $null -or $FirstBootExecuteCommand.Length -gt 0) -and $component.'processorArchitecture' -eq 'x86') + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Adding Every-Logon Commands" + $commandOrder = 1 + $FirstLogonCommandsElement = $component.AppendChild($unattendXml.CreateElement('LogonCommands','urn:schemas-microsoft-com:unattend')) + foreach ($command in ($EveryLogonExecuteCommand | Sort-Object -Property { + $_.order + })) + { + $CommandElement = $FirstLogonCommandsElement.AppendChild($unattendXml.CreateElement('AsynchronousCommand','urn:schemas-microsoft-com:unattend')) + $CommandDescriptionElement = $CommandElement.AppendChild($unattendXml.CreateElement('Description','urn:schemas-microsoft-com:unattend')) + $CommandOrderElement = $CommandElement.AppendChild($unattendXml.CreateElement('Order','urn:schemas-microsoft-com:unattend')) + $CommandCommandLineElement = $CommandElement.AppendChild($unattendXml.CreateElement('CommandLine','urn:schemas-microsoft-com:unattend')) + $CommandRequireInputlement = $CommandElement.AppendChild($unattendXml.CreateElement('RequiresUserInput','urn:schemas-microsoft-com:unattend')) + + $null = $CommandElement.SetAttribute('action','http://schemas.microsoft.com/WMIConfig/2002/State','add') + $null = $CommandDescriptionElement.AppendChild($unattendXml.CreateTextNode($command['Description'])) + $null = $CommandOrderElement.AppendChild($unattendXml.CreateTextNode($commandOrder)) + $null = $CommandCommandLineElement.AppendChild($unattendXml.CreateTextNode($command['CommandLine'])) + $null = $CommandRequireInputlement.AppendChild($unattendXml.CreateTextNode('false')) + $commandOrder++ + } + } + } + } #end foreach setting.Component + } #end foreach unattendXml.Unattend.Settings + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] Saving file" + + $unattendXml.Save($Path) + Get-ChildItem $Path + # } + # catch + # { + # throw $_.Exception.Message + # } + } + } +} + + +function Get-UnattendChunk +{ + param + ( + [string] $pass, + [string] $component, + [string] $arch, + [xml] $unattend + ) + + # Helper function that returns one component chunk from the Unattend XML data structure + return $unattend.unattend.settings | + Where-Object -Property pass -EQ -Value $pass | + Select-Object -ExpandProperty component | + Where-Object -Property name -EQ -Value $component | + Where-Object -Property processorArchitecture -EQ -Value $arch +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/New-WindowsImageToolsExample.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/New-WindowsImageToolsExample.ps1 new file mode 100644 index 0000000..689d0f6 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/New-WindowsImageToolsExample.ps1 @@ -0,0 +1,485 @@ +function New-WindowsImageToolsExample +{ + <# + .Synopsis + Create folders and script examples on the use of Windows Image Tools + .DESCRIPTION + This Command creates the folders structures and example files needed to use Windows Image Tools to auto update windows images. + .EXAMPLE + New-WitExample -Path c:\WitExample + .NOTES + This is a work in progress + #> + [CmdletBinding(SupportsShouldProcess = $true + )] + [OutputType([System.IO.DirectoryInfo])] + Param + ( + # Path path to Folder/Directory to create (should not exist) + [Parameter(Mandatory = $true, + Position = 0)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [ValidateScript({ + If (Test-Path -Path $_) + { + throw "$_ allready exist" + } + else + { + $true + } + })] + [Alias('FullName')] + [string]$Path + ) + + if ($pscmdlet.ShouldProcess($Path, 'Create new Windows Image Tools Example')) + { + #region File Content + $DownloadEvalIsoContent = { + Write-Warning -Message 'Eval copies are only good for a short period then will automaticaly shutdown if not licenced.' + function BitsDownload + { + [CmdletBinding()] + param ( + [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [System.String] $DestinationPath, + [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [System.String] $Uri + ) + $destinationFilename = [System.IO.Path]::GetFileName($DestinationPath) + $startBitsTransferParams = @{ + Source = $Uri + Destination = $DestinationPath + TransferType = 'Download' + DisplayName = "Downloading $destinationFilename" + Description = $Uri + Priority = 'Foreground' + } + Start-BitsTransfer @startBitsTransferParams #-ErrorAction Stop + } #end function SetBitsDownload + + $win10Evalx64 = 'http://download.microsoft.com/download/B/B/3/BB3611B6-9781-437F-A293-AB43B85C2190/10586.0.151029-1700.TH2_RELEASE_CLIENTENTERPRISEEVAL_OEMRET_X64FRE_EN-US.ISO' + $Win10Evalx86 = 'http://download.microsoft.com/download/B/B/3/BB3611B6-9781-437F-A293-AB43B85C2190/10586.0.151029-1700.TH2_RELEASE_CLIENTENTERPRISEEVAL_OEMRET_X86FRE_EN-US.ISO' + $Win81Evalx64 = 'http://download.microsoft.com/download/B/9/9/B999286E-0A47-406D-8B3D-5B5AD7373A4A/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_ENTERPRISE_EVAL_EN-US-IR3_CENA_X64FREE_EN-US_DV9.ISO' + $Win81Evalx86 = 'http://download.microsoft.com/download/B/9/9/B999286E-0A47-406D-8B3D-5B5AD7373A4A/9600.17050.WINBLUE_REFRESH.140317-1640_X86FRE_ENTERPRISE_EVAL_EN-US-IR3_CENA_X86FREE_EN-US_DV9.ISO' + $Srv2016tp4Eval = 'http://download.microsoft.com/download/C/2/5/C257AD1A-45C1-48F9-B31C-5D37D6463123/10586.0.151029-1700.TH2_RELEASE_SERVER_OEMRET_X64FRE_EN-US.ISO' + $HyperV2016tp4Eval = 'http://download.microsoft.com/download/C/2/5/C257AD1A-45C1-48F9-B31C-5D37D6463123/10586.0.151029-1700.TH2_RELEASE_SERVERHYPERCORE_OEM_X64FRE_EN-US.ISO' + $Srv2012r2Eval = 'http://download.microsoft.com/download/6/2/A/62A76ABB-9990-4EFC-A4FE-C7D698DAEB96/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_EN-US-IR3_SSS_X64FREE_EN-US_DV9.ISO' + $HyperV2012r2Eval = 'http://download.microsoft.com/download/F/7/D/F7DF966B-5C40-4674-9A32-D83D869A3244/9600.16384.WINBLUE_RTM.130821-1623_X64FRE_SERVERHYPERCORE_EN-US-IRM_SHV_X64FRE_EN-US_DV5.ISO' + + if (-not (Test-Path -Path $PSScriptRoot\ISO\Win10Evalx64.ISO)) + { + Write-Verbose -Message 'win10x64' -Verbose + BitsDownload -Uri $win10Evalx64 -DestinationPath $PSScriptRoot\ISO\Win10Evalx64.ISO + } + if (-not (Test-Path -Path $PSScriptRoot\ISO\Win10Evalx86.ISO)) + { + Write-Verbose -Message 'win10x86' -Verbose + BitsDownload -Uri $Win10Evalx86 -DestinationPath $PSScriptRoot\ISO\Win10Evalx86.ISO + } + if (-not (Test-Path -Path $PSScriptRoot\ISO\Win81Evalx64.ISO)) + { + Write-Verbose -Message 'win81x64' -Verbose + BitsDownload -Uri $Win81Evalx64 -DestinationPath $PSScriptRoot\ISO\Win81Evalx64.ISO + } + if (-not (Test-Path -Path $PSScriptRoot\ISO\Win81Evalx86.ISO)) + { + Write-Verbose -Message 'win81x86' -Verbose + BitsDownload -Uri $Win81Evalx86 -DestinationPath $PSScriptRoot\ISO\Win81Evalx86.ISO + } + if (-not (Test-Path -Path $PSScriptRoot\ISO\Srv2016tp4Eval.ISO)) + { + Write-Verbose -Message 'Srv2016' -Verbose + BitsDownload -Uri $Srv2016tp4Eval -DestinationPath $PSScriptRoot\ISO\Srv2016tp4Eval.ISO + } + if (-not (Test-Path -Path $PSScriptRoot\ISO\HyperV2016tp4Eval.ISO)) + { + Write-Verbose -Message 'hv2016' -Verbose + BitsDownload -Uri $HyperV2016tp4Eval -DestinationPath $PSScriptRoot\ISO\HyperV2016tp4Eval.ISO + } + if (-not (Test-Path -Path $PSScriptRoot\ISO\Srv2012r2Eval.ISO)) + { + Write-Verbose -Message 'srv2012' -Verbose + BitsDownload -Uri $Srv2012r2Eval -DestinationPath $PSScriptRoot\ISO\Srv2012r2Eval.ISO + } + if (-not (Test-Path -Path $PSScriptRoot\ISO\HyperV2012r2Eval.ISO)) + { + Write-Verbose -Message 'hv2012' -Verbose + BitsDownload -Uri $HyperV2012r2Eval -DestinationPath $PSScriptRoot\ISO\HyperV2012r2Eval.ISO + } + } + $BasicExampleContent = { + Write-Warning -Message "You need to edit the configuration in $PSCommandPath and then commend out or delete line 1" + break + # Delete or comment out the above line + Write-Verbose -Message 'This example creates a no frils updated images of various windows versions' -Verbose + Write-Verbose -Message 'Win7 if found will be updated to WMF4' -Verbose + + Import-Module -Name WindowsImageTools -Force + + ## Done use plain text plasswords in production + #$adminCred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ('Administrator', ('P@ssw0rd'|ConvertTo-SecureString -Force -AsPlainText)) + $adminCred = Get-Credential -UserName 'Administrator' -Message 'Local Administrator' + + # Set the values of the VM configuration + $switch = 'Bridge' # Must allready exist + $vLan = 0 # 0 = no vLAN + $IpType = 'DHCP' # DHCP, IPv4, IPv6 + $IPAddress = '192.168.0.101' # Skiped if using DHCP + $SubnetMask = 24 # Skiped if using DHCP + $Gateway = '192.168.0.1' # Skiped if using DHCP + $DnsServer = '192.168.0.1' # Skiped if using DHCP + + $null = Set-UpdateConfig -Path $PSScriptRoot -VmSwitch $switch -vLAN $vLan -IpType $IpType -IpAddress $IPAddress -SubnetMask $SubnetMask -Gateway $Gateway -DnsServer $DnsServer -Verbose + + $Name = 'Win81Evalx86' + $Layout = 'BIOS' + $ISOPath = "$PSScriptRoot\ISO\Win81Evalx86.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName $Name -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + $Name = 'Win81Evalx64' + $Layout = 'UEFI' + $ISOPath = "$PSScriptRoot\ISO\Win81Evalx64.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName $Name -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + $Name = 'Win10Evalx86' + $Layout = 'BIOS' + $ISOPath = "$PSScriptRoot\ISO\Win10Evalx86.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName $Name -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + $Name = 'Win10Evalx64' + $Layout = 'UEFI' + $ISOPath = "$PSScriptRoot\ISO\Win10Evalx64.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName $Name -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + $Name = 'Srv2016tp4Eval' + $Layout = 'UEFI' + $ISOPath = "$PSScriptRoot\ISO\Srv2016tp4Eval.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName "$($Name)1" -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + Add-UpdateImage -Path $PSScriptRoot -FriendlyName "$($Name)2" -DiskLayout $Layout -SourcePath $ISOPath -Verbose -Index 2 -AdminCredential $adminCred + Add-UpdateImage -Path $PSScriptRoot -FriendlyName "$($Name)3" -DiskLayout $Layout -SourcePath $ISOPath -Verbose -Index 3 -AdminCredential $adminCred + Add-UpdateImage -Path $PSScriptRoot -FriendlyName "$($Name)4" -DiskLayout $Layout -SourcePath $ISOPath -Verbose -Index 4 -AdminCredential $adminCred + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + $Name = 'Srv2012r2Eval' + $Layout = 'UEFI' + $ISOPath = "$PSScriptRoot\ISO\Srv2012r2Eval.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName "$($Name)1" -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + Add-UpdateImage -Path $PSScriptRoot -FriendlyName "$($Name)2" -DiskLayout $Layout -SourcePath $ISOPath -Verbose -Index 2 -AdminCredential $adminCred + Add-UpdateImage -Path $PSScriptRoot -FriendlyName "$($Name)3" -DiskLayout $Layout -SourcePath $ISOPath -Verbose -Index 3 -AdminCredential $adminCred + Add-UpdateImage -Path $PSScriptRoot -FriendlyName "$($Name)4" -DiskLayout $Layout -SourcePath $ISOPath -Verbose -Index 4 -AdminCredential $adminCred + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + $Name = 'HyperV2016tp4Eval' + $Layout = 'UEFI' + $ISOPath = "$PSScriptRoot\ISO\HyperV2016tp4Eval.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName $Name -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + $Name = 'HyperV2012r2Eval' + $Layout = 'UEFI' + $ISOPath = "$PSScriptRoot\ISO\HyperV2012r2Eval.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName $Name -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + + $Name = 'Win7x64' + $Layout = 'BIOS' + $ISOPath = "$PSScriptRoot\ISO\Win7ent_x64.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName $Name -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + Update-WindowsImageWMF -Path $PSScriptRoot -ImageName $Name -Wmf4 -Verbose + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + $Name = 'Win7x86' + $Layout = 'BIOS' + $ISOPath = "$PSScriptRoot\ISO\Win7ent_x86.ISO" + if (Test-Path $ISOPath) + { + Add-UpdateImage -Path $PSScriptRoot -FriendlyName $Name -DiskLayout $Layout -SourcePath $ISOPath -Verbose -AdminCredential $adminCred + Update-WindowsImageWMF -Path $PSScriptRoot -ImageName $Name -Wmf4 -Verbose + } + else + { + Write-Warning -Message "$ISOPath does not exist skipping" + } + + Invoke-WindowsImageUpdate -Path $PSScriptRoot -verbose + } + $AdvancedExampleContent = { + Write-Warning -Message "You need to edit the configuration in $PSCommandPath and then commend out or delete line 1" + break + # Delete or comment out the above line + Import-Module -Name WindowsImageTools -Force + + #region config + + ## Dont save admin credentials in production + #$adminCred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ('Administrator', ('P@ssw0rd'|ConvertTo-SecureString -Force -AsPlainText)) + $adminCred = Get-Credential -UserName 'Administrator' -Message 'Local Administrator' + + # Set the values of the VM configuration + $switch = 'Bridge' # Must allready exist + $vLan = 0 # 0 = no vLAN + $IpType = 'DHCP' # DHCP, IPv4, IPv6 + $IPAddress = '192.168.0.101' # Skiped if using DHCP + $SubnetMask = 24 # Skiped if using DHCP + $Gateway = '192.168.0.1' # Skiped if using DHCP + $DnsServer = '192.168.0.1' # Skiped if using DHCP + + # Set path to Server 2012 R2 Eval Iso + $ISOPath = "$PSScriptRoot\ISO\Srv2012r2Eval.ISO" + #endregion + + #region Code + # Update configuration file with supplied values + $null = Set-UpdateConfig -Path $PSScriptRoot -VmSwitch $switch -vLAN $vLan -IpType $IpType -IpAddress $IPAddress -SubnetMask $SubnetMask -Gateway $Gateway -DnsServer $DnsServer -Verbose + + # Add 'Source' image to use for adding features to a patched image + Add-UpdateImage -Path $PSScriptRoot -FriendlyName 'Srv2012r2_Source' -DiskLayout UEFI -SourcePath $ISOPath -AdminCredential $adminCred -Verbose -AddPayloadForRemovedFeature -Index 4 + # Add 'Core' image + Add-UpdateImage -Path $PSScriptRoot -FriendlyName 'Srv2012r2_Core' -DiskLayout UEFI -SourcePath $ISOPath -AdminCredential $adminCred -Verbose -Index 3 + + # update both images to WMF5 Production Preview + Update-WindowsImageWMF -Path $PSScriptRoot -ImageName Srv2012r2_Core -Wmf5pp -verbose + Update-WindowsImageWMF -Path $PSScriptRoot -ImageName Srv2012r2_source -Wmf5pp -verbose + + # Update 'Core' image and remove unused feature payloads + Invoke-WindowsImageUpdate -Path $PSScriptRoot -Verbose -ImageName Srv2012r2_Core -ReduceImageSize + # Update 'Source' and only create WIM + Invoke-WindowsImageUpdate -Path $PSScriptRoot -Verbose -ImageName Srv2012r2_source -output WIM + + # create scedualed task to update images once a week on Wednesday night + # First action solves prompting of nuget updates, and must be in a seporate process. + $action1 = New-ScheduledTaskAction -ID 1 -Execute '%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe' -Argument " -Command `"& {get-packageprovider -name nuget -forcebootstrap }`"" + $action2 = New-ScheduledTaskAction -ID 2 -Execute '%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe' -Argument " -Command `"& {Start-Transcript $env:ALLUSERSPROFILE\WITUpdate.log -Append; import-module WindowsImageTools -erroraction stop; Invoke-WindowsImageUpdate -Path $PSScriptRoot -Verbose -ImageName Srv2012r2_Core -ReduceImageSize ; Invoke-WindowsImageUpdate -Path $PSScriptRoot -Verbose -ImageName Srv2012r2_source -output WIM }`"" + + $Paramaters = @{ + Action = $action1, $action2 + Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Wednesday -At 11pm + Settings = New-ScheduledTaskSettingsSet + } + $Name = $PSScriptRoot.Replace('\','-').Replace(':','') + $TaskObject = New-ScheduledTask @Paramaters + $null = Register-ScheduledTask -InputObject $TaskObject -User 'nt authority\system' -Verbose -TaskName "Advanced-ImageUpdate-for-$Name" + + #endregion + } + $ConvertExampleContent = { + Import-Module -Name $PSScriptRoot\WindowsImageTools -Force + + # Example of WIM2VHD conversion + + #Initialize-VHDPartition -Path g:\temp\temp1.vhdx -Dynamic -Verbose -DiskLayout BIOS -RecoveryImage -force -Passthru | + # Set-VHDPartition -SourcePath C:\iso\Win7ent_x64.ISO -Index 1 -Confirm:$false -force -Verbose + + #Convert-Wim2VHD -Path g:\temp\test2.vhdx -SourcePath C:\iso\Server2012R2.ISO -DiskLayout UEFI -Dynamic -Index 1 -Size 60GB -Force -Verbose -RecoveryImage + $commonParams = @{ + 'Dynamic' = $true + 'Verbose' = $true + 'Force' = $true + 'Unattend' = (New-UnattendXml -AdminPassword 'LocalP@ssword' -LogonCount 1) + 'filesToInject' = 'g:\temp\inject\pstemp\' + } + + $vhds = @( + @{ + 'SourcePath' = 'C:\iso\server_2016_preview_3.iso' + 'DiskLayout' = 'UEFI' + 'index' = 1 + 'size' = 40Gb + 'Path' = 'G:\temp\2016_CoreStd.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\server_2016_preview_3.iso' + 'DiskLayout' = 'UEFI' + 'index' = 2 + 'size' = 40Gb + 'Path' = 'G:\temp\2016_GUIStd.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\server_2016_preview_3.iso' + 'DiskLayout' = 'UEFI' + 'index' = 3 + 'size' = 40Gb + 'Path' = 'G:\temp\2016_CoreDC.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\server_2016_preview_3.iso' + 'DiskLayout' = 'UEFI' + 'index' = 4 + 'size' = 40Gb + 'Path' = 'G:\temp\2016_GUIDC.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\Svr_2012_R2.ISO' + 'DiskLayout' = 'UEFI' + 'index' = 1 + 'size' = 40Gb + 'Path' = 'G:\temp\2012r2_CoreStd.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\Svr_2012_R2.ISO' + 'DiskLayout' = 'UEFI' + 'index' = 2 + 'size' = 40Gb + 'Path' = 'G:\temp\2012r2_GUIStd.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\Svr_2012_R2.ISO' + 'DiskLayout' = 'UEFI' + 'index' = 3 + 'size' = 40Gb + 'Path' = 'G:\temp\2012r2_CoreDC.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\Svr_2012_R2.ISO' + 'DiskLayout' = 'UEFI' + 'index' = 4 + 'size' = 40Gb + 'Path' = 'G:\temp\2012r2_GUIDC.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\Win10ent_x64.ISO' + 'DiskLayout' = 'UEFI' + 'index' = 1 + 'size' = 40GB + 'Path' = 'G:\temp\Win10E_x64_UEFI.vhdx' + }, + @{ + 'SourcePath' = 'C:\iso\Win10ent_x64.ISO' + 'DiskLayout' = 'BIOS' + 'index' = 1 + 'size' = 40GB + 'Path' = 'G:\temp\Win10E_x64_BIOS.vhdx' + }, + @{ + 'SourcePath' = 'C:\ISO\Win10ent_x86.ISO' + 'DiskLayout' = 'BIOS' + 'index' = 1 + 'size' = 40GB + 'Path' = 'G:\temp\Win10E_x86_BIOS.vhdx' + }, + @{ + 'SourcePath' = 'C:\ISO\Win7ent_x64.ISO' + 'DiskLayout' = 'BIOS' + 'index' = 1 + 'size' = 40GB + 'Path' = 'G:\temp\Win7ent_x64_BIOS.vhdx' + }, + @{ + 'SourcePath' = 'C:\ISO\Win7ent_x86.ISO' + 'DiskLayout' = 'BIOS' + 'Index' = 1 + 'size' = 40GB + 'Path' = 'G:\temp\Win7ent_x86_BIOS.vhdx' + } + ) + + foreach ($VhdParms in $vhds) + { + Convert-Wim2VHD @VhdParms @commonParams #-WhatIf + } + } + #endregion + + #region Creat Directories + try + { + $null = New-Item -ItemType Directory -Path $Path -ErrorAction Stop + $null = New-Item -ItemType Directory -Path $Path\UpdatedImageShare -ErrorAction Stop + $null = New-Item -ItemType Directory -Path $Path\BaseImage -ErrorAction Stop + $null = New-Item -ItemType Directory -Path $Path\ISO -ErrorAction Stop + $null = New-Item -ItemType Directory -Path $Path\Resource -ErrorAction Stop + } + catch + { + throw "Error creating Directories in $Path" + } + #endregion + + #region create Files + try + { + $null = Set-UpdateConfig -Path $Path + $null = New-Item -Path $Path -Name BasicUpdateExample.ps1 -ItemType 'file' -Value $BasicExampleContent -Force + $null = New-Item -Path $Path -Name AdvancedUpdateExample.ps1 -ItemType 'file' -Value $AdvancedExampleContent -Force + $null = New-Item -Path $Path -Name DownloadEvalIso.ps1 -ItemType 'file' -Value $DownloadEvalIsoContent -Force + $null = New-Item -Path $Path -Name BasicConvertExample.ps1 -ItemType 'file' -Value $ConvertExampleContent -Force + } + catch + { + throw "trying to create files in $Path" + } + #endregion + + #region Download Modules + try + { + Find-Module -Name PSWindowsUpdate -ErrorAction Stop | Save-Module -Force -Path $Path\Resource -ErrorAction Stop + } + catch + { + Write-Warning -Message 'Unable to download PSWindowsUpdate useing PowerShellGet' + } + #endregion + } + return (Get-Item $Path) +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Set-UpdateConfig.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Set-UpdateConfig.ps1 new file mode 100644 index 0000000..882d809 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Set-UpdateConfig.ps1 @@ -0,0 +1,254 @@ +function Set-UpdateConfig +{ + <# + .Synopsis + Set the Windows Image Tools Update Config used for creating the temp VM + .DESCRIPTION + Set the config used by Invoke-WitUpdate to build a VM and update Windows Images + .EXAMPLE + Set-WitUpdateConfig -Path C:\WitUpdate -VmSwitch 'VM' -IpType DCHP + Set the temp VM to attach to siwth "VM" and use DCHP for IP addresses + .EXAMPLE + Set-WitUPdateConfig -Path C:\WitUpdate -VmSwitch CorpIntAccess -vLAN 1752 -IpType 'IPv4' -IPAddress '172.17.52.100' -SubnetMask 24 -Gateway '172.17.52.254' -DNS '208.67.222.123' + Setup the temp VM to attache to swithc CorpIntAccess, tag the packets with vLAN id 1752, and set the statis IPv4 Address, mask, gateway and DNS + .INPUTS + System.IO.DirectoryInfo + .OUTPUTS + System.IO.DirectoryInfo + #> + [CmdletBinding(SupportsShouldProcess = $true)] + [OutputType([System.IO.DirectoryInfo])] + Param + ( + # Path to the Windows Image Tools Update Folders (created via New-WitExample) + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [ValidateScript({ + if (Test-Path $_) + { + $true + } + else + { + throw "Path $_ does not exist" + } + })] + [Alias('FullName')] + $Path, + + # Existing VM Switch + [String] + $VmSwitch, + + # vLAN to have the VM tag it's trafic to (0 = No vLAN taging) + [int] + $vLAN, + + # IP Address Type used to set give the Temporary VM internet access DHCP, IPv4, or IPv6 + [ValidateSet('DHCP', 'IPv4', 'Ipv4')] + [String] + $IpType, + + # Static IP IPv4 or IPv6 Address to asign the Temporary VM help description + [ValidateScript({ + $ipObj = [System.Net.IPAddress]::parse($_) + $isValidIP = [System.Net.IPAddress]::tryparse([string]$_, [ref]$ipObj) + if ($isValidIP) + { + $true + } + else + { + throw 'IpAddress must be a valid IPv4 or IPv6 address' + } + })] + [String] + $IpAddress, + + # IP SubnetMask Ex. + [int] + $SubnetMask, + + # Static Gateway + [ValidateScript({ + $ipObj = [System.Net.IPAddress]::parse($_) + $isValidIP = [System.Net.IPAddress]::tryparse([string]$_, [ref]$ipObj) + if ($isValidIP) + { + $true + } + else + { + throw 'Gateway must be a valid IPv4 or IPv6 address' + } + })] + [String] + $Gateway, + + # Static DNS Server + [ValidateScript({ + $ipObj = [System.Net.IPAddress]::parse($_) + $isValidIP = [System.Net.IPAddress]::tryparse([string]$_, [ref]$ipObj) + if ($isValidIP) + { + $true + } + else + { + throw 'DNSServer must be a valid IPv4 or IPv6 address' + } + })] + [String] + $DnsServer + + + + ) + + if ($pscmdlet.ShouldProcess("$Path", 'Set the Windows Image Tools Update Configuration')) + { + $ConfigFilePath = $Path + $ParentPath = (Get-Item $Path).Parent.FullName + if (Test-Path -Path "$Path" -PathType Container) + { + $ConfigFilePath = "$Path\Config.xml" + $ParentPath = $Path + } + try + { + $ConfigData = Import-Clixml -Path $ConfigFilePath -ErrorAction Stop + } + catch + { + Write-Warning -Message "Unable to read Windows Image Tools Update Cofniguration from $ConfigFilePath, creating a new file" + $ConfigData = @{ + VmSwitch = 'vmswitch' + vLan = 0 + IpAddress = '192.168.0.100' + SubnetMask = 24 + Gateway = '192.168.0.1' + DnsServer = '192.168.0.1' + IpType = 'DHCP' + } + } + # validate data structure incase useing older or malformed xml + If (-not ($ConfigData.ContainsKey('VmSwitch'))) + { + $ConfigData.add('VmSwitch','vmswitch') + } + If (-not ($ConfigData.ContainsKey('vLan'))) + { + $ConfigData.add('vLan','0') + } + If (-not ($ConfigData.ContainsKey('IpType'))) + { + $ConfigData.add('IpType','DHCP') + } + If (-not ($ConfigData.ContainsKey('IpAddress'))) + { + $ConfigData.add('IpAddress','192.168.0.100') + } + If (-not ($ConfigData.ContainsKey('SubnetMask'))) + { + $ConfigData.add('SubnetMask','24') + } + If (-not ($ConfigData.ContainsKey('Gateway'))) + { + $ConfigData.add('Gateway','192.168.0.1') + } + If (-not ($ConfigData.ContainsKey('DnsServer'))) + { + $ConfigData.add('DnsServer','192.168.0.1') + } + + # update values + if ($VmSwitch) + { + $ConfigData.VmSwitch = $VmSwitch + } + if ($vLAN) + { + $ConfigData.vLan = $vLAN + } + if ($IpType) + { + $ConfigData.IpType = $IpType + } + if ($IpAddress) + { + $ConfigData.IpAddress = $IpAddress + } + if ($SubnetMask) + { + $ConfigData.SubnetMask = $SubnetMask + } + if ($Gateway) + { + $ConfigData.Gateway = $Gateway + } + if ($DnsServer) + { + $ConfigData.DnsServer = $DnsServer + } + + Write-Verbose -Message 'New Configuration' + Write-Verbose -Message ($ConfigData | Out-String) + + try + { + $ConfigData | Export-Clixml -Path $ConfigFilePath -ErrorAction Stop + } + catch + { + Throw "Failed to write $ConfigFilePath. $($_.Exception.Message)" + } + return (Get-Item $ParentPath) + } +} + +function Get-UpdateConfig +{ + <# + .Synopsis + Get the Windows Image Tools Update Config used for creating the temp VM + .DESCRIPTION + This command will Get the config used by Invoke-WindowsImageUpdate to build a VM and update Windows Images + .EXAMPLE + Set-WitUpdateConfig -Path C:\WitUpdate -VmSwitch 'VM' -IpType DCHP + Set the temp VM to attach to siwth "VM" and use DCHP for IP addresses + .EXAMPLE + Set-WitUPdateConfig -Path C:\WitUpdate -VmSwitch CorpIntAccess -vLAN 1752 -IpType 'IPv4' -IPAddress '172.17.52.100' -SubnetMask 24 -Gateway '172.17.52.254' -DNS '208.67.222.123' + Setup the temp VM to attache to swithc CorpIntAccess, tag the packets with vLAN id 1752, and set the statis IPv4 Address, mask, gateway and DNS + .INPUTS + System.IO.DirectoryInfo + .OUTPUTS + System.IO.DirectoryInfo + #> + [CmdletBinding()] + [Alias()] + [OutputType([Hashtable])] + Param + ( + # Path to the Windows Image Tools Update Folders (created via New-WitExample) + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [ValidateScript({ + if (Test-Path $_) + { + $true + } + else + { + throw "Path $_ does not exist" + } + })] + [Alias('FullName')] + $Path + ) + + return (Import-Clixml -Path "$Path\config.xml") +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Set-VHDPartition.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Set-VHDPartition.ps1 new file mode 100644 index 0000000..d9ef813 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Set-VHDPartition.ps1 @@ -0,0 +1,530 @@ +function Set-VHDPartition +{ + <# + .Synopsis + Sets the content of a VHD(X) using a source WIM or ISO + .DESCRIPTION + This command will copy the content of the SourcePath ISO or WIM and populate the + partitions found in the VHD(X) You must supply the path to the VHD(X) file and a + valid WIM/ISO. You should also include the index number for the Windows Edition + to install. If the recovery partitions are present the source WIM will be copied + to the recovery partition. Optionally, you can also specify an XML file to be + inserted into the OS partition as unattend.xml, any Drivers, WindowsUpdate (MSU) + or Optional Features you want installed. And any additional files to add. + CAUTION: This command will replace the content partitions. + .EXAMPLE + PS C:\> Set-VHDPartition -Path D:\vhd\demo3.vhdx -SourcePath D:\wim\Win2012R2-Install.wim -Index 1 + .EXAMPLE + PS C:\> Set-VHDPartition -Path D:\vhd\demo3.vhdx -SourcePath D:\wim\Win2012R2-Install.wim -Index 1 -Confirm:$false -force -Verbose + #> + [CmdletBinding(SupportsShouldProcess = $true, + PositionalBinding = $true, + ConfirmImpact = 'High')] + Param + ( + # Path to VHDX + [parameter(Position = 0,Mandatory = $true, + HelpMessage = 'Enter the path to the VHDX file', + ValueFromPipeline = $true, + ValueFromPipelineByPropertyName = $true)] + [Alias('FullName','pspath','ImagePath')] + [ValidateScript({ + Test-Path -Path (Get-FullFilePath -Path $_) + })] + [string]$Path, + + # Path to WIM or ISO used to populate VHDX + [parameter(Position = 1,Mandatory = $true, + HelpMessage = 'Enter the path to the WIM/ISO file')] + [ValidateScript({ + Test-Path -Path (Get-FullFilePath -Path $_ ) + })] + [string]$SourcePath, + + # Index of image inside of WIM (Default 1) + [int]$Index = 1, + + # Path to file to copy inside of VHD(X) as C:\unattent.xml + [ValidateScript({ + if ($_) + { + Test-Path -Path $_ + } + else + { + $true + } + })] + [string]$Unattend, + + # Native Boot does not have the boot code inside the VHD(x) it must exist on the physical disk. + [switch]$NativeBoot, + + # Add payload for all removed features + [switch]$AddPayloadForRemovedFeature, + + # Feature to turn on (in DISM format) + [ValidateNotNullOrEmpty()] + [string[]]$Feature, + + # Feature to remove (in DISM format) + [ValidateNotNullOrEmpty()] + [string[]]$RemoveFeature, + + # Feature Source path. If not provided, all ISO and WIM images in $sourcePath searched + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string]$FeatureSource, + + # Feature Source index. If the source is a .wim provide an index Default =1 + [int]$FeatureSourceIndex = 1, + + # Path to drivers to inject + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string[]]$Driver, + + # Path of packages to install via DSIM + [ValidateNotNullOrEmpty()] + [ValidateScript({ + Test-Path -Path $(Resolve-Path $_) + })] + [string[]]$Package, + + # Files/Folders to copy to root of Winodws Drive (to place files in directories mimic the direcotry structure off of C:\) + [ValidateNotNullOrEmpty()] + [ValidateScript({ + foreach ($Path in $_) + { + Test-Path -Path $(Resolve-Path $Path) + } + })] + [string[]]$filesToInject, + + # Bypass the warning and about lost data + [switch]$Force + ) + + + Process { + $Path = $Path | Get-FullFilePath + $SourcePath = $SourcePath | Get-FullFilePath + + $VhdxFileName = Split-Path -Leaf -Path $Path + + if ($pscmdlet.ShouldProcess("[$($MyInvocation.MyCommand)] : Overwrite partitions inside [$Path] with content of [$SourcePath]", + "Overwrite partitions inside [$Path] with contentce of [$SourcePath]? ", + 'Overwrite WARNING!')) + { + if($Force -Or $pscmdlet.ShouldContinue('Are you sure? Any existin data will be lost!', 'Warning')) + { + $ParametersToPass = @{} + foreach ($key in ('Whatif', 'Verbose', 'Debug')) + { + if ($PSBoundParameters.ContainsKey($key)) + { + $ParametersToPass[$key] = $PSBoundParameters[$key] + } + } + #region ISO detection + # If we're using an ISO, mount it and get the path to the WIM file. + if (([IO.FileInfo]$SourcePath).Extension -ilike '.ISO') + { + # If the ISO isn't local, copy it down so we don't have to worry about resource contention + # or about network latency. + if (Test-IsNetworkLocation -Path $SourcePath) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Copying ISO [$(Split-Path -Path $SourcePath -Leaf)] to [$env:temp]" + $null = & "$env:windir\system32\robocopy.exe" $(Split-Path -Path $SourcePath -Parent) $env:temp $(Split-Path -Path $SourcePath -Leaf) + $SourcePath = "$($env:temp)\$(Split-Path -Path $SourcePath -Leaf)" + + $tempSource = $SourcePath + } + + $isoPath = (Resolve-Path $SourcePath).Path + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Opening ISO [$(Split-Path -Path $isoPath -Leaf)]" + $openIso = Mount-DiskImage -ImagePath $isoPath -StorageType ISO -PassThru + # Workarround for new drive letters in script modules + $null = Get-PSDrive + # Refresh the DiskImage object so we can get the real information about it. I assume this is a bug. + $openIso = Get-DiskImage -ImagePath $isoPath + $driveLetter = ($openIso | Get-Volume).DriveLetter + + $SourcePath = "$($driveLetter):\sources\install.wim" + + # Check to see if there's a WIM file we can muck about with. + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Looking for $($SourcePath)" + if (!(Test-Path $SourcePath)) + { + throw 'The specified ISO does not appear to be valid Windows installation media.' + } + } + #endregion + + #region WIM on network + # Check to see if the WIM is local, or on a network location. If the latter, copy it locally. + if (Test-IsNetworkLocation -Path $SourcePath) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Copying WIM $(Split-Path -Path $SourcePath -Leaf) to [$env:temp]" + $null = & "$env:windir\system32\robocopy.exe" $(Split-Path -Path $SourcePath -Parent) $env:temp $(Split-Path -Path $SourcePath -Leaf) + $SourcePath = "$($TempDirectory)\$(Split-Path -Path $SourcePath -Leaf)" + + $tempSource = $SourcePath + } + $SourcePath = (Resolve-Path $SourcePath).Path + #endregion + + #region mount the VHDX file + try + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Mounting disk image [$Path]" + $disk = Mount-DiskImage -ImagePath $Path -PassThru | + Get-DiskImage | + Get-Disk + } + catch + { + throw $_.Exception.Message + } + #endregion + + try + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Munted as disknumber [$($disk.Number)]" + + #region Assign Drive Letters + foreach ($partition in (Get-Partition -DiskNumber $disk.Number | + Where-Object -Property Type -NE -Value Reserved)) + { + $partition | Add-PartitionAccessPath -AssignDriveLetter -ErrorAction Stop + } + # Workarround for new drive letters in script modules + $null = Get-PSDrive + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Partition Table" + Write-Verbose -Message (Get-Partition -DiskNumber $disk.Number | + Select-Object -Property PartitionNumber, DriveLetter, Size, Type| + Out-String) + #endregion + + #region get partitions + $RecoveryToolsPartition = Get-Partition -DiskNumber $disk.Number | + Where-Object -Property Type -EQ -Value Recovery | + Select-Object -First 1 + if ((Get-Partition -DiskNumber $disk.Number | + Where-Object -Property Type -EQ -Value Recovery).count -gt 1) + { + $RecoveryImagePartition = Get-Partition -DiskNumber $disk.Number | + Where-Object -Property Type -EQ -Value Recovery | + Select-Object -Last 1 + } + $WindowsPartition = Get-Partition -DiskNumber $disk.Number | + Where-Object -Property Type -EQ -Value Basic| + Select-Object -First 1 + $SystemPartition = Get-Partition -DiskNumber $disk.Number | + Where-Object -Property Type -EQ -Value System| + Select-Object -First 1 + + $DiskLayout = 'UEFI' + if (-not ($WindowsPartition -and $SystemPartition)) + { + $WindowsPartition = Get-Partition -DiskNumber $disk.Number | + Where-Object -Property Type -EQ -Value IFS| + Select-Object -First 1 + $SystemPartition = $WindowsPartition + $DiskLayout = 'BIOS' + } + if (Get-Partition -DiskNumber $disk.Number | + Where-Object -Property Type -EQ -Value FAT32 ) + { + $DiskLayout = 'WindowsToGo' + } + + #endregion + + #region Recovery Image + if ($RecoveryImagePartition) + { + #copy the WIM to recovery image partition as Install.wim + $recoverfolder = Join-Path -Path "$($RecoveryImagePartition.DriveLetter):" -ChildPath 'Recovery' + $null = mkdir -Path $recoverfolder + $recoveryPath = Join-Path -Path $recoverfolder -ChildPath 'install.wim' + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] Recovery Image Partition [$($RecoveryImagePartition.PartitionNumber)] : copying [$SourcePath] to [$recoveryPath]" + Copy-Item -Path $SourcePath -Destination $recoveryPath -ErrorAction Stop + } # end if Recovery + #endregion + + #region Windows partition + if ($WindowsPartition) + { + $WinPath = Join-Path -Path "$($WindowsPartition.DriveLetter):" -ChildPath '\' + $windir = Join-Path -Path $WinPath -ChildPath Windows + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] Windows Partition [$($WindowsPartition.partitionNumber)] : Applying image from [$SourcePath] to [$WinPath] using Index [$Index]" + $null = Expand-WindowsImage -ImagePath $SourcePath -Index $Index -ApplyPath $WinPath -ErrorAction Stop + + #region Modify the OS with Drivers, Active Features and Packages + if ($Driver) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Adding Windows Drivers to the Image" + + $Driver | ForEach-Object -Process + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Driver path: [$PSItem]" + $Dism = Add-WindowsDriver -Path $WinPath -Recurse -Driver $PSItem + } + } + if ($filesToInject) + { + foreach ($filePath in $filesToInject) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] Windows Partition [$($WindowsPartition.partitionNumber)] : Adding files from $filePath" + $recurse = $false + if (Test-Path $filePath -PathType Container) + { + $recurse = $true + } + Copy-Item -Path $filePath -Destination $WinPath -Recurse:$recurse + } + } + + + if ($Unattend) + { + try + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] Windows Partition [$($WindowsPartition.partitionNumber)] : Adding Unattend.xml ($Unattend)" + Copy-Item $Unattend -Destination "$WinPath\unattend.xml" + } + catch + { + Write-Error -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Error Installing Windows Feature " + throw $_.Exception.Message + } + } + if ($AddPayloadForRemovedFeature) + { + $Feature = $Feature + (Get-WindowsOptionalFeature -Path $WinPath | Where-Object -Property state -EQ -Value 'DisabledWithPayloadRemoved' ).FeatureName + } + + If ($Feature) + { + try + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Installing Windows Feature(s) : Colecting posible source paths" + $FeatureSourcePath = @() + $MountFolderList = @() + if ($FeatureSource) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Installing Windows Feature(s) : Source Path provided [$FeatureSource]" + if (($FeatureSource | + Resolve-Path | + Get-Item ).PSIsContainer -eq $true ) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Installing Windows Feature(s) : Source Path [$FeatureSource] in folder" + $FeatureSourcePath += $FeatureSource + } + elseif (($FeatureSource | + Resolve-Path | + Get-Item ).extension -like '.wim') + { + #$FeatureSourcePath += Convert-Path $FeatureSource + $MountFolder = [System.IO.Directory]::CreateDirectory((Join-Path -Path $env:temp -ChildPath ([System.IO.Path]::GetRandomFileName().split('.')[0]))) + $MountFolderList += $MountFolder.FullName + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Installing Windows Feature(s) : Mounting Source [$FeatureSource] Index [$FeatureSourceIndex]" + $null = Mount-WindowsImage -ImagePath $FeatureSource -Index $FeatureSourceIndex -Path $MountFolder.FullName -ReadOnly + $FeatureSourcePath += Join-Path -Path $MountFolder.FullName -ChildPath 'Windows\WinSxS' + } + else + { + Write-Warning -Message "$FeatureSource is not a .wim or folder" + } + } + else + { + if ($driveLetter) #ISO + { + $FeatureSourcePath += Join-Path -Path "$($driveLetter):" -ChildPath 'sources\sxs' + } + + $images = Get-WindowsImage -ImagePath $SourcePath + + foreach ($image in $images) + { + #$image | fl * + $MountFolder = [System.IO.Directory]::CreateDirectory((Join-Path -Path $env:temp -ChildPath ([System.IO.Path]::GetRandomFileName().split('.')[0]))) + $MountFolderList += $MountFolder.FullName + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Installing Windows Feature(s) : Mounting Source $($image.ImageIndex) $($image.ImageName)" + $null = Mount-WindowsImage -ImagePath $SourcePath -Index $image.ImageIndex -Path $MountFolder.FullName -ReadOnly + $FeatureSourcePath += Join-Path -Path $MountFolder.FullName -ChildPath 'Windows\WinSxS' + } + } #end if FeatureSource + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Installing Windows Feature(s) [$Feature] to the Image : Search Source Path [$FeatureSourcePath]" + $null = Enable-WindowsOptionalFeature -Path $WinPath -All -FeatureName $Feature -Source $FeatureSourcePath + } + catch + { + Write-Error -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Error Installing Windows Feature " + throw $_.Exception.Message + } + finally + { + foreach ($MountFolder in $MountFolderList) + { + $null = Dismount-WindowsImage -Path $MountFolder -Discard + } + } + } + + if ($Package) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Adding Windows Packages to the Image" + + $Package | ForEach-Object -Process { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Package path: [$PSItem]" + $Dism = Add-WindowsPackage -Path $WinPath -PackagePath $PSItem + } + } + if ($RemoveFeature) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Removing Windows Features from the Image" + + $Package | ForEach-Object -Process { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Package path: [$PSItem]" + try + { + $null = Disable-WindowsOptionalFeature -Path $WinPath -All -FeatureName $Feature + } + catch + { + Write-Error -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Error Removeing Windows Feature " + throw $_.Exception.Message + } + } + } + #endregion + } + else + { + throw 'Unable to find OS partition' + } + #endregion + + #region System partition + if ($SystemPartition -and (-not ($NativeBoot))) + { + $systemDrive = "$($SystemPartition.driveletter):" + + + $bcdBootArgs = @( + "$($WinPath)Windows", # Path to the \Windows on the VHD + "/s $systemDrive", # Specifies the volume letter of the drive to create the \BOOT folder on. + '/v' # Enabled verbose logging. + ) + + #if ($UEFICapable) { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Disk Layout [$DiskLayout]" + switch ($DiskLayout) + { + 'UEFI' + { + $bcdBootArgs += '/f UEFI' # Specifies the firmware type of the target system partition + } + 'BIOS' + { + $bcdBootArgs += '/f BIOS' # Specifies the firmware type of the target system partition + } + + 'WindowsToGo' + { + # Create entries for both UEFI and BIOS if possible + if (Test-Path -Path "$($windowsDrive)\Windows\boot\EFI\bootmgfw.efi") + { + $bcdBootArgs += '/f ALL' + } + } + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] System Partition [$($SystemPartition.partitionNumber)] : Running [$windir\System32\bcdboot.exe] -> $bcdBootArgs" + Run-Executable -Executable "$windir\System32\bcdboot.exe" -Arguments $bcdBootArgs @ParametersToPass + + # The following is added to mitigate the VMM diff disk handling + # We're going to change from MBRBootOption to LocateBootOption. + if ($DiskLayout -eq 'BIOS') + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] System Partition [$($SystemPartition.partitionNumber)] : Fixing the Device ID in the BCD store on [$($VHDFormat)]" + Run-Executable -Executable 'BCDEDIT.EXE' -Arguments ( + "/store $($WinPath)boot\bcd", + "/set `{bootmgr`} device locate" + ) + Run-Executable -Executable 'BCDEDIT.EXE' -Arguments ( + "/store $($WinPath)boot\bcd", + "/set `{default`} device locate" + ) + Run-Executable -Executable 'BCDEDIT.EXE' -Arguments ( + "/store $($WinPath)boot\bcd", + "/set `{default`} osdevice locate" + ) + } + } + #endregion + + #region Recovery Tools + if ($RecoveryToolsPartition) + { + $recoverfolder = Join-Path -Path "$($RecoveryToolsPartition.DriveLetter):" -ChildPath 'Recovery' + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] Recovery Tools Partition [$($RecoveryToolsPartition.partitionNumber)] : [$cmd]" + Start-Process -NoNewWindow -Wait -FilePath "$windir\System32\reagentc.exe" -ArgumentList "/setosimage /path $recoverfolder /index $Index /target $windir" -NoNewWindow + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] Recovery Tools Partition [$($RecoveryToolsPartition.partitionNumber)] : Creating Recovery\WindowsRE folder [$($RecoveryToolsPartition.driveletter):\Recovery\WindowsRE]" + $repath = mkdir -Path "$($RecoveryToolsPartition.driveletter):\Recovery\WindowsRE" + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] Recovery Tools Partition [$($RecoveryToolsPartition.partitionNumber)] : Copying [$($WindowsPartition.DriveLetter):\Windows\System32\recovery\winre.wim] to [$($repath.fullname)]" + #the winre.wim file is hidden + Get-ChildItem -Path "$($WindowsPartition.DriveLetter):\Windows\System32\recovery\winre.wim" -Hidden | + Copy-Item -Destination $repath.FullName + } + #endregion + } + catch + { + Write-Error -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Error setting partition content " + throw $_.Exception.Message + } + finally + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Removing Drive letters" + Get-Partition -DiskNumber $disk.number | + Where-Object -FilterScript { + $_.driveletter + } | + Where-Object -Property Type -NE -Value 'Basic' | + Where-Object -Property Type -NE -Value 'IFS' | + ForEach-Object -Process { + $dl = "$($_.DriveLetter):" + $_ | + Remove-PartitionAccessPath -AccessPath $dl + } + #dismount + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Dismounting" + $null = Dismount-DiskImage -ImagePath $Path + if ($isoPath -and (Get-DiskImage $isoPath).Attached) + { + $null = Dismount-DiskImage -ImagePath $isoPath + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] [$VhdxFileName] : Finished" + } + } + else + { + Write-Warning -Message 'Process aborted by user' + } + } + else + { + # Write-Warning 'Process aborted by user' + } + + } +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Update-WindowsImageWMF.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Update-WindowsImageWMF.ps1 new file mode 100644 index 0000000..385db44 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Update-WindowsImageWMF.ps1 @@ -0,0 +1,338 @@ +function Update-WindowsImageWMF +{ + <# + .Synopsis + Updates WMF to 4.0, 5.0 Production Preview or 5.0 (and .NET to 4.6) in a Windows Update Image + .DESCRIPTION + This Command downloads WMF 4.0, 5.0PP or 5.0 (Production Preview) and .NET 4.6 offline installer + Creates a temp VM and updates .NET if needed and WMF + .EXAMPLE + Update-UpdateImageWMF -Path C:\WITExample + Updates every Image in c:\WITExample\BaseImages + .EXAMPLE + Update-UpdateImageWMF -Path C:\WitExample -Name Server2012R2Core + Updates only C:\WitExample\BaseImages\Server2012R2Core_Base.vhdx + #> + [CmdletBinding(SupportsShouldProcess)] + #[OutputType([String])] + Param + ( + # Path to the Windows Image Tools Update Folders (created via New-WindowsImageToolsExample) + [Parameter(Mandatory, + ValueFromPipelineByPropertyName)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [ValidateScript({ + if (Test-Path $_) + { + $true + } + else + { + throw "Path $_ does not exist" + } + })] + [Alias('FullName')] + $Path, + + # Name of the Image to update + [Parameter(Mandatory)] + [ValidateNotNull()] + [ValidateNotNullOrEmpty()] + [Alias('FriendlyName')] + [string[]] + $ImageName, + + # Use WMF 4 instead of the default WMF 5 + [switch] + $Wmf4, + + # Use WMF5 Production Preview instead of the default WMF 5 (overrides -vmf4) + [switch] + $Wmf5pp + + ) + + foreach ($image in $ImageName) + { + $parentVHD = "$Path\BaseImage\$($image)_Base.vhdx" + $target = "$Path\BaseImage\$($image)_Update.vhdx" + + if ($pscmdlet.ShouldProcess("$parentVHD", 'Update WMF in Windows Image Tools Update Image')) + { + $ParametersToPass = @{} + foreach ($key in ('Whatif', 'Verbose', 'Debug')) + { + if ($PSBoundParameters.ContainsKey($key)) + { + $ParametersToPass[$key] = $PSBoundParameters[$key] + } + } + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Creating $target from $parentVHD" + $null = New-VHD -Path $target -ParentPath $parentVHD + + #region Validate Input + try + { + $null = Test-Path -Path "$Path\BaseImage" -ErrorAction Stop + $null = Test-Path -Path "$Path\Resource" -ErrorAction Stop + } + catch + { + Throw "$Path missing required folder structure use New-WindowsImagetoolsExample to create example" + } + + if (-not(Test-Path -Path "$Path\BaseImage\$($ImageName)_Base.vhdx")) + { + Throw "BaseImage for $ImageName does not exists. Use Add-UpdateImage first" + } + #endregion + + #region Update Resource Folder + ## download WMF + $wmfPath = "$Path\Resource\WMF\5" + $wmfDownloadUrl = 'http://aka.ms/wmf5latest' + + if ($Wmf4) + { + $wmfPath = "$Path\Resource\WMF\4" + $wmfDownloadUrl = 'http://www.microsoft.com/en-us/download/details.aspx?id=40855' + } + if ($Wmf5pp) + { + $wmfPath = "$Path\Resource\WMF\5pp" + $wmfDownloadUrl = 'https://www.microsoft.com/en-us/download/details.aspx?id=48729' + } + try + { + if (-not (Test-Path -Path $wmfPath)) + { + $null = mkdir -Path $wmfPath + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Checking for the latest WMF in $wmfPath" + $confirmationPage = 'http://www.microsoft.com/en-us/download/' + $((Invoke-WebRequest -Uri $wmfDownloadUrl -UseBasicParsing).links | + Where-Object -Property Class -EQ -Value 'mscom-link download-button dl' | + ForEach-Object -MemberName href) + $directURLs = (Invoke-WebRequest -Uri $confirmationPage -UseBasicParsing).Links | + Where-Object -Property Class -EQ -Value 'mscom-link' | + Where-Object -Property href -Like -Value '*.msu' | + ForEach-Object -MemberName href + foreach ($directURL in $directURLs) + { + $filename = $directURL -split '/' | Select-Object -Last 1 + if (-not (Test-Path -Path "$wmfPath\$filename" )) + { + Write-Warning -Message "[$($MyInvocation.MyCommand)] : Checking for the latest WMF : $filename Missing, Downloading" + $null = Invoke-WebRequest -Uri $directURL -OutFile "$wmfPath\$filename" + } + else + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Checking for the latest WMF : $wmfPath\$filename : Found" + } + } + } + catch + { + if (-not (Test-Path -Path "$wmfPath\*.msu")) + { + throw "Unable to downlaod WMF to $wmfPath. please download WMF manualy and place in $wmfPath " + } + } + + + ## download .NET 4.6 + try + { + if (-not (Test-Path -Path $Path\Resource\dotNET)) + { + mkdir -Path $Path\Resource\dotNET + } + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : Checking for .NET 4.6" + $directURL = 'https://download.microsoft.com/download/C/3/A/C3A5200B-D33C-47E9-9D70-2F7C65DAAD94/NDP46-KB3045557-x86-x64-AllOS-ENU.exe' + $filename = 'dotNet4-6.exe' + if (-not (Test-Path -Path "$Path\Resource\dotNET\$filename" )) + { + Write-Warning -Message "[$($MyInvocation.MyCommand)] : Checking for .NET 4.6 : Missing : Downloading" + $null = Invoke-WebRequest -Uri $directURL -OutFile "$Path\Resource\dotNET\$filename" + } + } + catch + { + if (-not (Test-Path -Path "$Path\Resource\dotNET\$filename")) + { + throw "Unable to downlaod .net 4.6 to $Path\Resource\dotNET\$filename. please download .net 4.6 manualy " + } + } + #endregion + + #region Install .NET + $dotNetInstallAtStartup = { + Start-Transcript -Path $PSScriptRoot\AtStartup.log -Append + $currentDotNetVersionv = (Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | + Get-ItemProperty -Name Version, Release -EA 0 | + Where-Object -FilterScript { + $_.PSChildName -match '^(?!S)\p{L}' + } | + Sort-Object -Property version -Descending | + Select-Object -First 1 ).version + if ($currentDotNetVersionv -lt 4.6) + { + if (-not (Test-Path -Path c:\PsTemp\dotNET\attempt.txt)) + { + Get-Date | Out-File -FilePath c:\PsTemp\dotNET\attempt.txt + Write-Verbose -Message '.Net 4.6 : Installing' -Verbose + Start-Process -Verb runas -Wait -FilePath 'C:\PsTemp\dotNET\dotNet4-6.exe' -ArgumentList '/q', '/norestart', '/log c:\PsTemp\dotNet\dotNetLog.htm' + } + + else + { + Write-Error -Message '.Net 4.6 : install attempted but failed!' + Start-Sleep -Seconds 30 + # Stop-Computer does not have -force in 2008/win7 WMF2 + if ((Get-Command Stop-Computer -Syntax) -like '*[force]*') + { + Stop-Computer -Verbose -Force + } + else + { + & "$env:windir\system32\shutdown.exe" /s /t 0 /f + } + Stop-Transcript + } + } + else + { + Get-Date | Out-File -FilePath c:\PsTemp\dotNET\Verified.txt + Write-Verbose -Message '.Net 4.6 : detected shuting down' -Verbose + # Stop-Computer does not have -force in 2008/win7 WMF2 + if ((Get-Command Stop-Computer -Syntax) -like '*[force]*') + { + Stop-Computer -Verbose -Force + } + else + { + & "$env:windir\system32\shutdown.exe" /s /t 0 /f + } + Stop-Transcript + } + Start-Sleep -Seconds 30 + Write-Verbose -Message 'Rebooting computer' -Verbose + # Restart-Computer does not have -force in 2008/win7 WMF2 + if ((Get-Command Restart-Computer -Syntax) -like '*[force]*') + { + Restart-Computer -Verbose -Force + } + else + { + & "$env:windir\system32\shutdown.exe" /r /t 0 /f + } + Stop-Transcript + } + + $AddDotNetFilesBlock = { + if (-not (Test-Path -Path "$($driveLetter):\PsTemp")) + { + $null = mkdir -Path "$($driveLetter):\PsTemp" + } + if (-not (Test-Path -Path "$($driveLetter):\PsTemp\dotNET")) + { + $null = mkdir -Path "$($driveLetter):\PsTemp\dotNET" + } + $null = New-Item -Path "$($driveLetter):\PsTemp" -Name AtStartup.ps1 -ItemType 'file' -Value $dotNetInstallAtStartup -Force + $null = Copy-Item -Path "$Path\Resource\dotNET\$filename" -Destination "$($driveLetter):\PsTemp\dotNET\$filname" + } + + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : .NET : Adding installer to $target" + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : .NET : updateting AtStartup script" + MountVHDandRunBlock -vhd $target -block $AddDotNetFilesBlock + $vmGeneration = 1 + if ((GetVHDPartitionStyle -vhd $target) -eq 'GPT') + { + $vmGeneration = 2 + } + $ConfigData = Get-UpdateConfig -Path $Path + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : .NET : Creating temp vm and waiting " + createRunAndWaitVM -vhdPath $target -vmGeneration $vmGeneration -configData $ConfigData @ParametersToPass + #endregion + + #region Install WMF + $verifyWmfVersion4 = { + Start-Transcript -Path $PSScriptRoot\AtStartup.log -Append + if ($PSVersionTable.PSVersion.Major -ge 4) + { + Write-Verbose -Message 'WMF : version varified' + Get-Date | Out-File -FilePath c:\PsTemp\ChangesMade.txt + } + else + { + Write-Warning -Message "WMF : Excpected version 4, found $($PSVersionTable.PSVersion.Major)" + } + Stop-Transcript + Stop-Computer -Force + } + $verifyWmfVersion5 = { + Start-Transcript -Path $PSScriptRoot\AtStartup.log -Append + if ($PSVersionTable.PSVersion.Major -ge 5) + { + Write-Verbose -Message 'WMF : version varified' + Get-Date | Out-File -FilePath c:\PsTemp\ChangesMade.txt + } + else + { + Write-Warning -Message "WMF : Excpected version 4, found $($PSVersionTable.PSVersion.Major)" + } + Stop-Transcript + Stop-Computer -Force + } + + if ($Wmf4) + { + $VeirfyWmfAtStartup = $verifyWmfVersion4 + } + else + { + $VeirfyWmfAtStartup = $verifyWmfVersion5 + } + + $addWmfFilesBlock = { + foreach ($update in (Get-ChildItem -Path $wmfPath\*.msu ).FullName ) + { + Write-Verbose -Message "checking if $update applies to $target" + $null = Add-WindowsPackage -PackagePath $update -Path "$($driveLetter):" + } + $null = New-Item -Path "$($driveLetter):\PsTemp" -Name AtStartup.ps1 -ItemType 'file' -Value $VeirfyWmfAtStartup -Force + } + + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : WMF : Applying WMF to $target and Updating AtStartup script" + MountVHDandRunBlock -vhd $target -block $addWmfFilesBlock + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : WMF : creating temp VM to finalize install on $target" + createRunAndWaitVM -vhdPath $target -vmGeneration $vmGeneration -configData $ConfigData @ParametersToPass + #endregion + + #region check for changes and merge or delete + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : WMF : Checking if changes made" + $checkresultsBlock = { + Test-Path -Path "$($driveLetter):\PsTemp\ChangesMade.txt" + if (Test-Path -Path "$($driveLetter):\PsTemp\ChangesMade.txt") + { + Remove-Item -Path "$($driveLetter):\PsTemp\AtStartup.ps1" -ErrorAction SilentlyContinue + } + } + $ChangesMade = MountVHDandRunBlock -vhd $target -block $checkresultsBlock + if ($ChangesMade) + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : WMF : Changes found : Merging $target into $parentVHD" + Merge-VHD -Path $target -DestinationPath $parentVHD + } + else + { + Write-Verbose -Message "[$($MyInvocation.MyCommand)] : WMF : No Changes : Discarding $target" + Remove-Item $target + } + #endregion + } + } +} diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Wim2VhdClass.ps1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Wim2VhdClass.ps1 new file mode 100644 index 0000000..83bfb4a --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/Functions/Wim2VhdClass.ps1 @@ -0,0 +1,1637 @@ +$code = @" +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Xml.Linq; +using System.Xml.XPath; +using Microsoft.Win32.SafeHandles; + +namespace WIM2VHD +{ + +/// <summary> +/// P/Invoke methods and associated enums, flags, and structs. +/// </summary> +public class +NativeMethods +{ + + #region Delegates and Callbacks + #region WIMGAPI + + ///<summary> + ///User-defined function used with the RegisterMessageCallback or UnregisterMessageCallback function. + ///</summary> + ///<param name="MessageId">Specifies the message being sent.</param> + ///<param name="wParam">Specifies additional message information. The contents of this parameter depend on the value of the + ///MessageId parameter.</param> + ///<param name="lParam">Specifies additional message information. The contents of this parameter depend on the value of the + ///MessageId parameter.</param> + ///<param name="UserData">Specifies the user-defined value passed to RegisterCallback.</param> + ///<returns> + ///To indicate success and to enable other subscribers to process the message return WIM_MSG_SUCCESS. + ///To prevent other subscribers from receiving the message, return WIM_MSG_DONE. + ///To cancel an image apply or capture, return WIM_MSG_ABORT_IMAGE when handling the WIM_MSG_PROCESS message. + ///</returns> + public delegate uint + WimMessageCallback( + uint MessageId, + IntPtr wParam, + IntPtr lParam, + IntPtr UserData + ); + + public static void + RegisterMessageCallback( + WimFileHandle hWim, + WimMessageCallback callback) + { + + uint _callback = NativeMethods.WimRegisterMessageCallback(hWim, callback, IntPtr.Zero); + int rc = Marshal.GetLastWin32Error(); + if (0 != rc) + { + // Throw an exception if something bad happened on the Win32 end. + throw + new InvalidOperationException( + string.Format( + CultureInfo.CurrentCulture, + "Unable to register message callback." + )); + } + } + + public static void + UnregisterMessageCallback( + WimFileHandle hWim, + WimMessageCallback registeredCallback) + { + + bool status = NativeMethods.WimUnregisterMessageCallback(hWim, registeredCallback); + int rc = Marshal.GetLastWin32Error(); + if (!status) + { + throw + new InvalidOperationException( + string.Format( + CultureInfo.CurrentCulture, + "Unable to unregister message callback." + )); + } + } + + #endregion WIMGAPI + #endregion Delegates and Callbacks + + #region Constants + + #region VDiskInterop + + /// <summary> + /// The default depth in a VHD parent chain that this library will search through. + /// If you want to go more than one disk deep into the parent chain, provide a different value. + /// </summary> + public const uint OPEN_VIRTUAL_DISK_RW_DEFAULT_DEPTH = 0x00000001; + + public const uint DEFAULT_BLOCK_SIZE = 0x00080000; + public const uint DISK_SECTOR_SIZE = 0x00000200; + + internal const uint ERROR_VIRTDISK_NOT_VIRTUAL_DISK = 0xC03A0015; + internal const uint ERROR_NOT_FOUND = 0x00000490; + internal const uint ERROR_IO_PENDING = 0x000003E5; + internal const uint ERROR_INSUFFICIENT_BUFFER = 0x0000007A; + internal const uint ERROR_ERROR_DEV_NOT_EXIST = 0x00000037; + internal const uint ERROR_BAD_COMMAND = 0x00000016; + internal const uint ERROR_SUCCESS = 0x00000000; + + public const uint GENERIC_READ = 0x80000000; + public const uint GENERIC_WRITE = 0x40000000; + public const short FILE_ATTRIBUTE_NORMAL = 0x00000080; + public const uint CREATE_NEW = 0x00000001; + public const uint CREATE_ALWAYS = 0x00000002; + public const uint OPEN_EXISTING = 0x00000003; + public const short INVALID_HANDLE_VALUE = -1; + + internal static Guid VirtualStorageTypeVendorUnknown = new Guid("00000000-0000-0000-0000-000000000000"); + internal static Guid VirtualStorageTypeVendorMicrosoft = new Guid("EC984AEC-A0F9-47e9-901F-71415A66345B"); + + #endregion VDiskInterop + + #region WIMGAPI + + public const uint WIM_FLAG_VERIFY = 0x00000002; + public const uint WIM_FLAG_INDEX = 0x00000004; + + public const uint WM_APP = 0x00008000; + + #endregion WIMGAPI + + #endregion Constants + + #region Enums and Flags + + #region VDiskInterop + + /// <summary> + /// Indicates the version of the virtual disk to create. + /// </summary> + public enum CreateVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + public enum OpenVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + /// <summary> + /// Contains the version of the virtual hard disk (VHD) ATTACH_VIRTUAL_DISK_PARAMETERS structure to use in calls to VHD functions. + /// </summary> + public enum AttachVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001, + Version2 = 0x00000002 + } + + public enum CompactVirtualDiskVersion : int + { + VersionUnspecified = 0x00000000, + Version1 = 0x00000001 + } + + /// <summary> + /// Contains the type and provider (vendor) of the virtual storage device. + /// </summary> + public enum VirtualStorageDeviceType : int + { + /// <summary> + /// The storage type is unknown or not valid. + /// </summary> + Unknown = 0x00000000, + /// <summary> + /// For internal use only. This type is not supported. + /// </summary> + ISO = 0x00000001, + /// <summary> + /// Virtual Hard Disk device type. + /// </summary> + VHD = 0x00000002, + /// <summary> + /// Virtual Hard Disk v2 device type. + /// </summary> + VHDX = 0x00000003 + } + + /// <summary> + /// Contains virtual hard disk (VHD) open request flags. + /// </summary> + [Flags] + public enum OpenVirtualDiskFlags + { + /// <summary> + /// No flags. Use system defaults. + /// </summary> + None = 0x00000000, + /// <summary> + /// Open the VHD file (backing store) without opening any differencing-chain parents. Used to correct broken parent links. + /// </summary> + NoParents = 0x00000001, + /// <summary> + /// Reserved. + /// </summary> + BlankFile = 0x00000002, + /// <summary> + /// Reserved. + /// </summary> + BootDrive = 0x00000004, + } + + /// <summary> + /// Contains the bit mask for specifying access rights to a virtual hard disk (VHD). + /// </summary> + [Flags] + public enum VirtualDiskAccessMask + { + /// <summary> + /// Only Version2 of OpenVirtualDisk API accepts this parameter + /// </summary> + None = 0x00000000, + /// <summary> + /// Open the virtual disk for read-only attach access. The caller must have READ access to the virtual disk image file. + /// </summary> + /// <remarks> + /// If used in a request to open a virtual disk that is already open, the other handles must be limited to either + /// VIRTUAL_DISK_ACCESS_DETACH or VIRTUAL_DISK_ACCESS_GET_INFO access, otherwise the open request with this flag will fail. + /// </remarks> + AttachReadOnly = 0x00010000, + /// <summary> + /// Open the virtual disk for read-write attaching access. The caller must have (READ | WRITE) access to the virtual disk image file. + /// </summary> + /// <remarks> + /// If used in a request to open a virtual disk that is already open, the other handles must be limited to either + /// VIRTUAL_DISK_ACCESS_DETACH or VIRTUAL_DISK_ACCESS_GET_INFO access, otherwise the open request with this flag will fail. + /// If the virtual disk is part of a differencing chain, the disk for this request cannot be less than the readWriteDepth specified + /// during the prior open request for that differencing chain. + /// </remarks> + AttachReadWrite = 0x00020000, + /// <summary> + /// Open the virtual disk to allow detaching of an attached virtual disk. The caller must have + /// (FILE_READ_ATTRIBUTES | FILE_READ_DATA) access to the virtual disk image file. + /// </summary> + Detach = 0x00040000, + /// <summary> + /// Information retrieval access to the virtual disk. The caller must have READ access to the virtual disk image file. + /// </summary> + GetInfo = 0x00080000, + /// <summary> + /// Virtual disk creation access. + /// </summary> + Create = 0x00100000, + /// <summary> + /// Open the virtual disk to perform offline meta-operations. The caller must have (READ | WRITE) access to the virtual + /// disk image file, up to readWriteDepth if working with a differencing chain. + /// </summary> + /// <remarks> + /// If the virtual disk is part of a differencing chain, the backing store (host volume) is opened in RW exclusive mode up to readWriteDepth. + /// </remarks> + MetaOperations = 0x00200000, + /// <summary> + /// Reserved. + /// </summary> + Read = 0x000D0000, + /// <summary> + /// Allows unrestricted access to the virtual disk. The caller must have unrestricted access rights to the virtual disk image file. + /// </summary> + All = 0x003F0000, + /// <summary> + /// Reserved. + /// </summary> + Writable = 0x00320000 + } + + /// <summary> + /// Contains virtual hard disk (VHD) creation flags. + /// </summary> + [Flags] + public enum CreateVirtualDiskFlags + { + /// <summary> + /// Contains virtual hard disk (VHD) creation flags. + /// </summary> + None = 0x00000000, + /// <summary> + /// Pre-allocate all physical space necessary for the size of the virtual disk. + /// </summary> + /// <remarks> + /// The CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION flag is used for the creation of a fixed VHD. + /// </remarks> + FullPhysicalAllocation = 0x00000001 + } + + /// <summary> + /// Contains virtual disk attach request flags. + /// </summary> + [Flags] + public enum AttachVirtualDiskFlags + { + /// <summary> + /// No flags. Use system defaults. + /// </summary> + None = 0x00000000, + /// <summary> + /// Attach the virtual disk as read-only. + /// </summary> + ReadOnly = 0x00000001, + /// <summary> + /// No drive letters are assigned to the disk's volumes. + /// </summary> + /// <remarks>Oddly enough, this doesn't apply to NTFS mount points.</remarks> + NoDriveLetter = 0x00000002, + /// <summary> + /// Will decouple the virtual disk lifetime from that of the VirtualDiskHandle. + /// The virtual disk will be attached until the Detach() function is called, even if all open handles to the virtual disk are closed. + /// </summary> + PermanentLifetime = 0x00000004, + /// <summary> + /// Reserved. + /// </summary> + NoLocalHost = 0x00000008 + } + + [Flags] + public enum DetachVirtualDiskFlag + { + None = 0x00000000 + } + + [Flags] + public enum CompactVirtualDiskFlags + { + None = 0x00000000, + NoZeroScan = 0x00000001, + NoBlockMoves = 0x00000002 + } + + #endregion VDiskInterop + + #region WIMGAPI + + [FlagsAttribute] + internal enum + WimCreateFileDesiredAccess : uint + { + WimQuery = 0x00000000, + WimGenericRead = 0x80000000 + } + + public enum WimMessage : uint + { + WIM_MSG = WM_APP + 0x1476, + WIM_MSG_TEXT, + ///<summary> + ///Indicates an update in the progress of an image application. + ///</summary> + WIM_MSG_PROGRESS, + ///<summary> + ///Enables the caller to prevent a file or a directory from being captured or applied. + ///</summary> + WIM_MSG_PROCESS, + ///<summary> + ///Indicates that volume information is being gathered during an image capture. + ///</summary> + WIM_MSG_SCANNING, + ///<summary> + ///Indicates the number of files that will be captured or applied. + ///</summary> + WIM_MSG_SETRANGE, + ///<summary> + ///Indicates the number of files that have been captured or applied. + ///</summary> + WIM_MSG_SETPOS, + ///<summary> + ///Indicates that a file has been either captured or applied. + ///</summary> + WIM_MSG_STEPIT, + ///<summary> + ///Enables the caller to prevent a file resource from being compressed during a capture. + ///</summary> + WIM_MSG_COMPRESS, + ///<summary> + ///Alerts the caller that an error has occurred while capturing or applying an image. + ///</summary> + WIM_MSG_ERROR, + ///<summary> + ///Enables the caller to align a file resource on a particular alignment boundary. + ///</summary> + WIM_MSG_ALIGNMENT, + WIM_MSG_RETRY, + ///<summary> + ///Enables the caller to align a file resource on a particular alignment boundary. + ///</summary> + WIM_MSG_SPLIT, + WIM_MSG_SUCCESS = 0x00000000, + WIM_MSG_ABORT_IMAGE = 0xFFFFFFFF + } + + internal enum + WimCreationDisposition : uint + { + WimOpenExisting = 0x00000003, + } + + internal enum + WimActionFlags : uint + { + WimIgnored = 0x00000000 + } + + internal enum + WimCompressionType : uint + { + WimIgnored = 0x00000000 + } + + internal enum + WimCreationResult : uint + { + WimCreatedNew = 0x00000000, + WimOpenedExisting = 0x00000001 + } + + #endregion WIMGAPI + + #endregion Enums and Flags + + #region Structs + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct CreateVirtualDiskParameters + { + /// <summary> + /// A CREATE_VIRTUAL_DISK_VERSION enumeration that specifies the version of the CREATE_VIRTUAL_DISK_PARAMETERS structure being passed to or from the virtual hard disk (VHD) functions. + /// </summary> + public CreateVirtualDiskVersion Version; + + /// <summary> + /// Unique identifier to assign to the virtual disk object. If this member is set to zero, a unique identifier is created by the system. + /// </summary> + public Guid UniqueId; + + /// <summary> + /// The maximum virtual size of the virtual disk object. Must be a multiple of 512. + /// If a ParentPath is specified, this value must be zero. + /// If a SourcePath is specified, this value can be zero to specify the size of the source VHD to be used, otherwise the size specified must be greater than or equal to the size of the source disk. + /// </summary> + public ulong MaximumSize; + + /// <summary> + /// Internal size of the virtual disk object blocks. + /// The following are predefined block sizes and their behaviors. For a fixed VHD type, this parameter must be zero. + /// </summary> + public uint BlockSizeInBytes; + + /// <summary> + /// Internal size of the virtual disk object sectors. Must be set to 512. + /// </summary> + public uint SectorSizeInBytes; + + /// <summary> + /// Optional path to a parent virtual disk object. Associates the new virtual disk with an existing virtual disk. + /// If this parameter is not NULL, SourcePath must be NULL. + /// </summary> + public string ParentPath; + + /// <summary> + /// Optional path to pre-populate the new virtual disk object with block data from an existing disk. This path may refer to a VHD or a physical disk. + /// If this parameter is not NULL, ParentPath must be NULL. + /// </summary> + public string SourcePath; + + /// <summary> + /// Flags for opening the VHD + /// </summary> + public OpenVirtualDiskFlags OpenFlags; + + /// <summary> + /// GetInfoOnly flag for V2 handles + /// </summary> + public bool GetInfoOnly; + + /// <summary> + /// Virtual Storage Type of the parent disk + /// </summary> + public VirtualStorageType ParentVirtualStorageType; + + /// <summary> + /// Virtual Storage Type of the source disk + /// </summary> + public VirtualStorageType SourceVirtualStorageType; + + /// <summary> + /// A GUID to use for fallback resiliency over SMB. + /// </summary> + public Guid ResiliencyGuid; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct VirtualStorageType + { + public VirtualStorageDeviceType DeviceId; + public Guid VendorId; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct SecurityDescriptor + { + public byte revision; + public byte size; + public short control; + public IntPtr owner; + public IntPtr group; + public IntPtr sacl; + public IntPtr dacl; + } + + #endregion Structs + + #region VirtDisk.DLL P/Invoke + + [DllImport("virtdisk.dll", CharSet = CharSet.Unicode)] + public static extern uint + CreateVirtualDisk( + [In, Out] ref VirtualStorageType VirtualStorageType, + [In] string Path, + [In] VirtualDiskAccessMask VirtualDiskAccessMask, + [In, Out] ref SecurityDescriptor SecurityDescriptor, + [In] CreateVirtualDiskFlags Flags, + [In] uint ProviderSpecificFlags, + [In, Out] ref CreateVirtualDiskParameters Parameters, + [In] IntPtr Overlapped, + [Out] out SafeFileHandle Handle); + + #endregion VirtDisk.DLL P/Invoke + + #region Win32 P/Invoke + + [DllImport("advapi32", SetLastError = true)] + public static extern bool InitializeSecurityDescriptor( + [Out] out SecurityDescriptor pSecurityDescriptor, + [In] uint dwRevision); + + #endregion Win32 P/Invoke + + #region WIMGAPI P/Invoke + + #region SafeHandle wrappers for WimFileHandle and WimImageHandle + + public sealed class WimFileHandle : SafeHandle + { + + public WimFileHandle( + string wimPath) + : base(IntPtr.Zero, true) + { + + if (String.IsNullOrEmpty(wimPath)) + { + throw new ArgumentNullException("wimPath"); + } + + if (!File.Exists(Path.GetFullPath(wimPath))) + { + throw new FileNotFoundException((new FileNotFoundException()).Message, wimPath); + } + + NativeMethods.WimCreationResult creationResult; + + this.handle = NativeMethods.WimCreateFile( + wimPath, + NativeMethods.WimCreateFileDesiredAccess.WimGenericRead, + NativeMethods.WimCreationDisposition.WimOpenExisting, + NativeMethods.WimActionFlags.WimIgnored, + NativeMethods.WimCompressionType.WimIgnored, + out creationResult + ); + + // Check results. + if (creationResult != NativeMethods.WimCreationResult.WimOpenedExisting) + { + throw new Win32Exception(); + } + + if (this.handle == IntPtr.Zero) + { + throw new Win32Exception(); + } + + // Set the temporary path. + NativeMethods.WimSetTemporaryPath( + this, + Environment.ExpandEnvironmentVariables("%TEMP%") + ); + } + + protected override bool ReleaseHandle() + { + return NativeMethods.WimCloseHandle(this.handle); + } + + public override bool IsInvalid + { + get { return this.handle == IntPtr.Zero; } + } + } + + public sealed class WimImageHandle : SafeHandle + { + public WimImageHandle( + WimFile Container, + uint ImageIndex) + : base(IntPtr.Zero, true) + { + + if (null == Container) + { + throw new ArgumentNullException("Container"); + } + + if ((Container.Handle.IsClosed) || (Container.Handle.IsInvalid)) + { + throw new ArgumentNullException("The handle to the WIM file has already been closed, or is invalid.", "Container"); + } + + if (ImageIndex > Container.ImageCount) + { + throw new ArgumentOutOfRangeException("ImageIndex", "The index does not exist in the specified WIM file."); + } + + this.handle = NativeMethods.WimLoadImage( + Container.Handle.DangerousGetHandle(), + ImageIndex); + } + + protected override bool ReleaseHandle() + { + return NativeMethods.WimCloseHandle(this.handle); + } + + public override bool IsInvalid + { + get { return this.handle == IntPtr.Zero; } + } + } + + #endregion SafeHandle wrappers for WimFileHandle and WimImageHandle + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMCreateFile")] + internal static extern IntPtr + WimCreateFile( + [In, MarshalAs(UnmanagedType.LPWStr)] string WimPath, + [In] WimCreateFileDesiredAccess DesiredAccess, + [In] WimCreationDisposition CreationDisposition, + [In] WimActionFlags FlagsAndAttributes, + [In] WimCompressionType CompressionType, + [Out, Optional] out WimCreationResult CreationResult + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMCloseHandle")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimCloseHandle( + [In] IntPtr Handle + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMLoadImage")] + internal static extern IntPtr + WimLoadImage( + [In] IntPtr Handle, + [In] uint ImageIndex + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMGetImageCount")] + internal static extern uint + WimGetImageCount( + [In] WimFileHandle Handle + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMGetImageInformation")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimGetImageInformation( + [In] SafeHandle Handle, + [Out] out StringBuilder ImageInfo, + [Out] out uint SizeOfImageInfo + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMSetTemporaryPath")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimSetTemporaryPath( + [In] WimFileHandle Handle, + [In] string TempPath + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMRegisterMessageCallback", CallingConvention = CallingConvention.StdCall)] + internal static extern uint + WimRegisterMessageCallback( + [In, Optional] WimFileHandle hWim, + [In] WimMessageCallback MessageProc, + [In, Optional] IntPtr ImageInfo + ); + + [DllImport("Wimgapi.dll", CharSet = CharSet.Unicode, SetLastError = true, EntryPoint = "WIMUnregisterMessageCallback", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool + WimUnregisterMessageCallback( + [In, Optional] WimFileHandle hWim, + [In] WimMessageCallback MessageProc + ); + + + #endregion WIMGAPI P/Invoke +} + +#region WIM Interop + +public class WimFile +{ + + internal XDocument m_xmlInfo; + internal List<WimImage> m_imageList; + + private static NativeMethods.WimMessageCallback wimMessageCallback; + + #region Events + + /// <summary> + /// DefaultImageEvent handler + /// </summary> + public delegate void DefaultImageEventHandler(object sender, DefaultImageEventArgs e); + + ///<summary> + ///ProcessFileEvent handler + ///</summary> + public delegate void ProcessFileEventHandler(object sender, ProcessFileEventArgs e); + + ///<summary> + ///Enable the caller to prevent a file resource from being compressed during a capture. + ///</summary> + public event ProcessFileEventHandler ProcessFileEvent; + + ///<summary> + ///Indicate an update in the progress of an image application. + ///</summary> + public event DefaultImageEventHandler ProgressEvent; + + ///<summary> + ///Alert the caller that an error has occurred while capturing or applying an image. + ///</summary> + public event DefaultImageEventHandler ErrorEvent; + + ///<summary> + ///Indicate that a file has been either captured or applied. + ///</summary> + public event DefaultImageEventHandler StepItEvent; + + ///<summary> + ///Indicate the number of files that will be captured or applied. + ///</summary> + public event DefaultImageEventHandler SetRangeEvent; + + ///<summary> + ///Indicate the number of files that have been captured or applied. + ///</summary> + public event DefaultImageEventHandler SetPosEvent; + + #endregion Events + + private + enum + ImageEventMessage : uint + { + ///<summary> + ///Enables the caller to prevent a file or a directory from being captured or applied. + ///</summary> + Progress = NativeMethods.WimMessage.WIM_MSG_PROGRESS, + ///<summary> + ///Notification sent to enable the caller to prevent a file or a directory from being captured or applied. + ///To prevent a file or a directory from being captured or applied, call WindowsImageContainer.SkipFile(). + ///</summary> + Process = NativeMethods.WimMessage.WIM_MSG_PROCESS, + ///<summary> + ///Enables the caller to prevent a file resource from being compressed during a capture. + ///</summary> + Compress = NativeMethods.WimMessage.WIM_MSG_COMPRESS, + ///<summary> + ///Alerts the caller that an error has occurred while capturing or applying an image. + ///</summary> + Error = NativeMethods.WimMessage.WIM_MSG_ERROR, + ///<summary> + ///Enables the caller to align a file resource on a particular alignment boundary. + ///</summary> + Alignment = NativeMethods.WimMessage.WIM_MSG_ALIGNMENT, + ///<summary> + ///Enables the caller to align a file resource on a particular alignment boundary. + ///</summary> + Split = NativeMethods.WimMessage.WIM_MSG_SPLIT, + ///<summary> + ///Indicates that volume information is being gathered during an image capture. + ///</summary> + Scanning = NativeMethods.WimMessage.WIM_MSG_SCANNING, + ///<summary> + ///Indicates the number of files that will be captured or applied. + ///</summary> + SetRange = NativeMethods.WimMessage.WIM_MSG_SETRANGE, + ///<summary> + ///Indicates the number of files that have been captured or applied. + /// </summary> + SetPos = NativeMethods.WimMessage.WIM_MSG_SETPOS, + ///<summary> + ///Indicates that a file has been either captured or applied. + ///</summary> + StepIt = NativeMethods.WimMessage.WIM_MSG_STEPIT, + ///<summary> + ///Success. + ///</summary> + Success = NativeMethods.WimMessage.WIM_MSG_SUCCESS, + ///<summary> + ///Abort. + ///</summary> + Abort = NativeMethods.WimMessage.WIM_MSG_ABORT_IMAGE + } + + ///<summary> + ///Event callback to the Wimgapi events + ///</summary> + private + uint + ImageEventMessagePump( + uint MessageId, + IntPtr wParam, + IntPtr lParam, + IntPtr UserData) + { + + uint status = (uint) NativeMethods.WimMessage.WIM_MSG_SUCCESS; + + DefaultImageEventArgs eventArgs = new DefaultImageEventArgs(wParam, lParam, UserData); + + switch ((ImageEventMessage)MessageId) + { + + case ImageEventMessage.Progress: + ProgressEvent(this, eventArgs); + break; + + case ImageEventMessage.Process: + if (null != ProcessFileEvent) + { + string fileToImage = Marshal.PtrToStringUni(wParam); + ProcessFileEventArgs fileToProcess = new ProcessFileEventArgs(fileToImage, lParam); + ProcessFileEvent(this, fileToProcess); + + if (fileToProcess.Abort == true) + { + status = (uint)ImageEventMessage.Abort; + } + } + break; + + case ImageEventMessage.Error: + if (null != ErrorEvent) + { + ErrorEvent(this, eventArgs); + } + break; + + case ImageEventMessage.SetRange: + if (null != SetRangeEvent) + { + SetRangeEvent(this, eventArgs); + } + break; + + case ImageEventMessage.SetPos: + if (null != SetPosEvent) + { + SetPosEvent(this, eventArgs); + } + break; + + case ImageEventMessage.StepIt: + if (null != StepItEvent) + { + StepItEvent(this, eventArgs); + } + break; + + default: + break; + } + return status; + + } + + /// <summary> + /// Constructor. + /// </summary> + /// <param name="wimPath">Path to the WIM container.</param> + public + WimFile(string wimPath) + { + if (string.IsNullOrEmpty(wimPath)) + { + throw new ArgumentNullException("wimPath"); + } + + if (!File.Exists(Path.GetFullPath(wimPath))) + { + throw new FileNotFoundException((new FileNotFoundException()).Message, wimPath); + } + + Handle = new NativeMethods.WimFileHandle(wimPath); + + // Hook up the events before we return. + //wimMessageCallback = new NativeMethods.WimMessageCallback(ImageEventMessagePump); + //NativeMethods.RegisterMessageCallback(this.Handle, wimMessageCallback); + } + + /// <summary> + /// Closes the WIM file. + /// </summary> + public void + Close() + { + foreach (WimImage image in Images) + { + image.Close(); + } + + if (null != wimMessageCallback) + { + NativeMethods.UnregisterMessageCallback(this.Handle, wimMessageCallback); + wimMessageCallback = null; + } + + if ((!Handle.IsClosed) && (!Handle.IsInvalid)) + { + Handle.Close(); + } + } + + /// <summary> + /// Provides a list of WimImage objects, representing the images in the WIM container file. + /// </summary> + public List<WimImage> + Images + { + get + { + if (null == m_imageList) + { + + int imageCount = (int)ImageCount; + m_imageList = new List<WimImage>(imageCount); + for (int i = 0; i < imageCount; i++) + { + + // Load up each image so it's ready for us. + m_imageList.Add( + new WimImage(this, (uint)i + 1)); + } + } + + return m_imageList; + } + } + + /// <summary> + /// Provides a list of names of the images in the specified WIM container file. + /// </summary> + public List<string> + ImageNames + { + get + { + List<string> nameList = new List<string>(); + foreach (WimImage image in Images) + { + nameList.Add(image.ImageName); + } + return nameList; + } + } + + /// <summary> + /// Indexer for WIM images inside the WIM container, indexed by the image number. + /// The list of Images is 0-based, but the WIM container is 1-based, so we automatically compensate for that. + /// this[1] returns the 0th image in the WIM container. + /// </summary> + /// <param name="ImageIndex">The 1-based index of the image to retrieve.</param> + /// <returns>WinImage object.</returns> + public WimImage + this[int ImageIndex] + { + get { return Images[ImageIndex - 1]; } + } + + /// <summary> + /// Indexer for WIM images inside the WIM container, indexed by the image name. + /// WIMs created by different processes sometimes contain different information - including the name. + /// Some images have their name stored in the Name field, some in the Flags field, and some in the EditionID field. + /// We take all of those into account in while searching the WIM. + /// </summary> + /// <param name="ImageName"></param> + /// <returns></returns> + public WimImage + this[string ImageName] + { + get + { + return + Images.Where(i => ( + i.ImageName.ToUpper() == ImageName.ToUpper() || + i.ImageFlags.ToUpper() == ImageName.ToUpper() )) + .DefaultIfEmpty(null) + .FirstOrDefault<WimImage>(); + } + } + + /// <summary> + /// Returns the number of images in the WIM container. + /// </summary> + internal uint + ImageCount + { + get { return NativeMethods.WimGetImageCount(Handle); } + } + + /// <summary> + /// Returns an XDocument representation of the XML metadata for the WIM container and associated images. + /// </summary> + internal XDocument + XmlInfo + { + get + { + + if (null == m_xmlInfo) + { + StringBuilder builder; + uint bytes; + if (!NativeMethods.WimGetImageInformation(Handle, out builder, out bytes)) + { + throw new Win32Exception(); + } + + // Ensure the length of the returned bytes to avoid garbage characters at the end. + int charCount = (int)bytes / sizeof(char); + if (null != builder) + { + // Get rid of the unicode file marker at the beginning of the XML. + builder.Remove(0, 1); + builder.EnsureCapacity(charCount - 1); + builder.Length = charCount - 1; + + // This isn't likely to change while we have the image open, so cache it. + m_xmlInfo = XDocument.Parse(builder.ToString().Trim()); + } + else + { + m_xmlInfo = null; + } + } + + return m_xmlInfo; + } + } + + public NativeMethods.WimFileHandle Handle + { + get; + private set; + } +} + +public class +WimImage +{ + + internal XDocument m_xmlInfo; + + public + WimImage( + WimFile Container, + uint ImageIndex) + { + + if (null == Container) + { + throw new ArgumentNullException("Container"); + } + + if ((Container.Handle.IsClosed) || (Container.Handle.IsInvalid)) + { + throw new ArgumentNullException("The handle to the WIM file has already been closed, or is invalid.", "Container"); + } + + if (ImageIndex > Container.ImageCount) + { + throw new ArgumentOutOfRangeException("ImageIndex", "The index does not exist in the specified WIM file."); + } + + Handle = new NativeMethods.WimImageHandle(Container, ImageIndex); + } + + public enum + Architectures : uint + { + x86 = 0x0, + ARM = 0x5, + IA64 = 0x6, + AMD64 = 0x9, + ARM64 = 0xC + } + + public void + Close() + { + if ((!Handle.IsClosed) && (!Handle.IsInvalid)) + { + Handle.Close(); + } + } + + public NativeMethods.WimImageHandle + Handle + { + get; + private set; + } + + internal XDocument + XmlInfo + { + get + { + + if (null == m_xmlInfo) + { + StringBuilder builder; + uint bytes; + if (!NativeMethods.WimGetImageInformation(Handle, out builder, out bytes)) + { + throw new Win32Exception(); + } + + // Ensure the length of the returned bytes to avoid garbage characters at the end. + int charCount = (int)bytes / sizeof(char); + if (null != builder) + { + // Get rid of the unicode file marker at the beginning of the XML. + builder.Remove(0, 1); + builder.EnsureCapacity(charCount - 1); + builder.Length = charCount - 1; + + // This isn't likely to change while we have the image open, so cache it. + m_xmlInfo = XDocument.Parse(builder.ToString().Trim()); + } + else + { + m_xmlInfo = null; + } + } + + return m_xmlInfo; + } + } + + public string + ImageIndex + { + get { return XmlInfo.Element("IMAGE").Attribute("INDEX").Value; } + } + + public string + ImageName + { + get { return XmlInfo.XPathSelectElement("/IMAGE/NAME").Value; } + } + + public string + ImageEditionId + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/EDITIONID").Value; } + } + + public string + ImageFlags + { + get + { + string flagValue = String.Empty; + + try + { + flagValue = XmlInfo.XPathSelectElement("/IMAGE/FLAGS").Value; + } + catch + { + + // Some WIM files don't contain a FLAGS element in the metadata. + // In an effort to support those WIMs too, inherit the EditionId if there + // are no Flags. + + if (String.IsNullOrEmpty(flagValue)) + { + flagValue = this.ImageEditionId; + + // Check to see if the EditionId is "ServerHyper". If so, + // tweak it to be "ServerHyperCore" instead. + + if (0 == String.Compare("serverhyper", flagValue, true)) + { + flagValue = "ServerHyperCore"; + } + } + + } + + return flagValue; + } + } + + public string + ImageProductType + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/PRODUCTTYPE").Value; } + } + + public string + ImageInstallationType + { + get { return XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/INSTALLATIONTYPE").Value; } + } + + public string + ImageDescription + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DESCRIPTION").Value; } + } + + public ulong + ImageSize + { + get { return ulong.Parse(XmlInfo.XPathSelectElement("/IMAGE/TOTALBYTES").Value); } + } + + public Architectures + ImageArchitecture + { + get + { + int arch = -1; + try + { + arch = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/ARCH").Value); + } + catch { } + + return (Architectures)arch; + } + } + + public string + ImageDefaultLanguage + { + get + { + string lang = null; + try + { + lang = XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/LANGUAGES/DEFAULT").Value; + } + catch { } + + return lang; + } + } + + public Version + ImageVersion + { + get + { + int major = 0; + int minor = 0; + int build = 0; + int revision = 0; + + try + { + major = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/MAJOR").Value); + minor = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/MINOR").Value); + build = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/BUILD").Value); + revision = int.Parse(XmlInfo.XPathSelectElement("/IMAGE/WINDOWS/VERSION/SPBUILD").Value); + } + catch { } + + return (new Version(major, minor, build, revision)); + } + } + + public string + ImageDisplayName + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DISPLAYNAME").Value; } + } + + public string + ImageDisplayDescription + { + get { return XmlInfo.XPathSelectElement("/IMAGE/DISPLAYDESCRIPTION").Value; } + } +} + +///<summary> +///Describes the file that is being processed for the ProcessFileEvent. +///</summary> +public class +DefaultImageEventArgs : EventArgs +{ + ///<summary> + ///Default constructor. + ///</summary> + public + DefaultImageEventArgs( + IntPtr wideParameter, + IntPtr leftParameter, + IntPtr userData) + { + + WideParameter = wideParameter; + LeftParameter = leftParameter; + UserData = userData; + } + + ///<summary> + ///wParam + ///</summary> + public IntPtr WideParameter + { + get; + private set; + } + + ///<summary> + ///lParam + ///</summary> + public IntPtr LeftParameter + { + get; + private set; + } + + ///<summary> + ///UserData + ///</summary> + public IntPtr UserData + { + get; + private set; + } +} + +///<summary> +///Describes the file that is being processed for the ProcessFileEvent. +///</summary> +public class +ProcessFileEventArgs : EventArgs +{ + ///<summary> + ///Default constructor. + ///</summary> + ///<param name="file">Fully qualified path and file name. For example: c:\file.sys.</param> + ///<param name="skipFileFlag">Default is false - skip file and continue. + ///Set to true to abort the entire image capture.</param> + public + ProcessFileEventArgs( + string file, + IntPtr skipFileFlag) + { + + m_FilePath = file; + m_SkipFileFlag = skipFileFlag; + } + + ///<summary> + ///Skip file from being imaged. + ///</summary> + public void + SkipFile() + { + byte[] byteBuffer = + { + 0 + }; + int byteBufferSize = byteBuffer.Length; + Marshal.Copy(byteBuffer, 0, m_SkipFileFlag, byteBufferSize); + } + + ///<summary> + ///Fully qualified path and file name. + ///</summary> + public string + FilePath + { + get + { + string stringToReturn = ""; + if (m_FilePath != null) + { + stringToReturn = m_FilePath; + } + return stringToReturn; + } + } + + ///<summary> + ///Flag to indicate if the entire image capture should be aborted. + ///Default is false - skip file and continue. Setting to true will + ///abort the entire image capture. + ///</summary> + public bool Abort + { + set { m_Abort = value; } + get { return m_Abort; } + } + + private string m_FilePath; + private bool m_Abort; + private IntPtr m_SkipFileFlag; + +} + +#endregion WIM Interop + +#region VHD Interop +// Based on code written by the Hyper-V Test team. +/// <summary> +/// The Virtual Hard Disk class provides methods for creating and manipulating Virtual Hard Disk files. +/// </summary> +public class +VirtualHardDisk +{ + #region Static Methods + + #region Sparse Disks + + /// <summary> + /// Abbreviated signature of CreateSparseDisk so it's easier to use from WIM2VHD. + /// </summary> + /// <param name="virtualStorageDeviceType">The type of disk to create, VHD or VHDX.</param> + /// <param name="path">The path of the disk to create.</param> + /// <param name="size">The maximum size of the disk to create.</param> + /// <param name="overwrite">Overwrite the VHD if it already exists.</param> + public static void + CreateSparseDisk( + NativeMethods.VirtualStorageDeviceType virtualStorageDeviceType, + string path, + ulong size, + bool overwrite) + { + + CreateSparseDisk( + path, + size, + overwrite, + null, + IntPtr.Zero, + (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.DEFAULT_BLOCK_SIZE + : 0, + virtualStorageDeviceType, + NativeMethods.DISK_SECTOR_SIZE); + } + + /// <summary> + /// Creates a new sparse (dynamically expanding) virtual hard disk (.vhd). Supports both sync and async modes. + /// The VHD image file uses only as much space on the backing store as needed to store the actual data the VHD currently contains. + /// </summary> + /// <param name="path">The path and name of the VHD to create.</param> + /// <param name="size">The size of the VHD to create in bytes. + /// When creating this type of VHD, the VHD API does not test for free space on the physical backing store based on the maximum size requested, + /// therefore it is possible to successfully create a dynamic VHD with a maximum size larger than the available physical disk free space. + /// The maximum size of a dynamic VHD is 2,040 GB. The minimum size is 3 MB.</param> + /// <param name="source">Optional path to pre-populate the new virtual disk object with block data from an existing disk + /// This path may refer to a VHD or a physical disk. Use NULL if you don't want a source.</param> + /// <param name="overwrite">If the VHD exists, setting this parameter to 'True' will delete it and create a new one.</param> + /// <param name="overlapped">If not null, the operation runs in async mode</param> + /// <param name="blockSizeInBytes">Block size for the VHD.</param> + /// <param name="virtualStorageDeviceType">VHD format version (VHD1 or VHD2)</param> + /// <param name="sectorSizeInBytes">Sector size for the VHD.</param> + /// <exception cref="ArgumentOutOfRangeException">Thrown when an invalid size is specified</exception> + /// <exception cref="FileNotFoundException">Thrown when source VHD is not found.</exception> + /// <exception cref="SecurityException">Thrown when there was an error while creating the default security descriptor.</exception> + /// <exception cref="Win32Exception">Thrown when an error occurred while creating the VHD.</exception> + public static void + CreateSparseDisk( + string path, + ulong size, + bool overwrite, + string source, + IntPtr overlapped, + uint blockSizeInBytes, + NativeMethods.VirtualStorageDeviceType virtualStorageDeviceType, + uint sectorSizeInBytes) + { + + // Validate the virtualStorageDeviceType + if (virtualStorageDeviceType != NativeMethods.VirtualStorageDeviceType.VHD && virtualStorageDeviceType != NativeMethods.VirtualStorageDeviceType.VHDX) + { + + throw ( + new ArgumentOutOfRangeException( + "virtualStorageDeviceType", + virtualStorageDeviceType, + "VirtualStorageDeviceType must be VHD or VHDX." + )); + } + + // Validate size. It needs to be a multiple of DISK_SECTOR_SIZE (512)... + if ((size % NativeMethods.DISK_SECTOR_SIZE) != 0) + { + + throw ( + new ArgumentOutOfRangeException( + "size", + size, + "The size of the virtual disk must be a multiple of 512." + )); + } + + if ((!String.IsNullOrEmpty(source)) && (!System.IO.File.Exists(source))) + { + + throw ( + new System.IO.FileNotFoundException( + "Unable to find the source file.", + source + )); + } + + if ((overwrite) && (System.IO.File.Exists(path))) + { + + System.IO.File.Delete(path); + } + + NativeMethods.CreateVirtualDiskParameters createParams = new NativeMethods.CreateVirtualDiskParameters(); + + // Select the correct version. + createParams.Version = (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.CreateVirtualDiskVersion.Version1 + : NativeMethods.CreateVirtualDiskVersion.Version2; + + createParams.UniqueId = Guid.NewGuid(); + createParams.MaximumSize = size; + createParams.BlockSizeInBytes = blockSizeInBytes; + createParams.SectorSizeInBytes = sectorSizeInBytes; + createParams.ParentPath = null; + createParams.SourcePath = source; + createParams.OpenFlags = NativeMethods.OpenVirtualDiskFlags.None; + createParams.GetInfoOnly = false; + createParams.ParentVirtualStorageType = new NativeMethods.VirtualStorageType(); + createParams.SourceVirtualStorageType = new NativeMethods.VirtualStorageType(); + + // + // Create and init a security descriptor. + // Since we're creating an essentially blank SD to use with CreateVirtualDisk + // the VHD will take on the security values from the parent directory. + // + + NativeMethods.SecurityDescriptor securityDescriptor; + if (!NativeMethods.InitializeSecurityDescriptor(out securityDescriptor, 1)) + { + + throw ( + new SecurityException( + "Unable to initialize the security descriptor for the virtual disk." + )); + } + + NativeMethods.VirtualStorageType virtualStorageType = new NativeMethods.VirtualStorageType(); + virtualStorageType.DeviceId = virtualStorageDeviceType; + virtualStorageType.VendorId = NativeMethods.VirtualStorageTypeVendorMicrosoft; + + SafeFileHandle vhdHandle; + + uint returnCode = NativeMethods.CreateVirtualDisk( + ref virtualStorageType, + path, + (virtualStorageDeviceType == NativeMethods.VirtualStorageDeviceType.VHD) + ? NativeMethods.VirtualDiskAccessMask.All + : NativeMethods.VirtualDiskAccessMask.None, + ref securityDescriptor, + NativeMethods.CreateVirtualDiskFlags.None, + 0, + ref createParams, + overlapped, + out vhdHandle); + + vhdHandle.Close(); + + if (NativeMethods.ERROR_SUCCESS != returnCode && NativeMethods.ERROR_IO_PENDING != returnCode) + { + + throw ( + new Win32Exception( + (int)returnCode + )); + } + } + + #endregion Sparse Disks + + #endregion Static Methods + +} +#endregion VHD Interop +} +"@ +Add-Type -TypeDefinition $code -ReferencedAssemblies 'System.Xml', 'System.Linq', 'System.Xml.Linq' \ No newline at end of file diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/WindowsImageTools.psd1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/WindowsImageTools.psd1 new file mode 100644 index 0000000..cafb822 --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/WindowsImageTools.psd1 @@ -0,0 +1,132 @@ +# +# Module manifest for module 'WindowsImageTools' +# +# Generated by: David Jones +# +# Generated on: 8/18/2015 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = '.\WindowsImageTools.psm1' + +# Version number of this module. +ModuleVersion = '1.0.7' + +# ID used to uniquely identify this module +GUID = '6210674e-8cfa-4f61-a2fb-c54fd7ffcba1' + +# Author of this module +Author = 'David Jones' + +# Company or vendor of this module +CompanyName = 'BladeFireLight' + +# Copyright statement for this module +Copyright = '2015' + +# Description of the functionality provided by this module +Description = 'Tools for creating bootable virtual disks from an ISO or WIM' + +# Minimum version of the Windows PowerShell engine required by this module +# PowerShellVersion = '' + +# Name of the Windows PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the Windows PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module +# DotNetFrameworkVersion = '' + +# Minimum version of the common language runtime (CLR) required by this module +# CLRVersion = '' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +# RequiredModules = @('storage') + +# Assemblies that must be loaded prior to importing this module +# RequiredAssemblies = @() + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +# NestedModules = @() + +# Functions to export from this module +FunctionsToExport = 'Convert-Wim2VHD', + 'Initialize-VHDPartition', + 'Set-VHDPartition', + 'New-UnattendXml', + 'New-WindowsImageToolsExample', + 'Set-UpdateConfig', + 'Get-UpdateConfig', + 'Add-UpdateImage', + 'Update-WindowsImageWMF', + 'Invoke-WindowsImageUpdate', + 'Invoke-CreateVmRunAndWait', + 'Mount-VhdAndRunBlock', + 'Get-VhdPartitionStyle' + +# Cmdlets to export from this module +# CmdletsToExport = '*' + +# Variables to export from this module +# VariablesToExport = '*' + +# Aliases to export from this module +# AliasesToExport = '*' + +# DSC resources to export from this module +# DscResourcesToExport = @() + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('WIM', 'VHDX') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/BladeFireLight/WindowsImageTools/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/BladeFireLight/WindowsImageTools' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + ReleaseNotes = 'Fixed but with BCDBoot ran fine but PowerShell thought it threw and error' + + } # End of PSData hashtable + +} # End of PrivateData hashtable + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + +} + diff --git a/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/WindowsImageTools.psm1 b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/WindowsImageTools.psm1 new file mode 100644 index 0000000..914a6aa --- /dev/null +++ b/deployment/dsc/azshcihost/WindowsImageTools/1.0.7/WindowsImageTools.psm1 @@ -0,0 +1,42 @@ +#requires -RunAsAdministrator + +# Check for New-VHD +$VHDCmdlets = $true +if (-not (Get-Module -Name hyper-v -ListAvailable)) +{ + $VHDCmdlets = $false + Write-Warning -Message '[Module : WindowsImageTools] Hyper-V Module Not Installed: ' +} +if ([environment]::OSVersion.Version.Major -ge 10 -and +(Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Services).state -eq 'Disabled') +{ + $VHDCmdlets = $false + Write-Warning -Message '[Module : WindowsImageTools] Hyper-v Services on windows 10 not installed' +} + +if (-not ($VHDCmdlets)) +{ + Write-Warning -Message '[Module : WindowsImageTools] *-VHD cmdlets not avalible ' + Write-Warning -Message ' Loading WIN2VHD Class' + . $PSScriptRoot\Functions\Wim2VHDClass.ps1 + Write-Warning -Message ' Windows Image Update function not loaded' +} + +# Import Basic functions +. $PSScriptRoot\Functions\HelperFunctions.ps1 +. $PSScriptRoot\Functions\Convert-Wim2VHD.ps1 +. $PSScriptRoot\Functions\Initialize-VHDPartition.ps1 +. $PSScriptRoot\Functions\Set-VHDPartition.ps1 +. $PSScriptRoot\Functions\New-Unattend.ps1 + +if ($VHDCmdlets) #only import if depended functions avalible +{ + . $PSScriptRoot\Functions\New-WindowsImageToolsExample.ps1 + . $PSScriptRoot\Functions\Set-UpdateConfig.ps1 + . $PSScriptRoot\Functions\Add-UpdateImage.ps1 + . $PSScriptRoot\Functions\Update-WindowsImageWMF.ps1 + . $PSScriptRoot\Functions\Invoke-WindowsImageUpdate.ps1 + . $PSScriptRoot\Functions\Mount-VhdAndRunBlock.ps1 + . $PSScriptRoot\Functions\Invoke-CreateVmRunAndWait.ps1 + . $PSScriptRoot\Functions\Get-VhdPartitionStyle.ps1 +} diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorBuild.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorBuild.ps1 new file mode 100644 index 0000000..16a67ee --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorBuild.ps1 @@ -0,0 +1,32 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#---------------------------------# +# Header # +#---------------------------------# +Write-Host 'Running AppVeyor build script' -ForegroundColor Yellow +Write-Host "ModuleName : $env:ModuleName" +Write-Host "Build version : $env:APPVEYOR_BUILD_VERSION" +Write-Host "Author : $env:APPVEYOR_REPO_COMMIT_AUTHOR" +Write-Host "Branch : $env:APPVEYOR_REPO_BRANCH" +Write-Host "Repo : $env:APPVEYOR_REPO_NAME" +Write-Host "PSModulePath :" + +$env:PSModulePath -split ';' + +#---------------------------------# +# BuildScript # +#---------------------------------# +Write-Host 'Nothing to build, skipping.....' diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorDeploy.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorDeploy.ps1 new file mode 100644 index 0000000..5cb1715 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorDeploy.ps1 @@ -0,0 +1,45 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#---------------------------------# +# Header # +#---------------------------------# +Write-Host 'Running AppVeyor deploy script' -ForegroundColor Yellow + +#---------------------------------# +# Update module manifest # +#---------------------------------# +Write-Host 'Creating new module manifest' + +$ModuleManifestPath = Join-Path -path "$pwd" -ChildPath ("$env:ModuleName"+'.psd1') +$ModuleManifest = Get-Content $ModuleManifestPath -Raw + +Write-Host "Updating module manifest to version: $env:APPVEYOR_BUILD_VERSION" +[regex]::replace($ModuleManifest,'(ModuleVersion = )(.*)',"`$1'$env:APPVEYOR_BUILD_VERSION'") | Out-File -LiteralPath $ModuleManifestPath + +#---------------------------------# +# Publish to PS Gallery # +#---------------------------------# + +if ( ($env:APPVEYOR_REPO_NAME -notmatch 'chocolatey') -or (!$env:APPVEYOR_REPO_TAG_NAME) ) +{ + Write-Host "Finished testing of branch: $env:APPVEYOR_REPO_BRANCH - Exiting" + exit; +} + +Write-Host "Publishing module to Powershell Gallery: " +Publish-Module -Name $env:ModuleName -NuGetApiKey $env:nugetKey + +Write-Host 'Done!' -ForegroundColor Green diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorInstall.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorInstall.ps1 new file mode 100644 index 0000000..1ce33ea --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorInstall.ps1 @@ -0,0 +1,57 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#---------------------------------# +# Header # +#---------------------------------# +Write-Host 'Running AppVeyor install script' -ForegroundColor Yellow + +#---------------------------------# +# Enable TLS 1.2 # +#---------------------------------# +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 + +#---------------------------------# +# Install NuGet # +#---------------------------------# +Write-Host 'Installing NuGet PackageProvider' +$pkg = Install-PackageProvider -Name NuGet -Force -ErrorAction Stop +Write-Host "Installed NuGet version '$($pkg.version)'" + +#---------------------------------# +# Install Modules # +#---------------------------------# +[version]$ScriptAnalyzerVersion = '1.8.1' +[version]$PesterVersion = '4.10.1' +Install-Module -Name 'PSScriptAnalyzer' -Repository PSGallery -Force -ErrorAction Stop -MaximumVersion $ScriptAnalyzerVersion +Install-Module -Name 'Pester' -SkipPublisherCheck -Repository PSGallery -Force -ErrorAction Stop -MaximumVersion $PesterVersion +Install-Module -Name 'xDSCResourceDesigner' -Repository PSGallery -Force -ErrorAction Stop + +#---------------------------------# +# Update PSModulePath # +#---------------------------------# +Write-Host 'Updating PSModulePath for DSC resource testing' +$env:PSModulePath = $env:PSModulePath + ";" + "C:\projects" + +#---------------------------------# +# Validate # +#---------------------------------# +$RequiredModules = 'PSScriptAnalyzer','Pester','xDSCResourceDesigner' +$InstalledModules = Get-Module -Name $RequiredModules -ListAvailable +if ( ($InstalledModules.count -lt $RequiredModules.Count) -or ($Null -eq $InstalledModules)) { + throw "Required modules are missing." +} else { + Write-Host 'All modules required found' -ForegroundColor Green +} diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorTest.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorTest.ps1 new file mode 100644 index 0000000..01acf24 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/AppVeyor/AppVeyorTest.ps1 @@ -0,0 +1,43 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#---------------------------------# +# Header # +#---------------------------------# +Write-Host 'Running AppVeyor test script' -ForegroundColor Yellow +Write-Host "Current working directory: $pwd" + +#---------------------------------# +# Run Pester Tests # +#---------------------------------# +$resultsFile = '.\TestsResults.xml' +$testFiles = Get-ChildItem "$pwd\tests" | Where-Object {$_.FullName -match 'Tests.ps1$'} | Select-Object -ExpandProperty FullName +$results = Invoke-Pester -Script $testFiles -OutputFormat NUnitXml -OutputFile $resultsFile -PassThru + +Write-Host 'Uploading results' +try { + (New-Object 'System.Net.WebClient').UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path $resultsFile)) +} catch { + throw "Upload failed." +} + +#---------------------------------# +# Validate # +#---------------------------------# +if (($results.FailedCount -gt 0) -or ($results.PassedCount -eq 0) -or ($null -eq $results)) { + throw "$($results.FailedCount) tests failed." +} else { + Write-Host 'All tests passed' -ForegroundColor Green +} diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoConfig/cChocoConfig.psm1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoConfig/cChocoConfig.psm1 new file mode 100644 index 0000000..bf0bd6e --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoConfig/cChocoConfig.psm1 @@ -0,0 +1,188 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +<# +.Description +Returns the configuration for cChocoConfig. + +.Example +Get-TargetResource -ConfigName cacheLocation -Ensure 'Present' -Value 'c:\temp\choco' +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([Hashtable])] + param + ( + [parameter(Mandatory = $true)] + [string] + $ConfigName, + + [ValidateSet('Present','Absent')] + [string] + $Ensure='Present', + + [parameter(Mandatory = $false)] + [string] + $Value + ) + + Write-Verbose "Starting cChocoConfig Get-TargetResource - Config Name: $ConfigName, Ensure: $Ensure" + + $returnValue = @{ + ConfigName = $ConfigName + Ensure = $Ensure + Value = $Value + } + + $returnValue + +} + +<# +.Description +Performs the set for the cChocoConfig resource. + +.Example +Set-TargetResource -ConfigName cacheLocation -Ensure 'Present' -Value 'c:\temp\choco' + +#> +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess=$true)] + param + ( + [parameter(Mandatory = $true)] + [string] + $ConfigName, + + [ValidateSet('Present','Absent')] + [string] + $Ensure='Present', + + [parameter(Mandatory = $false)] + [string] + $Value + ) + + + Write-Verbose "Starting cChocoConfig Set-TargetResource - Config Name: $ConfigName, Ensure: $Ensure" + + if ($pscmdlet.ShouldProcess("Choco config $ConfigName will be ensured $Ensure.")) + { + if ($Ensure -eq 'Present') + { + Write-Verbose "Setting choco config $ConfigName." + choco config set --name "'$ConfigName'" --value "'$Value'" + } + else + { + Write-Verbose "Unsetting choco config $ConfigName." + choco config unset --name "'$ConfigName'" + } + } + +} + +<# +.Description +Performs the test for cChocoFeature. + +.Example +Test-TargetResource -ConfigName cacheLocation -Ensure 'Present' -Value 'c:\temp\choco' +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([Boolean])] + param + ( + [parameter(Mandatory = $true)] + [string] + $ConfigName, + + [ValidateSet('Present','Absent')] + [string] + $Ensure='Present', + + [parameter(Mandatory = $false)] + [string] + $Value + ) + + Write-Verbose "Starting cChocoConfig Test-TargetResource - Config Name: $ConfigName, Ensure: $Ensure." + + # validate value is given when ensure present + if ($Ensure -eq 'Present' -and (-not $PSBoundParameters.ContainsKey('Value') -or [String]::IsNullOrEmpty($Value))) { + throw "Missing parameter 'Value' when ensuring config is present!" + } + + if($env:ChocolateyInstall -eq "" -or $null -eq $env:ChocolateyInstall) + { + $command = Get-Command -Name choco.exe -ErrorAction SilentlyContinue + + if(!$command) { + throw "Unable to find choco.exe. Please make sure Chocolatey is installed correctly." + } + + $chocofolder = Split-Path $command.Source + + if( $chocofolder.EndsWith("bin") ) + { + $chocofolder = Split-Path $chocofolder + } + } + else + { + $chocofolder = $env:ChocolateyInstall + } + + if(!(Get-Item -Path $chocofolder -ErrorAction SilentlyContinue)) { + throw "Unable to find Chocolatey installation folder. Please make sure Chocolatey is installed and configured properly." + } + + $configfolder = Join-Path -Path $chocofolder -ChildPath "config" + $configfile = Get-ChildItem -Path $configfolder | Where-Object {$_.Name -match "chocolatey.config$"} + + if(!(Get-Item -Path $configfile.FullName -ErrorAction SilentlyContinue)) { + throw "Unable to find Chocolatey config file. Please make sure Chocolatey is installed and configured properly." + } + + # There is currently no choco command that only returns the settings in an CSV format. + # choco config list -r shows settings, sources, features and a note about API keys. + $xml = [xml](Get-Content -Path $configfile.FullName) + $settings = $xml.chocolatey.config.add + foreach($setting in $settings) + { + # If the config name matches and it should be present, check the value and + # if it matches it returns true. + if($setting.key -eq $ConfigName -and $Ensure -eq 'Present') + { + return ($setting.value -eq $Value) + } + # If the config name matches and it should be absent, check the value and + # if it is null or empty, return true + elseif($setting.key -eq $ConfigName -and $Ensure -eq 'Absent') + { + return ([String]::IsNullOrEmpty($setting.value)) + } + } + + # If we get this far, the configuraion item hasn't been found. + # There is currently no value, so return false if it should be present. + # True otherwise. + return !($Ensure -eq 'Present') +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoConfig/cChocoConfig.schema.mof b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoConfig/cChocoConfig.schema.mof new file mode 100644 index 0000000..0838843 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoConfig/cChocoConfig.schema.mof @@ -0,0 +1,9 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("cChocoConfig")] +class cChocoConfig : OMI_BaseResource +{ + [Key] String ConfigName; + [Write,ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [Write] String Value; +}; + diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoFeature/cChocoFeature.psm1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoFeature/cChocoFeature.psm1 new file mode 100644 index 0000000..716334f --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoFeature/cChocoFeature.psm1 @@ -0,0 +1,148 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +<# +.Description +Returns the configuration for cChocoFeature. + +.Example +Get-TargetResource -FeatureName allowGlobalConfirmation -Ensure 'Present' +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $FeatureName, + + [ValidateSet('Present','Absent')] + [System.String] + $Ensure='Present' + ) + + Write-Verbose "Starting cChocoFeature Get-TargetResource - Feature Name: $FeatureName, Ensure: $Ensure" + + $returnValue = @{ + FeatureName = $FeatureName + Ensure = $Ensure + } + + $returnValue + +} + +<# +.Description +Performs the set for the cChocoFeature resource. + +.Example +Get-TargetResource -FeatureName allowGlobalConfirmation -Ensure 'Present' + +#> +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess=$true)] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $FeatureName, + + [ValidateSet('Present','Absent')] + [string] + $Ensure='Present' + ) + + + Write-Verbose "Starting cChocoFeature Set-TargetResource - Feature Name: $FeatureName, Ensure: $Ensure." + + if ($pscmdlet.ShouldProcess("Choco feature $FeatureName will be ensured $Ensure.")) + { + if ($Ensure -eq 'Present') + { + Write-Verbose "Enabling choco feature $FeatureName." + choco feature enable -n $FeatureName + } + else + { + Write-Verbose "Disabling choco feature $FeatureName." + choco feature disable -n $FeatureName + } + } + +} + +<# +.Description +Performs the test for cChocoFeature. + +.Example +Test-TargetResource -FeatureName allowGlobalConfirmation -Ensure 'Present' +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $FeatureName, + + [ValidateSet('Present','Absent')] + [System.String] + $Ensure='Present' + ) + + Write-Verbose "Starting cChocoFeature Test-TargetResource - Feature Name: $FeatureName, Ensure: $Ensure." + + $result = $false + $feature = Get-ChocoFeature -FeatureName $FeatureName | Where-Object {$_.State -eq "Enabled"} + + if (($Ensure -eq 'Present' -and ([bool]$feature)) -or ($Ensure -eq 'Absent' -and !([bool]$feature))) + { + Write-Verbose "Test-TargetResource is true, $FeatureName is $Ensure." + $result = $true + } + else + { + Write-Verbose "Test-TargetResource is false, $FeatureName is not $Ensure." + } + + return $result + +} + +<# +.Description +Query chocolatey features. +#> +function Get-ChocoFeature +{ + [OutputType([PSCustomObject])] + param( + [string] + $FeatureName + ) + choco feature -r | ConvertFrom-Csv -Delimiter "|" -Header Name, State, Description | Where-Object {$_.Name -eq $FeatureName} +} + + + + +Export-ModuleMember -Function *-TargetResource + diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoFeature/cChocoFeature.schema.mof b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoFeature/cChocoFeature.schema.mof new file mode 100644 index 0000000..6b1c53a --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoFeature/cChocoFeature.schema.mof @@ -0,0 +1,8 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("cChocoFeature")] +class cChocoFeature : OMI_BaseResource +{ + [Key] String FeatureName; + [Write,ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; +}; + diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoInstaller/cChocoInstaller.psm1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoInstaller/cChocoInstaller.psm1 new file mode 100644 index 0000000..85e3bb2 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoInstaller/cChocoInstaller.psm1 @@ -0,0 +1,212 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +function Get-TargetResource +{ + [OutputType([hashtable])] + param + ( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string] + $InstallDir, + [parameter()] + [string] + $ChocoInstallScriptUrl = 'https://chocolatey.org/install.ps1' + ) + Write-Verbose 'Start Get-TargetResource' + + #Needs to return a hashtable that returns the current status of the configuration component + $Configuration = @{ + InstallDir = $env:ChocolateyInstall + ChocoInstallScriptUrl = $ChocoInstallScriptUrl + } + + Return $Configuration +} + +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess)] + param + ( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string] + $InstallDir, + + [parameter()] + [string] + $ChocoInstallScriptUrl = 'https://chocolatey.org/install.ps1' + ) + Write-Verbose 'Start Set-TargetResource' + $whatIfShouldProcess = $pscmdlet.ShouldProcess('Chocolatey', 'Download and Install') + if ($whatIfShouldProcess) { + Install-Chocolatey @PSBoundParameters + } +} + +function Test-TargetResource +{ + [OutputType([bool])] + param + ( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string] + $InstallDir, + [parameter()] + [string] + $ChocoInstallScriptUrl = 'https://chocolatey.org/install.ps1' + ) + + Write-Verbose 'Test-TargetResource' + if (-not (Test-ChocoInstalled)) + { + Write-Verbose 'Choco is not installed, calling set' + Return $false + } + + ##Test to see if the Install Directory is correct. + $env:ChocolateyInstall = [Environment]::GetEnvironmentVariable('ChocolateyInstall','Machine') + if(-not ($InstallDir -eq $env:ChocolateyInstall)) + { + Write-Verbose "Choco should be installed in $InstallDir but is installed to $env:ChocolateyInstall calling set" + Return $false + } + + Return $true +} + +function Test-ChocoInstalled +{ + Write-Verbose 'Test-ChocoInstalled' + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + + Write-Verbose "Env:Path contains: $env:Path" + if (Test-Command -command choco) + { + Write-Verbose 'YES - Choco is Installed' + return $true + } + + Write-Verbose "NO - Choco is not Installed" + return $false +} + +Function Test-Command +{ + Param ( + [string]$command = 'choco' + ) + Write-Verbose "Test-Command $command" + if (Get-Command -Name $command -ErrorAction SilentlyContinue) { + Write-Verbose "$command exists" + return $true + } else { + Write-Verbose "$command does NOT exist" + return $false + } +} + +#region - chocolately installer work arounds. Main issue is use of write-host +function global:Write-Host +{ + Param( + [Parameter(Mandatory,Position = 0)] + $Object, + [Switch] + $NoNewLine, + [ConsoleColor] + $ForegroundColor, + [ConsoleColor] + $BackgroundColor + ) + #Redirecting Write-Host -> Write-Verbose. + Write-Verbose $Object +} +#endregion + +function Get-FileDownload { + param ( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$url, + + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string]$file + ) + # Set security protocol preference to avoid the download error if the machine has disabled TLS 1.0 and SSLv3 + # See: https://chocolatey.org/install (Installing With Restricted TLS section) + # Since cChoco requires at least PowerShell 4.0, we have .NET 4.5 available, so we can use [System.Net.SecurityProtocolType] enum values by name. + $securityProtocolSettingsOriginal = [System.Net.ServicePointManager]::SecurityProtocol + [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 -bor [System.Net.SecurityProtocolType]::Tls11 -bor [System.Net.SecurityProtocolType]::Tls -bor [System.Net.SecurityProtocolType]::Ssl3 + + Write-Verbose "Downloading $url to $file" + $downloader = new-object -TypeName System.Net.WebClient + $downloader.DownloadFile($url, $file) + + [System.Net.ServicePointManager]::SecurityProtocol = $securityProtocolSettingsOriginal +} + +Function Install-Chocolatey { + [CmdletBinding()] + param + ( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string] + $InstallDir, + + [parameter()] + [string] + $ChocoInstallScriptUrl = 'https://chocolatey.org/install.ps1' + ) + Write-Verbose 'Install-Chocolatey' + + #Create install directory if it does not exist + If(-not (Test-Path -Path $InstallDir)) { + Write-Verbose "[ChocoInstaller] Creating $InstallDir" + New-Item -Path $InstallDir -ItemType Directory + } + + #Set permanent EnvironmentVariable + Write-Verbose 'Setting ChocolateyInstall environment variables' + [Environment]::SetEnvironmentVariable('ChocolateyInstall', $InstallDir, [EnvironmentVariableTarget]::Machine) + $env:ChocolateyInstall = [Environment]::GetEnvironmentVariable('ChocolateyInstall','Machine') + Write-Verbose "Env:ChocolateyInstall has $env:ChocolateyInstall" + + #Download an execute install script + $tempPath = Join-Path -Path $env:TEMP -ChildPath ([GUID]::NewGuid().ToString()) + New-Item -Path $tempPath -ItemType Directory | Out-Null + $file = Join-Path -Path $tempPath -ChildPath 'install.ps1' + Get-FileDownload -url $ChocoInstallScriptUrl -file $file + . $file + + #refresh after install + Write-Verbose 'Adding Choco to path' + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + if ($env:path -notlike "*$InstallDir*") { + $env:Path += ";$InstallDir" + } + + Write-Verbose "Env:Path has $env:path" + #InstallChoco $InstallDir + $Null = Choco + Write-Verbose 'Finish InstallChoco' +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoInstaller/cChocoInstaller.schema.mof b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoInstaller/cChocoInstaller.schema.mof new file mode 100644 index 0000000..aa9f332 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoInstaller/cChocoInstaller.schema.mof @@ -0,0 +1,6 @@ +[ClassVersion("1.0.0"), FriendlyName("cChocoInstaller")] +class cChocoInstaller : OMI_BaseResource +{ + [Key] string InstallDir; + [Write] string ChocoInstallScriptUrl; +}; \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstall/cChocoPackageInstall.psm1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstall/cChocoPackageInstall.psm1 new file mode 100644 index 0000000..3e9db12 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstall/cChocoPackageInstall.psm1 @@ -0,0 +1,553 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +function Get-TargetResource +{ + [OutputType([hashtable])] + param + ( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string] + $Name, + [ValidateNotNullOrEmpty()] + [string] + $Params, + [ValidateNotNullOrEmpty()] + [string] + $Version, + [ValidateNotNull()] + [string] + $MinimumVersion, + [ValidateNotNullOrEmpty()] + [string] + $Source + ) + + Write-Verbose -Message 'Start Get-TargetResource' + + if (-Not (Test-ChocoInstalled)) { + throw "cChocoPackageInstall requires Chocolatey to be installed, consider using cChocoInstaller with 'dependson' in dsc config" + } + + #Needs to return a hashtable that returns the current + #status of the configuration component + $Configuration = @{ + Name = $Name + Params = $Params + Version = $Version + Source = $Source + } + + return $Configuration +} + +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess)] + param + ( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string] + $Name, + [ValidateSet('Present','Absent')] + [string] + $Ensure='Present', + [ValidateNotNullOrEmpty()] + [string] + $Params, + [ValidateNotNullOrEmpty()] + [string] + $Version, + [ValidateNotNull()] + [string] + $MinimumVersion, + [string] + $Source, + [String] + $chocoParams, + [bool] + $AutoUpgrade = $false + ) + Write-Verbose -Message 'Start Set-TargetResource' + $isVersionPresent = $PSBoundParameters.ContainsKey('Version') + $isMinimumVersionPresent = $PSBoundParameters.ContainsKey('MinimumVersion') + if ($isVersionPresent -and $isMinimumVersionPresent ) { + throw "Cannot specify 'Version' and 'MinimumVersion' in the same configuration" + } + + if (-Not (Test-ChocoInstalled)) { + throw "cChocoPackageInstall requires Chocolatey to be installed, consider using cChocoInstaller with 'dependson' in dsc config" + } + + $isInstalled = IsPackageInstalled -pName $Name + + #Determine the correct package version to use get to desired state + if ($isVersionPresent -or $isMinimumVersionPresent) { + if ($isVersionPresent) { + $versionToInstall = $PSBoundParameters['Version'] + } + else { + $versionToInstall = $PSBoundParameters['MinimumVersion'] + } + } + + #Uninstall if Ensure is set to absent and the package is installed + if ($isInstalled) { + if ($Ensure -eq 'Absent') { + $whatIfShouldProcess = $pscmdlet.ShouldProcess("$Name", 'Remove Chocolatey package') + if ($whatIfShouldProcess) { + Write-Verbose -Message "Removing $Name as ensure is set to absent" + UninstallPackage -pName $Name -pParams $Params + } + } else { + $whatIfShouldProcess = $pscmdlet.ShouldProcess("$Name", 'Installing / upgrading package from Chocolatey') + if ($whatIfShouldProcess) { + if ($Version) { + Write-Verbose -Message "Uninstalling $Name due to version mis-match" + UninstallPackage -pName $Name -pParams $Params + Write-Verbose -Message "Re-Installing $Name with correct version $versionToInstall" + InstallPackage -pName $Name -pParams $Params -pVersion $versionToInstall -pSource $Source -cParams $chocoParams + } + elseif ($MinimumVersion) { + Write-Verbose -Message "Upgrading $Name because installed version is lower that the specified minimum" + $chocoParams += " --version='$versionToInstall'" + Upgrade-Package -pName $Name -pParams $Params -pSource $Source -cParams $chocoParams + } + elseif ($AutoUpgrade) { + Write-Verbose -Message "Upgrading $Name due to version mis-match" + Upgrade-Package -pName $Name -pParams $Params -pSource $Source -cParams $chocoParams + } + } + } + } else { + $whatIfShouldProcess = $pscmdlet.ShouldProcess("$Name", 'Install package from Chocolatey') + if ($whatIfShouldProcess) { + InstallPackage -pName $Name -pParams $Params -pVersion $versionToInstall -pSource $Source -cParams $chocoParams + } + } +} + +function Test-TargetResource +{ + [CmdletBinding(SupportsShouldProcess)] + [OutputType([bool])] + param + ( + [parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [string] + $Name, + [ValidateSet('Present','Absent')] + [string] + $Ensure='Present', + [ValidateNotNullOrEmpty()] + [string] + $Params, + [ValidateNotNullOrEmpty()] + [string] + $Version, + [ValidateNotNull()] + [string] + $MinimumVersion, + [string] + $Source, + [ValidateNotNullOrEmpty()] + [String] + $chocoParams, + [bool] + $AutoUpgrade = $false + ) + + Write-Verbose -Message 'Start Test-TargetResource' + $isVersionPresent = $PSBoundParameters.ContainsKey('Version') + $isMinimumVersionPresent = $PSBoundParameters.ContainsKey('MinimumVersion') + if ($isVersionPresent -and $isMinimumVersionPresent ) { + throw "Cannot specify 'Version' and 'MinimumVersion' in the same configuration" + } + + if (-Not (Test-ChocoInstalled)) { + return $false + } + + $isInstalled = IsPackageInstalled -pName $Name + + if ($ensure -eq 'Absent') { + if ($isInstalled -eq $false) { + return $true + } else { + return $false + } + } + + if ($version) { + Write-Verbose -Message "Checking if $Name is installed and if version matches $version" + $result = IsPackageInstalled -pName $Name -pVersion $Version + } + elseif ($MinimumVersion) { + Write-Verbose -Message "Checking if $Name is installed and version is $MinimumVersion or higher" + $result = IsPackageInstalled -pName $Name -pMinimumVersion $MinimumVersion + } + else { + Write-Verbose -Message "Checking if $Name is installed" + + if ($AutoUpgrade -and $isInstalled) { + $testParams = @{ + pName = $Name + } + if ($Source){ + $testParams.pSource = $Source + } + $result = Test-LatestVersionInstalled @testParams + } else { + $result = $isInstalled + } + } + + Return $result +} +function Test-ChocoInstalled +{ + Write-Verbose -Message 'Test-ChocoInstalled' + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + + Write-Verbose -Message "Env:Path contains: $env:Path" + if (Test-Command -command choco) + { + Write-Verbose -Message 'YES - Choco is Installed' + return $true + } + + Write-Verbose -Message 'NO - Choco is not Installed' + return $false +} + +Function Test-Command +{ + [CmdletBinding()] + [OutputType([bool])] + Param ( + [string]$command = 'choco' + ) + Write-Verbose -Message "Test-Command $command" + if (Get-Command -Name $command -ErrorAction SilentlyContinue) { + Write-Verbose -Message "$command exists" + return $true + } else { + Write-Verbose -Message "$command does NOT exist" + return $false + } +} + +function InstallPackage +{ + [Diagnostics.CodeAnalysis.SuppressMessage('PSAvoidUsingInvokeExpression','')] + param( + [Parameter(Position=0,Mandatory)] + [string]$pName, + [Parameter(Position=1)] + [string]$pParams, + [Parameter(Position=2)] + [string]$pVersion, + [Parameter(Position=3)] + [string]$pSource, + [Parameter(Position=4)] + [string]$cParams + ) + + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + + [string]$chocoParams = '-y' + if ($pParams) { + $chocoParams += " --params=`"$pParams`"" + } + if ($pVersion) { + $chocoParams += " --version=`"$pVersion`"" + } + if ($pSource) { + $chocoParams += " --source=`"$pSource`"" + } + if ($cParams) { + $chocoParams += " $cParams" + } + # Check if Chocolatey version is Greater than 0.10.4, and add --no-progress + if ((Get-ChocoVersion) -ge [System.Version]('0.10.4')){ + $chocoParams += " --no-progress" + } + + $cmd = "choco install $pName $chocoParams" + Write-Verbose -Message "Install command: '$cmd'" + $packageInstallOuput = Invoke-Expression -Command $cmd + Write-Verbose -Message "Package output $packageInstallOuput" + + # Clear Package Cache + Get-ChocoInstalledPackage -Purge + + #refresh path varaible in powershell, as choco doesn"t, to pull in git + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') +} + +function UninstallPackage +{ + [Diagnostics.CodeAnalysis.SuppressMessage('PSAvoidUsingInvokeExpression','')] + param( + [Parameter(Position=0,Mandatory)] + [string]$pName, + [Parameter(Position=1)] + [string]$pParams + ) + + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + + [string]$chocoParams = "-y" + if ($pParams) { + $chocoParams += " --params=`"$pParams`"" + } + if ($pVersion) { + $chocoParams += " --version=`"$pVersion`"" + } + # Check if Chocolatey version is Greater than 0.10.4, and add --no-progress + if ((Get-ChocoVersion) -ge [System.Version]('0.10.4')){ + $chocoParams += " --no-progress" + } + + $cmd = "choco uninstall $pName $chocoParams" + Write-Verbose -Message "Uninstalling $pName with: '$cmd'" + $packageUninstallOuput = Invoke-Expression -Command $cmd + + Write-Verbose -Message "Package uninstall output $packageUninstallOuput " + + # Clear Package Cache + Get-ChocoInstalledPackage -Purge + + #refresh path varaible in powershell, as choco doesn"t, to pull in git + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') +} + +function IsPackageInstalled +{ + [CmdletBinding(DefaultParameterSetName = 'RequiredVersion')] + [OutputType([Boolean])] + param( + [Parameter(Position=0, Mandatory)] + [string]$pName, + + [Parameter(ParameterSetName = 'RequiredVersion')] + [string]$pVersion, + + [Parameter(ParameterSetName = 'MinimumVersion')] + [string]$pMinimumVersion + ) + Write-Verbose -Message "Start IsPackageInstalled $pName" + + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + Write-Verbose -Message "Path variables: $($env:Path)" + + $installedPackages = Get-ChocoInstalledPackage + + if ($pVersion) { + Write-Verbose 'Comparing required version' + $installedPackages = $installedPackages | Where-Object { $_.Name -eq $pName -and $_.Version -eq $pVersion} + } + elseif ($pMinimumVersion) { + Write-Verbose 'Comparing minimum version' + # version comparison can be done with [System.Version] but this lacks the ability to compare pre-release versions + # because of this limitation MinimumVersion cannot be used in conjuction with pre-release packages + $pre = ($pMinimumVersion -split "-")[1] + if ($pre) { + throw "MinimumVersion does not support comparing pre-releases, please use Version parameter instead" + } + + $comparablePackages = $installedPackages | Where-Object { $_.Name -eq $pName} | ForEach-Object { + # as mentioned above we cant convert prerelease versions to [Sytem.Version] so we ignore anything after "-" + # leaving just the . seperated numeric version. this is loosely equivalent to "rounding down" + $parseableVersion = ($_.Version -split "-")[0] + $v = [System.Version]($parseableVersion) + $_ | Add-Member -MemberType NoteProperty -Name ComparableVersion -Value $v -PassThru + } + $installedPackages = $comparablePackages | Where-Object {$_.ComparableVersion -ge $pMinimumVersion} + } + else { + Write-Verbose "Finding packages -eq $pName" + $installedPackages = $installedPackages | Where-Object { $_.Name -eq $pName} + } + + $count = @($installedPackages).Count + Write-Verbose "Found $Count matching packages" + if ($Count -gt 0) + { + $installedPackages | ForEach-Object {Write-Verbose -Message "Found: $($_.Name) with version $($_.Version)"} + return $true + } + + return $false +} + +Function Test-LatestVersionInstalled { + [Diagnostics.CodeAnalysis.SuppressMessage('PSAvoidUsingInvokeExpression','')] + param( + [Parameter(Mandatory)] + [string]$pName, + [string]$pSource + ) + Write-Verbose -Message "Testing if $pName can be upgraded" + + [string]$chocoParams = '--noop' + if ($pSource) { + $chocoParams += " --source=`"$pSource`"" + } + + $cmd = "choco upgrade $pName $chocoParams" + Write-Verbose -Message "Testing if $pName can be upgraded: '$cmd'" + + $packageUpgradeOuput = Invoke-Expression -Command $cmd + $packageUpgradeOuput | ForEach-Object {Write-Verbose -Message $_} + + if ($packageUpgradeOuput -match "$pName.*is the latest version available based on your source") { + return $true + } + return $false +} + +##region - chocolately installer work arounds. Main issue is use of write-host +##attempting to work around the issues with Chocolatey calling Write-host in its scripts. +function global:Write-Host +{ + Param( + [Parameter(Mandatory, Position = 0)] + [Object] + $Object, + [Switch] + $NoNewLine, + [ConsoleColor] + $ForegroundColor, + [ConsoleColor] + $BackgroundColor + + ) + + #Override default Write-Host... + Write-Verbose -Message $Object +} + +Function Upgrade-Package { + [Diagnostics.CodeAnalysis.SuppressMessage('PSUseApprovedVerbs','')] + [Diagnostics.CodeAnalysis.SuppressMessage('PSAvoidUsingInvokeExpression','')] + param( + [Parameter(Position=0,Mandatory)] + [string]$pName, + [Parameter(Position=1)] + [string]$pParams, + [Parameter(Position=2)] + [string]$pSource, + [Parameter(Position=3)] + [string]$cParams + ) + + $env:Path = [Environment]::GetEnvironmentVariable('Path','Machine') + Write-Verbose -Message "Path variables: $($env:Path)" + + [string]$chocoParams = '-dv -y' + if ($pParams) { + $chocoParams += " --params=`"$pParams`"" + } + if ($pSource) { + $chocoParams += " --source=`"$pSource`"" + } + if ($cParams) { + $chocoParams += " $cParams" + } + # Check if Chocolatey version is Greater than 0.10.4, and add --no-progress + if ((Get-ChocoVersion) -ge [System.Version]('0.10.4')){ + $chocoParams += " --no-progress" + } + + $cmd = "choco upgrade $pName $chocoParams" + Write-Verbose -Message "Upgrade command: '$cmd'" + + if (-not (IsPackageInstalled -pName $pName)) + { + throw "$pName is not installed, you cannot upgrade" + } + + $packageUpgradeOuput = Invoke-Expression -Command $cmd + $packageUpgradeOuput | ForEach-Object { Write-Verbose -Message $_ } + + # Clear Package Cache + Get-ChocoInstalledPackage -Purge +} + +function Get-ChocoInstalledPackage { + [CmdletBinding()] + param ( + [switch]$Purge, + [switch]$NoCache + ) + + $ChocoInstallLP = Join-Path -Path $env:ChocolateyInstall -ChildPath 'cache' + if ( -not (Test-Path $ChocoInstallLP)){ + New-Item -Name 'cache' -Path $env:ChocolateyInstall -ItemType Directory | Out-Null + } + $ChocoInstallList = Join-Path -Path $ChocoInstallLP -ChildPath 'ChocoInstalled.xml' + + if ($Purge.IsPresent) { + Remove-Item $ChocoInstallList -Force + $res = $true + } else { + $PackageCacheSec = (Get-Date).AddSeconds('-60') + if ( $PackageCacheSec -lt (Get-Item $ChocoInstallList -ErrorAction SilentlyContinue).LastWriteTime ) { + $res = Import-Clixml $ChocoInstallList + } else { + $res = choco list -lo -r | ConvertFrom-Csv -Header 'Name', 'Version' -Delimiter "|" + if ( -not $NoCache){ + $res | Export-Clixml -Path $ChocoInstallList + } + } + } + + Return $res +} + +function Get-ChocoVersion { + [CmdletBinding()] + param ( + [switch]$Purge, + [switch]$NoCache + ) + + $chocoInstallCache = Join-Path -Path $env:ChocolateyInstall -ChildPath 'cache' + if ( -not (Test-Path $chocoInstallCache)){ + New-Item -Name 'cache' -Path $env:ChocolateyInstall -ItemType Directory | Out-Null + } + $chocoVersion = Join-Path -Path $chocoInstallCache -ChildPath 'ChocoVersion.xml' + + if ($Purge.IsPresent) { + Remove-Item $chocoVersion -Force + $res = $true + } else { + $cacheSec = (Get-Date).AddSeconds('-60') + if ( $cacheSec -lt (Get-Item $chocoVersion -ErrorAction SilentlyContinue).LastWriteTime ) { + $res = Import-Clixml $chocoVersion + } else { + $cmd = choco -v + $res = [System.Version]($cmd.Split('-')[0]) + $res | Export-Clixml -Path $chocoVersion + } + } + Return $res +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstall/cChocoPackageInstall.schema.mof b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstall/cChocoPackageInstall.schema.mof new file mode 100644 index 0000000..e1938fc --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstall/cChocoPackageInstall.schema.mof @@ -0,0 +1,12 @@ +[ClassVersion("1.0.1"), FriendlyName("cChocoPackageInstaller")] +class cChocoPackageInstall : OMI_BaseResource +{ + [Key] string Name; + [Write,ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [write] string Params; + [write] string Version; + [write] string MinimumVersion; + [write] string Source; + [Write] String chocoParams; + [Write] Boolean AutoUpgrade; +}; diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstallerSet/cChocoPackageInstallerSet.psd1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstallerSet/cChocoPackageInstallerSet.psd1 new file mode 100644 index 0000000..758af2d --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstallerSet/cChocoPackageInstallerSet.psd1 @@ -0,0 +1,95 @@ + +# +# Module manifest for module 'cChocoPackageInstallerSet' +# +# Generated on: 2016/05/11 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = 'cChocoPackageInstallerSet.schema.psm1' + +# Version number of this module. +ModuleVersion = '2.1.0.0' + +# ID used to uniquely identify this module +GUID = '028ba992-9429-4a6b-9c99-17eb4999cb23' + +# Author of this module +Author = 'Chocolatey Software, Lawrence Gripper, Javy de Koning' + +# Company or vendor of this module +CompanyName = 'Chocolatey Software, Inc' + +# Copyright statement for this module +Copyright = '(c) 2017 Chocolatey Software, Inc (c) 2013-2017 Lawrence Gripper, All rights reserved.' + +# Description of the functionality provided by this module +# Description = 'Allows install/uninstall of a group of choco packages.' + +# Minimum version of the Windows PowerShell engine required by this module +# PowerShellVersion = '' + +# Name of the Windows PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the Windows PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module +# DotNetFrameworkVersion = '' + +# Minimum version of the common language runtime (CLR) required by this module +# CLRVersion = '' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +# RequiredModules = @() + +# Assemblies that must be loaded prior to importing this module +# RequiredAssemblies = @() + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +# NestedModules = @() + +# Functions to export from this module +FunctionsToExport = '*' + +# Cmdlets to export from this module +CmdletsToExport = '*' + +# Variables to export from this module +VariablesToExport = '*' + +# Aliases to export from this module +AliasesToExport = '*' + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess +# PrivateData = '' + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + +} + diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstallerSet/cChocoPackageInstallerSet.schema.psm1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstallerSet/cChocoPackageInstallerSet.schema.psm1 new file mode 100644 index 0000000..abfd486 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoPackageInstallerSet/cChocoPackageInstallerSet.schema.psm1 @@ -0,0 +1,45 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Configuration cChocoPackageInstallerSet +{ +<# +.SYNOPSIS +Composite DSC Resource allowing you to specify multiple choco packages in a single resource block. +#> + [CmdletBinding(SupportsShouldProcess=$true)] + param + ( + [parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Name, + [ValidateSet('Present','Absent')] + [System.String] + $Ensure='Present', + [parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [System.String] + $Source + ) + + foreach ($pName in $Name) { + cChocoPackageInstaller "cChocoPackageInstaller_$($Ensure)_$($pName)" { + Ensure = $Ensure + Name = $pName + Source = $Source + } + } +} diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoSource/cChocoSource.psm1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoSource/cChocoSource.psm1 new file mode 100644 index 0000000..aae50e1 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoSource/cChocoSource.psm1 @@ -0,0 +1,187 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + [ValidateSet('Present','Absent')] + [System.String] + $Ensure='Present', + [parameter(Mandatory = $false)] + [UInt32] + $Priority, + [parameter(Mandatory = $false)] + [PSCredential] + $Credentials, + [parameter(Mandatory = $false)] + [System.String] + $Source + ) + + Write-Verbose "Start Get-TargetResource" + + #Needs to return a hashtable that returns the current + #status of the configuration component + $Configuration = @{ + Name = $Name + Priority = $Priority + Source = $Source + } + + return $Configuration +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + [ValidateSet('Present','Absent')] + [System.String] + $Ensure='Present', + [parameter(Mandatory = $false)] + [UInt32] + $Priority, + [parameter(Mandatory = $false)] + [PSCredential] + $Credentials, + [parameter(Mandatory = $false)] + [System.String] + $Source + ) + Write-Verbose "Start Set-TargetResource" + + if($Ensure -eq "Present") + { + if($Credentials -eq $null) + { + if($priority -eq $null) + { + choco sources add -n"$name" -s"$source" + } + else + { + choco sources add -n"$name" -s"$source" --priority=$priority + } + } + else + { + $username = $Credentials.UserName + $password = $Credentials.GetNetworkCredential().Password + + if($priority -eq $null) + { + choco sources add -n"$name" -s"$source" -u="$username" -p="$password" + } + else + { + choco sources add -n"$name" -s"$source" -u="$username" -p="$password" --priority=$priority + } + } + } + else + { + choco sources remove -n"$name" + } +} + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + [ValidateSet('Present','Absent')] + [System.String] + $Ensure='Present', + [parameter(Mandatory = $false)] + [UInt32] + $Priority, + [parameter(Mandatory = $false)] + [PSCredential] + $Credentials, + [parameter(Mandatory = $false)] + [System.String] + $Source + ) + + Write-Verbose "Start Test-TargetResource" + + if($env:ChocolateyInstall -eq "" -or $env:ChocolateyInstall -eq $null) + { + $exe = (get-command choco).Source + $chocofolder = $exe.Substring(0,$exe.LastIndexOf("\")) + + if( $chocofolder.EndsWith("bin") ) + { + $chocofolder = $chocofolder.Substring(0,$chocofolder.LastIndexOf("\")) + } + } + else + { + $chocofolder = $env:ChocolateyInstall + } + $configfolder = "$chocofolder\config" + $configfile = Get-ChildItem $configfolder | Where-Object {$_.Name -match "chocolatey.config$"} + + $xml = [xml](Get-Content $configfile.FullName) + $sources = $xml.chocolatey.sources.source + + foreach($chocosource in $sources) + { + if($chocosource.id -eq $name -and $ensure -eq 'Present') + { + if ($chocosource.priority -eq $Priority) + { + return $true + } + else + { + return $false + } + } + elseif($chocosource.id -eq $name -and $ensure -eq 'Absent') + { + return $false + } + } + + if($Ensure -eq 'Present') + { + return $false + } + else + { + return $true + } +} + + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoSource/cChocoSource.schema.mof b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoSource/cChocoSource.schema.mof new file mode 100644 index 0000000..20f608d --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/DSCResources/cChocoSource/cChocoSource.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0"), FriendlyName("cChocoSource")] +class cChocoSource : OMI_BaseResource +{ + [Key] string Name; + [Write,ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [write] string source; + [write,EmbeddedInstance("MSFT_Credential")] String Credentials; + [write] UInt32 Priority; +}; diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/ExampleConfig.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/ExampleConfig.ps1 new file mode 100644 index 0000000..505e479 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/ExampleConfig.ps1 @@ -0,0 +1,80 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Configuration myChocoConfig +{ + Import-DscResource -Module cChoco + Node "localhost" + { + LocalConfigurationManager + { + DebugMode = 'ForceModuleImport' + } + cChocoInstaller installChoco + { + InstallDir = "c:\choco" + } + cChocoPackageInstaller installChrome + { + Name = "googlechrome" + DependsOn = "[cChocoInstaller]installChoco" + #This will automatically try to upgrade if available, only if a version is not explicitly specified. + AutoUpgrade = $True + } + cChocoPackageInstaller installAtomSpecificVersion + { + Name = "atom" + Version = "0.155.0" + DependsOn = "[cChocoInstaller]installChoco" + } + cChocoPackageInstaller installGit + { + Ensure = 'Present' + Name = "git" + Params = "/Someparam " + DependsOn = "[cChocoInstaller]installChoco" + } + cChocoPackageInstaller noFlashAllowed + { + Ensure = 'Absent' + Name = "flashplayerplugin" + DependsOn = "[cChocoInstaller]installChoco" + } + cChocoPackageInstallerSet installSomeStuff + { + Ensure = 'Present' + Name = @( + "git" + "skype" + "7zip" + ) + DependsOn = "[cChocoInstaller]installChoco" + } + cChocoPackageInstallerSet stuffToBeRemoved + { + Ensure = 'Absent' + Name = @( + "vlc" + "ruby" + "adobeair" + ) + DependsOn = "[cChocoInstaller]installChoco" + } + } +} + +myChocoConfig + +Start-DscConfiguration .\myChocoConfig -wait -Verbose -force diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoConfigExample.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoConfigExample.ps1 new file mode 100644 index 0000000..d0a3693 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoConfigExample.ps1 @@ -0,0 +1,39 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +configuration ChocoConfig { + + Import-DscResource -ModuleName cChoco + + Node 'localhost' { + + cChocoConfig webRequestTimeoutSeconds { + ConfigName = "webRequestTimeoutSeconds" + Ensure = 'Present' + Value = 30 + } + + cChocoConfig proxy { + ConfigName = "proxy" + Ensure = 'Absent' + } + } + +} + + +$config = ChocoConfig + +Start-DscConfiguration -Path $config.psparentpath -Wait -Verbose -Force diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoFeatureExample.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoFeatureExample.ps1 new file mode 100644 index 0000000..355b363 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoFeatureExample.ps1 @@ -0,0 +1,41 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +configuration ChocoFeatures { + + Import-DscResource -ModuleName cChoco + + Node 'localhost' { + + cChocoFeature allowGlobalConfirmation { + + FeatureName = "allowGlobalConfirmation" + Ensure = 'Present' + + } + + cChocoFeature powershellHost { + + FeatureName = "powershellHost" + Ensure = 'Absent' + } + } + +} + + +$config = ChocoFeatures + +Start-DscConfiguration -Path $config.psparentpath -Wait -Verbose -Force diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoInstaller_cChocoInstallerExample.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoInstaller_cChocoInstallerExample.ps1 new file mode 100644 index 0000000..2e687cc --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoInstaller_cChocoInstallerExample.ps1 @@ -0,0 +1,36 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Configuration InstallChoco +{ + Import-DscResource -Module cChoco + Node "localhost" + { + cChocoInstaller InstallChoco + { + InstallDir = "c:\choco" + } + cChocoPackageInstaller installSkypeWithChocoParams + { + Name = 'skype' + Ensure = 'Present' + DependsOn = '[cChocoInstaller]installChoco' + } + } +} + +$config = InstallChoco + +Start-DscConfiguration -Path $config.psparentpath -Wait -Verbose -Force diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoInstaller_cChocoPackageInstallExample.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoInstaller_cChocoPackageInstallExample.ps1 new file mode 100644 index 0000000..c811730 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Examples/cChocoInstaller_cChocoPackageInstallExample.ps1 @@ -0,0 +1,33 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Configuration InstallChoco +{ + Import-DscResource -Module cChoco + Node "localhost" + { + cChocoPackageInstaller installSkypeWithChocoParams + { + Name = 'skype' + Ensure = 'Present' + AutoUpgrade = $True + Version = 7.35.0.101 + } + } +} + +$config = InstallChoco + +Start-DscConfiguration -Path $config.psparentpath -Wait -Verbose -Force diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/LICENSE b/deployment/dsc/azshcihost/cChoco/2.5.0.0/LICENSE new file mode 100644 index 0000000..895657b --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/LICENSE @@ -0,0 +1,174 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/NOTICE b/deployment/dsc/azshcihost/cChoco/2.5.0.0/NOTICE new file mode 100644 index 0000000..7e2bd53 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/NOTICE @@ -0,0 +1,14 @@ + Copyright (c) 2017 Chocolatey Software, Inc. + Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/PSGetModuleInfo.xml b/deployment/dsc/azshcihost/cChoco/2.5.0.0/PSGetModuleInfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..83a99ba447f01bf93bb3d546c3e1d56ddf5dcf6b GIT binary patch literal 15666 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 literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoConfig_Tests.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoConfig_Tests.ps1 new file mode 100644 index 0000000..8a5e897 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoConfig_Tests.ps1 @@ -0,0 +1,105 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +$ResourceName = ((Split-Path $MyInvocation.MyCommand.Path -Leaf) -split '_')[0] +$ResourceFile = (Get-DscResource -Name $ResourceName).Path + +$TestsPath = (split-path -path $MyInvocation.MyCommand.Path -Parent) +$ResourceFile = Get-ChildItem -Recurse $TestsPath\.. -File | Where-Object {$_.name -eq "$ResourceName.psm1"} + +Import-Module -Name $ResourceFile.FullName + + +#---------------------------------# +# Pester tests for cChocoConfig # +#---------------------------------# +Describe "Testing cChocoConfig" { + + Context "Test-TargetResource" { + + mock -ModuleName cChocoConfig -CommandName Get-Content -MockWith {'<?xml version="1.0" encoding="utf-8"?> +<chocolatey xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <config> + <add key="commandExecutionTimeoutSeconds" value="1339" description="Default timeout for command execution. for infinite (starting in 0.10.4)." /> + <add key="proxy" value="" description="Explicit proxy location. Available in 0.9.9.9+." /> + </config> + <sources> + <source id="chocolatey" value="https://chocolatey.org/api/v2/" disabled="false" bypassProxy="false" selfService="false" adminOnly="false" priority="0" /> + </sources> +</chocolatey>' + } -Verifiable + + it 'Test-TargetResource returns true when Present and Configured.' { + Test-TargetResource -ConfigName 'commandExecutionTimeoutSeconds' -Ensure 'Present' -Value '1339' | Should be $true + } + + it 'Test-TargetResource returns false when Present and Not configured' { + Test-TargetResource -ConfigName 'proxy' -Ensure 'Present' -Value 'http://myproxy.url' | Should be $false + } + + it 'Test-TargetResource returns false when Present and Unknown' { + Test-TargetResource -ConfigName 'MyParam' -Ensure 'Present' -Value 'MyValue' | Should be $false + } + + it 'Test-TargetResource throws when Present and no value' { + { Test-TargetResource -ConfigName 'MyParam' -Ensure 'Present' } | Should -Throw "Missing parameter 'Value' when ensuring config is present!" + } + + it 'Test-TargetResource throws when Present and no value' { + { Test-TargetResource -ConfigName 'MyParam' -Ensure 'Present' -Value '' } | Should -Throw "Missing parameter 'Value' when ensuring config is present!" + } + + it 'Test-TargetResource throws when Present and no value' { + { Test-TargetResource -ConfigName 'MyParam' -Ensure 'Present' -Value $null } | Should -Throw "Missing parameter 'Value' when ensuring config is present!" + } + + it 'Test-TargetResource returns false when Absent and Configured' { + Test-TargetResource -ConfigName 'commandExecutionTimeoutSeconds' -Ensure 'Absent' | Should be $false + } + + it 'Test-TargetResource returns true when Absent and Not configured' { + Test-TargetResource -ConfigName 'proxy' -Ensure 'Absent' | Should be $true + } + + it 'Test-TargetResource returns true when Absent and Unknown' { + Test-TargetResource -ConfigName 'MyParam' -Ensure 'Absent' | Should be $true + } + + } + + Context "Set-TargetResource" { + + InModuleScope -ModuleName cChocoConfig -ScriptBlock { + function choco {} + mock choco {} + } + + Set-TargetResource -ConfigName "TestConfig" -Ensure "Present" -Value "MyValue" + + it "Present - Should have called choco, with set" { + Assert-MockCalled -CommandName choco -ModuleName cChocoConfig -ParameterFilter { + $args -contains "'MyValue'" + } + } + + Set-TargetResource -ConfigName "TestConfig" -Ensure "Absent" + + it "Absent - Should have called choco, with unset" { + Assert-MockCalled -CommandName choco -ModuleName cChocoConfig -ParameterFilter { + $args -contains "unset" + } + } + } +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoFeature_Tests.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoFeature_Tests.ps1 new file mode 100644 index 0000000..4c67253 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoFeature_Tests.ps1 @@ -0,0 +1,87 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +$ResourceName = ((Split-Path $MyInvocation.MyCommand.Path -Leaf) -split '_')[0] +$ResourceFile = (Get-DscResource -Name $ResourceName).Path + +$TestsPath = (split-path -path $MyInvocation.MyCommand.Path -Parent) +$ResourceFile = Get-ChildItem -Recurse $TestsPath\.. -File | Where-Object {$_.name -eq "$ResourceName.psm1"} + +Import-Module -Name $ResourceFile.FullName + + +#---------------------------------# +# Pester tests for cChocoInstall # +#---------------------------------# +Describe "Testing cChocoFeature" { + + Context "Test-TargetResource" { + + mock -ModuleName cChocoFeature -CommandName Get-ChocoFeature -MockWith { + @([pscustomobject]@{ + Name = "allowGlobalConfirmation" + State = "Enabled" + Description = "blah" + }, + [pscustomobject]@{ + Name = "powershellhost" + State = "Disabled" + Description = "blah" + } )| Where-Object { $_.Name -eq $FeatureName } + } -Verifiable + + + it 'Test-TargetResource returns true when Present and Enabled.' { + Test-TargetResource -FeatureName 'allowGlobalConfirmation' -Ensure 'Present' | should be $true + } + + it 'Test-TargetResource returns false when Present and Disabled' { + Test-TargetResource -FeatureName 'powershellhost' -Ensure 'Present' | should be $false + } + + it 'Test-TargetResource returns false when Absent and Enabled' { + Test-TargetResource -FeatureName 'allowGlobalConfirmation' -Ensure 'Absent' | Should be $false + } + + it 'Test-TargetResource returns true when Absent and Disabled' { + Test-TargetResource -FeatureName 'powershellhost' -Ensure 'Absent' | should be $true + } + + } + + Context "Set-TargetResource" { + + InModuleScope -ModuleName cChocoFeature -ScriptBlock { + function choco {} + mock choco {} + } + + Set-TargetResource -FeatureName "TestFeature" -Ensure "Present" + + it "Present - Should have called choco, with enable" { + Assert-MockCalled -CommandName choco -ModuleName cChocoFeature -ParameterFilter { + $args -contains "enable" + } + } + + Set-TargetResource -FeatureName "TestFeature" -Ensure "Absent" + + it "Absent - Should have called choco, with disable" { + Assert-MockCalled -CommandName choco -ModuleName cChocoFeature -ParameterFilter { + $args -contains "disable" + } + } + } +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoInstaller_Tests.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoInstaller_Tests.ps1 new file mode 100644 index 0000000..3ce85f9 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoInstaller_Tests.ps1 @@ -0,0 +1,28 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#---------------------------------# +# Pester tests for cChocoInstall # +#---------------------------------# +$ResourceName = ((Split-Path $MyInvocation.MyCommand.Path -Leaf) -split '_')[0] +$ResourceFile = (Get-DscResource -Name $ResourceName).Path + +Describe "Testing $ResourceName loaded from $ResourceFile" { + Context “Testing 'Get-TargetResource'” { + It 'DummyTest $true should be $true' { + $true | Should Be $true + } + } +} diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoPackageInstall_Tests.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoPackageInstall_Tests.ps1 new file mode 100644 index 0000000..97b954f --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChocoPackageInstall_Tests.ps1 @@ -0,0 +1,195 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#----------------------------------------# +# Pester tests for cChocoPackageInstall # +#----------------------------------------# +$ResourceName = ((Split-Path -Path $MyInvocation.MyCommand.Path -Leaf) -split '_')[0] +$ResourceFile = (Get-DscResource -Name $ResourceName).Path + +$TestsPath = (split-path -path $MyInvocation.MyCommand.Path -Parent) +$ResourceFile = Get-ChildItem -Recurse $TestsPath\.. -File | Where-Object {$_.name -eq "$ResourceName.psm1"} + +Import-Module -Name $ResourceFile.FullName + +Describe -Name "Testing $ResourceName loaded from $ResourceFile" -Fixture { + Context -Name "Package is not installed" -Fixture { + Mock -CommandName 'Get-ChocoInstalledPackage' -ModuleName 'cChocoPackageInstall' -MockWith { + return [pscustomobject]@{ + 'Name' = 'NotGoogleChrome' + 'Version' = '1.0.0' + } + } + + $Scenario1 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + } + It -name "Test-TargetResource -ensure 'Present' should return False" -test { + Test-TargetResource @Scenario1 | Should Be $False + } + + $Scenario2 = @{ + Name = 'GoogleChrome' + Ensure = 'Absent' + } + It -name "Test-TargetResource -ensure 'Absent' should return True" -test { + Test-TargetResource @Scenario2 | Should Be $True + } + + $Scenario3 = @{ + Name = 'GoogleChrome' + Ensure = 'Absent' + Version = '1.0.0' + } + It -name "Test-TargetResource -ensure 'Absent' -version '1.0.0' should return True" -test { + Test-TargetResource @Scenario3 | Should Be $True + } + + $Scenario4 = @{ + Name = 'GoogleChrome' + Ensure = 'Absent' + AutoUpgrade = $True + } + It -name "Test-TargetResource -ensure 'Absent' -AutoUpgrade should return True" -test { + Test-TargetResource @Scenario4 | Should Be $True + } + + $Scenario5 = @{ + Name = 'GoogleChrome' + Ensure = 'Absent' + Version = '1.0' + AutoUpgrade = $True + } + It -name "Test-TargetResource -ensure 'Absent' -version '1.0.0' -AutoUpgrade should return True" -test { + Test-TargetResource @Scenario5 | Should Be $True + } + + $Scenario6 = @{ + Name = 'GoogleChrome' + Ensure = 'Absent' + MinimumVersion = '1.0' + } + It -name "Test-TargetResource -ensure 'Absent' -MinimumVersion '1.0' should return True" -test { + Test-TargetResource @Scenario6 | Should Be $True + } + + $Scenario7 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + MinimumVersion = '1.0' + } + It -name "Test-TargetResource -ensure 'Present' -MinimumVersion '1.0' should return False" -test { + Test-TargetResource @Scenario7 | Should Be $false + } + } + + Context -Name "Package is installed with version 1.0.0" -Fixture { + Mock -CommandName 'Get-ChocoInstalledPackage' -ModuleName 'cChocoPackageInstall' -MockWith { + return [pscustomobject]@{ + 'Name' = 'GoogleChrome' + 'Version' = '1.0.0' + } + } + + $Scenario1 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + } + It -name "Test-TargetResource -ensure 'Present' should return True" -test { + Test-TargetResource @Scenario1 | Should Be $True + } + + $Scenario2 = @{ + Name = 'GoogleChrome' + Ensure = 'Absent' + } + It -name "Test-TargetResource -ensure 'Absent' should return False" -test { + Test-TargetResource @Scenario2 | Should Be $False + } + + $Scenario3 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + Version = '1.0.0' + } + + It -name "Test-TargetResource -ensure 'Present' -version '1.0.0' should return True" -test { + Test-TargetResource @Scenario3 | Should Be $True + } + + $Scenario4 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + Version = '1.0.1' + } + + It -name "Test-TargetResource -ensure 'Present' -version '1.0.1' should return False" -test { + Test-TargetResource @Scenario4 | Should Be $False + } + + $Scenario5 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + MinimumVersion = '0.9.0' + } + + It -name "Test-TargetResource -ensure 'Present' -MinimumVersion '0.9.0' should return True" -test { + Test-TargetResource @Scenario5 | Should Be $true + } + + $Scenario6 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + MinimumVersion = '1.0.1' + } + + It -name "Test-TargetResource -ensure 'Present' -MinimumVersion '1.0.1' should return False" -test { + Test-TargetResource @Scenario6 | Should Be $false + } + } + + Context -Name "Package is installed with prerelease version 1.0.0-1" -Fixture { + Mock -CommandName 'Get-ChocoInstalledPackage' -ModuleName 'cChocoPackageInstall' -MockWith { + return [pscustomobject]@{ + 'Name' = 'GoogleChrome' + 'Version' = '1.0.0-1' + } + } + + $Scenario1 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + MinimumVersion = '0.9.0' + } + + It -name "Test-TargetResource -ensure 'Present' -MinimumVersion '0.9.0' should return True" -test { + Test-TargetResource @Scenario1 | Should Be $true + } + + $Scenario2 = @{ + Name = 'GoogleChrome' + Ensure = 'Present' + MinimumVersion = '1.0.1' + } + + It -name "Test-TargetResource -ensure 'Present' -MinimumVersion '1.0.1' should return False" -test { + Test-TargetResource @Scenario2 | Should Be $false + } + } +} + +#Clean-up +Remove-Module cChocoPackageInstall diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChoco_ScriptAnalyzerTests.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChoco_ScriptAnalyzerTests.ps1 new file mode 100644 index 0000000..f8e1be9 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChoco_ScriptAnalyzerTests.ps1 @@ -0,0 +1,46 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#---------------------------------# +# PSScriptAnalyzer tests # +#---------------------------------# +$Rules = Get-ScriptAnalyzerRule + +#Only run on cChocoInstaller.psm1 for now as this is the only resource that has had code adjustments for PSScriptAnalyzer rules. +$Modules = Get-ChildItem “$PSScriptRoot\..\” -Filter ‘*.psm1’ -Recurse | Where-Object {$_.FullName -match '(cChocoInstaller|cChocoPackageInstall|cChocoFeature)\.psm1$'} + +#---------------------------------# +# Run Module tests (psm1) # +#---------------------------------# +if ($Modules.count -gt 0) { + Describe ‘Testing all Modules against default PSScriptAnalyzer rule-set’ { + foreach ($module in $modules) { + Context “Testing Module '$($module.FullName)'” { + foreach ($rule in $rules) { + It “passes the PSScriptAnalyzer Rule $rule“ { + $Failures = Invoke-ScriptAnalyzer -Path $module.FullName -IncludeRule $rule.RuleName + $FailuresCount = ($Failures | Measure-Object).Count + if ($FailuresCount -gt 0) { + $Failures | ForEach-Object { + Write-Warning "Script: $($_.ScriptName), Line $($_.Line), Message $($_.Message)" + } + } + $FailuresCount | Should Be 0 + } + } + } + } + } +} diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChoco_xDscResourceTests.ps1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChoco_xDscResourceTests.ps1 new file mode 100644 index 0000000..57a8f32 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/Tests/cChoco_xDscResourceTests.ps1 @@ -0,0 +1,41 @@ +# Copyright (c) 2017 Chocolatey Software, Inc. +# Copyright (c) 2013 - 2017 Lawrence Gripper & original authors/contributors from https://github.com/chocolatey/cChoco +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#---------------------------------# +# xDscResourceTests Pester # +#---------------------------------# +$DSC = Get-DscResource | Where-Object {$_.Module.Name -eq 'cChoco'} + +Describe 'Testing all DSC resources using xDscResource designer.' { + foreach ($Resource in $DSC) + { + if (-not ($Resource.ImplementedAs -eq 'Composite') ) { + $ResourceName = $Resource.ResourceType + $Mof = Get-ChildItem “$PSScriptRoot\..\” -Filter "$resourcename.schema.mof" -Recurse + + Context “Testing DscResource '$ResourceName' using Test-xDscResource” { + It 'Test-xDscResource should return $true' { + Test-xDscResource -Name $ResourceName | Should Be $true + } + } + + Context “Testing DscSchema '$ResourceName' using Test-xDscSchema” { + It 'Test-xDscSchema should return true' { + Test-xDscSchema -Path $Mof.FullName | Should Be $true + } + } + } + } +} diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/TestsResults.xml b/deployment/dsc/azshcihost/cChoco/2.5.0.0/TestsResults.xml new file mode 100644 index 0000000..75e90a3 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/TestsResults.xml @@ -0,0 +1,313 @@ +<?xml version="1.0" encoding="utf-8" standalone="no"?> +<test-results xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="nunit_schema_2.5.xsd" name="Pester" total="172" errors="0" failures="0" not-run="0" inconclusive="0" ignored="0" skipped="0" invalid="0" date="2021-02-09" time="14:51:09"> + <environment clr-version="4.0.30319.42000" user-domain="APPVYR-WIN" cwd="C:\projects\cchoco" platform="Microsoft Windows Server 2012 R2 Datacenter|C:\windows|\Device\Harddisk0\Partition5" machine-name="APPVYR-WIN" nunit-version="2.5.8.0" os-version="6.3.9600" user="appveyor" /> + <culture-info current-culture="en-US" current-uiculture="en-US" /> + <test-suite type="TestFixture" name="Pester" executed="True" result="Success" success="True" time="43.6443" asserts="0" description="Pester"> + <results> + <test-suite type="TestFixture" name="C:\projects\cchoco\tests\cChocoConfig_Tests.ps1" executed="True" result="Success" success="True" time="5.3013" asserts="0" description="C:\projects\cchoco\tests\cChocoConfig_Tests.ps1"> + <results> + <test-suite type="TestFixture" name="Testing cChocoConfig" executed="True" result="Success" success="True" time="2.7657" asserts="0" description="Testing cChocoConfig"> + <results> + <test-suite type="TestFixture" name="Test-TargetResource" executed="True" result="Success" success="True" time="2.2105" asserts="0" description="Test-TargetResource"> + <results> + <test-case description="Test-TargetResource returns true when Present and Configured." name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource returns true when Present and Configured." time="0.7493" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource returns false when Present and Not configured" name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource returns false when Present and Not configured" time="0.0117" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource returns false when Present and Unknown" name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource returns false when Present and Unknown" time="0.012" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource throws when Present and no value" name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource throws when Present and no value" time="0.1154" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource throws when Present and no value" name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource throws when Present and no value" time="0.005" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource throws when Present and no value" name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource throws when Present and no value" time="0.0085" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource returns false when Absent and Configured" name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource returns false when Absent and Configured" time="0.0133" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource returns true when Absent and Not configured" name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource returns true when Absent and Not configured" time="0.0122" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource returns true when Absent and Unknown" name="Testing cChocoConfig.Test-TargetResource.Test-TargetResource returns true when Absent and Unknown" time="0.0117" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Set-TargetResource" executed="True" result="Success" success="True" time="0.3048" asserts="0" description="Set-TargetResource"> + <results> + <test-case description="Present - Should have called choco, with set" name="Testing cChocoConfig.Set-TargetResource.Present - Should have called choco, with set" time="0.1563" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Absent - Should have called choco, with unset" name="Testing cChocoConfig.Set-TargetResource.Absent - Should have called choco, with unset" time="0.0175" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + </results> + </test-suite> + </results> + </test-suite> + <test-suite type="TestFixture" name="C:\projects\cchoco\tests\cChocoFeature_Tests.ps1" executed="True" result="Success" success="True" time="1.1879" asserts="0" description="C:\projects\cchoco\tests\cChocoFeature_Tests.ps1"> + <results> + <test-suite type="TestFixture" name="Testing cChocoFeature" executed="True" result="Success" success="True" time="0.4099" asserts="0" description="Testing cChocoFeature"> + <results> + <test-suite type="TestFixture" name="Test-TargetResource" executed="True" result="Success" success="True" time="0.2154" asserts="0" description="Test-TargetResource"> + <results> + <test-case description="Test-TargetResource returns true when Present and Enabled." name="Testing cChocoFeature.Test-TargetResource.Test-TargetResource returns true when Present and Enabled." time="0.0287" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource returns false when Present and Disabled" name="Testing cChocoFeature.Test-TargetResource.Test-TargetResource returns false when Present and Disabled" time="0.0111" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource returns false when Absent and Enabled" name="Testing cChocoFeature.Test-TargetResource.Test-TargetResource returns false when Absent and Enabled" time="0.01" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource returns true when Absent and Disabled" name="Testing cChocoFeature.Test-TargetResource.Test-TargetResource returns true when Absent and Disabled" time="0.107" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Set-TargetResource" executed="True" result="Success" success="True" time="0.1472" asserts="0" description="Set-TargetResource"> + <results> + <test-case description="Present - Should have called choco, with enable" name="Testing cChocoFeature.Set-TargetResource.Present - Should have called choco, with enable" time="0.0097" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Absent - Should have called choco, with disable" name="Testing cChocoFeature.Set-TargetResource.Absent - Should have called choco, with disable" time="0.0584" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + </results> + </test-suite> + </results> + </test-suite> + <test-suite type="TestFixture" name="C:\projects\cchoco\tests\cChocoInstaller_Tests.ps1" executed="True" result="Success" success="True" time="0.9738" asserts="0" description="C:\projects\cchoco\tests\cChocoInstaller_Tests.ps1"> + <results> + <test-suite type="TestFixture" name="Testing cChocoInstaller loaded from C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1" executed="True" result="Success" success="True" time="0.0409" asserts="0" description="Testing cChocoInstaller loaded from C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1"> + <results> + <test-suite type="TestFixture" name="Testing 'Get-TargetResource'" executed="True" result="Success" success="True" time="0.0237" asserts="0" description="Testing 'Get-TargetResource'"> + <results> + <test-case description="DummyTest $true should be $true" name="Testing cChocoInstaller loaded from C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1.Testing 'Get-TargetResource'.DummyTest $true should be $true" time="0.0031" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + </results> + </test-suite> + </results> + </test-suite> + <test-suite type="TestFixture" name="C:\projects\cchoco\tests\cChocoPackageInstall_Tests.ps1" executed="True" result="Success" success="True" time="1.5671" asserts="0" description="C:\projects\cchoco\tests\cChocoPackageInstall_Tests.ps1"> + <results> + <test-suite type="TestFixture" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1" executed="True" result="Success" success="True" time="0.8224" asserts="0" description="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1"> + <results> + <test-suite type="TestFixture" name="Package is not installed" executed="True" result="Success" success="True" time="0.3455" asserts="0" description="Package is not installed"> + <results> + <test-case description="Test-TargetResource -ensure 'Present' should return False" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is not installed.Test-TargetResource -ensure 'Present' should return False" time="0.0937" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Absent' should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is not installed.Test-TargetResource -ensure 'Absent' should return True" time="0.0156" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Absent' -version '1.0.0' should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is not installed.Test-TargetResource -ensure 'Absent' -version '1.0.0' should return True" time="0.0202" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Absent' -AutoUpgrade should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is not installed.Test-TargetResource -ensure 'Absent' -AutoUpgrade should return True" time="0.0165" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Absent' -version '1.0.0' -AutoUpgrade should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is not installed.Test-TargetResource -ensure 'Absent' -version '1.0.0' -AutoUpgrade should return True" time="0.0143" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Absent' -MinimumVersion '1.0' should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is not installed.Test-TargetResource -ensure 'Absent' -MinimumVersion '1.0' should return True" time="0.0182" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Present' -MinimumVersion '1.0' should return False" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is not installed.Test-TargetResource -ensure 'Present' -MinimumVersion '1.0' should return False" time="0.0841" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Package is installed with version 1.0.0" executed="True" result="Success" success="True" time="0.1934" asserts="0" description="Package is installed with version 1.0.0"> + <results> + <test-case description="Test-TargetResource -ensure 'Present' should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is installed with version 1.0.0.Test-TargetResource -ensure 'Present' should return True" time="0.0169" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Absent' should return False" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is installed with version 1.0.0.Test-TargetResource -ensure 'Absent' should return False" time="0.0161" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Present' -version '1.0.0' should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is installed with version 1.0.0.Test-TargetResource -ensure 'Present' -version '1.0.0' should return True" time="0.0215" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Present' -version '1.0.1' should return False" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is installed with version 1.0.0.Test-TargetResource -ensure 'Present' -version '1.0.1' should return False" time="0.0232" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Present' -MinimumVersion '0.9.0' should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is installed with version 1.0.0.Test-TargetResource -ensure 'Present' -MinimumVersion '0.9.0' should return True" time="0.0306" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Present' -MinimumVersion '1.0.1' should return False" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is installed with version 1.0.0.Test-TargetResource -ensure 'Present' -MinimumVersion '1.0.1' should return False" time="0.026" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Package is installed with prerelease version 1.0.0-1" executed="True" result="Success" success="True" time="0.2461" asserts="0" description="Package is installed with prerelease version 1.0.0-1"> + <results> + <test-case description="Test-TargetResource -ensure 'Present' -MinimumVersion '0.9.0' should return True" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is installed with prerelease version 1.0.0-1.Test-TargetResource -ensure 'Present' -MinimumVersion '0.9.0' should return True" time="0.0209" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="Test-TargetResource -ensure 'Present' -MinimumVersion '1.0.1' should return False" name="Testing cChocoPackageInstall loaded from cChocoPackageInstall.psm1.Package is installed with prerelease version 1.0.0-1.Test-TargetResource -ensure 'Present' -MinimumVersion '1.0.1' should return False" time="0.0215" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + </results> + </test-suite> + </results> + </test-suite> + <test-suite type="TestFixture" name="C:\projects\cchoco\tests\cChoco_ScriptAnalyzerTests.ps1" executed="True" result="Success" success="True" time="25.4189" asserts="0" description="C:\projects\cchoco\tests\cChoco_ScriptAnalyzerTests.ps1"> + <results> + <test-suite type="TestFixture" name="Testing all Modules against default PSScriptAnalyzer rule-set" executed="True" result="Success" success="True" time="24.7865" asserts="0" description="Testing all Modules against default PSScriptAnalyzer rule-set"> + <results> + <test-suite type="TestFixture" name="Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'" executed="True" result="Success" success="True" time="4.0562" asserts="0" description="Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'"> + <results> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingCmdletAliases" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingCmdletAliases" time="0.2417" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidDefaultValueSwitchParameter" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidDefaultValueSwitchParameter" time="0.0472" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidDefaultValueForMandatoryParameter" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidDefaultValueForMandatoryParameter" time="0.0442" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingEmptyCatchBlock" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingEmptyCatchBlock" time="0.0463" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidGlobalVars" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidGlobalVars" time="0.0436" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidInvokingEmptyMembers" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidInvokingEmptyMembers" time="0.0444" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidNullOrEmptyHelpMessageAttribute" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidNullOrEmptyHelpMessageAttribute" time="0.0491" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingPositionalParameters" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingPositionalParameters" time="0.3065" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSReservedCmdletChar" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSReservedCmdletChar" time="0.3055" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSReservedParams" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSReservedParams" time="0.0458" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidShouldContinueWithoutForce" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidShouldContinueWithoutForce" time="0.0449" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingUserNameAndPassWordParams" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingUserNameAndPassWordParams" time="0.0572" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingComputerNameHardcoded" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingComputerNameHardcoded" time="0.0544" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingConvertToSecureStringWithPlainText" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingConvertToSecureStringWithPlainText" time="0.0676" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingDeprecatedManifestFields" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingDeprecatedManifestFields" time="0.0757" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingInvokeExpression" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingInvokeExpression" time="0.0562" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingPlainTextForPassword" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingPlainTextForPassword" time="0.0576" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingWMICmdlet" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingWMICmdlet" time="0.0461" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingWriteHost" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingWriteHost" time="0.0473" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSMisleadingBacktick" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSMisleadingBacktick" time="0.0415" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSMissingModuleManifestField" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSMissingModuleManifestField" time="0.044" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSPossibleIncorrectComparisonWithNull" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSPossibleIncorrectComparisonWithNull" time="0.0465" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSProvideCommentHelp" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSProvideCommentHelp" time="0.301" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseApprovedVerbs" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseApprovedVerbs" time="0.0511" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseBOMForUnicodeEncodedFile" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseBOMForUnicodeEncodedFile" time="0.0693" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseCmdletCorrectly" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseCmdletCorrectly" time="0.324" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseCompatibleCmdlets" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseCompatibleCmdlets" time="0.0727" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseDeclaredVarsMoreThanAssignments" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseDeclaredVarsMoreThanAssignments" time="0.0718" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseLiteralInitializerForHashtable" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseLiteralInitializerForHashtable" time="0.0418" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseOutputTypeCorrectly" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseOutputTypeCorrectly" time="0.0723" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUsePSCredentialType" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUsePSCredentialType" time="0.049" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSShouldProcess" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSShouldProcess" time="0.2451" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseShouldProcessForStateChangingFunctions" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseShouldProcessForStateChangingFunctions" time="0.0794" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseSingularNouns" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseSingularNouns" time="0.107" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseToExportFieldsInManifest" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseToExportFieldsInManifest" time="0.0711" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseUTF8EncodingForHelpFile" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSUseUTF8EncodingForHelpFile" time="0.0629" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCDscExamplesPresent" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSDSCDscExamplesPresent" time="0.0537" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCDscTestsPresent" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSDSCDscTestsPresent" time="0.0399" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCReturnCorrectTypesForDSCFunctions" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSDSCReturnCorrectTypesForDSCFunctions" time="0.0458" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseIdenticalMandatoryParametersForDSC" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseIdenticalMandatoryParametersForDSC" time="0.0442" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseIdenticalParametersForDSC" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseIdenticalParametersForDSC" time="0.0462" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCStandardDSCFunctionsInResource" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSDSCStandardDSCFunctionsInResource" time="0.0418" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseVerboseMessageInDSCResource" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoFeature\cChocoFeature.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseVerboseMessageInDSCResource" time="0.0498" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'" executed="True" result="Success" success="True" time="7.1488" asserts="0" description="Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'"> + <results> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingCmdletAliases" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingCmdletAliases" time="0.0449" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidDefaultValueSwitchParameter" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidDefaultValueSwitchParameter" time="0.039" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidDefaultValueForMandatoryParameter" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidDefaultValueForMandatoryParameter" time="0.038" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingEmptyCatchBlock" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingEmptyCatchBlock" time="0.0446" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidGlobalVars" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidGlobalVars" time="0.0393" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidInvokingEmptyMembers" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidInvokingEmptyMembers" time="0.0586" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidNullOrEmptyHelpMessageAttribute" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidNullOrEmptyHelpMessageAttribute" time="0.046" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingPositionalParameters" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingPositionalParameters" time="1.4896" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSReservedCmdletChar" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSReservedCmdletChar" time="0.3349" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSReservedParams" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSReservedParams" time="0.0427" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidShouldContinueWithoutForce" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidShouldContinueWithoutForce" time="0.0413" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingUserNameAndPassWordParams" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingUserNameAndPassWordParams" time="0.0387" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingComputerNameHardcoded" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingComputerNameHardcoded" time="0.0456" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingConvertToSecureStringWithPlainText" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingConvertToSecureStringWithPlainText" time="0.0465" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingDeprecatedManifestFields" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingDeprecatedManifestFields" time="0.0439" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingInvokeExpression" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingInvokeExpression" time="0.0429" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingPlainTextForPassword" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingPlainTextForPassword" time="0.0421" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingWMICmdlet" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingWMICmdlet" time="0.0396" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingWriteHost" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingWriteHost" time="0.04" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSMisleadingBacktick" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSMisleadingBacktick" time="0.0584" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSMissingModuleManifestField" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSMissingModuleManifestField" time="0.0458" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSPossibleIncorrectComparisonWithNull" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSPossibleIncorrectComparisonWithNull" time="0.0451" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSProvideCommentHelp" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSProvideCommentHelp" time="0.3017" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseApprovedVerbs" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseApprovedVerbs" time="0.0794" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseBOMForUnicodeEncodedFile" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseBOMForUnicodeEncodedFile" time="0.0805" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseCmdletCorrectly" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseCmdletCorrectly" time="2.0537" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseCompatibleCmdlets" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseCompatibleCmdlets" time="0.0685" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseDeclaredVarsMoreThanAssignments" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseDeclaredVarsMoreThanAssignments" time="0.0598" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseLiteralInitializerForHashtable" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseLiteralInitializerForHashtable" time="0.0548" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseOutputTypeCorrectly" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseOutputTypeCorrectly" time="0.0874" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUsePSCredentialType" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUsePSCredentialType" time="0.0576" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSShouldProcess" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSShouldProcess" time="0.8316" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseShouldProcessForStateChangingFunctions" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseShouldProcessForStateChangingFunctions" time="0.0403" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseSingularNouns" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseSingularNouns" time="0.0421" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseToExportFieldsInManifest" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseToExportFieldsInManifest" time="0.0421" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseUTF8EncodingForHelpFile" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSUseUTF8EncodingForHelpFile" time="0.0396" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCDscExamplesPresent" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSDSCDscExamplesPresent" time="0.0388" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCDscTestsPresent" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSDSCDscTestsPresent" time="0.0421" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCReturnCorrectTypesForDSCFunctions" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSDSCReturnCorrectTypesForDSCFunctions" time="0.0423" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseIdenticalMandatoryParametersForDSC" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseIdenticalMandatoryParametersForDSC" time="0.0446" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseIdenticalParametersForDSC" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseIdenticalParametersForDSC" time="0.0444" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCStandardDSCFunctionsInResource" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSDSCStandardDSCFunctionsInResource" time="0.0432" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseVerboseMessageInDSCResource" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoInstaller\cChocoInstaller.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseVerboseMessageInDSCResource" time="0.0385" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'" executed="True" result="Success" success="True" time="13.5444" asserts="0" description="Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'"> + <results> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingCmdletAliases" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingCmdletAliases" time="0.0534" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidDefaultValueSwitchParameter" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidDefaultValueSwitchParameter" time="0.0456" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidDefaultValueForMandatoryParameter" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidDefaultValueForMandatoryParameter" time="0.053" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingEmptyCatchBlock" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingEmptyCatchBlock" time="0.0433" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidGlobalVars" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidGlobalVars" time="0.0637" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidInvokingEmptyMembers" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidInvokingEmptyMembers" time="0.0794" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidNullOrEmptyHelpMessageAttribute" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidNullOrEmptyHelpMessageAttribute" time="0.0832" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingPositionalParameters" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingPositionalParameters" time="4.4079" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSReservedCmdletChar" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSReservedCmdletChar" time="0.3085" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSReservedParams" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSReservedParams" time="0.0693" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidShouldContinueWithoutForce" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidShouldContinueWithoutForce" time="0.0576" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingUserNameAndPassWordParams" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingUserNameAndPassWordParams" time="0.0485" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingComputerNameHardcoded" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingComputerNameHardcoded" time="0.047" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingConvertToSecureStringWithPlainText" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingConvertToSecureStringWithPlainText" time="0.0508" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingDeprecatedManifestFields" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingDeprecatedManifestFields" time="0.0454" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingInvokeExpression" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingInvokeExpression" time="0.0653" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingPlainTextForPassword" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingPlainTextForPassword" time="0.0549" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingWMICmdlet" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingWMICmdlet" time="0.0639" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSAvoidUsingWriteHost" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSAvoidUsingWriteHost" time="0.0819" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSMisleadingBacktick" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSMisleadingBacktick" time="0.0471" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSMissingModuleManifestField" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSMissingModuleManifestField" time="0.0541" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSPossibleIncorrectComparisonWithNull" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSPossibleIncorrectComparisonWithNull" time="0.0474" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSProvideCommentHelp" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSProvideCommentHelp" time="0.3015" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseApprovedVerbs" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseApprovedVerbs" time="0.0855" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseBOMForUnicodeEncodedFile" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseBOMForUnicodeEncodedFile" time="0.0979" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseCmdletCorrectly" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseCmdletCorrectly" time="5.0352" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseCompatibleCmdlets" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseCompatibleCmdlets" time="0.0885" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseDeclaredVarsMoreThanAssignments" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseDeclaredVarsMoreThanAssignments" time="0.0826" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseLiteralInitializerForHashtable" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseLiteralInitializerForHashtable" time="0.0945" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseOutputTypeCorrectly" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseOutputTypeCorrectly" time="0.0752" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUsePSCredentialType" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUsePSCredentialType" time="0.0851" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSShouldProcess" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSShouldProcess" time="0.8663" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseShouldProcessForStateChangingFunctions" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseShouldProcessForStateChangingFunctions" time="0.056" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseSingularNouns" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseSingularNouns" time="0.0589" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseToExportFieldsInManifest" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseToExportFieldsInManifest" time="0.0539" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSUseUTF8EncodingForHelpFile" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSUseUTF8EncodingForHelpFile" time="0.0489" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCDscExamplesPresent" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSDSCDscExamplesPresent" time="0.0489" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCDscTestsPresent" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSDSCDscTestsPresent" time="0.0465" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCReturnCorrectTypesForDSCFunctions" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSDSCReturnCorrectTypesForDSCFunctions" time="0.0473" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseIdenticalMandatoryParametersForDSC" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseIdenticalMandatoryParametersForDSC" time="0.0576" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseIdenticalParametersForDSC" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseIdenticalParametersForDSC" time="0.0454" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCStandardDSCFunctionsInResource" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSDSCStandardDSCFunctionsInResource" time="0.045" asserts="0" success="True" result="Success" executed="True" /> + <test-case description="passes the PSScriptAnalyzer Rule PSDSCUseVerboseMessageInDSCResource" name="Testing all Modules against default PSScriptAnalyzer rule-set.Testing Module 'C:\projects\cchoco\DSCResources\cChocoPackageInstall\cChocoPackageInstall.psm1'.passes the PSScriptAnalyzer Rule PSDSCUseVerboseMessageInDSCResource" time="0.0454" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + </results> + </test-suite> + </results> + </test-suite> + <test-suite type="TestFixture" name="C:\projects\cchoco\tests\cChoco_xDscResourceTests.ps1" executed="True" result="Success" success="True" time="9.1952" asserts="0" description="C:\projects\cchoco\tests\cChoco_xDscResourceTests.ps1"> + <results> + <test-suite type="TestFixture" name="Testing all DSC resources using xDscResource designer." executed="True" result="Success" success="True" time="7.6797" asserts="0" description="Testing all DSC resources using xDscResource designer."> + <results> + <test-suite type="TestFixture" name="Testing DscResource 'cChocoConfig' using Test-xDscResource" executed="True" result="Success" success="True" time="1.9147" asserts="0" description="Testing DscResource 'cChocoConfig' using Test-xDscResource"> + <results> + <test-case description="Test-xDscResource should return $true" name="Testing all DSC resources using xDscResource designer..Testing DscResource 'cChocoConfig' using Test-xDscResource.Test-xDscResource should return $true" time="1.8619" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscSchema 'cChocoConfig' using Test-xDscSchema" executed="True" result="Success" success="True" time="0.1559" asserts="0" description="Testing DscSchema 'cChocoConfig' using Test-xDscSchema"> + <results> + <test-case description="Test-xDscSchema should return true" name="Testing all DSC resources using xDscResource designer..Testing DscSchema 'cChocoConfig' using Test-xDscSchema.Test-xDscSchema should return true" time="0.1303" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscResource 'cChocoFeature' using Test-xDscResource" executed="True" result="Success" success="True" time="1.2323" asserts="0" description="Testing DscResource 'cChocoFeature' using Test-xDscResource"> + <results> + <test-case description="Test-xDscResource should return $true" name="Testing all DSC resources using xDscResource designer..Testing DscResource 'cChocoFeature' using Test-xDscResource.Test-xDscResource should return $true" time="1.1303" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscSchema 'cChocoFeature' using Test-xDscSchema" executed="True" result="Success" success="True" time="0.1547" asserts="0" description="Testing DscSchema 'cChocoFeature' using Test-xDscSchema"> + <results> + <test-case description="Test-xDscSchema should return true" name="Testing all DSC resources using xDscResource designer..Testing DscSchema 'cChocoFeature' using Test-xDscSchema.Test-xDscSchema should return true" time="0.1299" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscResource 'cChocoInstaller' using Test-xDscResource" executed="True" result="Success" success="True" time="1.294" asserts="0" description="Testing DscResource 'cChocoInstaller' using Test-xDscResource"> + <results> + <test-case description="Test-xDscResource should return $true" name="Testing all DSC resources using xDscResource designer..Testing DscResource 'cChocoInstaller' using Test-xDscResource.Test-xDscResource should return $true" time="1.1917" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscSchema 'cChocoInstaller' using Test-xDscSchema" executed="True" result="Success" success="True" time="0.2672" asserts="0" description="Testing DscSchema 'cChocoInstaller' using Test-xDscSchema"> + <results> + <test-case description="Test-xDscSchema should return true" name="Testing all DSC resources using xDscResource designer..Testing DscSchema 'cChocoInstaller' using Test-xDscSchema.Test-xDscSchema should return true" time="0.2444" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscResource 'cChocoPackageInstall' using Test-xDscResource" executed="True" result="Success" success="True" time="0.9523" asserts="0" description="Testing DscResource 'cChocoPackageInstall' using Test-xDscResource"> + <results> + <test-case description="Test-xDscResource should return $true" name="Testing all DSC resources using xDscResource designer..Testing DscResource 'cChocoPackageInstall' using Test-xDscResource.Test-xDscResource should return $true" time="0.9034" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscSchema 'cChocoPackageInstall' using Test-xDscSchema" executed="True" result="Success" success="True" time="0.1452" asserts="0" description="Testing DscSchema 'cChocoPackageInstall' using Test-xDscSchema"> + <results> + <test-case description="Test-xDscSchema should return true" name="Testing all DSC resources using xDscResource designer..Testing DscSchema 'cChocoPackageInstall' using Test-xDscSchema.Test-xDscSchema should return true" time="0.1173" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscResource 'cChocoSource' using Test-xDscResource" executed="True" result="Success" success="True" time="1.2323" asserts="0" description="Testing DscResource 'cChocoSource' using Test-xDscResource"> + <results> + <test-case description="Test-xDscResource should return $true" name="Testing all DSC resources using xDscResource designer..Testing DscResource 'cChocoSource' using Test-xDscResource.Test-xDscResource should return $true" time="1.2046" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + <test-suite type="TestFixture" name="Testing DscSchema 'cChocoSource' using Test-xDscSchema" executed="True" result="Success" success="True" time="0.2431" asserts="0" description="Testing DscSchema 'cChocoSource' using Test-xDscSchema"> + <results> + <test-case description="Test-xDscSchema should return true" name="Testing all DSC resources using xDscResource designer..Testing DscSchema 'cChocoSource' using Test-xDscSchema.Test-xDscSchema should return true" time="0.2161" asserts="0" success="True" result="Success" executed="True" /> + </results> + </test-suite> + </results> + </test-suite> + </results> + </test-suite> + </results> + </test-suite> +</test-results> \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/appveyor.yml b/deployment/dsc/azshcihost/cChoco/2.5.0.0/appveyor.yml new file mode 100644 index 0000000..bfe6a65 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/appveyor.yml @@ -0,0 +1,48 @@ +#---------------------------------# +# environment configuration # +#---------------------------------# +version: 2.5.0.{build} +os: WMF 5 +install: + - ps: . .\AppVeyor\AppVeyorInstall.ps1 + +environment: + nugetKey: + secure: hwpi8ydkuOj0J22HAalIy+mRq4kxDKH7EjtCqwQ5V96svUwfostPY00EIp2HtNhZ + github_access_token: + secure: Xk7jTkdE82qskQy9WPZK0zSafSjT6gK1SYxH8m4Aa8muCMQ4ACkkztJ3toh9DFlS + ModuleName: cChoco +#---------------------------------# +# build configuration # +#---------------------------------# +build_script: + - ps: . .\AppVeyor\AppVeyorBuild.ps1 + +#---------------------------------# +# test configuration # +#---------------------------------# +test_script: + - ps: . .\AppVeyor\AppVeyorTest.ps1 + +#---------------------------------# +# deployment configuration # +#---------------------------------# +deploy_script: + - ps: . .\AppVeyor\AppveyorDeploy.ps1 + +#---------------------------------# +# notification configuration # +#---------------------------------# +notifications: +- provider: Email + to: + - chocolatey-build-status@googlegroups.com + subject: AppVeyor - cChoco DSC Resource Build Notification + on_build_success: false + on_build_failure: true + on_build_status_changed: true +- provider: Webhook + url: https://webhooks.gitter.im/e/f764ee3ccd6ed7348224 + on_build_success: true + on_build_failure: true + on_build_status_changed: true diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/cChoco.psd1 b/deployment/dsc/azshcihost/cChoco/2.5.0.0/cChoco.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..1def74114ac63477e64e0a2d4bea46046dbf75e9 GIT binary patch literal 1216 zcma)+Yfl<c5Qg8cn)E+x_@s>>f)}bWQ5Q9BZPTFkJ7HHO0!tPVP1C<#`^+q6xvYsf z*>jmQGw(Z>v#<Y7^hckxt~G^9G}4Pw_0-k99u=&NV<aVQsH07GHC45v19l<$3DQJ; zwXuxx6X=@r9j7U>6xkNCuNtBkEcvLbJm>8S{i$1+ZjAP&vl_uKW@mm*LF%*SY{!0z zHFljR=13LT9?jxwA{pb)EJm>E!ET7n{K(=fj;2XGA=)kXlW2k`V`sQ`_)1wPjvm0i z2f{s)9vGI7l(p@QN30z^Fn4FxZSEp;&BCI!JPsHW<mSh6xoBl^$H)@!OvBJ$h&Ip_ za?7?wHgLIlw3-B7(?_fhwaw@h)U4tbU2gNdSzinse+b4;d<~rCNAtGa1-a)--O>+D zn7u!;itMVPJvyz%_@WECr9mxf*p{_R51ui~^h8zr+?3HdR~?NiUxR%Ud7U}O{zX(% z;z+5gW!<{zx1TMeS!cXqSMZZtUU*$PWHi$o>jwREJ$pS;&va(_dCn@NGOZPa#kh;{ zLh>EKF2-{amibu4JB6k7Q`VP@IB%!Ss<_*it7dQRBk%GX{qf`-8^Jixch9B0g6>>4 eejtrtXi+U^eUV*_uHNIT`d9L|{MTpuYyAf~PqS?R literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cChoco/2.5.0.0/readme.md b/deployment/dsc/azshcihost/cChoco/2.5.0.0/readme.md new file mode 100644 index 0000000..b8c6883 --- /dev/null +++ b/deployment/dsc/azshcihost/cChoco/2.5.0.0/readme.md @@ -0,0 +1,58 @@ +| Branch | Status | +| ------------- | ------------- | +| master | [![Build status](https://ci.appveyor.com/api/projects/status/qma3jnh23w5vjt46/branch/master?svg=true&passingText=master%20-%20OK&pendingText=master%20-%20PENDING&failingText=master%20-%20FAILED)](https://ci.appveyor.com/project/LawrenceGripper/cchoco/branch/master) | +| development | [![Build status](https://ci.appveyor.com/api/projects/status/qma3jnh23w5vjt46/branch/development?svg=true&passingText=development%20-%20OK&pendingText=development%20-%20PENDING&failingText=development%20-%20FAILED)](https://ci.appveyor.com/project/LawrenceGripper/cchoco/branch/development) | + +# Community Chocolatey DSC Resource + +[![Join the chat at https://gitter.im/chocolatey/cChoco](https://badges.gitter.im/chocolatey/cChoco.svg)](https://gitter.im/chocolatey/cChoco?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +This resource is aimed at getting and installing packages using Chocolatey. + +The resource takes the name of the package and will then install that package. + +See [ExampleConfig.ps1](ExampleConfig.ps1) for example usage. + +See list of packages here: https://chocolatey.org/packages + +## Contributing + +Happy to accept new features and fixes. Outstanding issues which can be worked on tagged `Up For Grabs` under issues. + +### Submitting a PR + +Here's the general process of fixing an issue in the DSC Resource Kit: +1. Fork the repository. +3. Clone your fork to your machine. +4. It's preferred to create a non-master working branch where you store updates. +5. Make changes. +6. Write pester tests to ensure that the issue is fixed. +7. Submit a pull request to the development branch. +8. Make sure all tests are passing in AppVeyor for your pull request. +9. Make sure your code does not contain merge conflicts. +10. Address comments (if any). + +### Build and Publishing + +AppVeyor is used to package up the resource and publish to the PowerShell Gallery (on successful build from a newly pushed tag only). + +The AppVeyor scripts do the following: +- Test the resources using 'xDSCResourceDesigner' +- Verify best practises using 'PSScriptAnalyzer' +- Update the version in the manifest file +- Publish the module to the PowerShell gallery +- Check in updated manifest file to GitHub + +To build: + +1. Update `ModuleVersion` in `cChoco.psd1` - use `major.minor.patch.0`; +2. Update `version` in `appveyor.yml` - use `major.minor.patch.{build}`; +3. Merge development branch to master - `git checkout master`, `git merge development`; +4. Tag master with new version - `git tag v<major.minor.patch>`; +5. Push changes with tag `git push v<major.minor.patch>` + +## Known Issues / Troubleshooting + +### WS-Management - Exceeds the maximum envelope size allowed + +The maximum envelope size for WinRM is not sufficient for installing large packages. To increase the envelope size use `winrm set winrm/config @{MaxEnvelopeSizekb=”153600″}` - this exampe will increase it to 150MB. \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/README.md b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/README.md new file mode 100644 index 0000000..eddff87 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/README.md @@ -0,0 +1,51 @@ +#cVMIPAddress# +This DSC resource helps in injecting IP addresses into a running VM on the Hyper-V host. This is especially useful in a bootstrap scenario where there is no DHCP server or unattended XML method to configure an IP Address inside the guest OS. I use this quite a lot for building VMs from template VHDx files. + +![](http://i.imgur.com/S3UVP7F.png) + +The *Id* property is used to uniquely differentiate a VM network adapter that needs configuration. This is not a adapter property but a property that identifies the resource instance. This is a mandatory property. + +The *NetAdapterName* property identifies the VM network adapter. This is a mandatory property. + +The *VMName* property identifies the VM to which the network adapter is connected to. This is a mandatory property. + +The *IPAddress* property is the IP address that will be assigned to the network adapter. This is a mandatory property. If you want to remove a configured IP address or reset the IP address to DHCP, specify 'DHCP' as the value of this parameter. + +The *DefaultGateway* property is the default gateway address that will be assigned to the network adapter. + +The *Subnet* property is the subnet mask that will be assigned to the network adapter. + +The *DnsServer* property is the DNS Server address that will be assigned to the network adapter. + +Here are some examples that demonstrates how to use this resource. + +##Assigning an IP address to a VM adapter## + Configuration VMIPAddress + { + Import-DscResource -ModuleName cHyper-V -Name cVMIPAddress + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMIPAddress VMAdapter1IPAddress { + Id = 'VMMgmt-NIC' + NetAdapterName = 'VMMgmt-NIC' + VMName = 'SQLVM01' + IPAddress = '172.16.101.101' + DefaultGateway = '172.16.101.1' + Subnet = '255.255.255.0' + DnsServer = '172.16.101.2' + } + } + +##Removing an IP address assigned to a VM adapter## + Configuration VMIPAddress + { + Import-DscResource -ModuleName cHyper-V -Name cVMIPAddress + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMIPAddress VMAdapter1IPAddress { + Id = 'VMMgmt-NIC' + NetAdapterName = 'VMMgmt-NIC' + VMName = 'SQLVM01' + IPAddress = 'DHCP' + } + } \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/cVMIPAddress.psm1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/cVMIPAddress.psm1 new file mode 100644 index 0000000000000000000000000000000000000000..ac079345b4d49c50d86ec82a1464372b6f0971b9 GIT binary patch literal 22566 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 K4>DXjb@YG3Wvn>> literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/cVMIPAddress.schema.mof b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/cVMIPAddress.schema.mof new file mode 100644 index 0000000000000000000000000000000000000000..aa0536be20d6d2a03c61b96bd22d434565372144 GIT binary patch literal 638 zcmbV~UrPc}5XFDbLEquhlR-$n=2Iz&geEQ6gM_HN#e%MXT8$<A>e`tJUo;;!F5H>B z_nb3l=I(wspuv<8pIUtqR*ETeGAdkAqspz~H8%tvb(;#45sOpM6>p}qAtz#YXw&0f zx3Q3kYZ~{BOD=>s)Cp(NfjiZCcBLT??knNNwdSm)I#F(F-@XT-Z4G$R_d=Bd5xM)! z_|T~>FZCm==`E#}y36<vmi2Pzt~|Rd{oLm;Vxi2Y`hT_4nI1cO^?t3+Y5$S>9P7o* lQ5jxSjCaj{tyjxwDKq^q#iFE6rvD%kcg4o{Ul&`c`~b%gXI}sS literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/en-US/cVMIPAddress.psd1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMIPAddress/en-US/cVMIPAddress.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..96c4acfcf781cbe696dafc61b5ef73fd39b1e1d9 GIT binary patch literal 2792 zcmcguO>@&Q5ZyB~{0H57D*wPUFbz$6Xkai?&Tj0KOq008F`<7RcyDDzk{uay>12{v z@_xU!EB*O>CAIA2r&O|+gIwdcmaSY$j@4e)c=sqXDX=QU$a}fKul>B0H>c+Xv~J`@ zp4HC1++kfxD;un{;LWAnL+3Nz9#t}z@A%)~V<H^`zcqXsS>eCMs+4yUdZdRvbicwv zf%l*At>gpb3Pf>G>zUf5l);XbGti@?ft;0PZp_{wrnSmhY05N^+N$*K^puKd4!MIY z^w(B(1$&Rk|BLRiniVQ-Ysw5Mf7Cpl;A^RoS)CT~Fs`-k#hHhG`uR@t<T7`8Ga_cS zN3JQaIZ$}$V!p$3gXl831(uAVR4f|ovaUqSfI(ivAnyVwx5$|?+s=Z4P1gAt`nA@k z#G2YR9wI>Iu@Xz{(%<w-<yzq(A~P`Z3YId&NDOG5JU1PB9+MEq7!z`&hK92hW0dmD zu5#H7y-#O^^Bz_wj=*Le`Xe4oe274!xiglqu6-oaj3h3hwG~#IUWX1NxK@8;0eh19 z`)W9B$<2^WV==5cdt}VH>>W1!%-#MNlcs0rto5^V`{Q2HIn3o7*i|cDb{c+^U%-o) zXLwVgM+&Vw=j0sE?B^r?U$7oyZrNG&Q?@!;X8*E7iO>&NU+WX=ON8i&Q_@as+q->) zhG@*tUCn4N3vgk)POlwvx_%x7cG15kl0h9EYIZuFuWop@rG2OQkk&Ei4$Gp~!aMA1 zo=D^orw;j9Ci=e5B7Y8fE_xe0H(F(*KaKq?X3cqCKY*v_*l4GJjN`O!{eLW--86De zV!UVB_aS~^e(9bKS!L%jXS}~5rK8IAF1JLl^G3od4o}C});Q1N`OF(4?~DiBjd;7; k!3R%Zo(a4|#(pVnAQ4u8@?=J+?QaWJcOG2e#>yJ}1$=tuc>n+a literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/Readme.md b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/Readme.md new file mode 100644 index 0000000..520496e --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/Readme.md @@ -0,0 +1,111 @@ +#Using cVMNetworkAdapter resource# +This DSC resource can be used to attach network adapters to VM switches and add them to either management OS or virtual machines on the host. + +![](http://i.imgur.com/KVSWBo8.png) + +The *Id* property is the unique key within this DSC resource. This property isn't related to any VM network adapter configuration but instead used as a way to uniquely identify each VM network adapter resource in a configuration. This property was introduced in an earlier version of this resource to ensure you can add netowrk adapter with the same name to different virtual machines. Make a note of that. **This won't still let you create two network adapters with the same name and attach them to same VM.** When configuring management OS or VM with multiple network adapters, you should still use unique name for each network adapter. *DO NOT USE A GUID AS AN ARGUMENT. ESPECIALLY, DYNAMICALLY GENERATED GUIDs* + +In the previous version of this DSC resource, *Name* property was the key property. Having *Name* as the key property prevented creating network adapters with the same name and attach them to different VMs. So, if you need to add a network adapter to the management OS, specify *VMName* as 'ManagementOS'. If the value of *VMName* property is not 'ManagementOS', it will be considered a Virtual Machine configuration and a network adapter will be added to VM on the Hyper-V host. + +The *Name* property and *SwitchName* property identify the name to be assigned to the VM network adapter and the name of the switch to attach to. + +If you want to assign a static MAC address to the VM network adapter, you can use the *MacAddress* property. Providing a value to this property sets the static MAC address on the VM network adapter. Removing this value will make it a dynamic MAC address. This can be used only with the virtual machine adapters and not management OS. + +The following examples demonstrate how to use this resource module. + +## Create a management OS adapter on the Hyper-V host ## + Configuration HostOSAdapter + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapter HostOSAdapter { + Id = 'Management-NIC' + Name = 'Management-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } + } + +## Create multiple management OS adapters on the Hyper-V host ## + Configuration HostOSAdapter + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapter ManagementAdapter { + Id = 'Management-NIC' + Name = 'Management-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } + + cVMNetworkAdapter ClusterAdapter { + Id = 'Cluster-NIC' + Name = 'Cluster-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } + } + +## Create multiple management OS adapters on the Hyper-V host ## + Configuration VMAdapter + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapter MyVM01NIC { + Id = 'MyVM01-NIC' + Name = 'MyVM01-NIC' + SwitchName = 'SETSwitch' + VMName = 'MyVM01' + Ensure = 'Present' + } + + cVMNetworkAdapter MyVM02NIC { + Id = 'MyVM02-NIC' + Name = 'NetAdapter' + SwitchName = 'SETSwitch' + VMName = 'MyVM02' + Ensure = 'Present' + } + + #The following resource configuration shows that the different VMs can have network adapters with the same name. This is possible because Id is the key property and not Name. + cVMNetworkAdapter MyVM03NIC { + Id = 'MyVM03-NIC' + Name = 'NetAdapter' + SwitchName = 'SETSwitch' + VMName = 'MyVM03' + Ensure = 'Present' + } + } + +##Create multiple management OS adapters with static MAC address on the Hyper-V host ## + Configuration VMAdapter + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapter MyVM01NIC { + Id = 'MyVM01-NIC' + Name = 'MyVM01-NIC' + SwitchName = 'SETSwitch' + MacAddress = '001523be0c' + VMName = 'MyVM01' + Ensure = 'Present' + } + + cVMNetworkAdapter MyVM02NIC { + Id = 'MyVM02-NIC' + Name = 'MyVM02-NIC' + SwitchName = 'SETSwitch' + MacAddress = '001523be0d' + VMName = 'MyVM02' + Ensure = 'Present' + } + } + +If you want to remove a network adapter either from the management OS or virtual machine, you need to set the *Ensure* property to *Absent*. \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/cVMNetworkAdapter.psm1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/cVMNetworkAdapter.psm1 new file mode 100644 index 0000000..836d6ac --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/cVMNetworkAdapter.psm1 @@ -0,0 +1,308 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData -BindingVariable LocalizedData -filename cVMNetworkAdapter.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + #fallback to en-US + Import-LocalizedData -BindingVariable LocalizedData -filename cVMNetworkAdapter.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +Function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName + ) + + $configuration = @{ + Id = $Id + Name = $Name + SwitchName = $SwitchName + VMName = $VMName + } + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose -Message $localizedData.GetVMNetAdapter + $netAdapter = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($netAdapter) + { + Write-Verbose $localizedData.FoundVMNetAdapter + if ($VMName -eq 'ManagementOS') + { + $configuration.Add('MacAddress', $netAdapter.MacAddress) + $configuration.Add('DynamicMacAddress', $false) + } + elseif ($netAdapter.VMName) + { + $configuration.Add('MacAddress', $netAdapter.MacAddress) + $configuration.Add('DynamicMacAddress', $netAdapter.DynamicMacAddressEnabled) + } + $configuration.Add('Ensure','Present') + } + else + { + Write-Verbose -Message $localizedData.NoVMNetAdapterFound + $configuration.Add('Ensure','Absent') + } + + return $configuration +} + +Function Set-TargetResource +{ + [CmdletBinding()] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter()] + [String] $MacAddress, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] $Ensure='Present' + ) + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose $localizedData.GetVMNetAdapter + $netAdapterExists = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($Ensure -eq 'Present') + { + if ($netAdapterExists) + { + Write-Verbose $localizedData.FoundVMNetAdapter + if (($VMName -ne 'ManagementOS')) + { + if ($MacAddress) + { + if ($netAdapterExists.DynamicMacAddressEnabled) + { + Write-Verbose -Message $localizedData.EnableStaticMacAddress + $updateMacAddress = $true + } + elseif ($MacAddress -ne $netAdapterExists.StaicMacAddress) + { + Write-Verbose -Message $localizedData.EnableStaticMacAddress + $updateMacAddress = $true + } + } + else + { + if (-not $netAdapterExists.DynamicMacAddressEnabled) + { + Write-Verbose $localizedData.EnableDynamicMacAddress + $updateMacAddress = $true + } + } + + if ($netAdapterExists.SwitchName -ne $SwitchName) + { + Write-Verbose $localizedData.PerformSwitchConnect + Connect-VMNetworkAdapter -VMNetworkAdapter $netAdapterExists -SwitchName $SwitchName -ErrorAction Stop -Verbose + } + + if (($updateMacAddress)) + { + Write-Verbose $localizedData.PerformVMNetModify + + $setArguments = @{ } + $setArguments.Add('VMNetworkAdapter',$netAdapterExists) + if ($MacAddress) + { + $setArguments.Add('StaticMacAddress',$MacAddress) + } + else + { + $setArguments.Add('DynamicMacAddress', $true) + } + Set-VMNetworkAdapter @setArguments -ErrorAction Stop + } + } + } + else + { + if ($VMName -ne 'ManagementOS') + { + if (-not $MacAddress) + { + $arguments.Add('DynamicMacAddress',$true) + } + else + { + $arguments.Add('StaticMacAddress',$MacAddress) + } + $arguments.Add('SwitchName',$SwitchName) + } + Write-Verbose $localizedData.AddVMNetAdapter + Add-VMNetworkAdapter @arguments -ErrorAction Stop + } + } + else + { + Write-Verbose $localizedData.RemoveVMNetAdapter + Remove-VMNetworkAdapter @arguments -ErrorAction Stop + } +} + +Function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter()] + [String] $MacAddress, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] $Ensure='Present' + ) + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose $localizedData.GetVMNetAdapter + $netAdapterExists = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($Ensure -eq 'Present') + { + if ($netAdapterExists) + { + if ($VMName -ne 'ManagementOS') + { + if ($MacAddress) + { + if ($netAdapterExists.DynamicMacAddressEnabled) + { + Write-Verbose $localizedData.EnableStaticMacAddress + return $false + } + elseif ($netAdapterExists.MacAddress -ne $MacAddress) + { + Write-Verbose $localizedData.StaticAddressDoesNotMatch + return $false + } + } + else + { + if (-not $netAdapterExists.DynamicMacAddressEnabled) + { + Write-Verbose $localizedData.EnableDynamicMacAddress + return $false + } + } + + if ($netAdapterExists.SwitchName -ne $SwitchName) + { + Write-Verbose $localizedData.SwitchIsDifferent + return $false + } + else + { + Write-Verbose $localizedData.VMNetAdapterExistsNoActionNeeded + return $true + } + } + else + { + Write-Verbose $localizedData.VMNetAdapterExistsNoActionNeeded + return $true + } + } + else + { + Write-Verbose $localizedData.VMNetAdapterDoesNotExistShouldAdd + return $false + } + } + else + { + if ($netAdapterExists) + { + Write-Verbose $localizedData.VMNetAdapterExistsShouldRemove + return $false + } + else + { + Write-Verbose $localizedData.VMNetAdapterDoesNotExistNoActionNeeded + return $true + } + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/cVMNetworkAdapter.schema.mof b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/cVMNetworkAdapter.schema.mof new file mode 100644 index 0000000000000000000000000000000000000000..92b22082820d7ee5b54cb68d5875a9789f6ca876 GIT binary patch literal 734 zcmb7>PfG$(6vfZBpzkoaDv*elwNguvup+@0Au&E5HK@;Wj1cjwSHJtzF&G!hFn`{i zd(J)goZp`l9qUC6jg%_q>dI@%JJUo#r>f{u=ej8Fiq2G3q9$D#y+H%8bKQd<b2fy7 zrA@_arf+zr8mdNLst+p0Z!A68Y*$Q9_P`~&V)g^<ExoE9HG4h5nKS1LX2-YjF5>fu z-R`K&nU<)-bW<Jl#;Jv(>!QmzK4Hk{@cb$FZ#Fyx(_#ONsZQ^OLx<p3KCYbI;-2Fc z=44rA8&6zxdk{CVOm`tI!!ErecJ}yb*(}KAagDNMXPm3tHT7ZHRF*OSEjHg9S5|w= llsx9<|EaVr(sc%Pa-E>kDgn(mWEuD#<Ex9hcW=9d?+<O$dnf<^ literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/en-US/cVMNetworkAdapter.psd1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/en-US/cVMNetworkAdapter.psd1 new file mode 100644 index 0000000..c60f3ff --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapter/en-US/cVMNetworkAdapter.psd1 @@ -0,0 +1,23 @@ +ConvertFrom-StringData @' + VMNameAndManagementTogether=VMName cannot be provided when ManagementOS is set to True. + MustProvideVMName=Must provide VMName parameter when ManagementOS is set to False. + GetVMNetAdapter=Getting VM Network Adapter information. + FoundVMNetAdapter=Found VM Network Adapter. + NoVMNetAdapterFound=No VM Network Adapter found. + StaticMacAddressChosen=Static MAC Address has been specified. + StaticAddressDoesNotMatch=Staic MAC address on the VM Network Adapter does not match. + ModifyVMNetAdapter=VM Network Adapter exists with different configuration. This will be modified. + EnableDynamicMacAddress=VM Network Adapter exists but without Dynamic MAC address setting. + EnableStaticMacAddress=VM Network Adapter exists but without static MAC address setting. + PerformVMNetModify=Performing VM Network Adapter configuration changes. + CannotChangeHostAdapterMacAddress=VM Network adapter in configuration is a host adapter. Its configuration cannot be modified. + AddVMNetAdapter=Adding VM Network Adapter. + RemoveVMNetAdapter=Removing VM Network Adapter. + VMNetAdapterExistsNoActionNeeded=VM Network Adapter exists with requested configuration. No action needed. + VMNetAdapterDoesNotExistShouldAdd=VM Network Adapter does not exist. It will be added. + VMNetAdapterExistsShouldRemove=VM Network Adapter Exists. It will be removed. + VMNetAdapterDoesNotExistNoActionNeeded=VM Network adapter does not exist. No action needed. + StaticMacExists=StaicMacAddress configuration exists as desired. + SwitchIsDifferent=Net Adapter is not connected to the requested switch. + PerformSwitchConnect=Connecting VM Net adapter to the right switch. +'@ diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/README.md b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/README.md new file mode 100644 index 0000000..336a44f --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/README.md @@ -0,0 +1,78 @@ +#Using cVMNetworkAdapterSettings resource# +Once the VM network adapters are created, we can assign the bandwidth reservation or priority settings as needed. If we set the *MinimumBandwidthMode* to *Weight* during VM switch creation, we need to specify the percentage of bandwidth reservation for each adapter. We can this DSC resource for the purpose of updating the VM network adapter settings. This DSC resource can used for many other settings such as *DhcpGuard*, *RouterGuard*, *DeviceNaming*, and so on. + +![](http://i.imgur.com/tZ1d4Fv.png) + +The *Id* property is mandatory as a unique key for the resource configuration. This identifies the right resource instance of the network adapter in the system. This was chosen as an input property because the VM network adapter name can be the same for multiple adapters connected to the same VM or management OS. + +The *Name* property identifies the name of the virtual network adapter. This is a required property. + +The *SwitchName* property is used to specify where (the VM switch) the network adapter is connected. This is a required property too. + +The *VMName* property is used to if a network adapter is connected to a VM or Management OS. If you need to add a network adapter to the management OS, specify *VMName* as 'ManagementOS'. If the value of *VMName* property is not 'ManagementOS', it will be considered a VM configuration and the network adapter attached to the VM will be configured for specified settings. + +The *MaximumBandwidth* property is used to specify the maximum bandwidth, in bits per second, for the VM network adapter. + +The *MinimumBandwidthAbsolute* specifies the minimum bandwidth, in bits per second, for the virtual network adapter. By default, these properties are set to zero which means those parameters within the network adapter are disabled. + +The *MinimumBandwidthWeight* specifies the minimum bandwidth, in terms of relative weight, for the virtual network adapter. The weight describes how much bandwidth to provide to the virtual network adapter relative to other virtual network adapters connected to the same virtual switch. + +If you want allow teaming of network adapters in the guest OS, you can set the *AllowTeaming* property to On. By default, this is set to *Off* and therefore disallows network teaming inside guest OS. + +Similar to this, there are other settings of a VM network adapter that you can configure. These properties include *DhcpGuard*, *MacAddressSpoofing*, *PortMirroring*, *RouterGuard*, *IeeePriorityTag*, *DeviceNaming*, and *VmqWeight*. These properties are self explanatory and are left to defaults for a VM network adapter. + +The following examples demonstrate how to use this DSC resource. + +##Setting MinimumBandwidthWeight for a VM adapter in management OS## + Configuration HostOSAdapterSettings + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterSettings + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterSettings HostOSAdapterSettings { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'ManagementOS' + SwitchName = 'SETSwitch' + MinimumBandwidthWeight = 20 + } + } + +##Setting DHCP guard for a VM adapter connected to a VM## + Configuration VMAdapterSettings + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterSettings + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterSettings VMAdapterSettings { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'DHCPVM01' + SwitchName = 'SETSwitch' + DhcpGuard = 'On' + } + } + +##Setting DHCPGuard and DeviceNaming on multiple VM network adapters connected to the same VM## + Configuration VMAdapterSettings + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterSettings + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterSettings VMAdapterSettings01 { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'DHCPVM01' + SwitchName = 'SETSwitch' + DhcpGuard = 'On' + DeviceNaming = 'On' + } + + cVMNetworkAdapterSettings VMAdapterSettings02 { + Id = 'App-NIC' + Name = 'App-NIC' + VMName = 'DHCPVM01' + SwitchName = 'SETSwitch' + DeviceNaming = 'On' + } + } \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/cVMNetworkAdapterSettings.psm1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/cVMNetworkAdapterSettings.psm1 new file mode 100644 index 0000000..b8872a6 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/cVMNetworkAdapterSettings.psm1 @@ -0,0 +1,297 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData -BindingVariable LocalizedData -filename cVMNetworkAdapterSettings.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + #fallback to en-US + Import-LocalizedData -BindingVariable LocalizedData -filename cVMNetworkAdapterSettings.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +Function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName + ) + + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + $configuration = @{ + Id = $Id + Name = $Name + SwitchName = $SwitchName + } + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose $localizedData.GetVMNetAdapter + $netAdapter = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($netAdapter) + { + Write-Verbose $localizedData.FoundVMNetAdapter + $configuration.Add('MacAddressSpoofing', $netAdapter.MacAddressSpoofing) + $configuration.Add('DhcpGuard', $netAdapter.DhcpGuard) + $configuration.Add('RouterGuard', $netAdapter.RouterGuard) + $configuration.Add('AllowTeaming', $netAdapter.AllowTeaming) + $configuration.Add('VmqWeight', $netAdapter.VmqWeight) + $configuration.Add('MaximumBandwidth',$netAdapter.BandwidthSetting.MaximumBandwidth) + $configuration.Add('MinimumBandwidthWeight',$netAdapter.BandwidthSetting.MinimumBandwidthWeight) + $configuration.Add('MinimumBandwidthAbsolute',$netAdapter.BandwidthSetting.MinimumBandwidthAbsolute) + $configuration.Add('IeeePriorityTag',$netAdapter.IeeePriorityTag) + $configuration.Add('PortMirroring',$netAdapter.PortMirroringMode) + $configuration.Add('DeviceNaming',$netAdapter.DeviceNaming) + } + else + { + Write-Warning $localizedData.NoVMNetAdapterFound + } + + return $configuration +} + +Function Set-TargetResource +{ + [CmdletBinding()] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter()] + [ValidateSet('On','Off')] + [String] $MacAddressSpoofing = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $DhcpGuard = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $IeeePriorityTag = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $RouterGuard = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $AllowTeaming = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $DeviceNaming = 'On', + + [Parameter()] + [uint64] $MaximumBandwidth = 0, + + [Parameter()] + [ValidateRange(0,100)] + [uint32] $MinimumBandwidthWeight = 0, + + [Parameter()] + [uint32] $MinimumBandwidthAbsolute, + + [Parameter()] + [ValidateRange(0,100)] + [uint32] $VmqWeight = 100, + + [Parameter()] + [ValidateSet('None','Source','Destination')] + [String] $PortMirroring = 'None' + ) + + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose $localizedData.GetVMNetAdapter + $netAdapter = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + $setArguments = @{ + VMNetworkAdapter = $netAdapter + MacAddressSpoofing = $MacAddressSpoofing + DhcpGuard = $DhcpGuard + RouterGuard = $RouterGuard + VmqWeight = $VmqWeight + MaximumBandwidth = $MaximumBandwidth + MinimumBandwidthWeight = $MinimumBandwidthWeight + MinimumBandwidthAbsolute= $MinimumBandwidthAbsolute + IeeePriorityTag = $IeeePriorityTag + AllowTeaming = $AllowTeaming + PortMirroring = $PortMirroring + DeviceNaming = $DeviceNaming + } + + Write-Verbose $localizedData.PerformVMNetModify + Set-VMNetworkAdapter @setArguments -ErrorAction Stop +} + +Function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter()] + [ValidateSet('On','Off')] + [String] $MacAddressSpoofing = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $DhcpGuard = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $IeeePriorityTag = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $RouterGuard = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $AllowTeaming = 'Off', + + [Parameter()] + [ValidateSet('On','Off')] + [String] $DeviceNaming = 'On', + + [Parameter()] + [uint64] $MaximumBandwidth = 0, + + [Parameter()] + [ValidateRange(0,100)] + [uint32] $MinimumBandwidthWeight = 0, + + [Parameter()] + [uint32] $MinimumBandwidthAbsolute, + + [Parameter()] + [ValidateRange(0,100)] + [uint32] $VmqWeight = 100, + + [Parameter()] + [ValidateSet('None','Source','Destination')] + [String] $PortMirroring = 'None' + ) + + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose $localizedData.GetVMNetAdapter + $adapterExists = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($adapterExists) + { + Write-Verbose $localizedData.FoundVMNetAdapter + if ($adapterExists.MacAddressSpoofing -eq $MacAddressSpoofing ` + -and $adapterExists.RouterGuard -eq $RouterGuard ` + -and $adapterExists.DhcpGuard -eq $DhcpGuard ` + -and $adapterExists.IeeePriorityTag -eq $IeeePriorityTag ` + -and $adapterExists.AllowTeaming -eq $AllowTeaming ` + -and $adapterExists.BandwidthSetting.MaximumBandwidth -eq $MaximumBandwidth ` + -and $adapterExists.BandwidthSetting.MinimumBandwidthWeight -eq $MinimumBandwidthWeight ` + -and $adapterExists.BandwidthSetting.MinimumBandwidthAbsolute -eq $MinimumBandwidthAbsolute ` + -and $adapterExists.VMQWeight -eq $VMQWeight ` + -and $adapterExists.PortMirroringMode -eq $PortMirroring ` + -and $adapterExists.DeviceNaming -eq $DeviceNaming + ) + { + Write-Verbose $localizedData.VMNetAdapterExistsNoActionNeeded + return $true + } + else + { + Write-Verbose $localizedData.VMNetAdapterExistsWithDifferentConfiguration + return $false + } + } + else + { + throw $localizedData.VMNetAdapterDoesNotExist + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/cVMNetworkAdapterSettings.schema.mof b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/cVMNetworkAdapterSettings.schema.mof new file mode 100644 index 0000000000000000000000000000000000000000..9dc25821648c23dcac8726208d749432055dbc28 GIT binary patch literal 1876 zcmd6o-Ae*N6vfZ0LI1<zQ$a*u^pH<h6cUwW=|e==y6KW1rIv~KuUEf2Q!1&HK9mgW z?9SXd_sqE;zP~MNN!L11RYkQJc|~e6$7-mq6(zN)b#3!(xF@MqttrqERx!49l{nkg z8Ru(!+ldgAQ&u9i)d8oe2c@wq>X8-0&$+!e2z8b5W~etZF5!SlFb7VcJ-D6YJ)>Lg zyE{d?z*`F*&v*`bH$Of1o8ayztaR}nz^d(TWt;*KN=gl^4C4ue7>kIVar-X?W;v5X zpBS&9Dgy;)Iq!A$$`8*K+$~ILi&P#JsxXgG#Uju{?Q?WbvTJYmjHLSCY+F<9#&2%8 zp^I?IsbhJR!&8HC{~6=|V|R$QA#9G(pa{RwsQ$H58KPh#>mp>8VbSmE5@zL*Z2N0o z7p^*dZ7zaNX)?A7rw+<QXj5B&EQ<633+o@g(tYnrDKY2~!>Cz}Tsh8d?P`ZFtC3e$ zYGh%}btdbaR{bS1pfWM`qbS?jawz6?I!Xa{F_}~Wb5h04j+oY+>z&p?EI)pSn&*yB z`iaf7?sP`v>-h2=D(7<3cW%FO$X*LJrbW@sW<RZm&5t(T>9TNX;_(#UO@^;v`@itI H^qD^Zy@)vS literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/en-US/cVMNetworkAdapterSettings.psd1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/en-US/cVMNetworkAdapterSettings.psd1 new file mode 100644 index 0000000..229b830 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterSettings/en-US/cVMNetworkAdapterSettings.psd1 @@ -0,0 +1,12 @@ +ConvertFrom-StringData @' + HyperVModuleNotFound=Hyper-V PowerShell Module not found. + VMNameAndManagementTogether=VMName cannot be provided when ManagementOS is set to True. + MustProvideVMName=Must provide VMName parameter when ManagementOS is set to False. + GetVMNetAdapter=Getting VM Network Adapter information. + FoundVMNetAdapter=Found VM Network Adapter. + NoVMNetAdapterFound=No VM Network Adapter found. + PerformVMNetModify=Performing VM Network Adapter configuration changes. + VMNetAdapterExistsNoActionNeeded=VM Network Adapter exists with requested configuration. No action needed. + VMNetAdapterDoesNotExist=VM Network adapter does not exist. + VMNetAdapterExistsWithDifferentConfiguration=VM Network Adapter exists but different configuration. This will be fixed. +'@ diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/Readme.md b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/Readme.md new file mode 100644 index 0000000..1264430 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/Readme.md @@ -0,0 +1,94 @@ +#Using cVMNetworkAdapterVlan resource# +This DSC resource can be used to assign VLAN information to a NIC that is created attached to either the management OS or a virtual machine. There are several possibilities here. + +![](http://i.imgur.com/GMsXDyK.png) + +This resource has three mandatory properties. + +The *Id* property is a unique identifier to differentiate between multiple VMs containing the same network adapter name or same VM having multiple adapters named same. + +The *Name* property identifies the name of the network adapter for which the VLAN information needs to be configured. + +The *VMName* property identifies where the network adapter is connected. You can specify host OS by specifying a value *ManagementOS*. If the value of *VMName* property is not *ManagementOS*, it will be considered a Virtual Machine configuration and the network adapter attached to the VM will be configured for VLAN settings. + +The *AdapterMode* property specifies the operation mode of the adapter and is by default set to *Untagged* which means there is no VLAN configuration. The possible and valid values for this property are *Untagged*, *Access*, *Trunk*, *Community*, *Isolated*, and *Promiscuous*. Each of these modes have a corresponding VLAN property that is mandatory. + +If you set the *AdapterMode* property to *Access*, then it is mandatory to provide *VlanId* property. + +If you set the *AdapterMode* to *Trunk*, the *NativeVlanId* property must be specified. + +The following examples demonstrate how to use this DSC resource. + +##Simple Management OS NIC VLAN configuration for Access VLAN## + + Configuration HostOSAdapterVlan + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterVlan + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterVlan HostOSAdapterVlan { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'ManagementOS' + AdapterMode = 'Access' + VlanId = 10 + } + } + +##Multiple Management OS NIC VLAN configuration for Access and Untagged VLAN## + + Configuration HostOSAdapterVlan + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterVlan + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterVlan HostOSAdapterVlan { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'ManagementOS' + AdapterMode = 'Access' + VlanId = 10 + } + + cVMNetworkAdapterVlan ClusterAdapterVlan { + Id = 'Cluster-NIC' + Name = 'Cluster-NIC' + VMName = 'ManagementOS' + AdapterMode = 'Access' + VlanId = 20 + } + + #The following configuration removes any VLAN setting, if present. + cVMNetworkAdapterVlan JustAnotherAdapterVlan { + Id = 'JustAnother-NIC' + Name = 'JustAnother-NIC' + VMName = 'ManagementOS' + AdapterMode = 'Untagged' + } + } + +In the above example, setting the *AdapterMode* to *Untagged* removes any VLAN configuration on the NIC, if present. By default, all VM network adapters will be in Untagged mode. + +##Multiple Management OS NIC VLAN configuration for Access and Untagged VLAN## + + Configuration HostOSAdapterVlan + { + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterVlan + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterVlan VMMgmtAdapterVlan { + Id = 'VMManagement-NIC' + Name = 'VMManagement-NIC' + VMName = 'SQLVM01' + AdapterMode = 'Access' + VlanId = 10 + } + + cVMNetworkAdapterVlan VMiSCSIAdapterVlan { + Id = 'VMiSCSI-NIC' + Name = 'VMiSCSI-NIC' + VMName = 'SQLVM01' + AdapterMode = 'Untagged' + } + } + diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/cVMNetworkAdapterVlan.psm1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/cVMNetworkAdapterVlan.psm1 new file mode 100644 index 0000000..9d42a50 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/cVMNetworkAdapterVlan.psm1 @@ -0,0 +1,444 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData -BindingVariable localizedData -filename cVMNetworkAdapterVlan.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + #fallback to en-US + Import-LocalizedData -BindingVariable localizedData -filename cVMNetworkAdapterVlan.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +Function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $VMName + ) + + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + $configuration = @{ + Id = $Id + Name = $Name + VMName = $VMName + } + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + } + + try { + Write-Verbose $localizedData.GetVMNetAdapter + $adapterExists = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($adapterExists) + { + Write-Verbose $localizedData.FoundVMNetAdapter + $configuration.Add('AdapterMode',$adapterExists.VlanSetting.OperationMode) + $configuration.Add('VlanId',$adapterExists.VlanSetting.AccessVlanId) + $configuration.Add('NativeVlanId',$adapterExists.VlanSetting.NativeVlanId) + $configuration.Add('PrimaryVlanId',$adapterExists.VlanSetting.PrimaryVlanId) + $configuration.Add('SecondaryVlanId',$adapterExists.VlanSetting.SecondaryVlanId) + $configuration.Add('SecondaryVlanIdList',$adapterExists.VlanSetting.SecondaryVlanIdListString) + $configuration.Add('AllowedVlanIdList',$adapterExists.VlanSetting.AllowedVlanIdListString) + } + } + catch + { + Write-Error $_ + } + + return $configuration +} + +Function Set-TargetResource +{ + [CmdletBinding()] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter()] + [ValidateSet('Untagged','Access','Trunk','Communnity','Isolated','Promiscuous')] + [String] $AdapterMode = 'Untagged', + + [Parameter()] + [uint32] $VlanId, + + [Parameter()] + [uint32] $NativeVlanId, + + [Parameter()] + [String] $AllowedVlanIdList, + + [Parameter()] + [uint32] $PrimaryVlanId, + + [Parameter()] + [uint32] $SecondaryVlanId, + + [Parameter()] + [String] $SecondaryVlanIdList + ) + + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + } + + try + { + Write-Verbose $localizedData.GetVMNetAdapter + $adapterExists = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + if ($adapterExists) + { + Write-Verbose $localizedData.FoundVMNetAdapter + $setArguments = $arguments + $setArguments.Remove('Name') + $setArguments.Add('VMNetworkAdapterName',$Name) + switch ($AdapterMode) + { + 'Untagged' + { + $setArguments.Add('Untagged',$true) + break + } + + 'Access' + { + $setArguments.Add('Access',$true) + $setArguments.Add('VlanId',$VlanId) + break + } + + 'Trunk' + { + $setArguments.Add('Trunk',$true) + $setArguments.Add('NativeVlanId',$NativeVlanId) + if ($AllowedVlanIdList) + { + $setArguments.Add('AllowedVlanIdList',$AllowedVlanIdList) + } + break + } + + 'Community' + { + $setArguments.Add('Community',$true) + $setArguments.Add('PrimaryVlanId',$PrimaryVlanId) + if ($SecondaryVlanId) + { + $setArguments.Add('SecondaryVlanId',$SecondaryVlanId) + } + break + } + + 'Isolated' + { + $setArguments.Add('Isolated',$true) + $setArguments.Add('PrimaryVlanId',$PrimaryVlanId) + if ($SecondaryVlanId) + { + $setArguments.Add('SecondaryVlanId',$SecondaryVlanId) + } + break + } + + 'Promiscuous' + { + $setArguments.Add('Promiscuous',$true) + $setArguments.Add('PrimaryVlanId', $PrimaryVlanId) + if ($SecondaryVlanIdList) + { + $setArguments.Add('SecondaryVlanIdList', $SecondaryVlanIdList) + } + break + } + } + Write-Verbose $localizedData.PerformVMVlanSet + Set-VMNetworkAdapterVlan @setArguments -ErrorAction Stop + } + else + { + throw $localizedData.NoVMNetAdapterFound + } + } + catch + { + Write-Error $_ + } +} + +Function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter()] + [ValidateSet('Untagged','Access','Trunk','Communnity','Isolated','Promiscuous')] + [String] $AdapterMode = 'Untagged', + + [Parameter()] + [uint32] $VlanId, + + [Parameter()] + [uint32] $NativeVlanId, + + [Parameter()] + [String] $AllowedVlanIdList, + + [Parameter()] + [uint32] $PrimaryVlanId, + + [Parameter()] + [uint32] $SecondaryVlanId, + + [Parameter()] + [String] $SecondaryVlanIdList + ) + + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + } + + switch ($AdapterMode) + { + 'Untagged' + { + if ($VlanId -or $NativeVlanId -or $PrimaryVlanId -or $SecondaryVlanId -or $AllowedVlanIdList -or $SecondaryVlanIdList) + { + Write-Verbose $localizedData.IgnoreVlan + } + break + } + + 'Access' + { + if (-not $VlanId) + { + throw $localizedData.VlanIdRequiredInAccess + } + break + } + + 'Trunk' + { + if (-not $NativeVlanId) + { + throw $localizedData.MustProvideNativeVlanId + } + break + } + + 'Community' + { + if (-not $PrimaryVlanId) + { + throw $localizedData.PrimaryVlanIdRequired + } + break + } + + 'Isolated' + { + if (-not $PrimaryVlanId) + { + throw $localizedData.PrimaryVlanIdRequired + } + break + } + + 'Promiscuous' + { + if (-not $PrimaryVlanId) + { + throw $localizedData.PrimaryVlanIdRequired + } + break + } + } + + try + { + #There is a remote timing issue that occurs when VLAN is set just after creating a VM Adapter. This needs more investigation. Sleep until then. + Start-Sleep -Seconds 10 + Write-Verbose $localizedData.GetVMNetAdapter + $adapterExists = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($adapterExists) + { + Write-Verbose $localizedData.FoundVMNetAdapter + if ($adapterExists.VlanSetting.OperationMode -eq $AdapterMode) + { + switch ($adapterExists.VlanSetting.OperationMode) + { + 'Access' + { + if ($VlanId -ne $adapterExists.VlanSetting.AccessVlanId) + { + Write-Verbose $localizedData.AccessVlanMustChange + return $false + } + else + { + Write-Verbose $localizedData.AdaptersExistsWithVlan + return $true + } + break + } + + 'Trunk' + { + if ($NativeVlanId -ne $adapterExists.VlanSetting.NativeVlanId) + { + Write-Verbose $localizedData.NativeVlanMustChange + return $false + } + elseif ($AllowedVlanIdList -ne $AdapterMode.VlanSetting.AllowedVlanIdListString) + { + Write-Verbose $localizedData.AllowedVlanListMustChange + return $false + } + else + { + Write-Verbose $localizedData.AdaptersExistsWithVlan + return $true + } + break + } + + 'Untagged' + { + if ($AdapterMode -eq 'Untagged') + { + Write-Verbose $localizedData.AdaptersExistsWithVlan + Write-Verbose $localizedData.IgnoreVlan + return $true + } + break + } + + ('Community' -or 'isolated') + { + if ($PrimaryVlanId -ne $adapterExists.VlanSetting.PrimaryVlanId) + { + Write-Verbose $localizedData.PrimaryVlanMustChange + return $false + } + elseif ($SecondaryVlanId -ne $adapterExists.VlanSetting.SecondaryVlanId) + { + Write-Verbose $localizedData.SecondaryVlanMustChange + return $false + } + else + { + Write-Verbose $localizedData.AdaptersExistsWithVlan + return $true + } + break + } + + 'Promiscuous' + { + if ($PrimaryVlanId -ne $adapterExists.VlanSetting.PrimaryVlanId) + { + Write-Verbose $localizedData.PrimaryVlanMustChange + return $false + } + elseif ($SecondaryVlanIdList -ne $adapterExists.VlanSetting.SecondaryVlanIdListString) + { + Write-Verbose $localizedData.SecondaryVlanListMustChange + return $false + } + else + { + Write-Verbose $localizedData.AdaptersExistsWithVlan + return $true + } + } + } + } + else + { + Write-Verbose $localizedData.AdapterExistsWithDifferentVlanMode + return $false + } + } + else + { + throw $localizedData.VMNetAdapterDoesNotExist + } + } + catch + { + Write-Error $_ + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/cVMNetworkAdapterVlan.schema.mof b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/cVMNetworkAdapterVlan.schema.mof new file mode 100644 index 0000000000000000000000000000000000000000..5b4eeaab87c1271758164fb114c13b003c51e152 GIT binary patch literal 1146 zcmd6mUrWMZ7{$+RLEmBQDj}jjcXee#Fv^Ndy@&{zLxyve&P2qoUj3eTsZC3=s~B^> z@1Ap>bI$wh{cT6vx>rSsS{iUQ6sgZM){|20%GaUxb<BO>ZeJzs$<sMiF}11MV8^-w z-(ziv5SA)Ckur_o>8q<UbuB%!WBd)*FQvAm2bqR&uE5&>@96|B*K`Z?s59pw(k(p( z^c~VE<iGJx-0v1%FW4E=)l&^M<|0*xRe-|Nd6jXzzz|ar@n*Gt=6DlKo=cw80@rjZ zEE!9-fs2IB5w0w;2`Saln6c_`nHrx;pG-sN&(1C1xr1p)ZTE9sA%z~7?WK6haGqBN zE+IR0>pNq-0dI(yw;?FY(72~d$_D>L)#|Af=d6l@HvYcL+OTzZ`Wf?m<dU~M(xpjQ zoX#r3W*~#(l^(O1F3!<9w51)Bc8llu5BM5gLmb*S_<N4x)UW5bbd!+%m|u~r%-kmE O8M%r2nn#gm3f~9#s=(j? literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/en-US/cVMNetworkAdapterVlan.psd1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/en-US/cVMNetworkAdapterVlan.psd1 new file mode 100644 index 0000000..5edc6ad --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMNetworkAdapterVlan/en-US/cVMNetworkAdapterVlan.psd1 @@ -0,0 +1,22 @@ +ConvertFrom-StringData @' + HyperVModuleNotFound=Hyper-V PowerShell Module not found. + VMNameAndManagementTogether=VMName cannot be provided when ManagementOS is set to True. + MustProvideVMName=Must provide VMName parameter when ManagementOS is set to False. + GetVMNetAdapter=Getting VM Network Adapter information. + FoundVMNetAdapter=Found VM Network Adapter. + NoVMNetAdapterFound=No VM Network Adapter found. + VMNetAdapterDoesNotExist=VM Network Adapter does not exist. + PerformVMVlanSet=Perfoming VM Network Adapter VLAN setting configuration. + IgnoreVlan=Ignoring VLAN configuration when the opeartion mode chosen is Untagged. + VlanIdRequiredInAccess=VlanId must be specified when chosen operation mode is Access. + MustProvideNativeVlanId=NativeVlanId must be specified when chosen operation mode is Trunk. + PrimaryVlanIdRequired=PrimaryVlanId is required when the chosen operation mode is Community or Isolated or Promiscuous. + AccessVlanMustChange=VlanId in Access mode is different. It will be changed. + AdaptersExistsWithVlan=VM Network adapter exists with required VLAN configuration. + NativeVlanMustChange=NativeVlanId in Trunk mode is different and it wil be changed. + AllowedVlanListMustChange=AllowedVlanIdList is different in trunk mode. It will be changed. + PrimaryVlanMustChange=PrimaryVlanId is different and must be changed. + SecondaryVlanMustChange=SecondaryVlanId is different and must be changed. + SecondaryVlanListMustChange=SecondaryVlanIdList is different and must be changed. + AdapterExistsWithDifferentVlanMode=VM Network adapter exists with different Vlan configuration. It will be fixed. +'@ diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/README.md b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/README.md new file mode 100644 index 0000000..becbf50 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/README.md @@ -0,0 +1,98 @@ +#cVMSwitch PowerShell DSC Resource# +This resource module is a fork from Microsoft's xHyper-V resource module. I have added the capability to manage bandwidth settings of the VM switch and to deploy Switch Embedded teaming in Windows Server 2016. + +![](http://i.imgur.com/odgNbD3.png) + +When using this DSC resource, the *Name* and *Type* are mandatory properties where *Name* is the unique key properties. + +The *AllowManagementOS* property can be used to add a VM network adapter attached to the VM switch we are creating in the management OS. + +The *EnableIoV* property lets us enable SR-IOV capability on the VM switch. + +The *MinimumBandwidthMode* and *EnableIoV* properties are mutually exclusive. We cannot configure both at the same time. + +The *MinimumBandwidthMode* property can be used to configure a converged network switch on Hyper-V. + +The *NetAdapterName* parameter is used when creating a VM switch of *External* type. If you pass multiple adapter names to this parameter, a switch embedded team will be provisioned. You can specify a comma-separated list of physical network adapters. Although, it is technically possible to create a SET team with just one adapter, from a design point of view, I simplified this by putting a constraint on at least two adapters to create a SET team. + +The *LoadBalancingAlgorigthm* specifies the LB mode for the SET team. At the time of writing this resource module, SET supports only *SwitchIndepedent* load balancing algorithm. This applies only when multiple network adapters are specified. + +The *TeamingMode* can be set of either *HyperVPort* or *Dynamic*. The default is *Dynamic*. This applies only when multiple network adapters are specified. + +The following examples demonstrate how to use this resource module. +### Create a simple VM Switch from a native network team on the Hyper-V host ### + Configuration SimpleHostTeamvSwitch + { + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'External' + AllowManagementOS = $true + MinimumBandwidthMode = 'Weight' + NetAdapterName = 'HostTeam' + Ensure = 'Present' + } + } + +## Create a simple VM Switch using a network adapter on the Hyper-V host ## + Configuration SimpleNetAdaptervSwitch + { + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'External' + AllowManagementOS = $true + NetAdapterName = 'NIC1' + Ensure = 'Present' + } + } + +## Create a Switch Embedded Team switch using four network adapters on the Hyper-V host ## + Configuration SETTeamSwitch + { + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'External' + AllowManagementOS = $true + MinimumBandwidthMode = 'Weight' + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'HyperVPort' + NetAdapterName = 'NIC1','NIC2','NIC3','NIC4' + Ensure = 'Present' + } + } + +## Create a private VM switch on the Hyper-V host ## + Configuration PrivateSwitch + { + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'Private' + Ensure = 'Present' + } + } + +## Create a internal VM switch on the Hyper-V host ## + Configuration InternalSwitch + { + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'Internal' + Ensure = 'Present' + } + } + +To remove any of these switches, you can simply switch the *Ensure* property to *Absent*. \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/cVMSwitch.psm1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/cVMSwitch.psm1 new file mode 100644 index 0000000..f804cc8 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/cVMSwitch.psm1 @@ -0,0 +1,618 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData -BindingVariable localizedData -filename cVMSwitch.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + #fallback to en-US + Import-LocalizedData -BindingVariable localizedData -filename cVMSwitch.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [parameter(Mandatory)] + [String]$Name, + + [parameter(Mandatory)] + [ValidateSet("External","Internal","Private")] + [String]$Type + ) + + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + $configuration = @{ + Name = $Name + Type = $Type + } + + $switch = Get-VMSwitch -Name $Name -SwitchType $Type -ErrorAction SilentlyContinue + if ($switch) + { + Write-Verbose -Message $localizedData.FoundSwitch + if ($switch.SwitchType -eq 'External') + { + Write-Verbose -Message $localizedData.FoundExternalSwitch + + #SET specific properties for External switch type + if ($switch.EmbeddedTeamingEnabled) + { + Write-Verbose -Message $localizedData.FoundSetTeam + $switchTeam = Get-VMSwitchTeam -Name $Name + + $netAdapterName = $( + $switchTeam.NetAdapterInterfaceDescription | + Foreach-Object { + (Get-NetAdapter -InterfaceDescription $_).Name + } + ) + $configuration.Add('TeamingMode',$switchTeam.TeamingMode) + $configuration.Add('LoadBalancingAlgorithm',$switchTeam.LoadBalancingAlgorithm) + } + else + { + $netAdapterName = $( + if($switch.NetAdapterInterfaceDescription) + { + (Get-NetAdapter -InterfaceDescription $switch.NetAdapterInterfaceDescription).Name + } + ) + } + } + else + { + Write-Verbose -Message ($localizedData.FoundIntORPvtSwitch -f $switch.SwitchType) + } + + $configuration.Add('NetAdapterName', $netAdapterName) + $configuration.Add('NetAdapterInterfaceDescription',$switch.NetAdapterInterfaceDescriptions) + $configuration.Add('EmbeddedTeamingEnabled',$switch.EmbeddedTeamingEnabled) + $configuration.Add('AllowManagementOS',$switch.AllowManagementOS) + $configuration.Add('Id',$switch.Id) + $configuration.Add('EnableIoV',$switch.IovEnabled) + $configuration.Add('EnablePacketDirect',$switch.PacketDirectEnabled) + $configuration.Add('MinimumBandwidthMode',$switch.BandwidthReservationMode) + $configuration.Add('Ensure','Present') + } + else + { + Write-Verbose -Message $localizedData.NoSwitchFound + $configuration.Add('Ensure','Absent') + } + + return $configuration +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory)] + [String] $Name, + + [parameter(Mandatory)] + [ValidateSet('External','Internal','Private')] + [String] $Type, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] $NetAdapterName, + + [Parameter()] + [Boolean] $AllowManagementOS, + + [Parameter()] + [Boolean] $EnableIov, + + [Parameter()] + [ValidateSet('None', 'Default', 'Weight', 'Absolute')] + [String] $MinimumBandwidthMode='Absolute', + + [parameter()] + [ValidateSet('SwitchIndependent')] + [String] $TeamingMode, + + [parameter()] + [ValidateSet('Dynamic','HyperVPort')] + [String] $LoadBalancingAlgorithm, + + [Parameter()] + [Boolean]$EnablePacketDirect, + + [ValidateSet("Present","Absent")] + [String] $Ensure = "Present" + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + if ((($Type -eq 'Internal') -or ($Type -eq 'Private')) -and $AllowManagementOS) + { + throw $localizedData.InternalPrivateWithAllowManagementOS + } + + if ($Type -eq 'External' -and !($NetAdapterName)) + { + throw $localizedData.NetAdapterNameForExternal + } + + if ($Type -ne 'External' -and $NetAdapterName) + { + throw $localizedData.NoNetAdapterInternalPrivate + } + + if (($TeamingMode -or $LoadBalancingAlgorithm) -and ($Type -ne 'External')) + { + throw $localizedData.NoSETForInternalPrivate + } + + if ($EnableIov -and $EnablePacketDirect) + { + throw $localizedData.IOVPDTogether + } + + if ($MinimumBandwidthMode -and ($EnableIov -and ($NetAdapterName.Count -gt 1))) + { + throw $localizedData.IOVMBwithSET + } + + if ($MinimumBandwidthMode -and ($EnablePacketDirect -and ($NetAdapterName.Count -gt 1))) + { + throw $localizedData.PDMBwithSET + } + + if($Ensure -eq 'Present') + { + $switch = (Get-VMSwitch -Name $Name -SwitchType $Type -ErrorAction SilentlyContinue) + + # If switch is present and it is external type, that means it doesn't have right properties (TEST code ensures that) + if($switch) + { + Write-Verbose -Message $localizedData.FoundSwitch + if ($switch.SwitchType -eq 'External') + { + Write-Verbose -Message $localizedData.FoundExternalSwitch + + #Check if there are multiple network adapters specified; it should be a SET Team + if ($NetAdapterName.Count -gt 1) + { + #We need a SET Team + Write-Verbose -Message $localizedData.NeedASET + if (-not $switch.EmbeddedTeamingEnabled) + { + #We dont have a SET team; delete and re-create the team + Write-Verbose -Message $localizedData.ReCreateSET + + $switch | Remove-VMSwitch -Force + $arguments = @{ + Name = $Name + NetAdapterName = $NetAdapterName + MinimumBandwidthMode = $MinimumBandwidthMode + } + + if ($PSBoundParameters.ContainsKey('AllowManagementOS')) + { + $arguments['AllowManagementOS']=$AllowManagementOS + } + + if ($PSBoundParameters.ContainsKey('TeamingMode')) + { + $arguments['TeamingMode']=$TeamingMode + } + + if ($PSBoundParameters.ContainsKey('LoadBalancingAlgorithm')) + { + $arguments['LoadBalancingAlgorithm']=$LoadBalancingAlgorithm + } + + if ($PSBoundParameters.ContainsKey("EnableIov")) + { + $arguments['EnableIov']=$EnableIov + } + + if ($PSBoundParameters.ContainsKey("EnablePacketDirect")) + { + $arguments['EnablePacketDirect']=$EnablePacketDirect + } + + Write-Verbose -Message $localizedData.CreateSwitch + $null = New-VMSwitch @arguments + } + else + { + #We have a SET Team; check network adapters and other properties + Write-Verbose -Message $localizedData.SETFoundCheckNetAdapter + + $switchTeam = Get-VMSwitchTeam -VMSwitch $switch + $existngNetAdapters = $switchTeam.NetAdapterInterfaceDescription | + ForEach-Object { + (Get-NetAdapter -InterfaceDescription $_).Name + } + $switchTeamMembers = Compare-Object -ReferenceObject $NetAdapterName -DifferenceObject $existngNetAdapters + + $setTeamArguments = @{ + VMSwitch = $switch + } + + if ($null -ne $switchTeamMembers) + { + #We have a difference in the compared objects + Write-Verbose -Message $localizedData.SETMembersDontMatch + + $setTeamArguments['NetAdapterName'] = $NetAdapterName + $updateTeam = $true + } + + #check other propeties of the SET Team as well + if ($PSBoundParameters.ContainsKey('TeamingMode')) + { + if ($switchTeam.TeamingMode -ne $TeamingMode) + { + $setTeamArguments['TeamingMode']=$TeamingMode + $updateTeam = $true + } + } + + if ($PSBoundParameters.ContainsKey('LoadBalancingAlgorithm')) + { + if ($switchTeam.LoadBalancingAlgorithm -ne $LoadBalancingAlgorithm) + { + $setTeamArguments['LoadBalancingAlgorithm']=$LoadBalancingAlgorithm + $updateTeam = $true + } + } + + if ($updateTeam) + { + Write-Verbose -Message $localizedData.UpdateSETTeam + $null = Set-VMSwitchTeam @setTeamArguments + } + + #Finally, check if if we need set AllowManagementOS + if($PSBoundParameters.ContainsKey("AllowManagementOS")) + { + Write-Verbose -Message "Checking if Switch $Name has AllowManagementOS set correctly..." + if(($switch.AllowManagementOS -ne $AllowManagementOS)) + { + Write-Verbose -Message $localizedData.UpdateSwitch + $null = Set-VMSwitch -VMSwitch $switch -AllowManagementOS $AllowManagementOS + } + } + } + } + else + { + #We don't need a SET Team + if ($switch.EmbeddedTeamingEnabled) + { + #We have SET team; need to delete and re-create a normal switch + Write-Verbose -Message $localizedData.NeedANormalSwitch + Write-Verbose -Message $localizedData.RemovingSwitch + $switch | Remove-VMSwitch -Force + + $switchArguments = @{ + Name = $Name + NetAdapterName = $NetAdapterName + MinimumBandwidthMode = $MinimumBandwidthMode + } + + if ($PSBoundParameters.ContainsKey('AllowManagementOS')) + { + $switchArguments['AllowManagementOS']=$AllowManagementOS + } + + if ($PSBoundParameters.ContainsKey("EnableIov")) + { + $switchArguments['EnableIov']=$EnableIov + } + if ($PSBoundParameters.ContainsKey("EnablePacketDirect")) + { + $switchArguments['EnablePacketDirect']=$EnablePacketDirect + } + + Write-Verbose -Message $localizedData.CreateSwitch + $null = New-VMSwitch @switchArguments + } + else + { + #We have a normal switch; Check other properties + $switchUpdateArguments = @{ + VMSwitch = $switch + } + + if((Get-NetAdapter -Name $NetAdapterName).InterfaceDescription -ne $switch.NetAdapterInterfaceDescription) + { + #Network Adapter is not matching; we can set this without deleting the switch + $switchUpdateArguments['NetAdapterName'] = $NetAdapterName + $updateSwitch = $true + } + + if($PSBoundParameters.ContainsKey("AllowManagementOS")) + { + Write-Verbose -Message "Checking if Switch $Name has AllowManagementOS set correctly..." + if(($switch.AllowManagementOS -ne $AllowManagementOS)) + { + $switchUpdateArguments['AllowManagementOS'] = $AllowManagementOS + $updateSwitch = $true + } + } + + if ($updateSwitch) + { + Write-Verbose -Message $localizedData.UpdateSwitch + $null = Set-VMSwitch @switchUpdateArguments + } + } + } + } + else + { + #We have an internal or private switch; we cannot update any properties + Write-Verbose -Message $localizedData.WeShouldNeverReachHere + } + } + else + { + # If the switch is not present, create one + $parameters = @{} + $parameters["Name"] = $Name + if($NetAdapterName) + { + $parameters["NetAdapterName"] = $NetAdapterName + $parameters["MinimumBandwidthMode"] = $MinimumBandwidthMode + if($PSBoundParameters.ContainsKey("AllowManagementOS")) + { + $parameters["AllowManagementOS"] = $AllowManagementOS + } + } + else + { + $parameters["SwitchType"] = $Type + } + + Write-Verbose -Message $localizedData.CreateSwitch + $null = New-VMSwitch @parameters + } + } + # Ensure is set to "Absent", remove the switch + else + { + Write-Verbose -Message $localizedData.RemovingSwitch + Get-VMSwitch $Name -ErrorAction SilentlyContinue | Remove-VMSwitch -Force + } +} + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [parameter(Mandatory)] + [String] $Name, + + [parameter(Mandatory)] + [ValidateSet('External','Internal','Private')] + [String] $Type, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] $NetAdapterName, + + [Parameter()] + [Boolean] $AllowManagementOS, + + [Parameter()] + [Boolean] $EnableIov, + + [Parameter()] + [ValidateSet('None', 'Default', 'Weight', 'Absolute')] + [String] $MinimumBandwidthMode='Absolute', + + [parameter()] + [ValidateSet('SwitchIndependent')] + [String] $TeamingMode, + + [parameter()] + [ValidateSet('Dynamic','HyperVPort')] + [String] $LoadBalancingAlgorithm, + + [Parameter()] + [Boolean]$EnablePacketDirect, + + [ValidateSet("Present","Absent")] + [String] $Ensure = "Present" + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if(!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw $localizedData.HyperVModuleNotFound + } + + if ((($Type -eq 'Internal') -or ($Type -eq 'Private')) -and $AllowManagementOS) + { + throw $localizedData.InternalPrivateWithAllowManagementOS + } + + if ($Type -eq 'External' -and !($NetAdapterName)) + { + throw $localizedData.NetAdapterNameForExternal + } + + if ($Type -ne 'External' -and $NetAdapterName) + { + throw $localizedData.NoNetAdapterInternalPrivate + } + + if (($TeamingMode -or $LoadBalancingAlgorithm) -and ($Type -ne 'External')) + { + throw $localizedData.NoSETForInternalPrivate + } + + if ($EnableIov -and $EnablePacketDirect) + { + throw $localizedData.IOVPDTogether + } + + if ($MinimumBandwidthMode -and ($EnableIov -and ($NetAdapterName.Count -gt 1))) + { + throw $localizedData.IOVMBwithSET + } + + if ($MinimumBandwidthMode -and ($EnablePacketDirect -and ($NetAdapterName.Count -gt 1))) + { + throw $localizedData.PDMBwithSET + } + + try + { + $switch = Get-VMSwitch -Name $Name -SwitchType $Type -ErrorAction Stop + + if($switch) + { + Write-Verbose -Message $localizedData.FoundSwitch + if ($Ensure -eq 'Present') + { + if ($NetAdapterName.Count -gt 1) + { + Write-Verbose -Message $localizedData.NeedASET + #We need a SET team + if (-not $switch.EmbeddedTeamingEnabled) + { + Write-Verbose -Message $localizedData.ReCreateSET + return $false + } + else + { + #We have a SET team; need to compare the properties + $switchTeam = Get-VMSwitchTeam -Name $Name + + if ($Type -eq 'External') + { + #Compare network adapters in the SET + Write-Verbose -Message $localizedData.SETFoundCheckNetAdapter + $existngNetAdapters = $switchTeam.NetAdapterInterfaceDescription | + ForEach-Object { + (Get-NetAdapter -InterfaceDescription $_).Name + } + $switchTeamMembers = Compare-Object -ReferenceObject $NetAdapterName ` + -DifferenceObject $existngNetAdapters + + if ($null -ne $switchTeamMembers) + { + #We have a difference in the compared objects + Write-Verbose -Message $localizedData.SETMembersDontMatch + return $false + } + } + + if ($switchTeam.LoadBalancingAlgorithm -ne $LoadBalancingAlgorithm) + { + Write-Verbose -Message $localizedData.LBDifferent + return $false + } + + if ($switchTeam.TeamingMode -ne $TeamingMode) + { + Write-Verbose -Message $localizedData.TeamingDifferent + return $false + } + } + } + else + { + #We need a normal VM switch + if ($switch.EmbeddedTeamingEnabled) + { + Write-Verbose -Message $localizedData.NeedANormalSwitch + return $false + } + + if ($Type -eq 'External') + { + if((Get-NetAdapter -Name $NetAdapterName -ErrorAction SilentlyContinue).InterfaceDescription -ne $switch.NetAdapterInterfaceDescription) + { + Write-Verbose -Message $localizedData.NetAdapterDifferent + return $false + } + } + } + + #Check for common properties + if($PSBoundParameters.ContainsKey("AllowManagementOS") -and $Type -eq 'External') + { + if(($switch.AllowManagementOS -ne $AllowManagementOS)) + { + Write-Verbose -Message $localizedData.AllowMgmtOSDifferent + return $false + } + } + + if ($EnablePacketDirect) + { + if (-not $switch.EnablePacketDirect) { + Write-Warning -Message $localizedData.EPDCannotChange + } + } + + if ($EnableIov) + { + if (-not $switch.EnableIov) { + Write-Warning -Message $localizedData.IOVCannotChange + } + } + + if ($MinimumBandwidthMode -ne $switch.BandwidthReservationMode) + { + Write-Warning -Message $localizedData.MBCannotChange + } + + #If we have reached this far, the switch exists with necessary configuration + Write-Verbose -Message $localizedData.SwitchExistsNoAction + return $true + } + else + { + Write-Verbose -Message $localizedData.SwitchExistsItShouldnot + return $false + } + } + else + { + if ($Ensure -eq 'Present') + { + Write-Verbose -Message $localizedData.SwitchShouldExist + return $false + } + else + { + Write-Verbose -Message $localizedData.SwitchDoesNotExistNoAction + return $true + } + } + } + + # If no switch was present + catch [System.Management.Automation.ActionPreferenceStopException] + { + Write-Verbose -Message $localizedData.NoSwitchFound + return ($Ensure -eq 'Absent') + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/cVMSwitch.schema.mof b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/cVMSwitch.schema.mof new file mode 100644 index 0000000000000000000000000000000000000000..c82668f918bb255bbb008f7a8c342e2d7421e74a GIT binary patch literal 2572 zcmb`J+fEu$6o%KWP5KTyT-Bs$nqJl`tu!UAXsXo<V;USsAmU&d)EeWf+kXGr4#U7e z#27NCwb$WaXZ}4N+ZP*H$8vs$mfDDC--ediJ8Re{`(Pg@SHsrry#@OUS0CQY&XB#c zHu9HzOCmwbj_unm9AmzE(AMq5-r5_!3QM7eFW6^v?;_o@-?rtLQu~SC96Z<9On8@` zd%v&Qv3-Yf=a{ygFL7j7ST21i&;_)dV_^)Yl&5fp8l<9)T~B6RI12fVm8>3s>&op! ztNBbs6vsn+9N<|Bk`CPW#Hwk3v93I1e%iph1`)|>sC$m`20lqN?7<^ZYRz9k<B7*; zIv#~*Wju}?hcL*iWtm7pdP^Qgb^&LH`jOw!-{2mrjskfSPvE^8jX*7wm8D$9D90L` z&z$USR;(1+Jf<dB_h8?1nowQmSPndM?$wIwfjx&7s5AAI{7k%d)nnowPRU%sbqBo< zhpIvK)}kj1kG9|*LQgr(INjuZ0Oi(eMm5sqOi@#X>{7dRUMY*SnwlQ(Q`g-><IRgC z_uRV+?2pNOpRA>LGOpFNygH7&FJml~`)a0hPBjGvWHZ<)Rsy+@wVX@7tG^}J;k2L? z6RYfrveVQ(rF87G&5CS&KRriozH1ci+^1N&FgA54+jy0MGvZTko#Ub6Fn*#PLF-cm zy$L0Hp{lutws<nUmhO3PcR-YJU4r1!XSsHTI`<4jJ!*Hz+iH=R-YJ@glGlWdZ>oSr z6YzPG^IjaFU7Jn5bYFydo8DHBN=NdPuWwH?YsCED^O{|Zd=>e5{6EmH8LM5Y&6|NC z`l2b)b=%s~J@9SV+GM|J=SpsQzy3mB-~Nzc^<s<eFXwhK5vO~&m}u4Q+QLpbv7TqS ze#6Y}cXiG5wvp#?)2M^=U!opS+vTcTL-kgbt;evcCru)+S$4)x_h8kU(*{)i#3`-w cIO8&&sv7;Xs+;UptyP_xM5V@v_<<b!2Q4_eIRF3v literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/en-US/cVMSwitch.psd1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/en-US/cVMSwitch.psd1 new file mode 100644 index 0000000..3fa5ace --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cVMSwitch/en-US/cVMSwitch.psd1 @@ -0,0 +1,36 @@ +ConvertFrom-StringData @' + HyperVModuleNotFound=Hyper-V Module was not found on this system. + FoundSetTeam=VM Switch is an embedded team. + NoSwitchFound=No VM Switch provided details found. + FoundSwitch=Found a VM switch with provided details. + FoundExternalSwitch=VM switch is an external switch. + InternalPrivateWithAllowManagementOS=AllowManagementOS cannot be specified when the switch type is set to Internal or Private. + NetAdapterNameForExternal=For external switch type, NetAdapterName must be specified. + NoNetAdapterInternalPrivate=For Internal or Private switch type, NetAdapterName should not be specified. + NoSETForInternalPrivate=In this release, TeamingMode and/or LoadBalancingAlgorithm can be set only when Switch type is external. + IOVPDTogether=EnablePacketDirect and EnableIoV cannot specified together. + IOVMBwithSET=EnableIOV and SET cannot be cannot specified when using MinimumBandwidthMode. + PDMBwithSET=EnablePacketDirect and EnableEmbeddedTeaming cannot specified when using MinimumBandwidthMode. + FoundIntORPvtSwitch=Found a VM switch of type {0} + NeedASET=Multiple Network Adapters specified. We need a SET Team. + ReCreateSET=Switch found is not a SET Team. We need to recreate it. + CreateSwitch=Creating a new VM switch. + SETFoundCheckNetAdapter=SET Team found. Checking network adapter members. + SETMembersDontMatch=SET Team members not matching. We need to update the VM Switch. + UpdateSETTeam=Updating SET Team. + NeedANormalSwitch=A SET team was found. We need a normal switch. + RemovingSwitch=Removing VM switch. + UpdateSwitch=Updating VM Switch properties. + WeShouldNeverReachHere=VM Switch is either internal or private. The control should never reach here. + LBDifferent=Load Balancing mode different. + TeamingDifferent=Teaming mode is different. + NetAdapterDifferent=Network adapter did not match. + AllowMgmtOSDifferent=Allow Management OS property does not match. + EPDCannotChange=PacketDirect is not enabled and this configuration cannot be updated once switch is created unless we destroy and re-create. Consider doing this manually. + IOVCannotChange=IOV is not enabled and this configuration cannot be updated once switch is created unless we destroy and re-create. Consider doing this manually. + MBCannotChange=MinimumBandwidthMode is not matching and this configuration cannot be updated once switch is created unless we destroy and re-create. Consider doing this manually. + SwitchExistsNoAction=Switch exists. No action needed. + SwitchExistsItShouldnot=Switch exists while it should not. + SwitchShouldExist=Switch does not exist while it should. + SwitchDoesNotExistNoAction=Switch does not exist. No action needed. +'@ diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/README.md b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/README.md new file mode 100644 index 0000000..7026b12 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/README.md @@ -0,0 +1,42 @@ +#cWaitForVMGuestIntegration# +This DSC resource is especially helpful when a VM resource configuration requires that the VM integration components are up and running. You can use this resource to wait for the guest integration components. For example, to be able to inject an IP address (using cVMIPAddress DSC resource) into a newly created Windows VM, the VM should have integration components installed and running. In such a configuration scenario, you can use this resource to wait until the integration components change into running state. + +![](http://i.imgur.com/rtiyk4B.png) + +The *Id* property is an instance identifier and key property in the resource configuration. This does not identify any VM property instead provides a way to wait for the integration components of that VM multiple times in a single configuration document. + +The *VMName* property identifies the virtual machine in which the guest integration components should be in running state. This is a mandatory property. + +The *RetryCount* property identifies how many times the resource should try to test for guest integration component state. Default value is 5. This is an optional property. + +The *RetryIntervalSec* property identifies interval (in seconds) between retries. Default Value is 10 seconds. This is an optional property. + +Here are some examples that demonstrates how to use this resource. + +##Wait For VM IC with default retry values## +Configuration WaitForIC + { + Import-DscResource -Name cWaitForVMGuestIntegration -ModuleName cHyper-V + + cWaitForVMGuestIntegration VM01 + { + Id = 'VM01-IC01' + VMName = 'VM01' + } + } + +##Wait for VM IC with custom retry values## + Configuration WaitForIC + { + Import-DscResource -Name cWaitForVMGuestIntegration -ModuleName cHyper-V + + cWaitForVMGuestIntegration VM01 + { + Id = 'VM01-IC01' + VMName = 'VM01' + RetryIntervalSec = 20 + RetryCount = 10 + } + } + + \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/cWaitForVMGuestIntegration.psm1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/cWaitForVMGuestIntegration.psm1 new file mode 100644 index 0000000000000000000000000000000000000000..1c7107a908c6cf0b8fd1adab7f1eea2db5fa3a76 GIT binary patch literal 7228 zcmeHMSx;I)6h6;Q`X8=BB332Z?WJkbx|^1^5!452Qe;sgiv?_J4S&7u_swv;GnXqu z0ri0x?!ercvwmlp@$a96w4^MjQkAAOB#;`$q7*Pz<u~4x@K=xyK2PNd<|<f|k{sT& zF}osP%-b`}&P!6R@jHvZBB)m70xR}GuZgiMUvJ(Y$ewJ-C3tl3B>ygUFB%Tl<{5w< z|MsK~Dov~*uaAAQZT4gf@OB*>8<3XIQ#r&N%21FK@F|1V;N2Ch<+=uT)Xn;$9N~Kv zoVSexhmw&U$ZIv<!^#f6pMneRW9^rQv~9?+27cc>O;n@1M`}_4m9lJtDy>rlecIp( zRL8Y4z1RgEj%8>}KK$<6Jpn%x12tH$0RHFLK^X$9Zot+D@G*C(HZwns?x)a_^Tw84 z^Gp~EmyF*vDrsqcDnMVuph2T`2dfzwIe4iBEb`Yro^AMwkyXU^e(&bxGv0Q9RX%gT z)dkk2BoD7%VJ~rAmo#FuX)s_BXnD3VziaS$hIJZU$B5oz!$}cwVI*QKxj0FAzjSTh zWD&*@Bahr$kS2rQjAurdMSqk>xIc?EjCMx;F;JOA<|xUs;pXxWcQ9{FmLv1Sr=AX$ zvvSjMcu8*8l)00c=e4}-X-a=n`>Wm?TJHzssKJ}`Tp(}pS(DYCJyaSUCn?nndEO@# zQAFH!dXl{IFkrL3D?<Y7Hss96&b(u5&TbE-Euj4nvvp7{fv(N%RiHKiiW!B>XqH>W z;3fcGEy8tg5xYxfX9ufY-sF{%Ieav-G9Dk+AoA+Sdt+nP42=QSAoYKg=VGtAsm=Xt ztFt+1-2%U#&?O1V(Mqh<E)70SM=K&Pw1%sX%_&OXeRBj(tZijuPh#c-G-x~Okui2` zLpSCWR{X*8g#OwA3bTd=JB1{C6-I^iwMvsT-m)D)!_?~<{7G)a>$^xr(p`*eyTZn} ztCOyAdFonsE^g0oQIs^<bx^borX7t1mtOeJrQv(<Hk)yWUCD3#b%L2-^g8i)a=3a{ zN7q6+H|Z+kV|UbAGHeES5uiQg;QT$j?sv;z^R+8Oh(a4VvuqvQl8L63tzG{nQDy2k zb=^N}Fs6x=s_F9D$V{xV4g6*oq<PQw@yzQk-G|Hmt`u6ISzU^#K5mz=DsP~JKfi*S z$SxutuhI2OvNTlHO~P8Xe_-9wy3cx{@i@rttd?$ViPk*7D_C$&kb&vXLJ#t^YtNJ| zbNXWMzTkOHGo7BoRq{0YXIAq%>NWd7cEjwNFHz4oL8T4r@;%SvdU9C7{CDWPfV02{ zJQwjjzAI6#lf{hf6QY=1f#y*Q`dx!cqvQAy!fMXG!$qc2*YN~v%CPBq>?*%T>mK)X zt#dlwzopqR@@(kmh|%pmSrmj_7vseGKAa2V!9C9m#)HMay)Vj|9={CSlREPyvkcFa zJT16cB%V_oB79$mJ(qe`V{;Dl|2KF08pdO#<D3<S@6NY?W1cWt#v=W(wmg(weEF;m zLQC{_pE+2bXQpZ0Q>;TH-c&F`8#sSP`<{pFWAFPWV*IXEk*s4}6y$LOXk*6SL);xp zwjY_)EriOZ<6s$QU9P>+_U}PvcM`OUpUbqPvS@wGy`a_^m3X>6;AE@*xV;~HF}*ip z9gpka{5l=ii^bQ~X=plb?-kWI{!ACG!&~wTosa(S%)KGx?Oq-CeLO$1Guk#?A^*#y Kr-Nrh)arjnI276d literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/cWaitForVMGuestIntegration.schema.mof b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/cWaitForVMGuestIntegration.schema.mof new file mode 100644 index 0000000000000000000000000000000000000000..5e5aa8e5fc0a9df250d844af35b038cd301cf0f3 GIT binary patch literal 506 zcmbV}%SyvQ6o$XG;5!UmDTsK(h3+gUMO08|7o|wCK>{_wv=xH*>gso<v|!zc3`u6@ z{I_%R^*N-=lrb|`pMu73NlnEL9S+&&VEuI1Wsk(As8VdjL~hHi{1?x`cw*qGWG<=} z*XM>S7FK88_2kUmKU*2QTRMgAh;6oHud<|nDJ9O#cc*8MM=o+-1^3y#HbtXqk)7W2 zJBf}p<l6hz6p06OMSqnklR6X5H?X1is#+<ou>PABU9YCH$sT0&m_qPEC1!HUiKkEw g_jWz0hBv#InyN7S-?WZ7`k~eJPb{*_lK-L3H#3G*CjbBd literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/en-US/cWaitForVMGuestIntegration.psd1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/DSCResources/cWaitForVMGuestIntegration/en-US/cWaitForVMGuestIntegration.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..a93c31293d60809e7fc95c8fa693b3dcb87ad63c GIT binary patch literal 964 zcmcgrO-lnY5Pj!@|6y)DwdfC6C{$Z}P^1gJulwa<yIaz2rHFrBeKTq821Nu>0!b#B znY@|z^7cALgBm;JaA+~%++c+PVp<Lr?@C-Ep_M=|LZ7oAXXt(GZy9xsJ=T_Ifg9Qx zwph}RIyVC>7<0$lC-aQ)z;($XL5%R-hHnZAu3K6ehUmUHw#XEZm|{k>5l$x_wGe&5 z3{%GE*jP5bX=#<LO>3%{y{1oWXm+$y^OeK7Rw8)DIbOIXjLNw>LsTES6XNn{=7C2P zV3_?A2IZv1-y=CP^<7uy?3?OoAMoVab?j*Q1CBPII8rv16^}rbq`8i4sefubW@JBP z>7<n_#;E2Uk#&{wJC+Kfs!aVE5w*-OxF;Ufq+$+xC8kc*qk1G%t?qm+7pA<gYU%Sg H>W_E_8TF+i literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMIPAddress/ResetIPAddress.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMIPAddress/ResetIPAddress.Example.ps1 new file mode 100644 index 0000000..0de6ebe --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMIPAddress/ResetIPAddress.Example.ps1 @@ -0,0 +1,12 @@ +Configuration VMIPAddress +{ + Import-DscResource -ModuleName cHyper-V -Name cVMIPAddress + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMIPAddress VMAdapter1IPAddress { + Id = 'VMMgmt-NIC' + NetAdapterName = 'VMMgmt-NIC' + VMName = 'SQLVM01' + IPAddress = 'DHCP' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMIPAddress/SetIPAddress.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMIPAddress/SetIPAddress.Example.ps1 new file mode 100644 index 0000000..7f6a7a5 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMIPAddress/SetIPAddress.Example.ps1 @@ -0,0 +1,15 @@ +Configuration VMIPAddress +{ + Import-DscResource -ModuleName cHyper-V -Name cVMIPAddress + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMIPAddress VMAdapter1IPAddress { + Id = 'VMMgmt-NIC' + NetAdapterName = 'VMMgmt-NIC' + VMName = 'SQLVM01' + IPAddress = '172.16.101.101' + DefaultGateway = '172.16.101.1' + Subnet = '255.255.255.0' + DnsServer = '172.16.101.2' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterManagementOS.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterManagementOS.Example.ps1 new file mode 100644 index 0000000..d939de4 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterManagementOS.Example.ps1 @@ -0,0 +1,13 @@ +Configuration HostOSAdapter +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapter HostOSAdapter { + Id = 'Management-NIC' + Name = 'Management-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleManagementOS.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleManagementOS.Example.ps1 new file mode 100644 index 0000000..bf031b5 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleManagementOS.Example.ps1 @@ -0,0 +1,21 @@ +Configuration HostOSAdapter +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapter ManagementAdapter { + Id = 'Management-NIC' + Name = 'Management-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } + + cVMNetworkAdapter ClusterAdapter { + Id = 'Cluster-NIC' + Name = 'Cluster-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleVM.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleVM.Example.ps1 new file mode 100644 index 0000000..1720dea --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleVM.Example.ps1 @@ -0,0 +1,29 @@ +Configuration VMAdapter +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapter MyVM01NIC { + Id = 'MyVM01-NIC' + Name = 'MyVM01-NIC' + SwitchName = 'SETSwitch' + VMName = 'MyVM01' + Ensure = 'Present' + } + + cVMNetworkAdapter MyVM02NIC { + Id = 'MyVM02-NIC' + Name = 'NetAdapter' + SwitchName = 'SETSwitch' + VMName = 'MyVM02' + Ensure = 'Present' + } + + cVMNetworkAdapter MyVM03NIC { + Id = 'MyVM03-NIC' + Name = 'NetAdapter' + SwitchName = 'SETSwitch' + VMName = 'MyVM03' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleVMMACAddress.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleVMMACAddress.Example.ps1 new file mode 100644 index 0000000..c23ad31 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapter/CreateVMNetworkAdapterMultipleVMMACAddress.Example.ps1 @@ -0,0 +1,23 @@ +Configuration VMAdapter +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapter MyVM01NIC { + Id = 'MyVM01-NIC' + Name = 'MyVM01-NIC' + SwitchName = 'SETSwitch' + MacAddress = '001523be0c' + VMName = 'MyVM01' + Ensure = 'Present' + } + + cVMNetworkAdapter MyVM02NIC { + Id = 'MyVM02-NIC' + Name = 'MyVM02-NIC' + SwitchName = 'SETSwitch' + MacAddress = '001523be0d' + VMName = 'MyVM02' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsManagementOS.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsManagementOS.Example.ps1 new file mode 100644 index 0000000..4fdb44e --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsManagementOS.Example.ps1 @@ -0,0 +1,13 @@ +Configuration HostOSAdapterSettings +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterSettings + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterSettings HostOSAdapterSettings { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'ManagementOS' + SwitchName = 'SETSwitch' + MinimumBandwidthWeight = 20 + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsVMMultiple.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsVMMultiple.Example.ps1 new file mode 100644 index 0000000..accc528 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsVMMultiple.Example.ps1 @@ -0,0 +1,22 @@ +Configuration VMAdapterSettings +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterSettings + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterSettings VMAdapterSettings01 { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'DHCPVM01' + SwitchName = 'SETSwitch' + DhcpGuard = 'On' + DeviceNaming = 'On' + } + + cVMNetworkAdapterSettings VMAdapterSettings02 { + Id = 'App-NIC' + Name = 'App-NIC' + VMName = 'DHCPVM01' + SwitchName = 'SETSwitch' + DeviceNaming = 'On' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsVMSimple.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsVMSimple.Example.ps1 new file mode 100644 index 0000000..3e50559 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterSettings/VMNetworkAdapterSettingsVMSimple.Example.ps1 @@ -0,0 +1,13 @@ +Configuration VMAdapterSettings +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterSettings + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterSettings VMAdapterSettings { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'DHCPVM01' + SwitchName = 'SETSwitch' + DhcpGuard = 'On' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanManagementOS.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanManagementOS.Example.ps1 new file mode 100644 index 0000000..a1cf270 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanManagementOS.Example.ps1 @@ -0,0 +1,13 @@ +Configuration HostOSAdapterVlan +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterVlan + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterVlan HostOSAdapterVlan { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'ManagementOS' + AdapterMode = 'Access' + VlanId = 10 + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanMultipleManagementOS.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanMultipleManagementOS.Example.ps1 new file mode 100644 index 0000000..62312b7 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanMultipleManagementOS.Example.ps1 @@ -0,0 +1,29 @@ +Configuration HostOSAdapterVlan +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterVlan + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterVlan HostOSAdapterVlan { + Id = 'Management-NIC' + Name = 'Management-NIC' + VMName = 'ManagementOS' + AdapterMode = 'Access' + VlanId = 10 + } + + cVMNetworkAdapterVlan ClusterAdapterVlan { + Id = 'Cluster-NIC' + Name = 'Cluster-NIC' + VMName = 'ManagementOS' + AdapterMode = 'Access' + VlanId = 20 + } + + #The following configuration removes any VLAN setting, if present. + cVMNetworkAdapterVlan JustAnotherAdapterVlan { + Id = 'JustAnother-NIC' + Name = 'JustAnother-NIC' + VMName = 'ManagementOS' + AdapterMode = 'Untagged' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanMultipleVM.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanMultipleVM.Example.ps1 new file mode 100644 index 0000000..0715fd4 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMNetworkAdapterVlan/VMNetworkAdapterVlanMultipleVM.Example.ps1 @@ -0,0 +1,20 @@ +Configuration HostOSAdapterVlan +{ + Import-DscResource -ModuleName cHyper-V -Name cVMNetworkAdapterVlan + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMNetworkAdapterVlan VMMgmtAdapterVlan { + Id = 'VMManagement-NIC' + Name = 'VMManagement-NIC' + VMName = 'SQLVM01' + AdapterMode = 'Access' + VlanId = 10 + } + + cVMNetworkAdapterVlan VMiSCSIAdapterVlan { + Id = 'VMiSCSI-NIC' + Name = 'VMiSCSI-NIC' + VMName = 'SQLVM01' + AdapterMode = 'Untagged' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/HostTeamSwitch.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/HostTeamSwitch.Example.ps1 new file mode 100644 index 0000000..deff9fe --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/HostTeamSwitch.Example.ps1 @@ -0,0 +1,14 @@ +Configuration SimpleHostTeamvSwitch +{ + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'External' + AllowManagementOS = $true + MinimumBandwidthMode = 'Weight' + NetAdapterName = 'HostTeam' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/InternalSwitch.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/InternalSwitch.Example.ps1 new file mode 100644 index 0000000..869774d --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/InternalSwitch.Example.ps1 @@ -0,0 +1,11 @@ +Configuration InternalSwitch +{ + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'Internal' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/NetAdapterSwitch.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/NetAdapterSwitch.Example.ps1 new file mode 100644 index 0000000..a2c3de9 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/NetAdapterSwitch.Example.ps1 @@ -0,0 +1,13 @@ +Configuration SimpleNetAdaptervSwitch +{ + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'External' + AllowManagementOS = $true + NetAdapterName = 'NIC1' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/PrivateSwitch.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/PrivateSwitch.Example.ps1 new file mode 100644 index 0000000..ca415f2 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/PrivateSwitch.Example.ps1 @@ -0,0 +1,11 @@ +Configuration PrivateSwitch +{ + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'Private' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/SETTeamSwitch.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/SETTeamSwitch.Example.ps1 new file mode 100644 index 0000000..aa8d382 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cVMSwitch/SETTeamSwitch.Example.ps1 @@ -0,0 +1,16 @@ +Configuration SETTeamSwitch +{ + Import-DscResource -ModuleName cHyper-V -Name cVMSwitch + Import-DscResource -ModuleName PSDesiredStateConfiguration + + cVMSwitch HostSwitch { + Name = 'HostSwitch' + Type = 'External' + AllowManagementOS = $true + MinimumBandwidthMode = 'Weight' + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'HyperVPort' + NetAdapterName = 'NIC1','NIC2','NIC3','NIC4' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cWaitForVMIntegrationComponent/WaitForIntegrationComponentCustom.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cWaitForVMIntegrationComponent/WaitForIntegrationComponentCustom.Example.ps1 new file mode 100644 index 0000000..fb99fca --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cWaitForVMIntegrationComponent/WaitForIntegrationComponentCustom.Example.ps1 @@ -0,0 +1,12 @@ +Configuration WaitForIC +{ + Import-DscResource -Name cWaitForVMGuestIntegration -ModuleName cHyper-V + + cWaitForVMGuestIntegration VM01 + { + Id = 'VM01-IC01' + VMName = 'VM01' + RetryIntervalSec = 20 + RetryCount = 10 + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cWaitForVMIntegrationComponent/WaitForIntegrationComponentDefault.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cWaitForVMIntegrationComponent/WaitForIntegrationComponentDefault.Example.ps1 new file mode 100644 index 0000000..1cf8f6c --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/Resources/cWaitForVMIntegrationComponent/WaitForIntegrationComponentDefault.Example.ps1 @@ -0,0 +1,10 @@ +Configuration WaitForIC +{ + Import-DscResource -Name cWaitForVMGuestIntegration -ModuleName cHyper-V + + cWaitForVMGuestIntegration VM01 + { + Id = 'VM01-IC01' + VMName = 'VM01' + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/SwitchEmbeddedTeamingWithHostNetworkAdapter/SETTeamWithHostNetworkAdapters.Example.ps1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/SwitchEmbeddedTeamingWithHostNetworkAdapter/SETTeamWithHostNetworkAdapters.Example.ps1 new file mode 100644 index 0000000..927be9c --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/Examples/SwitchEmbeddedTeamingWithHostNetworkAdapter/SETTeamWithHostNetworkAdapters.Example.ps1 @@ -0,0 +1,105 @@ +Configuration SETTeam +{ + param ( + [String] $SwitchName, + [String[]] $NetAdapterName, + [Int] $ManagementVlan, + [Int] $ManagementBandwidthWeight, + [String] $ClusterAdapterName, + [Int] $ClusterVlan, + [Int] $ClusterBandwidthWeight, + [String] $LiveMigrationAdapterName, + [Int] $LiveMigrationVlan, + [Int] $LiveMigrationBandwidthWeight + ) + Import-DscResource -ModuleName cHyper-V + + cVMSwitch $SwitchName + { + Name = $SwitchName + NetAdapterName = $NetAdapterName + Type = 'External' + MinimumBandwidthMode = 'Weight' + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'Dynamic' + Ensure = 'Present' + } + + cVMNetworkAdapterVlan $SwitchName + { + Id = 'Mgmt-NIC' + Name = $SwitchName + AdapterMode = 'Access' + VlanId = $ManagementVlan + VMName = 'ManagementOS' + DependsOn = "[cVMSwitch]$SwitchName" + } + + cVMNetworkAdapterSettings $SwitchName + { + Id = 'Mgmt-NIC' + Name = $SwitchName + VMName = 'ManagementOS' + SwitchName = $SwitchName + MinimumBandwidthWeight = $ManagementBandwidthWeight + DependsOn = "[cVMSwitch]$SwitchName" + } + + cVMNetworkAdapter $ClusterAdapterName + { + Id = 'Cluster-NIC' + Name = $ClusterAdapterName + VMName = 'ManagementOS' + SwitchName = $SwitchName + DependsOn = "[cVMSwitch]$SwitchName" + } + + cVMNetworkAdapterVlan $ClusterAdapterName + { + Id = 'Cluster-NIC' + Name = $ClusterAdapterName + AdapterMode = 'Access' + VlanId = $ClusterVlan + VMName = 'ManagementOS' + DependsOn = "[cVMNetworkAdapter]$ClusterAdapterName" + } + + cVMNetworkAdapterSettings $ClusterAdapterName + { + Id = 'Cluster-NIC' + Name = $ClusterAdapterName + VMName = 'ManagementOS' + SwitchName = $SwitchName + MinimumBandwidthWeight = $ClusterBandwidthWeight + DependsOn = "[cVMNetworkAdapter]$ClusterAdapterName" + } + + cVMNetworkAdapter $LiveMigrationAdapterName + { + Id = 'LM-NIC' + Name = $LiveMigrationAdapterName + VMName = 'ManagementOS' + SwitchName = $SwitchName + DependsOn = "[cVMSwitch]$SwitchName" + } + + cVMNetworkAdapterVlan $LiveMigrationAdapterName + { + Id = 'LM-NIC' + Name = $LiveMigrationAdapterName + AdapterMode = 'Access' + VlanId = $LiveMigrationVlan + VMName = 'ManagementOS' + DependsOn = "[cVMNetworkAdapter]$LiveMigrationAdapterName" + } + + cVMNetworkAdapterSettings $LiveMigrationAdapterName + { + Id = 'LM-NIC' + Name = $LiveMigrationAdapterName + VMName = 'ManagementOS' + SwitchName = $SwitchName + MinimumBandwidthWeight = $LiveMigrationBandwidthWeight + DependsOn = "[cVMNetworkAdapter]$LiveMigrationAdapterName" + } +} diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/README.md b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/README.md new file mode 100644 index 0000000..7c21445 --- /dev/null +++ b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/README.md @@ -0,0 +1,18 @@ +# DSCResources # +### Custom DSC resource module for Microsoft Hyper-V Networking by [PowerShell Magazine](http://www.powershellmagazine.com "PowerShell Magazine"). ### +---------- + +### This release (3.0.0.0) removed the cSwitchEmbededTeaming and cNATSwitch from this resource module. The functionality for creating SET team is now a part of cVMSwitch and cNatSwitch will go to xNetworking soon! ### + +Microsoft Hyper-V DSC resource module contains a set of resources for managing Hyper-V management OS and guest networking. + +- [cVMSwitch](https://github.com/rchaganti/DSCResources/tree/master/cHyper-V/DSCResources/cVMSwitch) is used to create virtual machine switches. +- [cVMNetworkAdapter](https://github.com/rchaganti/DSCResources/tree/master/cHyper-V/DSCResources/cVMNetworkAdapter) is used to create VM network adapters to attach to either management OS or the virtual machines. +- [cVMNetworkAdapterSettings](https://github.com/rchaganti/DSCResources/tree/master/cHyper-V/DSCResources/cVMNetworkAdapterSettings) is used to configure VM network adapter settings such as bandwidth weights, port mirroring, DHCP guard, MAC address spoofing, etc. +- [cVMNetworkAdapterVlan](https://github.com/rchaganti/DSCResources/tree/master/cHyper-V/DSCResources/cVMNetworkAdapterVlan) is used to configure VLANs on virtual network adapters either in the management OS or virtual machines. +- [cVMIPAddress](https://github.com/rchaganti/DSCResources/tree/master/cHyper-V/DSCResources/cVMIPAddress) is used to inject IP Address into a virtual machine running on Hyper-V host. +- [cWaitForVMGuestIntegration](https://github.com/rchaganti/DSCResources/tree/master/cHyper-V/DSCResources/cWaitForVMGuestIntegration) is used to ensure that the VM integration components are running. This will be useful when you want to wait until a VM completes reboot and then perform an action. + +Note that before using any of the custom resources, you must either import the individual resources or the entire module containing these resources. You can do this using the Import-DscResource cmdlet. + +Note: For documentation of each of these resources, visit the resource page. \ No newline at end of file diff --git a/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/cHyper-V.psd1 b/deployment/dsc/azshcihost/cHyper-V/3.0.0.0/cHyper-V.psd1 new file mode 100644 index 0000000000000000000000000000000000000000..ce2b0e6eeabc808d6abd2b99d47e779fa382c57d GIT binary patch literal 3108 zcmbuBTW=Fr6ovP5rT&MJcyK^XLIX5VsZyhaQUpN}B=9`3onVMBopGRm`0KRa+S?~H z#~FhW8rd^*E_<)D*1pVtU;eaD_OtzDH>|LiHnhrW8`;z*yie@X#&+tX1!HH7&FwYw zHBVzk2CTSXe#>nfwnmn1{lSi&-C^bJt6$G|CGU^zfHjxc9%5IXrv5&`-#?5G@$`X_ z5wk<E&3QWWk#0<~`^Zi#?1ulo_3fTtJN%cnX}{WUw#&6?cX=N0ziIcG>)Q@b4?w)b z^Ddrt8NI`^-g4x7pc95E?0ualVaitruIFHR$9djz*U4UEXP^Jl&KD!2C7=6v8{5oh z#Y*^o=gbV&M3UQhhOIIC3kys~Sb5KTWiLP?_Ai(_TwwYL+6kjM6S6o%lZx4McFoyQ z^I!5Cx^<ndfX%?WTDdMufolT=ZenAHNRoPmt%r1rm3xa*H24(B71$JY6&fh^ww6wH z;PZVy)eQV8KbnjXYiC5k1Z-)(#Mg*7sWW5m)D>3jD!Na<5xJ{;1_$j-D^N*(6f*~C zwa@*zBc6h&0+CMFaQ-)*XN*<E_e;i~@jS<d6nTrK3CiWF9{T7A{ZtPMXQ^E$avom! zYQ^At_uH+GGWgtAiaRNw93T19I{b85?XEd@z25xDiTa#n%oSDff@l`@OV5NrFXg3s z<j)2gJVgUV>Gz*3_O5@Hzd+KCJ82!Yb7=pfv~-P}Qw&PK)meAl)-ih?W_BV1Z!N{h zK9&bWykhA`5af2&^?t+|N5o~+nF1twDzBJOovd59#DJ7*_b^o|<wYM$XZ#{hl@H3N zDc79p*Yv#Y>`h38V!Ft;ny4%67(c07mY(sd3N@<=)+wHZGJFW_5&3&?g<bW(_9|LZ zFT`y-*Go=0U~jwLET2g6C=U%EO@ECF)Rjlk&2vs0RMJ0vHK?Bziz~;zYE@c&gI&iU zJ9kw|n4fvQZ1?`|I8D4p%`RNY3wF1;$#oS=wezj|UbzmzxfD>9RwpaKB6Y;GqDl6H ziG(@b8{Bcq4RRssb*f)4oOSg)^|6V^lPX4qhoo1}e!-`9s%GbJ%k}$->-_aKn(bL$ z-Fws^Y1Gy!ok9xi@jD^9pK_0y(PT!7OML^J!i6GDEM4#2(cRuKtM1p$S>#4qbK(rA zFAaSs%u%qm-));qeL*-b@w?@^jTu!Z%fE=W7u+qgRkON(jfwB$K{a0AnvtbZ$92w# zx~TT*0;{TNHw)tY@xo@#LDQd-KA%~u^$$U!ju>4w&$8<kBAs&8?slDQa=P2jXOElz E0YDJ+WdHyG literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/dscmetadata.json b/deployment/dsc/azshcihost/dscmetadata.json new file mode 100644 index 0000000..214fe5b --- /dev/null +++ b/deployment/dsc/azshcihost/dscmetadata.json @@ -0,0 +1,20 @@ +{ + "Modules": [ + "StorageDSC", + "NetworkingDSC", + "ComputerManagementDsc", + "xPSDesiredStateConfiguration", + "xHyper-v", + "cHyper-v", + "xDhcpServer", + "DnsServerDsc", + "cChoco", + "DSCR_Shortcut", + "xCredSSP", + "ActiveDirectoryDsc", + "WindowsDeploymentHelper", + "WindowsImageTools", + "MSCatalog", + "Hyper-ConvertImage" + ] +} \ No newline at end of file diff --git a/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/DSCResources/MSFT_xCredSSP/MSFT_xCredSSP.psm1 b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/DSCResources/MSFT_xCredSSP/MSFT_xCredSSP.psm1 new file mode 100644 index 0000000..11a9c7a --- /dev/null +++ b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/DSCResources/MSFT_xCredSSP/MSFT_xCredSSP.psm1 @@ -0,0 +1,324 @@ +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [parameter(Mandatory = $true)] + [ValidateSet("Server","Client")] + [System.String] + $Role + ) + + #Check if GPO policy has been set + switch($Role) + { + "Server" + { + $RegKey = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WinRM\Service" + } + "Client" + { + $RegKey = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WinRM\Client" + } + } + $RegValueName = "AllowCredSSP" + + if (Test-RegistryValue -Path $RegKey -Name $RegValueName) + { + Write-Verbose -Message "CredSSP is configured via Group Policies" + } + else + { + # Check regular values + switch($Role) + { + "Server" + { + $RegKey = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Service" + } + "Client" + { + $RegKey = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Client" + } + } + $RegValueName = "auth_credssp" + } + + if(Test-RegistryValue -Path $RegKey -Name $RegValueName) + { + $Setting = (Get-ItemProperty -Path $RegKey -Name $RegValueName).$RegValueName + } + else + { + $Setting = 0 + } + + switch($Role) + { + "Server" + { + switch($Setting) + { + 1 + { + $returnValue = @{ + Ensure = "Present"; + Role = "Server" + } + } + 0 + { + $returnValue = @{ + Ensure = "Absent"; + Role = "Server" + } + } + } + } + "Client" + { + switch($Setting) + { + 1 + { + $key = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentials" + + $DelegateComputers = @() + + + Get-Item -Path $key -ErrorAction SilentlyContinue | + Select-Object -ExpandProperty Property | + ForEach-Object { + $DelegateComputer = ((Get-ItemProperty -Path $key -Name $_).$_).Split("/")[1] + $DelegateComputers += $DelegateComputer + } + $DelegateComputers = $DelegateComputers | Sort-Object -Unique + + $returnValue = @{ + Ensure = "Present"; + Role = "Client"; + DelegateComputers = @($DelegateComputers) + } + } + 0 + { + $returnValue = @{ + Ensure = "Absent"; + Role = "Client" + } + } + } + } + } + + return $returnValue +} + + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = "Present", + + [parameter(Mandatory = $true)] + [ValidateSet("Server","Client")] + [System.String] + $Role, + + [System.String[]] + $DelegateComputers, + + [System.Boolean] + $SuppressReboot = $false + ) + + if ($Role -eq "Server" -and ($DelegateComputers)) + { + throw ("Cannot use the Role=Server parameter together with " + ` + "the DelegateComputers parameter") + } + + #Check if policy has been set + switch($Role) + { + "Server" + { + $RegKey = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WinRM\Service" + } + "Client" + { + $RegKey = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WinRM\Client" + } + } + $RegValueName = "AllowCredSSP" + + if (Test-RegistryValue -Path $RegKey -Name $RegValueName) + { + Throw "Cannot configure CredSSP. CredSSP is configured via Group Policies" + } + + switch($Role) + { + "Server" + { + switch($Ensure) + { + "Present" + { + Enable-WSManCredSSP -Role Server -Force | Out-Null + if ($SuppressReboot -eq $false) + { + $global:DSCMachineStatus = 1 + } + } + "Absent" + { + Disable-WSManCredSSP -Role Server | Out-Null + } + } + } + "Client" + { + switch($Ensure) + { + "Present" + { + if($DelegateComputers) + { + $key = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentials" + + if (!(test-path $key)) + { + New-Item $key -Force | out-null + } + + $CurrentDelegateComputers = @() + + Get-Item -Path $key | + Select-Object -ExpandProperty Property | + ForEach-Object { + $CurrentDelegateComputer = ((Get-ItemProperty -Path $key -Name $_).$_).Split("/")[1] + $CurrentDelegateComputers += $CurrentDelegateComputer + } + $CurrentDelegateComputers = $CurrentDelegateComputers | Sort-Object -Unique + + foreach($DelegateComputer in $DelegateComputers) + { + if(($CurrentDelegateComputers -eq $NULL) -or (!$CurrentDelegateComputers.Contains($DelegateComputer))) + { + Enable-WSManCredSSP -Role Client -DelegateComputer $DelegateComputer -Force | Out-Null + if ($SuppressReboot -eq $false) + { + $global:DSCMachineStatus = 1 + } + } + } + } + else + { + Throw "DelegateComputers is required!" + } + } + "Absent" + { + Disable-WSManCredSSP -Role Client | Out-Null + } + } + } + } +} + + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = "Present", + + [parameter(Mandatory = $true)] + [ValidateSet("Server","Client")] + [System.String] + $Role, + + [System.String[]] + $DelegateComputers, + + [System.Boolean] + $SuppressReboot = $false + ) + + if ($Role -eq "Server" -and $PSBoundParameters.ContainsKey("DelegateComputers")) + { + Write-Verbose -Message ("Cannot use the Role=Server parameter together with " + ` + "the DelegateComputers parameter") + } + + $CredSSP = Get-TargetResource -Role $Role + + switch($Role) + { + "Server" + { + return ($CredSSP.Ensure -eq $Ensure) + } + "Client" + { + switch($Ensure) + { + "Present" + { + $CorrectDelegateComputers = $true + if($DelegateComputers) + { + foreach($DelegateComputer in $DelegateComputers) + { + if(!($CredSSP.DelegateComputers | Where-Object {$_ -eq $DelegateComputer})) + { + $CorrectDelegateComputers = $false + } + } + } + $result = (($CredSSP.Ensure -eq $Ensure) -and $CorrectDelegateComputers) + } + "Absent" + { + $result = ($CredSSP.Ensure -eq $Ensure) + } + } + } + } + + return $result +} + + +Export-ModuleMember -Function *-TargetResource + + +function Test-RegistryValue +{ + param ( + [Parameter(Mandatory = $true)] + [String]$Path + , + [Parameter(Mandatory = $true)] + [String]$Name + ) + + if ($null -eq $Path) + { + return $false + } + + $itemProperties = Get-ItemProperty -Path $Path -ErrorAction SilentlyContinue + return ($null -ne $itemProperties -and $null -ne $itemProperties.$Name) +} diff --git a/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/DSCResources/MSFT_xCredSSP/MSFT_xCredSSP.schema.mof b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/DSCResources/MSFT_xCredSSP/MSFT_xCredSSP.schema.mof new file mode 100644 index 0000000..80b7354 --- /dev/null +++ b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/DSCResources/MSFT_xCredSSP/MSFT_xCredSSP.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xCredSSP")] +class MSFT_xCredSSP : OMI_BaseResource +{ + [Key, Description("Specifies the CredSSP role.\nServer \nClient \n"), ValueMap{"Server","Client"}, Values{"Server","Client"}] String Role; + [Write, Description("An enumerated value that describes if the role is expected to be enabled on the machine.\nPresent {default} \nAbsent \n"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Specifies the array of computers that CredSSP client can delegate to.")] String DelegateComputers[]; + [Write, Description("Specifies if a reboot should be supressed. Default is False")] Boolean SuppressReboot; +}; + diff --git a/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/LICENSE b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/LICENSE new file mode 100644 index 0000000..567fd6a --- /dev/null +++ b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Microsoft Corporation. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/PSGetModuleInfo.xml b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/PSGetModuleInfo.xml new file mode 100644 index 0000000000000000000000000000000000000000..7061ceafe9cc69dffa00cfbc11def0bbebbe183c GIT binary patch literal 11376 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 Co3ZQw literal 0 HcmV?d00001 diff --git a/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/README.md b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/README.md new file mode 100644 index 0000000..04de267 --- /dev/null +++ b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/README.md @@ -0,0 +1,102 @@ +[![Build status](https://ci.appveyor.com/api/projects/status/29y5yx2vxwjq60ic/branch/master?svg=true)](https://ci.appveyor.com/project/PowerShell/xcredssp/branch/master) + +# xCredSSP + + +The **xCredSSP** module is a part of the Windows PowerShell Desired State Configuration (DSC) Resource Kit, which is a collection of DSC Resources produced by the PowerShell Team. +This module contains the **xCredSSP** resource, which enables or disables Credential Security Support Provider (CredSSP) authentication on a client or on a server computer, and which server or servers the client credentials can be delegated to. + + +**All of the resources in the DSC Resource Kit are provided AS IS, and are not supported through any Microsoft standard support program or service. +The "x" in xCredSSP stands for experimental**, which means that these resources will be **fix forward** and monitored by the module owner(s). + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Installation + +To install **xCredSSP** module + +* Unzip the content under $env:ProgramFiles\WindowsPowerShell\Modules folder + +To confirm installation: + +* Run **Get-DSCResource** to see that **xCredSSP** is among the DSC Resources listed. + + +## Requirements + +This module requires the latest version of PowerShell (v4.0, which ships in Windows 8.1 or Windows Server 2012R2). +To easily use PowerShell 4.0 on older operating systems, [<span style="color:#0000ff">install WMF 4.0</span>](http://www.microsoft.com/en-us/download/details.aspx?id=40855). +Please read the installation instructions that are present on both the download page and the release notes for WMF 4.0. + + +## Description + +The **xCredSSP** module contains the **xCredSSP** resource, which enables or disables Credential Security Support Provider (CredSSP) authentication on a client or on a server computer, and which server or servers the client credentials can be delegated to. + + +## Details + +**xCredSSP** resource has following properties: + +* **Ensure:** Specifies whether the domain trust is present or absent +* **Role**: REQUIRED parameter representing the CredSSP role, and is either "Server" or "Client" +* **DelegateComputers**: Array of servers to be delegated to, REQUIRED when Role is set to "Client". +* **SuppressReboot**: Specifies whether a necessary reboot has to be supressed or not. + +## Versions + +### Unreleased + +### 1.3.0.0 +* Added a fix to enable credSSP with a fresh server installation + +### 1.2.0.0 +* Converted appveyor.yml to install Pester from PSGallery instead of from Chocolatey. +* Implemented a GPO check to prevent an endless reboot loop when CredSSP is configured via a GPO +* Fixed issue with Test always returning false with other regional settings then english +* Added check to test if Role=Server and DelegateComputers parameter is specified +* Added parameter to supress a reboot, default value is false (reboot server when required) + +### 1.1.0.0 + +* Made sure DSC reboots if credSS is enabled + +### 1.0.1.0 + +* Updated with minor bug fixes. + + +### 1.0.0.0 + +* Initial release with the following resources + * <span style="font-family:Calibri; font-size:medium">xADDomain</span> + +## Examples + +Enable CredSSP for both server and client roles, and delegate to Server1 and Server2. + +```powershell +Configuration EnableCredSSP +{ + Import-DscResource -Module xCredSSP + Node localhost + { + xCredSSP Server + { + Ensure = "Present" + Role = "Server" + } + xCredSSP Client + { + Ensure = "Present" + Role = "Client" + DelegateComputers = "Server1","Server2" + } + } +} +``` + +## Contributing +Please check out common DSC Resources [contributing guidelines](https://github.com/PowerShell/DscResource.Kit/blob/master/CONTRIBUTING.md). diff --git a/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/Tests/Unit/MSFT_xCredSSP.tests.ps1 b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/Tests/Unit/MSFT_xCredSSP.tests.ps1 new file mode 100644 index 0000000..6e8bddf --- /dev/null +++ b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/Tests/Unit/MSFT_xCredSSP.tests.ps1 @@ -0,0 +1,275 @@ +<# +.Synopsis + Unit tests for MSFT_xCredSSP +.DESCRIPTION + Unit tests for MSFT_xCredSSP + +.NOTES + Code in HEADER and FOOTER regions are standard and may be moved into DSCResource.Tools in + Future and therefore should not be altered if possible. +#> + + +$Global:DSCModuleName = 'xCredSSP' # Example xNetworking +$Global:DSCResourceName = 'MSFT_xCredSSP' # Example MSFT_xFirewall + +#region HEADER +[String] $moduleRoot = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $Script:MyInvocation.MyCommand.Path)) +if ( (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\')) +} +else +{ + & git @('-C',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\'),'pull') +} +Import-Module (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $Global:DSCModuleName ` + -DSCResourceName $Global:DSCResourceName ` + -TestType Unit +#endregion + +# TODO: Other Optional Init Code Goes Here... + +# Begin Testing +try +{ + #region Pester Tests + + # The InModuleScope command allows you to perform white-box unit testing on the internal + # (non-exported) code of a Script Module. + InModuleScope $Global:DSCResourceName { + + #region Pester Test Initialization + # TODO: Optopnal Load Mock for use in Pester tests here... + #endregion + + + #region Function Get-TargetResource + Describe "$($Global:DSCResourceName)\Get-TargetResource" { + # TODO: Complete Tests... + } + #endregion + + + #region Function Test-TargetResource + Describe "$($Global:DSCResourceName)\Test-TargetResource" { + # TODO: Complete Tests... + } + #endregion + + + #region Function Set-TargetResource + Describe "$($Global:DSCResourceName)\Set-TargetResource" { + + Context "Enable Server Role with invalid delegate Computer parameter" { + BeforeAll { + $global:DSCMachineStatus = $null + } + AfterAll { + $global:DSCMachineStatus = $null + } + + mock Enable-WSManCredSSP -MockWith {} -Verifiable + mock Disable-WSManCredSSP -MockWith {} + + it 'should throw' { + { Set-TargetResource -Ensure 'Present' -Role Server -DelegateComputer 'foo' } | should throw + } + it 'should have not called enable' { + Assert-MockCalled -CommandName Enable-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'should have not called disable' { + Assert-MockCalled -CommandName Disable-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'Should not have triggered a reboot' { + $global:DSCMachineStatus | should be $null + } + } + + Context "Enable Server Role when it has been configured using GPO" { + BeforeAll { + $global:DSCMachineStatus = $null + } + AfterAll { + $global:DSCMachineStatus = $null + } + + mock Enable-WSManCredSSP -MockWith {} -Verifiable + mock Disable-WSManCredSSP -MockWith {} + mock Get-ItemProperty -MockWith { + return @{ AllowCredSSP = 1 } + } -ParameterFilter { $Path -eq "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WinRM\Service" } + + it 'should throw' { + { Set-TargetResource -Ensure 'Present' -Role Server }| should throw + } + it 'should have not called enable' { + Assert-MockCalled -CommandName Enable-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'should have not called disable' { + Assert-MockCalled -CommandName Disable-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'Should not have triggered a reboot' { + $global:DSCMachineStatus | should be $null + } + } + + Context "Enable Client Role when it has been configured using GPO" { + BeforeAll { + $global:DSCMachineStatus = $null + } + AfterAll { + $global:DSCMachineStatus = $null + } + + mock Enable-WSManCredSSP -MockWith {} -Verifiable + mock Disable-WSManCredSSP -MockWith {} + mock Get-ItemProperty -MockWith { + return @{ AllowCredSSP = 1 } + } -ParameterFilter { $Path -eq "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WinRM\Client" } + + it 'should throw' { + {Set-TargetResource -Ensure 'Present' -Role Client -DelegateComputers 'foo'}| should throw + } + it 'should have not called enable' { + Assert-MockCalled -CommandName Enable-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'should have not called disable' { + Assert-MockCalled -CommandName Disable-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'Should not have triggered a reboot' { + $global:DSCMachineStatus | should be $null + } + } + + Context "Enable Server Role" { + BeforeAll { + $global:DSCMachineStatus = $null + } + AfterAll { + $global:DSCMachineStatus = $null + } + + mock Enable-WSManCredSSP -MockWith {} -Verifiable + mock Disable-WSManCredSSP -MockWith {} + mock Get-ItemProperty -MockWith { + return @{ auth_credssp = 1 } + } + it 'should not return anything' { + Set-TargetResource -Ensure 'Present' -Role Server | should be $null + } + it 'should have called enable'{ + Assert-MockCalled -CommandName Enable-WSManCredSSP -Times 1 -ParameterFilter {$Role -eq 'Server' -and $Force -eq $true} + } + it 'should have not called disable' { + Assert-MockCalled -CommandName Disable-WSManCredSSP -Times 0 + } + it 'Should have triggered a reboot'{ + $global:DSCMachineStatus | should be 1 + } + } + + Context "Enable Client Role" { + BeforeAll { + $global:DSCMachineStatus = $null + } + AfterAll { + $global:DSCMachineStatus = $null + } + + Mock Get-WSManCredSSP -MockWith {@([string]::Empty,[string]::Empty)} + mock Enable-WSManCredSSP -MockWith {} -Verifiable + mock Disable-WSManCredSSP -MockWith {} + mock Get-ItemProperty -MockWith { + return @{ + 1 = "wsman/testserver.domain.com" + 2 = "wsman/testserver2.domain.com" + } + } + mock Get-Item -MockWith { + $client1 = New-Object -typename PSObject| + Add-Member NoteProperty "Name" 1 -PassThru | + Add-Member NoteProperty "Property" 1 -PassThru + + $client2 = New-Object -typename PSObject| + Add-Member NoteProperty "Name" 2 -PassThru | + Add-Member NoteProperty "Property" 2 -PassThru + + return @($client1, $client2) + } + + it 'should not return anything' { + Set-TargetResource -Ensure 'Present' -Role Client -DelegateComputer 'foo' | should be $null + } + it 'should have called enable'{ + Assert-MockCalled -CommandName Enable-WSManCredSSP -Times 1 -ParameterFilter {$Role -eq 'Client' -and $Force -eq $true -and $DelegateComputer -eq 'foo'} + } + it 'should have not called disable' { + Assert-MockCalled -CommandName Disable-WSManCredSSP -Times 0 + } + it 'Should have triggered a reboot'{ + $global:DSCMachineStatus | should be 1 + } + } + Context "Enable Client Role with invalid delegate Computer parameter" { + BeforeAll { + $global:DSCMachineStatus = $null + } + AfterAll { + $global:DSCMachineStatus = $null + } + + Mock Get-WSManCredSSP -MockWith {@([string]::Empty,[string]::Empty)} + mock Enable-WSManCredSSP -MockWith {} -Verifiable + mock Disable-WSManCredSSP -MockWith {} + mock Get-ItemProperty -MockWith { + return @{ auth_credssp = 1 } + } + mock Get-Item -MockWith { + return @( + @{ + Name = 1 + Property = "wsman/foo" + }, + @{ + Name = 1 + Property = "wsman/testserver.domain.com" + } + ) + } + + it 'should throw' { + { Set-TargetResource -Ensure 'Present' -Role Client } | should throw 'DelegateComputers is required!' + } + it 'should have not called get' { + Assert-MockCalled -CommandName Get-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'should have called enable' { + Assert-MockCalled -CommandName Enable-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'should have not called disable' { + Assert-MockCalled -CommandName Disable-WSManCredSSP -Times 0 -Scope 'Context' + } + it 'Should have triggered a reboot'{ + $global:DSCMachineStatus | should be $null + } + } + } + #endregion + + # TODO: Pester Tests for any Helper Cmdlets + + } + #endregion +} +finally +{ + #region FOOTER + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion + + # TODO: Other Optional Cleanup Code Goes Here... +} diff --git a/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/xCredSSP.psd1 b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/xCredSSP.psd1 new file mode 100644 index 0000000..5ceaf44 --- /dev/null +++ b/deployment/dsc/azshcihost/xCredSSP/1.3.0.0/xCredSSP.psd1 @@ -0,0 +1,60 @@ +@{ +# Version number of this module. +ModuleVersion = '1.3.0.0' + +# ID used to uniquely identify this module +GUID = '38e1ad0f-9b30-490a-a2b6-cc77765af4ec' + +# Author of this module +Author = 'Microsoft Corporation' + +# Company or vendor of this module +CompanyName = 'Microsoft Corporation' + +# Copyright statement for this module +Copyright = '(c) 2014 Microsoft Corporation. All rights reserved.' + +# Description of the functionality provided by this module +Description = 'Module with DSC Resources for WSMan CredSSP.' + +# Minimum version of the Windows PowerShell engine required by this module +PowerShellVersion = '4.0' + +# Minimum version of the common language runtime (CLR) required by this module +CLRVersion = '4.0' + +# Functions to export from this module +FunctionsToExport = '*' + +# Cmdlets to export from this module +CmdletsToExport = '*' + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/PowerShell/xCredSSP/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/PowerShell/xCredSSP' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + ReleaseNotes = '* Added a fix to enable credSSP with a fresh server installation + +' + + } # End of PSData hashtable + +} # End of PrivateData hashtable +} + + + diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/Helper.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/Helper.psm1 new file mode 100644 index 0000000..9a2f675 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/Helper.psm1 @@ -0,0 +1,267 @@ +# Localized messages +data LocalizedData +{ + # culture="en-US" + ConvertFrom-StringData @' +RoleNotFound = Please ensure that the PowerShell module for role {0} is installed +InvalidIPAddressFormat = Value of {0} property is not in a valid IP address format. Specify a valid IP address format and try again. +InvalidIPAddressFamily = The IP address {0} is not a valid {1} address. Specify a valid IP address in {1} format and try again. +InvalidTimeSpanFormat = Value of {0} property is not in a valid timespan format. Specify the timespan in days.hrs:mins:secs format and try again. +InvalidScopeIdSubnetMask = Value of byte {0} in {1} ({2}) is not valid. Binary AND with byte {0} in SubnetMask ({3}) should be equal to byte {0} in ScopeId ({4}). +InvalidStartAndEndRangeMessage = Value of IPStartRange ({0}) and IPEndRange ({1}) are not valid. Start should be lower than end. +'@ +} + +# Internal function to throw terminating error with specified ErrorCategory, ErrorId and ErrorMessage +function New-TerminatingError +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [String] + $ErrorMessage, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.ErrorCategory] + $ErrorCategory + ) + + $exception = New-Object -TypeName System.InvalidOperationException -ArgumentList $ErrorMessage + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord -ArgumentList $exception, $ErrorId, $ErrorCategory, $null + throw $errorRecord +} + +# Internal function to translate a string to valid IPAddress format +function Get-ValidIPAddress +{ + [CmdletBinding()] + [OutputType([System.Net.IPAddress])] + param + ( + [Parameter(Mandatory = $true)] + [string] + $IpString, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter(Mandatory = $true)] + [string] + $ParameterName + ) + + $ipAddressFamily = '' + if($AddressFamily -eq 'IPv4') + { + $ipAddressFamily = 'InterNetwork' + } + else + { + $ipAddressFamily = 'InterNetworkV6' + } + + [System.Net.IPAddress]$ipAddress = $null + $result = [System.Net.IPAddress]::TryParse($IpString, [ref]$ipAddress) + if(-not $result) + { + $errorMsg = $($LocalizedData.InvalidIPAddressFormat) -f $ParameterName + New-TerminatingError -ErrorId 'NotValidIPAddress' -ErrorMessage $errorMsg -ErrorCategory InvalidType + } + + if($ipAddress.AddressFamily -ne $ipAddressFamily) + { + $errorMsg = $($LocalizedData.InvalidIPAddressFamily) -f $ipAddress,$AddressFamily + New-TerminatingError -ErrorId 'InvalidIPAddressFamily' -ErrorMessage $errorMsg -ErrorCategory SyntaxError + } + + $ipAddress +} + +# Internal function to assert if the role specific module is installed or not +function Assert-Module +{ + [CmdletBinding()] + param + ( + [Parameter()] + [String] + $ModuleName = 'DHCPServer' + ) + + if(! (Get-Module -Name $ModuleName -ListAvailable)) + { + $errorMsg = $($LocalizedData.RoleNotFound) -f $ModuleName + New-TerminatingError -ErrorId 'ModuleNotFound' -ErrorMessage $errorMsg -ErrorCategory ObjectNotFound + } +} + +<# + .SYNOPSIS + Internal function to assert if values of ScopeId/SubnetMask/IPStartRange/IPEndRange make sense. + + .DESCRIPTION + Internal function used to assert if value of following parameters are correct: + - ScopeID + - SubnetMask + - IPStartRange + - IPEndRange + + It validates them against simple rules: + - Has to be correct (IPv4) address + - Anything but SubnetMask has to follow the rule that: + (TokenFromParameter) -band (TokenFromSubnetMask) = (TokenFromScopeId) + - IPStartRange has to be before IPEndRange + Implementation for IPv4. + + .PARAMETER ScopeId + String version of ScopeId. + + .PARAMETER SubnetMask + String version of SubnetMask. + + .PARAMETER IPStartRange + String version of StartRange. + + .PARAMETER IPEndRange + String version of EndRange. + + .PARAMETER AddressFamily + AddressFamily that IPs should validate against. + + .EXAMPLE + Assert-ScopeParameter -ScopeId 192.168.1.0 -SubnetMask 255.255.255.0 -IPStartRange 192.168.1.1 -IPEndRange 192.168.1.254 -AddressFamily IPv4 + Validates all parameters against rules and returns nothing (all parameters are correct). + + .EXAMPLE + Assert-ScopeParameter -ScopeId 192.168.1.0 -SubnetMask 255.255.240.0 -IPStartRange 192.168.1.1 -IPEndRange 192.168.1.254 -AddressFamily IPv4 + Returns error informing that using specified SubnetMask with specified ScopeId is incorrect: + Value of byte 3 in ScopeId (1) is not valid. Binary AND with byte 3 in SubnetMask (240) should be equal to byte 3 in ScopeId (1). +#> +function Assert-ScopeParameter +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [String] + $SubnetMask, + + [Parameter(Mandatory = $true)] + [String] + $IPStartRange, + + [Parameter(Mandatory = $true)] + [String] + $IPEndRange, + + [Parameter(Mandatory = $true)] + [String] + $AddressFamily + ) + + # Convert the Subnet Mask to be a valid IPAddress + $netMask = Get-ValidIpAddress -IpString $SubnetMask -AddressFamily $AddressFamily -ParameterName SubnetMask + + # Convert the ScopeID to be a valid IPAddress + $scope = Get-ValidIPAddress -IpString $ScopeId -AddressFamily $AddressFamily -ParameterName ScopeId + + # Convert the Start Range to be a valid IPAddress + $startRange = Get-ValidIpAddress -IpString $IPStartRange -AddressFamily $AddressFamily -ParameterName IPStartRange + + # Convert the End Range to be a valid IPAddress + $endRange = Get-ValidIpAddress -IpString $IPEndRange -AddressFamily $AddressFamily -ParameterName IPEndRange + + # Check to ensure startRange is smaller than endRange + if($endRange.Address -lt $startRange.Address) + { + $errorMsg = $LocalizedData.InvalidStartAndEndRangeMessage -f $IPStartRange, $IPEndRange + New-TerminatingError -ErrorId RangeNotCorrect -ErrorMessage $errorMsg -ErrorCategory InvalidArgument + } + + $addressBytes = @{ + ScopeId = $scope.GetAddressBytes() + SubnetMask = $netMask.GetAddressBytes() + IPStartRange = $startRange.GetAddressBytes() + IPEndRange = $endRange.GetAddressBytes() + } + + foreach ($parameter in $addressBytes.Keys.Where{ $_ -ne 'SubnetMask' }) + { + foreach ($ipTokenIndex in 0..3) + { + $parameterByte = $addressBytes[$parameter][$ipTokenIndex] + $subnetMaskByte = $addressBytes['SubnetMask'][$ipTokenIndex] + $scopeIdByte = $addressBytes['ScopeId'][$ipTokenIndex] + if(($parameterByte -band $subnetMaskByte) -ne $scopeIdByte) + { + $errorMsg = $($LocalizedData.InvalidScopeIdSubnetMask) -f ($ipTokenIndex + 1), $parameter, $parameterByte, $subnetMaskByte, $scopeIdByte + New-TerminatingError -ErrorId ScopeIdOrMaskIncorrect -ErrorMessage $errorMsg -ErrorCategory InvalidArgument + } + } + } +} + +# Internal function to write verbose messages for collection of properties +function Write-PropertyMessage +{ + param + ( + [Parameter(Mandatory = $true)] + [Hashtable] + $Parameters, + + [Parameter(Mandatory = $true)] + [String[]] + $KeysToSkip, + + [Parameter(Mandatory = $true)] + [String] + $MessageTemplate + ) + + foreach($key in $parameters.keys) + { + if($keysToSkip -notcontains $key) + { + $msg = $MessageTemplate -f $key,$parameters[$key] + Write-Verbose -Message $msg + } + } +} + +# Internal function to translate a string to valid IPAddress format +function Get-ValidTimeSpan +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [string] + $TsString, + + [Parameter(Mandatory = $true)] + [string] + $ParameterName + ) + + [System.TimeSpan]$timeSpan = New-TimeSpan + $result = [System.TimeSpan]::TryParse($TsString, [ref]$timeSpan) + if(-not $result) + { + $errorMsg = $($LocalizedData.InvalidTimeSpanFormat) -f $ParameterName + New-TerminatingError -ErrorId 'NotValidTimeSpan' -ErrorMessage $errorMsg -ErrorCategory InvalidType + } + + $timeSpan +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpPolicyOptionValue/MSFT_DhcpPolicyOptionValue.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpPolicyOptionValue/MSFT_DhcpPolicyOptionValue.psm1 new file mode 100644 index 0000000..0bfa09f --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpPolicyOptionValue/MSFT_DhcpPolicyOptionValue.psm1 @@ -0,0 +1,207 @@ +$currentPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent + +$modulePathhelper = (Join-Path -Path (Split-Path -Path $currentPath -Parent) -ChildPath 'Helper.psm1') +$modulePathOptionValueHelper = (Join-Path -Path (Join-Path -Path (Join-Path -Path (Split-Path -Path (Split-Path -Path $currentPath -Parent) -Parent) ` + -ChildPath 'modules') -ChildPath 'DhcpServerDsc.OptionValueHelper') -ChildPath 'OptionValueHelper.psm1') + +Import-Module -Name $modulePathhelper +Import-Module -Name $modulePathOptionValueHelper + +<# + .SYNOPSIS + This function gets a DHCP policy option value. + + .PARAMETER PolicyName + The Policy name. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER ScopeId + The scope ID to get the value. If not used server level values are retrieved. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $PolicyName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [AllowNull()] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily + ) + + $hashTable = Get-TargetResourceHelper -ApplyTo 'Policy' -UserClass '' @PSBoundParameters + + # Removing properties that are not in the schema.mof before returning the hash table + $hashTable.Remove('ApplyTo') + $hashTable.Remove('ReservedIP') + $hashTable.Remove('UserClass') + + $hashTable +} + +<# + .SYNOPSIS + This function sets a DHCP policy option value. + + .PARAMETER PolicyName + The policy name. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER Value + The data value option. + + .PARAMETER ScopeId + The scope ID to set the value. If not used server level values are used. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $PolicyName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [String[]] + $Value, + + [Parameter()] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + Set-TargetResourceHelper -ApplyTo 'Policy' -UserClass '' @PSBoundParameters +} + +<# + .SYNOPSIS + This function tests a DHCP policy option value. + + .PARAMETER PolicyName + The policy name. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER Value + The data value option. + + .PARAMETER ScopeId + The scope ID to test the value. If not used server level values are tested. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $PolicyName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [String[]] + $Value, + + [Parameter()] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + $result = Test-TargetResourceHelper -ApplyTo 'Policy' -UserClass '' @PSBoundParameters + $result +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpPolicyOptionValue/MSFT_DhcpPolicyOptionValue.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpPolicyOptionValue/MSFT_DhcpPolicyOptionValue.schema.mof new file mode 100644 index 0000000..1885693 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpPolicyOptionValue/MSFT_DhcpPolicyOptionValue.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DhcpPolicyOptionValue")] +class MSFT_DhcpPolicyOptionValue : OMI_BaseResource +{ + [Key, Description("Option ID, specify an integer between 1 and 255.")] UInt32 OptionId; + [Key, Description("Policy Name.")] String PolicyName; + [Write, Description("Option data value. Could be an array of string for a multivalued option.")] String Value[]; + [Write, Description("Scope ID to get policy values from. Do not use it to get an option from server level.")] String ScopeId; + [Key, Description("Vendor class. Use an empty string for default vendor class.")] String VendorClass; + [Key, Description("Address family. Currently needs to be IPv4."), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Write, Description("Whether the DHCP option should exist."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpReservedIPOptionValue/MSFT_DhcpReservedIPOptionValue.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpReservedIPOptionValue/MSFT_DhcpReservedIPOptionValue.psm1 new file mode 100644 index 0000000..94c6378 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpReservedIPOptionValue/MSFT_DhcpReservedIPOptionValue.psm1 @@ -0,0 +1,209 @@ +$currentPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent + +$modulePathhelper = (Join-Path -Path (Split-Path -Path $currentPath -Parent) -ChildPath 'Helper.psm1') +$modulePathOptionValueHelper = (Join-Path -Path (Join-Path -Path (Join-Path -Path (Split-Path -Path (Split-Path -Path $currentPath -Parent) -Parent) ` + -ChildPath 'modules') -ChildPath 'DhcpServerDsc.OptionValueHelper') -ChildPath 'OptionValueHelper.psm1') + +Import-Module -Name $modulePathhelper +Import-Module -Name $modulePathOptionValueHelper + +<# + .SYNOPSIS + This function gets a DHCP reserved IP option value. + + .PARAMETER ReservedIP + The Reserved IP to get the option value from. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $ReservedIP, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily + ) + + $hashTable = Get-TargetResourceHelper -ApplyTo 'ReservedIP' @PSBoundParameters + + # Removing properties that are not in the schema.mof before returning the hash table + $hashTable.Remove('ApplyTo') + $hashTable.Remove('ScopeId') + $hashTable.Remove('PolicyName') + + $hashTable +} + +<# + .SYNOPSIS + This function sets a DHCP reserved IP option value. + + .PARAMETER ReservedIP + The reserved IP. + + .PARAMETER OptionId + The Option ID. + + .PARAMETER Value + The option data value. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $ReservedIP, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [String[]] + $Value, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + Set-TargetResourceHelper -ApplyTo 'ReservedIP' @PSBoundParameters +} + +<# + .SYNOPSIS + This function tests a DHCP reserved IP option value. + + .PARAMETER ReservedIP + The reserved IP. + + .PARAMETER OptionId + The Option ID. + + .PARAMETER Value + The option data value. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $ReservedIP, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [String[]] + $Value, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + $result = Test-TargetResourceHelper -ApplyTo 'ReservedIP' @PSBoundParameters + $result +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpReservedIPOptionValue/MSFT_DhcpReservedIPOptionValue.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpReservedIPOptionValue/MSFT_DhcpReservedIPOptionValue.schema.mof new file mode 100644 index 0000000..8f1ec5b --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpReservedIPOptionValue/MSFT_DhcpReservedIPOptionValue.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DhcpReservedIPOptionValue")] +class MSFT_DhcpReservedIPOptionValue : OMI_BaseResource +{ + [Key, Description("Reserved IP to set the option value.")] String ReservedIP; + [Key, Description("Option ID, specify an integer between 1 and 255.")] UInt32 OptionId; + [Write, Description("Option data value. Could be an array of string for a multivalued option.")] String Value[]; + [Key, Description("Vendor class. Use an empty string for default vendor class.")] String VendorClass; + [Key, Description("User class. Use an empty string for default user class.")] String UserClass; + [Key, Description("Address family. Currently needs to be IPv4."), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Write, Description("Whether the DHCP option should exist."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpScopeOptionValue/MSFT_DhcpScopeOptionValue.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpScopeOptionValue/MSFT_DhcpScopeOptionValue.psm1 new file mode 100644 index 0000000..37ade8d --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpScopeOptionValue/MSFT_DhcpScopeOptionValue.psm1 @@ -0,0 +1,209 @@ +$currentPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent + +$modulePathhelper = (Join-Path -Path (Split-Path -Path $currentPath -Parent) -ChildPath 'Helper.psm1') +$modulePathOptionValueHelper = (Join-Path -Path (Join-Path -Path (Join-Path -Path (Split-Path -Path (Split-Path -Path $currentPath -Parent) -Parent) ` + -ChildPath 'modules') -ChildPath 'DhcpServerDsc.OptionValueHelper') -ChildPath 'OptionValueHelper.psm1') + +Import-Module -Name $modulePathhelper +Import-Module -Name $modulePathOptionValueHelper + +<# + .SYNOPSIS + This function gets a DHCP scope option value. + + .PARAMETER ScopeId + The ID of the scope. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily + ) + + $hashTable = Get-TargetResourceHelper -ApplyTo 'Scope' @PSBoundParameters + + # Removing properties that are not in the schema.mof before returning the hash table + $hashTable.Remove('ApplyTo') + $hashTable.Remove('PolicyName') + $hashTable.Remove('ReservedIP') + + $hashTable +} + +<# + .SYNOPSIS + This function sets a DHCP scope option value. + + .PARAMETER ScopeId + The ID of the scope. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER Value + The data value option. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [String[]] + $Value, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + Set-TargetResourceHelper -ApplyTo 'Scope' @PSBoundParameters +} + +<# + .SYNOPSIS + This function tests a DHCP scope option value. + + .PARAMETER ScopeId + The ID of the scope. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER Value + The data value option. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [String[]] + $Value, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + $result = Test-TargetResourceHelper -ApplyTo 'Scope' @PSBoundParameters + $result +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpScopeOptionValue/MSFT_DhcpScopeOptionValue.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpScopeOptionValue/MSFT_DhcpScopeOptionValue.schema.mof new file mode 100644 index 0000000..e5a40f2 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpScopeOptionValue/MSFT_DhcpScopeOptionValue.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DhcpScopeOptionValue")] +class MSFT_DhcpScopeOptionValue : OMI_BaseResource +{ + [Key, Description("Scope ID to set the option.")] String ScopeId; + [Key, Description("Option ID, specify an integer between 1 and 255.")] UInt32 OptionId; + [Write, Description("Option data value.")] String Value[]; + [Key, Description("Vendor class. Use an empty string for default vendor class.")] String VendorClass; + [Key, Description("User class. Use an empty string for default user class.")] String UserClass; + [Key, Description("Address family. Currently needs to be IPv4."), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Write, Description("Whether the DHCP option should exist."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpServerOptionValue/MSFT_DhcpServerOptionValue.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpServerOptionValue/MSFT_DhcpServerOptionValue.psm1 new file mode 100644 index 0000000..de7b23c --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpServerOptionValue/MSFT_DhcpServerOptionValue.psm1 @@ -0,0 +1,187 @@ +$currentPath = Split-Path -Path $MyInvocation.MyCommand.Path -Parent + +$modulePathhelper = (Join-Path -Path (Split-Path -Path $currentPath -Parent) -ChildPath 'Helper.psm1') +$modulePathOptionValueHelper = (Join-Path -Path (Join-Path -Path (Join-Path -Path (Split-Path -Path (Split-Path -Path $currentPath -Parent) -Parent) ` + -ChildPath 'modules') -ChildPath 'DhcpServerDsc.OptionValueHelper') -ChildPath 'OptionValueHelper.psm1') + +Import-Module -Name $modulePathhelper +Import-Module -Name $modulePathOptionValueHelper + +<# + .SYNOPSIS + This function gets a DHCP server option value. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily + ) + + $hashTable = Get-TargetResourceHelper -ApplyTo 'Server' @PSBoundParameters + + # Removing properties that are not in the schema.mof before returning the hash table + $hashTable.Remove('ApplyTo') + $hashTable.Remove('PolicyName') + $hashTable.Remove('ReservedIP') + $hashTable.Remove('ScopeId') + + $hashTable +} + +<# + .SYNOPSIS + This function sets a DHCP server option value. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER Value + The data value option. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [String[]] + $Value, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + Set-TargetResourceHelper -ApplyTo 'Server' @PSBoundParameters +} + +<# + .SYNOPSIS + This function tests a DHCP server option value. + + .PARAMETER OptionId + The ID of the option. + + .PARAMETER Value + The data value option. + + .PARAMETER VendorClass + The vendor class of the option. Use an empty string for standard class. + + .PARAMETER UserClass + The user class of the option. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [Parameter()] + [String[]] + $Value, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + + $result = Test-TargetResourceHelper -ApplyTo 'Server' @PSBoundParameters + $result +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpServerOptionValue/MSFT_DhcpServerOptionValue.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpServerOptionValue/MSFT_DhcpServerOptionValue.schema.mof new file mode 100644 index 0000000..c5d1d5f --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_DhcpServerOptionValue/MSFT_DhcpServerOptionValue.schema.mof @@ -0,0 +1,10 @@ +[ClassVersion("1.0.0.0"), FriendlyName("DhcpServerOptionValue")] +class MSFT_DhcpServerOptionValue : OMI_BaseResource +{ + [Key, Description("Option ID, specify an integer between 1 and 255.")] UInt32 OptionId; + [Write, Description("Option data value. Could be an array of string for a multivalued option.")] String Value[]; + [Key, Description("Vendor class. Use an empty string for default vendor class.")] String VendorClass; + [Key, Description("User class. Use an empty string for default user class.")] String UserClass; + [Key, Description("Address family. Currently needs to be IPv4."), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Write, Description("Whether the DHCP option should exist."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerAuthorization/MSFT_xDhcpServerAuthorization.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerAuthorization/MSFT_xDhcpServerAuthorization.psm1 new file mode 100644 index 0000000..71be251 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerAuthorization/MSFT_xDhcpServerAuthorization.psm1 @@ -0,0 +1,171 @@ +Import-Module $PSScriptRoot\..\Helper.psm1 -Verbose:$false + +# Localized messages +data LocalizedData +{ + # culture="en-US" + ConvertFrom-StringData @' +ResolvingIPv4Address = Resolving first local IPv4 IP address ... +ResolvingHostname = Resolving local hostname ... +AuthorizingServer = Authorizing DHCP Server '{0}' with IP address '{1}' +UnauthorizingServer = Unauthorizing DHCP Server '{0}' with IP address '{1}' +ServerIsAuthorized = DHCP Server '{0}' with IP address '{1}' IS authorized +ServerNotAuthorized = DHCP Server '{0}' with IP address '{1}' is NOT authorized +IncorrectPropertyValue = Property '{0}' is incorrect. Expected '{1}', actual '{2}' +ResourceInDesiredState = DHCP Server '{0}' is in the desired state +ResourceNotInDesiredState = DHCP Server '{0}' is NOT in the desired state +'@ +} + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory)] + [ValidateSet('Present','Absent')] + [System.String] $Ensure, + + [ValidateNotNullOrEmpty()] + [System.String] $DnsName = ( Get-Hostname ), + + [ValidateNotNullOrEmpty()] + [System.String] $IPAddress = ( Get-IPv4Address | Select-Object -First 1 ) + ) + Assert-Module -ModuleName 'DHCPServer'; + $IPAddress = Get-ValidIPAddress -IPString $IPAddress -AddressFamily 'IPv4' -ParameterName 'IPAddress' + $dhcpServer = Get-DhcpServerInDC | Where-Object { ($_.DnsName -eq $DnsName) -and ($_.IPAddress -eq $IPAddress) } + $targetResource = @{ + DnsName = $dhcpServer.DnsName + IPAddress = $dhcpServer.IPAddress + } + if ($dhcpServer) + { + Write-Verbose ($LocalizedData.ServerIsAuthorized -f $DnsName, $IPAddress) + $targetResource['Ensure'] = 'Present' + } + else + { + Write-Verbose ($LocalizedData.ServerNotAuthorized -f $DnsName, $IPAddress) + $targetResource['Ensure'] = 'Absent' + } + return $targetResource +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory)] + [ValidateSet('Present','Absent')] + [System.String] $Ensure, + + [ValidateNotNullOrEmpty()] + [System.String] $DnsName = ( Get-Hostname ), + + [ValidateNotNullOrEmpty()] + [System.String] $IPAddress = ( Get-IPv4Address | Select-Object -First 1 ) + ) + Assert-Module -ModuleName 'DHCPServer' + $IPAddress = Get-ValidIPAddress -IPString $IPAddress -AddressFamily 'IPv4' -ParameterName 'IPAddress' + if ($Ensure -eq 'Present') + { + Write-Verbose ($LocalizedData.AuthorizingServer -f $DnsName, $IPAddress) + Add-DhcpServerInDc -DnsName $DnsName -IPAddress $IPAddress + } + elseif ($Ensure -eq 'Absent') + { + Write-Verbose ($LocalizedData.UnauthorizingServer -f $DnsName, $IPAddress) + Get-DhcpServerInDC | Where-Object { ($_.DnsName -eq $DnsName) -and ($_.IPAddress -eq $IPAddress) } | Remove-DhcpServerInDc + } +} + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory)] + [ValidateSet('Present','Absent')] + [System.String] $Ensure, + + [ValidateNotNullOrEmpty()] + [System.String] $DnsName = ( Get-Hostname ), + + [ValidateNotNullOrEmpty()] + [System.String] $IPAddress = ( Get-IPv4Address | Select-Object -First 1 ) + ) + $targetResource = Get-TargetResource @PSBoundParameters + $isCompliant = $true + + if ($targetResource.Ensure -ne $Ensure) + { + Write-Verbose ($LocalizedData.IncorrectPropertyValue -f 'Ensure', $Ensure, $targetResource.Ensure) + $isCompliant = $false + + } + elseif ($Ensure -eq 'Present') + { + if ($targetResource.DnsName -ne $DnsName) + { + Write-Verbose ($LocalizedData.IncorrectPropertyValue -f 'DnsName', $DnsName, $targetResource.DnsName) + $isCompliant = $false + } + if ($targetResource.IPAddress -ne $IPAddress) + { + Write-Verbose ($LocalizedData.IncorrectPropertyValue -f 'IPAddress', $IPAddress, $targetResource.IPAddress) + $isCompliant = $false + } + } + + if ($isCompliant) + { + Write-Verbose ($LocalizedData.ResourceInDesiredState -f $DnsName) + } + else { + Write-Verbose ($LocalizedData.ResourceNotInDesiredState -f $DnsName) + } + return $isCompliant +} + +## Internal function used to return all IPv4 addresses +function Get-IPv4Address +{ + [CmdletBinding()] + [OutputType([System.String])] + param ( ) + process + { + Write-Verbose $LocalizedData.ResolvingIPv4Address + Get-WmiObject Win32_NetworkAdapterConfiguration -Namespace 'root\CIMV2' | + Where-Object IPEnabled -eq 'True' | + ForEach-Object { + Write-Output ($_.IPAddress -notmatch ':') + } + } #end process +} #end function Get-IPv4Address + +## Internal function used to resolve the local hostname +function Get-Hostname { + [CmdletBinding()] + [OutputType([System.String])] + param ( ) + process + { + Write-Verbose $LocalizedData.ResolvingHostname; + $globalIpProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties(); + if ($globalIpProperties.DomainName) + { + return '{0}.{1}' -f $globalIpProperties.HostName, $globalIpProperties.DomainName + } + else + { + return $globalIpProperties.HostName + } + } #end process +} #end function Get-Hostname + +Export-ModuleMember -Function *-TargetResource; diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerAuthorization/MSFT_xDhcpServerAuthorization.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerAuthorization/MSFT_xDhcpServerAuthorization.schema.mof new file mode 100644 index 0000000..61b7b64 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerAuthorization/MSFT_xDhcpServerAuthorization.schema.mof @@ -0,0 +1,7 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xDhcpServerAuthorization")] +class MSFT_xDhcpServerAuthorization : OMI_BaseResource +{ + [Write, Description("DHCP Server FQDN")] String DnsName; + [Write, Description("DHCP Server IP Address")] String IPAddress; + [Key, Description("Whether the DHCP server should be authorised within Active Directory"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerClass/MSFT_xDhcpServerClass.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerClass/MSFT_xDhcpServerClass.psm1 new file mode 100644 index 0000000..2f7badf --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerClass/MSFT_xDhcpServerClass.psm1 @@ -0,0 +1,192 @@ +Import-Module $PSScriptRoot\..\Helper.psm1 -Verbose:$false + +# Localized messages +data LocalizedData +{ + # culture="en-US" + ConvertFrom-StringData @' + SettingClassIDMessage = Setting DHCP Server Class {0} + AddingClassIDMessage = Adding DHCP Server Class {0} + RemovingClassIDMessage = Removing DHCP Server Class {0} +'@ +} + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory)][ValidateSet('Present','Absent')] + [System.String] $Ensure, + + [parameter(Mandatory)] [ValidateNotNullOrEmpty()] + [String]$Name, + + [parameter(Mandatory)][ValidateSet('Vendor','User')] + [String]$Type, + + [parameter(Mandatory)][ValidateNotNullOrEmpty()] + [string] $AsciiData, + + [AllowEmptyString()] + [string]$Description = '', + + [parameter(Mandatory)][ValidateSet('IPv4')] + [String]$AddressFamily + ) + +#region Input Validation + + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + +#endregion Input Validation + + $DhcpServerClass = Get-DhcpServerv4Class -Name $Name -ErrorAction SilentlyContinue + + if ($DhcpServerClass) + { + $HashTable = @{ + 'Name'=$DhcpServerClass.Name + 'Type'=$DhcpServerClass.Type + 'AsciiData' = $DhcpServerClass.AsciiData + 'Description' = $DhcpServerClass.Description + 'AddressFamily' = 'IPv4' + } + } + else + { + $HashTable = @{ + 'Name' = '' + 'Type' = '' + 'AsciiData' = '' + 'Description' = '' + 'AddressFamily' = '' + } + } + $HashTable +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory)][ValidateSet('Present','Absent')] + [System.String] $Ensure, + + [parameter(Mandatory)] [ValidateNotNullOrEmpty()] + [String]$Name, + + [parameter(Mandatory)][ValidateSet('Vendor','User')] + [String]$Type, + + [parameter(Mandatory)][ValidateNotNullOrEmpty()] + [string] $AsciiData, + + [AllowEmptyString()] + [string]$Description = '', + + [parameter(Mandatory)][ValidateSet('IPv4')] + [String]$AddressFamily + ) + + $DhcpServerClass = Get-DhcpServerv4Class $Name -ErrorAction SilentlyContinue + + #testing for ensure = present + if ($Ensure -eq 'Present') + { + #testing if class exists + if ($DhcpServerClass) + { + #if it exists we use the set verb + $scopeIDMessage = $($LocalizedData.SettingClassIDMessage) -f $Name + Write-Verbose -Message $scopeIDMessage + set-DhcpServerv4Class -Name $Name -Type $Type -Data $AsciiData -Description $Description + } + + #class not exists + else + { + $scopeIDMessage = $($LocalizedData.AddingClassIDMessage) -f $Name + Write-Verbose -Message $scopeIDMessage + Add-DhcpServerv4Class -Name $Name -Type $Type -Data $AsciiData -Description $Description + } + } + + #ensure = absent + else + { + $scopeIDMessage = $($LocalizedData.RemovingClassIDMessage) -f $Name + Write-Verbose -Message $scopeIDMessage + Remove-DhcpServerv4Class -Name $Name -Type $Type + } +} +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory)][ValidateSet('Present','Absent')] + [System.String] $Ensure, + + [parameter(Mandatory)] [ValidateNotNullOrEmpty()] + [String]$Name, + + [parameter(Mandatory)][ValidateSet('Vendor','User')] + [String]$Type, + + [parameter(Mandatory)][ValidateNotNullOrEmpty()] + [string] $AsciiData, + + [AllowEmptyString()] + [string]$Description = '', + + [parameter(Mandatory)][ValidateSet('IPv4')] + [String]$AddressFamily + ) + + $DhcpServerClass = Get-DhcpServerv4Class -Name $Name -ErrorAction SilentlyContinue + + #testing for ensure = present + if ($Ensure -eq 'Present') + { + #testing if $DhcpServerClass is not null + if ($DhcpServerClass) + { + #since $DhcpServerClass is not null compare the values + if (($DhcpServerClass.Type -eq $Type) -and ($DhcpServerClass.asciiData -eq $AsciiData) -and ($DhcpServerClass.Description -eq $Description)) + { + $result = $true + } + + else + { + $result = $false + } + } + #if $DhcpServerClass return false + else + { + $result = $false + } + } + + #ensure = absent + else + { + #testing if $DhcpServerClass is not null, if it exists return false + if ($DhcpServerClass) + { + $result = $false + } + #if it not exists return true + else + { + $result = $true + } + } + $result +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerClass/MSFT_xDhcpServerClass.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerClass/MSFT_xDhcpServerClass.schema.mof new file mode 100644 index 0000000..f36df4c --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerClass/MSFT_xDhcpServerClass.schema.mof @@ -0,0 +1,10 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xDhcpServerClass")] +class MSFT_xDhcpServerClass : OMI_BaseResource +{ + [key, Description("Class Name")] String Name; + [key, Description("Class Type, Vendor or User"), ValueMap{"Vendor","User"}, Values{"Vendor","User"}] String Type; + [key, Description("Class Data, in ASCII format")] String AsciiData; + [Write, Description("Class Description")] String Description; + [key, Description("Class address family. Currently needs to be IPv4"), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Key, Description("Whether the DHCP server Class should exist"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOption/MSFT_xDhcpServerOption.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOption/MSFT_xDhcpServerOption.psm1 new file mode 100644 index 0000000..34e033e --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOption/MSFT_xDhcpServerOption.psm1 @@ -0,0 +1,428 @@ +Import-Module $PSScriptRoot\..\Helper.psm1 -Verbose:$false + +# Localized messages +data LocalizedData +{ + # culture="en-US" + ConvertFrom-StringData @' +InvalidScopeIDMessage = DHCP server scopeID {0} is not valid. Supply a valid scopeID and try again +CheckScopeIDMessage = Checking DHCP server options for scopeID {0} ... +AddingScopeIDMessage = Adding DHCP server options for scopeID {0} ... +SetScopeIDMessage = DHCP server options is set for scopeID {0}. +FoundScopeIDMessage = Found DHCP server options for scopeID {0} and they should be {1} +NotFoundScopeIDMessage = Can not find DHCP server options for scopeID {0} and they should be {1} +RemovingScopeOptions = Removing DHCP Server options for scopeID {0}... +ScopeOptionsRemoved = DHCP Server options are removed. + +CheckPropertyMessage = Checking {0} option ... +NotDesiredPropertyMessage = {0} is not correct. Expected {1}, actual {2} +DesiredPropertyMessage = {0} option is correct. + +SettingPropertyMessage = Setting {0} option ... +SetPropertyMessage = {0} option is set to {1}. +'@ +} + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [parameter(Mandatory = $true)] + [String]$ScopeID, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String[]]$DnsServerIPAddress, + + [Parameter()] [ValidateSet('IPv4')] + [String]$AddressFamily = 'IPv4' + ) + +#region Input Validation + + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + + # Convert the ScopeID to be a valid IPAddress + $ScopeID = (Get-ValidIpAddress -ipString $ScopeID -AddressFamily $AddressFamily -parameterName 'ScopeID').ToString() + + # Test if the ScopeID is valid + $null = Get-DhcpServerv4Scope -ScopeId $ScopeID -ErrorAction SilentlyContinue -ErrorVariable err + if($err) + { + $errorMsg = $($LocalizedData.InvalidScopeIdMessage) -f $ScopeID + New-TerminatingError -errorId ScopeIdNotFound -errorMessage $errorMsg -errorCategory InvalidOperation + } + +#endregion Input Validation + + $ensure = 'Absent' + try + { + $dhcpOption = Get-DhcpServerv4OptionValue -ScopeID $ScopeID + if($dhcpOption) + { + $dnsDomain = (($dhcpOption | Where-Object Name -like 'DNS Domain Name').value)[0] + $ensure = 'Present' + $dnsServerIP = ($dhcpOption | Where-Object Name -like 'DNS Servers').value + $Router = ($dhcpOption | Where-Object OptionId -Like 3).value + } + } + catch + { + } + + @{ + ScopeID = $ScopeID + DnsDomain = $dnsDomain + AddressFamily = 'IPv4' + Ensure = $ensure + DnsServerIPAddress = $dnsServerIP + Router = $Router + } +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory = $true)] + [String]$ScopeID, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String[]]$DnsServerIPAddress, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String[]]$Router, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String]$DnsDomain, + + [ValidateSet('IPv4')] + [String]$AddressFamily = 'IPv4', + + [ValidateSet('Present','Absent')] + [String]$Ensure = 'Present' + ) + +#region Input Validation + + # Array of valid IP Address + [String[]]$validDnSServer = @() + + # Convert the ScopeID to be a valid IPAddress + $ScopeID = (Get-ValidIpAddress -ipString $ScopeID -AddressFamily $AddressFamily -parameterName 'ScopeID').ToString() + + # Convert the input to be valid IPAddress + foreach ($dnsServerIp in $DnsServerIPAddress) + { + $validDnSServer += (Get-ValidIpAddress -ipString $dnsServerIp -AddressFamily $AddressFamily -parameterName 'DnsServerIPAddress').ToString() + } + $DnsServerIPAddress = $validDnSServer + + # Array of valid IP Address + [String[]]$validRouter = @() + + # Convert the input to be valid IPAddress + foreach ($routerIp in $Router) + { + $validRouter += (Get-ValidIpAddress -ipString $routerIp -AddressFamily $AddressFamily -parameterName 'Router').ToString() + } + $Router = $validRouter + +#endregion Input Validation + + # Remove $AddressFamily and $debug from PSBoundParameters and pass it to validate-properties helper function + If($PSBoundParameters['Debug']) {$null = $PSBoundParameters.Remove('Debug')} + If($PSBoundParameters['AddressFamily']){$null = $PSBoundParameters.Remove('AddressFamily')} + + ValidateResourceProperties @PSBoundParameters -Apply +} + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [parameter(Mandatory = $true)] + [String]$ScopeID, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String[]]$DnsServerIPAddress, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String[]]$Router, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String]$DnsDomain, + + [ValidateSet('IPv4')] + [String]$AddressFamily = 'IPv4', + + [ValidateSet('Present','Absent')] + [String]$Ensure = 'Present' + ) + +#region Input Validation + + # Array of valid IP Address + [String[]]$validDnSServer = @() + + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + + # Convert the ScopeID to be a valid IPAddress + $ScopeID = (Get-ValidIpAddress -ipString $ScopeID -AddressFamily $AddressFamily -parameterName 'ScopeID').ToString() + + # Array of valid IP Address + [String[]]$validDnSServer = @() + + # Convert the input to be valid IPAddress + foreach ($dnsServerIp in $DnsServerIPAddress) + { + $validDnSServer += (Get-ValidIpAddress -ipString $dnsServerIp -AddressFamily $AddressFamily -parameterName 'DnsServerIPAddress').ToString() + } + $DnsServerIPAddress = $validDnSServer + + # Array of valid IP Address + [String[]]$validRouter = @() + + # Convert the input to be valid IPAddress + foreach ($routerIp in $Router) + { + $validRouter += (Get-ValidIpAddress -ipString $routerIp -AddressFamily $AddressFamily -parameterName 'Router').ToString() + } + $Router = $validRouter + + # Test if the ScopeID is valid + $null = Get-DhcpServerv4Scope -ScopeId $ScopeID -ErrorAction SilentlyContinue -ErrorVariable err + if($err) + { + $errorMsg = $($LocalizedData.InvalidScopeIdMessage) -f $ScopeID + New-TerminatingError -errorId ScopeIdNotFound -errorMessage $errorMsg -errorCategory InvalidOperation + } + +#endregion Input Validation + + # Remove $AddressFamily and $debug from PSBoundParameters and pass it to validateProperties helper function + If($PSBoundParameters['Debug']) {$null = $PSBoundParameters.Remove('Debug')} + If($PSBoundParameters['AddressFamily']){$null = $PSBoundParameters.Remove('AddressFamily')} + + ValidateResourceProperties @PSBoundParameters +} + +#region Helper function + +# Internal function to validate dhcpOptions properties +function ValidateResourceProperties +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory)] + [string]$ScopeID, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String[]]$DnsServerIPAddress, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String]$DnsDomain, + + [Parameter()] [ValidateNotNullOrEmpty()] + [String[]]$Router, + + [ValidateSet('Present','Absent')] + [String]$Ensure = 'Present', + + [switch]$Apply + ) + + $scopeIDMessage = $($LocalizedData.CheckScopeIDMessage) -f $ScopeID + Write-Verbose -Message $scopeIDMessage + + $dhcpOption = Get-DhcpServerv4OptionValue -ScopeID $ScopeID + + # Found DHCPOption + if($dhcpOption) + { + $foundScopeIdMessage = $($LocalizedData.FoundScopeIDMessage) -f $ScopeID, $Ensure + Write-Verbose -Message $foundScopeIdMessage + + # If Options should be present, check other properties + if($Ensure -eq 'Present') + { + + if($PSBoundParameters.ContainsKey('DnsServerIPAddress')) + { + # Test the DNS Server IPs + $checkPropertyMessage = $($LocalizedData.CheckPropertyMessage) -f 'Dns server ip' + Write-Verbose -Message $checkPropertyMessage + + $dnsServerIP = ($DhcpOption | Where-Object OptionId -eq 6).Value + # If comparison return something, they are not equal + if((-not $dnsServerIP) -or (Compare-Object $dnsServerIP $DnsServerIPAddress)) + { + $notDesiredPropertyMessage = $($LocalizedData.NotDesiredPropertyMessage) -f 'DNS server ip', ($DnsServerIPAddress -join ', '), ($dnsServerIP -join ', ') + Write-Verbose -Message $notDesiredPropertyMessage + if($Apply) + { + $settingPropertyMessage = $($LocalizedData.SettingPropertyMessage) -f 'DNS server ip' + Write-Verbose -Message $settingPropertyMessage + + Set-DhcpServerv4OptionValue -ScopeId $ScopeID -DnsServer $DnsServerIPAddress -Force + + $setPropertyMessage = $($LocalizedData.SetPropertyMessage) -f 'DNS server ip', ($DnsServerIPAddress -join ', ') + Write-Verbose -Message $setPropertyMessage + + } # end $Apply + else + { + return $false + } + } # end Compare-object + else + { + $desiredPropertyMessage = $($LocalizedData.DesiredPropertyMessage) -f 'DNS server ip' + Write-Verbose -Message $desiredPropertyMessage + } + } + + # If DNS Domain is specified, test that + if($PSBoundParameters.ContainsKey('DnsDomain')) + { + $checkPropertyMessage = $($LocalizedData.CheckPropertyMessage) -f 'Dns domain name' + Write-Verbose -Message $checkPropertyMessage + + $dnsDomainName = ($DhcpOption | Where-Object OptionId -eq 15).Value + if($dnsDomainName -ne $DnsDomain) + { + $notDesiredPropertyMessage = $($LocalizedData.NotDesiredPropertyMessage) -f 'DNS domain name', $DnsDomain, ($dnsDomainName -join ', ') + Write-Verbose -Message $notDesiredPropertyMessage + + if($Apply) + { + $settingPropertyMessage = $($LocalizedData.SettingPropertyMessage) -f 'DNS domain name' + Write-Verbose -Message $settingPropertyMessage + + Set-DhcpServerv4OptionValue -ScopeId $ScopeID -DnsDomain $DnsDomain + + $setPropertyMessage = $($LocalizedData.SetPropertyMessage) -f 'DNS domain name', ($DnsDomain -join ', ') + Write-Verbose -Message $setPropertyMessage + } # end $Apply + else + { + return $false + } + } # end $dnsDomainName -ne $DnsDomain + else + { + $desiredPropertyMessage = $($LocalizedData.DesiredPropertyMessage) -f 'DNS domain name' + Write-Verbose -Message $desiredPropertyMessage + } + } # end $PSBoundParameters.ContainsKey('DnsDomain') + + # If Router is specified, test that + if($PSBoundParameters.ContainsKey('Router')) + { + $propertyName = 'Router ip addresses' + $checkPropertyMessage = $($LocalizedData.CheckPropertyMessage) -f 'Router ip addresses' + Write-Verbose -Message $checkPropertyMessage + + $routerIP = ($DhcpOption | Where-Object OptionId -eq 3).Value + + if((-not $routerIP) -or (Compare-Object $routerIP $Router)) + { + $notDesiredPropertyMessage = $($LocalizedData.NotDesiredPropertyMessage) -f $propertyName, ($Router -join ', '), ($routerIP -join ', ') + Write-Verbose -Message $notDesiredPropertyMessage + + if($Apply) + { + $settingPropertyMessage = $($LocalizedData.SettingPropertyMessage) -f $propertyName + Write-Verbose -Message $settingPropertyMessage + + Set-DhcpServerv4OptionValue -ScopeId $ScopeID -Router $Router + + $setPropertyMessage = $($LocalizedData.SetPropertyMessage) -f $propertyName, ($Router -join ', ') + Write-Verbose -Message $setPropertyMessage + } # end $Apply + else + { + return $false + } + } # end $routerIP -ne $Router + else + { + $desiredPropertyMessage = $($LocalizedData.DesiredPropertyMessage) -f $propertyName + Write-Verbose -Message $desiredPropertyMessage + } + } # end $PSBoundParameters.ContainsKey('Router') + + if(-not $Apply) + { + return $true + } + } # end $Ensure -eq 'Present' + + # If Options should be absent, return False or remove it + else + { + if($Apply) + { + Write-Verbose -Message ($LocalizedData.RemovingScopeOptions -f $ScopeID) + foreach($option in $dhcpOption.OptionID) + { + Remove-DhcpServerv4OptionValue -ScopeId $ScopeID -OptionId $option + } + Write-Verbose -Message ($LocalizedData.ScopeOptionsRemoved) + } # end if $Apply + else {return $false} + } + } + else + { + $notFoundScopeIdMessage = $($LocalizedData.NotFoundScopeIDMessage) -f $ScopeID, $Ensure + Write-Verbose -Message $notFoundScopeIdMessage + + if($Apply) + { + # If Options should be present, create those + if($Ensure -eq 'Present') + { + $addingScopeIdMessage = $($LocalizedData.AddingScopeIDMessage) -f $ScopeID + Write-Verbose -Message $addingScopeIdMessage + + $parameters = @{ScopeID = $ScopeID;} + + ## If DnsServer(s) specified, pass it + if ($PSBoundParameters.ContainsKey('DnsServerIPAddress')) + { + $parameters['DnsServer'] = $DnsServerIPAddress + } + + # If Dns domain is specified pass it + if($PSBoundParameters.ContainsKey('DnsDomain')) + { + $parameters['DnsDomain'] = $DnsDomain + } + + Set-DhcpServerv4OptionValue @parameters -Force + + $setScopeIdMessage = $($LocalizedData.SetScopeIDMessage) -f $ScopeID + Write-Verbose -Message $setScopeIdMessage + } # end Ensure -eq 'Present + } # end if $Apply + else + { + # If Options should be present, return false else true + return ($Ensure -eq 'Absent') + } + } +} +#endregion Helper function +if($global:DhpcOptionTest -ne $true) +{ + Export-ModuleMember -Function *-TargetResource +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOption/MSFT_xDhcpServerOption.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOption/MSFT_xDhcpServerOption.schema.mof new file mode 100644 index 0000000..90f3627 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOption/MSFT_xDhcpServerOption.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xDhcpServerOption")] +class MSFT_xDhcpServerOption : OMI_BaseResource +{ + [Key, Description("ScopeId for which options are set")] String ScopeID; + [Write, Description("IP address of DNS Servers")] String DnsServerIPAddress[]; + [Write, Description("Domain name of DNS Server")] String DnsDomain; + [Write, Description("IP address of the router/default gateway.")] String Router[]; + [Write, Description("Address family type"), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Write, Description("Whether option should be set or removed"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; + diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOptionDefinition/MSFT_xDhcpServerOptionDefinition.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOptionDefinition/MSFT_xDhcpServerOptionDefinition.psm1 new file mode 100644 index 0000000..4d1d6bf --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOptionDefinition/MSFT_xDhcpServerOptionDefinition.psm1 @@ -0,0 +1,396 @@ +Import-Module $PSScriptRoot\..\Helper.psm1 -Verbose:$false + +# Localized messages +data LocalizedData +{ + # Culture="en-US" + ConvertFrom-StringData @' + GettingOptionDefinitionIDMessage = Getting DHCP server option definition "{0}" with vendor class "{1}". + TestingOptionDefinitionIDMessage = Begin testing DHCP server option definition "{0}" with vendor class "{1}". + RemovingOptionDefinitionIDMessage = Removing DHCP server option definition "{0}" with vendor class "{1}". + RecreatingOptionDefinitionIDMessage = Recreating DHCP server option definition "{0}" with vendor class "{1}". + AddingOptionDefinitionIDMessage = Adding DHCP server option definition "{0}" with vendor class "{1}". + SettingOptionDefinitionIDMessage = Setting DHCP server option definition "{0}" with vendor class "{1}". + FoundOptionDefinitionIDMessage = Found DHCP server option Definition "{0}" with vendor class "{1}". + NotFoundOptionDefinitionIDMessage = Cannot find DHCP server option Definition "{0}" with vendor class "{1}". + ComparingOptionDefinitionIDMessage = Comparing option definition "{0}", vendor class "{1}" with existing definition. + ExactMatchOptionDefinitionIDMessage = Matched option definition "{0}" with vendor class "{1}" with existing definition. + NotMatchOptionDefinitionIDMessage = Not matched all parameters in option definition "{0}" with vendor class "{1}", should adjust. +'@ +} + + <# + + .SYNOPSIS + This function gets a DHCP option definition. + + .PARAMETER Ensure + When set to 'Present', the option definition will be created. + When set to 'Absent', the option definition will be removed. + + .PARAMETER OptionId + The ID of the option definition. + + .PARAMETER Name + The name of the option definition. + + .PARAMETER VendorClass + The vendor class of the option definition. Use an empty string for standard class. + + .PARAMETER Type + The data type of the option definition. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + +#> + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter()] + [ValidateSet('Present','Absent')] + [ValidateNotNullOrEmpty()] + [String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [Validaterange(1,255)] + [UInt32] + $OptionId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Byte','Word','Dword','DwordDword','IPv4Address','String','BinaryData','EncapsulatedData')] + [String] + $Type, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily + ) + + # Region Input Validation + + # Check for DhcpServer module/role + Assert-Module -ModuleName DHCPServer + + # Endregion Input Validation + + $gettingIDMessage = $localizedData.GettingOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose -Message $gettingIDMessage + $dhcpServerOptionDefinition = Get-DhcpServerv4OptionDefinition -OptionId $OptionId -VendorClass $VendorClass -ErrorAction SilentlyContinue + + if ($dhcpServerOptionDefinition) + { + $hashTable = @{ + OptionId = $dhcpServerOptionDefinition.OptionId + Name = $dhcpServerOptionDefinition.Name + AddressFamily = $AddressFamily + Description = $dhcpServerOptionDefinition.Description + Type = $dhcpServerOptionDefinition.Type + VendorClass = $dhcpServerOptionDefinition.VendorClass + MultiValued = $dhcpServerOptionDefinition.MultiValued + Ensure = 'Present' + } + } + else + { + $hashTable = @{ + OptionId = $null + Name = $null + AddressFamily = $null + Description = $null + Type = $null + VendorClass = $null + MultiValued = $null + Ensure = 'Absent' + } + } + + $hashTable +} + +<# + + .SYNOPSIS + This function sets the state of a DHCP option definition. + + .PARAMETER Ensure + When set to 'Present', the option definition will be created. + When set to 'Absent', the option definition will be removed. + + .PARAMETER OptionId + The ID of the option definition. + + .PARAMETER Name + The name of the option definition. + + .PARAMETER Description + Description of the option definition. + + .PARAMETER VendorClass + The vendor class of the option definition. Use an empty string for standard class. + + .PARAMETER Type + The data type of the option definition. + + .PARAMETER Multivalued + Whether the option definition is multivalued or not. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + +#> + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('Present','Absent')] + [ValidateNotNullOrEmpty()] + [String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [Validaterange(1,255)] + [UInt32] + $OptionId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Name, + + [Parameter()] + [AllowEmptyString()] + [String] + $Description, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('Byte','Word','Dword','DwordDword','IPv4Address','String','BinaryData','EncapsulatedData')] + [String] + $Type, + + [Parameter()] + [Boolean] + $MultiValued, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily + ) + + # Reading the DHCP option + $dhcpServerOptionDefinition = Get-TargetResource -OptionId $OptionId -Name $Name -VendorClass $VendorClass -Type $Type -AddressFamily $AddressFamily -ErrorAction SilentlyContinue + + # Testing for present + if ($Ensure -eq 'Present') + { + # Testing if option exists + if ($dhcpServerOptionDefinition.Ensure -eq 'Present') + { + # If it exists and any of multivalued, type or vendorclass is being changed remove then re-add the whole option definition + if (($dhcpServerOptionDefinition.Type -ne $Type) -or ($dhcpServerOptionDefinition.MultiValued -ne $MultiValued) -or ($dhcpServerOptionDefinition.VendorClass -ne $VendorClass)) + { + $scopeIDMessage = $localizedData.RecreatingOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose -Message $scopeIDMessage + Remove-DhcpServerv4OptionDefinition -OptionId $OptionId -VendorClass $VendorClass + Add-DhcpServerv4OptionDefinition -OptionId $OptionId -name $Name -Type $Type -Description $Description -MultiValued:$MultiValued -VendorClass $VendorClass + } + # If option exists we need only to adjust the parameters + else + { + $settingIDMessage = $localizedData.SettingOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose -Message $settingIDMessage + Set-DhcpServerv4OptionDefinition -OptionId $OptionId -VendorClass $VendorClass -name $Name -Description $Description + } + } + # If option does not exist we need to add it + else + { + $scopeIDMessage = $localizedData.AddingOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose -Message $scopeIDMessage + Add-DhcpServerv4OptionDefinition -OptionId $OptionId -name $Name -Type $Type -Description $Description -MultiValued:$MultiValued -VendorClass $VendorClass + } + } + # Testing for 'absent' + else + { + if ($dhcpServerOptionDefinition) + { + $scopeIDMessage = $localizedData.RemovingOptionDefinitionIDMessage -f $OptionId,$VendorClass + Write-Verbose -Message $scopeIDMessage + Remove-DhcpServerv4OptionDefinition -OptionId $OptionId -VendorClass $VendorClass + } + } +} + +<# + + .SYNOPSIS + This function tests if the DHCP option definition is created. + + .PARAMETER Ensure + When set to 'Present', the option definition will be created. + When set to 'Absent', the option definition will be removed. + + .PARAMETER OptionId + The ID of the option definition. + + .PARAMETER Name + The name of the option definition. + + .PARAMETER Description + Description of the option definition. + + .PARAMETER VendorClass + The vendor class of the option definition. Use an empty string for standard class. + + .PARAMETER Type + The data type of the option definition. + + .PARAMETER Multivalued + Whether the option definition is multivalued or not. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + +#> + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [ValidateSet('Present','Absent')] + [ValidateNotNullOrEmpty()] + [String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [Validaterange(1,255)] + [UInt32] $OptionId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String] + $Name, + + [Parameter()] + [AllowEmptyString()] + [String] + $Description, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [Parameter(Mandatory = $true)] + [ValidateSet('Byte','Word','Dword','DwordDword','IPv4Address','String','BinaryData','EncapsulatedData')] + [String] + $Type, + + [Parameter()] + [Boolean] + $MultiValued, + + [Parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily + ) + + # Region Input Validation + + # Check for DhcpServer module/role + Assert-Module -ModuleName DHCPServer + # Endregion Input Validation + + $testingIDMessage = $localizedData.TestingOptionDefinitionIDMessage -f $OptionId, $VendorClass + # Geting the dhcp option definition + Write-Verbose -Message $testingIDMessage + + $currentConfiguration = Get-TargetResource -OptionId $OptionId -Name $Name -VendorClass $VendorClass -Type $Type -AddressFamily $AddressFamily -ErrorAction SilentlyContinue + + if ($currentConfiguration.Ensure -eq 'Present') + { + $foundIDMessage = $localizedData.FoundOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose $foundIDMessage + } + else + { + $notFoundIDMessage = $localizedData.NotFoundOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose $notFoundIDMessage + } + + + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + # Testing if $OptionId and VendorClass already exist + if ($currentConfiguration.Ensure -eq 'Present') + { + $comparingIDMessage = $localizedData.ComparingOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose $comparingIDMessage + + # Since $OptionId and $VendorClass exist compare all the Values + if (($currentConfiguration.OptionId -eq $OptionId) -and ($currentConfiguration.Name -eq $Name) -and ($currentConfiguration.Description -eq $Description) -and ($currentConfiguration.VendorClass -eq $VendorClass) -and ($currentConfiguration.Type -eq $Type) -and ($currentConfiguration.MultiValued -eq $MultiValued)) + { + $exactMatchIDMessage = $localizedData.ExactMatchOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose $exactMatchIDMessage + $result = $true + } + else + { + $notMatchIDMessage = $localizedData.NotMatchOptionDefinitionIDMessage -f $OptionId, $VendorClass + Write-Verbose $notMatchIDMessage + $result = $false + } + } + else + { + # Since $OptionId and $VendorClass do not exist return $false + $result = $false + } + } + # If Ensure = Absent + else + { + if ($currentConfiguration.Ensure -eq 'Present') + { + # Since desired state is 'Absent' and $OptionId and $VendorClass exist return $false + $result = $false + } + else + { + # Since desired state is 'Absent' and $OptionId and $VendorClass do not exist return $true + $result = $true + } + } +$result +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOptionDefinition/MSFT_xDhcpServerOptionDefinition.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOptionDefinition/MSFT_xDhcpServerOptionDefinition.schema.mof new file mode 100644 index 0000000..32309d7 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerOptionDefinition/MSFT_xDhcpServerOptionDefinition.schema.mof @@ -0,0 +1,12 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xDhcpServerOptionDefinition")] +class MSFT_xDhcpServerOptionDefinition : OMI_BaseResource +{ + [Key, Description("Option ID, specify a number between 1 and 255.")] uint32 OptionId; + [Key, Description("Vendor class. Use an empty string for standard option class.")] String VendorClass; + [Required, Description("Option name.")] String Name; + [Required, Description("Option data type."),ValueMap{"Byte","Word","Dword","DwordDword","IPv4Address","String","BinaryData","EncapsulatedData"},Values{"Byte","Word","Dword","DwordDword","IPv4Address","String","BinaryData","EncapsulatedData"}] string Type; + [Write, Description("Whether option is multivalued or not.")] Boolean Multivalued; + [Write, Description("Option description.")] String Description; + [Key, Description("Class address family. Currently needs to be IPv4."), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Write, Description("Whether the DHCP server class should exist."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerReservation/MSFT_xDhcpServerReservation.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerReservation/MSFT_xDhcpServerReservation.psm1 new file mode 100644 index 0000000..640c7b5 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerReservation/MSFT_xDhcpServerReservation.psm1 @@ -0,0 +1,354 @@ +Import-Module $PSScriptRoot\..\Helper.psm1 -Verbose:$false + +# Localized messages +data LocalizedData +{ + # culture="en-US" + ConvertFrom-StringData @' +InvalidScopeIDMessage = DHCP server scopeID {0} is not valid. Supply a valid scopeID and try again +CheckingReservationMessage = Checking DHCP server reservation in scope id {0} for IP address {1} ... +TestReservationMessage = DHCP server reservation in the given scope id for the IP address is {0} and it should be {1} +RemovingReservationMessage = Removing DHCP server reservation from scope id {0} for MAC address {1} ... +DeleteReservationMessage = DHCP server reservation for the given MAC address is now absent +AddingReservationMessage = Adding DHCP server reservation with the given IP address ... +SetReservationMessage = DHCP server reservation in the given scope id for the IP address {0} is now present + +CheckPropertyMessage = Checking DHCP server reservation {0} for the given ipaddress ... +NotDesiredPropertyMessage = DHCP server reservation for the given ipaddress doesn't have correct {0}. Expected {1}, actual {2} +DesiredPropertyMessage = DHCP server reservation {0} for the given ipaddress is correct. +SetPropertyMessage = DHCP server reservation {0} for the given ipaddress is set. +'@ +} + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [parameter(Mandatory)] + [String]$ScopeID, + + [parameter(Mandatory)] + [String]$ClientMACAddress, + + [parameter(Mandatory)] + [String]$IPAddress, + + [ValidateSet("IPv4")] + [String]$AddressFamily = 'IPv4' + ) + +#region input validation + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + + # Convert the ScopeID to be a valid IPAddress + $ScopeID = (Get-ValidIpAddress -ipString $ScopeID -AddressFamily $AddressFamily -parameterName 'ScopeID').ToString() + + # Test if the ScopeID is valid + $null = Get-DhcpServerv4Scope -ScopeId $ScopeID -ErrorAction SilentlyContinue -ErrorVariable err + if($err) + { + $errorMsg = $($LocalizedData.InvalidScopeIdMessage) -f $ScopeID + New-TerminatingError -errorId ScopeIdNotFound -errorMessage $errorMsg -errorCategory InvalidOperation + } + + # Convert the Start Range to be a valid IPAddress + $IPAddress = (Get-ValidIpAddress -ipString $IPAddress -AddressFamily $AddressFamily -parameterName 'IPAddress').ToString() + +#endregion input validation + + $reservation = Get-DhcpServerv4Reservation -ScopeID $ScopeID | Where-Object IPAddress -eq $IPAddress + + if($reservation) + { + $ensure = 'Present' + } + else + { + $ensure = 'Absent' + } + + @{ + ScopeID = $ScopeID + IPAddress = $IPAddress + ClientMACAddress = $reservation.ClientId + Name = $reservation.Name + AddressFamily = $AddressFamily + Ensure = $Ensure + } + +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory)] + [String]$ScopeID, + + [parameter(Mandatory)] + [String]$ClientMACAddress, + + [parameter(Mandatory)] + [String]$IPAddress, + + [String]$Name, + + [ValidateSet("IPv4")] + [String]$AddressFamily = 'IPv4', + + [ValidateSet("Present","Absent")] + [String]$Ensure = 'Present' + ) + + if($PSBoundParameters.ContainsKey('Debug')){ $null = $PSBoundParameters.Remove('Debug')} + if($PSBoundParameters.ContainsKey('AddressFamily')) {$null = $PSBoundParameters.Remove('AddressFamily')} + + Validate-ResourceProperties @PSBoundParameters -Apply +} + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [parameter(Mandatory)] + [String]$ScopeID, + + [parameter(Mandatory)] + [String]$ClientMACAddress, + + [parameter(Mandatory)] + [String]$IPAddress, + + [String]$Name, + + [ValidateSet("IPv4")] + [String]$AddressFamily = 'IPv4', + + [ValidateSet("Present","Absent")] + [String]$Ensure = 'Present' + ) + +#region input validation + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + + # Convert the ScopeID to be a valid IPAddress + $ScopeID = (Get-ValidIpAddress -ipString $ScopeID -AddressFamily $AddressFamily -parameterName 'ScopeID').ToString() + + # Test if the ScopeID is valid + $null = Get-DhcpServerv4Scope -ScopeId $ScopeID -ErrorAction SilentlyContinue -ErrorVariable err + if($err) + { + $errorMsg = $($LocalizedData.InvalidScopeIdMessage) -f $ScopeID + New-TerminatingError -errorId ScopeIdNotFound -errorMessage $errorMsg -errorCategory InvalidOperation + } + + # Convert the Start Range to be a valid IPAddress + $IPAddress = (Get-ValidIpAddress -ipString $IPAddress -AddressFamily $AddressFamily -parameterName 'IPAddress').ToString() + + #Convert the MAC Address into normalized form for comparison + $ClientMACAddress = $ClientMACAddress.Replace('-','') + +#endregion input validation + + if($PSBoundParameters.ContainsKey('Debug')){ $null = $PSBoundParameters.Remove('Debug')} + if($PSBoundParameters.ContainsKey('AddressFamily')) {$null = $PSBoundParameters.Remove('AddressFamily')} + + Validate-ResourceProperties @PSBoundParameters +} + +#region Helper function + +# Internal function to validate dhcpOptions properties +function Validate-ResourceProperties +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory)] + [String]$ScopeID, + + [parameter(Mandatory)] + [String]$ClientMACAddress, + + [parameter(Mandatory)] + [String]$IPAddress, + + [String]$Name, + + [ValidateSet("IPv4")] + [String]$AddressFamily = 'IPv4', + + [ValidateSet("Present","Absent")] + [String]$Ensure = 'Present', + + [Switch]$Apply + ) + + $reservationMessage = $($LocalizedData.CheckingReservationMessage) -f $ScopeID, $IPAddress + Write-Verbose -Message $reservationMessage + + $reservation = Get-DhcpServerv4Reservation -ScopeID $ScopeID | Where-Object IPAddress -eq $IPAddress + + # Initialize the parameter collection + if($Apply) + { + $parameters = @{IPAddress = $IPAddress} + } + # Found DHCP reservation + if($reservation) + { + $TestReservationMessage = $($LocalizedData.TestReservationMessage) -f 'present', $Ensure + Write-Verbose -Message $TestReservationMessage + + # if it should be present, test individual properties to match parameter values + if($Ensure -eq 'Present') + { + #Convert the MAC Address into normalized form for comparison + $normalizedClientID = $reservation.ClientId.Replace('-','') + + #region Test MAC address + $checkPropertyMsg = $($LocalizedData.CheckPropertyMessage) -f 'client MAC address' + Write-Verbose -Message $checkPropertyMsg + + if($normalizedClientID -ne $ClientMACAddress) + { + $notDesiredPropertyMsg = $($LocalizedData.NotDesiredPropertyMessage) -f 'client MAC address',$ClientMACAddress,$normalizedClientID + Write-Verbose -Message $notDesiredPropertyMsg + + if($Apply) + { + $parameters['ClientID'] = $ClientMACAddress + } + else + { + return $false + } + } # end ClientID ne ClientMACAddress + else + { + $desiredPropertyMsg = $($LocalizedData.DesiredPropertyMessage) -f 'client MAC address' + Write-Verbose -Message $desiredPropertyMsg + } + #endregion Test MAC address + + #region Test reservation name + $checkPropertyMsg = $($LocalizedData.CheckPropertyMessage) -f 'name' + Write-Verbose -Message $checkPropertyMsg + + if($reservation.Name -ne $Name) + { + $notDesiredPropertyMsg = $($LocalizedData.NotDesiredPropertyMessage) -f 'name',$Name,$($reservation.Name) + Write-Verbose -Message $notDesiredPropertyMsg + + if($Apply) + { + $parameters['Name'] = $Name + } + else + { + return $false + } + } # end reservation.Name -ne Name + else + { + $desiredPropertyMsg = $($LocalizedData.DesiredPropertyMessage) -f 'name' + Write-Verbose -Message $desiredPropertyMsg + } + #endregion Test reservation name + + if($Apply) + { + # If parameters contains more than 1 key, set the DhcpServer reservation + if($parameters.Count -gt 1) + { + Set-DhcpServerv4Reservation @parameters + + Write-PropertyMessage -Parameters $parameters -keysToSkip IPAddress ` + -Message $($LocalizedData.SetPropertyMessage) -Verbose + } + } # end Apply + else + { + return $true + } + } # end ensure -eq present + + # If dhcpreservation should be absent + else + { + if($Apply) + { + $removingReservationMsg = $($LocalizedData.RemovingReservationMessage) -f $ScopeID,$ClientMACAddress + Write-Verbose -Message $removingReservationMsg + + # Remove the reservation + Remove-DhcpServerv4Reservation -ScopeId $ScopeID -ClientId $ClientMACAddress + + $deleteReservationMsg = $LocalizedData.deleteReservationMessage + Write-Verbose -Message $deleteReservationMsg + } + else + { + return $false + } + } # end ensure -eq absent + } # end found resevation + + else + { + $TestReservationMessage = $($LocalizedData.TestReservationMessage) -f 'absent', $Ensure + Write-Verbose -Message $TestReservationMessage + + if($Ensure -eq 'Present') + { + if($Apply) + { + # Add other mandatory parameters + $parameters['ScopeId'] = $ScopeID + $parameters['ClientId'] = $ClientMACAddress + + # Check if reservation name is specified, add to parameter collection + if($PSBoundParameters.ContainsKey('Name')) + { + $parameters['Name'] = $Name + } + + $addingReservationeMessage = $LocalizedData.AddingReservationMessage + Write-Verbose -Message $addingReservationeMessage + + try + { + # Create a new scope with specified properties + Add-DhcpServerv4Reservation @parameters + + $setReservationMessage = $($LocalizedData.SetReservationMessage) -f $Name + Write-Verbose -Message $setReservationMessage + } + catch + { + New-TerminatingError -errorId DhcpServerReservationFailure -errorMessage $_.Exception.Message -errorCategory InvalidOperation + } + }# end Apply + else + { + return $false + } + } # end Ensure -eq Present + else + { + return $true + } + } # end ! reservation +} + +#endregion + +Export-ModuleMember -Function *-TargetResource + diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerReservation/MSFT_xDhcpServerReservation.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerReservation/MSFT_xDhcpServerReservation.schema.mof new file mode 100644 index 0000000..c1d6c0e --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerReservation/MSFT_xDhcpServerReservation.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xDhcpServerReservation")] +class MSFT_xDhcpServerReservation : OMI_BaseResource +{ + [Key, Description("ScopeId for which reservations are set")] String ScopeID; + [Key, Description("IP address of the reservation for which the properties are modified")] String IPAddress; + [Required, Description("Client MAC Address to set on the reservation")] String ClientMACAddress; + [Write, Description("Reservation name")] String Name; + [Write, Description("Address family type"), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Write, Description("Whether option should be set or removed"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; + diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerScope/MSFT_xDhcpServerScope.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerScope/MSFT_xDhcpServerScope.psm1 new file mode 100644 index 0000000..fb3ec17 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerScope/MSFT_xDhcpServerScope.psm1 @@ -0,0 +1,700 @@ +Import-Module $PSScriptRoot\..\Helper.psm1 -Verbose:$false + +# Localized messages +data LocalizedData +{ + # culture="en-US" + ConvertFrom-StringData @' +AddingScopeMessage = Adding DHCP server scope with the given ScopeId ({0})... +CheckScopeMessage = Checking DHCP server scope with the given ScopeId ({0})... +SetScopeMessage = DHCP server scope with name '{0}' is now present. +RemovingScopeMessage = Removing DHCP server scope with the given ScopeId ({0})... +DeleteScopeMessage = DHCP server scope with the given ScopeId ({0}) is now absent. +TestScopeMessage = DHCP server scope with the given ScopeId ({0}) is '{1}' and it should be '{2}'. + +CheckPropertyMessage = Checking DHCP server scope '{0}' ... +NotDesiredPropertyMessage = DHCP server scope '{0}' is not correct; expected '{1}', actual '{2}'. +DesiredPropertyMessage = DHCP server scope '{0}' is correct. +SetPropertyMessage = DHCP server scope '{0}' is set to '{1}'. +'@ +} + +<# + .SYNOPSIS + Gets current status of the scope with specified ScopeId. + + .DESCRIPTION + Used by DSC Resource to perform Get method. + For existing scopes retrieves all information that might be defined in the resource. + Fore missing scopes returns only ScopeId, AddressFamily and the fact that it is absent. + + .EXAMPLE + Get-TargetResource -ScopeId 192.168.1.0 -Name MyScope -IPStartRange 192.168.1.1 -IPEndRange 192.168.1.250 -SubnetMask 255.255.255.0 + Gets information about scope 192.168.1.0 (if exists) or retunrs information about missing scope. + + .PARAMETER ScopeId + ScopeId of the DHCP scope + + .PARAMETER Name + Name of the DHCP scope + + .PARAMETER IPStartRange + StartRange of the DHCP scope + + .PARAMETER IPEndRange + EndRange of the DHCP scope + + .PARAMETER SubnetMask + SubnetMask of the DHCP scope + + .PARAMETER AddressFamily + AddressFamily of the DHCP scope +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $IPStartRange, + + [Parameter(Mandatory = $true)] + [String] + $IPEndRange, + + [Parameter(Mandatory = $true)] + [String] + $SubnetMask, + + [Parameter()] + [ValidateSet('IPv4')] + [String] + $AddressFamily = 'IPv4' + + ) + #region Input Validation + + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + + # Check values of IP Addresses used to define the scope + $ipAddressesAssertionParameters = @{ + ScopeId = $ScopeId + IPStartRange = $IPStartRange + IPEndRange = $IPEndRange + SubnetMask = $SubnetMask + AddressFamily = $AddressFamily + } + Assert-ScopeParameter @ipAddressesAssertionParameters + + #endregion Input Validation + + $dhcpScope = Get-DhcpServerv4Scope -ScopeId $ScopeId -ErrorAction SilentlyContinue + if($dhcpScope) + { + $ensure = 'Present' + $leaseDuration = $dhcpScope.LeaseDuration.ToString() + } + else + { + $ensure = 'Absent' + $leaseDuration = '' + } + + return @{ + ScopeID = $ScopeId + Name = $dhcpScope.Name + IPStartRange = $dhcpScope.StartRange + IPEndRange = $dhcpScope.EndRange + SubnetMask = $dhcpScope.SubnetMask + Description = $dhcpScope.Description + LeaseDuration = $leaseDuration + State = $dhcpScope.State + AddressFamily = $AddressFamily + Ensure = $ensure + } +} + +<# + .SYNOPSIS + Sets the scope with specified ScopeId. + + .DESCRIPTION + Used by DSC Resource to perform Set method. + It will add/remove/modify Scope based on input parameters + + .EXAMPLE + Set-TargetResource -ScopeId 192.168.1.0 -Name MyScope -IPStartRange 192.168.1.1 -IPEndRange 192.168.1.250 -SubnetMask 255.255.255.0 + Sets or creates scope with ScopeId 192.168.1.0 with parameters specified. + + .PARAMETER ScopeId + ScopeId of the DHCP scope + + .PARAMETER Name + Expected name of the DHCP scope + + .PARAMETER IPStartRange + Expected startRange of the DHCP scope + + .PARAMETER IPEndRange + Expected endRange of the DHCP scope + + .PARAMETER SubnetMask + Expected subnetMask of the DHCP scope + + .PARAMETER Description + Expected description of the DHCP scope + + .PARAMETER LeaseDuration + Expected duration of the lease of the DHCP scope + + .PARAMETER AddressFamily + Expected address family of the DHCP scope + + .PARAMETER State + Expected state of the DHCP scope + + .PARAMETER Ensure + Expected presence of the DHCP scope +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $IPStartRange, + + [Parameter(Mandatory = $true)] + [String] + $IPEndRange, + + [Parameter(Mandatory = $true)] + [String] + $SubnetMask, + + [Parameter()] + [String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $LeaseDuration, + + [Parameter()] + [ValidateSet('IPv4')] + [String] + $AddressFamily = 'IPv4', + + [Parameter()] + [ValidateSet('Active','Inactive')] + [String] + $State = 'Active', + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + #region Input Validation + + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + + # Check values of IP Addresses used to define the scope + $ipAddressesAssertionParameters = @{ + ScopeId = $ScopeId + IPStartRange = $IPStartRange + IPEndRange = $IPEndRange + SubnetMask = $SubnetMask + AddressFamily = $AddressFamily + } + Assert-ScopeParameter @ipAddressesAssertionParameters + + #endregion Input Validation + + + if($PSBoundParameters.ContainsKey('Debug')){ $null = $PSBoundParameters.Remove('Debug')} + if($PSBoundParameters.ContainsKey('AddressFamily')) {$null = $PSBoundParameters.Remove('AddressFamily')} + + Validate-ResourceProperties @PSBoundParameters -Apply + +} + +<# + .SYNOPSIS + Tests the scope with specified ScopeId. + + .DESCRIPTION + Used by DSC Resource to perform Test method. + It will verify that Scope is configured as described in the parameters. + + .EXAMPLE + Test-TargetResource -ScopeId 192.168.1.0 -Name MyScope -IPStartRange 192.168.1.1 -IPEndRange 192.168.1.250 -SubnetMask 255.255.255.0 + Returns $true if scope is configured as described and $false if it's not + + .PARAMETER ScopeId + ScopeId of the DHCP scope + + .PARAMETER Name + Expected name of the DHCP scope + + .PARAMETER IPStartRange + Expected startRange of the DHCP scope + + .PARAMETER IPEndRange + Expected endRange of the DHCP scope + + .PARAMETER SubnetMask + Expected subnetMask of the DHCP scope + + .PARAMETER Description + Expected description of the DHCP scope + + .PARAMETER LeaseDuration + Expected duration of the lease of the DHCP scope + + .PARAMETER AddressFamily + Expected address family of the DHCP scope + + .PARAMETER State + Expected state of the DHCP scope + + .PARAMETER Ensure + Expected presence of the DHCP scope +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $IPStartRange, + + [Parameter(Mandatory = $true)] + [String] + $IPEndRange, + + [Parameter(Mandatory = $true)] + [String] + $SubnetMask, + + [Parameter()] + [String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $LeaseDuration, + + [Parameter()] + [ValidateSet('IPv4')] + [String] + $AddressFamily = 'IPv4', + + [Parameter()] + [ValidateSet('Active','Inactive')] + [String] + $State = 'Active', + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + #region Input Validation + + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + + # Check values of IP Addresses used to define the scope + $ipAddressesAssertionParameters = @{ + ScopeId = $ScopeId + IPStartRange = $IPStartRange + IPEndRange = $IPEndRange + SubnetMask = $SubnetMask + AddressFamily = $AddressFamily + } + Assert-ScopeParameter @ipAddressesAssertionParameters + + #endregion Input Validation + + if($PSBoundParameters.ContainsKey('Debug')){ $null = $PSBoundParameters.Remove('Debug')} + if($PSBoundParameters.ContainsKey('AddressFamily')) {$null = $PSBoundParameters.Remove('AddressFamily')} + + Validate-ResourceProperties @PSBoundParameters + +} + +function Validate-ResourceProperties +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $ScopeId, + + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $IPStartRange, + + [Parameter(Mandatory = $true)] + [String] + $IPEndRange, + + [Parameter(Mandatory = $true)] + [String] + $SubnetMask, + + [Parameter()] + [String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String] + $LeaseDuration, + + [Parameter()] + [ValidateSet('Active','Inactive')] + [String] + $State = 'Active', + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [Switch] + $Apply + ) + + # Convert the Lease duration to be a valid timespan + if($LeaseDuration) + { + $LeaseDuration = (Get-ValidTimeSpan -tsString $LeaseDuration -parameterName 'Leaseduration').ToString() + } + + $checkScopeMessage = $LocalizedData.CheckScopeMessage -f $ScopeId + Write-Verbose -Message $checkScopeMessage + + $dhcpScope = Get-DhcpServerv4Scope -ScopeId $ScopeId -ErrorAction SilentlyContinue + # Initialize the parameter collection + if($Apply) + { + $parameters = @{} + } + + # dhcpScope is set + if($dhcpScope) + { + $TestScopeMessage = $($LocalizedData.TestScopeMessage) -f $ScopeId, 'present', $Ensure + Write-Verbose -Message $TestScopeMessage + + # if it should be present, test individual properties to match parameter values + if($Ensure -eq 'Present') + { + #region Test the Scope Name + $checkPropertyMsg = $($LocalizedData.CheckPropertyMessage) -f 'name' + Write-Verbose -Message $checkPropertyMsg + + if($dhcpScope.Name -ne $Name) + { + $notDesiredPropertyMsg = $($LocalizedData.NotDesiredPropertyMessage) -f 'name',$Name,$($dhcpScope.Name) + Write-Verbose -Message $notDesiredPropertyMsg + + if($Apply) + { + $parameters['Name'] = $Name + } + else + { + return $false + } + } + else + { + $desiredPropertyMsg = $($LocalizedData.DesiredPropertyMessage) -f 'name' + Write-Verbose -Message $desiredPropertyMsg + } + #endregion scope name + + #region Test the IPStartRange and IPEndRange + if($dhcpScope.StartRange -ne $IPStartRange -or $dhcpScope.EndRange -ne $IPEndRange) + { + $notDesiredPropertyMsg = $($LocalizedData.NotDesiredPropertyMessage) -f 'Start/EndRange',"$IPStartRange/$IPEndRange","$($dhcpScope.StartRange)/$($dhcpScope.EndRange)" + Write-Verbose -Message $notDesiredPropertyMsg + + if($Apply) + { + $parameters['StartRange'] = $IPStartRange + $parameters['EndRange'] = $IPEndRange + } + else + { + return $false + } + } + #endregion IPStartRange and IPEndRange + + #region Test the Scope Description + if($PSBoundParameters.ContainsKey('Description')) + { + $checkPropertyMsg = $($LocalizedData.CheckPropertyMessage) -f 'description' + Write-Verbose -Message $checkPropertyMsg + + if($dhcpScope.Description -ne $Description) + { + $notDesiredPropertyMsg = $($LocalizedData.NotDesiredPropertyMessage) -f 'description',$Description,$($dhcpScope.Description) + Write-Verbose -Message $notDesiredPropertyMsg + + if($Apply) + { + $parameters['Description'] = $Description + } + else + { + return $false + } + } + else + { + $desiredPropertyMsg = $($LocalizedData.DesiredPropertyMessage) -f 'description' + Write-Verbose -Message $desiredPropertyMsg + } + } + #endregion scope description + + #region Test the Lease duration + if($PSBoundParameters.ContainsKey('LeaseDuration')) + { + $checkPropertyMsg = $($LocalizedData.CheckPropertyMessage) -f 'lease duration' + Write-Verbose -Message $checkPropertyMsg + + if($dhcpScope.LeaseDuration -ne $LeaseDuration) + { + $notDesiredPropertyMsg = $($LocalizedData.NotDesiredPropertyMessage) -f 'lease duration',$LeaseDuration,$($dhcpScope.LeaseDuration) + Write-Verbose -Message $notDesiredPropertyMsg + + if($Apply) + { + $parameters['LeaseDuration'] = $LeaseDuration + } + else + { + return $false + } + } + else + { + $desiredPropertyMsg = $($LocalizedData.DesiredPropertyMessage) -f 'lease duration' + Write-Verbose -Message $desiredPropertyMsg + } + } + #endregion lease duration + + #region Test the Scope State + if($PSBoundParameters.ContainsKey('State')) + { + $checkPropertyMsg = $($LocalizedData.CheckPropertyMessage) -f 'state' + Write-Verbose -Message $checkPropertyMsg + + if($dhcpScope.State -ne $State) + { + $notDesiredPropertyMsg = $($LocalizedData.NotDesiredPropertyMessage) -f 'state',$State,$($dhcpScope.State) + Write-Verbose -Message $notDesiredPropertyMsg + + if($Apply) + { + $parameters['State'] = $State + } + else + { + return $false + } + } + else + { + $desiredPropertyMsg = $($LocalizedData.DesiredPropertyMessage) -f 'state' + Write-Verbose -Message $desiredPropertyMsg + } + } + #endregion scope state + + #region Test the Subnet Mask + $checkPropertyMsg = $($LocalizedData.CheckPropertyMessage) -f 'subnet mask' + Write-Verbose -Message $checkPropertyMsg + + if($dhcpScope.SubnetMask -ne $SubnetMask) + { + $notDesiredPropertyMsg = $($LocalizedData.NotDesiredPropertyMessage) -f 'subnet mask',$SubnetMask,$($dhcpScope.SubnetMask) + Write-Verbose -Message $notDesiredPropertyMsg + + if($Apply) + { + try + { + # To set the subnet mask scope, the only ways is to remove the old scope and add a new scope + Remove-DhcpServerv4Scope -ScopeId $ScopeId + ## We can't splat two hashtables and $parameters may be empty, so just clone the existing one + $addDhcpServerv4ScopeParams = $parameters.Clone(); + $addDhcpServerv4ScopeParams['Type'] = 'Dhcp'; + $addDhcpServerv4ScopeParams['StartRange'] = $IPStartRange; + $addDhcpServerv4ScopeParams['EndRange'] = $IPEndRange; + $addDhcpServerv4ScopeParams['Name'] = $Name; + $addDhcpServerv4ScopeParams['SubnetMask'] = $SubnetMask; + Add-DhcpServerv4Scope @addDhcpServerv4ScopeParams; + } + catch + { + New-TerminatingError -errorId DhcpServerScopeFailure -errorMessage $_.Exception.Message -errorCategory InvalidOperation + } + + $setPropertyMsg = $($LocalizedData.SetPropertyMessage) -f 'subnet mask',$SubnetMask + Write-Verbose -Message $setPropertyMsg + } + else + { + return $false + } + } + else + { + $desiredPropertyMsg = $($LocalizedData.DesiredPropertyMessage) -f 'subnet mask' + Write-Verbose -Message $desiredPropertyMsg + } + #endregion subnet mask + + if($Apply) + { + # If parameters contains more than 0 key, set the DhcpServer scope + if($parameters.Count -gt 0) + { + Set-DhcpServerv4Scope @parameters -ScopeId $dhcpScope.ScopeId + Write-PropertyMessage -Parameters $parameters -keysToSkip ScopeId ` + -Message $($LocalizedData.SetPropertyMessage) -Verbose + } + } # end Apply + else + { + return $true + } + } # end ensure eq present + + # If dhcpscope should be absent + else + { + if($Apply) + { + $removingScopeMsg = $LocalizedData.RemovingScopeMessage -f $ScopeId + Write-Verbose -Message $removingScopeMsg + + # Remove the scope + Remove-DhcpServerv4Scope -ScopeId $ScopeId + + $deleteScopeMsg = $LocalizedData.deleteScopeMessage -f $ScopeId + Write-Verbose -Message $deleteScopeMsg + } + else + { + return $false + } + }# end ensure -eq 'Absent' + } # if $dhcpScope + + #If dhcpScope is not set, create it if needed + else + { + $TestScopeMessage = $($LocalizedData.TestScopeMessage) -f $ScopeId, 'absent', $Ensure + Write-Verbose -Message $TestScopeMessage + + if($Ensure -eq 'Present') + { + if($Apply) + { + # Add mandatory parameters + $parameters['Name'] = $Name + $parameters['StartRange'] = $IPStartRange + $parameters['EndRange'] = $IPEndRange + $parameters['SubnetMask'] = $SubnetMask + + # Check if Lease duration is specified, add to parameter collection + if($PSBoundParameters.ContainsKey('LeaseDuration')) + { + $parameters['LeaseDuration'] = $LeaseDuration + } + + # Check if State is specified, add to parameter collection + if($PSBoundParameters.ContainsKey('State')) + { + $parameters['State'] = $State + } + + $addingScopeMessage = $LocalizedData.AddingScopeMessage -f $ScopeId + Write-Verbose -Message $addingScopeMessage + + try + { + # Create a new scope with specified properties + Add-DhcpServerv4Scope @parameters -Type dhcp + + $setScopeMessage = $($LocalizedData.SetScopeMessage) -f $Name + Write-Verbose -Message $setScopeMessage + } + catch + { + New-TerminatingError -errorId DhcpServerScopeFailure -errorMessage $_.Exception.Message -errorCategory InvalidOperation + } + }# end Apply + else + { + return $false + } + } # end Ensure -eq Present + else + { + return $true + } + } # else !dhcpscope +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerScope/MSFT_xDhcpServerScope.schema.mof b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerScope/MSFT_xDhcpServerScope.schema.mof new file mode 100644 index 0000000..da1b50c --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/DSCResources/MSFT_xDhcpServerScope/MSFT_xDhcpServerScope.schema.mof @@ -0,0 +1,15 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xDhcpServerScope")] +class MSFT_xDhcpServerScope : OMI_BaseResource +{ + [Key, Description("ScopeId for the given scope")] String ScopeId; + [Required, Description("Name of DHCP Scope")] String Name; + [Required, Description("Subnet mask for the scope specified in IP address format")] String SubnetMask; + [Required, Description("Starting address to set for this scope")] String IPStartRange; + [Required, Description("Ending address to set for this scope")] String IPEndRange; + [Write, Description("Description of DHCP Scope")] String Description; + [Write, Description("Time interval for which an IP address should be leased")] String LeaseDuration; + [Write, Description("Whether scope should be active or inactive"), ValueMap{"Active","Inactive"}, Values{"Active","Inactive"}] String State; + [Write, Description("Address family type"), ValueMap{"IPv4"}, Values{"IPv4"}] String AddressFamily; + [Write, Description("Whether scope should be set or removed"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; + diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/LICENSE b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/LICENSE new file mode 100644 index 0000000..6bf8d3a --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Microsoft Corporation. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerOptionResource.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerOptionResource.ps1 new file mode 100644 index 0000000..678623c --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerOptionResource.ps1 @@ -0,0 +1,17 @@ +$Properties = @{ + DnsServer = New-xDscResourceProperty -Name DnsServerIPAddress -Type String[] -Attribute Required ` + -Description 'IP address of DNS Servers' + Router = New-xDscResourceProperty -Name Router -Type String[] -Attribute Required ` + -Description 'IP address of the router/default gateway.' + DnsDomain = New-xDscResourceProperty -Name DnsDomain -Type String -Attribute Write ` + -Description 'Domain name of DNS Server' + AddressFamily = New-xDscResourceProperty -Name AddressFamily -Type String -Attribute Write ` + -ValidateSet 'IPv4' -Description 'Address family type' + ScopeID = New-xDscResourceProperty -Name ScopeID -Type String -Attribute Key ` + -Description 'ScopeId for which options are set' + Ensure = New-xDscResourceProperty -Name Ensure -Type String -Attribute Write ` + -ValidateSet 'Present','Absent' ` + -Description 'Whether option should be set or removed' +} + +New-xDscResource -Name MSFT_xDhcpServerOption -Property $Properties.Values -ModuleName xDhcpServer -FriendlyName xDhcpServerOption diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerReservationResource.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerReservationResource.ps1 new file mode 100644 index 0000000..dd0850c --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerReservationResource.ps1 @@ -0,0 +1,17 @@ +$Properties = @{ + ScopeID = New-xDscResourceProperty -Name ScopeID -Type String -Attribute Key ` + -Description 'ScopeId for which reservations are set' + IPAddress = New-xDscResourceProperty -Name IPAddress -Type String -Attribute Required ` + -Description 'IP address of the reservation for which the properties are modified' + ClientMACAddress = New-xDscResourceProperty -Name ClientMACAddress -Type String -Attribute Required ` + -Description 'Client ID to set on the reservation For Windows clients it is the MAC address' + Name = New-xDscResourceProperty -Name Name -Type String -Attribute Write ` + -Description 'Reservation name' + AddressFamily = New-xDscResourceProperty -Name AddressFamily -Type String -Attribute Write ` + -ValidateSet 'IPv4' -Description 'Address family type' + Ensure = New-xDscResourceProperty -Name Ensure -Type String -Attribute Write ` + -ValidateSet 'Present','Absent' ` + -Description 'Whether option should be set or removed' +} + +New-xDscResource -Name MSFT_xDhcpServerReservation -Property $Properties.Values -ModuleName xDhcpServer -FriendlyName xDhcpServerReservation diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerScopeResource.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerScopeResource.ps1 new file mode 100644 index 0000000..a2eadb0 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Misc/New-DhcpServerScopeResource.ps1 @@ -0,0 +1,24 @@ +$Properties = @{ + ScopeID = New-xDscResourceProperty -Name ScopeID -Type String -Attribute Read ` + -Description 'ScopeId for which properties are set' + Name = New-xDscResourceProperty -Name Name -Type String -Attribute Required ` + -Description 'Name of DHCP Scope' + AddressFamily = New-xDscResourceProperty -Name AddressFamily -Type String -Attribute Write ` + -ValidateSet 'IPv4' -Description 'Address family type' + IPStartRange = New-xDscResourceProperty -Name IPStartRange -Type String -Attribute Key ` + -Description 'Starting address to set for this scope' + IPEndRange = New-xDscResourceProperty -Name IPEndRange -Type String -Attribute Key ` + -Description 'Ending address to set for this scope' + SubnetMask = New-xDscResourceProperty -Name SubnetMask -Type String -Attribute Write ` + -Description 'Subnet mask for the scope specified in IP address format' + LeaseDuration = New-xDscResourceProperty -Name LeaseDuration -Type String -Attribute Write ` + -Description 'Time interval for which an IP address should be leased' + State = New-xDscResourceProperty -Name State -Type String -Attribute Write ` + -ValidateSet 'Active','Inactive' ` + -Description 'Whether scope should be active or inactive' + Ensure = New-xDscResourceProperty -Name Ensure -Type String -Attribute Write ` + -ValidateSet 'Present','Absent' ` + -Description 'Whether scope should be set or removed' +} + +New-xDscResource -Name MSFT_xDhcpServerScope -Property $Properties.Values -ModuleName xDhcpServer -FriendlyName xDhcpServerScope diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/CommonResourceHelper.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/CommonResourceHelper.psm1 new file mode 100644 index 0000000..bf18d83 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/CommonResourceHelper.psm1 @@ -0,0 +1,265 @@ +<# + .SYNOPSIS + Creates and throws an invalid argument exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ArgumentName + The name of the invalid argument that is causing this error to be thrown. +#> +function New-InvalidArgumentException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArgumentName + ) + + $argumentException = New-Object -TypeName 'ArgumentException' ` + -ArgumentList @($Message, $ArgumentName) + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @($argumentException, $ArgumentName, 'InvalidArgument', $null) + } + + $errorRecord = New-Object @newObjectParameters + + throw $errorRecord +} + +<# + .SYNOPSIS + Creates and throws an invalid operation exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-InvalidOperationException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'InvalidOperation', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Creates and throws an object not found exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-ObjectNotFoundException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'ObjectNotFound', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Creates and throws an invalid result exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-InvalidResultException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'InvalidResult', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Retrieves the localized string data based on the machine's culture. + Falls back to en-US strings if the machine's culture is not supported. + + .PARAMETER ResourceName + The name of the resource as it appears before '.strings.psd1' of the localized string file. + For example: + For WindowsOptionalFeature: MSFT_WindowsOptionalFeature + For Service: MSFT_ServiceResource + For Registry: MSFT_RegistryResource + For Helper: SqlServerDscHelper + + .PARAMETER ScriptRoot + Optional. The root path where to expect to find the culture folder. This is only needed + for localization in helper modules. This should not normally be used for resources. +#> +function Get-LocalizedData +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ResourceName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ScriptRoot + ) + + if ( -not $ScriptRoot ) + { + $resourceDirectory = Join-Path -Path $PSScriptRoot -ChildPath $ResourceName + $localizedStringFileLocation = Join-Path -Path $resourceDirectory -ChildPath $PSUICulture + } + else + { + $localizedStringFileLocation = Join-Path -Path $ScriptRoot -ChildPath $PSUICulture + } + + if (-not (Test-Path -Path $localizedStringFileLocation)) + { + # Fallback to en-US + if ( -not $ScriptRoot ) + { + $localizedStringFileLocation = Join-Path -Path $resourceDirectory -ChildPath 'en-US' + } + else + { + $localizedStringFileLocation = Join-Path -Path $ScriptRoot -ChildPath 'en-US' + } + } + + Import-LocalizedData ` + -BindingVariable 'localizedData' ` + -FileName "$ResourceName.strings.psd1" ` + -BaseDirectory $localizedStringFileLocation + + return $localizedData +} + +Export-ModuleMember -Function @( + 'New-InvalidArgumentException', + 'New-InvalidOperationException', + 'New-ObjectNotFoundException', + 'New-InvalidResultException', + 'Get-LocalizedData' ) diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/DhcpServerDsc.OptionValueHelper/OptionValueHelper.psm1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/DhcpServerDsc.OptionValueHelper/OptionValueHelper.psm1 new file mode 100644 index 0000000..3b49c86 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/DhcpServerDsc.OptionValueHelper/OptionValueHelper.psm1 @@ -0,0 +1,758 @@ +# Load Localization Data +Import-Module -Name (Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath 'CommonResourceHelper.psm1') + +$script:localizedData = Get-LocalizedData -ResourceName 'OptionValueHelper' -ScriptRoot $PSScriptRoot + +<# + .SYNOPSIS + Helper function to get a DHCP option value. + + .PARAMETER ApplyTo + Specify where to get the DHCP option from. + + .PARAMETER OptionId + The option ID. + + .PARAMETER VendorClass + The option vendor class. Use an empty string for standard class. + + .PARAMETER UserClass + The option user class. + + .PARAMETER ScopeId + If used, the option scope ID. + + .PARAMETER PolicyName + If used, the option policy name. + + .PARAMETER ReservedIP + If used, the option reserved IP. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. +#> +function Get-TargetResourceHelper +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Server','Scope','Policy','ReservedIP')] + [String] + $ApplyTo, + + [parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [parameter()] + [AllowNull()] + [String] + $ScopeId, + + [parameter()] + [AllowNull()] + [String] + $PolicyName, + + [parameter()] + [AllowNull()] + [ipaddress] + $ReservedIP, + + [parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily + ) + + #region Input Validation + + # Check for DhcpServer module/role + Assert-Module -moduleName DHCPServer + + #endregion Input Validation + + # Checking if option needs to be configured for server, DHCP scope, Policy or reservedIP + switch ($ApplyTo) + { + + 'Server' + { + # Getting the dhcp server option Value + $serverGettingValueMessage = $localizedData.ServerGettingValueMessage -f $OptionId, $VendorClass, $UserClass + Write-Verbose $serverGettingValueMessage + + $parameters = @{ + OptionId = $OptionId + VendorClass = $VendorClass + userClass = $UserClass + } + $currentConfiguration = Get-DhcpServerv4OptionValue @parameters -ErrorAction SilentlyContinue + } + + 'Scope' + { + # Getting the dhcp server option Value + $scopeGettingValueMessage = $localizedData.ScopeGettingValueMessage -f $OptionId, $VendorClass, $UserClass, $ScopeId + Write-Verbose $scopeGettingValueMessage + + $parameters = @{ + OptionId = $OptionId + ScopeId = $ScopeId + VendorClass = $VendorClass + UserClass = $UserClass + } + $currentConfiguration = Get-DhcpServerv4OptionValue @parameters -ErrorAction SilentlyContinue + } + + 'Policy' + { + # Getting the dhcp policy option Value + $policyGettingValueMessage = $localizedData.PolicyGettingValueMessage -f $OptionId, $VendorClass, $ScopeId, $PolicyName + Write-Verbose $policyGettingValueMessage + + # Policy can exist on server or scope level, so we need to address both cases + if ($ScopeId) + { + $parameters = @{ + PolicyName = $PolicyName + OptionId = $OptionId + VendorClass = $VendorClass + ScopeId = $ScopeId + } + $currentConfiguration = Get-DhcpServerv4OptionValue @parameters -ErrorAction SilentlyContinue + } + else + { + $parameters = @{ + PolicyName = $PolicyName + OptionId = $OptionId + VendorClass = $VendorClass + } + $currentConfiguration = Get-DhcpServerv4OptionValue @parameters -ErrorAction SilentlyContinue + } + } + + 'ReservedIP' + { + # Getting the dhcp reserved IP option Value + $reservedIPGettingValueMessage = $localizedData.ReservedIPGettingValueMessage -f $OptionId, $VendorClass, $PolicyName, $ReservedIP + Write-Verbose $reservedIPGettingValueMessage + + $parameters = @{ + ReservedIP = $ReservedIP + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + } + $currentConfiguration = Get-DhcpServerv4OptionValue @parameters -ErrorAction SilentlyContinue + } + } + + # Testing for null + if ($currentConfiguration) + { + $hashTable = @{ + ApplyTo = $ApplyTo + OptionId = $currentConfiguration.OptionID + Value = $currentConfiguration.Value + VendorClass = $currentConfiguration.VendorClass + UserClass = $currentConfiguration.UserClass + ScopeId = $currentConfiguration.ScopeId + PolicyName = $currentConfiguration.PolicyName + ReservedIP = $currentConfiguration.ReservedIP + AddressFamily = $AddressFamily + Ensure = 'Present' + } + } + else + { + $hashTable = @{ + ApplyTo = $null + OptionId = $null + Value = $null + VendorClass = $null + UserClass = $null + ScopeId = $null + PolicyName = $null + ReservedIP = $null + AddressFamily = $null + Ensure = 'Absent' + } + } + + $hashTable +} + +<# + .SYNOPSIS + Helper function to test a DHCP option value. + + .PARAMETER ApplyTo + Specify where to test the DHCP option. + + .PARAMETER OptionId + The option ID. + + .PARAMETER Value + The option data value. + + .PARAMETER VendorClass + The option vendor class. Use an empty string for standard class. + + .PARAMETER UserClass + The option user class. + + .PARAMETER ScopeId + If used, the option scope ID. + + .PARAMETER PolicyName + If used, the option policy name. + + .PARAMETER ReservedIP + If used, the option reserved IP. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Test-TargetResourceHelper +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Server','Scope','Policy','ReservedIP')] + [String] + $ApplyTo, + + [parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [parameter(Mandatory = $true)] + [String[]] + $Value, + + [parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [parameter()] + [AllowNull()] + [String] + $ScopeId, + + [parameter()] + [AllowNull()] + [String] + $PolicyName, + + [parameter()] + [AllowNull()] + [ipaddress] + $ReservedIP, + + [parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + # Checking if option needs to be configured for server, DHCP scope, Policy or reservedIP + switch ($ApplyTo) + { + 'Server' + { + # Trying to get the option value + $parameters = @{ + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'Server' @parameters + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + # Since we need to compare an array of strings we need to use the Compare-Object cmdlet + if (($currentConfiguration.Ensure -eq 'Present') -and (@(Compare-Object -ReferenceObject $currentConfiguration.Value -DifferenceObject $Value -SyncWindow 0 -CaseSensitive).Length -eq 0)) + { + # Found an exact match + $serverExactMatchValueMessage = $localizedData.ServerExactMatchValueMessage -f $OptionId, $VendorClass, $UserClass + Write-Verbose $serverExactMatchValueMessage + $result = $true + } + else + { + # Not found Option Value + $serverNotFoundValueMessage = $localizedData.ServerNotFoundValueMessage -f $OptionId, $VendorClass, $UserClass + Write-Verbose $serverNotFoundValueMessage + $result = $false + } + } + # Ensure = 'Absent' + else + { + if ($currentConfiguration.Ensure -eq 'Present') + { + # Found a match, should return $false since it should not be here + $serverFoundAndRemoveValueMessage = $localizedData.ServerFoundAndRemoveValueMessage -f $OptionId, $VendorClass, $UserClass + Write-Verbose $serverFoundAndRemoveValueMessage + $result = $false + } + else + { + # Not found Option Value, return $true + $serverNotFoundDoNothingValueMessage = $localizedData.ServerNotFoundDoNothingValueMessage -f $OptionId, $VendorClass, $UserClass + Write-Verbose $serverNotFoundDoNothingValueMessage + $result = $true + } + } + } + + 'Scope' + { + # Trying to get the option value + $parameters = @{ + ScopeId = $ScopeId + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'Scope' @parameters + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + if (($currentConfiguration.Ensure -eq 'Present') -and (@(Compare-Object -ReferenceObject $currentConfiguration.Value -DifferenceObject $Value -SyncWindow 0 -CaseSensitive).Length -eq 0)) + { + # Found an exact match + $scopeExactMatchValueMessage = $localizedData.ScopeExactMatchValueMessage -f $OptionId, $VendorClass, $UserClass, $ScopeId + Write-Verbose $scopeExactMatchValueMessage + $result = $true + } + else + { + # Not found Option Value + $scopeNotFoundValueMessage = $localizedData.ScopeNotFoundValueMessage -f $OptionId, $VendorClass, $UserClass, $ScopeId + Write-Verbose $scopeNotFoundValueMessage + $result = $false + } + } + + # Ensure = 'Absent' + else + { + if (($currentConfiguration.Ensure -eq 'Present')) + { + # Found a match, should return $false since it should not be here + $scopeFoundAndRemoveValueMessage = $localizedData.ScopeFoundAndRemoveValueMessage -f $OptionId, $VendorClass, $UserClass, $ScopeId + Write-Verbose $scopeFoundAndRemoveValueMessage + $result = $false + } + else + { + # Not found Option Value, return $true + $scopeNotFoundDoNothingValueMessage = $localizedData.ScopeNotFoundDoNothingValueMessage -f $OptionId, $VendorClass, $UserClass, $ScopeId + Write-Verbose $scopeNotFoundDoNothingValueMessage + $result = $true + } + } + } + + 'Policy' + { + # Trying to get the option value + $parameters = @{ + PolicyName = $PolicyName + OptionId = $OptionId + ScopeId = $ScopeId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'Policy' @parameters + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + if (($currentConfiguration.Ensure -eq 'Present') -and (@(Compare-Object -ReferenceObject $currentConfiguration.Value -DifferenceObject $Value -SyncWindow 0 -CaseSensitive).Length -eq 0)) + { + # Found an exact match + $policyExactMatchValueMessage = $localizedData.PolicyExactMatchValueMessage -f $OptionId, $VendorClass, $PolicyName + Write-Verbose $policyExactMatchValueMessage + $result = $true + } + else + { + # Not found Option Value + $policyNotFoundValueMessage = $localizedData.PolicyNotFoundValueMessage -f $OptionId, $VendorClass, $PolicyName + Write-Verbose $policyNotFoundValueMessage + $result = $false + } + } + + # Ensure = 'Absent' + else + { + if (($currentConfiguration.Ensure -eq 'Present')) + { + # Found a match, should return $false since it should not be here + $policyFoundAndRemoveValueMessage = $localizedData.PolicyFoundAndRemoveValueMessage -f $OptionId, $VendorClass, $PolicyName + Write-Verbose $policyFoundAndRemoveValueMessage + $result = $false + } + else + { + # Not found Option Value, return $true + $policyNotFoundDoNothingValueMessage = $localizedData.PolicyNotFoundDoNothingValueMessage -f $OptionId, $VendorClass, $PolicyName + Write-Verbose $policyNotFoundDoNothingValueMessage + $result = $true + } + } + } + + 'ReservedIP' + { + # Trying to get the option value + $parameters = @{ + ReservedIP = $ReservedIP + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'ReservedIP' @parameters + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + # Comparing only the data value, since we already found an option ID that matchs the other parameters + if (($currentConfiguration.Ensure -eq 'Present') -and (@(Compare-Object -ReferenceObject $currentConfiguration.Value -DifferenceObject $Value -SyncWindow 0 -CaseSensitive).Length -eq 0)) + { + # Found an exact match + $reservedIPExactMatchValueMessage = $localizedData.ReservedIPExactMatchValueMessage -f $OptionId, $VendorClass, $UserClass, $ReservedIP + Write-Verbose $reservedIPExactMatchValueMessage + $result = $true + } + else + { + # Not found Option Value + $reservedIPNotFoundValueMessage = $localizedData.ReservedIPNotFoundValueMessage -f $OptionId, $VendorClass, $UserClass, $ReservedIP + Write-Verbose $reservedIPNotFoundValueMessage + $result = $false + } + } + + # Ensure = 'Absent' + else + { + if ($currentConfiguration.Ensure -eq 'Present') + { + # Found a match, should return $false since it should not be here + $reservedIPFoundAndRemoveValueMessage = $localizedData.ReservedIPFoundAndRemoveValueMessage -f $OptionId, $VendorClass, $UserClass, $ScopeId, $ReservedIP + Write-Verbose $reservedIPFoundAndRemoveValueMessage + $result = $false + } + else + { + # Not found Option Value, return $true + $reservedIPNotFoundDoNothingValueMessage = $localizedData.ReservedIPNotFoundDoNothingValueMessage -f $OptionId, $VendorClass, $UserClass, $scopeId, $ReservedIP + Write-Verbose $reservedIPNotFoundDoNothingValueMessage + $result = $true + } + } + } + } + + $result +} + +<# + .SYNOPSIS + Helper function to set a DHCP option value. + + .PARAMETER ApplyTo + Specify where to set the DHCP option. + + .PARAMETER OptionId + The option ID. + + .PARAMETER Value + The option data value. + + .PARAMETER VendorClass + The option vendor class. Use an empty string for standard class. + + .PARAMETER UserClass + The option user class. + + .PARAMETER ScopeId + If used, the option scope ID. + + .PARAMETER PolicyName + If used, the option policy name. + + .PARAMETER ReservedIP + If used, the option reserved IP. + + .PARAMETER AddressFamily + The option definition address family (IPv4 or IPv6). Currently only the IPv4 is supported. + + .PARAMETER Ensure + When set to 'Present', the option will be created. + When set to 'Absent', the option will be removed. +#> +function Set-TargetResourceHelper +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Server','Scope','Policy','ReservedIP')] + [String] + $ApplyTo, + + [parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [UInt32] + $OptionId, + + [parameter(Mandatory = $true)] + [String[]] + $Value, + + [parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $VendorClass, + + [parameter(Mandatory = $true)] + [AllowEmptyString()] + [String] + $UserClass, + + [parameter()] + [AllowNull()] + [String] + $ScopeId, + + [parameter()] + [AllowNull()] + [String] + $PolicyName, + + [parameter()] + [AllowNull()] + [ipaddress] + $ReservedIP, + + [parameter(Mandatory = $true)] + [ValidateSet('IPv4')] + [String] + $AddressFamily, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] + $Ensure = 'Present' + ) + + # Checking if option needs to be configured for server, DHCP scope, Policy or reservedIP + switch ($ApplyTo) + { + 'Server' + { + $parameters = @{ + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'Server' @parameters + + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + $serverSettingValueMessage = $localizedData.ServerSettingValueMessage -f $OptionId, $VendorClass, $UserClass + Write-Verbose $serverSettingValueMessage + Set-DhcpServerv4OptionValue -OptionId $OptionId -Value $Value -VendorClass $VendorClass -UserClass $UserClass + } + + # Ensure = 'Absent' + else + { + # If it exists and Ensure is 'Present' we should remove it + if ($currentConfiguration.Ensure -eq 'Present') + { + $serverRemoveValueMessage = $localizedData.ServerRemoveValueMessage -f $OptionId, $VendorClass, $UserClass + Write-Verbose $serverRemoveValueMessage + Remove-DhcpServerv4OptionValue -OptionId $OptionId -VendorClass $VendorClass -UserClass $UserClass + } + } + } + + 'Scope' + { + $parameters = @{ + ScopeId = $ScopeId + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'Scope' @parameters + + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + # If value should be present we just set it + $scopeSettingValueMessage = $localizedData.ScopeSettingValueMessage -f $OptionId, $VendorClass, $UserClass, $ScopeId + Write-Verbose $scopeSettingValueMessage + Set-DhcpServerv4OptionValue -ScopeId $ScopeId -OptionId $OptionId -Value $Value -VendorClass $VendorClass -UserClass $UserClass + } + + # Ensure = 'Absent' + else + { + # If it exists and Ensure is 'Present' we should remove it + if ($currentConfiguration.Ensure -eq 'Present') + { + $scopeRemoveValueMessage = $localizedData.ScopeRemoveValueMessage -f $OptionId, $VendorClass, $UserClass, $ScopeId + Write-Verbose $scopeRemoveValueMessage + Remove-DhcpServerv4OptionValue -ScopeId $ScopeId -OptionId $currentConfiguration.OptionId -VendorClass $VendorClass -UserClass $UserClass + } + } + } + + 'Policy' + { + # If $ScopeId exist + if ($ScopeId) + { + $parameters = @{ + PolicyName = $PolicyName + ScopeId = $ScopeId + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'Policy' @parameters + + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + # If value should be present we just set it + $policyWithScopeSettingValueMessage = $localizedData.PolicyWithScopeSettingValueMessage -f $OptionId, $VendorClass, $PolicyName, $ScopeId + Write-Verbose $policyWithScopeSettingValueMessage + Set-DhcpServerv4OptionValue -PolicyName $PolicyName -OptionId $OptionId -ScopeId $ScopeId -Value $Value -VendorClass $VendorClass + } + + # Ensure = 'Absent' + else + { + # If it exists and Ensure is 'Present' we should remove it + if ($currentConfiguration.Ensure -eq 'Present') + { + $policyWithScopeRemoveValueMessage = $localizedData.policyWithScopeRemoveValueMessage -f $OptionId, $VendorClass, $PolicyName, $ScopeId + Write-Verbose $policyWithScopeRemoveValueMessage + Remove-DhcpServerv4OptionValue -PolicyName $PolicyName -ScopeId $ScopeId -OptionId $OptionId -VendorClass $VendorClass + } + } + } + # If $ScopeId is null + else + { + $parameters = @{ + PolicyName = $PolicyName + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'Policy' @parameters + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + # If value should be present we just set it + $policySettingValueMessage = $localizedData.PolicySettingValueMessage -f $OptionId, $VendorClass, $PolicyName + Write-Verbose $policySettingValueMessage + Set-DhcpServerv4OptionValue -PolicyName $PolicyName -OptionId $OptionId -Value $Value -VendorClass $VendorClass + } + else + { + # If it exists and Ensure is 'Present' we should remove it + if ($currentConfiguration.Ensure -eq 'Present') + { + $policyRemoveValueMessage = $localizedData.PolicyRemoveValueMessage -f $OptionId, $VendorClass, $PolicyName + Write-Verbose $policyRemoveValueMessage + Remove-DhcpServerv4OptionValue -PolicyName $PolicyName -OptionId $OptionId -VendorClass $VendorClass + } + } + } + } + + 'ReservedIP' + { + $parameters = @{ + ReservedIP = $ReservedIP + OptionId = $OptionId + VendorClass = $VendorClass + UserClass = $UserClass + AddressFamily = $AddressFamily + } + $currentConfiguration = Get-TargetResourceHelper -ApplyTo 'ReservedIP' @parameters + + # Testing for Ensure = Present + if ($Ensure -eq 'Present') + { + # If value should be present we just set it + $reservedIPSettingValueMessage = $localizedData.ReservedIPSettingValueMessage -f $OptionId, $VendorClass, $UserClass, $ReservedIP + Write-Verbose $reservedIPSettingValueMessage + Set-DhcpServerv4OptionValue -ReservedIP $ReservedIP -OptionId $OptionId -Value $Value -VendorClass $VendorClass -UserClass $UserClass + } + + # Ensure = 'Absent' + else + { + # If it exists and Ensure is 'Present' we should remove it + if ($currentConfiguration.Ensure -eq 'Present') + { + $reservedIPRemoveValueMessage = $localizedData.ReservedIPRemoveValueMessage -f $OptionId, $VendorClass, $UserClass, $ReservedIP + Write-Verbose $reservedIPRemoveValueMessage + Remove-DhcpServerv4OptionValue -ReservedIP $ReservedIP -OptionId $OptionId -VendorClass $VendorClass -UserClass $UserClass + } + } + } + } +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/DhcpServerDsc.OptionValueHelper/en-US/OptionValueHelper.strings.psd1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/DhcpServerDsc.OptionValueHelper/en-US/OptionValueHelper.strings.psd1 new file mode 100644 index 0000000..babbb17 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Modules/DhcpServerDsc.OptionValueHelper/en-US/OptionValueHelper.strings.psd1 @@ -0,0 +1,38 @@ +# Localized resources for helper module OptionValueHelper. + +ConvertFrom-StringData @' + ServerGettingValueMessage = Getting DHCP server option value "{0}" with vendor class "{1}" and user class "{2}". + ServerExactMatchValueMessage = Found DHCP server option value "{0}" with vendor class "{1}" and user class "{2}". + ServerRemoveValueMessage = Removing DHCP server option value "{0}" with vendor class "{1}" and user class "{2}". + ServerSettingValueMessage = Setting DHCP server option value "{0}" with vendor class "{1}" and user class "{2}". + ServerFoundAndRemoveValueMessage = Found DHCP server option value "{0}" with vendor class "{1}" and user class "{2}", should remove it. + ServerNotFoundDoNothingValueMessage = DHCP server option value "{0}" with vendor class "{1}" and user class "{2}" not found, should do nothing. + ServerNotFoundValueMessage = DHCP server option value "{0}" with vendor class "{1}" and user class "{2}" not found. + + ScopeGettingValueMessage = Getting DHCP scope option value "{0}" with vendor class "{1}" and user class "{2}" and Scope ID "{3}". + ScopeExactMatchValueMessage = Found DHCP server option value "{0}" with vendor class "{1}" and user class "{2}" and scope ID "{3}". + ScopeRemoveValueMessage = Removing DHCP server option value "{0}" with vendor class "{1}" and user class "{2}" and scope ID "{3}". + ScopeSettingValueMessage = Setting DHCP server option value "{0}" with vendor class "{1}" and user class "{2}" and scope ID "{3}". + ScopeFoundAndRemoveValueMessage = Found DHCP server option value "{0}" with vendor class "{1}" and user class "{2}" and scope ID "{3}", should remove it. + ScopeNotFoundDoNothingValueMessage = DHCP server option value "{0}" with vendor class "{1}" and user class "{2}" and scope ID "{3}" not found, should do nothing. + ScopeNotFoundValueMessage = DHCP server option value "{0}" with vendor class "{1}" and user class "{2}" and scope ID "{3}" not found. + + PolicyGettingValueMessage = Getting DHCP policy option value "{0}" and vendor class "{1}" and policy name "{2}" and Scope Id "{3}". + PolicyExactMatchValueMessage = Found DHCP policy option value "{0}" with vendor class "{1}" and policy name "{2}". + PolicyRemoveValueMessage = Removing DHCP policy option value "{0}" with vendor class "{1}" and policy name "{2}". + PolicyWithScopeRemoveValueMessage = Removing DHCP policy option value "{0}" with vendor class "{1}" and policy name "{2}" and scope ID "{3}". + PolicySettingValueMessage = Setting DHCP policy option value "{0}" with vendor class "{1}" and policy name "{2}". + PolicyWithScopeSettingValueMessage = Setting DHCP policy option value "{0}" with vendor class "{1}" and policy name "{2}" and scope ID "{3}". + PolicyFoundAndRemoveValueMessage = Found DHCP policy option value "{0}" with vendor class "{1}" and policy name "{2}", should remove it. + PolicyNotFoundDoNothingValueMessage = DHCP policy option value "{0}" with vendor class "{1}" and policy name "{2}" not found, should do nothing. + PolicyNotFoundValueMessage = DHCP policy option value "{0}" with vendor class "{1}" and policy name "{2}" not found. + + ReservedIPGettingValueMessage = Getting DHCP reserved IP option value "{0}" with vendor class "{1}" and user class "{2}" and reserved IP "{3}". + ReservedIPExactMatchValueMessage = Found DHCP reserved IP option value "{0}" with vendor class "{1}" and user class "{2}" and reserved IP "{3}". + ReservedIPRemoveValueMessage = Removing DHCP reserved IP option value "{0}" with vendor class "{1}" and user class "{2}" and reserved IP "{3}". + ReservedIPSettingValueMessage = Setting DHCP reserved IP option value "{0}" with vendor class "{1}" and user class "{2}" and reserved IP "{3}". + ReservedIPFoundAndRemoveValueMessage = Found DHCP reserved IP option value "{0}" with vendor class "{1}" and user class "{2}" and reserved IP "{3}", should remove it. + ReservedIPNotFoundDoNothingValueMessage = DHCP reserved IP option value "{0}" with vendor class "{1}" and user class "{2}" and reserved IP "{3}" not found, should do nothing. + ReservedIPNotFoundValueMessage = DHCP reserved IP option value "{0}" with vendor class "{1}" and user class "{2}" and reserved "{3}" not found. + +'@ diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/README.md b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/README.md new file mode 100644 index 0000000..abb5f18 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/README.md @@ -0,0 +1,321 @@ +# xDhcpServer + +The **xDhcpServer** DSC resources are used for configuring and managing a DHCP server. They include **xDhcpServerScope**, **xDhcpServerReservation**, **xDhcpServerOptions** and **xDhcpServerAuthorization**. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Branches + +### master + +[![Build status](https://ci.appveyor.com/api/projects/status/uan12tf7tfxhg7m5/branch/master?svg=true)](https://ci.appveyor.com/project/PowerShell/xDhcpServer/branch/master) +[![codecov](https://codecov.io/gh/PowerShell/xDhcpServer/branch/master/graph/badge.svg)](https://codecov.io/gh/PowerShell/xDhcpServer/branch/master) + +This is the branch containing the latest release - +no contributions should be made directly to this branch. + +### dev + +[![Build status](https://ci.appveyor.com/api/projects/status/uan12tf7tfxhg7m5/branch/dev?svg=true)](https://ci.appveyor.com/project/PowerShell/xDhcpServer/branch/dev) +[![codecov](https://codecov.io/gh/PowerShell/xDhcpServer/branch/dev/graph/badge.svg)](https://codecov.io/gh/PowerShell/xDhcpServer/branch/dev) + +This is the development branch +to which contributions should be proposed by contributors as pull requests. +This development branch will periodically be merged to the master branch, +and be released to [PowerShell Gallery](https://www.powershellgallery.com/). + +## Contributing + +Please check out common DSC Resources [contributing guidelines](https://github.com/PowerShell/DscResource.Kit/blob/master/CONTRIBUTING.md). + +## Resources + +* **xDhcpServerClass** manages DHCP Classes (Vendor or User). +* **xDhcpServerScope** sets a scope for consecutive range of possible IP addresses that the DHCP server can lease to clients on a subnet. +* **xDhcpServerReservation** sets lease assignments used to ensure that a specified client on a subnet can always use the same IP address. +* **xDhcpServerOptions** (DEPRECATED) currently supports setting DNS domain and DNS Server IP Address options at a DHCP server scope level. +* **xDhcpServerAuthorization** authorizes a DHCP in Active Directory. + * *This resource must run on an Active Directory domain controller.* +* **xDhcpServerOptionDefinition** manages DHCP option definitions. +* **DhcpServerOptionValue** manages an option value on server level. +* **DhcpScopeOptionValue** manages an option value on scope level. +* **DhcpReservedIPOptionValue** manages an option value on reserved IP level. +* **DhcpPolicyOptionValue** manages an option value on Policy level. + +### xDhcpServerScope + +* **ScopeId**: ScopeId of the DHCP scope +* **IPStartRange**: Starting address to set for this scope +* **IPEndRange**: Ending address to set for this scope +* **Name**: Name of this DHCP Scope +* **SubnetMask**: Subnet mask for the scope specified in IP address format +* **LeaseDuration**: Time interval for which an IP address should be leased + * This should be specified in the following format: `Days.Hours:Minutes:Seconds` + * For example, '`02.00:00:00`' is 2 days and '`08:00:00`' is 8 hours. +* **State**: Whether scope should be active or inactive. +* **Ensure**: Whether DHCP scope should be present or removed +* **ScopeID**: Scope Identifier. This is a read-only property for this resource. + +### xDhcpServerReservation + +* **ScopeID**: ScopeId for which reservations are set +* **IPAddress**: IP address of the reservation for which the properties are modified +* **ClientMACAddress**: Client MAC Address to set on the reservation +* **Name**: Reservation name +* **AddressFamily**: Address family type. Note: at this time, only IPv4 is supported. +* **Ensure**: Whether option should be set or removed + +### xDhcpServerOption (DEPRECATED) + +* **ScopeID**: ScopeID for which options are set +* **DnsServerIPAddress**: IP address of DNS Servers +* **DnsDomain**: Domain name of DNS Server +* **AddressFamily**: Address family type +* **Router**: The default gateway for clients +* **Ensure**: Whether option should be set or removed + +### xDhcpServerAuthorization + +* **Ensure**: Whether the DHCP server should be authorized. +* **DnsName**: FQDN of the server to authorize. If not specified, it defaults to the local hostname of the enacting node. +* **IPAddress**: IP v4 address of the server to authorized. If not specified, it default to the first IPv4 address of the enacting node. + +### xDhcpServerClass + + * **Name**: DHCP Class Name. + * **Type**: Class type, should be Vendor or User. + * **AsciiData**: Class Data in a ascii formated string. + * **AddressFamily**: Currently should be "IPv4". + * **Description**: Class Description. + * **Ensure**: Whether class should be set or removed. + + ### xDhcpServerOptionDefinition + + * **OptionID**: Option ID, should be a number between 1 and 255. + * **VendorClass**: Vendor class. Use an empty string for standard option class. + * **Name**: Option name. + * **Type**: Option data type. { Byte | Word | Dword | DwordDword | IPv4Address | String | BinaryData | EncapsulatedData } + * **Multivalued**: Whether option is multivalued or not. + * **Description**: Option description. + * **AddressFamily**: Sets the address family for the option definition. Currently only IPv4 is supported. { IPv4 } + * **Ensure**: Whether option should be set or removed. { *Present* | Absent } + + ### DhcpScopeOptionValue + + * **ScopeId**: Scope ID where to set the option value. + * **OptionId**: Option ID, specify an integer between 1 and 255. + * **Value**: Option data value. Could be an array of string for a multivalued option. + * **VendorClass**: Vendor class. Use an empty string for default vendor class. + * **UserClass**: User class. Use an empty string for default user class. + * **AddressFamily**: Sets the address family for the option definition. Currently only IPv4 is supported. { IPv4 } + * **Ensure**: Whether option should be set or removed. { *Present* | Absent } + +### DhcpServerOptionValue + + * **OptionId**: Option ID, specify an integer between 1 and 255. + * **Value**: Option data value. Could be an array of string for a multivalued option. + * **VendorClass**: Vendor class. Use an empty string for default vendor class. + * **UserClass**: User class. Use an empty string for default user class. + * **AddressFamily**: Sets the address family for the option definition. Currently only IPv4 is supported. { IPv4 } + * **Ensure**: Whether option should be set or removed. { *Present* | Absent } + + ### DhcpReservedIPOptionValue + + * **ReservedIP**: Reserved IP to set the option value. + * **OptionId**: Option ID, specify an integer between 1 and 255. + * **Value**: Option data value. Could be an array of string for a multivalued option. + * **VendorClass**: Vendor class. Use an empty string for default vendor class. + * **UserClass**: User class. Use an empty string for default user class. + * **AddressFamily**: Sets the address family for the option definition. Currently only IPv4 is supported. { IPv4 } + * **Ensure**: Whether option should be set or removed. { *Present* | Absent } + + ### DhcpPolicyOptionValue + + * **PolicyName**: Dhcp Policy Name. + * **OptionId**: Option ID, specify an integer between 1 and 255. + * **Value**: Option data value. Could be an array of string for a multivalued option. + * **ScopeId**: Scope ID to get policy values from. Do not use it to get an option from server level. + * **VendorClass**: Vendor class. Use an empty string for default vendor class. + * **AddressFamily**: Sets the address family for the option definition. Currently only IPv4 is supported. { IPv4 } + * **Ensure**: Whether option should be set or removed. { *Present* | Absent } + + +## Versions + +### Unreleased + +### 2.0.0.0 +* BREAKING CHANGE: Switch to ScopeId as a key property for xDhcpServerScope ([issue #43](https://github.com/PowerShell/xDhcpServer/issues/48). [Bartek Bielawski (@bielawb)](https://github.com/bielawb) + +### 1.7.0.0 + +* Changes to xDhcpServer + * Updated year in LICENSE file. + * Updated year in module manifest. + * Added Codecov and status badges to README.md. + * Update appveyor.yml to use the default template. +* Added xDhcpServerOptionDefinition +* Added DhcpScopeOptionValue +* Added DhcpServerOptionValue +* Added DhcpReservedIPOptionValue +* Added DhcpPolicyOptionValue + +### 1.6.0.0 +added xDhcpServerClass + +### 1.5.0.0 +* Converted AppVeyor.yml to pull Pester from PSGallery instead of Chocolatey +* Bug Fix fixes xDhcpServerOption\Get-TargetResource not returning Router property + +### 1.4.0.0 + +* Bug Fix fixes localization bug in xDhcpServerScope option enumeration + +### 1.3.0.0 + +* Added **xDhcpServerAuthorization** resource. +* Bug Fix LeaseDuration is no longer mandatory for xDhcpServerScope resource. +* Bug Fix DnsServerIPAddress is no longer mandatory for xDhcpServerOption resource. +* Bug Fix corrects verbose display output in xDhcpServerOption resource. + +### 1.2 + +* Fix "Cannot set default gateway on xDhcpServerOption". + +### 1.1 + +* Bug fix, enables creating more than 1 DHCP server scope. + +### 1.0 + +* Initial release with the following resources + * **xDhcpServerScope** + * **xDhcpServerReservation** + * **xDhcpServerOptions** + +## Examples + +### Creating a DHCP Server Scope + +```powershell +configuration Sample_xDhcpsServerScope_NewScope +{ + Import-DscResource -module xDHCpServer + xDhcpServerScope Scope + { + ScopeId = '192.168.1.0' + Ensure = 'Present' + IPEndRange = '192.168.1.254' + IPStartRange = '192.168.1.1' + Name = 'PowerShellScope' + SubnetMask = '255.255.255.0' + LeaseDuration = ((New-TimeSpan -Hours 8 ).ToString()) + State = 'Active' + AddressFamily = 'IPv4' + } +} +``` + +### Resizing existing scope with different values for EndRange + +```powershell +configuration Sample_xDhcpsServerScope_ResizeScope +{ + Import-DscResource -module xDHCpServer + xDhcpServerScope SmallerScope + { + ScopeId = '192.168.1.0' + Ensure = 'Present' + IPEndRange = '192.168.1.100' + IPStartRange = '192.168.1.1' + Name = 'PowerShellScope' + SubnetMask = '255.255.255.0' + LeaseDuration = ((New-TimeSpan -Hours 8 ).ToString()) + State = 'Active' + AddressFamily = 'IPv4' + } +} +``` + +### Reserving an IP address within a DHCP server + +```powershell +configuration Sample_xDhcpServerReservation_IPReservation +{ + Import-DscResource -module xDHCpServer + xDhcpServerReservation PullServerIP + { + Ensure = 'Present' + ScopeID = '192.168.1.0' + ClientMACAddress = '00155D8A54A1' + IPAddress = '192.168.1.2' + Name = 'DSCPullServer' + AddressFamily = 'IPv4' + } +} +``` + +### Setting the domain name, DNS server and default gateway option for a DHCP scope + +```powershell +configuration Sample_xDhcpServerOption_SetScopeOption +{ + Import-DscResource -module xDHCpServer + xDhcpServerOption Option + { + Ensure = 'Present' + ScopeID = '192.168.1.0' + DnsDomain = 'contoso.com' + DnsServerIPAddress = '192.168.1.22','192.168.1.1' + AddressFamily = 'IPv4' + Router = '192.168.1.1' + } +} +``` + +### Authorizing the local DHCP server + +```powershell +configuration Sample_Local_xDhcpServerAuthorization +{ + Import-DscResource -module xDHCpServer + xDhcpServerAuthorization LocalServerActivation + { + Ensure = 'Present' + } +} +``` + +### Authorizing a remote DHCP server + +```powershell +configuration Sample_Remote_xDhcpServerAuthorization +{ + Import-DscResource -module xDHCpServer + xDhcpServerAuthorization RemoteServerActivation + { + Ensure = 'Present' + DnsName = 'servertoauthorize.contoso.com' + IPAddress = '192.168.0.1' + } +} +``` + +### Adding a DHCP Server class + +```powershell +configuration Sample_DHCPServerClass +{ + Import-DscResource -module xDHCpServer + xDhcpServerClass DHCPServerClass + { + ensure = 'Present' + Name = 'VendorClass' + Type = 'Vendor' + AsciiData = 'sampledata' + AddressFamily = 'IPv4' + Description = 'Vendor Class Description' + } +} +``` diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpPolicyOptionValue/DhcpPolicyOptionValue.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpPolicyOptionValue/DhcpPolicyOptionValue.ps1 new file mode 100644 index 0000000..e2c04e7 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpPolicyOptionValue/DhcpPolicyOptionValue.ps1 @@ -0,0 +1,36 @@ +<# + .SYNOPSiS + This example sets an option ID 8 (cookie servers) on a policy at server level and at scope level. +#> +configuration Example +{ + Import-DscResource -ModuleName PSDscResources + Import-DscResource -moduleName xDhcpServer + WindowsFeature DHCP + { + Name = 'DHCP' + Ensure = 'Present' + } + + DhcpPolicyOptionValue policyOptionValue_ID-008 + { + OptionId = 8 + Value = '1.1.1.1' + ScopeId = '' + VendorClass = '' + AddressFamily = 'IPv4' + PolicyName = 'TestPolicy' + Ensure = 'Present' + } + + DhcpPolicyOptionValue policyOptionValue_ID-008-scope + { + OptionId = 8 + Value = '1.1.1.1' + ScopeId = '192.168.0.0' + VendorClass = '' + AddressFamily = 'IPv4' + PolicyName = 'TestPolicy' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpReservedIPOptionValue/DhcpReservedIPOptionValue.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpReservedIPOptionValue/DhcpReservedIPOptionValue.ps1 new file mode 100644 index 0000000..19023e8 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpReservedIPOptionValue/DhcpReservedIPOptionValue.ps1 @@ -0,0 +1,25 @@ +<# + .SYNOPSiS + This example sets an option ID 8 (cookie servers) on a a reserved IP level. +#> +configuration Example +{ + Import-DscResource -ModuleName PSDscResources + Import-DscResource -moduleName xDhcpServer + WindowsFeature DHCP + { + Name = 'DHCP' + Ensure = 'Present' + } + + DhcpReservedIPOptionValue ReservedIPOptionValue_ID-008 + { + ReservedIP = '192.168.0.1' + OptionId = 8 + Value ='1.1.1.1' + VendorClass = '' + UserClass = '' + AddressFamily = 'IPv4' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpScopeOptionValue/DhcpScopeOptionValue.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpScopeOptionValue/DhcpScopeOptionValue.ps1 new file mode 100644 index 0000000..876eeac --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpScopeOptionValue/DhcpScopeOptionValue.ps1 @@ -0,0 +1,47 @@ +<# + .SYNOPSiS + This example shows how to substitute the xDhcpServerOption resource, setting the gateway (option 3), DNS Servers (option 6) and domain name (Option 15). +#> +configuration Example +{ + Import-DscResource -ModuleName PSDscResources + Import-DscResource -moduleName xDhcpServer + WindowsFeature DHCP + { + Name = 'DHCP' + Ensure = 'Present' + } + + # Setting scope gateway + DhcpScopeOptionValue scopeOptionGateway + { + OptionId = 3 + Value = 1.1.1.1 + ScopeId = '1.1.1.0' + VendorClass = '' + UserClass = '' + AddressFamily = 'IPv4' + } + + # Setting scope DNS servers + DhcpScopeOptionValue scopeOptionDNS + { + OptionId = 6 + Value = 1.1.1.1,2.2.2.2 + ScopeId = '1.1.1.0' + VendorClass = '' + UserClass = '' + AddressFamily = 'IPv4' + } + + # Setting scope DNS domain name + DhcpScopeOptionValue scopeOptionDNSDomainName + { + OptionId = 15 + Value = 'Contoso.com' + ScopeId = '1.1.1.0' + VendorClass = '' + UserClass = '' + AddressFamily = 'IPv4' + } +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpServerOptionValue/DhcpServerOptionValue.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpServerOptionValue/DhcpServerOptionValue.ps1 new file mode 100644 index 0000000..14ab1fc --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/DhcpServerOptionValue/DhcpServerOptionValue.ps1 @@ -0,0 +1,24 @@ +<# + .SYNOPSiS + This example sets an option ID 8 (cookie servers) on a server level. +#> +configuration Example +{ + Import-DscResource -ModuleName PSDscResources + Import-DscResource -moduleName xDhcpServer + WindowsFeature DHCP + { + Name = 'DHCP' + Ensure = 'Present' + } + + DhcpServerOptionValue ServerOptionValue_ID-008 + { + OptionId = 8 + Value = '1.1.1.1' + VendorClass = '' + UserClass = '' + AddressFamily = 'IPv4' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/SampleConfiguration.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/SampleConfiguration.ps1 new file mode 100644 index 0000000..48a1889 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Samples/SampleConfiguration.ps1 @@ -0,0 +1,74 @@ +configuration Sample_xDhcpsServerScope_NewScope + { + Import-DscResource -module xDHCpServer + WindowsFeature DHCP + { + Name = 'DHCP' + Ensure = 'Present' + } + xDhcpServerScope Scope + { + Ensure = 'Present' + IPStartRange = '192.168.1.1' + IPEndRange = '192.168.1.254' + + Name = 'ContosoScope' + SubnetMask = '255.255.255.0' + LeaseDuration = '00:08:00' + State = 'Active' + AddressFamily = 'IPv4' + DependsOn = @('[WindowsFeature]DHCP') + } + xDhcpServerReservation PullServerIP + { + Ensure = 'Present' + ScopeID = '192.168.1.0' + ClientMACAddress = '00155D8A54A1' + IPAddress = '192.168.1.2' + Name = 'DSCPullServer' + AddressFamily = 'IPv4' + DependsOn = @('[WindowsFeature]DHCP') + } + xDhcpServerOption Option + { + Ensure = 'Present' + ScopeID = '192.168.1.0' + DnsDomain = 'contoso.com' + DnsServerIPAddress = '192.168.1.22','192.168.1.1' + AddressFamily = 'IPv4' + Router = '192.168.1.1' + DependsOn = @('[WindowsFeature]DHCP') + } + + xDhcpServerclass DHCPServerClass + { + ensure = 'Present' + Name = 'VendorClass' + Type = 'Vendor' + AsciiData = 'sampledata' + AddressFamily = 'IPv4' + Description = 'Vendor Class Description' + } + + xDhcpServerOptionDefinition DHCPServerOptionDefinition + { + Ensure = 'Present' + Name = 'Cisco AP c1700 Provisioning' + OptionID = '200' + Type = 'IPv4Address' + AddressFamily = 'IPv4' + VendorClass = 'Cisco AP c1700' + Description = 'Sample description' + } + + xDhcpServerOptionDefinition DHCPServerOptionDefinition + { + Ensure = 'Present' + Name = 'sample name' + OptionID = '200' + Type = 'IPv4Address' + AddressFamily = 'IPv4' + VendorClass = '' #default option class + Description = 'Sample description' + } + } diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/TestSampleUsingAzure.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/TestSampleUsingAzure.ps1 new file mode 100644 index 0000000..364c28a --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/TestSampleUsingAzure.ps1 @@ -0,0 +1,17 @@ +# To Run this test create a Windows Server 2012 or 2012 R2 VM in Azure +# and run this script. It will prompt you to choose a VM, choose the VM. +# wait a while, RDP into the machine and manually verify that the DHCP Server +# is configured as specified in .\samples\SampleConfiguration.ps1 + +Write-Verbose -Message 'Publishing configuration ...' -Verbose +Publish-AzureVMDscConfiguration -ConfigurationPath .\Samples\SampleConfiguration.ps1 -Verbose -force +Write-Verbose -Message 'Choosing VM ...' -Verbose +$vm = get-azurevm | Out-GridView -Title 'choose vm to test with' -OutputMode Single +if($vm) +{ + Write-Verbose -Message 'Setting Extension ...' -Verbose + Set-AzureVMDscExtension -ConfigurationArchive SampleConfiguration.ps1.zip -ConfigurationName Sample_xDhcpsServerScope_NewScope -VM $vm -Verbose + Write-Verbose -Message 'Updating Vm ...' -Verbose + $vm | Update-AzureVM +} +Write-Verbose -Message 'Done' -Verbose diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/CommonResourceHelper.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/CommonResourceHelper.Tests.ps1 new file mode 100644 index 0000000..5416383 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/CommonResourceHelper.Tests.ps1 @@ -0,0 +1,191 @@ +Describe 'CommonResourceHelper Unit Tests' { + BeforeAll { + # Import the CommonResourceHelper module to test + $dscResourcesFolderFilePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) ` + -ChildPath 'Modules' + + Import-Module -Name (Join-Path -Path $dscResourcesFolderFilePath ` + -ChildPath 'CommonResourceHelper.psm1') -Force + } + + InModuleScope 'CommonResourceHelper' { + Describe 'Get-LocalizedData' { + $mockTestPath = { + return $mockTestPathReturnValue + } + + $mockImportLocalizedData = { + $BaseDirectory | Should -Be $mockExpectedLanguagePath + } + + BeforeEach { + Mock -CommandName Test-Path -MockWith $mockTestPath -Verifiable + Mock -CommandName Import-LocalizedData -MockWith $mockImportLocalizedData -Verifiable + } + + Context 'When loading localized data for Swedish' { + $mockExpectedLanguagePath = 'sv-SE' + $mockTestPathReturnValue = $true + + It 'Should call Import-LocalizedData with sv-SE language' { + Mock -CommandName Join-Path -MockWith { + return 'sv-SE' + } -Verifiable + + { Get-LocalizedData -ResourceName 'DummyResource' } | Should -Not -Throw + + Assert-MockCalled -CommandName Join-Path -Exactly -Times 2 -Scope It + Assert-MockCalled -CommandName Test-Path -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Import-LocalizedData -Exactly -Times 1 -Scope It + } + + $mockExpectedLanguagePath = 'en-US' + $mockTestPathReturnValue = $false + + It 'Should call Import-LocalizedData and fallback to en-US if sv-SE language does not exist' { + Mock -CommandName Join-Path -MockWith { + return $ChildPath + } -Verifiable + + { Get-LocalizedData -ResourceName 'DummyResource' } | Should -Not -Throw + + Assert-MockCalled -CommandName Join-Path -Exactly -Times 3 -Scope It + Assert-MockCalled -CommandName Test-Path -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Import-LocalizedData -Exactly -Times 1 -Scope It + } + + Context 'When $ScriptRoot is set to a path' { + $mockExpectedLanguagePath = 'sv-SE' + $mockTestPathReturnValue = $true + + It 'Should call Import-LocalizedData with sv-SE language' { + Mock -CommandName Join-Path -MockWith { + return 'sv-SE' + } -Verifiable + + { Get-LocalizedData -ResourceName 'DummyResource' -ScriptRoot '.' } | Should -Not -Throw + + Assert-MockCalled -CommandName Join-Path -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Test-Path -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Import-LocalizedData -Exactly -Times 1 -Scope It + } + + $mockExpectedLanguagePath = 'en-US' + $mockTestPathReturnValue = $false + + It 'Should call Import-LocalizedData and fallback to en-US if sv-SE language does not exist' { + Mock -CommandName Join-Path -MockWith { + return $ChildPath + } -Verifiable + + { Get-LocalizedData -ResourceName 'DummyResource' -ScriptRoot '.' } | Should -Not -Throw + + Assert-MockCalled -CommandName Join-Path -Exactly -Times 2 -Scope It + Assert-MockCalled -CommandName Test-Path -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Import-LocalizedData -Exactly -Times 1 -Scope It + } + } + } + + Context 'When loading localized data for English' { + Mock -CommandName Join-Path -MockWith { + return 'en-US' + } -Verifiable + + $mockExpectedLanguagePath = 'en-US' + $mockTestPathReturnValue = $true + + It 'Should call Import-LocalizedData with en-US language' { + { Get-LocalizedData -ResourceName 'DummyResource' } | Should -Not -Throw + } + } + + Assert-VerifiableMock + } + + Describe 'New-InvalidResultException' { + Context 'When calling with Message parameter only' { + It 'Should throw the correct error' { + $mockErrorMessage = 'Mocked error' + + { New-InvalidResultException -Message $mockErrorMessage } | Should -Throw $mockErrorMessage + } + } + + Context 'When calling with both the Message and ErrorRecord parameter' { + It 'Should throw the correct error' { + $mockErrorMessage = 'Mocked error' + $mockExceptionErrorMessage = 'Mocked exception error message' + + $mockException = New-Object -TypeName System.Exception -ArgumentList $mockExceptionErrorMessage + $mockErrorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord -ArgumentList $mockException, $null, 'InvalidResult', $null + + { New-InvalidResultException -Message $mockErrorMessage -ErrorRecord $mockErrorRecord } | Should -Throw ('System.Exception: {0} ---> System.Exception: {1}' -f $mockErrorMessage, $mockExceptionErrorMessage) + } + } + + Assert-VerifiableMock + } + + Describe 'New-ObjectNotFoundException' { + Context 'When calling with Message parameter only' { + It 'Should throw the correct error' { + $mockErrorMessage = 'Mocked error' + + { New-ObjectNotFoundException -Message $mockErrorMessage } | Should -Throw $mockErrorMessage + } + } + + Context 'When calling with both the Message and ErrorRecord parameter' { + It 'Should throw the correct error' { + $mockErrorMessage = 'Mocked error' + $mockExceptionErrorMessage = 'Mocked exception error message' + + $mockException = New-Object -TypeName System.Exception -ArgumentList $mockExceptionErrorMessage + $mockErrorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord -ArgumentList $mockException, $null, 'InvalidResult', $null + + { New-ObjectNotFoundException -Message $mockErrorMessage -ErrorRecord $mockErrorRecord } | Should -Throw ('System.Exception: {0} ---> System.Exception: {1}' -f $mockErrorMessage, $mockExceptionErrorMessage) + } + } + + Assert-VerifiableMock + } + + Describe 'New-InvalidOperationException' { + Context 'When calling with Message parameter only' { + It 'Should throw the correct error' { + $mockErrorMessage = 'Mocked error' + + { New-InvalidOperationException -Message $mockErrorMessage } | Should -Throw $mockErrorMessage + } + } + + Context 'When calling with both the Message and ErrorRecord parameter' { + It 'Should throw the correct error' { + $mockErrorMessage = 'Mocked error' + $mockExceptionErrorMessage = 'Mocked exception error message' + + $mockException = New-Object -TypeName System.Exception -ArgumentList $mockExceptionErrorMessage + $mockErrorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord -ArgumentList $mockException, $null, 'InvalidResult', $null + + { New-InvalidOperationException -Message $mockErrorMessage -ErrorRecord $mockErrorRecord } | Should -Throw ('System.InvalidOperationException: {0} ---> System.Exception: {1}' -f $mockErrorMessage, $mockExceptionErrorMessage) + } + } + + Assert-VerifiableMock + } + + Describe 'New-InvalidArgumentException' { + Context 'When calling with both the Message and ArgumentName parameter' { + It 'Should throw the correct error' { + $mockErrorMessage = 'Mocked error' + $mockArgumentName = 'MockArgument' + + { New-InvalidArgumentException -Message $mockErrorMessage -ArgumentName $mockArgumentName } | Should -Throw ('Parameter name: {0}' -f $mockArgumentName) + } + } + + Assert-VerifiableMock + } + } +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/Helper.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/Helper.Tests.ps1 new file mode 100644 index 0000000..71f0653 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/Helper.Tests.ps1 @@ -0,0 +1,78 @@ +$script:ModuleName = 'Helper' + +#region HEADER +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests'))) -or + (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\')) +} +else +{ + & git @('-C',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\'),'pull') +} +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResources\Helper.psm1') + +#endregion + +# Begin Testing +InModuleScope $script:ModuleName { + + $testParams = @{ + ScopeId = '192.168.1.0' + IPStartRange = '192.168.1.10' + IPEndRange = '192.168.1.99' + SubnetMask = '255.255.255.0' + AddressFamily = 'IPv4' + } + + #region Function Assert-ScopeParameter + Describe 'Helper\Assert-ScopeParameter' { + It 'Should not throw when parameters are correct' { + { Assert-ScopeParameter @testParams } | Should -Not -Throw + } + + It 'Should return nothing when parameters are correct' { + Assert-ScopeParameter @testParams | Should -BeNullOrEmpty + } + + It 'Should throw an exception with ErrorId <ErrorId> and information about incorrect <Parameter> (<Value>)' { + param ( + [String]$Parameter, + [String]$Value, + [String]$ErrorPattern, + [String]$ErrorId + ) + $brokenTestParams = $testParams.Clone() + $brokenTestParams[$Parameter] = $Value + { Assert-ScopeParameter @brokenTestParams } | Should -Throw -ExpectedMessage $ErrorPattern -ErrorId $ErrorId + } -TestCases @( + @{ + Parameter = 'ScopeId' + Value = '192.168.1.42' + ErrorPattern = 'Value of byte 4 in ScopeId (42) is not valid.' + ErrorId = 'ScopeIdOrMaskIncorrect' + } + @{ + Parameter = 'IPStartRange' + Value = '192.168.0.1' + ErrorPattern = 'Value of byte 3 in IPStartRange (0) is not valid.' + ErrorId = 'ScopeIdOrMaskIncorrect' + } + @{ + Parameter = 'IPEndRange' + Value = '192.167.1.100' + ErrorPattern = 'Value of byte 2 in IPEndRange (167) is not valid.' + ErrorId = 'ScopeIdOrMaskIncorrect' + } + @{ + Parameter = 'IPEndRange' + Value = '192.168.1.2' + ErrorPattern = 'not valid. Start should be lower than end.' + ErrorId = 'RangeNotCorrect' + } + ) + } + #endregion +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpPolicyOptionValue.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpPolicyOptionValue.Tests.ps1 new file mode 100644 index 0000000..37c7e3c --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpPolicyOptionValue.Tests.ps1 @@ -0,0 +1,211 @@ +#region HEADER + +# Unit Test Template Version: 1.2.1 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'xDhcpServer' ` + -DSCResourceName 'MSFT_DhcpPolicyOptionValue' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_DhcpPolicyOptionValue' { + + $policyName = 'Test Policy' + $optionId = 67 + $value = @('test Value') + $scopeId = '10.1.1.0' + $vendorClass = '' + $addressFamily = 'IPv4' + $ensure = 'Present' + + $testParams = @{ + PolicyName = $policyName + OptionId = $optionId + ScopeId = $scopeId + VendorClass = $vendorClass + AddressFamily = $addressFamily + } + + $getFakeDhcpPolicyv4OptionValue = { + return @{ + PolicyName = $policyName + OptionId = $optionId + Value = $value + ScopeId = $scopeId + VendorClass = $vendorClass + AddressFamily = $addressFamily + } + } + + $getFakeDhcpPolicyv4OptionValueID168 = { + return @{ + PolicyName = $policyName + OptionId = 168 + Value = $value + ScopeId = $scopeId + VendorClass = $vendorClass + AddressFamily = $addressFamily + } + } + + $getFakeDhcpPolicyv4OptionValueDifferentValue = { + return @{ + PolicyName = $policyName + OptionId = $optionId + Value = @('DifferentValue') + ScopeId = $scopeId + VendorClass = $vendorClass + AddressFamily = $addressFamily + } + } + + + Describe 'xDhcpServer\Get-TargetResource' { + + Mock Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpPolicyv4OptionValue + + It 'Should call "Assert-Module" to ensure "DHCPServer" module is available' { + + $result = Get-TargetResource @testParams + + Assert-MockCalled -CommandName Assert-Module -Scope It -ModuleName OptionValueHelper + } + + It 'Returns a "System.Collections.Hashtable" object type' { + + $result = Get-TargetResource @testParams + $result | Should BeOfType [System.Collections.Hashtable] + } + + It 'Returns "Absent" when the option value does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Get-TargetResource @testParams + $result.Ensure | Should -Be 'Absent' + } + + It 'Returns all correct values'{ + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $getFakeDhcpPolicyv4OptionValueDifferentValue + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be $ensure + $result.OptionId | Should Be $optionId + $result.PolicyName | Should Be $policyName + $result.Value | Should Be @('DifferentValue') + $result.VendorClass | Should Be $vendorClass + $result.AddressFamily | Should Be $addressFamily + } + + It 'Returns the properties as $null when the option does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be 'Absent' + $result.OptionId | Should Be $null + $result.PolicyName | Should Be $null + $result.Value | Should Be $null + $result.VendorClass | Should Be $null + $result.AddressFamily | Should Be $null + } + } + + + Describe 'xDhcpServer\Test-TargetResource' { + + Mock Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + It 'Returns a "System.Boolean" object type' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpPolicyv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should BeOfType [System.Boolean] + } + + It 'Returns $true when the option exists and Ensure = Present' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpPolicyv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should Be $true + } + + It 'Returns $false when the option does not exist and Ensure = Present' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should Be $false + } + + It 'Returns $false when the option exists and Ensure = Absent ' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpPolicyv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Absent' -Value $value + $result | Should Be $false + } + } + + Describe 'xDhcpServer\Set-TargetResource' { + + Mock -CommandName Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } + + Mock Remove-DhcpServerv4OptionValue -ModuleName OptionValueHelper + Mock Set-DhcpServerv4OptionValue -ModuleName OptionValueHelper + + It 'Should call "Set-DhcpServerv4Optionvalue" when "Ensure" = "Present" and definition does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + Set-TargetResource @testParams -Ensure 'Present' -Value $value + Assert-MockCalled -CommandName Set-DhcpServerv4OptionValue -Scope It -ModuleName OptionValueHelper + } + + It 'Should call "Remove-DhcpServerv4OptionValue" when "Ensure" = "Absent" and Definition does exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpPolicyv4OptionValue + + Set-TargetResource @testParams -Ensure 'Absent' -Value $value + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionValue -ModuleName OptionValueHelper -Scope It + } + + It 'Should call "Set-DhcpServerv4OptionValue" when "Ensure" = "Present" and option value is different' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $getFakeDhcpPolicyv4OptionValueDifferentValue + + Set-TargetResource @testParams -Ensure 'Present' -Value $value + Assert-MockCalled -CommandName Set-DhcpServerv4OptionValue -ModuleName OptionValueHelper -Scope It + } + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpReservedIPOptionValue.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpReservedIPOptionValue.Tests.ps1 new file mode 100644 index 0000000..bd5613f --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpReservedIPOptionValue.Tests.ps1 @@ -0,0 +1,208 @@ +#region HEADER + +# Unit Test Template Version: 1.2.1 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'xDhcpServer' ` + -DSCResourceName 'MSFT_DhcpReservedIPOptionValue' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_DhcpReservedIPOptionValue' { + + $optionId = 67 + $reservedIP = '1.1.1.1' + $value = [array] @('testValue1','testValue2') + $vendorClass = '' + $userClass = '' + $addressFamily = 'IPv4' + $ensure = 'Present' + + $testParams = @{ + OptionId = $optionId + ReservedIP = $reservedIP + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + + $getFakeDhcpReservedIPv4OptionValue = { + return @{ + OptionId = $optionId + Value = $value + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + $getFakeDhcpReservedIPv4OptionValueID168 = { + return @{ + OptionId = 168 + Value = $value + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + $getFakeDhcpReservedIPv4OptionValueDifferentValue = { + return @{ + OptionId = $optionId + Value = @('DifferentValue') + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + Describe 'xDhcpServer\Get-TargetResource' { + + Mock Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpReservedIPv4OptionValue + + It 'Should call "Assert-Module" to ensure "DHCPServer" module is available' { + + $result = Get-TargetResource @testParams + + Assert-MockCalled -CommandName Assert-Module -Scope It -ModuleName OptionValueHelper + } + + It 'Returns a "System.Collections.Hashtable" object type' { + + $result = Get-TargetResource @testParams + $result | Should BeOfType [System.Collections.Hashtable] + } + + It 'Returns "Absent" when the option value does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be 'Absent' + } + + It 'Returns all correct values'{ + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $getFakeDhcpReservedIPv4OptionValueDifferentValue + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be $ensure + $result.OptionId | Should Be $optionId + $result.Value | Should Be @('DifferentValue') + $result.VendorClass | Should Be $vendorClass + $result.UserClass | Should Be $userClass + $result.AddressFamily | Should Be $addressFamily + } + + It 'Returns the properties as $null when the option does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be 'Absent' + $result.OptionId | Should Be $null + $result.ReservedIP | Should Be $null + $result.Value | Should Be $null + $result.VendorClass | Should Be $null + $result.UserClass | Should Be $null + $result.AddressFamily | Should Be $null + } + } + + + Describe 'xDhcpServer\Test-TargetResource' { + + Mock Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + It 'Returns a "System.Boolean" object type' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpReservedIPv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should BeOfType [System.Boolean] + } + + It 'Returns $true when the option exists and Ensure = Present' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpReservedIPv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should Be $true + } + + It 'Returns $false when the option does not exist and Ensure = Present' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should Be $false + } + + It 'Returns $false when the option exists and Ensure = Absent ' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpReservedIPv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Absent' -Value $value + $result | Should Be $false + } + } + + Describe 'xDhcpServer\Set-TargetResource' { + + Mock -CommandName Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } + + Mock Remove-DhcpServerv4OptionValue -ModuleName OptionValueHelper + Mock Set-DhcpServerv4OptionValue -ModuleName OptionValueHelper + + It 'Should call "Set-DhcpServerv4Optionvalue" when "Ensure" = "Present" and definition does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + Set-TargetResource @testParams -Ensure 'Present' -Value $value + Assert-MockCalled -CommandName Set-DhcpServerv4OptionValue -Scope It -ModuleName OptionValueHelper + } + + It 'Should call "Remove-DhcpServerv4OptionValue" when "Ensure" = "Absent" and Definition does exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpReservedIPv4OptionValue + + Set-TargetResource @testParams -Ensure 'Absent' -Value $value + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionValue -ModuleName OptionValueHelper -Scope It + } + + It 'Should call "Set-DhcpServerv4OptionValue" when "Ensure" = "Present" and option value is different' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $getFakeDhcpReservedIPv4OptionValueDifferentValue + + Set-TargetResource @testParams -Ensure 'Present' -Value $value + Assert-MockCalled -CommandName Set-DhcpServerv4OptionValue -ModuleName OptionValueHelper -Scope It + } + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpScopeOptionValue.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpScopeOptionValue.Tests.ps1 new file mode 100644 index 0000000..3110cb5 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpScopeOptionValue.Tests.ps1 @@ -0,0 +1,211 @@ +#region HEADER + +# Unit Test Template Version: 1.2.1 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'xDhcpServer' ` + -DSCResourceName 'MSFT_DhcpScopeOptionValue' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_DhcpScopeOptionValue' { + + $optionId = 67 + $value = @('test Value') + $scopeId = '10.1.1.0' + $vendorClass = '' + $userClass = '' + $addressFamily = 'IPv4' + $ensure = 'Present' + + $testParams = @{ + OptionId = $optionId + ScopeId = $scopeId + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + + $getFakeDhcpScopev4OptionValue = { + return @{ + OptionId = $optionId + Value = $value + ScopeId = $scopeId + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + $getFakeDhcpScopev4OptionValueID168 = { + return @{ + OptionId = 168 + Value = $value + ScopeId = $scopeId + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + $getFakeDhcpScopev4OptionValueDifferentValue = { + return @{ + OptionId = $optionId + Value = @('DifferentValue') + ScopeId = $scopeId + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + Describe 'xDhcpServer\Get-TargetResource' { + + Mock Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpScopev4OptionValue + + It 'Should call "Assert-Module" to ensure "DHCPServer" module is available' { + + $result = Get-TargetResource @testParams + + Assert-MockCalled -CommandName Assert-Module -Scope It -ModuleName OptionValueHelper + } + + It 'Returns a "System.Collections.Hashtable" object type' { + + $result = Get-TargetResource @testParams + $result | Should BeOfType [System.Collections.Hashtable] + } + + It 'Returns "Absent" when the option value does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Get-TargetResource @testParams + $result.Ensure | Should -Be 'Absent' + } + + It 'Returns all correct values'{ + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $getFakeDhcpScopev4OptionValueDifferentValue + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be $ensure + $result.OptionId | Should Be $optionId + $result.ScopeId | Should Be $scopeId + $result.Value | Should Be @('DifferentValue') + $result.VendorClass | Should Be $vendorClass + $result.UserClass | Should Be $userClass + $result.AddressFamily | Should Be $addressFamily + } + + It 'Returns the properties as $null when the option does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be 'Absent' + $result.OptionId | Should Be $null + $result.ScopeId | Should Be $null + $result.Value | Should Be $null + $result.VendorClass | Should Be $null + $result.UserClass | Should Be $null + $result.AddressFamily | Should Be $null + } + } + + Describe 'xDhcpServer\Test-TargetResource' { + + Mock Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + It 'Returns a "System.Boolean" object type' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpScopev4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should BeOfType [System.Boolean] + } + + It 'Returns $true when the option exists and Ensure = Present' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpScopev4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should Be $true + } + + It 'Returns $false when the option does not exist and Ensure = Present' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should Be $false + } + + It 'Returns $false when the option exists and Ensure = Absent ' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpScopev4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Absent' -Value $value + $result | Should Be $false + } + } + + Describe 'xDhcpServer\Set-TargetResource' { + + Mock -CommandName Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } + + Mock Remove-DhcpServerv4OptionValue -ModuleName OptionValueHelper + Mock Set-DhcpServerv4OptionValue -ModuleName OptionValueHelper + + It 'Should call "Set-DhcpServerv4Optionvalue" when "Ensure" = "Present" and definition does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + Set-TargetResource @testParams -Ensure 'Present' -Value $value + Assert-MockCalled -CommandName Set-DhcpServerv4OptionValue -Scope It -ModuleName OptionValueHelper + } + + It 'Should call "Remove-DhcpServerv4OptionValue" when "Ensure" = "Absent" and Definition does exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpScopev4OptionValue + + Set-TargetResource @testParams -Ensure 'Absent' -Value $value + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionValue -ModuleName OptionValueHelper -Scope It + } + + It 'Should call "Set-DhcpServerv4OptionValue" when "Ensure" = "Present" and option value is different' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $getFakeDhcpScopev4OptionValueDifferentValue + + Set-TargetResource @testParams -Ensure 'Present' -Value $value + Assert-MockCalled -CommandName Set-DhcpServerv4OptionValue -ModuleName OptionValueHelper -Scope It + } + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpServerOptionValue.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpServerOptionValue.Tests.ps1 new file mode 100644 index 0000000..b583782 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_DhcpServerOptionValue.Tests.ps1 @@ -0,0 +1,204 @@ +#region HEADER + +# Unit Test Template Version: 1.2.1 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'xDhcpServer' ` + -DSCResourceName 'MSFT_DhcpServerOptionValue' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_DhcpServerOptionValue' { + + $optionId = 67 + $value = @('test Value') + $vendorClass = '' + $userClass = '' + $addressFamily = 'IPv4' + $ensure = 'Present' + + $testParams = @{ + OptionId = $optionId + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + + $getFakeDhcpServerv4OptionValue = { + return @{ + OptionId = $optionId + Value = $value + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + $getFakeDhcpServerv4OptionValueID168 = { + return @{ + OptionId = 168 + Value = $value + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + $getFakeDhcpServerv4OptionValueDifferentValue = { + return @{ + OptionId = $optionId + Value = @('DifferentValue') + VendorClass = $vendorClass + UserClass = $userClass + AddressFamily = $addressFamily + } + } + + Describe 'xDhcpServer\Get-TargetResource' { + + Mock Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpServerv4OptionValue + + It 'Should call "Assert-Module" to ensure "DHCPServer" module is available' { + + $result = Get-TargetResource @testParams + + Assert-MockCalled -CommandName Assert-Module -Scope It -ModuleName OptionValueHelper + } + + It 'Returns a "System.Collections.Hashtable" object type' { + + $result = Get-TargetResource @testParams + $result | Should BeOfType [System.Collections.Hashtable] + } + + It 'Returns "Absent" when the option value does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Get-TargetResource @testParams + $result.Ensure | Should -Be 'Absent' + } + + It 'Returns all correct values'{ + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $getFakeDhcpServerv4OptionValueDifferentValue + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be $ensure + $result.OptionId | Should Be $optionId + $result.Value | Should Be @('DifferentValue') + $result.VendorClass | Should Be $vendorClass + $result.UserClass | Should Be $userClass + $result.AddressFamily | Should Be $addressFamily + } + + It 'Returns the properties as $null when the option does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Get-TargetResource @testParams + $result.Ensure | Should Be 'Absent' + $result.OptionId | Should Be $null + $result.Value | Should Be $null + $result.VendorClass | Should Be $null + $result.UserClass | Should Be $null + $result.AddressFamily | Should Be $null + } + } + + Describe 'xDhcpServer\Test-TargetResource' { + + Mock Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + It 'Returns a "System.Boolean" object type' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpServerv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should BeOfType [System.Boolean] + } + + It 'Returns $true when the option exists and Ensure = Present' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpServerv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should Be $true + } + + It 'Returns $false when the option does not exist and Ensure = Present' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + $result = Test-TargetResource @testParams -Ensure 'Present' -Value $value + $result | Should Be $false + } + + It 'Returns $false when the option exists and Ensure = Absent ' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpServerv4OptionValue + + $result = Test-TargetResource @testParams -Ensure 'Absent' -Value $value + $result | Should Be $false + } + } + + Describe 'xDhcpServer\Set-TargetResource' { + + Mock -CommandName Assert-Module -ModuleName OptionValueHelper -ParameterFilter { $ModuleName -eq 'DHCPServer' } + + Mock Remove-DhcpServerv4OptionValue -ModuleName OptionValueHelper + Mock Set-DhcpServerv4OptionValue -ModuleName OptionValueHelper + + It 'Should call "Set-DhcpServerv4Optionvalue" when "Ensure" = "Present" and definition does not exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper {return $null} + + Set-TargetResource @testParams -Ensure 'Present' -Value $value + Assert-MockCalled -CommandName Set-DhcpServerv4OptionValue -Scope It -ModuleName OptionValueHelper + } + + It 'Should call "Remove-DhcpServerv4OptionValue" when "Ensure" = "Absent" and Definition does exist' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $GetFakeDhcpServerv4OptionValue + + Set-TargetResource @testParams -Ensure 'Absent' -Value $value + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionValue -ModuleName OptionValueHelper -Scope It + } + + It 'Should call "Set-DhcpServerv4OptionValue" when "Ensure" = "Present" and option value is different' { + + Mock Get-DhcpServerv4OptionValue -ModuleName OptionValueHelper -MockWith $getFakeDhcpServerv4OptionValueDifferentValue + + Set-TargetResource @testParams -Ensure 'Present' -Value $value + Assert-MockCalled -CommandName Set-DhcpServerv4OptionValue -ModuleName OptionValueHelper -Scope It + } + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerAuthorization.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerAuthorization.Tests.ps1 new file mode 100644 index 0000000..5adcea1 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerAuthorization.Tests.ps1 @@ -0,0 +1,209 @@ +$Global:DSCModuleName = 'xDhcpServer' +$Global:DSCResourceName = 'MSFT_xDhcpServerAuthorization' + +#region HEADER +[String] $moduleRoot = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $Script:MyInvocation.MyCommand.Path)) +if ( (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\')) +} +else +{ + & git @('-C',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\'),'pull') +} +Import-Module (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $Global:DSCModuleName ` + -DSCResourceName $Global:DSCResourceName ` + -TestType Unit +#endregion + +# TODO: Other Optional Init Code Goes Here... + +# Begin Testing +try +{ + + #region Pester Tests + + # The InModuleScope command allows you to perform white-box unit testing on the internal + # (non-exported) code of a Script Module. + InModuleScope $Global:DSCResourceName { + + #region Pester Test Initialization + + ## Mock missing functions + function Get-DhcpServerInDc { } + function Add-DhcpServerInDc { } + ## http://virtualengine.co.uk/2015/mocking-missing-cmdlet-pipelines-with-pester/ + function Remove-DhcpServerInDc { [CmdletBinding()] param ( [Parameter(ValueFromPipeline)] $someValue ) } + + ## Test TargetResource parameters with Ensure = 'Present' + $testPresentParams = @{ Ensure = 'Present'; DnsName = 'test1.contoso.com'; IPAddress = '192.168.1.1'; } + ## Test TargetResource parameters with Ensure = 'Absent' + $testAbsentParams = @{ Ensure = 'Absent'; DnsName = 'test1.contoso.com'; IPAddress = '192.168.1.1'; } + + ## Authorised server list with test1.contoso.com authorised + $fakeDhcpServersPresent = @( + @{ IPAddress = '192.168.1.1'; DnsName = 'test1.contoso.com'; }, + @{ IPAddress = '192.168.1.2'; DnsName = 'test2.contoso.com'; }, + @{ IPAddress = '192.168.1.3'; DnsName = 'test3.contoso.com'; } + ) + ## Authorised server list with test1.contoso.com not authorised + $fakeDhcpServersAbsent = @( + @{ IPAddress = '192.168.1.2'; DnsName = 'test2.contoso.com'; }, + @{ IPAddress = '192.168.1.3'; DnsName = 'test3.contoso.com'; } + ) + ## Authorised server list with mismathed DnsName, but matched IPAddress + $fakeDhcpServersMismatchDnsName = @( + @{ IPAddress = '192.168.1.1'; DnsName = 'test11.contoso.com'; }, + @{ IPAddress = '192.168.1.2'; DnsName = 'test2.contoso.com'; }, + @{ IPAddress = '192.168.1.3'; DnsName = 'test3.contoso.com'; } + ) + ## Authorised server list with mismathed IPAddress, but matched DnsName + $fakeDhcpServersMismatchIPAddress = @( + @{ IPAddress = '192.168.1.11'; DnsName = 'test1.contoso.com'; }, + @{ IPAddress = '192.168.1.2'; DnsName = 'test2.contoso.com'; }, + @{ IPAddress = '192.168.1.3'; DnsName = 'test3.contoso.com'; } + ) + + #endregion + + #region Function Get-TargetResource + Describe "$($Global:DSCResourceName)\Get-TargetResource" { + + Mock Assert-Module { }; + + It 'Returns a [System.Collection.Hashtable] type' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersPresent; } + + $result = Get-TargetResource @testPresentParams; + + $result -is [System.Collections.Hashtable] | Should Be $true; + } + It 'Returns Ensure is Present when DHCP server authorization exists' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersPresent; } + + $result = Get-TargetResource @testPresentParams + + $result.Ensure | Should Be 'Present'; + } + It 'Returns Ensure is Absent when DHCP server authorization does not exist' { + Mock Get-DhcpServerInDC { } + + $result = Get-TargetResource @testPresentParams; + + $result.Ensure | Should Be 'Absent'; + } + + } + #endregion Function Get-TargetResource + + #region Function Test-TargetResource + Describe "$($Global:DSCResourceName)\Test-TargetResource" { + Mock Assert-Module { }; + + It 'Returns a [System.Boolean] type' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersPresent; } + + $result = Test-TargetResource @testPresentParams; + + $result -is [System.Boolean] | Should Be $true; + } + It 'Fails when DHCP Server authorization does not exist and Ensure is Present' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersAbsent; } + + Test-TargetResource @testPresentParams | Should Be $false; + } + It 'Fails when DHCP Server authorization does exist and Ensure is Absent' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersPresent; } + + Test-TargetResource @testAbsentParams | Should Be $false; + } + It 'Fails when DHCP Server authorization does exist, Ensure is Present but DnsName is wrong' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersMismatchDnsName; } + + Test-TargetResource @testPresentParams | Should Be $false; + } + It 'Fails when DHCP Server authorization does exist, Ensure is Present but IPAddress is wrong' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersMismatchIPAddress; } + + Test-TargetResource @testPresentParams | Should Be $false; + } + It 'Passes when DHCP Server authorization does exist and Ensure is Present' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersPresent; } + + $result = Test-TargetResource @testPresentParams + + $result -is [System.Boolean] | Should Be $true; + } + It 'Passes when DHCP Server authorization does not exist and Ensure is Absent' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersAbsent; } + + $result = Test-TargetResource @testAbsentParams + + $result -is [System.Boolean] | Should Be $true; + } + + } + #endregion Function Test-TargetResource + + #region Function Set-TargetResource + Describe "$($Global:DSCResourceName)\Set-TargetResource" { + Mock Assert-Module { }; + + It 'Calls Add-DhcpServerInDc when Ensure is Present' { + Mock Add-DhcpServerInDC { } + + Set-TargetResource @testPresentParams; + + Assert-MockCalled Add-DhcpServerInDC -Scope It; + } + It 'Calls Remove-DhcpServerInDc when Ensure is Present' { + Mock Get-DhcpServerInDC { return $fakeDhcpServersPresent; } + Mock Remove-DhcpServerInDC { } + + Set-TargetResource @testAbsentParams; + + Assert-MockCalled Remove-DhcpServerInDC -Scope It; + } + + } + #endregion Function Set-TargetResource + + #region Function Get-IPv4Address + Describe "$($Global:DSCResourceName)\Get-IPv4Address" { + + It 'Returns a IPv4 address' { + $result = Get-IPv4Address; + + $result -match '\d+\.\d+\.\d+\.\d+' | Should Be $true; + } + + } + #endregion Function Get-IPv4Address + + #region Function Get-Hostname + Describe "$($Global:DSCResourceName)\Get-Hostname" { + + It 'Returns at least the current NetBIOS name' { + $hostname = [System.Net.Dns]::GetHostname(); + + $result = Get-Hostname; + + $result -match $hostname | Should Be $true; + } + + } + #endregion Function Get-Hostname + + } #end InModuleScope + +} +finally +{ + #region FOOTER + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerClass.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerClass.Tests.ps1 new file mode 100644 index 0000000..18cffec --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerClass.Tests.ps1 @@ -0,0 +1,167 @@ +$Global:DSCModuleName = 'xDhcpServer' +$Global:DSCResourceName = 'MSFT_xDhcpServerClass' + +#region HEADER +[String] $moduleRoot = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $Script:MyInvocation.MyCommand.Path)) +if ( (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\')) +} +else +{ + & git @('-C',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\'),'pull') +} +Import-Module (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $Global:DSCModuleName ` + -DSCResourceName $Global:DSCResourceName ` + -TestType Unit +#endregion + +# TODO: Other Optional Init Code Goes Here... + +# Begin Testing +try +{ + + #region Pester Tests + + # The InModuleScope command allows you to perform white-box unit testing on the internal + # (non-exported) code of a Script Module. + InModuleScope $Global:DSCResourceName { + + ## Mock missing functions + function Get-DhcpServerv4Class { } + function Add-DhcpServerv4Class { } + function Set-DhcpServerv4Class { } + function Remove-DhcpServerv4Class { } + + + + #region Pester Test Initialization + + $testClassName = 'Test Class'; + $testClassType = 'Vendor'; + $testAsciiData = 'test data'; + $testClassDescription = 'test class description'; + $testClassAddressFamily = 'IPv4'; + $testEnsure = 'Present' + + + $testParams = @{ + Name = $testClassName; + Type = $testClassType; + AsciiData = $testAsciiData; + AddressFamily = 'IPv4' + Description = $testClassDescription + #Ensure = $testEnsure + } + + $fakeDhcpServerClass = [PSCustomObject] @{ + 'Name'=$testClassName; + 'Type'=$testClassType + 'AsciiData' = $testAsciiData + 'Description' = $testClassDescription + 'AddressFamily' = $testClassAddressFamily + } + + + #endregion + + #region Function Get-TargetResource + Describe "$($Global:DSCResourceName)\Get-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + + It 'Calls "Assert-Module" to ensure "DHCPServer" module is available' { + Mock Get-DhcpServerv4Class { return $fakeDhcpServerClass; } + + $result = Get-TargetResource @testParams -Ensure Present; + + Assert-MockCalled Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } -Scope It; + } + + + It 'Returns a "System.Collections.Hashtable" object type' { + Mock Get-DhcpServerv4Class { return $fakeDhcpServerClass; } + $result = Get-TargetResource @testParams -Ensure Present; + $result -is [System.Collections.Hashtable] | Should Be $true; + } + } + #endregion Function Get-TargetResource + + #region Function Test-TargetResource + Describe "$($Global:DSCResourceName)\Test-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + It 'Returns a "System.Boolean" object type' { + Mock Get-DhcpServerv4Class { return $fakeDhcpServerClass; } + + $result = Test-TargetResource @testParams -Ensure Present; + + $result -is [System.Boolean] | Should Be $true; + } + + It 'Passes when all parameters are correct' { + Mock Get-DhcpServerv4Class { return $fakeDhcpServerClass; } + + $result = Test-TargetResource @testParams -Ensure Present; + + $result | Should Be $true; + } + + } + #endregion Function Test-TargetResource + + #region Function Set-TargetResource + Describe "$($Global:DSCResourceName)\Set-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + It 'Calls "Add-DhcpServerv4Class" when "Ensure" = "Present" and class does not exist' { + Mock Set-DhcpServerv4Class { } + Mock Add-DhcpServerv4Class { } + + Set-TargetResource @testParams -Ensure Present; + + Assert-MockCalled Add-DhcpServerv4Class -Scope It; + } + + + It 'Calls "Remove-DhcpServerv4Class" when "Ensure" = "Absent" and scope does exist' { + + Mock Get-DhcpServerv4Class { return $fakeDhcpServerClass; } + Mock Remove-DhcpServerv4Class { } + + Set-TargetResource @testParams -Ensure 'Absent'; + + Assert-MockCalled Remove-DhcpServerv4Class -Scope It; + } + + + It 'Calls Set-DhcpServerv4Class when asciidata changes' { + + Mock Get-DhcpServerv4Class { return $fakeDhcpServerClass; } + Mock Set-DhcpServerv4Class { } + $testParams.AsciiData = 'differentdata' + Set-TargetResource @testParams -Ensure 'Present'; + + Assert-MockCalled Set-DhcpServerv4Class -Scope It; + } + + + }#End region Function Set-TargetResource + + + } #end InModuleScope + +} +finally +{ + #region FOOTER + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerOption.tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerOption.tests.ps1 new file mode 100644 index 0000000..83c828b --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerOption.tests.ps1 @@ -0,0 +1,368 @@ +$Global:DSCModuleName = 'xDhcpServer' # Example xNetworking +$Global:DSCResourceName = 'MSFT_xDhcpServerOption' # Example MSFT_xFirewall + +#region HEADER +[String] $moduleRoot = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $Script:MyInvocation.MyCommand.Path)) +if ( (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\')) +} +else +{ + & git @('-C',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\'),'pull') +} +Import-Module (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $Global:DSCModuleName ` + -DSCResourceName $Global:DSCResourceName ` + -TestType Unit +#endregion + +# Begin Testing + +try +{ + InModuleScope $Global:DSCResourceName { + + #region Pester Test Initialization + # TODO: Optopnal Load Mock for use in Pester tests here... + #endregion + + $testScopeID = '192.168.1.0'; + $testDnsServerIPAddress = '192.168.1.10'; + $testDnsDomain = 'contoso.com'; + $testRouter = '192.168.1.1'; + + $testParams = @{ + ScopeID = $testScopeID; + DnsServerIPAddress = $testDnsServerIPAddress; + } + + $fakeDhcpServerv4Option = [PSCustomObject] @{ + ScopeID = $testScopeID; + DnsDomain = $testDnsDomain; + AddressFamily = 'IPv4'; + DnsServerIPAddress = $testDnsServerIPAddress; + Router = $testRouter; + } + + $fakeDhcpServerv4Scope = [PSCustomObject] @{ + ScopeID = $testScopeID; + } + + #region Function Get-TargetResource + Describe "$($Global:DSCResourceName)\Get-TargetResource" { + + It 'Returns all properties' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope; } + Mock Get-DhcpServerv4OptionValue { return $fakeDhcpServerv4Option } + $result = Get-TargetResource @testParams; + + $missingCount = + ( + $fakeDhcpServerv4Option.psobject.properties.ForEach{ + $result.ContainsKey($_.Name) + } | Where-Object { -not $_ } | Measure-Object + ).Count + + $missingCount | Should Be 0; + } + } + #endregion Function Get-TargetResource + + #region Function ValidateResourceProperties + Describe "$($Global:DSCResourceName)\ValidateResourceProperties" { + + $dnsDomainName = 'contoso.com' + $dnsIpAddress = @('2.1.1.2','2.1.1.3') + $routeripAddress = '1.1.1.2' + Mock -CommandName Set-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { } + + # Absent removes the whole option, so this is not new to this issue. + # So not currently testing Absent and Apply = $true + foreach($params in @(@{Ensure='Present';Apply=$false},@{Ensure='Absent';Apply=$false},@{Ensure='Present';Apply=$true})) + { + It "Return true when DNS Server scalar match, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=6;Value=$dnsIpAddress[1]}) + } + + $expectedReturn = $true + if($params.Ensure -eq 'Absent') + { + $expectedReturn = $false + } + if($params.Apply) + { + $expectedReturn = $null + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -DnsServerIPAddress $dnsIpAddress[1] -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue -Exactly 0 -Scope It + } + + It "Return true when DNS Server array match, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=6;Value=$dnsIpAddress}) + } + + $expectedReturn = $true + if($params.Ensure -eq 'Absent') + { + $expectedReturn = $false + } + if($params.Apply) + { + $expectedReturn = $null + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -DnsServerIPAddress $dnsIpAddress -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue -Exactly 0 -Scope It + } + + It "Return false when DNS Server mismatch, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=6;Value=$dnsIpAddress}) + } + + $expectedReturn = $false + $setMockCalledParams = @{} + if($params.Apply) + { + $expectedReturn = $null + } + else + { + $setMockCalledParams.Add('Exactly',$true) + $setMockCalledParams.Add('Times',0) + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -DnsServerIPAddress '1.2.2.1' -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue @setMockCalledParams -Scope It + } + + It "Return false when DNS Server empty, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=15;Value=$dnsDomainName}) + } + + $expectedReturn = $false + $setMockCalledParams = @{} + if($params.Apply) + { + $expectedReturn = $null + } + else + { + $setMockCalledParams.Add('Exactly',$true) + $setMockCalledParams.Add('Times',0) + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -DnsServerIPAddress '1.2.2.1' -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue @setMockCalledParams -Scope It + } + + It "Return true when DNS domain name match, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=15;Value=$dnsDomainName}) + } + + $expectedReturn = $true + if($params.Ensure -eq 'Absent') + { + $expectedReturn = $false + } + if($params.Apply) + { + $expectedReturn = $null + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -DnsDomain $dnsDomainName -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue -Exactly 0 -Scope It + } + + It "Return false when DNS domain name mismatch, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=15;Value=$dnsDomainName}) + } + + $expectedReturn = $false + $setMockCalledParams = @{} + if($params.Apply) + { + $expectedReturn = $null + } + else + { + $setMockCalledParams.Add('Exactly',$true) + $setMockCalledParams.Add('Times',0) + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -DnsDomain 'wrong.com' -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue @setMockCalledParams -Scope It + } + + It "Return true when Router scalar match, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=3;Value=$routeripAddress}) + } + + $expectedReturn = $true + if($params.Ensure -eq 'Absent') + { + $expectedReturn = $false + } + if($params.Apply) + { + $expectedReturn = $null + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -Router $routeripAddress -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue -Exactly 0 -Scope It + } + + It "Return true when Router array match, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=3;Value=$routeripAddress}) + } + + $expectedReturn = $true + if($params.Ensure -eq 'Absent') + { + $expectedReturn = $false + } + if($params.Apply) + { + $expectedReturn = $null + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -Router $routeripAddress -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue -Exactly 0 -Scope It + } + + It "Return false when Router scalar mismatch, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=3;Value=$routeripAddress}) + } + + $expectedReturn = $false + $setMockCalledParams = @{} + if($params.Apply) + { + $expectedReturn = $null + } + else + { + $setMockCalledParams.Add('Exactly',$true) + $setMockCalledParams.Add('Times',0) + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -Router '1.1.1.3' -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue @setMockCalledParams -Scope It + } + + It "Return false when Router array mismatch, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=3;Value=$routeripAddress}) + } + + $expectedReturn = $false + $setMockCalledParams = @{} + if($params.Apply) + { + $expectedReturn = $null + } + else + { + $setMockCalledParams.Add('Exactly',$true) + $setMockCalledParams.Add('Times',0) + } + + + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -Router @('1.1.1.2','1.1.1.4') -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue @setMockCalledParams -Scope It + } + + It "Return false when Router array extra element, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=3;Value=$routeripAddress}) + } + + $expectedReturn = $false + $setMockCalledParams = @{} + if($params.Apply) + { + $expectedReturn = $null + } + else + { + $setMockCalledParams.Add('Exactly',$true) + $setMockCalledParams.Add('Times',0) + } + + $result = ValidateResourceProperties @params -scopeId '1.1.1.0'-Router @('1.1.1.2','1.1.1.3', '1.1.1.4') -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue @setMockCalledParams -Scope It + } + + It "Return false when Router array missing element, apply: $($params.Apply), Ensure: $($params.Ensure)" { + Mock -CommandName Get-DhcpServerv4OptionValue -ModuleName MSFT_xDhcpServerOption -MockWith { + return @(new-object psobject -property @{OptionId=3;Value=$routeripAddress}) + } + + $expectedReturn = $false + $setMockCalledParams = @{} + if($params.Apply) + { + $expectedReturn = $null + } + else + { + $setMockCalledParams.Add('Exactly',$true) + $setMockCalledParams.Add('Times',0) + } + $result = ValidateResourceProperties @params -scopeId '1.1.1.0' -Router @('1.1.1.2','1.1.1.3') -Verbose + + $result | should be $expectedReturn + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName Get-DhcpServerv4OptionValue -Scope It + Assert-MockCalled -ModuleName MSFT_xDhcpServerOption -commandName set-DhcpServerv4OptionValue @setMockCalledParams -Scope It + } + } + #endregion + + } #endregion InModuleScope + + } + #endregion + +} +finally +{ + #region FOOTER + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerOptionDefinition.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerOptionDefinition.Tests.ps1 new file mode 100644 index 0000000..8fb3cf2 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerOptionDefinition.Tests.ps1 @@ -0,0 +1,229 @@ +$Global:DSCModuleName = 'xDhcpServer' +$Global:DSCResourceName = 'MSFT_xDhcpServerOptionDefinition' + +#region HEADER + +# Unit Test Template Version: 1.2.1 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'xDhcpServer' ` + -DSCResourceName 'MSFT_xDhcpServerOptionDefinition' ` + -TestType Unit + +#endregion HEADER + + +function Invoke-TestSetup { +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing + +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_xDhcpServerOptionDefinition' { + + $optionId = 22 + $name = 'Test name' + $addressFamily = 'IPv4' + $description = 'Test Description' + $type = 'IPv4Address' + $vendorClass = '' + $multiValued = $false + + $testParams = @{ + OptionId = $optionId + Name = $name + AddressFamily = $addressFamily + Description = $description + Type = $type + VendorClass = $vendorClass + MultiValued = $multiValued + } + + $fakeDhcpServerv4OptionDefinition = [PSCustomObject] @{ + OptionId = $optionId + Name = $name + AddressFamily = $addressFamily + Description = $description + Type = $type + VendorClass = $vendorClass + MultiValued = $multiValued + } + + Describe "xDhcpServer\Get-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + Mock Set-DhcpServerv4OptionDefinition { } + Mock Add-DhcpServerv4OptionDefinition { } + Mock Remove-DhcpServerv4OptionDefinition { } + + It 'Should call "Assert-Module" to ensure "DHCPServer" module is available' { + + $result = Get-TargetResource -OptionId $OptionId -Name $Name -Type $Type -VendorClass $VendorClass -AddressFamily IPv4 -Ensure Present; + Assert-MockCalled -CommandName Assert-Module -Scope It + } + + It 'Returns a "System.Collections.Hashtable" object type' { + + $result = Get-TargetResource -OptionId $OptionId -Name $Name -Type $Type -VendorClass $VendorClass -AddressFamily IPv4 -Ensure Present; + $result -is [System.Collections.Hashtable] | Should Be $true; + } + } + + Describe "xDhcpServer\Test-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + Mock Set-DhcpServerv4OptionDefinition { } + Mock Add-DhcpServerv4OptionDefinition { } + Mock Remove-DhcpServerv4OptionDefinition { } + + It 'Returns a "System.Boolean" object type' { + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition; } + + $result = Test-TargetResource @testParams -Ensure Present; + $result | Should BeOfType [System.Boolean] + } + + It 'Passes when all parameters are correct' { + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition; } + + $result = Test-TargetResource @testParams -Ensure Present; + $result | Should Be $true; + } + } + + Describe "xDhcpServer\Set-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + Mock Set-DhcpServerv4OptionDefinition { } + Mock Add-DhcpServerv4OptionDefinition { } + Mock Remove-DhcpServerv4OptionDefinition { } + + It 'Should call "Add-DhcpServerv4OptionDefinition" when "Ensure" = "Present" and definition does not exist' { + + Mock Get-DhcpServerv4OptionDefinition { return $null } + + $TempParams = $testParams.Clone() + $TempParams.OptionId = 2 + Set-TargetResource @TempParams -Ensure 'Present' + + Assert-MockCalled Add-DhcpServerv4OptionDefinition -Scope It + } + + It 'Should call "Remove-DhcpServerv4OptionDefinition" when "Ensure" = "Absent" and Definition does exist' { + + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + + Set-TargetResource @testParams -Ensure 'Absent' + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionDefinition -Scope It + } + + It 'Should call Set-DhcpServerv4OptionDefinition when "Ensure" = "Present" and Name or Description has changed' { + + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + + $TempParams = $testParams.Clone() + $TempParams.Description = 'New Description' + Set-TargetResource @TempParams -Ensure 'Present' + + Assert-MockCalled -CommandName Set-DhcpServerv4OptionDefinition -Scope It + } + + It 'Should call "Remove-DhcpServerv4OptionDefinition" and then "Add-DhcpServerv4OptionDefinition" when "Ensure" = "Present" and Type, MultiValued, VendorClass has changed' { + + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + + $TempParams = $testParams.Clone() + $TempParams.Type = 'Byte' + Set-TargetResource @TempParams -Ensure 'Present' + + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionDefinition -Scope It + Assert-MockCalled -CommandName Add-DhcpServerv4OptionDefinition -Scope It + } + + + It 'Should call "Remove-DhcpServerv4OptionDefinition" and then "Add-DhcpServerv4OptionDefinition" when "Ensure" = "Present" and Type has changed' { + + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + + $TempParams = $testParams.Clone() + $TempParams.Type = 'Byte' + Set-TargetResource @tempParams -Ensure 'Present' + + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionDefinition -Scope It + Assert-MockCalled -CommandName Add-DhcpServerv4OptionDefinition -Scope It + } + + + It 'Should call "Remove-DhcpServerv4OptionDefinition" and then "Add-DhcpServerv4OptionDefinition" when "Ensure" = "Present" and MultiValued has changed' { + + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + + $TempParams = $testParams.Clone() + $TempParams.MultiValued = $true + Set-TargetResource @TempParams -Ensure 'Present' + + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionDefinition -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Add-DhcpServerv4OptionDefinition -Scope It -Times 1 -Exactly + } + + It 'Should call "Remove-DhcpServerv4OptionDefinition" and then "Add-DhcpServerv4OptionDefinition" when "Ensure" = "Present" and VendorClass has changed' { + + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + + $TempParams = $testParams.Clone() + $TempParams.VendorClass = 'NewVendorClass' + Set-TargetResource @TempParams -Ensure 'Present' + + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionDefinition -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Add-DhcpServerv4OptionDefinition -Scope It -Times 1 -Exactly + } + + + It 'Should call "Remove-DhcpServerv4OptionDefinition" and then "Add-DhcpServerv4OptionDefinition" when "Ensure" = "Present" and VendorClass and Description has changed' { + + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + + $TempParams = $testParams.Clone() + $TempParams.VendorClass = 'NewVendorClass' + $TempParams.Description = 'New Description' + Set-TargetResource @TempParams -Ensure 'Present' + + Assert-MockCalled -CommandName Remove-DhcpServerv4OptionDefinition -Scope It -Times 1 -Exactly + Assert-MockCalled -CommandName Add-DhcpServerv4OptionDefinition -Scope It -Times 1 -Exactly + } + + It 'Should call "Set-DhcpServerv4OptionDefinition" when "Ensure" = "Present" and Description has changed' { + + Mock Get-DhcpServerv4OptionDefinition { return $fakeDhcpServerv4OptionDefinition } + + $TempParams = $testParams.Clone() + $TempParams.Description = 'New Description' + Set-TargetResource @testParams -Ensure 'Present' + + Assert-MockCalled -CommandName Set-DhcpServerv4OptionDefinition -Scope It + } + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerScope.Tests.ps1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerScope.Tests.ps1 new file mode 100644 index 0000000..3058a9f --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/Tests/Unit/MSFT_xDhcpServerScope.Tests.ps1 @@ -0,0 +1,295 @@ +$Global:DSCModuleName = 'xDhcpServer' +$Global:DSCResourceName = 'MSFT_xDhcpServerScope' + +#region HEADER +[String] $moduleRoot = Split-Path -Parent (Split-Path -Parent (Split-Path -Parent $Script:MyInvocation.MyCommand.Path)) +if ( (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests'))) -or + (-not (Test-Path -Path (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\')) +} +else +{ + & git @('-C',(Join-Path -Path $moduleRoot -ChildPath '\DSCResource.Tests\'),'pull') +} +Import-Module (Join-Path -Path $moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $Global:DSCModuleName ` + -DSCResourceName $Global:DSCResourceName ` + -TestType Unit +#endregion + +# Begin Testing +try +{ + #region Pester Tests + + # The InModuleScope command allows you to perform white-box unit testing on the internal + # (non-exported) code of a Script Module. + InModuleScope $Global:DSCResourceName { + + #region Pester Test Initialization + # TODO: Optional Load Mock for use in Pester tests here... + #endregion + + $testScopeName = 'Test Scope' + $testScopeID = '192.168.1.0' + $testIPStartRange = '192.168.1.10' + $testIPEndRange = '192.168.1.99' + $testSubnetMask = '255.255.255.0' + $testState = 'Active' + $testLeaseDuration = New-TimeSpan -Days 8 + $testDescription = 'Scope description' + $testAddressFamily = 'IPv4' + + $testParams = @{ + ScopeId = $testScopeID + Name = $testScopeName + IPStartRange = $testIPStartRange + IPEndRange = $testIPEndRange + SubnetMask = $testSubnetMask + } + + $fakeDhcpServerv4Scope = [PSCustomObject] @{ + ScopeID = $testScopeID + Name = $testScopeName + StartRange = $testIPStartRange + EndRange = $testIPEndRange + Description = $testDescription + SubnetMask = $testSubnetMask + LeaseDuration = $testLeaseDuration + State = $testState + AddressFamily = $testAddressFamily + } + + #region Function Get-TargetResource + Describe "$($Global:DSCResourceName)\Get-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + Mock Assert-ScopeParameter -ParameterFilter { + $ScopeId -eq $testScopeID -and + $SubnetMask -eq $testSubnetMask -and + $IPStartRange -eq $testIPStartRange -and + $IPEndRange -eq $testIPEndRange -and + $AddressFamily -eq $testAddressFamily + } + + It 'Should call "Assert-Module" to ensure "DHCPServer" module is available' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + + $result = Get-TargetResource @testParams + + Assert-MockCalled Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } -Scope It + } + + It 'Should call "Assert-ScopeParameter" to ensure parameters passed are correct' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + $result = Get-TargetResource @testParams + Assert-MockCalled Assert-Module -Scope It + } + + It 'Should return a "System.Collections.Hashtable" object type' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + Get-TargetResource @testParams | Should -BeOfType System.Collections.Hashtable + } + + It 'Should return all information about existing scope with specified ScopeId' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + $result = Get-TargetResource @testParams + $result.Name | Should -Be $testScopeName + $result.IPStartRange | Should -Be $testIPStartRange + $result.IPEndRange | Should -Be $testIPEndRange + $result.SubnetMask | Should -Be $testSubnetMask + $result.Description | Should -Be $testDescription + $result.LeaseDuration | Should -Be $testLeaseDuration + $result.State | Should -Be $testState + $result.AddressFamily | Should -Be $testAddressFamily + $result.Ensure | Should -Be Present + } + + It 'Should return basic information about missing scope with specified ScopeId' { + Mock Get-DhcpServerv4Scope {} + $result = Get-TargetResource @testParams + $result.Name | Should -BeNullOrEmpty + $result.IPStartRange | Should -BeNullOrEmpty + $result.IPEndRange | Should -BeNullOrEmpty + $result.SubnetMask | Should -BeNullOrEmpty + $result.Description | Should -BeNullOrEmpty + $result.LeaseDuration | Should -BeNullOrEmpty + $result.State | Should -BeNullOrEmpty + $result.AddressFamily | Should -Be $testAddressFamily + $result.Ensure | Should -Be Absent + } + } + #endregion Function Get-TargetResource + + #region Function Test-TargetResource + Describe "$($Global:DSCResourceName)\Test-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + It 'Should return a "System.Boolean" object type' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + Test-TargetResource @testParams | Should -BeOfType System.Boolean + } + + It 'Should pass when all parameters are correct' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + Test-TargetResource @testParams | Should -BeTrue + } + + It 'Should pass when optional <Parameter> parameter is correct' { + param ( + $Parameter, + $Value + ) + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + $optionalParameters = @{ + $Parameter = $Value + } + Test-TargetResource @testParams @optionalParameters | Should -BeTrue + } -TestCases @( + @{ + Parameter = 'Description' + Value = $testDescription + } + @{ + Parameter = 'LeaseDuration' + Value = $testLeaseDuration.ToString() + } + @{ + Parameter = 'State' + Value = $testState + } + ) + + It 'Should pass when "Ensure" = "Absent" and scope does not exist' { + Mock Get-DhcpServerv4Scope { } + Test-TargetResource @testParams -Ensure 'Absent' | Should -BeTrue + } + + It 'Should fail when <parameter> parameter is incorrect' { + param ( + $Parameter, + $Value + ) + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + $testNameParams = $testParams.Clone() + $testNameParams[$Parameter] = $Value + Test-TargetResource @testNameParams | Should -BeFalse + } -TestCases @( + @{ + Parameter = 'Name' + Value = 'IncorrectName' + } + @{ + Parameter = 'IPStartRange' + Value = '192.168.1.1' + } + @{ + Parameter = 'IPEndRange' + Value = '192.168.1.254' + } + @{ + Parameter = 'SubnetMask' + Value = '255.255.255.128' + } + @{ + Parameter = 'Description' + Value = 'Wrong description' + } + @{ + Parameter = 'LeaseDuration' + Value = '08:00:00' + } + @{ + Parameter = 'State' + Value = 'Inactive' + } + @{ + Parameter = 'Ensure' + Value = 'Absent' + } + ) + } + #endregion + + #region Function Set-TargetResource + Describe "$($Global:DSCResourceName)\Set-TargetResource" { + + Mock Assert-Module -ParameterFilter { $ModuleName -eq 'DHCPServer' } { } + + It 'Should call "Add-DhcpServerv4Scope" when "Ensure" = "Present" and scope does not exist' { + Mock Get-DhcpServerv4Scope { } + Mock Add-DhcpServerv4Scope { } + + Set-TargetResource @testParams + + Assert-MockCalled Add-DhcpServerv4Scope -Scope It -Times 1 -Exactly -ParameterFilter { + $StartRange -eq $testIPStartRange -and + $EndRange -eq $testIPEndRange -and + $SubnetMask -eq $testSubnetMask -and + $Name -eq $testScopeName + } + } + + It 'Should call "Remove-DhcpServerv4Scope" when "Ensure" = "Absent" and scope does exist' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + Mock Remove-DhcpServerv4Scope { } + + Set-TargetResource @testParams -Ensure 'Absent' + + Assert-MockCalled Remove-DhcpServerv4Scope -Scope It -Times 1 -Exactly -ParameterFilter { $ScopeId -eq $testScopeID } + } + + It 'Should call "Set-DhcpServerv4Scope" when "Ensure" = "Present" and scope does exist' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + Mock Set-DhcpServerv4Scope { } + + Set-TargetResource @testParams -LeaseDuration '08:00:00' + + Assert-MockCalled Set-DhcpServerv4Scope -Scope It -Times 1 -Exactly -ParameterFilter { + $ScopeId -eq $testScopeID -and + $LeaseDuration -eq (New-TimeSpan -Hours 8) + } + } + + It 'Should call "Remove-DhcpServerv4Scope" when "Ensure" = "Present", scope does exist but "SubnetMask" is incorrect' { + Mock Get-DhcpServerv4Scope { return $fakeDhcpServerv4Scope } + Mock Remove-DhcpServerv4Scope { } + Mock Set-DhcpServerv4Scope { } + $testSubnetMaskParams = $testParams.Clone() + $testSubnetMaskParams['SubnetMask'] = '255.255.255.128' + + Set-TargetResource @testSubnetMaskParams + + Assert-MockCalled Remove-DhcpServerv4Scope -Scope It -Times 1 -Exactly -ParameterFilter { $ScopeId -eq $testScopeID } + Assert-MockCalled Add-DhcpServerv4Scope -Scope It -Times 1 -Exactly -ParameterFilter { + $StartRange -eq $testIPStartRange -and + $EndRange -eq $testIPEndRange -and + $SubnetMask -eq '255.255.255.128' -and + $Name -eq $testScopeName + } + + } + + } + #endregion + + #region Function Set-TargetResource + Describe "$($Global:DSCResourceName)\Validate-ResourceProperties" { + # TODO: Complete Tests... + } + #endregion + + } + #endregion +} +finally +{ + #region FOOTER + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion + + # TODO: Other Optional Cleanup Code Goes Here... +} diff --git a/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/xDhcpServer.psd1 b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/xDhcpServer.psd1 new file mode 100644 index 0000000..02ca4f9 --- /dev/null +++ b/deployment/dsc/azshcihost/xDhcpServer/2.0.0.0/xDhcpServer.psd1 @@ -0,0 +1,64 @@ +@{ +# Version number of this module. +moduleVersion = '2.0.0.0' + +# ID used to uniquely identify this module +GUID = '286890c9-a6c3-4605-9cd5-03c8413c8325' + +# Author of this module +Author = 'Microsoft Corporation' + +# Company or vendor of this module +CompanyName = 'Microsoft Corporation' + +# Copyright statement for this module +Copyright = '(c) 2018 Microsoft Corporation. All rights reserved.' + +# Description of the functionality provided by this module +Description = 'Module with DSC Resources for DHCP Server area' + +# Minimum version of the Windows PowerShell engine required by this module +PowerShellVersion = '4.0' + +# Minimum version of the common language runtime (CLR) required by this module +# CLRVersion = '4.0' + +# Functions to export from this module +FunctionsToExport = '*' + +# Cmdlets to export from this module +CmdletsToExport = '*' + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/PowerShell/xDhcpServer/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/PowerShell/xDhcpServer' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + ReleaseNotes = '* BREAKING CHANGE: Switch to ScopeId as a key property for xDhcpServerScope ([issue 43](https://github.com/PowerShell/xDhcpServer/issues/48). [Bartek Bielawski (@bielawb)](https://github.com/bielawb) + +' + + } # End of PSData hashtable + +} # End of PrivateData hashtable +} + + + + + + + diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/CHANGELOG.md b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/CHANGELOG.md new file mode 100644 index 0000000..d82d90d --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/CHANGELOG.md @@ -0,0 +1,198 @@ +# Change log for xHyper-V + +## Unreleased + +## 3.17.0.0 + +* MSFT_xVMNetworkAdapter: + * Added NetworkSettings to be able to statically set IPAddress. + * Added option for Vlan tagging. You can now setup a Network Adapeter as an access switch on a specific Vlan. + +## 3.16.0.0 + +* MSFT_xVMHyperV: + * Moved localization string data to own file. + * Fixed code styling issues. + * Fixed bug where StartupMemory was not evaluated in Test-TargetResource. + * Redo of abandoned PRs: + * [PR #148](https://github.com/PowerShell/xHyper-V/pull/148), Fixes [Issue #149](https://github.com/PowerShell/xHyper-V/issues/149). + * [PR #67](https://github.com/PowerShell/xHyper-V/pull/67), Fixes [Issue #145](https://github.com/PowerShell/xHyper-V/issues/145). + * Fixed Get throws error when NetworkAdapters are not attached or missing properties. + +## 3.15.0.0 + +* Explicitly removed extra hidden files from release package. + +## 3.14.0.0 + +* MSFT_xVMHost: + * Added support to Enable / Disable VM Live Migration. Fixes [Issue #155](https://github.com/PowerShell/xHyper-V/issues/155). + +## 3.13.0.0 + +* MSFT_xVMSwitch: + * Changed 'Id' parameter form read only to optional so the VMSwitch ID can be set on Windows Server 2016. This is important for SDN setups where the VMSwitch ID must remain the same when a Hyper-V host is re-installed. + * Update appveyor.yml to use the default template. + * Added default template files .codecov.yml, .gitattributes, and .gitignore, and + .vscode folder. + +## 3.12.0.0 + +* Changes to xHyper-V + * Removed alignPropertyValuePairs from the Visual Studio Code default style + formatting settings (issue #110). + +## 3.11.0.0 + +* Added the following resources: + * MSFT_xVMHardDiskDrive to manage additional attached VHD/Xs. + * MSFT_xVMScsiController to manage virtual machine SCSI controllers. +* MSFT_xVMSwitch: + * Added parameter to specify the Load Balancing Algorithm of a vSwitch with Switch Embedded Teaming (SET). + +## 3.10.0.0 + +* MSFT_xVMHyperV: + * Added support for configuring automatic snapshots. + +## 3.9.0.0 + +* MSFT_xVMHyperV: + * Enable / disable dynamic memory for client and server SKUs in identical way. + * Increased xVMHyperV StartupMemory and MinimumMemory limits from 17GB to 64GB. + * EnableGuestService works on localized OS (language independent). + * Adds missing Hyper-V-PowerShell feature in examples. +* Added the following resources: + * MSFT_xVMProcessor to manage virtual machine processor options. + * MSFT_xVMHost to managing Hyper-V host settings. +* MSFT_xVMSwitch: + * Added support for Switch Embedded Teaming (SET) in Server 2016. + * Fixed a bug where Get-TargetResource threw an error if a non External switch + is used. + * Updated unit tests to use template version 1.2.0. + * Style fixes. + * Added support for Localization. +* xHyper-V module: + * Added vs code formatting rule settings. + * Fix Markdown rule violations in Readme.md. + * Added .MetaTestOptIn.json for Markdown common test to be included. + * Added Appveyor badge for Dev branch in Readme.md and moved to Branches section. + * Added missing properties for all resources in Readme.md. + * Added and corrected missing / wrong DataTypes and Dsc attributes in Readme.md. + * Updated Readme to match DscResources style. + * Created change log and linked to it from Readme. + * Removed version info from Readme. + * Updated appveyor.yml to use Appveyor module. + * Examples: + * Removed code from Readme and linked to example files instead. + * Moved code to new example files where there was only code in Readme. + * Codecov: + * Updated appveyor.yml to include codecov. + * Added .codecov.yml. + * Added codecov badges to Readme. +* MSFT_xVHD: + * Support setting the disk type. + * Added unit tests. + * Added example Sample\_xVHD\_FixedVHD.ps1 + * Style fixes + +## 3.8.0.0 + +* Fix bug in xVMDvdDrive with hardcoded VM Name. +* Corrected Markdown rule violations in Readme.md. + +## 3.7.0.0 + +* Adding a new resource + * MSFT_xVMNetworkAdapter: Attaches a new VM network adapter to the management + OS or VM. + +## 3.6.0.0 + +* xVHD: Updated incorrect property name MaximumSize in error message +* Fix Markdown rule violations in Readme.md identified by [markdownlint](https://github.com/mivok/markdownlint/blob/master/docs/RULES.md). +* Created standard Unit/Integration test folder structure. +* Moved unit tests into Unit test folder. +* Renamed the unit tests to meet standards. +* Added the following resources: + * xVMDvdDrive to manage DVD drives attached to a Hyper-V virtual machine. + +## 3.5.0.0 + +* Converted appveyor.yml to install Pester from PSGallery instead of from Chocolatey. +* MSFT_xVMHyperV: Fixed bug in Test-TargetResource throwing when a Vhd's ParentPath + property was null. + +## 3.4.0.0 + +* MSFT_xVMHyperV: Fixed bug causing Test-TargetResource to fail when VM had snapshots. +* MSFT_xVMHyperV: Adds localization support. +* MSFT_xVMSwitch: Fixes bug where virtual switches are duplicated when + BandwidthReservationMode is not specified. + +## 3.3.0.0 + +* xHyperV: Added SecureBoot parameter to enable control of the secure boot BIOS + setting on generation 2 VMs. + * Fixed drive letter when mounting VHD when calling resource xVhdFile. Fixes #20. +* MSFT_xVMHyperV: Changed the SwitchName parameter to string[] to support + assigning multiple NICs to virtual machines. +* MSFT_xVMHyperV: Changed the MACAddress parameter to string[] to support + assigning multiple MAC addresses to virtual machines. +* MSFT_xVMHyperV: Added enabling of Guest Service Interface. +* MSFT_xVMSwitch: Added the BandwidthReservationMode parameter which specifies + how minimum bandwidth is to be configured on a virtual switch + +## 3.2.0.0 + +* Added data type System.String to CheckSum parameter of Get/Set/Test-TargetResource + functions and aligned indentation. +* Minor fixes + +## 3.1.0.0 + +* xVMHyperV: Fixed bug in mof schema (Generation property had two types) +* xVhdFileDirectory: Fixed typo in type comparison +* Readme updates + +## 3.0.0.0 + +* Decoupled VM generation from underlying VHD format in xVMHyperV resource. + * __Breaking change:__ xVMHyperV resource: Generation property type changed + from a String to an Integer. + * The initial generation property was tied to the virtual disk format which was + incorrect and has been rectified. + * This change will only impact configurations that have previously explicitly + specified the VM generation is either "vhd" or "vhdx". + +## 2.4.0.0 + +* Fixed VM power state issue in xVMHyperV resource + +## 2.3.0 + +* Fixed check for presence of param AllowManagementOS. + +## 2.2.1 + +## 2.1 + +* Added logic to automatically adjust VM's startup memory when only minimum and + maximum memory is specified in configuration +* Fixed the issue that a manually stopped VM cannot be brought back to running + state with DSC + +## 2.0 + +* Added xVhdFileDirectory Resource +* Allowed name to be specified with the extension in xVhd (e.g. the Vhd name could + either be "sample" or "sample.vhd") +* When a VHD cannot be removed because it is already being used by another process, + an error will be thrown. + +## 1.0.0.0 + +* Initial release with the following resources + * xVhd + * xVMHyperV + * xVMSwitch diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/HyperVCommon/HyperVCommon.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/HyperVCommon/HyperVCommon.psm1 new file mode 100644 index 0000000..25ad1d5 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/HyperVCommon/HyperVCommon.psm1 @@ -0,0 +1,436 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename HyperVCommon.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + # fallback to en-US + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename HyperVCommon.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +<# + .SYNOPSIS + Throws an InvalidOperation custom exception. + + .PARAMETER ErrorId + The error Id of the exception. + + .PARAMETER ErrorMessage + The error message text to set in the exception. +#> +function New-InvalidOperationError +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage + ) + + $exception = New-Object -TypeName System.InvalidOperationException ` + -ArgumentList $ErrorMessage + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidOperation + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + throw $errorRecord +} # end function New-InvalidOperationError + +<# + .SYNOPSIS + Throws an InvalidArgument custom exception. + + .PARAMETER ErrorId + The error Id of the exception. + + .PARAMETER ErrorMessage + The error message text to set in the exception. +#> +function New-InvalidArgumentError +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage + ) + + $exception = New-Object -TypeName System.ArgumentException ` + -ArgumentList $ErrorMessage + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + throw $errorRecord +} # end function New-InvalidArgumentError + +<# + .SYNOPSIS + Sets one or more virtual machine properties, powering the VM + off if required. + + .PARAMETER Name + Name of the virtual machine to apply the changes to. + + .PARAMETER VMName + Name of the virtual machine to apply the changes to. + + .PARAMETER VMCommand + The Hyper-V cmdlet name to call to enact the changes. + + .PARAMETER ChangeProperty + The collection of cmdlet parameter names and values to pass to the command. + + .PARAMETER WaitForIP + Waits for the virtual machine to report an IP address when transitioning + into a running state. + + .PARAMETER RestartIfNeeded + Power cycle the virtual machine if changes are required. +#> +function Set-VMProperty +{ + [CmdletBinding(DefaultParameterSetName = 'Name')] + param + ( + [Parameter(Mandatory = $true, ParameterSetName = 'Name')] + [System.String] + $Name, + + [Parameter(Mandatory = $true, ParameterSetName = 'VMName')] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [System.String] + $VMCommand, + + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $ChangeProperty, + + [Parameter()] + [System.Boolean] + $WaitForIP, + + [Parameter()] + [System.Boolean] + $RestartIfNeeded + ) + + if ($PSBoundParameters.ContainsKey('VMName')) + { + # Add the -Name property to the ChangeProperty hashtable for splatting + $ChangeProperty['VMName'] = $VMName + + # Set the common parameters for splatting against Get-VM and Set-VMState + $vmCommonProperty = @{ Name = $VMName; } + + # Ensure that the name parameter is set for verbose messages + $Name = $VMName + } + else + { + # Add the -Name property to the ChangeProperty hashtable for splatting + $ChangeProperty['Name'] = $Name + + # Set the common parameters for splatting against Get-VM and Set-VMState + $vmCommonProperty = @{ Name = $Name; } + } + + $vmObject = Get-VM @vmCommonProperty + $vmOriginalState = $vmObject.State + + if ($vmOriginalState -ne 'Off' -and $RestartIfNeeded) + { + # Turn the vm off to make changes + Set-VMState @vmCommonProperty -State Off + + Write-Verbose -Message ($localizedData.UpdatingVMProperties -f $Name) + # Make changes using the passed hashtable + & $VMCommand @ChangeProperty + + # Cannot move an off VM to a paused state - only to running state + if ($vmOriginalState -eq 'Running') + { + Set-VMState @vmCommonProperty -State Running -WaitForIP $WaitForIP + } + + Write-Verbose -Message ($localizedData.VMPropertiesUpdated -f $Name) + + # Cannot restore a vm to a paused state + if ($vmOriginalState -eq 'Paused') + { + Write-Warning -Message ($localizedData.VMStateWillBeOffWarning -f $Name) + } + } + elseif ($vmOriginalState -eq 'Off') + { + Write-Verbose -Message ($localizedData.UpdatingVMProperties -f $Name) + & $VMCommand @ChangeProperty + Write-Verbose -Message ($localizedData.VMPropertiesUpdated -f $Name) + } + else + { + $errorMessage = $localizedData.CannotUpdatePropertiesOnlineError -f $Name, $vmOriginalState + New-InvalidOperationError -ErrorId RestartRequired -ErrorMessage $errorMessage + } +} #end function + +<# + .SYNOPSIS + Sets one or more virtual machine properties, powering the VM + off if required. + + .PARAMETER Name + Name of the virtual machine to apply the changes to. + + .PARAMETER State + The target power state of the virtual machine. + + .PARAMETER ChangeProperty + The collection of cmdlet parameter names and values to pass to the command. + + .PARAMETER WaitForIP + Waits for the virtual machine to be report an IP address when transitioning + into a running state. +#> +function Set-VMState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Alias('VMName')] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Running','Paused','Off')] + [System.String] + $State, + + [Parameter()] + [System.Boolean] + $WaitForIP + ) + + switch ($State) + { + 'Running' { + $vmCurrentState = (Get-VM -Name $Name).State + if ($vmCurrentState -eq 'Paused') + { + # If VM is in paused state, use resume-vm to make it running + Write-Verbose -Message ($localizedData.ResumingVM -f $Name) + Resume-VM -Name $Name + } + elseif ($vmCurrentState -eq 'Off') + { + # If VM is Off, use start-vm to make it running + Write-Verbose -Message ($localizedData.StartingVM -f $Name) + Start-VM -Name $Name + } + + if ($WaitForIP) + { + Wait-VMIPAddress -Name $Name -Verbose + } + } + 'Paused' { + if ($vmCurrentState -ne 'Off') + { + Write-Verbose -Message ($localizedData.SuspendingVM -f $Name) + Suspend-VM -Name $Name + } + } + 'Off' { + if ($vmCurrentState -ne 'Off') + { + Write-Verbose -Message ($localizedData.StoppingVM -f $Name) + Stop-VM -Name $Name -Force -WarningAction SilentlyContinue + } + } + } +} #end function + +<# + .SYNOPSIS + Waits for a virtual machine to be assigned an IP address. + + .PARAMETER Name + Name of the virtual machine to apply the changes to. + + .PARAMETER Timeout + Number of seconds to wait before timing out. Defaults to 300 (5 minutes). +#> +function Wait-VMIPAddress +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Alias('VMName')] + [System.String] + $Name, + + [Parameter()] + [System.Int32] + $Timeout = 300 + ) + + [System.Int32] $elapsedSeconds = 0 + while ((Get-VMNetworkAdapter -VMName $Name).IpAddresses.Count -lt 2) + { + Write-Verbose -Message ($localizedData.WaitingForVMIPAddress -f $Name) + Start-Sleep -Seconds 3; + + $elapsedSeconds += 3 + if ($elapsedSeconds -gt $Timeout) + { + $errorMessage = $localizedData.WaitForVMIPAddressTimeoutError -f $Name, $Timeout + New-InvalidOperationError -ErrorId 'WaitVmTimeout' -ErrorMessage $errorMessage + } + } +} #end function + +<# + .SYNOPSIS + Ensures that the specified PowerShell module(s) are installed. + + .PARAMETER Name + Name of the PowerShell module to check is installed. +#> +function Assert-Module +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String[]] + $Name + ) + + if (-not (Get-Module -Name $Name -ListAvailable )) + { + $errorMessage = $localizedData.RoleMissingError -f $Name + New-InvalidOperationError -ErrorId MissingRole -ErrorMessage $errorMessage + } +} #end function + +<# + .SYNOPSIS + Converts a number of seconds, minutes, hours or days into a System.TimeSpan object. + + .PARAMETER TimeInterval + The total number of seconds, minutes, hours or days to convert. + + .PARAMETER TimeSpanType + Convert using specified interval type. +#> +function ConvertTo-TimeSpan +{ + [CmdletBinding()] + [OutputType([System.TimeSpan])] + param + ( + [Parameter(Mandatory = $true)] + [System.UInt32] + $TimeInterval, + + [Parameter(Mandatory = $true)] + [ValidateSet('Seconds','Minutes','Hours','Days')] + [System.String] + $TimeIntervalType + ) + + $newTimeSpanParams = @{ } + switch ($TimeIntervalType) + { + 'Seconds' { $newTimeSpanParams['Seconds'] = $TimeInterval } + 'Minutes' { $newTimeSpanParams['Minutes'] = $TimeInterval } + 'Hours' { $newTimeSpanParams['Hours'] = $TimeInterval } + 'Days' { $newTimeSpanParams['Days'] = $TimeInterval } + } + return (New-TimeSpan @newTimeSpanParams) +} #end function ConvertTo-TimeSpan + +<# + .SYNOPSIS + Converts a System.TimeSpan into the number of seconds, minutes, hours or days. + + .PARAMETER TimeSpan + TimeSpan to convert into an integer + + .PARAMETER TimeSpanType + Convert timespan into the total number of seconds, minutes, hours or days. +#> +function ConvertFrom-TimeSpan +{ + [CmdletBinding()] + [OutputType([System.Int32])] + param + ( + [Parameter(Mandatory = $true)] + [System.TimeSpan] + $TimeSpan, + + [Parameter(Mandatory = $true)] + [ValidateSet('Seconds','Minutes','Hours','Days')] + [System.String] + $TimeSpanType + ) + + switch ($TimeSpanType) + { + 'Seconds' { return $TimeSpan.TotalSeconds -as [System.UInt32] } + 'Minutes' { return $TimeSpan.TotalMinutes -as [System.UInt32] } + 'Hours' { return $TimeSpan.TotalHours -as [System.UInt32] } + 'Days' { return $TimeSpan.TotalDays -as [System.UInt32] } + } +} #end function ConvertFrom-TimeSpan + +<# + .SYNOPSIS + Helper function for retrieving a virtual machine, ensuring only one VM is resolved + + .PARAMETER VMName + Name of the Hyper-V virtual machine to return +#> +function Get-VMHyperV +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName + ) + + $vm = Get-VM -Name $VMName -ErrorAction SilentlyContinue + + # Check if 1 or 0 VM with name = $name exist + if ($vm.count -gt 1) + { + $errorMessage = $localizedData.MoreThanOneVMExistsError -f $VMName + New-InvalidArgumentError -ErrorId 'MultipleVMsFound' -ErrorMessage $errorMessage + } + + return $vm +} #end function Get-VMHyperV diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/HyperVCommon/en-us/HyperVCommon.strings.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/HyperVCommon/en-us/HyperVCommon.strings.psd1 new file mode 100644 index 0000000..ae731d3 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/HyperVCommon/en-us/HyperVCommon.strings.psd1 @@ -0,0 +1,16 @@ +ConvertFrom-StringData @' + UpdatingVMProperties = Updating VM '{0}' properties. + VMPropertiesUpdated = VM '{0}' properties have been updated. + WaitingForVMIPAddress = Waiting for IP Address for VM '{0}' ... + StoppingVM = Stopping VM '{0}'. + SuspendingVM = Suspending VM '{0}'. + StartingVM = Starting VM '{0}'. + ResumingVM = Resuming VM '{0}'. + + VMStateWillBeOffWarning = VM '{0}' state will be 'OFF' and not 'Paused'. + + CannotUpdatePropertiesOnlineError = Can not change properties for VM '{0}' in '{1}' state unless 'RestartIfNeeded' is set to true. + WaitForVMIPAddressTimeoutError = Waiting for VM '{0}' IP address timed out after {1} seconds. + RoleMissingError = Please ensure that '{0}' role is installed with its PowerShell module. + MoreThanOneVMExistsError = More than one VM with the name '{0}' exists. +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVHD/MSFT_xVHD.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVHD/MSFT_xVHD.psm1 new file mode 100644 index 0000000..f1e769c --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVHD/MSFT_xVHD.psm1 @@ -0,0 +1,381 @@ +<# +.SYNOPSIS + Gets MSFT_xVHD resource current state. + +.PARAMETER Name + The desired VHD file name. + +.PARAMETER Path + The desired Path where the VHD will be created. + +.PARAMETER Generation + Virtual disk format. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $Path, + + [Parameter()] + [ValidateSet("Vhd","Vhdx")] + [String] + $Generation = "Vhd" + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if (!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw 'Please ensure that Hyper-V role is installed with its PowerShell module' + } + + # Construct the full path for the vhdFile + $vhdName = GetNameWithExtension -Name $Name -Generation $Generation + $vhdFilePath = Join-Path -Path $Path -ChildPath $vhdName + Write-Verbose -Message "Vhd full path is $vhdFilePath" + + $vhd = Get-VHD -Path $vhdFilePath -ErrorAction SilentlyContinue + + $ensure = 'Absent' + if ($vhd) + { + $ensure = 'Present' + } + + @{ + Name = $Name + Path = $Path + ParentPath = $vhd.ParentPath + Generation = $vhd.VhdFormat + Ensure = $ensure + ID = $vhd.DiskIdentifier + Type = $vhd.VhdType + FileSizeBytes = $vhd.FileSize + MaximumSizeBytes = $vhd.Size + IsAttached = $vhd.Attached + } +} + +<# +.SYNOPSIS + Configures MSFT_xVHD resource state. + +.PARAMETER Name + The desired VHD file name. + +.PARAMETER Path + The desired Path where the VHD will be created. + +.PARAMETER ParentPath + Parent VHD file path, for differencing disk. + +.PARAMETER MaximumSizeBytes + Maximum size of VHD to be created. + +.PARAMETER Type + Virtual disk type. + +.PARAMETER Generation + Virtual disk format. + +.PARAMETER Ensure + Ensures that the VHD is Present or Absent. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $Path, + + [Parameter()] + [String] + $ParentPath, + + [Parameter()] + [Uint64] + $MaximumSizeBytes, + + [Parameter()] + [ValidateSet('Dynamic', 'Fixed', 'Differencing')] + [String] + $Type = 'Dynamic', + + [Parameter()] + [ValidateSet('Vhd', 'Vhdx')] + [String] + $Generation = 'Vhd', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present' + ) + + # Construct the full path for the vhdFile + $vhdName = GetNameWithExtension -Name $Name -Generation $Generation + $vhdFilePath = Join-Path -Path $Path -ChildPath $vhdName + Write-Verbose -Message "Vhd full path is $vhdFilePath" + + Write-Verbose -Message "Checking if $vhdFilePath is $Ensure ..." + + # If vhd should be absent, delete it + if ($Ensure -eq 'Absent') + { + if (Test-Path -Path $vhdFilePath) + { + Write-Verbose -Message "$vhdFilePath is not $Ensure" + Remove-Item -Path $vhdFilePath -Force -ErrorAction Stop + } + Write-Verbose -Message "$vhdFilePath is $Ensure" + } + + else + { + # Check if the Vhd is present + try + { + $vhd = Get-VHD -Path $vhdFilePath -ErrorAction Stop + + # If this is a differencing disk, check the parent path + if ($ParentPath) + { + Write-Verbose -Message "Checking if $vhdFilePath parent path is $ParentPath ..." + + # If the parent path is not set correct, fix it + if ($vhd.ParentPath -ne $ParentPath) + { + Write-Verbose -Message "$vhdFilePath parent path is not $ParentPath." + Set-VHD -Path $vhdFilePath -ParentPath $ParentPath + Write-Verbose -Message "$vhdFilePath parent path is now $ParentPath." + } + else + { + Write-Verbose -Message "$vhdFilePath is $Ensure and parent path is set to $ParentPath." + } + } + + # This is a fixed disk, check the size + elseif ($PSBoundParameters.ContainsKey('MaximumSizeBytes')) + { + Write-Verbose -Message "Checking if $vhdFilePath size is $MaximumSizeBytes ..." + + # If the size is not correct, fix it + if ($vhd.Size -ne $MaximumSizeBytes) + { + Write-Verbose -Message "$vhdFilePath size is not $MaximumSizeBytes." + Resize-VHD -Path $vhdFilePath -SizeBytes $MaximumSizeBytes + Write-Verbose -Message "$vhdFilePath size is now $MaximumSizeBytes." + } + else + { + Write-Verbose -Message "$vhdFilePath is $Ensure and size is $MaximumSizeBytes." + } + } + + if ($vhd.Type -ne $Type) + { + Write-Verbose -Message 'This module can''t convert disk types' + } + } + + # Vhd file is not present + catch + { + Write-Verbose -Message "$vhdFilePath is not $Ensure" + if ($ParentPath) + { + $null = New-VHD -Path $vhdFilePath -ParentPath $ParentPath + } + else + { + $params = @{ + Path = $vhdFilePath + SizeBytes = $MaximumSizeBytes + $Type = $True + } + $null = New-VHD @params + } + + Write-Verbose -Message "$vhdFilePath is now $Ensure" + } + } +} + +<# +.SYNOPSIS + Tests if MSFT_xVHD resource state is in the desired state or not. + +.PARAMETER Name + The desired VHD file name. + +.PARAMETER Path + The desired Path where the VHD will be created. + +.PARAMETER ParentPath + Parent VHD file path, for differencing disk. + +.PARAMETER MaximumSizeBytes + Maximum size of VHD to be created. + +.PARAMETER Type + Virtual disk type. + +.PARAMETER Generation + Virtual disk format. + +.PARAMETER Ensure + Ensures that the VHD is Present or Absent. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $Path, + + [Parameter()] + [String] + $ParentPath, + + [Parameter()] + [Uint64] + $MaximumSizeBytes, + + [Parameter()] + [ValidateSet('Vhd', 'Vhdx')] + [String] + $Generation = 'Vhd', + + [Parameter()] + [ValidateSet('Dynamic', 'Fixed', 'Differencing')] + [String] + $Type = 'Dynamic', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present' + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if (!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw "Please ensure that Hyper-V role is installed with its PowerShell module" + } + + # input validation + if ($Type -ne 'Differencing' -and -not $MaximumSizeBytes) + { + Throw 'Specify MaximumSizeBytes property for Fixed and Dynamic VHDs.' + } + + if ($ParentPath -and $Type -ne 'Differencing') + { + Throw 'Parent path is only supported for Differencing disks' + } + + if (-not $ParentPath -and $Type -eq 'Differencing') + { + Throw 'Differencing requires a parent path' + } + + if ($ParentPath) + { + if (!(Test-Path -Path $ParentPath)) + { + Throw "$ParentPath does not exists" + } + + # Check if the generation matches parenting disk + if ($Generation -and ($ParentPath.Split('.')[-1] -ne $Generation)) + { + Throw "Generation $Generation should match ParentPath extension $($ParentPath.Split('.')[-1])" + } + } + + if (!(Test-Path -Path $Path)) + { + Throw "$Path does not exists" + } + + # Construct the full path for the vhdFile + $vhdName = GetNameWithExtension -Name $Name -Generation $Generation + $vhdFilePath = Join-Path -Path $Path -ChildPath $vhdName + Write-Verbose -Message "Vhd full path is $vhdFilePath" + + # Add the logic here and at the end return either $true or $false. + $result = Test-VHD -Path $vhdFilePath -ErrorAction SilentlyContinue + Write-Verbose -Message "Vhd $vhdFilePath is present:$result and Ensure is $Ensure" + return ($result -and ($Ensure -eq "Present")) +} + +<# +.SYNOPSIS + Appends generation appropriate file extension if not already specified. + +.PARAMETER Name + The desired VHD file name. + +.PARAMETER Generation + Virtual disk format. +#> +function GetNameWithExtension +{ + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $Generation = 'Vhd' + ) + + # If the name ends with vhd or vhdx don't append the generation to the vhdname. + if ($Name -like '*.vhd' -or $Name -like '*.vhdx') + { + $extension = $Name.Split('.')[-1] + if ($Generation -ne $extension) + { + throw "the extension $extension on the name does not match the generation $Generation" + } + else + { + Write-Verbose -Message "Vhd full name is $vhdName" + $vhdName = $Name + } + } + else + { + # Append generation to the name + $vhdName = "$Name.$Generation" + Write-Verbose -Message "Vhd full name is $vhdName" + } + + $vhdName +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVHD/MSFT_xVHD.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVHD/MSFT_xVHD.schema.mof new file mode 100644 index 0000000..f41e9d2 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVHD/MSFT_xVHD.schema.mof @@ -0,0 +1,15 @@ +[ClassVersion("1.0.0"), FriendlyName("xVHD")] +class MSFT_xVHD : OMI_BaseResource +{ + [Key, Description("Name of the VHD File")] String Name; + [Key, Description("Folder where the VHD will be created")] String Path; + [Write, Description("Parent VHD file path, for differencing disk")] String ParentPath; + [Write, Description("Maximum size of Vhd to be created")] Uint64 MaximumSizeBytes; + [Write, Description("Virtual disk format - Vhd or Vhdx"), ValueMap{"Vhd","Vhdx"}, Values{"Vhd","Vhdx"}] String Generation; + [Write, Description("Should the VHD be created or deleted"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Read, Description("Virtual Disk Identifier")] String ID; + [Write, Description("Type of Vhd - Dynamic, Fixed, Differencing"), ValueMap{"Dynamic","Fixed","Differencing"}, Values{"Dynamic","Fixed","Differencing"}] String Type; + [Read, Description("Current size of the VHD")] Uint64 FileSizeBytes; + [Read, Description("Is the VHD attached to a VM or not")] Boolean IsAttached; +}; + diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.psm1 new file mode 100644 index 0000000..fd7e010 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.psm1 @@ -0,0 +1,437 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename MSFT_xVMDvdDrive.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + #fallback to en-US + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename MSFT_xVMDvdDrive.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +# Import the common HyperV functions +Import-Module -Name ( Join-Path ` + -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath '\HyperVCommon\HyperVCommon.psm1' ) + +<# + .SYNOPSIS + Returns the current status of the VM DVD Drive. + + .PARAMETER VMName + Specifies the name of the virtual machine to which the DVD drive is to be added. + + .PARAMETER ControllerNumber + Specifies the number of the controller to which the DVD drive is to be added. + + .PARAMETER ControllerLocation + Specifies the number of the location on the controller at which the DVD drive is to be added. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $VMName, + + [parameter(Mandatory = $true)] + [System.Uint32] + $ControllerNumber, + + [parameter(Mandatory = $true)] + [System.Uint32] + $ControllerLocation + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.GettingVMDVDDriveMessage ` + -f $VMName,$ControllerNumber,$ControllerLocation) + ) -join '' ) + + Test-ParameterValid @PSBoundParameters + + $dvdDrive = Get-VMDvdDrive @PSBoundParameters + + if ($dvdDrive) + { + $returnValue = @{ + VMName = $VMName + ControllerLocation = $ControllerLocation + ControllerNumber = $ControllerNumber + Path = $dvdDrive.Path + Ensure = 'Present' + } + } + else + { + $returnValue = @{ + VMName = $VMName + ControllerLocation = $ControllerLocation + ControllerNumber = $ControllerNumber + Path = '' + Ensure = 'Absent' + } + } # if + + $returnValue +} # Get-TargetResource + +<# + .SYNOPSIS + Adds, removes or changes the mounted ISO on a VM DVD Drive. + + .PARAMETER VMName + Specifies the name of the virtual machine to which the DVD drive is to be added. + + .PARAMETER ControllerNumber + Specifies the number of the controller to which the DVD drive is to be added. + + .PARAMETER ControllerLocation + Specifies the number of the location on the controller at which the DVD drive is to be added. + + .PARAMETER Path + Specifies the full path to the virtual hard disk file or physical hard disk volume for the + added DVD drive. + + .PARAMETER Ensure + Specifies if the DVD Drive should exist or not. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $VMName, + + [parameter(Mandatory = $true)] + [System.Uint32] + $ControllerLocation, + + [parameter(Mandatory = $true)] + [System.Uint32] + $ControllerNumber, + + [System.String] + $Path, + + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.SettingVMDVDDriveMessage ` + -f $VMName,$ControllerNumber,$ControllerLocation) + ) -join '' ) + + $null = $PSBoundParameters.Remove('Path') + $null = $PSBoundParameters.Remove('Ensure') + + # Get the current status of the VM DVD Drive + $dvdDrive = Get-TargetResource @PSBoundParameters + + if ($Ensure -eq 'Present') + { + # The DVD Drive should exist + if ($dvdDrive.Ensure -eq 'Present') + { + # The DVD Drive already exists + if (-not [String]::IsNullOrWhiteSpace($Path) ` + -and ($Path -ne $dvdDrive.Path)) + { + # The current path assigned to the DVD Drive needs to be changed. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.VMDVDDriveChangePathMessage) ` + -f $VMName,$ControllerNumber,$ControllerLocation,$Path ` + ) -join '' ) + + Set-VMDvdDrive @PSBoundParameters -Path $Path + } + } + else + { + # The DVD Drive does not exist but should. Change required. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.VMDVDDriveAddMessage) ` + -f $VMName,$ControllerNumber,$ControllerLocation,$Path ` + ) -join '' ) + + if (-not [String]::IsNullOrWhiteSpace($Path)) { + $PSBoundParameters.Add('Path',$Path) + } # if + + Add-VMDvdDrive @PSBoundParameters + } # if + } + else + { + # The DVD Drive should not exist + if ($dvdDrive.Ensure -eq 'Present') + { + # The DVD Drive does exist, but should not. Change required. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.VMDVDDriveRemoveMessage) ` + -f $VMName,$ControllerNumber,$ControllerLocation ` + ) -join '' ) + + Remove-VMDvdDrive @PSBoundParameters + } # if + } # if +} # Set-TargetResource + +<# + .SYNOPSIS + Tests the state of a VM DVD Drive and the mounted ISO. + + .PARAMETER VMName + Specifies the name of the virtual machine to which the DVD drive is to be added. + + .PARAMETER ControllerNumber + Specifies the number of the controller to which the DVD drive is to be added. + + .PARAMETER ControllerLocation + Specifies the number of the location on the controller at which the DVD drive is to be added. + + .PARAMETER Path + Specifies the full path to the virtual hard disk file or physical hard disk volume for the + added DVD drive. + + .PARAMETER Ensure + Specifies if the DVD Drive should exist or not. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $VMName, + + [parameter(Mandatory = $true)] + [System.Uint32] + $ControllerLocation, + + [parameter(Mandatory = $true)] + [System.Uint32] + $ControllerNumber, + + [System.String] + $Path, + + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.TestingVMDVDDriveMessage ` + -f $VMName,$ControllerNumber,$ControllerLocation) + ) -join '' ) + + $null = $PSBoundParameters.Remove('Path') + $null = $PSBoundParameters.Remove('Ensure') + + # Get the current status of the VM DVD Drive + $dvdDrive = Get-TargetResource @PSBoundParameters + + # Flag to signal whether settings are correct + [Boolean] $desiredConfigurationMatch = $true + + if ($Ensure -eq 'Present') + { + # The DVD Drive should exist + if ($dvdDrive.Ensure -eq 'Present') + { + # The DVD Drive already exists + if (-not [String]::IsNullOrWhiteSpace($Path) ` + -and ($Path -ne $dvdDrive.Path)) + { + # The current path assigned to the DVD drive is wrong. Change required. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.VMDVDDriveExistsAndShouldPathMismatchMessage) ` + -f $VMName,$ControllerNumber,$ControllerLocation,$Path,$dvdDrive.Path ` + ) -join '' ) + + $desiredConfigurationMatch = $false + } + else + { + # The DVD drive exists and should. Change not required. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.VMDVDDriveExistsAndShouldMessage) ` + -f $VMName,$ControllerNumber,$ControllerLocation,$Path ` + ) -join '' ) + } # if + } + else + { + # The DVD Drive does not exist but should. Change required. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.VMDVDDriveDoesNotExistButShouldMessage) ` + -f $VMName,$ControllerNumber,$ControllerLocation ` + ) -join '' ) + + $desiredConfigurationMatch = $false + } # if + } + else + { + # The DVD Drive should not exist + if ($dvdDrive.Ensure -eq 'Present') + { + # The DVD Drive does exist, but should not. Change required. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.VMDVDDriveDoesExistButShouldNotMessage) ` + -f $VMName,$ControllerNumber,$ControllerLocation ` + ) -join '' ) + + $desiredConfigurationMatch = $false + } + else + { + # The DVD Drive does not exist and should not. Change not required. + Write-Verbose -Message ( @( + "$($MyInvocation.MyCommand): " + $($LocalizedData.VMDVDDriveDoesNotExistAndShouldNotMessage) ` + -f $VMName,$ControllerNumber,$ControllerLocation ` + ) -join '' ) + } # if + } # if + + return $desiredConfigurationMatch +} # Test-TargetResource + +<# + .SYNOPSIS + Validates that the parameters passed are valid. If the parameter combination + is invalid then an exception will be thrown. The following items are validated: + - The VM exists. + - A disk mount point at the controller number/location exists. + - A hard disk is not already mounted at the controller number/location. + - The Path if required is valid. + + .PARAMETER VMName + Specifies the name of the virtual machine to which the DVD drive is to be added. + + .PARAMETER ControllerNumber + Specifies the number of the controller to which the DVD drive is to be added. + + .PARAMETER ControllerLocation + Specifies the number of the location on the controller at which the DVD drive is to be added. + + .PARAMETER Path + Specifies the full path to the virtual hard disk file or physical hard disk volume for the + added DVD drive. + + .PARAMETER Ensure + Specifies if the DVD Drive should exist or not. + + .OUTPUTS + Returns true if the parameters are valid, but will throw a specific error if not. +#> +function Test-ParameterValid +{ + [CmdletBinding()] + [OutputType([Boolean])] + param + ( + [parameter(Mandatory = $true)] + [System.String] + $VMName, + + [parameter(Mandatory = $true)] + [System.Uint32] + $ControllerLocation, + + [parameter(Mandatory = $true)] + [System.Uint32] + $ControllerNumber, + + [System.String] + $Path, + + [ValidateSet("Present","Absent")] + [System.String] + $Ensure = 'Present' + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if(-not (Get-Module -ListAvailable -Name Hyper-V)) + { + New-InvalidArgumentError ` + -ErrorId 'RoleMissingError' ` + -ErrorMessage ($LocalizedData.RoleMissingError -f ` + 'Hyper-V') + } # if + + # Does the VM exist? + $null = Get-VM -Name $VMName + + # Does the controller exist? + if (-not (Get-VMScsiController -VMName $VMName -ControllerNumber $ControllerNumber) ` + -and -not (Get-VMIdeController -VMName $VMName -ControllerNumber $ControllerNumber)) + { + # No it does not + New-InvalidArgumentError ` + -ErrorId 'VMControllerDoesNotExistError' ` + -ErrorMessage ($LocalizedData.VMControllerDoesNotExistError -f ` + $VMName,$ControllerNumber) + } # if + + # Is a Hard Drive assigned to this controller location/number? + if (Get-VMHardDiskDrive ` + -VMName $VMName ` + -ControllerLocation $ControllerLocation ` + -ControllerNumber $ControllerNumber) + { + # Yes, so don't even try and touch this + New-InvalidArgumentError ` + -ErrorId 'ControllerConflictError' ` + -ErrorMessage ($LocalizedData.ControllerConflictError -f ` + $VMName,$ControllerNumber,$ControllerLocation) + } # if + + if ($Ensure -eq 'Present') + { + # If the path is not blank does it exist? + if (-not ([String]::IsNullOrWhiteSpace($Path))) + { + if (-not (Test-Path -Path $Path)) + { + # Path does not exist + New-InvalidArgumentError ` + -ErrorId 'PathDoesNotExistError' ` + -ErrorMessage ($LocalizedData.PathDoesNotExistError -f ` + $Path) + } # if + } # if + } # if + + return $true +} # Test-ParameterValid + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.schema.mof new file mode 100644 index 0000000..04e3c4a --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/MSFT_xVMDvdDrive.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xVMDvdDrive")] +class MSFT_xVMDvdDrive : OMI_BaseResource +{ + [Key, Description("Specifies the name of the virtual machine to which the DVD drive is to be added.")] String VMName; + [Key, Description("Specifies the number of the controller to which the DVD drive is to be added.")] Uint32 ControllerNumber; + [Key, Description("Specifies the number of the location on the controller at which the DVD drive is to be added.")] Uint32 ControllerLocation; + [Write, Description("Specifies the full path to the virtual hard disk file or physical hard disk volume for the added DVD drive.")] String Path; + [Write, Description("Specifies if the DVD Drive should exist or not."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/en-us/MSFT_xVMDvdDrive.strings.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/en-us/MSFT_xVMDvdDrive.strings.psd1 new file mode 100644 index 0000000..2c29d24 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMDvdDrive/en-us/MSFT_xVMDvdDrive.strings.psd1 @@ -0,0 +1,20 @@ +ConvertFrom-StringData @' + GettingVMDVDDriveMessage = Getting VM DVD Drive for VM '{0}' controller number {1} location {2}. + + SettingVMDVDDriveMessage = Setting VM DVD Drive for VM '{0}' controller number {1} location {2}. + VMDVDDriveChangePathMessage = VM '{0}' DVD Drive on controller number {1} location {2} already exists, changing the Path to '{3}'. + VMDVDDriveAddMessage = Adding VM '{0}' DVD Drive on controller number {1} location {2} with path '{3}'. + VMDVDDriveRemoveMessage = Removing VM '{0}' DVD Drive on controller number {1} location {2}. + + TestingVMDVDDriveMessage = Testing VM DVD Drive for VM '{0}' controller number {1} location {2}. + VMDVDDriveExistsAndShouldPathMismatchMessage = VM '{0}' DVD Drive on controller number {1} location {2} exists and should but the desired path '{3}' does not match '{4}'. Change required. + VMDVDDriveExistsAndShouldMessage = VM '{0}' DVD Drive on controller number {1} location {2} exists and should and the path '{3}' matches. Change not required. + VMDVDDriveDoesNotExistButShouldMessage = VM '{0}' DVD Drive on controller number {1} location {2} does not exist but should. Change required. + VMDVDDriveDoesExistButShouldNotMessage = VM '{0}' DVD Drive on controller number {1} location {2} exists but should not. Change required. + VMDVDDriveDoesNotExistAndShouldNotMessage = VM '{0}' DVD Drive on controller number {1} location {2} does not exist and should not. Change not required. + + RoleMissingError = Please ensure that '{0}' role is installed with its PowerShell module. + VMControllerDoesNotExistError = The controller number {1} does not exist on VM '{0}'. + PathDoesNotExistError = The path '{0}' does not exist. + ControllerConflictError = The Controller number {1} location {2} already has a hard drive attached on VM '{0}'. +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/MSFT_xVMHardDiskDrive.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/MSFT_xVMHardDiskDrive.psm1 new file mode 100644 index 0000000..b5db636 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/MSFT_xVMHardDiskDrive.psm1 @@ -0,0 +1,273 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename MSFT_xVMHardDiskDrive.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + # fallback to en-US + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename MSFT_xVMHardDiskDrive.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +# Import the common HyperV functions +Import-Module -Name ( Join-Path ` + -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath '\HyperVCommon\HyperVCommon.psm1' ) + +<# + .SYNOPSIS + Returns the current status of the VM hard disk drive. + .PARAMETER VMName + Specifies the name of the virtual machine whose hard disk drive status is to be fetched. + .PARAMETER Path + Specifies the full path of the VHD file linked to the hard disk drive. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [System.String] + $Path + ) + + Assert-Module -Name 'Hyper-V' + + $hardDiskDrive = Get-VMHardDiskDrive -VMName $VMName -ErrorAction Stop | + Where-Object -FilterScript { $_.Path -eq $Path } + + if ($null -eq $hardDiskDrive) + { + Write-Verbose -Message ($localizedData.DiskNotFound -f $Path, $VMName) + $ensure = 'Absent' + } + else + { + Write-Verbose -Message ($localizedData.DiskFound -f $Path, $VMName) + $ensure = 'Present' + } + + return @{ + VMName = $VMName + Path = $hardDiskDrive.Path + ControllerType = $hardDiskDrive.ControllerType + ControllerNumber = $hardDiskDrive.ControllerNumber + ControllerLocation = $hardDiskDrive.ControllerLocation + Ensure = $ensure + } +} + +<# + .SYNOPSIS + Tests the state of a VM hard disk drive. + .PARAMETER VMName + Specifies the name of the virtual machine whose hard disk drive is to be tested. + .PARAMETER Path + Specifies the full path of the VHD file to be tested. + .PARAMETER ControllerType + Specifies the type of controller to which the the hard disk drive is to be set (IDE/SCSI). + Default to SCSI. + .PARAMETER ControllerNumber + Specifies the number of the controller to which the hard disk drive is to be set. + If not specified, the controller number defaults to 0. + .PARAMETER ControllerLocation + Specifies the number of the location on the controller at which the hard disk drive is to be + set. If not specified, the controller location defaults to 0. + .PARAMETER Ensure + Specifies if the hard disk drive should exist or not. Defaults to Present. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('IDE', 'SCSI')] + [System.String] + $ControllerType = 'SCSI', + + [Parameter()] + [ValidateSet(0, 1, 2, 3)] + [System.UInt32] + $ControllerNumber, + + [Parameter()] + [ValidateRange(0, 63)] + [System.UInt32] + $ControllerLocation, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $resource = Get-TargetResource -VMName $VMName -Path $Path + + # Throw exception when the ControllerNumber or ControllerLocation are out of bounds for IDE + if ($ControllerType -eq 'IDE' -and ($ControllerNumber -gt 1 -or $ControllerLocation -gt 1)) + { + $errorMessage = $localizedData.IdeLocationError -f $ControllerNumber, $ControllerLocation + New-InvalidOperationError -ErrorId 'InvalidLocation' -ErrorMessage $errorMessage + } + + $isCompliant = $true + foreach ($key in $PSBoundParameters.Keys) + { + # Only check passed parameter values + if ($resource.ContainsKey($key)) + { + Write-Verbose -Message ($localizedData.ComparingParameter -f $key, + $PSBoundParameters[$key], + $resource[$key]) + $isCompliant = $isCompliant -and ($PSBoundParameters[$key] -eq $resource[$key]) + } + } + return $isCompliant +} + +<# + .SYNOPSIS + Tests the state of a VM hard disk drive. + .PARAMETER VMName + Specifies the name of the virtual machine whose hard disk drive is to be tested. + .PARAMETER Path + Specifies the full path of the VHD file to be tested. + .PARAMETER ControllerType + Specifies the type of controller to which the the hard disk drive is to be set (IDE/SCSI). + Default to SCSI. + .PARAMETER ControllerNumber + Specifies the number of the controller to which the hard disk drive is to be set. + If not specified, the controller number defaults to 0. + .PARAMETER ControllerLocation + Specifies the number of the location on the controller at which the hard disk drive is to be + set. If not specified, the controller location defaults to 0. + .PARAMETER Ensure + Specifies if the hard disk drive should exist or not. Defaults to Present. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('IDE', 'SCSI')] + [System.String] + $ControllerType = 'SCSI', + + [Parameter()] + [ValidateSet(0, 1, 2, 3)] + [System.UInt32] + $ControllerNumber, + + [Parameter()] + [ValidateRange(0, 63)] + [System.UInt32] + $ControllerLocation, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Assert-Module -Name 'Hyper-V' + + $hardDiskDrive = Get-VMHardDiskDrive -VMName $VMName | + Where-Object -FilterScript { $_.Path -eq $Path } + + if ($Ensure -eq 'Present') + { + $null = $PSBoundParameters.Remove('Ensure') + + Write-Verbose -Message ($localizedData.CheckingDiskIsAttached) + if ($hardDiskDrive) + { + Write-Verbose -Message ($localizedData.DiskFound -f $Path, $VMName) + $null = $PSBoundParameters.Remove('VMName') + $null = $PSBoundParameters.Remove('Path') + # As the operation is a move, we must use ToController instead of Controller + if ($PSBoundParameters.ContainsKey('ControllerType')) + { + $null = $PSBoundParameters.Remove('ControllerType') + $null = $PSBoundParameters.Add('ToControllerType', $ControllerType) + } + if ($PSBoundParameters.ContainsKey('ControllerNumber')) + { + $null = $PSBoundParameters.Remove('ControllerNumber') + $null = $PSBoundParameters.Add('ToControllerNumber', $ControllerNumber) + } + if ($PSBoundParameters.ContainsKey('ControllerLocation')) + { + $null = $PSBoundParameters.Remove('ControllerLocation') + $null = $PSBoundParameters.Add('ToControllerLocation', $ControllerLocation) + } + $null = $hardDiskDrive | Set-VMHardDiskDrive @PSBoundParameters + } + else + { + Write-Verbose -Message ($localizedData.CheckingExistingDiskLocation) + $getVMHardDiskDriveParams = @{ + VMName = $VMName + ControllerType = $ControllerType + ControllerNumber = $ControllerNumber + ControllerLocation = $ControllerLocation + } + $existingHardDiskDrive = Get-VMHardDiskDrive @getVMHardDiskDriveParams + if ($null -ne $existingHardDiskDrive) + { + $errorMessage = $localizedData.DiskPresentError -f $ControllerNumber, ` + $ControllerLocation + New-InvalidOperationError -ErrorId 'ControllerNotEmpty' -ErrorMessage $errorMessage + } + + Write-Verbose -Message ($localizedData.AddingDisk -f $Path, $VMName) + $null = Add-VMHardDiskDrive @PSBoundParameters + } + } + else + { + # We must ensure that the disk is absent + if ($hardDiskDrive) + { + Write-Verbose -Message ($localizedData.RemovingDisk -f $Path, $VMName) + $null = $hardDiskDrive | Remove-VMHardDiskDrive + } + else + { + Write-Warning -Message ($localizedData.DiskNotFound -f $Path, $VMName) + } + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/MSFT_xVMHardDiskDrive.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/MSFT_xVMHardDiskDrive.schema.mof new file mode 100644 index 0000000..3375c15 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/MSFT_xVMHardDiskDrive.schema.mof @@ -0,0 +1,10 @@ +[ClassVersion("1.0.0"), FriendlyName("xVMHardDiskDrive")] +class MSFT_xVMHardDiskDrive : OMI_BaseResource +{ + [Key, Description("Specifies the name of the virtual machine whose hard disk drive is to be manipulated.")] String VMName; + [Key, Description("Specifies the full path to the location of the VHD that represents the hard disk drive.")] String Path; + [Write, Description("Specifies the controller type - IDE/SCSI where the disk is attached. If not specified, it defaults to SCSI."), ValueMap{"IDE","SCSI"}, Values{"IDE","SCSI"}] String ControllerType; + [Write, Description("Specifies the number of the controller where the disk is attached. If not specified, it defaults to 0."), ValueMap{"0","1","2","3"}, Values{"0","1","2","3"}] Uint32 ControllerNumber; + [Write, Description("Specifies the number of the location on the controller where the disk is attached. If not specified, it defaults to 0.")] Uint32 ControllerLocation; + [Write, Description("Specifies if the hard disk drive must be present or absent. If not specified, it defaults to Present."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/en-US/MSFT_xVMHardDiskDrive.strings.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/en-US/MSFT_xVMHardDiskDrive.strings.psd1 new file mode 100644 index 0000000..50a9aa4 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHardDiskDrive/en-US/MSFT_xVMHardDiskDrive.strings.psd1 @@ -0,0 +1,12 @@ +ConvertFrom-StringData @' + DiskFound = Found hard disk '{0}' attached to VM '{1}'. + DiskNotFound = Hard disk '{0}' missing from VM '{1}' + CheckingDiskIsAttached = Checking if the disk is already attached to the VM. + CheckingExistingDiskLocation = Checking if there is an existing disk in the specified location. + AddingDisk = Adding the disk '{0}' to VM '{1}'. + RemovingDisk = Removing disk '{0}' from VM '{1}'. + ComparingParameter = Comparing '{0}'; expected '{1}', actual '{2}'. + + DiskPresentError = There is already a disk present in controller '{0}', location '{1}'. + IdeLocationError = ControllerNumber '{0}' or ControllerLocation '{1}' are not valid for IDE controller. +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/MSFT_xVMHost.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/MSFT_xVMHost.psm1 new file mode 100644 index 0000000..b4c0bb3 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/MSFT_xVMHost.psm1 @@ -0,0 +1,457 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData -BindingVariable localizedData -Filename MSFT_xVMHost.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + # fallback to en-US + Import-LocalizedData -BindingVariable localizedData -Filename MSFT_xVMHost.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +# Import the common HyperV functions +Import-Module -Name ( Join-Path ` + -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath '\HyperVCommon\HyperVCommon.psm1' ) + +<# +.SYNOPSIS + Gets MSFT_xVMHost resource current state. + +.PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance + ) + + Assert-Module -Name 'Hyper-V' + + Write-Verbose -Message $localizedData.QueryingVMHost + $vmHost = Get-VMHost + + # Convert the current TimeSpan into minutes + $convertFromTimeSpanParams = @{ + TimeSpan = $vmHost.ResourceMeteringSaveInterval + TimeSpanType = 'Minutes' + } + $resourceMeteringSaveInterval = ConvertFrom-TimeSpan @convertFromTimeSpanParams + + $configuration = @{ + IsSingleInstance = $IsSingleInstance + EnableEnhancedSessionMode = $vmHost.EnableEnhancedSessionMode + FibreChannelWwnn = $vmHost.FibreChannelWwnn + FibreChannelWwpnMaximum = $vmHost.FibreChannelWwpnMaximum + FibreChannelWwpnMinimum = $vmHost.FibreChannelWwpnMinimum + MacAddressMaximum = $vmHost.MacAddressMaximum + MacAddressMinimum = $vmHost.MacAddressMinimum + MaximumStorageMigrations = $vmHost.MaximumStorageMigrations + MaximumVirtualMachineMigrations = $vmHost.MaximumVirtualMachineMigrations + NumaSpanningEnabled = $vmHost.NumaSpanningEnabled + ResourceMeteringSaveIntervalMinute = $resourceMeteringSaveInterval + UseAnyNetworkForMigration = $vmHost.UseAnyNetworkForMigration + VirtualHardDiskPath = $vmHost.VirtualHardDiskPath + VirtualMachineMigrationAuthenticationType = $vmHost.VirtualMachineMigrationAuthenticationType + VirtualMachineMigrationPerformanceOption = $vmHost.VirtualMachineMigrationPerformanceOption + VirtualMachinePath = $vmHost.VirtualMachinePath + VirtualMachineMigrationEnabled = $vmHost.VirtualMachineMigrationEnabled + } + + return $configuration +} + +<# +.SYNOPSIS + Tests if MSFT_xVMHost resource state is in the desired state or not. + +.PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + +.PARAMETER EnableEnhancedSessionMode + Indicates whether users can use enhanced mode when they connect to virtual machines on this + server by using Virtual Machine Connection. + +.PARAMETER FibreChannelWwnn + Specifies the default value of the World Wide Node Name on the Hyper-V host. + +.PARAMETER FibreChannelWwpnMaximum + Specifies the maximum value that can be used to generate World Wide Port Names on the Hyper-V + host. Use with the FibreChannelWwpnMinimum parameter to establish a range of WWPNs that the + specified Hyper-V host can assign to virtual Fibre Channel adapters. + +.PARAMETER FibreChannelWwpnMinimum + Specifies the minimum value that can be used to generate the World Wide Port Names on the + Hyper-V host. Use with the FibreChannelWwpnMaximum parameter to establish a range of WWPNs that + the specified Hyper-V host can assign to virtual Fibre Channel adapters. + +.PARAMETER MacAddressMaximum + Specifies the maximum MAC address using a valid hexadecimal value. Use with the + MacAddressMinimum parameter to establish a range of MAC addresses that the specified Hyper-V + host can assign to virtual machines configured to receive dynamic MAC addresses. + +.PARAMETER MacAddressMinimum + Specifies the minimum MAC address using a valid hexadecimal value. Use with the + MacAddressMaximum parameter to establish a range of MAC addresses that the specified Hyper-V + host can assign to virtual machines configured to receive dynamic MAC addresses. + +.PARAMETER MaximumStorageMigrations + Specifies the maximum number of storage migrations that can be performed at the same time on + the Hyper-V host. + +.PARAMETER MaximumVirtualMachineMigrations + Specifies the maximum number of live migrations that can be performed at the same time on the + Hyper-V host. + +.PARAMETER NumaSpanningEnabled + Specifies whether virtual machines on the Hyper-V host can use resources from more than one + NUMA node. + +.PARAMETER ResourceMeteringSaveIntervalMinute + Specifies how often the Hyper-V host saves the data that tracks resource usage. The range is a + minimum of 60 minutes to a maximum 1440 minutes (24 hours). + +.PARAMETER UseAnyNetworkForMigration + Specifies how networks are selected for incoming live migration traffic. If set to $True, any + available network on the host can be used for this traffic. If set to $False, incoming live + migration traffic is transmitted only on the networks specified in the MigrationNetworks + property of the host. + +.PARAMETER VirtualHardDiskPath + Specifies the default folder to store virtual hard disks on the Hyper-V host. + +.PARAMETER VirtualMachineMigrationAuthenticationType + Specifies the type of authentication to be used for live migrations. The acceptable values for + this parameter are 'Kerberos' and 'CredSSP'. + +.PARAMETER VirtualMachineMigrationPerformanceOption + Specifies the performance option to use for live migration. The acceptable values for this + parameter are 'TCPIP', 'Compression' and 'SMB'. + +.PARAMETER VirtualMachinePath + Specifies the default folder to store virtual machine configuration files on the Hyper-V host. + +.PARAMETER VirtualMachineMigrationEnabled + Indicates whether Live Migration should be enabled or disabled on the Hyper-V host. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.Boolean] + $EnableEnhancedSessionMode, + + [Parameter()] + [System.String] + $FibreChannelWwnn, + + [Parameter()] + [System.String] + $FibreChannelWwpnMaximum, + + [Parameter()] + [System.String] + $FibreChannelWwpnMinimum, + + [Parameter()] + [System.String] + $MacAddressMaximum, + + [Parameter()] + [System.String] + $MacAddressMinimum, + + [Parameter()] + [System.UInt32] + $MaximumStorageMigrations, + + [Parameter()] + [System.UInt32] + $MaximumVirtualMachineMigrations, + + [Parameter()] + [System.Boolean] + $NumaSpanningEnabled, + + [Parameter()] + [System.UInt32] + $ResourceMeteringSaveIntervalMinute, + + [Parameter()] + [System.Boolean] + $UseAnyNetworkForMigration, + + [Parameter()] + [System.String] + $VirtualHardDiskPath, + + [Parameter()] + [ValidateSet('Kerberos', 'CredSSP')] + [System.String] + $VirtualMachineMigrationAuthenticationType, + + [Parameter()] + [ValidateSet('TCPIP', 'Compression', 'SMB')] + [System.String] + $VirtualMachineMigrationPerformanceOption, + + [Parameter()] + [System.String] + $VirtualMachinePath, + + [Parameter()] + [System.Boolean] + $VirtualMachineMigrationEnabled + ) + + Assert-Module -Name 'Hyper-V' + + $targetResource = Get-TargetResource -IsSingleInstance $IsSingleInstance + $isTargetResourceCompliant = $true + + foreach ($parameter in $PSBoundParameters.GetEnumerator()) + { + if (($targetResource.ContainsKey($parameter.Key)) -and + ($parameter.Value -ne $targetResource[$parameter.Key])) + { + $isTargetResourceCompliant = $false + Write-Verbose -Message ($localizedData.PropertyMismatch -f $parameter.Key, + $parameter.Value, $targetResource[$parameter.Key]) + } + } + + if ($isTargetResourceCompliant) + { + Write-Verbose -Message $localizedData.VMHostInDesiredState + } + else + { + Write-Verbose -Message $localizedData.VMHostNotInDesiredState + } + + return $isTargetResourceCompliant +} #end function + +<# +.SYNOPSIS + Configures MSFT_xVMHost resource state. + +.PARAMETER IsSingleInstance + Specifies the resource is a single instance, the value must be 'Yes'. + +.PARAMETER EnableEnhancedSessionMode + Indicates whether users can use enhanced mode when they connect to virtual machines on this + server by using Virtual Machine Connection. + +.PARAMETER FibreChannelWwnn + Specifies the default value of the World Wide Node Name on the Hyper-V host. + +.PARAMETER FibreChannelWwpnMaximum + Specifies the maximum value that can be used to generate World Wide Port Names on the Hyper-V + host. Use with the FibreChannelWwpnMinimum parameter to establish a range of WWPNs that the + specified Hyper-V host can assign to virtual Fibre Channel adapters. + +.PARAMETER FibreChannelWwpnMinimum + Specifies the minimum value that can be used to generate the World Wide Port Names on the + Hyper-V host. Use with the FibreChannelWwpnMaximum parameter to establish a range of WWPNs that + the specified Hyper-V host can assign to virtual Fibre Channel adapters. + +.PARAMETER MacAddressMaximum + Specifies the maximum MAC address using a valid hexadecimal value. Use with the + MacAddressMinimum parameter to establish a range of MAC addresses that the specified Hyper-V + host can assign to virtual machines configured to receive dynamic MAC addresses. + +.PARAMETER MacAddressMinimum + Specifies the minimum MAC address using a valid hexadecimal value. Use with the + MacAddressMaximum parameter to establish a range of MAC addresses that the specified Hyper-V + host can assign to virtual machines configured to receive dynamic MAC addresses. + +.PARAMETER MaximumStorageMigrations + Specifies the maximum number of storage migrations that can be performed at the same time on + the Hyper-V host. + +.PARAMETER MaximumVirtualMachineMigrations + Specifies the maximum number of live migrations that can be performed at the same time on the + Hyper-V host. + +.PARAMETER NumaSpanningEnabled + Specifies whether virtual machines on the Hyper-V host can use resources from more than one + NUMA node. + +.PARAMETER ResourceMeteringSaveIntervalMinute + Specifies how often the Hyper-V host saves the data that tracks resource usage. The range is a + minimum of 60 minutes to a maximum 1440 minutes (24 hours). + +.PARAMETER UseAnyNetworkForMigration + Specifies how networks are selected for incoming live migration traffic. If set to $True, any + available network on the host can be used for this traffic. If set to $False, incoming live + migration traffic is transmitted only on the networks specified in the MigrationNetworks + property of the host. + +.PARAMETER VirtualHardDiskPath + Specifies the default folder to store virtual hard disks on the Hyper-V host. + +.PARAMETER VirtualMachineMigrationAuthenticationType + Specifies the type of authentication to be used for live migrations. The acceptable values for + this parameter are 'Kerberos' and 'CredSSP'. + +.PARAMETER VirtualMachineMigrationPerformanceOption + Specifies the performance option to use for live migration. The acceptable values for this + parameter are 'TCPIP', 'Compression' and 'SMB'. + +.PARAMETER VirtualMachinePath + Specifies the default folder to store virtual machine configuration files on the Hyper-V host. + +.PARAMETER VirtualMachineMigrationEnabled + Indicates whether Live Migration should be enabled or disabled on the Hyper-V host. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Yes')] + [System.String] + $IsSingleInstance, + + [Parameter()] + [System.Boolean] + $EnableEnhancedSessionMode, + + [Parameter()] + [System.String] + $FibreChannelWwnn, + + [Parameter()] + [System.String] + $FibreChannelWwpnMaximum, + + [Parameter()] + [System.String] + $FibreChannelWwpnMinimum, + + [Parameter()] + [System.String] + $MacAddressMaximum, + + [Parameter()] + [System.String] + $MacAddressMinimum, + + [Parameter()] + [System.UInt32] + $MaximumStorageMigrations, + + [Parameter()] + [System.UInt32] + $MaximumVirtualMachineMigrations, + + [Parameter()] + [System.Boolean] + $NumaSpanningEnabled, + + [Parameter()] + [System.UInt32] + $ResourceMeteringSaveIntervalMinute, + + [Parameter()] + [System.Boolean] + $UseAnyNetworkForMigration, + + [Parameter()] + [System.String] + $VirtualHardDiskPath, + + [Parameter()] + [ValidateSet('Kerberos', 'CredSSP')] + [System.String] + $VirtualMachineMigrationAuthenticationType, + + [Parameter()] + [ValidateSet('TCPIP', 'Compression', 'SMB')] + [System.String] + $VirtualMachineMigrationPerformanceOption, + + [Parameter()] + [System.String] + $VirtualMachinePath, + + [Parameter()] + [System.Boolean] + $VirtualMachineMigrationEnabled + ) + + Assert-Module -Name 'Hyper-V' + + $null = $PSBoundParameters.Remove('IsSingleInstance') + + if ($PSBoundParameters.ContainsKey('ResourceMeteringSaveIntervalMinute')) + { + # Need to convert the specified minutes into a TimeSpan object first + $convertToTimeSpanParams = @{ + TimeInterval = $PSBoundParameters['ResourceMeteringSaveIntervalMinute'] + TimeIntervalType = 'Minutes' + } + $resourceMeteringSaveInterval = ConvertTo-TimeSpan @convertToTimeSpanParams + + # Remove the existing UInt32 explicit type and add the TimeSpan type parameter + $null = $PSBoundParameters.Remove('ResourceMeteringSaveIntervalMinute') + $PSBoundParameters['ResourceMeteringSaveInterval'] = $resourceMeteringSaveInterval + } + + if ($PSBoundParameters.ContainsKey('VirtualMachineMigrationEnabled')) + { + $null = $PSBoundParameters.Remove('VirtualMachineMigrationEnabled') + + if ($VirtualMachineMigrationEnabled) + { + if ((Get-CimInstance -ClassName Win32_ComputerSystem).PartOfDomain) + { + Write-Verbose -Message $localizedData.EnableLiveMigration + Enable-VMMigration + } + else + { + New-InvalidOperationError -ErrorId InvalidState -ErrorMessage $localizedData.LiveMigrationDomainOnly + } + } + else + { + Write-Verbose -Message $localizedData.DisableLiveMigration + Disable-VMMigration + } + } + + $vmHostParams = $PSBoundParameters.GetEnumerator() | Where-Object -FilterScript { + $_.Key -notin ( + [System.Management.Automation.PSCmdlet]::CommonParameters + + [System.Management.Automation.PSCmdlet]::OptionalCommonParameters + ) + } + + if ($vmHostParams.Count -ne 0) + { + Write-Verbose -Message $localizedData.UpdatingVMHostProperties + Set-VMHost @PSBoundParameters + Write-Verbose -Message $localizedData.VMHostPropertiesUpdated + } +} #end function diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/MSFT_xVMHost.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/MSFT_xVMHost.schema.mof new file mode 100644 index 0000000..12be0e8 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/MSFT_xVMHost.schema.mof @@ -0,0 +1,21 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xVMHost")] +class MSFT_xVMHost : OMI_BaseResource +{ + [Key, Description("Specifies the resource is a single instance, the value must be 'Yes'."), ValueMap{"Yes"}, Values{"Yes"}] String IsSingleInstance; + [Write, Description("Indicates whether users can use enhanced mode when they connect to virtual machines on this server by using Virtual Machine Connection.")] Boolean EnableEnhancedSessionMode; + [Write, Description("Specifies the default value of the World Wide Node Name on the Hyper-V host.")] String FibreChannelWwnn; + [Write, Description("Specifies the maximum value that can be used to generate World Wide Port Names on the Hyper-V host.")] String FibreChannelWwpnMaximum; + [Write, Description("Specifies the minimum value that can be used to generate the World Wide Port Names on the Hyper-V host.")] String FibreChannelWwpnMinimum; + [Write, Description("Specifies the maximum MAC address using a valid hexadecimal value.")] String MacAddressMaximum; + [Write, Description("Specifies the minimum MAC address using a valid hexadecimal value.")] String MacAddressMinimum; + [Write, Description("Specifies the maximum number of storage migrations that can be performed at the same time on the Hyper-V host.")] Uint32 MaximumStorageMigrations; + [Write, Description("Specifies the maximum number of live migrations that can be performed at the same time on the Hyper-V host.")] Uint32 MaximumVirtualMachineMigrations; + [Write, Description("Specifies whether virtual machines on the Hyper-V host can use resources from more than one NUMA node.")] Boolean NumaSpanningEnabled; + [Write, Description("Specifies how often the Hyper-V host saves the data that tracks resource usage. The range is a minimum of 60 minutes to a maximum of 1440 (24 hours).")] Uint32 ResourceMeteringSaveIntervalMinute; + [Write, Description("Specifies how networks are selected for incoming live migration traffic.")] Boolean UseAnyNetworkForMigration; + [Write, Description("Specifies the default folder to store virtual hard disks on the Hyper-V host.")] String VirtualHardDiskPath; + [Write, Description("Specifies the type of authentication to be used for live migrations. The acceptable values for this parameter are 'Kerberos' and 'CredSSP'."), ValueMap{"CredSSP","Kerberos"}, Values{"CredSSP","Kerberos"}] String VirtualMachineMigrationAuthenticationType; + [Write, Description("Specifies the performance option to use for live migration. The acceptable values for this parameter are 'TCPIP', 'Compression' and 'SMB'."), ValueMap{"TCPIP","Compression","SMB"}, Values{"TCPIP","Compression","SMB"}] String VirtualMachineMigrationPerformanceOption; + [Write, Description("Specifies the default folder to store virtual machine configuration files on the Hyper-V host.")] String VirtualMachinePath; + [Write, Description("Indicates whether Live Migration should be enabled or disabled on the Hyper-V host.")] Boolean VirtualMachineMigrationEnabled; +}; diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/en-US/MSFT_xVMHost.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/en-US/MSFT_xVMHost.psd1 new file mode 100644 index 0000000..3e25077 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHost/en-US/MSFT_xVMHost.psd1 @@ -0,0 +1,11 @@ +ConvertFrom-StringData @' + QueryingVMHost = Querying VM host configuration. + PropertyMismatch = Property '{0}' mismatch; expected value '{1}', but was '{2}'. + VMHostInDesiredState = VM host in desired state. + VMHostNotInDesiredState = VM host not in desired state. + UpdatingVMHostProperties = Updating VM host properties. + VMHostPropertiesUpdated = VM host properties have been updated. + EnableLiveMigration = Enabling VM Live Migration. + DisableLiveMigration = Disabling VM Live Migration. + LiveMigrationDomainOnly = Enabling VM Live Migration requires the computer to be joined to an Active Directory domain. +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/MSFT_xVMHyperV.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/MSFT_xVMHyperV.psm1 new file mode 100644 index 0000000..2b32f64 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/MSFT_xVMHyperV.psm1 @@ -0,0 +1,988 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData -BindingVariable localizedData -Filename MSFT_xVMHyperV.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + # fallback to en-US + Import-LocalizedData -BindingVariable localizedData -Filename MSFT_xVMHyperV.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +# Import the common HyperV functions +Import-Module -Name ( Join-Path ` + -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath '\HyperVCommon\HyperVCommon.psm1' ) + +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.String] + $VhdPath + ) + + Write-Verbose -Message ($localizedData.QueryingVM -f $Name) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if (!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw ($localizedData.RoleMissingError -f 'Hyper-V') + } + + $vmobj = Get-VM -Name $Name -ErrorAction SilentlyContinue + + # Check if 1 or 0 VM with name = $name exist + if ($vmobj.count -gt 1) + { + Throw ($localizedData.MoreThanOneVMExistsError -f $Name) + } + + <# + Retrieve the Vhd hierarchy to ensure we enumerate snapshots/differencing disks + Fixes #28 + #> + if ($null -ne $vmobj) + { + $vhdChain = @(Get-VhdHierarchy -VhdPath ($vmObj.HardDrives[0].Path)) + } + + $vmSecureBootState = $false + if ($vmobj.Generation -eq 2) + { + # Retrieve secure boot status (can only be enabled on Generation 2 VMs) and convert to a boolean. + $vmSecureBootState = ($vmobj | Get-VMFirmware).SecureBoot -eq 'On' + } + + $guestServiceId = 'Microsoft:{0}\6C09BB55-D683-4DA0-8931-C9BF705F6480' -f $vmObj.Id + + $macAddress = @() + $switchName = @() + $ipAddress = @() + + foreach ($networkAdapter in $vmobj.NetworkAdapters) + { + $macAddress += $networkAdapter.MacAddress + + if (-Not ([string]::IsNullOrEmpty($networkAdapter.SwitchName))) + { + $switchName += $networkAdapter.SwitchName + } + + if ($networkAdapter.IPAddresses.Count -ge 1) + { + $ipAddress += $networkAdapter.IPAddresses + } + } + + @{ + Name = $Name + # Return the Vhd specified if it exists in the Vhd chain + VhdPath = if ($vhdChain -contains $VhdPath) { $VhdPath } else { $null } + SwitchName = $switchName + State = $vmobj.State + Path = $vmobj.Path + Generation = $vmobj.Generation + SecureBoot = $vmSecureBootState + StartupMemory = $vmobj.MemoryStartup + MinimumMemory = $vmobj.MemoryMinimum + MaximumMemory = $vmobj.MemoryMaximum + MACAddress = $macAddress + ProcessorCount = $vmobj.ProcessorCount + Ensure = if ($vmobj) { 'Present'} else { 'Absent' } + ID = $vmobj.Id + Status = $vmobj.Status + CPUUsage = $vmobj.CPUUsage + MemoryAssigned = $vmobj.MemoryAssigned + Uptime = $vmobj.Uptime + CreationTime = $vmobj.CreationTime + HasDynamicMemory = $vmobj.DynamicMemoryEnabled + NetworkAdapters = $ipAddress + EnableGuestService = ($vmobj | Get-VMIntegrationService | Where-Object -FilterScript {$_.Id -eq $guestServiceId}).Enabled + AutomaticCheckpointsEnabled = $vmobj.AutomaticCheckpointsEnabled + } +} + +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + # Name of the VM + [Parameter(Mandatory = $true)] + [String] + $Name, + + # VHD associated with the VM + [Parameter(Mandatory = $true)] + [String] + $VhdPath, + + # Virtual switch associated with the VM + [Parameter()] + [String[]] + $SwitchName, + + # State of the VM + [Parameter()] + [ValidateSet('Running', 'Paused', 'Off')] + [String] + $State, + + # Folder where the VM data will be stored + [Parameter()] + [String] + $Path, + + # Virtual machine generation + [Parameter()] + [ValidateRange(1, 2)] + [UInt32] + $Generation = 1, + + # Startup RAM for the VM + [Parameter()] + [ValidateRange(32MB, 65536MB)] + [UInt64] + $StartupMemory, + + # Minimum RAM for the VM. This enables dynamic memory + [Parameter()] + [ValidateRange(32MB, 65536MB)] + [UInt64] + $MinimumMemory, + + # Maximum RAM for the VM. This enables dynamic memory + [Parameter()] + [ValidateRange(32MB, 1048576MB)] + [UInt64] + $MaximumMemory, + + # MAC address of the VM + [Parameter()] + [String[]] + $MACAddress, + + # Processor count for the VM + [Parameter()] + [UInt32] + $ProcessorCount, + + # Waits for VM to get valid IP address + [Parameter()] + [Boolean] + $WaitForIP, + + # If specified, shutdowns and restarts the VM as needed for property changes + [Parameter()] + [Boolean] + $RestartIfNeeded, + + # Should the VM be created or deleted + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Notes, + + # Enable secure boot for Generation 2 VMs + [Parameter()] + [Boolean] + $SecureBoot = $true, + + # Enable Guest Services + [Parameter()] + [Boolean] + $EnableGuestService = $false, + + # Enable AutomaticCheckpoints + [Parameter()] + [Boolean] + $AutomaticCheckpointsEnabled + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if (!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw ($localizedData.RoleMissingError -f 'Hyper-V') + } + + # Check if AutomaticCheckpointsEnabled is set in configuration + if ($PSBoundParameters.ContainsKey('AutomaticCheckpointsEnabled')) + { + <# + Check if AutomaticCheckpoints are supported + If AutomaticCheckpoints are supported, parameter exists on Set-VM + #> + if (-Not (Get-Command -Name Set-VM -Module Hyper-V).Parameters.ContainsKey('AutomaticCheckpointsEnabled')) + { + Throw ($localizedData.AutomaticCheckpointsUnsupported) + } + } + + Write-Verbose -Message ($localizedData.CheckingVMExists -f $Name) + $vmObj = Get-VM -Name $Name -ErrorAction SilentlyContinue + + # VM already exists + if ($vmObj) + { + Write-Verbose -Message ($localizedData.VMExists -f $Name) + + # If VM shouldn't be there, stop it and remove it + if ($Ensure -eq 'Absent') + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'Ensure', $Ensure, 'Present') + Get-VM $Name | Stop-VM -Force -Passthru -WarningAction SilentlyContinue | Remove-VM -Force + Write-Verbose -Message ($localizedData.VMPropertySet -f 'Ensure', $Ensure) + } + + <# + If VM is present, check its state, startup memory, minimum memory, maximum memory,processor count, automatic checkpoint and mac address + One cannot set the VM's vhdpath, path, generation and switchName after creation + #> + else + { + # If state has been specified and the VM is not in right state, set it to right state + if ($State -and ($vmObj.State -ne $State)) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'State', $State, $vmObj.State) + Set-VMState -Name $Name -State $State -WaitForIP $WaitForIP + Write-Verbose -Message ($localizedData.VMPropertySet -f 'State', $State) + } + + $changeProperty = @{} + # If the VM does not have the right startup memory + if ($PSBoundParameters.ContainsKey('StartupMemory') -and ($vmObj.MemoryStartup -ne $StartupMemory)) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'MemoryStartup', $StartupMemory, $vmObj.MemoryStartup) + $changeProperty['MemoryStartup'] = $StartupMemory + } + elseif ($PSBoundParameters.ContainsKey('MinimumMemory') -and ($vmObj.MemoryStartup -lt $MinimumMemory)) + { + Write-Verbose -Message ($localizedData.AdjustingLessThanMemoryWarning -f 'StartupMemory', $vmObj.MemoryStartup, 'MinimumMemory', $MinimumMemory) + $changeProperty['MemoryStartup'] = $MinimumMemory + } + elseif ($PSBoundParameters.ContainsKey('MaximumMemory') -and ($vmObj.MemoryStartup -gt $MaximumMemory)) + { + Write-Verbose -Message ($localizedData.AdjustingGreaterThanMemoryWarning -f 'StartupMemory', $vmObj.MemoryStartup, 'MaximumMemory', $MaximumMemory) + $changeProperty['MemoryStartup'] = $MaximumMemory + } + + # If the VM does not have the right minimum or maximum memory, stop the VM, set the right memory, start the VM + if ($PSBoundParameters.ContainsKey('MinimumMemory') -or $PSBoundParameters.ContainsKey('MaximumMemory')) + { + $changeProperty['DynamicMemory'] = $true + $changeProperty['StaticMemory'] = $false + + if ($PSBoundParameters.ContainsKey('MinimumMemory') -and ($vmObj.Memoryminimum -ne $MinimumMemory)) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'MinimumMemory', $MinimumMemory, $vmObj.MemoryMinimum) + $changeProperty['MemoryMinimum'] = $MinimumMemory + } + if ($PSBoundParameters.ContainsKey('MaximumMemory') -and ($vmObj.Memorymaximum -ne $MaximumMemory)) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'MaximumMemory', $MaximumMemory, $vmObj.MemoryMaximum) + $changeProperty['MemoryMaximum'] = $MaximumMemory + } + } + + # If the VM does not have the right processor count, stop the VM, set the right memory, start the VM + if ($PSBoundParameters.ContainsKey('ProcessorCount') -and ($vmObj.ProcessorCount -ne $ProcessorCount)) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'ProcessorCount', $ProcessorCount, $vmObj.ProcessorCount) + $changeProperty['ProcessorCount'] = $ProcessorCount + } + + # Stop the VM, set the right properties, start the VM only if there are properties to change + if ($changeProperty.Count -gt 0) + { + Set-VMProperty -Name $Name -VMCommand 'Set-VM' -ChangeProperty $changeProperty -WaitForIP $WaitForIP -RestartIfNeeded $RestartIfNeeded + Write-Verbose -Message ($localizedData.VMPropertiesUpdated -f $Name) + } + + <# + Special cases to disable dynamic memory: + - If startup, minimum and maximum memory are specified with equal values or + - If only startup memory is specified, but neither minimum nor maximum + #> + if ( ($PSBoundParameters.ContainsKey('StartupMemory') -and + ($StartupMemory -eq $MinimumMemory) -and + ($StartupMemory -eq $MaximumMemory) + ) -or + ( $PSBoundParameters.ContainsKey('StartupMemory') -and + (-not $PSBoundParameters.ContainsKey('MinimumMemory')) -and + (-not $PSBoundParameters.ContainsKey('MaximumMemory')) + ) + ) + { + # Refresh VM properties + $vmObj = Get-VM -Name $Name -ErrorAction SilentlyContinue + if ($vmObj.DynamicMemoryEnabled) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'DynamicMemoryEnabled', $false, $vmObj.DynamicMemoryEnabled) + $setVMPropertyParams = @{ + VMName = $Name + VMCommand = 'Set-VM' + ChangeProperty = @{ + StaticMemory = $true + DynamicMemory = $false + } + WaitForIP = $WaitForIP + RestartIfNeeded = $RestartIfNeeded + } + Set-VMProperty @setVMPropertyParams + Write-Verbose -Message ($localizedData.VMPropertiesUpdated -f $Name) + } + } + + # Set VM network switches. This can be done while the VM is running. + for ($i = 0; $i -lt $SwitchName.Count; $i++) + { + $switch = $SwitchName[$i] + $nic = $vmObj.NetworkAdapters[$i] + if ($nic) + { + # We cannot change the MAC address whilst the VM is running.. This is changed later + if ($nic.SwitchName -ne $switch) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'NIC', $switch, $nic.SwitchName) + $nic | Connect-VMNetworkAdapter -SwitchName $switch + Write-Verbose -Message ($localizedData.VMPropertySet -f 'NIC', $switch) + } + } + else + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'NIC', $switch, '<missing>') + if ($MACAddress -and (-not [System.String]::IsNullOrEmpty($MACAddress[$i]))) + { + Add-VMNetworkAdapter -VMName $Name -SwitchName $switch -StaticMacAddress $MACAddress[$i] + Write-Verbose -Message ($localizedData.VMPropertySet -f 'NIC', $switch) + } + else + { + Add-VMNetworkAdapter -VMName $Name -SwitchName $switch + Write-Verbose -Message ($localizedData.VMPropertySet -f 'NIC', $switch) + } + # Refresh the NICs after we've added one + $vmObj = Get-VM -Name $Name -ErrorAction SilentlyContinue + } + } + + # If the VM does not have the right MACAddress, stop the VM, set the right MACAddress, start the VM + for ($i = 0; $i -lt $MACAddress.Count; $i++) + { + $address = $MACAddress[$i] + $nic = $vmObj.NetworkAdapters[$i] + if ($nic.MacAddress -ne $address) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'MACAddress', $address, $nic.MacAddress) + Set-VMMACAddress -Name $Name -NICIndex $i -MACAddress $address -WaitForIP $WaitForIP -RestartIfNeeded $RestartIfNeeded + } + } + + if ($Generation -eq 2) + { + # Retrive the current secure boot state + $vmSecureBoot = Test-VMSecureBoot -Name $Name + if ($SecureBoot -ne $vmSecureBoot) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'SecureBoot', $SecureBoot, $vmSecureBoot) + + if (-not $SecureBoot) + { + $enableSecureBoot = 'On' + } + else + { + $enableSecureBoot = 'Off' + } + + # Cannot change the secure boot state whilst the VM is powered on. + $setVMPropertyParams = @{ + VMName = $Name + VMCommand = 'Set-VMFirmware' + ChangeProperty = @{ EnableSecureBoot = $enableSecureBoot } + RestartIfNeeded = $RestartIfNeeded + } + Set-VMProperty @setVMPropertyParams + Write-Verbose -Message ($localizedData.VMPropertySet -f 'SecureBoot', $SecureBoot) + } + } + + if ($Notes -ne $null) + { + # If the VM notes do not match the desire notes, update them. This can be done while the VM is running. + if ($vmObj.Notes -ne $Notes) + { + Set-Vm -Name $Name -Notes $Notes + } + } + + # If the VM doesn't have Guest Service Interface correctly configured, update it. + $guestServiceId = 'Microsoft:{0}\6C09BB55-D683-4DA0-8931-C9BF705F6480' -f $vmObj.Id + + $guestService = $vmObj | Get-VMIntegrationService | Where-Object -FilterScript {$_.Id -eq $guestServiceId} + if ($guestService.Enabled -eq $false -and $EnableGuestService) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'EnableGuestService', $EnableGuestService, $guestService.Enabled) + $guestService | Enable-VMIntegrationService + Write-Verbose -Message ($localizedData.VMPropertySet -f 'EnableGuestService', $EnableGuestService) + } + elseif ($guestService.Enabled -and -not $EnableGuestService) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'EnableGuestService', $EnableGuestService, $guestService.Enabled) + $guestService | Disable-VMIntegrationService + Write-Verbose -Message ($localizedData.VMPropertySet -f 'EnableGuestService', $EnableGuestService) + } + + # If AutomaticCheckpointsEnabled is set in configuration + if ($PSBoundParameters.ContainsKey('AutomaticCheckpointsEnabled')) + { + if ($vmObj.AutomaticCheckpointsEnabled -ne $AutomaticCheckpointsEnabled) + { + Set-VM -Name $Name -AutomaticCheckpointsEnabled $AutomaticCheckpointsEnabled + } + } + } + } + + # VM is not present, create one + else + { + Write-Verbose -Message ($localizedData.VMDoesNotExist -f $Name) + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ($localizedData.CreatingVM -f $Name) + + $parameters = @{} + $parameters['Name'] = $Name + $parameters['VHDPath'] = $VhdPath + $parameters['Generation'] = $Generation + + # Optional parameters + if ($SwitchName) + { + $parameters['SwitchName'] = $SwitchName[0] + } + if ($Path) + { + $parameters['Path'] = $Path + } + $defaultStartupMemory = 512MB + if ($PSBoundParameters.ContainsKey('StartupMemory')) + { + $parameters['MemoryStartupBytes'] = $StartupMemory + } + elseif ($PSBoundParameters.ContainsKey('MinimumMemory') -and ($defaultStartupMemory -lt $MinimumMemory)) + { + $parameters['MemoryStartupBytes'] = $MinimumMemory + } + elseif ($PSBoundParameters.ContainsKey('MaximumMemory') -and ($defaultStartupMemory -gt $MaximumMemory)) + { + $parameters['MemoryStartupBytes'] = $MaximumMemory + } + $null = New-VM @parameters + + $parameters = @{} + $parameters['Name'] = $Name + $parameters['StaticMemory'] = $true + $parameters['DynamicMemory'] = $false + if ($PSBoundParameters.ContainsKey('MinimumMemory') -or $PSBoundParameters.ContainsKey('MaximumMemory')) + { + $parameters['DynamicMemory'] = $true + $parameters['StaticMemory'] = $false + if ($PSBoundParameters.ContainsKey('MinimumMemory')) + { + $parameters['MemoryMinimumBytes'] = $MinimumMemory + } + if ($PSBoundParameters.ContainsKey('MaximumMemory')) + { + $parameters['MemoryMaximumBytes'] = $MaximumMemory + } + } + + if ($Notes) + { + $parameters['Notes'] = $Notes + } + + if ($PSBoundParameters.ContainsKey('ProcessorCount')) + { + $parameters['ProcessorCount'] = $ProcessorCount + } + + # If AutomaticCheckpointsEnabled is set in configuration + if ($PSBoundParameters.ContainsKey('AutomaticCheckpointsEnabled')) + { + $parameters['AutomaticCheckpointsEnabled'] = $AutomaticCheckpointsEnabled + } + + $null = Set-VM @parameters + + # Special case: Disable dynamic memory if startup, minimum and maximum memory are equal + if ($PSBoundParameters.ContainsKey('StartupMemory') -and + ($StartupMemory -eq $MinimumMemory) -and + ($StartupMemory -eq $MaximumMemory)) + { + Set-VMMemory -VMName $Name -DynamicMemoryEnabled $false + } + + # There's always a NIC added with New-VM + if ($MACAddress) + { + Set-VMNetworkAdapter -VMName $Name -StaticMacAddress $MACAddress[0] + } + + # Add additional NICs + for ($i = 1; $i -lt $SwitchName.Count; $i++) + { + $addVMNetworkAdapterParams = @{ + VMName = $Name + SwitchName = $SwitchName[$i] + } + if ($MACAddress -and (-not [System.String]::IsNullOrEmpty($MACAddress[$i]))) + { + $addVMNetworkAdapterParams['StaticMacAddress'] = $MACAddress[$i] + } + Add-VMNetworkAdapter @addVMNetworkAdapterParams + Write-Verbose -Message ($localizedData.VMPropertySet -f 'NIC', $SwitchName[$i]) + } + + if ($Generation -eq 2) + { + <# + Secure boot is only applicable to Generation 2 VMs and it defaults to on. + Therefore, we only need to explicitly set it to off if specified. + #> + if ($SecureBoot -eq $false) + { + Set-VMFirmware -VMName $Name -EnableSecureBoot Off + } + } + + if ($EnableGuestService) + { + $guestServiceId = 'Microsoft:{0}\6C09BB55-D683-4DA0-8931-C9BF705F6480' -f (Get-VM -Name $Name).Id + Get-VMIntegrationService -VMName $Name | Where-Object -FilterScript {$_.Id -eq $guestServiceId} | Enable-VMIntegrationService + } + + Write-Verbose -Message ($localizedData.VMCreated -f $Name) + + if ($State) + { + Set-VMState -Name $Name -State $State -WaitForIP $WaitForIP + Write-Verbose -Message ($localizedData.VMPropertySet -f 'State', $State) + } + + } + } +} + +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + # Name of the VM + [Parameter(Mandatory = $true)] + [String] + $Name, + + # VHD associated with the VM + [Parameter(Mandatory = $true)] + [String] + $VhdPath, + + # Virtual switch associated with the VM + [Parameter()] + [String[]] + $SwitchName, + + # State of the VM + [Parameter()] + [ValidateSet('Running', 'Paused', 'Off')] + [String] + $State, + + # Folder where the VM data will be stored + [Parameter()] + [String] + $Path, + + # Virtual machine generation + [Parameter()] + [ValidateRange(1, 2)] + [UInt32] + $Generation = 1, + + # Startup RAM for the VM + [Parameter()] + [ValidateRange(32MB, 65536MB)] + [UInt64] + $StartupMemory, + + # Minimum RAM for the VM. This enables dynamic memory + [Parameter()] + [ValidateRange(32MB, 65536MB)] + [UInt64] + $MinimumMemory, + + # Maximum RAM for the VM. This enables dynamic memory + [Parameter()] + [ValidateRange(32MB, 1048576MB)] + [UInt64] + $MaximumMemory, + + # MAC address of the VM + [Parameter()] + [String[]] + $MACAddress, + + # Processor count for the VM + [Parameter()] + [UInt32] + $ProcessorCount, + + # Waits for VM to get valid IP address + [Parameter()] + [Boolean] + $WaitForIP, + + # If specified, shutdowns and restarts the VM as needed for property changes + [Parameter()] + [Boolean] + $RestartIfNeeded, + + # Should the VM be created or deleted + [Parameter()] + [ValidateSet('Present', 'Absent')] + [String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Notes, + + # Enable secure boot for Generation 2 VMs + [Parameter()] + [Boolean] + $SecureBoot = $true, + + [Parameter()] + [Boolean] + $EnableGuestService = $false, + + # Enable AutomaticCheckpoints + [Parameter()] + [Boolean] + $AutomaticCheckpointsEnabled + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if (!(Get-Module -ListAvailable -Name Hyper-V)) + { + Throw ($localizedData.RoleMissingError -f 'Hyper-V') + } + + # Check if 1 or 0 VM with name = $name exist + if ((Get-VM -Name $Name -ErrorAction SilentlyContinue).count -gt 1) + { + Throw ($localizedData.MoreThanOneVMExistsError -f $Name) + } + + # Check if AutomaticCheckpointsEnabled is set in configuration + if ($PSBoundParameters.ContainsKey('AutomaticCheckpointsEnabled')) + { + <# + Check if AutomaticCheckpoints are supported + If AutomaticCheckpoints are supported, parameter exists on Set-VM + #> + if (-Not (Get-Command -Name Set-VM -Module Hyper-V).Parameters.ContainsKey('AutomaticCheckpointsEnabled')) + { + Throw ($localizedData.AutomaticCheckpointsUnsupported) + } + } + + try + { + $vmObj = Get-VM -Name $Name -ErrorAction Stop + if ($Ensure -eq 'Present') + { + # Check if $VhdPath exist + if (!(Test-Path $VhdPath)) + { + Throw ($localizedData.VhdPathDoesNotExistError -f $VhdPath) + } + + # Check if Minimum memory is less than StartUpmemory + if ($PSBoundParameters.ContainsKey('StartupMemory') -and + $PSBoundParameters.ContainsKey('MinimumMemory') -and + ($MinimumMemory -gt $StartupMemory)) + { + Throw ($localizedData.MinMemGreaterThanStartupMemError -f $MinimumMemory, $StartupMemory) + } + + # Check if Minimum memory is greater than Maximummemory + if ($PSBoundParameters.ContainsKey('MaximumMemory') -and + $PSBoundParameters.ContainsKey('MinimumMemory') -and + ($MinimumMemory -gt $MaximumMemory)) + { + Throw ($localizedData.MinMemGreaterThanMaxMemError -f $MinimumMemory, $MaximumMemory) + } + + # Check if Startup memory is greater than Maximummemory + if ($PSBoundParameters.ContainsKey('MaximumMemory') -and + $PSBoundParameters.ContainsKey('StartupMemory') -and + ($StartupMemory -gt $MaximumMemory)) + { + Throw ($localizedData.StartUpMemGreaterThanMaxMemError -f $StartupMemory, $MaximumMemory) + } + + <# + VM Generation has no direct relation to the virtual hard disk format and cannot be changed + after the virtual machine has been created. Generation 2 VMs do not support .VHD files. + #> + if (($Generation -eq 2) -and ($VhdPath.Split('.')[-1] -eq 'vhd')) + { + Throw ($localizedData.VhdUnsupportedOnGen2VMError) + } + + # Check if $Path exist + if ($Path -and !(Test-Path -Path $Path)) + { + Throw ($localizedData.PathDoesNotExistError -f $Path) + } + + $vhdChain = @(Get-VhdHierarchy -VhdPath ($vmObj.HardDrives[0].Path)) + if ($vhdChain -notcontains $VhdPath) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'VhdPath', $VhdPath, ($vhdChain -join ',')) + return $false + } + + if ($state -and ($vmObj.State -ne $State)) + { + return $false + } + + if ($PSBoundParameters.ContainsKey('StartupMemory') -and + ($vmObj.MemoryStartup -ne $StartupMemory)) + { + return $false + } + + if ($PSBoundParameters.ContainsKey('MaximumMemory') -and + ($vmObj.MemoryMaximum -ne $MaximumMemory)) + { + return $false + } + + if ($PSBoundParameters.ContainsKey('MinimumMemory') -and + ($vmObj.MemoryMinimum -ne $MinimumMemory)) + { + return $false + } + + # If startup memory but neither minimum nor maximum memory specified, dynamic memory should be disabled + if ($PSBoundParameters.ContainsKey('StartupMemory') -and + ( -not $PSBoundParameters.ContainsKey('MinimumMemory')) -and + ( -not $PSBoundParameters.ContainsKey('MaximumMemory')) -and + $vmobj.DynamicMemoryEnabled) + { + return $false + } + + # If startup, minimum and maximum memory are specified with the same values, dynamic memory should be disabled + if ($PSBoundParameters.ContainsKey('StartupMemory') -and + $PSBoundParameters.ContainsKey('MinimumMemory') -and + $PSBoundParameters.ContainsKey('MaximumMemory') -and + ($StartupMemory -eq $MinimumMemory) -and + ($StartupMemory -eq $MaximumMemory) -and + $vmobj.DynamicMemoryEnabled) + { + return $false + } + + if ($vmObj.HardDrives.Path -notcontains $VhdPath) + { + return $false + } + + for ($i = 0; $i -lt $SwitchName.Count; $i++) + { + if ($vmObj.NetworkAdapters[$i].SwitchName -ne $SwitchName[$i]) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'SwitchName', $SwitchName[$i], $vmObj.NetworkAdapters[$i].SwitchName) + return $false + } + } + + for ($i = 0; $i -lt $MACAddress.Count; $i++) + { + if ($vmObj.NetworkAdapters[$i].MACAddress -ne $MACAddress[$i]) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'MACAddress', $MACAddress[$i], $vmObj.NetworkAdapters[$i].MACAddress) + return $false + } + } + + # $Generation always exists, only check if parameter has been explicitly specified + if ($PSBoundParameters.ContainsKey('Generation') -and ($Generation -ne $vmObj.Generation)) + { + return $false + } + + if ($PSBoundParameters.ContainsKey('ProcessorCount') -and ($vmObj.ProcessorCount -ne $ProcessorCount)) + { + return $false + } + + if ($vmObj.Generation -eq 2) + { + $vmSecureBoot = Test-VMSecureBoot -Name $Name + if ($SecureBoot -ne $vmSecureBoot) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'SecureBoot', $SecureBoot, $vmSecureBoot) + return $false + } + } + + $guestServiceId = 'Microsoft:{0}\6C09BB55-D683-4DA0-8931-C9BF705F6480' -f $vmObj.Id + $guestService = $vmObj | Get-VMIntegrationService | Where-Object -FilterScript {$_.Id -eq $guestServiceId} + if ($guestService.Enabled -ne $EnableGuestService) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'EnableGuestService', $EnableGuestService, $guestService.Enabled) + return $false + } + + # If AutomaticCheckpointsEnabled is set in configuration + if ($PSBoundParameters.ContainsKey('AutomaticCheckpointsEnabled')) + { + if ($vmObj.AutomaticCheckpointsEnabled -ne $AutomaticCheckpointsEnabled) + { + Write-Verbose -Message ($localizedData.VMPropertyShouldBe -f 'AutomaticCheckpointsEnabled', $AutomaticCheckpointsEnabled, $vmObj.AutomaticCheckpointsEnabled) + return $false + } + } + + return $true + } + else + { + return $false + } + } + catch [System.Management.Automation.ActionPreferenceStopException] + { + ($Ensure -eq 'Absent') + } +} + +#region Helper function + +# Returns VM VHDs, including snapshots and differencing disks +function Get-VhdHierarchy +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VhdPath + ) + + $vmVhdPath = Get-VHD -Path $VhdPath + Write-Output -InputObject $vmVhdPath.Path + while (-not [System.String]::IsNullOrEmpty($vmVhdPath.ParentPath)) + { + $vmVhdPath.ParentPath + $vmVhdPath = (Get-VHD -Path $vmVhdPath.ParentPath) + } +} + +<# + The 'Set-VMProperty' method cannot be used as it cannot deal with piped + command in it's current implementation +#> +function Set-VMMACAddress +{ + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [String] + $MACAddress, + + [Parameter(Mandatory = $true)] + [Int] + $NICIndex, + + [Parameter()] + [Boolean] + $WaitForIP, + + [Parameter()] + [Boolean] + $RestartIfNeeded + ) + $vmObj = Get-VM -Name $Name + $originalState = $vmObj.state + if ($originalState -ne 'Off' -and $RestartIfNeeded) + { + Set-VMState -Name $Name -State Off + $vmObj.NetworkAdapters[$NICIndex] | Set-VMNetworkAdapter -StaticMacAddress $MACAddress + + # Can not move a off VM to paused, but only to running state + if ($originalState -eq 'Running') + { + Set-VMState -Name $Name -State Running -WaitForIP $WaitForIP + } + + # Cannot make a paused VM to go back to Paused state after turning Off + if ($originalState -eq 'Paused') + { + Write-Warning -Message ($localizedData.VMStateWillBeOffWarning -f $Name) + } + } + elseif ($originalState -eq 'Off') + { + $vmObj.NetworkAdapters[$NICIndex] | Set-VMNetworkAdapter -StaticMacAddress $MACAddress + Write-Verbose -Message ($localizedData.VMPropertySet -f 'MACAddress', $MACAddress) + } + else + { + Write-Error -Message ($localizedData.CannotUpdatePropertiesOnlineError -f $Name, $vmObj.State) + } +} + +function Test-VMSecureBoot +{ + param + ( + [Parameter(Mandatory = $true)] + [string] + $Name + ) + $vm = Get-VM -Name $Name + return (Get-VMFirmware -VM $vm).SecureBoot -eq 'On' +} + +#endregion + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/MSFT_xVMHyperV.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/MSFT_xVMHyperV.schema.mof new file mode 100644 index 0000000..7a2541e --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/MSFT_xVMHyperV.schema.mof @@ -0,0 +1,30 @@ +[ClassVersion("1.0.0"), FriendlyName("xVMHyperV")] +class MSFT_xVMHyperV : OMI_BaseResource +{ + [Key, Description("Name of the VM")] String Name; + [Required, Description("VHD associated with the VM")] String VhdPath; + [Write, Description("Virtual switch(es) associated with the VM")] String SwitchName[]; + [Write, Description("State of the VM."), ValueMap{"Running","Paused","Off"}, Values{"Running","Paused","Off"}] String State; + [Write, Description("Folder where the VM data will be stored")] String Path; + [Write, Description("Virtual machine generation")] Uint32 Generation; + [Write, Description("Startup RAM for the VM.")] Uint64 StartupMemory; + [Write, Description("Minimum RAM for the VM. This enables dynamic memory.")] Uint64 MinimumMemory; + [Write, Description("Maximum RAM for the VM. This enable dynamic memory.")] Uint64 MaximumMemory; + [Write, Description("MAC address(es) of the VM NICs.")] String MACAddress[]; + [Write, Description("Processor count for the VM")] Uint32 ProcessorCount; + [Write, Description("Waits for VM to get valid IP address.")] Boolean WaitForIP; + [Write, Description("If specified, shutdowns and restarts the VM as needed for property changes")] Boolean RestartIfNeeded; + [Write, Description("Should the VM be created or deleted"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Notes about the VM.")] String Notes; + [Write, Description("Enable secure boot for Generation 2 VMs.")] Boolean SecureBoot; + [Write, Description("Enable Guest Service Interface for the VM.")] Boolean EnableGuestService; + [Write, Description("Enable AutomaticCheckpoints for the VM.")] Boolean AutomaticCheckpointsEnabled; + [Read, Description("VM unique ID")] String ID; + [Read, Description("Status of the VM")] String Status; + [Read, Description("CPU Usage of the VM")] Uint32 CPUUsage; + [Read, Description("Memory assigned to the VM")] Uint64 MemoryAssigned; + [Read, Description("Uptime of the VM")] String Uptime; + [Read, Description("Creation time of the VM")] DateTime CreationTime; + [Read, Description("Does VM has dynamic memory enabled")] Boolean HasDynamicMemory; + [Read, Description("Network adapters' IP addresses of the VM")] String NetworkAdapters[]; +}; diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/en-US/MSFT_xVMHyperV.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/en-US/MSFT_xVMHyperV.psd1 new file mode 100644 index 0000000..67d0b3d --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMHyperV/en-US/MSFT_xVMHyperV.psd1 @@ -0,0 +1,28 @@ +ConvertFrom-StringData @' + RoleMissingError = Please ensure that '{0}' role is installed with its PowerShell module. + MoreThanOneVMExistsError = More than one VM with the name '{0}' exists. + PathDoesNotExistError = Path '{0}' does not exist. + VhdPathDoesNotExistError = Vhd '{0}' does not exist. + MinMemGreaterThanStartupMemError = MinimumMemory '{0}' should not be greater than StartupMemory '{1}' + MinMemGreaterThanMaxMemError = MinimumMemory '{0}' should not be greater than MaximumMemory '{1}' + StartUpMemGreaterThanMaxMemError = StartupMemory '{0}' should not be greater than MaximumMemory '{1}'. + VhdUnsupportedOnGen2VMError = Generation 2 virtual machines do not support the .VHD virtual disk extension. + CannotUpdatePropertiesOnlineError = Can not change properties for VM '{0}' in '{1}' state unless 'RestartIfNeeded' is set to true. + AutomaticCheckpointsUnsupported = AutomaticCheckpoints are not supported on this host. + + AdjustingGreaterThanMemoryWarning = VM {0} '{1}' is greater than {2} '{3}'. Adjusting {0} to be '{3}'. + AdjustingLessThanMemoryWarning = VM {0} '{1}' is less than {2} '{3}'. Adjusting {0} to be '{3}'. + VMStateWillBeOffWarning = VM '{0}' state will be 'OFF' and not 'Paused'. + + CheckingVMExists = Checking if VM '{0}' exists ... + VMExists = VM '{0}' exists. + VMDoesNotExist = VM '{0}' does not exist. + CreatingVM = Creating VM '{0}' ... + VMCreated = VM '{0}' created. + VMPropertyShouldBe = VM property '{0}' should be '{1}', actual '{2}'. + VMPropertySet = VM property '{0}' is '{1}'. + VMPropertiesUpdated = VM '{0}' properties have been updated. + WaitingForVMIPAddress = Waiting for IP Address for VM '{0}' ... + + QueryingVM = Querying VM '{0}'. +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/MSFT_xVMNetworkAdapter.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/MSFT_xVMNetworkAdapter.psm1 new file mode 100644 index 0000000..65ec9b5 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/MSFT_xVMNetworkAdapter.psm1 @@ -0,0 +1,681 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData -BindingVariable LocalizedData -filename MSFT_xVMNetworkAdapter.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + #fallback to en-US + Import-LocalizedData -BindingVariable LocalizedData -filename MSFT_xVMNetworkAdapter.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +<# +.SYNOPSIS + Gets MSFT_xVMNetworkAdapter resource current state. + +.PARAMETER Id + Specifies an unique identifier for the network adapter. + +.PARAMETER Name + Specifies a name for the network adapter that needs to be connected to a VM or management OS. + +.PARAMETER SwitchName + Specifies the name of the switch to which the new VM network adapter will be connected. + +.PARAMETER VMName + Specifies the name of the VM to which the network adapter will be connected. + Specify VMName as ManagementOS if you wish to connect the adapter to host OS. + +.PARAMETER IpAddress + Specifies the IpAddress information for the network adapter. +#> +Function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName + ) + + $configuration = @{ + Id = $Id + Name = $Name + SwitchName = $SwitchName + VMName = $VMName + } + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose -Message $localizedData.GetVMNetAdapter + $netAdapter = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($netAdapter) + { + Write-Verbose -Message $localizedData.FoundVMNetAdapter + if ($VMName -eq 'ManagementOS') + { + $configuration.Add('MacAddress', $netAdapter.MacAddress) + $configuration.Add('DynamicMacAddress', $false) + } + elseif ($netAdapter.VMName) + { + $configuration.Add('MacAddress', $netAdapter.MacAddress) + $configuration.Add('DynamicMacAddress', $netAdapter.DynamicMacAddressEnabled) + } + + $networkInfo = Get-NetworkInformation -VMName $VMName -Name $Name + if($networkInfo) + { + $item = New-CimInstance -ClassName MSFT_xNetworkSettings -Property $networkInfo -Namespace root/microsoft/windows/desiredstateconfiguration -ClientOnly + $configuration.Add('NetworkSetting', $item) + } + + $configuration.Add('Ensure','Present') + + Write-Verbose -Message $localizedData.GetVMNetAdapterVlan + $netAdapterVlan = Get-VMNetworkAdapterVlan -VMNetworkAdapter $netAdapter + if ($netAdapterVlan.OperationMode -ne 'Untagged') + { + $configuration.Add('VlanId', $netAdapterVlan.AccessVlanId) + } + } + else + { + Write-Verbose -Message $localizedData.NoVMNetAdapterFound + $configuration.Add('Ensure','Absent') + } + + return $configuration +} + +<# +.SYNOPSIS + Sets MSFT_xVMNetworkAdapter resource state. + +.PARAMETER Id + Specifies an unique identifier for the network adapter. + +.PARAMETER Name + Specifies a name for the network adapter that needs to be connected to a VM or management OS. + +.PARAMETER SwitchName + Specifies the name of the switch to which the new VM network adapter will be connected. + +.PARAMETER VMName + Specifies the name of the VM to which the network adapter will be connected. + Specify VMName as ManagementOS if you wish to connect the adapter to host OS. + +.PARAMETER MacAddress + Specifies the MAC address for the network adapter. This is not applicable if VMName + is set to ManagementOS. Use this parameter to specify a static MAC address. + +.PARAMETER IpAddress + Specifies the IpAddress information for the network adapter. + +.PARAMETER VlanId + Specifies the Vlan Id for the network adapter. + +.PARAMETER Ensure + Specifies if the network adapter should be Present or Absent. +#> +Function Set-TargetResource +{ + [CmdletBinding()] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter()] + [String] $MacAddress, + + [Parameter()] + [Microsoft.Management.Infrastructure.CimInstance] + $NetworkSetting, + + [Parameter()] + [String] $VlanId, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] $Ensure='Present' + ) + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose -Message $localizedData.GetVMNetAdapter + $netAdapterExists = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($Ensure -eq 'Present') + { + if ($netAdapterExists) + { + Write-Verbose -Message $localizedData.FoundVMNetAdapter + if (($VMName -ne 'ManagementOS')) + { + if ($MacAddress) + { + if ($netAdapterExists.DynamicMacAddressEnabled) + { + Write-Verbose -Message $localizedData.EnableStaticMacAddress + $updateMacAddress = $true + } + elseif ($MacAddress -ne $netAdapterExists.StaicMacAddress) + { + Write-Verbose -Message $localizedData.EnableStaticMacAddress + $updateMacAddress = $true + } + } + else + { + if (-not $netAdapterExists.DynamicMacAddressEnabled) + { + Write-Verbose -Message $localizedData.EnableDynamicMacAddress + $updateMacAddress = $true + } + } + + if ($netAdapterExists.SwitchName -ne $SwitchName) + { + Write-Verbose -Message $localizedData.PerformSwitchConnect + Connect-VMNetworkAdapter -VMNetworkAdapter $netAdapterExists -SwitchName $SwitchName -ErrorAction Stop -Verbose + } + + if (($updateMacAddress)) + { + Write-Verbose -Message $localizedData.PerformVMNetModify + + $setArguments = @{ } + $setArguments.Add('VMNetworkAdapter',$netAdapterExists) + if ($MacAddress) + { + $setArguments.Add('StaticMacAddress',$MacAddress) + } + else + { + $setArguments.Add('DynamicMacAddress', $true) + } + Set-VMNetworkAdapter @setArguments -ErrorAction Stop + } + } + } + else + { + if ($VMName -ne 'ManagementOS') + { + if (-not $MacAddress) + { + $arguments.Add('DynamicMacAddress',$true) + } + else + { + $arguments.Add('StaticMacAddress',$MacAddress) + } + $arguments.Add('SwitchName',$SwitchName) + } + Write-Verbose -Message $localizedData.AddVMNetAdapter + $netAdapterExists = Add-VMNetworkAdapter @arguments -Passthru -ErrorAction Stop + } + + if ($VmName -ne 'ManagementOS') + { + $networkInfo = Get-NetworkInformation -VMName $VMName -Name $Name + if (-not $NetworkSetting) + { + if($networkInfo) + { + Write-Verbose -Message $localizedData.EnableDhcp + Set-NetworkInformation -VMName $VMName -Name $Name -Dhcp + } + } + else + { + $parameters = @{} + if ($ipAddress = $NetworkSetting.CimInstanceProperties["IpAddress"].Value) + { + if (-not $ipAddress) + { + throw $localizedData.MissingIPAndSubnet + } + $parameters.Add('IPAddress', $ipAddress) + } + if ($subnet = $NetworkSetting.CimInstanceProperties["Subnet"].Value) + { + if (-not $subnet) + { + throw $localizedData.MissingIPAndSubnet + } + $parameters.Add('Subnet', $subnet) + } + if ($defaultGateway = $NetworkSetting.CimInstanceProperties["DefaultGateway"].Value) + { + $parameters.Add('DefaultGateway', $defaultGateway) + } + if ($dnsServer = $NetworkSetting.CimInstanceProperties["DnsServer"].Value) + { + $parameters.Add('DnsServer', $dnsServer) + } + + Set-NetworkInformation -VMName $VMName -Name $Name @parameters + } + + Write-Verbose -Message $localizedData.GetVMNetAdapterVlan + $netAdapterVlan = Get-VMNetworkAdapterVlan -VMNetworkAdapter $netAdapterExists + if ($netAdapterVlan) + { + if ($VlanId) + { + $setVlan = $true + } + else + { + Write-Verbose -Message $localizedData.RemovingVlanTag + Set-VMNetworkAdapterVlan -VMNetworkAdapter $netAdapterExists -Untagged + } + } + elseif ($VlanId) + { + $setVlan = $true + } + + if ($setVlan) + { + Write-Verbose -Message $localizedData.SettingVlan + Set-VMNetworkAdapterVlan -VMNetworkAdapter $netAdapterExists -Access -VlanId $VlanId + } + } + } + else + { + Write-Verbose -Message $localizedData.RemoveVMNetAdapter + Remove-VMNetworkAdapter @arguments -ErrorAction Stop + } +} + +<# +.SYNOPSIS + Tests if MSFT_xVMNetworkAdapter resource state is indeed desired state or not. + +.PARAMETER Id + Specifies an unique identifier for the network adapter. + +.PARAMETER Name + Specifies a name for the network adapter that needs to be connected to a VM or management OS. + +.PARAMETER SwitchName + Specifies the name of the switch to which the new VM network adapter will be connected. + +.PARAMETER VMName + Specifies the name of the VM to which the network adapter will be connected. + Specify VMName as ManagementOS if you wish to connect the adapter to host OS. + +.PARAMETER MacAddress + Specifies the MAC address for the network adapter. This is not applicable if VMName + is set to ManagementOS. Use this parameter to specify a static MAC address. + +.PARAMETER IpAddress + Specifies the IpAddress information for the network adapter. + +.PARAMETER VlanId + Specifies the Vlan Id for the network adapter. + +.PARAMETER Ensure + Specifies if the network adapter should be Present or Absent. +#> +Function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + Param ( + [Parameter(Mandatory)] + [String] $Id, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(Mandatory)] + [String] $SwitchName, + + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter()] + [String] $MacAddress, + + [Parameter()] + [Microsoft.Management.Infrastructure.CimInstance] + $NetworkSetting, + + [Parameter()] + [String] $VlanId, + + [Parameter()] + [ValidateSet('Present','Absent')] + [String] $Ensure='Present' + ) + + $arguments = @{ + Name = $Name + } + + if ($VMName -ne 'ManagementOS') + { + $arguments.Add('VMName',$VMName) + } + else + { + $arguments.Add('ManagementOS', $true) + $arguments.Add('SwitchName', $SwitchName) + } + + Write-Verbose -Message $localizedData.GetVMNetAdapter + $netAdapterExists = Get-VMNetworkAdapter @arguments -ErrorAction SilentlyContinue + + if ($Ensure -eq 'Present') + { + if ($netAdapterExists) + { + if ($VMName -ne 'ManagementOS') + { + if ($MacAddress) + { + if ($netAdapterExists.DynamicMacAddressEnabled) + { + Write-Verbose -Message $localizedData.EnableStaticMacAddress + return $false + } + elseif ($netAdapterExists.MacAddress -ne $MacAddress) + { + Write-Verbose -Message $localizedData.StaticAddressDoesNotMatch + return $false + } + } + else + { + if (-not $netAdapterExists.DynamicMacAddressEnabled) + { + Write-Verbose -Message $localizedData.EnableDynamicMacAddress + return $false + } + } + + $networkInfo = Get-NetworkInformation -VMName $VMName -Name $Name + if (-not $NetworkSetting) + { + if($networkInfo) + { + Write-Verbose -Message $localizedData.NotDhcp + return $false + } + } + else + { + if (-not $networkInfo) + { + Write-Verbose -Message $localizedData.Dhcp + return $false + } + else + { + $ipAddress = $NetworkSetting.CimInstanceProperties["IpAddress"].Value + $subnet = $NetworkSetting.CimInstanceProperties["Subnet"].Value + $defaultGateway = $NetworkSetting.CimInstanceProperties["DefaultGateway"].Value + $dnsServer = $NetworkSetting.CimInstanceProperties["DnsServer"].Value + + if (-not $IpAddress -or -not $subnet) + { + throw $localizedData.MissingIPAndSubnet + } + + if ($ipAddress -and -not $networkInfo.IPAddress.Split(',').Contains($ipAddress)) + { + Write-Verbose -Message $localizedData.IPAddressNotConfigured + return $false + } + + if ($defaultGateway -and -not $networkInfo.DefaultGateway.Split(',').Contains($defaultGateway)) + { + Write-Verbose -Message $localizedData.GatewayNotConfigured + return $false + } + + if ($dnsServer -and -not $networkInfo.DNSServer.Split(',').Contains($dnsServer)) + { + Write-Verbose -Message $localizedData.DNSServerNotConfigured + return $false + } + } + } + + Write-Verbose -Message $localizedData.GetVMNetAdapterVlan + $netAdapterVlan = Get-VMNetworkAdapterVlan -VMNetworkAdapter $netAdapterExists + if ($netAdapterVlan) + { + if ($netAdapterVlan.OperationMode -eq 'Untagged') + { + if ($VlanId) + { + Write-Verbose -Message $localizedData.VlanNotUntagged + return $false + } + } + else + { + if ($VlanId) + { + if ($netAdapterVlan.AccessVlanId -ne $VlanId) + { + Write-Verbose -Message $localizedData.VlanDoesNotMatch + return $false + } + } + else + { + Write-Verbose -Message $localizedData.VlanShouldntBeTagged + return $false + } + } + } + elseif ($VlanId) + { + Write-Verbose -Message $localizedData.VlanNotUntagged + return $false + } + + if ($netAdapterExists.SwitchName -ne $SwitchName) + { + Write-Verbose -Message $localizedData.SwitchIsDifferent + return $false + } + else + { + Write-Verbose -Message $localizedData.VMNetAdapterExistsNoActionNeeded + return $true + } + + } + else + { + Write-Verbose -Message $localizedData.VMNetAdapterExistsNoActionNeeded + return $true + } + } + else + { + Write-Verbose -Message $localizedData.VMNetAdapterDoesNotExistShouldAdd + return $false + } + } + else + { + if ($netAdapterExists) + { + Write-Verbose -Message $localizedData.VMNetAdapterExistsShouldRemove + return $false + } + else + { + Write-Verbose -Message $localizedData.VMNetAdapterDoesNotExistNoActionNeeded + return $true + } + } +} + +function Get-NetworkInformation +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + Param ( + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter(Mandatory)] + [String] $Name + ) + + $vm = Get-WmiObject -Namespace 'root\virtualization\v2' -Class 'Msvm_ComputerSystem' | Where-Object { $_.ElementName -ieq "$VmName" } + $vmSettings = $vm.GetRelated('Msvm_VirtualSystemSettingData') | Where-Object { $_.VirtualSystemType -eq 'Microsoft:Hyper-V:System:Realized' } + $vmNetAdapter = $vmSettings.GetRelated('Msvm_SyntheticEthernetPortSettingData') | Where-Object { $_.ElementName -ieq "$Name" } + $networkSettings = $vmNetAdapter.GetRelated("Msvm_GuestNetworkAdapterConfiguration") + + if ($networkSettings.DHCPEnabled) + { + return $null + } + else + { + return @{ + IpAddress = $networkSettings.IPAddresses -join ',' + Subnet = $networkSettings.Subnets -join ',' + DefaultGateway = $networkSettings.DefaultGateways -join ',' + DnsServer = $networkSettings.DNSServers -join ',' + } + } + +} + +function Set-NetworkInformation +{ + [CmdletBinding()] + Param ( + [Parameter(Mandatory)] + [String] $VMName, + + [Parameter(Mandatory)] + [String] $Name, + + [Parameter(ParameterSetName='Dhcp')] + [switch] $Dhcp, + + [Parameter(Mandatory, ParameterSetName='Static')] + [String] $IPAddress, + + [Parameter(Mandatory, ParameterSetName='Static')] + [String] $Subnet, + + [Parameter(ParameterSetName='Static')] + [String] $DefaultGateway, + + [Parameter(ParameterSetName='Static')] + [String] $DnsServer + ) + + $vm = Get-WmiObject -Namespace 'root\virtualization\v2' -Class 'Msvm_ComputerSystem' | Where-Object { $_.ElementName -ieq "$VmName" } + $vmSettings = $vm.GetRelated('Msvm_VirtualSystemSettingData') | Where-Object { $_.VirtualSystemType -eq 'Microsoft:Hyper-V:System:Realized' } + $vmNetAdapter = $vmSettings.GetRelated('Msvm_SyntheticEthernetPortSettingData') | Where-Object { $_.ElementName -ieq $Name } + $networkSettings = $vmNetAdapter.GetRelated("Msvm_GuestNetworkAdapterConfiguration") | Select-Object -First 1 + + switch ($PSCmdlet.ParameterSetName) + { + 'Dhcp' + { + $networkSettings.DHCPEnabled = $true + $networkSettings.IPAddresses = @() + $networkSettings.Subnets = @() + $networkSettings.DefaultGateways = @() + $networkSettings.DNSServers = @() + } + 'Static' + { + $networkSettings.IPAddresses = $IPAddress + $networkSettings.Subnets = $Subnet + + if ($DefaultGateway) + { + $networkSettings.DefaultGateways = $DefaultGateway + } + if ($DnsServer) + { + $networkSettings.DNSServers = $DNSServer + } + $networkSettings.DHCPEnabled = $false + } + } + $networkSettings.ProtocolIFType = 4096 + + $service = Get-WmiObject -Class "Msvm_VirtualSystemManagementService" -Namespace "root\virtualization\v2" + $setIP = $service.SetGuestNetworkAdapterConfiguration($vm, $networkSettings.GetText(1)) + + if ($setIP.ReturnValue -eq 4096) + { + $job = [WMI]$setIP.job + + while ($job.JobState -eq 3 -or $job.JobState -eq 4) + { + Start-Sleep 1 + $job = [WMI]$setIP.job + } + + if($job.JobState -ne 7) + { + throw $job.GetError().Error + } + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/MSFT_xVMNetworkAdapter.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/MSFT_xVMNetworkAdapter.schema.mof new file mode 100644 index 0000000..8929134 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/MSFT_xVMNetworkAdapter.schema.mof @@ -0,0 +1,23 @@ + +[ClassVersion("2.0.0.0")] +Class xNetworkSettings +{ + [Write] string IpAddress; + [Write] string Subnet; + [Write] string DefaultGateway; + [Write] string DnsServer; +}; + +[ClassVersion("2.0.0.0"), FriendlyName("xVMNetworkAdapter")] +class MSFT_xVMNetworkAdapter : OMI_BaseResource +{ + [Key] String Id; + [Required] String Name; + [Required] String SwitchName; + [Required] String VMName; + [Write] String MacAddress; + [Write, EmbeddedInstance("xNetworkSettings")] String NetworkSetting; + [Write] String VlanId; + [Write, ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Read] Boolean DynamicMacAddress; +}; diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/en-US/MSFT_xVMNetworkAdapter.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/en-US/MSFT_xVMNetworkAdapter.psd1 new file mode 100644 index 0000000..b5e1676 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMNetworkAdapter/en-US/MSFT_xVMNetworkAdapter.psd1 @@ -0,0 +1,37 @@ +ConvertFrom-StringData @' + VMNameAndManagementTogether=VMName cannot be provided when ManagementOS is set to True. + MustProvideVMName=Must provide VMName parameter when ManagementOS is set to False. + GetVMNetAdapter=Getting VM Network Adapter information. + GetVMNetAdapterVlan=Getting VM Network Adapter VLAN information. + VlanShouldntBeTagged=VM Network Adapter should not have a Vlan tag. + VlanNotUntagged=Vlan is tagged. It will be removed. + VlanDoesNotMatch=VlanId does not match. + RemovingVlanTag=Removing Vlan tagging on Network Adapter. + SettingVlan=Setting VlanId on network adapter. + IpAddressIsNotSet=Ip Address is not set. + NotDhcp=Ethernet Adapter is not configured for Dhcp. + Dhcp=Ethernet Adapter is configured for Dhcp. + EnableDhcp=Enabling DHCP. + IPAddressNotConfigured=IPAddress is not configured. + GatewayNotConfigured=Gateway is not configured. + DNSServerNotConfigured=DNS Server not configured. + MissingIPAndSubnet=Missing IPAddress or Subnet. + FoundVMNetAdapter=Found VM Network Adapter. + NoVMNetAdapterFound=No VM Network Adapter found. + StaticMacAddressChosen=Static MAC Address has been specified. + StaticAddressDoesNotMatch=Staic MAC address on the VM Network Adapter does not match. + ModifyVMNetAdapter=VM Network Adapter exists with different configuration. This will be modified. + EnableDynamicMacAddress=VM Network Adapter exists but without Dynamic MAC address setting. + EnableStaticMacAddress=VM Network Adapter exists but without static MAC address setting. + PerformVMNetModify=Performing VM Network Adapter configuration changes. + CannotChangeHostAdapterMacAddress=VM Network adapter in configuration is a host adapter. Its configuration cannot be modified. + AddVMNetAdapter=Adding VM Network Adapter. + RemoveVMNetAdapter=Removing VM Network Adapter. + VMNetAdapterExistsNoActionNeeded=VM Network Adapter exists with requested configuration. No action needed. + VMNetAdapterDoesNotExistShouldAdd=VM Network Adapter does not exist. It will be added. + VMNetAdapterExistsShouldRemove=VM Network Adapter Exists. It will be removed. + VMNetAdapterDoesNotExistNoActionNeeded=VM Network adapter does not exist. No action needed. + StaticMacExists=StaicMacAddress configuration exists as desired. + SwitchIsDifferent=Net Adapter is not connected to the requested switch. + PerformSwitchConnect=Connecting VM Net adapter to the right switch. +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/MSFT_xVMProcessor.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/MSFT_xVMProcessor.psm1 new file mode 100644 index 0000000..79cd09c --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/MSFT_xVMProcessor.psm1 @@ -0,0 +1,443 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData -BindingVariable localizedData -Filename MSFT_xVMProcessor.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + # fallback to en-US + Import-LocalizedData -BindingVariable localizedData -Filename MSFT_xVMProcessor.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +# Import the common HyperV functions +Import-Module -Name ( Join-Path ` + -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath '\HyperVCommon\HyperVCommon.psm1' ) + +<# +.SYNOPSIS + Gets MSFT_xVMProcessor resource current state. + +.PARAMETER VMName + Specifies the name of the virtual machine on which the processor is to be configured. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName + ) + + Assert-Module -Name 'Hyper-V' + Write-Verbose -Message ($localizedData.QueryingVMProcessor -f $VMName) + $vmProcessor = Get-VMProcessor -VMName $VMName -ErrorAction Stop + $configuration = @{ + VMName = $VMName + EnableHostResourceProtection = $vmProcessor.EnableHostResourceProtection + ExposeVirtualizationExtensions = $vmProcessor.ExposeVirtualizationExtensions + HwThreadCountPerCore = $vmProcessor.HwThreadCountPerCore + Maximum = $vmProcessor.Maximum + MaximumCountPerNumaNode = $vmProcessor.MaximumCountPerNumaNode + MaximumCountPerNumaSocket = $vmProcessor.MaximumCountPerNumaSocket + RelativeWeight = $vmProcessor.RelativeWeight + Reserve = $vmProcessor.Reserve + ResourcePoolName = $vmProcessor.ResourcePoolName + CompatibilityForMigrationEnabled = $vmProcessor.CompatibilityForMigrationEnabled + CompatibilityForOlderOperatingSystemsEnabled = $vmProcessor.CompatibilityForOlderOperatingSystemsEnabled + RestartIfNeeded = $false + } + return $configuration +} + +<# +.SYNOPSIS + Tests if MSFT_xVMProcessor resource state is in the desired state or not. + +.PARAMETER VMName + Specifies the name of the virtual machine on which the processor is to be configured. + +.PARAMETER EnableHostResourceProtection + Specifies whether to enable host resource protection. + NOTE: Only supported on Windows 10 and Server 2016. + +.PARAMETER ExposeVirtualizationExtensions + Specifies whether nested virtualization is enabled. + NOTE: Only supported on Windows 10 and Server 2016. + +.PARAMETER HwThreadCountPerCore + Specifies the maximum thread core per processor core. + NOTE: Only supported on Windows 10 and Server 2016. + +.PARAMETER Maximum + Specifies the maximum percentage of resources available to the virtual machine + processor to be configured. Allowed values range from 0 to 100. + +.PARAMETER MaximumCountPerNumaNode + Specifies the maximum number of processors per NUMA node to be configured for + the virtual machine. + +.PARAMETER MaximumCountPerNumaSocket + Specifies the maximum number of sockets per NUMA node to be configured for + the virtual machine. + +.PARAMETER RelativeWeight + Specifies the priority for allocating the physical computer's processing + power to this virtual machine relative to others. Allowed values range + from 1 to 10000. + +.PARAMETER Reserve + Specifies the percentage of processor resources to be reserved for this + virtual machine. Allowed values range from 0 to 100. + +.PARAMETER ResourcePoolName + Specifies the name of the processor resource pool to be used. + +.PARAMETER CompatibilityForMigrationEnabled + Specifies whether the virtual processors features are to be limited + for compatibility when migrating the virtual machine to another host. + +.PARAMETER CompatibilityForOlderOperatingSystemsEnabled + Specifies whether the virtual processor’s features are to be limited + for compatibility with older operating systems. + +.PARAMETER RestartIfNeeded + If specified, shutdowns and restarts the VM if needed for property + changes. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter()] + [System.Boolean] + $EnableHostResourceProtection, + + [Parameter()] + [System.Boolean] + $ExposeVirtualizationExtensions, + + [Parameter()] + [System.UInt64] + $HwThreadCountPerCore, + + [Parameter()] + [ValidateRange(0,100)] + [System.UInt64] + $Maximum, + + [Parameter()] + [System.UInt32] + $MaximumCountPerNumaNode, + + [Parameter()] + [System.UInt32] + $MaximumCountPerNumaSocket, + + [Parameter()] + [ValidateRange(0,10000)] + [System.UInt32] + $RelativeWeight, + + [Parameter()] + [ValidateRange(0,100)] + [System.UInt64] + $Reserve, + + [Parameter()] + [System.String] + $ResourcePoolName, + + [Parameter()] + [System.Boolean] + $CompatibilityForMigrationEnabled, + + [Parameter()] + [System.Boolean] + $CompatibilityForOlderOperatingSystemsEnabled, + + [Parameter()] + [System.Boolean] + $RestartIfNeeded + ) + + Assert-Module -Name 'Hyper-V' + Assert-TargetResourceParameter @PSBoundParameters + + $targetResource = Get-TargetResource -VMName $VMName + $excludedTestParameters = @('RestartIfNeeded') + $isTargetResourceCompliant = $true + + foreach ($parameter in $PSBoundParameters.GetEnumerator()) + { + if (($targetResource.ContainsKey($parameter.Key)) -and + ($parameter.Key -notin $excludedTestParameters) -and + ($parameter.Value -ne $targetResource[$parameter.Key])) + { + $isTargetResourceCompliant = $false + Write-Verbose -Message ($localizedData.PropertyMismatch -f $parameter.Key, + $parameter.Value, $targetResource[$parameter.Key]) + } + } + + if ($isTargetResourceCompliant) + { + Write-Verbose -Message ($localizedData.VMProcessorInDesiredState -f $VMName) + } + else + { + Write-Verbose -Message ($localizedData.VMProcessorNotInDesiredState -f $VMName) + } + + return $isTargetResourceCompliant +} #end function + +<# +.SYNOPSIS + Configures MSFT_xVMProcessor resource state. + +.PARAMETER VMName + Specifies the name of the virtual machine on which the processor is to be configured. + +.PARAMETER EnableHostResourceProtection + Specifies whether to enable host resource protection. + NOTE: Only supported on Windows 10 and Server 2016. + +.PARAMETER ExposeVirtualizationExtensions + Specifies whether nested virtualization is enabled. + NOTE: Only supported on Windows 10 and Server 2016. + +.PARAMETER HwThreadCountPerCore + Specifies the maximum thread core per processor core + NOTE: Only supported on Windows 10 and Server 2016. + +.PARAMETER Maximum + Specifies the maximum percentage of resources available to the virtual machine + processor to be configured. Allowed values range from 0 to 100. + +.PARAMETER MaximumCountPerNumaNode + Specifies the maximum number of processors per NUMA node to be configured for + the virtual machine. + +.PARAMETER MaximumCountPerNumaSocket + Specifies the maximum number of sockets per NUMA node to be configured for + the virtual machine. + +.PARAMETER RelativeWeight + Specifies the priority for allocating the physical computer's processing + power to this virtual machine relative to others. Allowed values range + from 1 to 10000. + +.PARAMETER Reserve + Specifies the percentage of processor resources to be reserved for this + virtual machine. Allowed values range from 0 to 100. + +.PARAMETER ResourcePoolName + Specifies the name of the processor resource pool to be used. + +.PARAMETER CompatibilityForMigrationEnabled + Specifies whether the virtual processors features are to be limited + for compatibility when migrating the virtual machine to another host. + +.PARAMETER CompatibilityForOlderOperatingSystemsEnabled + Specifies whether the virtual processor’s features are to be limited + for compatibility with older operating systems. + +.PARAMETER RestartIfNeeded + If specified, shutdowns and restarts the VM if needed for property + changes. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter()] + [System.Boolean] + $EnableHostResourceProtection, + + [Parameter()] + [System.Boolean] + $ExposeVirtualizationExtensions, + + [Parameter()] + [System.UInt64] + $HwThreadCountPerCore, + + [Parameter()] + [ValidateRange(0,100)] + [System.UInt64] + $Maximum, + + [Parameter()] + [System.UInt32] + $MaximumCountPerNumaNode, + + [Parameter()] + [System.UInt32] + $MaximumCountPerNumaSocket, + + [Parameter()] + [ValidateRange(0,10000)] + [System.UInt32] + $RelativeWeight, + + [Parameter()] + [ValidateRange(0,100)] + [System.UInt64] + $Reserve, + + [Parameter()] + [System.String] + $ResourcePoolName, + + [Parameter()] + [System.Boolean] + $CompatibilityForMigrationEnabled, + + [Parameter()] + [System.Boolean] + $CompatibilityForOlderOperatingSystemsEnabled, + + [Parameter()] + [System.Boolean] + $RestartIfNeeded + ) + + Assert-Module -Name 'Hyper-V' + Assert-TargetResourceParameter @PSBoundParameters + + # Parameters requiring shutdown. + $restartRequiredParameterNames = @( + 'ExposeVirtualizationExtensions', + 'CompatibilityForMigrationEnabled', + 'CompatibilityForOlderOperatingSystemsEnabled', + 'HwThreadCountPerCore', + 'MaximumCountPerNumaNode', + 'MaximumCountPerNumaSocket', + 'ResourcePoolName' + ) + $isRestartRequired = $false + $vmObject = Get-VM -Name $VMName + + # Only check for restart required parameters if VM is not off + if ($vmObject.State -ne 'Off') + { + foreach ($parameterName in $restartRequiredParameterNames) + { + if ($PSBoundParameters.ContainsKey($parameterName)) + { + if (-not $RestartIfNeeded) + { + $errorMessage = $localized.CannotUpdateVmOnlineError -f $parameterName + New-InvalidOperationError -ErrorId InvalidState -ErrorMessage $errorMessage + } + else + { + $isRestartRequired = $true + } + } + } #end foreach parameter + } + + $null = $PSBoundParameters.Remove('RestartIfNeeded') + $null = $PSBoundParameters.Remove('VMName') + + if (-not $isRestartRequired) + { + # No parameter specified that requires a restart, so disable the restart flag + Write-Verbose -Message ($localizedData.UpdatingVMProperties -f $VMName) + Set-VMProcessor -VMName $VMName @PSBoundParameters + Write-Verbose -Message ($localizedData.VMPropertiesUpdated -f $VMName) + } + else + { + # Restart is required and that requires turning VM off + $setVMPropertyParameters = @{ + VMName = $VMName + VMCommand = 'Set-VMProcessor' + ChangeProperty = $PSBoundParameters + RestartIfNeeded = $true + Verbose = $Verbose + } + Set-VMProperty @setVMPropertyParameters + } +} #end function + +<# +.SYNOPSIS + Ensures OS supports the supplied parameters. + +.PARAMETER EnableHostResourceProtection + Specifies whether to enable host resource protection. + NOTE: Only supported on Windows 10, Server 2016 and Nano. + +.PARAMETER ExposeVirtualizationExtensions + Specifies whether nested virtualization is enabled. + NOTE: Only supported on Windows 10, Server 2016 and Nano. + +.PARAMETER HwThreadCountPerCore + Specifies the maximum thread core per processor core + NOTE: Only supported on Windows 10, Server 2016 and Nano. + +.PARAMETER RemainingArgument + Catch all to enable splatting of remaining parameters. +#> +function Assert-TargetResourceParameter +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.Boolean] + $EnableHostResourceProtection, + + [Parameter()] + [System.Boolean] + $ExposeVirtualizationExtensions, + + [Parameter()] + [System.UInt64] + $HwThreadCountPerCore, + + [Parameter(ValueFromRemainingArguments)] + [System.Object[]] + $RemainingArguments + ) + + # Get-CimInstance returns build number as a string + $win32OperatingSystem = Get-CimInstance -ClassName Win32_OperatingSystem -Verbose:$false + $osBuildNumber = $win32OperatingSystem.BuildNumber -as [System.Int64] + $build14393RequiredParameterNames = @( + 'EnableHostResourceProtection', + 'ExposeVirtualizationExtensions', + 'HwThreadCountPerCore' + ) + + foreach ($parameterName in $build14393RequiredParameterNames) + { + if (($PSBoundParameters.ContainsKey($parameterName)) -and ($osBuildNumber -lt 14393)) + { + $errorMessage = $localizedData.UnsupportedSystemError -f $parameterName, 14393 + New-InvalidArgumentError -ErrorId SystemUnsupported -ErrorMessage $errorMessage + } + } +} #end function + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/MSFT_xVMProcessor.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/MSFT_xVMProcessor.schema.mof new file mode 100644 index 0000000..0b3c174 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/MSFT_xVMProcessor.schema.mof @@ -0,0 +1,17 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xVMProcessor")] +class MSFT_xVMProcessor : OMI_BaseResource +{ + [Key, Description("Specifies the name of the virtual machine on which the processor is to be configured.")] String VMName; + [Write, Description("Specifies whether to enable host resource protection.")] Boolean EnableHostResourceProtection; + [Write, Description("Specifies whether nested virtualization is enabled.")] Boolean ExposeVirtualizationExtensions; + [Write, Description("Specifies the maximum thread core per processor core.")] Uint64 HwThreadCountPerCore; + [Write, Description("Specifies the maximum percentage of resources available to the virtual machine processor to be configured. Allowed values range from 0 to 100.")] Uint64 Maximum; + [Write, Description("Specifies the maximum number of processors per NUMA node to be configured for the virtual machine.")] Uint32 MaximumCountPerNumaNode; + [Write, Description("Specifies the maximum number of sockets per NUMA node to be configured for the virtual machine.")] Uint32 MaximumCountPerNumaSocket; + [Write, Description("Specifies the priority for allocating the physical computer's processing power to this virtual machine relative to others. Allowed values range from 1 to 10000.")] Uint32 RelativeWeight; + [Write, Description("Specifies the percentage of processor resources to be reserved for this virtual machine. Allowed values range from 0 to 100.")] Uint64 Reserve; + [Write, Description("Specifies the name of the processor resource pool to be used.")] String ResourcePoolName; + [Write, Description("Specifies whether the virtual processors features are to be limited for compatibility when migrating the virtual machine to another host.")] Boolean CompatibilityForMigrationEnabled; + [Write, Description("Specifies whether the virtual processor’s features are to be limited for compatibility with older operating systems.")] Boolean CompatibilityForOlderOperatingSystemsEnabled; + [Write, Description("If specified, shutdowns and restarts the VM if needed for property changes.")] Boolean RestartIfNeeded; +}; diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/en-US/MSFT_xVMProcessor.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/en-US/MSFT_xVMProcessor.psd1 new file mode 100644 index 0000000..fa6eab6 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMProcessor/en-US/MSFT_xVMProcessor.psd1 @@ -0,0 +1,12 @@ +ConvertFrom-StringData @' + QueryingVMProcessor = Querying VM '{0}' processor(s). + PropertyMismatch = Property '{0}' mismatch; expected value '{1}', but was '{2}'. + VMProcessorInDesiredState = VM '{0}' processor(s) in desired state. + VMProcessorNotInDesiredState = VM '{0}' processor(s) not in desired state. + UpdatingVMProperties = Updating VM '{0}' properties. + VMPropertiesUpdated = VM '{0}' properties have been updated. + + VMNotFoundError = VM '{0}' was not found. + UnsupportedSystemError = Parameter '{0}' is not supported on operating system builds earlier than '{1}'. + CannotUpdateVmOnlineError = Cannot change online property '{0}' unless 'RestartIfNeeded' is set to true. +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/MSFT_xVMScsiController.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/MSFT_xVMScsiController.psm1 new file mode 100644 index 0000000..6f7fd14 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/MSFT_xVMScsiController.psm1 @@ -0,0 +1,234 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename MSFT_xVMScsiController.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + # fallback to en-US + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename MSFT_xVMScsiController.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +# Import the common HyperV functions +Import-Module -Name ( Join-Path ` + -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath '\HyperVCommon\HyperVCommon.psm1' ) + +<# + .SYNOPSIS + Returns the current status of the VM SCSI controller. + + .PARAMETER VMName + Specifies the name of the virtual machine whose SCSI controller status is to be fetched. + + .PARAMETER ControllerNumber + Specifies the number of the controller to which the hard disk drive is to be set. + If not specified, the controller number defaults to 0. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [ValidateSet(0, 1, 2, 3)] + [System.UInt32] + $ControllerNumber + ) + + Assert-Module -Name 'Hyper-V' + + $controller = Get-VMScsiController -VMName $VMName -ControllerNumber $ControllerNumber + if ($null -eq $controller) + { + Write-Verbose -Message ($localizedData.ControllerNotFound -f $ControllerNumber, $VMName) + $ensure = 'Absent' + } + else + { + Write-Verbose -Message ($localizedData.ControllerFound -f $ControllerNumber, $VMName) + $ensure = 'Present' + } + + return @{ + VMName = $Controller.VMName + ControllerNumber = $Controller.ControllerNumber + RestartIfNeeded = $false + Ensure = $ensure + } +} + +<# + .SYNOPSIS + Tests the state of a VM SCSI controller. + + .PARAMETER VMName + Specifies the name of the virtual machine whose SCSI controller is to be tested. + + .PARAMETER ControllerNumber + Specifies the number of the controller to which the hard disk drive is to be set. + If not specified, the controller number defaults to 0. + + .PARAMETER RestartIfNeeded + Specifies if the VM should be restarted if needed for property changes. + + .PARAMETER Ensure + Specifies if the SCSI controller should exist or not. Default to Present. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [ValidateSet(0, 1, 2, 3)] + [System.UInt32] + $ControllerNumber, + + [Parameter()] + [System.Boolean] + $RestartIfNeeded, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + $null = $PSBoundParameters.Remove('RestartIfNeeded') + $resource = Get-TargetResource -VMName $VMName -ControllerNumber $ControllerNumber + + $isCompliant = $true + foreach ($key in $resource.Keys) + { + Write-Verbose -Message ($localizedData.ComparingParameter -f $key, + $PSBoundParameters[$key], + $resource[$key]) + $isCompliant = $isCompliant -and ($PSBoundParameters[$key] -eq $resource[$key]) + } + + return $isCompliant +} + +<# + .SYNOPSIS + Manipulates the state of a VM SCSI controller. + + .PARAMETER VMName + Specifies the name of the virtual machine whose SCSI controller is to be manipulated. + + .PARAMETER ControllerNumber + Specifies the number of the controller to which the hard disk drive is to be set. + If not specified, the controller number defaults to 0. + + .PARAMETER RestartIfNeeded + Specifies if the VM should be restarted if needed for property changes. + + .PARAMETER Ensure + Specifies if the SCSI controller should exist or not. Defaults to Present. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [ValidateSet(0, 1, 2, 3)] + [System.UInt32] + $ControllerNumber, + + [Parameter()] + [System.Boolean] + $RestartIfNeeded, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Assert-Module -Name 'Hyper-V' + + # Getting the state of the VM so we can restore it later + $existingVmState = (Get-VMHyperV -VMName $VMName).State + + if ((-not $RestartIfNeeded) -and ($existingVmState -ne 'Off')) + { + $errorMessage = $localizedData.CannotUpdateVmOnlineError -f $VMName + New-InvalidOperationError -ErrorId InvalidState -ErrorMessage $errorMessage + } + + [System.Int32] $scsiControllerCount = @(Get-VMScsiController -VMName $VMName).Count + if ($Ensure -eq 'Present') + { + if ($scsiControllerCount -lt $ControllerNumber) + { + <# + All intermediate controllers should be present on the system as we cannot create + a controller at a particular location. For example, we cannot explicitly create + controller #2 - it will only be controller #2 if controllers #0 and #1 are already + added/present in the VM. + #> + $errorMessage = $localizedData.CannotAddScsiControllerError -f $ControllerNumber + New-InvalidArgumentError -ErrorId InvalidController -ErrorMessage $errorMessage + } + + Set-VMState -Name $VMName -State 'Off' + Write-Verbose -Message ($localizedData.AddingController -f $scsiControllerCount) + Add-VMScsiController -VMName $VMName + } + else + { + if ($scsiControllerCount -ne ($ControllerNumber +1)) + { + <# + All intermediate controllers should be present on the system. Whilst we can remove + a controller at a particular location, all remaining controller numbers may be + reordered. For example, if we remove controller at position #1, then a controller + that was at position #2 will become controller number #1. + #> + $errorMessage = $localizedData.CannotRemoveScsiControllerError -f $ControllerNumber + New-InvalidArgumentError -ErrorId InvalidController -ErrorMessage $errorMessage + } + + Set-VMState -Name $VMName -State 'Off' + Write-Verbose -Message ($localizedData.CheckingExistingDisks -f $ControllerNumber) + $controller = Get-VMScsiController -VMName $VmName -ControllerNumber $ControllerNumber + + foreach ($drive in $controller.Drives) + { + $warningMessage = $localizedData.RemovingDiskWarning -f $drive.Path, $ControllerNumber + Write-Warning -Message $warningMessage + Remove-VMHardDiskDrive -VMHardDiskDrive $drive + } + + Write-Verbose -Message ($localizedData.RemovingController -f $ControllerNumber, $VMName) + Remove-VMScsiController -VMScsiController $controller + } + + # Restore the previous state + Set-VMState -Name $VMName -State $existingVmState +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/MSFT_xVMScsiController.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/MSFT_xVMScsiController.schema.mof new file mode 100644 index 0000000..1eebb01 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/MSFT_xVMScsiController.schema.mof @@ -0,0 +1,8 @@ +[ClassVersion("1.0.0"), FriendlyName("xVMScsiController")] +class MSFT_xVMScsiController : OMI_BaseResource +{ + [Key, Description("Specifies the name of the virtual machine whose SCSI controller status is to be controlled")] String VMName; + [Key, Description("Specifies the number of the SCSI controller whose status is to be controlled. If not specified, it defaults to 0."), ValueMap{"0","1","2","3"}, Values{"0","1","2","3"}] Uint32 ControllerNumber; + [Write, Description("Specifies if the SCSI controller should exist or not. If not specified, it defaults to Present."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Specifies if the VM should be restarted if needed for property changes. If not specified, it defaults to False.")] Boolean RestartIfNeeded; +}; diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/en-US/MSFT_xVMScsiController.strings.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/en-US/MSFT_xVMScsiController.strings.psd1 new file mode 100644 index 0000000..1587659 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMScsiController/en-US/MSFT_xVMScsiController.strings.psd1 @@ -0,0 +1,14 @@ +ConvertFrom-StringData @' + ControllerFound = Found controller '{0}' attached to VM '{1}'. + ControllerNotFound = Controller '{0}' missing from VM '{1}' + ComparingParameter = Comparing '{0}'; expected '{1}', actual '{2}'. + AddingController = Adding controller number '{0}'. + CheckingExistingDisks = Checking for existing disks on controller '{0}'. + RemovingController = Removing controller '{0}' from VM '{1}'. + + RemovingDiskWarning = Removing disk '{0}' from the controller '{1}'. + + CannotUpdateVmOnlineError = Cannot update a running VM unless 'RestartIfNeeded' is set to true. + CannotAddScsiControllerError = Cannot add controller number '{0}'. Ensure that all intermediate controllers are present on the system. + CannotRemoveScsiControllerError = Cannot remove controller number '{0}'. Ensure that you are removing the last controller to ensure that controller numbers are not reordered. +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/MSFT_xVMSwitch.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/MSFT_xVMSwitch.psm1 new file mode 100644 index 0000000..397e464 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/MSFT_xVMSwitch.psm1 @@ -0,0 +1,677 @@ +#region localizeddata +if (Test-Path "${PSScriptRoot}\${PSUICulture}") +{ + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename MSFT_xVMSwitch.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\${PSUICulture}" +} +else +{ + #fallback to en-US + Import-LocalizedData ` + -BindingVariable LocalizedData ` + -Filename MSFT_xVMSwitch.strings.psd1 ` + -BaseDirectory "${PSScriptRoot}\en-US" +} +#endregion + +# Import the common HyperV functions +Import-Module -Name ( Join-Path ` + -Path (Split-Path -Path $PSScriptRoot -Parent) ` + -ChildPath '\HyperVCommon\HyperVCommon.psm1' ) + +<# +.SYNOPSIS + Gets MSFT_xVMSwitch resource current state. + +.PARAMETER Name + Name of the VM Switch. + +.PARAMETER Type + Type of switch. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("External","Internal","Private")] + [String] + $Type + ) + + Write-Verbose -Message "Getting settings for VM Switch '$Name'" + + # Check if Hyper-V module is present for Hyper-V cmdlets + if (!(Get-Module -ListAvailable -Name Hyper-V)) + { + New-InvalidOperationError ` + -ErrorId 'HyperVNotInstalledError' ` + -ErrorMessage $LocalizedData.HyperVNotInstalledError + } + + $switch = Get-VMSwitch -Name $Name -SwitchType $Type -ErrorAction SilentlyContinue + + if ($null -ne $switch) + { + $ensure = 'Present' + if ($switch.SwitchType -eq 'External') + { + if ($switch.EmbeddedTeamingEnabled -ne $true) + { + $netAdapterName = (Get-NetAdapter -InterfaceDescription $switch.NetAdapterInterfaceDescription -ErrorAction SilentlyContinue).Name + $description = $switch.NetAdapterInterfaceDescription + + $loadBalancingAlgorithm = 'NA' + } + else + { + $netAdapterName = (Get-NetAdapter -InterfaceDescription $switch.NetAdapterInterfaceDescriptions).Name + $description = $switch.NetAdapterInterfaceDescriptions + + $loadBalancingAlgorithm = ($switch | Get-VMSwitchTeam).LoadBalancingAlgorithm.toString() + } + } + else + { + $netAdapterName = $null + $description = $null + } + } + else + { + $ensure = 'Absent' + } + + $returnValue = @{ + Name = $switch.Name + Type = $switch.SwitchType + NetAdapterName = [string[]]$netAdapterName + AllowManagementOS = $switch.AllowManagementOS + EnableEmbeddedTeaming = $switch.EmbeddedTeamingEnabled + LoadBalancingAlgorithm = $loadBalancingAlgorithm + Ensure = $ensure + Id = $switch.Id + NetAdapterInterfaceDescription = $description + } + + if ($null -ne $switch.BandwidthReservationMode) + { + $returnValue['BandwidthReservationMode'] = $switch.BandwidthReservationMode + } + else + { + $returnValue['BandwidthReservationMode'] = 'NA' + } + + return $returnValue +} + +<# +.SYNOPSIS + Configures MSFT_xVMSwitch resource state. + +.PARAMETER Name + Name of the VM Switch. + +.PARAMETER Type + Type of switch. + +.PARAMETER NetAdapterName + Network adapter name(s) for external switch type. + +.PARAMETER AllowManagementOS + Specify if the VM host has access to the physical NIC. + +.PARAMETER EnableEmbeddedTeaming + Should embedded NIC teaming be used (Windows Server 2016 only). + +.PARAMETER BandwidthReservationMode + Type of Bandwidth Reservation Mode to use for the switch. + +.PARAMETER LoadBalancingAlgorithm + The load balancing algorithm that this switch team use. + +.PARAMETER Id + Desired unique ID of the Hyper-V Switch (Windows Server 2016 only). + +.PARAMETER Ensure + Whether switch should be present or absent. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("External","Internal","Private")] + [String] + $Type, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $NetAdapterName, + + [Parameter()] + [Boolean] + $AllowManagementOS = $false, + + [Parameter()] + [Boolean] + $EnableEmbeddedTeaming = $false, + + [Parameter()] + [ValidateSet("Default","Weight","Absolute","None","NA")] + [String] + $BandwidthReservationMode = "NA", + + [Parameter()] + [ValidateSet('Dynamic','HyperVPort')] + [String] + $LoadBalancingAlgorithm, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [ValidateScript({$testGuid = New-Guid; if([guid]::TryParse($_,[ref]$testGuid)){return $true}else{Throw 'The VMSwitch Id must be in GUID format!'}})] + [String] + $Id, + + [Parameter()] + [ValidateSet("Present","Absent")] + [String] + $Ensure = "Present" + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if (!(Get-Module -ListAvailable -Name Hyper-V)) + { + New-InvalidOperationError ` + -ErrorId 'HyperVNotInstalledError' ` + -ErrorMessage $LocalizedData.HyperVNotInstalledError + } + + # Check to see if the BandwidthReservationMode chosen is supported in the OS + elseif (($BandwidthReservationMode -ne "NA") -and ((Get-OSVersion) -lt [version]'6.2.0')) + { + New-InvalidArgumentError ` + -ErrorId 'BandwidthReservationModeError' ` + -ErrorMessage $LocalizedData.BandwidthReservationModeError + } + + if ($EnableEmbeddedTeaming -eq $true -and (Get-OSVersion).Major -lt 10) + { + New-InvalidArgumentError ` + -ErrorId 'SETServer2016Error' ` + -ErrorMessage $LocalizedData.SETServer2016Error + } + + if (($PSBoundParameters.ContainsKey('Id')) -and (Get-OSVersion).Major -lt 10) + { + New-InvalidArgumentError ` + -ErrorId 'VMSwitchIDServer2016Error' ` + -ErrorMessage $LocalizedData.VMSwitchIDServer2016Error + } + + if ($Ensure -eq 'Present') + { + $switch = (Get-VMSwitch -Name $Name -SwitchType $Type -ErrorAction SilentlyContinue) + + # If switch is present and it is external type, that means it doesn't have right properties (TEST code ensures that) + if ($switch -and ($switch.SwitchType -eq 'External')) + { + $removeReaddSwitch = $false + + Write-Verbose -Message ($LocalizedData.CheckingSwitchMessage -f $Name) + if ($switch.EmbeddedTeamingEnabled -eq $false -or $null -eq $switch.EmbeddedTeamingEnabled) + { + if ((Get-NetAdapter -Name $NetAdapterName).InterfaceDescription -ne $switch.NetAdapterInterfaceDescription) + { + Write-Verbose -Message ($LocalizedData.NetAdapterInterfaceIncorrectMessage -f $Name) + $removeReaddSwitch = $true + } + } + else + { + $adapters = (Get-NetAdapter -InterfaceDescription $switch.NetAdapterInterfaceDescriptions -ErrorAction SilentlyContinue).Name + if ($null -ne (Compare-Object -ReferenceObject $adapters -DifferenceObject $NetAdapterName)) + { + Write-Verbose -Message ($LocalizedData.SwitchIncorrectNetworkAdapters -f $Name) + $removeReaddSwitch = $true + } + } + + if (($BandwidthReservationMode -ne "NA") -and ($switch.BandwidthReservationMode -ne $BandwidthReservationMode)) + { + Write-Verbose -Message ($LocalizedData.BandwidthReservationModeIncorrect -f $Name) + $removeReaddSwitch = $true + } + + if ($null -ne $switch.EmbeddedTeamingEnabled -and + $switch.EmbeddedTeamingEnabled -ne $EnableEmbeddedTeaming) + { + Write-Verbose -Message ($LocalizedData.EnableEmbeddedTeamingIncorrect -f $Name) + $removeReaddSwitch = $true + } + + if ($null -ne $switch.EmbeddedTeamingEnabled -and + $switch.EmbeddedTeamingEnabled -ne $EnableEmbeddedTeaming) + { + Write-Verbose -Message ($LocalizedData.EnableEmbeddedTeamingIncorrect -f $Name) + $removeReaddSwitch = $true + } + + if ($PSBoundParameters.ContainsKey('Id') -and $switch.Id -ne $Id) + { + Write-Verbose -Message ($LocalizedData.IdIncorrect -f $Name) + $removeReaddSwitch = $true + } + + if ($removeReaddSwitch) + { + Write-Verbose -Message ($LocalizedData.RemoveAndReaddSwitchMessage -f $Name) + $switch | Remove-VMSwitch -Force + $parameters = @{} + $parameters["Name"] = $Name + $parameters["NetAdapterName"] = $NetAdapterName + + if ($BandwidthReservationMode -ne "NA") + { + $parameters["MinimumBandwidthMode"] = $BandwidthReservationMode + } + + if ($PSBoundParameters.ContainsKey("AllowManagementOS")) + { + $parameters["AllowManagementOS"] = $AllowManagementOS + } + + if ($PSBoundParameters.ContainsKey("EnableEmbeddedTeaming")) + { + $parameters["EnableEmbeddedTeaming"] = $EnableEmbeddedTeaming + } + + if ($PSBoundParameters.ContainsKey('Id')) + { + $parameters["Id"] = $Id.ToString() + } + + $null = New-VMSwitch @parameters + # Since the switch is recreated, the $switch variable is stale and needs to be reassigned + $switch = (Get-VMSwitch -Name $Name -SwitchType $Type -ErrorAction SilentlyContinue) + } + else + { + Write-Verbose -Message ($LocalizedData.SwitchCorrectNetAdapterAndBandwidthMode -f $Name, ($NetAdapterName -join ','), $BandwidthReservationMode) + } + + Write-Verbose -Message ($LocalizedData.CheckAllowManagementOS -f $Name) + if ($PSBoundParameters.ContainsKey("AllowManagementOS") -and ($switch.AllowManagementOS -ne $AllowManagementOS)) + { + Write-Verbose -Message ($LocalizedData.AllowManagementOSIncorrect -f $Name) + $switch | Set-VMSwitch -AllowManagementOS $AllowManagementOS + Write-Verbose -Message ($LocalizedData.AllowManagementOSUpdated -f $Name, $AllowManagementOS) + } + else + { + Write-Verbose -Message ($LocalizedData.AllowManagementOSCorrect -f $Name) + } + } + + # If the switch is not present, create one + else + { + Write-Verbose -Message ($LocalizedData.PresentNotCorrect -f $Name, $Ensure) + Write-Verbose -Message $LocalizedData.CreatingSwitch + $parameters = @{} + $parameters["Name"] = $Name + + if ($BandwidthReservationMode -ne "NA") + { + $parameters["MinimumBandwidthMode"] = $BandwidthReservationMode + } + + if ($NetAdapterName) + { + $parameters["NetAdapterName"] = $NetAdapterName + if ($PSBoundParameters.ContainsKey("AllowManagementOS")) + { + $parameters["AllowManagementOS"] = $AllowManagementOS + } + } + else + { + $parameters["SwitchType"] = $Type + } + + if ($PSBoundParameters.ContainsKey("EnableEmbeddedTeaming")) + { + $parameters["EnableEmbeddedTeaming"] = $EnableEmbeddedTeaming + } + + if ($PSBoundParameters.ContainsKey('Id')) + { + $parameters["Id"] = $Id + } + + $switch = New-VMSwitch @parameters + Write-Verbose -Message ($LocalizedData.PresentCorrect -f $Name, $Ensure) + } + + # Set the load balancing algorithm if it's a SET Switch and the parameter is specified + if($EnableEmbeddedTeaming -eq $true -and $PSBoundParameters.ContainsKey('LoadBalancingAlgorithm')) + { + Write-Verbose -Message ($LocalizedData.SetLoadBalancingAlgorithmMessage -f $Name, $LoadBalancingAlgorithm) + Set-VMSwitchTeam -Name $switch.Name -LoadBalancingAlgorithm $LoadBalancingAlgorithm -Verbose + } + } + # Ensure is set to "Absent", remove the switch + else + { + Get-VMSwitch $Name -ErrorAction SilentlyContinue | Remove-VMSwitch -Force + } +} + +<# +.SYNOPSIS + Tests if MSFT_xVMSwitch resource state is in the desired state or not. + +.PARAMETER Name + Name of the VM Switch. + +.PARAMETER Type + Type of switch. + +.PARAMETER NetAdapterName + Network adapter name(s) for external switch type. + +.PARAMETER AllowManagementOS + Specify if the VM host has access to the physical NIC. + +.PARAMETER EnableEmbeddedTeaming + Should embedded NIC teaming be used (Windows Server 2016 only). + +.PARAMETER BandwidthReservationMode + Type of Bandwidth Reservation Mode to use for the switch. + +.PARAMETER LoadBalancingAlgorithm + The load balancing algorithm that this switch team use. + +.PARAMETER Id + Desired unique ID of the Hyper-V Switch (Windows Server 2016 only). + +.PARAMETER Ensure + Whether switch should be present or absent. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet("External","Internal","Private")] + [String] + $Type, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [String[]] + $NetAdapterName, + + [Parameter()] + [Boolean] + $AllowManagementOS = $false, + + [Parameter()] + [Boolean] + $EnableEmbeddedTeaming = $false, + + [Parameter()] + [ValidateSet("Default","Weight","Absolute","None","NA")] + [String] + $BandwidthReservationMode = "NA", + + [Parameter()] + [ValidateSet('Dynamic','HyperVPort')] + [String] + $LoadBalancingAlgorithm, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [ValidateScript({$testGuid = New-Guid; if([guid]::TryParse($_,[ref]$testGuid)){return $true}else{Throw 'The VMSwitch Id must be in GUID format!'}})] + [String] + $Id, + + [Parameter()] + [ValidateSet("Present","Absent")] + [String] + $Ensure = "Present" + ) + + # Check if Hyper-V module is present for Hyper-V cmdlets + if (!(Get-Module -ListAvailable -Name Hyper-V)) + { + New-InvalidOperationError ` + -ErrorId 'HyperVNotInstalledError' ` + -ErrorMessage $LocalizedData.HyperVNotInstalledError + } + + #region input validation + if ($Type -eq 'External' -and !($NetAdapterName)) + { + New-InvalidArgumentError ` + -ErrorId 'NetAdapterNameRequiredError' ` + -ErrorMessage $LocalizedData.NetAdapterNameRequiredError + } + + if ($Type -ne 'External' -and $NetAdapterName) + { + New-InvalidArgumentError ` + -ErrorId 'NetAdapterNameNotRequiredError' ` + -ErrorMessage $LocalizedData.NetAdapterNameNotRequiredError + } + + if (($BandwidthReservationMode -ne "NA") -and ((Get-OSVersion) -lt [version]'6.2.0')) + { + New-InvalidArgumentError ` + -ErrorId 'BandwidthReservationModeError' ` + -ErrorMessage $LocalizedData.BandwidthReservationModeError + } + + if ($EnableEmbeddedTeaming -eq $true -and (Get-OSVersion).Major -lt 10) + { + New-InvalidArgumentError ` + -ErrorId 'SETServer2016Error' ` + -ErrorMessage $LocalizedData.SETServer2016Error + } + + if (($PSBoundParameters.ContainsKey('Id')) -and (Get-OSVersion).Major -lt 10) + { + New-InvalidArgumentError ` + -ErrorId 'VMSwitchIDServer2016Error' ` + -ErrorMessage $LocalizedData.VMSwitchIDServer2016Error + } + #endregion + + try + { + # Check if switch exists + Write-Verbose -Message ($LocalizedData.PresentChecking -f $Name, $Ensure) + $switch = Get-VMSwitch -Name $Name -SwitchType $Type -ErrorAction Stop + + # If switch exists + if ($null -ne $switch) + { + Write-Verbose -Message ($LocalizedData.SwitchPresent -f $Name) + # If switch should be present, check the switch type + if ($Ensure -eq 'Present') + { + ## Only check the BandwidthReservationMode if specified + if ($PSBoundParameters.ContainsKey('BandwidthReservationMode')) + { + # If the BandwidthReservationMode is correct, or if $switch.BandwidthReservationMode is $null which means it isn't supported on the OS + Write-Verbose -Message ($LocalizedData.CheckingBandwidthReservationMode -f $Name) + if ($switch.BandwidthReservationMode -eq $BandwidthReservationMode -or $null -eq $switch.BandwidthReservationMode) + { + Write-Verbose -Message ($LocalizedData.BandwidthReservationModeCorrect -f $Name) + } + else + { + Write-Verbose -Message ($LocalizedData.BandwidthReservationModeIncorrect -f $Name) + return $false + } + } + + # If switch is the external type, check additional properties + if ($Type -eq 'External') + { + if ($EnableEmbeddedTeaming -eq $false) + { + Write-Verbose -Message ($LocalizedData.CheckingNetAdapterInterface -f $Name) + $adapter = $null + try + { + $adapter = Get-NetAdapter -Name $NetAdapterName -ErrorAction SilentlyContinue + } + catch + { + # There are scenarios where the SilentlyContinue error action is not honoured, + # so this block serves to handle those and the write-verbose message is here + # to ensure that script analyser doesn't see an empty catch block to throw an + # error + Write-Verbose -Message $LocalizedData.NetAdapterNotFound + } + + if ($adapter.InterfaceDescription -ne $switch.NetAdapterInterfaceDescription) + { + return $false + } + else + { + Write-Verbose -Message ($LocalizedData.NetAdapterInterfaceCorrect -f $Name) + } + } + else + { + Write-Verbose -Message ($LocalizedData.CheckingNetAdapterInterfaces -f $Name) + if ($null -ne $switch.NetAdapterInterfaceDescriptions) + { + $adapters = (Get-NetAdapter -InterfaceDescription $switch.NetAdapterInterfaceDescriptions -ErrorAction SilentlyContinue).Name + if ($null -ne (Compare-Object -ReferenceObject $adapters -DifferenceObject $NetAdapterName)) + { + Write-Verbose -Message ($LocalizedData.IncorrectNetAdapterInterfaces -f $Name) + return $false + } + else + { + Write-Verbose -Message ($LocalizedData.CorrectNetAdapterInterfaces -f $Name) + } + } + else + { + Write-Verbose -Message ($LocalizedData.IncorrectNetAdapterInterfaces -f $Name) + return $false + } + } + + if ($PSBoundParameters.ContainsKey("AllowManagementOS")) + { + Write-Verbose -Message ($LocalizedData.CheckAllowManagementOS -f $Name) + if (($switch.AllowManagementOS -ne $AllowManagementOS)) + { + return $false + } + else + { + Write-Verbose -Message ($LocalizedData.AllowManagementOSCorrect -f $Name) + } + } + + if($PSBoundParameters.ContainsKey('LoadBalancingAlgorithm')) + { + Write-Verbose -Message ($LocalizedData.CheckingLoadBalancingAlgorithm -f $Name) + $loadBalancingAlgorithm = ($switch | Get-VMSwitchTeam).LoadBalancingAlgorithm.toString() + if($loadBalancingAlgorithm -ne $LoadBalancingAlgorithm) + { + return $false + } + else + { + Write-Verbose -Message ($LocalizedData.LoadBalancingAlgorithmCorrect -f $Name) + } + } + } + + # Only check embedded teaming if specified + if ($PSBoundParameters.ContainsKey("EnableEmbeddedTeaming") -eq $true) + { + Write-Verbose -Message ($LocalizedData.CheckEnableEmbeddedTeaming -f $Name) + if ($switch.EmbeddedTeamingEnabled -eq $EnableEmbeddedTeaming -or $null -eq $switch.EmbeddedTeamingEnabled) + { + Write-Verbose -Message ($LocalizedData.EnableEmbeddedTeamingCorrect -f $Name) + } + else + { + Write-Verbose -Message ($LocalizedData.EnableEmbeddedTeamingIncorrect -f $Name) + return $false + } + } + + # Check if the Switch has the desired ID + if ($PSBoundParameters.ContainsKey("Id") -eq $true) + { + Write-Verbose -Message ($LocalizedData.CheckID -f $Name) + if ($switch.Id.Guid -eq $Id) + { + Write-Verbose -Message ($LocalizedData.IdCorrect -f $Name) + } + else + { + Write-Verbose -Message ($LocalizedData.IdIncorrect -f $Name) + return $false + } + } + + return $true + } + # If switch should be absent, but is there, return $false + else + { + return $false + } + } + } + + # If no switch was present + catch [System.Management.Automation.ActionPreferenceStopException] + { + Write-Verbose -Message ($LocalizedData.SwitchNotPresent -f $Name) + return ($Ensure -eq 'Absent') + } +} + +<# +.SYNOPSIS +Returns the OS version +#> +function Get-OSVersion +{ + [Environment]::OSVersion.Version +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/MSFT_xVMSwitch.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/MSFT_xVMSwitch.schema.mof new file mode 100644 index 0000000..4f6df35 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/MSFT_xVMSwitch.schema.mof @@ -0,0 +1,14 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xVMSwitch")] +class MSFT_xVMSwitch : OMI_BaseResource +{ + [Key, Description("Name of the VM Switch")] String Name; + [Key, Description("Type of switch"), ValueMap{"External","Internal","Private"}, Values{"External","Internal","Private"}] String Type; + [Write, Description("Network adapter name(s) for external switch type")] String NetAdapterName[]; + [Write, Description("Specify if the VM host has access to the physical NIC")] Boolean AllowManagementOS; + [Write, Description("Should embedded NIC teaming be used (Windows Server 2016 only)")] Boolean EnableEmbeddedTeaming; + [Write, Description("Type of Bandwidth Reservation Mode to use for the switch"), ValueMap{"Default","Weight","Absolute","None","NA"}, Values{"Default","Weight","Absolute","None","NA"}] String BandwidthReservationMode; + [Write, Description("Specifies the load balancing algorithm that this switch team uses"), ValueMap{"Dynamic","HyperVPort"}, Values{"Dynamic","HyperVPort"}] String LoadBalancingAlgorithm; + [Write, Description("Whether switch should be present or absent"), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Unique ID for the switch (Only settable on Windows Server 2016!)")] String Id; + [Read, Description("Description of the network interface")] String NetAdapterInterfaceDescription; +}; diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/en-us/MSFT_xVMSwitch.strings.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/en-us/MSFT_xVMSwitch.strings.psd1 new file mode 100644 index 0000000..dacd8f9 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVMSwitch/en-us/MSFT_xVMSwitch.strings.psd1 @@ -0,0 +1,43 @@ +ConvertFrom-StringData @' + CheckingSwitchMessage = Checking switch '{0}' NetAdapterInterface and BandwidthReservationMode ... + NetAdapterInterfaceIncorrectMessage = The switch '{0}' NetAdapterInterface is incorrect ... + SwitchIncorrectNetworkAdapters = Switch '{0}' has an incorrect list of network adapters... + BandwidthReservationModeIncorrect = The switch '{0}' BandwidthReservationMode is incorrect ... + EnableEmbeddedTeamingIncorrect = The switch '{0}' EnableEmbeddedTeaming is incorrect ... + RemoveAndReaddSwitchMessage = Removing switch '{0}' and creating with the correct properties ... + SwitchCorrectNetAdapterAndBandwidthMode = Switch '{0}' set has right network adapter(s) ('{1}') and BandwidthReservationMode ('{2}') + CheckAllowManagementOS = Checking switch '{0}' AllowManagementOS ... + AllowManagementOSIncorrect = Switch '{0}' AllowManagementOS property is not correct + AllowManagementOSUpdated = Switch '{0}' AllowManagementOS property is set to '{1}' + AllowManagementOSCorrect = Switch '{0}' AllowManagementOS is correctly set + PresentNotCorrect = Switch '{0}' is not '{1}'. + CreatingSwitch = Creating Switch ...Checking + PresentCorrect = Switch '{0}' is now '{1}'. + PresentChecking = Checking if Switch '{0}' is '{1}' ... + SwitchPresent = Switch '{0}' is Present + SwitchNotPresent = Switch '{0}' is Absent + CheckingBandwidthReservationMode = Checking if Switch '{0}' has correct BandwidthReservationMode ... + BandwidthReservationModeCorrect = Switch '{0}' has correct BandwidthReservationMode or it does not apply to this OS + CheckingNetAdapterInterface = Checking if Switch '{0}' has correct NetAdapterInterface ... + NetAdapterNotFound = Network adapter not found + NetAdapterInterfaceCorrect = Switch '{0}' has correct NetAdapterInterface + CheckingNetAdapterInterfaces = Checking if Switch '{0}' has correct NetAdapterInterfaces ... + IncorrectNetAdapterInterfaces = Switch '{0}' has an incorrect list of network adapters + CorrectNetAdapterInterfaces = Switch '{0}' has a correct list of network adapters + CheckEnableEmbeddedTeaming = Checking if Switch '{0}' has correct EnableEmbeddedTeaming ... + EnableEmbeddedTeamingCorrect = Switch '{0}' has correct EnableEmbeddedTeaming or it does not apply to this OS + SetLoadBalancingAlgorithmMessage = Set Load Balancing Algorithm of Switch '{0}' to '{1}' + CheckingLoadBalancingAlgorithm = Checking if Switch '{0}' has correct LoadBalancingAlgorithm ... + LoadBalancingAlgorithmCorrect = Switch '{0}' has correct LoadBalancingAlgorithm + + SETServer2016Error = Embedded teaming is only supported on Windows Server 2016 + HyperVNotInstalledError = Please ensure that the Hyper-V role is installed with its PowerShell module + BandwidthReservationModeError = The BandwidthReservationMode cannot be set on a Hyper-V version lower than 2012 + NetAdapterNameRequiredError = For external switch type, NetAdapterName must be specified + NetAdapterNameNotRequiredError = For Internal or Private switch type, NetAdapterName should not be specified + + VMSwitchIDServer2016Error = User defined VMSwitch ID is only supported on Windows Server 2016 and onwards + CheckID = Checking if Switch '{0}' has the desired Id ... + IdCorrect = Switch '{0}' has the desired Id + IdIncorrect = Switch '{0}' has NOT the desired Id +'@ diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVhdFileDirectory/MSFT_xVhdFileDirectory.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVhdFileDirectory/MSFT_xVhdFileDirectory.psm1 new file mode 100644 index 0000000..218d243 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVhdFileDirectory/MSFT_xVhdFileDirectory.psm1 @@ -0,0 +1,504 @@ + +<# +# Get the current configuration of the machine +# This function is called when you do Get-DscConfiguration after the configuration is set. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VhdPath, + + [Parameter(Mandatory = $true)] + [Microsoft.Management.Infrastructure.CimInstance[]] + $FileDirectory, + + [Parameter()] + [ValidateSet('ModifiedDate','SHA-1','SHA-256','SHA-512')] + [System.String] + $CheckSum = 'ModifiedDate' + ) + + if ( -not (Test-path $VhdPath)) + { + $item = New-CimInstance -ClassName MSFT_FileDirectoryConfiguration -Property @{DestinationPath = $VhdPath; Ensure = "Absent"} -Namespace root/microsoft/windows/desiredstateconfiguration -ClientOnly + + Return @{ + VhdPath = $VhdPath + FileDirectory = $item + } + } + + # Mount VHD. + $mountVHD = EnsureVHDState -Mounted -vhdPath $vhdPath + + $itemsFound = foreach($Item in $FileDirectory) + { + $item = GetItemToCopy -item $item + $mountedDrive = $mountVHD | Get-Disk | Get-Partition | Where-Object -FilterScript {$_.Type -ne 'Recovery'} | Get-Volume + $letterDrive = (-join $mountedDrive.DriveLetter) + ":\" + + # show the drive letters. + Get-PSDrive | Write-Verbose + + $finalPath = Join-Path $letterDrive $item.DestinationPath + + Write-Verbose "Getting the current value at $finalPath ..." + + if (Test-Path $finalPath) + { + New-CimInstance -ClassName MSFT_FileDirectoryConfiguration -Property @{DestinationPath = $finalPath; Ensure = "Present"} -Namespace root/microsoft/windows/desiredstateconfiguration -ClientOnly + } + else + { + New-CimInstance -ClassName MSFT_FileDirectoryConfiguration -Property @{DestinationPath = $finalPath ; Ensure = "Absent"} -Namespace root/microsoft/windows/desiredstateconfiguration -ClientOnly + } + } + + # Dismount VHD. + EnsureVHDState -Dismounted -vhdPath $VhdPath + + # Return the result. + Return @{ + VhdPath = $VhdPath + FileDirectory = $itemsFound + } +} + + +# This is a resource method that gets called if the Test-TargetResource returns false. +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VhdPath, + + [Parameter(Mandatory = $true)] + [Microsoft.Management.Infrastructure.CimInstance[]] + $FileDirectory, + + [Parameter()] + [ValidateSet('ModifiedDate','SHA-1','SHA-256','SHA-512')] + [System.String] + $CheckSum = 'ModifiedDate' + ) + + if (-not (Test-Path $VhdPath)) { throw "Specified destination path $VhdPath does not exist!"} + + # mount the VHD. + $mountedVHD = EnsureVHDState -Mounted -vhdPath $VhdPath + + try + { + # show the drive letters. + Get-PSDrive | Write-Verbose + + $mountedDrive = $mountedVHD | Get-Disk | Get-Partition | Where-Object -FilterScript {$_.Type -ne 'Recovery'} | Get-Volume + + foreach ($item in $FileDirectory) + { + $itemToCopy = GetItemToCopy -item $item + $letterDrive = (-join $mountedDrive.DriveLetter) + ":\" + $finalDestinationPath = $letterDrive + $finalDestinationPath = Join-Path $letterDrive $itemToCopy.DestinationPath + + # if the destination should be removed + if (-not($itemToCopy.Ensure)) + { + if (Test-Path $finalDestinationPath) + { + SetVHDFile -destinationPath $finalDestinationPath -ensure:$false -recurse:($itemToCopy.Recurse) + } + } + else + { + # Copy Scenario + if ($itemToCopy.SourcePath) + { + SetVHDFile -sourcePath $itemToCopy.SourcePath -destinationPath $finalDestinationPath -recurse:($itemToCopy.Recurse) -force:($itemToCopy.Force) + } + elseif ($itemToCopy.Content) + { + "Writing a content to a file" + + # if the type is not specified assume it is a file. + if (-not ($itemToCopy.Type)) + { + $itemToCopy.Type = 'File' + } + + # Create file/folder scenario + SetVHDFile -destinationPath $finalDestinationPath -type $itemToCopy.Type -force:($itemToCopy.Force) -content $itemToCopy.Content + } + + # Set Attribute scenario + if ($itemToCopy.Attributes) + { + SetVHDFile -destinationPath $finalDestinationPath -attribute $itemToCopy.Attributes -force:($itemToCopy.Force) + } + } + + } + } + finally + { + EnsureVHDState -Dismounted -vhdPath $VhdPath + } +} + +# This function returns if the current configuration of the machine is the same as the desired configration for this resource. +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VhdPath, + + [Parameter(Mandatory = $true)] + [Microsoft.Management.Infrastructure.CimInstance[]] + $FileDirectory, + + [Parameter()] + [ValidateSet('ModifiedDate','SHA-1','SHA-256','SHA-512')] + [System.String] + $CheckSum = 'ModifiedDate' + ) + + # If the VHD path does not exist throw an error and stop. + if ( -not (Test-Path $VhdPath)) + { + throw "VHD does not exist in the specified path $VhdPath" + } + + # mount the vhd. + $mountedVHD = EnsureVHDState -Mounted -vhdPath $VhdPath + + try + { + # Show the drive letters after mount + Get-PSDrive | Write-Verbose + + $mountedDrive = $mountedVHD | Get-Disk | Get-Partition | Where-Object -FilterScript {$_.Type -ne 'Recovery'} | Get-Volume + $letterDrive = (-join $mountedDrive.DriveLetter) + ":\" + Write-Verbose $letterDrive + + # return test result equal to true unless one of the tests in the loop below fails. + $result = $true + + foreach ($item in $FileDirectory) + { + $itemToCopy = GetItemToCopy -item $item + $destination = $itemToCopy.DestinationPath + Write-Verbose ("Testing the file with relative VHD destination $destination") + $destination = $itemToCopy.DestinationPath + $finalDestinationPath = $letterDrive + $finalDestinationPath = Join-Path $letterDrive $destination + + if (Test-Path $finalDestinationPath) + { + if( -not ($itemToCopy.Ensure)) + { + $result = $false + break; + } + else + { + $itemToCopyIsFile = Test-Path $itemToCopy.SourcePath -PathType Leaf + $destinationIsFolder = Test-Path $finalDestinationPath -PathType Container + + if ($itemToCopyIsFile -and $destinationIsFolder) + { + # Verify if the file exist inside the folder + $fileName = Split-Path $itemToCopy.SourcePath -Leaf + Write-Verbose "Checking if $fileName exist under $finalDestinationPath" + $fileExistInDestination = Test-Path (Join-Path $finalDestinationPath $fileName) + + # Report if the file exist on the destination folder. + Write-Verbose "File exist on the destination under $finalDestinationPath :- $fileExistInDestination" + $result = $fileExistInDestination + $result = $result -and -not(ItemHasChanged -sourcePath $itemToCopy.SourcePath -destinationPath (Join-Path $finalDestinationPath $fileName) -CheckSum $CheckSum) + } + + if (($itemToCopy.Type -eq "Directory") -and ($itemToCopy.Recurse)) + { + $result = $result -and -not(ItemHasChanged -sourcePath $itemToCopy.SourcePath -destinationPath $finalDestinationPath -CheckSum $CheckSum) + + if (-not ($result)) + { + break; + } + } + } + } + else + { + # If Ensure is specified as Present or if Ensure is not specified at all. + if(($itemToCopy.Ensure)) + { + $result = $false + break; + } + } + + # Check the attribute + if ($itemToCopy.Attributes) + { + $currentAttribute = @(Get-ItemProperty -Path $finalDestinationPath | ForEach-Object -MemberName Attributes) + $result = $currentAttribute.Contains($itemToCopy.Attributes) + } + } + } + finally + { + EnsureVHDState -Dismounted -vhdPath $VhdPath + } + + + Write-Verbose "Test returned $result" + return $result; +} + +# Assert the state of the VHD. +function EnsureVHDState +{ + [CmdletBinding(DefaultParametersetName="Mounted")] + param( + + [Parameter(ParameterSetName = "Mounted")] + [switch]$Mounted, + [Parameter(ParameterSetName = "Dismounted")] + [switch]$Dismounted, + [Parameter(Mandatory=$true)] + $vhdPath + ) + + if ( -not ( Get-Module -ListAvailable Hyper-v)) + { + throw "Hyper-v-Powershell Windows Feature is required to run this resource. Please install Hyper-v feature and try again" + } + if ($PSCmdlet.ParameterSetName -eq 'Mounted') + { + # Try mounting the VHD. + $mountedVHD = Mount-VHD -Path $vhdPath -Passthru -ErrorAction SilentlyContinue -ErrorVariable var + + # If mounting the VHD failed. Dismount the VHD and mount it again. + if ($var) + { + Write-Verbose "Mounting Failed. Attempting to dismount and mount it back" + Dismount-VHD $vhdPath + $mountedVHD = Mount-VHD -Path $vhdPath -Passthru -ErrorAction SilentlyContinue + + return $mountedVHD + } + else + { + return $mountedVHD + } + } + else + { + Dismount-VHD $vhdPath -ea SilentlyContinue + + } +} + +# Change the Cim Instance objects in to a hash table containing property value pair. +function GetItemToCopy +{ + param( + [Parameter()] + [Microsoft.Management.Infrastructure.CimInstance] $item + ) + + #Initialize Return Object + $returnValue = @{} + + #Define Default Values + + $DesiredProperties = [ordered]@{ + 'SourcePath' = $null + 'DestinationPath' = $null + 'Ensure' = 'Present' + 'Recurse' = 'True' + 'Force' = 'True' + 'Content' = $null + 'Attributes' = $null + 'Type' = 'Directory' + } + + [string[]]($DesiredProperties.Keys) | Foreach-Object -Process { + #Get Property Value + $thisItem = $item.CimInstanceProperties[$_].Value + + if (-not $thisItem -and $_ -in $DefaultValues.Keys) + { + #If unset and a default value is defined enter here + if ($_ -eq 'Type') + { + #Special behavior for the Type property based on SourcePath + #This relies on SourcePath preceeding Type in the list of keys (the reason for using OrderedDictionary) + if (Test-Path $returnValue.SourcePath -PathType Leaf ) + { + #If the sourcepath resolves to a file, set the default to File instad of Directory + $DefaultValues.Type = 'File' + } + } + $returnValue[$_] = $DefaultValues[$_] + } + else + { + #If value present or no default value enter here + $returnValue[$_] = $item.CimInstanceProperties[$_].Value + } + } + + #Relies on default values in the $DesiredProperties object being the $True equivalent values + $PropertyValuesToBoolean = @( + 'Force', + 'Recurse', + 'Ensure' + ) + + # Convert string values to boolean for ease of programming. + $PropertyValuesToBoolean | ForEach-Object -Process { + $returnValue[$_] = $returnValue[$_] -eq $DesiredProperties[$_] + } + + + $returnValue.Keys | ForEach-Object -Process { + Write-Verbose "$_ => $($returnValue[$_])" + } + + return $returnValue +} + + +# This is the main function that gets called after the file is mounted to perform copy, set or new operations on the mounted drive. +function SetVHDFile +{ + [CmdletBinding(DefaultParametersetName="Copy")] + param( + [Parameter(Mandatory=$true,ParameterSetName = "Copy")] + $sourcePath, + [Parameter()] + [switch]$recurse, + [Parameter()] + [switch]$force, + [Parameter(ParameterSetName = "New")] + $type, + [Parameter(ParameterSetName = "New")] + $content, + [Parameter(Mandatory=$true)] + $destinationPath, + [Parameter(Mandatory=$true,ParameterSetName = "Set")] + $attribute, + [Parameter(Mandatory=$true,ParameterSetName = "Delete")] + [switch]$ensure + ) + + Write-Verbose "Setting the VHD file $($PSCmdlet.ParameterSetName)" + if ($PSCmdlet.ParameterSetName -eq 'Copy') + { + New-Item -Path (Split-Path $destinationPath) -ItemType Directory -ErrorAction SilentlyContinue + Copy-Item -Path $sourcePath -Destination $destinationPath -Force:$force -Recurse:$recurse -ErrorAction SilentlyContinue + } + elseif ($PSCmdlet.ParameterSetName -eq 'New') + { + If ($type -eq 'Directory') + { + New-Item -Path $destinationPath -ItemType $type + } + else + { + New-Item -Path $destinationPath -ItemType $type + $content | Out-File $destinationPath + } + + } + elseif ($PSCmdlet.ParameterSetName -eq 'Set') + { + Write-Verbose "Attempting to change the attribute of the file $destinationPath to value $attribute" + Set-ItemProperty -Path $destinationPath -Name Attributes -Value $attribute + } + elseif (!($ensure)) + { + Remove-Item -Path $destinationPath -Force:$force -Recurse:$recurse + } +} + +# Detect if the item to be copied is modified version of the orginal. +function ItemHasChanged +{ + param( + [Parameter(Mandatory=$true)] + [ValidateScript({Test-Path $_})] + $sourcePath, + [Parameter(Mandatory=$true)] + [ValidateScript({Test-Path $_})] + $destinationPath, + [Parameter()] + [ValidateSet('ModifiedDate','SHA-1','SHA-256','SHA-512')] + $CheckSum = 'ModifiedDate' + ) + + $itemIsFolder = Test-Path $sourcePath -Type Container + $sourceItems = $null; + $destinationItems = $null; + + if ($itemIsFolder) + { + $sourceItems = Get-ChildItem "$sourcePath\*.*" -Recurse + $destinationItems = Get-ChildItem "$destinationPath\*.*" -Recurse + + } + else + { + $sourceItems = Get-ChildItem $sourcePath + $destinationItems = Get-ChildItem $destinationPath + + } + + if ( -not ($destinationItems)) + { + return $true; + } + + # Compute the difference using the algorithem specified. + $difference = $null + + switch ($CheckSum) + { + 'ModifiedDate' + { + $difference = Compare-Object -ReferenceObject $sourceItems -DifferenceObject $destinationItems -Property LastWriteTime + } + 'SHA-1' + { + $difference = Compare-Object -ReferenceObject ($sourceItems | Get-FileHash -Algorithm SHA1) -DifferenceObject ($destinationItems | Get-FileHash -Algorithm SHA1) -Property Hash + } + 'SHA-256' + { + $difference = Compare-Object -ReferenceObject ($sourceItems | Get-FileHash -Algorithm SHA256) -DifferenceObject ($destinationItems | Get-FileHash -Algorithm SHA256) -Property Hash + } + 'SHA-512' + { + $difference = Compare-Object -ReferenceObject ($sourceItems | Get-FileHash -Algorithm SHA512) -DifferenceObject ($destinationItems | Get-FileHash -Algorithm SHA512) -Property Hash + } + } + # If there are object difference between the item at the source and Items at the distenation. + return ($null -ne $difference) + +} + +Export-ModuleMember -Function *-TargetResource + diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVhdFileDirectory/MSFT_xVhdFileDirectory.schema.mof b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVhdFileDirectory/MSFT_xVhdFileDirectory.schema.mof new file mode 100644 index 0000000..b221b4b --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/DSCResources/MSFT_xVhdFileDirectory/MSFT_xVhdFileDirectory.schema.mof @@ -0,0 +1,24 @@ + +[ClassVersion("1.0.0.0")] +Class MSFT_xFileDirectory +{ + [Required] string DestinationPath; + [Write] string SourcePath; + [Write,ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] string Ensure; + [Write,ValueMap{"File", "Directory"},Values{"File", "Directory"}] string Type; + [Write] boolean Recurse; + [Write] boolean Force ; + [write] string Content; + [Write,ValueMap{"ReadOnly", "Hidden", "System", "Archive"},Values{"ReadOnly", "Hidden", "System", "Archive"}] string Attributes[]; +}; + +[ClassVersion("1.0.0.0"), FriendlyName("xVhdFile")] +class MSFT_xVhdFileDirectory : OMI_BaseResource +{ + [Key, Description("Path to the VHD")] String VhdPath; + [Required, EmbeddedInstance("MSFT_xFileDirectory"), Description("The FileDirectory objects to copy to the VHD")] String FileDirectory[]; + [Write,ValueMap{"ModifiedDate","SHA-1","SHA-256","SHA-512"},Values{"ModifiedDate","SHA-1","SHA-256","SHA-512"}] string CheckSum; +}; + + + diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_AdditionalPropertyVHD.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_AdditionalPropertyVHD.ps1 new file mode 100644 index 0000000..c552cbe --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_AdditionalPropertyVHD.ps1 @@ -0,0 +1,46 @@ +configuration Sample_xVHD_AdditionalPropertyVHD +{ + param + ( + [Parameter(Mandatory = $true)] + [string] + $Name, + + [Parameter(Mandatory = $true)] + [string] + $Path, + + [Parameter(Mandatory = $true)] + [string] + $ParentPath, + + [Parameter(Mandatory = $true)] + [string] + $MaximumSizeBytes, + + [Parameter()] + [ValidateSet('Vhd', 'Vhdx')] + [string] + $Generation = 'Vhd', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [string] + $Ensure = 'Present' + ) + + Import-DscResource -ModuleName xHyper-V + + Node localhost + { + xVHD WrongVHD + { + Ensure = $Ensure + Name = $Name + Path = $Path + ParentPath = $ParentPath + MaximumSizeBytes = $MaximumSizeBytes + Generation = $Generation + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_DiffVHD.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_DiffVHD.ps1 new file mode 100644 index 0000000..303544a --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_DiffVHD.ps1 @@ -0,0 +1,64 @@ +configuration Sample_xVhd_DiffVhd +{ + param + ( + [Parameter()] + [string[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [string] + $Name, + + [Parameter(Mandatory = $true)] + [string] + $Path, + + [Parameter(Mandatory = $true)] + [string] + $ParentPath, + + [Parameter()] + [ValidateSet('Vhd', 'Vhdx')] + [string] + $Generation = 'Vhd', + + [Parameter()] + [ValidateSet('Dynamic', 'Fixed', 'Differencing')] + [string]$Type = 'Differencing', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [string] + $Ensure = 'Present' + ) + + Import-DscResource -ModuleName xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + WindowsFeature HyperVPowerShell + { + Ensure = 'Present' + Name = 'Hyper-V-PowerShell' + } + + xVhd DiffVhd + { + Ensure = $Ensure + Name = $Name + Path = $Path + ParentPath = $ParentPath + Generation = $Generation + Type = $Type + DependsOn = '[WindowsFeature]HyperV', '[WindowsFeature]HyperVPowerShell' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_FixedVHD.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_FixedVHD.ps1 new file mode 100644 index 0000000..94777a1 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_FixedVHD.ps1 @@ -0,0 +1,60 @@ +configuration Sample_xVhd_FixedVhd +{ + param + ( + [Parameter()] + [string[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [string] + $Name, + + [Parameter(Mandatory = $true)] + [string] + $Path, + + [Parameter()] + [ValidateSet('Vhd', 'Vhdx')] + [string] + $Generation = 'Vhd', + + [Parameter()] + [ValidateSet('Dynamic', 'Fixed', 'Differencing')] + [string] + $Type = 'Fixed', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [string] + $Ensure = 'Present' + ) + + Import-DscResource -ModuleName xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + WindowsFeature HyperVPowerShell + { + Ensure = 'Present' + Name = 'Hyper-V-PowerShell' + } + + xVhd DiffVhd + { + Ensure = $Ensure + Name = $Name + Path = $Path + Generation = $Generation + Type = $Type + DependsOn = '[WindowsFeature]HyperV', '[WindowsFeature]HyperVPowerShell' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_MissingPropertyVHD.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_MissingPropertyVHD.ps1 new file mode 100644 index 0000000..baa7037 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_MissingPropertyVHD.ps1 @@ -0,0 +1,36 @@ +configuration Sample_xVHD_MissingPropertyVHD +{ + param + ( + [Parameter(Mandatory = $true)] + [string] + $Name, + + [Parameter(Mandatory = $true)] + [string] + $Path, + + [Parameter()] + [ValidateSet('Vhd', 'Vhdx')] + [string] + $Generation = 'Vhd', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [string] + $Ensure = 'Present' + ) + + Import-DscResource -module xHyper-V + + Node localhost + { + xVHD WrongVHD + { + Ensure = $Ensure + Name = $Name + Path = $Path + Generation = $Generation + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_NewVHD.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_NewVHD.ps1 new file mode 100644 index 0000000..f607afb --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVHD_NewVHD.ps1 @@ -0,0 +1,58 @@ +configuration Sample_xVHD_NewVhd +{ + param + ( + [Parameter()] + [string[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [string] + $Name, + + [Parameter(Mandatory = $true)] + [string] + $Path, + + [Parameter(Mandatory = $true)] + [Uint64] + $MaximumSizeBytes, + + [Parameter()] + [ValidateSet('Vhd', 'Vhdx')] + [string]$Generation = 'Vhd', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [string] + $Ensure = 'Present' + ) + + Import-DscResource -ModuleName xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + WindowsFeature HyperVPowerShell + { + Ensure = 'Present' + Name = 'Hyper-V-PowerShell' + } + + xVhd NewVhd + { + Ensure = $Ensure + Name = $Name + Path = $Path + Generation = $Generation + MaximumSizeBytes = $MaximumSizeBytes + DependsOn = '[WindowsFeature]HyperV', '[WindowsFeature]HyperVPowerShell' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHardDiskDrive_VMWith4AdditionalDisks.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHardDiskDrive_VMWith4AdditionalDisks.ps1 new file mode 100644 index 0000000..7cf165b --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHardDiskDrive_VMWith4AdditionalDisks.ps1 @@ -0,0 +1,97 @@ +configuration Sample_xVMHardDiskDrive +{ + param + ( + [Parameter()] + [string[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [string] + $VMName, + + [Parameter(Mandatory = $true)] + [string] + $VhdPath + ) + + Import-DscResource -ModuleName 'xHyper-V' + Import-DscResource -ModuleName 'PSDesiredStateConfiguration' + + Node $NodeName + { + $diskNameOS = "$VMName-OS.vhdx" + + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + WindowsFeature HyperVPowerShell + { + Ensure = 'Present' + Name = 'Hyper-V-PowerShell' + } + + # Create the VHD for the OS + xVHD DiskOS + { + + Name = $diskNameOS + Path = $VhdPath + Generation = 'vhdx' + MaximumSizeBytes = 20GB + Ensure = 'Present' + DependsOn = '[WindowsFeature]HyperV' + } + + # Create the VM + xVMHyperV NewVM + { + Name = $VMName + VhdPath = Join-Path $VhdPath -ChildPath $diskNameOS + Generation = 1 + Ensure = 'Present' + DependsOn = '[xVHD]DiskOS' + } + + # Ensures a SCSI controller exists on the VM + xVMScsiController Controller + { + Ensure = 'Present' + VMName = $VMName + ControllerNumber = 0 + DependsOn = '[xVMHyperV]NewVM' + } + + foreach ($i in 0 .. 3) + { + $diskName = "$VMName-Disk-$i.vhdx" + + # Create the VHD + xVHD "Disk-$i" + { + + Name = $diskName + Path = $VhdPath + Generation = 'vhdx' + MaximumSizeBytes = 20GB + Ensure = 'Present' + DependsOn = '[WindowsFeature]HyperV' + } + + # Attach the VHD + xVMHardDiskDrive "ExtraDisk-$i" + { + VMName = $VMName + Path = Join-Path $VhdPath -ChildPath $diskName + ControllerType = 'SCSI' + ControllerLocation = $i + Ensure = 'Present' + DependsOn = '[xVMScsiController]Controller', "[xVHD]Disk-$i" + } + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHardDiskDrive_VMWithExtraDisk.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHardDiskDrive_VMWithExtraDisk.ps1 new file mode 100644 index 0000000..0b01fbc --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHardDiskDrive_VMWithExtraDisk.ps1 @@ -0,0 +1,79 @@ +configuration Sample_xVMHardDiskDrive +{ + param + ( + [Parameter()] + [System.String[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [System.String] + $VhdPath + ) + + Import-DscResource -ModuleName 'xHyper-V' + Import-DscResource -ModuleName 'PSDesiredStateConfiguration' + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + $diskNameOS = "$VMName-DiskOS.vhdx" + $diskNameExtra1 = "$VMName-Disk1.vhdx" + + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + WindowsFeature HyperVPowerShell + { + Ensure = 'Present' + Name = 'Hyper-V-PowerShell' + } + + xVHD DiskOS + { + Name = $diskNameOS + Path = $VhdPath + Generation = 'vhdx' + MaximumSizeBytes = 20GB + Ensure = 'Present' + DependsOn = '[WindowsFeature]HyperV' + } + + xVHD Disk1 + { + Name = $diskNameExtra1 + Path = $VhdPath + Generation = 'vhdx' + MaximumSizeBytes = 20GB + Ensure = 'Present' + DependsOn = '[WindowsFeature]HyperV' + } + + xVMHyperV NewVM + { + Ensure = 'Present' + Name = $VMName + VhdPath = Join-Path $VhdPath -ChildPath $diskNameOS + Generation = 1 + DependsOn = '[xVHD]DiskOS' + } + + xVMHardDiskDrive ExtraDisk + { + VMName = $VMName + Path = Join-Path $VhdPath -ChildPath $diskNameExtra1 + ControllerType = 'IDE' + ControllerNumber = 0 + ControllerLocation = 1 + Ensure = 'Present' + DependsOn = '[xVHD]Disk1' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHost_Paths.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHost_Paths.ps1 new file mode 100644 index 0000000..044bc55 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHost_Paths.ps1 @@ -0,0 +1,22 @@ +Configuration HyperVHostPaths +{ + param + ( + [Parameter(Mandatory=$true, Position=0)] + [ValidateScript({Test-Path $_})] + $VirtualHardDiskPath, + + [Parameter(Mandatory=$true, Position=1)] + [ValidateScript({Test-Path $_})] + $VirtualMachinePath + ) + + Import-DscResource -moduleName xHyper-V + + xVMHost HyperVHostPaths + { + IsSingleInstance = 'Yes' + VirtualHardDiskPath = $VirtualHardDiskPath + VirtualMachinePath = $VirtualMachinePath + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_Complete.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_Complete.ps1 new file mode 100644 index 0000000..6ec87db --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_Complete.ps1 @@ -0,0 +1,103 @@ +configuration Sample_xVMHyperV_Complete +{ + param + ( + [string[]]$NodeName = 'localhost', + + [Parameter(Mandatory)] + [string]$VMName, + + [Parameter(Mandatory)] + [uint64]$VhdSizeBytes, + + [Parameter(Mandatory)] + [Uint64]$StartupMemory, + + [Parameter(Mandatory)] + [Uint64]$MinimumMemory, + + [Parameter(Mandatory)] + [Uint64]$MaximumMemory, + + [Parameter(Mandatory)] + [String]$SwitchName, + + [Parameter(Mandatory)] + [String]$Path, + + [Parameter(Mandatory)] + [Uint32]$ProcessorCount, + + [ValidateSet('Off','Paused','Running')] + [String]$State = 'Off', + + [Switch]$WaitForIP, + + [bool]$AutomaticCheckpointsEnabled + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Logic to handle both Client and Server OS + # Configuration needs to be compiled on target server + $Operatingsystem = Get-CimInstance -ClassName Win32_OperatingSystem + if ($Operatingsystem.ProductType -eq 1) + { + # Client OS, install Hyper-V as OptionalFeature + $HyperVDependency = '[WindowsOptionalFeature]HyperV' + WindowsOptionalFeature HyperV + { + Ensure = 'Enable' + Name = 'Microsoft-Hyper-V-All' + } + } + else { + # Server OS, install HyperV as WindowsFeature + $HyperVDependency = '[WindowsFeature]HyperV','[WindowsFeature]HyperVPowerShell' + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + WindowsFeature HyperVPowerShell + { + Ensure = 'Present' + Name = 'Hyper-V-PowerShell' + } + } + + # Create new VHD + xVhd NewVhd + { + Ensure = 'Present' + Name = "$VMName-OSDisk.vhdx" + Path = $Path + Generation = 'vhdx' + MaximumSizeBytes = $VhdSizeBytes + DependsOn = $HyperVDependency + } + + # Ensures a VM with all the properties + xVMHyperV NewVM + { + Ensure = 'Present' + Name = $VMName + VhdPath = (Join-Path -Path $Path -ChildPath "$VMName-OSDisk.vhdx") + SwitchName = $SwitchName + State = $State + Path = $Path + Generation = 2 + StartupMemory = $StartupMemory + MinimumMemory = $MinimumMemory + MaximumMemory = $MaximumMemory + ProcessorCount = $ProcessorCount + MACAddress = $MACAddress + RestartIfNeeded = $true + WaitForIP = $WaitForIP + AutomaticCheckpointsEnabled = $AutomaticCheckpointsEnabled + DependsOn = '[xVhd]NewVhd' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_DynamicMemory.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_DynamicMemory.ps1 new file mode 100644 index 0000000..4f260cd --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_DynamicMemory.ps1 @@ -0,0 +1,47 @@ +configuration Sample_xVMHyperV_DynamicMemory +{ + param + ( + [string[]]$NodeName = 'localhost', + + [Parameter(Mandatory)] + [string]$VMName, + + [Parameter(Mandatory)] + [string]$VhdPath, + + [Parameter(Mandatory)] + [Uint64]$StartupMemory, + + [Parameter(Mandatory)] + [Uint64]$MinimumMemory, + + [Parameter(Mandatory)] + [Uint64]$MaximumMemory + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + # Ensures a VM with dynamic memory + xVMHyperV NewVM + { + Ensure = 'Present' + Name = $VMName + VhdPath = $VhdPath + Generation = 2 + StartupMemory = $StartupMemory + MinimumMemory = $MinimumMemory + MaximumMemory = $MaximumMemory + DependsOn = '[WindowsFeature]HyperV' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_MultipleNICs.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_MultipleNICs.ps1 new file mode 100644 index 0000000..09adbae --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_MultipleNICs.ps1 @@ -0,0 +1,72 @@ +Configuration Sample_xVMHyperV_MultipleNICs +{ + param + ( + [string[]]$NodeName = 'localhost', + + [Parameter(Mandatory)] + [string]$VMName, + + [Parameter(Mandatory)] + [string]$VhdPath, + + [Parameter(Mandatory)] + [string[]]$SwitchName, + + [Parameter()] + [string[]]$MACAddress + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV features, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + WindowsFeature HyperVPowerShell + { + Ensure = 'Present' + Name = 'Hyper-V-PowerShell' + } + + # Dynamically build the 'DependsOn' array for the 'xVMHyperV' feature + # based on the number of virtual switches specified + $xVMHyperVDependsOn = @('[WindowsFeature]HyperV','[WindowsFeature]HyperVPowerShell') + + # Create each virtual switch + foreach ($vmSwitch in $SwitchName) + { + # Remove spaces and hyphens from the identifier + $vmSwitchName = $vmSwitch -replace ' ','' -replace '-','' + # Add the virtual switch dependency + $xVMHyperVDependsOn += "[xVMHyperV]$vmSwitchName" + + xVMSwitch $vmSwitchName + { + Ensure = 'Present' + Name = $vmSwitch + Type = 'Internal' + DependsOn = '[WindowsFeature]HyperV','[WindowsFeature]HyperVPowerShell' + } + } + + # Ensures a VM with all the properties + xVMHyperV $VMName + { + Ensure = 'Present' + Name = $VMName + VhdPath = $VhdPath + SwitchName = $SwitchName + MACAddress = $MACAddress + # Use the dynamically created dependency list/array + DependsOn = $xVMHyperVDependsOn + } + } +} + +Sample_xVMHyperV_MultipleNICs -VMName 'MultiNICVM' -VhdPath 'C:\VMs\MultiNICVM.vhdx' -SwitchName 'Switch 1','Switch-2' diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_Simple.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_Simple.ps1 new file mode 100644 index 0000000..a191a88 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_Simple.ps1 @@ -0,0 +1,35 @@ +configuration Sample_xVMHyperV_Simple +{ + param + ( + [string[]]$NodeName = 'localhost', + + [Parameter(Mandatory)] + [string]$VMName, + + [Parameter(Mandatory)] + [string]$VhdPath + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + # Ensures a VM with default settings + xVMHyperV NewVM + { + Ensure = 'Present' + Name = $VMName + VhdPath = $VhdPath + Generation = 2 + DependsOn = '[WindowsFeature]HyperV' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_SimpleWithDVDDrive.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_SimpleWithDVDDrive.ps1 new file mode 100644 index 0000000..2299b79 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_SimpleWithDVDDrive.ps1 @@ -0,0 +1,48 @@ +configuration Sample_xVMHyperV_SimpleWithDvdDrive +{ + param + ( + [string[]]$NodeName = 'localhost', + + [Parameter(Mandatory)] + [string]$VMName, + + [Parameter(Mandatory)] + [string]$VhdPath, + + [string]$ISOPath + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + # Ensures a VM with default settings + xVMHyperV NewVM + { + Ensure = 'Present' + Name = $VMName + VhdPath = $VhdPath + Generation = $VhdPath.Split('.')[-1] + DependsOn = '[WindowsFeature]HyperV' + } + + # Adds DVD Drive with ISO + xVMDvdDrive NewVMDvdDriveISO + { + Ensure = 'Present' + Name = $VMName + ControllerNumber = 0 + ControllerLocation = 0 + Path = $ISOPath + DependsOn = '[xVMHyperV]NewVM' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_SimpleWithNestedVirtualization.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_SimpleWithNestedVirtualization.ps1 new file mode 100644 index 0000000..6837639 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMHyperV_SimpleWithNestedVirtualization.ps1 @@ -0,0 +1,54 @@ +configuration Sample_xVMHyperV_SimpleWithNestedVirtualization +{ + param + ( + [Parameter()] + [string[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [string] + $VMName, + + [Parameter(Mandatory = $true)] + [string] + $VhdPath, + + [Parameter(Mandatory = $true)] + [Uint64] + $Memory + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + # Ensures a VM with default settings + xVMHyperV NewVM + { + Ensure = 'Present' + Name = $VMName + VhdPath = $VhdPath + Generation = 2 + StartupMemory = $Memory + MinimumMemory = $Memory + MaximumMemory = $Memory + DependsOn = '[WindowsFeature]HyperV' + } + + # Set the VM options + xVMProcessor NestedVirtualization + { + VMName = $VMName + ExposeVirtualizationExtensions = $true + DependsOn = '[xVMHyperV]NewVM' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_ManagementOS.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_ManagementOS.ps1 new file mode 100644 index 0000000..7be0ae5 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_ManagementOS.ps1 @@ -0,0 +1,13 @@ +Configuration HostOSAdapter +{ + Import-DscResource -ModuleName xHyper-V -Name xVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + xVMNetworkAdapter HostOSAdapter { + Id = 'Management-NIC' + Name = 'Management-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleManagementOS.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleManagementOS.ps1 new file mode 100644 index 0000000..a0cd100 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleManagementOS.ps1 @@ -0,0 +1,21 @@ +Configuration HostOSAdapter +{ + Import-DscResource -ModuleName xHyper-V -Name xVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + xVMNetworkAdapter ManagementAdapter { + Id = 'Management-NIC' + Name = 'Management-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } + + xVMNetworkAdapter ClusterAdapter { + Id = 'Cluster-NIC' + Name = 'Cluster-NIC' + SwitchName = 'SETSwitch' + VMName = 'ManagementOS' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleVM.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleVM.ps1 new file mode 100644 index 0000000..56d0a55 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleVM.ps1 @@ -0,0 +1,29 @@ +Configuration VMAdapter +{ + Import-DscResource -ModuleName xHyper-V -Name xVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + xVMNetworkAdapter MyVM01NIC { + Id = 'MyVM01-NIC' + Name = 'MyVM01-NIC' + SwitchName = 'SETSwitch' + VMName = 'MyVM01' + Ensure = 'Present' + } + + xVMNetworkAdapter MyVM02NIC { + Id = 'MyVM02-NIC' + Name = 'NetAdapter' + SwitchName = 'SETSwitch' + VMName = 'MyVM02' + Ensure = 'Present' + } + + xVMNetworkAdapter MyVM03NIC { + Id = 'MyVM03-NIC' + Name = 'NetAdapter' + SwitchName = 'SETSwitch' + VMName = 'MyVM03' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleVMMACAddress.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleVMMACAddress.ps1 new file mode 100644 index 0000000..80f0ead --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_MultipleVMMACAddress.ps1 @@ -0,0 +1,23 @@ +Configuration VMAdapter +{ + Import-DscResource -ModuleName xHyper-V -Name xVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + xVMNetworkAdapter MyVM01NIC { + Id = 'MyVM01-NIC' + Name = 'MyVM01-NIC' + SwitchName = 'SETSwitch' + MacAddress = '001523be0c' + VMName = 'MyVM01' + Ensure = 'Present' + } + + xVMNetworkAdapter MyVM02NIC { + Id = 'MyVM02-NIC' + Name = 'MyVM02-NIC' + SwitchName = 'SETSwitch' + MacAddress = '001523be0d' + VMName = 'MyVM02' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_VMStaticNetworkSettings.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_VMStaticNetworkSettings.ps1 new file mode 100644 index 0000000..2d192bc --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_VMStaticNetworkSettings.ps1 @@ -0,0 +1,20 @@ +Configuration VMAdapter +{ + Import-DscResource -ModuleName xHyper-V -Name xVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + xVMNetworkAdapter MyVM01NIC { + Id = 'MyVM01-NIC' + Name = 'MyVM01-NIC' + SwitchName = 'SETSwitch' + MacAddress = '001523be0c' + VMName = 'MyVM01' + NetworkSetting = xNetworkSettings { + IpAddress = "192.168.0.100" + Subnet = "255.255.255.255" + DefaultGateway = "192.168.0.1" + DnsServer = "192.168.0.1" + } + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_VMVlanTagging.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_VMVlanTagging.ps1 new file mode 100644 index 0000000..0c17245 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMNetworkAdapter_VMVlanTagging.ps1 @@ -0,0 +1,15 @@ +Configuration VMAdapter +{ + Import-DscResource -ModuleName xHyper-V -Name xVMNetworkAdapter + Import-DscResource -ModuleName PSDesiredStateConfiguration + + xVMNetworkAdapter MyVM01NIC { + Id = 'MyVM01-NIC' + Name = 'MyVM01-NIC' + SwitchName = 'SETSwitch' + MacAddress = '001523be0c' + VMName = 'MyVM01' + VlanId = '1' + Ensure = 'Present' + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMScsiController_AddControllers.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMScsiController_AddControllers.ps1 new file mode 100644 index 0000000..9ef5a72 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMScsiController_AddControllers.ps1 @@ -0,0 +1,68 @@ +configuration Sample_xVMScsiController +{ + param + ( + [Parameter()] + [System.String[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [System.String] + $VMName, + + [Parameter(Mandatory = $true)] + [System.String] + $VhdPath + ) + + Import-DscResource -ModuleName 'xHyper-V' + Import-DscResource -ModuleName 'PSDesiredStateConfiguration' + + Node $NodeName + { + $diskNameOS = "$VMName-OS.vhdx" + + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + # Create the VHD for the OS + xVHD DiskOS + { + Ensure = 'Present' + Name = $diskNameOS + Path = $VhdPath + Generation = 'vhdx' + MaximumSizeBytes = 20GB + DependsOn = '[WindowsFeature]HyperV' + } + + # Create the VM + xVMHyperV NewVM + { + Ensure = 'Present' + Name = $VMName + VhdPath = Join-Path -Path $VhdPath -ChildPath $diskNameOS + Generation = 2 + DependsOn = '[xVHD]DiskOS' + } + + # Add and additional SCSI controller + xVMScsiController Controller + { + Ensure = 'Present' + VMName = $VMName + ControllerNumber = 1 + DependsOn = '[xVMHyperV]NewVM' + } + + } +} + +$mofPath = "C:\temp\Sample_xVMScsiController" + +Sample_xVMScsiController -VMName "test1" -VhdPath "C:\temp\Tests" -OutputPath $mofPath +Start-DscConfiguration -Path $mofPath -Verbose -Wait -Force diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_External.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_External.ps1 new file mode 100644 index 0000000..48e2e94 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_External.ps1 @@ -0,0 +1,35 @@ +configuration Sample_xVMSwitch_External +{ + param + ( + [string[]]$NodeName = 'localhost', + + [Parameter(Mandatory)] + [string]$SwitchName, + + [Parameter(Mandatory)] + [string]$NetAdapterName + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + # Ensures a VM with default settings + xVMSwitch ExternalSwitch + { + Ensure = 'Present' + Name = $SwitchName + Type = 'External' + NetAdapterName = $NetAdapterName + DependsOn = '[WindowsFeature]HyperV' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_ExternalSET.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_ExternalSET.ps1 new file mode 100644 index 0000000..24c888d --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_ExternalSET.ps1 @@ -0,0 +1,47 @@ +Configuration Sample_xVMSwitch_External +{ + param + ( + [Parameter()] + [string[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [string] + $SwitchName, + + [Parameter(Mandatory = $true)] + [string[]] + $NetAdapterNames + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + WindowsFeature HyperVTools + { + Ensure = 'Present' + Name = 'RSAT-Hyper-V-Tools' + DependsOn = '[WindowsFeature]HyperV' + } + + # Ensures a VM with default settings + xVMSwitch ExternalSwitch + { + Ensure = 'Present' + Name = $SwitchName + Type = 'External' + NetAdapterName = $NetAdapterNames + EnableEmbeddedTeaming = $true + DependsOn = '[WindowsFeature]HyperVTools' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_ExternalSET_LBMode.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_ExternalSET_LBMode.ps1 new file mode 100644 index 0000000..102ea56 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_ExternalSET_LBMode.ps1 @@ -0,0 +1,48 @@ +Configuration Sample_xVMSwitch_External +{ + param + ( + [Parameter()] + [string[]] + $NodeName = 'localhost', + + [Parameter(Mandatory = $true)] + [string] + $SwitchName, + + [Parameter(Mandatory = $true)] + [string[]] + $NetAdapterNames + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + WindowsFeature HyperVTools + { + Ensure = 'Present' + Name = 'RSAT-Hyper-V-Tools' + DependsOn = '[WindowsFeature]HyperV' + } + + # Ensures a VM with Load Balancing Algorithm "Hyper-V Port" + xVMSwitch ExternalSwitch + { + Ensure = 'Present' + Name = $SwitchName + Type = 'External' + NetAdapterName = $NetAdapterNames + EnableEmbeddedTeaming = $true + LoadBalancingAlgorithm = 'HyperVPort' + DependsOn = '[WindowsFeature]HyperVTools' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_Internal.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_Internal.ps1 new file mode 100644 index 0000000..cc1c189 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVMSwitch_Internal.ps1 @@ -0,0 +1,31 @@ +configuration Sample_xVMSwitch_Internal +{ + param + ( + [string[]]$NodeName = 'localhost', + + [Parameter(Mandatory)] + [string]$SwitchName + ) + + Import-DscResource -module xHyper-V + + Node $NodeName + { + # Install HyperV feature, if not installed - Server SKU only + WindowsFeature HyperV + { + Ensure = 'Present' + Name = 'Hyper-V' + } + + # Ensures a VM with default settings + xVMSwitch InternalSwitch + { + Ensure = 'Present' + Name = $SwitchName + Type = 'Internal' + DependsOn = '[WindowsFeature]HyperV' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVhdFileExamples.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVhdFileExamples.ps1 new file mode 100644 index 0000000..93052c3 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Examples/Sample_xVhdFileExamples.ps1 @@ -0,0 +1,171 @@ +# sample values used for testing. +$sampleVhdPath = "C:\test_vhds\RenameComputer.Vhd" + +# sample text file that you want to copy in the VHD. +$sampletxt = "C:\sample.txt" + +# This path is the relative path to mounted drive letter. +$sampleVhdDestinationPath = "xvhdFileExample\CopiedFile" + +# A local folder that you want to copy in to the VHD. +$samplefolder = "c:\SampleFolder" + +Configuration xVhdD_CopyFileOrFolder +{ + + Param( + [Parameter(Mandatory=$true, Position=0)] + [validatescript({Test-Path $_})] + $vhdPath, + [Parameter(Mandatory=$true)] + [validatescript({Test-Path $_})] + $itemToCopy, + [Parameter(Mandatory=$true)] + $relativeDestinationPath + ) + + Import-DscResource -moduleName xHyper-V + + xVhdFile FileCopy + { + VhdPath = $vhdPath + FileDirectory = MSFT_xFileDirectory { + SourcePath = $itemToCopy + DestinationPath = $relativeDestinationPath + } + + } + +} + +# Copy File/Folder example +xVhdD_CopyFileOrFolder -vhdPath $sampleVhdPath -itemToCopy $sampletxt -relativeDestinationPath $sampleVhdDestinationPath +Start-DscConfiguration -ComputerName localhost -Path $pwd\xVhdD_CopyFileOrFolder\ -Wait -Verbose + +xVhdD_CopyFileOrFolder -vhdPath $sampleVhdPath -itemToCopy $samplefolder -relativeDestinationPath $sampleVhdDestinationPath +Start-DscConfiguration -ComputerName localhost -Path $pwd\xVhdD_CopyFileOrFolder\ -Wait -Verbose + +Configuration RemoveFileOrFolderFromVHD +{ + param( + [Parameter(Mandatory=$true, Position=0)] + [validatescript({Test-Path $_})] + $vhdPath, + [Parameter(Mandatory=$true)] + $relativeDestinationPath, + $Ensure = 'Absent' + ) + Import-DscResource -moduleName xHyper-V + xVhdFile RemoveFile + { + VhdPath = $vhdPath + FileDirectory = MSFT_xFileDirectory { + DestinationPath = $relativeDestinationPath + Ensure = $Ensure + } + + } + +} + +RemoveFileOrFolderFromVHD -vhdPath $sampleVhdPath -relativeDestinationPath $sampleVhdDestinationPath +Start-DscConfiguration -ComputerName localhost -Path $pwd\RemoveFileOrFolderFromVHD\ -Wait -Verbose + +Configuration ChangeAttribute +{ + param( + [Parameter(Mandatory=$true, Position=0)] + [validatescript({Test-Path $_})] + $vhdPath, + [Parameter(Mandatory=$true)] + $relativeDestinationPath, + [ValidateSet ("Archive", "Hidden", "ReadOnly", "System" )] $attribute + ) + + Import-DscResource -moduleName xHyper-V + xVhdFile Change-Attribute + { + VhdPath = $vhdPath + FileDirectory = MSFT_xFileDirectory { + DestinationPath = $relativeDestinationPath + Attributes = $attribute + } + + } +} + +ChangeAttribute -vhdPath $sampleVhdPath -relativeDestinationPath $sampleVhdDestinationPath -attribute 'ReadOnly' +Start-DscConfiguration -ComputerName localhost -Path $pwd\RemoveFileOrFolderFromVHD\ -Wait -Verbose + +# End to end sample for x-Hyper-v +Configuration Sample_EndToEndXHyperV_RunningVM +{ + + param + ( + [Parameter(Mandatory)] + $vhdPath, + [Parameter(Mandatory)] + $name, + [Parameter(Mandatory)] + [validatescript({Test-Path $_})] + $unattendedFilePathToCopy + ) + + Import-DscResource -module xHyper-V + + # Create a switch to be used by the VM + xVMSwitch switch + { + Name = "Test-Switch" + Ensure = "Present" + Type = "Internal" + } + + # Create new VHD file. + xVHD NewVHD1 + { + + Ensure = "Present" + Name = $name + Path = (Split-Path $vhdPath) + Generation = "vhd" + ParentPath = $vhdPath + + } + + # Customize VHD by copying a folders/files to the VHD before a VM can be created + # Example below shows copying unattended.xml before a VM can be created + xVhdFile CopyUnattendxml + { + VhdPath = $vhdPath + FileDirectory = MSFT_xFileDirectory { + SourcePath = $unattendedFilePathToCopy + DestinationPath = "unattended.xml" + } + + } + + # create the testVM out of the vhd. + xVMHyperV testvm + { + Name = "$($name)_vm" + SwitchName = "Test-Switch" + VhdPath = Join-path (Split-Path $vhdPath) "$name.vhd" + ProcessorCount = 2 + MaximumMemory = 1GB + MinimumMemory = 512MB + RestartIfNeeded = "TRUE" + DependsOn = "[xVHD]NewVHD1","[xVMSwitch]switch","[xVhdFile]CopyUnattendxml" + State = "Running" + + } + +} + +# Create a mof file. +Sample_EndToEndXHyperV_RunningVM -vhdPath $sampleVhdPath -name TestMachine -unattendedFilePathToCopy C:\temp\unattended.xml + +# Run the configuration on localhost. +Start-DscConfiguration -Path $pwd\Sample_EndToEndXHyperV_RunningVM -ComputerName localhost -Verbose -Wait + diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/LICENSE b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/LICENSE new file mode 100644 index 0000000..567fd6a --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Microsoft Corporation. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VHDResourceGenerator.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VHDResourceGenerator.ps1 new file mode 100644 index 0000000..1a00958 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VHDResourceGenerator.ps1 @@ -0,0 +1,13 @@ + $name = New-DscResourceProperty -Name Name -Type String -Attribute Key -Description "Name of the VHD File" + $path = New-DscResourceProperty -Name Path -Type String -Attribute Key -Description "Folder where the VHD will be created" + $parentPath = New-DscResourceProperty -Name ParentPath -Type String -Attribute Write -Description "Parent VHD file path, for differencing disk" + $generation = New-DscResourceProperty -Name Generation -Type String -Attribute Write -ValidateSet "Vhd","Vhdx" -Description "Virtual disk format - Vhd or Vhdx" + $ensure = New-DscResourceProperty -Name Ensure -Type String -Attribute Write -ValidateSet "Present","Absent" -Description "Should the VHD be created or deleted" + $MaximumSizeBytes = New-DscResourceProperty -Name MaximumSizeBytes -Type Uint32 -Attribute Write -Description "Maximum size of Vhd to be created" + + $id = New-DscResourceProperty -Name ID -Type String -Attribute Read -Description "Virtual Disk Identifier" + $type = New-DscResourceProperty -Name Type -Type String -Attribute Read -Description "Type of Vhd - Dynamic, Fixed, Differencing" + $FileSizeBytes = New-DscResourceProperty -Name FileSizeBytes -Type Uint32 -Attribute Read -Description "Current size of the VHD" + $IsAttached = New-DscResourceProperty -Name IsAttached -Type Boolean -Attribute Read -Description "Is the VHD attached to a VM or not" + + New-DscResource -Name MSFT_xVHD -Properties $name,$path,$parentPath,$generation,$ensure,$id,$type,$MaximumSizeBytes,$FileSizeBytes,$IsAttached -Path . -ClassVersion 1.0.0 -FriendlyName xVHD diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMHardDiskDriveGenerator.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMHardDiskDriveGenerator.ps1 new file mode 100644 index 0000000..37f2a6b --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMHardDiskDriveGenerator.ps1 @@ -0,0 +1,8 @@ +New-xDscResource -Name MSFT_xVMHardDiskDrive -Path . -ClassVersion 1.0.0 -FriendlyName xVMHardDiskDrive -Property $( + New-xDscResourceProperty -Name VMName -Type String -Attribute Key -Description "Specifies the name of the virtual machine whose hard disk drive is to be manipulated" + New-xDscResourceProperty -Name Path -Type String -Attribute Key -Description "Specifies the full path to the location of the VHD that represents the hard disk drive" + New-xDscResourceProperty -Name ControllerType -Type String -Attribute Write -ValidateSet "IDE","SCSI" -Description "Specifies the controller type - IDE/SCSI where the disk is attached" + New-xDscResourceProperty -Name ControllerNumber -Type Uint32 -Attribute Write -ValidateSet 0,1,2,3 -Description "Specifies the number of the controller where the disk is attached" + New-xDscResourceProperty -Name ControllerLocation -Type Uint32 -Attribute Write -Description "Specifies the number of the location on the controller where the disk is attached" + New-xDscResourceProperty -Name Ensure -Type String -Attribute Write -ValidateSet "Present","Absent" -Description "Specifies if the hard disk drive must be present or absent" +) diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMResourceGenerator.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMResourceGenerator.ps1 new file mode 100644 index 0000000..41d2451 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMResourceGenerator.ps1 @@ -0,0 +1,26 @@ + $name = New-xDscResourceProperty -Name Name -Type String -Attribute Key -Description "Name of the VM" + $vhdPath = New-xDscResourceProperty -Name VhdPath -Type String -Attribute Required -Description "VHD associated with the VM" + $switchName = New-xDscResourceProperty -Name SwitchName -Type String -Attribute Write -Description "Virtual switch associated with the VM" + $path = New-xDscResourceProperty -Name Path -Type String -Attribute Write -Description "Folder where the VM data will be stored" + $generation = New-xDscResourceProperty -Name Generation -Type String -Attribute Write -ValidateSet "Vhd","Vhdx" -Description "Associated Virtual disk format - Vhd or Vhdx" + $ensure = New-xDscResourceProperty -Name Ensure -Type String -Attribute Write -ValidateSet "Present","Absent" -Description "Should the VM be created or deleted" + $startupMem = New-xDscResourceProperty -Name StartupMemory -Type Uint64 -Attribute Write -Description "Startup RAM for the VM." + $minMem = New-xDscResourceProperty -Name MinimumMemory -Type Uint64 -Attribute Write -Description "Minimum RAM for the VM. This enables dynamic memory." + $maxMem = New-xDscResourceProperty -Name MaximumMemory -Type Uint64 -Attribute Write -Description "Maximum RAM for the VM. This enable dynamic memory." + $macAddress = New-xDscResourceProperty -Name MACAddress -Type String -Attribute Write -Description "MAC address of the VM." + $waitForIP = New-xDscResourceProperty -Name WaitForIP -Type Boolean -Attribute Write -Description "Waits for VM to get valid IP address." + $state = New-xDscResourceProperty -Name State -Type String -Attribute Write -ValidateSet "Running","Paused","Off" -Description "State of the VM." + $notes = New-xDscResourceProperty -Name Notes -Type String -Attribute Write -Description "Notes about the VM." + $procCount = New-xDscResourceProperty -Name ProcessorCount -Type Uint32 -Attribute Write -Description "Processor count for the VM" + $restartIfNeeded = New-xDscResourceProperty -Name RestartIfNeeded -Type Boolean -Attribute Write -Description "If specified, shutsdown and restarts the VM if needed for resource change" + + $id = New-xDscResourceProperty -Name ID -Type String -Attribute Read -Description "VM unique ID" + $status = New-xDscResourceProperty -Name Status -Type String -Attribute Read -Description "Status of the VM" + $CPUUsage = New-xDscResourceProperty -Name CPUUsage -Type Uint32 -Attribute Read -Description "CPU Usage of the VM" + $memAssigned = New-xDscResourceProperty -Name MemoryAssigned -Type Uint64 -Attribute Read -Description "Memory assigned to the VM" + $uptime = New-xDscResourceProperty -Name Uptime -Type String -Attribute Read -Description "Uptime of the VM" + $creationTime = New-xDscResourceProperty -Name CreationTime -Type DateTime -Attribute Read -Description "Creation time of the VM" + $hasDynamicMemory = New-xDscResourceProperty -Name HasDynamicMemory -Type Boolean -Attribute Read -Description "Does VM has dynamic memory enabled" + $networkAdapters = New-xDscResourceProperty -Name NetworkAdapters -Type String[] -Attribute Read -Description "Network adapters of the VM" + + New-xDscResource -Name MSFT_xVMHyperV -Property @($name,$vhdPath,$switchName,$state,$path,$generation,$startupMem,$minMem,$maxMem,$macAddress,$procCount,$waitForIP,$restartIfNeeded,$ensure, $notes,$id,$status,$CPUUsage,$memAssigned,$uptime,$creationTime,$hasDynamicMemory,$networkAdapters) -Path . -ClassVersion 1.0.0 -FriendlyName xVMHyperV diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMScsiControllerGenerator.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMScsiControllerGenerator.ps1 new file mode 100644 index 0000000..4dd414a --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMScsiControllerGenerator.ps1 @@ -0,0 +1,5 @@ +New-xDscResource -Name MSFT_xVMScsiController -Path . -ClassVersion 1.0.0 -FriendlyName xVMScsiController -Property $( + New-xDscResourceProperty -Name VMName -Type String -Attribute Key -Description "Specifies the name of the virtual machine whose SCSI controller status is to be controlled" + New-xDscResourceProperty -Name ControllerNumber -Type Uint32 -Attribute Key -ValidateSet 0,1,2,3 -Description "Specifies the number of the SCSI controller whose status is to be controlled" + New-xDscResourceProperty -Name Ensure -Type String -Attribute Write -ValidateSet "Present","Absent" -Description "Specifies if the SCSI controller should exist or not" +) diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMSwitchGenerator.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMSwitchGenerator.ps1 new file mode 100644 index 0000000..4d27ea9 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Misc/VMSwitchGenerator.ps1 @@ -0,0 +1,8 @@ + $name = New-DscResourceProperty -Name Name -Type String -Attribute Key -Description "Name of the VM Switch" + $type = New-DscResourceProperty -Name Type -Type String -Attribute Key -ValidateSet "Internal","Private" -Description "Type of switch" + $netAdapter = New-DscResourceProperty -Name NetAdapterName -Type String -Attribute Write -Description "Network adapter name for external switch type" + $allowManagementOS = New-DscResourceProperty -Name AllowManagementOS -Type Boolean -Attribute Write -Description "Specify is the VM host has access to the physical NIC" + $ensure = New-DscResourceProperty -Name Ensure -Type String -Attribute Write -ValidateSet "Present","Absent" -Description "Whether switch should be present or absent" + $id = New-DscResourceProperty -Name Id -Type String -Attribute Read -Description "Unique ID for the switch" + $netDescription = New-DscResourceProperty -Name NetAdapterInterfaceDescription -Type String -Attribute Read -Description "Description of the network interface" + New-DscResource -Name MSFT_xVMSwitch -Path . -Properties $name,$type,$netAdapter,$allowManagementOS,$ensure,$id,$netDescription -ClassVersion 1.0.0.0 -FriendlyName xVMSwitch diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/README.md b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/README.md new file mode 100644 index 0000000..ce8f76f --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/README.md @@ -0,0 +1,523 @@ +# xHyper-V + +The **xHyper-V** module contains DSC resources for deployment and configuration of + Hyper-V hosts, virtual machines and related resources. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) + or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any + additional questions or comments. + +## Branches + +### master + +[![Build status](https://ci.appveyor.com/api/projects/status/tsdbv0hgrxvmbo5y/branch/master?svg=true)](https://ci.appveyor.com/project/PowerShell/xhyper-v/branch/master) +[![codecov](https://codecov.io/gh/PowerShell/xHyper-V/branch/master/graph/badge.svg)](https://codecov.io/gh/PowerShell/xHyper-V/branch/master) + +This is the branch containing the latest release - no contributions should be +made directly to this branch. + +### dev + +[![Build status](https://ci.appveyor.com/api/projects/status/tsdbv0hgrxvmbo5y/branch/dev?svg=true)](https://ci.appveyor.com/project/PowerShell/xhyper-v/branch/dev) +[![codecov](https://codecov.io/gh/PowerShell/xHyper-V/branch/dev/graph/badge.svg)](https://codecov.io/gh/PowerShell/xHyper-V/branch/dev) + +This is the development branch to which contributions should be proposed by +contributors as pull requests. This development branch will periodically be +merged to the master branch, and be released to [PowerShell Gallery](https://www.powershellgallery.com/). + +## Contributing + +Please check out common DSC Resources [contributing guidelines](https://github.com/PowerShell/DscResource.Kit/blob/master/CONTRIBUTING.md). + +## Change log + +A full list of changes in each version can be found in the [change log](CHANGELOG.md). + +## Resources + +* [**xVHD**](#xvhd) manages VHDs in a Hyper-V host. +* [**xVhdFile**](#xvhdfile) manages files or directories in a VHD. + You can use it to copy files/folders to the VHD, remove files/folders from a VHD, + and change attributes of a file in a VHD (e.g. change a file attribute to + 'ReadOnly' or 'Hidden'). + This resource is particularly useful when bootstrapping DSC Configurations + into a VM. +* [**xVMDvdDrive**](#xvmdvddrive) manages DVD drives attached to a Hyper-V + virtual machine. +* [**xVMHardDiskDrive**](#xvmharddiskdrive) manages VHD(X)s attached to a Hyper-V virtual machine. +* [**xVMHost**](#xvmhost) manages Hyper-V host settings. +* [**xVMHyperV**](#xvmhyperv) manages VMs in a Hyper-V host. +* [**xVMNetworkAdapter**](#xvmnetworkadapter) manages VMNetadapters attached to + a Hyper-V virtual machine or the management OS. +* [**xVMProcessor**](#xvmprocessor) manages Hyper-V virtual machine processor options. +* [**xVMScsiController**](#xvmscsicontroller) manages the SCSI controllers attached to a Hyper-V virtual machine. +* [**xVMSwitch**](#xvmswitch) manages virtual switches in a Hyper-V host. + +### xVHD + +Manages VHDs in a Hyper-V host. + +#### Requirements for xVHD + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVHD + +* **`[String]` Name** _(Key)_: The desired VHD file name. +* **`[String]` Path** _(Key)_: The desired Path where the VHD will be created. +* **`[String]` ParentPath** _(Write)_: Parent VHD file path, for differencing disk. +* **`[Uint64]` MaximumSizeBytes** _(Write)_: Maximum size of VHD to be created. +* **`[String]` Generation** _(Write)_: Virtual disk format. + The default value is Vhd. { *Vhd* | Vhdx }. +* **`[String]` Type** _(Write)_: Virtual disk type. + The default value is Dynamic. { *Dynamic* | Fixed | Differencing }. +* **`[String]` Ensure** _(Write)_: Ensures that the VHD is Present or Absent. + The default value is Present. { *Present* | Absent }. + +#### Read-Only Properties from Get-TargetResource for xVHD + +* **`[String]` ID** _(Read)_: Virtual Disk Identifier. +* **`[String]` Type** _(Read)_: Type of Vhd - Dynamic, Fixed, Differencing. +* **`[Uint64]` FileSizeBytes** _(Read)_: Current size of the VHD. +* **`[Boolean]` IsAttached** _(Read)_: Is the VHD attached to a VM or not. + +#### Examples xVHD + +* [Create a new VHD](/Examples/Sample_xVHD_NewVHD.ps1) +* [Create a new Fixed VHD](/Examples/Sample_xVHD_FixedVHD.ps1) +* [Create a differencing VHD](/Examples/Sample_xVHD_DiffVHD.ps1) + +### xVhdFile + +Manages files or directories in a VHD. + You can use it to copy files/folders to the VHD, remove files/folders from a VHD, + and change attributes of a file in a VHD (e.g. change a file attribute to + 'ReadOnly' or 'Hidden'). + This resource is particularly useful when bootstrapping DSC Configurations + into a VM. + +#### Requirements for xVhdFile + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVhdFile + +* **`[String]` VhdPath** _(Key)_: Path to the VHD. +* **`[MSFT_xFileDirectory[]]` FileDirectory** _(Required)_: The FileDirectory objects + to copy to the VHD (as used in the "File" resource). + Please see the Examples section for more details. +* **`[String]` CheckSum** _(Write)_: Indicates the checksum type to use when determining + whether two files are the same. The default value is ModifiedDate. + { *ModifiedDate* | SHA-1 | SHA-256 | SHA-512 }. + +##### MSFT_xFileDirectory Class + +* **`[String]` DestinationPath** _(Required)_: Indicates the location where you want + to ensure the state for a file or directory. +* **`[String]` SourcePath** _(Write)_: Indicates the path from which to copy the + file or folder resource. +* **`[String]` Ensure** _(Write)_: Indicates if the file or directory exists. + Set this property to "Absent" to ensure that the file or directory does not exist. + Set it to "Present" to ensure that the file or directory does exist. + { Present | Absent }. +* **`[String]` Type** _(Write)_: Indicates if the resource being configured is a + directory or a file. Set this property to "Directory" to indicate that the resource + is a directory. Set it to "File" to indicate that the resource is a file. + { File | Directory }. +* **`[Boolean]` Recurse** _(Write)_: Indicates if subdirectories are included. + Set this property to $true to indicate that you want subdirectories to be included. +* **`[Boolean]` Force** _(Write)_: Certain file operations (such as overwriting a + file or deleting a directory that is not empty) will result in an error. Using the + Force property overrides such errors. +* **`[String]` Content** _(Write)_: Specifies the contents of a file, such as a + particular string. +* **`[String[]]` Attributes** _(Write)_: Specifies the desired state of the attributes + for the targeted file or directory. { ReadOnly | Hidden | System | Archive }. + +#### Read-Only Properties from Get-TargetResource for xVhdFile + +None + +#### Examples xVhdFile + +* [Multiple examples](/Examples/Sample_xVhdFileExamples.ps1) + +### xVMDvdDrive + +Manages DVD drives attached to a Hyper-V virtual machine. + +#### Requirements for xVMDvdDrive + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVMDvdDrive + +* **`[String]` VMName** _(Key)_: Specifies the name of the virtual machine + to which the DVD drive is to be added. +* **`[Uint32]` ControllerNumber** _(Key)_: Specifies the number of the controller + to which the DVD drive is to be added. +* **`[Uint32]` ControllerLocation** _(Key)_: Specifies the number of the location + on the controller at which the DVD drive is to be added. +* **`[String]` Path** _(Write)_: Specifies the full path to the virtual hard disk + file or physical hard disk volume for the added DVD drive. +* **`[String]` Ensure** _(Write)_: Specifies if the DVD Drive should exist or not. + The default value is Present. { *Present* | Absent }. + +#### Read-Only Properties from Get-TargetResource for xVMDvdDrive + +None + +#### Examples xVMDvdDrive + +* [Create a VM, given a VHDX and add a DVD Drives](/Examples/Sample_xVMHyperV_SimpleWithDVDDrive.ps1) + +### xVMHardDiskDrive + +Manages VHD(X)s attached to a Hyper-V virtual machine. +When ControllerNumber or ControllerLocation is not provided, the same logic as + Set-VMHardDiskDrive cmdlet is used. + +#### Requirements for xVMHardDiskDrive + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVMHardDiskDrive + +* **`[String]` VMName** _(Key)_: Specifies the name of the virtual machine + whose hard disk drive is to be manipulated. +* **`[String]` VhdPath** _(Key)_: Specifies the full path of the VHD file to be + manipulated. +* **`[String]` ControllerType** _(Write)_: Specifies the type of controller to which + the hard disk drive is to be set. The default value is SCSI. { *SCSI* | IDE }. +* **`[Uint32]` ControllerNumber** _(Write)_: Specifies the number of the controller + to which the hard disk drive is to be set. + For IDE: { 0, 1 }, for SCSI: { 0 | 1 | 2 | 3 }. + Defaults to 0. +* **`[Uint32]` ControllerLocation** _(Write)_: Specifies the number of the location + on the controller at which the hard disk drive is to be set. + For IDE: { 0 | 1 }, for SCSI: { 0 .. 63 }. + Defaults to 0. +* **`[String]` Ensure** _(Write)_: Specifies if the hard disk drive should exist or + not. The default value is Present. { *Present* | Absent }. + +#### Read-Only Properties from Get-TargetResource for xVMHardDiskDrive + +None + +#### Examples xVMHardDiskDrive + +* [Create a VM, with an OS drive and an additional data drive](/Examples/Sample_xVMHardDiskDrive_VMWithExtraDisk.ps1) +* [Create a VM, with an OS drive and 4 data drives](/Examples/Sample_xVMHardDiskDrive_VMWith4AdditionalDisks.ps1) + +### xVMHost + +Manages Hyper-V host settings. + +#### Requirements for xVMHost + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVMHost + +* **`[String]` IsSingleInstance** _(Key)_: Specifies the resource is a single instance, + the value must be 'Yes'. { *Yes* }. +* **`[Boolean]` EnableEnhancedSessionMode** _(Write)_: Indicates whether users + can use enhanced mode when they connect to virtual machines on this server + by using Virtual Machine Connection. +* **`[String]` FibreChannelWwnn** _(Write)_: Specifies the default value of + the World Wide Node Name on the Hyper-V host. +* **`[String]` FibreChannelWwpnMaximum** _(Write)_: Specifies the maximum value + that can be used to generate World Wide Port Names on the Hyper-V host. + Use with the FibreChannelWwpnMinimum parameter to establish a range of WWPNs + that the specified Hyper-V host can assign to virtual Fibre Channel adapters. +* **`[String]` FibreChannelWwpnMinimum** _(Write)_: Specifies the minimum value + that can be used to generate the World Wide Port Names on the Hyper-V host. + Use with the FibreChannelWwpnMaximum parameter to establish a range of WWPNs + that the specified Hyper-V host can assign to virtual Fibre Channel adapters. +* **`[String]` MacAddressMaximum** _(Write)_: Specifies the maximum MAC address + using a valid hexadecimal value. Use with the MacAddressMinimum parameter + to establish a range of MAC addresses that the specified Hyper-V host can assign + to virtual machines configured to receive dynamic MAC addresses. +* **`[String]` MacAddressMinimum** _(Write)_: Specifies the minimum MAC address + using a valid hexadecimal value. Use with the MacAddressMaximum parameter to + establish a range of MAC addresses that the specified Hyper-V host can assign + to virtual machines configured to receive dynamic MAC addresses. +* **`[Uint32]` MaximumStorageMigrations** _(Write)_: Specifies the maximum number + of storage migrations that can be performed at the same time on the Hyper-V host. +* **`[Uint32]` MaximumVirtualMachineMigrations** _(Write)_: Specifies the maximum + number of live migrations that can be performed at the same time + on the Hyper-V host. +* **`[Boolean]` NumaSpanningEnabled** _(Write)_: Specifies whether virtual machines + on the Hyper-V host can use resources from more than one NUMA node. +* **`[Uint32]` ResourceMeteringSaveIntervalMinute** _(Write)_: Specifies how often + the Hyper-V host saves the data that tracks resource usage. The range is a minimum + of 60 minutes to a maximum 1440 minutes (24 hours). +* **`[Boolean]` UseAnyNetworkForMigration** _(Write)_: Specifies how networks are + selected for incoming live migration traffic. If set to $True, any available network + on the host can be used for this traffic. If set to $False, incoming live migration + traffic is transmitted only on the networks specified in the MigrationNetworks + property of the host. +* **`[String]` VirtualHardDiskPath** _(Write)_: Specifies the default folder to + store virtual hard disks on the Hyper-V host. +* **`[String]` VirtualMachineMigrationAuthenticationType** _(Write)_: Specifies the + type of authentication to be used for live migrations. { Kerberos | CredSSP }. +* **`[String]` VirtualMachineMigrationPerformanceOption** _(Write)_: Specifies the + performance option to use for live migration. { TCPIP | Compression | SMB }. +* **`[String]` VirtualMachinePath** _(Write)_: Specifies the default folder + to store virtual machine configuration files on the Hyper-V host. +* **`[Boolean]` VirtualMachineMigrationEnabled** _(Write)_: Indicates whether Live + Migration should be enabled or disabled on the Hyper-V host. + +#### Read-Only Properties from Get-TargetResource for xVMHost + +None + +#### Examples xVMHost + +* [Change VM Host paths](/Examples/Sample_xVMHost_Paths.ps1) + +### xVMHyperV + +Manages VMs in a Hyper-V host. + +The following properties **cannot** be changed after VM creation: + +* VhdPath +* Path +* Generation + +#### Requirements for xVMHyperV + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVMHyperV + +* **`[String]` Name** _(Key)_: The desired VM name. +* **`[String]` VhdPath** _(Required)_: The desired VHD associated with the VM. +* **`[String[]]` SwitchName** _(Write)_: Virtual switch(es) associated with the VM. + Multiple NICs can now be assigned. +* **`[String]` State** _(Write)_: State of the VM: { Running | Paused | Off }. +* **`[String]` Path** _(Write)_: Folder where the VM data will be stored. +* **`[Uint32]` Generation** _(Write)_: Virtual machine generation. + Generation 2 virtual machines __only__ support VHDX files. + The default value is 1. { *1* | 2 }. +* **`[Boolean]` SecureBoot** _(Write)_: Enables or disables secure boot + __only on generation 2 virtual machines__. + The default value is $true. +* **`[Uint64]` StartupMemory** _(Write)_: Startup RAM for the VM. + If neither MinimumMemory nor MaximumMemory is specified, dynamic memory will be disabled. +* **`[Uint64]` MinimumMemory** _(Write)_: Minimum RAM for the VM. + Setting this property enables dynamic memory. Exception: + If MinimumMemory, MaximumMemory and StartupMemory is equal, dynamic memory will be disabled. +* **`[Uint64]` MaximumMemory** _(Write)_: Maximum RAM for the VM. + Setting this property enables dynamic memory. Exception: + If MinimumMemory, MaximumMemory and StartupMemory is equal, dynamic memory will be disabled. +* **`[String[]]` MACAddress** _(Write)_: MAC address(es) of the VM. + Multiple MAC addresses can now be assigned. +* **`[Uint32]` ProcessorCount** _(Write)_: Processor count for the VM. +* **`[Boolean]` WaitForIP** _(Write)_: If specified, waits for the VM to get + valid IP address. +* **`[Boolean]` RestartIfNeeded** _(Write)_: If specified, will shutdown and + restart the VM as needed for property changes. +* **`[String]` Ensure** _(Write)_: Ensures that the VM is Present or Absent. + The default value is Present. { *Present* | Absent }. +* **`[String]` Notes** _(Write)_: Notes about the VM. +* **`[Boolean]` EnableGuestService** _(Write)_: Enable Guest Service Interface + for the VM. The default value is $false. + +#### Read-Only Properties from Get-TargetResource for xVMHyperV + +* **`[String]` ID** _(Read)_: VM unique ID. +* **`[String]` Status** _(Read)_: Status of the VM. +* **`[Uint32]` CPUUsage** _(Read)_: CPU Usage of the VM. +* **`[Uint64]` MemoryAssigned** _(Read)_: Memory assigned to the VM. +* **`[String]` Uptime** _(Read)_: Uptime of the VM. +* **`[DateTime]` CreationTime** _(Read)_: Creation time of the VM. +* **`[Boolean]` HasDynamicMemory** _(Read)_: Does VM has dynamic memory enabled. +* **`[String[]]` NetworkAdapters** _(Read)_: Network adapters' IP addresses of + the VM". + +#### Examples xVMHyperV + +* [Create a VM (Simple)](/Examples/Sample_xVMHyperV_Simple.ps1) +* [Create a VM with dynamic memory](/Examples/Sample_xVMHyperV_DynamicMemory.ps1) +* [Create a VM (Complete)](/Examples/Sample_xVMHyperV_Complete.ps1) +* [Create a VM with multiple NICs attached to multiple switches](/Examples/Sample_xVMHyperV_MultipleNICs.ps1) + +### xVMNetworkAdapter + +Manages VMNetadapters attached to a Hyper-V virtual machine or the management OS. + +#### Requirements for xVMNetworkAdapter + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVMNetworkAdapter + +* **`[String]` Id** _(Key)_: Unique string for identifying the resource instance. +* **`[String]` Name** _(Required)_: Name of the network adapter as it appears either + in the management OS or attached to a VM. +* **`[String]` SwitchName** _(Required)_: Virtual Switch name to connect to. +* **`[String]` VMName** _(Required)_: Name of the VM to attach to. + If you want to attach new VM Network adapter to the management OS, + set this property to 'Management OS'. +* **`[xNetworkSettings]` NetworkSetting** _(Write)_: Network Settings of the network adapter. + If this parameter is not supplied, DHCP will be used. +* **`[String]` MacAddress** _(Write)_: Use this to specify a Static MAC Address. + If this parameter is not specified, dynamic MAC Address will be set. +* **`[String]` VlanId** _(Write)_: Use this to specify a Vlan id on the +* Network Adapter. +* **`[String]` Ensure** _(Write)_: Ensures that the VM Network Adapter is + Present or Absent. The default value is Present. { *Present* | Absent }. + +##### xNetworkSettings Class + +* **`[String]` IpAddress** _(Write)_: IpAddress to give the network adapter. + Only used if not Dhcp. Required if not Dhcp. +* **`[String]` Subnet** _(Write)_: Subnet to give the network adapter. + Only used if not Dhcp. Required if not Dhcp. +* **`[String]` DefaultGateway** _(Write)_: DefaultGateway to give the network adapter. + Only used if not Dhcp. +* **`[String]` DnsServer** _(Write)_: DNSServer to give the network adapter. + Only used if not Dhcp. + +#### Read-Only Properties from Get-TargetResource for xVMNetworkAdapter + +* **`[Boolean]` DynamicMacAddress** _(Read)_: Does the VMNetworkAdapter use a + Dynamic MAC Address. + +#### Examples xVMNetworkAdapter + +* [Add a new VM Network adapter in the management OS](/Examples/Sample_xVMNetworkAdapter_ManagementOS.ps1) +* [Add multiple VM Network adapters to a VM](/Examples/Sample_xVMNetworkAdapter_MultipleVM.ps1) +* [Add a couple of VM Network adapters in the management OS](/Examples/Sample_xVMNetworkAdapter_MultipleManagementOS.ps1) +* [Add multiple VM Network adapters to a VM using status MAC addresses](/Examples/Sample_xVMNetworkAdapter_MultipleVMMACAddress.ps1) +* [Add VM Network adapters to a VM with a Vlan tag](/Examples/Sample_xVMNetworkAdapter_VMVlanTagging.ps1) +* [Add VM Network adapters to a VM with a static IpAddress](/Examples/Sample_xVMNetworkAdapter_VMStaticNetworkSettings.ps1) + +### xVMProcessor + +Manages Hyper-V virtual machine processor options. + +#### Requirements for xVMProcessor + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVMProcessor + +* **`[String]` VMName** _(Key)_: Specifies the name of the virtual machine + on which the processor is to be configured. +* **`[Boolean]` EnableHostResourceProtection** _(Write)_: Specifies whether to + enable host resource protection. NOTE: Only supported on Windows 10 and Server 2016. +* **`[Boolean]` ExposeVirtualizationExtensions** _(Write)_: Specifies whether + nested virtualization is enabled. NOTE: Only supported on + Windows 10 and Server 2016. +* **`[Uint64]` HwThreadCountPerCore** _(Write)_: Specifies the maximum thread core + per processor core. NOTE: Only supported on Windows 10 and Server 2016. +* **`[Uint64]` Maximum** _(Write)_: Specifies the maximum percentage of resources + available to the virtual machine processor to be configured. + Allowed values range from 0 to 100. +* **`[Uint32]` MaximumCountPerNumaNode** _(Write)_: Specifies the maximum number + of processors per NUMA node to be configured for the virtual machine. +* **`[Uint32]` MaximumCountPerNumaSocket** _(Write)_: Specifies the maximum number + of sockets per NUMA node to be configured for the virtual machine. +* **`[Unit32]` RelativeWeight** _(Write)_: Specifies the priority for allocating + the physical computer's processing power to this virtual machine relative to others. + Allowed values range from 1 to 10000. +* **`[Uint64]` Reserve** _(Write)_: Specifies the percentage of processor resources + to be reserved for this virtual machine. Allowed values range from 0 to 100. +* **`[String]` ResourcePoolName** _(Write)_: Specifies the name of the processor + resource pool to be used. +* **`[Boolean]` CompatibilityForMigrationEnabled** _(Write)_: Specifies whether + the virtual processors features are to be limited for compatibility when migrating + the virtual machine to another host. +* **`[Boolean]` CompatibilityForOlderOperatingSystemsEnabled** _(Write)_: Specifies + whether the virtual processor’s features are to be limited for compatibility + with older operating systems. +* **`[Boolean]` RestartIfNeeded** _(Write)_: If specified, shutdowns and restarts + the VM if needed for property changes. + +#### Read-Only Properties from Get-TargetResource for xVMProcessor + +None + +#### Examples xVMProcessor + +* [Create a secure boot gen 2 VM for a given VHD with nested virtualisation enabled](/Examples/Sample_xVMHyperV_SimpleWithNestedVirtualization.ps1) + +### xVMScsiController + +Manages the SCSI controllers attached to a Hyper-V virtual machine. +When removing a controller, all the disks still connected to the controller will be detached. + +#### Requirements for xVMScsiController + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVMScsiController + +* **`[String]` VMName** _(Key)_: Specifies the name of the virtual machine whose SCSI + controller is to be manipulated. +* **`[Uint32]` ControllerNumber** _(Key)_: Specifies the number of the controller to + be set: { 0 | 1 | 2 | 3 }. +* **`[String]` Ensure** _(Write)_: Specifies if the SCSI controller should exist or + not. The default value is Present. { *Present* | Absent }. + +#### Read-Only Properties from Get-TargetResource for xVMScsiController + +None + +#### Examples xVMScsiController + +* [Add a secondary SCSI controller](/Examples/Sample_xVMScsiController_AddControllers.ps1) + +### xVMSwitch + +Manages virtual switches in a Hyper-V host. + +#### Requirements for xVMSwitch + +* The Hyper-V Role has to be installed on the machine. +* The Hyper-V PowerShell module has to be installed on the machine. + +#### Parameters for xVMSwitch + +* **`[String]` Name** _(Key)_: The desired VM Switch name. +* **`[String]` Type** _(Key)_: The desired type of switch. + { External | Internal | Private } +* **`[String[]]` NetAdapterName** _(Write)_: Network adapter name(s) + for external switch type. +* **`[Boolean]` AllowManagementOS** _(Write)_: Specify if the VM host + has access to the physical NIC. The default value is $false. +* **`[Boolean]` EnableEmbeddedTeaming** _(Write)_: Should embedded NIC teaming + be used (Windows Server 2016 only). The default value is $false. +* **`[String]` BandwidthReservationMode** _(Write)_: Specify the QoS mode used + (options other than NA are only supported on Hyper-V 2012+). + The default value is NA. { Default | Weight | Absolute | None | *NA* }. +* **`[String]` LoadBalancingAlgorithm** _(Write)_: Specify the Load Balancing algorithm which should be used for the embedded NIC teaming. + { Dynamic | HyperVPort }. +* **`[Boolean]` Id** _(Write)_: Specify the desired Unique ID of the Hyper-V switch. If not specified the ID will be generated by the system every time the Hyper-V Switch is created. (Windows Server 2016 only) +* **`[String]` Ensure** _(Write)_: Ensures that the VM Switch is Present or Absent. + The default value is Present. { *Present* | Absent }. + +#### Read-Only Properties from Get-TargetResource for xVMSwitch + +* **`[String]` NetAdapterInterfaceDescription** _(Read)_: Description of the + network interface. + +#### Examples xVMSwitch + +* [Create an internal VM Switch](/Examples/Sample_xVMSwitch_Internal.ps1) +* [Create an external VM Switch](/Examples/Sample_xVMSwitch_External.ps1) +* [Create an external VM Switch with embedded teaming](/Examples/Sample_xVMSwitch_ExternalSET.ps1) diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/IntegrationTestsCommon.psm1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/IntegrationTestsCommon.psm1 new file mode 100644 index 0000000..f407d69 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/IntegrationTestsCommon.psm1 @@ -0,0 +1,59 @@ +<# + .SYNOPSIS + Tests if Hyper-V is installed on this OS. + + .OUTPUTS + True if Hyper-V is installed. False otherwise. +#> +function Test-HyperVInstalled +{ + [CmdletBinding()] + [OutputType([String])] + param + ( + ) + + # Ensure that the tests can be performed on this computer + if ($PSVersionTable.PSEdition -eq 'Core') + { + # Nano Server uses Get-WindowsOptionalFeature like Desktop OS + $ProductType = 1 + } + else + { + $ProductType = (Get-CimInstance Win32_OperatingSystem).ProductType + } # if + switch ($ProductType) { + 1 + { + # Desktop OS or Nano Server + $HyperVInstalled = (((Get-WindowsOptionalFeature ` + -FeatureName Microsoft-Hyper-V ` + -Online).State -eq 'Enabled') -and ` + ((Get-WindowsOptionalFeature ` + -FeatureName Microsoft-Hyper-V-Management-PowerShell ` + -Online).State -eq 'Enabled')) + Break + } + 3 + { + # Server OS + $HyperVInstalled = (((Get-WindowsFeature -Name Hyper-V).Installed) -and ` + ((Get-WindowsFeature -Name Hyper-V-PowerShell).Installed)) + Break + } + default + { + # Unsupported OS type for testing + Write-Verbose -Message "Integration tests cannot be run on this operating system." -Verbose + Break + } + } + + if ($HyperVInstalled -eq $false) + { + Write-Verbose -Message "Integration tests cannot be run because Hyper-V Components not installed." -Verbose + Return $false + } + Return $True +} # end function Test-HyperVInstalled diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive.Integration.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive.Integration.Tests.ps1 new file mode 100644 index 0000000..50813a0 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive.Integration.Tests.ps1 @@ -0,0 +1,141 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMDvdDrive' + +#region HEADER +# Integration Test Template Version: 1.1.1 +[String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Integration +#endregion + +# Import the common integration test functions +Import-Module -Name ( Join-Path ` + -Path $PSScriptRoot ` + -ChildPath 'IntegrationTestsCommon.psm1' ) + +# Ensure that the tests can be performed on this computer +if (-not (Test-HyperVInstalled)) +{ + Return +} # if + +# Using try/finally to always cleanup even if something awful happens. +try +{ + $VMName = 'HyperVIntTestsVM' + ## Cannot use $TestDrive here as it no longer accessible outside of Describe/Context + $VMPath = Join-Path -Path $env:Temp -ChildPath $VMName + + # Make sure test VM does not exist + if (Get-VM -Name $VMName -ErrorAction SilentlyContinue) + { + $null = Remove-VM -Name $VMName -Force + } # if + + # Create the VM that will be used to test with + $null = New-VM -Name $VMName -NoVHD -Path $VMPath + + # Create a config data object to pass to the DSC Configs + $ConfigData = @{ + AllNodes = @( + @{ + NodeName = 'localhost' + VMName = $VMName + ControllerNumber = 0 + ControllerLocation = 0 + Path = '' + } + ) + } + + # Add DVD Drive + $ConfigFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:DSCResourceName)_add.config.ps1" + . $ConfigFile -Verbose -ErrorAction Stop + + Describe "$($script:DSCResourceName)_Add_Integration" { + Context 'Add a DVD Drive to a VM' { + #region DEFAULT TESTS + It 'Should compile without throwing' { + { + & "$($script:DSCResourceName)_Add_Config" ` + -OutputPath $TestDrive ` + -ConfigurationData $ConfigData + Start-DscConfiguration -Path $TestDrive ` + -ComputerName localhost -Wait -Verbose -Force + } | Should not throw + } + + It 'should be able to call Get-DscConfiguration without throwing' { + { Get-DscConfiguration -Verbose -ErrorAction Stop } | Should Not throw + } + #endregion + + It 'Should have set the resource and all the parameters should match' { + $current = Get-DscConfiguration | Where-Object { + $_.ConfigurationName -eq "$($script:DSCResourceName)_Add_Config" + } + $current.VMName | Should Be $VMName + $current.ControllerNumber | Should Be 0 + $current.ControllerLocation | Should Be 0 + $current.Path | Should BeNullOrEmpty + $current.Ensure | Should Be 'Present' + } + } + } + + # Dismount ISO + $ConfigFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:DSCResourceName)_remove.config.ps1" + . $ConfigFile -Verbose -ErrorAction Stop + + Describe "$($script:DSCResourceName)_Remove_Integration" { + Context 'Remove a DVD Drive from a VM' { + #region DEFAULT TESTS + It 'Should compile without throwing' { + { + & "$($script:DSCResourceName)_Remove_Config" ` + -OutputPath $TestDrive ` + -ConfigurationData $ConfigData + Start-DscConfiguration -Path $TestDrive ` + -ComputerName localhost -Wait -Verbose -Force + } | Should not throw + } + + It 'should be able to call Get-DscConfiguration without throwing' { + { Get-DscConfiguration -Verbose -ErrorAction Stop } | Should Not throw + } + #endregion + + It 'Should have set the resource and all the parameters should match' { + $current = Get-DscConfiguration | Where-Object { + $_.ConfigurationName -eq "$($script:DSCResourceName)_Remove_Config" + } + $current.VMName | Should Be $VMName + $current.ControllerNumber | Should Be 0 + $current.ControllerLocation | Should Be 0 + $current.Path | Should BeNullOrEmpty + $current.Ensure | Should Be 'Absent' + } + } + } +} +finally +{ + #region FOOTER + # Make sure the test VM has been removed + if (Get-VM -Name $VMName -ErrorAction SilentlyContinue) + { + $null = Remove-VM -Name $VMName -Force + } # if + + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive_add.config.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive_add.config.ps1 new file mode 100644 index 0000000..defc5f3 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive_add.config.ps1 @@ -0,0 +1,14 @@ +configuration MSFT_xVMDvdDrive_Add_Config { + + Import-DscResource -ModuleName xHyper-V + + node localhost { + xVMDvdDrive Integration_Test { + VMName = $Node.VMName + ControllerNumber = $Node.ControllerNumber + ControllerLocation = $Node.ControllerLocation + Path = $Node.Path + Ensure = 'Present' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive_remove.config.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive_remove.config.ps1 new file mode 100644 index 0000000..fb9ea13 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMDvdDrive_remove.config.ps1 @@ -0,0 +1,14 @@ +configuration MSFT_xVMDvdDrive_Remove_Config { + + Import-DscResource -ModuleName xHyper-V + + node localhost { + xVMDvdDrive Integration_Test { + VMName = $Node.VMName + ControllerNumber = $Node.ControllerNumber + ControllerLocation = $Node.ControllerLocation + Path = $Node.Path + Ensure = 'Absent' + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMHost.Integration.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMHost.Integration.Tests.ps1 new file mode 100644 index 0000000..1a18764 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMHost.Integration.Tests.ps1 @@ -0,0 +1,94 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMHost' + +#region HEADER +# Integration Test Template Version: 1.1.1 +[String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Integration +#endregion + +# Import the common integration test functions +Import-Module -Name ( Join-Path ` + -Path $PSScriptRoot ` + -ChildPath 'IntegrationTestsCommon.psm1' ) + +# Ensure that the tests can be performed on this computer +if (-not (Test-HyperVInstalled)) +{ + Return +} # if + +$currentVmHost = Get-VMHost +# Set-VMHost appears to update $currentVmHost by reference?! +$currentVirtualHardDiskPath = $currentVmHost.VirtualHardDiskPath +$currentVirtualMachinePath = $currentVmHost.VirtualMachinePath +$currentEnableEnhancedSessionMode = $currentVmHost.EnableEnhancedSessionMode + +# Using try/finally to always cleanup even if something awful happens. +try +{ + # Import the configuration + $ConfigFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:DSCResourceName)_set.config.ps1" + . $ConfigFile -Verbose -ErrorAction Stop + + Describe "$($script:DSCResourceName)_Set_Integration" { + #region DEFAULT TESTS + It 'Should compile without throwing' { + { + & "$($script:DSCResourceName)_Set_Config" ` + -OutputPath $TestDrive ` + -ConfigurationData $ConfigData ` + -VirtualHardDiskPath $TestDrive ` + -VirtualMachinePath $TestDrive ` + -EnableEnhancedSessionMode (-not $currentEnableEnhancedSessionMode) + + $startDscConfigurationParams = @{ + Path = $TestDrive; + ComputerName = 'localhost'; + Wait = $true; + Verbose = $true; + Force = $true; + } + Start-DscConfiguration @startDscConfigurationParams + + } | Should not throw + } + + It 'should be able to call Get-DscConfiguration without throwing' { + { Get-DscConfiguration -Verbose -ErrorAction Stop } | Should Not throw + } + #endregion + + It 'Should have set the resource and all the parameters should match' { + $current = Get-DscConfiguration | Where-Object { + $_.ConfigurationName -eq "$($script:DSCResourceName)_Set_Config" + } + + $current.VirtualHardDiskPath | Should Be $TestDrive.FullName + $current.VirtualMachinePath | Should Be $TestDrive.FullName + $current.EnableEnhancedSessionMode | Should Be (-not $currentEnableEnhancedSessionMode) + } + } +} +finally +{ + #region FOOTER + + # Restore current host settings + Set-VMHost -VirtualHardDiskPath $currentVirtualHardDiskPath ` + -VirtualMachinePath $currentVirtualMachinePath ` + -EnableEnhancedSessionMode $currentEnableEnhancedSessionMode -Verbose + + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMHost_set.config.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMHost_set.config.ps1 new file mode 100644 index 0000000..14c43bc --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMHost_set.config.ps1 @@ -0,0 +1,29 @@ +configuration MSFT_xVMHost_Set_Config +{ + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $VirtualHardDiskPath, + + [Parameter(Mandatory = $true)] + [System.String] + $VirtualMachinePath, + + [Parameter()] + [System.Boolean] + $EnableEnhancedSessionMode + ) + + Import-DscResource -ModuleName xHyper-V + + node localhost { + xVMHost Integration_Test { + IsSingleInstance = 'Yes' + VirtualHardDiskPath = $VirtualHardDiskPath + VirtualMachinePath = $VirtualMachinePath + EnableEnhancedSessionMode = $EnableEnhancedSessionMode + } + } + +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMProcessor.Integration.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMProcessor.Integration.Tests.ps1 new file mode 100644 index 0000000..a5751f5 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMProcessor.Integration.Tests.ps1 @@ -0,0 +1,103 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMProcessor' + +#region HEADER +# Integration Test Template Version: 1.1.1 +[String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Integration +#endregion + +# Import the common integration test functions +Import-Module -Name ( Join-Path ` + -Path $PSScriptRoot ` + -ChildPath 'IntegrationTestsCommon.psm1' ) + +# Ensure that the tests can be performed on this computer +if (-not (Test-HyperVInstalled)) +{ + Return +} # if + +# Using try/finally to always cleanup even if something awful happens. +try +{ + $VMName = 'HyperVIntTestsVM' + $VMPath = Join-Path -Path $env:Temp ` + -ChildPath $VMName + + # Make sure test VM does not exist + if (Get-VM -Name $VMName -ErrorAction SilentlyContinue) + { + $null = Remove-VM -Name $VMName -Force + } # if + + # Create the VM that will be used to test with + $null = New-VM -Name $VMName -NoVHD -Path $VMPath + + # Create a config data object to pass to the DSC Configs + $ConfigData = @{ + AllNodes = @( + @{ + NodeName = 'localhost' + VMName = $VMName + CompatibilityForMigrationEnabled = $true + CompatibilityForOlderOperatingSystemsEnabled = $true + } + ) + } + + # Set processor option(s) + $ConfigFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:DSCResourceName)_set.config.ps1" + . $ConfigFile -Verbose -ErrorAction Stop + + Describe "$($script:DSCResourceName)_Set_Integration" { + Context 'Configure VM' { + #region DEFAULT TESTS + It 'Should compile without throwing' { + { + & "$($script:DSCResourceName)_Set_Config" ` + -OutputPath $TestDrive ` + -ConfigurationData $ConfigData + Start-DscConfiguration -Path $TestDrive ` + -ComputerName localhost -Wait -Verbose -Force + } | Should not throw + } + + It 'should be able to call Get-DscConfiguration without throwing' { + { Get-DscConfiguration -Verbose -ErrorAction Stop } | Should Not throw + } + #endregion + + It 'Should have set the resource and all the parameters should match' { + $current = Get-DscConfiguration | Where-Object { + $_.ConfigurationName -eq "$($script:DSCResourceName)_Set_Config" + } + $current.VMName | Should Be $VMName + $current.CompatibilityForMigrationEnabled | Should Be $true + $current.CompatibilityForOlderOperatingSystemsEnabled | Should Be $true + } + } + } +} +finally +{ + #region FOOTER + # Make sure the test VM has been removed + if (Get-VM -Name $VMName -ErrorAction SilentlyContinue) + { + $null = Remove-VM -Name $VMName -Force + } # if + + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMProcessor_set.config.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMProcessor_set.config.ps1 new file mode 100644 index 0000000..ee46073 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Integration/MSFT_xVMProcessor_set.config.ps1 @@ -0,0 +1,12 @@ +configuration MSFT_xVMProcessor_Set_Config { + + Import-DscResource -ModuleName xHyper-V + + node localhost { + xVMProcessor Integration_Test { + VMName = $Node.VMName + CompatibilityForMigrationEnabled = $Node.CompatibilityForMigrationEnabled + CompatibilityForOlderOperatingSystemsEnabled = $Node.CompatibilityForOlderOperatingSystemsEnabled + } + } +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/HyperVCommon.tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/HyperVCommon.tests.ps1 new file mode 100644 index 0000000..1158f2e --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/HyperVCommon.tests.ps1 @@ -0,0 +1,338 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'HyperVCommon' + +#region HEADER +# Unit Test Template Version: 1.1.0 +[String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit +#endregion HEADER + +# Begin Testing +try +{ + #region Pester Tests + + $LocalizedData = InModuleScope $script:DSCResourceName { + $LocalizedData + } + + InModuleScope $script:DSCResourceName { + + Describe 'HyperVCommon\Set-VMProperty' { + + function Get-VM { + param + ( + [System.String] + $Name + ) + } + + function Get-VMProcessor { + param + ( + [System.String] + $VMName + ) + } + + function Set-VMProcessor { + param + ( + [System.String] + $VMName + ) + } + + # Guard mocks + Mock Get-VM { } + Mock Set-VMState { } + Mock Get-VMProcessor { } + Mock Set-VMProcessor { } + + It "Should throw if VM is running and 'RestartIfNeeded' is False" { + Mock Get-VM { return @{ State = 'Running' } } + + $setVMPropertyParams = @{ + VMName = 'Test'; + VMCommand = 'Set-VMProcessor'; + ChangeProperty = @{ ResourcePoolName = 'Dummy' } + } + { Set-VMProperty @setVMPropertyParams } | Should Throw 'RestartIfNeeded' + } + + It "Should stop and restart VM when running and 'RestartIfNeeded' is True" { + Mock Get-VM { return @{ State = 'Running' } } + + $setVMPropertyParams = @{ + VMName = 'Test'; + VMCommand = 'Set-VMProcessor'; + ChangeProperty = @{ ResourcePoolName = 'Dummy' } + RestartIfNeeded = $true; + } + Set-VMProperty @setVMPropertyParams + + Assert-MockCalled Set-VMState -ParameterFilter { $State -eq 'Off' } -Scope It + Assert-MockCalled Set-VMState -ParameterFilter { $State -eq 'Running' } -Scope It + } + + } + + Describe 'HyperVCommon\Set-VMState' { + + function Get-VM { + param + ( + [System.String] + $Name + ) + } + + function Resume-VM { + param + ( + [System.String] + $Name + ) + } + + function Start-VM { + param + ( + [System.String] + $Name + ) + } + + function Stop-VM { + param + ( + [System.String] + $Name + ) + } + + function Suspend-VM { + param + ( + [System.String] + $Name + ) + } + + # Guard mocks + Mock Resume-VM { } + Mock Start-VM { } + Mock Stop-VM { } + Mock Suspend-VM { } + Mock Wait-VMIPAddress { } + + It 'Should resume VM when current "State" is "Paused" and target state is "Running"' { + Mock Get-VM { return @{ State = 'Paused' } } + + Set-VMState -Name 'TestVM' -State 'Running' + + Assert-MockCalled Resume-VM -Scope It + Assert-MockCalled Wait-VMIPAddress -Scope It -Exactly 0 + } + + It 'Should resume VM and wait when current "State" is "Paused" and target state is "Running"' { + Mock Get-VM { return @{ State = 'Paused' } } + + Set-VMState -Name 'TestVM' -State 'Running' -WaitForIP $true + + Assert-MockCalled Resume-VM -Scope It + Assert-MockCalled Wait-VMIPAddress -Scope It + } + + It 'Should start VM when current "State" is "Off" and target state is "Running"' { + Mock Get-VM { return @{ State = 'Off' } } + + Set-VMState -Name 'TestVM' -State 'Running' + + Assert-MockCalled Start-VM -Scope It + Assert-MockCalled Wait-VMIPAddress -Scope It -Exactly 0 + } + + It 'Should start VM and wait when current "State" is "Off" and target state is "Running"' { + Mock Get-VM { return @{ State = 'Off' } } + + Set-VMState -Name 'TestVM' -State 'Running' -WaitForIP $true + + Assert-MockCalled Start-VM -Scope It + Assert-MockCalled Wait-VMIPAddress -Scope It + } + + It 'Should suspend VM when current "State" is "Running" and target state is "Paused"' { + Mock Get-VM { return @{ State = 'Running' } } + + Set-VMState -Name 'TestVM' -State 'Paused' + + Assert-MockCalled Suspend-VM -Scope It + } + + It 'Should stop VM when current "State" is "Running" and target state is "Off"' { + Mock Get-VM { return @{ State = 'Running' } } + + Set-VMState -Name 'TestVM' -State 'Off' + + Assert-MockCalled Stop-VM -Scope It + } + + It 'Should stop VM when current "State" is "Paused" and target state is "Off"' { + Mock Get-VM { return @{ State = 'Paused' } } + + Set-VMState -Name 'TestVM' -State 'Off' + + Assert-MockCalled Stop-VM -Scope It + } + } # describe HyperVCommon\Set-VMState + } + + Describe 'HyperVCommon\Wait-VMIPAddress' { + + function Get-VMNetworkAdapter { + param + ( + [System.String] + $VMName + ) + } + + # Guard mocks + Mock Get-VMNetworkAdapter -ModuleName $script:DSCResourceName { } + + It 'Should return when VM network adapter reports 2 IP addresses' { + Mock Get-VMNetworkAdapter -ModuleName $script:DSCResourceName { return @{ IpAddresses = @('192.168.0.1','172.16.0.1') } } + + $result = Wait-VMIPAddress -Name 'Test' + + $result | Should BeNullOrEmpty + } + + It 'Should throw when after timeout is exceeded' { + Mock Get-VMNetworkAdapter -ModuleName $script:DSCResourceName { return $null } + + { Wait-VMIPAddress -Name 'Test' -Timeout 2 } | Should Throw 'timed out' + } + } # describe HyperVCommon\WaitVMIPAddress + + Describe 'HyperVCommon\ConvertTo-TimeSpan' { + + It 'Should convert 60 seconds to "System.TimeSpan" of 1 minute' { + $testSeconds = 60 + + $result = ConvertTo-TimeSpan -TimeInterval $testSeconds -TimeIntervalType Seconds + + $result.TotalMinutes | Should Be 1 + } + + It 'Should convert 60 minutes to "System.TimeSpan" of 60 minutes' { + $testMinutes = 60 + + $result = ConvertTo-TimeSpan -TimeInterval $testMinutes -TimeIntervalType Minutes + + $result.TotalHours | Should Be 1 + } + + It 'Should convert 48 hours to "System.TimeSpan" of 2 days' { + $testHours = 48 + + $result = ConvertTo-TimeSpan -TimeInterval $testHours -TimeIntervalType Hours + + $result.TotalDays | Should Be 2 + } + + } # describe HyperVCommon\ConvertTo-TimeSpan + + Describe 'HyperVCommon\ConvertFrom-TimeSpan' { + + It 'Should convert a "System.TimeSpan" of 1 minute to 60 seconds' { + $testTimeSpan = New-TimeSpan -Minutes 1 + + $result = ConvertFrom-TimeSpan -TimeSpan $testTimeSpan -TimeSpanType Seconds + + $result | Should Be 60 + } + + It 'Should convert a "System.TimeSpan" of 1 hour to 60 minutes' { + $testTimeSpan = New-TimeSpan -Hours 1 + + $result = ConvertFrom-TimeSpan -TimeSpan $testTimeSpan -TimeSpanType Minutes + + $result | Should Be 60 + } + + It 'Should convert a "System.TimeSpan" of 2 dayes to 48 hours' { + $testTimeSpan = New-TimeSpan -Days 2 + + $result = ConvertFrom-TimeSpan -TimeSpan $testTimeSpan -TimeSpanType Hours + + $result | Should Be 48 + } + + } # describe HyperVCommon\ConvertFrom-TimeSpan + + Describe 'HyperVCommon\Get-VMHyperV' { + + function Get-VM { + [CmdletBinding()] + param + ( + $Name + ) + } + + # Guard mocks + Mock Get-VM -ModuleName $script:DSCResourceName { } + + It 'Should not throw when no VM is found' { + Mock Get-VM -ModuleName $script:DSCResourceName { } + $testVMName = 'TestVM' + + $result = Get-VMHyperV -VMName $testVMName + + $result | Should BeNullOrEmpty + } + + It 'Should not throw when one VM is found' { + Mock Get-VM -ModuleName $script:DSCResourceName { + Write-Output -InputObject ([PSCustomObject] @{ Name = $VMName }) + } + $testVMName = 'TestVM' + + $result = Get-VMHyperV -VMName $testVMName + + $result.Name | Should Be $testVMName + } + + It 'Should throw when more than one VM is found' { + Mock Get-VM -ModuleName $script:DSCResourceName { + Write-Output -InputObject ([PSCustomObject] @{ Name = $VMName }) + Write-Output -InputObject ([PSCustomObject] @{ Name = $VMName }) + } + $testVMName = 'TestVM' + + { Get-VMHyperV -VMName $testVMName } | Should Throw 'More than one VM' + } + + } # describe HyperVCommon\Get-VMHyperV + +} +finally +{ + #region FOOTER + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion + +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVHD.tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVHD.tests.ps1 new file mode 100644 index 0000000..83d779c --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVHD.tests.ps1 @@ -0,0 +1,302 @@ +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone', 'https://github.com/PowerShell/DscResource.Tests.git', (Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'xHyper-V' ` + -DSCResourceName 'MSFT_xVHD' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup +{ + +} + +function Invoke-TestCleanup +{ + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_xVHD' { + Describe 'MSFT_xVHD\Get-TargetResource' { + # Create an empty function to be able to mock the missing Hyper-V cmdlet + function Get-VHD + { + + } + + Context 'Should stop when Hyper-V module is missing' { + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $false + } + + It 'Should throw when the module is missing' { + { Test-TargetResource -Name 'server.vhdx' -Path 'C:\VMs' -Type 'Fixed' -MaximumSizeBytes 1GB } | + Should Throw 'Please ensure that Hyper-V role is installed with its PowerShell module' + } + } + + # Mocks "Get-Module -Name Hyper-V" so that the DSC resource thinks the Hyper-V module is on the test system + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $true + } + + Mock -CommandName GetNameWithExtension -MockWith { 'server.vhdx' } + + Context 'VHD Present' { + It 'Should return a hashtable with Ensure being Present' { + Mock -CommandName Get-VHD -MockWith { + [pscustomobject]@{ + Path = 'server.vhdx' + } + } + + $getTargetResult = Get-TargetResource -Name 'server' -Path 'c:\boguspath' -Generation 'vhdx' + $getTargetResult.Ensure | Should Be 'Present' + $getTargetResult | Should BeOfType hashtable + } + } + + Context 'VHD Not Present' { + It 'Should return a hashtable with Ensure being Absent' { + Mock -CommandName Get-VHD + + $getTargetResult = Get-TargetResource -Name 'server' -Path 'c:\boguspath' -Generation 'vhdx' + $getTargetResult.Ensure | Should Be 'Absent' + $getTargetResult | Should BeOfType hashtable + } + } + } + + Describe 'MSFT_xVHD\GetNameWithExtension' { + Context 'Name does not have extension' { + It 'Should return server.vhdx with generation vhdx' { + GetNameWithExtension -Name 'server' -Generation 'vhdx' | + Should Be 'server.vhdx' + } + + It 'Should return server.vhd with generation vhd' { + GetNameWithExtension -Name 'server' -Generation 'vhd' | + Should Be 'server.vhd' + } + + It 'Should not throw' { + { GetNameWithExtension -Name 'server' -Generation 'vhd' } | + Should Not Throw + } + } + + Context 'Name has extension' { + It 'Should return server.vhdx with Name server.vhdx and generation vhdx' { + GetNameWithExtension -Name 'server.vhd' -Generation 'vhd' | + Should Be 'server.vhd' + } + + It 'Should throw with mismatch with extension from name and generation' { + { GetNameWithExtension -Name 'server.vhdx' -Generation 'vhd' } | + Should Throw 'the extension vhdx on the name does not match the generation vhd' + } + } + } + + Describe 'MSFT_xVHD\Test-TargetResource' { + # Create an empty function to be able to mock the missing Hyper-V cmdlet + function Test-VHD + { + + } + + Context 'Should stop when Hyper-V module is missing' { + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $false + } + + It 'Should throw when the module is missing' { + { Test-TargetResource -Name 'server.vhdx' -Path 'C:\VMs' -Type 'Fixed' -MaximumSizeBytes 1GB } | + Should Throw 'Please ensure that Hyper-V role is installed with its PowerShell module' + } + } + + # Mocks "Get-Module -Name Hyper-V" so that the DSC resource thinks the Hyper-V module is on the test system + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $true + } + + Context 'Parameter validation' { + It 'Fixed and Dynamic VHDs need MaximumSizeBytes specified' { + { Test-TargetResource -Name 'server' -Path 'C:\VMs' -Type 'Dynamic' } | + Should Throw 'Specify MaximumSizeBytes property for Fixed and Dynamic VHDs.' + } + + It 'Parent Path is passed for a non Differencing disk' { + { Test-TargetResource -Name 'server' -Path 'C:\VMs' -ParentPath 'C:\VMs\Parent' -Type 'Fixed' -MaximumSizeBytes 1GB } | + Should Throw 'Parent path is only supported for Differencing disks' + } + + It 'Differencing disk needs a Parent Path' { + { Test-TargetResource -Name 'server' -Path 'C:\VMs' -Type 'Differencing' } | + Should Throw 'Differencing requires a parent path' + } + } + + Context 'ParentPath specified' { + It 'Should throw when ParentPath does not exist' { + Mock -CommandName Test-Path -MockWith { $false } + + { Test-TargetResource -Name 'server' -Path 'C:\VMs' -Type 'Differencing' -ParentPath 'c:\boguspath' } | + Should Throw 'c:\boguspath does not exists' + } + + # "Generation $Generation should match ParentPath extension $($ParentPath.Split('.')[-1])" + It 'Should throw when file extension and generation have a mismatch' { + Mock -CommandName Test-Path -MockWith { $true } + + { Test-TargetResource -Name 'server' -Path 'C:\VMs' -Type 'Differencing' -ParentPath 'c:\boguspath.vhd' -Generation 'Vhdx' } | + Should Throw 'Generation Vhdx should match ParentPath extension vhd' + } + } + + Context 'Path does not exist' { + It 'Should throw when the path does not exist' { + Mock -CommandName Test-Path -MockWith { $false } + + { Test-TargetResource -Name 'server.vhdx' -Path 'C:\VMs' -Type 'Fixed' -MaximumSizeBytes 1GB } | + Should Throw 'C:\VMs does not exists' + } + } + + Context 'Vhd exists' { + BeforeEach { + Mock -CommandName Test-Path -MockWith { $true } + Mock -CommandName GetNameWithExtension -MockWith { 'server.vhdx' } + Mock -CommandName Test-VHD -MockWith { $true } + } + + It 'Should not throw' { + { Test-TargetResource -Name 'server.vhdx' -Path 'C:\VMs' -Type 'Fixed' -MaximumSizeBytes 1GB } | + Should not Throw + } + + It 'Should return a boolean and it should be true' { + $testResult = Test-TargetResource -Name 'server.vhdx' -Path 'C:\VMs' -Type 'Fixed' -MaximumSizeBytes 1GB + $testResult | Should BeOfType bool + $testResult -eq $true | Should Be $true + } + } + + Context 'Vhd does not exist' { + BeforeEach { + Mock -CommandName Test-Path -MockWith { $true } + Mock -CommandName GetNameWithExtension -MockWith { 'server.vhdx' } + Mock -CommandName Test-VHD -MockWith { $false } + } + + It 'Should not throw' { + { Test-TargetResource -Name 'server.vhdx' -Path 'C:\VMs' -Type 'Fixed' -MaximumSizeBytes 1GB } | + Should not Throw + } + + It 'Should return a boolean and it should be false' { + $testResult = Test-TargetResource -Name 'server.vhdx' -Path 'C:\VMs' -Type 'Fixed' -MaximumSizeBytes 1GB + $testResult | Should BeOfType bool + $testResult -eq $true | Should Be $false + } + } + } + + Describe 'MSFT_xVHD\Set-TargetResource' { + # Create an empty function to be able to mock the missing Hyper-V cmdlet + function Get-VHD + { + + } + + function Set-VHD + { + + } + + function Resize-VHD + { + + } + + function New-VHD + { + + } + + Context 'Ensure is Absent' { + Mock -CommandName Test-Path -MockWith { $true } + Mock -CommandName Remove-Item + Mock -CommandName GetNameWithExtension -MockWith { 'server.vhdx' } + + It 'Should remove when Ensure is Absent and vhdx exists' { + $null = Set-TargetResource -Name 'server.vhdx' -Path 'TestDrive:\' -Ensure 'Absent' + Assert-MockCalled -CommandName Remove-Item -Times 1 -Exactly + } + } + + Context 'Ensure is Present' { + BeforeEach { + Mock -CommandName Get-VHD -MockWith { + [pscustomobject]@{ + Path = 'server.vhdx' + ParentPath = 'c:\boguspath\server.vhdx' + Size = 1073741824 + Type = 'Differencing' + } + } + + Mock -CommandName Set-VHD + Mock -CommandName Resize-VHD + Mock -CommandName GetNameWithExtension -MockWith { 'server.vhdx' } + Mock -CommandName New-VHD -MockWith { } + } + + It 'Should Create a VHD when Ensure is present and no VHD exists yet for non Differencing disk' { + Mock -CommandName Get-VHD -MockWith { throw } + + $null = Set-TargetResource -Name 'server.vhdx' -Path 'TestDrive:\' -Ensure 'Present' + Assert-MockCalled -CommandName New-VHD -Exactly -Times 1 -Scope It + } + + It 'Should Create a VHD when Ensure is present and no VHD exists yet for Differencing disk' { + Mock -CommandName Get-VHD -MockWith { throw } + + $null = Set-TargetResource -Name 'server.vhdx' -Path 'TestDrive:\' -Ensure 'Present' -ParentPath 'c:\boguspath\server.vhdx' -Type 'Differencing' + Assert-MockCalled -CommandName New-VHD -Exactly -Times 1 -Scope It + } + + It 'Should resize a VHD which has a different size as intended' { + $null = Set-TargetResource -Name 'server.vhdx' -Path 'TestDrive:\' -MaximumSizeBytes 2GB -Ensure 'Present' + Assert-MockCalled -CommandName Resize-VHD -Exactly -Times 1 -Scope It + } + + It 'Should update the parentpath if it is different from intent' { + $null = Set-TargetResource -Name 'server.vhdx' -Path 'TestDrive:\' -ParentPath 'c:\boguspath2\server.vhdx' -Ensure 'Present' + Assert-MockCalled -CommandName Set-VHD -Exactly -Times 1 -Scope It + } + } + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMDvdDrive.tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMDvdDrive.tests.ps1 new file mode 100644 index 0000000..a194462 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMDvdDrive.tests.ps1 @@ -0,0 +1,881 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMDvdDrive' + +#region HEADER +# Unit Test Template Version: 1.1.0 +[String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit +#endregion HEADER + +# Begin Testing +try +{ + #region Pester Tests + InModuleScope $script:DSCResourceName { + # Function to create a exception object for testing output exceptions + function Get-InvalidArgumentError + { + [CmdletBinding()] + param + ( + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorId, + + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorMessage + ) + + $exception = New-Object -TypeName System.ArgumentException ` + -ArgumentList $ErrorMessage + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + return $errorRecord + } # end function Get-InvalidArgumentError + + #region Pester Test Initialization + + $script:VMName = 'HyperVUnitTestsVM' + $script:TestISOPath = 'd:\test\test.iso' + + $script:splatGetDvdDrive = @{ + VMName = $script:VMName + ControllerNumber = 0 + ControllerLocation = 1 + Verbose = $True + } + $script:splatAddDvdDriveNoPath = @{ + VMName = $script:VMName + ControllerNumber = 0 + ControllerLocation = 1 + Path = '' + Ensure = 'Present' + Verbose = $True + } + $script:splatAddDvdDrive = @{ + VMName = $script:VMName + ControllerNumber = 0 + ControllerLocation = 1 + Path = $script:TestISOPath + Ensure = 'Present' + Verbose = $True + } + $script:splatRemoveDvdDrive = @{ + VMName = $script:VMName + ControllerNumber = 0 + ControllerLocation = 1 + Ensure = 'Absent' + Verbose = $True + } + $script:mockGetModule = [pscustomobject] @{ + Name = 'Hyper-V' + } + $script:mockGetVM = [pscustomobject] @{ + Name = $VMName + } + $script:mockGetVMScsiController = [pscustomobject] @{ + VMName = $VMName + } + $script:mockGetVMHardDiskDrive = [pscustomobject] @{ + VMName = $VMName + } + $script:mockNoDvdDrive = @{ + VMName = $script:VMName + ControllerNumber = 0 + ControllerLocation = 1 + Ensure = 'Absent' + } + $script:mockDvdDriveWithPath = @{ + VMName = $script:VMName + ControllerNumber = 0 + ControllerLocation = 1 + Path = $script:TestISOPath + Ensure = 'Present' + } + $script:mockDvdDriveWithDiffPath = @{ + VMName = $script:VMName + ControllerNumber = 0 + ControllerLocation = 1 + Path = 'd:\diff\diff.iso' + Ensure = 'Present' + } + #endregion + + #region Function Get-TargetResource + Describe 'MSFT_xVMDvdDrive\Get-TargetResource' { + #region VM Functions + function Get-VM { + Param + ( + [String] + $Name + ) + } + + function Get-VMScsiController { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber + ) + } + + function Get-VMIdeController { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber + ) + } + + function Get-VMHardDiskDrive { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber, + + [Uint32] + $ControllerLocation + ) + } + + function Get-VMDvdDrive { + Param + ( + [String] + $VMName + ) + } + #endregion + + Context 'DVD Drive does not exist' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Test-ParameterValid ` + -Verifiable + + Mock ` + -CommandName Get-VMDvdDrive ` + -MockWith {} ` + -ParameterFilter { $VMName -eq $script:splatGetDvdDrive.VMName } ` + -Verifiable + + It 'should not throw exception' { + { + $script:resource = Get-TargetResource @script:splatGetDvdDrive + } | Should Not Throw + } + + It 'should return expected values' { + $script:resource.VMName | Should Be $script:splatGetDvdDrive.VMName + $script:resource.ControllerNumber | Should Be $script:splatGetDvdDrive.ControllerNumber + $script:resource.ControllerLocation | Should Be $script:splatGetDvdDrive.ControllerLocation + $script:resource.Path | Should BeNullOrEmpty + $script:resource.Ensure | Should Be 'Absent' + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Test-ParameterValid -Exactly 1 + Assert-MockCalled -CommandName Get-VMDvdDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatGetDvdDrive.VMName } + } + } + + Context 'DVD Drive exists, but has empty path' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Test-ParameterValid ` + -Verifiable + + Mock ` + -CommandName Get-VMDvdDrive ` + -MockWith { $script:splatAddDvdDriveNoPath } ` + -ParameterFilter { $VMName -eq $script:splatGetDvdDrive.VMName } ` + -Verifiable + + It 'should not throw exception' { + { + $script:resource = Get-TargetResource @script:splatGetDvdDrive + } | Should Not Throw + } + + It 'should return expected values' { + $script:resource.VMName | Should Be $script:splatGetDvdDrive.VMName + $script:resource.ControllerNumber | Should Be $script:splatGetDvdDrive.ControllerNumber + $script:resource.ControllerLocation | Should Be $script:splatGetDvdDrive.ControllerLocation + $script:resource.Path | Should BeNullOrEmpty + $script:resource.Ensure | Should Be 'Present' + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Test-ParameterValid -Exactly 1 + Assert-MockCalled -CommandName Get-VMDvdDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatGetDvdDrive.VMName } + } + } + + Context 'DVD Drive exists, and has a test ISO path' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Test-ParameterValid ` + -Verifiable + + Mock ` + -CommandName Get-VMDvdDrive ` + -MockWith { $script:splatAddDvdDrive } ` + -ParameterFilter { $VMName -eq $script:splatGetDvdDrive.VMName } ` + -Verifiable + + It 'should not throw exception' { + { + $script:resource = Get-TargetResource @script:splatGetDvdDrive + } | Should Not Throw + } + + It 'should return expected values' { + $script:resource.VMName | Should Be $script:splatGetDvdDrive.VMName + $script:resource.ControllerNumber | Should Be $script:splatGetDvdDrive.ControllerNumber + $script:resource.ControllerLocation | Should Be $script:splatGetDvdDrive.ControllerLocation + $script:resource.Path | Should Be $script:TestISOPath + $script:resource.Ensure | Should Be 'Present' + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Test-ParameterValid -Exactly 1 + Assert-MockCalled -CommandName Get-VMDvdDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatGetDvdDrive.VMName } + } + } + } + #endregion + + #region Function Set-TargetResource + Describe 'MSFT_xVMDvdDrive\Set-TargetResource' { + #region VM Functions + function Add-VMDvdDrive { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber, + + [Uint32] + $ControllerLocation, + + [String] + $Path + ) + } + + function Set-VMDvdDrive { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber, + + [Uint32] + $ControllerLocation, + + [String] + $Path + ) + } + + function Remove-VMDvdDrive { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber, + + [Uint32] + $ControllerLocation + ) + } + #endregion + + Context 'DVD Drive does not exist but should' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockNoDvdDrive } ` + -Verifiable + + Mock ` + -CommandName Add-VMDvdDrive ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Set-VMDvdDrive + Mock -CommandName Remove-VMDvdDrive + + It 'should not throw exception' { + { Set-TargetResource @script:splatAddDvdDriveNoPath } | Should Not Throw + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + Assert-MockCalled -CommandName Add-VMDvdDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } + Assert-MockCalled -CommandName Set-VMDvdDrive -Exactly 0 + Assert-MockCalled -CommandName Remove-VMDvdDrive -Exactly 0 + } + } + + Context 'DVD Drive does exist and should, path matches' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockDvdDriveWithPath } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Add-VMDvdDrive + Mock -CommandName Set-VMDvdDrive + Mock -CommandName Remove-VMDvdDrive + + It 'should not throw exception' { + { Set-TargetResource @script:splatAddDvdDrive } | Should Not Throw + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + Assert-MockCalled -CommandName Add-VMDvdDrive -Exactly 0 + Assert-MockCalled -CommandName Set-VMDvdDrive -Exactly 0 + Assert-MockCalled -CommandName Remove-VMDvdDrive -Exactly 0 + } + } + + Context 'DVD Drive does exist and should, path does not match' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockDvdDriveWithDiffPath } ` + -Verifiable + + Mock ` + -CommandName Set-VMDvdDrive ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Add-VMDvdDrive + Mock -CommandName Remove-VMDvdDrive + + It 'should not throw exception' { + { Set-TargetResource @script:splatAddDvdDrive } | Should Not Throw + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + Assert-MockCalled -CommandName Add-VMDvdDrive -Exactly 0 + Assert-MockCalled -CommandName Set-VMDvdDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } + Assert-MockCalled -CommandName Remove-VMDvdDrive -Exactly 0 + } + } + + Context 'DVD Drive exists and should not' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockDvdDriveWithPath } ` + -Verifiable + + Mock ` + -CommandName Remove-VMDvdDrive ` + -ParameterFilter { $VMName -eq $script:splatRemoveDvdDrive.VMName } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Add-VMDvdDrive + Mock -CommandName Set-VMDvdDrive + + It 'should not throw exception' { + { Set-TargetResource @script:splatRemoveDvdDrive } | Should Not Throw + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + Assert-MockCalled -CommandName Add-VMDvdDrive -Exactly 0 + Assert-MockCalled -CommandName Set-VMDvdDrive -Exactly 0 + Assert-MockCalled -CommandName Remove-VMDvdDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatRemoveDvdDrive.VMName } + } + } + + Context 'DVD Drive does not exist and should not' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockNoDvdDrive } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Add-VMDvdDrive + Mock -CommandName Set-VMDvdDrive + Mock -CommandName Remove-VMDvdDrive + + It 'should not throw exception' { + { Set-TargetResource @script:splatRemoveDvdDrive } | Should Not Throw + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + Assert-MockCalled -CommandName Add-VMDvdDrive -Exactly 0 + Assert-MockCalled -CommandName Set-VMDvdDrive -Exactly 0 + Assert-MockCalled -CommandName Remove-VMDvdDrive -Exactly 0 + } + } + } + #endregion + + #region Function Test-TargetResource + Describe 'MSFT_xVMDvdDrive\Test-TargetResource' { + Context 'DVD Drive does not exist but should' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockNoDvdDrive } ` + -Verifiable + + It 'should return false' { + Test-TargetResource @script:splatAddDvdDriveNoPath | Should Be $False + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + } + } + + Context 'DVD Drive does exist and should, path matches' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockDvdDriveWithPath } ` + -Verifiable + + It 'should return true' { + Test-TargetResource @script:splatAddDvdDrive | Should Be $True + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + } + } + + Context 'DVD Drive does exist and should, path does not match' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockDvdDriveWithDiffPath } ` + -Verifiable + + It 'should return false' { + Test-TargetResource @script:splatAddDvdDrive | Should Be $False + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + } + } + + Context 'DVD Drive exists and should not' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockDvdDriveWithPath } ` + -Verifiable + + It 'should return false' { + Test-TargetResource @script:splatRemoveDvdDrive | Should Be $False + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + } + } + + Context 'DVD Drive does not exist and should not' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-TargetResource ` + -MockWith { $script:mockNoDvdDrive } ` + -Verifiable + + It 'should return true' { + Test-TargetResource @script:splatRemoveDvdDrive | Should Be $True + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-TargetResource -Exactly 1 + } + } + } + #endregion + + #region Function Test-ParameterValid + Describe 'MSFT_xVMDvdDrive\Test-ParameterValid' { + #region VM Functions + function Get-VM { + Param + ( + [String] + $Name + ) + } + + function Get-VMScsiController { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber + ) + } + + function Get-VMIdeController { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber + ) + } + + function Get-VMHardDiskDrive { + Param + ( + [String] + $VMName, + + [Uint32] + $ControllerNumber, + + [Uint32] + $ControllerLocation + ) + } + + function Get-VMDvdDrive { + Param + ( + [String] + $VMName + ) + } + #endregion + + Context 'Hyper-V Module is not available' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-Module ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Get-VM + Mock -CommandName Get-VMScsiController + Mock -CommandName Get-VMIdeController + Mock -CommandName Get-VMHardDiskDrive + + It 'should throw exception' { + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'RoleMissingError' ` + -ErrorMessage ($LocalizedData.RoleMissingError -f ` + 'Hyper-V') + + { Test-ParameterValid @script:splatAddDvdDriveNoPath } | Should Throw $errorRecord + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-Module -Exactly 1 + } + } + + Context 'VM does not exist' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-Module ` + -MockWith { $script:mockGetModule } ` + -Verifiable + + Mock ` + -CommandName Get-VM ` + -MockWith { Throw } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Get-VMScsiController + Mock -CommandName Get-VMIdeController + Mock -CommandName Get-VMHardDiskDrive + + It 'should throw exception' { + { Test-ParameterValid @script:splatAddDvdDriveNoPath } | Should Throw + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-Module -Exactly 1 + Assert-MockCalled -CommandName Get-VM -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } + } + } + + Context 'VM exists, controller does not exist' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-Module ` + -MockWith { $script:mockGetModule } ` + -Verifiable + + Mock ` + -CommandName Get-VM ` + -MockWith { $script:mockGetVM } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } ` + -Verifiable + + Mock ` + -CommandName Get-VMScsiController ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } ` + -Verifiable + + Mock ` + -CommandName Get-VMIdeController ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Get-VMHardDiskDrive + + It 'should throw exception' { + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'VMControllerDoesNotExistError' ` + -ErrorMessage ($LocalizedData.VMControllerDoesNotExistError -f ` + $script:VMName,0) + + { Test-ParameterValid @script:splatAddDvdDriveNoPath } | Should Throw $errorRecord + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-Module -Exactly 1 + Assert-MockCalled -CommandName Get-VM -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } + Assert-MockCalled -CommandName Get-VMScsiController -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } + Assert-MockCalled -CommandName Get-VMIdeController -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } + } + } + + Context 'VM exists, SCSI contrller exists, HD assigned' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-Module ` + -MockWith { $script:mockGetModule } ` + -Verifiable + + Mock ` + -CommandName Get-VM ` + -MockWith { $script:mockGetVM } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } ` + -Verifiable + + Mock ` + -CommandName Get-VMScsiController ` + -MockWith { $script:mockGetVMScsiController } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } ` + -Verifiable + + Mock ` + -CommandName Get-VMHardDiskDrive ` + -MockWith { $script:mockGetVMHardDiskDrive } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Get-VMIdeController + + It 'should throw exception' { + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'ControllerConflictError' ` + -ErrorMessage ($LocalizedData.ControllerConflictError -f ` + $script:VMName,0,1) + + { Test-ParameterValid @script:splatAddDvdDriveNoPath } | Should Throw $errorRecord + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-Module -Exactly 1 + Assert-MockCalled -CommandName Get-VM -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } + Assert-MockCalled -CommandName Get-VMScsiController -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } + Assert-MockCalled -CommandName Get-VMHardDiskDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDriveNoPath.VMName } + } + } + + Context 'VM exists, SCSI contrller exists, HD not assigned, Path invalid' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-Module ` + -MockWith { $script:mockGetModule } ` + -Verifiable + + Mock ` + -CommandName Get-VM ` + -MockWith { $script:mockGetVM } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } ` + -Verifiable + + Mock ` + -CommandName Get-VMScsiController ` + -MockWith { $script:mockGetVMScsiController } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } ` + -Verifiable + + Mock ` + -CommandName Get-VMHardDiskDrive ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } ` + -Verifiable + + Mock ` + -CommandName Test-Path ` + -MockWith { $False } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Get-VMIdeController + + It 'should throw exception' { + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'PathDoesNotExistError' ` + -ErrorMessage ($LocalizedData.PathDoesNotExistError -f ` + $script:TestISOPath) + + { Test-ParameterValid @script:splatAddDvdDrive } | Should Throw $errorRecord + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-Module -Exactly 1 + Assert-MockCalled -CommandName Get-VM -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } + Assert-MockCalled -CommandName Get-VMScsiController -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } + Assert-MockCalled -CommandName Get-VMHardDiskDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } + Assert-MockCalled -CommandName Test-Path -Exactly 1 + } + } + + Context 'VM exists, SCSI contrller exists, HD not assigned, Path Valid' { + # Verifiable (should be called) mocks + Mock ` + -CommandName Get-Module ` + -MockWith { $script:mockGetModule } ` + -Verifiable + + Mock ` + -CommandName Get-VM ` + -MockWith { $script:mockGetVM } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } ` + -Verifiable + + Mock ` + -CommandName Get-VMScsiController ` + -MockWith { $script:mockGetVMScsiController } ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } ` + -Verifiable + + Mock ` + -CommandName Get-VMHardDiskDrive ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } ` + -Verifiable + + Mock ` + -CommandName Test-Path ` + -MockWith { $True } ` + -Verifiable + + # Mocks that should not be called + Mock -CommandName Get-VMIdeController + + It 'should not throw exception' { + Test-ParameterValid @script:splatAddDvdDrive | Should Be $True + } + + It 'all the get mocks should be called' { + Assert-VerifiableMock + Assert-MockCalled -CommandName Get-Module -Exactly 1 + Assert-MockCalled -CommandName Get-VM -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } + Assert-MockCalled -CommandName Get-VMScsiController -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } + Assert-MockCalled -CommandName Get-VMHardDiskDrive -Exactly 1 ` + -ParameterFilter { $VMName -eq $script:splatAddDvdDrive.VMName } + Assert-MockCalled -CommandName Test-Path -Exactly 1 + } + } + } + #endregion + } +} +finally +{ + #region FOOTER + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHardDiskDrive.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHardDiskDrive.Tests.ps1 new file mode 100644 index 0000000..9ebefdb --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHardDiskDrive.Tests.ps1 @@ -0,0 +1,381 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMHardDiskDrive' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { + +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + + $testVMName = 'UnitTestVM' + $testHardDiskPath = 'TestDrive:\{0}.vhdx' -f $testVMName + + Describe 'MSFT_xVMHardDiskDrive\Get-TargetResource' { + + $stubHardDiskDrive = @{ + VMName = $testVMName + Path = $testHardDiskPath + ControllerLocation = 0 + ControllerNumber = 0 + ControllerType = 'SCSI' + } + + # Guard mocks + Mock Assert-Module { } + + function Get-VMHardDiskDrive { + [CmdletBinding()] + param + ( + [System.String] + $VMName + ) + } + + It 'Should return a [System.Collections.Hashtable] object type' { + Mock Get-VMHardDiskDrive { return $stubHardDiskDrive } + + $result = Get-TargetResource -VMName $testVMName -Path $testhardDiskPath + + $result -is [System.Collections.Hashtable] | Should Be $true + } + + It 'Should return "Present" when hard disk is attached' { + Mock Get-VMHardDiskDrive { return $stubHardDiskDrive } + + $result = Get-TargetResource -VMName $testVMName -Path $testhardDiskPath + + $result.Ensure | Should Be 'Present' + } + + It 'Should return "Absent" when hard disk is not attached' { + Mock Get-VMHardDiskDrive { } + + $result = Get-TargetResource -VMName $testVMName -Path $testhardDiskPath + + $result.Ensure | Should Be 'Absent' + } + + It 'Should assert Hyper-V module is installed' { + Mock Assert-Module { } + Mock Get-VMHardDiskDrive { return $stubHardDiskDrive } + + $null = Get-TargetResource -VMName $testVMName -Path $testhardDiskPath + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + } # descrive Get-TargetResource + + Describe 'MSFT_xVMHardDiskDrive\Test-TargetResource' { + + # Guard mocks + Mock Assert-Module { } + + function Get-VMHardDiskDrive { + [CmdletBinding()] + param + ( + [System.String] + $VMName + ) + } + + $stubTargetResource = @{ + VMName = $testVMName + Path = $testHardDiskPath + ControllerType = 'SCSI' + ControllerNumber = 0 + ControllerLocation = 0 + Ensure = 'Present' + } + + It 'Should return a [System.Boolean] object type' { + Mock Get-TargetResource { return $stubTargetResource } + + $result = Test-TargetResource -VMName $testVMName -Path $testHardDiskPath + + $result -is [System.Boolean] | Should Be $true + } + + $parameterNames = @( + 'ControllerNumber', + 'ControllerLocation' + ) + + foreach ($parameterName in $parameterNames) + { + $parameterValue = $stubTargetResource[$parameterName] + $testTargetResourceParams = @{ + VMName = $testVMName + Path = $testHardDiskPath + } + + It "Should pass when parameter '$parameterName' is correct" { + # Pass value verbatim so it should always pass first + $testTargetResourceParams[$parameterName] = $parameterValue + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $true + } + + It "Should fail when parameter '$parameterName' is incorrect" { + # Add one to cause a test failure + $testTargetResourceParams[$parameterName] = $parameterValue + 1 + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $false + } + } + + It "Should pass when parameter 'ControllerType' is correct" { + $testTargetResourceParams = @{ + VMName = $testVMName + Path = $testHardDiskPath + ControllerType = $stubTargetResource['ControllerType'] + } + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $true + } + + It "Should fail when parameter 'ControllerType' is incorrect" { + $testTargetResourceParams = @{ + VMName = $testVMName + Path = $testHardDiskPath + ControllerType = 'IDE' + } + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $false + } + + It "Should pass when parameter 'Ensure' is correct" { + $testTargetResourceParams = @{ + VMName = $testVMName + Path = $testHardDiskPath + Ensure = $stubTargetResource['Ensure'] + } + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $true + } + + It "Should fail when parameter 'Ensure' is incorrect" { + $testTargetResourceParams = @{ + VMName = $testVMName + Path = $testHardDiskPath + Ensure = 'Absent' + } + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $false + } + + It 'Should throw when IDE controller number 2 is specified' { + $testTargetResourceParams = @{ + VMName = $testVMName + Path = $testHardDiskPath + ControllerType = 'IDE' + ControllerNumber = 2 + } + + { Test-TargetResource @testTargetResourceParams } | Should Throw 'not valid' + } + + It 'Should throw when IDE controller location 2 is specified' { + $testTargetResourceParams = @{ + VMName = $testVMName + Path = $testHardDiskPath + ControllerType = 'IDE' + ControllerLocation = 2 + } + + { Test-TargetResource @testTargetResourceParams } | Should Throw 'not valid' + } + } # describe Test-TargetResource + + Describe 'MSFT_xVMHardDiskDrive\Set-TargetResource' { + + function Get-VMHardDiskDrive { + [CmdletBinding()] + param + ( + [Parameter(ValueFromPipeline)] + [System.String] + $VMName, + + [System.String] + $Path, + + [System.String] + $ControllerType, + + [System.Int32] + $ControllerNumber, + + [System.Int32] + $ControllerLocation + ) + } + + function Set-VMHardDiskDrive { + [CmdletBinding()] + param + ( + [Parameter(ValueFromPipeline)] + [System.String] + $VMName, + + [System.String] + $Path, + + [System.String] + $ControllerType, + + [System.Int32] + $ControllerNumber, + + [System.Int32] + $ControllerLocation + ) + } + + function Add-VMHardDiskDrive { + [CmdletBinding()] + param + ( + [Parameter(ValueFromPipeline)] + [System.String] + $VMName, + + [System.String] + $Path, + + [System.String] + $ControllerType, + + [System.Int32] + $ControllerNumber, + + [System.Int32] + $ControllerLocation + ) + } + + function Remove-VMHardDiskDrive { + [CmdletBinding()] + param + ( + [Parameter(ValueFromPipeline)] + [System.String] + $VMName, + + [System.String] + $Path, + + [System.String] + $ControllerType, + + [System.Int32] + $ControllerNumber, + + [System.Int32] + $ControllerLocation + ) + } + + # Guard mocks + Mock Assert-Module { } + Mock Get-VMHardDiskDrive { } + Mock Set-VMHardDiskDrive { } + Mock Add-VMHardDiskDrive { } + Mock Remove-VMHardDiskDrive { } + + $stubHardDiskDrive = @{ + VMName = $testVMName + Path = $testHardDiskPath + ControllerLocation = 0 + ControllerNumber = 0 + ControllerType = 'SCSI' + } + + It 'Should assert Hyper-V module is installed' { + Mock Get-VMHardDiskDrive { return $stubHardDiskDrive } + + $null = Set-TargetResource -VMName $testVMName -Path $testHardDiskPath + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + + It 'Should update existing hard disk' { + Mock Get-VMHardDiskDrive { return $stubHardDiskDrive } + + $null = Set-TargetResource -VMName $testVMName -Path $testHardDiskPath + + Assert-MockCalled Set-VMHardDiskDrive -Scope It + } + + It 'Should add hard disk when is not attached' { + Mock Get-VMHardDiskDrive { } + Mock Get-VMHardDiskDrive -ParameterFilter { $PSBoundParameters.ContainsKey('ControllerType') } + + $null = Set-TargetResource -VMName $testVMName -Path $testHardDiskPath + + Assert-MockCalled Add-VMHardDiskDrive -Scope It + } + + It 'Should throw when an existing disk is attached to controller/location' { + Mock Get-VMHardDiskDrive { } + Mock Get-VMHardDiskDrive -ParameterFilter { $PSBoundParameters.ContainsKey('ControllerType') } { return $stubHardDiskDrive } + + { Set-TargetResource -VMName $testVMName -Path $testHardDiskPath } | Should Throw 'disk present' + } + + It 'Should remove attached hard disk when Ensure is "Absent"' { + Mock Get-VMHardDiskDrive { return $stubHardDiskDrive } + + $null = Set-TargetResource -VMName $testVMName -Path $testHardDiskPath -Ensure 'Absent' + + Assert-MockCalled Remove-VMHardDiskDrive -Scope It + } + } # describe Set-TargetResource + } # InModuleScope +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHost.tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHost.tests.ps1 new file mode 100644 index 0000000..7396683 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHost.tests.ps1 @@ -0,0 +1,346 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMHost' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { + +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + + $testVMName = 'UnitTestVM' + + Describe 'MSFT_xVMHost\Get-TargetResource' { + + $fakeVMHost = @{ + ResourceMeteringSaveInterval = 60; + } + + # Guard mocks + + function Get-VMHost { } + + It 'Should return a [System.Collections.Hashtable] object type' { + Mock Assert-Module { } + Mock Get-VMHost { return $fakeVMHost } + + $result = Get-TargetResource -IsSingleInstance 'Yes' + + $result -is [System.Collections.Hashtable] | Should Be $true + } + + It 'Should assert Hyper-V module is installed' { + Mock Assert-Module { } + Mock Get-VMHost { return $fakeVMHost } + + $result = Get-TargetResource -IsSingleInstance 'Yes' + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + + } # describe Get-TargetResource + + Describe 'MSFT_xVMHost\Test-TargetResource' { + + # Guard mocks + Mock Assert-Module { } + + function Get-VMHost { } + + $fakeTargetResource = @{ + IsSingleInstance = 'Yes'; + EnableEnhancedSessionMode = $true; + FibreChannelWwnn = 'C003FF0000FFFF00'; + FibreChannelWwpnMaximum = 'C003FFFBEAE1FFFF'; + FibreChannelWwpnMinimum = 'C003FFFBEAE10000'; + MacAddressMinimum = '00155D327500'; + MacAddressMaximum = '00155D3275FF'; + MaximumStorageMigrations = 2; + MaximumVirtualMachineMigrations = 2; + NumaSpanningEnabled = $true; + ResourceMeteringSaveIntervalMinute = 60; + UseAnyNetworkForMigration = $false; + VirtualMachinePath ='C:\ProgramData\Microsoft\Windows\Hyper-V'; + VirtualMachineMigrationAuthenticationType = 'CredSSP'; + VirtualMachineMigrationPerformanceOption = 'TCPIP'; + VirtualHardDiskPath = 'C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks'; + VirtualMachineMigrationEnabled = $true + } + + It 'Should return a [System.Boolean] object type' { + Mock Get-TargetResource { return $fakeTargetResource } + + $testTargetResourceParams = @{ + IsSingleInstance = 'Yes'; + EnableEnhancedSessionMode = $fakeTargetResource.EnableEnhancedSessionMode; + VirtualMachineMigrationEnabled = $fakeTargetResource.VirtualMachineMigrationEnabled + } + $result = Test-TargetResource @testTargetResourceParams + + $result -is [System.Boolean] | Should Be $true + } + + It 'Should assert Hyper-V module is installed' { + Mock Get-TargetResource { return $fakeTargetResource } + + $testTargetResourceParams = @{ + IsSingleInstance = 'Yes'; + EnableEnhancedSessionMode = $fakeTargetResource.EnableEnhancedSessionMode; + } + $result = Test-TargetResource @testTargetResourceParams + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + + $parameterNames = @( + 'EnableEnhancedSessionMode', + 'FibreChannelWwnn', + 'FibreChannelWwpnMaximum', + 'FibreChannelWwpnMinimum', + 'MacAddressMaximum', + 'MacAddressMinimum', + 'MaximumStorageMigrations', + 'MaximumVirtualMachineMigrations', + 'NumaSpanningEnabled', + 'ResourceMeteringSaveIntervalMinute', + 'UseAnyNetworkForMigration', + 'VirtualHardDiskPath', + 'VirtualMachinePath', + 'VirtualMachineMigrationEnabled' + ) + + # Test each individual parameter value separately + foreach ($parameterName in $parameterNames) + { + $parameterValue = $fakeTargetResource[$parameterName]; + $testTargetResourceParams = @{ + IsSingleInstance = 'Yes'; + } + + # Pass value verbatim so it should always pass first + It "Should pass when parameter '$parameterName' is correct" { + $testTargetResourceParams[$parameterName] = $parameterValue + + $result = Test-TargetResource @testTargetResourceParams; + + $result | Should Be $true; + } + + if ($parameterValue -is [System.Boolean]) { + + # Invert parameter value to cause a test failure + $testTargetResourceParams[$parameterName] = -not $parameterValue + } + elseif ($parameterValue -is [System.String]) { + + # Repeat string to cause a test failure + $testTargetResourceParams[$parameterName] = "$parameterValue$parameterValue" + } + elseif ($parameterValue -is [System.Int32] -or $parameterValue -is [System.Int64]) { + + # Add one to cause a test failure + $testTargetResourceParams[$parameterName] = $parameterValue + 1 + } + + It "Should fail when parameter '$parameterName' is incorrect" { + $result = Test-TargetResource @testTargetResourceParams; + + $result | Should Be $false; + } + } + + It "Should pass when parameter <Parameter> is correct" -TestCases @( + @{ Parameter = 'VirtualMachineMigrationAuthenticationType'; + Value = $fakeTargetResource.VirtualMachineMigrationAuthenticationType; + Expected = $true; } + @{ Parameter = 'VirtualMachineMigrationPerformanceOption'; + Value = $fakeTargetResource.VirtualMachineMigrationPerformanceOption; + Expected = $true; } + @{ Parameter = 'VirtualMachineMigrationEnabled'; + Value = $fakeTargetResource.VirtualMachineMigrationEnabled; + Expected = $true; } + ) -Test { + param ( + [System.String] $Parameter, + [System.Object] $Value, + [System.Boolean] $Expected + ) + + $testTargetResourceParams = @{ + IsSingleInstance = 'Yes'; + $Parameter = $Value; + } + $result = Test-TargetResource @testTargetResourceParams | Should Be $Expected; + } + + It "Should fail when parameter <Parameter> is incorrect" -TestCases @( + @{ Parameter = 'VirtualMachineMigrationAuthenticationType'; + Value = 'Kerberos'; + Expected = $false; } + @{ Parameter = 'VirtualMachineMigrationPerformanceOption'; + Value = 'Compression'; + Expected = $false; } + @{ Parameter = 'VirtualMachineMigrationEnabled'; + Value = $true; + Expected = $true; } + ) -Test { + param + ( + [System.String] $Parameter, + [System.Object] $Value, + [System.Boolean] $Expected + ) + + $testTargetResourceParams = @{ + IsSingleInstance = 'Yes'; + $Parameter = $Value; + } + $result = Test-TargetResource @testTargetResourceParams | Should Be $Expected; + } + + } # describe Test-TargetResource + + Describe 'MSFT_xVMHost\Set-TargetResource' { + + function Get-VMHost { } + function Set-VMHost { param ($ResourceMeteringSaveInterval) } + + function Enable-VMMigration { } + + function Disable-VMMigration { } + + # Guard mocks + Mock Assert-Module { } + Mock Get-VMHost { } + Mock Set-VMHost { } + Mock Enable-VMMigration { } + Mock Disable-VMMigration { } + + It 'Should assert Hyper-V module is installed' { + $setTargetResourceParams = @{ + IsSingleInstance = 'Yes'; + } + + $result = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + + It 'Should call "Set-VMHost" with [System.TimeSpan] object when "ResourceMeteringSaveIntervalMinute" specified' { + $setTargetResourceParams = @{ + IsSingleInstance = 'Yes'; + ResourceMeteringSaveIntervalMinute = 60; + } + $result = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled Set-VMHost -ParameterFilter { $ResourceMeteringSaveInterval -is [System.TimeSpan] } + } + + It 'Should call "Enable-VMMigration" when "VirtualMachineMigrationEnabled" is set to true and computer is domain joined' { + Mock -CommandName 'Get-CimInstance' -MockWith { + [pscustomobject]@{ + PartOfDomain = $true + } + } + + Mock -CommandName 'Write-Error' + + $setTargetResourceParams = @{ + IsSingleInstance = 'Yes' + VirtualMachineMigrationEnabled = $true + } + + $result = Set-TargetResource @setTargetResourceParams + Assert-MockCalled -CommandName Write-Error -Times 0 -Exactly -Scope it + Assert-MockCalled -CommandName Enable-VMMigration -Times 1 -Exactly -Scope it + Assert-MockCalled -CommandName Disable-VMMigration -Times 0 -Exactly -Scope it + } + + It 'Should not call "Enable-VMMigration" and should throw when "VirtualMachineMigrationEnabled" is set to true and computer is not domain joined' { + Mock -CommandName 'Get-CimInstance' -MockWith { + [pscustomobject]@{ + PartOfDomain = $false + } + } + + $setTargetResourceParams = @{ + IsSingleInstance = 'Yes' + VirtualMachineMigrationEnabled = $true + } + + { Set-TargetResource @setTargetResourceParams } | Should -Throw + Assert-MockCalled -CommandName Enable-VMMigration -Times 0 -Exactly -Scope it + Assert-MockCalled -CommandName Disable-VMMigration -Times 0 -Exactly -Scope it + } + + It 'Should call "Disable-VMMigration" when "VirtualMachineMigrationEnabled" is set to false' { + $setTargetResourceParams = @{ + IsSingleInstance = 'Yes' + VirtualMachineMigrationEnabled = $false + } + + $result = Set-TargetResource @setTargetResourceParams + Assert-MockCalled -CommandName Enable-VMMigration -Times 0 -Exactly -Scope it + Assert-MockCalled -CommandName Disable-VMMigration -Times 1 -Exactly -Scope it + } + + It 'Should not call "Disable-VMMigration" or "Enable-VMMigration" when "VirtualMachineMigrationEnabled" is not set' { + $setTargetResourceParams = @{ + IsSingleInstance = 'Yes' + } + + $result = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled -CommandName Enable-VMMigration -Times 0 -Exactly -Scope it + Assert-MockCalled -CommandName Disable-VMMigration -Times 0 -Exactly -Scope it + } + + It 'Should not call "Set-VMHost" when only "VirtualMachineMigrationEnabled" is set' { + $setTargetResourceParams = @{ + IsSingleInstance = 'Yes' + VirtualMachineMigrationEnabled = $false + Verbose = $true + } + + $result = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled -CommandName Enable-VMMigration -Times 0 -Exactly -Scope it + Assert-MockCalled -CommandName Disable-VMMigration -Times 1 -Exactly -Scope it + Assert-MockCalled -CommandName Set-VMHost -Times 0 -Exactly -Scope it + } + + } # describe Set-TargetResource + + } # InModuleScope +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHyperV.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHyperV.Tests.ps1 new file mode 100644 index 0000000..2c7f8fd --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMHyperV.Tests.ps1 @@ -0,0 +1,669 @@ +[CmdletBinding()] +param() + +if (!$PSScriptRoot) # $PSScriptRoot is not defined in 2.0 +{ + $PSScriptRoot = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path) +} + +$ErrorActionPreference = 'stop' +Set-StrictMode -Version latest + +$RepoRoot = (Resolve-Path $PSScriptRoot\..\..).Path + +$ModuleName = 'MSFT_xVMHyperV' +Import-Module (Join-Path $RepoRoot "DSCResources\$ModuleName\$ModuleName.psm1") -Force; + +Describe 'xVMHyper-V' { + InModuleScope $ModuleName { + + # Create empty functions to be able to mock the missing Hyper-V cmdlets + # CmdletBinding required on Get-VM to support $ErrorActionPreference + function Get-VM { [CmdletBinding()] param( [Parameter(ValueFromRemainingArguments)] $Name) } + # Generation parameter is required for the mocking -ParameterFilter to work + function New-VM { param ( $Generation) } + function Set-VM { param ( $Name, $AutomaticCheckpointsEnabled ) } + function Stop-VM { } + function Remove-VM { } + function Get-VMNetworkAdapter { } + function Set-VMNetworkAdapter { } + function Add-VMNetworkAdapter { } + function Connect-VMNetworkAdapter { param ( $SwitchName ) } + function Get-VMFirmware { } + function Set-VMFirmware { } + function Get-VMIntegrationService { param ([Parameter(ValueFromPipeline)] $VM, $Name)} + function Enable-VMIntegrationService { param ([Parameter(ValueFromPipeline)] $VM, $Name)} + function Disable-VMIntegrationService { param ([Parameter(ValueFromPipeline)] $VM, $name)} + function Get-VHD { param ( $Path ) } + function Set-VMMemory { } + + $stubVhdxDisk = New-Item -Path 'TestDrive:\TestVM.vhdx' -ItemType File; + $studVhdxDiskSnapshot = New-Item -Path "TestDrive:\TestVM_D0145678-1576-4435-AB18-9F000C1C17D0.avhdx" -ItemType File; + $stubVhdDisk = New-Item -Path 'TestDrive:\TestVM.vhd' -ItemType File; + $StubVMConfig = New-Item -Path 'TestDrive:\TestVM.xml' -ItemType File; + $stubNIC1 = @{ SwitchName = 'Test Switch 1'; MacAddress = 'AA-BB-CC-DD-EE-FF'; IpAddresses = @('192.168.0.1','10.0.0.1'); }; + $stubNIC2 = @{ SwitchName = 'Test Switch 2'; MacAddress = 'AA-BB-CC-DD-EE-FE'; IpAddresses = @('192.168.1.1'); }; + $stubVM = @{ + HardDrives = @( + @{ Path = $stubVhdxDisk.FullName; } + @{ Path = $stubVhdDisk.FullName; } + ); + #State = 'Running'; + Path = $StubVMConfig.FullPath; + Generation = 1; + SecureBoot = $true; + MemoryStartup = 512MB; + MinimumMemory = 128MB; + MaximumMemory = 4096MB; + ProcessorCount = 1; + ID = [System.Guid]::NewGuid().ToString(); + CPUUsage = 10; + MemoryAssigned = 512MB; + Uptime = New-TimeSpan -Hours 12; + CreationTime = (Get-Date).AddHours(-12); + DynamicMemoryEnabled = $true; + NetworkAdapters = @($stubNIC1,$stubNIC2); + Notes = ''; + } + $stubGuestServiceInterfaceId = 'Microsoft:{0}\6C09BB55-D683-4DA0-8931-C9BF705F6480' -f $stubVM.ID + + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'RunningVM' } -MockWith { + $runningVM = $stubVM.Clone(); + $runningVM['State'] = 'Running'; + return [PSCustomObject] $runningVM; + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'StoppedVM' } -MockWith { + $stoppedVM = $stubVM.Clone(); + $stoppedVM['State'] = 'Off'; + return [PSCustomObject] $stoppedVM; + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'PausedVM' } -MockWith { + $pausedVM = $stubVM.Clone(); + $pausedVM['State'] = 'Paused'; + return [PSCustomObject] $pausedVM; + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'NonexistentVM' } -MockWith { + Write-Error 'VM not found.'; + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'DuplicateVM' } -MockWith { + return @([PSCustomObject] $stubVM, [PSCustomObject] $stubVM); + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'Generation1Vhd' } -MockWith { + $vhdVM = $stubVM.Clone(); + $vhdVM['HardDrives'] = @( @{ Path = $stubVhdDisk.FullName } ); + return [PSCustomObject] $vhdVM; + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'Generation2VM' } -MockWith { + $gen2VM = $stubVM.Clone(); + $gen2VM['Generation'] = 2; + return [PSCustomObject] $gen2VM; + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'VMWithAutomaticCheckpoints'} -MockWith { + $AutomaticCheckPointVM = $stubVM.Clone(); + $AutomaticCheckPointVM['AutomaticCheckpointsEnabled'] = $true; + return [PSCustomObject] $AutomaticCheckPointVM; + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'VMWithoutAutomaticCheckpoints'} -MockWith { + $NoAutomaticCheckPointVM = $stubVM.Clone() + $NoAutomaticCheckPointVM['AutomaticCheckpointsEnabled'] = $false + return [PSCustomObject] $NoAutomaticCheckPointVM + } + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'VMAutomaticCheckpointsUnsupported'} -MockWith { + $AutomaticCheckPointUnsupportedVM = $stubVM.Clone() + return [PSCustomObject] $AutomaticCheckPointUnsupportedVM + } + Mock -CommandName Get-VMIntegrationService -MockWith {return [pscustomobject]@{Enabled=$false;Id=$stubGuestServiceInterfaceId}} + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { return $true; } + Mock -CommandName Get-VhdHierarchy -ParameterFilter { $VhdPath.EndsWith('.vhd') } -MockWith { + # Return single Vhd chain for .vhds + return @($stubVhdDisk.FullName); + } + Mock -CommandName Get-VhdHierarchy -ParameterFilter { $VhdPath.EndsWith('.vhdx') } -MockWith { + # Return snapshot hierarchy for .vhdxs + return @($stubVhdxDiskSnapshot.FullName, $stubVhdxDisk.FullName); + } + Context 'Validates Get-TargetResource Method' { + + It 'Returns a hashtable' { + $targetResource = Get-TargetResource -Name 'RunningVM' -VhdPath $stubVhdxDisk.FullName; + $targetResource -is [System.Collections.Hashtable] | Should Be $true; + } + + It 'Throws when multiple VMs are present' { + { Get-TargetResource -Name 'DuplicateVM' -VhdPath $stubVhdxDisk.FullName } | Should Throw; + } + + It 'Does not call Get-VMFirmware if a generation 1 VM' { + Mock -CommandName Get-VMFirmware -MockWith { throw; } + $null = Get-TargetResource -Name 'RunningVM' -VhdPath $stubVhdxDisk.FullName; + Assert-MockCalled -CommandName Get-VMFirmware -Scope It -Exactly 0; + } + + It 'Calls Get-VMFirmware if a generation 2 VM' { + Mock -CommandName Get-VMFirmware -MockWith { return $true; } + $null = Get-TargetResource -Name 'Generation2VM' -VhdPath $stubVhdxDisk.FullName; + Assert-MockCalled -CommandName Get-VMFirmware -Scope It -Exactly 1; + } + + It 'Hash table contains key EnableGuestService' { + $targetResource = Get-TargetResource -Name 'RunningVM' -VhdPath $stubVhdxDisk.FullName; + $targetResource.ContainsKey('EnableGuestService') | Should Be $true; + } + It 'Hash table contains key AutomaticCheckpointEnabled' { + $targetResource = Get-TargetResource -Name 'VMWithAutomaticCheckpoints' -VhdPath $stubVhdxDisk.FullName; + $targetResource.ContainsKey('AutomaticCheckpointsEnabled') | Should Be $true; + } + It 'Throws when Hyper-V Tools are not installed' { + # This test needs to be the last in the Context otherwise all subsequent Get-Module checks will fail + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { } + { Get-TargetResource -Name 'RunningVM' @testParams } | Should Throw; + } + } #end context Validates Get-TargetResource Method + + Context 'Validates Test-TargetResource Method' { + $testParams = @{ + VhdPath = $stubVhdxDisk.FullName; + } + + It 'Returns a boolean' { + $targetResource = Test-TargetResource -Name 'RunningVM' @testParams; + $targetResource -is [System.Boolean] | Should Be $true; + } + + It 'Returns $true when VM is present and "Ensure" = "Present"' { + Test-TargetResource -Name 'RunningVM' @testParams | Should Be $true; + } + + It 'Returns $false when VM is not present and "Ensure" = "Present"' { + Test-TargetResource -Name 'NonexistentVM' @testParams | Should Be $false; + } + + It 'Returns $true when VM is not present and "Ensure" = "Absent"' { + Test-TargetResource -Name 'NonexistentVM' -Ensure Absent @testParams | Should Be $true; + } + + It 'Returns $false when VM is present and "Ensure" = "Absent"' { + Test-TargetResource -Name 'RunningVM' -Ensure Absent @testParams | Should Be $false; + } + + It 'Returns $true when VM is in the "Running" state and no state is explicitly specified' { + Test-TargetResource -Name 'RunningVM' @testParams | Should Be $true; + } + + It 'Returns $true when VM is in the "Stopped" state and no state is explicitly specified' { + Test-TargetResource -Name 'StoppedVM' @testParams | Should Be $true; + } + + It 'Returns $true when VM is in the "Paused" state and no state is explicitly specified' { + Test-TargetResource -Name 'PausedVM' @testParams | Should Be $true; + } + + It 'Returns $true when VM is in the "Running" state and requested "State" = "Running"' { + Test-TargetResource -Name 'RunningVM' @testParams | Should Be $true; + } + + It 'Returns $true when VM is in the "Off" state and requested "State" = "Off"' { + Test-TargetResource -Name 'StoppedVM' -State Off @testParams | Should Be $true; + } + + It 'Returns $true when VM is in the "Paused" state and requested "State" = Paused"' { + Test-TargetResource -Name 'PausedVM' -State Paused @testParams | Should Be $true; + } + + It 'Returns $false when VM is in the "Running" state and requested "State" = "Off"' { + Test-TargetResource -Name 'RunningVM' -State Off @testParams | Should Be $false; + } + + It 'Returns $false when VM is in the "Off" state and requested "State" = "Runnning"' { + Test-TargetResource -Name 'StoppedVM' -State Running @testParams | Should Be $false; + } + + It 'Returns $true when VM .vhd file is specified with a generation 1 VM' { + Test-TargetResource -Name 'Generation1Vhd' -VhdPath $stubVhdDisk -Generation 1 -Verbose | Should Be $true; + } + + It 'Returns $true when VM .vhdx file is specified with a generation 1 VM' { + Test-TargetResource -Name 'StoppedVM' -VhdPath $stubVhdxDisk -Generation 1 | Should Be $true; + } + + It 'Returns $true when VM .vhdx file is specified with a generation 2 VM' { + Mock -CommandName Test-VMSecureBoot -MockWith { return $true; } + Test-TargetResource -Name 'Generation2VM' -Generation 2 @testParams | Should Be $true; + } + + It 'Throws when a VM .vhd file is specified with a generation 2 VM' { + { Test-TargetResource -Name 'Gen2VM' -VhdPath $stubVhdDisk -Generation 2 } | Should Throw; + } + + It 'Returns $true when multiple NICs are assigned in the correct order' { + Test-TargetResource -Name 'RunningVM' @testParams -SwitchName @($stubNIC1.SwitchName,$stubNIC2.SwitchName) | Should Be $true; + } + + It 'Returns $false when multiple NICs are not assigned/assigned in the wrong order' { + Test-TargetResource -Name 'RunningVM' @testParams -SwitchName @($stubNIC2.SwitchName,$stubNIC1.SwitchName) | Should Be $false; + } + + It 'Returns $true when multiple MAC addresses are assigned in the correct order' { + Test-TargetResource -Name 'RunningVM' @testParams -MACAddress @($stubNIC1.MACAddress,$stubNIC2.MACAddress) | Should Be $true; + } + + It 'Returns $false when multiple MAC addresses not assigned/assigned in the wrong order' { + Test-TargetResource -Name 'RunningVM' @testParams -MACAddress @($stubNIC1.MACAddress,$stubNIC2.MACAddress) | Should Be $true; + } + + It 'Returns $true regardless of "SecureBoot" setting on a generation 1 VM' { + Test-TargetResource -Name 'RunningVM' -SecureBoot $true @testParams | Should Be $true; + Test-TargetResource -Name 'RunningVM' -SecureBoot $false @testParams | Should Be $true; + } + + It 'Returns $true when SecureBoot is On and requested "SecureBoot" = "$true"' { + Mock -CommandName Test-VMSecureBoot -MockWith { return $true; } + Test-TargetResource -Name 'Generation2VM' -Generation 2 @testParams | Should Be $true; + } + + It 'Returns $false when SecureBoot is On and requested "SecureBoot" = "$false"' { + Mock -CommandName Test-VMSecureBoot -MockWith { return $true; } + Test-TargetResource -Name 'Generation2VM' -SecureBoot $false -Generation 2 @testParams | Should be $false; + } + + It 'Returns $true when VM has snapshot chain' { + Mock -CommandName Get-VhdHierarchy -MockWith { Write-Host $VhdPath; return @($studVhdxDiskSnapshot, $stubVhdxDisk); } + Test-TargetResource -Name 'Generation2VM' -VhdPath $stubVhdxDisk -Verbose | Should Be $true; + } + + It 'Returns $false when EnableGuestService is off and requested "EnableGuestService" = "$true"' { + Test-TargetResource -Name 'RunningVM' -EnableGuestService $true @testParams | Should be $false; + } + + It 'Returns $true when EnableGuestService is off and "EnableGuestService" is not requested"' { + Test-TargetResource -Name 'RunningVM' @testParams | Should be $true; + } + + Mock -CommandName Get-Command -ParameterFilter { $Name -eq 'Set-VM' -and $Module -eq 'Hyper-V'} -MockWith { + [pscustomobject]@{ + parameters = @{ + # Does not contains parameter AutomaticCheckpointsEnabled + } + } + } + It 'Throws when AutomaticCheckpointsEnabled is configured but not supported' { + { Test-TargetResource -Name 'VMAutomaticCheckpoinstUnsupported' -AutomaticCheckpointsEnabled $true @testParams } | Should Throw; + } + + Mock -CommandName Get-Command -ParameterFilter { $Name -eq 'Set-VM' -and $Module -eq 'Hyper-V'} -MockWith { + [pscustomobject]@{ + parameters = @{ + 'AutomaticCheckpointsEnabled' = '' + } + } + } + It 'Returns $true when AutomaticCheckpointsEnabled is on and requested "AutomaticCheckpointsEnabled" is not requested' { + Test-TargetResource -Name 'VMWithAutomaticCheckpoints' @testParams | Should be $true; + } + It 'Returns $true when AutomaticCheckpointsEnabled is on and requested "AutomaticCheckpointsEnabled" = "$true"' { + Test-TargetResource -Name 'VMWithAutomaticCheckpoints' -AutomaticCheckpointsEnabled $true @testParams | Should be $true; + } + It 'Returns $true when AutomaticCheckpointsEnabled is off and requested "AutomaticCheckpointsEnabled" = "$false"' { + Test-TargetResource -Name 'VMWithoutAutomaticCheckpoints' -AutomaticCheckpointsEnabled $false @testParams | Should be $true; + } + It 'Returns $false when AutomaticCheckpointsEnabled is off and requested "AutomaticCheckpointsEnabled" = "$true"' { + Test-TargetResource -Name 'VMWithoutAutomaticCheckpoints' -AutomaticCheckpointsEnabled $true @testParams | Should be $false; + } + It 'Returns $false when AutomaticCheckpointsEnabled is on and requested "AutomaticCheckpointsEnabled" = "$false"' { + Test-TargetResource -Name 'VMWithAutomaticCheckpoints' -AutomaticCheckpointsEnabled $false @testParams | Should be $false; + } + + It 'Returns $true when EnableGuestService is on and requested "EnableGuestService" = "$true"' { + Mock -CommandName Get-VMIntegrationService -MockWith {return [pscustomobject]@{Enabled=$true;Id=$stubGuestServiceInterfaceId}} + Test-TargetResource -Name 'RunningVM' -EnableGuestService $true @testParams | Should be $true; + } + + It 'Throws when Hyper-V Tools are not installed' { + # This test needs to be the last in the Context otherwise all subsequent Get-Module checks will fail + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { } + { Test-TargetResource -Name 'RunningVM' @testParams } | Should Throw; + } + + } #end context Validates Test-TargetResource Method + + Context 'Validates Set-TargetResource Method' { + $testParams = @{ + VhdPath = $stubVhdxDisk.FullName; + } + + Mock -CommandName Get-VM -ParameterFilter { $Name -eq 'NewVM' } -MockWith { } + Mock -CommandName New-VM -MockWith { + $newVM = $stubVM.Clone(); + $newVM['State'] = 'Off'; + $newVM['Generation'] = $Generation; + return $newVM; + } + Mock -CommandName Set-VM -MockWith { return $true; } + Mock -CommandName Stop-VM -MockWith { return $true; } # requires output to be able to pipe something into Remove-VM + Mock -CommandName Remove-VM -MockWith { return $true; } + Mock -CommandName Set-VMNetworkAdapter -MockWith { return $true; } + Mock -CommandName Get-VMNetworkAdapter -MockWith { return $stubVM.NetworkAdapters.IpAddresses; } + Mock -CommandName Set-VMState -MockWith { return $true; } + Mock -CommandName Set-VMMemory -MockWith { } + + It 'Removes an existing VM when "Ensure" = "Absent"' { + Set-TargetResource -Name 'RunningVM' -Ensure Absent @testParams; + Assert-MockCalled -CommandName Remove-VM -Scope It; + } + + It 'Creates and starts a VM VM with disabled dynamic memory that does not exist when "Ensure" = "Present" and "State" = "Running"' { + Set-TargetResource -Name 'NewVM' -State Running @testParams; + Assert-MockCalled -CommandName New-VM -Exactly -Times 1 -Scope It; + Assert-MockCalled -CommandName Set-VM -Exactly -Times 1 -Scope It; + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 1 -Scope It; + } + + It 'Creates but does not start a VM with disabled dynamic memory that does not exist when "Ensure" = "Present"' { + Set-TargetResource -Name 'NewVM' @testParams; + Assert-MockCalled -CommandName New-VM -Exactly -Times 1 -Scope It; + Assert-MockCalled -CommandName Set-VM -Exactly -Times 1 -Scope It; + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 0 -Scope It; + } + + It 'Creates but does not start a VM with disabled dynamic memory when only StartupMemory is specified' { + Set-TargetResource -Name 'NewVM' @testParams -StartupMemory 4GB; + Assert-MockCalled -CommandName New-VM -Exactly -Times 1 -Scope It; + Assert-MockCalled -CommandName Set-VM -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 0 -Scope It; + } + + It 'Creates but does not start a VM with disabled dynamic memory when identical values for startup, minimum and maximum memory are specified' { + Set-TargetResource -Name 'NewVM' @testParams -StartupMemory 4GB -MinimumMemory 4GB -MaximumMemory 4GB; + Assert-MockCalled -CommandName New-VM -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Set-VM -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Set-VMMemory -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 0 -Scope It + } + + It 'Creates but does not start a VM with enabled dynamic memory because a MinimumMemory value is specified' { + Set-TargetResource -Name 'NewVM' @testParams -MinimumMemory 512MB + Assert-MockCalled -CommandName New-VM -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Set-VM -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Set-VMMemory -Exactly -Times 0 -Scope It + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 0 -Scope It + } + + It 'Creates but does not start a VM with enabled dynamic memory because a MaximumMemory value is specified' { + Set-TargetResource -Name 'NewVM' @testParams -MaximumMemory 16GB + Assert-MockCalled -CommandName New-VM -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Set-VM -Exactly -Times 1 -Scope It + Assert-MockCalled -CommandName Set-VMMemory -Exactly -Times 0 -Scope It + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 0 -Scope It + } + + It 'Does not change VM state when VM "State" = "Running" and requested "State" = "Running"' { + Set-TargetResource -Name 'RunningVM' -State Running @testParams; + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 0 -Scope It; + } + + It 'Does not change VM state when VM "State" = "Off" and requested "State" = "Off"' { + Set-TargetResource -Name 'StoppedVM' -State Off @testParams; + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 0 -Scope It; + } + + It 'Changes VM state when existing VM "State" = "Off" and requested "State" = "Running"' { + Set-TargetResource -Name 'StoppedVM' -State Running @testParams; + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 1 -Scope It; + } + + It 'Changes VM state when existing VM "State" = "Running" and requested "State" = "Off"' { + Set-TargetResource -Name 'RunningVM' -State Off @testParams; + Assert-MockCalled -CommandName Set-VMState -Exactly -Times 1 -Scope It; + } + + It 'Creates a generation 1 VM by default/when not explicitly specified' { + Set-TargetResource -Name 'NewVM' @testParams; + Assert-MockCalled -CommandName New-VM -ParameterFilter { $Generation -eq 1 } -Scope It; + } + + It 'Creates a generation 1 VM when explicitly specified' { + Set-TargetResource -Name 'NewVM' -Generation 1 @testParams; + Assert-MockCalled -CommandName New-VM -ParameterFilter { $Generation -eq 1 } -Scope It; + } + + It 'Creates a generation 2 VM when explicitly specified' { + Set-TargetResource -Name 'NewVM' -Generation 2 @testParams; + Assert-MockCalled -CommandName New-VM -ParameterFilter { $Generation -eq 2 } -Scope It; + } + + It 'Calls "Add-VMNetworkAdapter" for each NIC when creating a new VM' { + Mock -CommandName Add-VMNetworkAdapter -MockWith { } + Set-TargetResource -Name 'NewVM' @testParams -SwitchName 'Switch1','Switch2'; + # The first NIC is assigned during the VM creation + Assert-MockCalled -CommandName Add-VMNetworkAdapter -Exactly 1 -Scope It; + } + + It 'Calls "Connect-VMNetworkAdapter" for each existing NIC when updating an existing VM' { + Mock -CommandName Connect-VMNetworkAdapter -MockWith { } + Set-TargetResource -Name 'StoppedVM' @testParams -SwitchName 'Switch1','Switch2'; + # The first NIC is assigned during the VM creation + Assert-MockCalled -CommandName Connect-VMNetworkAdapter -Exactly 2 -Scope It; + } + + It 'Calls "Add-VMNetworkAdapter" for each missing NIC when updating an existing VM' { + Mock -CommandName Connect-VMNetworkAdapter -MockWith { } + Mock -CommandName Add-VMNetworkAdapter -MockWith { } + Set-TargetResource -Name 'StoppedVM' @testParams -SwitchName 'Switch1','Switch2','Switch3'; + # The first NIC is assigned during the VM creation + Assert-MockCalled -CommandName Connect-VMNetworkAdapter -Exactly 2 -Scope It; + Assert-MockCalled -CommandName Add-VMNetworkAdapter -Exactly 1 -Scope It; + } + + It 'Does not change switch assignments if no switch assignments are specified' { + Mock -CommandName Connect-VMNetworkAdapter -MockWith { } + Set-TargetResource -Name 'StoppedVM' @testParams; + Assert-MockCalled -CommandName Connect-VMNetworkAdapter -Exactly 0 -Scope It; + } + + It 'Does not change NIC assignments if the switch assisgnments are correct' { + Mock -CommandName Set-VMNetworkAdapter -MockWith { } + Set-TargetResource -Name 'StoppedVM' @testParams -SwitchName $stubNIC1.SwitchName,$stubNIC2.SwitchName; + Assert-MockCalled -CommandName Set-VMNetworkAdapter -Exactly 0 -Scope It; + } + + It 'Errors when updating MAC addresses on a running VM and "RestartIfNeeded" = "$false"' { + { Set-TargetResource -Name 'RunningVM' @testParams -MACAddress 'AABBCCDDEEFE','AABBCCDDEEFF' -ErrorAction Stop } | Should Throw; + } + + It 'Does not change MAC addresses if no MAC addresses assignments are specified' { + Mock -CommandName Set-VMNetworkAdapter -ParameterFilter { $StaticMacAddress -ne $null } -MockWith { } + Set-TargetResource -Name 'StoppedVM' @testParams; + Assert-MockCalled -CommandName Set-VMNetworkAdapter -ParameterFilter { $StaticMacAddress -ne $null } -Exactly 0 -Scope It; + } + + It 'Calls "Set-VMNetworkAdapter" for each MAC address on a stopped VM' { + Mock -CommandName Set-VMNetworkAdapter -MockWith { } + Set-TargetResource -Name 'StoppedVM' @testParams -MACAddress 'AABBCCDDEEFE','AABBCCDDEEFF'; + # The first NIC is assigned during the VM creation + Assert-MockCalled -CommandName Set-VMNetworkAdapter -Exactly 2 -Scope It; + } + + It 'Does not change Secure Boot call "Set-VMProperty" when creating a generation 1 VM' { + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'RunningVM' @testParams; + Assert-MockCalled Set-VMProperty -ParameterFilter { $VMCommand -eq 'Set-VMFirmware' } -Exactly 0 -Scope It; + } + + It 'Does call "Set-VMProperty" when creating a generation 2 VM' { + Mock Test-VMSecureBoot -MockWith { return $true; } + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'RunningVM' -Generation 2 -SecureBoot $false @testParams; + Assert-MockCalled Set-VMProperty -ParameterFilter { $VMCommand -eq 'Set-VMFirmware' } -Exactly 1 -Scope It; + } + + It 'Does not change Secure Boot for generation 1 VM' { + Mock Test-VMSecureBoot -MockWith { return $true; } + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'StoppedVM' -SecureBoot $true @testParams; + Set-TargetResource -Name 'StoppedVM' -SecureBoot $false @testParams; + Assert-MockCalled Set-VMProperty -ParameterFilter { $VMCommand -eq 'Set-VMFirmware' } -Exactly 0 -Scope It; + } + + It 'Does not change Secure Boot for generation 2 VM with VM "SecureBoot" match' { + Mock Test-VMSecureBoot -MockWith { return $true; } + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'StoppedVM' -SecureBoot $true -Generation 2 @testParams; + Assert-MockCalled Set-VMProperty -ParameterFilter { $VMCommand -eq 'Set-VMFirmware' } -Exactly 0 -Scope It; + } + + It 'Does change Secure Boot for generation 2 VM with VM "SecureBoot" mismatch' { + Mock Test-VMSecureBoot -MockWith { return $false; } + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'StoppedVM' -SecureBoot $true -Generation 2 @testParams; + Assert-MockCalled Set-VMProperty -ParameterFilter { $VMCommand -eq 'Set-VMFirmware' } -Exactly 1 -Scope It; + } + + It 'Does call "Enable-VMIntegrationService" when "EnableGuestService" = "$true"' { + Mock -CommandName Enable-VMIntegrationService -MockWith { } + Set-TargetResource -Name 'RunningVM' -EnableGuestService $true @testParams + Assert-MockCalled -CommandName Enable-VMIntegrationService -Exactly -Times 1 -Scope It + } + + It 'Does call "Disable-VMIntegrationService" when "Guest Service Interface" = "Enabled" and "EnableGuestService" = "$false" specified' { + Mock -CommandName Disable-VMIntegrationService -MockWith { } + Mock -CommandName Get-VMIntegrationService -MockWith {return [pscustomobject]@{Enabled=$true;Id=$stubGuestServiceInterfaceId}} + Set-TargetResource -Name 'RunningVM' -EnableGuestService $false @testParams + Assert-MockCalled -CommandName Disable-VMIntegrationService -Exactly -Times 1 -Scope It + } + + Mock -CommandName Get-Command -ParameterFilter { $Name -eq 'Set-VM' -and $Module -eq 'Hyper-V'} -MockWith { + [pscustomobject]@{ + parameters = @{ + # Does not contain parameter AutomaticCheckpointsEnabled + } + } + } + It 'Throws when AutomaticCheckpointsEnabled is configured but not supported' { + { Set-TargetResource -Name 'VMAutomaticCheckpointsUnsupported' -AutomaticCheckpointsEnabled $true @testParams } | Should Throw; + } + It 'Does not call "Set-VM" when "AutomaticCheckpointsEnabled" is unsupported and unspecified' { + Set-TargetResource -Name 'VMAutomaticCheckpointsUnsupported' @testParams + Assert-MockCalled -CommandName Set-VM -Exactly -Times 0 -Scope It + } + + Mock -CommandName Get-Command -ParameterFilter { $Name -eq 'Set-VM' -and $Module -eq 'Hyper-V'} -MockWith { + [pscustomobject]@{ + parameters = @{ + 'AutomaticCheckpointsEnabled' = '' + } + } + } + $AutomaticCheckpointsEnabledTestCases = @( + @{ + VMName = 'VMWithAutomaticCheckpoints' + SetAutomaticCheckpointsEnabled = $true + Assert = 'Does not call "Set-VM"' + Times = 0 + }, + @{ + VMName = 'VMWithoutAutomaticCheckpoints' + SetAutomaticCheckpointsEnabled = $false + Assert = 'Does not call "Set-VM"' + Times = 0 + }, + @{ + VMName = 'VMWithAutomaticCheckpoints' + SetAutomaticCheckpointsEnabled = $false + Assert = 'Does call "Set-VM"' + Times = 1 + }, + @{ + VMName = 'VMWithoutAutomaticCheckpoints' + SetAutomaticCheckpointsEnabled = $true + Assert = 'Does call "Set-VM"' + Times = 1 + } + ) + It '<Assert> on VM <VMName> when "AutomaticCheckpointsEnabled" is set to "<SetAutomaticCheckpointsEnabled>"' -TestCases $AutomaticCheckpointsEnabledTestCases { + Param($VMName,$SetAutomaticCheckpointsEnabled,$Times) + Set-TargetResource -Name $VMName -AutomaticCheckpointsEnabled $SetAutomaticCheckpointsEnabled @testParams + Assert-MockCalled -CommandName Set-VM -ParameterFilter {$Name -eq $VMName -and $AutomaticCheckpointsEnabled -eq $SetAutomaticCheckpointsEnabled} -Exactly -Times $Times -Scope It + } + It 'Disables dynamic memory of RuningVM if only StartupMemory specified' { + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'RunningVM' -StartupMemory 4GB @testParams + Assert-MockCalled -CommandName Set-VMProperty -ParameterFilter { + $VMCommand -eq 'Set-VM' -and + ($ChangeProperty.StaticMemory -eq $true) -and + ($ChangeProperty.DynamicMemory -eq $false) + } -Exactly -Times 1 -Scope It + } + + It 'Disables dynamic memory of RuningVM if StartupMemory, MinimumMemory and MaximumMemory are specified with the same values' { + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'RunningVM' -StartupMemory 4GB -MinimumMemory 4GB -MaximumMemory 4GB @testParams + Assert-MockCalled -CommandName Set-VMProperty -ParameterFilter { + $VMCommand -eq 'Set-VM' -and + ($ChangeProperty.StaticMemory -eq $true) -and + ($ChangeProperty.DynamicMemory -eq $false) + } -Exactly -Times 1 -Scope It + } + + It 'Enables dynamic memory of RuningVM if MinimumMemory is specified ' { + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'RunningVM' -MinimumMemory 4GB @testParams + Assert-MockCalled -CommandName Set-VMProperty -ParameterFilter { + $VMCommand -eq 'Set-VM' -and + ($ChangeProperty.StaticMemory -eq $false) -and + ($ChangeProperty.DynamicMemory -eq $true) + } -Exactly -Times 1 -Scope It + } + + It 'Enables dynamic memory of RuningVM if MaximumMemory is specified ' { + Mock Set-VMProperty -MockWith { } + Set-TargetResource -Name 'RunningVM' -MaximumMemory 4GB @testParams + Assert-MockCalled -CommandName Set-VMProperty -ParameterFilter { + $VMCommand -eq 'Set-VM' -and + ($ChangeProperty.StaticMemory -eq $false) -and + ($ChangeProperty.DynamicMemory -eq $true) + } -Exactly -Times 1 -Scope It + } + + It 'Throws when Hyper-V Tools are not installed' { + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { } + { Set-TargetResource -Name 'RunningVM' @testParams } | Should Throw; + } + } #end context Validates Set-TargetResource Method + + Context 'Validates Test-VMSecureBoot Method' { + + It 'Returns $true when "SecureBoot" = "On"' { + Mock -CommandName Get-VM -MockWith { } + Mock -CommandName Get-VMFirmware -MockWith { return [PSCustomObject] @{ SecureBoot = 'On' }; } + Test-VMSecureBoot -Name 'TestVM' | Should Be $true; + } + + It 'Returns $false when "SecureBoot" = "Off"' { + Mock -CommandName Get-VM -MockWith { } + Mock -CommandName Get-VMFirmware -MockWith { return [PSCustomObject] @{ SecureBoot = 'Off' }; } + Test-VMSecureBoot -Name 'TestVM' | Should Be $false; + } + + } #end context Validates Test-VMSecureBoot Method + + Context 'Validates Get-VhdHierarchy Method' { + + It 'Does not throw with null parent path (#52)' { + + # Must use a different file extension to ensure existing mocks Get-VhdHierarchy or not called + $fakeVhdPath = 'BaseVhd.avhdx'; + Mock -CommandName Get-VHD -ParameterFilter { $Path -eq $fakeVhdPath } -MockWith { + return [PSCustomObject] @{ + Path = $fakeVhdPath; + ParentPath = $null; + } + } + + { Get-VhdHierarchy -VhdPath $fakeVhdPath } | Should Not Throw; + } + + } #end context validates Get-VhdHierarchy + + + } #end inmodulescope +} #end describe xVMHyper-V diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMNetworkAdapter.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMNetworkAdapter.Tests.ps1 new file mode 100644 index 0000000..cd65429 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMNetworkAdapter.Tests.ps1 @@ -0,0 +1,357 @@ +$Global:DSCModuleName = 'xHyper-V' +$Global:DSCResourceName = 'MSFT_xVMNetworkAdapter' + +#region HEADER +if ( (-not (Test-Path -Path '.\DSCResource.Tests\')) -or ` + (-not (Test-Path -Path '.\DSCResource.Tests\TestHelper.psm1')) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git') +} +else +{ + & git @('-C',(Join-Path -Path (Get-Location) -ChildPath '\DSCResource.Tests\'),'pull') +} +Import-Module .\DSCResource.Tests\TestHelper.psm1 -Force +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $Global:DSCModuleName ` + -DSCResourceName $Global:DSCResourceName ` + -TestType Unit +#endregion + +# Begin Testing +try +{ + #region Pester Tests + InModuleScope $Global:DSCResourceName { + + # Create the Mock Objects that will be used for running tests + $MockHostAdapter = [PSCustomObject] @{ + Id = 'HostManagement1' + Name = 'Management' + SwitchName = 'HostSwitch' + VMName = 'ManagementOS' + } + + $propertiesStatic = @{ + IpAddress = "192.168.0.1" + Subnet = "255.255.255.0" + } + + $networkSettingsStatic = New-CimInstance -ClassName xNetworkSettings -Property $properties -Namespace root/microsoft/windows/desiredstateconfiguration -ClientOnly + + $TestAdapter = [PSObject]@{ + Id = $MockHostAdapter.Id + Name = $MockHostAdapter.Name + SwitchName = $MockHostAdapter.SwitchName + VMName = $MockHostAdapter.VMName + } + + $MockAdapter = [PSObject]@{ + Name = $TestAdapter.Name + SwitchName = $MockHostAdapter.SwitchName + IsManagementOs = $True + MacAddress = '14FEB5C6CE98' + } + + $MockAdapterVlanUntagged = [PSObject]@{ + OperationMode = 'Untagged' + } + + $MockAdapterVlanTagged = [PSObject]@{ + OperationMode = 'Access' + AccessVlanId = '1' + } + + Describe "$($Global:DSCResourceName)\Get-TargetResource" { + #Function placeholders + function Get-VMNetworkAdapter { } + function Set-VMNetworkAdapter { } + function Remove-VMNetworkAdapter { } + function Get-VMNetworkAdapterVlan { } + function Add-VMNetworkAdapter { } + function Get-NetworkInformation { } + Context 'NetAdapter does not exist' { + Mock Get-VMNetworkAdapter + Mock Get-VMNetworkAdapterVlan + It 'should return ensure as absent' { + $Result = Get-TargetResource ` + @TestAdapter + $Result.Ensure | Should Be 'Absent' + } + It 'should call the expected mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Get-VMNetworkAdapterVlan -Exactly 0 + } + } + + Context 'NetAdapter exists' { + Mock -CommandName Get-VMNetworkAdapter -MockWith { + $MockAdapter + } + Mock -CommandName Get-VMNetworkAdapterVlan -MockWith { + $MockAdapterVlanUntagged + } + Mock -CommandName Get-NetworkInformation -MockWith { + return @{ + IpAddress = '10.10.10.10' + Subnet = '255.255.255.0' + DefaultGateway = '10.10.10.1' + DnsServer = '10.10.10.1' + } + } + + It 'should return adapter properties' { + $Result = Get-TargetResource @TestAdapter + $Result.Ensure | Should Be 'Present' + $Result.Name | Should Be $TestAdapter.Name + $Result.SwitchName | Should Be $TestAdapter.SwitchName + $Result.VMName | Should Be 'ManagementOS' + $Result.Id | Should Be $TestAdapter.Id + $Result.VlanId | Should -BeNullOrEmpty + $Result.NetworkSetting | Should -Not -BeNullOrEmpty + } + It 'should call the expected mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Get-VMNetworkAdapterVlan -Exactly 1 + } + } + + Context 'NetAdapter exists' { + Mock -CommandName Get-VMNetworkAdapter -MockWith { + $MockAdapter + } + Mock -CommandName Get-VMNetworkAdapterVlan -MockWith { + $MockAdapterVlanTagged + } + + It 'should return adapter properties' { + $Result = Get-TargetResource @TestAdapter + $Result.Ensure | Should Be 'Present' + $Result.Name | Should Be $TestAdapter.Name + $Result.SwitchName | Should Be $TestAdapter.SwitchName + $Result.VMName | Should Be 'ManagementOS' + $Result.Id | Should Be $TestAdapter.Id + $Result.VlanId | Should Be '1' + } + It 'should call the expected mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Get-VMNetworkAdapterVlan -Exactly 1 + } + } + } + + Describe "$($Global:DSCResourceName)\Set-TargetResource" { + #Function placeholders + function Get-VMNetworkAdapter { } + function Get-VMNetworkAdapterVlan { } + function Set-VMNetworkAdapter { } + function Set-VMNetworkAdapterVlan { } + function Remove-VMNetworkAdapter { } + function Add-VMNetworkAdapter { } + function Get-NetworkInformation { } + function Set-NetworkInformation { } + + $newAdapter = [PSObject]@{ + Id = 'UniqueString' + Name = $TestAdapter.Name + SwitchName = $TestAdapter.SwitchName + VMName = 'VMName' + NetworkSetting = $networkSettingsStatic + Ensure = 'Present' + } + + Context 'Adapter does not exist but should' { + + Mock Get-VMNetworkAdapter + Mock Get-VMNetworkAdapterVlan + Mock Add-VMNetworkAdapter + Mock Remove-VMNetworkAdapter + Mock Set-VMNetworkAdapterVlan + Mock Set-NetworkInformation + + It 'should not throw error' { + { + Set-TargetResource @newAdapter + } | Should Not Throw + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -CommandName Set-VMNetworkAdapterVlan -Exactly 0 + Assert-MockCalled -commandName Add-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Remove-VMNetworkAdapter -Exactly 0 + Assert-MockCalled -CommandName Set-NetworkInformation -Exactly 1 + } + } + + Context 'Adapter exists but should not exist' { + Mock Get-VMNetworkAdapter + Mock Add-VMNetworkAdapter + Mock Remove-VMNetworkAdapter + Mock Set-VMNetworkAdapterVlan + + It 'should not throw error' { + { + $updateAdapter = $newAdapter.Clone() + $updateAdapter.Ensure = 'Absent' + Set-TargetResource @updateAdapter + } | Should Not Throw + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Add-VMNetworkAdapter -Exactly 0 + Assert-MockCalled -commandName Remove-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -CommandName Set-VMNetworkAdapterVlan -Exactly 0 + } + } + } + + Describe "$($Global:DSCResourceName)\Test-TargetResource" { + #Function placeholders + function Get-VMNetworkAdapter { } + function Get-VMNetworkAdapterVlan { } + function Set-VMNetworkAdapter { } + function Remove-VMNetworkAdapter { } + function Add-VMNetworkAdapter { } + function Get-NetworkInformation { } + + $newAdapter = [PSObject]@{ + Id = 'UniqueString' + Name = $TestAdapter.Name + SwitchName = $TestAdapter.SwitchName + VMName = 'ManagementOS' + Ensure = 'Present' + } + + Context 'Adapter does not exist but should' { + Mock Get-VMNetworkAdapter + Mock Get-VMNetworkAdapterVlan + + It 'should return false' { + Test-TargetResource @newAdapter | Should be $false + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + } + } + + Context 'Adapter exists but should not exist' { + Mock Get-VMNetworkAdapter -MockWith { $MockAdapter } + + It 'should return $false' { + $updateAdapter = $newAdapter.Clone() + $updateAdapter.Ensure = 'Absent' + Test-TargetResource @updateAdapter | Should Be $false + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + } + } + + Context 'Adapter exists and no action needed without Vlan tag' { + Mock Get-VMNetworkAdapter -MockWith { $MockAdapter } + + It 'should return true' { + $updateAdapter = $newAdapter.Clone() + Test-TargetResource @updateAdapter | Should Be $true + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + } + } + + Context 'Adapter exists and no action needed with Vlan tag' { + Mock Get-VMNetworkAdapter -MockWith { $MockAdapter } + Mock Get-VMNetworkAdapterVlan -MockWith { $MockAdapterVlanTagged } + Mock -CommandName Get-NetworkInformation + + It 'should return true' { + $updateAdapter = $newAdapter.Clone() + $updateAdapter.VMName = "VMName" + $updateAdapter.MacAddress = '14FEB5C6CE98' + $updateAdapter.VlanId = '1' + Test-TargetResource @updateAdapter | Should Be $true + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Get-VMNetworkAdapterVlan -Exactly 1 + } + } + + Context 'Adapter exists but Vlan is not tagged' { + Mock Get-VMNetworkAdapter -MockWith { $MockAdapter } + Mock Get-VMNetworkAdapterVlan + Mock -CommandName Get-NetworkInformation + + It 'should return false' { + $updateAdapter = $newAdapter.Clone() + $updateAdapter.VMName = "VMName" + $updateAdapter.MacAddress = '14FEB5C6CE98' + $updateAdapter.VlanId = '1' + Test-TargetResource @updateAdapter | Should Be $false + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Get-VMNetworkAdapterVlan -Exactly 1 + } + } + + Context 'Adapter exists but Vlan tag is wrong' { + Mock Get-VMNetworkAdapter -MockWith { $MockAdapter } + Mock Get-VMNetworkAdapterVlan -MockWith { $MockAdapterVlanTagged } + Mock -CommandName Get-NetworkInformation + + It 'should return false' { + $updateAdapter = $newAdapter.Clone() + $updateAdapter.VMName = "VMName" + $updateAdapter.MacAddress = '14FEB5C6CE98' + $updateAdapter.VlanId = '2' + Test-TargetResource @updateAdapter | Should Be $false + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Get-VMNetworkAdapterVlan -Exactly 1 + } + } + + Context 'Adapter does not exist and no action needed' { + Mock Get-VMNetworkAdapter + + It 'should return true' { + $updateAdapter = $newAdapter.Clone() + $updateAdapter.Ensure = 'Absent' + Test-TargetResource @updateAdapter | Should Be $true + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + } + } + + Context 'Adapter exists but network settings are not correct' { + Mock Get-VMNetworkAdapter -MockWith { $MockAdapter } + Mock Get-VMNetworkAdapterVlan -MockWith { $MockAdapterVlanTagged } + Mock -CommandName Get-NetworkInformation -MockWith { + @{ Dhcp = $false } + } + + It 'should return false' { + $updateAdapter = $newAdapter.Clone() + $updateAdapter.VMName = "VMName" + $updateAdapter.MacAddress = '14FEB5C6CE98' + Test-TargetResource @updateAdapter | Should Be $false + } + It 'should call expected Mocks' { + Assert-MockCalled -commandName Get-VMNetworkAdapter -Exactly 1 + Assert-MockCalled -commandName Get-NetworkInformation -Exactly 1 + } + } + } + + } + #endregion +} +finally +{ + #region FOOTER + Restore-TestEnvironment -TestEnvironment $TestEnvironment + #endregion +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMProcessor.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMProcessor.Tests.ps1 new file mode 100644 index 0000000..88b37d7 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMProcessor.Tests.ps1 @@ -0,0 +1,343 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMProcessor' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { + +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + + $testVMName = 'UnitTestVM' + $testResourcePoolName = 'Unit Test Resource Pool' + + Describe 'MSFT_xVMProcessor\Get-TargetResource' { + + $fakeVMProcessor = @{ + EnableHostResourceProtection = $true + } + + # Guard mocks + Mock Assert-Module { } + + function Get-VMProcessor { + [CmdletBinding()] + param + ( + [System.String] + $VMName + ) + } + + It 'Should return a [System.Collections.Hashtable] object type' { + Mock Get-VMProcessor { return $fakeVMProcessor } + + $result = Get-TargetResource -VMName $testVMName + + $result -is [System.Collections.Hashtable] | Should Be $true + } + + It 'Should assert Hyper-V module is installed' { + Mock Assert-Module { } + Mock Get-VMProcessor { return $fakeVMProcessor } + + $null = Get-TargetResource -VMName $testVMName + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + + It 'Should throw when VM processor is not found' { + Mock Get-Module { return $true } + Mock Get-VMProcessor { Write-Error 'Not Found' } + { $null = Get-TargetResource -VMName $testVMName } | Should Throw 'Not Found' + } + } # descrive Get-TargetResource + + Describe 'MSFT_xVMProcessor\Test-TargetResource' { + + # Guard mocks + Mock Assert-Module { } + Mock Assert-TargetResourceParameter { } + + function Get-VM { + param ( + [System.String] + $Name + ) + } + + function Get-VMProcessor { + param ( + [System.String] + $VMName + ) + } + + function Set-VMProcessor { + param ( + [System.String] + $VMName + ) + } + + $fakeTargetResource = @{ + VMName = $testVMName + EnableHostResourceProtection = $true + ExposeVirtualizationExtensions = $true + HwThreadCountPerCore = 1 + Maximum = 99 + MaximumCountPerNumaNode = 4 + MaximumCountPerNumaSocket = 1 + RelativeWeight = 99 + Reserve = 0 + ResourcePoolName = $testResourcePoolName + CompatibilityForMigrationEnabled = $false + CompatibilityForOlderOperatingSystemsEnabled = $false + } + + It 'Should return a [System.Boolean] object type' { + Mock Get-TargetResource { return $fakeTargetResource } + + $result = Test-TargetResource -VMName $testVMName + + $result -is [System.Boolean] | Should Be $true + } + + It 'Should assert Hyper-V module is installed' { + Mock Get-VMProcessor { return $fakeVMProcessor } + + $null = Test-TargetResource -VMName $testVMName + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + + It 'Should assert parameter values are valid' { + Mock Get-VMProcessor { return $fakeVMProcessor } + + $null = Test-TargetResource -VMName $testVMName + + Assert-MockCalled Assert-TargetResourceParameter -Scope It + } + + $parameterNames = @( + 'EnableHostResourceProtection', + 'ExposeVirtualizationExtensions', + 'HwThreadCountPerCore', + 'Maximum', + 'MaximumCountPerNumaNode', + 'MaximumCountPerNumaSocket', + 'RelativeWeight', + 'Reserve', + 'ResourcePoolName', + 'CompatibilityForMigrationEnabled', + 'CompatibilityForOlderOperatingSystemsEnabled' + ) + + # Test each individual parameter value separately + foreach ($parameterName in $parameterNames) + { + $parameterValue = $fakeTargetResource[$parameterName] + $testTargetResourceParams = @{ + VMName = $testVMName + } + + # Pass value verbatim so it should always pass first + It "Should pass when parameter '$parameterName' is correct" { + $testTargetResourceParams[$parameterName] = $parameterValue + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $true + } + + if ($parameterValue -is [System.Boolean]) + { + # Invert parameter value to cause a test failure + $testTargetResourceParams[$parameterName] = -not $parameterValue + } + elseif ($parameterValue -is [System.String]) + { + # Repeat string to cause a test failure + $testTargetResourceParams[$parameterName] = "$parameterValue$parameterValue" + } + elseif ($parameterValue -is [System.Int32] -or $parameterValue -is [System.Int64]) + { + # Add one to cause a test failure + $testTargetResourceParams[$parameterName] = $parameterValue + 1 + } + + It "Should fail when parameter '$parameterName' is incorrect" { + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $false + } + } + } # describe Test-TargetResource + + Describe 'MSFT_xVMProcessor\Set-TargetResource' { + + function Get-VM { + param + ( + [System.String] + $Name + ) + } + + function Get-VMProcessor { + param + ( + [System.String] + $VMName + ) + } + + function Set-VMProcessor { + param + ( + [System.String] + $VMName + ) + } + + # Guard mocks + Mock Assert-Module { } + Mock Assert-TargetResourceParameter { } + Mock Get-VM { } + Mock Set-VMProcessor { } + Mock Set-VMProperty { } + + It 'Should assert Hyper-V module is installed' { + $null = Set-TargetResource -VMName $testVMName + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + + It 'Should assert parameter values are valid' { + $null = Set-TargetResource -VMName $testVMName + + Assert-MockCalled Assert-TargetResourceParameter -Scope It + } + + $restartRequiredParameters = @{ + 'ExposeVirtualizationExtensions' = $false; + 'CompatibilityForMigrationEnabled' = $true; + 'CompatibilityForOlderOperatingSystemsEnabled' = $true; + 'HwThreadCountPerCore' = 2; + 'MaximumCountPerNumaNode' = 2 + 'MaximumCountPerNumaSocket' = 2 + 'ResourcePoolName' = $testResourcePoolName; + } + + foreach ($parameter in $restartRequiredParameters.GetEnumerator()) + { + $setTargetResourceParams = @{ + VMName = $testVMName; + $parameter.Name = $parameter.Value; + } + + It "Should not throw when VM is off, '$($parameter.Name)' is specified and 'RestartIfNeeded' is False" { + Mock Get-VM { return @{ State = 'Off' } } + + { Set-TargetResource @setTargetResourceParams } | Should Not Throw + } + + It "Should throw when VM is running, '$($parameter.Name)' is specified and 'RestartIfNeeded' is False" { + Mock Get-VM { return @{ State = 'Running' } } + + { Set-TargetResource @setTargetResourceParams } | Should Throw + } + + It "Should shutdown VM when running, '$($parameter.Name)' is specified and 'RestartIfNeeded' is True" { + Mock Get-VM { return @{ State = 'Running' } } + + Set-TargetResource @setTargetResourceParams -RestartIfNeeded $true + + Assert-MockCalled Set-VMProperty -Scope It -Exactly 1 + } + } + + $noRestartRequiredParameters = @{ + 'EnableHostResourceProtection' = $true; + 'Maximum' = 50; + 'RelativeWeight' = 50; + 'Reserve' = 50; + } + + foreach ($parameter in $noRestartRequiredParameters.GetEnumerator()) + { + $setTargetResourceParams = @{ + VMName = $testVMName; + $parameter.Name = $parameter.Value; + } + + It "Should not shutdown VM running and '$($parameter.Name) is specified" { + Mock Get-VM { return @{ State = 'Running' } } + + Set-TargetResource @setTargetResourceParams + + Assert-MockCalled Set-VMProcessor -Scope It -Exactly 1 + Assert-MockCalled Set-VMProperty -Scope It -Exactly 0 + } + } + } # describe Set-TargetResource + + Describe 'MSFT_xVMProcessor\Assert-TargetResourceParameter' { + + # Return Windows Server 2012 R2/Windows 8.1 Update 1 + Mock Get-CimInstance { return @{ BuildNumber = '9600' } } + + It "Should not throw when parameter 'ResourcePoolName' is specified on 2012 R2 host" { + { Assert-TargetResourceParameter -ResourcePoolName 'TestPool' } | Should Not Throw + } + + $server2016OnlyParameters = @{ + EnableHostResourceProtection = $true; + ExposeVirtualizationExtensions = $true; + HwThreadCountPerCore = 1; + } + + foreach ($parameter in $server2016OnlyParameters.GetEnumerator()) + { + $assertTargetResourceParameterParams = @{ + $parameter.Name = $parameter.Value; + } + + It "Should throw when parameter '$($parameter.Name)' is specified on 2012 R2 host" { + { Assert-TargetResourceParameter @assertTargetResourceParameterParams } | Should Throw '14393' + } + } + } # describe Assert-TargetResourceParameter + } # InModuleScope +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMScsiController.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMScsiController.Tests.ps1 new file mode 100644 index 0000000..64f534d --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMScsiController.Tests.ps1 @@ -0,0 +1,352 @@ +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMScsiController' + +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup { + +} + +function Invoke-TestCleanup { + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + + $testVMName = 'UnitTestVM' + + Describe 'MSFT_xVMScsiController\Get-TargetResource' { + + $stubScsiController = @{ + VMName = $testVMName + ControllerNumber = 0 + } + + # Guard mocks + Mock Assert-Module { } + + function Get-VMScsiController { + [CmdletBinding()] + param + ( + [System.String] + $VMName, + + [System.Int32] + $ControllerNumber + ) + } + + It 'Should return a [System.Collections.Hashtable] object type' { + Mock Get-VMScsiController { return $stubScsiController } + + $result = Get-TargetResource -VMName $testVMName -ControllerNumber 0 + + $result -is [System.Collections.Hashtable] | Should Be $true + } + + It 'Should return "Present" when controller is attached' { + Mock Get-VMScsiController { return $stubScsiController } + + $result = Get-TargetResource -VMName $testVMName -ControllerNumber 0 + + $result.Ensure | Should Be 'Present' + } + + It 'Should return "Absent" when controller is not attached' { + Mock Get-VMScsiController { } + + $result = Get-TargetResource -VMName $testVMName -ControllerNumber 0 + + $result.Ensure | Should Be 'Absent' + } + + It 'Should assert Hyper-V module is installed' { + Mock Assert-Module { } + Mock Get-VMScsiController { } + + $null = Get-TargetResource -VMName $testVMName -ControllerNumber 0 + + Assert-MockCalled Assert-Module -ParameterFilter { $Name -eq 'Hyper-V' } -Scope It + } + } # descrive Get-TargetResource + + Describe 'MSFT_xVMScsiController\Test-TargetResource' { + + # Guard mocks + Mock Assert-Module { } + + $stubTargetResource = @{ + VMName = $testVMName + ControllerNumber = 0 + Ensure = 'Present' + } + + It 'Should return a [System.Boolean] object type' { + Mock Get-TargetResource { return $stubTargetResource } + $testTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + } + + $result = Test-TargetResource @testTargetResourceParams + + $result -is [System.Boolean] | Should Be $true + } + + It "Should pass when parameter 'Ensure' is correct" { + Mock Get-TargetResource { return $stubTargetResource } + $testTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + Ensure = $stubTargetResource['Ensure'] + } + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $true + } + + It "Should fail when parameter 'Ensure' is incorrect" { + Mock Get-TargetResource { return $stubTargetResource } + $testTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + Ensure = 'Absent' + } + + $result = Test-TargetResource @testTargetResourceParams + + $result | Should Be $false + } + } # describe Test-TargetResource + + Describe 'MSFT_xVMScsiController\Set-TargetResource' { + + function Get-VMScsiController { + param + ( + [System.String] + $VMName + ) + } + + function Add-VMScsiController { + param + ( + [System.String] + $VMName + ) + } + + function Remove-VMScsiController { + param + ( + [System.String] + $VMName + ) + } + + function Remove-VMHardDiskDrive { + param ( + [System.Object] + $VMHardDiskDrive + ) + } + + # Guard mocks + Mock Assert-Module { } + Mock Get-VMScsiController { } + Mock Add-VMScsiController { } + Mock Remove-VMScsiController { } + Mock Remove-VMHardDiskDrive { } + Mock Set-VMState { } + + It 'Should assert Hyper-V module is installed' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + RestartIfNeeded = $true + } + + $null = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled Assert-Module + } + + It 'Should throw if "RestartIfNeeded" is not specified and VM is "Running"' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + } + + { Set-TargetResource @setTargetResourceParams } | Should Throw 'RestartIfNeeded' + } + + It 'Should not throw if "RestartIfNeeded" is not specified and VM is "Off"' { + Mock Get-VMHyperV { return @{ State = 'Off' } } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + } + + { Set-TargetResource @setTargetResourceParams } | Should Not Throw + } + + It 'Should call "Set-VMState" to stop running VM' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + RestartIfNeeded = $true + } + + $null = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled Set-VMState -ParameterFilter { $State -eq 'Off' } -Scope It + } + + It 'Should call "Set-VMState" to restore VM to its previous state' { + $testVMState = 'Paused' + Mock Get-VMHyperV { return @{ State = $testVMState } } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + RestartIfNeeded = $true + } + + $null = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled Set-VMState -ParameterFilter { $State -eq $testVMState } -Scope It + } + + It 'Should add single controller when it does not exist' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + Mock Get-VMScsiController { } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + RestartIfNeeded = $true + } + + $null = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled Add-VMScsiController -Scope It -Exactly 1 + } + + It 'Should add single controller when one already exists' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + $fakeVMScsiController = [PSCustomObject] @{ ControllerNumber = 0 } + Mock Get-VMScsiController { return $fakeVMScsiController } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 1 + RestartIfNeeded = $true + } + + $null = Set-TargetResource @setTargetResourceParams + + Assert-MockCalled Add-VMScsiController -Scope It -Exactly 1 + } + + It 'Should throw when adding controller when intermediate controller(s) do not exist' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + Mock Get-VMScsiController { } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 1 + RestartIfNeeded = $true + } + + { Set-TargetResource @setTargetResourceParams } | Should Throw 'Cannot add controller' + } + + It 'Should remove controller when Ensure = "Absent"' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + $fakeVMScsiControllers = @( + [PSCustomObject] @{ ControllerNumber = 0 } + [PSCustomObject] @{ ControllerNumber = 1 } + ) + Mock Get-VMScsiController { return $fakeVMScsiControllers } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 1 + RestartIfNeeded = $true + Ensure = 'Absent' + } + + $null = Set-TargetResource @setTargetResourceParams -WarningAction SilentlyContinue + + Assert-MockCalled Remove-VMScsiController -Scope It + } + + It 'Should remove all attached disks when Ensure = "Absent"' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + $fakeVMScsiController = [PSCustomObject] @{ + ControllerNumber = 0 + Drives = @( + [PSCustomObject] @{ Name = 'Hard Drive on SCSI controller number 0 at location 0' } + [PSCustomObject] @{ Name = 'Hard Drive on SCSI controller number 0 at location 1' } + ) + } + Mock Get-VMScsiController { return $fakeVMScsiController } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + RestartIfNeeded = $true + Ensure = 'Absent' + } + + $null = Set-TargetResource @setTargetResourceParams -WarningAction SilentlyContinue + + Assert-MockCalled Remove-VMHardDiskDrive -Scope It -Exactly ($fakeVMScsiController.Drives.Count) + } + + It 'Should throw removing a controller when additional/subsequent controller(s) exist' { + Mock Get-VMHyperV { return @{ State = 'Running' } } + $fakeVMScsiControllers = @( + [PSCustomObject] @{ ControllerNumber = 0 } + [PSCustomObject] @{ ControllerNumber = 1 } + ) + Mock Get-VMScsiController { return $fakeVMScsiControllers } + $setTargetResourceParams = @{ + VMName = $testVMName + ControllerNumber = 0 + RestartIfNeeded = $true + Ensure = 'Absent' + } + + { Set-TargetResource @setTargetResourceParams } | Should Throw 'Cannot remove controller' + } + + } # describe Set-TargetResource + } # InModuleScope +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_BandwidthReservationMode.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_BandwidthReservationMode.Tests.ps1 new file mode 100644 index 0000000..eb29268 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_BandwidthReservationMode.Tests.ps1 @@ -0,0 +1,549 @@ +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone', 'https://github.com/PowerShell/DscResource.Tests.git', (Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'xHyper-V' ` + -DSCResourceName 'MSFT_xVMSwitch' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup +{ + +} + +function Invoke-TestCleanup +{ + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_xVMSwitch' { + + <# + Defines a variable that contains all the possible Bandwidth Reservation Modes which will be used + for foreach loops later on + #> + New-Variable -Name 'BANDWIDTH_RESERVATION_MODES' -Option 'Constant' -Value @('Default', 'Weight', 'Absolute', 'None') + + # Function to create a exception object for testing output exceptions + function Get-InvalidArgumentError + { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorMessage + ) + + $exception = New-Object -TypeName System.ArgumentException ` + -ArgumentList $ErrorMessage + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + return $errorRecord + } # end function Get-InvalidArgumentError + + # A helper function to mock a VMSwitch + function New-MockedVMSwitch + { + Param ( + [Parameter(Mandatory = $true)] + [string] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Default', 'Weight', 'Absolute', 'None', 'NA')] + [string] + $BandwidthReservationMode, + + [Parameter()] + [bool] + $AllowManagementOS = $false + ) + + $mockedVMSwitch = @{ + Name = $Name + SwitchType = 'External' + AllowManagementOS = $AllowManagementOS + NetAdapterInterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver' + } + + if ($BandwidthReservationMode -ne 'NA') + { + $mockedVMSwitch['BandwidthReservationMode'] = $BandwidthReservationMode + } + + return [PsObject]$mockedVMSwitch + } + + Describe 'Validates Get-TargetResource Function' { + # Create an empty function to be able to mock the missing Hyper-V cmdlet + function Get-VMSwitch + { + + } + + <# + Mocks Get-VMSwitch and will return $global:mockedVMSwitch which is + a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName Get-VMSwitch -MockWith { + param + ( + [string] + $ErrorAction + ) + + if ($ErrorAction -eq 'Stop' -and $global:mockedVMSwitch -eq $null) + { + throw [System.Management.Automation.ActionPreferenceStopException]'No switch can be found by given criteria.' + } + + return $global:mockedVMSwitch + } + + # Mocks Get-NetAdapter which returns a simplified network adapter + Mock -CommandName Get-NetAdapter -MockWith { + return [PSCustomObject]@{ + Name = 'SomeNIC' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver' + } + } + + # Mocks "Get-Module -Name Hyper-V" so that the DSC resource thinks the Hyper-V module is on the test system + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $true + } + + # Create all the test cases for Get-TargetResource + $getTestCases = @() + foreach ($brmMode in $BANDWIDTH_RESERVATION_MODES) { + $getTestCases += @{ + CurrentName = $brmMode + 'BRM' + CurrentBandwidthReservationMode = $brmMode + } + } + + # Test Get-TargetResource with the test cases created above + It 'Current switch''s BandwidthReservationMode is set to <CurrentBandwidthReservationMode>' -TestCases $getTestCases { + param + ( + [Parameter()] + [string] + $CurrentName, + + [Parameter()] + [string] + $CurrentBandwidthReservationMode + ) + + # Set the mocked VMSwitch to be returned from Get-VMSwitch based on the input from $getTestCases + $global:mockedVMSwitch = New-MockedVMSwitch -Name $CurrentName -BandwidthReservationMode $CurrentBandwidthReservationMode + + $targetResource = Get-TargetResource -Name $CurrentName -Type 'External' + $targetResource -is [System.Collections.Hashtable] | Should Be $true + $targetResource['BandwidthReservationMode'] | Should Be $CurrentBandwidthReservationMode + + Remove-Variable -Scope 'Global' -Name 'mockedVMSwitch' -ErrorAction 'SilentlyContinue' + } + + <# + Test Get-TargetResource when the VMSwitch's BandwidthReservationMode member variable is not + set which simulates older versions of Windows that don't support it + #> + It 'BandwidthReservationMode is set to null' { + # Set the mocked VMSwitch to be returned from Get-VMSwitch + $global:mockedVMSwitch = New-MockedVMSwitch -Name 'NaBRM' -BandwidthReservationMode 'NA' + + $targetResource = Get-TargetResource -Name 'NaBRM' -Type 'External' + $targetResource -is [System.Collections.Hashtable] | Should Be $true + $targetResource['BandwidthReservationMode'] | Should Be "NA" + + Remove-Variable -Scope 'Global' -Name 'mockedVMSwitch' -ErrorAction 'SilentlyContinue' + } + } + + # Create all the test cases for Test-TargetResource and Set-TargetResource when the switch already exists + $testSetTestCases = @() + foreach ($currentBrmMode in $BANDWIDTH_RESERVATION_MODES) + { + foreach ($desiredBrmMode in $BANDWIDTH_RESERVATION_MODES) + { + foreach ($ensureOption in @('Present', 'Absent')) + { + $case = @{ + CurrentName = $currentBrmMode + 'BRM' + CurrentBandwidthReservationMode = $currentBrmMode + DesiredName = $desiredBrmMode + 'BRM' + DesiredBandwidthReservationMode = $desiredBrmMode + Ensure = $ensureOption + ExpectedResult = $ensureOption -eq 'Present' -and $currentBrmMode -eq $desiredBrmMode + } + $testSetTestCases += $case + } + } + } + + # Create all the test cases for Test-TargetResource and Set-TargetResource when the switch does not exists + foreach ($desiredBrmMode in $BANDWIDTH_RESERVATION_MODES) + { + foreach ($ensureOption in @('Present', 'Absent')) + { + $case = @{ + CurrentName = $null + CurrentBandwidthReservationMode = $null + DesiredName = $desiredBrmMode + 'BRM' + DesiredBandwidthReservationMode = $desiredBrmMode + Ensure = $ensureOption + ExpectedResult = $ensureOption -eq 'Absent' + } + $testSetTestCases += $case + } + } + + Describe 'Validates Test-TargetResource Function' { + # Create an empty function to be able to mock the missing Hyper-V cmdlet + function Get-VMSwitch + { + + } + + <# + Mocks Get-VMSwitch and will return $global:mockedVMSwitch which is + a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName Get-VMSwitch -MockWith { + param ( + [string] + $ErrorAction + ) + + if ($ErrorAction -eq 'Stop' -and $global:mockedVMSwitch -eq $null) + { + throw [System.Management.Automation.ActionPreferenceStopException]'No switch can be found by given criteria.' + } + + return $global:mockedVMSwitch + } + + # Mocks Get-NetAdapter which returns a simplified network adapter + Mock -CommandName Get-NetAdapter -MockWith { + return [PSCustomObject]@{ + Name = 'SomeNIC' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver' + } + } + + # Mocks "Get-Module -Name Hyper-V" so that the DSC resource thinks the Hyper-V module is on the test system + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $true + } + + Mock -CommandName Get-OSVersion -MockWith { + return [Version]::Parse('6.3.9600') + } + + # Create all the test cases for Get-TargetResource + $getTestCases = @() + foreach ($brmMode in $BANDWIDTH_RESERVATION_MODES) + { + $getTestCases += @{ + CurrentName = $brmMode + 'BRM' + CurrentBandwidthReservationMode = $brmMode + } + } + + # Test Test-TargetResource with the test cases created above + It 'Current Name "<CurrentName>" | Current BandwidthReservationMode set to "<CurrentBandwidthReservationMode>" | Desired BandwidthReservationMode set to "<DesiredBandwidthReservationMode>" | Ensure "<Ensure>"' -TestCases $testSetTestCases { + param + ( + [Parameter()] + [string] + $CurrentName, + + [Parameter()] + [string] + $CurrentBandwidthReservationMode, + + [Parameter()] + [string] + $DesiredName, + + [Parameter()] + [string] + $DesiredBandwidthReservationMode, + + [Parameter()] + [string] + $Ensure, + + [Parameter()] + [bool] + $ExpectedResult + ) + + # Set the mocked VMSwitch to be returned from Get-VMSwitch if the switch exists + if ($CurrentName) + { + $global:mockedVMSwitch = New-MockedVMSwitch -Name $CurrentName -BandwidthReservationMode $CurrentBandwidthReservationMode -AllowManagementOS $true + } + + $targetResource = Test-TargetResource -Name $DesiredName -BandwidthReservationMode $DesiredBandwidthReservationMode -Type 'External' -NetAdapterName 'SomeNIC' -Ensure $Ensure -AllowManagementOS $true + $targetResource | Should Be $ExpectedResult + + Remove-Variable -Scope 'Global' -Name 'mockedVMSwitch' -ErrorAction 'SilentlyContinue' + } + + Mock -CommandName Get-OSVersion -MockWith { + return [Version]::Parse('6.1.7601') + } + + # Test Test-TargetResource when the version of Windows doesn't support BandwidthReservationMode + It 'Invalid Operating System Exception' { + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'BandwidthReservationModeError' ` + -ErrorMessage $LocalizedData.BandwidthReservationModeError + {Test-TargetResource -Name 'WeightBRM' -Type 'External' -NetAdapterName 'SomeNIC' -AllowManagementOS $true -BandwidthReservationMode 'Weight' -Ensure 'Present'} | Should Throw $errorRecord + } + + # Test Test-TargetResource when the version of Windows doesn't support BandwidthReservationMode and specifies NA for BandwidthReservationMode + It 'Simulates Windows Server 2008 R2 | Desired BandwidthReservationMode set to "NA" | Ensure Present | Expected Result is True' { + $global:mockedVMSwitch = New-MockedVMSwitch -Name 'SomeSwitch' -BandwidthReservationMode 'NA' -AllowManagementOS $true + $targetResource = Test-TargetResource -Name 'SomeSwitch' -BandwidthReservationMode 'NA' -Type 'External' -NetAdapterName 'SomeNIC' -Ensure 'Present' -AllowManagementOS $true + $targetResource | Should Be $true + } + + It 'Passes when "BandwidthReservationMode" does not match but is not specified (#48)' { + $global:mockedVMSwitch = New-MockedVMSwitch -Name 'SomeSwitch' -BandwidthReservationMode 'Absolute' + $targetResource = Test-TargetResource -Name 'SomeSwitch' -Type 'Internal' -Ensure 'Present' + $targetResource | Should Be $true + } + } + + Describe 'Validates Set-TargetResource Function' { + # Create empty functions to be able to mock the missing Hyper-V cmdlet + function Get-VMSwitch + { + + } + + function New-VMSwitch + { + + } + + function Remove-VMSwitch + { + + } + + function Set-VMSwitch + { + + } + + <# + Mocks Get-VMSwitch and will return $global:mockedVMSwitch which is + a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName Get-VMSwitch -MockWith { + param + ( + [string] + $Name, + + [string] + $SwitchType, + + [string] + $ErrorAction + ) + + if ($ErrorAction -eq 'Stop' -and $global:mockedVMSwitch -eq $null) + { + throw [System.Management.Automation.ActionPreferenceStopException]'No switch can be found by given criteria.' + } + + return $global:mockedVMSwitch + } + + <# + Mocks New-VMSwitch and will assign a mocked switch to $global:mockedVMSwitch. This returns $global:mockedVMSwitch + which is a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName New-VMSwitch -MockWith { + param + ( + [string] + $Name, + + [string] + $NetAdapterName, + + [string] + $MinimumBandwidthMode, + + [bool] + $AllowManagementOS + ) + + $global:mockedVMSwitch = New-MockedVMSwitch -Name $Name -BandwidthReservationMode $MinimumBandwidthMode -AllowManagementOS $AllowManagementOS + return $global:mockedVMSwitch + } + + <# + Mocks Set-VMSwitch and will modify $global:mockedVMSwitch which is + a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName Set-VMSwitch -MockWith { + param + ( + [bool] + $AllowManagementOS + ) + + if ($AllowManagementOS) + { + $global:mockedVMSwitch['AllowManagementOS'] = $AllowManagementOS + } + } + + <# + Mocks Remove-VMSwitch and will remove the variable $global:mockedVMSwitch which is + a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName Remove-VMSwitch -MockWith { + $global:mockedVMSwitch = $null + } + + # Mocks Get-NetAdapter which returns a simplified network adapter + Mock -CommandName Get-NetAdapter -MockWith { + return [PSCustomObject]@{ + Name = 'SomeNIC' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver' + } + } + + # Mocks "Get-Module -Name Hyper-V" so that the DSC resource thinks the Hyper-V module is on the test system + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $true + } + + Mock -CommandName Get-OSVersion -MockWith { + return [Version]::Parse('6.3.9600') + } + + # Create all the test cases for Get-TargetResource + $getTestCases = @() + foreach ($brmMode in $BANDWIDTH_RESERVATION_MODES) + { + $getTestCases += @{ + CurrentName = $brmMode + 'BRM' + CurrentBandwidthReservationMode = $brmMode + } + } + + It 'Current Name "<CurrentName>" | Current BandwidthReservationMode set to "<CurrentBandwidthReservationMode>" | Desired BandwidthReservationMode set to "<DesiredBandwidthReservationMode>" | Ensure "<Ensure>"' -TestCases $testSetTestCases { + param + ( + [Parameter()] + [string] + $CurrentName, + + [Parameter()] + [string] + $CurrentBandwidthReservationMode, + + [Parameter()] + [string] + $DesiredName, + + [Parameter()] + [string] + $DesiredBandwidthReservationMode, + + [Parameter()] + [string] + $Ensure, + + [Parameter()] + [bool] + $ExpectedResult + ) + + # Set the mocked VMSwitch to be returned from Get-VMSwitch if the switch exists + if ($CurrentName) + { + $global:mockedVMSwitch = New-MockedVMSwitch -Name $CurrentName -BandwidthReservationMode $CurrentBandwidthReservationMode -AllowManagementOS $true + } + + $targetResource = Set-TargetResource -Name $DesiredName -BandwidthReservationMode $DesiredBandwidthReservationMode -Type 'External' -NetAdapterName 'SomeNIC' -Ensure $Ensure -AllowManagementOS $true + $targetResource | Should Be $null + + if ($CurrentName -and $Ensure -eq 'Present') + { + if ($DesiredBandwidthReservationMode -ne $CurrentBandwidthReservationMode) + { + Assert-MockCalled -CommandName Get-VMSwitch -Times 2 -Scope 'It' + Assert-MockCalled -CommandName Remove-VMSwitch -Times 1 -Scope 'It' + Assert-MockCalled -CommandName New-VMSwitch -Times 1 -Scope 'It' + Assert-MockCalled -CommandName Set-VMSwitch -Times 0 -Scope 'It' + } + else + { + Assert-MockCalled -CommandName Get-VMSwitch -Times 1 -Scope 'It' + } + } + elseif ($Ensure -eq 'Present') + { + Assert-MockCalled -CommandName Get-VMSwitch -Times 1 -Scope 'It' + Assert-MockCalled -CommandName New-VMSwitch -Times 1 -Scope 'It' + } + else + { + Assert-MockCalled -CommandName Get-VMSwitch -Times 1 -Scope 'It' + Assert-MockCalled -CommandName Remove-VMSwitch -Times 1 -Scope 'It' + } + Remove-Variable -Scope 'Global' -Name 'mockedVMSwitch' -ErrorAction 'SilentlyContinue' + } + + # Test Set-TargetResource when the version of Windows doesn't support BandwidthReservationMode + It 'Invalid Operating System Exception' { + Mock -CommandName Get-OSVersion -MockWith { + return [Version]::Parse('6.1.7601') + } + + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'BandwidthReservationModeError' ` + -ErrorMessage $LocalizedData.BandwidthReservationModeError + {Set-TargetResource -Name 'WeightBRM' -Type 'External' -NetAdapterName 'SomeNIC' -AllowManagementOS $true -BandwidthReservationMode 'Weight' -Ensure 'Present'} | Should Throw $errorRecord + } + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_EnableEmbeddedTeaming.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_EnableEmbeddedTeaming.Tests.ps1 new file mode 100644 index 0000000..205f8ed --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_EnableEmbeddedTeaming.Tests.ps1 @@ -0,0 +1,550 @@ +#region HEADER + +# Unit Test Template Version: 1.2.0 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone', 'https://github.com/PowerShell/DscResource.Tests.git', (Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName 'xHyper-V' ` + -DSCResourceName 'MSFT_xVMSwitch' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup +{ + +} + +function Invoke-TestCleanup +{ + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope 'MSFT_xVMSwitch' { + # Function to create a exception object for testing output exceptions + function Get-InvalidArgumentError + { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorMessage + ) + + $exception = New-Object -TypeName System.ArgumentException ` + -ArgumentList $ErrorMessage + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + return $errorRecord + } # end function Get-InvalidArgumentError + + # A helper function to mock a VMSwitch + function New-MockedVMSwitch + { + param ( + [Parameter(Mandatory = $true)] + [string] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Default', 'Weight', 'Absolute', 'None', 'NA')] + [string] + $BandwidthReservationMode, + + [parameter()] + [ValidateSet('Dynamic','HyperVPort')] + [String] + $LoadBalancingAlgorithm, + + [Parameter()] + [bool] + $AllowManagementOS = $false + ) + + $mockedVMSwitch = @{ + Name = $Name + SwitchType = 'External' + AllowManagementOS = $AllowManagementOS + NetAdapterInterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver' + } + + if ($BandwidthReservationMode -ne 'NA') + { + $mockedVMSwitch['BandwidthReservationMode'] = $BandwidthReservationMode + } + + if($PSBoundParameters.ContainsKey('LoadBalancingAlgorithm')) + { + $mockedVMSwitch['LoadBalancingAlgorithm'] = $LoadBalancingAlgorithm + } + + return [PsObject]$mockedVMSwitch + } + + Describe "MSFT_xVMSwitch" { + # Create empty functions to be able to mock the missing Hyper-V cmdlet + function Get-VMSwitch + { + + } + + function New-VMSwitch + { + + } + + function Set-VMSwitch + { + + } + + function Remove-VMSwitch + { + + } + + function Get-VMSwitchTeam + { + + } + + function Set-VMSwitchTeam + { + + } + + <# + Mocks Get-VMSwitch and will return $global:mockedVMSwitch which is + a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName Get-VMSwitch -MockWith { + param + ( + [string] + $Name, + + [string] + $SwitchType, + + [string] + $ErrorAction + ) + + if ($ErrorAction -eq 'Stop' -and $global:mockedVMSwitch -eq $null) + { + throw [System.Management.Automation.ActionPreferenceStopException]'No switch can be found by given criteria.' + } + + return $global:mockedVMSwitch + } + + <# + Mocks New-VMSwitch and will assign a mocked switch to $global:mockedVMSwitch. This returns $global:mockedVMSwitch + which is a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName New-VMSwitch -MockWith { + param + ( + [string] + $Name, + + [string[]] + $NetAdapterName, + + [string] + $MinimumBandwidthMode = 'NA', + + [bool] + $EnableEmbeddedTeaming, + + [bool] + $AllowManagementOS + ) + + $global:mockedVMSwitch = New-MockedVMSwitch -Name $Name -BandwidthReservationMode $MinimumBandwidthMode -AllowManagementOS $AllowManagementOS + #is SET is enabled mok a VMSwitchTeam + if($EnableEmbeddedTeaming){ + $global:mockedVMSwitchTeam = [PSCustomObject]@{ + Name = "TestSwitch" + Id = [Guid]::NewGuid() + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'Dynamic' + } + } + return $global:mockedVMSwitch + } + + Mock -CommandName Get-OSVersion -MockWith { + return @{ + Major = 10 + } + } + + <# + Mocks Set-VMSwitch and will modify $global:mockedVMSwitch which is + a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName Set-VMSwitch -MockWith { + param + ( + [bool] + $AllowManagementOS + ) + + if ($AllowManagementOS) + { + $global:mockedVMSwitch['AllowManagementOS'] = $AllowManagementOS + } + } + + <# + Mocks Remove-VMSwitch and will remove the variable $global:mockedVMSwitch which is + a variable that is created during most It statements to mock a VMSwitch + #> + Mock -CommandName Remove-VMSwitch -MockWith { + $global:mockedVMSwitch = $null + } + + <# + Mocks Get-VMSwitchTeam and will return a moked VMSwitchTeam + #> + Mock -CommandName Get-VMSwitchTeam -MockWith { + return $global:mockedVMSwitchTeam + } + + <# + Mocks Set-VMSwitchTeam and will return a moked VMSwitchTeam + #> + Mock -CommandName Set-VMSwitchTeam -MockWith { + param + ( + [parameter(Mandatory=$true)] + [ValidateSet('Dynamic','HyperVPort')] + [String] + $LoadBalancingAlgorithm, + + [String] + $Name + ) + + $global:mockedVMSwitchTeam.LoadBalancingAlgorithm = $LoadBalancingAlgorithm + } + + # Mocks Get-NetAdapter which returns a simplified network adapter + Mock -CommandName Get-NetAdapter -MockWith { + return @( + [PSCustomObject]@{ + Name = 'NIC1' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver #1' + } + [PSCustomObject]@{ + Name = 'NIC2' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver #2' + } + ) + } + + # Mocks "Get-Module -Name Hyper-V" so that the DSC resource thinks the Hyper-V module is on the test system + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $true + } + + Context "A virtual switch with embedded teaming does not exist but should" { + $global:mockedVMSwitch = $null + + $testParams = @{ + Name = "TestSwitch" + Type = "External" + NetAdapterName = @("NIC1", "NIC2") + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + BandwidthReservationMode = "NA" + Ensure = "Present" + } + + It "Should return absent in the get method" { + (Get-TargetResource -Name $testParams.Name -Type $testParams.Type).Ensure | Should Be "Absent" + } + + It "Should return false in the test method" { + Test-TargetResource @testParams | Should Be $false + } + + It "Should run the set method without exceptions" { + Set-TargetResource @testParams + Assert-MockCalled -CommandName "New-VMSwitch" -Times 1 + } + } + + Context "A virtual switch with embedded teaming exists and should" { + $global:mockedVMSwitch = @{ + Name = "TestSwitch" + SwitchType = "External" + AllowManagementOS = $true + EmbeddedTeamingEnabled = $true + Id = [Guid]::NewGuid() + NetAdapterInterfaceDescriptions = @("Microsoft Network Adapter Multiplexor Driver #1", "Microsoft Network Adapter Multiplexor Driver #2") + } + + $testParams = @{ + Name = "TestSwitch" + Type = "External" + NetAdapterName = @("NIC1", "NIC2") + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + BandwidthReservationMode = "NA" + Ensure = "Present" + } + + It "Should return present in the get method" { + (Get-TargetResource -Name $testParams.Name -Type $testParams.Type).Ensure | Should Be "Present" + } + + It "Should return true in the test method" { + Test-TargetResource @testParams | Should Be $true + } + } + + Context "A virtual switch with embedded teaming exists but does not refer to the correct adapters" { + $global:mockedVMSwitch = @{ + Name = "TestSwitch" + SwitchType = "External" + AllowManagementOS = $true + EmbeddedTeamingEnabled = $true + Id = [Guid]::NewGuid() + NetAdapterInterfaceDescriptions = @("Wrong adapter", "Microsoft Network Adapter Multiplexor Driver #2") + } + + Mock -CommandName Get-NetAdapter -MockWith { + return @( + [PSCustomObject]@{ + Name = 'WrongNic' + InterfaceDescription = 'Wrong adapter' + } + [PSCustomObject]@{ + Name = 'NIC2' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver #2' + } + ) + } + + $testParams = @{ + Name = "TestSwitch" + Type = "External" + NetAdapterName = @("NIC1", "NIC2") + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + BandwidthReservationMode = "NA" + Ensure = "Present" + } + + It "Should return present in the get method" { + (Get-TargetResource -Name $testParams.Name -Type $testParams.Type).Ensure | Should Be "Present" + } + + It "Should return false in the test method" { + Test-TargetResource @testParams | Should Be $false + } + + It "Should run the set method without exceptions" { + Set-TargetResource @testParams + Assert-MockCalled -CommandName "Remove-VMSwitch" -Times 1 + Assert-MockCalled -CommandName "New-VMSwitch" -Times 1 + } + } + + Context "A virtual switch with embedded teaming exists but does not use the correct LB algorithm" { + $global:mockedVMSwitch = @{ + Name = "TestSwitch" + SwitchType = "External" + AllowManagementOS = $true + EmbeddedTeamingEnabled = $true + LoadBalancingAlgorithm = 'Dynamic' + Id = [Guid]::NewGuid() + NetAdapterInterfaceDescriptions = @("Microsoft Network Adapter Multiplexor Driver #1", "Microsoft Network Adapter Multiplexor Driver #2") + } + + Mock -CommandName Get-NetAdapter -MockWith { + return @( + [PSCustomObject]@{ + Name = 'NIC01' + InterfaceDescription = "Microsoft Network Adapter Multiplexor Driver #1" + } + [PSCustomObject]@{ + Name = 'NIC2' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver #2' + } + ) + } + + $testParams = @{ + Name = "TestSwitch" + Type = "External" + NetAdapterName = @("NIC1", "NIC2") + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + LoadBalancingAlgorithm = 'HyperVPort' + Ensure = "Present" + } + + It "Should return present in the get method" { + (Get-TargetResource -Name $testParams.Name -Type $testParams.Type).Ensure | Should Be "Present" + } + + It "Should return false in the test method" { + Test-TargetResource @testParams | Should Be $false + } + + It "Should run the set method without exceptions" { + Set-TargetResource @testParams + Assert-MockCalled -CommandName "Remove-VMSwitch" -Times 1 + Assert-MockCalled -CommandName "New-VMSwitch" -Times 1 + } + } + + Context "A virtual switch without embedded teaming exists but should use embedded teaming" { + $global:mockedVMSwitch = @{ + Name = "TestSwitch" + SwitchType = "External" + AllowManagementOS = $true + EmbeddedTeamingEnabled = $false + Id = [Guid]::NewGuid() + NetAdapterInterfaceDescription = "Microsoft Network Adapter Multiplexor Driver #1" + } + + $testParams = @{ + Name = "TestSwitch" + Type = "External" + NetAdapterName = @("NIC1", "NIC2") + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + BandwidthReservationMode = "NA" + Ensure = "Present" + } + + It "Should return present in the get method" { + (Get-TargetResource -Name $testParams.Name -Type $testParams.Type).Ensure | Should Be "Present" + } + + It "Should return false in the test method" { + Test-TargetResource @testParams | Should Be $false + } + + It "Should run the set method without exceptions" { + Set-TargetResource @testParams + Assert-MockCalled -CommandName "Remove-VMSwitch" -Times 1 + Assert-MockCalled -CommandName "New-VMSwitch" -Times 1 + } + } + + Context "A virtual switch with embedded teaming exists but shouldn't" { + $global:mockedVMSwitch = @{ + Name = "TestSwitch" + SwitchType = "External" + AllowManagementOS = $true + EmbeddedTeamingEnabled = $true + Id = [Guid]::NewGuid() + NetAdapterInterfaceDescriptions = @("Microsoft Network Adapter Multiplexor Driver #1", "Microsoft Network Adapter Multiplexor Driver #2") + } + + $testParams = @{ + Name = "TestSwitch" + Type = "Internal" + Ensure = "Absent" + } + + It "Should return present in the get method" { + (Get-TargetResource -Name $testParams.Name -Type $testParams.Type).Ensure | Should Be "Present" + } + + It "Should return false in the test method" { + Test-TargetResource @testParams | Should Be $false + } + + It "Should run the set method without exceptions" { + Set-TargetResource @testParams + Assert-MockCalled -CommandName "Remove-VMSwitch" -Times 1 + } + } + + Context "A virtual switch with embedded teaming does not exist and shouldn't" { + $global:mockedVMSwitch = $null + + $testParams = @{ + Name = "TestSwitch" + Type = "Internal" + Ensure = "Absent" + } + + It "Should return absent in the get method" { + (Get-TargetResource -Name $testParams.Name -Type $testParams.Type).Ensure | Should Be "Absent" + } + + It "Should return true in the test method" { + Test-TargetResource @testParams | Should Be $true + } + } + + Context "A server is not running Server 2016 and attempts to use embedded teaming" { + $global:mockedVMSwitch = $null + + $testParams = @{ + Name = "TestSwitch" + Type = "External" + NetAdapterName = @("NIC1", "NIC2") + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + BandwidthReservationMode = "NA" + Ensure = "Present" + } + + Mock -CommandName Get-OSVersion -MockWith { + return [Version]::Parse('6.3.9600') + } + + It "Should return absent in the get method" { + (Get-TargetResource -Name $testParams.Name -Type $testParams.Type).Ensure | Should Be "Absent" + } + + It "Should throw an error in the test method" { + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'SETServer2016Error' ` + -ErrorMessage $LocalizedData.SETServer2016Error + + {Test-TargetResource @testParams} | Should Throw $errorRecord + } + + It "Should throw an error in the set method" { + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'SETServer2016Error' ` + -ErrorMessage $LocalizedData.SETServer2016Error + + {Set-TargetResource @testParams} | Should Throw $errorRecord + } + } + } + } +} +finally { + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_Id.Tests.ps1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_Id.Tests.ps1 new file mode 100644 index 0000000..32980a4 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/Tests/Unit/MSFT_xVMSwitch_Id.Tests.ps1 @@ -0,0 +1,421 @@ + +#region HEADER +$script:DSCModuleName = 'xHyper-V' +$script:DSCResourceName = 'MSFT_xVMSwitch' + +# Unit Test Template Version: 1.2.4 +$script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) +if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or ` + (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) ) +{ + & git @('clone', 'https://github.com/PowerShell/DscResource.Tests.git', (Join-Path -Path $script:moduleRoot -ChildPath 'DscResource.Tests')) +} + +Import-Module -Name (Join-Path -Path $script:moduleRoot -ChildPath (Join-Path -Path 'DSCResource.Tests' -ChildPath 'TestHelper.psm1')) -Force + +$TestEnvironment = Initialize-TestEnvironment ` + -DSCModuleName $script:DSCModuleName ` + -DSCResourceName $script:DSCResourceName ` + -ResourceType 'Mof' ` + -TestType Unit + +#endregion HEADER + +function Invoke-TestSetup +{ +} + +function Invoke-TestCleanup +{ + Restore-TestEnvironment -TestEnvironment $TestEnvironment +} + +# Begin Testing +try +{ + Invoke-TestSetup + + InModuleScope $script:DSCResourceName { + + # A helper function to create a exception object for testing output exceptions + function Get-InvalidArgumentError + { + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorMessage + ) + + $exception = New-Object -TypeName System.ArgumentException ` + -ArgumentList $ErrorMessage + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidArgument + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + return $errorRecord + } + + # A helper function to mock a VMSwitch + function New-MockedVMSwitch + { + param ( + [Parameter(Mandatory = $true)] + [String] + $Name, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [Guid] + $Id + ) + + $mockedVMSwitch = @{ + Name = $Name + SwitchType = 'External' + AllowManagementOS = $true + EmbeddedTeamingEnabled = $true + LoadBalancingAlgorithm = 'HyperVPort' + BandwidthReservationMode = 'Default' + NetAdapterInterfaceDescriptions = @("Microsoft Network Adapter Multiplexor Driver #1", "Microsoft Network Adapter Multiplexor Driver #2") + } + + if ($PSBoundParameters.ContainsKey('Id')) + { + $mockedVMSwitch['Id'] = $Id + } + else + { + $mockedVMSwitch['Id'] = New-Guid + } + return [PsObject]$mockedVMSwitch + } + + # Mocks "Get-Module -Name Hyper-V" so that the DSC resource thinks the Hyper-V module is on the test system + Mock -CommandName Get-Module -ParameterFilter { ($Name -eq 'Hyper-V') -and ($ListAvailable -eq $true) } -MockWith { + return $true + } + + function Get-VMSwitch + { + } + Mock -CommandName Get-VMSwitch -MockWith { + return $Global:MockedVMSwitch + } + + function Get-NetAdapter + { + } + Mock -CommandName Get-NetAdapter -MockWith { + return @( + [PSCustomObject]@{ + Name = 'NIC1' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver #1' + } + [PSCustomObject]@{ + Name = 'NIC2' + InterfaceDescription = 'Microsoft Network Adapter Multiplexor Driver #2' + } + ) + } + + function Get-VMSwitchTeam + { + } + Mock -CommandName Get-VMSwitchTeam -MockWith { + return [PSCustomObject]@{ + Name = 'TestTeam' + Id = New-Guid + NetAdapterInterfaceDescription = @("Microsoft Network Adapter Multiplexor Driver #1", "Microsoft Network Adapter Multiplexor Driver #2") + TeamingMode = 'SwitchIndependent' + LoadBalancingAlgorithm = 'HyperVPort' + } + } + + function Remove-VMSwitch {} + Mock -CommandName Remove-VMSwitch -MockWith { + $Global:mockedVMSwitch = $null + } + + function New-VMSwitch {} + Mock -CommandName New-VMSwitch -MockWith { + Param( + [Parameter()] + [String] + $Name, + + [Parameter()] + [String[]] + $NetAdapterName, + + [Parameter()] + [String] + $MinimumBandwidthMode, + + [Parameter()] + [bool] + $AllowManagementOS, + + [Parameter()] + [String] + $SwitchType, + + [Parameter()] + [bool] + $EnableEmbeddedTeaming, + + [Parameter()] + [Guid] + $Id + ) + + if($PSBoundParameters.ContainsKey('Id')) + { + $Global:MockedVMSwitch = New-MockedVMSwitch -Name $Name -Id $id + } + else + { + $Global:MockedVMSwitch = New-MockedVMSwitch -Name $Name + } + } + + function Get-OSVersion + { + } + Mock -CommandName Get-OSVersion -MockWith { + [PSCustomObject]@{ + Major = 10 + Minor = 0 + Build = 14393 + Revision = 0 + MajorRevision = 0 + MinorRevision = 0 + } + } + + Describe 'MSFT_xVMSwitch\Get-TargetResource' -Tag 'Get' { + + Context 'When the system is in the desired state (VMSwitch has the desired Id)' { + $Global:MockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' + + It 'Should return "present"' { + (Get-TargetResource -Name 'TestSwitch' -Type 'External').Ensure | Should Be 'Present' + Assert-MockCalled -CommandName "Get-VMSwitch" -Times 1 + Assert-MockCalled -CommandName "Get-VMSwitchTeam" -Times 1 + } + } + + Context 'When the system is not in the desired state (VMSwitch has not the desired Id)' { + + $Global:mockedVMSwitch = $null + + It 'Should return "absent"' { + (Get-TargetResource -Name 'TestSwitch' -Type 'External').Ensure | Should Be 'Absent' + Assert-MockCalled -CommandName "Get-VMSwitch" -Times 1 + Assert-MockCalled -CommandName "Get-VMSwitchTeam" -Times 0 + } + } + } + + Describe 'MSFT_xVMSwitch\Set-TargetResource' -Tag 'Set' { + + Context 'When the system is in the desired state (VMSwitch has the desired Id)' { + $desiredVMSwitchID = New-Guid + + $Global:mockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' -Id $desiredVMSwitchID + + $testParams = @{ + Name = 'TestSwitch' + Type = 'External' + NetAdapterName = @('NIC1', 'NIC2') + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + Ensure = 'Present' + Id = $desiredVMSwitchID + } + + It 'Should run without without exceptions' { + {Set-TargetResource @testParams} | Should -Not -Throw + Assert-MockCalled -CommandName "Get-VMSwitch" -Times 1 + Assert-MockCalled -CommandName 'Get-NetAdapter' -Times 1 + } + } + + Context 'When the system is not in the desired state (VMSwitch has not the desired Id)' { + + $Global:mockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' + + $testParams = @{ + Name = 'TestSwitch' + Type = 'External' + NetAdapterName = @('NIC1', 'NIC2') + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + Ensure = 'Present' + Id = New-Guid + } + + It 'Should run without exception while re-creating the VMSwitch' { + {Set-TargetResource @testParams} | Should -Not -Throw + Assert-MockCalled -CommandName "Get-VMSwitch" -Times 1 + Assert-MockCalled -CommandName 'Get-NetAdapter' -Times 1 + Assert-MockCalled -CommandName 'Remove-VMSwitch' -Times 1 + Assert-MockCalled -CommandName 'New-VMSwitch' -Times 1 + } + } + + Context 'When the specified value for Id parameter is not a GUID' { + + $Global:mockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' + + $testParams = @{ + Name = 'TestSwitch' + Type = 'External' + NetAdapterName = @('NIC1', 'NIC2') + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + Ensure = 'Present' + Id = '123' + } + + It 'Should throw "The VMSwitch Id must be in GUID format!"' { + {Set-TargetResource @testParams} | Should -Throw 'The VMSwitch Id must be in GUID format!' + } + } + + Context 'When the system is not running Server 2016' { + + $desiredVMSwitchID = New-Guid + + $Global:mockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' -Id $desiredVMSwitchID + + $testParams = @{ + Name = 'TestSwitch' + Type = 'External' + NetAdapterName = 'NIC1' + AllowManagementOS = $true + EnableEmbeddedTeaming = $false + Ensure = 'Present' + Id = $desiredVMSwitchID + } + + Mock -CommandName Get-OSVersion -MockWith { + return [Version]::Parse('6.3.9600') + } + + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'VMSwitchIDServer2016Error' ` + -ErrorMessage $LocalizedData.VMSwitchIDServer2016Error + + It 'Should throw "VMSwitchIDServer2016Error"' { + {Set-TargetResource @testParams} | Should -Throw $errorRecord + } + } + } + + Describe 'MSFT_xVMSwitch\Test-TargetResource' -Tag 'Test' { + Context 'When the system is in the desired state (VMSwitch has the desired Id)' { + + $desiredVMSwitchID = New-Guid + + $Global:mockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' -Id $desiredVMSwitchID + + $testParams = @{ + Name = 'TestSwitch' + Type = 'External' + NetAdapterName = @('NIC1', 'NIC2') + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + Ensure = 'Present' + Id = $desiredVMSwitchID + } + + It 'Should return $true' { + {Test-TargetResource @testParams} | Should -Not -Throw + Assert-MockCalled -CommandName "Get-VMSwitch" -Times 1 + Assert-MockCalled -CommandName 'Get-NetAdapter' -Times 1 + } + } + + Context 'When the system is not in the desired state (VMSwitch has not the desired Id)' { + + $Global:mockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' + + $testParams = @{ + Name = 'TestSwitch' + Type = 'External' + NetAdapterName = @('NIC1', 'NIC2') + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + Ensure = 'Present' + Id = New-Guid + } + + It 'Should return $false' { + {Test-TargetResource @testParams} | Should -Not -Throw + Assert-MockCalled -CommandName "Get-VMSwitch" -Times 1 + Assert-MockCalled -CommandName 'Get-NetAdapter' -Times 1 + } + } + + Context 'When the specified value for Id parameter is not a GUID' { + + $Global:mockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' + + $testParams = @{ + Name = 'TestSwitch' + Type = 'External' + NetAdapterName = @('NIC1', 'NIC2') + AllowManagementOS = $true + EnableEmbeddedTeaming = $true + Ensure = 'Present' + Id = '123' + } + + It 'Should throw "The VMSwitch Id must be in GUID format!"' { + {Test-TargetResource @testParams} | Should -Throw 'The VMSwitch Id must be in GUID format!' + } + } + + Context 'When the system is not running Server 2016' { + + $desiredVMSwitchID = New-Guid + + $Global:mockedVMSwitch = New-MockedVMSwitch -Name 'TestSwitch' -Id $desiredVMSwitchID + + $testParams = @{ + Name = 'TestSwitch' + Type = 'External' + NetAdapterName = 'NIC1' + AllowManagementOS = $true + EnableEmbeddedTeaming = $false + Ensure = 'Present' + Id = $desiredVMSwitchID + } + + Mock -CommandName Get-OSVersion -MockWith { + return [Version]::Parse('6.3.9600') + } + + $errorRecord = Get-InvalidArgumentError ` + -ErrorId 'VMSwitchIDServer2016Error' ` + -ErrorMessage $LocalizedData.VMSwitchIDServer2016Error + + It 'Should throw "VMSwitchIDServer2016Error"' { + {Test-TargetResource @testParams} | Should -Throw $errorRecord + } + } + + } + } +} +finally +{ + Invoke-TestCleanup +} diff --git a/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/xHyper-V.psd1 b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/xHyper-V.psd1 new file mode 100644 index 0000000..e4809a6 --- /dev/null +++ b/deployment/dsc/azshcihost/xHyper-V/3.17.0.0/xHyper-V.psd1 @@ -0,0 +1,75 @@ +@{ +# Version number of this module. +moduleVersion = '3.17.0.0' + +# ID used to uniquely identify this module +GUID = 'f5a5f169-7026-4053-932a-19a7c37b1ca5' + +# Author of this module +Author = 'Microsoft Corporation' + +# Company or vendor of this module +CompanyName = 'Microsoft Corporation' + +# Copyright statement for this module +Copyright = '(c) 2017 Microsoft Corporation. All rights reserved.' + +# Description of the functionality provided by this module +Description = 'Module with DSC Resources for Hyper-V area' + +# Minimum version of the Windows PowerShell engine required by this module +PowerShellVersion = '4.0' + +# Minimum version of the common language runtime (CLR) required by this module +CLRVersion = '4.0' + +# Functions to export from this module +FunctionsToExport = '*' + +# Cmdlets to export from this module +CmdletsToExport = '*' + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/PowerShell/xHyper-V/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/PowerShell/xHyper-V' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + ReleaseNotes = '* MSFT_xVMNetworkAdapter: + * Added NetworkSettings to be able to statically set IPAddress. + * Added option for Vlan tagging. You can now setup a Network Adapeter as an access switch on a specific Vlan. + +' + + } # End of PSData hashtable + +} # End of PrivateData hashtable +} + + + + + + + + + + + + + + + + diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/DSC_xArchive.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/DSC_xArchive.psm1 new file mode 100644 index 0000000..53199d4 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/DSC_xArchive.psm1 @@ -0,0 +1,1712 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xArchive' + +Add-Type -AssemblyName 'System.IO.Compression' + +# This resource has not yet been tested on a Nano server. +if (-not (Test-IsNanoServer)) +{ + Add-Type -AssemblyName 'System.IO.Compression.FileSystem' +} + +<# + .SYNOPSIS + Retrieves the current state of the archive resource with the specified path and + destination. + + The returned object provides the following properties: + Path: The specified path. + Destination: The specified destination. + Ensure: Present if the archive at the specified path is expanded at the specified + destination. Absent if the archive at the specified path is not expanded at the + specified destination. + + .PARAMETER Path + The path to the archive file that should or should not be expanded at the specified + destination. + + .PARAMETER Destination + The path where the archive file should or should not be expanded. + + .PARAMETER Validate + Specifies whether or not to validate that a file at the destination with the same name as a + file in the archive actually matches that corresponding file in the archive by the + specified checksum method. + + If a file does not match it will be considered not present. + + The default value is false. + + .PARAMETER Checksum + The Checksum method to use to validate whether or not a file at the destination with the + same name as a file in the archive actually matches that corresponding file in the archive. + + An invalid argument exception will be thrown if Checksum is specified while Validate is + specified as false. + + ModifiedDate will check that the LastWriteTime property of the file at the destination + matches the LastWriteTime property of the file in the archive. + CreatedDate will check that the CreationTime property of the file at the destination + matches the CreationTime property of the file in the archive. + SHA-1, SHA-256, and SHA-512 will check that the hash of the file at the destination by the + specified SHA method matches the hash of the file in the archive by the specified SHA + method. + + The default value is ModifiedDate. + + .PARAMETER Credential + The credential of a user account with permissions to access the specified archive path and + destination if needed. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Destination, + + [Parameter()] + [System.Boolean] + $Validate = $false, + + [Parameter()] + [ValidateSet('SHA-1', 'SHA-256', 'SHA-512', 'CreatedDate', 'ModifiedDate')] + [System.String] + $Checksum = 'ModifiedDate', + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + if ($PSBoundParameters.ContainsKey('Checksum') -and -not $Validate) + { + $errorMessage = $script:localizedData.ChecksumSpecifiedAndValidateFalse -f $Checksum, $Path, $Destination + New-InvalidArgumentException -ArgumentName 'Checksum or Validate' -Message $errorMessage + } + + $archiveState = @{ + Path = $Path + Destination = $Destination + } + + # In case an error occurs, we assume that the archive is not expanded at the destination + $archiveExpandedAtDestination = $false + + $psDrive = $null + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $psDrive = Mount-PSDriveWithCredential -Path $Path -Credential $Credential + } + + try + { + Assert-PathExistsAsLeaf -Path $Path + Assert-DestinationDoesNotExistAsFile -Destination $Destination + + Write-Verbose -Message ($script:localizedData.RetrievingArchiveState -f $Path, $Destination) + + $testArchiveExistsAtDestinationParameters = @{ + ArchiveSourcePath = $Path + Destination = $Destination + } + + if ($Validate) + { + $testArchiveExistsAtDestinationParameters['Checksum'] = $Checksum + } + + if (Test-Path -LiteralPath $Destination) + { + Write-Verbose -Message ($script:localizedData.DestinationExists -f $Destination) + + $archiveExpandedAtDestination = Test-ArchiveExistsAtDestination @testArchiveExistsAtDestinationParameters + } + else + { + Write-Verbose -Message ($script:localizedData.DestinationDoesNotExist -f $Destination) + } + } + finally + { + if ($null -ne $psDrive) + { + Write-Verbose -Message ($script:localizedData.RemovingPSDrive -f $psDrive.Root) + + $null = Remove-PSDrive -Name $psDrive -Force -ErrorAction 'SilentlyContinue' + } + } + + if ($archiveExpandedAtDestination) + { + $archiveState['Ensure'] = 'Present' + } + else + { + $archiveState['Ensure'] = 'Absent' + } + + return $archiveState +} + +<# + .SYNOPSIS + Expands the archive (.zip) file at the specified path to the specified destination or + removes the expanded archive (.zip) file at the specified path from the specified + destination. + + .PARAMETER Path + The path to the archive file that should be expanded to or removed from the specified + destination. + + .PARAMETER Destination + The path where the specified archive file should be expanded to or removed from. + + .PARAMETER Ensure + Specifies whether or not the expanded content of the archive file at the specified path + should exist at the specified destination. + + To update the specified destination to have the expanded content of the archive file at the + specified path, specify this property as Present. + To remove the expanded content of the archive file at the specified path from the specified + destination, specify this property as Absent. + + The default value is Present. + + .PARAMETER Validate + Specifies whether or not to validate that a file at the destination with the same name as a + file in the archive actually matches that corresponding file in the archive by the + specified checksum method. + + If the file does not match and Ensure is specified as Present and Force is not specified, + the resource will throw an error that the file at the destination cannot be overwritten. + If the file does not match and Ensure is specified as Present and Force is specified, the + file at the destination will be overwritten. + If the file does not match and Ensure is specified as Absent, the file at the destination + will not be removed. + + The default value is false. + + .PARAMETER Checksum + The Checksum method to use to validate whether or not a file at the destination with the + same name as a file in the archive actually matches that corresponding file in the archive. + + An invalid argument exception will be thrown if Checksum is specified while Validate is + specified as false. + + ModifiedDate will check that the LastWriteTime property of the file at the destination + matches the LastWriteTime property of the file in the archive. + CreatedDate will check that the CreationTime property of the file at the destination + matches the CreationTime property of the file in the archive. + SHA-1, SHA-256, and SHA-512 will check that the hash of the file at the destination by the + specified SHA method matches the hash of the file in the archive by the specified SHA + method. + + The default value is ModifiedDate. + + .PARAMETER Credential + The credential of a user account with permissions to access the specified archive path and + destination if needed. + + .PARAMETER Force + Specifies whether or not any existing files or directories at the destination with the same + name as a file or directory in the archive should be overwritten to match the file or + directory in the archive. + + When this property is false, an error will be thrown if an item at the destination needs to + be overwritten. + + The default value is false. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Destination, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $Validate = $false, + + [Parameter()] + [ValidateSet('SHA-1', 'SHA-256', 'SHA-512', 'CreatedDate', 'ModifiedDate')] + [System.String] + $Checksum = 'ModifiedDate', + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [System.Boolean] + $Force = $false + ) + + if ($PSBoundParameters.ContainsKey('Checksum') -and -not $Validate) + { + $errorMessage = $script:localizedData.ChecksumSpecifiedAndValidateFalse -f $Checksum, $Path, $Destination + New-InvalidArgumentException -ArgumentName 'Checksum or Validate' -Message $errorMessage + } + + $psDrive = $null + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $psDrive = Mount-PSDriveWithCredential -Path $Path -Credential $Credential + } + + try + { + Assert-PathExistsAsLeaf -Path $Path + Assert-DestinationDoesNotExistAsFile -Destination $Destination + + Write-Verbose -Message ($script:localizedData.SettingArchiveState -f $Path, $Destination) + + $expandArchiveToDestinationParameters = @{ + ArchiveSourcePath = $Path + Destination = $Destination + Force = $Force + } + + $removeArchiveFromDestinationParameters = @{ + ArchiveSourcePath = $Path + Destination = $Destination + } + + if ($Validate) + { + $expandArchiveToDestinationParameters['Checksum'] = $Checksum + $removeArchiveFromDestinationParameters['Checksum'] = $Checksum + } + + if (Test-Path -LiteralPath $Destination) + { + Write-Verbose -Message ($script:localizedData.DestinationExists -f $Destination) + + if ($Ensure -eq 'Present') + { + Expand-ArchiveToDestination @expandArchiveToDestinationParameters + } + else + { + Remove-ArchiveFromDestination @removeArchiveFromDestinationParameters + } + } + else + { + Write-Verbose -Message ($script:localizedData.DestinationDoesNotExist -f $Destination) + + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.CreatingDirectoryAtDestination -f $Destination) + + $null = New-Item -Path $Destination -ItemType 'Directory' + Expand-ArchiveToDestination @expandArchiveToDestinationParameters + } + } + + Write-Verbose -Message ($script:localizedData.ArchiveStateSet -f $Path, $Destination) + } + finally + { + if ($null -ne $psDrive) + { + Write-Verbose -Message ($script:localizedData.RemovingPSDrive -f $psDrive.Root) + + $null = Remove-PSDrive -Name $psDrive -Force -ErrorAction 'SilentlyContinue' + } + } +} + +<# + .SYNOPSIS + Tests whether or not the archive (.zip) file at the specified path is expanded at the + specified destination. + + .PARAMETER Path + The path to the archive file that should or should not be expanded at the specified + destination. + + .PARAMETER Destination + The path where the archive file should or should not be expanded. + + .PARAMETER Ensure + Specifies whether or not the archive file should be expanded to the specified destination. + + To test whether the archive file is expanded at the specified destination, specify this + property as Present. + To test whether the archive file is not expanded at the specified destination, specify this + property as Absent. + + The default value is Present. + + .PARAMETER Validate + Specifies whether or not to validate that a file at the destination with the same name as a + file in the archive actually matches that corresponding file in the archive by the + specified checksum method. + + If a file does not match it will be considered not present. + + The default value is false. + + .PARAMETER Checksum + The Checksum method to use to validate whether or not a file at the destination with the + same name as a file in the archive actually matches that corresponding file in the archive. + + An invalid argument exception will be thrown if Checksum is specified while Validate is + specified as false. + + ModifiedDate will check that the LastWriteTime property of the file at the destination + matches the LastWriteTime property of the file in the archive. + CreatedDate will check that the CreationTime property of the file at the destination + matches the CreationTime property of the file in the archive. + SHA-1, SHA-256, and SHA-512 will check that the hash of the file at the destination by the + specified SHA method matches the hash of the file in the archive by the specified SHA + method. + + The default value is ModifiedDate. + + .PARAMETER Credential + The credential of a user account with permissions to access the specified archive path and + destination if needed. + + .PARAMETER Force + Not used in Test-TargetResource. +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Destination, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $Validate = $false, + + [Parameter()] + [ValidateSet('SHA-1', 'SHA-256', 'SHA-512', 'CreatedDate', 'ModifiedDate')] + [System.String] + $Checksum = 'ModifiedDate', + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [System.Boolean] + $Force = $false + ) + + $getTargetResourceParameters = @{ + Path = $Path + Destination = $Destination + } + + $optionalGetTargetResourceParameters = @( 'Validate', 'Checksum', 'Credential' ) + + foreach ($optionalGetTargetResourceParameter in $optionalGetTargetResourceParameters) + { + if ($PSBoundParameters.ContainsKey($optionalGetTargetResourceParameter)) + { + $getTargetResourceParameters[$optionalGetTargetResourceParameter] = $PSBoundParameters[$optionalGetTargetResourceParameter] + } + } + + $archiveResourceState = Get-TargetResource @getTargetResourceParameters + + Write-Verbose -Message ($script:localizedData.TestingArchiveState -f $Path, $Destination) + + $archiveInDesiredState = $archiveResourceState.Ensure -ieq $Ensure + + return $archiveInDesiredState +} + +<# + .SYNOPSIS + Creates a new GUID. + This is a wrapper function for unit testing. +#> +function New-Guid +{ + [OutputType([System.Guid])] + [CmdletBinding()] + param () + + return [System.Guid]::NewGuid() +} + +<# + .SYNOPSIS + Invokes the cmdlet New-PSDrive with the specified parameters. + This is a wrapper function for unit testing due to a bug in Pester. + Issue has been filed here: https://github.com/pester/Pester/issues/728 + + .PARAMETER Parameters + A hashtable of parameters to splat to New-PSDrive. +#> +function Invoke-NewPSDrive +{ + [OutputType([System.Management.Automation.PSDriveInfo])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Collections.Hashtable] + $Parameters + ) + + return New-PSDrive @Parameters +} + +<# + .SYNOPSIS + Mounts a PSDrive to access the specified path with the permissions granted by the specified + credential. + + .PARAMETER Path + The path to which to mount a PSDrive. + + .PARAMETER Credential + The credential of the user account with permissions to access the specified path. +#> +function Mount-PSDriveWithCredential +{ + [OutputType([System.Management.Automation.PSDriveInfo])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $newPSDrive = $null + + if (Test-Path -LiteralPath $Path -ErrorAction 'SilentlyContinue') + { + Write-Verbose -Message ($script:localizedData.PathAccessiblePSDriveNotNeeded -f $Path) + } + else + { + $pathIsADirectory = $Path.EndsWith('\') + + if ($pathIsADirectory) + { + $pathToPSDriveRoot = $Path + } + else + { + $lastIndexOfBackslash = $Path.LastIndexOf('\') + $pathDoesNotContainADirectory = $lastIndexOfBackslash -eq -1 + + if ($pathDoesNotContainADirectory) + { + $errorMessage = $script:localizedData.PathDoesNotContainValidPSDriveRoot -f $Path + New-InvalidArgumentException -ArgumentName 'Path' -Message $errorMessage + } + else + { + $pathToPSDriveRoot = $Path.Substring(0, $lastIndexOfBackslash) + } + } + + $newPSDriveParameters = @{ + Name = New-Guid + PSProvider = 'FileSystem' + Root = $pathToPSDriveRoot + Scope = 'Script' + Credential = $Credential + } + + try + { + Write-Verbose -Message ($script:localizedData.CreatingPSDrive -f $pathToPSDriveRoot, $Credential.UserName) + $newPSDrive = Invoke-NewPSDrive -Parameters $newPSDriveParameters + } + catch + { + $errorMessage = $script:localizedData.ErrorCreatingPSDrive -f $pathToPSDriveRoot, $Credential.UserName + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + } + + return $newPSDrive +} + +<# + .SYNOPSIS + Throws an invalid argument exception if the specified path does not exist or is not a path + leaf. + + .PARAMETER Path + The path to assert. +#> +function Assert-PathExistsAsLeaf +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $pathExistsAsLeaf = Test-Path -LiteralPath $Path -PathType 'Leaf' -ErrorAction 'SilentlyContinue' + + if (-not $pathExistsAsLeaf) + { + $errorMessage = $script:localizedData.PathDoesNotExistAsLeaf -f $Path + New-InvalidArgumentException -ArgumentName 'Path' -Message $errorMessage + } +} + +<# + .SYNOPSIS + Throws an invalid argument exception if the specified destination path already exists as a + file. + + .PARAMETER Destination + The destination path to assert. +#> +function Assert-DestinationDoesNotExistAsFile +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Destination + ) + + $itemAtDestination = Get-Item -LiteralPath $Destination -ErrorAction 'SilentlyContinue' + + $itemAtDestinationExists = $null -ne $itemAtDestination + $itemAtDestinationIsFile = $itemAtDestination -is [System.IO.FileInfo] + + if ($itemAtDestinationExists -and $itemAtDestinationIsFile) + { + $errorMessage = $script:localizedData.DestinationExistsAsFile -f $Destination + New-InvalidArgumentException -ArgumentName 'Destination' -Message $errorMessage + } +} + +<# + .SYNOPSIS + Opens the archive at the given path. + This is a wrapper function for unit testing. + + .PARAMETER Path + The path to the archive to open. +#> +function Open-Archive +{ + [OutputType([System.IO.Compression.ZipArchive])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + Write-Verbose -Message ($script:localizedData.OpeningArchive -f $Path) + + try + { + $archive = [System.IO.Compression.ZipFile]::OpenRead($Path) + } + catch + { + $errorMessage = $script:localizedData.ErrorOpeningArchive -f $Path + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + + return $archive +} + +<# + .SYNOPSIS + Closes the specified archive. + This is a wrapper function for unit testing. + + .PARAMETER Archive + The archive to close. +#> +function Close-Archive +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Compression.ZipArchive] + $Archive + ) + + Write-Verbose -Message ($script:localizedData.ClosingArchive -f $Path) + $null = $Archive.Dispose() +} + +<# + .SYNOPSIS + Retrieves the archive entries from the specified archive. + This is a wrapper function for unit testing. + + .PARAMETER Archive + The archive of which to retrieve the archive entries. +#> +function Get-ArchiveEntries +{ + [OutputType([System.IO.Compression.ZipArchiveEntry[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Compression.ZipArchive] + $Archive + ) + + return $Archive.Entries +} + +<# + .SYNOPSIS + Retrieves the full name of the specified archive entry. + This is a wrapper function for unit testing. + + .PARAMETER ArchiveEntry + The archive entry to retrieve the full name of. +#> +function Get-ArchiveEntryFullName +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Compression.ZipArchiveEntry] + $ArchiveEntry + ) + + return $ArchiveEntry.FullName +} + +<# + .SYNOPSIS + Opens the specified archive entry. + This is a wrapper function for unit testing. + + .PARAMETER ArchiveEntry + The archive entry to open. +#> +function Open-ArchiveEntry +{ + [OutputType([System.IO.Stream])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Compression.ZipArchiveEntry] + $ArchiveEntry + ) + + Write-Verbose -Message ($script:localizedData.OpeningArchiveEntry -f $ArchiveEntry.FullName) + return $ArchiveEntry.Open() +} + +<# + .SYNOPSIS + Closes the specified stream. + This is a wrapper function for unit testing. + + .PARAMETER Stream + The stream to close. +#> +function Close-Stream +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Stream] + $Stream + ) + + $null = $Stream.Dispose() +} + +<# + .SYNOPSIS + Tests if the given checksum method name is the name of a SHA checksum method. + + .PARAMETER Checksum + The name of the checksum method to test. +#> +function Test-ChecksumIsSha +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Checksum + ) + + return ($Checksum.Length -ge 'SHA'.Length) -and ($Checksum.Substring(0, 3) -ieq 'SHA') +} + +<# + .SYNOPSIS + Converts the specified DSC hash algorithm name (with a hyphen) to a PowerShell hash + algorithm name (without a hyphen). The in-box PowerShell Get-FileHash cmdlet will only hash + algorithm names without hypens. + + .PARAMETER DscHashAlgorithmName + The DSC hash algorithm name to convert. +#> +function ConvertTo-PowerShellHashAlgorithmName +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DscHashAlgorithmName + ) + + return $DscHashAlgorithmName.Replace('-', '') +} + +<# + .SYNOPSIS + Tests if the hash of the specified file matches the hash of the specified archive entry + using the specified hash algorithm. + + .PARAMETER FilePath + The path to the file to test the hash of. + + .PARAMETER CacheEntry + The cache entry to test the hash of. + + .PARAMETER HashAlgorithmName + The name of the hash algorithm to use to retrieve the hashes of the file and archive entry. +#> +function Test-FileHashMatchesArchiveEntryHash +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $FilePath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Compression.ZipArchiveEntry] + $ArchiveEntry, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $HashAlgorithmName + ) + + $archiveEntryFullName = Get-ArchiveEntryFullName -ArchiveEntry $ArchiveEntry + + Write-Verbose -Message ($script:localizedData.ComparingHashes -f $FilePath, $archiveEntryFullName, $HashAlgorithmName) + + $fileHashMatchesArchiveEntryHash = $false + + $powerShellHashAlgorithmName = ConvertTo-PowerShellHashAlgorithmName -DscHashAlgorithmName $HashAlgorithmName + + $openStreams = @() + + try + { + $archiveEntryStream = Open-ArchiveEntry -ArchiveEntry $ArchiveEntry + $openStreams += $archiveEntryStream + + # The Open mode will open the file for reading without modifying the file + $fileStreamMode = [System.IO.FileMode]::Open + + $fileStream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList @( $FilePath, $fileStreamMode ) + $openStreams += $fileStream + + $fileHash = Get-FileHash -InputStream $fileStream -Algorithm $powerShellHashAlgorithmName + $archiveEntryHash = Get-FileHash -InputStream $archiveEntryStream -Algorithm $powerShellHashAlgorithmName + + $hashAlgorithmsMatch = $fileHash.Algorithm -eq $archiveEntryHash.Algorithm + $hashesMatch = $fileHash.Hash -eq $archiveEntryHash.Hash + + $fileHashMatchesArchiveEntryHash = $hashAlgorithmsMatch -and $hashesMatch + } + catch + { + $errorMessage = $script:localizedData.ErrorComparingHashes -f $FilePath, $archiveEntryFullName, $HashAlgorithmName + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + finally + { + foreach ($openStream in $openStreams) + { + Close-Stream -Stream $openStream + } + } + + return $fileHashMatchesArchiveEntryHash +} + +<# + .SYNOPSIS + Retrieves the timestamp of the specified file for the specified checksum method + and returns it as a checksum. + + .PARAMETER File + The file to retrieve the timestamp of. + + .PARAMETER Checksum + The checksum method to retrieve the timestamp checksum for. + + .NOTES + The returned string is file timestamp normalized to the format specified in + ConvertTo-CheckSumFromDateTime. +#> +function Get-ChecksumFromFileTimestamp +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.FileInfo] + $File, + + [Parameter(Mandatory = $true)] + [ValidateSet('CreatedDate', 'ModifiedDate')] + [System.String] + $Checksum + ) + + $timestamp = Get-TimestampForChecksum @PSBoundParameters + + return ConvertTo-ChecksumFromDateTime -Date $timestamp +} + +<# + .SYNOPSIS + Retrieves the timestamp of the specified file for the specified checksum method. + + .PARAMETER File + The file to retrieve the timestamp of. + + .PARAMETER Checksum + The checksum method to retrieve the timestamp for. +#> +function Get-TimestampForChecksum +{ + [OutputType([System.DateTime])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.FileInfo] + $File, + + [Parameter(Mandatory = $true)] + [ValidateSet('CreatedDate', 'ModifiedDate')] + [System.String] + $Checksum + ) + + if ($Checksum -ieq 'CreatedDate') + { + $relevantTimestamp = 'CreationTime' + } + elseif ($Checksum -ieq 'ModifiedDate') + { + $relevantTimestamp = 'LastWriteTime' + } + + return Get-TimestampFromFile -File $File -Timestamp $relevantTimestamp +} + +<# + .SYNOPSIS + Retrieves a timestamp of the specified file. + + .PARAMETER File + The file to retrieve the timestamp from. + + .PARAMETER Timestamp + The timestamp attribute to retrieve. +#> +function Get-TimestampFromFile +{ + [OutputType([System.Datetime])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.FileInfo] + $File, + + [Parameter(Mandatory = $true)] + [ValidateSet('CreationTime', 'LastWriteTime')] + [System.String] + $Timestamp + ) + + return $File.$Timestamp +} + +<# + .SYNOPSIS + Converts a datetime object into the format used for a + checksum. + + .PARAMETER Date + The date to use to generate the checksum. + + .NOTES + The returned date is normalized to the General (G) date format. + https://technet.microsoft.com/en-us/library/ee692801.aspx + + Because the General (G) is localization specific a non-localization + specific format such as ISO9660 could be used in future. +#> +function ConvertTo-ChecksumFromDateTime +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.DateTime] + $Date + ) + + return Get-Date -Date $Date -Format 'G' +} + +<# + .SYNOPSIS + Retrieves the last write time of the specified archive entry. + This is a wrapper function for unit testing. + + .PARAMETER ArchiveEntry + The archive entry to retrieve the last write time of. +#> +function Get-ArchiveEntryLastWriteTime +{ + [OutputType([System.DateTime])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Compression.ZipArchiveEntry] + $ArchiveEntry + ) + + return $ArchiveEntry.LastWriteTime.DateTime +} + +<# + .SYNOPSIS + Tests if the specified file matches the specified archive entry based on the specified + checksum method. + + .PARAMETER File + The file to test against the specified archive entry. + + .PARAMETER ArchiveEntry + The archive entry to test against the specified file. + + .PARAMETER Checksum + The checksum method to use to determine whether or not the specified file matches the + specified archive entry. +#> +function Test-FileMatchesArchiveEntryByChecksum +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.FileInfo] + $File, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Compression.ZipArchiveEntry] + $ArchiveEntry, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Checksum + ) + + $archiveEntryFullName = Get-ArchiveEntryFullName -ArchiveEntry $ArchiveEntry + + Write-Verbose -Message ($script:localizedData.TestingIfFileMatchesArchiveEntryByChecksum -f $File.FullName, $archiveEntryFullName, $Checksum) + + $fileMatchesArchiveEntry = $false + + if (Test-ChecksumIsSha -Checksum $Checksum) + { + $fileHashMatchesArchiveEntryHash = Test-FileHashMatchesArchiveEntryHash -FilePath $File.FullName -ArchiveEntry $ArchiveEntry -HashAlgorithmName $Checksum + + if ($fileHashMatchesArchiveEntryHash) + { + Write-Verbose -Message ($script:localizedData.FileMatchesArchiveEntryByChecksum -f $File.FullName, $archiveEntryFullName, $Checksum) + + $fileMatchesArchiveEntry = $true + } + else + { + Write-Verbose -Message ($script:localizedData.FileDoesNotMatchArchiveEntryByChecksum -f $File.FullName, $archiveEntryFullName, $Checksum) + } + } + else + { + $fileTimestampForChecksum = Get-ChecksumFromFileTimestamp -File $File -Checksum $Checksum + + $archiveEntryLastWriteTime = Get-ArchiveEntryLastWriteTime -ArchiveEntry $ArchiveEntry + $archiveEntryLastWriteTimeChecksum = ConvertTo-CheckSumFromDateTime -Date $archiveEntryLastWriteTime + + if ($fileTimestampForChecksum.Equals($archiveEntryLastWriteTimeChecksum)) + { + Write-Verbose -Message ($script:localizedData.FileMatchesArchiveEntryByChecksum -f $File.FullName, $archiveEntryFullName, $Checksum) + + $fileMatchesArchiveEntry = $true + } + else + { + Write-Verbose -Message ($script:localizedData.FileDoesNotMatchArchiveEntryByChecksum -f $File.FullName, $archiveEntryFullName, $Checksum) + } + } + + return $fileMatchesArchiveEntry +} + +<# + .SYNOPSIS + Tests if the given archive entry name represents a directory. + + .PARAMETER ArchiveEntryName + The archive entry name to test. +#> +function Test-ArchiveEntryIsDirectory +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArchiveEntryName + ) + + return $ArchiveEntryName.EndsWith('\') -or $ArchiveEntryName.EndsWith('/') +} + +<# + .SYNOPSIS + Tests if the specified archive exists in its expanded form at the destination. + + .PARAMETER Archive + The archive to test for existence at the specified destination. + + .PARAMETER Destination + The path to the destination to check for the presence of the expanded form of the specified + archive. + + .PARAMETER Checksum + The checksum method to use to determine whether a file in the archive matches a file at the + destination. + + If not provided, only the existence of the items in the archive will be checked. +#> +function Test-ArchiveExistsAtDestination +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArchiveSourcePath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Destination, + + [Parameter()] + [ValidateSet('SHA-1', 'SHA-256', 'SHA-512', 'CreatedDate', 'ModifiedDate')] + [System.String] + $Checksum + ) + + Write-Verbose -Message ($script:localizedData.TestingIfArchiveExistsAtDestination -f $Destination) + + $archiveExistsAtDestination = $true + + $archive = Open-Archive -Path $ArchiveSourcePath + + try + { + $archiveEntries = Get-ArchiveEntries -Archive $archive + + foreach ($archiveEntry in $archiveEntries) + { + $archiveEntryFullName = Get-ArchiveEntryFullName -ArchiveEntry $archiveEntry + $archiveEntryPathAtDestination = Join-Path -Path $Destination -ChildPath $archiveEntryFullName + + $archiveEntryItemAtDestination = Get-Item -LiteralPath $archiveEntryPathAtDestination -ErrorAction 'SilentlyContinue' + + if ($null -eq $archiveEntryItemAtDestination) + { + Write-Verbose -Message ($script:localizedData.ItemWithArchiveEntryNameDoesNotExist -f $archiveEntryPathAtDestination) + + $archiveExistsAtDestination = $false + break + } + else + { + Write-Verbose -Message ($script:localizedData.ItemWithArchiveEntryNameExists -f $archiveEntryPathAtDestination) + + if (Test-ArchiveEntryIsDirectory -ArchiveEntryName $archiveEntryFullName) + { + if (-not ($archiveEntryItemAtDestination -is [System.IO.DirectoryInfo])) + { + Write-Verbose -Message ($script:localizedData.ItemWithArchiveEntryNameIsNotDirectory -f $archiveEntryPathAtDestination) + + $archiveExistsAtDestination = $false + break + } + } + else + { + if ($archiveEntryItemAtDestination -is [System.IO.FileInfo]) + { + if ($PSBoundParameters.ContainsKey('Checksum')) + { + if (-not (Test-FileMatchesArchiveEntryByChecksum -File $archiveEntryItemAtDestination -ArchiveEntry $archiveEntry -Checksum $Checksum)) + { + $archiveExistsAtDestination = $false + break + } + } + } + else + { + Write-Verbose -Message ($script:localizedData.ItemWithArchiveEntryNameIsNotFile -f $archiveEntryPathAtDestination) + + $archiveExistsAtDestination = $false + break + } + } + } + } + } + finally + { + Close-Archive -Archive $archive + } + + if ($archiveExistsAtDestination) + { + Write-Verbose -Message ($script:localizedData.ArchiveExistsAtDestination -f $ArchiveSourcePath, $Destination) + } + else + { + Write-Verbose -Message ($script:localizedData.ArchiveDoesNotExistAtDestination -f $ArchiveSourcePath, $Destination) + } + + return $archiveExistsAtDestination +} + +<# + .SYNOPSIS + Copies the contents of the specified source stream to the specified destination stream. + This is a wrapper function for unit testing. + + .PARAMETER SourceStream + The stream to copy from. + + .PARAMETER DestinationStream + The stream to copy to. +#> +function Copy-FromStreamToStream +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Stream] + $SourceStream, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Stream] + $DestinationStream + ) + + $null = $SourceStream.CopyTo($DestinationStream) +} + +<# + .SYNOPSIS + Copies the specified archive entry to the specified destination path. + + .PARAMETER ArchiveEntry + The archive entry to copy to the destination. + + .PARAMETER DestinationPath + The destination file path to copy the archive entry to. +#> +function Copy-ArchiveEntryToDestination +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.IO.Compression.ZipArchiveEntry] + $ArchiveEntry, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPath + ) + + $archiveEntryFullName = Get-ArchiveEntryFullName -ArchiveEntry $ArchiveEntry + + Write-Verbose -Message ($script:localizedData.CopyingArchiveEntryToDestination -f $archiveEntryFullName, $DestinationPath) + + if (Test-ArchiveEntryIsDirectory -ArchiveEntryName $archiveEntryFullName) + { + Write-Verbose -Message ($script:localizedData.CreatingArchiveEntryDirectory -f $DestinationPath) + + $null = New-Item -Path $DestinationPath -ItemType 'Directory' + } + else + { + $openStreams = @() + + try + { + $archiveEntryStream = Open-ArchiveEntry -ArchiveEntry $ArchiveEntry + $openStreams += $archiveEntryStream + + # The Create mode will create a new file if it does not exist or overwrite the file if it already exists + $destinationStreamMode = [System.IO.FileMode]::Create + + $destinationStream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList @( $DestinationPath, $destinationStreamMode ) + $openStreams += $destinationStream + + Copy-FromStreamToStream -SourceStream $archiveEntryStream -DestinationStream $destinationStream + } + catch + { + $errorMessage = $script:localizedData.ErrorCopyingFromArchiveToDestination -f $DestinationPath + New-InvalidOperationException -Message $errorMessage -ErrorRecord $_ + } + finally + { + foreach ($openStream in $openStreams) + { + Close-Stream -Stream $openStream + } + } + + $null = New-Object -TypeName 'System.IO.FileInfo' -ArgumentList @( $DestinationPath ) + + $updatedTimestamp = Get-ArchiveEntryLastWriteTime -ArchiveEntry $ArchiveEntry + + $null = Set-ItemProperty -LiteralPath $DestinationPath -Name 'LastWriteTime' -Value $updatedTimestamp + $null = Set-ItemProperty -LiteralPath $DestinationPath -Name 'LastAccessTime' -Value $updatedTimestamp + $null = Set-ItemProperty -LiteralPath $DestinationPath -Name 'CreationTime' -Value $updatedTimestamp + } +} + +<# + .SYNOPSIS + Expands the archive at the specified source path to the specified destination path. + + .PARAMETER ArchiveSourcePath + The source path of the archive to expand to the specified destination path. + + .PARAMETER Destination + The destination path at which to expand the archive at the specified source path. + + .PARAMETER Checksum + The checksum method to use to determine if a file at the destination already matches a file + in the archive. + + .PARAMETER Force + Specifies whether or not to overwrite files that exist at the destination but do not match + the file of the same name in the archive based on the specified checksum method. +#> +function Expand-ArchiveToDestination +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArchiveSourcePath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Destination, + + [Parameter()] + [ValidateSet('SHA-1', 'SHA-256', 'SHA-512', 'CreatedDate', 'ModifiedDate')] + [System.String] + $Checksum, + + [Parameter()] + [System.Boolean] + $Force = $false + ) + + Write-Verbose -Message ($script:localizedData.ExpandingArchiveToDestination -f $ArchiveSourcePath, $Destination) + + $archive = Open-Archive -Path $ArchiveSourcePath + + try + { + $archiveEntries = Get-ArchiveEntries -Archive $archive + + foreach ($archiveEntry in $archiveEntries) + { + $archiveEntryFullName = Get-ArchiveEntryFullName -ArchiveEntry $archiveEntry + $archiveEntryPathAtDestination = Join-Path -Path $Destination -ChildPath $archiveEntryFullName + + $archiveEntryIsDirectory = Test-ArchiveEntryIsDirectory -ArchiveEntryName $archiveEntryFullName + + $archiveEntryItemAtDestination = Get-Item -LiteralPath $archiveEntryPathAtDestination -ErrorAction 'SilentlyContinue' + + if ($null -eq $archiveEntryItemAtDestination) + { + Write-Verbose -Message ($script:localizedData.ItemWithArchiveEntryNameDoesNotExist -f $archiveEntryPathAtDestination) + + if (-not $archiveEntryIsDirectory) + { + $parentDirectory = Split-Path -Path $archiveEntryPathAtDestination -Parent + + if (-not (Test-Path -Path $parentDirectory)) + { + Write-Verbose -Message ($script:localizedData.CreatingParentDirectory -f $parentDirectory) + + $null = New-Item -Path $parentDirectory -ItemType 'Directory' + } + } + + Copy-ArchiveEntryToDestination -ArchiveEntry $archiveEntry -DestinationPath $archiveEntryPathAtDestination + } + else + { + Write-Verbose -Message ($script:localizedData.ItemWithArchiveEntryNameExists -f $archiveEntryPathAtDestination) + + $overwriteArchiveEntry = $true + + if ($archiveEntryIsDirectory) + { + $overwriteArchiveEntry = -not ($archiveEntryItemAtDestination -is [System.IO.DirectoryInfo]) + } + elseif ($archiveEntryItemAtDestination -is [System.IO.FileInfo]) + { + if ($PSBoundParameters.ContainsKey('Checksum')) + { + $overwriteArchiveEntry = -not (Test-FileMatchesArchiveEntryByChecksum -File $archiveEntryItemAtDestination -ArchiveEntry $archiveEntry -Checksum $Checksum) + } + else + { + $overwriteArchiveEntry = $false + } + } + + if ($overwriteArchiveEntry) + { + if ($Force) + { + Write-Verbose -Message ($script:localizedData.OverwritingItem -f $archiveEntryPathAtDestination) + + $null = Remove-Item -LiteralPath $archiveEntryPathAtDestination + Copy-ArchiveEntryToDestination -ArchiveEntry $archiveEntry -DestinationPath $archiveEntryPathAtDestination + } + else + { + New-InvalidOperationException -Message ($script:localizedData.ForceNotSpecifiedToOverwriteItem -f $archiveEntryPathAtDestination, $archiveEntryFullName) + } + } + } + } + } + finally + { + Close-Archive -Archive $archive + } +} + +<# + .SYNOPSIS + Removes the specified directory from the specified destination path. + + .PARAMETER Directory + The partial path under the destination path of the directory to remove. + + .PARAMETER Destination + The destination from which to remove the directory. +#> +function Remove-DirectoryFromDestination +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Directory, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Destination + ) + + # Sort-Object requires the use of a pipe to function properly + $Directory = $Directory | Sort-Object -Descending -Unique + + foreach ($directoryToRemove in $Directory) + { + $directoryPathAtDestination = Join-Path -Path $Destination -ChildPath $directoryToRemove + $directoryExists = Test-Path -LiteralPath $directoryPathAtDestination -PathType 'Container' + + if ($directoryExists) + { + $directoryChildItems = Get-ChildItem -LiteralPath $directoryPathAtDestination -ErrorAction 'SilentlyContinue' + $directoryIsEmpty = $null -eq $directoryChildItems + + if ($directoryIsEmpty) + { + Write-Verbose -Message ($script:localizedData.RemovingDirectory -f $directoryPathAtDestination) + + $null = Remove-Item -LiteralPath $directoryPathAtDestination + } + else + { + Write-Verbose -Message ($script:localizedData.DirectoryIsNotEmpty -f $directoryPathAtDestination) + } + } + } +} + +<# + .SYNOPSIS + Removes the specified archive from the specified destination. + + .PARAMETER Archive + The archive to remove from the specified destination. + + .PARAMETER Destination + The path to the destination to remove the specified archive from. + + .PARAMETER Checksum + The checksum method to use to determine whether a file in the archive matches a file at the + destination. + + If not provided, only the existence of the items in the archive will be checked. +#> +function Remove-ArchiveFromDestination +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArchiveSourcePath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Destination, + + [Parameter()] + [ValidateSet('SHA-1', 'SHA-256', 'SHA-512', 'CreatedDate', 'ModifiedDate')] + [System.String] + $Checksum + ) + + Write-Verbose -Message ($script:localizedData.RemovingArchiveFromDestination -f $Destination) + + $archive = Open-Archive -Path $ArchiveSourcePath + + try + { + $directoriesToRemove = @() + + $archiveEntries = Get-ArchiveEntries -Archive $archive + + foreach ($archiveEntry in $archiveEntries) + { + $archiveEntryFullName = Get-ArchiveEntryFullName -ArchiveEntry $archiveEntry + $archiveEntryPathAtDestination = Join-Path -Path $Destination -ChildPath $archiveEntryFullName + + $archiveEntryIsDirectory = Test-ArchiveEntryIsDirectory -ArchiveEntryName $archiveEntryFullName + + $itemAtDestination = Get-Item -LiteralPath $archiveEntryPathAtDestination -ErrorAction 'SilentlyContinue' + + if ($null -eq $itemAtDestination) + { + Write-Verbose -Message ($script:localizedData.ItemWithArchiveEntryNameDoesNotExist -f $archiveEntryPathAtDestination) + } + else + { + Write-Verbose -Message ($script:localizedData.ItemWithArchiveEntryNameExists -f $archiveEntryPathAtDestination) + + $itemAtDestinationIsDirectory = $itemAtDestination -is [System.IO.DirectoryInfo] + $itemAtDestinationIsFile = $itemAtDestination -is [System.IO.FileInfo] + + $removeArchiveEntry = $false + + if ($archiveEntryIsDirectory -and $itemAtDestinationIsDirectory) + { + $removeArchiveEntry = $true + $directoriesToRemove += $archiveEntryFullName + + } + elseif ((-not $archiveEntryIsDirectory) -and $itemAtDestinationIsFile) + { + $removeArchiveEntry = $true + + if ($PSBoundParameters.ContainsKey('Checksum')) + { + $removeArchiveEntry = Test-FileMatchesArchiveEntryByChecksum -File $itemAtDestination -ArchiveEntry $archiveEntry -Checksum $Checksum + } + + if ($removeArchiveEntry) + { + Write-Verbose -Message ($script:localizedData.RemovingFile -f $archiveEntryPathAtDestination) + $null = Remove-Item -LiteralPath $archiveEntryPathAtDestination + } + } + else + { + Write-Verbose -Message ($script:localizedData.CouldNotRemoveItemOfIncorrectType -f $archiveEntryPathAtDestination, $archiveEntryFullName) + } + + if ($removeArchiveEntry) + { + $parentDirectory = Split-Path -Path $archiveEntryFullName -Parent + + while (-not [System.String]::IsNullOrEmpty($parentDirectory)) + { + $directoriesToRemove += $parentDirectory + $parentDirectory = Split-Path -Path $parentDirectory -Parent + } + } + } + } + + if ($directoriesToRemove.Count -gt 0) + { + $null = Remove-DirectoryFromDestination -Directory $directoriesToRemove -Destination $Destination + } + + Write-Verbose -Message ($script:localizedData.ArchiveRemovedFromDestination -f $Destination) + + } + finally + { + Close-Archive -Archive $archive + } +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/DSC_xArchive.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/DSC_xArchive.schema.mof new file mode 100644 index 0000000..2d0fdb3 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/DSC_xArchive.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0.0"),FriendlyName("xArchive")] +class DSC_xArchive : OMI_BaseResource +{ + [Key, Description("The path to the archive file that should be expanded to or removed from the specified destination.")] String Path; + [Key, Description("The path where the specified archive file should be expanded to or removed from.")] String Destination; + [Write, Description("Specifies whether or not the expanded content of the archive file at the specified path should exist at the specified destination. To update the specified destination to have the expanded content of the archive file at the specified path, specify this property as Present. To remove the expanded content of the archive file at the specified path from the specified destination, specify this property as Absent. The default value is Present."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Write, Description("Specifies whether or not to validate that a file at the destination with the same name as a file in the archive actually matches that corresponding file in the archive by the specified checksum method. If the file does not match and Ensure is specified as Present and Force is not specified, the resource will throw an error that the file at the desintation cannot be overwritten. If the file does not match and Ensure is specified as Present and Force is specified, the file at the desintation will be overwritten. If the file does not match and Ensure is specified as Absent, the file at the desintation will not be removed. The default value is false.")] Boolean Validate; + [Write, Description("The Checksum method to use to validate whether or not a file at the destination with the same name as a file in the archive actually matches that corresponding file in the archive. An invalid argument exception will be thrown if Checksum is specified while Validate is specified as false. ModifiedDate will check that the LastWriteTime property of the file at the destination matches the LastWriteTime property of the file in the archive. CreatedDate will check that the CreationTime property of the file at the destination matches the CreationTime property of the file in the archive. SHA-1, SHA-256, and SHA-512 will check that the hash of the file at the destination by the specified SHA method matches the hash of the file in the archive by the specified SHA method. The default value is ModifiedDate.") ,ValueMap{"SHA-1", "SHA-256", "SHA-512", "CreatedDate", "ModifiedDate"}, Values{"SHA-1", "SHA-256", "SHA-512", "CreatedDate", "ModifiedDate"}] String Checksum; + [Write, Description("The credential of a user account with permissions to access the specified archive path and destination if needed.") ,EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("Specifies whether or not any existing files or directories at the destination with the same name as a file or directory in the archive should be overwritten to match the file or directory in the archive. When this property is false, an error will be thrown if an item at the destination needs to be overwritten. The default value is false.")] Boolean Force; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/en-US/DSC_xArchive.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/en-US/DSC_xArchive.schema.mfl new file mode 100644 index 0000000..42da26b --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/en-US/DSC_xArchive.schema.mfl @@ -0,0 +1,11 @@ +[AMENDMENT, LOCALE("MS_409")] +class DSC_xArchive : OMI_BaseResource +{ + [Key,Description("The path to the archive file that should be expanded to or removed from the specified destination.") : Amended] String Path; + [Key,Description("The path where the specified archive file should be expanded to or removed from.") : Amended] String Destination; + [Description("Specifies whether or not the expanded content of the archive file at the specified path should exist at the specified destination. To update the specified destination to have the expanded content of the archive file at the specified path, specify this property as Present. To remove the expanded content of the archive file at the specified path from the specified destination, specify this property as Absent. The default value is Present.") : Amended] String Ensure; + [Description("Specifies whether or not to validate that a file at the destination with the same name as a file in the archive actually matches that corresponding file in the archive by the specified checksum method. If the file does not match and Ensure is specified as Present and Force is not specified, the resource will throw an error that the file at the desintation cannot be overwritten. If the file does not match and Ensure is specified as Present and Force is specified, the file at the desintation will be overwritten. If the file does not match and Ensure is specified as Absent, the file at the desintation will not be removed. The default value is false.") : Amended] Boolean Validate; + [Description("The Checksum method to use to validate whether or not a file at the destination with the same name as a file in the archive actually matches that corresponding file in the archive. An invalid argument exception will be thrown if Checksum is specified while Validate is specified as false. ModifiedDate will check that the LastWriteTime property of the file at the destination matches the LastWriteTime property of the file in the archive. CreatedDate will check that the CreationTime property of the file at the destination matches the CreationTime property of the file in the archive. SHA-1, SHA-256, and SHA-512 will check that the hash of the file at the destination by the specified SHA method matches the hash of the file in the archive by the specified SHA method. The default value is ModifiedDate.") : Amended] String Checksum; + [Description("The credential of a user account with permissions to access the specified archive path and destination if needed.") : Amended] String Credential; + [Description("Specifies whether or not any existing files or directories at the destination with the same name as a file or directory in the archive should be overwritten to match the file or directory in the archive. When this property is false, an error will be thrown if an item at the destination needs to be overwritten. The default value is false.") : Amended] Boolean Force; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/en-US/DSC_xArchive.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/en-US/DSC_xArchive.strings.psd1 new file mode 100644 index 0000000..55f0912 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xArchive/en-US/DSC_xArchive.strings.psd1 @@ -0,0 +1,58 @@ +# Localized resources for DSC_xArchive + +ConvertFrom-StringData @' + RetrievingArchiveState = Retrieving the state of the archive with path "{0}" and destination "{1}"... + SettingArchiveState = Setting the state of the archive with path "{0}" and destination "{1}"... + ArchiveStateSet = The state of the archive with path "{0}" and destination "{1}" has been set. + TestingArchiveState = Testing whether or not the state of the archive with path "{0}" and destination "{1}" matches the desired state... + + PathAccessiblePSDriveNotNeeded = The path "{0}" is accessible. A new PSDrive is not needed. + CreatingPSDrive = Creating a PSDrive to access the path "{0}" with permissions from the user "{1}"... + RemovingPSDrive = Removing the mounted PSDrive "{0}"... + + DestinationExists = A directory already exists at the destination path "{0}". + DestinationDoesNotExist = A directory does not exist at the destination path "{0}". + CreatingDirectoryAtDestination = Creating the root directory at the destination path "{0}"... + + TestingIfArchiveExistsAtDestination = Testing if the archive at the destination path "{0}" exists... + ArchiveExistsAtDestination = The archive at path "{0}" exists at the destination "{1}". + ArchiveDoesNotExistAtDestination = The archive at path "{0}" does not exist at the destination "{1}". + + OpeningArchive = Opening the archive at path "{0}"... + ClosingArchive = Closing the archive at path "{0}"... + + OpeningArchiveEntry = Opening the archive entry "{0}"... + + ItemWithArchiveEntryNameExists = An item with the same name as the archive entry exists at the destination path "{0}". + ItemWithArchiveEntryNameDoesNotExist = An item with the same name as the archive entry does not exist at the destination path "{0}". + ItemWithArchiveEntryNameIsNotDirectory = The item at the destination path "{0}" has the same name as a directory archive entry but is not a directory. + ItemWithArchiveEntryNameIsNotFile = The item at the destination path "{0}" has the same name as a file archive entry but is not a file. + + TestingIfFileMatchesArchiveEntryByChecksum = Testing if the file at "{0}" matches the archive entry at "{1}" by the checksum method "{2}"... + ComparingHashes = Comparing the hash of the file at "{0}" to the hash of the archive entry at "{1}" with the hash algorithm "{2}"... + FileMatchesArchiveEntryByChecksum = The file at "{0}" matches the archive entry at "{1}" by the checksum method "{2}". + FileDoesNotMatchArchiveEntryByChecksum = The file at "{0}" does not match the archive entry at "{1}" by the checksum method "{2}". + + ExpandingArchiveToDestination = Expanding the archive at "{0}" to the destination "{1}"... + CreatingParentDirectory = Creating an archive entry parent directory at the path "{0}"... + OverwritingItem = Overwriting the item at the path "{0}"... + CreatingArchiveEntryDirectory = Creating an archive entry directory "{0}"... + CopyingArchiveEntryToDestination = Copying the archive entry "{0}" to the destination path "{1}"... + + RemovingArchiveFromDestination = Removing archive from the destination path "{0}"... + RemovingDirectory = Removing the directory at path "{0}"... + RemovingFile = Removing the file at path "{0}"... + CouldNotRemoveItemOfIncorrectType = The file at "{0}" does not match the item type (file, directory, or other) or the archive entry at "{1}", so it will not be removed. + ArchiveRemovedFromDestination = Archive removed from the destination path "{0}". + + ChecksumSpecifiedAndValidateFalse = The Checksum parameter was specified as "{0}" but the Validate parameter is set to false for the archive with path "{1}" and destination "{2}". Please specify the Validate parameter as true to use the Checksum parameter. + PathDoesNotContainValidPSDriveRoot = The path "{0}" cannot be accessed because it does not contain any directories to use as the root of a PSDrive. + ErrorCreatingPSDrive = An error occurred while attempting to create a PSDrive to access the path "{0}" under the user "{1}". + PathDoesNotExistAsLeaf = The path "{0}" does not exist or is not a path leaf. + DestinationExistsAsFile = A file exists at the desintation path "{0}". + ErrorOpeningArchive = An error occurred while attempting to open the archive at path "{0}". + ErrorCopyingFromArchiveToDestination = An error occurred while attempting copy from the archive to the destination path "{0}". + DirectoryIsNotEmpty = The directory at path "{0}" is not empty, so it will not be removed. + ErrorComparingHashes = An error occurred while comparing the hash of the file at "{0}" to the archive entry "{1}" with the hash algorithm "{2}". + ForceNotSpecifiedToOverwriteItem = An item already exists at "{0}" that does not match the item in the archive at "{1}", but the Force parameter has not been specified to overwrite this item. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/DSC_xDSCWebService.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/DSC_xDSCWebService.psm1 new file mode 100644 index 0000000..c136aab --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/DSC_xDSCWebService.psm1 @@ -0,0 +1,1759 @@ +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.PSWSIIS' ` + -ChildPath 'xPSDesiredStateConfiguration.PSWSIIS.psm1')) +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Firewall' ` + -ChildPath 'xPSDesiredStateConfiguration.Firewall.psm1')) +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Security' ` + -ChildPath 'xPSDesiredStateConfiguration.Security.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xDSCWebService' + +<# + .SYNOPSIS + Get the state of the DSC Web Service. + + .PARAMETER EndpointName + Prefix of the WCF SVC file. + + .PARAMETER ApplicationPoolName + The IIS ApplicationPool to use for the Pull Server. If not specified a + pool with name 'PSWS' will be created. + + .PARAMETER CertificateSubject + The subject of the Certificate in CERT:\LocalMachine\MY\ for Pull Server. + + .PARAMETER CertificateTemplateName + The certificate Template Name of the Certificate in CERT:\LocalMachine\MY\ + for Pull Server. + + .PARAMETER CertificateThumbPrint + The thumbprint of the Certificate in CERT:\LocalMachine\MY\ for Pull Server. + + .PARAMETER ConfigureFirewall + Enable incomming firewall exceptions for the configured DSC Pull Server + port. Defaults to true. + + .PARAMETER DisableSecurityBestPractices + A list of exceptions to the security best practices to apply. + + .PARAMETER Enable32BitAppOnWin64 + Enable the DSC Pull Server to run in a 32-bit process on a 64-bit operating + system. + + .PARAMETER UseSecurityBestPractices + Ensure that the DSC Pull Server is created using security best practices. +#> +function Get-TargetResource +{ + [CmdletBinding(DefaultParameterSetName = 'CertificateThumbPrint')] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EndpointName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ApplicationPoolName = $DscWebServiceDefaultAppPoolName, + + [Parameter(ParameterSetName = 'CertificateSubject')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateSubject, + + [Parameter(ParameterSetName = 'CertificateSubject')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateTemplateName = 'WebServer', + + [Parameter(ParameterSetName = 'CertificateThumbPrint')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateThumbPrint, + + [Parameter()] + [System.Boolean] + $ConfigureFirewall = $true, + + [Parameter()] + [ValidateSet('SecureTLSProtocols')] + [System.String[]] + $DisableSecurityBestPractices, + + [Parameter()] + [System.Boolean] + $Enable32BitAppOnWin64 = $false, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Boolean] + $UseSecurityBestPractices + ) + + <# + If Certificate Subject is not specified then a value for + CertificateThumbprint must be explicitly set instead. The + Mof schema doesn't allow for a mandatory parameter in a parameter set. + #> + if ($PScmdlet.ParameterSetName -eq 'CertificateThumbPrint' ` + -and $PSBoundParameters.ContainsKey('CertificateThumbPrint') -ne $true) + { + throw $script:localizedData.ThrowCertificateThumbprint + } + + $webSite = Get-Website -Name $EndpointName + + if ($webSite) + { + Write-Verbose -Message "PullServer is deployed at '$EndpointName'." + + $Ensure = 'Present' + $acceptSelfSignedCertificates = $false + + # Get Full Path for Web.config file + $webConfigFullPath = Join-Path -Path $website.physicalPath -ChildPath 'web.config' + + # Get module and configuration path + $modulePath = Get-WebConfigAppSetting -WebConfigFullPath $webConfigFullPath -AppSettingName 'ModulePath' + $configurationPath = Get-WebConfigAppSetting -WebConfigFullPath $webConfigFullPath -AppSettingName 'ConfigurationPath' + $registrationKeyPath = Get-WebConfigAppSetting -WebConfigFullPath $webConfigFullPath -AppSettingName 'RegistrationKeyPath' + + # Get database path + switch ((Get-WebConfigAppSetting -WebConfigFullPath $webConfigFullPath -AppSettingName 'dbprovider')) + { + 'ESENT' + { + $databasePath = Get-WebConfigAppSetting -WebConfigFullPath $webConfigFullPath -AppSettingName 'dbconnectionstr' | Split-Path -Parent + } + + 'System.Data.OleDb' + { + $connectionString = Get-WebConfigAppSetting -WebConfigFullPath $webConfigFullPath -AppSettingName 'dbconnectionstr' + + if ($connectionString -match 'Data Source=(.*)\\Devices\.mdb') + { + $databasePath = $Matches[0] + } + else + { + $databasePath = $connectionString + } + } + } + + $urlPrefix = $website.bindings.Collection[0].protocol + '://' + + $ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties() + + if ($ipProperties.DomainName) + { + $fqdn = '{0}.{1}' -f $ipProperties.HostName, $ipProperties.DomainName + } + else + { + $fqdn = $ipProperties.HostName + } + + $iisPort = $website.bindings.Collection[0].bindingInformation.Split(':')[1] + + $svcFileName = (Get-ChildItem -Path $website.physicalPath -Filter '*.svc').Name + + $serverUrl = $urlPrefix + $fqdn + ':' + $iisPort + '/' + $svcFileName + + $webBinding = Get-WebBinding -Name $EndpointName + + if ((Test-IISSelfSignedModuleEnabled -EndpointName $EndpointName)) + { + $acceptSelfSignedCertificates = $true + } + + $ConfigureFirewall = Test-PullServerFirewallConfiguration -Port $iisPort + $ApplicationPoolName = $webSite.applicationPool + $physicalPath = $website.physicalPath + $state = $webSite.state + } + else + { + Write-Verbose -Message "No website found with name '$EndpointName'." + $Ensure = 'Absent' + } + + $output = @{ + EndpointName = $EndpointName + ApplicationPoolName = $ApplicationPoolName + Port = $iisPort + PhysicalPath = $physicalPath + State = $state + DatabasePath = $databasePath + ModulePath = $modulePath + ConfigurationPath = $configurationPath + DSCServerUrl = $serverUrl + Ensure = $Ensure + RegistrationKeyPath = $registrationKeyPath + AcceptSelfSignedCertificates = $acceptSelfSignedCertificates + UseSecurityBestPractices = $UseSecurityBestPractices + DisableSecurityBestPractices = $DisableSecurityBestPractices + Enable32BitAppOnWin64 = $Enable32BitAppOnWin64 + ConfigureFirewall = $ConfigureFirewall + } + + if ($CertificateThumbPrint -eq 'AllowUnencryptedTraffic') + { + Write-Verbose -Message 'Current PullServer configuration allows unencrypted traffic.' + $output.Add('CertificateThumbPrint', $certificateThumbPrint) + } + else + { + $certificate = ([System.Array] (Get-ChildItem -Path 'Cert:\LocalMachine\My\')) | + Where-Object -FilterScript { + $_.Thumbprint -eq $webBinding.CertificateHash + } + + # Try to parse the Certificate Template Name. The property is not available on all Certificates. + $actualCertificateTemplateName = '' + $certificateTemplateProperty = $certificate.Extensions | Where-Object -FilterScript { + $_.Oid.FriendlyName -eq 'Certificate Template Name' + } + + if ($null -ne $certificateTemplateProperty) + { + $actualCertificateTemplateName = $certificateTemplateProperty.Format($false) + } + + $output.Add('CertificateThumbPrint', $webBinding.CertificateHash) + $output.Add('CertificateSubject', $certificate.Subject) + $output.Add('CertificateTemplateName', $actualCertificateTemplateName) + } + + return $output +} + +<# + .SYNOPSIS + Set the state of the DSC Web Service. + + .PARAMETER EndpointName + Prefix of the WCF SVC file. + + .PARAMETER AcceptSelfSignedCertificates + Specifies is self-signed certs will be accepted for client authentication. + + .PARAMETER ApplicationPoolName + The IIS ApplicationPool to use for the Pull Server. If not specified a + pool with name 'PSWS' will be created. + + .PARAMETER CertificateSubject + The subject of the Certificate in CERT:\LocalMachine\MY\ for Pull Server. + + .PARAMETER CertificateTemplateName + The certificate Template Name of the Certificate in CERT:\LocalMachine\MY\ + for Pull Server. + + .PARAMETER CertificateThumbPrint + The thumbprint of the Certificate in CERT:\LocalMachine\MY\ for Pull Server. + + .PARAMETER ConfigurationPath + The location on the disk where the Configuration is stored. + + .PARAMETER ConfigureFirewall + Enable incomming firewall exceptions for the configured DSC Pull Server + port. Defaults to true. + + .PARAMETER DatabasePath + The location on the disk where the database is stored. + + .PARAMETER DisableSecurityBestPractices + A list of exceptions to the security best practices to apply. + + .PARAMETER Enable32BitAppOnWin64 + Enable the DSC Pull Server to run in a 32-bit process on a 64-bit operating + system. + + .PARAMETER Ensure + Specifies if the DSC Web Service should be installed. + + .PARAMETER PhysicalPath + The physical path for the IIS Endpoint on the machine (usually under inetpub). + + .PARAMETER Port + The port number of the DSC Pull Server IIS Endpoint. + + .PARAMETER ModulePath + The location on the disk where the Modules are stored. + + .PARAMETER RegistrationKeyPath + The location on the disk where the RegistrationKeys file is stored. + + .PARAMETER SqlConnectionString + The connection string to use to connect to the SQL server backend database. + Required if SqlProvider is true. + + .PARAMETER SqlProvider + Enable DSC Pull Server to use SQL server as the backend database. + + .PARAMETER State + Specifies the state of the DSC Web Service. + + .PARAMETER UseSecurityBestPractices + Ensure that the DSC Pull Server is created using security best practices. +#> +function Set-TargetResource +{ + [CmdletBinding(DefaultParameterSetName = 'CertificateThumbPrint')] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EndpointName, + + [Parameter()] + [System.Boolean] + $AcceptSelfSignedCertificates = $true, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ApplicationPoolName = $DscWebServiceDefaultAppPoolName, + + [Parameter(ParameterSetName = 'CertificateSubject')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateSubject, + + [Parameter(ParameterSetName = 'CertificateSubject')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateTemplateName = 'WebServer', + + [Parameter(ParameterSetName = 'CertificateThumbPrint')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateThumbPrint, + + [Parameter()] + [System.String] + $ConfigurationPath = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration", + + [Parameter()] + [System.Boolean] + $ConfigureFirewall = $true, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DatabasePath = "$env:PROGRAMFILES\WindowsPowerShell\DscService", + + [Parameter()] + [ValidateSet('SecureTLSProtocols')] + [System.String[]] + $DisableSecurityBestPractices, + + [Parameter()] + [System.Boolean] + $Enable32BitAppOnWin64 = $false, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $ModulePath = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Modules", + + [Parameter()] + [System.String] + $PhysicalPath = "$env:SystemDrive\inetpub\$EndpointName", + + [Parameter()] + [ValidateRange(1, 65535)] + [System.UInt32] + $Port = 8080, + + [Parameter()] + [System.String] + $RegistrationKeyPath = "$env:PROGRAMFILES\WindowsPowerShell\DscService", + + [Parameter()] + [System.String] + $SqlConnectionString, + + [Parameter()] + [System.Boolean] + $SqlProvider = $false, + + [Parameter()] + [ValidateSet('Started', 'Stopped')] + [System.String] + $State = 'Started', + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Boolean] + $UseSecurityBestPractices + ) + + <# + If Certificate Subject is not specified then a value for CertificateThumbprint + must be explicitly set instead. The Mof schema doesn't allow for a mandatory parameter + in a parameter set. + #> + if ($PScmdlet.ParameterSetName -eq 'CertificateThumbPrint' -and $PSBoundParameters.ContainsKey('CertificateThumbPrint') -ne $true) + { + throw $script:localizedData.ThrowCertificateThumbprint + } + + # Find a certificate that matches the Subject and Template Name + if ($PSCmdlet.ParameterSetName -eq 'CertificateSubject') + { + $certificateThumbPrint = Find-CertificateThumbprintWithSubjectAndTemplateName -Subject $CertificateSubject -TemplateName $CertificateTemplateName + } + + # Check parameter values + if ($UseSecurityBestPractices -and ($CertificateThumbPrint -eq 'AllowUnencryptedTraffic')) + { + throw $script:localizedData.ThrowUseSecurityBestPractice + } + + if ($ConfigureFirewall) + { + Write-Warning -Message $script:localizedData.ConfigFirewallDeprecated + } + + <# + If the Pull Server Site should be bound to the non default AppPool + ensure that the AppPool already exists + #> + if ('Present' -eq $Ensure ` + -and $ApplicationPoolName -ne $DscWebServiceDefaultAppPoolName ` + -and (-not (Test-Path -Path "IIS:\AppPools\$ApplicationPoolName"))) + { + throw ($script:localizedData.ThrowApplicationPoolNotFound -f $ApplicationPoolName) + } + + # Initialize with default values + $pathPullServer = "$pshome\modules\PSDesiredStateConfiguration\PullServer" + $jet4provider = 'System.Data.OleDb' + $jet4database = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$DatabasePath\Devices.mdb;' + $eseprovider = 'ESENT' + $esedatabase = "$DatabasePath\Devices.edb" + + $cultureInfo = Get-Culture + $languagePath = $cultureInfo.IetfLanguageTag + $language = $cultureInfo.TwoLetterISOLanguageName + + # The two letter iso languagename is not actually implemented in the source path, it's always 'en' + if (-not (Test-Path -Path "$pathPullServer\$languagePath\Microsoft.Powershell.DesiredStateConfiguration.Service.Resources.dll")) + { + $languagePath = 'en' + } + + $os = Get-OSVersion + + $isBlue = $false + + if ($os.Major -eq 6 -and $os.Minor -eq 3) + { + $isBlue = $true + } + + $isDownlevelOfBlue = $false + + if ($os.Major -eq 6 -and $os.Minor -lt 3) + { + $isDownlevelOfBlue = $true + } + + # Use Pull Server values for defaults + $webConfigFileName = "$pathPullServer\PSDSCPullServer.config" + $svcFileName = "$pathPullServer\PSDSCPullServer.svc" + $pswsMofFileName = "$pathPullServer\PSDSCPullServer.mof" + $pswsDispatchFileName = "$pathPullServer\PSDSCPullServer.xml" + + if (($Ensure -eq 'Absent')) + { + if (Test-Path -LiteralPath "IIS:\Sites\$EndpointName") + { + # Get the port number for the Firewall rule + Write-Verbose -Message "Processing bindings for '$EndpointName'." + $portList = Get-WebBinding -Name $EndpointName | ForEach-Object -Process { + [System.Text.RegularExpressions.Regex]::Match($_.bindingInformation, ':(\d+):').Groups[1].Value + } + + # There is a web site, but there shouldn't be one + Write-Verbose -Message "Removing web site '$EndpointName'." + Remove-PSWSEndpoint -SiteName $EndpointName + + $portList | ForEach-Object -Process { Remove-PullServerFirewallConfiguration -Port $_ } + } + + # We are done here, all stuff below is for 'Present' + return + } + + Write-Verbose -Message 'Create the IIS endpoint' + New-PSWSEndpoint ` + -site $EndpointName ` + -Path $PhysicalPath ` + -cfgfile $webConfigFileName ` + -port $Port ` + -appPool $ApplicationPoolName ` + -applicationPoolIdentityType LocalSystem ` + -app $EndpointName ` + -svc $svcFileName ` + -mof $pswsMofFileName ` + -dispatch $pswsDispatchFileName ` + -asax "$pathPullServer\Global.asax" ` + -dependentBinaries "$pathPullServer\Microsoft.Powershell.DesiredStateConfiguration.Service.dll" ` + -language $language ` + -dependentMUIFiles "$pathPullServer\$languagePath\Microsoft.Powershell.DesiredStateConfiguration.Service.Resources.dll" ` + -certificateThumbPrint $certificateThumbPrint ` + -Enable32BitAppOnWin64 $Enable32BitAppOnWin64 ` + + switch ($Ensure) + { + 'Present' + { + if ($ConfigureFirewall) + { + Write-Verbose -Message "Enabling firewall exception for port $port." + Add-PullServerFirewallConfiguration -Port $port + } + } + + 'Absent' + { + Write-Verbose -Message "Disabling firewall exception for port $port." + Remove-PullServerFirewallConfiguration -Port $port + } + } + + Update-LocationTagInApplicationHostConfigForAuthentication -WebSite $EndpointName -Authentication 'anonymous' + Update-LocationTagInApplicationHostConfigForAuthentication -WebSite $EndpointName -Authentication 'basic' + Update-LocationTagInApplicationHostConfigForAuthentication -WebSite $EndpointName -Authentication 'windows' + + if ($SqlProvider) + { + Write-Verbose -Message 'Set values into the web.config that define the SQL Connection' + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'dbprovider' -Value $jet4provider + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'dbconnectionstr' -Value $SqlConnectionString + + if ($isBlue) + { + Set-BindingRedirectSettingInWebConfig -Path $PhysicalPath + } + } + elseif ($isBlue) + { + Write-Verbose -Message 'Set values into the web.config that define the repository for BLUE OS' + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'dbprovider' -Value $eseprovider + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'dbconnectionstr' -Value $esedatabase + + Set-BindingRedirectSettingInWebConfig -Path $PhysicalPath + } + else + { + if ($isDownlevelOfBlue) + { + Write-Verbose -Message 'Set values into the web.config that define the repository for non-BLUE Downlevel OS' + $repository = Join-Path -Path $DatabasePath -ChildPath 'Devices.mdb' + Copy-Item -Path "$pathPullServer\Devices.mdb" -Destination $repository -Force + + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'dbprovider' -Value $jet4provider + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'dbconnectionstr' -Value $jet4database + } + else + { + Write-Verbose -Message 'Set values into the web.config that define the repository later than BLUE OS' + Write-Verbose -Message 'Only ESENT is supported on Windows Server 2016' + + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'dbprovider' -Value $eseprovider + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'dbconnectionstr' -Value $esedatabase + } + } + + Write-Verbose -Message 'Pull Server: Set values into the web.config that indicate the location of repository, configuration, modules' + + # Create the application data directory calculated above + $null = New-Item -Path $DatabasePath -ItemType 'directory' -Force + $null = New-Item -Path $ConfigurationPath -ItemType 'directory' -Force + + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'ConfigurationPath' -Value $configurationPath + + $null = New-Item -Path $ModulePath -ItemType 'directory' -Force + + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'ModulePath' -Value $ModulePath + + $null = New-Item -Path $RegistrationKeyPath -ItemType 'directory' -Force + + Set-AppSettingsInWebconfig -Path $PhysicalPath -Key 'RegistrationKeyPath' -Value $registrationKeyPath + + if ($AcceptSelfSignedCertificates) + { + Write-Verbose -Message 'Accepting self signed certificates from incoming hosts' + Enable-IISSelfSignedModule -EndpointName $EndpointName -Enable32BitAppOnWin64:$Enable32BitAppOnWin64 + } + else + { + Disable-IISSelfSignedModule -EndpointName $EndpointName + } + + if ($UseSecurityBestPractices) + { + Set-UseSecurityBestPractice -DisableSecurityBestPractices $DisableSecurityBestPractices + } +} + +<# + .SYNOPSIS + Test the state of the DSC Web Service. + + .PARAMETER EndpointName + Prefix of the WCF SVC file. + + .PARAMETER AcceptSelfSignedCertificates + Specifies is self-signed certs will be accepted for client authentication. + + .PARAMETER ApplicationPoolName + The IIS ApplicationPool to use for the Pull Server. If not specified a + pool with name 'PSWS' will be created. + + .PARAMETER CertificateSubject + The subject of the Certificate in CERT:\LocalMachine\MY\ for Pull Server. + + .PARAMETER CertificateTemplateName + The certificate Template Name of the Certificate in CERT:\LocalMachine\MY\ + for Pull Server. + + .PARAMETER CertificateThumbPrint + The thumbprint of the Certificate in CERT:\LocalMachine\MY\ for Pull Server. + + .PARAMETER ConfigurationPath + The location on the disk where the Configuration is stored. + + .PARAMETER ConfigureFirewall + Enable incomming firewall exceptions for the configured DSC Pull Server + port. Defaults to true. + + .PARAMETER DatabasePath + The location on the disk where the database is stored. + + .PARAMETER DisableSecurityBestPractices + A list of exceptions to the security best practices to apply. + + .PARAMETER Enable32BitAppOnWin64 + Enable the DSC Pull Server to run in a 32-bit process on a 64-bit operating + system. + + .PARAMETER Ensure + Specifies if the DSC Web Service should be installed. + + .PARAMETER PhysicalPath + The physical path for the IIS Endpoint on the machine (usually under inetpub). + + .PARAMETER Port + The port number of the DSC Pull Server IIS Endpoint. + + .PARAMETER ModulePath + The location on the disk where the Modules are stored. + + .PARAMETER RegistrationKeyPath + The location on the disk where the RegistrationKeys file is stored. + + .PARAMETER SqlConnectionString + The connection string to use to connect to the SQL server backend database. + Required if SqlProvider is true. + + .PARAMETER SqlProvider + Enable DSC Pull Server to use SQL server as the backend database. + + .PARAMETER State + Specifies the state of the DSC Web Service. + + .PARAMETER UseSecurityBestPractices + Ensure that the DSC Pull Server is created using security best practices. +#> +function Test-TargetResource +{ + [CmdletBinding(DefaultParameterSetName = 'CertificateThumbPrint')] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EndpointName, + + [Parameter()] + [System.Boolean] + $AcceptSelfSignedCertificates, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ApplicationPoolName = $DscWebServiceDefaultAppPoolName, + + [Parameter(ParameterSetName = 'CertificateSubject')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateSubject, + + [Parameter(ParameterSetName = 'CertificateSubject')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateTemplateName = 'WebServer', + + [Parameter(ParameterSetName = 'CertificateThumbPrint')] + [ValidateNotNullOrEmpty()] + [System.String] + $CertificateThumbPrint, + + [Parameter()] + [System.String] + $ConfigurationPath = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration", + + [Parameter()] + [System.Boolean] + $ConfigureFirewall = $true, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DatabasePath = "$env:PROGRAMFILES\WindowsPowerShell\DscService", + + [Parameter()] + [ValidateSet('SecureTLSProtocols')] + [System.String[]] + $DisableSecurityBestPractices, + + [Parameter()] + [System.Boolean] + $Enable32BitAppOnWin64 = $false, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $ModulePath = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Modules", + + [Parameter()] + [System.String] + $PhysicalPath = "$env:SystemDrive\inetpub\$EndpointName", + + [Parameter()] + [ValidateRange(1, 65535)] + [System.UInt32] + $Port = 8080, + + [Parameter()] + [System.String] + $RegistrationKeyPath, + + [Parameter()] + [System.String] + $SqlConnectionString, + + [Parameter()] + [System.Boolean] + $SqlProvider = $false, + + [Parameter()] + [ValidateSet('Started', 'Stopped')] + [System.String] + $State = 'Started', + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Boolean] + $UseSecurityBestPractices + ) + + <# + If Certificate Subject is not specified then a value for CertificateThumbprint + must be explicitly set instead. The Mof schema doesn't allow for a mandatory + parameter in a parameter set. + #> + if ($PScmdlet.ParameterSetName -eq 'CertificateThumbPrint' -and $PSBoundParameters.ContainsKey('CertificateThumbPrint') -ne $true) + { + throw $script:localizedData.ThrowCertificateThumbprint + } + + $desiredConfigurationMatch = $true + + $website = Get-Website -Name $EndpointName + $stop = $true + + :WebSiteTests do + { + Write-Verbose -Message 'Check Ensure.' + + if (($Ensure -eq 'Present' -and $null -eq $website)) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "The Website '$EndpointName' is not present." + break + } + + if (($Ensure -eq 'Absent' -and $null -ne $website)) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "The Website '$EndpointName' is present but should not be." + break + } + + if (($Ensure -eq 'Absent' -and $null -eq $website)) + { + $desiredConfigurationMatch = $true + Write-Verbose -Message "The Website '$EndpointName' is not present as requested." + break + } + + # The other case is: Ensure and exist, we continue with more checks + Write-Verbose -Message 'Check Port.' + $actualPort = $website.bindings.Collection[0].bindingInformation.Split(':')[1] + + if ($Port -ne $actualPort) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "Port for the Website '$EndpointName' does not match the desired state." + break + } + + Write-Verbose -Message 'Check Application Pool.' + + if ($ApplicationPoolName -ne $website.applicationPool) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "Currently bound application pool '$($website.applicationPool)' does not match the desired state '$ApplicationPoolName'." + break + } + + Write-Verbose -Message 'Check Binding.' + $actualCertificateHash = $website.bindings.Collection[0].certificateHash + $websiteProtocol = $website.bindings.collection[0].Protocol + + Write-Verbose -Message 'Checking firewall rule settings.' + $ruleExists = Test-PullServerFirewallConfiguration -Port $Port + + if ($ruleExists -and -not $ConfigureFirewall) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "Firewall rule exists for $Port and should not. Configuration does not match the desired state." + break + } + elseif (-not $ruleExists -and $ConfigureFirewall) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "Firewall rule does not exist for $Port and should. Configuration does not match the desired state." + break + } + + switch ($PSCmdlet.ParameterSetName) + { + 'CertificateThumbprint' + { + if ($CertificateThumbPrint -eq 'AllowUnencryptedTraffic' -and $websiteProtocol -ne 'http') + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "Website '$EndpointName' is not configured for http and does not match the desired state." + break WebSiteTests + } + + if ($CertificateThumbPrint -ne 'AllowUnencryptedTraffic' -and $websiteProtocol -ne 'https') + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "Website '$EndpointName' is not configured for https and does not match the desired state." + break WebSiteTests + } + } + + 'CertificateSubject' + { + $certificateThumbPrint = Find-CertificateThumbprintWithSubjectAndTemplateName -Subject $CertificateSubject -TemplateName $CertificateTemplateName + + if ($CertificateThumbPrint -ne $actualCertificateHash) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "Certificate Hash for the Website '$EndpointName' does not match the desired state." + break WebSiteTests + } + } + } + + Write-Verbose -Message 'Check Physical Path property.' + + if (Test-WebsitePath -EndpointName $EndpointName -PhysicalPath $PhysicalPath) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "Physical Path of Website '$EndpointName' does not match the desired state." + break + } + + Write-Verbose -Message 'Check State.' + + if ($website.state -ne $State -and $null -ne $State) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "The state of Website '$EndpointName' does not match the desired state." + break + } + + Write-Verbose -Message 'Get Full Path for Web.config file.' + $webConfigFullPath = Join-Path -Path $website.physicalPath -ChildPath 'web.config' + + # Changed from -eq $false to -ne $true as $IsComplianceServer is never set. This section was always being skipped + if ($IsComplianceServer -ne $true) + { + Write-Verbose -Message 'Check DatabasePath.' + + switch ((Get-WebConfigAppSetting -WebConfigFullPath $webConfigFullPath -AppSettingName 'dbprovider')) + { + 'ESENT' + { + $expectedConnectionString = "$DatabasePath\Devices.edb" + } + + 'System.Data.OleDb' + { + $expectedConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=$DatabasePath\Devices.mdb;" + } + + default + { + $expectedConnectionString = [System.String]::Empty + } + } + + if ($SqlProvider) + { + $expectedConnectionString = $SqlConnectionString + } + + if (([System.String]::IsNullOrEmpty($expectedConnectionString))) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message "The DB provider does not have a valid value: 'ESENT' or 'System.Data.OleDb'." + break + } + + if (-not (Test-WebConfigAppSetting ` + -WebConfigFullPath $webConfigFullPath ` + -AppSettingName 'dbconnectionstr' ` + -ExpectedAppSettingValue $expectedConnectionString)) + { + $desiredConfigurationMatch = $false + break + } + + Write-Verbose -Message 'Check ModulePath.' + + if ($ModulePath) + { + if (-not (Test-WebConfigAppSetting ` + -WebConfigFullPath $webConfigFullPath ` + -AppSettingName 'ModulePath' ` + -ExpectedAppSettingValue $ModulePath)) + { + $desiredConfigurationMatch = $false + break + } + } + + Write-Verbose -Message 'Check ConfigurationPath.' + + if ($ConfigurationPath) + { + if (-not (Test-WebConfigAppSetting ` + -WebConfigFullPath $webConfigFullPath ` + -AppSettingName 'ConfigurationPath' ` + -ExpectedAppSettingValue $configurationPath)) + { + $desiredConfigurationMatch = $false + break + } + } + + Write-Verbose -Message 'Check RegistrationKeyPath.' + + if ($RegistrationKeyPath) + { + if (-not (Test-WebConfigAppSetting ` + -WebConfigFullPath $webConfigFullPath ` + -AppSettingName 'RegistrationKeyPath' ` + -ExpectedAppSettingValue $registrationKeyPath)) + { + $desiredConfigurationMatch = $false + break + } + } + + Write-Verbose -Message 'Check AcceptSelfSignedCertificates.' + + if ($AcceptSelfSignedCertificates) + { + Write-Verbose -Message "AcceptSelfSignedCertificates is enabled. Checking if module Selfsigned IIS module is configured for web site at '$webConfigFullPath'." + + if (Test-IISSelfSignedModuleInstalled) + { + if (-not (Test-IISSelfSignedModuleEnabled -EndpointName $EndpointName)) + { + Write-Verbose -Message 'Module not enabled in web site. Current configuration does not match the desired state.' + $desiredConfigurationMatch = $false + break + } + else + { + Write-Verbose -Message 'Module present in web site. Current configuration match the desired state.' + } + } + else + { + Write-Verbose -Message 'Selfsigned module not installed in IIS. Current configuration does not match the desired state.' + $desiredConfigurationMatch = $false + } + } + else + { + Write-Verbose -Message "AcceptSelfSignedCertificates is disabled. Checking if module Selfsigned IIS module is NOT configured for web site at '$webConfigFullPath'." + + if (Test-IISSelfSignedModuleInstalled) + { + if (-not (Test-IISSelfSignedModuleEnabled -EndpointName $EndpointName)) + { + Write-Verbose -Message 'Module not enabled in web site. Current configuration does match the desired state.' + } + else + { + Write-Verbose -Message 'Module present in web site. Current configuration does not match the desired state.' + $desiredConfigurationMatch = $false + break + } + } + else + { + Write-Verbose -Message 'Selfsigned module not installed in IIS. Current configuration does match the desired state.' + } + } + } + + Write-Verbose -Message 'Check UseSecurityBestPractices.' + + if ($UseSecurityBestPractices) + { + if (-not (Test-UseSecurityBestPractice -DisableSecurityBestPractices $DisableSecurityBestPractices)) + { + $desiredConfigurationMatch = $false + Write-Verbose -Message 'The state of security settings does not match the desired state.' + break + } + } + + $stop = $false + } + while ($stop) + + return $desiredConfigurationMatch +} + +<# + .SYNOPSIS + The function returns the OS version string detected by .NET. + + .DESCRIPTION + The function returns the OS version which ahs been detected + by .NET. The function is added so that the dectection of the OS + is mockable in Pester tests. + + .OUTPUTS + System.String. The operating system version. +#> +function Get-OSVersion +{ + [CmdletBinding()] + [OutputType([System.String])] + param () + + # Moved to a function to allow for the behaviour to be mocked. + return [System.Environment]::OSVersion.Version +} + +#region IIS Utils + +<# + .SYNOPSIS + Returns the configuration value for a module settings from + web.config. + + .PARAMETER WebConfigFullPath + The full path to the web.config. + + .PARAMETER ModuleName + The name of the IIS module. + + .OUTPUTS + System.String. The configured value. +#> +function Get-WebConfigModulesSetting +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $WebConfigFullPath, + + [Parameter(Mandatory = $true)] + [System.String] + $ModuleName + ) + + $moduleValue = '' + + if (Test-Path -Path $WebConfigFullPath) + { + $webConfigXml = [Xml] (Get-Content -Path $WebConfigFullPath) + $root = $webConfigXml.get_DocumentElement() + + foreach ($item in $root.'system.webServer'.modules.add) + { + if ($item.name -eq $ModuleName) + { + $moduleValue = $item.name + break + } + } + } + + return $moduleValue +} + +<# + .SYNOPSIS + Unlocks a specifc authentication configuration section for a IIS website. + + .PARAMETER WebSite + The name of the website. + + .PARAMETER Authentication + The authentication section which should be unlocked. + + .OUTPUTS + System.String. The configured value. +#> +function Update-LocationTagInApplicationHostConfigForAuthentication +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $WebSite, + + [Parameter(Mandatory = $true)] + [ValidateSet('anonymous', 'basic', 'windows')] + [System.String] + $Authentication + ) + + $webAdminSrvMgr = Get-IISServerManager + $appHostConfig = $webAdminSrvMgr.GetApplicationHostConfiguration() + + $authenticationType = $Authentication + 'Authentication' + $appHostConfigSection = $appHostConfig.GetSection("system.webServer/security/authentication/$authenticationType", $WebSite) + $appHostConfigSection.OverrideMode = 'Allow' + $webAdminSrvMgr.CommitChanges() +} + +<# + .SYNOPSIS + Returns an instance of the Microsoft.Web.Administration.ServerManager. + + .OUTPUTS + The server manager as Microsoft.Web.Administration.ServerManager. +#> +function Get-IISServerManager +{ + [CmdletBinding()] + [OutputType([System.Object])] + param () + + $iisInstallPath = (Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\INetStp' -Name InstallPath).InstallPath + + if (-not $iisInstallPath) + { + throw ($script:localizedData.IISInstallationPathNotFound) + } + + $assyPath = Join-Path -Path $iisInstallPath -ChildPath 'Microsoft.Web.Administration.dll' -Resolve -ErrorAction:SilentlyContinue + + if (-not $assyPath) + { + throw ($script:localizedData.IISWebAdministrationAssemblyNotFound) + } + + $assy = [System.Reflection.Assembly]::LoadFrom($assyPath) + return [System.Activator]::CreateInstance($assy.FullName, 'Microsoft.Web.Administration.ServerManager').Unwrap() +} + +<# + .SYNOPSIS + Tests if a module installation status is equal to an expected status. + + .PARAMETER WebConfigFullPath + The full path to the web.config. + + .PARAMETER ModuleName + The name of the IIS module for which the state should be checked. + + .PARAMETER ExpectedInstallationStatus + Test if the module is installed ($true) or absent ($false). + + .OUTPUTS + Returns true if the current installation status is equal to the expected + installation status. +#> +function Test-WebConfigModulesSetting +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $WebConfigFullPath, + + [Parameter(Mandatory = $true)] + [System.String] + $ModuleName, + + [Parameter(Mandatory = $true)] + [Boolean] + $ExpectedInstallationStatus + ) + + if (Test-Path -Path $WebConfigFullPath) + { + $webConfigXml = [Xml] (Get-Content -Path $WebConfigFullPath) + $root = $webConfigXml.get_DocumentElement() + + foreach ($item in $root.'system.webServer'.modules.add) + { + if ( $item.name -eq $ModuleName ) + { + return $ExpectedInstallationStatus -eq $true + } + } + } + else + { + Write-Warning -Message "Test-WebConfigModulesSetting: web.config file not found at '$WebConfigFullPath'" + } + + return $ExpectedInstallationStatus -eq $false +} + +<# + .SYNOPSIS + Tests if a the currently configured path for a website is equal to a given + path. + + .PARAMETER EndpointName + The endpoint name (website name) to test. + + .PARAMETER PhysicalPath + The full physical path to check. + + .OUTPUTS + Returns true if the current installation status is equal to the expected + installation status. +#> +function Test-WebsitePath +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $EndpointName, + + [Parameter(Mandatory = $true)] + [System.String] + $PhysicalPath + ) + + $pathNeedsUpdating = $false + + if ((Get-ItemProperty -Path "IIS:\Sites\$EndpointName" -Name physicalPath) -ne $PhysicalPath) + { + $pathNeedsUpdating = $true + } + + return $pathNeedsUpdating +} + +<# + .SYNOPSIS + Test if a currently configured app setting is equal to a given value. + + .PARAMETER WebConfigFullPath + The full path to the web.config. + + .PARAMETER AppSettingName + The app setting name to check. + + .PARAMETER ExpectedAppSettingValue + The expected value. + + .OUTPUTS + Returns true if the current value is equal to the expected value. +#> +function Test-WebConfigAppSetting +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $WebConfigFullPath, + + [Parameter(Mandatory = $true)] + [System.String] + $AppSettingName, + + [Parameter(Mandatory = $true)] + [System.String] + $ExpectedAppSettingValue + ) + + $returnValue = $true + + if (Test-Path -Path $WebConfigFullPath) + { + $webConfigXml = [System.Xml.XmlDocument] (Get-Content -Path $WebConfigFullPath) + $root = $webConfigXml.get_DocumentElement() + + foreach ($item in $root.appSettings.add) + { + if ( $item.key -eq $AppSettingName ) + { + break + } + } + + if ($item.value -ne $ExpectedAppSettingValue) + { + $returnValue = $false + Write-Verbose -Message "The state of Web.Config AppSetting '$AppSettingName' does not match the desired state." + } + } + + return $returnValue +} + +<# + .SYNOPSIS + Helper function to Get the specified Web.Config App Setting. + + .PARAMETER WebConfigFullPath + The full path to the web.config. + + .PARAMETER AppSettingName + The app settings name to get the value for. + + .OUTPUTS + The current app settings value. +#> +function Get-WebConfigAppSetting +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $WebConfigFullPath, + + [Parameter(Mandatory = $true)] + [System.String] + $AppSettingName + ) + + $appSettingValue = '' + + if (Test-Path -Path $WebConfigFullPath) + { + $webConfigXml = [System.Xml.XmlDocument] (Get-Content -Path $WebConfigFullPath) + $root = $webConfigXml.get_DocumentElement() + + foreach ($item in $root.appSettings.add) + { + if ($item.key -eq $AppSettingName) + { + $appSettingValue = $item.value + break + } + } + } + + return $appSettingValue +} + +#endregion + +#region IIS Selfsigned Certficate Module + +New-Variable -Name iisSelfSignedModuleAssemblyName -Value 'IISSelfSignedCertModule.dll' -Option ReadOnly -Scope Script +New-Variable -Name iisSelfSignedModuleName -Value 'IISSelfSignedCertModule(32bit)' -Option ReadOnly -Scope Script + +<# + .SYNOPSIS + Get a powershell command instance for appcmd.exe. + + .OUTPUTS + The appcmd.exe as System.Management.Automation.CommandInfo. +#> +function Get-IISAppCmd +{ + [CmdletBinding()] + [OutputType([System.Management.Automation.CommandInfo])] + param () + + Push-Location -Path "$env:windir\system32\inetsrv" + $appCmd = Get-Command -Name '.\appcmd.exe' -CommandType 'Application' -ErrorAction 'Stop' + Pop-Location + $appCmd +} + +<# + .SYNOPSIS + Tests if two files differ. + + .PARAMETER SourceFilePath + Path to the source file. + + .PARAMETER DestinationFilePath + Path to the destination file. + + .OUTPUTS + Returns true if the two files differ. +#> +function Test-FilesDiffer +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript( { Test-Path -PathType Leaf -LiteralPath $_ })] + [System.String] + $SourceFilePath, + + [Parameter()] + [System.String] + $DestinationFilePath + ) + + Write-Verbose -Message "Testing for file difference between '$SourceFilePath' and '$DestinationFilePath'." + + if (Test-Path -LiteralPath $DestinationFilePath) + { + if (Test-Path -LiteralPath $DestinationFilePath -PathType Container) + { + throw "$DestinationFilePath is a container (Directory) not a leaf (File)" + } + + Write-Verbose -Message "Destination file already exists at '$DestinationFilePath'." + $md5Dest = Get-FileHash -LiteralPath $destinationFilePath -Algorithm MD5 + $md5Src = Get-FileHash -LiteralPath $sourceFilePath -Algorithm MD5 + return $md5Src.Hash -ne $md5Dest.Hash + } + else + { + Write-Verbose -Message "Destination file does not exist at '$DestinationFilePath'." + return $true + } +} + +<# + .SYNOPSIS + Tests if the IISSelfSignedModule module is installed. + + .OUTPUTS + Returns true if the module is installed. +#> +function Test-IISSelfSignedModuleInstalled +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param () + + ('' -ne ((& (Get-IISAppCmd) list config -section:system.webServer/globalModules) -like "*$iisSelfSignedModuleName*")) +} + +<# + .SYNOPSIS + Install the IISSelfSignedModule module. + + .PARAMETER Enable32BitAppOnWin64 + If set install the module as 32bit module. +#> +function Install-IISSelfSignedModule +{ + [CmdletBinding()] + param + ( + [Parameter()] + [Switch] + $Enable32BitAppOnWin64 + ) + + if ($Enable32BitAppOnWin64) + { + Write-Verbose -Message "Install-IISSelfSignedModule: Providing '$iisSelfSignedModuleAssemblyName' to run in a 32 bit process." + + $sourceFilePath = Join-Path -Path "$env:windir\SysWOW64\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PullServer" ` + -ChildPath $iisSelfSignedModuleAssemblyName + $destinationFolderPath = "$env:windir\SysWOW64\inetsrv" + + Copy-Item -Path $sourceFilePath -Destination $destinationFolderPath -Force + } + + if (Test-IISSelfSignedModuleInstalled) + { + Write-Verbose -Message "Install-IISSelfSignedModule: module '$iisSelfSignedModuleName' already installed." + } + else + { + Write-Verbose -Message "Install-IISSelfSignedModule: Installing module '$iisSelfSignedModuleName'." + $sourceFilePath = Join-Path -Path "$env:windir\System32\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PullServer" ` + -ChildPath $iisSelfSignedModuleAssemblyName + $destinationFolderPath = "$env:windir\System32\inetsrv" + $destinationFilePath = Join-Path -Path $destinationFolderPath ` + -ChildPath $iisSelfSignedModuleAssemblyName + + if (Test-FilesDiffer -SourceFilePath $sourceFilePath -DestinationFilePath $destinationFilePath) + { + # Might fail if the DLL has already been loaded by the IIS from a former PullServer Deployment + Copy-Item -Path $sourceFilePath -Destination $destinationFolderPath -Force + } + else + { + Write-Verbose -Message "Install-IISSelfSignedModule: module '$iisSelfSignedModuleName' already installed at '$destinationFilePath' with the correct version." + } + + Write-Verbose -Message "Install-IISSelfSignedModule: globally activating module '$iisSelfSignedModuleName'." + + & (Get-IISAppCmd) install module /name:$iisSelfSignedModuleName /image:$destinationFilePath /add:false /lock:false + } +} + +<# + .SYNOPSIS + Enable the IISSelfSignedModule module for a specific website (endpoint). + + .PARAMETER EndpointName + The endpoint (website) for which the module should be enabled. + + .PARAMETER Enable32BitAppOnWin64 + If set enable the module as a 32bit module. +#> +function Enable-IISSelfSignedModule +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EndpointName, + + [Parameter()] + [Switch] + $Enable32BitAppOnWin64 + ) + + Write-Verbose -Message "Enable-IISSelfSignedModule: EndpointName '$EndpointName' and Enable32BitAppOnWin64 '$Enable32BitAppOnWin64'" + + Install-IISSelfSignedModule -Enable32BitAppOnWin64:$Enable32BitAppOnWin64 + $preConditionBitnessArgumentFor32BitInstall = '' + + if ($Enable32BitAppOnWin64) + { + $preConditionBitnessArgumentFor32BitInstall = '/preCondition:bitness32' + } + + & (Get-IISAppCmd) add module /name:$iisSelfSignedModuleName /app.name:"$EndpointName/" $preConditionBitnessArgumentFor32BitInstall +} + +<# + .SYNOPSIS + Disable the IISSelfSignedModule module for a specific website (endpoint). + + .PARAMETER EndpointName + The endpoint (website) for which the module should be disabled. +#> +function Disable-IISSelfSignedModule +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String]$EndpointName + ) + + Write-Verbose -Message "Disable-IISSelfSignedModule: EndpointName '$EndpointName'" + + & (Get-IISAppCmd) delete module /name:$iisSelfSignedModuleName /app.name:"$EndpointName/" +} + +<# + .SYNOPSIS + Tests if the IISSelfSignedModule module is enabled for a website (endpoint). + + .PARAMETER EndpointName + The endpoint (website) for which the status should be checked. + + .OUTPUTS + Returns true if the module is enabled. +#> +function Test-IISSelfSignedModuleEnabled +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $EndpointName + ) + + Write-Verbose -Message "Test-IISSelfSignedModuleEnabled: EndpointName '$EndpointName'" + + $webSite = Get-Website -Name $EndpointName + + if ($webSite) + { + $webConfigFullPath = Join-Path -Path $website.physicalPath -ChildPath 'web.config' + Write-Verbose -Message "Test-IISSelfSignedModuleEnabled: web.confg path '$webConfigFullPath'" + Test-WebConfigModulesSetting -WebConfigFullPath $webConfigFullPath -ModuleName $iisSelfSignedModuleName -ExpectedInstallationStatus $true + } + else + { + throw "Website '$EndpointName' not found" + } +} + +#endregion + +#region Certificate Utils + +<# + .SYNOPSIS + Returns a certificate thumbprint from a certificate with a matching subject. + + .DESCRIPTION + Retreives a list of certificates from the a certificate store. + From this list all certificates will be checked to see if they match the supplied Subject and Template. + If one certificate is found the thumbrpint is returned. Otherwise an error is thrown. + + .PARAMETER Subject + The subject of the certificate to find the thumbprint of. + + .PARAMETER TemplateName + The template used to create the certificate to find the subject of. + + .PARAMETER Store + The certificate store to retrieve certificates from. + + .NOTES + Uses certificate Oid mapping: + 1.3.6.1.4.1.311.20.2 = Certificate Template Name + 1.3.6.1.4.1.311.21.7 = Certificate Template Information +#> +function Find-CertificateThumbprintWithSubjectAndTemplateName +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Subject, + + [Parameter(Mandatory = $true)] + [System.String] + $TemplateName, + + [Parameter()] + [System.String] + $Store = 'Cert:\LocalMachine\My' + ) + + $filteredCertificates = @() + + foreach ($oidFriendlyName in 'Certificate Template Name', 'Certificate Template Information') + { + # Only get certificates created from a template otherwise filtering by subject and template name will cause errors + [System.Array] $certificatesFromTemplates = (Get-ChildItem -Path $Store).Where{ + $_.Extensions.Oid.FriendlyName -contains $oidFriendlyName + } + + switch ($oidFriendlyName) + { + 'Certificate Template Name' + { + $templateMatchString = $TemplateName + } + + 'Certificate Template Information' + { + $templateMatchString = '^Template={0}' -f $TemplateName + } + } + + $filteredCertificates += $certificatesFromTemplates.Where{ + $_.Subject -eq $Subject -and + $_.Extensions.Where{ + $_.Oid.FriendlyName -eq $oidFriendlyName + }.Format($false) -match $templateMatchString + } + } + + if ($filteredCertificates.Count -eq 1) + { + return $filteredCertificates.Thumbprint + } + elseif ($filteredCertificates.Count -gt 1) + { + throw ($script:localizedData.FindCertificateBySubjectMultiple -f $Subject, $TemplateName) + } + else + { + throw ($script:localizedData.FindCertificateBySubjectNotFound -f $Subject, $TemplateName) + } +} + +#endregion + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/DSC_xDSCWebService.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/DSC_xDSCWebService.schema.mof new file mode 100644 index 0000000..28be58d --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/DSC_xDSCWebService.schema.mof @@ -0,0 +1,25 @@ +[ClassVersion("1.0.0"), FriendlyName("xDSCWebService")] +class DSC_xDSCWebService : OMI_BaseResource +{ + [Key, Description("Prefix of the WCF SVC file.")] string EndpointName; + [Write, Description("Specifies is self-signed certs will be accepted for client authentication.")] boolean AcceptSelfSignedCertificates; + [Write, Description("The IIS ApplicationPool to use for the Pull Server. If not specified a pool with name 'PSWS' will be created.")] string ApplicationPoolName; + [Write, Description("The subject of the Certificate in CERT:\\LocalMachine\\MY\\ for Pull Server.")] string CertificateSubject; + [Write, Description("The certificate Template Name of the Certificate in CERT:\\LocalMachine\\MY\\ for Pull Server.")] string CertificateTemplateName; + [Write, Description("The thumbprint of the Certificate in CERT:\\LocalMachine\\MY\\ for Pull Server.")] string CertificateThumbPrint; + [Write, Description("The location on the disk where the Configuration is stored.")] string ConfigurationPath; + [Write, Description("Enable incomming firewall exceptions for the configured DSC Pull Server port. Defaults to true.")] boolean ConfigureFirewall; + [Write, Description("The location on the disk where the database is stored.")] string DatabasePath; + [Write, Description("A list of exceptions to the security best practices to apply."), ValueMap{"SecureTLSProtocols"},Values{"SecureTLSProtocols"}] string DisableSecurityBestPractices []; + [Write, Description("Enable the DSC Pull Server to run in a 32-bit process on a 64-bit operating system.")] boolean Enable32BitAppOnWin64; + [Write, Description("Specifies if the DSC Web Service should be installed."), ValueMap{"Present","Absent"},Values{"Present","Absent"}] string Ensure; + [Write, Description("The location on the disk where the Modules are stored.")] string ModulePath; + [Write, Description("The physical path for the IIS Endpoint on the machine (usually under inetpub).")] string PhysicalPath; + [Write, Description("The port number of the DSC Pull Server IIS Endpoint.")] uint32 Port; + [Write, Description("The location on the disk where the RegistrationKeys file is stored.")] string RegistrationKeyPath; + [Write, Description("The connection string to use to connect to the SQL server backend database. Required if SqlProvider is true.")] string SqlConnectionString; + [Write, Description("Enable DSC Pull Server to use SQL server as the backend database.")] boolean SqlProvider; + [Write, Description("Specifies the state of the DSC Web Service."), ValueMap{"Started","Stopped"},Values{"Started","Stopped"}] string State; + [Required, Description("This property will ensure that the Pull Server is created with the most secure practices.")] boolean UseSecurityBestPractices; + [Read, Description("The URL of the DSC Pull Server.")] string DSCServerUrl; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/en-US/DSC_xDSCWebService.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/en-US/DSC_xDSCWebService.strings.psd1 new file mode 100644 index 0000000..28cdc70 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xDSCWebService/en-US/DSC_xDSCWebService.strings.psd1 @@ -0,0 +1,11 @@ +# culture="en-US" +ConvertFrom-StringData -StringData @' + ThrowCertificateThumbprint = CertificateThumbprint must contain a certificate thumbprint, or "AllowUnencryptedTraffic" to opt-out from being secure. + ThrowUseSecurityBestPractice = Error: Cannot use best practice security settings with unencrypted traffic. Please set UseSecurityBestPractices to $false or use a certificate to encrypt pull server traffic. + FindCertificateBySubjectMultiple = More than one certificate found with subject containing {0} and using template "{1}". + FindCertificateBySubjectNotFound = Certificate not found with subject containing {0} and using template "{1}". + IISInstallationPathNotFound = IIS installation path not found + IISWebAdministrationAssemblyNotFound = IIS version of Microsoft.Web.Administration.dll not found + ConfigFirewallDeprecated = The support for configuring firewall rules is deprecated. Please set ConfigureFirewall to false and use the Firewall resource from NetworkingDSC module to configure required firewall rules. + ThrowApplicationPoolNotFound = IIS Application pool "{0}" not found. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/DSC_xEnvironmentResource.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/DSC_xEnvironmentResource.psm1 new file mode 100644 index 0000000..90f6261 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/DSC_xEnvironmentResource.psm1 @@ -0,0 +1,1156 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xEnvironmentResource' + +$script:envVarRegPathMachine = 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' +$script:envVarRegPathUser = 'HKCU:\Environment' + +$script:maxSystemEnvVariableLength = 1024 +$script:maxUserEnvVariableLength = 255 + +<# + .SYNOPSIS + Retrieves the state of the environment variable. If both Machine and Process Target are + specified, only the machine value will be returned. + + .PARAMETER Name + The name of the environment variable to retrieve. + + .PARAMETER Target + Indicates where to retrieve the variable: The machine or the process. If both are indicated + then only the value from the machine is returned. + The default is both since that is the default for the rest of the resource. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Process', 'Machine')] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Target = ('Process', 'Machine') + ) + + $valueToReturn = $null + + if ($Target -contains 'Machine') + { + $environmentVaraible = Get-EnvironmentVariableWithoutExpanding -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -ne $environmentVaraible) + { + $valueToReturn = $environmentVaraible.$Name + } + } + else + { + $valueToReturn = Get-ProcessEnvironmentVariable -Name $Name + } + + $environmentResource = @{ + Name = $Name + Value = $null + Ensure = 'Absent' + } + + if ($null -eq $valueToReturn) + { + Write-Verbose -Message ($script:localizedData.EnvVarNotFound -f $Name) + } + else + { + Write-Verbose -Message ($script:localizedData.EnvVarFound -f $Name, $valueToReturn) + $environmentResource.Ensure = 'Present' + $environmentResource.Value = $valueToReturn + } + + return $environmentResource +} + +<# + .SYNOPSIS + Creates, modifies, or removes an environment variable. + + .PARAMETER Name + The name of the environment variable to create, modify, or remove. + + .PARAMETER Value + The value to set the environment variable to. + If a value is not provided, the variable cannot be created. + If Ensure is set to Present, the variable does not already exist, and a value is not + specified, an error will be thrown indicating that the variable cannot be created without + a specified value. If Ensure is set to Present, the variable already exists, and no value + is specified, nothing will be changed. + + .PARAMETER Ensure + Specifies whether the variable should exist or not. + To ensure that the variable or value does exist, set this property to Present. + To ensure that the variable or value does not exist, set this property to Absent. + The default value is Present. + + .PARAMETER Path + Indicates whether or not this is a path variable. If this property is set to True, + the value provided through the Value property will be appended to (or removed from if + Ensure is set to Absent) the existing value. + If this property is set to False, the existing value will be replaced by the new Value. + The default value is False. + + .PARAMETER Target + Indicates where to set the environment variable: The machine, the process, or both. + The default is both: ('Process', 'Machine') +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Value = [System.String]::Empty, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $Path = $false, + + [Parameter()] + [ValidateSet('Process', 'Machine')] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Target = ('Process', 'Machine') + ) + + $valueSpecified = ($Value -ne [System.String]::Empty) + $currentValueFromMachine = $null + $currentValueFromProcess = $null + $currentPropertiesFromMachine = $null + + $setMachineVariable = ($Target -contains 'Machine') + $setProcessVariable = ($Target -contains 'Process') + + if ($setMachineVariable) + { + if ($Path) + { + $currentPropertiesFromMachine = Get-EnvironmentVariableWithoutExpanding -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -ne $currentPropertiesFromMachine) + { + $currentValueFromMachine = $currentPropertiesFromMachine.$Name + } + } + else + { + $currentPropertiesFromMachine = Get-ItemProperty -Path $script:envVarRegPathMachine -Name $Name -ErrorAction 'SilentlyContinue' + $currentValueFromMachine = Get-EnvironmentVariable -Name $Name -Target 'Machine' + } + } + + if ($setProcessVariable) + { + $currentValueFromProcess = Get-EnvironmentVariable -Name $Name -Target 'Process' + } + + # A different value of the environment variable needs to be displayed depending on the Target + $currentValueToDisplay = '' + if ($setMachineVariable -and $setProcessVariable) + { + $currentValueToDisplay = "Machine: $currentValueFromMachine, Process: $currentValueFromProcess" + } + elseif ($setMachineVariable) + { + $currentValueToDisplay = $currentValueFromMachine + } + else + { + $currentValueToDisplay = $currentValueFromProcess + } + + if ($Ensure -eq 'Present') + { + $createMachineVariable = ((-not $setMachineVariable) -or ($null -eq $currentPropertiesFromMachine) -or ($currentValueFromMachine -eq [System.String]::Empty)) + $createProcessVariable = ((-not $setProcessVariable) -or ($null -eq $currentValueFromProcess) -or ($currentValueFromProcess -eq [System.String]::Empty)) + + if ($createMachineVariable -and $createProcessVariable) + { + if (-not $valueSpecified) + { + <# + If the environment variable doesn't exist and no value is passed in + then there is nothing to set - so throw an error. + #> + + New-InvalidOperationException -Message ($script:localizedData.CannotSetValueToEmpty -f $Name) + } + + <# + Given the specified $Name environment variable hasn't been created or set + simply create one with the specified value and return. + Both path and non-path cases are covered by this. + #> + + Set-EnvironmentVariable -Name $Name -Value $Value -Target $Target + + Write-Verbose -Message ($script:localizedData.EnvVarCreated -f $Name, $Value) + return + } + + if (-not $valueSpecified) + { + <# + Given no $Value was specified to be set and the variable exists, + we'll leave the existing variable as is. + This covers both path and non-path variables. + #> + + Write-Verbose -Message ($script:localizedData.EnvVarUnchanged -f $Name, $currentValueToDisplay) + return + } + + # Check if an empty, whitespace or semi-colon only string has been specified. If yes, return unchanged. + $trimmedValue = $Value.Trim(';').Trim() + + if ([System.String]::IsNullOrEmpty($trimmedValue)) + { + Write-Verbose -Message ($script:localizedData.EnvVarPathUnchanged -f $Name, $currentValueToDisplay) + return + } + + if (-not $Path) + { + # For non-path variables, simply set the specified $Value as the new value of the specified + # variable $Name for the given $Target + + if (($setMachineVariable -and ($Value -cne $currentValueFromMachine)) -or ` + ($setProcessVariable -and ($Value -cne $currentValueFromProcess))) + { + Set-EnvironmentVariable -Name $Name -Value $Value -Target $Target + Write-Verbose -Message ($script:localizedData.EnvVarUpdated -f $Name, $currentValueToDisplay, $Value) + } + else + { + Write-Verbose -Message ($script:localizedData.EnvVarUnchanged -f $Name, $currentValueToDisplay) + } + + return + } + + # If the control reaches here, the specified variable exists, it is a path variable, and a value has been specified to be set. + + if ($setMachineVariable) + { + $valueUnchanged = Test-PathsInValue -ExistingPaths $currentValueFromMachine -QueryPaths $trimmedValue -FindCriteria 'All' + + if ($currentValueFromMachine -and -not $valueUnchanged) + { + $updatedValue = Add-PathsToValue -CurrentValue $currentValueFromMachine -NewValue $trimmedValue + Set-EnvironmentVariable -Name $Name -Value $updatedValue -Target @('Machine') + Write-Verbose -Message ($script:localizedData.EnvVarPathUpdated -f $Name, $currentValueFromMachine, $updatedValue) + } + else + { + Write-Verbose -Message ($script:localizedData.EnvVarPathUnchanged -f $Name, $currentValueFromMachine) + } + } + + if ($setProcessVariable) + { + $valueUnchanged = Test-PathsInValue -ExistingPaths $currentValueFromProcess -QueryPaths $trimmedValue -FindCriteria 'All' + + if ($currentValueFromProcess -and -not $valueUnchanged) + { + $updatedValue = Add-PathsToValue -CurrentValue $currentValueFromProcess -NewValue $trimmedValue + Set-EnvironmentVariable -Name $Name -Value $updatedValue -Target @('Process') + Write-Verbose -Message ($script:localizedData.EnvVarPathUpdated -f $Name, $currentValueFromProcess, $updatedValue) + } + else + { + Write-Verbose -Message ($script:localizedData.EnvVarPathUnchanged -f $Name, $currentValueFromProcess) + } + } + } + + # Ensure = 'Absent' + else + { + $machineVariableRemoved = ((-not $setMachineVariable) -or ($null -eq $currentPropertiesFromMachine)) + $processVariableRemoved = ((-not $setProcessVariable) -or ($null -eq $currentValueFromProcess)) + + if ($machineVariableRemoved -and $processVariableRemoved) + { + # Variable not found, condition is satisfied and there is nothing to set/remove, return + Write-Verbose -Message ($script:localizedData.EnvVarNotFound -f $Name) + return + } + + if ((-not $ValueSpecified) -or (-not $Path)) + { + <# + If $Value is not specified or if $Value is a non-path variable, + simply remove the environment variable. + #> + + Remove-EnvironmentVariable -Name $Name -Target $Target + + Write-Verbose -Message ($script:localizedData.EnvVarRemoved -f $Name) + return + } + + # Check if an empty string or semi-colon only string has been specified as $Value. If yes, return unchanged as we don't need to remove anything. + $trimmedValue = $Value.Trim(';').Trim() + + if ([System.String]::IsNullOrEmpty($trimmedValue)) + { + Write-Verbose -Message ($script:localizedData.EnvVarPathUnchanged -f $Name, $currentValueToDisplay) + return + } + + # If the control reaches here: target variable is an existing environment path-variable and a specified $Value needs be removed from it + + if ($setMachineVariable) + { + $finalPath = $null + + if ($currentValueFromMachine) + { + <# + If this value returns $null or an empty string, than the entire path should be removed. + If it returns the same value as the path that was passed in, than nothing needs to be + updated, otherwise, only the specified paths were removed but there are still others + that need to be left in, so the path variable is updated to remove only the specified paths. + #> + $finalPath = Remove-PathsFromValue -CurrentValue $currentValueFromMachine -PathsToRemove $trimmedValue + } + + if ([System.String]::IsNullOrEmpty($finalPath)) + { + Remove-EnvironmentVariable -Name $Name -Target @('Machine') + Write-Verbose -Message ($script:localizedData.EnvVarRemoved -f $Name) + } + elseif ($finalPath -ceq $currentValueFromMachine) + { + Write-Verbose -Message ($script:localizedData.EnvVarPathUnchanged -f $Name, $currentValueFromMachine) + } + else + { + Set-EnvironmentVariable -Name $Name -Value $finalPath -Target @('Machine') + Write-Verbose -Message ($script:localizedData.EnvVarPathUpdated -f $Name, $currentValueFromMachine, $finalPath) + } + } + + if ($setProcessVariable) + { + $finalPath = $null + + if ($currentValueFromProcess) + { + <# + If this value returns $null or an empty string, than the entire path should be removed. + If it returns the same value as the path that was passed in, than nothing needs to be + updated, otherwise, only the specified paths were removed but there are still others + that need to be left in, so the path variable is updated to remove only the specified paths. + #> + $finalPath = Remove-PathsFromValue -CurrentValue $currentValueFromProcess -PathsToRemove $trimmedValue + } + + if ([System.String]::IsNullOrEmpty($finalPath)) + { + Remove-EnvironmentVariable -Name $Name -Target @('Process') + Write-Verbose -Message ($script:localizedData.EnvVarRemoved -f $Name) + } + elseif ($finalPath -ceq $currentValueFromProcess) + { + Write-Verbose -Message ($script:localizedData.EnvVarPathUnchanged -f $Name, $currentValueFromProcess) + } + else + { + Set-EnvironmentVariable -Name $Name -Value $finalPath -Target @('Process') + Write-Verbose -Message ($script:localizedData.EnvVarPathUpdated -f $Name, $currentValueFromProcess, $finalPath) + } + } + } +} + +<# + .SYNOPSIS + Tests if the environment variable is in the desired state. + + .PARAMETER Name + The name of the environment variable to test. + + .PARAMETER Value + The value of the environment variable to test. If no value is specified then only the + existence of the variable will be checked. + + .PARAMETER Ensure + Specifies whether the variable should exist or not. + To test that the variable does exist, set this property to Present. + To test that the variable does not exist, set this property to Absent. + The default value is Present. + + .PARAMETER Path + Indicates whether or not this is a path variable. If this property is set to True, + the value(s) provided through the Value property will be checked against all existing + values already set in this variable. + If this property is set to False, the value will be compared directly to the existing value. + The default value is False. + + .PARAMETER Target + Indicates where to test the environment variable: The machine, the process, or both. + The default is both: ('Process', 'Machine') +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateNotNull()] + [System.String] + $Value, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $Path = $false, + + [Parameter()] + [ValidateSet('Process', 'Machine')] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Target = ('Process', 'Machine') + ) + + $valueSpecified = $PSBoundParameters.ContainsKey('Value') -and ($Value -ne [System.String]::Empty) + $currentValueFromMachine = $null + $currentValueFromProcess = $null + $currentPropertiesFromMachine = $null + + $checkMachineTarget = ($Target -contains 'Machine') + $checkProcessTarget = ($Target -contains 'Process') + + if ($checkMachineTarget) + { + if ($Path) + { + $currentPropertiesFromMachine = Get-EnvironmentVariableWithoutExpanding -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -ne $currentPropertiesFromMachine) + { + $currentValueFromMachine = $currentPropertiesFromMachine.$Name + } + } + else + { + $currentPropertiesFromMachine = Get-ItemProperty -Path $script:envVarRegPathMachine -Name $Name -ErrorAction 'SilentlyContinue' + $currentValueFromMachine = Get-EnvironmentVariable -Name $Name -Target 'Machine' + } + } + + if ($checkProcessTarget) + { + $currentValueFromProcess = Get-EnvironmentVariable -Name $Name -Target 'Process' + } + + # A different value of the environment variable needs to be displayed depending on the Target + $currentValueToDisplay = '' + if ($checkMachineTarget -and $checkProcessTarget) + { + $currentValueToDisplay = "Machine: $currentValueFromMachine, Process: $currentValueFromProcess" + } + elseif ($checkMachineTarget) + { + $currentValueToDisplay = $currentValueFromMachine + } + else + { + $currentValueToDisplay = $currentValueFromProcess + } + + if (($checkMachineTarget -and ($null -eq $currentPropertiesFromMachine)) -or ($checkProcessTarget -and ($null -eq $currentValueFromProcess))) + { + # Variable not found + Write-Verbose ($script:localizedData.EnvVarNotFound -f $Name) + return ($Ensure -eq 'Absent') + } + + if (-not $valueSpecified) + { + Write-Verbose ($script:localizedData.EnvVarFound -f $Name, $currentValueToDisplay) + return ($Ensure -eq 'Present') + } + + if (-not $Path) + { + # For this non-path variable, make sure that the specified $Value matches the current value. + + if (($checkMachineTarget -and ($Value -cne $currentValueFromMachine)) -or ` + ($checkProcessTarget -and ($Value -cne $currentValueFromProcess))) + { + Write-Verbose ($script:localizedData.EnvVarFoundWithMisMatchingValue -f $Name, $currentValueToDisplay, $Value) + return ($Ensure -eq 'Absent') + } + else + { + Write-Verbose ($script:localizedData.EnvVarFound -f $Name, $currentValueToDisplay) + return ($Ensure -eq 'Present') + } + } + + # If the control reaches here, the expected environment variable exists, it is a path variable and a $Value is specified to test against + if ($Ensure -eq 'Present') + { + if ($checkMachineTarget) + { + if (-not (Test-PathsInValue -ExistingPaths $currentValueFromMachine -QueryPaths $Value -FindCriteria 'All')) + { + # If the control reached here some part of the specified path ($Value) was not found in the existing variable, return failure + Write-Verbose ($script:localizedData.EnvVarFoundWithMisMatchingValue -f $Name, $currentValueToDisplay, $Value) + return $false + } + } + + if ($checkProcessTarget) + { + if (-not (Test-PathsInValue -ExistingPaths $currentValueFromProcess -QueryPaths $Value -FindCriteria 'All')) + { + # If the control reached here some part of the specified path ($Value) was not found in the existing variable, return failure + Write-Verbose ($script:localizedData.EnvVarFoundWithMisMatchingValue -f $Name, $currentValueToDisplay, $Value) + return $false + } + } + + # The specified path was completely present in the existing environment variable, return success + Write-Verbose ($script:localizedData.EnvVarFound -f $Name, $currentValueToDisplay) + return $true + } + # Ensure = 'Absent' + else + { + if ($checkMachineTarget) + { + if (Test-PathsInValue -ExistingPaths $currentValueFromMachine -QueryPaths $Value -FindCriteria 'Any') + { + # One of the specified paths in $Value exists in the environment variable path, thus the test fails + Write-Verbose ($script:localizedData.EnvVarFound -f $Name, $currentValueFromMachine) + return $false + } + } + + if ($checkProcessTarget) + { + if (Test-PathsInValue -ExistingPaths $currentValueFromProcess -QueryPaths $Value -FindCriteria 'Any') + { + # One of the specified paths in $Value exists in the environment variable path, thus the test fails + Write-Verbose ($script:localizedData.EnvVarFound -f $Name, $currentValueFromProcess) + return $false + } + } + + # If the control reached here, none of the specified paths were found in the existing path-variable, return success + Write-Verbose ($script:localizedData.EnvVarFoundWithMisMatchingValue -f $Name, $currentValueToDisplay, $Value) + return $true + } +} + +<# + .SYNOPSIS + Retrieves the value of the environment variable from the given Target. + + .PARAMETER Name + The name of the environment variable to retrieve the value from. + + .PARAMETER Target + Indicates where to retrieve the environment variable from. Currently, only + Process and Machine are being used, but User is included for future extension + of this resource. +#> +function Get-EnvironmentVariable +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Process', 'Machine')] + [System.String] + $Target + ) + + $valueToReturn = $null + + if ($Target -eq 'Process') + { + $valueToReturn = Get-ProcessEnvironmentVariable -Name $Name + } + elseif ($Target -eq 'Machine') + { + $retrievedProperty = Get-ItemProperty -Path $script:envVarRegPathMachine -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -ne $retrievedProperty) + { + $valueToReturn = $retrievedProperty.$Name + } + } + elseif ($Target -eq 'User') + { + $retrievedProperty = Get-ItemProperty -Path $script:envVarRegPathUser -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -ne $retrievedProperty) + { + $valueToReturn = $retrievedProperty.$Name + } + } + + return $valueToReturn +} + +<# + .SYNOPSIS + Wrapper function to retrieve an environment variable from the current process. + + .PARAMETER Name + The name of the variable to retrieve +#> +function Get-ProcessEnvironmentVariable +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name + ) + + return [System.Environment]::GetEnvironmentVariable($Name) +} + +<# + .SYNOPSIS + If there are any paths in NewPaths that aren't in CurrentValue they will be added + to the current paths value and a String will be returned containing all old paths + and new paths. Otherwise the original value will be returned unchanged. + + .PARAMETER CurrentValue + A semicolon-separated String containing the current path values. + + .PARAMETER NewPaths + A semicolon-separated String containing any paths that should be added to + the current value. If CurrentValue already contains a path, it will not be added. +#> +function Add-PathsToValue +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $CurrentValue, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $NewValue + ) + + $finalValue = $CurrentValue + ';' + $currentPaths = $CurrentValue -split ';' + $newPaths = $NewValue -split ';' + + foreach ($path in $newPaths) + { + if ($currentPaths -notcontains $path) + { + <# + If the control reached here, we didn't find this $specifiedPath in the $currentPaths, + so add it. + #> + + $finalValue += ($path + ';') + } + } + + # Remove any extraneous ';' at the end (and potentially start - as a side-effect) of the value to be set + return $finalValue.Trim(';') +} + +<# + .SYNOPSIS + If there are any paths in PathsToRemove that aren't in CurrentValue they will be removed + from the current paths value and either the new value will be returned if there are still + paths that remain, or an empty string will be returned if all paths were removed. + If none of the paths in PathsToRemove are in CurrentValue then this function will + return CurrentValue since nothing needs to be changed. + + .PARAMETER CurrentValue + A semicolon-separated String containing the current path values. + + .PARAMETER PathsToRemove + A semicolon-separated String containing any paths that should be removed from + the current value. +#> +function Remove-PathsFromValue +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $CurrentValue, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $PathsToRemove + ) + + $finalPath = '' + $specifiedPaths = $PathsToRemove -split ';' + $currentPaths = $CurrentValue -split ';' + $varAltered = $false + + foreach ($subpath in $currentPaths) + { + if ($specifiedPaths -contains $subpath) + { + <# + Found this $subpath as one of the $specifiedPaths, skip adding this to the final + value/path of this variable and mark the variable as altered. + #> + $varAltered = $true + } + else + { + # the current $subpath was not part of the $specifiedPaths (to be removed) so keep this $subpath in the finalPath + $finalPath += $subpath + ';' + } + } + + # Remove any extraneous ';' at the end (and potentially start - as a side-effect) of the $finalPath + $finalPath = $finalPath.Trim(';') + + if ($varAltered) + { + return $finalPath + } + else + { + return $CurrentValue + } +} + +<# + .SYNOPSIS + Sets the value of the environment variable with the given name if a value is specified. + If no value is specified, then the environment variable will be removed. + + .PARAMETER Name + The name of the environment variable to set or remove. + + .PARAMETER Value + The value to set the environment variable to. If not provided, then the variable will + be removed. + + .PARAMETER Target + Indicates where to set or remove the environment variable: The machine, the process, or both. + The logic for User is also included here for future expansion of this resource. +#> +function Set-EnvironmentVariable +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [System.String] + $Value, + + [Parameter(Mandatory = $true)] + [ValidateSet('Process', 'Machine')] + [System.String[]] + $Target + ) + + $valueSpecified = $PSBoundParameters.ContainsKey('Value') + + try + { + # If the Value is set to [System.String]::Empty then nothing should be updated for the process + if (($Target -contains 'Process') -and (-not $valueSpecified -or ($Value -ne [System.String]::Empty))) + { + if (-not $valueSpecified) + { + Set-ProcessEnvironmentVariable -Name $Name -Value $null + } + else + { + Set-ProcessEnvironmentVariable -Name $Name -Value $Value + } + } + + if ($Target -contains 'Machine') + { + if ($Name.Length -ge $script:maxSystemEnvVariableLength) + { + New-InvalidArgumentException -Message $script:localizedData.ArgumentTooLong -ArgumentName $Name + } + + $path = $script:envVarRegPathMachine + + if (-not $valueSpecified) + { + $environmentKey = Get-ItemProperty -Path $path -Name $Name -ErrorAction 'SilentlyContinue' + + if ($environmentKey) + { + Remove-ItemProperty -Path $path -Name $Name + } + else + { + $message = ($script:localizedData.RemoveNonExistentVarError -f $Name) + New-InvalidArgumentException -Message $message -ArgumentName $Name + } + } + else + { + Set-ItemProperty -Path $path -Name $Name -Value $Value + $environmentKey = Get-ItemProperty -Path $path -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -eq $environmentKey) + { + $message = ($script:localizedData.GetItemPropertyFailure -f $Name, $path) + New-InvalidArgumentException -Message $message -ArgumentName $Name + } + } + } + + # The User feature of this resource is not yet implemented. + if ($Target -contains 'User') + { + if ($Name.Length -ge $script:maxUserEnvVariableLength) + { + New-InvalidArgumentException -Message $script:localizedData.ArgumentTooLong -ArgumentName $Name + } + + $path = $script:envVarRegPathUser + + if (-not $valueSpecified) + { + $environmentKey = Get-ItemProperty -Path $path -Name $Name -ErrorAction 'SilentlyContinue' + + if ($environmentKey) + { + Remove-ItemProperty -Path $path -Name $Name + } + else + { + $message = ($script:localizedData.RemoveNonExistentVarError -f $Name) + New-InvalidArgumentException -Message $message -ArgumentName $Name + } + } + else + { + Set-ItemProperty -Path $path -Name $Name -Value $Value + $environmentKey = Get-ItemProperty -Path $path -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -eq $environmentKey) + { + $message = ($script:localizedData.GetItemPropertyFailure -f $Name, $path) + New-InvalidArgumentException -Message $message -ArgumentName $Name + } + } + } + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.EnvVarSetError -f $Name, $Value) ` + -ErrorRecord $_ + } + +} + +<# + .SYNOPSIS + Wrapper function to set an environment variable for the current process. + + .PARAMETER Name + The name of the environment variable to set. + + .PARAMETER Value + The value to set the environment variable to. +#> +function Set-ProcessEnvironmentVariable +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [System.String] + $Value = [System.String]::Empty + ) + + [System.Environment]::SetEnvironmentVariable($Name, $Value) +} + +<# + .SYNOPSIS + Removes an environment variable from the given target(s) by calling Set-EnvironmentVariable + with no Value specified. + + .PARAMETER Name + The name of the environment variable to remove. + + .PARAMETER Target + Indicates where to remove the environment variable from: The machine, the process, or both. +#> +function Remove-EnvironmentVariable +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Process', 'Machine')] + [System.String[]] + $Target + ) + + try + { + Set-EnvironmentVariable -Name $Name -Target $Target + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.EnvVarRemoveError -f $Name) ` + -ErrorRecord $_ + } +} + +<# + .SYNOPSIS + Tests all of the paths in QueryPaths against those in ExistingPaths. + If FindCriteria is set to 'All' then it will only return True if all of the + paths in QueryPaths are in ExistingPaths, otherwise it will return False. + If FindCriteria is set to 'Any' then it will return True if any of the paths + in QueryPaths are in ExistingPaths, otherwise it will return False. + + .PARAMETER ExistingPaths + A semicolon-separated String containing the path values to test against. + + .PARAMETER QueryPaths + A semicolon-separated String containing the path values to ensure are either + included or not included in ExistingPaths. + + .PARAMETER FindCriteria + Set to either 'All' or 'Any' to indicate whether all of the paths in QueryPaths + should be included in ExistingPaths or any of them. +#> +function Test-PathsInValue +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ExistingPaths, + + [Parameter(Mandatory = $true)] + [System.String] + $QueryPaths, + + [Parameter(Mandatory = $true)] + [ValidateSet('Any', 'All')] + [System.String] + $FindCriteria + ) + + $existingPathList = $ExistingPaths -split ';' + $queryPathList = $QueryPaths -split ';' + + switch ($FindCriteria) + { + 'Any' + { + foreach ($queryPath in $queryPathList) + { + if ($existingPathList -contains $queryPath) + { + # Found this $queryPath in the existing paths, return $true + return $true + } + } + + # If the control reached here, none of the QueryPaths were found in ExistingPaths + return $false + } + + 'All' + { + foreach ($queryPath in $queryPathList) + { + if ($queryPath) + { + if ($existingPathList -notcontains $queryPath) + { + # The current $queryPath wasn't found in any of the $existingPathList, return false + return $false + } + } + } + + # If the control reached here, all of the QueryPaths were found in ExistingPaths + return $true + } + } +} + +<# + .SYNOPSIS + Retrieves the Environment variable with the given name from the registry on the machine. + It returns the result as an object containing a Hashtable with the environment variable + name and its current value on the machine. This is to most closely represent what the + actual API call returns. If an environment variable with the given name is not found, then + $null will be returned. + + .PARAMETER Name + The name of the environment variable to retrieve the value of. +#> +function Get-EnvironmentVariableWithoutExpanding +{ + [OutputType([System.Management.Automation.PSObject])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.String] + $Name + ) + + $path = $script:envVarRegPathMachine + $pathTokens = $path.Split('\',[System.StringSplitOptions]::RemoveEmptyEntries) + $entry = $pathTokens[1..($pathTokens.Count - 1)] -join '\' + + # Since the target registry path coming to this function is hardcoded for local machine + $hive = [Microsoft.Win32.Registry]::LocalMachine + + $noteProperties = @{} + + try + { + $key = $hive.OpenSubKey($entry) + + $valueNames = $key.GetValueNames() + if ($valueNames -inotcontains $Name) + { + return $null + } + + [System.String] $value = Get-KeyValue -Name $Name -Key $key + $noteProperties.Add($Name, $value) + } + finally + { + if ($key) + { + $key.Close() + } + } + + [System.Management.Automation.PSObject] $propertyResults = New-Object -TypeName System.Management.Automation.PSObject -Property $noteProperties + + return $propertyResults +} + +<# + .SYNOPSIS + Wrapper function to get the value of the environment variable with the given name + from the specified registry key. + + .PARAMETER Name + The name of the environment variable to retrieve the value of. + + .PARAMETER Key + The key to retrieve the environment variable from. +#> +function Get-KeyValue +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [Microsoft.Win32.RegistryKey] + $Key + ) + + return $Key.GetValue($Name, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/DSC_xEnvironmentResource.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/DSC_xEnvironmentResource.schema.mof new file mode 100644 index 0000000..dc3c093 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/DSC_xEnvironmentResource.schema.mof @@ -0,0 +1,9 @@ +[ClassVersion("1.0.0"), FriendlyName("xEnvironment")] +class DSC_xEnvironmentResource : OMI_BaseResource +{ + [Key, Description("The name of the environment variable for which you want to ensure a specific state.")] String Name; + [Write, Description("The desired value for the environment variable.")] String Value; + [Write, Description("Specifies if the environment variable should exist."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Write, Description("Indicates whether or not the environment variable is the Path variable.")] Boolean Path; + [Write, Description("Indicates the target where the environment variable should be set."), ValueMap{"Process", "Machine"}, Values{"Process", "Machine"}] String Target[]; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/en-US/DSC_xEnvironmentResource.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/en-US/DSC_xEnvironmentResource.schema.mfl new file mode 100644 index 0000000..d6dff21 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/en-US/DSC_xEnvironmentResource.schema.mfl @@ -0,0 +1,9 @@ +[Description("The xEnvironment resource provides a mechanism to manage machine-wide environment variables.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xEnvironmentResource : OMI_BaseResource +{ + [Key, Description("The name of the environment variable for which you want to ensure a specific state.") : Amended] String Name; + [Description("The desired value for the environment variable.") : Amended] String Value; + [Description("Specifies if the environment varaible should exist.") : Amended] String Ensure; + [Description("Indicates whether or not the environment variable is the Path variable.") : Amended] Boolean Path; + [Description("Indicates the target where the environment variable should be set.") : Amended] String Target[]; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/en-US/DSC_xEnvironmentResource.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/en-US/DSC_xEnvironmentResource.strings.psd1 new file mode 100644 index 0000000..13b7bf3 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xEnvironmentResource/en-US/DSC_xEnvironmentResource.strings.psd1 @@ -0,0 +1,19 @@ +# Localized resources for DSC_xEnvironmentResource + +ConvertFrom-StringData @' + ArgumentTooLong = Argument is too long. + CannotSetValueToEmpty = Cannot create environment variable with an empty value. Set Ensure = Absent to remove environment variable '{0}'. + EnvVarCreated = Environment variable '{0}' created with value '{1}'. + EnvVarSetError = Failed to set environment variable '{0}' to value '{1}'. + EnvVarRemoveError = Failed to remove environment variable '{0}' holding value '{1}'. + EnvVarUnchanged = Environment variable '{0}' with value '{1}' was not updated. + EnvVarUpdated = Environment variable '{0}' updated from value '{1}' to value '{2}'. + EnvVarPathUnchanged = Path environment variable '{0}' with value '{1}' was not updated. + EnvVarPathUpdated = Environment variable '{0}' updated from value '{1}' to value '{2}'. + EnvVarNotFound = Environment variable '{0}' does not exist. + EnvVarFound = Environment variable '{0}' with value '{1}' was successfully found. + EnvVarFoundWithMisMatchingValue = Environment variable '{0}' with value '{1}' mismatched the specified value '{2}'. + EnvVarRemoved = Environment variable '{0}' removed. + GetItemPropertyFailure = Failed to get the item property for variable '{0}' with path '{1}'. + RemoveNonExistentVarError = Environment variable '{0}' cannot be removed because it does not exist. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/DSC_xGroupResource.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/DSC_xGroupResource.psm1 new file mode 100644 index 0000000..c4c0e06 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/DSC_xGroupResource.psm1 @@ -0,0 +1,2620 @@ +<# + Implementatation Notes + + Managing Disposable Objects + The types PrincipalContext, Principal, and DirectoryEntry are used througout the code and + all are disposable. However, in many cases, disposing the object immediately causes + subsequent operations to fail or duplicate disposes calls to occur. + + To simplify management of these disposables, each public entry point defines a $disposables + ArrayList variable and passes it to secondary functions that may need to create disposable + objects. The public entry point is then required to dispose the contents of the list in a + finally block. + + Managing PrincipalContext Instances + To use the AccountManagement APIs to connect to the local machine or a domain, a + PrincipalContext is needed. + + For the local groups and users, a PrincipalContext reflecting the current user can be + created. + + For the default domain, the domain where the machine is joined, explicit credentials are + needed since the default user context is SYSTEM which has no rights to the domain. + + Additional PrincipalContext instances may be needed when the machine is in a domain that is + part of a multi-domain forest. For example, Microsoft uses a multi-domain forest that + includes domains such as ntdev, redmond, wingroup and a group may have members that + span multiple domains. Unless the enterprise implements the Global Catalog, + something that Microsoft does not do, a unique PrincipalContext is needed to resolve + accounts in each of the domains. + + To manage the use of PrincipalContext across domains, public entry points define a + $principalContextCache hashtable and pass it to support functions that need to resolve a group + or group member. Consumers of a PrincipalContext call Get-PrincipalContext with a scope + (domain name or machine name). Get-PrincipalContext returns an existing hashtable entry or + creates a new entry. Note that a PrincipalContext to a target domain requires connecting + to the domain. The hashtable avoids subsequent connection calls. Also note that + Get-PrincipalContext takes a Credential parameter for the case where a new PrincipalContext + is needed. The implicit assumption is that the credential provided for the primary domain + also has rights to resolve accounts in any of the other domains. + + Resolving Group Members + The original implementation assumed that group members could be resolved using the machine + PrincipalContext or the logged on user. In practice this is not reliable since the resource + is typically run under the SYSTEM account and this account is not guaranteed to have rights + to resolve domain accounts. Additionally, the APIs for enumerating group members do not + provide a facility for passing additional credentials resulting in domain members failing + to resolve. + + To address this, group members are enumerated by first converting the GroupPrincipal to a + DirectoryEntry and enumerating its child members. The returned DirectoryEntry instances are + then resolved to Principal objects using a PrincipalContext appropriate for the target + domain. + + Handling Stale Group Members + A group may have stale members if the machine was moved from one domain to a another + foreign domain or when accounts are deleted (domain or local). At this point, members that + were defined in the original domain or were deleted are now stale and cannot be resolved + using Principal::FindByIdentity. The original implementation failed at this point + preventing any operations against the group. The current implementation calls Write-Warning + with the associated SID of the member that cannot be resolved then continues the operation. +#> + +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xGroupResource' + +if (-not (Test-IsNanoServer)) +{ + Add-Type -AssemblyName 'System.DirectoryServices.AccountManagement' +} + +<# + .SYNOPSIS + Retrieves the current state of the group with the specified name. + + .PARAMETER GroupName + The name of the group to retrieve the current state of. + + .PARAMETER Credential + A credential to resolve non-local group members. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + Assert-GroupNameValid -GroupName $GroupName + + if (Test-IsNanoServer) + { + Write-Verbose -Message ($script:localizedData.InvokingFunctionForGroup -f 'Get-TargetResourceOnNanoServer', $GroupName) + return Get-TargetResourceOnNanoServer @PSBoundParameters + } + else + { + Write-Verbose -Message ($script:localizedData.InvokingFunctionForGroup -f 'Get-TargetResourceOnFullSKU', $GroupName) + return Get-TargetResourceOnFullSKU @PSBoundParameters + } +} + +<# + .SYNOPSIS + Creates, modifies, or removes a group. + + .PARAMETER GroupName + The name of the group to create, modify, or remove. + + .PARAMETER Ensure + Specifies whether the group should exist or not. + + To ensure that the group does exist, set this property to present. + To ensure that the group does not exist, set this property to Absent. + + The default value is Present. + + .PARAMETER Description + The description the group should have. + + .PARAMETER Members + The members the group should have. + + This property will replace all the current group members with the specified members. + + Members should be specified as strings in the format of their domain qualified name + (domain\username), their UPN (username@domainname), their distinguished name (CN=username,DC=...), + or their username (for local machine accounts). + + Using either the MembersToExclude or MembersToInclude properties in the same configuration + as this property will generate an error. + + .PARAMETER MembersToInclude + The members the group should include. + + This property will only add members to a group. + + Members should be specified as strings in the format of their domain qualified name + (domain\username), their UPN (username@domainname), their distinguished name (CN=username,DC=...), + or their username (for local machine accounts). + + Using the Members property in the same configuration as this property will generate an error. + + .PARAMETER MembersToExclude + The members the group should exclude. + + This property will only remove members from a group. + + Members should be specified as strings in the format of their domain qualified name + (domain\username), their UPN (username@domainname), their distinguished name (CN=username,DC=...), + or their username (for local machine accounts). + + Using the Members property in the same configuration as this property will generate an error. + + .PARAMETER Credential + A credential to resolve and add non-local group members. + + An error will occur if this account does not have the appropriate Active Directory permissions to add all + non-local accounts to the group. + + .NOTES + ShouldProcess PSSA rule is suppressed because Set-TargetResourceOnFullSKU and + Set-TargetResourceOnNanoServer call ShouldProcess. +#> +function Set-TargetResource +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')] + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + Write-Verbose ($script:localizedData.SetTargetResourceStartMessage -f $GroupName) + + Assert-GroupNameValid -GroupName $GroupName + + if (Test-IsNanoServer) + { + Set-TargetResourceOnNanoServer @PSBoundParameters + } + else + { + Set-TargetResourceOnFullSKU @PSBoundParameters + } + + Write-Verbose ($script:localizedData.SetTargetResourceEndMessage -f $GroupName) +} + +<# + .SYNOPSIS + Tests if the group with the specified name is in the desired state. + + .PARAMETER GroupName + The name of the group to test the state of. + + .PARAMETER Ensure + Indicates if the group should exist or not. + + Set this property to "Absent" to test that the group does not exist. + Setting it to "Present" (the default value) tests that the group exists. + + .PARAMETER Description + The description of the group to test for. + + .PARAMETER Members + The list of members the group should have. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use either the MembersToExclude or + MembersToInclude property. Doing so will generate an error. + + .PARAMETER MembersToInclude + A list of members that should be in the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER MembersToExclude + A list of members that should not be in the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER Credential + The credentials required to resolve non-local group members +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + Assert-GroupNameValid -GroupName $GroupName + + if (Test-IsNanoServer) + { + Write-Verbose ($script:localizedData.InvokingFunctionForGroup -f 'Test-TargetResourceOnNanoServer', $GroupName) + return Test-TargetResourceOnNanoServer @PSBoundParameters + } + else + { + Write-Verbose ($script:localizedData.InvokingFunctionForGroup -f 'Test-TargetResourceOnFullSKU', $GroupName) + return Test-TargetResourceOnFullSKU @PSBoundParameters + } +} + +<# + .SYNOPSIS + Retrieves the current state of the group with the specified name on a full server. + + .PARAMETER GroupName + The name of the group to retrieve the current state of. + + .PARAMETER Credential + A credential to resolve non-local group members. +#> +function Get-TargetResourceOnFullSKU +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $principalContextCache = @{} + $disposables = New-Object -TypeName 'System.Collections.ArrayList' + + try + { + $principalContext = Get-PrincipalContext ` + -PrincipalContextCache $principalContextCache ` + -Disposables $Disposables ` + -Scope $env:COMPUTERNAME + + $group = Get-Group -GroupName $GroupName -PrincipalContext $principalContext + + if ($null -ne $group) + { + $null = $disposables.Add($group) + + # The group was found. Find the group members. + $members = Get-MembersOnFullSKU -Group $group -PrincipalContextCache $principalContextCache ` + -Credential $Credential -Disposables $disposables + + return @{ + GroupName = $group.Name + Ensure = 'Present' + Description = $group.Description + Members = $members + } + } + else + { + # The group was not found. + return @{ + GroupName = $GroupName + Ensure = 'Absent' + } + } + } + finally + { + Remove-DisposableObject -Disposables $disposables + } +} + +<# + .SYNOPSIS + Retrieves the current state of the group with the specified name on Nano Server. + + .PARAMETER GroupName + The name of the group to retrieve the current state of. + + .PARAMETER Credential + A credential to resolve non-local group members. +#> +function Get-TargetResourceOnNanoServer +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + try + { + $group = Get-LocalGroup -Name $GroupName -ErrorAction 'Stop' + } + catch + { + if ($_.CategoryInfo.Reason -eq 'GroupNotFoundException') + { + # The group was not found. + return @{ + GroupName = $GroupName + Ensure = 'Absent' + } + } + + New-InvalidOperationException -ErrorRecord $_ + } + + # The group was found. Find the group members. + $members = Get-MembersOnNanoServer -Group $group + + return @{ + GroupName = $group.Name + Ensure = 'Present' + Description = $group.Description + Members = $members + } +} + +<# + .SYNOPSIS + The Set-TargetResource cmdlet on a full server. + + .PARAMETER GroupName + The name of the group for which you want to ensure a specific state. + + .PARAMETER Ensure + Indicates if the group should exist or not. + + Set this property to Present to ensure that the group exists. + Set this property to Absent to ensure that the group does not exist. + + The default value is Present. + + .PARAMETER Description + The description of the group. + + .PARAMETER Members + Use this property to replace the current group membership with the specified members. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + an unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use either the MembersToExclude or + MembersToInclude property. Doing so will generate an error. + + .PARAMETER MembersToInclude + Use this property to add members to the existing membership of the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER MembersToExclude + Use this property to remove members from the existing membership of the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER Credential + The credentials required to access remote resources. Note: This account must have the + appropriate Active Directory permissions to add all non-local accounts to the group. + Otherwise, an error will occur. +#> +function Set-TargetResourceOnFullSKU +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $principalContextCache = @{} + $disposables = New-Object -TypeName 'System.Collections.ArrayList' + + try + { + $principalContext = Get-PrincipalContext ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Scope $env:computerName + + # Try to find a group by its name. + $group = Get-Group -GroupName $GroupName -PrincipalContext $principalContext + $groupOriginallyExists = $null -ne $group + + if ($Ensure -eq 'Present') + { + $shouldProcessTarget = $script:localizedData.GroupWithName -f $GroupName + if ($groupOriginallyExists) + { + $null = $disposables.Add($group) + $whatIfShouldProcess = $PSCmdlet.ShouldProcess($shouldProcessTarget, $script:localizedData.SetOperation) + } + else + { + $whatIfShouldProcess = $PSCmdlet.ShouldProcess($shouldProcessTarget, $script:localizedData.AddOperation) + } + + if ($whatIfShouldProcess) + { + $saveChanges = $false + + if (-not $groupOriginallyExists) + { + $localPrincipalContext = Get-PrincipalContext -PrincipalContextCache $principalContextCache ` + -Disposables $disposables -Scope $env:COMPUTERNAME + + $group = New-Object -TypeName 'System.DirectoryServices.AccountManagement.GroupPrincipal' ` + -ArgumentList @( $localPrincipalContext ) + $null = $disposables.Add($group) + + $group.Name = $GroupName + $saveChanges = $true + } + + # Set group properties. + + if ($PSBoundParameters.ContainsKey('Description') -and $Description -ne $group.Description) + { + $group.Description = $Description + $saveChanges = $true + } + + $actualMembersAsPrincipals = $null + + <# + Group members can be updated in two ways: + 1. Supplying the Members parameter - this causes the membership to be replaced + with the members defined in Members. + + NOTE: If Members is empty, the group membership is cleared. + + 2. Providing MembersToInclude and/or MembersToExclude + - this adds/removes members from the list. + + If Members is mutually exclusive with MembersToInclude and MembersToExclude + If Members is not defined then MembersToInclude or MembersToExclude + must contain at least one entry. + #> + if ($PSBoundParameters.ContainsKey('Members')) + { + foreach ($incompatibleParameterName in @( 'MembersToInclude', 'MembersToExclude' )) + { + if ($PSBoundParameters.ContainsKey($incompatibleParameterName)) + { + New-InvalidArgumentException -ArgumentName $incompatibleParameterName ` + -Message ($script:localizedData.MembersAndIncludeExcludeConflict -f 'Members', $incompatibleParameterName) + } + } + + if ($groupOriginallyExists) + { + $actualMembersAsPrincipals = @( Get-MembersAsPrincipalsList ` + -Group $group ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + } + + if ($Members.Count -eq 0 -and $null -ne $actualMembersAsPrincipals -and $actualMembersAsPrincipals.Count -ne 0) + { + Clear-GroupMember -Group $group + $saveChanges = $true + } + elseif ($Members.Count -ne 0) + { + # Remove duplicate names as strings. + $uniqueMembers = $Members | Select-Object -Unique + + # Resolve the names to actual principal objects. + $membersAsPrincipals = @( ConvertTo-UniquePrincipalsList ` + -MemberNames $uniqueMembers ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential ) + + if ($null -ne $actualMembersAsPrincipals -and $actualMembersAsPrincipals.Count -gt 0) + { + foreach ($memberAsPrincipal in $membersAsPrincipals) + { + if ($actualMembersAsPrincipals -notcontains $memberAsPrincipal) + { + Add-GroupMember -Group $group -MemberAsPrincipal $memberAsPrincipal + $saveChanges = $true + } + } + + foreach ($actualMemberAsPrincipal in $actualMembersAsPrincipals) + { + if ($membersAsPrincipals -notcontains $actualMemberAsPrincipal) + { + Remove-GroupMember -Group $group -MemberAsPrincipal $actualMemberAsPrincipal + $saveChanges = $true + } + } + } + else + { + # Set the members of the group + foreach ($memberAsPrincipal in $membersAsPrincipals) + { + Add-GroupMember -Group $group -MemberAsPrincipal $memberAsPrincipal + } + + $saveChanges = $true + } + } + else + { + Write-Verbose -Message ($script:localizedData.GroupAndMembersEmpty -f $GroupName) + } + } + elseif ($PSBoundParameters.ContainsKey('MembersToInclude') -or $PSBoundParameters.ContainsKey('MembersToExclude')) + { + if ($groupOriginallyExists) + { + $actualMembersAsPrincipals = @( Get-MembersAsPrincipalsList ` + -Group $group ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + } + + $membersToIncludeAsPrincipals = $null + $uniqueMembersToInclude = $MembersToInclude | Select-Object -Unique + + if ($null -eq $uniqueMembersToInclude) + { + Write-Verbose -Message $script:localizedData.MembersToIncludeEmpty + } + else + { + # Resolve the names to actual principal objects. + $membersToIncludeAsPrincipals = @( ConvertTo-UniquePrincipalsList ` + -MemberNames $uniqueMembersToInclude ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + } + + $membersToExcludeAsPrincipals = $null + $uniqueMembersToExclude = $MembersToExclude | Select-Object -Unique + + if ($null -eq $uniqueMembersToExclude) + { + Write-Verbose -Message $script:localizedData.MembersToExcludeEmpty + } + else + { + # Resolve the names to actual principal objects. + $membersToExcludeAsPrincipals = @( ConvertTo-UniquePrincipalsList ` + -MemberNames $uniqueMembersToExclude ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + } + + foreach ($includedPrincipal in $membersToIncludeAsPrincipals) + { + <# + Throw an error if any common principals were provided in MembersToInclude + and MembersToExclude. + #> + if ($membersToExcludeAsPrincipals -contains $includedPrincipal) + { + New-InvalidArgumentException -ArgumentName 'MembersToInclude and MembersToExclude' ` + -Message ($script:localizedData.IncludeAndExcludeConflict -f $includedPrincipal.SamAccountName, + 'MembersToInclude', 'MembersToExclude') + } + + if ($actualMembersAsPrincipals -notcontains $includedPrincipal) + { + Add-GroupMember -Group $group -MemberAsPrincipal $includedPrincipal + $saveChanges = $true + } + } + + foreach ($excludedPrincipal in $membersToExcludeAsPrincipals) + { + if ($actualMembersAsPrincipals -contains $excludedPrincipal) + { + Remove-GroupMember -Group $group -MemberAsPrincipal $excludedPrincipal + $saveChanges = $true + } + } + } + + if ($saveChanges) + { + Save-Group -Group $group + + # Send an operation success verbose message. + if ($groupOriginallyExists) + { + Write-Verbose -Message ($script:localizedData.GroupUpdated -f $GroupName) + } + else + { + Write-Verbose -Message ($script:localizedData.GroupCreated -f $GroupName) + } + } + else + { + Write-Verbose -Message ($script:localizedData.NoConfigurationRequired -f $GroupName) + } + } + } + else + { + if ($groupOriginallyExists) + { + if ($PSCmdlet.ShouldProcess(($script:localizedData.GroupWithName -f $GroupName), $script:localizedData.RemoveOperation)) + { + # Don't add group to $disposables since Delete also disposes. + Remove-Group -Group $group + Write-Verbose -Message ($script:localizedData.GroupRemoved -f $GroupName) + } + else + { + $null = $disposables.Add($group) + } + } + else + { + Write-Verbose -Message ($script:localizedData.NoConfigurationRequiredGroupDoesNotExist -f $GroupName) + } + } + } + finally + { + Remove-DisposableObject -Disposables $disposables + } +} + +<# + .SYNOPSIS + The Set-TargetResource cmdlet on Nano Server. + + .PARAMETER GroupName + The name of the group for which you want to ensure a specific state. + + .PARAMETER Ensure + Indicates if the group should exist or not. + + Set this property to Present to ensure that the group exists. + Set this property to Absent to ensure that the group does not exist. + + The default value is Present. + + .PARAMETER Description + The description of the group. + + .PARAMETER Members + Use this property to replace the current group membership with the specified members. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use either the MembersToExclude or + MembersToInclude property. Doing so will generate an error. + + .PARAMETER MembersToInclude + Use this property to add members to the existing membership of the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER MembersToExclude + Use this property to remove members from the existing membership of the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER Credential + Not used on Nano Server. + Only local users are accessible from the resource. +#> +function Set-TargetResourceOnNanoServer +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + try + { + $group = Get-LocalGroup -Name $GroupName -ErrorAction 'Stop' + $groupOriginallyExists = $true + } + catch [System.Exception] + { + if ($_.CategoryInfo.Reason -eq 'GroupNotFoundException') + { + # A group with the provided name does not exist. + Write-Verbose -Message ($script:localizedData.GroupDoesNotExist -f $GroupName) + $groupOriginallyExists = $false + } + else + { + New-InvalidOperationException -ErrorRecord $_ + } + } + + if ($Ensure -eq 'Present') + { + $whatIfShouldProcess = + if ($groupOriginallyExists) + { + $PSCmdlet.ShouldProcess(($script:localizedData.GroupWithName -f $GroupName), + $script:localizedData.SetOperation) + } + else + { + $PSCmdlet.ShouldProcess(($script:localizedData.GroupWithName -f $GroupName), + $script:localizedData.AddOperation) + } + + if ($whatIfShouldProcess) + { + if (-not $groupOriginallyExists) + { + $group = New-LocalGroup -Name $GroupName + Write-Verbose -Message ($script:localizedData.GroupCreated -f $GroupName) + } + + # Set the group properties. + if ($PSBoundParameters.ContainsKey('Description') -and + ((-not $groupOriginallyExists) -or ($Description -ne $group.Description))) + { + Set-LocalGroup -Name $GroupName -Description $Description + } + + if ($PSBoundParameters.ContainsKey('Members')) + { + foreach ($incompatibleParameterName in @( 'MembersToInclude', 'MembersToExclude' )) + { + if ($PSBoundParameters.ContainsKey($incompatibleParameterName)) + { + New-InvalidArgumentException -ArgumentName $incompatibleParameterName ` + -Message ($script:localizedData.MembersAndIncludeExcludeConflict -f 'Members', $incompatibleParameterName) + } + } + + $groupMembers = Get-MembersOnNanoServer -Group $group + + # Remove duplicate names as strings. + $uniqueMembers = $Members | Select-Object -Unique + + # Remove unspecified members + foreach ($groupMember in $groupMembers) + { + if ($uniqueMembers -notcontains $groupMember) + { + Remove-LocalGroupMember -Group $GroupName -Member $groupMember + } + } + + # Add specified missing members + foreach ($uniqueMember in $uniqueMembers) + { + if ($groupMembers -notcontains $uniqueMember) + { + Add-LocalGroupMember -Group $GroupName -Member $uniqueMember + } + } + } + elseif ($PSBoundParameters.ContainsKey('MembersToInclude') -or $PSBoundParameters.ContainsKey('MembersToExclude')) + { + [System.Array] $groupMembers = Get-MembersOnNanoServer -Group $group + + $uniqueMembersToInclude = $MembersToInclude | Select-Object -Unique + $uniqueMembersToExclude = $MembersToExclude | Select-Object -Unique + + <# + Both MembersToInclude and MembersToExclude were provided. + Check if they have common principals. + #> + foreach ($includedMember in $uniqueMembersToInclude) + { + foreach ($excludedMember in $uniqueMembersToExclude) + { + if ($includedMember -eq $excludedMember) + { + New-InvalidArgumentException -ArgumentName 'MembersToInclude and MembersToExclude' ` + -Message ($script:localizedData.IncludeAndExcludeConflict -f $includedMember, 'MembersToInclude', + 'MembersToExclude') + } + } + } + + foreach ($includedMember in $uniqueMembersToInclude) + { + if ($groupMembers -notcontains $includedMember) + { + Add-LocalGroupMember -Group $GroupName -Member $includedMember + } + } + + foreach ($excludedMember in $uniqueMembersToExclude) + { + if ($groupMembers -contains $excludedMember) + { + Remove-LocalGroupMember -Group $GroupName -Member $excludedMember + } + } + } + } + } + else + { + # Ensure is set to "Absent". + if ($groupOriginallyExists) + { + $whatIfShouldProcess = $PSCmdlet.ShouldProcess( + ($script:localizedData.GroupWithName -f $GroupName), $script:localizedData.RemoveOperation) + if ($whatIfShouldProcess) + { + # The group exists. Remove the group by the provided name. + Remove-LocalGroup -Name $GroupName + Write-Verbose -Message ($script:localizedData.GroupRemoved -f $GroupName) + } + } + else + { + Write-Verbose -Message ($script:localizedData.NoConfigurationRequiredGroupDoesNotExist -f $GroupName) + } + } +} + +<# + .SYNOPSIS + The Test-TargetResource cmdlet on a full server. + Tests if the group being managed is in the desired state. + + .PARAMETER GroupName + The name of the group for which you want to test a specific state. + + .PARAMETER Ensure + Indicates if the group should exist or not. + + Set this property to Present to ensure that the group exists. + Set this property to Absent to ensure that the group does not exist. + + The default value is Present. + + .PARAMETER Description + The description of the group to test for. + + .PARAMETER Members + Use this property to test if the existing membership of the group matches + the list provided. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use either the MembersToExclude or + MembersToInclude property. Doing so will generate an error. + + .PARAMETER MembersToInclude + Use this property to test if members need to be added to the existing membership + of the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER MembersToExclude + Use this property to test if members need to removed from the existing membership + of the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER Credential + The credentials required to resolve non-local group members +#> +function Test-TargetResourceOnFullSKU +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $principalContextCache = @{} + $disposables = New-Object -TypeName 'System.Collections.ArrayList' + + try + { + $principalContext = Get-PrincipalContext ` + -PrincipalContextCache $PrincipalContextCache ` + -Disposables $disposables ` + -Scope $env:computerName + + $group = Get-Group -GroupName $GroupName -PrincipalContext $principalContext + + if ($null -eq $group) + { + Write-Verbose -Message ($script:localizedData.GroupDoesNotExist -f $GroupName) + return $Ensure -eq 'Absent' + } + + $null = $disposables.Add($group) + Write-Verbose -Message ($script:localizedData.GroupExists -f $GroupName) + + # Validate separate properties. + if ($Ensure -eq 'Absent') + { + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Ensure', 'Absent', 'Present') + return $false + } + + if ($PSBoundParameters.ContainsKey('Description') -and $Description -ne $group.Description) + { + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Description', $Description, $group.Description) + return $false + } + + if ($PSBoundParameters.ContainsKey('Members')) + { + foreach ($incompatibleParameterName in @( 'MembersToInclude', 'MembersToExclude' )) + { + if ($PSBoundParameters.ContainsKey($incompatibleParameterName)) + { + New-InvalidArgumentException -ArgumentName $incompatibleParameterName ` + -Message ($script:localizedData.MembersAndIncludeExcludeConflict -f 'Members', $incompatibleParameterName) + } + } + + $actualMembersAsPrincipals = @( Get-MembersAsPrincipalsList ` + -Group $group ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + + $uniqueMembers = $Members | Select-Object -Unique + + if ($null -eq $uniqueMembers) + { + return ($null -eq $actualMembersAsPrincipals -or $actualMembersAsPrincipals.Count -eq 0) + } + else + { + if ($null -eq $actualMembersAsPrincipals -or $actualMembersAsPrincipals.Count -eq 0) + { + return $false + } + + # Resolve the names to actual principal objects. + $expectedMembersAsPrincipals = @( ConvertTo-UniquePrincipalsList ` + -MemberNames $uniqueMembers ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + + if ($expectedMembersAsPrincipals.Count -ne $actualMembersAsPrincipals.Count) + { + Write-Verbose -Message ($script:localizedData.MembersNumberMismatch -f 'Members', + $expectedMembersAsPrincipals.Count, $actualMembersAsPrincipals.Count) + return $false + } + + # Compare the two member lists. + foreach ($expectedMemberAsPrincipal in $expectedMembersAsPrincipals) + { + if ($actualMembersAsPrincipals -notcontains $expectedMemberAsPrincipal) + { + Write-Verbose -Message ($script:localizedData.MembersMemberMismatch -f $expectedMemberAsPrincipal.SamAccountName, + 'Members', $group.SamAccountName) + return $false + } + } + } + } + elseif ($PSBoundParameters.ContainsKey('MembersToInclude') -or $PSBoundParameters.ContainsKey('MembersToExclude')) + { + $actualMembersAsPrincipals = @( Get-MembersAsPrincipalsList ` + -Group $group ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + + $membersToIncludeAsPrincipals = $null + $uniqueMembersToInclude = $MembersToInclude | Select-Object -Unique + + if ($null -eq $uniqueMembersToInclude) + { + Write-Verbose -Message $script:localizedData.MembersToIncludeEmpty + } + else + { + # Resolve the names to actual principal objects. + $membersToIncludeAsPrincipals = @( ConvertTo-UniquePrincipalsList ` + -MemberNames $uniqueMembersToInclude ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + } + + $membersToExcludeAsPrincipals = $null + $uniqueMembersToExclude = $MembersToExclude | Select-Object -Unique + + if ($null -eq $uniqueMembersToExclude) + { + Write-Verbose -Message $script:localizedData.MembersToExcludeEmpty + } + else + { + # Resolve the names to actual principal objects. + $membersToExcludeAsPrincipals = @( ConvertTo-UniquePrincipalsList ` + -MemberNames $uniqueMembersToExclude ` + -PrincipalContextCache $principalContextCache ` + -Disposables $disposables ` + -Credential $Credential + ) + } + + foreach ($includedPrincipal in $membersToIncludeAsPrincipals) + { + <# + Throw an error if any common principals were provided in MembersToInclude + and MembersToExclude. + #> + if ($membersToExcludeAsPrincipals -contains $includedPrincipal) + { + New-InvalidArgumentException -ArgumentName 'MembersToInclude and MembersToExclude' ` + -Message ($script:localizedData.IncludeAndExcludeConflict -f $includedPrincipal.SamAccountName, + 'MembersToInclude', 'MembersToExclude') + } + + if ($actualMembersAsPrincipals -notcontains $includedPrincipal) + { + return $false + } + } + + foreach ($excludedPrincipal in $membersToExcludeAsPrincipals) + { + if ($actualMembersAsPrincipals -contains $excludedPrincipal) + { + return $false + } + } + } + } + finally + { + Remove-DisposableObject -Disposables $disposables + } + + return $true +} + +<# + .SYNOPSIS + The Test-TargetResource cmdlet on a Nano server + Tests if the group being managed is in the desired state. + + .PARAMETER GroupName + The name of the group for which you want to test a specific state. + + .PARAMETER Ensure + Indicates if the group should exist or not. + + Set this property to Present to ensure that the group exists. + Set this property to Absent to ensure that the group does not exist. + + The default value is Present. + + .PARAMETER Description + The description of the group to test for. + + .PARAMETER Members + Use this property to test if the existing membership of the group matches + the list provided. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use either the MembersToExclude or + MembersToInclude property. Doing so will generate an error. + + .PARAMETER MembersToInclude + Use this property to test if members need to be added to the existing membership + of the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER MembersToExclude + Use this property to test if members need to removed from the existing membership + of the group. + + The value of this property is an array of strings of the formats domain qualified name + (domain\username), UPN (username@domainname), distinguished name (CN=username,DC=...) and/or + a unqualified (username) for local machine accounts. + + If you set this property in a configuration, do not use the Members property. + Doing so will generate an error. + + .PARAMETER Credential + The credentials required to resolve non-local group members +#> +function Test-TargetResourceOnNanoServer +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [System.String[]] + $Members, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + try + { + $group = Get-LocalGroup -Name $GroupName -ErrorAction Stop + } + catch [System.Exception] + { + if ($_.CategoryInfo.Reason -eq 'GroupNotFoundException') + { + # A group with the provided name does not exist. + Write-Verbose -Message ($script:localizedData.GroupDoesNotExist -f $GroupName) + + return ($Ensure -eq 'Absent') + } + + New-InvalidOperationException -ErrorRecord $_ + } + + # A group with the provided name exists. + Write-Verbose -Message ($script:localizedData.GroupExists -f $GroupName) + + # Validate separate properties. + if ($Ensure -eq 'Absent') + { + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Ensure', 'Absent', 'Present') + return $false + } + + if ($PSBoundParameters.ContainsKey('Description') -and $Description -ne $group.Description) + { + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Description', $Description, $group.Description) + return $false + } + + if ($PSBoundParameters.ContainsKey('Members')) + { + foreach ($incompatibleParameterName in @( 'MembersToInclude', 'MembersToExclude' )) + { + if ($PSBoundParameters.ContainsKey($incompatibleParameterName)) + { + New-InvalidArgumentException -ArgumentName $incompatibleParameterName ` + -Message ($script:localizedData.MembersAndIncludeExcludeConflict -f 'Members', $incompatibleParameterName) + } + } + + [System.Array] $groupMembers = Get-MembersOnNanoServer -Group $group + + # Remove duplicate names as strings. + $uniqueMembers = $Members | Select-Object -Unique + + if ($null -eq $uniqueMembers) + { + return ($null -eq $groupMembers -or $groupMembers.Count -eq 0) + } + else + { + if ($null -eq $groupMembers -or $uniqueMembers.Count -ne $groupMembers.Count) + { + return $false + } + + foreach ($groupMember in $groupMembers) + { + if ($uniqueMembers -notcontains $groupMember) + { + return $false + } + } + } + } + elseif ($PSBoundParameters.ContainsKey('MembersToInclude') -or $PSBoundParameters.ContainsKey('MembersToExclude')) + { + $groupMembers = Get-MembersOnNanoServer -Group $group + + $uniqueMembersToInclude = $MembersToInclude | Select-Object -Unique + $uniqueMembersToExclude = $MembersToExclude | Select-Object -Unique + + <# + Both MembersToInclude and MembersToExclude were provided. + Check if they have common principals. + #> + foreach ($includedMember in $uniqueMembersToInclude) + { + foreach ($excludedMember in $uniqueMembersToExclude) + { + if ($includedMember -eq $excludedMember) + { + New-InvalidArgumentException -ArgumentName 'MembersToInclude and MembersToExclude' ` + -Message ($script:localizedData.IncludeAndExcludeConflict -f $includedMember, 'MembersToInclude', + 'MembersToExclude') + } + } + } + + foreach ($includedMember in $uniqueMembersToInclude) + { + if ($groupMembers -notcontains $includedMember) + { + return $false + } + } + + foreach ($excludedMember in $uniqueMembersToExclude) + { + if ($groupMembers -contains $excludedMember) + { + return $false + } + } + } + + # All properties match. Return $true. + return $true +} + +<# + .SYNOPSIS + Retrieves the members of a group on a Nano server. + + .PARAMETER Group + The LocalGroup Object to retrieve members for. +#> +function Get-MembersOnNanoServer +{ + [OutputType([System.String[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [Microsoft.PowerShell.Commands.LocalGroup] + $Group + ) + + $memberNames = New-Object -TypeName 'System.Collections.ArrayList' + + # Get the group members. + $groupMembers = Get-LocalGroupMember -Group $Group + + foreach ($groupMember in $groupMembers) + { + if ($groupMember.PrincipalSource -ieq 'Local') + { + $localMemberName = $groupMember.Name.Substring($groupMember.Name.IndexOf('\') + 1) + $null = $memberNames.Add($localMemberName) + } + else + { + Write-Verbose -Message ($script:localizedData.MemberIsNotALocalUser -f $groupMember.Name,$groupMember.PrincipalSource) + $domainMemberName = $groupMember.Name + $null = $memberNames.Add($domainMemberName) + } + } + + return $memberNames.ToArray() +} + +<# + .SYNOPSIS + Retrieves the members of the given a group on a full server. + + .PARAMETER Group + The GroupPrincipal Object to retrieve members for. + + .PARAMETER PrincipalContextCache + A hashtable cache of PrincipalContext instances for each scope. + This is used to cache PrincipalContext instances for cases where it is used multiple times. + + .PARAMETER Disposables + The ArrayList of disposable objects to which to add any objects that need to be disposed. + + .PARAMETER Credential + The network credential to use when explicit credentials are needed for the target domain. +#> +function Get-MembersOnFullSKU +{ + [OutputType([System.String[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.GroupPrincipal] + $Group, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.Hashtable] + [AllowEmptyCollection()] + $PrincipalContextCache, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.ArrayList] + [AllowEmptyCollection()] + $Disposables, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $members = New-Object -TypeName 'System.Collections.ArrayList' + + $membersAsPrincipals = @( Get-MembersAsPrincipalsList ` + -Group $Group ` + -PrincipalContextCache $PrincipalContextCache ` + -Disposables $Disposables ` + -Credential $Credential + ) + + foreach ($memberAsPrincipal in $membersAsPrincipals) + { + if ($memberAsPrincipal.ContextType -eq [System.DirectoryServices.AccountManagement.ContextType]::Domain) + { + # Select only the first part of the full domain name. + $domainName = $memberAsPrincipal.Context.Name + + $domainNameDotIndex = $domainName.IndexOf('.') + if ($domainNameDotIndex -ne -1) + { + $domainName = $domainName.Substring(0, $domainNameDotIndex) + } + + if ($memberAsPrincipal.StructuralObjectClass -ieq 'computer') + { + $null = $members.Add($domainName + '\' + $memberAsPrincipal.Name) + } + else + { + $null = $members.Add($domainName + '\' + $memberAsPrincipal.SamAccountName) + } + } + else + { + $null = $members.Add($memberAsPrincipal.Name) + } + } + + return $members.ToArray() +} + +<# + .SYNOPSIS + Retrieves the members of a group as Principal instances. + + .PARAMETER Group + The group to retrieve members for. + + .PARAMETER PrincipalContextCache + A hashtable cache of PrincipalContext instances for each scope. + This is used to cache PrincipalContext instances for cases where it is used multiple times. + + .PARAMETER Disposables + The ArrayList of disposable objects to which to add any objects that need to be disposed. + + .PARAMETER Credential + The network credential to use when explicit credentials are needed for the target domain. +#> +function Get-MembersAsPrincipalsList +{ + [OutputType([System.DirectoryServices.AccountManagement.Principal[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.GroupPrincipal] + $Group, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.Hashtable] + [AllowEmptyCollection()] + $PrincipalContextCache, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.ArrayList] + [AllowEmptyCollection()] + $Disposables, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $principals = New-Object -TypeName 'System.Collections.ArrayList' + + <# + This logic enumerates the group members using the underlying DirectoryEntry API. This is + needed because enumerating the group members as principal instances causes a resolve to + occur. Since there is no facility for passing credentials to perform the resolution, any + members that cannot be resolved using the current user will fail (such as when this + resource runs as SYSTEM). Dropping down to the underyling DirectoryEntry API allows us to + access the account's SID which can then be used to resolve the associated principal using + explicit credentials. + #> + $groupDirectoryMembers = Get-GroupMembersFromDirectoryEntry -Group $Group + + foreach ($groupDirectoryMember in $groupDirectoryMembers) + { + # Extract the ObjectSid from the underlying DirectoryEntry + $memberDirectoryEntry = New-Object -TypeName 'System.DirectoryServices.DirectoryEntry' ` + -ArgumentList @( $groupDirectoryMember ) + $null = $disposables.Add($memberDirectoryEntry) + + $memberDirectoryEntryPathParts = $memberDirectoryEntry.Path.Split('/') + + if ($memberDirectoryEntryPathParts.Count -eq 4) + { + # Parsing WinNT://domainname/accountname or WinNT://machinename/accountname + $scope = $memberDirectoryEntryPathParts[2] + $accountName = $memberDirectoryEntryPathParts[3] + } + elseif ($memberDirectoryEntryPathParts.Count -eq 5) + { + # Parsing WinNT://domainname/machinename/accountname + $scope = $memberDirectoryEntryPathParts[3] + $accountName = $memberDirectoryEntryPathParts[4] + } + else + { + <# + The account is stale either becuase it was deleted or the machine was moved to a + new domain without removing the domain members from the group. If we consider this + a fatal error, the group is no longer managable by the DSC resource. Writing a + warning allows the operation to complete while leaving the stale member in the + group. + #> + Write-Warning -Message ($script:localizedData.MemberNotValid -f $memberDirectoryEntry.Path) + continue + } + + $principalContext = Get-PrincipalContext ` + -Scope $scope ` + -Credential $Credential ` + -PrincipalContextCache $PrincipalContextCache ` + -Disposables $Disposables + + # If local machine qualified, get the PrincipalContext for the local machine + if (Test-IsLocalMachine -Scope $scope) + { + Write-Verbose -Message ($script:localizedData.ResolvingLocalAccount -f $accountName) + } + # The account is domain qualified - credential required to resolve it. + elseif ($null -ne $principalContext) + { + Write-Verbose -Message ($script:localizedData.ResolvingDomainAccount -f $accountName, $scope) + } + else + { + <# + The provided name is not scoped to the local machine and no credential was + provided. This is an unsupported use case. A credential is required to resolve + off-box. + #> + New-InvalidArgumentException -ArgumentName 'Credential' ` + -Message ($script:localizedData.DomainCredentialsRequired -f $accountName) + } + + # Create a SID to enable comparison againt the expected member's SID. + $memberSidBytes = $memberDirectoryEntry.Properties['ObjectSid'].Value + $memberSid = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' ` + -ArgumentList @( $memberSidBytes, 0 ) + + $principal = Resolve-SidToPrincipal -PrincipalContext $principalContext -Sid $memberSid -Scope $scope + $null = $disposables.Add($principal) + + $null = $principals.Add($principal) + } + + return $principals.ToArray() +} + +<# + .SYNOPSIS + Throws an error if a group name contains invalid characters. + + .PARAMETER GroupName + The group name to test. +#> +function Assert-GroupNameValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName + ) + + $invalidCharacters = @( '\', '/', '"', '[', ']', ':', '|', '<', '>', '+', '=', ';', ',', '?', '*', '@' ) + + if ($GroupName.IndexOfAny($invalidCharacters) -ne -1) + { + New-InvalidArgumentException -ArgumentName 'GroupName' ` + -Message ($script:localizedData.InvalidGroupName -f $GroupName, [System.String]::Join(' ', $invalidCharacters)) + } + + $nameContainsOnlyWhitspaceOrDots = $true + + # Check if the name consists of only periods and/or white spaces. + for ($groupNameIndex = 0; $groupNameIndex -lt $GroupName.Length; $groupNameIndex++) + { + if (-not [System.Char]::IsWhiteSpace($GroupName, $groupNameIndex) -and $GroupName[$groupNameIndex] -ne '.') + { + $nameContainsOnlyWhitspaceOrDots = $false + break + } + } + + if ($nameContainsOnlyWhitspaceOrDots) + { + New-InvalidArgumentException -ArgumentName 'GroupName' ` + -Message ($script:localizedData.InvalidGroupName -f $GroupName, [System.String]::Join(' ', $invalidCharacters)) + } +} + +<# + .SYNOPSIS + Resolves an array of member names to Principal instances. + + .PARAMETER MemberNames + The member names to convert to Principal instances. + + .PARAMETER PrincipalContextCache + A hashtable cache of PrincipalContext instances for each scope. + This is used to cache PrincipalContext instances for cases where it is used multiple times. + + .PARAMETER Disposables + The ArrayList of disposable objects to which to add any objects that need to be disposed. + + .PARAMETER Credential + The network credential to use when explicit credentials are needed for the target domain. +#> +function ConvertTo-UniquePrincipalsList +{ + [OutputType([System.DirectoryServices.AccountManagement.Principal[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String[]] + $MemberNames, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.Hashtable] + [AllowEmptyCollection()] + $PrincipalContextCache, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.ArrayList] + [AllowEmptyCollection()] + $Disposables, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $principals = @() + + foreach ($memberName in $MemberNames) + { + $principal = ConvertTo-Principal ` + -MemberName $memberName ` + -PrincipalContextCache $PrincipalContextCache ` + -Disposables $Disposables ` + -Credential $Credential + + if ($null -ne $principal) + { + # Do not add duplicate entries + if ($principal.ContextType -eq [System.DirectoryServices.AccountManagement.ContextType]::Domain) + { + $duplicatePrincipal = $principals | Where-Object -FilterScript { $_.DistinguishedName -ieq $principal.DistinguishedName } + + if ($null -eq $duplicatePrincipal) + { + $principals += $principal + } + } + else + { + $duplicatePrincipal = $principals | Where-Object -FilterScript { $_.SamAccountName -ieq $principal.SamAccountName } + + if ($null -eq $duplicatePrincipal) + { + $principals += $principal + } + } + } + } + + return $principals +} + +<# + .SYNOPSIS + Resolves a member name to a Principal instance. + + .PARAMETER MemberName + The member name to convert to a Principal instance. + + .PARAMETER PrincipalContextCache + A hashtable cache of PrincipalContext instances for each scope. + This is used to cache PrincipalContext instances for cases where it is used multiple times. + + .PARAMETER Disposables + The ArrayList of disposable objects to which to add any objects that need to be disposed. + + .PARAMETER Credential + The network credential to use when explicit credentials are needed for the target domain. + + .NOTES + ConvertTo-Principal will fail if a machine name is specified as domainname\machinename. It + will succeed if the machine name is specified as the SAM name (domainname\machinename$) or + as the unqualified machine name. + + Split-MemberName splits the scope and account name to avoid this problem. +#> +function ConvertTo-Principal +{ + [OutputType([System.DirectoryServices.AccountManagement.Principal])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.String] + $MemberName, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.Hashtable] + [AllowEmptyCollection()] + $PrincipalContextCache, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.ArrayList] + [AllowEmptyCollection()] + $Disposables, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + # The scope of the the object name when in the form of scope\name, UPN, or DN + $scope, $identityValue = Split-MemberName -MemberName $MemberName + + if (Test-IsLocalMachine -Scope $scope) + { + # If local machine qualified, get the PrincipalContext for the local machine + Write-Verbose -Message ($script:localizedData.ResolvingLocalAccount -f $identityValue) + } + elseif ($null -ne $Credential) + { + # The account is domain qualified - a credential is provided to resolve it. + Write-Verbose -Message ($script:localizedData.ResolvingDomainAccount -f $identityValue, $scope) + } + else + { + <# + The provided name is not scoped to the local machine and no credentials were provided. + If the object is a domain qualified name, we can try to resolve the user with domain + trust, if setup. When using domain trust, we use the object name to resolve. Object + name can be in different formats such as a domain qualified name, UPN, or a + distinguished name for the scope + #> + + Write-Verbose -Message ($script:localizedData.ResolvingDomainAccountWithTrust -f $MemberName) + $identityValue = $MemberName + } + + $principalContext = Get-PrincipalContext ` + -Scope $scope ` + -PrincipalContextCache $PrincipalContextCache ` + -Disposables $Disposables ` + -Credential $Credential + + try + { + $principal = Find-Principal -PrincipalContext $principalContext -IdentityValue $identityValue + } + catch [System.Runtime.InteropServices.COMException] + { + New-InvalidArgumentException -ArgumentName $MemberName ` + -Message ( $script:localizedData.UnableToResolveAccount -f $MemberName, $_.Exception.Message, $_.Exception.HResult ) + } + + if ($null -eq $principal) + { + New-InvalidArgumentException -ArgumentName $MemberName -Message ($script:localizedData.CouldNotFindPrincipal -f $MemberName) + } + + return $principal +} + +<# + .SYNOPSIS + Resolves a SID to a principal. + + .PARAMETER Sid + The security identifier to resolve to a Principal. + + .PARAMETER PrincipalContext + The PrincipalContext to use to resolve the Principal. + + .PARAMETER Scope + The scope of the PrincipalContext. +#> +function Resolve-SidToPrincipal +{ + [OutputType([System.DirectoryServices.AccountManagement.Principal])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Security.Principal.SecurityIdentifier] + $Sid, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.PrincipalContext] + $PrincipalContext, + + [Parameter(Mandatory = $true)] + [System.String] + $Scope + ) + + $principal = Find-Principal -PrincipalContext $PrincipalContext -IdentityValue $Sid.Value -IdentityType ([System.DirectoryServices.AccountManagement.IdentityType]::Sid) + + if ($null -eq $principal) + { + if (Test-IsLocalMachine -Scope $Scope) + { + New-InvalidArgumentException -ArgumentName 'Members, MembersToInclude, or MembersToExclude' -Message ($script:localizedData.CouldNotFindPrincipal -f $Sid.Value) + } + else + { + New-InvalidArgumentException -ArgumentName 'Members, MembersToInclude, MembersToExclude, or Credential' -Message ($script:localizedData.CouldNotFindPrincipal -f $Sid.Value) + } + } + + return $principal +} + +<# + .SYNOPSIS + Retrieves a PrincipalContext to use to resolve an object in the given scope. + + .PARAMETER Scope + The scope to retrieve the principal context for. + + .PARAMETER Credential + The network credential to use when explicit credentials are needed for the target domain. + + .PARAMETER PrincipalContextCache + A hashtable cache of PrincipalContext instances for each scope. + This is used to cache PrincipalContext instances for cases where it is used multiple times. + + .PARAMETER Disposables + The ArrayList of disposable objects to which to add any objects that need to be disposed. + + .NOTES + When a new PrincipalContext is created, it is added to the Disposables list + as well as the PrincipalContextCache. +#> +function Get-PrincipalContext +{ + [OutputType([System.DirectoryServices.AccountManagement.PrincipalContext])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Scope, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.Hashtable] + [AllowEmptyCollection()] + $PrincipalContextCache, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.ArrayList] + [AllowEmptyCollection()] + $Disposables + ) + + $principalContext = $null + + if (Test-IsLocalMachine -Scope $Scope) + { + # Check for a cached PrincipalContext for the local machine. + if ($PrincipalContextCache.ContainsKey($env:computerName)) + { + $principalContext = $PrincipalContextCache[$env:computerName] + } + else + { + # Create a PrincipalContext for the local machine + $principalContext = New-Object -TypeName 'System.DirectoryServices.AccountManagement.PrincipalContext' ` + -ArgumentList @( [System.DirectoryServices.AccountManagement.ContextType]::Machine ) + + # Cache the PrincipalContext for this scope for subsequent calls. + $null = $PrincipalContextCache.Add($env:computerName, $principalContext) + $null = $Disposables.Add($principalContext) + } + } + elseif ($PrincipalContextCache.ContainsKey($Scope)) + { + $principalContext = $PrincipalContextCache[$Scope] + } + elseif ($null -ne $Credential) + { + # Create a PrincipalContext targeting $Scope using the network credentials that were passed in. + $credentialDomain = $Credential.GetNetworkCredential().Domain + $credentialUserName = $Credential.GetNetworkCredential().UserName + if ($credentialDomain -ne [System.String]::Empty) + { + $principalContextName = "$credentialDomain\$credentialUserName" + } + else + { + $principalContextName = $credentialUserName + } + + $principalContext = New-Object -TypeName 'System.DirectoryServices.AccountManagement.PrincipalContext' ` + -ArgumentList @( [System.DirectoryServices.AccountManagement.ContextType]::Domain, $Scope, + $principalContextName, $Credential.GetNetworkCredential().Password ) + + # Cache the PrincipalContext for this scope for subsequent calls. + $null = $PrincipalContextCache.Add($Scope, $principalContext) + $null = $Disposables.Add($principalContext) + } + else + { + # Get a PrincipalContext for the current user in the target domain (even for local System account). + $principalContext = New-Object -TypeName 'System.DirectoryServices.AccountManagement.PrincipalContext' ` + -ArgumentList @( [System.DirectoryServices.AccountManagement.ContextType]::Domain, $Scope ) + + # Cache the PrincipalContext for this scope for subsequent calls. + $null = $PrincipalContextCache.Add($Scope, $principalContext) + $null = $Disposables.Add($principalContext) + } + + return $principalContext +} + +<# + .SYNOPSIS + Determines if a scope represents the current machine. + + .PARAMETER Scope + The scope to test. +#> +function Test-IsLocalMachine +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Scope + ) + + $localMachineScopes = @( '.', $env:computerName, 'localhost', '127.0.0.1', 'NT Authority', 'NT Service', 'BuiltIn' ) + + if ($localMachineScopes -icontains $Scope) + { + return $true + } + + <# + Determine if we have an ip address that matches an ip address on one of the network + adapters. This is likely overkill. Consider removing it. + #> + if ($Scope.Contains('.')) + { + $win32NetworkAdapterConfigurations = @( Get-CimInstance -ClassName 'Win32_NetworkAdapterConfiguration' ) + foreach ($win32NetworkAdapterConfiguration in $win32NetworkAdapterConfigurations) + { + if ($null -ne $win32NetworkAdapterConfiguration.IPAddress) + { + foreach ($ipAddress in $win32NetworkAdapterConfiguration.IPAddress) + { + if ($ipAddress -eq $Scope) + { + return $true + } + } + } + } + } + + return $false +} + +<# + .SYNOPSIS + Splits a member name into the scope and the account name. + + + .DESCRIPTION + The returned $scope is used to determine where to perform the resolution, the local machine + or a target domain. The returned $accountName is the name of the account to resolve. + + The following details the formats that are handled as well as how the values are + determined: + + Domain Qualified Names: (domainname\username) + + The value is split on the first '\' character with the left hand side returned as the scope + and the right hand side returned as the account name. + + UPN: (username@domainname) + + The value is split on the first '@' character with the left hand side returned as the + account name and the right hand side returned as the scope. + + Distinguished Name: + + The value at the first occurance of 'DC=' is used to extract the unqualified domain name. + The incoming string is returned, as is, for the account name. + + Unqualified Account Names: + + The incoming string is returned as the account name and the local machine name is returned + as the scope. Note that values that do not fall into the above categories are interpreted + as unqualified account names. + + .PARAMETER MemberName + The full name of the member to split. + + .NOTES + ConvertTo-Principal will fail if a machine name is specified as domainname\machinename. It + will succeed if the machine name is specified as the SAM name (domainname\machinename$) or + as the unqualified machine name. + + Split-MemberName splits the scope and account name to avoid this problem. +#> +function Split-MemberName +{ + [OutputType([System.String[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $MemberName + ) + + # Assume no scope is defined or $FullName is a DistinguishedName + $scope = $env:computerName + $accountName = $MemberName + + # Parse domain or machine qualified account name + $separatorIndex = $MemberName.IndexOf('\') + if ($separatorIndex -ne -1) + { + $scope = $MemberName.Substring(0, $separatorIndex) + + if (Test-IsLocalMachine -Scope $scope) + { + $scope = $env:computerName + } + + $accountName = $MemberName.Substring($separatorIndex + 1) + + return [System.String[]] @( $scope, $accountName ) + } + + # Parse UPN for the scope + $separatorIndex = $MemberName.IndexOf('@') + if ($separatorIndex -ne -1) + { + $scope = $MemberName.Substring($separatorIndex + 1) + $accountName = $MemberName.Substring(0, $separatorIndex) + + return [System.String[]] @( $scope, $accountName ) + } + + # Parse distinguished name for the scope + $distinguishedNamePrefix = 'DC=' + + $separatorIndex = $MemberName.IndexOf($distinguishedNamePrefix, [System.StringComparison]::OrdinalIgnoreCase) + if ($separatorIndex -ne -1) + { + <# + For member names in the distinguished name format, the account name returned should be + the entire distinguished name. + See the initialization of $accountName above. + #> + + $startScopeIndex = $separatorIndex + $distinguishedNamePrefix.Length + $endScopeIndex = $MemberName.IndexOf(',', $startScopeIndex) + + if ($endScopeIndex -gt $startScopeIndex) + { + $scopeLength = $endScopeIndex - $separatorIndex - $distinguishedNamePrefix.Length + $scope = $MemberName.Substring($startScopeIndex, $scopeLength) + + return [System.String[]] @( $scope, $accountName ) + } + } + + return [System.String[]] @( $scope, $accountName ) +} + +<# + .SYNOPSIS + Finds a principal by identity. + Wrapper function for testing. + + .PARAMETER PrincipalContext + The principal context to find the principal in. + + .PARAMETER IdentityValue + The identity value to find the principal by (e.g. username). + + .PARAMETER IdentityType + The identity type of the principal to find. +#> +function Find-Principal +{ + [OutputType([System.DirectoryServices.AccountManagement.Principal])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.DirectoryServices.AccountManagement.PrincipalContext] + $PrincipalContext, + + [Parameter(Mandatory = $true)] + [System.String] + $IdentityValue, + + [Parameter()] + [System.DirectoryServices.AccountManagement.IdentityType] + $IdentityType + ) + + if ($PSBoundParameters.ContainsKey('IdentityType')) + { + return [System.DirectoryServices.AccountManagement.Principal]::FindByIdentity($PrincipalContext, $IdentityType, $IdentityValue) + } + else + { + return [System.DirectoryServices.AccountManagement.Principal]::FindByIdentity($PrincipalContext, $IdentityValue) + } + +} + +<# + .SYNOPSIS + Retrieves a local Windows group. + + .PARAMETER GroupName + The name of the group to retrieve. + + .PARAMETER Disposables + The ArrayList of disposable objects to which to add any objects that need to be disposed. + + .PARAMETER PrincipalContextCache + A hashtable cache of PrincipalContext instances for each scope. + This is used to cache PrincipalContext instances for cases where it is used multiple times. + + .NOTES + The returned value is NOT added to the $disposables list because the caller may need to + call $group.Delete() which also disposes it. +#> +function Get-Group +{ + [OutputType([System.DirectoryServices.AccountManagement.GroupPrincipal])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GroupName, + + [Parameter(Mandatory = $true)] + [System.DirectoryServices.AccountManagement.PrincipalContext] + $PrincipalContext + ) + + $principalContext = Get-PrincipalContext ` + -PrincipalContextCache $PrincipalContextCache ` + -Disposables $Disposables ` + -Scope $env:COMPUTERNAME + + try + { + $group = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($PrincipalContext, $GroupName) + } + catch + { + $group = $null + } + + return $group +} + +<# + .SYNOPSIS + Retrieves the members of a group from the underlying directory entry. + + .PARAMETER Group + The group to retrieve the members of. +#> +function Get-GroupMembersFromDirectoryEntry +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.GroupPrincipal] + $Group + ) + + $groupDirectoryEntry = $Group.GetUnderlyingObject() + return $groupDirectoryEntry.Invoke('Members') +} + +<# + .SYNOPSIS + Clears the members of the specified group. + This is a wrapper function for testing purposes. + + .PARAMETER Group + The group to clear the members of. +#> +function Clear-GroupMember +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.GroupPrincipal] + $Group + ) + + $Group.Members.Clear() +} + +<# + .SYNOPSIS + Adds the specified member to the specified group. + This is a wrapper function for testing purposes. + + .PARAMETER Group + The group to add the member to. + + .PARAMETER MemberAsPrincipal + The member to add to the group as a principal. +#> +function Add-GroupMember +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.GroupPrincipal] + $Group, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.Principal] + $MemberAsPrincipal + ) + + $Group.Members.Add($MemberAsPrincipal) +} + +<# + .SYNOPSIS + Removes the specified member from the specified group. + This is a wrapper function for testing purposes. + + .PARAMETER Group + The group to remove the member from. + + .PARAMETER MemberAsPrincipal + The member to remove from the group as a principal. +#> +function Remove-GroupMember +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.GroupPrincipal] + $Group, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.Principal] + $MemberAsPrincipal + ) + + $Group.Members.Remove($MemberAsPrincipal) +} + +<# + .SYNOPSIS + Deletes the specified group. + This is a wrapper function for testing purposes. + + .PARAMETER Group + The group to delete. +#> +function Remove-Group +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.GroupPrincipal] + $Group + ) + + $Group.Delete() +} + +<# + .SYNOPSIS + Saves the specified group. + This is a wrapper function for testing purposes. + + .PARAMETER Group + The group to save. +#> +function Save-Group +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.DirectoryServices.AccountManagement.GroupPrincipal] + $Group + ) + + $Group.Save() +} + +<# + .SYNOPSIS + Disposes of the contents of an array list containing IDisposable objects. + + .PARAMETER Disosables + The array list of IDisposable Objects to dispose of. +#> +function Remove-DisposableObject +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Collections.ArrayList] + [AllowEmptyCollection()] + $Disposables + ) + + foreach ($disposable in $Disposables) + { + if ($disposable -is [System.IDisposable]) + { + $disposable.Dispose() + } + } +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/DSC_xGroupResource.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/DSC_xGroupResource.schema.mof new file mode 100644 index 0000000..764630f --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/DSC_xGroupResource.schema.mof @@ -0,0 +1,12 @@ + +[ClassVersion("1.0.0"),FriendlyName("xGroup")] +class DSC_xGroupResource : OMI_BaseResource +{ + [Key, Description("The name of the group to create, modify, or remove.")] String GroupName; + [Write, ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}, Description("Indicates if the group should exist or not.")] String Ensure; + [Write, Description("The description the group should have.")] String Description; + [Write, Description("The members the group should have.")] String Members[]; + [Write, Description("The members the group should include.")] String MembersToInclude[]; + [Write, Description("The members the group should exclude.")] String MembersToExclude[]; + [Write, EmbeddedInstance("MSFT_Credential"), Description("A credential to resolve non-local group members.")] String Credential; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/en-US/DSC_xGroupResource.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/en-US/DSC_xGroupResource.schema.mfl new file mode 100644 index 0000000..f999c24 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/en-US/DSC_xGroupResource.schema.mfl @@ -0,0 +1,11 @@ +[Description("The xGroup resource provides a mechanism to manage local groups on the target node.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xGroupResource : OMI_BaseResource +{ + [Key,Description("The name of the group to create, modify, or remove.") : Amended] String GroupName; + [Description("Indicates if the group should exist or not.") : Amended] String Ensure; + [Description("The description the group should have.") : Amended] String Description; + [Description("The members the group should have.") : Amended] String Members[]; + [Description("The members the group should include.") : Amended] String MembersToInclude[]; + [Description("The members the group should exclude.") : Amended] String MembersToExclude[]; + [Description("A credential to resolve non-local group members.") : Amended] String Credential; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/en-US/DSC_xGroupResource.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/en-US/DSC_xGroupResource.strings.psd1 new file mode 100644 index 0000000..8674e53 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xGroupResource/en-US/DSC_xGroupResource.strings.psd1 @@ -0,0 +1,35 @@ +# Localized resources for DSC_xGroupResource + +ConvertFrom-StringData @' + GroupWithName = Group: {0} + RemoveOperation = Remove + AddOperation = Add + SetOperation = Set + GroupCreated = Group {0} created successfully. + GroupUpdated = Group {0} properties updated successfully. + GroupRemoved = Group {0} removed successfully. + NoConfigurationRequired = Group {0} exists on this node with the desired properties. No action required. + NoConfigurationRequiredGroupDoesNotExist = Group {0} does not exist on this node. No action required. + CouldNotFindPrincipal = Could not find a principal with the provided name {0}. + MembersAndIncludeExcludeConflict = The {0} and {1} parameters conflict. The {0} parameter should not be used in any combination with the {1} parameter. + GroupAndMembersEmpty = Members is empty and group {0} has no members. No change to group members is needed. + MemberIsNotALocalUser = {0} is not a local user. User's principal source is {1}. + MemberNotValid = The group member {0} does not exist or cannot be resolved. + IncludeAndExcludeConflict = The principal {0} is included in both {1} and {2} parameter values. The same principal cannot be included in both {1} and {2} parameter values. + InvalidGroupName = The group name {0} cannot be used. Names may not consist entirely of periods and/or whitespace or contain these characters: {1} + GroupExists = A group with the name {0} exists. + GroupDoesNotExist = A group with the name {0} does not exist. + PropertyMismatch = The value of the {0} property is expected to be {1} but it is {2}. + MembersNumberMismatch = The number of provided unique group members {1} in {0} is different from the number of actual group members {2}. + MembersMemberMismatch = At least one member {0} of the provided {1} parameter does not match a user in the existing group {2}. + ResolvingLocalAccount = Resolving {0} as a local account. + ResolvingDomainAccount = Resolving {0} in the domain {1}. + ResolvingDomainAccountWithTrust = Resolving {0} with domain trust. + DomainCredentialsRequired = Credentials are required to resolve the domain account {0}. + UnableToResolveAccount = Unable to resolve account '{0}'. Failed with message: {1} (error code={2}) + InvokingFunctionForGroup = Invoking the function {0} for the group {1}. + SetTargetResourceStartMessage = Begin executing Set functionality on the group {0}. + SetTargetResourceEndMessage = End executing Set functionality on the group {0}. + MembersToIncludeEmpty = MembersToInclude is empty. No group member additions are needed. + MembersToExcludeEmpty = MembersToExclude is empty. No group member removals are needed. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/DSC_xMsiPackage.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/DSC_xMsiPackage.psm1 new file mode 100644 index 0000000..532d1bb --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/DSC_xMsiPackage.psm1 @@ -0,0 +1,1693 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] +param () + +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xMsiPackage' + +# Path to the directory where the files for a package from a file server will be downloaded to +$script:packageCacheLocation = "$env:ProgramData\Microsoft\Windows\PowerShell\Configuration\BuiltinProvCache\MSFT_xMsiPackage" +$script:msiTools = $null + +<# + .SYNOPSIS + Retrieves the current state of the MSI file with the given Product ID. + + .PARAMETER ProductId + The ID of the MSI file to retrieve the state of, usually a GUID. + + .PARAMETER Path + Not used in Get-TargetResource. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ProductId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $identifyingNumber = Convert-ProductIdToIdentifyingNumber -ProductId $ProductId + + $packageResourceResult = @{} + + $productEntry = Get-ProductEntry -IdentifyingNumber $identifyingNumber + + if ($null -eq $productEntry) + { + $packageResourceResult = @{ + Ensure = 'Absent' + ProductId = $identifyingNumber + } + + Write-Verbose -Message ($script:localizedData.GetTargetResourceNotFound -f $ProductId) + } + else + { + $packageResourceResult = Get-ProductEntryInfo -ProductEntry $productEntry + $packageResourceResult['ProductId'] = $identifyingNumber + $packageResourceResult['Ensure'] = 'Present' + + Write-Verbose -Message ($script:localizedData.GetTargetResourceFound -f $ProductId) + } + + return $packageResourceResult +} + +<# + .SYNOPSIS + Installs or uninstalls the MSI file at the given path. + + .PARAMETER ProductId + The identifying number used to find the package, usually a GUID. + + .PARAMETER Path + The path to the MSI file to install or uninstall. + + .PARAMETER Ensure + Indicates whether the given MSI file should be installed or uninstalled. + Set this property to Present to install the MSI, and Absent to uninstall + the MSI. + + .PARAMETER Arguments + The arguments to pass to the MSI package during installation or uninstallation + if needed. + + .PARAMETER IgnoreReboot + Ignore a pending reboot if requested by package installation. + By default is `$false` and DSC will try to reboot the system. + + .PARAMETER Credential + The credential of a user account to be used to mount a UNC path if needed. + + .PARAMETER LogPath + The path to the log file to log the output from the MSI execution. + + .PARAMETER FileHash + The expected hash value of the MSI file at the given path. + + .PARAMETER HashAlgorithm + The algorithm used to generate the given hash value. + + .PARAMETER SignerSubject + The subject that should match the signer certificate of the digital signature of the MSI file. + + .PARAMETER SignerThumbprint + The certificate thumbprint that should match the signer certificate of the digital signature of the MSI file. + + .PARAMETER ServerCertificateValidationCallback + PowerShell code to be used to validate SSL certificates for paths using HTTPS. + + .PARAMETER RunAsCredential + The credential of a user account under which to run the installation or uninstallation of the MSI package. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ProductId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Arguments, + + [Parameter()] + [System.Boolean] + $IgnoreReboot = $false, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [System.String] + $FileHash, + + [Parameter()] + [ValidateSet('SHA1', 'SHA256', 'SHA384', 'SHA512', 'MD5', 'RIPEMD160')] + [System.String] + $HashAlgorithm = 'SHA256', + + [Parameter()] + [System.String] + $SignerSubject, + + [Parameter()] + [System.String] + $SignerThumbprint, + + [Parameter()] + [System.String] + $ServerCertificateValidationCallback, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $RunAsCredential + ) + + $uri = Convert-PathToUri -Path $Path + $identifyingNumber = Convert-ProductIdToIdentifyingNumber -ProductId $ProductId + + # Ensure that the actual file extension is checked if a query string is passed in + if ($null -ne $uri.LocalPath) + { + $uriLocalPath = (Split-Path -Path $uri.LocalPath -Leaf) + Assert-PathExtensionValid -Path $uriLocalPath + } + else + { + Assert-PathExtensionValid -Path $Path + } + + <# + Path gets overwritten in the download code path. Retain the user's original Path so as + to provide a more descriptive error message in case the install succeeds but the named + package can't be found on the system afterward. + #> + $originalPath = $Path + + Write-Verbose -Message $script:localizedData.PackageConfigurationStarting + + $psDrive = $null + $downloadedFileName = $null + + $exitCode = 0 + + try + { + if ($PSBoundParameters.ContainsKey('LogPath')) + { + New-LogFile -LogPath $LogPath + } + + # Download or mount file as necessary + if ($Ensure -eq 'Present') + { + $localPath = $Path + + if ($null -ne $uri.LocalPath) + { + $localPath = $uri.LocalPath + } + + if ($uri.IsUnc) + { + $psDriveArgs = @{ + Name = [System.Guid]::NewGuid() + PSProvider = 'FileSystem' + Root = Split-Path -Path $localPath + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $psDriveArgs['Credential'] = $Credential + } + + $psDrive = New-PSDrive @psDriveArgs + $Path = Join-Path -Path $psDrive.Root -ChildPath (Split-Path -Path $localPath -Leaf) + } + elseif (@( 'http', 'https' ) -contains $uri.Scheme) + { + $outStream = $null + + try + { + if (-not (Test-Path -Path $script:packageCacheLocation -PathType 'Container')) + { + Write-Verbose -Message ($script:localizedData.CreatingCacheLocation) + $null = New-Item -Path $script:packageCacheLocation -ItemType 'Directory' + } + + $destinationPath = Join-Path -Path $script:packageCacheLocation -ChildPath (Split-Path -Path $localPath -Leaf) + + try + { + Write-Verbose -Message ($script:localizedData.CreatingTheDestinationCacheFile) + $outStream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList @( $destinationPath, 'Create' ) + } + catch + { + # Should never happen since we own the cache directory + New-InvalidOperationException -Message ($script:localizedData.CouldNotOpenDestFile -f $destinationPath) -ErrorRecord $_ + } + + try + { + $responseStream = Get-WebRequestResponse -Uri $uri -ServerCertificateValidationCallback $ServerCertificateValidationCallback + + Copy-ResponseStreamToFileStream -ResponseStream $responseStream -FileStream $outStream + } + finally + { + if ((Test-Path -Path variable:responseStream) -and ($null -ne $responseStream)) + { + Close-Stream -Stream $responseStream + } + } + } + finally + { + if ($null -ne $outStream) + { + Close-Stream -Stream $outStream + } + } + + Write-Verbose -Message ($script:localizedData.RedirectingPackagePathToCacheFileLocation) + $Path = $destinationPath + $downloadedFileName = $destinationPath + } + + # At this point the Path should be valid if this is an install case + if (-not (Test-Path -Path $Path -PathType 'Leaf')) + { + New-InvalidOperationException -Message ($script:localizedData.PathDoesNotExist -f $Path) + } + + Assert-FileValid -Path $Path -HashAlgorithm $HashAlgorithm -FileHash $FileHash -SignerSubject $SignerSubject -SignerThumbprint $SignerThumbprint + + # Check if the MSI package specifies the ProductCode, and if so make sure they match + $productCode = Get-MsiProductCode -Path $Path + + if ((-not [System.String]::IsNullOrEmpty($identifyingNumber)) -and ($identifyingNumber -ne $productCode)) + { + New-InvalidArgumentException -ArgumentName 'ProductId' -Message ($script:localizedData.InvalidId -f $identifyingNumber, $productCode) + } + } + + $exitCode = Start-MsiProcess -IdentifyingNumber $identifyingNumber -Path $Path -Ensure $Ensure -Arguments $Arguments -LogPath $LogPath -RunAsCredential $RunAsCredential + } + finally + { + if ($null -ne $psDrive) + { + $null = Remove-PSDrive -Name $psDrive -Force + } + } + + if ($null -ne $downloadedFileName) + { + <# + This is deliberately not in the finally block because we want to leave the downloaded + file on disk if an error occurred as a debugging aid for the user. + #> + $null = Remove-Item -Path $downloadedFileName + } + + <# + Check if a reboot is required, if so notify CA. The MSFT_ServerManagerTasks provider is + missing on some client SKUs (worked on both Server and Client Skus in Windows 10). + #> + $serverFeatureData = Invoke-CimMethod ` + -Name 'GetServerFeature' ` + -Namespace 'root\microsoft\windows\servermanager' ` + -Class 'MSFT_ServerManagerTasks' ` + -Arguments @{ + BatchSize = 256 + } ` + -ErrorAction 'Ignore' + + $registryData = Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' -Name 'PendingFileRenameOperations' -ErrorAction 'Ignore' + + $rebootRequired = (($exitcode -eq 3010) -or ($exitcode -eq 1641) -or ($null -ne $registryData)) + + if (($serverFeatureData -and $serverFeatureData.RequiresReboot) -or $rebootRequired) + { + Write-Verbose $script:localizedData.MachineRequiresReboot + if ($IgnoreReboot) + { + Write-Verbose $script:localizedData.IgnoreReboot + } + else + { + Set-DSCMachineRebootRequired + } + } + elseif ($Ensure -eq 'Present') + { + $productEntry = Get-ProductEntry -IdentifyingNumber $identifyingNumber + + if ($null -eq $productEntry) + { + New-InvalidOperationException -Message ($script:localizedData.PostValidationError -f $originalPath) + } + } + + if ($Ensure -eq 'Present') + { + Write-Verbose -Message $script:localizedData.PackageInstalled + } + else + { + Write-Verbose -Message $script:localizedData.PackageUninstalled + } +} + +<# + .SYNOPSIS + Tests if the MSI file with the given product ID is installed or uninstalled. + + .PARAMETER ProductId + The identifying number used to find the package, usually a GUID. + + .PARAMETER Path + Not Used in Test-TargetResource + + .PARAMETER Ensure + Indicates whether the MSI file should be installed or uninstalled. + Set this property to Present if the MSI file should be installed. Set + this property to Absent if the MSI file should be uninstalled. + + .PARAMETER Arguments + Not Used in Test-TargetResource + + .PARAMETER IgnoreReboot + Not Used in Test-TargetResource + + .PARAMETER Credential + Not Used in Test-TargetResource + + .PARAMETER LogPath + Not Used in Test-TargetResource + + .PARAMETER FileHash + Not Used in Test-TargetResource + + .PARAMETER HashAlgorithm + Not Used in Test-TargetResource + + .PARAMETER SignerSubject + Not Used in Test-TargetResource + + .PARAMETER SignerThumbprint + Not Used in Test-TargetResource + + .PARAMETER ServerCertificateValidationCallback + Not Used in Test-TargetResource + + .PARAMETER RunAsCredential + Not Used in Test-TargetResource +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ProductId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Arguments, + + [Parameter()] + [System.Boolean] + $IgnoreReboot = $false, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [System.String] + $FileHash, + + [Parameter()] + [ValidateSet('SHA1', 'SHA256', 'SHA384', 'SHA512', 'MD5', 'RIPEMD160')] + [System.String] + $HashAlgorithm = 'SHA256', + + [Parameter()] + [System.String] + $SignerSubject, + + [Parameter()] + [System.String] + $SignerThumbprint, + + [Parameter()] + [System.String] + $ServerCertificateValidationCallback, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $RunAsCredential + ) + + $identifyingNumber = Convert-ProductIdToIdentifyingNumber -ProductId $ProductId + + $productEntry = Get-ProductEntry -IdentifyingNumber $identifyingNumber + + if ($null -ne $productEntry) + { + $displayName = Get-ProductEntryValue -ProductEntry $productEntry -Property 'DisplayName' + Write-Verbose -Message ($script:localizedData.PackageAppearsInstalled -f $displayName) + } + else + { + Write-Verbose -Message ($script:localizedData.PackageDoesNotAppearInstalled -f $ProductId) + } + + return (($null -ne $productEntry -and $Ensure -eq 'Present') -or ($null -eq $productEntry -and $Ensure -eq 'Absent')) +} + +<# + .SYNOPSIS + Asserts that the path extension is '.msi' + + .PARAMETER Path + The path to the file to validate the extension of. +#> +function Assert-PathExtensionValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $pathExtension = [System.IO.Path]::GetExtension($Path) + Write-Verbose -Message ($script:localizedData.ThePathExtensionWasPathExt -f $pathExtension) + + if ($pathExtension.ToLower() -ne '.msi') + { + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.InvalidBinaryType -f $Path) + } +} + +<# + .SYNOPSIS + Converts the given path to a URI and returns the URI object. + Throws an exception if the path's scheme as a URI is not valid. + + .PARAMETER Path + The path to the file to retrieve as a URI. +#> +function Convert-PathToUri +{ + [OutputType([System.Uri])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + try + { + $uri = [System.Uri] $Path + } + catch + { + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.InvalidPath -f $Path) + } + + $validUriSchemes = @( 'file', 'http', 'https' ) + + if ($validUriSchemes -notcontains $uri.Scheme) + { + Write-Verbose -Message ($script:localizedData.TheUriSchemeWasUriScheme -f $uri.Scheme) + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.InvalidPath -f $Path) + } + + return $uri +} + +<# + .SYNOPSIS + Converts the product ID to the identifying number format. + + .PARAMETER ProductId + The product ID to convert to an identifying number. +#> +function Convert-ProductIdToIdentifyingNumber +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ProductId + ) + + try + { + Write-Verbose -Message ($script:localizedData.ParsingProductIdAsAnIdentifyingNumber -f $ProductId) + $identifyingNumber = '{{{0}}}' -f [System.Guid]::Parse($ProductId).ToString().ToUpper() + + Write-Verbose -Message ($script:localizedData.ParsedProductIdAsIdentifyingNumber -f $ProductId, $identifyingNumber) + return $identifyingNumber + } + catch + { + New-InvalidArgumentException -ArgumentName 'ProductId' -Message ($script:localizedData.InvalidIdentifyingNumber -f $ProductId) + } +} + + +<# + .SYNOPSIS + Retrieves the product entry for the package with the given identifying number. + + .PARAMETER IdentifyingNumber + The identifying number of the product entry to retrieve. +#> +function Get-ProductEntry +{ + [OutputType([Microsoft.Win32.RegistryKey])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $IdentifyingNumber + ) + + $uninstallRegistryKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' + $uninstallRegistryKeyWow64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' + + $productEntry = $null + + if (-not [System.String]::IsNullOrEmpty($IdentifyingNumber)) + { + $productEntryKeyLocation = Join-Path -Path $uninstallRegistryKey -ChildPath $IdentifyingNumber + $productEntry = Get-Item -Path $productEntryKeyLocation -ErrorAction 'SilentlyContinue' + + if ($null -eq $productEntry) + { + $productEntryKeyLocation = Join-Path -Path $uninstallRegistryKeyWow64 -ChildPath $IdentifyingNumber + $productEntry = Get-Item $productEntryKeyLocation -ErrorAction 'SilentlyContinue' + } + } + + return $productEntry +} + +<# + .SYNOPSIS + Retrieves the information for the given product entry and returns it as a hashtable. + + .PARAMETER ProductEntry + The product entry to retrieve the information for. +#> +function Get-ProductEntryInfo +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $ProductEntry + ) + + $installDate = Get-ProductEntryValue -ProductEntry $ProductEntry -Property 'InstallDate' + + if ($null -ne $installDate) + { + try + { + $installDate = '{0:d}' -f [System.DateTime]::ParseExact($installDate, 'yyyyMMdd', [System.Globalization.CultureInfo]::CurrentCulture).Date + } + catch + { + $installDate = $null + } + } + + $publisher = Get-ProductEntryValue -ProductEntry $ProductEntry -Property 'Publisher' + + $estimatedSizeInKB = Get-ProductEntryValue -ProductEntry $ProductEntry -Property 'EstimatedSize' + + if ($null -ne $estimatedSizeInKB) + { + $estimatedSizeInMB = $estimatedSizeInKB / 1024 + } + + $displayVersion = Get-ProductEntryValue -ProductEntry $ProductEntry -Property 'DisplayVersion' + + $comments = Get-ProductEntryValue -ProductEntry $ProductEntry -Property 'Comments' + + $displayName = Get-ProductEntryValue -ProductEntry $ProductEntry -Property 'DisplayName' + + $installSource = Get-ProductEntryValue -ProductEntry $ProductEntry -Property 'InstallSource' + + return @{ + Name = $displayName + InstallSource = $installSource + InstalledOn = $installDate + Size = $estimatedSizeInMB + Version = $displayVersion + PackageDescription = $comments + Publisher = $publisher + } +} + +<# + .SYNOPSIS + Retrieves the value of the given property for the given product entry. + This is a wrapper for unit testing. + + .PARAMETER ProductEntry + The product entry object to retrieve the property value from. + + .PARAMETER Property + The property to retrieve the value of from the product entry. +#> +function Get-ProductEntryValue +{ + [OutputType([System.Object])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $ProductEntry, + + [Parameter(Mandatory = $true)] + [System.String] + $Property + ) + + return $ProductEntry.GetValue($Property) +} + +<# + .SYNOPSIS + Removes the file at the given path if it exists and creates a new file + to be written to. + + .PARAMETER LogPath + The path where the log file should be created. +#> +function New-LogFile +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $LogPath + ) + + try + { + <# + Pre-verify the log path exists and is writable ahead of time so the user won't + have to detect why the MSI log path doesn't exist. + #> + if (Test-Path -Path $LogPath) + { + $null = Remove-Item -Path $LogPath + } + + $null = New-Item -Path $LogPath -Type 'File' + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.CouldNotOpenLog -f $LogPath) -ErrorRecord $_ + } +} + +<# + .SYNOPSIS + Retrieves the WebRequest response as a stream for the MSI file with the given URI. + + .PARAMETER Uri + The Uri to retrieve the WebRequest from. + + .PARAMETER ServerCertificationValidationCallback + The callback code to validate the SSL certificate for HTTPS URI schemes. +#> +function Get-WebRequestResponse +{ + [OutputType([System.IO.Stream])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Uri] + $Uri, + + [Parameter()] + [System.String] + $ServerCertificateValidationCallback + ) + + try + { + $uriScheme = $Uri.Scheme + + Write-Verbose -Message ($script:localizedData.CreatingTheSchemeStream -f $uriScheme) + $webRequest = Get-WebRequest -Uri $Uri + + Write-Verbose -Message ($script:localizedData.SettingDefaultCredential) + $webRequest.Credentials = [System.Net.CredentialCache]::DefaultCredentials + $webRequest.AuthenticationLevel = [System.Net.Security.AuthenticationLevel]::None + + if ($uriScheme -eq 'http') + { + # Default value is MutualAuthRequested, which applies to the https scheme + Write-Verbose -Message ($script:localizedData.SettingAuthenticationLevel) + $webRequest.AuthenticationLevel = [System.Net.Security.AuthenticationLevel]::None + } + elseif ($uriScheme -eq 'https' -and -not [System.String]::IsNullOrEmpty($ServerCertificateValidationCallback)) + { + Write-Verbose -Message $script:localizedData.SettingCertificateValidationCallback + $webRequest.ServerCertificateValidationCallBack = (Get-ScriptBlock -FunctionName $ServerCertificateValidationCallback) + } + + Write-Verbose -Message ($script:localizedData.GettingTheSchemeResponseStream -f $uriScheme) + $responseStream = Get-WebRequestResponseStream -WebRequest $webRequest + + return $responseStream + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.CouldNotGetResponseFromWebRequest -f $uriScheme, $Uri.OriginalString) -ErrorRecord $_ + } +} + +<# + .SYNOPSIS + Creates a WebRequst object based on the given Uri and returns it. + This is a wrapper for unit testing + + .PARAMETER Uri + The URI object to create the WebRequest from +#> +function Get-WebRequest +{ + [OutputType([System.Net.WebRequest])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Uri] + $Uri + ) + + return [System.Net.WebRequest]::Create($Uri) +} + +<# + .SYNOPSIS + Retrieves the response stream from the given WebRequest object. + This is a wrapper for unit testing. + + .PARAMETER WebRequest + The WebRequest object to retrieve the response stream from. +#> +function Get-WebRequestResponseStream +{ + [OutputType([System.IO.Stream])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Net.WebRequest] + $WebRequest + ) + + return (([System.Net.HttpWebRequest] $WebRequest).GetResponse()).GetResponseStream() +} + +<# + .SYNOPSIS + Converts the given function into a script block and returns it. + This is a wrapper for unit testing + + .PARAMETER Function + The name of the function to convert to a script block +#> +function Get-ScriptBlock +{ + [OutputType([System.Management.Automation.ScriptBlock])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $FunctionName + ) + + return [System.Management.Automation.ScriptBlock]::Create($FunctionName) +} + +<# + .SYNOPSIS + Copies the given response stream to the given file stream. + + .PARAMETER ResponseStream + The response stream to copy over. + + .PARAMETER FileStream + The file stream to copy to. +#> +function Copy-ResponseStreamToFileStream +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.IO.Stream] + $ResponseStream, + + [Parameter(Mandatory = $true)] + [System.IO.Stream] + $FileStream + ) + + try + { + Write-Verbose -Message ($script:localizedData.CopyingTheSchemeStreamBytesToTheDiskCache) + $null = $ResponseStream.CopyTo($FileStream) + $null = $ResponseStream.Flush() + $null = $FileStream.Flush() + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.ErrorCopyingDataToFile) -ErrorRecord $_ + } +} + +<# + .SYNOPSIS + Closes the given stream. + Wrapper function for unit testing. + + .PARAMETER Stream + The stream to close. +#> +function Close-Stream +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.IO.Stream] + $Stream + ) + + $null = $Stream.Close() +} + +<# + .SYNOPSIS + Asserts that the file at the given path has a valid hash, signer thumbprint, and/or + signer subject. If only Path is provided, then this function will never throw. + If FileHash is provided and HashAlgorithm is not, then Sha-256 will be used as the hash + algorithm by default. + + .PARAMETER Path + The path to the file to check. + + .PARAMETER FileHash + The hash that should match the hash of the file. + + .PARAMETER HashAlgorithm + The algorithm to use to retrieve the file hash. + + .PARAMETER SignerThumbprint + The certificate thumbprint that should match the file's signer certificate. + + .PARAMETER SignerSubject + The certificate subject that should match the file's signer certificate. +#> +function Assert-FileValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [System.String] + $FileHash, + + [Parameter()] + [System.String] + $HashAlgorithm = 'SHA256', + + [Parameter()] + [System.String] + $SignerThumbprint, + + [Parameter()] + [System.String] + $SignerSubject + ) + + if (-not [System.String]::IsNullOrEmpty($FileHash)) + { + Assert-FileHashValid -Path $Path -Hash $FileHash -Algorithm $HashAlgorithm + } + + if (-not [System.String]::IsNullOrEmpty($SignerThumbprint) -or -not [System.String]::IsNullOrEmpty($SignerSubject)) + { + Assert-FileSignatureValid -Path $Path -Thumbprint $SignerThumbprint -Subject $SignerSubject + } +} + +<# + .SYNOPSIS + Asserts that the hash of the file at the given path matches the given hash. + + .PARAMETER Path + The path to the file to check the hash of. + + .PARAMETER Hash + The hash to check against. + + .PARAMETER Algorithm + The algorithm to use to retrieve the file's hash. + Default is 'Sha256' +#> +function Assert-FileHashValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [System.String] + $Hash, + + [Parameter()] + [System.String] + $Algorithm = 'SHA256' + ) + + Write-Verbose -Message ($script:localizedData.CheckingFileHash -f $Path, $Hash, $Algorithm) + + $fileHash = Get-FileHash -LiteralPath $Path -Algorithm $Algorithm + + if ($fileHash.Hash -ne $Hash) + { + New-InvalidArgumentException -ArgumentName 'FileHash' -Message ($script:localizedData.InvalidFileHash -f $Path, $Hash, $Algorithm) + } +} + +<# + .SYNOPSIS + Asserts that the signature of the file at the given path is valid. + + .PARAMETER Path + The path to the file to check the signature of + + .PARAMETER Thumbprint + The certificate thumbprint that should match the file's signer certificate. + + .PARAMETER Subject + The certificate subject that should match the file's signer certificate. +#> +function Assert-FileSignatureValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [System.String] + $Thumbprint, + + [Parameter()] + [System.String] + $Subject + ) + + Write-Verbose -Message ($script:localizedData.CheckingFileSignature -f $Path) + + $signature = Get-AuthenticodeSignature -LiteralPath $Path + + if ($signature.Status -ne [System.Management.Automation.SignatureStatus]::Valid) + { + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.InvalidFileSignature -f $Path, $signature.Status) + } + else + { + Write-Verbose -Message ($script:localizedData.FileHasValidSignature -f $Path, $signature.SignerCertificate.Thumbprint, $signature.SignerCertificate.Subject) + } + + if (-not [System.String]::IsNullOrEmpty($Subject) -and ($signature.SignerCertificate.Subject -notlike $Subject)) + { + New-InvalidArgumentException -ArgumentName 'SignerSubject' -Message ($script:localizedData.WrongSignerSubject -f $Path, $Subject) + } + + if (-not [System.String]::IsNullOrEmpty($Thumbprint) -and ($signature.SignerCertificate.Thumbprint -ne $Thumbprint)) + { + New-InvalidArgumentException -ArgumentName 'SignerThumbprint' -Message ($script:localizedData.WrongSignerThumbprint -f $Path, $Thumbprint) + } +} + +<# + .SYNOPSIS + Starts the given MSI installation or uninstallation either as a process or + under a user credential if RunAsCredential is specified. + + .PARAMETER IdentifyingNumber + The identifying number used to find the package. + + .PARAMETER Path + The path to the MSI file to install or uninstall. + + .PARAMETER Ensure + Indicates whether the given MSI file should be installed or uninstalled. + + .PARAMETER Arguments + The arguments to pass to the MSI package. + + .PARAMETER LogPath + The path to the log file to log the output from the MSI execution. + + .PARAMETER RunAsCredential + The credential of a user account under which to run the installation or uninstallation. +#> +function Start-MsiProcess +{ + [OutputType([System.Int32])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $IdentifyingNumber, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $Arguments, + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $RunAsCredential + ) + + $startInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo' + + # Necessary for I/O redirection + $startInfo.UseShellExecute = $false + + $startInfo.FileName = "$env:winDir\system32\msiexec.exe" + + if ($Ensure -eq 'Present') + { + $startInfo.Arguments = '/i "{0}"' -f $Path + } + # Ensure -eq 'Absent' + else + { + $productEntry = Get-ProductEntry -IdentifyingNumber $identifyingNumber + + $id = Split-Path -Path $productEntry.Name -Leaf + $startInfo.Arguments = ('/x{0}' -f $id) + } + + if (-not [System.String]::IsNullOrEmpty($LogPath)) + { + $startInfo.Arguments += (' /log "{0}"' -f $LogPath) + } + + $startInfo.Arguments += ' /quiet /norestart' + + if (-not [System.String]::IsNullOrEmpty($Arguments)) + { + # Append any specified arguments with a space + $startInfo.Arguments += (' {0}' -f $Arguments) + } + + Write-Verbose -Message ($script:localizedData.StartingWithStartInfoFileNameStartInfoArguments -f $startInfo.FileName, $startInfo.Arguments) + + $exitCode = 0 + + try + { + if (-not [System.String]::IsNullOrEmpty($RunAsCredential)) + { + $commandLine = ('"{0}" {1}' -f $startInfo.FileName, $startInfo.Arguments) + $exitCode = Invoke-PInvoke -CommandLine $commandLine -RunAsCredential $RunAsCredential + } + else + { + $process = New-Object -TypeName 'System.Diagnostics.Process' + $process.StartInfo = $startInfo + $exitCode = Invoke-Process -Process $process + } + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.CouldNotStartProcess -f $Path) -ErrorRecord $_ + } + + return $exitCode +} + +<# + .SYNOPSIS + Runs a process as the specified user via PInvoke. Returns the exitCode that + PInvoke returns. + + .PARAMETER CommandLine + The command line (including arguments) of the process to start. + + .PARAMETER RunAsCredential + The user credential to start the process as. +#> +function Invoke-PInvoke +{ + [OutputType([System.Int32])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $CommandLine, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $RunAsCredential + ) + + Register-PInvoke + [System.Int32] $exitCode = 0 + + $null = [Source.NativeMethods]::CreateProcessAsUser($CommandLine, ` + $RunAsCredential.GetNetworkCredential().Domain, ` + $RunAsCredential.GetNetworkCredential().UserName, ` + $RunAsCredential.GetNetworkCredential().Password, ` + [ref] $exitCode + ) + + return $exitCode +} + +<# + .SYNOPSIS + Starts and waits for a process. + + .PARAMETER Process + The System.Diagnositics.Process object to start. +#> +function Invoke-Process +{ + [OutputType([System.Int32])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Diagnostics.Process] + $Process + ) + + $null = $Process.Start() + + $null = $Process.WaitForExit() + return $Process.ExitCode +} + +<# + .SYNOPSIS + Retrieves product code from the MSI at the given path. + + .PARAMETER Path + The path to the MSI to retrieve the product code from. +#> +function Get-MsiProductCode +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $msiTools = Get-MsiTool + + $productCode = $msiTools::GetProductCode($Path) + + return $productCode +} + +<# + .SYNOPSIS + Retrieves the MSI tools type. +#> +function Get-MsiTool +{ + [OutputType([System.Type])] + [CmdletBinding()] + param () + + # Check if the variable is already defined + if ($null -ne $script:msiTools) + { + return $script:msiTools + } + + $msiToolsCodeDefinition = @' + [DllImport("msi.dll", CharSet = CharSet.Unicode, PreserveSig = true, SetLastError = true, ExactSpelling = true)] + private static extern UInt32 MsiOpenPackageExW(string szPackagePath, int dwOptions, out IntPtr hProduct); + [DllImport("msi.dll", CharSet = CharSet.Unicode, PreserveSig = true, SetLastError = true, ExactSpelling = true)] + private static extern uint MsiCloseHandle(IntPtr hAny); + [DllImport("msi.dll", CharSet = CharSet.Unicode, PreserveSig = true, SetLastError = true, ExactSpelling = true)] + private static extern uint MsiGetPropertyW(IntPtr hAny, string name, StringBuilder buffer, ref int bufferLength); + private static string GetPackageProperty(string msi, string property) + { + IntPtr MsiHandle = IntPtr.Zero; + try + { + var res = MsiOpenPackageExW(msi, 1, out MsiHandle); + if (res != 0) + { + return null; + } + int length = 256; + var buffer = new StringBuilder(length); + res = MsiGetPropertyW(MsiHandle, property, buffer, ref length); + return buffer.ToString(); + } + finally + { + if (MsiHandle != IntPtr.Zero) + { + MsiCloseHandle(MsiHandle); + } + } + } + public static string GetProductCode(string msi) + { + return GetPackageProperty(msi, "ProductCode"); + } + public static string GetProductName(string msi) + { + return GetPackageProperty(msi, "ProductName"); + } +'@ + + # Check if the the type is already defined + if (([System.Management.Automation.PSTypeName]'Microsoft.Windows.DesiredStateConfiguration.xPackageResource.MsiTools').Type) + { + $script:msiTools = ([System.Management.Automation.PSTypeName]'Microsoft.Windows.DesiredStateConfiguration.xPackageResource.MsiTools').Type + } + else + { + $script:msiTools = Add-Type ` + -Namespace 'Microsoft.Windows.DesiredStateConfiguration.xPackageResource' ` + -Name 'MsiTools' ` + -Using 'System.Text' ` + -MemberDefinition $msiToolsCodeDefinition ` + -PassThru + } + + return $script:msiTools +} + +<# + .SYNOPSIS + Registers PInvoke to run a process as a user. +#> +function Register-PInvoke +{ + [CmdletBinding()] + param () + + $programSource = @' + using System; + using System.Collections.Generic; + using System.Text; + using System.Security; + using System.Runtime.InteropServices; + using System.Diagnostics; + using System.Security.Principal; + using System.ComponentModel; + using System.IO; + namespace Source + { + [SuppressUnmanagedCodeSecurity] + public static class NativeMethods + { + //The following structs and enums are used by the various Win32 API's that are used in the code below + [StructLayout(LayoutKind.Sequential)] + public struct STARTUPINFO + { + public Int32 cb; + public string lpReserved; + public string lpDesktop; + public string lpTitle; + public Int32 dwX; + public Int32 dwY; + public Int32 dwXSize; + public Int32 dwXCountChars; + public Int32 dwYCountChars; + public Int32 dwFillAttribute; + public Int32 dwFlags; + public Int16 wShowWindow; + public Int16 cbReserved2; + public IntPtr lpReserved2; + public IntPtr hStdInput; + public IntPtr hStdOutput; + public IntPtr hStdError; + } + [StructLayout(LayoutKind.Sequential)] + public struct PROCESS_INFORMATION + { + public IntPtr hProcess; + public IntPtr hThread; + public Int32 dwProcessID; + public Int32 dwThreadID; + } + [Flags] + public enum LogonType + { + LOGON32_LOGON_INTERACTIVE = 2, + LOGON32_LOGON_NETWORK = 3, + LOGON32_LOGON_BATCH = 4, + LOGON32_LOGON_SERVICE = 5, + LOGON32_LOGON_UNLOCK = 7, + LOGON32_LOGON_NETWORK_CLEARTEXT = 8, + LOGON32_LOGON_NEW_CREDENTIALS = 9 + } + [Flags] + public enum LogonProvider + { + LOGON32_PROVIDER_DEFAULT = 0, + LOGON32_PROVIDER_WINNT35, + LOGON32_PROVIDER_WINNT40, + LOGON32_PROVIDER_WINNT50 + } + [StructLayout(LayoutKind.Sequential)] + public struct SECURITY_ATTRIBUTES + { + public Int32 Length; + public IntPtr lpSecurityDescriptor; + public bool bInheritHandle; + } + public enum SECURITY_IMPERSONATION_LEVEL + { + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation + } + public enum TOKEN_TYPE + { + TokenPrimary = 1, + TokenImpersonation + } + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct TokPriv1Luid + { + public int Count; + public long Luid; + public int Attr; + } + public const int GENERIC_ALL_ACCESS = 0x10000000; + public const int CREATE_NO_WINDOW = 0x08000000; + internal const int SE_PRIVILEGE_ENABLED = 0x00000002; + internal const int TOKEN_QUERY = 0x00000008; + internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; + internal const string SE_INCRASE_QUOTA = "SeIncreaseQuotaPrivilege"; + [DllImport("kernel32.dll", + EntryPoint = "CloseHandle", SetLastError = true, + CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] + public static extern bool CloseHandle(IntPtr handle); + [DllImport("advapi32.dll", + EntryPoint = "CreateProcessAsUser", SetLastError = true, + CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern bool CreateProcessAsUser( + IntPtr hToken, + string lpApplicationName, + string lpCommandLine, + ref SECURITY_ATTRIBUTES lpProcessAttributes, + ref SECURITY_ATTRIBUTES lpThreadAttributes, + bool bInheritHandle, + Int32 dwCreationFlags, + IntPtr lpEnvrionment, + string lpCurrentDirectory, + ref STARTUPINFO lpStartupInfo, + ref PROCESS_INFORMATION lpProcessInformation + ); + [DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx")] + public static extern bool DuplicateTokenEx( + IntPtr hExistingToken, + Int32 dwDesiredAccess, + ref SECURITY_ATTRIBUTES lpThreadAttributes, + Int32 ImpersonationLevel, + Int32 dwTokenType, + ref IntPtr phNewToken + ); + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern Boolean LogonUser( + String lpszUserName, + String lpszDomain, + String lpszPassword, + LogonType dwLogonType, + LogonProvider dwLogonProvider, + out IntPtr phToken + ); + [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] + internal static extern bool AdjustTokenPrivileges( + IntPtr htok, + bool disall, + ref TokPriv1Luid newst, + int len, + IntPtr prev, + IntPtr relen + ); + [DllImport("kernel32.dll", ExactSpelling = true)] + internal static extern IntPtr GetCurrentProcess(); + [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] + internal static extern bool OpenProcessToken( + IntPtr h, + int acc, + ref IntPtr phtok + ); + [DllImport("kernel32.dll", ExactSpelling = true)] + internal static extern int WaitForSingleObject( + IntPtr h, + int milliseconds + ); + [DllImport("kernel32.dll", ExactSpelling = true)] + internal static extern bool GetExitCodeProcess( + IntPtr h, + out int exitcode + ); + [DllImport("advapi32.dll", SetLastError = true)] + internal static extern bool LookupPrivilegeValue( + string host, + string name, + ref long pluid + ); + public static void CreateProcessAsUser(string strCommand, string strDomain, string strName, string strPassword, ref int ExitCode ) + { + var hToken = IntPtr.Zero; + var hDupedToken = IntPtr.Zero; + TokPriv1Luid tp; + var pi = new PROCESS_INFORMATION(); + var sa = new SECURITY_ATTRIBUTES(); + sa.Length = Marshal.SizeOf(sa); + Boolean bResult = false; + try + { + bResult = LogonUser( + strName, + strDomain, + strPassword, + LogonType.LOGON32_LOGON_BATCH, + LogonProvider.LOGON32_PROVIDER_DEFAULT, + out hToken + ); + if (!bResult) + { + throw new Win32Exception("Logon error #" + Marshal.GetLastWin32Error().ToString()); + } + IntPtr hproc = GetCurrentProcess(); + IntPtr htok = IntPtr.Zero; + bResult = OpenProcessToken( + hproc, + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, + ref htok + ); + if(!bResult) + { + throw new Win32Exception("Open process token error #" + Marshal.GetLastWin32Error().ToString()); + } + tp.Count = 1; + tp.Luid = 0; + tp.Attr = SE_PRIVILEGE_ENABLED; + bResult = LookupPrivilegeValue( + null, + SE_INCRASE_QUOTA, + ref tp.Luid + ); + if(!bResult) + { + throw new Win32Exception("Lookup privilege error #" + Marshal.GetLastWin32Error().ToString()); + } + bResult = AdjustTokenPrivileges( + htok, + false, + ref tp, + 0, + IntPtr.Zero, + IntPtr.Zero + ); + if(!bResult) + { + throw new Win32Exception("Token elevation error #" + Marshal.GetLastWin32Error().ToString()); + } + bResult = DuplicateTokenEx( + hToken, + GENERIC_ALL_ACCESS, + ref sa, + (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, + (int)TOKEN_TYPE.TokenPrimary, + ref hDupedToken + ); + if(!bResult) + { + throw new Win32Exception("Duplicate Token error #" + Marshal.GetLastWin32Error().ToString()); + } + var si = new STARTUPINFO(); + si.cb = Marshal.SizeOf(si); + si.lpDesktop = ""; + bResult = CreateProcessAsUser( + hDupedToken, + null, + strCommand, + ref sa, + ref sa, + false, + 0, + IntPtr.Zero, + null, + ref si, + ref pi + ); + if(!bResult) + { + throw new Win32Exception("Create process as user error #" + Marshal.GetLastWin32Error().ToString()); + } + int status = WaitForSingleObject(pi.hProcess, -1); + if(status == -1) + { + throw new Win32Exception("Wait during create process failed user error #" + Marshal.GetLastWin32Error().ToString()); + } + bResult = GetExitCodeProcess(pi.hProcess, out ExitCode); + if(!bResult) + { + throw new Win32Exception("Retrieving status error #" + Marshal.GetLastWin32Error().ToString()); + } + } + finally + { + if (pi.hThread != IntPtr.Zero) + { + CloseHandle(pi.hThread); + } + if (pi.hProcess != IntPtr.Zero) + { + CloseHandle(pi.hProcess); + } + if (hDupedToken != IntPtr.Zero) + { + CloseHandle(hDupedToken); + } + } + } + } + } +'@ + $null = Add-Type -TypeDefinition $programSource -ReferencedAssemblies 'System.ServiceProcess' +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/DSC_xMsiPackage.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/DSC_xMsiPackage.schema.mof new file mode 100644 index 0000000..69692b9 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/DSC_xMsiPackage.schema.mof @@ -0,0 +1,24 @@ +[ClassVersion("1.0.0"),FriendlyName("xMsiPackage")] +class DSC_xMsiPackage : OMI_BaseResource +{ + [Key, Description("The identifying number used to find the package, usually a GUID.")] String ProductId; + [Required, Description("The path to the MSI file that should be installed or uninstalled.")] String Path; + [Write, Description("Specifies whether or not the MSI file should be installed or uninstalled."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Write, Description("The arguments to be passed to the MSI package during installation or uninstallation.")] String Arguments; + [Write, Description("The credential of a user account to be used to mount a UNC path if needed."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("The path to the log file to log the output from the MSI execution.")] String LogPath; + [Write, Description("The expected hash value of the MSI file at the given path.")] String FileHash; + [Write, Description("The algorithm used to generate the given hash value."), ValueMap{"SHA1", "SHA256", "SHA384", "SHA512", "MD5", "RIPEMD160"}, Values{"SHA1", "SHA256", "SHA384", "SHA512", "MD5", "RIPEMD160"}] String HashAlgorithm; + [Write, Description("The subject that should match the signer certificate of the digital signature of the MSI file.")] String SignerSubject; + [Write, Description("The certificate thumbprint that should match the signer certificate of the digital signature of the MSI file.")] String SignerThumbprint; + [Write, Description("PowerShell code that should be used to validate SSL certificates for paths using HTTPS.")] String ServerCertificateValidationCallback; + [Write, Description("Ignore a pending reboot if requested by package installation.")] Boolean IgnoreReboot; + [Write, Description("The credential of a user account under which to run the installation or uninstallation of the MSI package."), EmbeddedInstance("MSFT_Credential")] String RunAsCredential; + [Read, Description("The display name of the MSI package.")] String Name; + [Read, Description("The path to the MSI package.")] String InstallSource; + [Read, Description("The date that the MSI package was installed on or serviced on, whichever is later.")] String InstalledOn; + [Read, Description("The size of the MSI package in MB.")] UInt32 Size; + [Read, Description("The version number of the MSI package.")] String Version; + [Read, Description("The description of the MSI package.")] String PackageDescription; + [Read, Description("The publisher of the MSI package.")] String Publisher; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/en-US/DSC_xMsiPackage.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/en-US/DSC_xMsiPackage.schema.mfl new file mode 100644 index 0000000..ba42832 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/en-US/DSC_xMsiPackage.schema.mfl @@ -0,0 +1,23 @@ +[Description("The xMsiPackage resource is used to manage MSI files.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xMsiPackage : OMI_BaseResource +{ + [Key,Description("The identifying number used to uniquely identify this package") : Amended] String ProductId; + [Description("The path, URL or UNC path to the package") : Amended] String Path; + [Description("Indicates whether to Ensure that the package is Present or Absent (default Present)") : Amended] String Ensure; + [Description("The arguments to be passed to the package during addition or removal") : Amended] String Arguments; + [Description("The credentials to be used for mounting the UNC path (if applicable)") : Amended] String Credential; + [Description("The path to log the output of the MSI") : Amended] String LogPath; + [Description("The expected hash value of the file found in the Path location.") : Amended] String FileHash; + [Description("The algorithm used to generate the FileHash value. Defaults to SHA256") : Amended] String HashAlgorithm; + [Description("The subject that must match the signer certificate of the digital signature. Wildcards are allowed.") : Amended] String SignerSubject; + [Description("The certificate thumbprint which must match the signer certificate of the digital signature.") : Amended] String SignerThumbprint; + [Description("PowerShell code used to validate SSL certificates of HTTPS url assigned to Path.") : Amended] String ServerCertificateValidationCallback; + [Description("The credentials under which to run the installation") : Amended] String RunAsCredential; + [Description("The display name of the identified package") : Amended] String Name; + [Description("The path to the identified package") : Amended] String InstallSource; + [Description("The date that the identified package was last serviced or its install date, whichever is later") : Amended] String InstalledOn; + [Description("The size of the identified package in MB") : Amended] UInt32 Size; + [Description("The version number of the identified package") : Amended] String Version; + [Description("The description of the identified package") : Amended] String PackageDescription; + [Description("The publisher for the identified package") : Amended] String Publisher; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/en-US/DSC_xMsiPackage.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/en-US/DSC_xMsiPackage.strings.psd1 new file mode 100644 index 0000000..4a08925 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xMsiPackage/en-US/DSC_xMsiPackage.strings.psd1 @@ -0,0 +1,45 @@ +# Localized resources for DSC_xMsiPackage + +ConvertFrom-StringData @' + CheckingFileHash = Checking file '{0}' for expected {2} hash value of {1} + CheckingFileSignature = Checking file '{0}' for valid digital signature + CopyingTheSchemeStreamBytesToTheDiskCache = Copying the stream bytes to the disk cache + CouldNotGetResponseFromWebRequest = An error occurred while trying to get the {0} response for file {1} + CouldNotOpenDestFile = Could not open the file {0} for writing + CouldNotOpenLog = The specified LogPath ({0}) could not be opened + CouldNotStartProcess = The process {0} could not be started + CreatingCacheLocation = Creating cache location + CreatingTheDestinationCacheFile = Creating the destination cache file + CreatingTheSchemeStream = Creating the {0} stream + ErrorCopyingDataToFile = Encountered an error while copying the response to the output stream + FileHasValidSignature = File '{0}' contains a valid digital signature. Signer Thumbprint: {1}, Subject: {2} + GetTargetResourceFound = Successfully retrieved package {0} + GetTargetResourceNotFound = Unable to find package: {0} + GettingTheSchemeResponseStream = Getting the {0} response stream + IgnoreReboot = Ignore a pending reboot + InvalidBinaryType = The specified Path ({0}) does not appear to specify an MSI file and as such is not supported + InvalidFileHash = File '{0}' does not match expected {2} hash value of {1} + InvalidFileSignature = File '{0}' does not have a valid Authenticode signature. Status: {1} + InvalidId = The specified IdentifyingNumber ({0}) does not match the IdentifyingNumber ({1}) in the MSI file + InvalidIdentifyingNumber = The specified IdentifyingNumber ({0}) is not a valid GUID + InvalidPath = The specified Path ({0}) is not in a valid format. Valid formats are local paths, UNC, HTTP, and HTTPS + MachineRequiresReboot = The machine requires a reboot + PackageAppearsInstalled = The package {0} is installed + PackageConfigurationStarting = Package configuration starting + PackageDoesNotAppearInstalled = The package {0} is not installed + PathDoesNotExist = The given Path ({0}) could not be found + PackageInstalled = Package has been installed + PackageUninstalled = Package has been uninstalled + ParsedProductIdAsIdentifyingNumber = Parsed {0} as {1} + ParsingProductIdAsAnIdentifyingNumber = Parsing {0} as an identifyingNumber + PostValidationError = Package from {0} was installed, but the specified ProductId does not match package details + RedirectingPackagePathToCacheFileLocation = Redirecting package path to cache file location + SettingAuthenticationLevel = Setting authentication level to None + SettingCertificateValidationCallback = Assigning user-specified certificate verification callback + SettingDefaultCredential = Setting default credential + StartingWithStartInfoFileNameStartInfoArguments = Starting {0} with {1} + ThePathExtensionWasPathExt = The path extension was {0} + TheUriSchemeWasUriScheme = The uri scheme was {0} + WrongSignerSubject = File '{0}' was not signed by expected signer subject '{1}' + WrongSignerThumbprint = File '{0}' was not signed by expected signer certificate thumbprint '{1}' +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/DSC_xPSSessionConfiguration.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/DSC_xPSSessionConfiguration.psm1 new file mode 100644 index 0000000..5a13ac4 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/DSC_xPSSessionConfiguration.psm1 @@ -0,0 +1,799 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xPSSessionConfiguration' + +<# + .SYNOPSIS + Returns the current state of the specified PSSessionConfiguration + + .PARAMETER Name + Specifies the name of the session configuration. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name + ) + + Write-Verbose -Message ($script:localizedData.GetTargetResourceStartMessage -f $Name) + + # Try getting the specified endpoint + $endpoint = Get-PSSessionConfiguration -Name $Name -ErrorAction SilentlyContinue -Verbose:$false + + # If endpoint is null, it is absent + if ($null -eq $endpoint) + { + $ensure = 'Absent' + } + # If endpoint is present, check other properties + else + { + $ensure = 'Present' + + # If runAsUser is specified, return only the username in the credential property + if ($endpoint.RunAsUser) + { + $newCimInstanceParams = @{ + ClassName = 'MSFT_Credential' + + Property = @{ + Username = [System.String] $endpoint.RunAsUser + Password = [System.String] $null + } + + Namespace = 'root/microsoft/windows/desiredstateconfiguration' + ClientOnly = $true + } + + $convertToCimCredential = New-CimInstance @newCimInstanceParams + } + + $accessMode = Get-EndpointAccessMode -Endpoint $endpoint + } + + @{ + Name = $Name + RunAsCredential = [Microsoft.Management.Infrastructure.CimInstance] $convertToCimCredential + SecurityDescriptorSDDL = $endpoint.Permission + StartupScript = $endpoint.StartupScript + AccessMode = $accessMode + Ensure = $ensure + } + + Write-Verbose -Message ($script:localizedData.GetTargetResourceEndMessage -f $Name) +} + +<# + .SYNOPSIS + Ensures the specified PSSessionConfiguration is in its desired state + + .PARAMETER Name + Specifies the name of the session configuration. + + .PARAMETER StartupScript + Specifies the startup script for the configuration. + Enter the fully qualified path of a Windows PowerShell script. + + .PARAMETER RunAsCredential + Specifies the credential for commands of this session configuration. + + .PARAMETER SecurityDescriptorSDDL + Specifies the Security Descriptor Definition Language (SDDL) string for the configuration. + + .PARAMETER AccessMode + Enables and disables the session configuration and determines whether it can be used for + remote or local sessions on the computer. The default value is 'Remote'. + + .PARAMETER Ensure + Indicates if the session configuration should exist. The default value is 'Present'. +#> +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [AllowEmptyString()] + [System.String] + $StartupScript, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $RunAsCredential, + + [Parameter()] + [System.String] + $SecurityDescriptorSDDL, + + [Parameter()] + [ValidateSet('Local', 'Remote', 'Disabled')] + [System.String] + $AccessMode = 'Remote', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ($script:localizedData.SetTargetResourceStartMessage -f $Name) + + # Check if the session configuration exists + Write-Verbose -Message ($script:localizedData.CheckEndpointMessage -f $Name) + + # Try to get a named session configuration + $endpoint = Get-PSSessionConfiguration -Name $Name -ErrorAction SilentlyContinue -Verbose:$false + + if ($PSCmdlet.ShouldProcess(($script:localizedData.EnsureSessionConfigurationMessage -f $Ensure))) + { + # If endpoint is present, set ensure correctly + if ($endpoint) + { + Write-Verbose -Message ($script:localizedData.EndpointNameMessage -f $Name, 'present') + + # If the endpoint should be absent, delete the endpoint + if ($Ensure -eq 'Absent') + { + try + { + <# + Set the following preference so the functions inside Unregister-PSSessionConfig + doesn't get these settings + #> + $oldDebugPrefernce = $DebugPreference + $oldVerbosePreference = $VerbosePreference + $DebugPreference = $VerbosePreference = "SilentlyContinue" + + $unregisterPSSessionConfigParams = @{ + Name = $Name + Force = $true + NoServiceRestart = $true + ErrorAction = 'Stop' + } + + $null = Unregister-PSSessionConfiguration @unregisterPSSessionConfigParams + + # Reset the following preference to older values + $DebugPreference = $oldDebugPrefernce + $VerbosePreference = $oldVerbosePreference + + Write-Verbose -Message ($script:localizedData.EndpointNameMessage -f $Name, 'absent') + + $restartNeeded = $true + } + catch + { + $invokeThrowErrorHelperParams = @{ + ErrorId = 'UnregisterPSSessionConfigurationFailed' + ErrorMessage = $_.Exception + ErrorCategory = 'InvalidOperation' + } + + Invoke-ThrowErrorHelper @invokeThrowErrorHelperParams + } + + } + + # else validate endpoint properties and return the result + else + { + # Remove Name and Ensure from the bound Parameters for splatting + if ($PSBoundParameters.ContainsKey('Name')) + { + $null = $PSBoundParameters.Remove('Name') + } + + if ($PSBoundParameters.ContainsKey('Ensure')) + { + $null = $PSBoundParameters.Remove('Ensure') + } + + [System.Collections.Hashtable] $validatedProperties = ( + Get-ValidatedResourcePropertyTable -Endpoint $endpoint @PSBoundParameters -Apply + ) + $null = $validatedProperties.Add('Name', $Name) + + # If the $validatedProperties contain more than 1 key, something needs to be changed + if ($validatedProperties.count -gt 1) + { + try + { + $setPSSessionConfigurationParams = $validatedProperties.psobject.Copy() + $setPSSessionConfigurationParams['Force'] = $true + $setPSSessionConfigurationParams['NoServiceRestart'] = $true + $setPSSessionConfigurationParams['Verbose'] = $false + $null = Set-PSSessionConfiguration @setPSSessionConfigurationParams + $restartNeeded = $true + + # Write verbose message for all the properties, except Name, that are changing + Write-EndpointMessage -Parameters $validatedProperties -keysToSkip 'Name' + } + catch + { + $invokeThrowErrorHelperParams = @{ + ErrorId = 'SetPSSessionConfigurationFailed' + ErrorMessage = $_.Exception + ErrorCategory = 'InvalidOperation' + } + + Invoke-ThrowErrorHelper @invokeThrowErrorHelperParams + } + } + } + } + else + { + # Named session configuration is absent + Write-Verbose -Message ($script:localizedData.EndpointNameMessage -f $Name, 'absent') + + # If the endpoint should have been present, create it + if ($Ensure -eq 'Present') + { + # Remove Ensure,Verbose,Debug from the bound Parameters for splatting + foreach ($key in @('Ensure', 'Verbose', 'Debug')) + { + if ($PSBoundParameters.ContainsKey($key)) + { + $null = $PSBoundParameters.Remove($key) + } + } + + # Register the endpoint with specified properties + try + { + <# + Set the following preference so the functions inside + Unregister-PSSessionConfig doesn't get these settings + #> + $oldDebugPrefernce = $DebugPreference + $oldVerbosePreference = $VerbosePreference + $DebugPreference = $VerbosePreference = "SilentlyContinue" + + $null = Register-PSSessionConfiguration @PSBoundParameters -Force -NoServiceRestart + + # Reset the following preference to older values + $DebugPreference = $oldDebugPrefernce + $VerbosePreference = $oldVerbosePreference + + # If access mode is specified, set it on the endpoint + if ($PSBoundParameters.ContainsKey('AccessMode') -and $AccessMode -ne 'Remote') + { + $setPSSessionConfigurationParams = @{ + Name = $Name + AccessMode = $AccessMode + Force = $true + NoServiceRestart = $true + Verbose = $false + } + + $null = Set-PSSessionConfiguration @setPSSessionConfigurationParams + } + + $restartNeeded = $true + + Write-Verbose -Message ($script:localizedData.EndpointNameMessage -f $Name, 'present') + } + catch + { + $invokeThrowErrorHelperParams = @{ + ErrorId = 'RegisterOrSetPSSessionConfigurationFailed' + ErrorMessage = $_.Exception + ErrorCategory = 'InvalidOperation' + } + + Invoke-ThrowErrorHelper @invokeThrowErrorHelperParams + } + } + } + + <# + Any change to existing endpoint or creating new endpoint requires WinRM restart. + Since DSC(CIM) uses WSMan as well it will stop responding. + Hence telling the DSC Engine to restart the machine + #> + if ($restartNeeded) + { + Set-DSCMachineRebootRequired + } + } + + Write-Verbose -Message ($script:localizedData.SetTargetResourceEndMessage -f $Name) +} + +<# + .SYNOPSIS + Tests if the specified PSSessionConfiguration is in its desired state + + .PARAMETER Name + Specifies the name of the session configuration. + + .PARAMETER StartupScript + Specifies the startup script for the configuration. + Enter the fully qualified path of a Windows PowerShell script. + + .PARAMETER RunAsCredential + Specifies the credential for commands of this session configuration. + + .PARAMETER SecurityDescriptorSDDL + Specifies the Security Descriptor Definition Language (SDDL) string for the configuration. + + .PARAMETER AccessMode + Enables and disables the session configuration and determines whether it can be used for + remote or local sessions on the computer. The default value is 'Remote'. + + .PARAMETER Ensure + Indicates if the session configuration should exist. The default value is 'Present'. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [AllowEmptyString()] + [System.String] + $StartupScript, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $RunAsCredential, + + [Parameter()] + [System.String] + $SecurityDescriptorSDDL, + + [Parameter()] + [ValidateSet('Local', 'Remote', 'Disabled')] + [System.String] + $AccessMode = 'Remote', + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present' + ) + + Write-Verbose -Message ($script:localizedData.TestTargetResourceStartMessage -f $Name) + + #region Input Validation + # Check if the endpoint name is blank/whitespaced string + if ([System.String]::IsNullOrWhiteSpace($Name)) + { + $invokeThrowErrorHelperParams = @{ + ErrorId = 'BlankString' + ErrorMessage = $script:localizedData.WhitespacedStringMessage -f 'name' + ErrorCategory = 'SyntaxError' + } + + Invoke-ThrowErrorHelper @invokeThrowErrorHelperParams + } + + # Check for Startup script path and extension + if ($PSBoundParameters.ContainsKey('StartupScript')) + { + # Check if startup script path is valid + if (!(Test-Path -Path $StartupScript)) + { + $invokeThrowErrorHelperParams = @{ + ErrorId = 'PathNotFound' + ErrorMessage = $script:localizedData.StartupPathNotFoundMessage -f $StartupScript + ErrorCategory = 'ObjectNotFound' + } + + Invoke-ThrowErrorHelper @invokeThrowErrorHelperParams + } + + # Check the startup script extension + $startupScriptFileExtension = $StartupScript.Split('.')[-1] + + if ($startupScriptFileExtension -ne 'ps1') + { + $invokeThrowErrorHelperParams = @{ + ErrorId = 'WrongFileExtension' + ErrorMessage = + $script:localizedData.WrongStartupScriptExtensionMessage -f $startupScriptFileExtension + ErrorCategory = 'InvalidData' + } + + Invoke-ThrowErrorHelper @invokeThrowErrorHelperParams + } + } + + # Check if SecurityDescriptorSDDL is whitespaced + if ($PSBoundParameters.ContainsKey('SecurityDescriptorSDDL') -and + [System.String]::IsNullOrWhiteSpace($SecurityDescriptorSDDL)) + { + $invokeThrowErrorHelperParams = @{ + ErrorId = 'BlankString' + ErrorMessage = $script:localizedData.WhitespacedStringMessage -f 'securityDescriptorSddl' + ErrorCategory = 'SyntaxError' + } + + Invoke-ThrowErrorHelper @invokeThrowErrorHelperParams + } + + # Check if the RunAsCredential is not empty + if ($PSBoundParameters.ContainsKey('RunAsCredential') -and + ($RunAsCredential -eq [System.Management.Automation.PSCredential]::Empty)) + { + $invokeThrowErrorHelperParams = @{ + ErrorId = 'EmptyCredential' + ErrorMessage = $script:localizedData.EmptyCredentialMessage + ErrorCategory = 'InvalidArgument' + } + + Invoke-ThrowErrorHelper @invokeThrowErrorHelperParams + } + #endregion + + # Check if the session configuration exists + Write-Verbose -Message ($script:localizedData.CheckEndpointMessage -f $Name) + + try + { + # Try to get a named session configuration + $endpoint = Get-PSSessionConfiguration -Name $Name -ErrorAction Stop -Verbose:$false + + Write-Verbose -Message ($script:localizedData.EndpointNameMessage -f $Name, 'present') + + # If the endpoint shouldn't be present, return false + if ($Ensure -eq 'Absent') + { + return $false + } + # else validate endpoint properties and return the result + else + { + # Remove Name and Ensure from the bound Parameters for splatting + if ($PSBoundParameters.ContainsKey('Name')) + { + $null = $PSBoundParameters.Remove('Name') + } + + if ($PSBoundParameters.ContainsKey('Ensure')) + { + $null = $PSBoundParameters.Remove('Ensure') + } + + return (Get-ValidatedResourcePropertyTable -Endpoint $endpoint @PSBoundParameters) + } + } + catch [Microsoft.PowerShell.Commands.WriteErrorException] + { + Write-Verbose -Message ($script:localizedData.EndpointNameMessage -f $Name, 'absent') + + return ($Ensure -eq 'Absent') + } + + Write-Verbose -Message ($script:localizedData.TestTargetResourceEndMessage -f $Name) +} + +<# + .SYNOPSIS + Helper function to translate the endpoint's accessmode + to the 'Disabled', 'Local', 'Remote' values + + .PARAMETER Endpoint + Specifies a valid session configuration endpoint object +#> +function Get-EndpointAccessMode +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + $Endpoint + ) + + if (-not $endpoint.Enabled) + { + return 'Disabled' + } + elseif ($endpoint.Permission -and + ($endpoint.Permission).contains('NT AUTHORITY\NETWORK AccessDenied')) + { + return 'Local' + } + else + { + return 'Remote' + } +} + +<# + .SYNOPSIS + Helper function to write verbose messages for collection of properties + + .PARAMETER Parameters + Specifies a properties Hashtable. + + .PARAMETER KeysToSkip + Specifies an array of Hashtable keys to ignore. +#> +function Write-EndpointMessage +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Parameters, + + [Parameter(Mandatory = $true)] + [System.String[]] + $KeysToSkip + ) + + foreach ($key in $Parameters.keys) + { + if ($KeysToSkip -notcontains $key) + { + Write-Verbose -Message ($script:localizedData.SetPropertyMessage -f $key, $Parameters[$key]) + } + } +} + +<# + .SYNOPSIS + Helper function to get a Hashtable of validated endpoint properties + + .PARAMETER Endpoint + Specifies a valid session configuration endpoint. + + .PARAMETER StartupScript + Specifies the startup script for the configuration. + Enter the fully qualified path of a Windows PowerShell script. + + .PARAMETER RunAsCredential + Specifies the credential for commands of this session configuration. + + .PARAMETER SecurityDescriptorSDDL + Specifies the Security Descriptor Definition Language (SDDL) string for the configuration. + + .PARAMETER AccessMode + Enables and disables the session configuration and determines whether it can be used for + remote or local sessions on the computer. + + The acceptable values for this parameter are: + - Disabled + - Local + - Remote + + .PARAMETER Apply + Indicates that this function should return a hashtable of validated endpoint properties. + By default, this function returns the value $false. +#> +function Get-ValidatedResourcePropertyTable +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + $Endpoint, + + [Parameter()] + [System.String] + $StartupScript, + + [Parameter()] + [System.Management.Automation.PSCredential] + $RunAsCredential, + + [Parameter()] + [System.String] + $SecurityDescriptorSDDL, + + [Parameter()] + [ValidateSet('Local', 'Remote', 'Disabled')] + [System.String] + $AccessMode, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Apply + ) + + if ($Apply) + { + $validatedProperties = @{} + } + + # Check if the SDDL is same as specified + if ($PSBoundParameters.ContainsKey('SecurityDescriptorSDDL')) + { + Write-Verbose -Message ($script:localizedData.CheckPropertyMessage -f 'SDDL', + $SecurityDescriptorSDDL) + + # If endpoint SDDL is not same as specified + if ($endpoint.SecurityDescriptorSddl -and + ($endpoint.SecurityDescriptorSddl -ne $SecurityDescriptorSDDL)) + { + $notDesiredSDDLMessage = $script:localizedData.NotDesiredPropertyMessage -f 'SDDL', + $SecurityDescriptorSDDL, $endpoint.SecurityDescriptorSddl + Write-Verbose -Message $notDesiredSDDLMessage + + if ($Apply) + { + $validatedProperties['SecurityDescriptorSddl'] = $SecurityDescriptorSDDL + } + else + { + return $false + } + } + # If endpoint SDDL is same as specified + else + { + Write-Verbose -Message ($script:localizedData.DesiredPropertyMessage -f 'SDDL', + $SecurityDescriptorSDDL) + } + } + + # Check the RunAs user is same as specified + if ($PSBoundParameters.ContainsKey('RunAsCredential')) + { + Write-Verbose -Message ($script:localizedData.CheckPropertyMessage -f 'RunAs user', + $RunAsCredential.UserName) + + # If endpoint RunAsUser is not same as specified + if ($endpoint.RunAsUser -ne $RunAsCredential.UserName) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f 'RunAs user', + $RunAsCredential.UserName, $endpoint.RunAsUser) + + if ($Apply) + { + $validatedProperties['RunAsCredential'] = $RunAsCredential + } + else + { + return $false + } + } + # If endpoint RunAsUser is same as specified + else + { + Write-Verbose -Message ($script:localizedData.DesiredPropertyMessage -f 'RunAs user', + $RunAsCredential.UserName) + } + } + + # Check if the StartupScript is same as specified + if ($PSBoundParameters.ContainsKey('StartupScript')) + { + Write-Verbose -Message ($script:localizedData.CheckPropertyMessage -f 'startup script', + $StartupScript) + + # If endpoint StartupScript is not same as specified + if ($endpoint.StartupScript -ne $StartupScript) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f 'startup script', + $StartupScript, $endpoint.StartupScript) + + if ($Apply) + { + $validatedProperties['StartupScript'] = $StartupScript + } + else + { + return $false + } + } + # If endpoint StartupScript is same as specified + else + { + Write-Verbose -Message ($script:localizedData.DesiredPropertyMessage -f 'startup script', + $StartupScript) + } + } + + # Check if AccessMode is same as specified + if ($PSBoundParameters.ContainsKey('AccessMode')) + { + Write-Verbose -Message ($script:localizedData.CheckPropertyMessage -f 'acess mode', $AccessMode) + + $curAccessMode = Get-EndpointAccessMode -Endpoint $Endpoint + + # If endpoint access mode is not same as specified + if ($curAccessMode -ne $AccessMode) + { + Write-Verbose -Message ($script:localizedData.NotDesiredPropertyMessage -f 'access mode', + $AccessMode, $curAccessMode) + + if ($Apply) + { + $validatedProperties['AccessMode'] = $AccessMode + } + else + { + return $false + } + } + # If endpoint access mode is same as specified + else + { + Write-Verbose -Message ($script:localizedData.DesiredPropertyMessage -f 'access mode', + $AccessMode) + } + } + + if ($Apply) + { + return $validatedProperties + } + else + { + return ($Ensure -eq 'Present') + } +} + +<# + .SYNOPSIS + Invoke this helper function to throw a terminating error. + + .PARAMETER ErrorId + Specifies a developer-defined identifier of the error. + This identifier must be a non-localized string for a specific error type. + + .PARAMETER ExceptionMessage + Specifies the message that describes the error. + + .PARAMETER ErrorCategory + Specifies the category of the error. +#> +function Invoke-ThrowErrorHelper +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.ErrorCategory] + $ErrorCategory + ) + + $exception = New-Object System.InvalidOperationException $ErrorMessage + $errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $ErrorId, + $ErrorCategory, $null + + throw $errorRecord +} + +Export-ModuleMember -Function Get-TargetResource, Set-TargetResource, Test-TargetResource diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/DSC_xPSSessionConfiguration.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/DSC_xPSSessionConfiguration.schema.mof new file mode 100644 index 0000000..c5bef7e --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/DSC_xPSSessionConfiguration.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0.0"), FriendlyName("xPSEndpoint")] +class DSC_xPSSessionConfiguration : OMI_BaseResource +{ + [Key, Description("Specifies the name of the session configuration.")] String Name; + [Write, Description("Indicates if the session configuration should exist. The default value is 'Present'."), ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Ensure; + [Write, Description("Specifies the startup script for the configuration. Enter the fully qualified path of a Windows PowerShell script.")] String StartupScript; + [Write, Description("Specifies the credential for commands of this session configuration."), EmbeddedInstance("MSFT_Credential")] String RunAsCredential; + [Write, Description("Specifies the Security Descriptor Definition Language (SDDL) string for the configuration.")] String SecurityDescriptorSDDL; + [Write, Description("Enables and disables the session configuration and determines whether it can be used for remote or local sessions on the computer. The default value is 'Remote'."), ValueMap{"Local","Remote", "Disabled"}, Values{"Local","Remote","Disabled"}] String AccessMode; +}; + diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/en-US/DSC_xPSSessionConfiguration.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/en-US/DSC_xPSSessionConfiguration.strings.psd1 new file mode 100644 index 0000000..0e2e680 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPSSessionConfiguration/en-US/DSC_xPSSessionConfiguration.strings.psd1 @@ -0,0 +1,25 @@ +# Localized resources for DSC_xPSSessionConfiguration + +ConvertFrom-StringData @' + CheckEndpointMessage = Checking if session configuration {0} exists ... + EndpointNameMessage = Session configuration {0} is {1} + + CheckPropertyMessage = Checking if session configuration {0} is {1} ... + NotDesiredPropertyMessage = Session configuration {0} is NOT {1}, but {2} + DesiredPropertyMessage = Session configuration {0} is {1} + SetPropertyMessage = Session configuration {0} is now {1} + + WhitespacedStringMessage = The session configuration {0} should not be white-spaced string + StartupPathNotFoundMessage = Startup path {0} not found + EmptyCredentialMessage = The value of RunAsCredential can not be an empty credential + WrongStartupScriptExtensionMessage = The startup script should have a 'ps1' extension, and not '{0}' + + GetTargetResourceStartMessage = Begin executing Get functionality on the session configuration {0}. + GetTargetResourceEndMessage = End executing Get functionality on the session configuration {0}. + SetTargetResourceStartMessage = Begin executing Set functionality on the session configuration {0}. + SetTargetResourceEndMessage = End executing Set functionality on the session configuration {0}. + TestTargetResourceStartMessage = Begin executing Test functionality on the session configuration {0}. + TestTargetResourceEndMessage = End executing Test functionality on the session configuration {0}. + + EnsureSessionConfigurationMessage = Ensure the specified session configuration is "{0}" +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/DSC_xPackageResource.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/DSC_xPackageResource.psm1 new file mode 100644 index 0000000..743cd4b --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/DSC_xPackageResource.psm1 @@ -0,0 +1,2054 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')] +param () + +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xPackageResource' + +$script:packageCacheLocation = "$env:programData\Microsoft\Windows\PowerShell\Configuration\BuiltinProvCache\DSC_xPackageResource" +$script:msiTools = $null + +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $ProductId, + + [Parameter()] + [System.Boolean] + $CreateCheckRegValue = $false, + + [Parameter()] + [ValidateSet('LocalMachine', 'CurrentUser')] + [System.String] + $InstalledCheckRegHive = 'LocalMachine', + + [Parameter()] + [System.String] + $InstalledCheckRegKey, + + [Parameter()] + [System.String] + $InstalledCheckRegValueName, + + [Parameter()] + [System.String] + $InstalledCheckRegValueData + ) + + Write-Verbose -Message $script:localizedData.EnteringGetTargetResource + + Assert-PathExtensionValid -Path $Path + + $identifyingNumber = [System.String]::Empty + + if (-not [System.String]::IsNullOrEmpty($ProductId)) + { + $identifyingNumber = Convert-ProductIdToIdentifyingNumber -ProductId $ProductId + } + + $packageResourceResult = @{} + + $getProductEntryParameters = @{ + Name = $Name + IdentifyingNumber = $identifyingNumber + } + + $checkRegistryValueParameters = @{ + CreateCheckRegValue = $CreateCheckRegValue + InstalledCheckRegHive = $InstalledCheckRegHive + InstalledCheckRegKey = $InstalledCheckRegKey + InstalledCheckRegValueName = $InstalledCheckRegValueName + InstalledCheckRegValueData = $InstalledCheckRegValueData + } + + if ($CreateCheckRegValue) + { + Assert-RegistryParametersValid -InstalledCheckRegKey $InstalledCheckRegKey -InstalledCheckRegValueName $InstalledCheckRegValueName -InstalledCheckRegValueData $InstalledCheckRegValueData + + $getProductEntryParameters += $checkRegistryValueParameters + $packageResourceResult += $checkRegistryValueParameters + } + + $productEntry = Get-ProductEntry @getProductEntryParameters + + if ($null -eq $productEntry) + { + $packageResourceResult += @{ + Ensure = 'Absent' + Name = $Name + ProductId = $identifyingNumber + Path = $Path + Installed = $false + } + + return $packageResourceResult + } + elseif ($CreateCheckRegValue) + { + $packageResourceResult += @{ + Ensure = 'Present' + Name = $Name + ProductId = $identifyingNumber + Path = $Path + Installed = $true + } + + return $packageResourceResult + } + + <# + Identifying number can still be null here (e.g. remote MSI with Name specified, local EXE). + If the user gave a product ID just pass it through, otherwise get it from the product. + #> + if ($null -eq $identifyingNumber -and $null -ne $productEntry.Name) + { + $identifyingNumber = Split-Path -Path $productEntry.Name -Leaf + } + + $installDate = $productEntry.GetValue('InstallDate') + + if ($null -ne $installDate) + { + try + { + $installDate = '{0:d}' -f [System.DateTime]::ParseExact($installDate, 'yyyyMMdd', [System.Globalization.CultureInfo]::CurrentCulture).Date + } + catch + { + $installDate = $null + } + } + + $publisher = Get-LocalizedRegistryKeyValue -RegistryKey $productEntry -ValueName 'Publisher' + + $estimatedSize = $productEntry.GetValue('EstimatedSize') + + if ($null -ne $estimatedSize) + { + $estimatedSize = $estimatedSize / 1024 + } + + $displayVersion = $productEntry.GetValue('DisplayVersion') + + $comments = $productEntry.GetValue('Comments') + + $displayName = Get-LocalizedRegistryKeyValue -RegistryKey $productEntry -ValueName 'DisplayName' + + $packageResourceResult += @{ + Ensure = 'Present' + Name = $displayName + Path = $Path + InstalledOn = $installDate + ProductId = $identifyingNumber + Size = $estimatedSize + Installed = $true + Version = $displayVersion + PackageDescription = $comments + Publisher = $publisher + } + + return $packageResourceResult +} + +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $ProductId, + + [Parameter()] + [System.String] + $Arguments, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + # Return codes 1641 and 3010 indicate success when a restart is requested per installation + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.UInt32[]] + $ReturnCode = @( 0, 1641, 3010 ), + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [System.String] + $FileHash, + + [Parameter()] + [ValidateSet('SHA1', 'SHA256', 'SHA384', 'SHA512', 'MD5', 'RIPEMD160')] + [System.String] + $HashAlgorithm, + + [Parameter()] + [System.String] + $SignerSubject, + + [Parameter()] + [System.String] + $SignerThumbprint, + + [Parameter()] + [System.String] + $ServerCertificateValidationCallback, + + [Parameter()] + [System.Boolean] + $CreateCheckRegValue = $false, + + [Parameter()] + [ValidateSet('LocalMachine', 'CurrentUser')] + [System.String] + $InstalledCheckRegHive = 'LocalMachine', + + [Parameter()] + [System.String] + $InstalledCheckRegKey, + + [Parameter()] + [System.String] + $InstalledCheckRegValueName, + + [Parameter()] + [System.String] + $InstalledCheckRegValueData, + + [Parameter()] + [System.Boolean] + $IgnoreReboot = $false, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $RunAsCredential + ) + + $ErrorActionPreference = 'Stop' + + if (Test-TargetResource @PSBoundParameters) + { + return + } + + Assert-PathExtensionValid -Path $Path + $uri = Convert-PathToUri -Path $Path + + if (-not [System.String]::IsNullOrEmpty($ProductId)) + { + $identifyingNumber = Convert-ProductIdToIdentifyingNumber -ProductId $ProductId + } + else + { + $identifyingNumber = $ProductId + } + + $productEntry = Get-ProductEntry -Name $Name -IdentifyingNumber $identifyingNumber + + <# + Path gets overwritten in the download code path. Retain the user's original Path in case + the install succeeded but the named package wasn't present on the system afterward so we + can give a better error message. + #> + $originalPath = $Path + + Write-Verbose -Message $script:localizedData.PackageConfigurationStarting + + $logStream = $null + $psDrive = $null + $downloadedFileName = $null + + try + { + $fileExtension = [System.IO.Path]::GetExtension($Path).ToLower() + if (-not [System.String]::IsNullOrEmpty($LogPath)) + { + try + { + if ($fileExtension -eq '.msi') + { + <# + We want to pre-verify the log path exists and is writable ahead of time + even in the MSI case, as detecting WHY the MSI log path doesn't exist would + be rather problematic for the user. + #> + if ((Test-Path -Path $LogPath) -and $PSCmdlet.ShouldProcess($script:localizedData.RemoveExistingLogFile, $null, $null)) + { + Remove-Item -Path $LogPath + } + + if ($PSCmdlet.ShouldProcess($script:localizedData.CreateLogFile, $null, $null)) + { + New-Item -Path $LogPath -Type 'File' | Out-Null + } + } + elseif ($PSCmdlet.ShouldProcess($script:localizedData.CreateLogFile, $null, $null)) + { + $logStream = New-Object -TypeName 'System.IO.StreamWriter' -ArgumentList @( $LogPath, $false ) + } + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.CouldNotOpenLog -f $LogPath) -ErrorRecord $_ + } + } + + # Download or mount file as necessary + if (-not ($fileExtension -eq '.msi' -and $Ensure -eq 'Absent')) + { + if ($uri.IsUnc -and $PSCmdlet.ShouldProcess($script:localizedData.MountSharePath, $null, $null)) + { + $psDriveArgs = @{ + Name = [System.Guid]::NewGuid() + PSProvider = 'FileSystem' + Root = Split-Path -Path $uri.LocalPath + } + + # If we pass a null for Credential, a dialog will pop up. + if ($null -ne $Credential) + { + $psDriveArgs['Credential'] = $Credential + } + + $psDrive = New-PSDrive @psDriveArgs + $Path = Join-Path -Path $psDrive.Root -ChildPath (Split-Path -Path $uri.LocalPath -Leaf) + } + elseif (@( 'http', 'https' ) -contains $uri.Scheme -and $Ensure -eq 'Present' -and $PSCmdlet.ShouldProcess($script:localizedData.DownloadHTTPFile, $null, $null)) + { + $uriScheme = $uri.Scheme + $outStream = $null + $responseStream = $null + + try + { + Write-Verbose -Message ($script:localizedData.CreatingCacheLocation) + + if (-not (Test-Path -Path $script:packageCacheLocation -PathType 'Container')) + { + New-Item -Path $script:packageCacheLocation -ItemType 'Directory' | Out-Null + } + + $destinationPath = Join-Path -Path $script:packageCacheLocation -ChildPath (Split-Path -Path $uri.LocalPath -Leaf) + + Write-Verbose -Message ($script:localizedData.NeedtodownloadfilefromschemedestinationwillbedestName -f $uriScheme, $destinationPath) + + try + { + Write-Verbose -Message ($script:localizedData.CreatingTheDestinationCacheFile) + $outStream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList @( $destinationPath, 'Create' ) + } + catch + { + # Should never happen since we own the cache directory + New-InvalidOperationException -Message ($script:localizedData.CouldNotOpenDestFile -f $destinationPath) -ErrorRecord $_ + } + + try + { + Write-Verbose -Message ($script:localizedData.CreatingTheSchemeStream -f $uriScheme) + $webRequest = [System.Net.WebRequest]::Create($uri) + + Write-Verbose -Message ($script:localizedData.SettingDefaultCredential) + $webRequest.Credentials = [System.Net.CredentialCache]::DefaultCredentials + + if ($uriScheme -eq 'http') + { + # Default value is MutualAuthRequested, which applies to the https scheme + Write-Verbose -Message ($script:localizedData.SettingAuthenticationLevel) + $webRequest.AuthenticationLevel = [System.Net.Security.AuthenticationLevel]::None + } + elseif ($uriScheme -eq 'https' -and -not [System.String]::IsNullOrEmpty($ServerCertificateValidationCallback)) + { + Write-Verbose -Message 'Assigning user-specified certificate verification callback' + $serverCertificateValidationScriptBlock = [System.Management.Automation.ScriptBlock]::Create($ServerCertificateValidationCallback) + $webRequest.ServerCertificateValidationCallBack = $serverCertificateValidationScriptBlock + } + + Write-Verbose -Message ($script:localizedData.Gettingtheschemeresponsestream -f $uriScheme) + $responseStream = (([System.Net.HttpWebRequest] $webRequest).GetResponse()).GetResponseStream() + } + catch + { + Write-Verbose -Message ($script:localizedData.ErrorOutString -f ($_ | Out-String)) + New-InvalidOperationException -Message ($script:localizedData.CouldNotGetHttpStream -f $uriScheme, $Path) -ErrorRecord $_ + } + + try + { + Write-Verbose -Message ($script:localizedData.CopyingTheSchemeStreamBytesToTheDiskCache -f $uriScheme) + $responseStream.CopyTo($outStream) + $responseStream.Flush() + $outStream.Flush() + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.ErrorCopyingDataToFile -f $Path, $destinationPath) -ErrorRecord $_ + } + } + finally + { + if ($null -ne $outStream) + { + $outStream.Close() + } + + if ($null -ne $responseStream) + { + $responseStream.Close() + } + } + + Write-Verbose -Message ($script:localizedData.RedirectingPackagePathToCacheFileLocation) + $Path = $destinationPath + $downloadedFileName = $destinationPath + } + + # At this point the Path ought to be valid unless it's a MSI uninstall case + if (-not (Test-Path -Path $Path -PathType 'Leaf')) + { + New-InvalidOperationException -Message ($script:localizedData.PathDoesNotExist -f $Path) + } + + Assert-FileValid -Path $Path -HashAlgorithm $HashAlgorithm -FileHash $FileHash -SignerSubject $SignerSubject -SignerThumbprint $SignerThumbprint + } + + $startInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo' + + # Necessary for I/O redirection and just generally a good idea + $startInfo.UseShellExecute = $false + + $process = New-Object -TypeName 'System.Diagnostics.Process' + $process.StartInfo = $startInfo + + # Concept only, will never touch disk + $errorLogPath = $LogPath + '.err' + + if ($fileExtension -eq '.msi') + { + $startInfo.FileName = "$env:winDir\system32\msiexec.exe" + + if ($Ensure -eq 'Present') + { + # Check if the MSI package specifies the ProductName and Code + $productName = Get-MsiProductName -Path $Path + $productCode = Get-MsiProductCode -Path $Path + + if ((-not [System.String]::IsNullOrEmpty($Name)) -and ($productName -ne $Name)) + { + New-InvalidArgumentException -ArgumentName 'Name' -Message ($script:localizedData.InvalidNameOrId -f $Name, $identifyingNumber, $productName, $productCode) + } + + if ((-not [System.String]::IsNullOrEmpty($identifyingNumber)) -and ($identifyingNumber -ne $productCode)) + { + New-InvalidArgumentException -ArgumentName 'ProductId' -Message ($script:localizedData.InvalidNameOrId -f $Name, $identifyingNumber, $productName, $productCode) + } + + $startInfo.Arguments = '/i "{0}"' -f $Path + } + else + { + $productEntry = Get-ProductEntry -Name $Name -IdentifyingNumber $identifyingNumber + + # We may have used the Name earlier, now we need the actual ID + $id = Split-Path -Path $productEntry.Name -Leaf + $startInfo.Arguments = '/x{0}' -f $id + } + + if ($LogPath) + { + $startInfo.Arguments += ' /log "{0}"' -f $LogPath + } + + $startInfo.Arguments += ' /quiet /norestart' + + if ($Arguments) + { + # Append any specified arguments with a space (#195) + $startInfo.Arguments += ' {0}' -f $Arguments + } + } + else + { + # EXE + Write-Verbose -Message $script:localizedData.TheBinaryIsAnExe + + if ($Ensure -eq 'Present') + { + $startInfo.FileName = $Path + $startInfo.Arguments = $Arguments + + if ($LogPath) + { + Write-Verbose -Message ($script:localizedData.UserHasRequestedLoggingNeedToAttachEventHandlersToTheProcess) + $startInfo.RedirectStandardError = $true + $startInfo.RedirectStandardOutput = $true + + Register-ObjectEvent -InputObject $process -EventName 'OutputDataReceived' -SourceIdentifier $LogPath + Register-ObjectEvent -InputObject $process -EventName 'ErrorDataReceived' -SourceIdentifier $errorLogPath + } + } + else + { + # Absent case + $startInfo.FileName = "$env:winDir\system32\msiexec.exe" + + # We may have used the Name earlier, now we need the actual ID + if ($null -eq $productEntry -or $null -eq $productEntry.Name) + { + $id = $Path + } + else + { + $id = Split-Path -Path $productEntry.Name -Leaf + } + + $startInfo.Arguments = "/x `"$id`" /quiet /norestart" + + if ($LogPath) + { + $startInfo.Arguments += ' /log "{0}"' -f $LogPath + } + + if ($Arguments) + { + # Append the specified arguments with a space (#195) + $startInfo.Arguments += ' {0}' -f $Arguments + } + } + } + + Write-Verbose -Message ($script:localizedData.StartingWithStartInfoFileNameStartInfoArguments -f $startInfo.FileName, $startInfo.Arguments) + + if ($PSCmdlet.ShouldProcess(($script:localizedData.StartingProcessMessage -f $startInfo.FileName, $startInfo.Arguments), $null, $null)) + { + try + { + [System.Int32] $exitCode = 0 + if ($PSBoundParameters.ContainsKey('RunAsCredential')) + { + $commandLine = '"{0}" {1}' -f $startInfo.FileName, $startInfo.Arguments + $exitCode = Invoke-PInvoke -CommandLine $commandLine -Credential $RunAsCredential + } + else + { + $process = Invoke-Process -Process $process -LogStream ($null -ne $logStream) + $exitCode = $process.ExitCode + } + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.CouldNotStartProcess -f $Path) -ErrorRecord $_ + } + + if ($logStream) + { + <# + We have to re-mux these since they appear to us as different streams + the underlying Win32 APIs prevent this problem, as would constructing a script + on the fly and executing it, but the former is highly problematic from PowerShell + and the latter doesn't let us get the return code for UI-based EXEs + #> + $outputEvents = Get-Event -SourceIdentifier $LogPath + $errorEvents = Get-Event -SourceIdentifier $errorLogPath + $masterEvents = @() + $outputEvents + $errorEvents + $masterEvents = $masterEvents | Sort-Object -Property TimeGenerated + + foreach ($event in $masterEvents) + { + $logStream.Write($event.SourceEventArgs.Data); + } + + Remove-Event -SourceIdentifier $LogPath + Remove-Event -SourceIdentifier $errorLogPath + } + + if (-not ($ReturnCode -contains $exitCode)) + { + # Some .exe files do not support uninstall + if ($Ensure -eq 'Absent' -and $fileExtension -eq '.exe' -and $exitCode -eq '1620') + { + Write-Warning -Message ($script:localizedData.ExeCouldNotBeUninstalled -f $Path) + } + else + { + New-InvalidOperationException ($script:localizedData.UnexpectedReturnCode -f $exitCode.ToString()) + } + } + } + } + finally + { + if ($psDrive) + { + Remove-PSDrive -Name $psDrive -Force + } + + if ($logStream) + { + $logStream.Dispose() + } + } + + if ($downloadedFileName -and $PSCmdlet.ShouldProcess($script:localizedData.RemoveDownloadedFile, $null, $null)) + { + <# + This is deliberately not in the finally block because we want to leave the downloaded + file on disk if an error occurred as a debugging aid for the user. + #> + Remove-Item -Path $downloadedFileName + } + + $operationMessageString = $script:localizedData.PackageUninstalled + if ($Ensure -eq 'Present') + { + $operationMessageString = $script:localizedData.PackageInstalled + } + + if ($CreateCheckRegValue) + { + $registryValueString = '{0}\{1}\{2}' -f $InstalledCheckRegHive, $InstalledCheckRegKey, $InstalledCheckRegValueName + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.CreatingRegistryValue -f $registryValueString) + Set-RegistryValue -RegistryHive $InstalledCheckRegHive -Key $InstalledCheckRegKey -Value $InstalledCheckRegValueName -Data $InstalledCheckRegValueData + } + else + { + Write-Verbose ($script:localizedData.RemovingRegistryValue -f $registryValueString) + Remove-RegistryValue -RegistryHive $InstalledCheckRegHive -Key $InstalledCheckRegKey -Value $InstalledCheckRegValueName + } + } + + <# + Check if a reboot is required, if so notify CA. The MSFT_ServerManagerTasks provider is + missing on some client SKUs (worked on both Server and Client Skus in Windows 10). + #> + + $serverFeatureData = Invoke-CimMethod ` + -Name 'GetServerFeature' ` + -Namespace 'root\microsoft\windows\servermanager' ` + -Class 'MSFT_ServerManagerTasks' ` + -Arguments @{ + BatchSize = 256 + } ` + -ErrorAction 'Ignore' + $registryData = Get-ItemProperty ` + -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' ` + -Name 'PendingFileRenameOperations' ` + -ErrorAction 'Ignore' + + if (($serverFeatureData -and $serverFeatureData.RequiresReboot) -or $registryData -or $exitcode -eq 3010 -or $exitcode -eq 1641) + { + Write-Verbose $script:localizedData.MachineRequiresReboot + if ($IgnoreReboot) + { + Write-Verbose $script:localizedData.IgnoreReboot + } + else + { + Set-DSCMachineRebootRequired + } + } + elseif ($Ensure -eq 'Present') + { + $getProductEntryParameters = @{ + Name = $Name + IdentifyingNumber = $identifyingNumber + } + + $checkRegistryValueParameters = @{ + CreateCheckRegValue = $CreateCheckRegValue + InstalledCheckRegHive = $InstalledCheckRegHive + InstalledCheckRegKey = $InstalledCheckRegKey + InstalledCheckRegValueName = $InstalledCheckRegValueName + InstalledCheckRegValueData = $InstalledCheckRegValueData + } + + if ($CreateCheckRegValue) + { + $getProductEntryParameters += $checkRegistryValueParameters + } + + $productEntry = Get-ProductEntry @getProductEntryParameters + + if ($null -eq $productEntry) + { + New-InvalidOperationException -Message ($script:localizedData.PostValidationError -f $originalPath) + } + } + + Write-Verbose -Message $operationMessageString + Write-Verbose -Message $script:localizedData.PackageConfigurationComplete +} + +function Test-TargetResource +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $ProductId, + + [Parameter()] + [System.String] + $Arguments, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + # Return codes 1641 and 3010 indicate success when a restart is requested per installation + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.UInt32[]] + $ReturnCode = @( 0, 1641, 3010 ), + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [System.String] + $FileHash, + + [Parameter()] + [ValidateSet('SHA1', 'SHA256', 'SHA384', 'SHA512', 'MD5', 'RIPEMD160')] + [System.String] + $HashAlgorithm, + + [Parameter()] + [System.String] + $SignerSubject, + + [Parameter()] + [System.String] + $SignerThumbprint, + + [Parameter()] + [System.String] + $ServerCertificateValidationCallback, + + [Parameter()] + [System.Boolean] + $CreateCheckRegValue = $false, + + [Parameter()] + [ValidateSet('LocalMachine', 'CurrentUser')] + [System.String] + $InstalledCheckRegHive = 'LocalMachine', + + [Parameter()] + [System.String] + $InstalledCheckRegKey, + + [Parameter()] + [System.String] + $InstalledCheckRegValueName, + + [Parameter()] + [System.String] + $InstalledCheckRegValueData, + + [Parameter()] + [System.Boolean] + $IgnoreReboot = $false, + + [Parameter()] + [System.Management.Automation.PSCredential] + $RunAsCredential + ) + + Assert-PathExtensionValid -Path $Path + $identifyingNumber = $null + + if (-not [System.String]::IsNullOrEmpty($ProductId)) + { + $identifyingNumber = Convert-ProductIdToIdentifyingNumber -ProductId $ProductId + } + + $getProductEntryParameters = @{ + Name = $Name + IdentifyingNumber = $identifyingNumber + } + + $checkRegistryValueParameters = @{ + CreateCheckRegValue = $CreateCheckRegValue + InstalledCheckRegHive = $InstalledCheckRegHive + InstalledCheckRegKey = $InstalledCheckRegKey + InstalledCheckRegValueName = $InstalledCheckRegValueName + InstalledCheckRegValueData = $InstalledCheckRegValueData + } + + if ($CreateCheckRegValue) + { + Assert-RegistryParametersValid -InstalledCheckRegKey $InstalledCheckRegKey -InstalledCheckRegValueName $InstalledCheckRegValueName -InstalledCheckRegValueData $InstalledCheckRegValueData + $getProductEntryParameters += $checkRegistryValueParameters + } + + $productEntry = Get-ProductEntry @getProductEntryParameters + + Write-Verbose -Message ($script:localizedData.EnsureIsEnsure -f $Ensure) + + if ($null -ne $productEntry) + { + Write-Verbose -Message ($script:localizedData.ProductIsProduct -f $productEntry) + } + else + { + Write-Verbose -Message 'Product installation cannot be determined' + } + + Write-Verbose -Message ($script:localizedData.ProductAsBooleanIs -f [System.Boolean] $productEntry) + + if ($null -ne $productEntry) + { + if ($CreateCheckRegValue) + { + Write-Verbose -Message ($script:localizedData.PackageAppearsInstalled -f $Name) + } + else + { + $displayName = Get-LocalizedRegistryKeyValue -RegistryKey $productEntry -ValueName 'DisplayName' + Write-Verbose -Message ($script:localizedData.PackageAppearsInstalled -f $displayName) + } + } + else + { + $displayName = $null + + if (-not [System.String]::IsNullOrEmpty($Name)) + { + $displayName = $Name + } + else + { + $displayName = $ProductId + } + + Write-Verbose -Message ($script:localizedData.PackageDoesNotAppearInstalled -f $displayName) + } + + return ($null -ne $productEntry -and $Ensure -eq 'Present') -or ($null -eq $productEntry -and $Ensure -eq 'Absent') +} + +<# + .SYNOPSIS + Asserts that the path extension is valid - either .msi or .exe. + + .PARAMETER Path + The path to validate the extension of. +#> +function Assert-PathExtensionValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $pathExtension = [System.IO.Path]::GetExtension($Path) + Write-Verbose -Message ($script:localizedData.ThePathExtensionWasPathExt -f $pathExtension) + + $validPathExtensions = @( '.msi', '.exe' ) + + if ($validPathExtensions -notcontains $pathExtension.ToLower()) + { + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.InvalidBinaryType -f $Path) + } +} + +<# + .SYNOPSIS + Converts the given path to a URI. + Throws an exception if the path's scheme as a URI is not valid. + + .PARAMETER Path + The path to retrieve as a URI. +#> +function Convert-PathToUri +{ + [OutputType([System.Uri])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + try + { + $uri = [System.Uri] $Path + } + catch + { + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.InvalidPath -f $Path) + } + + $validUriSchemes = @( 'file', 'http', 'https' ) + + if ($validUriSchemes -notcontains $uri.Scheme) + { + Write-Verbose -Message ($script:localizedData.TheUriSchemeWasUriScheme -f $uri.Scheme) + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.InvalidPath -f $Path) + } + + return $uri +} + +<# + .SYNOPSIS + Retrieves the product ID as an identifying number. + + .PARAMETER ProductId + The product id to retrieve as an identifying number. +#> +function Convert-ProductIdToIdentifyingNumber +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ProductId + ) + + try + { + Write-Verbose -Message ($script:localizedData.ParsingProductIdAsAnIdentifyingNumber -f $ProductId) + $identifyingNumber = '{{{0}}}' -f [System.Guid]::Parse($ProductId).ToString().ToUpper() + + Write-Verbose -Message ($script:localizedData.ParsedProductIdAsIdentifyingNumber -f $ProductId, $identifyingNumber) + return $identifyingNumber + } + catch + { + New-InvalidArgumentException -ArgumentName 'ProductId' -Message ($script:localizedData.InvalidIdentifyingNumber -f $ProductId) + } +} + +<# + .SYNOPSIS + Asserts that the InstalledCheckRegKey, InstalledCheckRegValueName, and + InstalledCheckRegValueData parameter required for retrieving package installation status + from a registry are not null or empty. + + .PARAMETER InstalledCheckRegKey + The InstalledCheckRegKey parameter to check. + + .PARAMETER InstalledCheckRegValueName + The InstalledCheckRegValueName parameter to check. + + .PARAMETER InstalledCheckRegValueData + The InstalledCheckRegValueData parameter to check. + + .NOTES + This could be done with parameter validation. + It is implemented this way to provide a clearer error message. +#> +function Assert-RegistryParametersValid +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $InstalledCheckRegKey, + + [Parameter()] + [System.String] + $InstalledCheckRegValueName, + + [Parameter()] + [System.String] + $InstalledCheckRegValueData + ) + + foreach ($parameter in $PSBoundParameters.Keys) + { + if ([System.String]::IsNullOrEmpty($PSBoundParameters[$parameter])) + { + New-InvalidArgumentException -ArgumentName $parameter -Message ($script:localizedData.ProvideParameterForRegistryCheck -f $parameter) + } + } +} + +<# + .SYNOPSIS + Retrieves the product entry for the package with the given name and/or identifying number. + + .PARAMETER Name + The name of the product entry to retrieve. + + .PARAMETER CreateCheckRegValue + Indicates whether or not to retrieve the package installation status from a registry. + + .PARAMETER IdentifyingNumber + The identifying number of the product entry to retrieve. + + .PARAMETER InstalledCheckRegHive + The registry hive to check for package installation status. + + .PARAMETER InstalledCheckRegKey + The registry key to open to check for package installation status. + + .PARAMETER InstalledCheckRegValueName + The registry value name to check for package installation status. + + .PARAMETER InstalledCheckRegValueData + The value to compare against the retrieved registry value to check for package installation. +#> +function Get-ProductEntry +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $Name, + + [Parameter()] + [System.String] + $IdentifyingNumber, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $CreateCheckRegValue, + + [Parameter()] + [ValidateSet('LocalMachine', 'CurrentUser')] + [System.String] + $InstalledCheckRegHive = 'LocalMachine', + + [Parameter()] + [System.String] + $InstalledCheckRegKey, + + [Parameter()] + [System.String] + $InstalledCheckRegValueName, + + [Parameter()] + [System.String] + $InstalledCheckRegValueData + ) + + $uninstallRegistryKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' + $uninstallRegistryKeyWow64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' + + $productEntry = $null + + if (-not [System.String]::IsNullOrEmpty($IdentifyingNumber)) + { + $productEntryKeyLocation = Join-Path -Path $uninstallRegistryKey -ChildPath $IdentifyingNumber + $productEntry = Get-Item -Path $productEntryKeyLocation -ErrorAction 'SilentlyContinue' + + if ($null -eq $productEntry) + { + $productEntryKeyLocation = Join-Path -Path $uninstallRegistryKeyWow64 -ChildPath $IdentifyingNumber + $productEntry = Get-Item $productEntryKeyLocation -ErrorAction 'SilentlyContinue' + } + } + else + { + foreach ($registryKeyEntry in (Get-ChildItem -Path @( $uninstallRegistryKey, $uninstallRegistryKeyWow64) -ErrorAction 'Ignore' )) + { + if ($Name -eq (Get-LocalizedRegistryKeyValue -RegistryKey $registryKeyEntry -ValueName 'DisplayName')) + { + $productEntry = $registryKeyEntry + break + } + } + } + + if ($null -eq $productEntry) + { + if ($CreateCheckRegValue) + { + $installValue = $null + + $win32OperatingSystem = Get-CimInstance -ClassName 'Win32_OperatingSystem' -ErrorAction 'SilentlyContinue' + + # If 64-bit OS, check 64-bit registry view first + if ($win32OperatingSystem.OSArchitecture -ieq '64-bit') + { + $installValue = Get-RegistryValueWithErrorsIgnored -Key $InstalledCheckRegKey -Value $InstalledCheckRegValueName -RegistryHive $InstalledCheckRegHive -RegistryView 'Registry64' + } + + if ($null -eq $installValue) + { + $installValue = Get-RegistryValueWithErrorsIgnored -Key $InstalledCheckRegKey -Value $InstalledCheckRegValueName -RegistryHive $InstalledCheckRegHive -RegistryView 'Registry32' + } + + if ($null -ne $installValue) + { + if ($InstalledCheckRegValueData -and $installValue -eq $InstalledCheckRegValueData) + { + $productEntry = @{ + Installed = $true + } + } + } + } + } + + return $productEntry +} + +<# + .SYNOPSIS + Retrieves a value from a registry without throwing errors. + + .PARAMETER Key + The key of the registry to get the value from. + + .PARAMETER Value + The name of the value to retrieve. + + .PARAMETER RegistryHive + The registry hive to retrieve the value from. + + .PARAMETER RegistyView + The registry view to retrieve the value from. +#> +function Get-RegistryValueWithErrorsIgnored +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Key, + + [Parameter(Mandatory = $true)] + [System.String] + $Value, + + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryHive] + $RegistryHive, + + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryView] + $RegistryView + ) + + $registryValue = $null + + try + { + $baseRegistryKey = [Microsoft.Win32.RegistryKey]::OpenBaseKey($RegistryHive, $RegistryView) + $subRegistryKey = $baseRegistryKey.OpenSubKey($Key) + + if ($null -ne $subRegistryKey) + { + $registryValue = $subRegistryKey.GetValue($Value) + } + } + catch + { + $exceptionText = ($_ | Out-String).Trim() + Write-Verbose -Message "An exception occured while attempting to retrieve a registry value: $exceptionText" + } + + return $registryValue +} + +<# + .SYNOPSIS + Retrieves a localized registry key value. + + .PARAMETER RegistryKey + The registry key to retrieve the value from. + + .PARAMETER ValueName + The name of the value to retrieve. +#> +function Get-LocalizedRegistryKeyValue +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.Object] + $RegistryKey, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ValueName + ) + + $localizedRegistryKeyValue = $RegistryKey.GetValue('{0}_Localized' -f $ValueName) + + if ($null -eq $localizedRegistryKeyValue) + { + $localizedRegistryKeyValue = $RegistryKey.GetValue($ValueName) + } + + return $localizedRegistryKeyValue +} + +<# + .SYNOPSIS + Asserts that the file at the given path is valid. + + .PARAMETER Path + The path to the file to check. + + .PARAMETER FileHash + The hash that should match the hash of the file. + + .PARAMETER HashAlgorithm + The algorithm to use to retrieve the file hash. + + .PARAMETER SignerThumbprint + The certificate thumbprint that should match the file's signer certificate. + + .PARAMETER SignerSubject + The certificate subject that should match the file's signer certificate. +#> +function Assert-FileValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [System.String] + $FileHash, + + [Parameter()] + [System.String] + $HashAlgorithm, + + [Parameter()] + [System.String] + $SignerThumbprint, + + [Parameter()] + [System.String] + $SignerSubject + ) + + if (-not [System.String]::IsNullOrEmpty($FileHash)) + { + Assert-FileHashValid -Path $Path -Hash $FileHash -Algorithm $HashAlgorithm + } + + if (-not [System.String]::IsNullOrEmpty($SignerThumbprint) -or -not [System.String]::IsNullOrEmpty($SignerSubject)) + { + Assert-FileSignatureValid -Path $Path -Thumbprint $SignerThumbprint -Subject $SignerSubject + } +} + +<# + .SYNOPSIS + Asserts that the hash of the file at the given path matches the given hash. + + .PARAMETER Path + The path to the file to check the hash of. + + .PARAMETER Hash + The hash to check against. + + .PARAMETER Algorithm + The algorithm to use to retrieve the file's hash. +#> +function Assert-FileHashValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [Parameter(Mandatory = $true)] + [System.String] + $Hash, + + [Parameter()] + [System.String] + $Algorithm = 'SHA256' + ) + + if ([System.String]::IsNullOrEmpty($Algorithm)) + { + $Algorithm = 'SHA256' + } + + Write-Verbose -Message ($script:localizedData.CheckingFileHash -f $Path, $Hash, $Algorithm) + + $fileHash = Get-FileHash -LiteralPath $Path -Algorithm $Algorithm -ErrorAction 'Stop' + + if ($fileHash.Hash -ne $Hash) + { + throw ($script:localizedData.InvalidFileHash -f $Path, $Hash, $Algorithm) + } +} + +<# + .SYNOPSIS + Asserts that the signature of the file at the given path is valid. + + .PARAMETER Path + The path to the file to check the signature of + + .PARAMETER Thumbprint + The certificate thumbprint that should match the file's signer certificate. + + .PARAMETER Subject + The certificate subject that should match the file's signer certificate. +#> +function Assert-FileSignatureValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path, + + [Parameter()] + [System.String] + $Thumbprint, + + [Parameter()] + [System.String] + $Subject + ) + + Write-Verbose -Message ($script:localizedData.CheckingFileSignature -f $Path) + + $signature = Get-AuthenticodeSignature -LiteralPath $Path -ErrorAction 'Stop' + + if ($signature.Status -ne [System.Management.Automation.SignatureStatus]::Valid) + { + throw ($script:localizedData.InvalidFileSignature -f $Path, $signature.Status) + } + else + { + Write-Verbose -Message ($script:localizedData.FileHasValidSignature -f $Path, $signature.SignerCertificate.Thumbprint, $signature.SignerCertificate.Subject) + } + + if ($null -ne $Subject -and ($signature.SignerCertificate.Subject -notlike $Subject)) + { + throw ($script:localizedData.WrongSignerSubject -f $Path, $Subject) + } + + if ($null -ne $Thumbprint -and ($signature.SignerCertificate.Thumbprint -ne $Thumbprint)) + { + throw ($script:localizedData.WrongSignerThumbprint -f $Path, $Thumbprint) + } +} + +<# + .SYNOPSIS + Retrieves the name of a product from an msi. + + .PARAMETER Path + The path to the msi to retrieve the name from. +#> +function Get-MsiProductName +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $msiTools = Get-MsiTool + + $productName = $msiTools::GetProductName($Path) + + return $productName +} + +<# + .SYNOPSIS + Retrieves the code of a product from an msi. + + .PARAMETER Path + The path to the msi to retrieve the code from. +#> +function Get-MsiProductCode +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $msiTools = Get-MsiTool + + $productCode = $msiTools::GetProductCode($Path) + + return $productCode +} + +<# + .SYNOPSIS + Retrieves the MSI tools type. +#> +function Get-MsiTool +{ + [OutputType([System.Type])] + [CmdletBinding()] + param () + + if ($null -ne $script:msiTools) + { + return $script:msiTools + } + + $msiToolsCodeDefinition = @' + [DllImport("msi.dll", CharSet = CharSet.Unicode, PreserveSig = true, SetLastError = true, ExactSpelling = true)] + private static extern UInt32 MsiOpenPackageExW(string szPackagePath, int dwOptions, out IntPtr hProduct); + + [DllImport("msi.dll", CharSet = CharSet.Unicode, PreserveSig = true, SetLastError = true, ExactSpelling = true)] + private static extern uint MsiCloseHandle(IntPtr hAny); + + [DllImport("msi.dll", CharSet = CharSet.Unicode, PreserveSig = true, SetLastError = true, ExactSpelling = true)] + private static extern uint MsiGetPropertyW(IntPtr hAny, string name, StringBuilder buffer, ref int bufferLength); + + private static string GetPackageProperty(string msi, string property) + { + IntPtr MsiHandle = IntPtr.Zero; + try + { + var res = MsiOpenPackageExW(msi, 1, out MsiHandle); + if (res != 0) + { + return null; + } + + int length = 256; + var buffer = new StringBuilder(length); + res = MsiGetPropertyW(MsiHandle, property, buffer, ref length); + return buffer.ToString(); + } + finally + { + if (MsiHandle != IntPtr.Zero) + { + MsiCloseHandle(MsiHandle); + } + } + } + public static string GetProductCode(string msi) + { + return GetPackageProperty(msi, "ProductCode"); + } + + public static string GetProductName(string msi) + { + return GetPackageProperty(msi, "ProductName"); + } +'@ + + if (([System.Management.Automation.PSTypeName]'Microsoft.Windows.DesiredStateConfiguration.xPackageResource.MsiTools').Type) + { + $script:msiTools = ([System.Management.Automation.PSTypeName]'Microsoft.Windows.DesiredStateConfiguration.xPackageResource.MsiTools').Type + } + else + { + $script:msiTools = Add-Type ` + -Namespace 'Microsoft.Windows.DesiredStateConfiguration.xPackageResource' ` + -Name 'MsiTools' ` + -Using 'System.Text' ` + -MemberDefinition $msiToolsCodeDefinition ` + -PassThru + } + + return $script:msiTools +} + +<# + .SYNOPSIS + Runs a process as the specified user via PInvoke. + + .PARAMETER CommandLine + The command line (including arguments) of the process to start. + + .PARAMETER Credential + The user credential to start the process as. +#> +function Invoke-PInvoke +{ + [CmdletBinding()] + [OutputType([System.Int32])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $CommandLine, + + [Parameter(Mandatory = $true)] + [System.Management.Automation.PSCredential] + [System.Management.Automation.CredentialAttribute()] + $Credential + ) + + Register-PInvoke + [System.Int32] $exitCode = 0 + + [Source.NativeMethods]::CreateProcessAsUser($CommandLine, ` + $Credential.GetNetworkCredential().Domain, ` + $Credential.GetNetworkCredential().UserName, ` + $Credential.GetNetworkCredential().Password, ` + [ref] $exitCode + ) + + return $exitCode; +} + +<# + .SYNOPSIS + Starts and waits for a process. + + .DESCRIPTION + Allows mocking and testing of process arguments. + + .PARAMETER Process + The System.Diagnositics.Process object to start. + + .PARAMETER LogStream + Redirect STDOUT and STDERR output. +#> +function Invoke-Process +{ + [CmdletBinding()] + [OutputType([System.Diagnostics.Process])] + param ( + [Parameter(Mandatory = $true)] + [System.Diagnostics.Process] + $Process, + + [Parameter()] + [System.Boolean] + $LogStream + ) + + $Process.Start() | Out-Null + + if ($LogStream) + { + $Process.BeginOutputReadLine() + $Process.BeginErrorReadLine() + } + + $Process.WaitForExit() + return $Process +} + +<# + .SYNOPSIS + Sets the value of a registry key to the specified data. + + .PARAMETER Key + The registry key that contains the value to set. + + .PARAMETER Value + The value name of the registry key value to set. + + .PARAMETER RegistryHive + The registry hive that contains the registry key to set. + + .PARAMETER Data + The data to set the registry key value to. +#> +function Set-RegistryValue +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Key, + + [Parameter(Mandatory = $true)] + [System.String] + $Value, + + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryHive] + $RegistryHive, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Data + ) + + try + { + $baseRegistryKey = [Microsoft.Win32.RegistryKey]::OpenBaseKey($RegistryHive, [Microsoft.Win32.RegistryView]::Default) + + # Opens the subkey with write access + $subRegistryKey = $baseRegistryKey.OpenSubKey($Key, $true) + + if ($null -eq $subRegistryKey) + { + Write-Verbose "Key: '$Key'" + $subRegistryKey = $baseRegistryKey.CreateSubKey($Key) + } + + $subRegistryKey.SetValue($Value, $Data) + $subRegistryKey.Close() + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.ErrorSettingRegistryValue -f $Key, $Value, $Data) -ErrorRecord $_ + } +} + +<# + .SYNOPSIS + Removes the specified value of a registry key. + + .PARAMETER Key + The registry key that contains the value to remove. + + .PARAMETER Value + The value name of the registry key value to remove. + + .PARAMETER RegistryHive + The registry hive that contains the registry key to remove. +#> +function Remove-RegistryValue +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Key, + + [Parameter(Mandatory = $true)] + [System.String] + $Value, + + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryHive] + $RegistryHive + ) + + try + { + $baseRegistryKey = [Microsoft.Win32.RegistryKey]::OpenBaseKey($RegistryHive, [Microsoft.Win32.RegistryView]::Default) + + $subRegistryKey = $baseRegistryKey.OpenSubKey($Key, $true) + $subRegistryKey.DeleteValue($Value) + $subRegistryKey.Close() + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.ErrorRemovingRegistryValue -f $Key, $Value) -ErrorRecord $_ + } +} + +<# + .SYNOPSIS + Registers PInvoke to run a process as a user. +#> +function Register-PInvoke +{ + $programSource = @' + using System; + using System.Collections.Generic; + using System.Text; + using System.Security; + using System.Runtime.InteropServices; + using System.Diagnostics; + using System.Security.Principal; + using System.ComponentModel; + using System.IO; + + namespace Source + { + [SuppressUnmanagedCodeSecurity] + public static class NativeMethods + { + //The following structs and enums are used by the various Win32 API's that are used in the code below + + [StructLayout(LayoutKind.Sequential)] + public struct STARTUPINFO + { + public Int32 cb; + public string lpReserved; + public string lpDesktop; + public string lpTitle; + public Int32 dwX; + public Int32 dwY; + public Int32 dwXSize; + public Int32 dwXCountChars; + public Int32 dwYCountChars; + public Int32 dwFillAttribute; + public Int32 dwFlags; + public Int16 wShowWindow; + public Int16 cbReserved2; + public IntPtr lpReserved2; + public IntPtr hStdInput; + public IntPtr hStdOutput; + public IntPtr hStdError; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PROCESS_INFORMATION + { + public IntPtr hProcess; + public IntPtr hThread; + public Int32 dwProcessID; + public Int32 dwThreadID; + } + + [Flags] + public enum LogonType + { + LOGON32_LOGON_INTERACTIVE = 2, + LOGON32_LOGON_NETWORK = 3, + LOGON32_LOGON_BATCH = 4, + LOGON32_LOGON_SERVICE = 5, + LOGON32_LOGON_UNLOCK = 7, + LOGON32_LOGON_NETWORK_CLEARTEXT = 8, + LOGON32_LOGON_NEW_CREDENTIALS = 9 + } + + [Flags] + public enum LogonProvider + { + LOGON32_PROVIDER_DEFAULT = 0, + LOGON32_PROVIDER_WINNT35, + LOGON32_PROVIDER_WINNT40, + LOGON32_PROVIDER_WINNT50 + } + [StructLayout(LayoutKind.Sequential)] + public struct SECURITY_ATTRIBUTES + { + public Int32 Length; + public IntPtr lpSecurityDescriptor; + public bool bInheritHandle; + } + + public enum SECURITY_IMPERSONATION_LEVEL + { + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation + } + + public enum TOKEN_TYPE + { + TokenPrimary = 1, + TokenImpersonation + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct TokPriv1Luid + { + public int Count; + public long Luid; + public int Attr; + } + + public const int GENERIC_ALL_ACCESS = 0x10000000; + public const int CREATE_NO_WINDOW = 0x08000000; + internal const int SE_PRIVILEGE_ENABLED = 0x00000002; + internal const int TOKEN_QUERY = 0x00000008; + internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; + internal const string SE_INCRASE_QUOTA = "SeIncreaseQuotaPrivilege"; + + [DllImport("kernel32.dll", + EntryPoint = "CloseHandle", SetLastError = true, + CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] + public static extern bool CloseHandle(IntPtr handle); + + [DllImport("advapi32.dll", + EntryPoint = "CreateProcessAsUser", SetLastError = true, + CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern bool CreateProcessAsUser( + IntPtr hToken, + string lpApplicationName, + string lpCommandLine, + ref SECURITY_ATTRIBUTES lpProcessAttributes, + ref SECURITY_ATTRIBUTES lpThreadAttributes, + bool bInheritHandle, + Int32 dwCreationFlags, + IntPtr lpEnvrionment, + string lpCurrentDirectory, + ref STARTUPINFO lpStartupInfo, + ref PROCESS_INFORMATION lpProcessInformation + ); + + [DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx")] + public static extern bool DuplicateTokenEx( + IntPtr hExistingToken, + Int32 dwDesiredAccess, + ref SECURITY_ATTRIBUTES lpThreadAttributes, + Int32 ImpersonationLevel, + Int32 dwTokenType, + ref IntPtr phNewToken + ); + + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern Boolean LogonUser( + String lpszUserName, + String lpszDomain, + String lpszPassword, + LogonType dwLogonType, + LogonProvider dwLogonProvider, + out IntPtr phToken + ); + + [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] + internal static extern bool AdjustTokenPrivileges( + IntPtr htok, + bool disall, + ref TokPriv1Luid newst, + int len, + IntPtr prev, + IntPtr relen + ); + + [DllImport("kernel32.dll", ExactSpelling = true)] + internal static extern IntPtr GetCurrentProcess(); + + [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] + internal static extern bool OpenProcessToken( + IntPtr h, + int acc, + ref IntPtr phtok + ); + + [DllImport("kernel32.dll", ExactSpelling = true)] + internal static extern int WaitForSingleObject( + IntPtr h, + int milliseconds + ); + + [DllImport("kernel32.dll", ExactSpelling = true)] + internal static extern bool GetExitCodeProcess( + IntPtr h, + out int exitcode + ); + + [DllImport("advapi32.dll", SetLastError = true)] + internal static extern bool LookupPrivilegeValue( + string host, + string name, + ref long pluid + ); + + public static void CreateProcessAsUser(string strCommand, string strDomain, string strName, string strPassword, ref int ExitCode ) + { + var hToken = IntPtr.Zero; + var hDupedToken = IntPtr.Zero; + TokPriv1Luid tp; + var pi = new PROCESS_INFORMATION(); + var sa = new SECURITY_ATTRIBUTES(); + sa.Length = Marshal.SizeOf(sa); + Boolean bResult = false; + try + { + bResult = LogonUser( + strName, + strDomain, + strPassword, + LogonType.LOGON32_LOGON_BATCH, + LogonProvider.LOGON32_PROVIDER_DEFAULT, + out hToken + ); + if (!bResult) + { + throw new Win32Exception("Logon error #" + Marshal.GetLastWin32Error().ToString()); + } + IntPtr hproc = GetCurrentProcess(); + IntPtr htok = IntPtr.Zero; + bResult = OpenProcessToken( + hproc, + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, + ref htok + ); + if(!bResult) + { + throw new Win32Exception("Open process token error #" + Marshal.GetLastWin32Error().ToString()); + } + tp.Count = 1; + tp.Luid = 0; + tp.Attr = SE_PRIVILEGE_ENABLED; + bResult = LookupPrivilegeValue( + null, + SE_INCRASE_QUOTA, + ref tp.Luid + ); + if(!bResult) + { + throw new Win32Exception("Lookup privilege error #" + Marshal.GetLastWin32Error().ToString()); + } + bResult = AdjustTokenPrivileges( + htok, + false, + ref tp, + 0, + IntPtr.Zero, + IntPtr.Zero + ); + if(!bResult) + { + throw new Win32Exception("Token elevation error #" + Marshal.GetLastWin32Error().ToString()); + } + + bResult = DuplicateTokenEx( + hToken, + GENERIC_ALL_ACCESS, + ref sa, + (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, + (int)TOKEN_TYPE.TokenPrimary, + ref hDupedToken + ); + if(!bResult) + { + throw new Win32Exception("Duplicate Token error #" + Marshal.GetLastWin32Error().ToString()); + } + var si = new STARTUPINFO(); + si.cb = Marshal.SizeOf(si); + si.lpDesktop = ""; + bResult = CreateProcessAsUser( + hDupedToken, + null, + strCommand, + ref sa, + ref sa, + false, + 0, + IntPtr.Zero, + null, + ref si, + ref pi + ); + if(!bResult) + { + throw new Win32Exception("Create process as user error #" + Marshal.GetLastWin32Error().ToString()); + } + + int status = WaitForSingleObject(pi.hProcess, -1); + if(status == -1) + { + throw new Win32Exception("Wait during create process failed user error #" + Marshal.GetLastWin32Error().ToString()); + } + + bResult = GetExitCodeProcess(pi.hProcess, out ExitCode); + if(!bResult) + { + throw new Win32Exception("Retrieving status error #" + Marshal.GetLastWin32Error().ToString()); + } + } + finally + { + if (pi.hThread != IntPtr.Zero) + { + CloseHandle(pi.hThread); + } + if (pi.hProcess != IntPtr.Zero) + { + CloseHandle(pi.hProcess); + } + if (hDupedToken != IntPtr.Zero) + { + CloseHandle(hDupedToken); + } + } + } + } + } +'@ + Add-Type -TypeDefinition $programSource -ReferencedAssemblies 'System.ServiceProcess' +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/DSC_xPackageResource.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/DSC_xPackageResource.schema.mof new file mode 100644 index 0000000..e81147a --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/DSC_xPackageResource.schema.mof @@ -0,0 +1,30 @@ +[ClassVersion("1.0.0"),FriendlyName("xPackage")] +class DSC_xPackageResource : OMI_BaseResource +{ + [Write,ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] string Ensure; + [Key] string Name; + [Required] string Path; + [Key] string ProductId; + [Write] string Arguments; + [Write,EmbeddedInstance("MSFT_Credential")] string Credential; + [Write] uint32 ReturnCode[]; + [Write] string LogPath; + [Read] string PackageDescription; + [Read] string Publisher; + [Read] string InstalledOn; + [Read] uint32 Size; + [Read] string Version; + [Read] boolean Installed; + [Write] string FileHash; + [Write,ValueMap{"SHA1","SHA256","SHA384","SHA512","MD5","RIPEMD160"},Values{"SHA1","SHA256","SHA384","SHA512","MD5","RIPEMD160"}] string HashAlgorithm; + [Write] string SignerSubject; + [Write] string SignerThumbprint; + [Write] string ServerCertificateValidationCallback; + [Write,ValueMap{"LocalMachine","CurrentUser"},Values{"LocalMachine","CurrentUser"}] string InstalledCheckRegHive; + [Write] string InstalledCheckRegKey; + [Write] string InstalledCheckRegValueName; + [Write] string InstalledCheckRegValueData; + [Write] boolean CreateCheckRegValue; + [Write, Description("Ignore a pending reboot if requested by package installation.")] Boolean IgnoreReboot; + [Write,EmbeddedInstance("MSFT_Credential")] string RunAsCredential; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/en-US/DSC_xPackageResource.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/en-US/DSC_xPackageResource.schema.mfl new file mode 100644 index 0000000..454e1e9 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/en-US/DSC_xPackageResource.schema.mfl @@ -0,0 +1,32 @@ +#pragma namespace("\\\\.\\root\\default") +instance of __namespace{ name="MS_409";}; +#pragma namespace("\\\\.\\root\\default\\MS_409") + +[AMENDMENT, LOCALE("MS_409")] +class DSC_xPackageResource : OMI_BaseResource +{ + [Description("Indicates whether to Ensure that the package is Present or Absent (default Present)") : Amended] string Ensure; + [Key,Description("The name of the package to be added or removed") : Amended] string Name; + [Description("The path, URL or UNC path to the package") : Amended] string Path; + [Key,Description("The identifying number used to uniquely identify this package") : Amended] string ProductId; + [Description("The arguments to be passed to the package during addition or removal") : Amended] string Arguments; + [Description("The credentials to be used for mounting the UNC path (if applicable)") : Amended] string Credential; + [Description("The list of possible valid return codes for this install or removal") : Amended] uint32 ReturnCode[]; + [Description("The path to log the output of the MSI or EXE") : Amended] string LogPath; + [Description("The description of the identified package") : Amended] string PackageDescription; + [Description("The publisher for the identified package") : Amended] string Publisher; + [Description("The date that the identified package was last serviced or its install date, whichever is later") : Amended] string InstalledOn; + [Description("The size of the identified package") : Amended] uint32 Size; + [Description("The version number of the identified package") : Amended] string Version; + [Description("Whether the identified package is installed") : Amended] boolean Installed; + [Description("The credentials under which to run the installation") : Amended] string RunAsCredential; + [Description("The expected hash value of the file found in the Path location.") : Amended] string FileHash; + [Description("The algorithm used to generate the FileHash value. Defaults to SHA256") : Amended] string HashAlgorithm; + [Description("The subject that must match the signer certificate of the digital signature. Wildcards are allowed.") : Amended] string SignerSubject; + [Description("The certificate thumbprint which must match the signer certificate of the digital signature.") : Amended] string SignerThumbprint; + [Description("PowerShell code used to validate SSL certificates of HTTPS url assigned to Path.") : Amended] string ServerCertificateValidationCallback; + [Description("The Registry key to validate the package is installed") : Amended] string InstalledCheckRegKey; + [Description("The Registry value name to validate the package is installed") : Amended] string InstalledCheckRegValueName; + [Description("The Registry value to validate the package is installed") : Amended] string InstalledCheckRegValueData; +}; + diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/en-US/DSC_xPackageResource.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/en-US/DSC_xPackageResource.strings.psd1 new file mode 100644 index 0000000..06c8215 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xPackageResource/en-US/DSC_xPackageResource.strings.psd1 @@ -0,0 +1,64 @@ +# Localized resources for DSC_xPackageResource + +ConvertFrom-StringData @' + InvalidIdentifyingNumber = The specified IdentifyingNumber '{0}' is not a valid Guid. + InvalidPath = The specified Path '{0}' is not in a valid format. Valid formats are local paths, UNC, and HTTP. + InvalidNameOrId = The specified Name '{0}' and IdentifyingNumber '{1}' do not match Name '{2}' and IdentifyingNumber '{3}' in the MSI file. + InvalidBinaryType = The specified Path '{0}' does not appear to specify an EXE or MSI file and as such is not supported. + CouldNotOpenLog = The specified LogPath '{0}' could not be opened. + CouldNotStartProcess = The process '{0}' could not be started. + UnexpectedReturnCode = The return code '{0}' was not expected. Configuration is likely not correct. + PathDoesNotExist = The given Path '{0}' could not be found. + CouldNotOpenDestFile = Could not open the file '{0}' for writing. + CouldNotGetHttpStream = Could not get the '{0}' stream for file '{1}'. + ErrorCopyingDataToFile = Encountered error while writing the contents of '{0}' to '{1}'. + PackageConfigurationComplete = Package configuration finished. + PackageConfigurationStarting = Package configuration starting. + RemoveExistingLogFile = Remove existing log file. + CreateLogFile = Create log file. + MountSharePath = Mount share to get media. + DownloadHTTPFile = Download the media over HTTP or HTTPS. + StartingProcessMessage = Starting process '{0}' with arguments '{1}'. + RemoveDownloadedFile = Remove the downloaded file. + PackageInstalled = Package has been installed. + PackageUninstalled = Package has been uninstalled. + MachineRequiresReboot = The machine requires a reboot. + IgnoreReboot = Ignore a pending reboot. + PackageDoesNotAppearInstalled = The package '{0}' is not installed. + PackageAppearsInstalled = The package '{0}' is installed. + PostValidationError = Package from '{0}' was installed, but the specified ProductId and/or Name does not match package details. + CheckingFileHash = Checking file '{0}' for expected '{2}' hash value of '{1}'. + InvalidFileHash = File '{0}' does not match expected '{2}' hash value of '{1}'. + CheckingFileSignature = Checking file '{0}' for valid digital signature. + FileHasValidSignature = File '{0}' contains a valid digital signature. Signer Thumbprint: '{1}', Subject: '{2}'. + InvalidFileSignature = File '{0}' does not have a valid Authenticode signature. Status: '{1}'. + WrongSignerSubject = File '{0}' was not signed by expected signer subject '{1}'. + WrongSignerThumbprint = File '{0}' was not signed by expected signer certificate thumbprint '{1}'. + CreatingRegistryValue = Creating package registry value of '{0}'. + RemovingRegistryValue = Removing package registry value of '{0}'. + TheurischemewasuriScheme = The uri scheme was '{0}'. + ThepathextensionwaspathExt = The path extension was '{0}'. + ParsingProductIdasanidentifyingNumber = Parsing '{0}' as an identifyingNumber. + ParsedProductIdasidentifyingNumber = Parsed '{0}' as '{1}'. + EnsureisEnsure = Ensure is '{0}'. + productisproduct = product '{0}' found. + productasbooleanis = product as boolean is '{0}'. + Creatingcachelocation = Creating cache location. + NeedtodownloadfilefromschemedestinationwillbedestName = Need to download file from '{0}', destination will be '{1}'. + Creatingthedestinationcachefile = Creating the destination cache file. + Creatingtheschemestream = Creating the '{0}' stream. + Settingdefaultcredential = Setting default credential. + Settingauthenticationlevel = Setting authentication level. + Gettingtheschemeresponsestream = Getting the '{0}' response stream. + ErrorOutString = Error: {0}. + Copyingtheschemestreambytestothediskcache = Copying the '{0}' stream bytes to the disk cache. + Redirectingpackagepathtocachefilelocation = Redirecting package path to cache file location. + ThebinaryisanEXE = The binary is an EXE. + Userhasrequestedloggingneedtoattacheventhandlerstotheprocess = User has requested logging, need to attach event handlers to the process. + StartingwithstartInfoFileNamestartInfoArguments = Starting '{0}' with '{1}'. + ProvideParameterForRegistryCheck = Please provide the '{0}' parameter in order to check for installation status from a registry key. + ErrorSettingRegistryValue = An error occured while attempting to set the registry key '{0}' value '{1}' to '{2}'. + ErrorRemovingRegistryValue = An error occured while attempting to remove the registry key '{0}' value '{1}'. + ExeCouldNotBeUninstalled = The .exe file found at '{0}' could not be uninstalled. The uninstall functionality may not be implemented in this .exe file. + EnteringGetTargetResource = Entering Get-TargetResource in file DSC_xPackageResource.psm1. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/DSC_xRegistryResource.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/DSC_xRegistryResource.psm1 new file mode 100644 index 0000000..eca2357 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/DSC_xRegistryResource.psm1 @@ -0,0 +1,1536 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xRegistryResource' + +$script:registryDriveRoots = @{ + 'HKCC' = 'HKEY_CURRENT_CONFIG' + 'HKCR' = 'HKEY_CLASSES_ROOT' + 'HKCU' = 'HKEY_CURRENT_USER' + 'HKLM' = 'HKEY_LOCAL_MACHINE' + 'HKUS' = 'HKEY_USERS' +} + +<# + .SYNOPSIS + Retrieves the current state of the Registry resource with the given Key. + + .PARAMETER Key + The path of the registry key to retrieve the state of. + This path must include the registry hive. + + .PARAMETER ValueName + The name of the registry value to retrieve the state of. + + .PARAMETER ValueData + Used only as a boolean flag (along with ValueType) to determine if the target entity is the + Default Value or the key itself. + + .PARAMETER ValueType + Used only as a boolean flag (along with ValueData) to determine if the target entity is the + Default Value or the key itself. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Key, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.String] + [AllowEmptyString()] + $ValueName, + + [Parameter()] + [System.String[]] + $ValueData, + + [Parameter()] + [ValidateSet('String', 'Binary', 'DWord', 'QWord', 'MultiString', 'ExpandString')] + [System.String] + $ValueType + ) + + Write-Verbose -Message ($script:localizedData.GetTargetResourceStartMessage -f $Key) + + $registryResource = @{ + Key = $Key + Ensure = 'Absent' + ValueName = $null + ValueType = $null + ValueData = $null + } + + # Retrieve the registry key at the specified path + $registryKey = Get-RegistryKey -RegistryKeyPath $Key + + # Check if the registry key exists + if ($null -eq $registryKey) + { + Write-Verbose -Message ($script:localizedData.RegistryKeyDoesNotExist -f $Key) + } + else + { + Write-Verbose -Message ($script:localizedData.RegistryKeyExists -f $Key) + + # Check if the user specified a value name to retrieve + $valueNameSpecified = (-not [System.String]::IsNullOrEmpty($ValueName)) -or $PSBoundParameters.ContainsKey('ValueType') -or $PSBoundParameters.ContainsKey('ValueData') + + if ($valueNameSpecified) + { + $valueDisplayName = Get-RegistryKeyValueDisplayName -RegistryKeyValueName $ValueName + $registryResource['ValueName'] = $valueDisplayName + + # If a value name was specified, retrieve the value with the specified name from the retrieved registry key + $registryKeyValue = Get-RegistryKeyValue -RegistryKey $registryKey -RegistryKeyValueName $ValueName + + # Check if the registry key value exists + if ($null -eq $registryKeyValue) + { + Write-Verbose -Message ($script:localizedData.RegistryKeyValueDoesNotExist -f $Key, $valueDisplayName) + } + else + { + Write-Verbose -Message ($script:localizedData.RegistryKeyValueExists -f $Key, $valueDisplayName) + + # If the registry key value exists, retrieve its type + $actualValueType = Get-RegistryKeyValueType -RegistryKey $registryKey -RegistryKeyValueName $ValueName + + # If the registry key value exists, convert it to a readable string + $registryKeyValueAsReadableString = @() + (ConvertTo-ReadableString -RegistryKeyValue $registryKeyValue -RegistryKeyValueType $actualValueType) + + $registryResource['Ensure'] = 'Present' + $registryResource['ValueType'] = $actualValueType + $registryResource['ValueData'] = $registryKeyValueAsReadableString + } + } + else + { + $registryResource['Ensure'] = 'Present' + } + } + + Write-Verbose -Message ($script:localizedData.GetTargetResourceEndMessage -f $Key) + + return $registryResource +} + +<# + .SYNOPSIS + Sets the Registry resource with the given Key to the specified state. + + .PARAMETER Key + The path of the registry key to set the state of. + This path must include the registry hive. + + .PARAMETER ValueName + The name of the registry value to set. + + To add or remove a registry key, specify this property as an empty string without + specifying ValueType or ValueData. To modify or remove the default value of a registry key, + specify this property as an empty string while also specifying ValueType or ValueData. + + .PARAMETER Ensure + Specifies whether or not the registry key with the given path and the registry key value with the given name should exist. + + To ensure that the registry key and value exists, set this property to Present. + To ensure that the registry key and value do not exist, set this property to Absent. + + The default value is Present. + + .PARAMETER ValueData + The data to set as the registry key value. + + .PARAMETER ValueType + The type of the value to set. + + The supported types are: + String (REG_SZ) + Binary (REG-BINARY) + Dword 32-bit (REG_DWORD) + Qword 64-bit (REG_QWORD) + Multi-string (REG_MULTI_SZ) + Expandable string (REG_EXPAND_SZ) + + .PARAMETER Hex + Specifies whether or not the value data should be expressed in hexadecimal format. + + If specified, DWORD/QWORD value data is presented in hexadecimal format. + Not valid for other value types. + + The default value is $false. + + .PARAMETER Force + Specifies whether or not to overwrite the registry key with the given path with the new + value if it is already present. +#> +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Key, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.String] + [AllowEmptyString()] + $ValueName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $ValueData = @(), + + [Parameter()] + [ValidateSet('String', 'Binary', 'DWord', 'QWord', 'MultiString', 'ExpandString')] + [System.String] + $ValueType = 'String', + + [Parameter()] + [System.Boolean] + $Hex = $false, + + [Parameter()] + [System.Boolean] + $Force = $false + ) + + Write-Verbose -Message ($script:localizedData.SetTargetResourceStartMessage -f $Key) + + # Retrieve the registry key at the specified path + $registryKey = Get-RegistryKey -RegistryKeyPath $Key -WriteAccessAllowed + + # Check if the registry key exists + if ($null -eq $registryKey) + { + Write-Verbose -Message ($script:localizedData.RegistryKeyDoesNotExist -f $Key) + + # Check if the user wants the registry key to exist + if ($Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.CreatingRegistryKey -f $Key) + $registryKey = New-RegistryKey -RegistryKeyPath $Key + } + } + + # Check if the registry key exists + if ($null -ne $registryKey) + { + Write-Verbose -Message ($script:localizedData.RegistryKeyExists -f $Key) + + $valueNameSpecified = (-not [System.String]::IsNullOrEmpty($ValueName)) -or $PSBoundParameters.ContainsKey('ValueType') -or $PSBoundParameters.ContainsKey('ValueData') + + # Check if the user wants to set a registry key value + if ($valueNameSpecified) + { + # Retrieve the display name of the specified registry key value + $valueDisplayName = Get-RegistryKeyValueDisplayName -RegistryKeyValueName $ValueName + + # Retrieve the existing registry key value + $actualRegistryKeyValue = Get-RegistryKeyValue -RegistryKey $registryKey -RegistryKeyValueName $ValueName + + # Check if the user wants to add/modify or remove the registry key value + if ($Ensure -eq 'Present') + { + # Convert the specified registry key value to the specified type + $expectedRegistryKeyValue = switch ($ValueType) + { + 'Binary' { ConvertTo-Binary -RegistryKeyValue $ValueData; break } + 'DWord' { ConvertTo-DWord -RegistryKeyValue $ValueData -Hex $Hex; break } + 'MultiString' { ConvertTo-MultiString -RegistryKeyValue $ValueData; break } + 'QWord' { ConvertTo-QWord -RegistryKeyValue $ValueData -Hex $Hex; break } + default { ConvertTo-String -RegistryKeyValue $ValueData} + } + + # Retrieve the name of the registry key + $registryKeyName = Get-RegistryKeyName -RegistryKey $registryKey + + # Check if the registry key value exists + if ($null -eq $actualRegistryKeyValue) + { + # If the registry key value does not exist, set the new value + Write-Verbose -Message ($script:localizedData.SettingRegistryKeyValue -f $valueDisplayName, $Key) + $null = Set-RegistryKeyValue -RegistryKeyName $registryKeyName -RegistryKeyValueName $ValueName -RegistryKeyValue $expectedRegistryKeyValue -ValueType $ValueType + } + else + { + # If the registry key value exists, retrieve its type + $actualValueType = Get-RegistryKeyValueType -RegistryKey $registryKey -RegistryKeyValueName $ValueName + + $ShouldOverwriteRegistryKeyValue = $false + + # Check if the specified type of the registry key value matches the retrieved type of the registry key value + if ($PSBoundParameters.ContainsKey('ValueType') -and ($ValueType -ne $actualValueType)) + { + # If the specified type of the registry key value does not matches the retrieved type of the registry key value, should overwrite the value + $ShouldOverwriteRegistryKeyValue = $true + } + # Check if the specified registry key value matches the retrieved registry key value + elseif (-not (Test-RegistryKeyValuesMatch -ExpectedRegistryKeyValue $expectedRegistryKeyValue -ActualRegistryKeyValue $actualRegistryKeyValue -RegistryKeyValueType $ValueType)) + { + # If the specified registry key value does not matches the retrieved registry key value, should overwrite the value + $ShouldOverwriteRegistryKeyValue = $true + } + + # Check if the registry key value should be overwritten + if ($false -eq $ShouldOverwriteRegistryKeyValue) + { + # No change is needed + Write-Verbose -Message ($script:localizedData.RegistryKeyValueAlreadySet -f $valueDisplayName, $Key) + } + else + { + # Check if the user wants to overwrite the value + if (-not $Force) + { + # If the user does not want to overwrite the value, throw an error + New-InvalidOperationException -Message ($script:localizedData.CannotOverwriteExistingRegistryKeyValueWithoutForce -f $Key, $valueDisplayName) + } + else + { + # If the user does want to overwrite the value, overwrite the value + Write-Verbose -Message ($script:localizedData.OverwritingRegistryKeyValue -f $valueDisplayName, $Key) + $null = Set-RegistryKeyValue -RegistryKeyName $registryKeyName -RegistryKeyValueName $ValueName -RegistryKeyValue $expectedRegistryKeyValue -ValueType $ValueType + } + } + } + } + else + { + # Check if the registry key value exists + if ($null -ne $actualRegistryKeyValue) + { + Write-Verbose -Message ($script:localizedData.RemovingRegistryKeyValue -f $valueDisplayName, $Key) + + # If the specified registry key value exists, check if the user specified a registry key value with a name to remove + if (-not [System.String]::IsNullOrEmpty($ValueName)) + { + # If the user specified a registry key value with a name to remove, remove the registry key value with the specified name + $null = Remove-RegistryKeyValue -RegistryKey $registryKey -RegistryKeyValueName $ValueName + } + else + { + # If the user did not specify a registry key value with a name to remove, remove the default registry key value + $null = Remove-DefaultRegistryKeyValue -RegistryKey $registryKey + } + } + } + } + else + { + # Check if the user wants to remove the registry key + if ($Ensure -eq 'Absent') + { + # Retrieve the number of subkeys the registry key has + $registryKeySubKeyCount = Get-RegistryKeySubKeyCount -RegistryKey $registryKey + + # Check if the registry key has subkeys and the user does not want to forcibly remove the registry key + if ($registryKeySubKeyCount -gt 0 -and -not $Force) + { + New-InvalidOperationException -Message ($script:localizedData.CannotRemoveExistingRegistryKeyWithSubKeysWithoutForce -f $Key) + } + else + { + # Remove the registry key + Write-Verbose -Message ($script:localizedData.RemovingRegistryKey -f $Key) + $null = Remove-RegistryKey -RegistryKey $registryKey + } + } + } + } + + Write-Verbose -Message ($script:localizedData.SetTargetResourceEndMessage -f $Key) +} + +<# + .SYNOPSIS + Tests if the Registry resource with the given key is in the specified state. + + .PARAMETER Key + The path of the registry key to test the state of. + This path must include the registry hive. + + .PARAMETER ValueName + The name of the registry value to check for. + Specify this property as an empty string ('') to check the default value of the registry key. + + .PARAMETER Ensure + Specifies whether or not the registry key and value should exist. + + To test that they exist, set this property to "Present". + To test that they do not exist, set the property to "Absent". + The default value is "Present". + + .PARAMETER ValueData + The data the registry key value should have. + + .PARAMETER ValueType + The type of the value. + + The supported types are: + String (REG_SZ) + Binary (REG-BINARY) + Dword 32-bit (REG_DWORD) + Qword 64-bit (REG_QWORD) + Multi-string (REG_MULTI_SZ) + Expandable string (REG_EXPAND_SZ) + + .PARAMETER Hex + Not used in Test-TargetResource. + + .PARAMETER Force + Not used in Test-TargetResource. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Key, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [ValidateNotNull()] + [System.String] + $ValueName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNull()] + [System.String[]] + $ValueData = @(), + + [Parameter()] + [ValidateSet('String', 'Binary', 'DWord', 'QWord', 'MultiString', 'ExpandString')] + [System.String] + $ValueType = 'String', + + [Parameter()] + [System.Boolean] + $Hex = $false, + + [Parameter()] + [System.Boolean] + $Force = $false + ) + + Write-Verbose -Message ($script:localizedData.TestTargetResourceStartMessage -f $Key) + + $registryResourceInDesiredState = $false + + $getTargetResourceParameters = @{ + Key = $Key + ValueName = $ValueName + } + + if ($PSBoundParameters.ContainsKey('ValueType')) + { + $getTargetResourceParameters['ValueType'] = $ValueType + } + + if ($PSBoundParameters.ContainsKey('ValueData')) + { + $getTargetResourceParameters['ValueData'] = $ValueData + } + + $registryResource = Get-TargetResource @getTargetResourceParameters + + # Check if the user specified a value name to retrieve + $valueNameSpecified = (-not [System.String]::IsNullOrEmpty($ValueName)) -or $PSBoundParameters.ContainsKey('ValueType') -or $PSBoundParameters.ContainsKey('ValueData') + + if ($valueNameSpecified) + { + $valueDisplayName = Get-RegistryKeyValueDisplayName -RegistryKeyValueName $ValueName + + if ($registryResource.Ensure -eq 'Absent') + { + Write-Verbose -Message ($script:localizedData.RegistryKeyValueDoesNotExist -f $Key, $valueDisplayName) + $registryResourceInDesiredState = $Ensure -eq 'Absent' + } + else + { + Write-Verbose -Message ($script:localizedData.RegistryKeyValueExists -f $Key, $valueDisplayName) + + if ($Ensure -eq 'Absent') + { + $registryResourceInDesiredState = $false + } + elseif ($PSBoundParameters.ContainsKey('ValueType') -and $ValueType -ne $registryResource.ValueType) + { + Write-Verbose -Message ($script:localizedData.RegistryKeyValueTypeDoesNotMatch -f $valueDisplayName, $Key, $ValueType, $registryResource.ValueType) + + $registryResourceInDesiredState = $false + } + elseif ($PSBoundParameters.ContainsKey('ValueData')) + { + # Need to get the actual registry key value since Get-TargetResource returns + $registryKey = Get-RegistryKey -RegistryKeyPath $Key + $actualRegistryKeyValue = Get-RegistryKeyValue -RegistryKey $registryKey -RegistryKeyValueName $ValueName + + if (-not $PSBoundParameters.ContainsKey('ValueType') -and $null -ne $registryResource.ValueType) + { + $ValueType = $registryResource.ValueType + } + + # Convert the specified registry key value to the specified type + $expectedRegistryKeyValue = switch ($ValueType) + { + 'Binary' { ConvertTo-Binary -RegistryKeyValue $ValueData; break } + 'DWord' { ConvertTo-DWord -RegistryKeyValue $ValueData -Hex $Hex; break } + 'MultiString' { ConvertTo-MultiString -RegistryKeyValue $ValueData; break } + 'QWord' { ConvertTo-QWord -RegistryKeyValue $ValueData -Hex $Hex; break } + default { ConvertTo-String -RegistryKeyValue $ValueData; break } + } + + if (-not (Test-RegistryKeyValuesMatch -ExpectedRegistryKeyValue $expectedRegistryKeyValue -ActualRegistryKeyValue $actualRegistryKeyValue -RegistryKeyValueType $ValueType)) + { + Write-Verbose -Message ($script:localizedData.RegistryKeyValueDoesNotMatch -f $valueDisplayName, $Key, $ValueData, $registryResource.ValueData) + + $registryResourceInDesiredState = $false + } + else + { + $registryResourceInDesiredState = $true + } + } + else + { + $registryResourceInDesiredState = $true + } + } + } + else + { + if ($registryResource.Ensure -eq 'Present') + { + Write-Verbose -Message ($script:localizedData.RegistryKeyExists -f $Key) + $registryResourceInDesiredState = $Ensure -eq 'Present' + } + else + { + Write-Verbose -Message ($script:localizedData.RegistryKeyDoesNotExist -f $Key) + $registryResourceInDesiredState = $Ensure -eq 'Absent' + } + } + + Write-Verbose -Message ($script:localizedData.TestTargetResourceEndMessage -f $Key) + + return $registryResourceInDesiredState +} + +<# + .SYNOPSIS + Retrieves the root of the specified path. + + .PARAMETER Path + The path to retrieve the root of. +#> +function Get-PathRoot +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + if ($Path.Contains('\')) + { + $pathRoot = $Path.Split('\')[0] + } + else + { + $pathRoot = $Path + } + + return $pathRoot +} + +<# + .SYNOPSIS + Converts the specified registry drive root to its corresponding registry drive name. + + .PARAMETER RegistryDriveRoot + The registry drive root to convert. +#> +function ConvertTo-RegistryDriveName +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RegistryDriveRoot + ) + + $registryDriveName = $null + + if ($script:registryDriveRoots.ContainsValue($RegistryDriveRoot)) + { + foreach ($registryDriveRootsKey in $script:registryDriveRoots.Keys) + { + if ($script:registryDriveRoots[$registryDriveRootsKey] -ieq $RegistryDriveRoot) + { + $registryDriveName = $registryDriveRootsKey + break + } + } + } + + return $registryDriveName +} + +<# + .SYNOPSIS + Retrieves the name of the registry drive at the root of the the specified registry key path. + + .PARAMETER RegistryKeyPath + The registry key path to retrieve the registry drive name from. +#> +function Get-RegistryDriveName +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RegistryKeyPath + ) + + $registryKeyPathRoot = Get-PathRoot -Path $RegistryKeyPath + $registryKeyPathRoot = $registryKeyPathRoot.TrimEnd('\') + + if ($registryKeyPathRoot.Contains(':')) + { + $registryDriveName = $registryKeyPathRoot.TrimEnd(':') + + if (-not $script:registryDriveRoots.ContainsKey($registryDriveName)) + { + New-InvalidArgumentException -ArgumentName 'Key' -Message ($script:localizedData.InvalidRegistryDrive -f $registryDriveName) + } + } + else + { + $registryDriveName = ConvertTo-RegistryDriveName -RegistryDriveRoot $registryKeyPathRoot + + if ([System.String]::IsNullOrEmpty($registryDriveName)) + { + New-InvalidArgumentException -ArgumentName 'Key' -Message ($script:localizedData.InvalidRegistryDrive -f $registryKeyPathRoot) + } + } + + return $registryDriveName +} + +<# + .SYNOPSIS + Mounts the registry drive with the specified name. + + .PARAMETER RegistryKeyName + The name of the registry drive to mount. +#> +function Mount-RegistryDrive +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RegistryDriveName + ) + + $registryDriveInfo = Get-PSDrive -Name $RegistryDriveName -ErrorAction 'SilentlyContinue' + + if ($null -eq $registryDriveInfo) + { + $newPSDriveParameters = @{ + Name = $RegistryDriveName + Root = $script:registryDriveRoots[$RegistryDriveName] + PSProvider = 'Registry' + Scope = 'Script' + } + + $registryDriveInfo = New-PSDrive @newPSDriveParameters + } + + # Validate that the specified PSDrive is valid + if (($null -eq $registryDriveInfo) -or ($null -eq $registryDriveInfo.Provider) -or ($registryDriveInfo.Provider.Name -ine 'Registry')) + { + New-InvalidOperationException -Message ($script:localizedData.RegistryDriveCouldNotBeMounted -f $RegistryDriveName) + } +} + +<# + .SYNOPSIS + Opens the specified registry sub key under the specified registry parent key. + This is a wrapper function for unit testing. + + .PARAMETER ParentKey + The parent registry key which contains the sub key to open. + + .PARAMETER SubKey + The sub key to open. + + .PARAMETER WriteAccessAllowed + Specifies whether or not to open the sub key with permissions to write to it. +#> +function Open-RegistrySubKey +{ + [OutputType([Microsoft.Win32.RegistryKey])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $ParentKey, + + [Parameter(Mandatory = $true)] + [System.String] + [AllowEmptyString()] + $SubKey, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $WriteAccessAllowed + ) + + return $ParentKey.OpenSubKey($SubKey, $WriteAccessAllowed) +} + +<# + .SYNOPSIS + Opens and retrieves the registry key at the specified path. + + .PARAMETER RegistryKeyPath + The path to the registry key to open. + The path must include the registry drive. + + .PARAMETER WriteAccessAllowed + Specifies whether or not to open the key with permissions to write to it. + + .NOTES + This method is used instead of Get-Item so that there is no ambiguity between + forward slashes as path separators vs literal characters in a key name + (which is valid in the registry). + +#> +function Get-RegistryKey +{ + [OutputType([Microsoft.Win32.RegistryKey])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RegistryKeyPath, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $WriteAccessAllowed + ) + + # Parse the registry drive from the specified registry key path + $registryDriveName = Get-RegistryDriveName -RegistryKeyPath $RegistryKeyPath + + # Mount the registry drive if needed + Mount-RegistryDrive -RegistryDriveName $registryDriveName + + # Retrieve the registry drive key + $registryDriveKey = Get-Item -LiteralPath ($registryDriveName + ':') + + # Parse the registry drive subkey from the specified registry key path + $indexOfBackSlashInPath = $RegistryKeyPath.IndexOf('\') + if ($indexOfBackSlashInPath -ge 0 -and $indexOfBackSlashInPath -lt ($RegistryKeyPath.Length - 1)) + { + $registryDriveSubKey = $RegistryKeyPath.Substring($RegistryKeyPath.IndexOf('\') + 1) + } + else + { + $registryDriveSubKey = '' + } + + # Open the registry drive subkey + $registryKey = Open-RegistrySubKey -ParentKey $registryDriveKey -SubKey $registryDriveSubKey -WriteAccessAllowed:$WriteAccessAllowed + + # Return the opened registry key + return $registryKey +} + +<# + .SYNOPSIS + Retrieves the display name of the default registry key value if needed. + + .PARAMETER RegistryKeyValueName + The name of the registry key value to retrieve the display name of. +#> +function Get-RegistryKeyValueDisplayName +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [AllowNull()] + [AllowEmptyString()] + [System.String] + $RegistryKeyValueName + ) + + $registryKeyValueDisplayName = $RegistryKeyValueName + + if ([System.String]::IsNullOrEmpty($RegistryKeyValueName)) + { + $registryKeyValueDisplayName = $script:localizedData.DefaultValueDisplayName + } + + return $registryKeyValueDisplayName +} + +<# + .SYNOPSIS + Retrieves the registry key value with the specified name from the specified registry key. + This is a wrapper function for unit testing. + + .PARAMETER RegistryKey + The registry key to retrieve the value from. + + .PARAMETER RegistryKeyValueName + The name of the registry key value to retrieve. +#> +function Get-RegistryKeyValue +{ + [OutputType([System.Object[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $RegistryKey, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [AllowEmptyString()] + [System.String] + $RegistryKeyValueName + ) + + $registryValueOptions = [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames + $registryKeyValue = $RegistryKey.GetValue($RegistryKeyValueName, $null, $registryValueOptions) + return ,$registryKeyValue +} + +<# + .SYNOPSIS + Retrieves the type of the registry key value with the specified name from the the specified + registry key. + This is a wrapper function for unit testing. + + .PARAMETER RegistryKey + The registry key to retrieve the type of the value from. + + .PARAMETER RegistryKeyValueName + The name of the registry key value to retrieve the type of. +#> +function Get-RegistryKeyValueType +{ + [OutputType([System.Type])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $RegistryKey, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [AllowEmptyString()] + [System.String] + $RegistryKeyValueName + ) + + return $RegistryKey.GetValueKind($RegistryKeyValueName) +} + +<# + .SYNOPSIS + Converts the specified byte array to a hex string. + + .PARAMETER ByteArray + The byte array to convert. +#> +function Convert-ByteArrayToHexString +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [AllowEmptyCollection()] + [System.Object[]] + $ByteArray + ) + + $hexString = '' + + foreach ($byte in $ByteArray) + { + $hexString += ('{0:x2}' -f $byte) + } + + return $hexString +} + +<# + .SYNOPSIS + Converts the specified registry key value to a readable string. + + .PARAMETER RegistryKeyValue + The registry key value to convert. + + .PARAMETER RegistryKeyValueType + The type of the registry key value to convert. +#> +function ConvertTo-ReadableString +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [AllowNull()] + [AllowEmptyCollection()] + [System.Object[]] + $RegistryKeyValue, + + [Parameter(Mandatory = $true)] + [ValidateSet('String', 'Binary', 'DWord', 'QWord', 'MultiString', 'ExpandString')] + [System.String] + $RegistryKeyValueType + ) + + $registryKeyValueAsString = [System.String]::Empty + + if ($null -ne $RegistryKeyValue) + { + # For Binary type data, convert the received bytes back to a readable hex-string + if ($RegistryKeyValueType -eq 'Binary') + { + $RegistryKeyValue = Convert-ByteArrayToHexString -ByteArray $RegistryKeyValue + } + + if ($RegistryKeyValueType -ne 'MultiString') + { + $RegistryKeyValue = [System.String[]] @() + $RegistryKeyValue + } + + if ($RegistryKeyValue.Count -eq 1 -and -not [System.String]::IsNullOrEmpty($RegistryKeyValue[0])) + { + $registryKeyValueAsString = $RegistryKeyValue[0].ToString() + } + elseif ($RegistryKeyValue.Count -gt 1) + { + $registryKeyValueAsString = "($($RegistryKeyValue -join ', '))" + } + } + + return $registryKeyValueAsString +} + +<# + .SYNOPSIS + Creates a new subkey with the specified name under the specified registry key. + This is a wrapper function for unit testing. + + .PARAMETER ParentRegistryKey + The parent registry key to create the new subkey under. + + .PARAMETER SubKeyName + The name of the new subkey to create. +#> +function New-RegistrySubKey +{ + [OutputType([Microsoft.Win32.RegistryKey])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $ParentRegistryKey, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SubKeyName + ) + + return $ParentRegistryKey.CreateSubKey($SubKeyName) +} + +<# + .SYNOPSIS + Creates a new registry key at the specified registry key path. + + .PARAMETER RegistryKeyPath + The path at which to create the registry key. + This path must include the registry drive. +#> +function New-RegistryKey +{ + [OutputType([Microsoft.Win32.RegistryKey])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RegistryKeyPath + ) + + # registry key names can contain forward slashes, so we can't use Split-Path here (it will split on /) + $lastSep = $RegistryKeyPath.LastIndexOf('\') + $parentRegistryKeyPath = $RegistryKeyPath.Substring(0, $lastSep) + $newRegistryKeyName = $RegistryKeyPath.Substring($lastSep + 1) + + $parentRegistryKey = Get-RegistryKey -RegistryKeyPath $parentRegistryKeyPath -WriteAccessAllowed + + if ($null -eq $parentRegistryKey) + { + # If the parent registry key does not exist, create it + $parentRegistryKey = New-RegistryKey -RegistryKeyPath $parentRegistryKeyPath + } + + $newRegistryKey = New-RegistrySubKey -ParentRegistryKey $parentRegistryKey -SubKeyName $newRegistryKeyName + + return $newRegistryKey +} + +<# + .SYNOPSIS + Retrieves the name of the specified registry key. + This is a wrapper function for unit testing. + + .PARAMETER RegistryKey + The registry key to retrieve the name of. +#> +function Get-RegistryKeyName +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $RegistryKey + ) + + return $RegistryKey.Name +} + +<# + .SYNOPSIS + Converts the specified registry key value to a byte array for the Binary registry type. + + .PARAMETER RegistryKeyValue + The registry key value to convert. +#> +function ConvertTo-Binary +{ + [OutputType([System.Byte[]])] + [CmdletBinding()] + param + ( + [Parameter()] + [AllowNull()] + [AllowEmptyCollection()] + [System.String[]] + $RegistryKeyValue + ) + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Count -gt 1)) + { + New-InvalidArgumentException -ArgumentName 'ValueData' -Message ($script:localizedData.ArrayNotAllowedForExpectedType -f 'Binary') + } + + $binaryRegistryKeyValue = [System.Byte[]] @() + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Count -eq 1) -and (-not [System.String]::IsNullOrEmpty($RegistryKeyValue[0]))) + { + $singleRegistryKeyValue = $RegistryKeyValue[0] + + if ($singleRegistryKeyValue.StartsWith('0x')) + { + $singleRegistryKeyValue = $singleRegistryKeyValue.Substring('0x'.Length) + } + + if (($singleRegistryKeyValue.Length % 2) -ne 0) + { + $singleRegistryKeyValue = $singleRegistryKeyValue.PadLeft($singleRegistryKeyValue.Length + 1, '0') + } + + try + { + for ($singleRegistryKeyValueIndex = 0 ; $singleRegistryKeyValueIndex -lt ($singleRegistryKeyValue.Length - 1) ; $singleRegistryKeyValueIndex = $singleRegistryKeyValueIndex + 2) + { + $binaryRegistryKeyValue += [System.Byte]::Parse($singleRegistryKeyValue.Substring($singleRegistryKeyValueIndex, 2), 'HexNumber') + } + } + catch + { + New-InvalidArgumentException -ArgumentName 'ValueData' -Message ($script:localizedData.BinaryDataNotInHexFormat -f $singleRegistryKeyValue) + } + } + + return $binaryRegistryKeyValue +} + +<# + .SYNOPSIS + Converts the specified registry key value to an Int32 for the DWord registry type. + + .PARAMETER RegistryKeyValue + The registry key value to convert. +#> +function ConvertTo-DWord +{ + [OutputType([System.Int32])] + [CmdletBinding()] + param + ( + [Parameter()] + [AllowNull()] + [AllowEmptyCollection()] + [System.String[]] + $RegistryKeyValue, + + [Parameter()] + [System.Boolean] + $Hex = $false + ) + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Count -gt 1)) + { + New-InvalidArgumentException -ArgumentName 'ValueData' -Message ($script:localizedData.ArrayNotAllowedForExpectedType -f 'Dword') + } + + $dwordRegistryKeyValue = [System.Int32] 0 + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Count -eq 1) -and (-not [System.String]::IsNullOrEmpty($RegistryKeyValue[0]))) + { + $singleRegistryKeyValue = $RegistryKeyValue[0] + + if ($Hex) + { + if ($singleRegistryKeyValue.StartsWith('0x')) + { + $singleRegistryKeyValue = $singleRegistryKeyValue.Substring('0x'.Length) + } + + $currentCultureInfo = [System.Globalization.CultureInfo]::CurrentCulture + $referenceValue = $null + + if ([System.Int32]::TryParse($singleRegistryKeyValue, 'HexNumber', $currentCultureInfo, [ref] $referenceValue)) + { + $dwordRegistryKeyValue = $referenceValue + } + else + { + New-InvalidArgumentException -ArgumentName 'ValueData' -Message ($script:localizedData.DWordDataNotInHexFormat -f $singleRegistryKeyValue) + } + } + else + { + $dwordRegistryKeyValue = [System.Int32]::Parse($singleRegistryKeyValue) + } + } + + return $dwordRegistryKeyValue +} + +<# + .SYNOPSIS + Converts the specified registry key value to a string array for the MultiString registry type. + + .PARAMETER RegistryKeyValue + The registry key value to convert. +#> +function ConvertTo-MultiString +{ + [OutputType([System.String[]])] + [CmdletBinding()] + param + ( + [Parameter()] + [AllowNull()] + [AllowEmptyCollection()] + [System.String[]] + $RegistryKeyValue + ) + + $multiStringRegistryKeyValue = [System.String[]] @() + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Length -gt 0)) + { + $multiStringRegistryKeyValue = [System.String[]] $RegistryKeyValue + } + + return $multiStringRegistryKeyValue +} + +<# + .SYNOPSIS + Converts the specified registry key value to an Int64 for the QWord registry type. + + .PARAMETER RegistryKeyValue + The registry key value to convert. +#> +function ConvertTo-QWord +{ + [OutputType([System.Int64])] + [CmdletBinding()] + param + ( + [Parameter()] + [AllowNull()] + [AllowEmptyCollection()] + [System.String[]] + $RegistryKeyValue, + + [Parameter()] + [System.Boolean] + $Hex = $false + ) + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Count -gt 1)) + { + New-InvalidArgumentException -ArgumentName 'ValueData' -Message ($script:localizedData.ArrayNotAllowedForExpectedType -f 'Qword') + } + + $qwordRegistryKeyValue = [System.Int64] 0 + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Count -eq 1) -and (-not [System.String]::IsNullOrEmpty($RegistryKeyValue[0]))) + { + $singleRegistryKeyValue = $RegistryKeyValue[0] + + if ($Hex) + { + if ($singleRegistryKeyValue.StartsWith('0x')) + { + $singleRegistryKeyValue = $singleRegistryKeyValue.Substring('0x'.Length) + } + + $currentCultureInfo = [System.Globalization.CultureInfo]::CurrentCulture + $referenceValue = $null + + if ([System.Int64]::TryParse($singleRegistryKeyValue, 'HexNumber', $currentCultureInfo, [ref] $referenceValue)) + { + $qwordRegistryKeyValue = $referenceValue + } + else + { + New-InvalidArgumentException -ArgumentName 'ValueData' -Message ($script:localizedData.QWordDataNotInHexFormat -f $singleRegistryKeyValue) + } + } + else + { + $qwordRegistryKeyValue = [System.Int64]::Parse($singleRegistryKeyValue) + } + } + + return $qwordRegistryKeyValue +} + +<# + .SYNOPSIS + Converts the specified registry key value to a string for the String or ExpandString registry types. + + .PARAMETER RegistryKeyValue + The registry key value to convert. +#> +function ConvertTo-String +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter()] + [AllowNull()] + [AllowEmptyCollection()] + [System.String[]] + $RegistryKeyValue + ) + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Count -gt 1)) + { + New-InvalidArgumentException -ArgumentName 'ValueData' -Message ($script:localizedData.ArrayNotAllowedForExpectedType -f 'String or ExpandString') + } + + $registryKeyValueAsString = [System.String]::Empty + + if (($null -ne $RegistryKeyValue) -and ($RegistryKeyValue.Count -eq 1)) + { + $registryKeyValueAsString = [System.String] $RegistryKeyValue[0] + } + + return $registryKeyValueAsString +} + +<# + .SYNOPSIS + Sets the specified registry key value with the specified name to the specified value. + This is a wrapper function for unit testing. + + .PARAMETER RegistryKeyName + The name of the registry key that the value to set is under. + + .PARAMETER RegistryKeyValueName + The name of the registry key value to set. + + .PARAMETER RegistryKeyValue + The new value to set the registry key value to. + + .PARAMETER RegistryKeyValueType + The type of the new value to set the registry key value to. +#> +function Set-RegistryKeyValue +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $RegistryKeyName, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [AllowEmptyString()] + [System.String] + $RegistryKeyValueName, + + [Parameter(Mandatory = $true)] + [AllowNull()] + [System.Object] + $RegistryKeyValue, + + [Parameter(Mandatory = $true)] + [ValidateSet('String', 'Binary', 'DWord', 'QWord', 'MultiString', 'ExpandString')] + [System.String] + $ValueType + ) + + if ($ValueType -eq 'Binary') + { + $RegistryKeyValue = [System.Byte[]] $RegistryKeyValue + } + elseif ($ValueType -eq 'MultiString') + { + $RegistryKeyValue = [System.String[]] $RegistryKeyValue + } + + $null = [Microsoft.Win32.Registry]::SetValue($RegistryKeyName, $RegistryKeyValueName, $RegistryKeyValue, $ValueType) +} + +<# + .SYNOPSIS + Tests if the actual registry key value matches the expected registry key value. + + .PARAMETER ExpectedRegistryKeyValue + The expected registry key value to test against. + + .PARAMETER ActualRegistryKeyValue + The actual registry key value to test. + + .PARAMETER RegistryKeyValueType + The type of the registry key values. +#> +function Test-RegistryKeyValuesMatch +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [AllowNull()] + [System.Object] + $ExpectedRegistryKeyValue, + + [Parameter(Mandatory = $true)] + [AllowNull()] + [System.Object] + $ActualRegistryKeyValue, + + [Parameter(Mandatory = $true)] + [ValidateSet('String', 'Binary', 'DWord', 'QWord', 'MultiString', 'ExpandString')] + [System.String] + $RegistryKeyValueType + ) + + $registryKeyValuesMatch = $true + + if ($RegistryKeyValueType -eq 'Multistring' -or $RegistryKeyValueType -eq 'Binary') + { + if ($null -eq $ExpectedRegistryKeyValue) + { + $ExpectedRegistryKeyValue = @() + } + + if ($null -eq $ActualRegistryKeyValue) + { + $ActualRegistryKeyValue = @() + } + + $registryKeyValuesMatch = $null -eq (Compare-Object -ReferenceObject $ExpectedRegistryKeyValue -DifferenceObject $ActualRegistryKeyValue) + } + else + { + if ($null -eq $ExpectedRegistryKeyValue) + { + $ExpectedRegistryKeyValue = '' + } + + if ($null -eq $ActualRegistryKeyValue) + { + $ActualRegistryKeyValue = '' + } + + $registryKeyValuesMatch = $ExpectedRegistryKeyValue -ieq $ActualRegistryKeyValue + } + + return $registryKeyValuesMatch +} + +<# + .SYNOPSIS + Removes the specified registry key and child subkeys recursively. + + .PARAMETER RegistryKey + The registry key to remove. +#> +function Remove-RegistryKey +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $RegistryKey + ) + + $parentKeyName = Split-Path -Path $RegistryKey.Name -Parent + $targetKeyName = Split-Path -Path $RegistryKey.Name -Leaf + + $parentRegistryKey = Get-RegistryKey -RegistryKeyPath $parentKeyName -WriteAccessAllowed + + $null = $parentRegistryKey.DeleteSubKeyTree($targetKeyName) +} + +<# + .SYNOPSIS + Removes the specified value of the specified registry key. + This is a wrapper function for unit testing. + + .PARAMETER RegistryKey + The registry key to remove the default value of. +#> +function Remove-RegistryKeyValue +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $RegistryKey, + + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [AllowEmptyString()] + [System.String] + $RegistryKeyValueName + ) + + $null = $RegistryKey.DeleteValue($RegistryKeyValueName) +} + +<# + .SYNOPSIS + Removes the default value of the specified registry key. + This is a wrapper function for unit testing. + + .PARAMETER RegistryKey + The registry key to remove the default value of. +#> +function Remove-DefaultRegistryKeyValue +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $RegistryKey + ) + + $null = $RegistryKey.DeleteValue('') +} + +<# + .SYNOPSIS + Retrieves the number of subkeys under the specified registry key. + This is a wrapper function for unit testing. + + .PARAMETER RegistryKey + The registry key to retrieve the subkeys of. +#> +function Get-RegistryKeySubKeyCount +{ + [OutputType([System.Int32])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $RegistryKey + ) + + return $RegistryKey.SubKeyCount +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/DSC_xRegistryResource.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/DSC_xRegistryResource.schema.mof new file mode 100644 index 0000000..be99b6f --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/DSC_xRegistryResource.schema.mof @@ -0,0 +1,11 @@ +[ClassVersion("1.0.0"), FriendlyName("xRegistry")] +class DSC_xRegistryResource : OMI_BaseResource +{ + [Key, Description("The path of the registry key to add, modify, or remove. This path must include the registry hive/drive.")] String Key; + [Key, Description("The name of the registry value. To add or remove a registry key, specify this property as an empty string without specifying ValueType or ValueData. To modify or remove the default value of a registry key, specify this property as an empty string while also specifying ValueType or ValueData.")] String ValueName; + [Write, Description("The data the specified registry key value should have as a string or an array of strings (MultiString only).")] String ValueData[]; + [Write, Description("The type the specified registry key value should have."), ValueMap{"String", "Binary", "DWord", "QWord", "MultiString", "ExpandString"},Values{"String", "Binary", "DWord", "QWord", "MultiString", "ExpandString"}] String ValueType; + [Write, Description("Specifies whether or not the registry key or value should exist. To add or modify a registry key or value, set this property to Present. To remove a registry key or value, set the property to Absent."), ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [Write, Description("Specifies whether or not the specified DWord or QWord registry key data is provided in a hexadecimal format. Not valid for types other than DWord and QWord. The default value is $false.")] Boolean Hex; + [Write, Description("Specifies whether or not to overwrite the specified registry key value if it already has a value or whether or not to delete a registry key that has subkeys. The default value is $false.")] Boolean Force; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/en-US/DSC_xRegistryResource.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/en-US/DSC_xRegistryResource.schema.mfl new file mode 100644 index 0000000..6380f55 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/en-US/DSC_xRegistryResource.schema.mfl @@ -0,0 +1,11 @@ +[Description("Provides a mechanism to manage registry keys and values on a target node.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xRegistryResource : OMI_BaseResource +{ + [Key,Description("The path of the registry key to add, modify, or remove. This path must include the registry hive/drive.") : Amended] String Key; + [Key,Description("The name of the registry value. To add or remove a registry key, specify this property as an empty string without specifying ValueType or ValueData. To modify or remove the default value of a registry key, specify this property as an empty string while also specifying ValueType or ValueData.") : Amended] String ValueName; + [Description("The data the specified registry key value should have as a string or an array of strings (MultiString only).") : Amended] String ValueData[]; + [Description("The type the specified registry key value should have.") : Amended] String ValueType; + [Description("Specifies whether or not the registry key or value should exist. To add or modify a registry key or value, set this property to Present. To remove a registry key or value, set the property to Absent.") : Amended] String Ensure; + [Description("Specifies whether or not the specified DWord or QWord registry key data is provided in a hexadecimal format. Not valid for types other than DWord and QWord. The default value is $false.") : Amended] Boolean Hex; + [Description("Specifies whether or not to overwrite the specified registry key value if it already has a value or whether or not to delete a registry key that has subkeys. The default value is $false.") : Amended] Boolean Force; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/en-US/DSC_xRegistryResource.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/en-US/DSC_xRegistryResource.strings.psd1 new file mode 100644 index 0000000..411f650 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRegistryResource/en-US/DSC_xRegistryResource.strings.psd1 @@ -0,0 +1,35 @@ +# Localized resources for DSC_xRegistryResource + +ConvertFrom-StringData @' + DefaultValueDisplayName = (Default) + + GetTargetResourceStartMessage = Get-TargetResource is starting for Registry resource with Key {0} + GetTargetResourceEndMessage = Get-TargetResource has finished for Registry resource with Key {0} + RegistryKeyDoesNotExist = The registry key at path {0} does not exist. + RegistryKeyExists = The registry key at path {0} exists. + RegistryKeyValueDoesNotExist = The registry key at path {0} does not have a value named {1}. + RegistryKeyValueExists = The registry key at path {0} has a value named {1}. + + SetTargetResourceStartMessage = Set-TargetResource is starting for Registry resource with Key {0} + SetTargetResourceEndMessage = Set-TargetResource has finished for Registry resource with Key {0} + CreatingRegistryKey = Creating registry key at path {0}... + SettingRegistryKeyValue = Setting the value {0} under the registry key at path {1}... + OverwritingRegistryKeyValue = Overwriting the value {0} under the registry key at path {1}... + RemovingRegistryKey = Removing registry key at path {0}... + RegistryKeyValueAlreadySet = The value {0} under the registry key at path {1} has already been set to the specified value. + RemovingRegistryKeyValue = Removing the value {0} from the registry key at path {1}... + + TestTargetResourceStartMessage = Test-TargetResource is starting for Registry resource with Key {0} + TestTargetResourceEndMessage = Test-TargetResource has finished for Registry resource with Key {0} + RegistryKeyValueTypeDoesNotMatch = The type of the value {0} under the registry key at path {1} does not match the expected type. Expected {2} but was {3}. + RegistryKeyValueDoesNotMatch = The value {0} under the registry key at path {1} does not match the expected value. Expected {2} but was {3}. + + CannotRemoveExistingRegistryKeyWithSubKeysWithoutForce = The registry key at path {0} has subkeys. To remove this registry key please specifiy the Force parameter as $true. + CannotOverwriteExistingRegistryKeyValueWithoutForce = The registry key at path {0} already has a value with the name {1}. To overwrite this registry key value please specifiy the Force parameter as $true. + ArrayNotAllowedForExpectedType = The specified value data has been declared as a string array, but the registry key type {0} cannot be converted from an array. Please declare the value data as only one string or use the registry type MultiString. + DWordDataNotInHexFormat = The specified registry key value data {0} is not in the correct hex format to parse as an Int32 (dword). + QWordDataNotInHexFormat = The specified registry key value data {0} is not in the correct hex format to parse as an Int64 (qword). + BinaryDataNotInHexFormat = The specified registry key value data {0} is not in the correct hex format to parse as a Byte array (Binary). + InvalidRegistryDrive = The registry drive {0} is invalid. Please update the Key parameter to include a valid registry drive. + RegistryDriveCouldNotBeMounted = The registry drive with the abbreviation {0} could not be mounted. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/DSC_xRemoteFile.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/DSC_xRemoteFile.psm1 new file mode 100644 index 0000000..133a8b7 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/DSC_xRemoteFile.psm1 @@ -0,0 +1,851 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xRemoteFile' + +# Path where cache will be stored. It's cleared whenever LCM gets new configuration. +$script:cacheLocation = "$env:ProgramData\Microsoft\Windows\PowerShell\Configuration\BuiltinProvCache\DSC_xRemoteFile" + +<# + .SYNOPSIS + The Get-TargetResource function is used to fetch the status of file + specified in DestinationPath on the target machine. + + .PARAMETER DestinationPath + Path under which downloaded or copied file should be accessible after + operation. + + .PARAMETER Uri + Uri of a file which should be copied or downloaded. This parameter + supports HTTP and HTTPS values. + + .PARAMETER ChecksumType + The algorithm used to calculate the checksum of the file. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Uri, + + [Parameter()] + [System.String] + [ValidateSet('None', 'SHA1', 'SHA256', 'SHA384', 'SHA512', 'MACTripleDES', 'MD5', 'RIPEMD160')] + $ChecksumType = 'None' + + ) + + # Check whether DestinationPath is existing file + $ensure = 'Absent' + $pathItemType = Get-PathItemType -Path $DestinationPath + $checksumValue = '' + + switch ($pathItemType) + { + 'File' + { + Write-Verbose -Message ($script:localizedData.DestinationPathIsExistingFile -f $DestinationPath) + $ensure = 'Present' + + if ($ChecksumType -ine 'None') + { + $getFileHash = Get-FileHash -Path $DestinationPath -Algorithm $ChecksumType + $checksumValue = $getFileHash.Hash + } + } + + 'Directory' + { + Write-Verbose -Message ($script:localizedData.DestinationPathIsExistingPath -f $DestinationPath) + + # If it's existing directory, let's check whether expectedDestinationPath exists + $uriFileName = Split-Path -Path $Uri -Leaf + $expectedDestinationPath = Join-Path -Path $DestinationPath -ChildPath $uriFileName + + if (Test-Path -Path $expectedDestinationPath) + { + Write-Verbose -Message ($script:localizedData.FileExistsInDestinationPath -f $uriFileName) + $ensure = 'Present' + + if ($ChecksumType -ine 'None') + { + $getFileHash = Get-FileHash -Path $expectedDestinationPath -Algorithm $ChecksumType + $checksumValue = $getFileHash.Hash + } + } + } + + 'Other' + { + Write-Verbose -Message ($script:localizedData.DestinationPathUnknownType -f $DestinationPath, $pathItemType) + } + + 'NotExists' + { + Write-Verbose -Message ($script:localizedData.DestinationPathDoesNotExist -f $DestinationPath) + } + } + + return @{ + DestinationPath = $DestinationPath + Uri = $Uri + Ensure = $ensure + Checksum = $checksumValue + } +} + +<# + .SYNOPSIS + The Set-TargetResource function is used to download file found under + Uri location to DestinationPath. Additional parameters can be specified + to configure web request. + + .PARAMETER DestinationPath + Path under which downloaded or copied file should be accessible after + operation. + + .PARAMETER Uri + Uri of a file which should be copied or downloaded. This parameter + supports HTTP and HTTPS values. + + .PARAMETER UserAgent + User agent for the web request. + + .PARAMETER Headers + Headers of the web request. + + .PARAMETER Credential + Specifies a user account that has permission to send the request. + + .PARAMETER MatchSource + A boolean value to indicate whether the remote file should be re-downloaded + if the file in the DestinationPath was modified locally. The default value + is true. + + .PARAMETER TimeoutSec + Specifies how long the request can be pending before it times out. + + .PARAMETER Proxy + Uses a proxy server for the request, rather than connecting directly + to the Internet resource. Should be the URI of a network proxy server + (e.g 'http://10.20.30.1'). + + .PARAMETER ProxyCredential + Specifies a user account that has permission to use the proxy server that + is specified by the Proxy parameter. + + .PARAMETER Checksum + Specifies the expected checksum value of downloaded file. + + .PARAMETER ChecksumType + The algorithm used to calculate the checksum of the file. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Uri, + + [Parameter()] + [System.String] + $UserAgent, + + [Parameter()] + [Microsoft.Management.Infrastructure.CimInstance[]] + $Headers, + + [Parameter()] + [System.Management.Automation.Credential()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.Boolean] + $MatchSource = $true, + + [Parameter()] + [System.Uint32] + $TimeoutSec, + + [Parameter()] + [System.String] + $Proxy, + + [Parameter()] + [System.Management.Automation.Credential()] + [System.Management.Automation.PSCredential] + $ProxyCredential, + + [Parameter()] + [System.String] + [ValidateSet('None', 'SHA1', 'SHA256', 'SHA384', 'SHA512', 'MACTripleDES', 'MD5', 'RIPEMD160')] + $ChecksumType = 'None', + + [Parameter()] + [System.String] + $Checksum + ) + + # Validate Uri + if (-not (Test-UriScheme -Uri $Uri -Scheme 'http|https|file')) + { + $errorMessage = $script:localizedData.InvalidWebUriError -f $Uri + New-InvalidDataException ` + -ErrorId 'UriValidationFailure' ` + -ErrorMessage $errorMessage + } + + # Validate DestinationPath scheme + if (-not (Test-UriScheme -Uri $DestinationPath -Scheme 'file')) + { + $errorMessage = $script:localizedData.InvalidDestinationPathSchemeError -f $DestinationPath + New-InvalidDataException ` + -ErrorId 'DestinationPathSchemeValidationFailure' ` + -ErrorMessage $errorMessage + } + + # Validate DestinationPath is not UNC path + if ($DestinationPath.StartsWith('\\')) + { + $errorMessage = $script:localizedData.DestinationPathIsUncError -f $DestinationPath + New-InvalidDataException ` + -ErrorId 'DestinationPathIsUncFailure' ` + -ErrorMessage $errorMessage + } + + # Validate DestinationPath does not contain invalid characters + @('*', '?', '"', '<', '>', '|') | ForEach-Object -Process { + if ($DestinationPath.Contains($_)) + { + $errorMessage = $script:localizedData.DestinationPathHasInvalidCharactersError -f $DestinationPath + New-InvalidDataException ` + -ErrorId 'DestinationPathHasInvalidCharactersError' ` + -ErrorMessage $errorMessage + } + } + + # Validate DestinationPath does not end with / or \ (Invoke-WebRequest requirement) + if ($DestinationPath.EndsWith('/') -or $DestinationPath.EndsWith('\')) + { + $errorMessage = $script:localizedData.DestinationPathEndsWithInvalidCharacterError -f $DestinationPath + New-InvalidDataException ` + -ErrorId 'DestinationPathEndsWithInvalidCharacterError' ` + -ErrorMessage $errorMessage + } + + # Check whether DestinationPath's parent directory exists. Create if it doesn't. + $destinationPathParent = Split-Path -Path $DestinationPath -Parent + + if (-not (Test-Path $destinationPathParent)) + { + $null = New-Item -ItemType Directory -Path $destinationPathParent -Force + } + + # Check whether DestinationPath's leaf is an existing folder + $uriFileName = Split-Path -Path $Uri -Leaf + + if (Test-Path $DestinationPath -PathType Container) + { + $DestinationPath = Join-Path -Path $DestinationPath -ChildPath $uriFileName + } + + # Remove ChecksumType and Checksum from parameters as they are not parameters of Invoke-WebRequest. + $null = $PSBoundParameters.Remove('ChecksumType') + $null = $PSBoundParameters.Remove('Checksum') + + # Remove DestinationPath and MatchSource from parameters as they are not parameters of Invoke-WebRequest + $null = $PSBoundParameters.Remove('DestinationPath') + $null = $PSBoundParameters.Remove('MatchSource') + + # Convert headers to hashtable + $null = $PSBoundParameters.Remove('Headers') + $headersHashtable = $null + + if ($null -ne $Headers) + { + $headersHashtable = Convert-KeyValuePairArrayToHashtable -Array $Headers + } + + # Invoke web request + try + { + $currentProgressPreference = $ProgressPreference + $ProgressPreference = 'SilentlyContinue' + + Write-Verbose -Message ($script:localizedData.DownloadingURI -f $DestinationPath, $URI) + $count = 0 + $success = $false + + do + { + try + { + $count++ + Invoke-WebRequest ` + @PSBoundParameters ` + -Headers $headersHashtable ` + -OutFile $DestinationPath + $success = $true + } + catch [System.Exception] + { + Write-Verbose -Message ($script:localizedData.DownloadingFailedRetry -f $URI, $count, $_.Exception.Message) + + if ($count -gt 5) + { + # Inside catch variable $_ is not the exception itself, but a System.Management.Automation.ErrorRecord that contains the actual Exception + throw $_.Exception + } + + Start-Sleep -Seconds 5 + } + } + while ($success -eq $false) + } + catch [System.OutOfMemoryException] + { + $errorMessage = $script:localizedData.DownloadOutOfMemoryException -f $_ + New-InvalidDataException ` + -ErrorId 'SystemOutOfMemoryException' ` + -ErrorMessage $errorMessage + } + catch [System.Exception] + { + $errorMessage = $script:localizedData.DownloadException -f $_ + New-InvalidDataException ` + -ErrorId 'SystemException' ` + -ErrorMessage $errorMessage + } + finally + { + $ProgressPreference = $currentProgressPreference + } + + # Check checksum + if ($ChecksumType -ine 'None' -and -not [String]::IsNullOrEmpty($Checksum)) + { + $fileHashSplat = @{ + Path = $DestinationPath + Algorithm = $ChecksumType + } + + $getFileHash = Get-FileHash @fileHashSplat + $fileHash = $getFileHash.Hash + + if ($fileHash -ine $Checksum) + { + # the checksum failed + $errorMessage = $script:localizedData.ChecksumDoesNotMatch -f $Checksum, $fileHash + New-InvalidDataException ` + -ErrorId 'ChecksumDoesNotMatch' ` + -ErrorMessage $errorMessage + } + } + + # Update cache + if (Test-Path -Path $DestinationPath) + { + $downloadedFile = Get-Item -Path $DestinationPath + $lastWriteTime = $downloadedFile.LastWriteTimeUtc + $filesize = $downloadedFile.Length + $inputObject = @{ } + $inputObject['LastWriteTime'] = $lastWriteTime + $inputObject['FileSize'] = $filesize + Update-Cache -DestinationPath $DestinationPath -Uri $Uri -InputObject $inputObject + } +} + +<# + .SYNOPSIS + The Test-TargetResource function is used to validate if the DestinationPath + exists on the machine. + + .PARAMETER DestinationPath + Path under which downloaded or copied file should be accessible after + operation. + + .PARAMETER Uri + Uri of a file which should be copied or downloaded. This parameter + supports HTTP and HTTPS values. + + .PARAMETER UserAgent + User agent for the web request. + + .PARAMETER Headers + Headers of the web request. + + .PARAMETER Credential + Specifies a user account that has permission to send the request. + + .PARAMETER MatchSource + A boolean value to indicate whether the remote file should be re-downloaded + if the file in the DestinationPath was modified locally. The default value + is true. + + .PARAMETER TimeoutSec + Specifies how long the request can be pending before it times out. + + .PARAMETER Proxy + Uses a proxy server for the request, rather than connecting directly + to the Internet resource. Should be the URI of a network proxy server + (e.g 'http://10.20.30.1'). + + .PARAMETER ProxyCredential + Specifies a user account that has permission to use the proxy server that + is specified by the Proxy parameter. + + .PARAMETER Checksum + Specifies the expected checksum value of downloaded file. + + .PARAMETER ChecksumType + The algorithm used to calculate the checksum of the file. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Uri, + + [Parameter()] + [System.String] + $UserAgent, + + [Parameter()] + [Microsoft.Management.Infrastructure.CimInstance[]] + $Headers, + + [Parameter()] + [System.Management.Automation.Credential()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.Boolean] + $MatchSource = $true, + + [Parameter()] + [System.Uint32] + $TimeoutSec, + + [Parameter()] + [System.String] + $Proxy, + + [Parameter()] + [System.Management.Automation.Credential()] + [System.Management.Automation.PSCredential] + $ProxyCredential, + + [Parameter()] + [System.String] + [ValidateSet('None', 'SHA1', 'SHA256', 'SHA384', 'SHA512', 'MACTripleDES', 'MD5', 'RIPEMD160')] + $ChecksumType = 'None', + + [Parameter()] + [System.String] + $Checksum + ) + + # Check whether DestinationPath points to existing file or directory + $fileExists = $false + $uriFileName = Split-Path -Path $Uri -Leaf + $pathItemType = Get-PathItemType -Path $DestinationPath + + switch ($pathItemType) + { + 'File' + { + Write-Verbose -Message ($script:localizedData.DestinationPathIsExistingFile -f $DestinationPath) + + if ($MatchSource) + { + $file = Get-Item -Path $DestinationPath + # Getting cache. It's cleared every time user runs Start-DscConfiguration + $cache = Get-Cache -DestinationPath $DestinationPath -Uri $Uri + + if ($null -ne $cache ` + -and ($cache.LastWriteTime -eq $file.LastWriteTimeUtc) ` + -and ($cache.FileSize -eq $file.Length)) + { + Write-Verbose -Message $script:localizedData.CacheReflectsCurrentState + $fileExists = $true + } + else + { + Write-Verbose -Message $script:localizedData.CacheIsEmptyOrNotMatchCurrentState + } + } + else + { + Write-Verbose -Message $script:localizedData.MatchSourceFalse + $fileExists = $true + } + + if ($ChecksumType -ine 'None' ` + -and -not [String]::IsNullOrEmpty($Checksum) ` + -and $fileExists -eq $true) + { + $fileHashSplat = @{ + Path = $DestinationPath + Algorithm = $ChecksumType + } + $getFileHash = Get-FileHash @fileHashSplat + $fileHash = $getFileHash.Hash + + if ($fileHash -ieq $Checksum) + { + $fileExists = $true + } + else + { + # The checksum does not match. The file may match what is in the cached data. Resetting it to false. + $fileExists = $false + } + } + } + + 'Directory' + { + Write-Verbose -Message ($script:localizedData.DestinationPathIsExistingPath -f $DestinationPath) + + $expectedDestinationPath = Join-Path -Path $DestinationPath -ChildPath $uriFileName + + if (Test-Path -Path $expectedDestinationPath) + { + if ($MatchSource) + { + $file = Get-Item -Path $expectedDestinationPath + $cache = Get-Cache -DestinationPath $expectedDestinationPath -Uri $Uri + + if ($null -ne $cache -and ($cache.LastWriteTime -eq $file.LastWriteTimeUtc)) + { + Write-Verbose -Message $script:localizedData.CacheReflectsCurrentState + $fileExists = $true + } + else + { + Write-Verbose -Message $script:localizedData.CacheIsEmptyOrNotMatchCurrentState + } + } + else + { + Write-Verbose -Message $script:localizedData.MatchSourceFalse + $fileExists = $true + } + + if ($ChecksumType -ine 'None' ` + -and -not [String]::IsNullOrEmpty($Checksum) ` + -and $fileExists -eq $true) + { + $fileHashSplat = @{ + Path = $expectedDestinationPath + Algorithm = $ChecksumType + } + $getFileHash = Get-FileHash @fileHashSplat + $fileHash = $getFileHash.Hash + + if ($fileHash -ieq $Checksum) + { + $fileExists = $true + } + else + { + # The checksum does not match. The file may match what is in the cached data. Resetting it to false. + $fileExists = $false + } + } + } + } + + 'Other' + { + Write-Verbose -Message ($script:localizedData.DestinationPathUnknownType -f $DestinationPath, $pathItemType) + } + + 'NotExists' + { + Write-Verbose -Message ($script:localizedData.DestinationPathDoesNotExist -f $DestinationPath) + } + } + + $result = $fileExists + + return $result +} + +<# + .SYNOPSIS + Checks whether given URI represents specific scheme. + + .DESCRIPTION + Most common schemes: file, http, https, ftp + We can also specify logical expressions like: [http|https] + + .PARAMETER Uri + The path of the item to test the scheme of. + + .PARAMETER Scheme + The type of scheme to test the item is. +#> +function Test-UriScheme +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Uri, + + [Parameter(Mandatory = $true)] + [System.String] + $Scheme + ) + + $newUri = $Uri -as [System.URI] + + return ($null -ne $newUri.AbsoluteURI -and $newUri.Scheme -match $Scheme) +} + +<# + .SYNOPSIS + Gets type of the item which path points to. + + .PARAMETER Path + The path of the item to return the item type of. + + .OUTPUTS + File, Directory, Other or NotExists. +#> +function Get-PathItemType +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Path + ) + + $type = $null + + # Check whether path exists + if (Test-Path -Path $path) + { + # Check type of the path + $pathItem = Get-Item -Path $Path + $pathItemType = $pathItem.GetType().Name + + if ($pathItemType -eq 'FileInfo') + { + $type = 'File' + } + elseif ($pathItemType -eq 'DirectoryInfo') + { + $type = 'Directory' + } + else + { + $type = 'Other' + } + } + else + { + $type = 'NotExists' + } + + return $type +} + +<# + .SYNOPSIS + Converts CimInstance array of type KeyValuePair to hashtable + + .PARAMETER Array + The array of KeyValuePairs to convert to a hashtable. +#> +function Convert-KeyValuePairArrayToHashtable +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Management.Infrastructure.CimInstance[]] + $Array + ) + + $hashtable = @{ } + + foreach ($item in $Array) + { + $hashtable += @{ + $item.Key = $item.Value + } + } + + return $hashtable +} + +<# + .SYNOPSIS + Gets cache for specific DestinationPath and Uri. + + .PARAMETER DestinationPath + The path to the cache. + + .PARAMETER Uri + The URI of the file to get the cache content for. +#> +function Get-Cache +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Uri + ) + + $cacheContent = $null + $key = Get-CacheKey -DestinationPath $DestinationPath -Uri $Uri + $path = Join-Path -Path $script:cacheLocation -ChildPath $key + + Write-Verbose -Message ($script:localizedData.CacheLookingForPath -f $Path) + + if (-not (Test-Path -Path $path)) + { + Write-Verbose -Message ($script:localizedData.CacheNotFoundForPath -f $DestinationPath, $Uri, $Key) + + $cacheContent = $null + } + else + { + $cacheContent = Import-Clixml -Path $path + Write-Verbose -Message ($script:localizedData.CacheFoundForPath -f $DestinationPath, $Uri, $Key) + } + + return $cacheContent +} + +<# + .SYNOPSIS + Creates or updates cache for specific DestinationPath and Uri. + + .PARAMETER DestinationPath + The path to the cache. + + .PARAMETER Uri + The URI of the file to update the cache for. + + .PARAMETER Uri + The content of the file to update in the cache. +#> +function Update-Cache +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Uri, + + [Parameter(Mandatory = $true)] + [System.Object] + $InputObject + ) + + $key = Get-CacheKey -DestinationPath $DestinationPath -Uri $Uri + $path = Join-Path -Path $script:cacheLocation -ChildPath $key + + if (-not (Test-Path -Path $script:cacheLocation)) + { + $null = New-Item -ItemType Directory -Path $script:cacheLocation + } + + Write-Verbose -Message ($script:localizedData.UpdatingCache -f $DestinationPath, $Uri, $Key) + + Export-Clixml -Path $path -InputObject $InputObject -Force +} + +<# + .SYNOPSIS + Returns cache key for given parameters. + + .PARAMETER DestinationPath + The path to the cache. + + .PARAMETER Uri + The URI of the file to get the cache key for. +#> +function Get-CacheKey +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Uri + ) + + return [System.String]::Join('', @($DestinationPath, $Uri)).GetHashCode().ToString() +} + +Export-ModuleMember -Function Get-TargetResource, Set-TargetResource, Test-TargetResource diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/DSC_xRemoteFile.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/DSC_xRemoteFile.schema.mof new file mode 100644 index 0000000..b879fdc --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/DSC_xRemoteFile.schema.mof @@ -0,0 +1,17 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("xRemoteFile")] +class DSC_xRemoteFile : OMI_BaseResource +{ + [Key, Description("Path under which downloaded or copied file should be accessible after operation.")] String DestinationPath; + [Required, Description("Uri of a file which should be copied or downloaded. This parameter supports HTTP and HTTPS values.")] String Uri; + [Write, Description("User agent for the web request.")] String UserAgent; + [Write, Description("Headers of the web request."), EmbeddedInstance("MSFT_KeyValuePair")] String Headers[]; + [Write, Description("Specifies a user account that has permission to send the request."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Write, Description("A boolean value to indicate whether the remote file should be re-downloaded if the file in the DestinationPath was modified locally. The default value is true.")] Boolean MatchSource; + [Write, Description("Specifies the checksum type to verify the downloaded file"), ValueMap{"None","SHA1","SHA256","SHA384","SHA512","MACTripleDES","MD5","RIPEMD160"}, Values{"None","SHA1","SHA256","SHA384","SHA512","MACTripleDES","MD5","RIPEMD160"}] String ChecksumType; + [Write, Description("Specifies the checksum value to compare against the downloaded file")] String Checksum; + [Write, Description("Specifies how long the request can be pending before it times out.")] Uint32 TimeoutSec; + [Write, Description("Uses a proxy server for the request, rather than connecting directly to the Internet resource. Should be the URI of a network proxy server (e.g 'http://10.20.30.1').")] String Proxy; + [Write, Description("Specifies a user account that has permission to use the proxy server that is specified by the Proxy parameter."), EmbeddedInstance("MSFT_Credential")] String ProxyCredential; + [Read, Description("Says whether DestinationPath exists on the machine."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/en-us/DSC_xRemoteFile.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/en-us/DSC_xRemoteFile.strings.psd1 new file mode 100644 index 0000000..34db460 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xRemoteFile/en-us/DSC_xRemoteFile.strings.psd1 @@ -0,0 +1,26 @@ +# Localized resources for DSC_xRemoteFile + +ConvertFrom-StringData @' + DestinationPathIsExistingFile=DestinationPath '{0}' is existing file on the machine. + DestinationPathIsExistingPath=DestinationPath '{0}' is existing directory on the machine. + FileExistsInDestinationPath=File '{0}' exists in DestinationPath. + DestinationPathUnknownType=DestinationPath '{0}' has unknown type '{1}'. + DestinationPathDoesNotExist=DestinationPath '{0}' doesn't exist on the machine. + InvalidWebUriError=Specified URI is not valid: "{0}". Only http, https or file paths are accepted. + InvalidDestinationPathSchemeError=Specified DestinationPath is not valid: "{0}". DestinationPath should be absolute path. + DestinationPathIsUncError=Specified DestinationPath is not valid: "{0}". DestinationPath should be local path instead of UNC path. + DestinationPathHasInvalidCharactersError=Specified DestinationPath is not valid: "{0}". DestinationPath should be contains following characters: * ? " < > | + DestinationPathEndsWithInvalidCharacterError=Specified DestinationPath is not valid: "{0}". DestinationPath should not end with / or \\ + DownloadOutOfMemoryException=Invoking web request failed with OutOfMemoryException- Possible cause is the requested file being too big. {0} + DownloadException=Invoking web request failed with error. {0} + DownloadingURI=Downloading '{1}' to '{0}'. + DownloadingFailedRetry=Download of '{0}' failed on attempt {1} with this error: {2} + CacheReflectsCurrentState=Cache reflects current state. No need for downloading file. + CacheIsEmptyOrNotMatchCurrentState=Cache is empty or it doesn't reflect current state. File will be downloaded. + MatchSourceFalse=MatchSource is false. No need for downloading file. + CacheLookingForPath=Looking for cache path '{0}'. + CacheNotFoundForPath=No cache found for DestinationPath '{0}' and Uri '{1}' CacheKey '{2}'. + CacheFoundForPath=Found cache found for DestinationPath '{0}' and Uri '{1}' CacheKey '{2}'. + ChecksumDoesNotMatch=Checksum does not match specified value - Desired: '{0}', Actual: '{1}'. + UpdatingCache=Updating cache for DestinationPath '{0}' and Uri '{1}' CacheKey '{2}'. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/DSC_xScriptResource.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/DSC_xScriptResource.psm1 new file mode 100644 index 0000000..3185a5a --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/DSC_xScriptResource.psm1 @@ -0,0 +1,288 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xScriptResource' + +<# + .SYNOPSIS + Runs the given get script. + Should return a hashtable. + + .PARAMETER GetScript + A string that can be used to create a PowerShell script block that retrieves the + current state of the resource. + + .PARAMETER SetScript + Not used in Get-TargetResource. + + .PARAMETER TestScript + Not used in Get-TargetResource. + + .PARAMETER Credential + The credential of the user account to run the script under if needed. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GetScript, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SetScript, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $TestScript, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + Write-Verbose -Message $script:localizedData.GetTargetResourceStartVerboseMessage + + $invokeScriptParameters = @{ + ScriptBlock = [System.Management.Automation.ScriptBlock]::Create($GetScript) + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $invokeScriptParameters['Credential'] = $Credential + } + + $invokeScriptResult = Invoke-Script @invokeScriptParameters + + if ($invokeScriptResult -is [System.Management.Automation.ErrorRecord]) + { + New-InvalidOperationException -Message $script:localizedData.GetScriptThrewError -ErrorRecord $invokeScriptResult + } + + $invokeScriptResultAsHashTable = $invokeScriptResult -as [System.Collections.Hashtable] + + if ($null -eq $invokeScriptResultAsHashTable) + { + New-InvalidArgumentException -ArgumentName 'TestScript' -Message $script:localizedData.GetScriptDidNotReturnHashtable + } + + Write-Verbose -Message $script:localizedData.GetTargetResourceEndVerboseMessage + + return $invokeScriptResultAsHashTable +} + +<# + .SYNOPSIS + Runs the given set script. + Should not return. + + .PARAMETER GetScript + Not used in Set-TargetResource. + + .PARAMETER SetScript + A string that can be used to create a PowerShell script block that sets the resource + to the desired state. + + .PARAMETER TestScript + Not used in Set-TargetResource. + + .PARAMETER Credential + The credential of the user account to run the script under if needed. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GetScript, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SetScript, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $TestScript, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + Write-Verbose -Message $script:localizedData.SetTargetResourceStartVerboseMessage + + $invokeScriptParameters = @{ + ScriptBlock = [System.Management.Automation.ScriptBlock]::Create($SetScript) + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $invokeScriptParameters['Credential'] = $Credential + } + + $invokeScriptResult = Invoke-Script @invokeScriptParameters + + if ($invokeScriptResult -is [System.Management.Automation.ErrorRecord]) + { + New-InvalidOperationException -Message $script:localizedData.SetScriptThrewError -ErrorRecord $invokeScriptResult + } + + Write-Verbose -Message $script:localizedData.SetTargetResourceEndVerboseMessage +} + +<# + .SYNOPSIS + Runs the given test script. + Should return true if the resource is in the desired state and false otherwise. + + .PARAMETER GetScript + Not used in Test-TargetResource. + + .PARAMETER SetScript + Not used in Test-TargetResource. + + .PARAMETER TestScript + A string that can be used to create a PowerShell script block that validates whether + or not the resource is in the desired state. + + .PARAMETER Credential + The credential of the user account to run the script under if needed. +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $GetScript, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SetScript, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $TestScript, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + Write-Verbose -Message $script:localizedData.TestTargetResourceStartVerboseMessage + + $invokeScriptParameters = @{ + ScriptBlock = [System.Management.Automation.ScriptBlock]::Create($TestScript) + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $invokeScriptParameters['Credential'] = $Credential + } + + $invokeScriptResult = Invoke-Script @invokeScriptParameters + + # If the script is returing multiple objects, then we consider the last object to be the result of the script execution. + if ($invokeScriptResult -is [System.Object[]] -and $invokeScriptResult.Count -gt 0) + { + $invokeScriptResult = $invokeScriptResult[$invokeScriptResult.Count - 1] + } + + if ($invokeScriptResult -is [System.Management.Automation.ErrorRecord]) + { + New-InvalidOperationException -Message $script:localizedData.TestScriptThrewError -ErrorRecord $invokeScriptResult + } + + if ($null -eq $invokeScriptResult -or -not ($invokeScriptResult -is [System.Boolean])) + { + New-InvalidArgumentException -ArgumentName 'TestScript' -Message $script:localizedData.TestScriptDidNotReturnBoolean + } + + Write-Verbose -Message $script:localizedData.TestTargetResourceEndVerboseMessage + + return $invokeScriptResult +} + +<# + .SYNOPSIS + Invokes the given script block. + + The output of the script will be returned unless the script throws an error. + If the script throws an error, the ErrorRecord will be returned rather than thrown. + + .PARAMETER ScriptBlock + The script block to invoke. + + .PARAMETER Credential + The credential to run the script under if needed. +#> +function Invoke-Script +{ + [OutputType([System.Object])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Management.Automation.ScriptBlock] + $ScriptBlock, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $scriptResult = $null + + try + { + Write-Verbose -Message ($script:localizedData.ExecutingScriptMessage -f $ScriptBlock) + + if ($null -ne $Credential) + { + $scriptResult = Invoke-Command -ScriptBlock $ScriptBlock -Credential $Credential -ComputerName . + } + else + { + $scriptResult = & $ScriptBlock + } + } + catch + { + # Surfacing the error thrown by the execution of the script + $scriptResult = $_ + } + + return $scriptResult +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/DSC_xScriptResource.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/DSC_xScriptResource.schema.mof new file mode 100644 index 0000000..c42994d --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/DSC_xScriptResource.schema.mof @@ -0,0 +1,10 @@ + +[ClassVersion("1.0.0"),FriendlyName("xScript")] +class DSC_xScriptResource : OMI_BaseResource +{ + [Key, Description("A string that can be used to create a PowerShell script block that retrieves the current state of the resource.")] String GetScript; + [Key, Description("A string that can be used to create a PowerShell script block that sets the resource to the desired state.")] String SetScript; + [Key, Description("A string that can be used to create a PowerShell script block that validates whether or not the resource is in the desired state.")] String TestScript; + [Write, Description("The credential of the user account to run the script under if needed."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Read, Description("The result from the GetScript script block.")] String Result; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/en-US/DSC_xScriptResource.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/en-US/DSC_xScriptResource.schema.mfl new file mode 100644 index 0000000..17e6515 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/en-US/DSC_xScriptResource.schema.mfl @@ -0,0 +1,9 @@ +[Description("This resource is used to perform Get, Set and Test functionality on the DSC managed nodes through Powershell scripts. \n") : Amended,AMENDMENT, LOCALE("ms_409")] +class DSC_xScriptResource : OMI_BaseResource +{ + [Key,Description("A string that can be used to create a PowerShell script block that retrieves the current state of the resource.") : Amended] String GetScript; + [Key,Description("A string that can be used to create a PowerShell script block that sets the resource to the desired state.") : Amended] String SetScript; + [Key,Description("A string that can be used to create a PowerShell script block that validates whether or not the resource is in the desired state.") : Amended] String TestScript; + [Description("The credential of the user account to run the script under if needed.") : Amended] String Credential; + [Read, Description("The result from the GetScript script block.") : Amended] String DisplayName; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/en-US/DSC_xScriptResource.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/en-US/DSC_xScriptResource.strings.psd1 new file mode 100644 index 0000000..db44aca --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xScriptResource/en-US/DSC_xScriptResource.strings.psd1 @@ -0,0 +1,16 @@ +# Localized resources for DSC_xScriptResource + +ConvertFrom-StringData @' + GetTargetResourceStartVerboseMessage = Begin executing get script. + GetScriptThrewError = The get script threw an error. + GetScriptDidNotReturnHashtable = The get script did not return a hashtable. + GetTargetResourceEndVerboseMessage = End executing get script. + SetTargetResourceStartVerboseMessage = Begin executing set script. + SetScriptThrewError = The set script threw an error. + SetTargetResourceEndVerboseMessage = End executing set script. + TestTargetResourceStartVerboseMessage = Begin executing test script. + TestScriptThrewError = The test script threw an error. + TestScriptDidNotReturnBoolean = The test script did not return a boolean. + TestTargetResourceEndVerboseMessage = End executing test script. + ExecutingScriptMessage = Executing script: {0} +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/DSC_xServiceResource.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/DSC_xServiceResource.psm1 new file mode 100644 index 0000000..5a29d06 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/DSC_xServiceResource.psm1 @@ -0,0 +1,1870 @@ +<# + Error codes and their meanings for Invoke-CimMethod on a Win32_Service can be found here: + https://msdn.microsoft.com/en-us/library/aa384901(v=vs.85).aspx +#> + +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xServiceResource' + +<# + .SYNOPSIS + Retrieves the current status of the service resource with the given name. + + .PARAMETER Name + The name of the service to retrieve the status of. + + This may be different from the service's display name. + To retrieve a list of all services with their names and current states, use the Get-Service + cmdlet. + + .NOTES + BuiltInAccount, Credential and GroupManagedServiceAccount parameters output the user used + to run the service to the BuiltinAccount property, Evaluating if the account is a gMSA would + mean doing a call to active directory to verify, as the property returned by the ciminstance + is just a string. In a production scenario that would mean that every xService test will check + with AD every 15 minutes if the account is a gMSA. That's not desireable, so we output Credential + and GroupManagedServiceAccount without evaluating what kind of user is supplied. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name + ) + + $service = Get-Service -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -ne $service) + { + Write-Verbose -Message ($script:localizedData.ServiceExists -f $Name) + + $serviceCimInstance = Get-ServiceCimInstance -ServiceName $Name + + $dependencies = @() + + foreach ($serviceDependedOn in $service.ServicesDependedOn) + { + if ($null -ne $serviceDependedOn -and $null -ne $serviceDependedOn.Name) + { + $dependencies += $serviceDependedOn.Name.ToString() + } + else + { + Write-Warning -Message ($script:localizedData.CorruptDependency -f $Name) + } + } + + $startupType = ConvertTo-StartupTypeString -StartMode $serviceCimInstance.StartMode + + $builtInAccount = switch ($serviceCimInstance.StartName) + { + 'NT Authority\NetworkService' { 'NetworkService'; break } + 'NT Authority\LocalService' { 'LocalService'; break } + default { $serviceCimInstance.StartName } + } + + $serviceResource = @{ + Name = $Name + Ensure = 'Present' + Path = $serviceCimInstance.PathName + StartupType = $startupType + BuiltInAccount = $builtInAccount + State = $service.Status.ToString() + DisplayName = $service.DisplayName + Description = $serviceCimInstance.Description + DesktopInteract = $serviceCimInstance.DesktopInteract + Dependencies = $dependencies + } + } + else + { + Write-Verbose -Message ($script:localizedData.ServiceDoesNotExist -f $Name) + $serviceResource = @{ + Name = $Name + Ensure = 'Absent' + } + } + + return $serviceResource +} + +<# + .SYNOPSIS + Creates, modifies, or deletes the service with the given name. + + .PARAMETER Name + The name of the service to create, modify, or delete. + + This may be different from the service's display name. + To retrieve a list of all services with their names and current states, use the Get-Service + cmdlet. + + .PARAMETER Ensure + Specifies whether the service should exist or not. + + Set this property to Present to create or modify a service. + Set this property to Absent to delete a service. + + The default value is Present. + + .PARAMETER Path + The path to the executable the service should run. + Required when creating a service. + + The user account specified by BuiltInAccount or Credential must have access to this path in + order to start the service. + + .PARAMETER StartupType + The startup type the service should have. + + .PARAMETER BuiltInAccount + The built-in account the service should start under. + + Cannot be specified at the same time as Credential or GroupManagedServiceAccount. + + The user account specified by this property must have access to the service executable path + defined by Path in order to start the service. + + .PARAMETER GroupManagedServiceAccount + The Group Managed Service Account the service should start under. The GMSA + must be provided in DOMAIN\gMSA$ format or UPN format gMSA$@domain.fqdn. + + Cannot be specified at the same time as BuilInAccount or Credential. + + .PARAMETER DesktopInteract + Indicates whether or not the service should be able to communicate with a window on the + desktop. + + Must be false for services not running as LocalSystem. + The default value is false. + + .PARAMETER State + The state the service should be in. + The default value is Running. + + To disregard the state that the service is in, specify this property as Ignore. + + .PARAMETER DisplayName + The display name the service should have. + + .PARAMETER Description + The description the service should have. + + .PARAMETER Dependencies + An array of the names of the dependencies the service should have. + + .PARAMETER StartupTimeout + The time to wait for the service to start in milliseconds. + The default value is 30000 (30 seconds). + + .PARAMETER TerminateTimeout + The time to wait for the service to stop in milliseconds. + The default value is 30000 (30 seconds). + + .PARAMETER Credential + The credential of the user account the service should start under. + + Cannot be specified at the same time as BuiltInAccount. + The user specified by this credential will automatically be granted the Log on as a Service + right. + + The user account specified by this property must have access to the service executable path + defined by Path in order to start the service. + + .NOTES + SupportsShouldProcess is enabled because Invoke-CimMethod calls ShouldProcess. + Here are the paths through which Set-TargetResource calls Invoke-CimMethod: + + Set-TargetResource --> Set-ServicePath --> Invoke-CimMethod + --> Set-ServiceProperty --> Set-ServiceDependency --> Invoke-CimMethod + --> Set-ServiceAccountProperty --> Invoke-CimMethod + --> Set-ServiceStartupType --> Invoke-CimMethod +#> +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Automatic', 'Manual', 'Disabled')] + [System.String] + $StartupType, + + [Parameter()] + [ValidateSet('LocalSystem', 'LocalService', 'NetworkService')] + [System.String] + $BuiltInAccount, + + [Parameter()] + [System.String] + $GroupManagedServiceAccount, + + [Parameter()] + [ValidateSet('Running', 'Stopped', 'Ignore')] + [System.String] + $State = 'Running', + + [Parameter()] + [System.Boolean] + $DesktopInteract = $false, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Description, + + [Parameter()] + [System.String[]] + [AllowEmptyCollection()] + $Dependencies, + + [Parameter()] + [System.UInt32] + $StartupTimeout = 30000, + + [Parameter()] + [System.UInt32] + $TerminateTimeout = 30000, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + if ($PSBoundParameters.ContainsKey('StartupType')) + { + Assert-NoStartupTypeStateConflict -ServiceName $Name -StartupType $StartupType -State $State + } + + if (($PSBoundParameters.ContainsKey('BuiltInAccount') -and $PSBoundParameters.ContainsKey('Credential')) -or + ($PSBoundParameters.ContainsKey('BuiltInAccount') -and $PSBoundParameters.ContainsKey('GroupManagedServiceAccount')) -or + ($PSBoundParameters.ContainsKey('GroupManagedServiceAccount') -and $PSBoundParameters.ContainsKey('Credential')) + ) + { + $errorMessage = $script:localizedData.CredentialParametersAreMutallyExclusive -f $Name + New-InvalidArgumentException -ArgumentName 'BuiltInAccount / Credential / GroupManagedServiceAccount' -Message $errorMessage + } + + $service = Get-Service -Name $Name -ErrorAction 'SilentlyContinue' + + if ($Ensure -eq 'Absent') + { + if ($null -eq $service) + { + Write-Verbose -Message $script:localizedData.ServiceAlreadyAbsent + } + else + { + Write-Verbose -Message ($script:localizedData.RemovingService -f $Name) + + Stop-ServiceWithTimeout -ServiceName $Name -TerminateTimeout $TerminateTimeout + Remove-ServiceWithTimeout -Name $Name -TerminateTimeout $TerminateTimeout + } + } + else + { + $serviceRestartNeeded = $false + + # Create new service or update the service path if needed + if ($null -eq $service) + { + if ($PSBoundParameters.ContainsKey('Path')) + { + Write-Verbose -Message ($script:localizedData.CreatingService -f $Name, $Path) + $null = New-Service -Name $Name -BinaryPathName $Path + } + else + { + $errorMessage = $script:localizedData.ServiceDoesNotExistPathMissingError -f $Name + New-InvalidArgumentException -ArgumentName 'Path' -Message $errorMessage + } + } + else + { + if ($PSBoundParameters.ContainsKey('Path')) + { + $serviceRestartNeeded = Set-ServicePath -ServiceName $Name -Path $Path + } + } + + # Update the properties of the service if needed + $setServicePropertyParameters = @{} + + $servicePropertyParameterNames = @( 'StartupType', 'BuiltInAccount', 'Credential', 'GroupManagedServiceAccount', 'DesktopInteract', 'DisplayName', 'Description', 'Dependencies' ) + + foreach ($servicePropertyParameterName in $servicePropertyParameterNames) + { + if ($PSBoundParameters.ContainsKey($servicePropertyParameterName)) + { + $setServicePropertyParameters[$servicePropertyParameterName] = $PSBoundParameters[$servicePropertyParameterName] + } + } + + if ($setServicePropertyParameters.Count -gt 0) + { + Write-Verbose -Message ($script:localizedData.EditingServiceProperties -f $Name) + Set-ServiceProperty -ServiceName $Name @setServicePropertyParameters + } + + # Update service state if needed + if ($State -eq 'Stopped') + { + Stop-ServiceWithTimeout -ServiceName $Name -TerminateTimeout $TerminateTimeout + } + elseif ($State -eq 'Running') + { + if ($serviceRestartNeeded) + { + Write-Verbose -Message ($script:localizedData.RestartingService -f $Name) + Stop-ServiceWithTimeout -ServiceName $Name -TerminateTimeout $TerminateTimeout + } + + Start-ServiceWithTimeout -ServiceName $Name -StartupTimeout $StartupTimeout + } + } +} + +<# + .SYNOPSIS + Tests if the service with the given name has the specified property values. + + .PARAMETER Name + The name of the service to test. + + This may be different from the service's display name. + To retrieve a list of all services with their names and current states, use the Get-Service + cmdlet. + + .PARAMETER Ensure + Specifies whether the service should exist or not. + + Set this property to Present to test if a service exists. + Set this property to Absent to test if a service does not exist. + + The default value is Present. + + .PARAMETER Path + The path to the executable the service should be running. + + .PARAMETER StartupType + The startup type the service should have. + + .PARAMETER BuiltInAccount + The built-in account the service should start under. + + Cannot be specified at the same time as Credential or GroupManagedServiceAccount. + + .PARAMETER GroupManagedServiceAccount + The Group Managed Service Account the service should start under. The GMSA + must be provided in DOMAIN\gMSA$ format or UPN format gMSA$@domain.fqdn. + + Cannot be specified at the same time as BuilInAccount or Credential. + + .PARAMETER DesktopInteract + Indicates whether or not the service should be able to communicate with a window on the + desktop. + + Should be false for services not running as LocalSystem. + The default value is false. + + .PARAMETER State + The state the service should be in. + The default value is Running. + + To disregard the state that the service is in, specify this property as Ignore. + + .PARAMETER DisplayName + The display name the service should have. + + .PARAMETER Description + The description the service should have. + + .PARAMETER Dependencies + An array of the names of the dependencies the service should have. + + .PARAMETER StartupTimeout + Not used in Test-TargetResource. + + .PARAMETER TerminateTimeout + Not used in Test-TargetResource. + + .PARAMETER Credential + The credential the service should be running under. + + Cannot be specified at the same time as BuiltInAccount. +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [ValidateSet('Automatic', 'Manual', 'Disabled')] + [System.String] + $StartupType, + + [Parameter()] + [ValidateSet('LocalSystem', 'LocalService', 'NetworkService')] + [System.String] + $BuiltInAccount, + + [Parameter()] + [System.String] + $GroupManagedServiceAccount, + + [Parameter()] + [System.Boolean] + $DesktopInteract = $false, + + [Parameter()] + [ValidateSet('Running', 'Stopped', 'Ignore')] + [System.String] + $State = 'Running', + + [Parameter()] + [ValidateNotNull()] + [System.String] + $DisplayName, + + [Parameter()] + [System.String] + [AllowEmptyString()] + $Description, + + [Parameter()] + [System.String[]] + [AllowEmptyCollection()] + $Dependencies, + + [Parameter()] + [System.UInt32] + $StartupTimeout = 30000, + + [Parameter()] + [System.UInt32] + $TerminateTimeout = 30000, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + if ($PSBoundParameters.ContainsKey('StartupType')) + { + Assert-NoStartupTypeStateConflict -ServiceName $Name -StartupType $StartupType -State $State + } + + if (($PSBoundParameters.ContainsKey('BuiltInAccount') -and $PSBoundParameters.ContainsKey('Credential')) -or + ($PSBoundParameters.ContainsKey('BuiltInAccount') -and $PSBoundParameters.ContainsKey('GroupManagedServiceAccount')) -or + ($PSBoundParameters.ContainsKey('GroupManagedServiceAccount') -and $PSBoundParameters.ContainsKey('Credential')) + ) + { + $errorMessage = $script:localizedData.CredentialParametersAreMutallyExclusive -f $Name + New-InvalidArgumentException -ArgumentName 'BuiltInAccount / Credential / GroupManagedServiceAccount' -Message $errorMessage + } + + $serviceResource = Get-TargetResource -Name $Name + + if ($serviceResource.Ensure -eq 'Absent') + { + Write-Verbose -Message ($script:localizedData.ServiceDoesNotExist -f $Name) + + if ($StartupType -eq 'Disabled') + { + return $true + } + + return ($Ensure -eq 'Absent') + } + else + { + Write-Verbose -Message ($script:localizedData.ServiceExists -f $Name) + + if ($Ensure -eq 'Absent') + { + return $false + } + + # Check the service path + if ($PSBoundParameters.ContainsKey('Path')) + { + $pathsMatch = Test-PathsMatch -ExpectedPath $Path -ActualPath $serviceResource.Path + + if (-not $pathsMatch) + { + Write-Verbose -Message ($script:localizedData.ServicePathDoesNotMatch -f $Name, $Path, $serviceResource.Path) + return $false + } + } + + # Check the service display name + if ($PSBoundParameters.ContainsKey('DisplayName') -and $serviceResource.DisplayName -ine $DisplayName) + { + Write-Verbose -Message ($script:localizedData.ServicePropertyDoesNotMatch -f 'DisplayName', $Name, $DisplayName, $serviceResource.DisplayName) + return $false + } + + # Check the service description + if ($PSBoundParameters.ContainsKey('Description') -and $serviceResource.Description -ine $Description) + { + Write-Verbose -Message ($script:localizedData.ServicePropertyDoesNotMatch -f 'Description', $Name, $Description, $serviceResource.Description) + return $false + } + + # Check the service dependencies + if ($PSBoundParameters.ContainsKey('Dependencies')) + { + $serviceDependenciesDoNotMatch = $false + + if ($null -eq $serviceResource.Dependencies -xor $null -eq $Dependencies) + { + $serviceDependenciesDoNotMatch = $true + } + elseif ($null -ne $serviceResource.Dependencies -and $null -ne $Dependencies) + { + $mismatchedDependencies = Compare-Object -ReferenceObject $serviceResource.Dependencies -DifferenceObject $Dependencies + $serviceDependenciesDoNotMatch = $null -ne $mismatchedDependencies + } + + if ($serviceDependenciesDoNotMatch) + { + $expectedDependenciesString = $Dependencies -join ',' + $actualDependenciesString = $serviceResource.Dependencies -join ',' + + Write-Verbose -Message ($script:localizedData.ServicePropertyDoesNotMatch -f 'Dependencies', $Name, $expectedDependenciesString, $actualDependenciesString) + return $false + } + } + + # Check the service desktop interation setting + if ($PSBoundParameters.ContainsKey('DesktopInteract') -and $serviceResource.DesktopInteract -ine $DesktopInteract) + { + Write-Verbose -Message ($script:localizedData.ServicePropertyDoesNotMatch -f 'DesktopInteract', $Name, $DesktopInteract, $serviceResource.DesktopInteract) + return $false + } + + # Check the service account properties + if ($PSBoundParameters.ContainsKey('BuiltInAccount') -and $serviceResource.BuiltInAccount -ine $BuiltInAccount) + { + Write-Verbose -Message ($script:localizedData.ServicePropertyDoesNotMatch -f 'BuiltInAccount', $Name, $BuiltInAccount, $serviceResource.BuiltInAccount) + return $false + } + elseif ($PSBoundParameters.ContainsKey('GroupManagedServiceAccount')) + { + $expectedStartName = ConvertTo-StartName -Username $GroupManagedServiceAccount + + if ($serviceResource.BuiltInAccount -ine $expectedStartName) + { + Write-Verbose -Message ($script:localizedData.GroupManagedServiceCredentialDoesNotMatch -f $Name, $GroupManagedServiceAccount, $serviceResource.BuiltInAccount) + return $false + } + } + elseif ($PSBoundParameters.ContainsKey('Credential')) + { + $expectedStartName = ConvertTo-StartName -Username $Credential.UserName + + if ($serviceResource.BuiltInAccount -ine $expectedStartName) + { + Write-Verbose -Message ($script:localizedData.ServiceCredentialDoesNotMatch -f $Name, $Credential.UserName, $serviceResource.BuiltInAccount) + return $false + } + } + + # Check the service startup type + if ($PSBoundParameters.ContainsKey('StartupType') -and $serviceResource.StartupType -ine $StartupType) + { + Write-Verbose -Message ($script:localizedData.ServicePropertyDoesNotMatch -f 'StartupType', $Name, $StartupType, $serviceResource.StartupType) + return $false + } + + # Check the service state + if ($State -ne 'Ignore' -and $serviceResource.State -ine $State) + { + Write-Verbose -Message ($script:localizedData.ServicePropertyDoesNotMatch -f 'State', $Name, $State, $serviceResource.State) + return $false + } + } + + return $true +} + +<# + .SYNOPSIS + Retrieves the CIM instance of the service with the given name. + + .PARAMETER ServiceName + The name of the service to get the CIM instance of. +#> +function Get-ServiceCimInstance +{ + [OutputType([Microsoft.Management.Infrastructure.CimInstance])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + $ServiceName + ) + + return Get-CimInstance -ClassName 'Win32_Service' -Filter "Name='$ServiceName'" +} + +<# + .SYNOPSIS + Converts the StartMode value returned in a CIM instance of a service to the format + expected by this resource. + + .PARAMETER StartMode + The StartMode value to convert. +#> +function ConvertTo-StartupTypeString +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateSet('Auto', 'Manual', 'Disabled')] + [System.String] + $StartMode + ) + + if ($StartMode -eq 'Auto') + { + return 'Automatic' + } + + return $StartMode +} + +<# + .SYNOPSIS + Throws an invalid argument error if the given service startup type conflicts with the given + service state. + + .PARAMETER ServiceName + The name of the service for the error message. + + .PARAMETER StartupType + The service startup type to check. + + .PARAMETER State + The service state to check. +#> +function Assert-NoStartupTypeStateConflict +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter(Mandatory = $true)] + [ValidateSet('Automatic', 'Manual', 'Disabled')] + [System.String] + $StartupType, + + [Parameter(Mandatory = $true)] + [ValidateSet('Running', 'Stopped', 'Ignore')] + [System.String] + $State + ) + + if ($State -eq 'Stopped') + { + if ($StartupType -eq 'Automatic') + { + # Cannot stop a service and set it to start automatically at the same time + $errorMessage = $script:localizedData.StartupTypeStateConflict -f $ServiceName, $StartupType, $State + New-InvalidArgumentException -ArgumentName 'StartupType and State' -Message $errorMessage + } + } + elseif ($State -eq 'Running') + { + if ($StartupType -eq 'Disabled') + { + # Cannot start a service and disable it at the same time + $errorMessage = $script:localizedData.StartupTypeStateConflict -f $ServiceName, $StartupType, $State + New-InvalidArgumentException -ArgumentName 'StartupType and State' -Message $errorMessage + } + } +} + +<# + .SYNOPSIS + Tests if the two given paths match. + + .PARAMETER ExpectedPath + The expected path to test against. + + .PARAMETER ActualPath + The actual path to test. +#> +function Test-PathsMatch +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ExpectedPath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ActualPath + ) + + return (0 -eq [System.String]::Compare($ExpectedPath, $ActualPath, [System.Globalization.CultureInfo]::CurrentUICulture)) +} + +<# + .SYNOPSIS + Converts the given username to the string version of it that would be expected in a + service's StartName property. + + .PARAMETER Username + The username to convert. +#> +function ConvertTo-StartName +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Username + ) + + $startName = $Username + + if ($Username -ieq 'NetworkService' -or $Username -ieq 'LocalService') + { + $startName = "NT Authority\$Username" + } + elseif (-not $Username.Contains('\') -and -not $Username.Contains('@')) + { + $startName = ".\$Username" + } + elseif ($Username.StartsWith("$env:computerName\")) + { + $startName = $Username.Replace($env:computerName, '.') + } + + return $startName +} + +<# + .SYNOPSIS + Sets the executable path of the service with the given name. + Returns a boolean specifying whether a restart is needed or not. + + .PARAMETER ServiceName + The name of the service to set the path of. + + .PARAMETER Path + The path to set for the service. + + .NOTES + SupportsShouldProcess is enabled because Invoke-CimMethod calls ShouldProcess. + This function calls Invoke-CimMethod directly. +#> +function Set-ServicePath +{ + [OutputType([System.Boolean])] + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $serviceCimInstance = Get-ServiceCimInstance -ServiceName $ServiceName + + $pathsMatch = Test-PathsMatch -ExpectedPath $Path -ActualPath $serviceCimInstance.PathName + + if ($pathsMatch) + { + Write-Verbose -Message ($script:localizedData.ServicePathMatches -f $ServiceName) + return $false + } + else + { + Write-Verbose -Message ($script:localizedData.ServicePathDoesNotMatch -f $ServiceName) + + $changeServiceArguments = @{ + PathName = $Path + } + + $changeServiceResult = Invoke-CimMethod ` + -InputObject $serviceCimInstance ` + -MethodName 'Change' ` + -Arguments $changeServiceArguments + + if ($changeServiceResult.ReturnValue -ne 0) + { + $serviceChangePropertyString = $changeServiceArguments.Keys -join ', ' + $errorMessage = $script:localizedData.InvokeCimMethodFailed -f 'Change', $ServiceName, $serviceChangePropertyString, $changeServiceResult.ReturnValue + New-InvalidArgumentException -ArgumentName 'Path' -Message $errorMessage + } + + return $true + } +} + +<# + .SYNOPSIS + Sets the dependencies of the service with the given name. + + .PARAMETER ServiceName + The name of the service to set the dependencies of. + + .PARAMETER Dependencies + The names of the dependencies to set for the service. + + .NOTES + SupportsShouldProcess is enabled because Invoke-CimMethod calls ShouldProcess. + This function calls Invoke-CimMethod directly. +#> +function Set-ServiceDependency +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter(Mandatory = $true)] + [System.String[]] + [AllowEmptyCollection()] + $Dependencies + ) + + $service = Get-Service -Name $ServiceName -ErrorAction 'SilentlyContinue' + + $serviceDependenciesMatch = $true + + $noActualServiceDependencies = $null -eq $service.ServicesDependedOn -or 0 -eq $service.ServicesDependedOn.Count + $noExpectedServiceDependencies = $null -eq $Dependencies -or 0 -eq $Dependencies.Count + + if ($noActualServiceDependencies -xor $noExpectedServiceDependencies) + { + $serviceDependenciesMatch = $false + } + elseif (-not $noActualServiceDependencies -and -not $noExpectedServiceDependencies) + { + $mismatchedDependencies = Compare-Object -ReferenceObject $service.ServicesDependedOn.Name -DifferenceObject $Dependencies + $serviceDependenciesMatch = $null -eq $mismatchedDependencies + } + + if ($serviceDependenciesMatch) + { + Write-Verbose -Message ($script:localizedData.ServiceDepdenciesMatch -f $ServiceName) + } + else + { + Write-Verbose -Message ($script:localizedData.ServiceDepdenciesDoNotMatch -f $ServiceName) + + $serviceCimInstance = Get-ServiceCimInstance -ServiceName $ServiceName + + $changeServiceArguments = @{ + ServiceDependencies = $Dependencies + } + + $changeServiceResult = Invoke-CimMethod ` + -InputObject $serviceCimInstance ` + -MethodName 'Change' ` + -Arguments $changeServiceArguments + + if ($changeServiceResult.ReturnValue -ne 0) + { + $serviceChangePropertyString = $changeServiceArguments.Keys -join ', ' + $errorMessage = $script:localizedData.InvokeCimMethodFailed -f 'Change', $ServiceName, $serviceChangePropertyString, $changeServiceResult.ReturnValue + New-InvalidArgumentException -Message $errorMessage -ArgumentName 'Dependencies' + } + } +} + +<# + .SYNOPSIS + Grants the 'Log on as a service' right to the user with the given username. + + .PARAMETER Username + The username of the user to grant 'Log on as a service' right to +#> +function Grant-LogOnAsServiceRight +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Username + ) + + $logOnAsServiceText = @" + namespace LogOnAsServiceHelper + { + using Microsoft.Win32.SafeHandles; + using System; + using System.Runtime.ConstrainedExecution; + using System.Runtime.InteropServices; + using System.Security; + + public class NativeMethods + { + #region constants + // from ntlsa.h + private const int POLICY_LOOKUP_NAMES = 0x00000800; + private const int POLICY_CREATE_ACCOUNT = 0x00000010; + private const uint ACCOUNT_ADJUST_SYSTEM_ACCESS = 0x00000008; + private const uint ACCOUNT_VIEW = 0x00000001; + private const uint SECURITY_ACCESS_SERVICE_LOGON = 0x00000010; + + // from LsaUtils.h + private const uint STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034; + + // from lmcons.h + private const int UNLEN = 256; + private const int DNLEN = 15; + + // Extra characteres for '\', '@' etc. + private const int EXTRA_LENGTH = 3; + #endregion constants + + #region interop structures + /// <summary> + /// Used to open a policy, but not containing anything meaqningful + /// </summary> + [StructLayout(LayoutKind.Sequential)] + private struct LSA_OBJECT_ATTRIBUTES + { + public UInt32 Length; + public IntPtr RootDirectory; + public IntPtr ObjectName; + public UInt32 Attributes; + public IntPtr SecurityDescriptor; + public IntPtr SecurityQualityOfService; + + public void Initialize() + { + this.Length = 0; + this.RootDirectory = IntPtr.Zero; + this.ObjectName = IntPtr.Zero; + this.Attributes = 0; + this.SecurityDescriptor = IntPtr.Zero; + this.SecurityQualityOfService = IntPtr.Zero; + } + } + + /// <summary> + /// LSA string + /// </summary> + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct LSA_UNICODE_STRING + { + internal ushort Length; + internal ushort MaximumLength; + [MarshalAs(UnmanagedType.LPWStr)] + internal string Buffer; + + internal void Set(string src) + { + this.Buffer = src; + this.Length = (ushort)(src.Length * sizeof(char)); + this.MaximumLength = (ushort)(this.Length + sizeof(char)); + } + } + + /// <summary> + /// Structure used as the last parameter for LSALookupNames + /// </summary> + [StructLayout(LayoutKind.Sequential)] + private struct LSA_TRANSLATED_SID2 + { + public uint Use; + public IntPtr SID; + public int DomainIndex; + public uint Flags; + }; + #endregion interop structures + + #region safe handles + /// <summary> + /// Handle for LSA objects including Policy and Account + /// </summary> + private class LsaSafeHandle : SafeHandleZeroOrMinusOneIsInvalid + { + [DllImport("advapi32.dll")] + private static extern uint LsaClose(IntPtr ObjectHandle); + + /// <summary> + /// Prevents a default instance of the LsaPolicySafeHAndle class from being created. + /// </summary> + private LsaSafeHandle(): base(true) + { + } + + /// <summary> + /// Calls NativeMethods.CloseHandle(handle) + /// </summary> + /// <returns>the return of NativeMethods.CloseHandle(handle)</returns> + [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] + protected override bool ReleaseHandle() + { + long returnValue = LsaSafeHandle.LsaClose(this.handle); + return returnValue != 0; + + } + } + + /// <summary> + /// Handle for IntPtrs returned from Lsa calls that have to be freed with + /// LsaFreeMemory + /// </summary> + private class SafeLsaMemoryHandle : SafeHandleZeroOrMinusOneIsInvalid + { + [DllImport("advapi32")] + internal static extern int LsaFreeMemory(IntPtr Buffer); + + private SafeLsaMemoryHandle() : base(true) { } + + private SafeLsaMemoryHandle(IntPtr handle) + : base(true) + { + SetHandle(handle); + } + + private static SafeLsaMemoryHandle InvalidHandle + { + get { return new SafeLsaMemoryHandle(IntPtr.Zero); } + } + + override protected bool ReleaseHandle() + { + return SafeLsaMemoryHandle.LsaFreeMemory(handle) == 0; + } + + internal IntPtr Memory + { + get + { + return this.handle; + } + } + } + #endregion safe handles + + #region interop function declarations + /// <summary> + /// Opens LSA Policy + /// </summary> + [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] + private static extern uint LsaOpenPolicy( + IntPtr SystemName, + ref LSA_OBJECT_ATTRIBUTES ObjectAttributes, + uint DesiredAccess, + out LsaSafeHandle PolicyHandle + ); + + /// <summary> + /// Convert the name into a SID which is used in remaining calls + /// </summary> + [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true), SuppressUnmanagedCodeSecurityAttribute] + private static extern uint LsaLookupNames2( + LsaSafeHandle PolicyHandle, + uint Flags, + uint Count, + LSA_UNICODE_STRING[] Names, + out SafeLsaMemoryHandle ReferencedDomains, + out SafeLsaMemoryHandle Sids + ); + + /// <summary> + /// Opens the LSA account corresponding to the user's SID + /// </summary> + [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] + private static extern uint LsaOpenAccount( + LsaSafeHandle PolicyHandle, + IntPtr Sid, + uint Access, + out LsaSafeHandle AccountHandle); + + /// <summary> + /// Creates an LSA account corresponding to the user's SID + /// </summary> + [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] + private static extern uint LsaCreateAccount( + LsaSafeHandle PolicyHandle, + IntPtr Sid, + uint Access, + out LsaSafeHandle AccountHandle); + + /// <summary> + /// Gets the LSA Account access + /// </summary> + [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] + private static extern uint LsaGetSystemAccessAccount( + LsaSafeHandle AccountHandle, + out uint SystemAccess); + + /// <summary> + /// Sets the LSA Account access + /// </summary> + [DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] + private static extern uint LsaSetSystemAccessAccount( + LsaSafeHandle AccountHandle, + uint SystemAccess); + #endregion interop function declarations + + /// <summary> + /// Sets the Log On As A Service Policy for <paramref name="userName"/>, if not already set. + /// </summary> + /// <param name="userName">the user name we want to allow logging on as a service</param> + /// <exception cref="ArgumentNullException">If the <paramref name="userName"/> is null or empty.</exception> + /// <exception cref="InvalidOperationException">In the following cases: + /// Failure opening the LSA Policy. + /// The <paramref name="userName"/> is too large. + /// Failure looking up the user name. + /// Failure opening LSA account (other than account not found). + /// Failure creating LSA account. + /// Failure getting LSA account policy access. + /// Failure setting LSA account policy access. + /// </exception> + public static void SetLogOnAsServicePolicy(string userName) + { + if (String.IsNullOrEmpty(userName)) + { + throw new ArgumentNullException("userName"); + } + + LSA_OBJECT_ATTRIBUTES objectAttributes = new LSA_OBJECT_ATTRIBUTES(); + objectAttributes.Initialize(); + + // All handles are delcared in advance so they can be closed on finally + LsaSafeHandle policyHandle = null; + SafeLsaMemoryHandle referencedDomains = null; + SafeLsaMemoryHandle sids = null; + LsaSafeHandle accountHandle = null; + + try + { + uint status = LsaOpenPolicy( + IntPtr.Zero, + ref objectAttributes, + POLICY_LOOKUP_NAMES | POLICY_CREATE_ACCOUNT, + out policyHandle); + + if (status != 0) + { + throw new InvalidOperationException("CannotOpenPolicyErrorMessage"); + } + + // Unicode strings have a maximum length of 32KB. We don't want to create + // LSA strings with more than that. User lengths are much smaller so this check + // ensures userName's length is useful + if (userName.Length > UNLEN + DNLEN + EXTRA_LENGTH) + { + throw new InvalidOperationException("UserNameTooLongErrorMessage"); + } + + LSA_UNICODE_STRING lsaUserName = new LSA_UNICODE_STRING(); + lsaUserName.Set(userName); + + LSA_UNICODE_STRING[] names = new LSA_UNICODE_STRING[1]; + names[0].Set(userName); + + status = LsaLookupNames2( + policyHandle, + 0, + 1, + new LSA_UNICODE_STRING[] { lsaUserName }, + out referencedDomains, + out sids); + + if (status != 0) + { + throw new InvalidOperationException("CannotLookupNamesErrorMessage"); + } + + LSA_TRANSLATED_SID2 sid = (LSA_TRANSLATED_SID2)Marshal.PtrToStructure(sids.Memory, typeof(LSA_TRANSLATED_SID2)); + + status = LsaOpenAccount(policyHandle, + sid.SID, + ACCOUNT_VIEW | ACCOUNT_ADJUST_SYSTEM_ACCESS, + out accountHandle); + + uint currentAccess = 0; + + if (status == 0) + { + status = LsaGetSystemAccessAccount(accountHandle, out currentAccess); + + if (status != 0) + { + throw new InvalidOperationException("CannotGetAccountAccessErrorMessage"); + } + + } + else if (status == STATUS_OBJECT_NAME_NOT_FOUND) + { + status = LsaCreateAccount( + policyHandle, + sid.SID, + ACCOUNT_ADJUST_SYSTEM_ACCESS, + out accountHandle); + + if (status != 0) + { + throw new InvalidOperationException("CannotCreateAccountAccessErrorMessage"); + } + } + else + { + throw new InvalidOperationException("CannotOpenAccountErrorMessage"); + } + + if ((currentAccess & SECURITY_ACCESS_SERVICE_LOGON) == 0) + { + status = LsaSetSystemAccessAccount( + accountHandle, + currentAccess | SECURITY_ACCESS_SERVICE_LOGON); + if (status != 0) + { + throw new InvalidOperationException("CannotSetAccountAccessErrorMessage"); + } + } + } + finally + { + if (policyHandle != null) { policyHandle.Close(); } + if (referencedDomains != null) { referencedDomains.Close(); } + if (sids != null) { sids.Close(); } + if (accountHandle != null) { accountHandle.Close(); } + } + } + } + } +"@ + + try + { + $null = [LogOnAsServiceHelper.NativeMethods] + } + catch + { + $logOnAsServiceText = $logOnAsServiceText.Replace('CannotOpenPolicyErrorMessage', ` + $script:localizedData.CannotOpenPolicyErrorMessage) + $logOnAsServiceText = $logOnAsServiceText.Replace('UserNameTooLongErrorMessage', ` + $script:localizedData.UserNameTooLongErrorMessage) + $logOnAsServiceText = $logOnAsServiceText.Replace('CannotLookupNamesErrorMessage', ` + $script:localizedData.CannotLookupNamesErrorMessage) + $logOnAsServiceText = $logOnAsServiceText.Replace('CannotOpenAccountErrorMessage', ` + $script:localizedData.CannotOpenAccountErrorMessage) + $logOnAsServiceText = $logOnAsServiceText.Replace('CannotCreateAccountAccessErrorMessage', ` + $script:localizedData.CannotCreateAccountAccessErrorMessage) + $logOnAsServiceText = $logOnAsServiceText.Replace('CannotGetAccountAccessErrorMessage', ` + $script:localizedData.CannotGetAccountAccessErrorMessage) + $logOnAsServiceText = $logOnAsServiceText.Replace('CannotSetAccountAccessErrorMessage', ` + $script:localizedData.CannotSetAccountAccessErrorMessage) + $null = Add-Type $logOnAsServiceText -PassThru + } + + if ($Username.StartsWith('.\')) + { + $Username = $Username.Substring(2) + } + + try + { + [LogOnAsServiceHelper.NativeMethods]::SetLogOnAsServicePolicy($Username) + } + catch + { + $errorMessage = $script:localizedData.ErrorSettingLogOnAsServiceRightsForUser -f $Username, $_.Exception.Message + New-InvalidOperationException -Message $errorMessage + } +} + +<# + .SYNOPSIS + Sets the service properties involving the account the service is running under. + (StartName, StartPassword, DesktopInteract) + + .PARAMETER ServiceName + The name of the service to change the start name of. + + .PARAMETER BuiltInAccount + The name of the built-in account to run the service under. + This value will overwrite the Credential value if Credential is also declared. + + .PARAMETER Credential + The user credential to run the service under. + BuiltInAccount will overwrite this value if BuiltInAccount is also declared. + + .PARAMETER DesktopInteract + Indicates whether or not the service should be able to communicate with a window on the + desktop. + + Must be false for services not running as LocalSystem. + + .NOTES + DesktopInteract is included here because it can only be enabled when the service startup + account name is LocalSystem. In order not to run into a conflict where one property has + been updated before the other, both are updated here at the same time. + + SupportsShouldProcess is enabled because Invoke-CimMethod calls ShouldProcess. + This function calls Invoke-CimMethod directly. +#> +function Set-ServiceAccountProperty +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter()] + [System.String] + [ValidateSet('LocalSystem', 'LocalService', 'NetworkService')] + $BuiltInAccount, + + [Parameter()] + [System.String] + $GroupManagedServiceAccount, + + [Parameter()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [System.Boolean] + $DesktopInteract + ) + + $serviceCimInstance = Get-ServiceCimInstance -ServiceName $ServiceName + + $changeServiceArguments = @{} + + if ($PSBoundParameters.ContainsKey('BuiltInAccount')) + { + $startName = ConvertTo-StartName -Username $BuiltInAccount + + if ($serviceCimInstance.StartName -ine $startName) + { + $changeServiceArguments['StartName'] = $startName + $changeServiceArguments['StartPassword'] = '' + } + } + elseif ($PSBoundParameters.ContainsKey('GroupManagedServiceAccount')) + { + $startName = ConvertTo-StartName -Username $GroupManagedServiceAccount + + if ($serviceCimInstance.StartName -ine $startName) + { + Grant-LogOnAsServiceRight -Username $startName + + $changeServiceArguments['StartName'] = $startName + } + } + elseif ($PSBoundParameters.ContainsKey('Credential')) + { + $startName = ConvertTo-StartName -Username $Credential.UserName + + if ($serviceCimInstance.StartName -ine $startName) + { + Grant-LogOnAsServiceRight -Username $startName + + $changeServiceArguments['StartName'] = $startName + $changeServiceArguments['StartPassword'] = $Credential.GetNetworkCredential().Password + } + } + + if ($PSBoundParameters.ContainsKey('DesktopInteract')) + { + if ($serviceCimInstance.DesktopInteract -ne $DesktopInteract) + { + $changeServiceArguments['DesktopInteract'] = $DesktopInteract + } + } + + if ($changeServiceArguments.Count -gt 0) + { + $changeServiceResult = Invoke-CimMethod -InputObject $ServiceCimInstance -MethodName 'Change' -Arguments $changeServiceArguments + + if ($changeServiceResult.ReturnValue -ne 0) + { + $serviceChangePropertyString = $changeServiceArguments.Keys -join ', ' + $errorMessage = $script:localizedData.InvokeCimMethodFailed -f 'Change', $ServiceName, $serviceChangePropertyString, $changeServiceResult.ReturnValue + New-InvalidArgumentException -ArgumentName 'BuiltInAccount, Credential, or DesktopInteract' -Message $errorMessage + } + } +} + +<# + .SYNOPSIS + Sets the startup type of the service with the given name. + + .PARAMETER ServiceName + The name of the service to set the startup type of. + + .PARAMETER StartupType + The startup type value to set for the service. + + .NOTES + SupportsShouldProcess is enabled because Invoke-CimMethod calls ShouldProcess. + This function calls Invoke-CimMethod directly. +#> +function Set-ServiceStartupType +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter(Mandatory = $true)] + [ValidateSet('Automatic', 'Manual', 'Disabled')] + [System.String] + $StartupType + ) + + $serviceCimInstance = Get-ServiceCimInstance -ServiceName $ServiceName + $serviceStartupType = ConvertTo-StartupTypeString -StartMode $serviceCimInstance.StartMode + + if ($serviceStartupType -ieq $StartupType) + { + Write-Verbose -Message ($script:localizedData.ServiceStartupTypeMatches -f $ServiceName) + } + else + { + Write-Verbose -Message ($script:localizedData.ServiceStartupTypeDoesNotMatch -f $ServiceName) + + $changeServiceArguments = @{ + StartMode = $StartupType + } + + $changeResult = Invoke-CimMethod ` + -InputObject $serviceCimInstance ` + -MethodName 'Change' ` + -Arguments $changeServiceArguments + + if ($changeResult.ReturnValue -ne 0) + { + $serviceChangePropertyString = $changeServiceArguments.Keys -join ', ' + $errorMessage = $script:localizedData.InvokeCimMethodFailed -f 'Change', $ServiceName, $serviceChangePropertyString, $changeResult.ReturnValue + New-InvalidArgumentException -ArgumentName 'StartupType' -Message $errorMessage + } + } +} + +<# + .SYNOPSIS + Sets the service with the given name to have the specified properties. + + .PARAMETER Name + The name of the service to set the properties of. + + .PARAMETER DisplayName + The display name the service should have. + + .PARAMETER Description + The description the service should have. + + .PARAMETER Dependencies + The names of the dependencies the service should have. + + .PARAMETER BuiltInAccount + The built-in account the service should start under. + + Cannot be specified at the same time as Credential or GroupManagedServiceAccount. + + .PARAMETER GroupManagedServiceAccount + The Group Managed Service Account that is used to run the service. + + Cannot be specified at the same time as BuiltInAccount or Credential. + + .PARAMETER Credential + The credential of the user account the service should start under. + + Cannot be specified at the same time as BuiltInAccount or GroupManagedServiceAccount. + The user specified by this credential will automatically be granted the Log on as a Service + right. + + .PARAMETER DesktopInteract + Indicates whether or not the service should be able to communicate with a window on the desktop. + + .PARAMETER StartupType + The startup type the service should have. + + .NOTES + SupportsShouldProcess is enabled because Invoke-CimMethod calls ShouldProcess. + Here are the paths through which Set-ServiceProperty calls Invoke-CimMethod: + + Set-ServiceProperty --> Set-ServiceDependency --> Invoke-CimMethod + --> Set-ServieceAccountProperty --> Invoke-CimMethod + --> Set-ServiceStartupType --> Invoke-CimMethod +#> +function Set-ServiceProperty +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter()] + [ValidateSet('Automatic', 'Manual', 'Disabled')] + [System.String] + $StartupType, + + [Parameter()] + [ValidateSet('LocalSystem', 'LocalService', 'NetworkService')] + [System.String] + $BuiltInAccount, + + [Parameter()] + [System.String] + $GroupManagedServiceAccount, + + [Parameter()] + [System.Boolean] + $DesktopInteract, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $DisplayName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Description, + + [Parameter()] + [System.String[]] + [AllowEmptyCollection()] + $Dependencies, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + # Update display name and/or description if needed + $serviceCimInstance = Get-ServiceCimInstance -ServiceName $ServiceName + + $setServiceParameters = @{} + + if ($PSBoundParameters.ContainsKey('DisplayName') -and $serviceCimInstance.DisplayName -ine $DisplayName) + { + $setServiceParameters['DisplayName'] = $DisplayName + } + + if ($PSBoundParameters.ContainsKey('Description') -and $serviceCimInstance.Description -ine $Description) + { + $setServiceParameters['Description'] = $Description + } + + if ($setServiceParameters.Count -gt 0) + { + $null = Set-Service -Name $ServiceName @setServiceParameters + } + + # Update service dependencies if needed + if ($PSBoundParameters.ContainsKey('Dependencies')) + { + Set-ServiceDependency -ServiceName $ServiceName -Dependencies $Dependencies + } + + # Update service account properties if needed + $setServiceAccountPropertyParameters = @{} + + if ($PSBoundParameters.ContainsKey('BuiltInAccount')) + { + $setServiceAccountPropertyParameters['BuiltInAccount'] = $BuiltInAccount + } + elseif ($PSBoundParameters.ContainsKey('GroupManagedServiceAccount')) + { + $setServiceAccountPropertyParameters['GroupManagedServiceAccount'] = $GroupManagedServiceAccount + } + elseif ($PSBoundParameters.ContainsKey('Credential')) + { + $setServiceAccountPropertyParameters['Credential'] = $Credential + } + + if ($PSBoundParameters.ContainsKey('DesktopInteract')) + { + $setServiceAccountPropertyParameters['DesktopInteract'] = $DesktopInteract + } + + if ($setServiceAccountPropertyParameters.Count -gt 0) + { + Set-ServiceAccountProperty -ServiceName $ServiceName @setServiceAccountPropertyParameters + } + + # Update startup type + if ($PSBoundParameters.ContainsKey('StartupType')) + { + Set-ServiceStartupType -ServiceName $ServiceName -StartupType $StartupType + } +} + +<# + .SYNOPSIS + Deletes the service with the given name. + + This is a wrapper function for unit testing. + + .PARAMETER Name + The name of the service to delete. +#> +function Remove-Service +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name + ) + + & 'sc.exe' 'delete' $Name +} + +<# + .SYNOPSIS + Deletes the service with the given name and waits for the service to be deleted. + + .PARAMETER Name + The name of the service to delete. + + .PARAMETER TerminateTimeout + The time to wait for the service to be deleted in milliseconds. +#> +function Remove-ServiceWithTimeout +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [System.UInt32] + $TerminateTimeout + ) + + Remove-Service -Name $Name + + $serviceDeleted = $false + $start = [System.DateTime]::Now + + while (-not $serviceDeleted -and ([System.DateTime]::Now - $start).TotalMilliseconds -lt $TerminateTimeout) + { + $service = Get-Service -Name $Name -ErrorAction 'SilentlyContinue' + + if ($null -eq $service) + { + $serviceDeleted = $true + } + else + { + Write-Verbose -Message ($script:localizedData.WaitingForServiceDeletion -f $Name) + Start-Sleep -Seconds 1 + } + } + + if ($serviceDeleted) + { + Write-Verbose -Message ($script:localizedData.ServiceDeletionSucceeded -f $Name) + } + else + { + New-InvalidOperationException -Message ($script:localizedData.ServiceDeletionFailed -f $Name) + } +} + +<# + .SYNOPSIS + Waits for the service with the given name to reach the given state within the given time + span. + + This is a wrapper function for unit testing. + + .PARAMETER ServiceName + The name of the service that should be in the given state. + + .PARAMETER State + The state the service should be in. + + .PARAMETER WaitTimeSpan + A time span of how long to wait for the service to reach the desired state. +#> +function Wait-ServiceStateWithTimeout +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter(Mandatory = $true)] + [System.ServiceProcess.ServiceControllerStatus] + $State, + + [Parameter(Mandatory = $true)] + [System.TimeSpan] + $WaitTimeSpan + ) + + $service = Get-Service -Name $ServiceName -ErrorAction 'SilentlyContinue' + $Service.WaitForStatus($State, $WaitTimeSpan) +} + +<# + .SYNOPSIS + Starts the service with the given name, if it is not already running, and waits for the + service to be running. + + .PARAMETER ServiceName + The name of the service to start. + + .PARAMETER StartupTimeout + The time to wait for the service to be running in milliseconds. +#> +function Start-ServiceWithTimeout +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter(Mandatory = $true)] + [System.UInt32] + $StartupTimeout + ) + + Start-Service -Name $ServiceName + $waitTimeSpan = New-Object -TypeName 'TimeSpan' -ArgumentList (0, 0, 0, 0, $StartupTimeout) + Wait-ServiceStateWithTimeout -ServiceName $ServiceName -State 'Running' -WaitTimeSpan $waitTimeSpan +} + +<# + .SYNOPSIS + Stops the service with the given name, if it is not already stopped, and waits for the + service to be stopped. + + .PARAMETER ServiceName + The name of the service to stop. + + .PARAMETER TerminateTimeout + The time to wait for the service to be stopped in milliseconds. +#> +function Stop-ServiceWithTimeout +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ServiceName, + + [Parameter(Mandatory = $true)] + [System.UInt32] + $TerminateTimeout + ) + + Stop-Service -Name $ServiceName + $waitTimeSpan = New-Object -TypeName 'TimeSpan' -ArgumentList (0, 0, 0, 0, $TerminateTimeout) + Wait-ServiceStateWithTimeout -ServiceName $ServiceName -State 'Stopped' -WaitTimeSpan $waitTimeSpan +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/DSC_xServiceResource.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/DSC_xServiceResource.schema.mof new file mode 100644 index 0000000..2876dbe --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/DSC_xServiceResource.schema.mof @@ -0,0 +1,19 @@ + +[ClassVersion("1.0.0"),FriendlyName("xService")] +class DSC_xServiceResource : OMI_BaseResource +{ + [Key,Description("Indicates the service name. Note that sometimes this is different from the display name. You can get a list of the services and their current state with the Get-Service cmdlet.")] String Name; + [Write,Description("Ensures that the service is present or absent. Defaults to Present."),ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [Write,Description("The path to the service executable file.")] String Path; + [Write,Description("Indicates the startup type for the service."),ValueMap{"Automatic", "Manual", "Disabled"},Values{"Automatic", "Manual", "Disabled"}] String StartupType; + [Write,Description("Indicates the sign-in account to use for the service."),ValueMap{"LocalSystem", "LocalService", "NetworkService"},Values{"LocalSystem", "LocalService", "NetworkService"}] String BuiltInAccount; + [Write,Description("The Group Managed Service Account to run the service under.")] String GroupManagedServiceAccount; + [Write,Description("The credential to run the service under."),EmbeddedInstance("MSFT_Credential")] String Credential; + [Write,Description("The service can create or communicate with a window on the desktop. Must be false for services not running as LocalSystem. Defaults to False.")] Boolean DesktopInteract; + [Write,Description("Indicates the state you want to ensure for the service. Defaults to Running."),ValueMap{"Running", "Stopped", "Ignore"},Values{"Running", "Stopped", "Ignore"}] String State; + [Write,Description("The display name of the service.")] String DisplayName; + [Write,Description("The description of the service.")] String Description; + [Write,Description("An array of strings indicating the names of the dependencies of the service.")] String Dependencies[]; + [Write,Description("The time to wait for the service to start in milliseconds. Defaults to 30000.")] uint32 StartupTimeout; + [Write,Description("The time to wait for the service to stop in milliseconds. Defaults to 30000.")] uint32 TerminateTimeout; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/en-US/DSC_xServiceResource.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/en-US/DSC_xServiceResource.schema.mfl new file mode 100644 index 0000000..69532e1 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/en-US/DSC_xServiceResource.schema.mfl @@ -0,0 +1,16 @@ +[Description("This resource is used to manage services.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xServiceResource : OMI_BaseResource +{ + [key,Description("The name for the service") : Amended] string Name; + [Description("An enumerated value that describes if the service is expected to be running on the machine.\nRunning {default} \nStopped \n") : Amended] string State; + [Description("An enumerated value that describes the service start type.\nAutomatic \nManual \nDisabled \n") : Amended] string StartupType; + [Description("An enumerated value that describes the built in account the service runs under.\nLocalSystem \nLocalService \nNetworkService \n") : Amended] string BuiltInAccount; + [Description("The optional GroupManagedServiceAccount the service runs under, GroupManagedServiceAccount, BuiltInAccount and Credential are mutually exclusive") : Amended] string GroupManagedServiceAccount; + [Description("The optional credentials the service runs under") : Amended] string Credential; + [Description("The service status") : Amended] string Status; + [Description("The service display name") : Amended] string DisplayName; + [Description("The service description") : Amended] string Description; + [Description("The path to the service executable file") : Amended] string Path; + [Description("A list of service dependencies") : Amended] string Dependencies[]; + [Description("An enumerated value that checks whether a service already exists and creates it if it does not exist on the machine.\nPresent {default} \nAbsent \n") : Amended] string Ensure; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/en-US/DSC_xServiceResource.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/en-US/DSC_xServiceResource.strings.psd1 new file mode 100644 index 0000000..6bfb21e --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xServiceResource/en-US/DSC_xServiceResource.strings.psd1 @@ -0,0 +1,40 @@ +<# + Localized resources for DSC_xServiceResource + Strings underneath the blank line are for Grant-LogOnAsServiceRight. +#> + +ConvertFrom-StringData @' + ServiceExists = Service {0} exists. + ServiceDoesNotExist = Service {0} does not exist. + CredentialParametersAreMutallyExclusive = BuiltInAccount, Credential and GroupManagedServiceAccount are mutually exclusive. Please specify only one of these parameters for service {0}. + ServiceAlreadyAbsent = Service {0} is already absent. No change required. + ServiceDoesNotExistPathMissingError = The service '{0}' does not exist, but Path was not specified. Please specify the path to the executable the service should run to create a new service. + CreatingService = Creating new service {0}... + EditingServiceProperties = Editing the properties of service {0}... + RemovingService = Removing the service {0}... + RestartingService = Restarting the service {0}... + ServicePathMatches = The path of service {0} matches the expected path. + ServicePathDoesNotMatch = The path of service {0} does not match the expected path. + ServiceDepdenciesMatch = The dependencies of service {0} match the expected dependencies. + ServiceDepdenciesDoNotMatch = The dependencies of service {0} do not match the expected dependencies. + ServiceStartupTypeMatches = The start mode of service {0} matches the expected start mode. + ServiceStartupTypeDoesNotMatch = The start mode of service {0} does not match the expected start mode. + ServicePropertyDoesNotMatch = The service property {0} of service {1} does not match the expected value. The expected value is {2}. The actual value is {3}. + ServiceCredentialDoesNotMatch = The start name of service {0} does not match the expected username from the given credential. The expected value is {1}. The actual value is {2}. + GroupManagedServiceCredentialDoesNotMatch = The start name of service {0} does not match the expected username from the given Group Managed Service Account. The expected value is {1}. The actual value is {2}. + ServiceDeletionSucceeded = The service {0} has been successfully deleted. + ServiceDeletionFailed = Failed to delete service {0}. + WaitingForServiceDeletion = Waiting for service {0} to be deleted. + ErrorSettingLogOnAsServiceRightsForUser = Error granting user {0} the right to log on as a service. Error message: '{1}' + StartupTypeStateConflict = Service {0} cannot have a startup type of {1} and a state of {2} at the same time. + InvokeCimMethodFailed = The CIM method {0} failed on service {1} while attempting to update the {2} property(s) with the error code {3}. + + CannotOpenPolicyErrorMessage = Cannot open policy manager. + UserNameTooLongErrorMessage = User name is too long. + CannotLookupNamesErrorMessage = Failed to lookup user name. + CannotOpenAccountErrorMessage = Failed to open policy for user. + CannotCreateAccountAccessErrorMessage = Failed to create policy for user. + CannotGetAccountAccessErrorMessage = Failed to get user policy rights. + CannotSetAccountAccessErrorMessage = Failed to set user policy rights. + CorruptDependency = Service '{0}' has a corrupt dependency. For more information, inspect the registry value at HKLM:\\SYSTEM\\CurrentControlSet\\Services\\{0}\\DependOnService. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/DSC_xUserResource.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/DSC_xUserResource.psm1 new file mode 100644 index 0000000..a35c829 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/DSC_xUserResource.psm1 @@ -0,0 +1,1397 @@ +# User name and password needed for this resource and Write-Verbose Used in helper functions +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingUserNameAndPassWordParams', '')] +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCUseVerboseMessageInDSCResource', '')] +param () + +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xUserResource' + +if (-not (Test-IsNanoServer)) +{ + Add-Type -AssemblyName 'System.DirectoryServices.AccountManagement' +} + +<# + .SYNOPSIS + Retrieves the user with the given username + + .PARAMETER UserName + The name of the user to retrieve. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName + ) + + if (Test-IsNanoServer) + { + Get-TargetResourceOnNanoServer @PSBoundParameters + } + else + { + Get-TargetResourceOnFullSKU @PSBoundParameters + } +} + +<# + .SYNOPSIS + Creates, modifies, or deletes a user. + + .PARAMETER UserName + The name of the user to create, modify, or delete. + + .PARAMETER Ensure + Specifies whether the user should exist or not. + By default this is set to Present. + + .PARAMETER FullName + The (optional) full name or display name of the user. + If not provided this value will remain blank. + + .PARAMETER Description + Optional description for the user. + + .PARAMETER Password + The desired password for the user. + + .PARAMETER Disabled + Specifies whether the user should be disabled or not. + By default this is set to $false + + .PARAMETER PasswordNeverExpires + Specifies whether the password should ever expire or not. + By default this is set to $false + + .PARAMETER PasswordChangeRequired + Specifies whether the user must reset their password or not. + By default this is set to $false + + .PARAMETER PasswordChangeNotAllowed + Specifies whether the user is allowed to change their password or not. + By default this is set to $false + + .NOTES + If Ensure is set to 'Present' then the password parameter is required. +#> +function Set-TargetResource +{ + # Should process is called in a helper functions but not directly in Set-TargetResource + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSShouldProcess', '')] + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $FullName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Password, + + [Parameter()] + [System.Boolean] + $Disabled, + + [Parameter()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter()] + [System.Boolean] + $PasswordChangeRequired, + + [Parameter()] + [System.Boolean] + $PasswordChangeNotAllowed + ) + + if (Test-IsNanoServer) + { + Set-TargetResourceOnNanoServer @PSBoundParameters + } + else + { + Set-TargetResourceOnFullSKU @PSBoundParameters + } +} + +<# + .SYNOPSIS + Tests if a user is in the desired state. + + .PARAMETER UserName + The name of the user to test the state of. + + .PARAMETER Ensure + Specifies whether the user should exist or not. + By default this is set to Present + + .PARAMETER FullName + The full name/display name that the user should have. + If not provided, this value will not be tested. + + .PARAMETER Description + The description that the user should have. + If not provided, this value will not be tested. + + .PARAMETER Password + The password the user should have. + + .PARAMETER Disabled + Specifies whether the user account should be disabled or not. + + .PARAMETER PasswordNeverExpires + Specifies whether the password should ever expire or not. + + .PARAMETER PasswordChangeRequired + Not used in Test-TargetResource as there is no easy way to test this value. + + .PARAMETER PasswordChangeNotAllowed + Specifies whether the user should be allowed to change their password or not. +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $FullName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Password, + + [Parameter()] + [System.Boolean] + $Disabled, + + [Parameter()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter()] + [System.Boolean] + $PasswordChangeRequired, + + [Parameter()] + [System.Boolean] + $PasswordChangeNotAllowed + ) + + if (Test-IsNanoServer) + { + Test-TargetResourceOnNanoServer @PSBoundParameters + } + else + { + Test-TargetResourceOnFullSKU @PSBoundParameters + } +} + + +<# + .SYNOPSIS + Retrieves the user with the given username when on a full server + + .PARAMETER UserName + The name of the user to retrieve. +#> +function Get-TargetResourceOnFullSKU +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName + ) + + Set-StrictMode -Version Latest + + Assert-UserNameValid -UserName $UserName + + # Try to find a user by a name + $principalContext = New-Object ` + -TypeName System.DirectoryServices.AccountManagement.PrincipalContext ` + -ArgumentList ([System.DirectoryServices.AccountManagement.ContextType]::Machine) + + try + { + Write-Verbose -Message 'Starting Get-TargetResource on FullSKU' + $user = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($principalContext, $UserName) + + if ($null -ne $user) + { + # The user is found. Return all user properties and Ensure='Present'. + $returnValue = @{ + UserName = $user.Name + Ensure = 'Present' + FullName = $user.DisplayName + Description = $user.Description + Disabled = -not $user.Enabled + PasswordNeverExpires = $user.PasswordNeverExpires + PasswordChangeRequired = $null + PasswordChangeNotAllowed = $user.UserCannotChangePassword + } + + return $returnValue + } + + # The user is not found. Return Ensure = Absent. + return @{ + UserName = $UserName + Ensure = 'Absent' + } + } + catch + { + New-ConnectionException -ErrorId 'MultipleMatches' -ErrorMessage ($script:localizedData.MultipleMatches + $_) + } + finally + { + if ($null -ne $user) + { + $user.Dispose() + } + + $principalContext.Dispose() + } +} + +<# + .SYNOPSIS + Creates, modifies, or deletes a user when on a full server. + + .PARAMETER UserName + The name of the user to create, modify, or delete. + + .PARAMETER Ensure + Specifies whether the user should exist or not. + By default this is set to Present + + .PARAMETER FullName + The (optional) full name or display name of the user. + If not provided this value will remain blank. + + .PARAMETER Description + Optional description for the user. + + .PARAMETER Password + The desired password for the user. + + .PARAMETER Disabled + Specifies whether the user should be disabled or not. + By default this is set to $false + + .PARAMETER PasswordNeverExpires + Specifies whether the password should ever expire or not. + By default this is set to $false + + .PARAMETER PasswordChangeRequired + Specifies whether the user must reset their password or not. + By default this is set to $false + + .PARAMETER PasswordChangeNotAllowed + Specifies whether the user is allowed to change their password or not. + By default this is set to $false + + .NOTES + If Ensure is set to 'Present' then the Password parameter is required. +#> +function Set-TargetResourceOnFullSKU +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $FullName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Password, + + [Parameter()] + [System.Boolean] + $Disabled, + + [Parameter()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter()] + [System.Boolean] + $PasswordChangeRequired, + + [Parameter()] + [System.Boolean] + $PasswordChangeNotAllowed + ) + + Set-StrictMode -Version Latest + + Write-Verbose -Message ($script:localizedData.ConfigurationStarted -f $UserName) + + Assert-UserNameValid -UserName $UserName + + # Try to find a user by name. + $principalContext = New-Object ` + -TypeName System.DirectoryServices.AccountManagement.PrincipalContext ` + -ArgumentList ([System.DirectoryServices.AccountManagement.ContextType]::Machine) + + try + { + try + { + $user = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($principalContext, $UserName) + } + catch + { + New-InvalidOperationException -Message ($script:localizedData.MultipleMatches + $_) + } + + if ($Ensure -eq 'Present') + { + $whatIfShouldProcess = $true + $userExists = $false + $saveChanges = $false + + if ($null -eq $user) + { + # A user does not exist. Check WhatIf for adding a user + $whatIfShouldProcess = $pscmdlet.ShouldProcess($script:localizedData.UserWithName -f $UserName, $script:localizedData.AddOperation) + } + else + { + # A user exists + $userExists = $true + + # Check WhatIf for setting a user + $whatIfShouldProcess = $pscmdlet.ShouldProcess($script:localizedData.UserWithName -f $UserName, $script:localizedData.SetOperation) + } + + if ($whatIfShouldProcess) + { + if (-not $userExists) + { + # The user with the provided name does not exist so add a new user + $user = New-Object ` + -TypeName System.DirectoryServices.AccountManagement.UserPrincipal ` + -ArgumentList $principalContext + $user.Name = $UserName + $saveChanges = $true + } + + # Set user properties. + if ($PSBoundParameters.ContainsKey('FullName') -and ((-not $userExists) -or ($FullName -ne $user.DisplayName))) + { + $user.DisplayName = $FullName + $saveChanges = $true + } + else + { + if (-not $userExists) + { + # For a newly created user, set the DisplayName property to an empty string since by default DisplayName is set to user's name + $user.DisplayName = [System.String]::Empty + } + } + + if ($PSBoundParameters.ContainsKey('Description') -and ((-not $userExists) -or ($Description -ne $user.Description))) + { + $user.Description = $Description + $saveChanges = $true + } + + # Set the password regardless of the state of the user + if ($PSBoundParameters.ContainsKey('Password')) + { + $user.SetPassword($Password.GetNetworkCredential().Password) + $saveChanges = $true + } + + if ($PSBoundParameters.ContainsKey('Disabled') -and ((-not $userExists) -or ($Disabled -eq $user.Enabled))) + { + $user.Enabled = -not $Disabled + $saveChanges = $true + } + + if ($PSBoundParameters.ContainsKey('PasswordNeverExpires') -and ((-not $userExists) -or ($PasswordNeverExpires -ne $user.PasswordNeverExpires))) + { + $user.PasswordNeverExpires = $PasswordNeverExpires + $saveChanges = $true + } + + if ($PSBoundParameters.ContainsKey('PasswordChangeRequired')) + { + if ($PasswordChangeRequired) + { + # Expire the password which will force the user to change the password at the next logon + $user.ExpirePasswordNow() + $saveChanges = $true + } + } + + if ($PSBoundParameters.ContainsKey('PasswordChangeNotAllowed') -and ((-not $userExists) -or ($PasswordChangeNotAllowed -ne $user.UserCannotChangePassword))) + { + $user.UserCannotChangePassword = $PasswordChangeNotAllowed + $saveChanges = $true + + } + + if ($saveChanges) + { + $user.Save() + + # Send an operation success verbose message + if ($userExists) + { + Write-Verbose -Message ($script:localizedData.UserUpdated -f $UserName) + } + else + { + Write-Verbose -Message ($script:localizedData.UserCreated -f $UserName) + } + } + else + { + Write-Verbose -Message ($script:localizedData.NoConfigurationRequired -f $UserName) + } + } + } + else + { + # Ensure is set to 'Absent' + if ($null -ne $user) + { + # The user exists + if ($pscmdlet.ShouldProcess($script:localizedData.UserWithName -f $UserName, $script:localizedData.RemoveOperation)) + { + # Remove the user + $user.Delete() + } + + Write-Verbose -Message ($script:localizedData.UserRemoved -f $UserName) + } + else + { + Write-Verbose -Message ($script:localizedData.NoConfigurationRequiredUserDoesNotExist -f $UserName) + } + } + } + catch + { + New-InvalidOperationException -Message $_ + } + finally + { + if ($null -ne $user) + { + $user.Dispose() + } + + $principalContext.Dispose() + } + + Write-Verbose -Message ($script:localizedData.ConfigurationCompleted -f $UserName) +} + +<# + .SYNOPSIS + Tests if a user is in the desired state when on a full server. + + .PARAMETER UserName + The name of the user to test the state of. + + .PARAMETER Ensure + Specifies whether the user should exist or not. + By default this is set to Present + + .PARAMETER FullName + The full name/display name that the user should have. + If not provided, this value will not be tested. + + .PARAMETER Description + The description that the user should have. + If not provided, this value will not be tested. + + .PARAMETER Password + The password the user should have. + + .PARAMETER Disabled + Specifies whether the user account should be disabled or not. + + .PARAMETER PasswordNeverExpires + Specifies whether the password should ever expire or not. + + .PARAMETER PasswordChangeRequired + Not used in Test-TargetResource as there is no easy way to test this value. + + .PARAMETER PasswordChangeNotAllowed + Specifies whether the user should be allowed to change their password or not. +#> +function Test-TargetResourceOnFullSKU +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $FullName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Password, + + [Parameter()] + [System.Boolean] + $Disabled, + + [Parameter()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter()] + [System.Boolean] + $PasswordChangeRequired, + + [Parameter()] + [System.Boolean] + $PasswordChangeNotAllowed + ) + + Set-StrictMode -Version Latest + + Assert-UserNameValid -UserName $UserName + + # Try to find a user by a name + $principalContext = New-Object System.DirectoryServices.AccountManagement.PrincipalContext ` + -ArgumentList ([System.DirectoryServices.AccountManagement.ContextType]::Machine) + + try + { + $user = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($principalContext, $UserName) + if ($null -eq $user) + { + # A user with the provided name does not exist + Write-Verbose -Message ($script:localizedData.UserDoesNotExist -f $UserName) + + if ($Ensure -eq 'Absent') + { + return $true + } + else + { + return $false + } + } + + # A user with the provided name exists + Write-Verbose -Message ($script:localizedData.UserExists -f $UserName) + + # Validate separate properties + if ($Ensure -eq 'Absent') + { + # The Ensure property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Ensure', 'Absent', 'Present') + return $false + } + + if ($PSBoundParameters.ContainsKey('FullName') -and $FullName -ne $user.DisplayName) + { + # The FullName property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'FullName', $FullName, $user.DisplayName) + return $false + } + + if ($PSBoundParameters.ContainsKey('Description') -and $Description -ne $user.Description) + { + # The Description property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Description', $Description, $user.Description) + return $false + } + + # Password + if ($PSBoundParameters.ContainsKey('Password')) + { + if (-not $principalContext.ValidateCredentials($UserName, $Password.GetNetworkCredential().Password)) + { + # The Password property does not match + Write-Verbose -Message ($script:localizedData.PasswordPropertyMismatch -f 'Password') + return $false + } + } + + if ($PSBoundParameters.ContainsKey('Disabled') -and $Disabled -eq $user.Enabled) + { + # The Disabled property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Disabled', $Disabled, $user.Enabled) + return $false + } + + if ($PSBoundParameters.ContainsKey('PasswordNeverExpires') -and $PasswordNeverExpires -ne $user.PasswordNeverExpires) + { + # The PasswordNeverExpires property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'PasswordNeverExpires', $PasswordNeverExpires, $user.PasswordNeverExpires) + return $false + } + + if ($PSBoundParameters.ContainsKey('PasswordChangeNotAllowed') -and $PasswordChangeNotAllowed -ne $user.UserCannotChangePassword) + { + # The PasswordChangeNotAllowed property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'PasswordChangeNotAllowed', $PasswordChangeNotAllowed, $user.UserCannotChangePassword) + return $false + } + } + catch + { + New-ConnectionException -ErrorId 'ConnectionError' -ErrorMessage ($script:localizedData.ConnectionError + $_) + } + + finally + { + if ($null -ne $user) + { + $user.Dispose() + } + + $principalContext.Dispose() + + } + + # All properties match + Write-Verbose -Message ($script:localizedData.AllUserPropertisMatch -f 'User', $UserName) + return $true +} + + +<# + .SYNOPSIS + Retrieves the user with the given username when on Nano Server. + + .PARAMETER UserName + The name of the user to retrieve. +#> +function Get-TargetResourceOnNanoServer +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName + ) + + Set-StrictMode -Version Latest + + Assert-UserNameValid -UserName $UserName + + # Try to find a user by a name + try + { + Write-Verbose -Message 'Starting Get-TargetResource on NanoServer' + [Microsoft.PowerShell.Commands.LocalUser] $user = Get-LocalUser -Name $UserName -ErrorAction Stop + } + catch [System.Exception] + { + if ($_.CategoryInfo.ToString().Contains('UserNotFoundException')) + { + # The user is not found + return @{ + UserName = $UserName + Ensure = 'Absent' + } + } + New-InvalidOperationException -ErrorRecord $_ + } + + # The user is found. Return all user properties and Ensure = 'Present'. + $returnValue = @{ + UserName = $user.Name + Ensure = 'Present' + FullName = $user.FullName + Description = $user.Description + Disabled = -not $user.Enabled + PasswordChangeRequired = $null + PasswordChangeNotAllowed = -not $user.UserMayChangePassword + } + + if ($user.PasswordExpires) + { + $returnValue.Add('PasswordNeverExpires', $false) + } + else + { + $returnValue.Add('PasswordNeverExpires', $true) + } + + return $returnValue +} + +<# + .SYNOPSIS + Creates, modifies, or deletes a user when on Nano Server. + + .PARAMETER UserName + The name of the user to create, modify, or delete. + + .PARAMETER Ensure + Specifies whether the user should exist or not. + By default this is set to Present + + .PARAMETER FullName + The (optional) full name or display name of the user. + If not provided this value will remain blank. + + .PARAMETER Description + Optional description for the user. + + .PARAMETER Password + The desired password for the user. + + .PARAMETER Disabled + Specifies whether the user should be disabled or not. + By default this is set to $false + + .PARAMETER PasswordNeverExpires + Specifies whether the password should ever expire or not. + By default this is set to $false + + .PARAMETER PasswordChangeRequired + Specifies whether the user must reset their password or not. + By default this is set to $false + + .PARAMETER PasswordChangeNotAllowed + Specifies whether the user is allowed to change their password or not. + By default this is set to $false + + .NOTES + If Ensure is set to 'Present' then the Password parameter is required. +#> +function Set-TargetResourceOnNanoServer +{ + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $FullName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Password, + + [Parameter()] + [System.Boolean] + $Disabled, + + [Parameter()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter()] + [System.Boolean] + $PasswordChangeRequired, + + [Parameter()] + [System.Boolean] + $PasswordChangeNotAllowed + ) + + Set-StrictMode -Version Latest + + Write-Verbose -Message ($script:localizedData.ConfigurationStarted -f $UserName) + + Assert-UserNameValid -UserName $UserName + + # Try to find a user by a name. + $userExists = $false + + try + { + [Microsoft.PowerShell.Commands.LocalUser] $user = Get-LocalUser -Name $UserName -ErrorAction Stop + $userExists = $true + } + catch [System.Exception] + { + if ($_.CategoryInfo.ToString().Contains('UserNotFoundException')) + { + # The user is not found. + Write-Verbose -Message ($script:localizedData.UserDoesNotExist -f $UserName) + } + else + { + New-InvalidOperationException -ErrorRecord $_ + } + } + + if ($Ensure -eq 'Present') + { + # Ensure is set to 'Present' + + if (-not $userExists) + { + # The user with the provided name does not exist so add a new user + New-LocalUser -Name $UserName -NoPassword + Write-Verbose -Message ($script:localizedData.UserCreated -f $UserName) + } + + # Set user properties + if ($PSBoundParameters.ContainsKey('FullName')) + { + if (-not $userExists -or $FullName -ne $user.FullName) + { + if ($null -eq $FullName) + { + Set-LocalUser -Name $UserName -FullName ([System.String]::Empty) + } + else + { + Set-LocalUser -Name $UserName -FullName $FullName + } + } + } + else + { + if (-not $userExists) + { + # For a newly created user, set the DisplayName property to an empty string since by default DisplayName is set to user's name. + Set-LocalUser -Name $UserName -FullName ([System.String]::Empty) + } + } + + if ($PSBoundParameters.ContainsKey('Description') -and ((-not $userExists) -or ($Description -ne $user.Description))) + { + if ($null -eq $Description) + { + Set-LocalUser -Name $UserName -Description ([System.String]::Empty) + } + else + { + Set-LocalUser -Name $UserName -Description $Description + } + } + + # Set the password regardless of the state of the user + if ($PSBoundParameters.ContainsKey('Password')) + { + Set-LocalUser -Name $UserName -Password $Password.Password + } + + if ($PSBoundParameters.ContainsKey('Disabled') -and ((-not $userExists) -or ($Disabled -eq $user.Enabled))) + { + if ($Disabled) + { + Disable-LocalUser -Name $UserName + } + else + { + Enable-LocalUser -Name $UserName + } + } + + $existingUserPasswordNeverExpires = (($userExists) -and ($null -eq $user.PasswordExpires)) + if ($PSBoundParameters.ContainsKey('PasswordNeverExpires') -and ((-not $userExists) -or ($PasswordNeverExpires -ne $existingUserPasswordNeverExpires))) + { + Set-LocalUser -Name $UserName -PasswordNeverExpires:$passwordNeverExpires + } + + if ($PSBoundParameters.ContainsKey('PasswordChangeRequired') -and ($PasswordChangeRequired)) + { + Set-LocalUser -Name $UserName -AccountExpires ([System.DateTime]::Now) + } + + # NOTE: The parameter name and the property name have opposite meaning. + [System.Boolean] $expected = -not $PasswordChangeNotAllowed + $actual = $expected + + if ($userExists) + { + $actual = $user.UserMayChangePassword + } + + if ($PSBoundParameters.ContainsKey('PasswordChangeNotAllowed') -and ((-not $userExists) -or ($expected -ne $actual))) + { + Set-LocalUser -Name $UserName -UserMayChangePassword $expected + } + } + else + { + # Ensure is set to 'Absent' + if ($userExists) + { + # The user exists + Remove-LocalUser -Name $UserName + + Write-Verbose -Message ($script:localizedData.UserRemoved -f $UserName) + } + else + { + Write-Verbose -Message ($script:localizedData.NoConfigurationRequiredUserDoesNotExist -f $UserName) + } + } + + Write-Verbose -Message ($script:localizedData.ConfigurationCompleted -f $UserName) +} + +<# + .SYNOPSIS + Tests if a user is in the desired state when on Nano Server. + + .PARAMETER UserName + The name of the user to test the state of. + + .PARAMETER Ensure + Specifies whether the user should exist or not. + By default this is set to Present + + .PARAMETER FullName + The full name/display name that the user should have. + If not provided, this value will not be tested. + + .PARAMETER Description + The description that the user should have. + If not provided, this value will not be tested. + + .PARAMETER Password + The password the user should have. + + .PARAMETER Disabled + Specifies whether the user account should be disabled or not. + + .PARAMETER PasswordNeverExpires + Specifies whether the password should ever expire or not. + + .PARAMETER PasswordChangeRequired + Not used in Test-TargetResource as there is no easy way to test this value. + + .PARAMETER PasswordChangeNotAllowed + Specifies whether the user should be allowed to change their password or not. +#> +function Test-TargetResourceOnNanoServer +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $FullName, + + [Parameter()] + [System.String] + $Description, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Password, + + [Parameter()] + [System.Boolean] + $Disabled, + + [Parameter()] + [System.Boolean] + $PasswordNeverExpires, + + [Parameter()] + [System.Boolean] + $PasswordChangeRequired, + + [Parameter()] + [System.Boolean] + $PasswordChangeNotAllowed + ) + + Set-StrictMode -Version Latest + + Assert-UserNameValid -UserName $UserName + + # Try to find a user by a name + try + { + [Microsoft.PowerShell.Commands.LocalUser] $user = Get-LocalUser -Name $UserName -ErrorAction Stop + } + catch [System.Exception] + { + if ($_.CategoryInfo.ToString().Contains('UserNotFoundException')) + { + # The user is not found + if ($Ensure -eq 'Absent') + { + return $true + } + else + { + return $false + } + } + New-InvalidOperationException -ErrorRecord $_ + } + + # A user with the provided name exists + Write-Verbose -Message ($script:localizedData.UserExists -f $UserName) + + # Validate separate properties + if ($Ensure -eq 'Absent') + { + # The Ensure property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Ensure', 'Absent', 'Present') + return $false + } + + if ($PSBoundParameters.ContainsKey('FullName') -and $FullName -ne $user.FullName) + { + # The FullName property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'FullName', $FullName, $user.FullName) + return $false + } + + if ($PSBoundParameters.ContainsKey('Description') -and $Description -ne $user.Description) + { + # The Description property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Description', $Description, $user.Description) + return $false + } + + if ($PSBoundParameters.ContainsKey('Password')) + { + if (-not (Test-CredentialsValidOnNanoServer -UserName $UserName -Password $Password.Password)) + { + # The Password property does not match + Write-Verbose -Message ($script:localizedData.PasswordPropertyMismatch -f 'Password') + return $false + } + } + + if ($PSBoundParameters.ContainsKey('Disabled') -and ($Disabled -eq $user.Enabled)) + { + # The Disabled property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'Disabled', $Disabled, $user.Enabled) + return $false + } + + $existingUserPasswordNeverExpires = ($null -eq $user.PasswordExpires) + if ($PSBoundParameters.ContainsKey('PasswordNeverExpires') -and $PasswordNeverExpires -ne $existingUserPasswordNeverExpires) + { + # The PasswordNeverExpires property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'PasswordNeverExpires', $PasswordNeverExpires, $existingUserPasswordNeverExpires) + return $false + } + + if ($PSBoundParameters.ContainsKey('PasswordChangeNotAllowed') -and $PasswordChangeNotAllowed -ne (-not $user.UserMayChangePassword)) + { + # The PasswordChangeNotAllowed property does not match + Write-Verbose -Message ($script:localizedData.PropertyMismatch -f 'PasswordChangeNotAllowed', $PasswordChangeNotAllowed, (-not $user.UserMayChangePassword)) + return $false + } + + # All properties match. Return $true. + Write-Verbose -Message ($script:localizedData.AllUserPropertisMatch -f 'User', $UserName) + return $true +} + +<# + .SYNOPSIS + Checks that the username does not contain invalid characters. + + .PARAMETER UserName + The username to validate. +#> +function Assert-UserNameValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName + ) + + # Check if the name consists of only periods and/or white spaces + $wrongName = $true + + for ($i = 0; $i -lt $UserName.Length; $i++) + { + if (-not [System.Char]::IsWhiteSpace($UserName, $i) -and $UserName[$i] -ne '.') + { + $wrongName = $false + break + } + } + + $invalidChars = @('\', '/', '"', '[', ']', ':', '|', '<', '>', '+', '=', ';', ',', '?', '*', '@') + + if ($wrongName) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidUserName -f $UserName, [System.String]::Join(' ', $invalidChars)) ` + -ArgumentName 'UserName' + } + + if ($UserName.IndexOfAny($invalidChars) -ne -1) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidUserName -f $UserName, [System.String]::Join(' ', $invalidChars)) ` + -ArgumentName 'UserName' + } +} + +<# + .SYNOPSIS + Creates a new Connection error record and throws it. + + .PARAMETER ErrorId + The ID for the error record to be thrown. + + .PARAMETER ErrorMessage + Message to be included in the error record to be thrown. +#> +function New-ConnectionException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ErrorMessage + ) + + $errorCategory = [System.Management.Automation.ErrorCategory]::ConnectionError + $exception = New-Object ` + -TypeName System.ArgumentException ` + -ArgumentList $ErrorMessage + $errorRecord = New-Object ` + -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList @($exception, $ErrorId, $errorCategory, $null) + throw $errorRecord +} + +<# + .SYNOPSIS + Tests the local user's credentials on the local machine. + + .PARAMETER UserName + The username to validate the credentials of. + + .PARAMETER Password + The password of the given user. +#> +function Test-CredentialsValidOnNanoServer +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $UserName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Security.SecureString] + $Password + ) + + $source = @' + [Flags] + private enum LogonType + { + Logon32LogonInteractive = 2, + Logon32LogonNetwork, + Logon32LogonBatch, + Logon32LogonService, + Logon32LogonUnlock, + Logon32LogonNetworkCleartext, + Logon32LogonNewCredentials + } + + [Flags] + private enum LogonProvider + { + Logon32ProviderDefault = 0, + Logon32ProviderWinnt35, + Logon32ProviderWinnt40, + Logon32ProviderWinnt50 + } + + [DllImport("api-ms-win-security-logon-l1-1-1.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern Boolean LogonUser( + String lpszUserName, + String lpszDomain, + IntPtr lpszPassword, + LogonType dwLogonType, + LogonProvider dwLogonProvider, + out IntPtr phToken + ); + + + [DllImport("api-ms-win-core-handle-l1-1-0.dll", + EntryPoint = "CloseHandle", SetLastError = true, + CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] + internal static extern bool CloseHandle(IntPtr handle); + + public static bool ValidateCredentials(string username, SecureString password) + { + IntPtr tokenHandle = IntPtr.Zero; + IntPtr unmanagedPassword = IntPtr.Zero; + + unmanagedPassword = SecureStringMarshal.SecureStringToCoTaskMemUnicode(password); + + try + { + return LogonUser( + username, + null, + unmanagedPassword, + LogonType.Logon32LogonInteractive, + LogonProvider.Logon32ProviderDefault, + out tokenHandle); + } + catch + { + return false; + } + finally + { + if (tokenHandle != IntPtr.Zero) + { + CloseHandle(tokenHandle); + } + if (unmanagedPassword != IntPtr.Zero) { + Marshal.ZeroFreeCoTaskMemUnicode(unmanagedPassword); + } + unmanagedPassword = IntPtr.Zero; + } + } +'@ + + Add-Type -PassThru -Namespace Microsoft.Windows.DesiredStateConfiguration.NanoServer.UserResource ` + -Name CredentialsValidationTool -MemberDefinition $source -Using System.Security -ReferencedAssemblies System.Security.SecureString.dll | Out-Null + return [Microsoft.Windows.DesiredStateConfiguration.NanoServer.UserResource.CredentialsValidationTool]::ValidateCredentials($UserName, $Password) +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/DSC_xUserResource.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/DSC_xUserResource.schema.mof new file mode 100644 index 0000000..5bb0191 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/DSC_xUserResource.schema.mof @@ -0,0 +1,13 @@ +[ClassVersion("1.0.0"), FriendlyName("xUser")] +class DSC_xUserResource : OMI_BaseResource +{ + [Key,Description("The name of the User to Create/Modify/Delete")] String UserName; + [Write,Description("An enumerated value that describes if the user is expected to exist on the machine"),ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] String Ensure; + [Write,Description("The display name of the user")] String FullName; + [Write,Description("A description for the user")] String Description; + [Write,Description("The password for the user"),EmbeddedInstance("MSFT_Credential")] String Password; + [Write,Description("Value used to disable/enable a user account")] Boolean Disabled; + [Write,Description("Value used to set whether a user's password expires or not")] Boolean PasswordNeverExpires; + [Write,Description("Value used to require a user to change their password")] Boolean PasswordChangeRequired; + [Write,Description("Value used to set whether a user can/cannot change their password")] Boolean PasswordChangeNotAllowed; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/en-US/DSC_xUserResource.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/en-US/DSC_xUserResource.schema.mfl new file mode 100644 index 0000000..1723e04 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/en-US/DSC_xUserResource.schema.mfl @@ -0,0 +1,13 @@ +[Description("This resource is used to manage local user accounts.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xUserResource : OMI_BaseResource +{ + [Key, Description("The name of the User to Create/Modify/Delete") : Amended] String UserName; + [Write, Description("An enumerated value that describes if the user is expected to exist on the machine, ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Write, Description("The full name of the user") : Amended] String FullName; + [Write, Description("A description for the user") : Amended] String Description; + [Write, Description("The password for the user"), (EmbeddedInstance("MSFT_Credential") : Amended] String Password; + [Write, Description("Value used to disable/enable a user account") : Amended] Boolean Disabled; + [Write, Description("Value used to set whether a user's password expires or not") : Amended] Boolean PasswordNeverExpires; + [Write, Description("Value used to require a user to change their password") : Amended] Boolean PasswordChangeRequired; + [Write, Description("Value used to set whether a user can/cannot change their password") : Amended] Boolean PasswordChangeNotAllowed; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/en-US/DSC_xUserResource.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/en-US/DSC_xUserResource.strings.psd1 new file mode 100644 index 0000000..ee860bb --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xUserResource/en-US/DSC_xUserResource.strings.psd1 @@ -0,0 +1,23 @@ +# Localized resources for DSC_xUserResource + +ConvertFrom-StringData @' + UserWithName = User: {0} + RemoveOperation = Remove + AddOperation = Add + SetOperation = Set + ConfigurationStarted = Configuration of user {0} started. + ConfigurationCompleted = Configuration of user {0} completed successfully. + UserCreated = User {0} created successfully. + UserUpdated = User {0} properties updated successfully. + UserRemoved = User {0} removed successfully. + NoConfigurationRequired = User {0} exists on this node with the desired properties. No action required. + NoConfigurationRequiredUserDoesNotExist = User {0} does not exist on this node. No action required. + InvalidUserName = The name {0} cannot be used. Names may not consist entirely of periods and/or spaces, or contain these characters: {1} + UserExists = A user with the name {0} exists. + UserDoesNotExist = A user with the name {0} does not exist. + PropertyMismatch = The value of the {0} property is expected to be {1} but it is {2}. + PasswordPropertyMismatch = The value of the {0} property does not match. + AllUserPropertisMatch = All {0} {1} properties match. + ConnectionError = There could be a possible connection error while trying to use the System.DirectoryServices API's. + MultipleMatches = There could be a possible multiple matches exception while trying to use the System.DirectoryServices API's. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/DSC_xWindowsFeature.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/DSC_xWindowsFeature.psm1 new file mode 100644 index 0000000..41fd156 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/DSC_xWindowsFeature.psm1 @@ -0,0 +1,568 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xWindowsFeature' + +<# + .SYNOPSIS + Retrieves the status of the role or feature with the given name on the target machine. + + .PARAMETER Name + The name of the role or feature to retrieve + + .PARAMETER Credential + The credential (if required) to retrieve the role or feature. + Optional. + + .NOTES + If the specified role or feature does not contain any subfeatures then + IncludeAllSubFeature will be set to $false. If the specified feature contains one + or more subfeatures then IncludeAllSubFeature will be set to $true only if all the + subfeatures are installed. Otherwise, IncludeAllSubFeature will be set to $false. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + Write-Verbose -Message ($script:localizedData.GetTargetResourceStartMessage -f $Name) + + Import-ServerManager + + Write-Verbose -Message ($script:localizedData.QueryFeature -f $Name) + + $isWinServer2008R2SP1 = Test-IsWinServer2008R2SP1 + if ($isWinServer2008R2SP1 -and $PSBoundParameters.ContainsKey('Credential')) + { + $feature = Invoke-Command -ScriptBlock { Get-WindowsFeature -Name $Name } ` + -ComputerName . ` + -Credential $Credential ` + } + else + { + $feature = Get-WindowsFeature @PSBoundParameters + } + + Assert-SingleInstanceOfFeature -Feature $feature -Name $Name + + $includeAllSubFeature = $true + + if ($feature.SubFeatures.Count -eq 0) + { + $includeAllSubFeature = $false + } + else + { + foreach ($currentSubFeatureName in $feature.SubFeatures) + { + $getWindowsFeatureParameters = @{ + Name = $currentSubFeatureName + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getWindowsFeatureParameters['Credential'] = $Credential + } + + if ($isWinServer2008R2SP1 -and $PSBoundParameters.ContainsKey('Credential')) + { + <# + Calling Get-WindowsFeature through Invoke-Command to start a new process with + the given credential since Get-WindowsFeature doesn't support the Credential + attribute on this server. + #> + $subFeature = Invoke-Command -ScriptBlock { Get-WindowsFeature -Name $currentSubFeatureName } ` + -ComputerName . ` + -Credential $Credential ` + } + else + { + $subFeature = Get-WindowsFeature @getWindowsFeatureParameters + } + + Assert-SingleInstanceOfFeature -Feature $subFeature -Name $currentSubFeatureName + + if (-not $subFeature.Installed) + { + $includeAllSubFeature = $false + break + } + } + } + + if ($feature.Installed) + { + $ensureResult = 'Present' + } + else + { + $ensureResult = 'Absent' + } + + Write-Verbose -Message ($script:localizedData.GetTargetResourceEndMessage -f $Name) + + # Add all feature properties to the hash table + return @{ + Name = $Name + DisplayName = $feature.DisplayName + Ensure = $ensureResult + IncludeAllSubFeature = $includeAllSubFeature + } +} + +<# + .SYNOPSIS + Installs or uninstalls the role or feature with the given name on the target machine + with the option of installing or uninstalling all subfeatures as well. + + .PARAMETER Name + The name of the role or feature to install or uninstall. + + .PARAMETER Ensure + Specifies whether the role or feature should be installed ('Present') + or uninstalled ('Absent'). + By default this is set to Present. + + .PARAMETER IncludeAllSubFeature + Specifies whether or not all subfeatures should be installed or uninstalled with + the specified role or feature. Default is false. + If this property is true and Ensure is set to Present, all subfeatures will be installed. + If this property is false and Ensure is set to Present, subfeatures will not be installed or uninstalled. + If Ensure is set to Absent, all subfeatures will be uninstalled. + + .PARAMETER Credential + The credential (if required) to install or uninstall the role or feature. + Optional. + + .PARAMETER LogPath + The custom path to the log file to log this operation. + If not passed in, the default log path will be used (%windir%\logs\ServerManager.log). +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $IncludeAllSubFeature = $false, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath + ) + + Write-Verbose -Message ($script:localizedData.SetTargetResourceStartMessage -f $Name) + + Import-ServerManager + + $isWinServer2008R2SP1 = Test-IsWinServer2008R2SP1 + + if ($Ensure -eq 'Present') + { + $addWindowsFeatureParameters = @{ + Name = $Name + IncludeAllSubFeature = $IncludeAllSubFeature + } + + if ($PSBoundParameters.ContainsKey('LogPath')) + { + $addWindowsFeatureParameters['LogPath'] = $LogPath + } + + Write-Verbose -Message ($script:localizedData.InstallFeature -f $Name) + + if ($isWinServer2008R2SP1 -and $PSBoundParameters.ContainsKey('Credential')) + { + <# + Calling Add-WindowsFeature through Invoke-Command to start a new process with + the given credential since Add-WindowsFeature doesn't support the Credential + attribute on this server. + #> + $feature = Invoke-Command -ScriptBlock { Add-WindowsFeature @addWindowsFeatureParameters } ` + -ComputerName . ` + -Credential $Credential + } + else + { + if ($PSBoundParameters.ContainsKey('Credential')) + { + $addWindowsFeatureParameters['Credential'] = $Credential + } + + $feature = Add-WindowsFeature @addWindowsFeatureParameters + } + + if ($null -ne $feature -and $feature.Success) + { + Write-Verbose -Message ($script:localizedData.InstallSuccess -f $Name) + + # Check if reboot is required, if so notify the Local Configuration Manager. + if ($feature.RestartNeeded -eq 'Yes') + { + Write-Verbose -Message $script:localizedData.RestartNeeded + Set-DSCMachineRebootRequired + } + } + else + { + New-InvalidOperationException -Message ($script:localizedData.FeatureInstallationFailureError -f $Name) + } + } + # Ensure = 'Absent' + else + { + $removeWindowsFeatureParameters = @{ + Name = $Name + } + + if ($PSBoundParameters.ContainsKey('LogPath')) + { + $removeWindowsFeatureParameters['LogPath'] = $LogPath + } + + Write-Verbose -Message ($script:localizedData.UninstallFeature -f $Name) + + if ($isWinServer2008R2SP1 -and $PSBoundParameters.ContainsKey('Credential')) + { + <# + Calling Remove-WindowsFeature through Invoke-Command to start a new process with + the given credential since Remove-WindowsFeature doesn't support the Credential + attribute on this server. + #> + $feature = Invoke-Command -ScriptBlock { Remove-WindowsFeature @removeWindowsFeatureParameters } ` + -ComputerName . ` + -Credential $Credential + } + else + { + if ($PSBoundParameters.ContainsKey('Credential')) + { + $addWindowsFeatureParameters['Credential'] = $Credential + } + + $feature = Remove-WindowsFeature @removeWindowsFeatureParameters + } + + if ($null -ne $feature -and $feature.Success) + { + Write-Verbose ($script:localizedData.UninstallSuccess -f $Name) + + # Check if reboot is required, if so notify the Local Configuration Manager. + if ($feature.RestartNeeded -eq 'Yes') + { + Write-Verbose -Message $script:localizedData.RestartNeeded + Set-DSCMachineRebootRequired + } + } + else + { + New-InvalidOperationException -Message ($script:localizedData.FeatureUninstallationFailureError -f $Name) + } + } + + Write-Verbose -Message ($script:localizedData.SetTargetResourceEndMessage -f $Name) +} + +<# + .SYNOPSIS + Tests if the role or feature with the given name is in the desired state. + + .PARAMETER Name + The name of the role or feature to test the state of. + + .PARAMETER Ensure + Specifies whether the role or feature should be installed ('Present') + or uninstalled ('Absent'). + By default this is set to Present. + + .PARAMETER IncludeAllSubFeature + Specifies whether the subfeatures of the indicated role or feature should also be checked + to ensure they are in the desired state. If Ensure is set to 'Present' and this is set to + $true then each subfeature is checked to ensure it is installed as well. If Ensure is set to + Absent and this is set to $true, then each subfeature is checked to ensure it is uninstalled. + As of now, this test can't be used to check if a feature is Installed but all of its + subfeatures are uninstalled. + By default this is set to $false. + + .PARAMETER Credential + The Credential (if required) to test the status of the role or feature. + Optional. + + .PARAMETER LogPath + The path to the log file to log this operation. + Not used in Test-TargetResource. + +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $IncludeAllSubFeature = $false, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath + + ) + + Write-Verbose -Message ($script:localizedData.TestTargetResourceStartMessage -f $Name) + + Import-ServerManager + + $testTargetResourceResult = $false + + $getWindowsFeatureParameters = @{ + Name = $Name + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getWindowsFeatureParameters['Credential'] = $Credential + } + + Write-Verbose -Message ($script:localizedData.QueryFeature -f $Name) + + $isWinServer2008R2SP1 = Test-IsWinServer2008R2SP1 + if ($isWinServer2008R2SP1 -and $PSBoundParameters.ContainsKey('Credential')) + { + <# + Calling Get-WindowsFeature through Invoke-Command to start a new process with + the given credential since Get-WindowsFeature doesn't support the Credential + attribute on this server. + #> + $feature = Invoke-Command -ScriptBlock { Get-WindowsFeature -Name $Name } ` + -ComputerName . ` + -Credential $Credential + } + else + { + $feature = Get-WindowsFeature @getWindowsFeatureParameters + } + + Assert-SingleInstanceOfFeature -Feature $feature -Name $Name + + # Check if the feature is in the requested Ensure state. + if (($Ensure -eq 'Present' -and $feature.Installed -eq $true) -or ` + ($Ensure -eq 'Absent' -and $feature.Installed -eq $false)) + { + $testTargetResourceResult = $true + + if ($IncludeAllSubFeature) + { + # Check if each subfeature is in the requested state. + foreach ($currentSubFeatureName in $feature.SubFeatures) + { + $getWindowsFeatureParameters['Name'] = $currentSubFeatureName + + if ($isWinServer2008R2SP1 -and $PSBoundParameters.ContainsKey('Credential')) + { + <# + Calling Get-WindowsFeature through Invoke-Command to start a new process with + the given credential since Get-WindowsFeature doesn't support the Credential + attribute on this server. + #> + $subFeature = Invoke-Command -ScriptBlock { Get-WindowsFeature -Name $currentSubFeatureName } ` + -ComputerName . ` + -Credential $Credential + } + else + { + $subFeature = Get-WindowsFeature @getWindowsFeatureParameters + } + + Assert-SingleInstanceOfFeature -Feature $subFeature -Name $currentSubFeatureName + + if (-not $subFeature.Installed -and $Ensure -eq 'Present') + { + $testTargetResourceResult = $false + break + } + + if ($subFeature.Installed -and $Ensure -eq 'Absent') + { + $testTargetResourceResult = $false + break + } + } + } + } + else + { + # Ensure is not in the correct state + $testTargetResourceResult = $false + } + + Write-Verbose -Message ($script:localizedData.TestTargetResourceEndMessage -f $Name) + + return $testTargetResourceResult +} + + +<# + .SYNOPSIS + Asserts that a single instance of the given role or feature exists. + + .PARAMETER Feature + The role or feature object to check. + + .PARAMETER Name + The name of the role or feature to include in any error messages that are thrown. + (Not used to assert validity of the feature). +#> +function Assert-SingleInstanceOfFeature +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.Management.Automation.PSObject[]] + $Feature, + + [Parameter()] + [System.String] + $Name + ) + + if ($null -eq $Feature) + { + New-InvalidOperationException -Message ($script:localizedData.FeatureNotFoundError -f $Name) + } + + if ($Feature.Count -gt 1) + { + New-InvalidOperationException -Message ($script:localizedData.MultipleFeatureInstancesError -f $Name) + } +} + +<# + .SYNOPSIS + Sets up the ServerManager module on the target node. + Throws an error if not on a machine running Windows Server. +#> +function Import-ServerManager +{ + param + () + + <# + Enable ServerManager-PSH-Cmdlets feature if OS is WS2008R2 Core. + Datacenter = 12, Standard = 13, Enterprise = 14 + #> + $serverCoreOSCodes = @( 12, 13, 14 ) + + $operatingSystem = Get-CimInstance -Class 'Win32_OperatingSystem' + + # Check if this operating system needs an update to the ServerManager cmdlets + if ($operatingSystem.Version.StartsWith('6.1.') -and ` + $serverCoreOSCodes -contains $operatingSystem.OperatingSystemSKU) + { + Write-Verbose -Message $script:localizedData.EnableServerManagerPSHCmdletsFeature + + <# + ServerManager-PSH-Cmdlets has a depndency on Powershell 2 update: MicrosoftWindowsPowerShell, + so enabling the MicrosoftWindowsPowerShell update. + #> + $null = Dism\online\enable-feature\FeatureName:MicrosoftWindowsPowerShell + $null = Dism\online\enable-feature\FeatureName:ServerManager-PSH-Cmdlets + } + + try + { + Import-Module -Name 'ServerManager' -ErrorAction Stop + } + catch [System.Management.Automation.RuntimeException] + { + if ($_.Exception.Message -like "*Some or all identity references could not be translated*") + { + Write-Verbose $_.Exception.Message + } + else + { + Write-Verbose -Message $script:localizedData.ServerManagerModuleNotFoundMessage + New-InvalidOperationException -Message $script:localizedData.SkuNotSupported + } + } + catch + { + Write-Verbose -Message $script:localizedData.ServerManagerModuleNotFoundMessage + New-InvalidOperationException -Message $script:localizedData.SkuNotSupported + } +} + +<# + .SYNOPSIS + Tests if the machine is a Windows Server 2008 R2 SP1 machine. + + .NOTES + Since Assert-PrequisitesValid ensures that ServerManager is available on the machine, + this function only checks the OS version. +#> +function Test-IsWinServer2008R2SP1 +{ + param + () + + return ([Environment]::OSVersion.Version.ToString().Contains('6.1.')) +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/DSC_xWindowsFeature.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/DSC_xWindowsFeature.schema.mof new file mode 100644 index 0000000..94e1e83 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/DSC_xWindowsFeature.schema.mof @@ -0,0 +1,11 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("xWindowsFeature")] +class DSC_xWindowsFeature : OMI_BaseResource +{ + [Key, Description("The name of the role or feature to install or uninstall.")] String Name; + [Write, Description("Specifies whether the role or feature should be installed or uninstalled. To install the feature, set this property to Present. To uninstall the feature, set the property to Absent."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Write, Description("Specifies whether the subfeatures of the main feature should also be installed.")] Boolean IncludeAllSubFeature; + [Write, Description("The path to the log file to log this operation.")] String LogPath; + [Write, Description("A credential, if needed, to install or uninstall the role or feature."), EmbeddedInstance("MSFT_Credential")] String Credential; + [Read, Description("The display name of the retrieved role or feature.")] String DisplayName; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/en-US/DSC_xWindowsFeature.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/en-US/DSC_xWindowsFeature.schema.mfl new file mode 100644 index 0000000..e87be67 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/en-US/DSC_xWindowsFeature.schema.mfl @@ -0,0 +1,11 @@ +[Description("This resource is used to install, uninstall and query roles or features on the DSC managed node.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xWindowsFeature : OMI_BaseResource +{ + [Key, Description("The name of the role or feature to install or uninstall.") : Amended] String Name; + [Write, Description("Specifies whether the role or feature should be installed or uninstalled. To install the feature, set this property to Present. To uninstall the feature, set the property to Absent.") : Amended] String Ensure; + [Write, Description("Specifies whether the subfeatures of the main feature should also be installed.") : Amended] Boolean IncludeAllSubFeature; + [Write, Description("The path to the log file to log this operation.") : Amended] String LogPath; + [Write, Description("A credential, if needed, to install or uninstall the role or feature."), EmbeddedInstance("MSFT_Credential") : Amended] String Credential; + [Read, Description("The display name of the retrieved role or feature.") : Amended] String DisplayName; +}; + diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/en-US/DSC_xWindowsFeature.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/en-US/DSC_xWindowsFeature.strings.psd1 new file mode 100644 index 0000000..e6c2388 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsFeature/en-US/DSC_xWindowsFeature.strings.psd1 @@ -0,0 +1,23 @@ +# Localized strings for DSC_xWindowsFeature.psd1 + +ConvertFrom-StringData @' + FeatureNotFoundError = The requested feature {0} could not be found on the target machine. + MultipleFeatureInstancesError = Failure to get the requested feature {0} information from the target machine. Wildcard pattern is not supported in the feature name. + FeatureInstallationFailureError = Failure to successfully install the feature {0} . + FeatureUninstallationFailureError = Failure to successfully uninstall the feature {0} . + QueryFeature = Querying for feature {0} using Server Manager cmdlet Get-WindowsFeature. + InstallFeature = Trying to install feature {0} using Server Manager cmdlet Add-WindowsFeature. + UninstallFeature = Trying to uninstall feature {0} using Server Manager cmdlet Remove-WindowsFeature. + RestartNeeded = The Target machine needs to be restarted. + GetTargetResourceStartMessage = Begin executing Get functionality on the {0} feature. + GetTargetResourceEndMessage = End executing Get functionality on the {0} feature. + SetTargetResourceStartMessage = Begin executing Set functionality on the {0} feature. + SetTargetResourceEndMessage = End executing Set functionality on the {0} feature. + TestTargetResourceStartMessage = Begin executing Test functionality on the {0} feature. + TestTargetResourceEndMessage = End executing Test functionality on the {0} feature. + ServerManagerModuleNotFoundMessage = ServerManager module is not installed on the machine. + SkuNotSupported = Installing roles and features using PowerShell Desired State Configuration is supported only on Server SKU's. It is not supported on Client SKU. + EnableServerManagerPSHCmdletsFeature = Windows Server 2008R2 Core operating system detected: ServerManager-PSH-Cmdlets feature has been enabled. + UninstallSuccess = Successfully uninstalled the feature {0}. + InstallSuccess = Successfully installed the feature {0}. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/DSC_xWindowsOptionalFeature.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/DSC_xWindowsOptionalFeature.psm1 new file mode 100644 index 0000000..a3daeda --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/DSC_xWindowsOptionalFeature.psm1 @@ -0,0 +1,417 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xWindowsOptionalFeature' + +<# + .SYNOPSIS + Retrieves the state of a Windows optional feature resource. + + .PARAMETER Name + The name of the Windows optional feature resource to retrieve. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name + ) + + Write-Verbose -Message ($script:localizedData.GetTargetResourceStartMessage -f $Name) + + Assert-ResourcePrerequisitesValid + + $windowsOptionalFeature = Dism\Get-WindowsOptionalFeature -FeatureName $Name -Online + + <# + $windowsOptionalFeatureProperties and this section of code are needed because an error will be thrown if a property + is not found in WMF 4 instead of returning null. + #> + $windowsOptionalFeatureProperties = @{} + $propertiesNeeded = @( 'LogPath', 'State', 'CustomProperties', 'FeatureName', 'LogLevel', 'Description', 'DisplayName' ) + + foreach ($property in $propertiesNeeded) + { + try + { + $windowsOptionalFeatureProperties[$property] = $windowsOptionalFeature.$property + } + catch + { + $windowsOptionalFeatureProperties[$property] = $null + } + } + + $windowsOptionalFeatureResource = @{ + LogPath = $windowsOptionalFeatureProperties.LogPath + Ensure = Convert-FeatureStateToEnsure -State $windowsOptionalFeatureProperties.State + CustomProperties = Convert-CustomPropertyArrayToStringArray ` + -CustomProperties $windowsOptionalFeatureProperties.CustomProperties + Name = $windowsOptionalFeatureProperties.FeatureName + LogLevel = $windowsOptionalFeatureProperties.LogLevel + Description = $windowsOptionalFeatureProperties.Description + DisplayName = $windowsOptionalFeatureProperties.DisplayName + } + + Write-Verbose -Message ($script:localizedData.GetTargetResourceEndMessage -f $Name) + + return $windowsOptionalFeatureResource +} + +<# + .SYNOPSIS + Enables or disables a Windows optional feature + + .PARAMETER Name + The name of the feature to enable or disable. + + .PARAMETER Ensure + Specifies whether the feature should be enabled or disabled. + To enable the feature, set this property to Present. + To disable the feature, set the property to Absent. + + .PARAMETER RemoveFilesOnDisable + Specifies that all files associated with the feature should be removed if the feature is + being disabled. + + .PARAMETER NoWindowsUpdateCheck + Specifies whether or not DISM contacts Windows Update (WU) when searching for the source + files to enable the feature. + If $true, DISM will not contact WU. + + .PARAMETER LogPath + The path to the log file to log this operation. + There is no default value, but if not set, the log will appear at + %WINDIR%\Logs\Dism\dism.log. + + .PARAMETER LogLevel + The maximum output level to show in the log. + Accepted values are: "ErrorsOnly" (only errors are logged), "ErrorsAndWarning" (errors and + warnings are logged), and "ErrorsAndWarningAndInformation" (errors, warnings, and debug + information are logged). +#> +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $RemoveFilesOnDisable, + + [Parameter()] + [System.Boolean] + $NoWindowsUpdateCheck, + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [ValidateSet('ErrorsOnly', 'ErrorsAndWarning', 'ErrorsAndWarningAndInformation')] + [System.String] + $LogLevel = 'ErrorsAndWarningAndInformation' + ) + + Write-Verbose -Message ($script:localizedData.SetTargetResourceStartMessage -f $Name) + + Assert-ResourcePrerequisitesValid + + $dismLogLevel = switch ($LogLevel) + { + 'ErrorsOnly' + { + 'Errors' + break + } + + 'ErrorsAndWarning' + { + 'Warnings' + break + } + + 'ErrorsAndWarningAndInformation' + { + 'WarningsInfo' + break + } + } + + # Construct splatting hashtable for DISM cmdlets + $dismCmdletParameters = @{ + FeatureName = $Name + Online = $true + LogLevel = $dismLogLevel + NoRestart = $true + } + + if ($PSBoundParameters.ContainsKey('LogPath')) + { + $dismCmdletParameters['LogPath'] = $LogPath + } + + if ($Ensure -eq 'Present') + { + if ($PSCmdlet.ShouldProcess($Name, $script:localizedData.ShouldProcessEnableFeature)) + { + if ($NoWindowsUpdateCheck) + { + $dismCmdletParameters['LimitAccess'] = $true + } + + $windowsOptionalFeature = Dism\Enable-WindowsOptionalFeature @dismCmdletParameters + } + + Write-Verbose -Message ($script:localizedData.FeatureInstalled -f $Name) + } + else + { + if ($PSCmdlet.ShouldProcess($Name, $script:localizedData.ShouldProcessDisableFeature)) + { + if ($RemoveFilesOnDisable) + { + $dismCmdletParameters['Remove'] = $true + } + + $windowsOptionalFeature = Dism\Disable-WindowsOptionalFeature @dismCmdletParameters + } + + Write-Verbose -Message ($script:localizedData.FeatureUninstalled -f $Name) + } + + <# + $restartNeeded and this section of code are needed because an error will be thrown if the + RestartNeeded property is not found in WMF 4. + #> + try + { + $restartNeeded = $windowsOptionalFeature.RestartNeeded + } + catch + { + $restartNeeded = $false + } + + # Indicate we need a restart if needed + if ($restartNeeded) + { + Write-Verbose -Message $script:localizedData.RestartNeeded + Set-DSCMachineRebootRequired + } + + Write-Verbose -Message ($script:localizedData.SetTargetResourceEndMessage -f $Name) +} + +<# + .SYNOPSIS + Tests if a Windows optional feature is in the specified state. + + .PARAMETER Name + The name of the feature to test the state of. + + .PARAMETER Ensure + Specifies whether the feature should be enabled or disabled. + To test if the feature is enabled, set this property to Present. + To test if the feature is disabled, set this property to Absent. + + .PARAMETER RemoveFilesOnDisable + Not used in Test-TargetResource. + + .PARAMETER NoWindowsUpdateCheck + Not used in Test-TargetResource. + + .PARAMETER LogPath + Not used in Test-TargetResource. + + .PARAMETER LogLevel + Not used in Test-TargetResource. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.Boolean] + $RemoveFilesOnDisable, + + [Parameter()] + [System.Boolean] + $NoWindowsUpdateCheck, + + [Parameter()] + [System.String] + $LogPath, + + [Parameter()] + [ValidateSet('ErrorsOnly', 'ErrorsAndWarning', 'ErrorsAndWarningAndInformation')] + [System.String] + $LogLevel = 'ErrorsAndWarningAndInformation' + ) + + Write-Verbose -Message ($script:localizedData.TestTargetResourceStartMessage -f $Name) + + Assert-ResourcePrerequisitesValid + + $windowsOptionalFeature = Dism\Get-WindowsOptionalFeature -FeatureName $Name -Online + + $featureIsInDesiredState = $false + + if ($null -eq $windowsOptionalFeature -or $windowsOptionalFeature.State -eq 'Disabled') + { + $featureIsInDesiredState = $Ensure -eq 'Absent' + } + elseif ($windowsOptionalFeature.State -eq 'Enabled') + { + $featureIsInDesiredState = $Ensure -eq 'Present' + } + + Write-Verbose -Message ($script:localizedData.TestTargetResourceEndMessage -f $Name) + + return $featureIsInDesiredState +} + +<# + .SYNOPSIS + Converts a list of CustomProperty objects into an array of Strings. + + .PARAMETER CustomProperties + The list of CustomProperty objects to be converted. + Each CustomProperty object should have Name, Value, and Path properties. +#> +function Convert-CustomPropertyArrayToStringArray +{ + [CmdletBinding()] + [OutputType([System.String[]])] + param + ( + [Parameter()] + [System.Management.Automation.PSObject[]] + $CustomProperties + ) + + $propertiesAsStrings = [System.String[]] @() + + foreach ($customProperty in $CustomProperties) + { + if ($null -ne $customProperty) + { + $propertiesAsStrings += "Name = $($customProperty.Name), Value = $($customProperty.Value), Path = $($customProperty.Path)" + } + } + + return $propertiesAsStrings +} + +<# + .SYNOPSIS + Converts the string state returned by the DISM Get-WindowsOptionalFeature cmdlet to Present or Absent. + + .PARAMETER State + The state to be converted to either Present or Absent. + Should be either Enabled or Disabled. +#> +function Convert-FeatureStateToEnsure +{ + [CmdletBinding()] + [OutputType([System.String])] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $State + ) + + if ($State -eq 'Disabled') + { + return 'Absent' + } + elseif ($State -eq 'Enabled') + { + return 'Present' + } + else + { + Write-Warning ($script:localizedData.CouldNotConvertFeatureState -f $State) + return $State + } +} + +<# + .SYNOPSIS + Throws errors if the prerequisites for using WindowsOptionalFeature are not met on the + target machine. + + Current prerequisites are: + - Must be running either a Windows client, at least Windows Server 2012, or Nano Server + - Must be running as an administrator + - The DISM PowerShell module must be available for import +#> +function Assert-ResourcePrerequisitesValid +{ + [CmdletBinding()] + param () + + Write-Verbose -Message $script:localizedData.ValidatingPrerequisites + + # Check that we're running on Server 2012 (or later) or on a client SKU + $operatingSystem = Get-CimInstance -ClassName 'Win32_OperatingSystem' + + if (($operatingSystem.ProductType -eq 2) -and ([System.Int32] $operatingSystem.BuildNumber -lt 9600)) + { + New-InvalidOperationException -Message $script:localizedData.NotSupportedSku + } + + # Check that we are running as an administrator + $windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() + $windowsPrincipal = New-Object -TypeName 'System.Security.Principal.WindowsPrincipal' -ArgumentList @( $windowsIdentity ) + + $adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator + + if (-not $windowsPrincipal.IsInRole($adminRole)) + { + New-InvalidOperationException -Message $script:localizedData.ElevationRequired + } + + # Check that Dism PowerShell module is available + Import-Module -Name 'Dism' -ErrorVariable 'errorsFromDismImport' -ErrorAction 'SilentlyContinue' -Force -Verbose:$false + + if ($errorsFromDismImport.Count -gt 0) + { + New-InvalidOperationException -Message $script:localizedData.DismNotAvailable + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/DSC_xWindowsOptionalFeature.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/DSC_xWindowsOptionalFeature.schema.mof new file mode 100644 index 0000000..982293a --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/DSC_xWindowsOptionalFeature.schema.mof @@ -0,0 +1,14 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("xWindowsOptionalFeature")] +class DSC_xWindowsOptionalFeature : OMI_BaseResource +{ + [Key, Description("The name of the feature to enable or disable.")] String Name; + [Write, Description("Specifies whether the feature should be enabled or disabled. To enable the feature, set this property to Present. To disable the feature, set the property to Absent."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Write, Description("Specifies that all files associated with the feature should be removed if the feature is being disabled.")] Boolean RemoveFilesOnDisable; + [Write, Description("Specifies whether or not DISM contacts Windows Update (WU) when searching for the source files to enable the feature. If $true, DISM will not contact WU.")] Boolean NoWindowsUpdateCheck; + [Write, Description("The maximum output level to show in the log. Accepted values are: ErrorsOnly (only errors are logged), ErrorsAndWarning (errors and warnings are logged), and ErrorsAndWarningAndInformation (errors, warnings, and debug information are logged)."), ValueMap{"ErrorsOnly", "ErrorsAndWarning", "ErrorsAndWarningAndInformation"}, Values{"ErrorsOnly", "ErrorsAndWarning", "ErrorsAndWarningAndInformation"}] String LogLevel; + [Write, Description("The path to the log file to log this operation.")] String LogPath; + [Read, Description("The custom properties retrieved from the Windows optional feature as an array of strings.")] String CustomProperties[]; + [Read, Description("The description retrieved from the Windows optional feature.")] String Description; + [Read, Description("The display name retrieved from the Windows optional feature.")] String DisplayName; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/en-US/DSC_xWindowsOptionalFeature.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/en-US/DSC_xWindowsOptionalFeature.schema.mfl new file mode 100644 index 0000000..d3e51ad --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/en-US/DSC_xWindowsOptionalFeature.schema.mfl @@ -0,0 +1,13 @@ +[Description("This resource is used to enable and disable Windows optional features.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xWindowsOptionalFeature : OMI_BaseResource +{ + [Key, Description("The name of the feature to enable or disable.") : Amended] String Name; + [Description("Specifies whether the feature should be enabled or disabled. To enable the feature, set this property to Present. To disable the feature, set the property to Absent.") : Amended] String Ensure; + [Description("Specifies that all files associated with the feature should be removed if the feature is being disabled.") : Amended] Boolean RemoveFilesOnDisable; + [Description("Specifies whether or not DISM contacts Windows Update (WU) when searching for the source files to enable the feature. If $true, DISM will not contact WU.") : Amended] Boolean NoWindowsUpdateCheck; + [Description("The maximum output level to show in the log. Accepted values are: ErrorsOnly (only errors are logged), ErrorsAndWarning (errors and warnings are logged), and ErrorsAndWarningAndInformation (errors, warnings, and debug information are logged).") : Amended] String LogLevel; + [Description("The path to the log file to log this operation.") : Amended] String LogPath; + [Description("The custom properties retrieved from the Windows optional feature as an array of strings.") : Amended] String CustomProperties[]; + [Description("The description retrieved from the Windows optional feature.") : Amended] String Description; + [Description("The display name retrieved from the Windows optional feature.") : Amended] String DisplayName; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/en-US/DSC_xWindowsOptionalFeature.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/en-US/DSC_xWindowsOptionalFeature.strings.psd1 new file mode 100644 index 0000000..b29de25 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsOptionalFeature/en-US/DSC_xWindowsOptionalFeature.strings.psd1 @@ -0,0 +1,20 @@ +# Localized resources for DSC_xWindowsOptionalFeature + +ConvertFrom-StringData @' + DismNotAvailable = PowerShell module DISM could not be imported. + NotSupportedSku = This resource is available only on Windows client operating systems and Windows Server 2012 or later. + ElevationRequired = This resource must run as an Administrator. + ValidatingPrerequisites = Validating resource prerequisites. + CouldNotConvertFeatureState = Could not convert feature state '{0}' into Absent or Present. + RestartNeeded = Target machine needs to restart. + GetTargetResourceStartMessage = Started Get-TargetResource on the '{0}' feature. + GetTargetResourceEndMessage = Finished Get-TargetResource on the '{0}' feature. + SetTargetResourceStartMessage = Started Set-TargetResource on the '{0}' feature. + SetTargetResourceEndMessage = Finished Set-TargetResource on the '{0}' feature. + TestTargetResourceStartMessage = Started Test-TargetResource on the '{0}' feature. + TestTargetResourceEndMessage = Finished Test-TargetResource on the '{0}' feature. + FeatureInstalled = Installed feature '{0}'. + FeatureUninstalled = Uninstalled feature '{0}'. + ShouldProcessEnableFeature = Enable Windows optional feature. + ShouldProcessDisableFeature = Disable Windows optional feature. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/DSC_xWindowsPackageCab.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/DSC_xWindowsPackageCab.psm1 new file mode 100644 index 0000000..a301b67 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/DSC_xWindowsPackageCab.psm1 @@ -0,0 +1,238 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xWindowsPackageCab' + +Import-Module -Name 'Dism' + +<# + .SYNOPSIS + Retrieves the current state of a package from a windows cabinet (cab) file. + + .PARAMETER Name + The name of the package to retrieve the state of. + + .PARAMETER Ensure + Not used in Get-TargetResource. + Provided here to follow DSC design convention of including all mandatory parameters + in Get, Set, and Test. + + .PARAMETER SourcePath + The path to the cab file the package should be installed or uninstalled from. + Returned from Get-TargetResource as it is passed in. + + .PARAMETER LogPath + The path to a file to log this operation to. + There is no default value, but if not set, the log will appear at %WINDIR%\Logs\Dism\dism.log. +#> +function Get-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Collections.Hashtable])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SourcePath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath + ) + + $windowsPackageCab = @{ + Name = $Name + Ensure = 'Present' + SourcePath = $SourcePath + LogPath = $LogPath + } + + $getWindowsPackageParams = @{ + PackageName = $Name + Online = $true + } + + if ($PSBoundParameters.ContainsKey('LogPath')) + { + $getWindowsPackageParams['LogPath'] = $LogPath + } + + Write-Verbose -Message ($script:localizedData.RetrievingPackage -f $Name) + + try + { + $windowsPackageInfo = Dism\Get-WindowsPackage @getWindowsPackageParams + } + catch + { + $windowsPackageInfo = $null + } + + if ($null -eq $windowsPackageInfo -or -not ($windowsPackageInfo.PackageState -in @( 'Installed', 'InstallPending' ))) + { + $windowsPackageCab.Ensure = 'Absent' + } + + Write-Verbose -Message ($script:localizedData.PackageEnsureState -f $Name, $windowsPackageCab.Ensure) + + return $windowsPackageCab +} + +<# + .SYNOPSIS + Installs or uninstalls a package from a windows cabinet (cab) file. + + .PARAMETER Name + The name of the package to install or uninstall. + + .PARAMETER Ensure + Specifies whether the package should be installed or uninstalled. + To install the package, set this property to Present. + To uninstall the package, set the property to Absent. + + .PARAMETER SourcePath + The path to the cab file to install or uninstall the package from. + + .PARAMETER LogPath + The path to a file to log this operation to. + There is no default value, but if not set, the log will appear at %WINDIR%\Logs\Dism\dism.log. +#> +function Set-TargetResource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SourcePath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath + ) + + Write-Verbose -Message ($script:localizedData.SetTargetResourceStarting -f $Name) + + if (-not (Test-Path -Path $SourcePath)) + { + New-InvalidArgumentException -ArgumentName 'SourcePath' -Message ($script:localizedData.SourcePathDoesNotExist -f $SourcePath) + } + + if ($Ensure -ieq 'Present') + { + Write-Verbose -Message ($script:localizedData.AddingPackage -f $SourcePath) + Dism\Add-WindowsPackage -PackagePath $SourcePath -LogPath $LogPath -Online + } + else + { + Write-Verbose -Message ($script:localizedData.RemovingPackage -f $SourcePath) + Dism\Remove-WindowsPackage -PackagePath $SourcePath -LogPath $LogPath -Online + } + + Write-Verbose -Message ($script:localizedData.SetTargetResourceFinished -f $Name) +} + +<# + .SYNOPSIS + Tests whether a package in a windows cabinet (cab) file is installed or uninstalled. + + .PARAMETER Name + The name of the cab package to test for installation. + + .PARAMETER Ensure + Specifies whether to test if the package is installed or uninstalled. + To test if the package is installed, set this property to Present. + To test if the package is uninstalled, set the property to Absent. + + .PARAMETER SourcePath + Not used in Test-TargetResource. + + .PARAMETER LogPath + The path to a file to log this operation to. + There is no default value, but if not set, the log will appear at %WINDIR%\Logs\Dism\dism.log. +#> +function Test-TargetResource +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SourcePath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath + ) + + $getTargetResourceParams = @{ + Name = $Name + Ensure = $Ensure + SourcePath = $SourcePath + } + + if ($PSBoundParameters.ContainsKey('LogPath')) + { + $getTargetResourceParams['LogPath'] = $LogPath + } + + $windowsPackageCab = Get-TargetResource @getTargetResourceParams + + if ($windowsPackageCab.Ensure -ieq $Ensure) + { + Write-Verbose -Message ($script:localizedData.EnsureStatesMatch -f $Name) + return $true + } + else + { + Write-Verbose -Message ($script:localizedData.EnsureStatesDoNotMatch -f $Name) + return $false + } +} + +Export-ModuleMember -Function '*-TargetResource' diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/DSC_xWindowsPackageCab.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/DSC_xWindowsPackageCab.schema.mof new file mode 100644 index 0000000..ee5951f --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/DSC_xWindowsPackageCab.schema.mof @@ -0,0 +1,9 @@ + +[ClassVersion("1.0.0.0"), FriendlyName("xWindowsPackageCab")] +class DSC_xWindowsPackageCab : OMI_BaseResource +{ + [Key, Description("The name of the package to install or uninstall.")] String Name; + [Required, Description("Specifies whether the package should be installed or uninstalled. To install the package, set this property to Present. To uninstall the package, set the property to Absent."), ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}] String Ensure; + [Required, Description("The path to the cab file to install or uninstall the package from.")] String SourcePath; + [Write, Description("The path to a file to log the operation to.")] String LogPath; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/en-US/DSC_xWindowsPackageCab.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/en-US/DSC_xWindowsPackageCab.schema.mfl new file mode 100644 index 0000000..db43ded --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/en-US/DSC_xWindowsPackageCab.schema.mfl @@ -0,0 +1,8 @@ +[Description("This resource is used to install or uninstall a package from a windows cabinet (cab) file.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xWindowsPackageCab : OMI_BaseResource +{ + [Key, Description("The name of the package to install or uninstall.") : Amended] String Name; + [Description("Specifies whether the package should be installed or uninstalled. To install the package, set this property to Present. To uninstall the package, set the property to Absent.") : Amended] String Ensure; + [Description("The path to the cab file to install or uninstall the package from.") : Amended] String SourcePath; + [Description("The path to a file to log the operation to.") : Amended] String LogPath; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/en-US/DSC_xWindowsPackageCab.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/en-US/DSC_xWindowsPackageCab.strings.psd1 new file mode 100644 index 0000000..998c1c6 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsPackageCab/en-US/DSC_xWindowsPackageCab.strings.psd1 @@ -0,0 +1,13 @@ +# Localized resources for DSC_xWindowsPackageCab + +ConvertFrom-StringData @' + RetrievingPackage = Retrieving information for the package {0} + PackageEnsureState = The package {0} is currently {1} + SourcePathDoesNotExist = Could not find the source file at path {0} + SetTargetResourceStarting = Starting configuration of the WindowsPackageCab resource {0} + SetTargetResourceFinished = Finished configuration of WindowsPackageCab resource {0} + AddingPackage = Adding a package from the source at path {0} + RemovingPackage = Removing package from the source at path {0} + EnsureStatesMatch = Ensure states match for package {0} + EnsureStatesDoNotMatch = Ensure states do not match for package {0} +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/DSC_xWindowsProcess.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/DSC_xWindowsProcess.psm1 new file mode 100644 index 0000000..b9d2459 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/DSC_xWindowsProcess.psm1 @@ -0,0 +1,1565 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'DSC_xWindowsProcess' + +<# + .SYNOPSIS + Retrieves the current state of the Windows process(es) with the specified + executable and arguments. + + If more than one process is found, only the information of the first process is retrieved. + ProcessCount will contain the actual number of processes that were found. + + .PARAMETER Path + The path to the process executable. If this is the file name of the executable + (not the fully qualified path), the DSC resource will search the environment Path variable + ($env:Path) to find the executable file. If the value of this property is a fully qualified + path, DSC will use the given Path variable to find the file. If the path is not found it + will throw an error. Relative paths are not allowed. + + .PARAMETER Arguments + The arguments to the process as a single string. + + .PARAMETER Credential + The credential of the user account to start the process under. +#> +function Get-TargetResource +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $Arguments, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + Write-Verbose -Message ($script:localizedData.GetTargetResourceStartMessage -f $Path) + + $Path = Expand-Path -Path $Path + + $getProcessCimInstanceArguments = @{ + Path = $Path + Arguments = $Arguments + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getProcessCimInstanceArguments['Credential'] = $Credential + } + + $processCimInstance = @( Get-ProcessCimInstance @getProcessCimInstanceArguments ) + + $processToReturn = @{} + + if ($processCimInstance.Count -eq 0) + { + $processToReturn = @{ + Path = $Path + Arguments = $Arguments + Ensure ='Absent' + } + } + else + { + $processId = $processCimInstance[0].ProcessId + $getProcessResult = Get-Process -ID $processId + + $processToReturn = @{ + Path = $Path + Arguments = $Arguments + PagedMemorySize = $getProcessResult.PagedMemorySize64 + NonPagedMemorySize = $getProcessResult.NonpagedSystemMemorySize64 + VirtualMemorySize = $getProcessResult.VirtualMemorySize64 + HandleCount = $getProcessResult.HandleCount + Ensure = 'Present' + ProcessId = $processId + ProcessCount = $processCimInstance.Count + } + } + + Write-Verbose -Message ($script:localizedData.GetTargetResourceEndMessage -f $Path) + + return $processToReturn +} + +<# + .SYNOPSIS + Sets the Windows process with the specified executable path and arguments + to the specified state. + + If multiple process are found, the specified state will be set for all of them. + + .PARAMETER Path + The path to the process executable. If this is the file name of the executable + (not the fully qualified path), the DSC resource will search the environment Path variable + ($env:Path) to find the executable file. If the value of this property is a fully qualified + path, DSC will use the given Path variable to find the file. If the path is not found it + will throw an error. Relative paths are not allowed. + + .PARAMETER Arguments + The arguments to pass to the process as a single string. + + .PARAMETER Credential + The credential of the user account to start the process under. + + .PARAMETER Ensure + Specifies whether or not the process should exist. + To start or modify a process, set this property to Present. + To stop a process, set this property to Absent. + The default value is Present. + + .PARAMETER StandardOutputPath + The file path to write the standard output to. Any existing file at this path + will be overwritten.This property cannot be specified at the same time as Credential + when running the process as a local user. + + .PARAMETER StandardErrorPath + The file path to write the standard error output to. Any existing file at this path + will be overwritten. + + .PARAMETER StandardInputPath + The file path to get standard input from. This property cannot be specified at the + same time as Credential when running the process as a local user. + + .PARAMETER WorkingDirectory + The file path to use as the working directory for the process. Any existing file + at this path will be overwritten. This property cannot be specified at the same time + as Credential when running the process as a local user. +#> +function Set-TargetResource +{ + [CmdletBinding(SupportsShouldProcess = $true)] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $Arguments, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $StandardOutputPath, + + [Parameter()] + [System.String] + $StandardErrorPath, + + [Parameter()] + [System.String] + $StandardInputPath, + + [Parameter()] + [System.String] + $WorkingDirectory + ) + + Write-Verbose -Message ($script:localizedData.SetTargetResourceStartMessage -f $Path) + + Assert-PsDscContextNotRunAsUser + + $Path = Expand-Path -Path $Path + + $getProcessCimInstanceArguments = @{ + Path = $Path + Arguments = $Arguments + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getProcessCimInstanceArguments['Credential'] = $Credential + } + + $processCimInstance = @( Get-ProcessCimInstance @getProcessCimInstanceArguments ) + + if ($Ensure -eq 'Absent') + { + $assertHashtableParams = @{ + Hashtable = $PSBoundParameters + Key = @( 'StandardOutputPath', + 'StandardErrorPath', + 'StandardInputPath', + 'WorkingDirectory' ) + } + Assert-HashtableDoesNotContainKey @assertHashtableParams + + $whatIfShouldProcess = $PSCmdlet.ShouldProcess($Path, $script:localizedData.StoppingProcessWhatif) + + if ($processCimInstance.Count -gt 0 -and $whatIfShouldProcess) + { + # If there are multiple process Ids, all will be included to be stopped + $processIds = $processCimInstance.ProcessId + + # Redirecting error output to standard output while we try to stop the processes + $stopProcessError = Stop-Process -Id $processIds -Force 2>&1 + + if ($null -eq $stopProcessError) + { + Write-Verbose -Message ($script:localizedData.ProcessesStopped -f $Path, ($processIds -join ',')) + } + else + { + $errorMessage = ($script:localizedData.ErrorStopping -f $Path, + ($processIds -join ','), + ($stopProcessError | Out-String)) + + New-InvalidOperationException -Message $errorMessage + } + + <# + Before returning from Set-TargetResource we have to ensure a subsequent + Test-TargetResource is going to work + #> + if (-not (Wait-ProcessCount -ProcessSettings $getProcessCimInstanceArguments -ProcessCount 0)) + { + $message = $script:localizedData.ErrorStopping -f $Path, ($processIds -join ','), + $script:localizedData.FailureWaitingForProcessesToStop + + New-InvalidOperationException -Message $message + } + } + else + { + Write-Verbose -Message ($script:localizedData.ProcessAlreadyStopped -f $Path) + } + } + # Ensure = 'Present' + else + { + $shouldBeRootedPathArguments = @( 'StandardInputPath', + 'WorkingDirectory', + 'StandardOutputPath', + 'StandardErrorPath' ) + + foreach ($shouldBeRootedPathArgument in $shouldBeRootedPathArguments) + { + if (-not [System.String]::IsNullOrEmpty($PSBoundParameters[$shouldBeRootedPathArgument])) + { + $assertPathArgumentRootedParams = @{ + PathArgumentName = $shouldBeRootedPathArgument + PathArgument = $PSBoundParameters[$shouldBeRootedPathArgument] + } + Assert-PathArgumentRooted @assertPathArgumentRootedParams + } + } + + $shouldExistPathArguments = @( 'StandardInputPath', 'WorkingDirectory' ) + + foreach ($shouldExistPathArgument in $shouldExistPathArguments) + { + if (-not [System.String]::IsNullOrEmpty($PSBoundParameters[$shouldExistPathArgument])) + { + $assertPathArgumentValidParams = @{ + PathArgumentName = $shouldExistPathArgument + PathArgument = $PSBoundParameters[$shouldExistPathArgument] + } + Assert-PathArgumentValid @assertPathArgumentValidParams + } + } + + if ($processCimInstance.Count -eq 0) + { + $startProcessArguments = @{ + FilePath = $Path + } + + $startProcessOptionalArgumentMap = @{ + Credential = 'Credential' + RedirectStandardOutput = 'StandardOutputPath' + RedirectStandardError = 'StandardErrorPath' + RedirectStandardInput = 'StandardInputPath' + WorkingDirectory = 'WorkingDirectory' + } + + foreach ($startProcessOptionalArgumentName in $startProcessOptionalArgumentMap.Keys) + { + $parameterKey = $startProcessOptionalArgumentMap[$startProcessOptionalArgumentName] + $parameterValue = $PSBoundParameters[$parameterKey] + + if (-not [System.String]::IsNullOrEmpty($parameterValue)) + { + $startProcessArguments[$startProcessOptionalArgumentName] = $parameterValue + } + } + + if (-not [System.String]::IsNullOrEmpty($Arguments) -and ` + -not ($Arguments.Trim().Length -eq 0)) + { + $startProcessArguments['ArgumentList'] = Add-SurroundingDoubleQuotesToString -StringIn $Arguments + } + + if ($PSCmdlet.ShouldProcess($Path, $script:localizedData.StartingProcessWhatif)) + { + <# + Start-Process calls .net Process.Start() + If -Credential is present Process.Start() uses win32 api CreateProcessWithLogonW + http://msdn.microsoft.com/en-us/library/0w4h05yb(v=vs.110).aspx + CreateProcessWithLogonW cannot be called as LocalSystem user. + Details http://msdn.microsoft.com/en-us/library/windows/desktop/ms682431(v=vs.85).aspx + (section Remarks/Windows XP with SP2 and Windows Server 2003) + + In this case we call another api. + #> + if (($PSBoundParameters.ContainsKey('Credential')) -and (Test-IsRunFromLocalSystemUser)) + { + # Throw an exception if any of the below parameters are included with Credential passed + foreach ($key in @('StandardOutputPath', 'StandardInputPath', 'WorkingDirectory')) + { + if ($PSBoundParameters.Keys -contains $key) + { + $newInvalidArgumentExceptionParams = @{ + ArgumentName = $key + Message = $script:localizedData.ErrorParametersNotSupportedWithCredential + } + New-InvalidArgumentException @newInvalidArgumentExceptionParams + } + } + + try + { + Start-ProcessAsLocalSystemUser -Path $Path -Arguments $Arguments -Credential $Credential + } + catch + { + throw (New-Object -TypeName 'System.Management.Automation.ErrorRecord' ` + -ArgumentList @( $_.Exception, 'Win32Exception', 'OperationStopped', $null )) + } + } + # Credential not passed in or running from a LocalSystem + else + { + try + { + Start-Process @startProcessArguments + } + catch [System.Exception] + { + $errorMessage = ($script:localizedData.ErrorStarting -f $Path, $_.Exception.Message) + + New-InvalidOperationException -Message $errorMessage + } + } + + Write-Verbose -Message ($script:localizedData.ProcessesStarted -f $Path) + + # Before returning from Set-TargetResource we have to ensure a subsequent Test-TargetResource is going to work + if (-not (Wait-ProcessCount -ProcessSettings $getProcessCimInstanceArguments -ProcessCount 1)) + { + $message = $script:localizedData.ErrorStarting -f $Path, + $script:localizedData.FailureWaitingForProcessesToStart + + New-InvalidOperationException -Message $message + } + } + } + else + { + Write-Verbose -Message ($script:localizedData.ProcessAlreadyStarted -f $Path) + } + } + + Write-Verbose -Message ($script:localizedData.SetTargetResourceEndMessage -f $Path) +} + +<# + .SYNOPSIS + Tests if the Windows process with the specified executable path and arguments is in + the specified state. + + .PARAMETER Path + The path to the process executable. If this is the file name of the executable + (not the fully qualified path), the DSC resource will search the environment Path variable + ($env:Path) to find the executable file. If the value of this property is a fully qualified + path, DSC will use the given Path variable to find the file. If the path is not found it + will throw an error. Relative paths are not allowed. + + .PARAMETER Arguments + The arguments to pass to the process as a single string. + + .PARAMETER Credential + The credential of the user account the process should be running under. + + .PARAMETER Ensure + Specifies whether or not the process should exist. + If the process should exist, set this property to Present. + If the process should not exist, set this property to Absent. + The default value is Present. + + .PARAMETER StandardOutputPath + Not used in Test-TargetResource. + + .PARAMETER StandardErrorPath + Not used in Test-TargetResource. + + .PARAMETER StandardInputPath + Not used in Test-TargetResource. + + .PARAMETER WorkingDirectory + Not used in Test-TargetResource. +#> +function Test-TargetResource +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $Arguments, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure = 'Present', + + [Parameter()] + [System.String] + $StandardOutputPath, + + [Parameter()] + [System.String] + $StandardErrorPath, + + [Parameter()] + [System.String] + $StandardInputPath, + + [Parameter()] + [System.String] + $WorkingDirectory + ) + + Write-Verbose -Message ($script:localizedData.TestTargetResourceStartMessage -f $Path) + + Assert-PsDscContextNotRunAsUser + + $Path = Expand-Path -Path $Path + + $getProcessCimInstanceArguments = @{ + Path = $Path + Arguments = $Arguments + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $getProcessCimInstanceArguments['Credential'] = $Credential + } + + $processCimInstances = @( Get-ProcessCimInstance @getProcessCimInstanceArguments ) + + Write-Verbose -Message ($script:localizedData.TestTargetResourceEndMessage -f $Path) + + if ($Ensure -eq 'Absent') + { + return ($processCimInstances.Count -eq 0) + } + else + { + return ($processCimInstances.Count -gt 0) + } +} + +<# + .SYNOPSIS + Expands a relative leaf path into a full, rooted path. Throws an invalid argument exception + if the path is not valid. + + .PARAMETER Path + The relative leaf path to expand. +#> +function Expand-Path +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path + ) + + $Path = [Environment]::ExpandEnvironmentVariables($Path) + + # Check to see if the path is rooted. If so, return it as is. + if ([IO.Path]::IsPathRooted($Path)) + { + if (-not (Test-Path -Path $Path -PathType 'Leaf')) + { + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.FileNotFound -f $Path) + } + + return $Path + } + + # Check to see if the path to the file exists in the current location. If so, return the full rooted path. + $rootedPath = [System.IO.Path]::GetFullPath($Path) + + if ([System.IO.File]::Exists($rootedPath)) + { + return $rootedPath + } + + # If the path is not found, throw an exception + New-InvalidArgumentException -ArgumentName 'Path' -Message ($script:localizedData.FileNotFound -f $Path) +} + +<# + .SYNOPSIS + Retrieves any process CIM instance objects that match the given path, arguments, and credential. + + .PARAMETER Path + The executable path of the process to retrieve. + + .PARAMETER Arguments + The arguments of the process to retrieve as a single string. + + .PARAMETER Credential + The credential of the user account of the process to retrieve + + .PARAMETER UseGetCimInstanceThreshold + If the number of processes returned by the Get-Process method is greater than or equal to + this value, this function will retrieve all processes at the executable path. This will + help the function execute faster. Otherwise, this function will retrieve each process + CIM instance with the process IDs retrieved from Get-Process. +#> +function Get-ProcessCimInstance +{ + [OutputType([Microsoft.Management.Infrastructure.CimInstance[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter()] + [System.String] + $Arguments, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [ValidateRange(0, [System.Int32]::MaxValue)] + [System.Int32] + $UseGetCimInstanceThreshold = 8 + ) + + $processName = [IO.Path]::GetFileNameWithoutExtension($Path) + + $getProcessResult = @( Get-Process -Name $processName -ErrorAction 'SilentlyContinue' ) + + $processCimInstances = @() + + if ($getProcessResult.Count -ge $UseGetCimInstanceThreshold) + { + $escapedPathForWqlFilter = ConvertTo-EscapedStringForWqlFilter -FilterString $Path + $wqlFilter = "ExecutablePath = '$escapedPathForWqlFilter'" + + $processCimInstances = Get-CimInstance -ClassName 'Win32_Process' -Filter $wqlFilter + } + else + { + foreach ($process in $getProcessResult) + { + if ($process.Path -ieq $Path) + { + Write-Verbose -Message ($script:localizedData.VerboseInProcessHandle -f $process.Id) + $getCimInstanceParams = @{ + ClassName = 'Win32_Process' + Filter = "ProcessId = $($process.Id)" + ErrorAction = 'SilentlyContinue' + } + $processCimInstances += Get-CimInstance @getCimInstanceParams + } + } + } + + if ($PSBoundParameters.ContainsKey('Credential')) + { + $splitCredentialResult = Split-Credential -Credential $Credential + $domain = $splitCredentialResult.Domain + $userName = $splitCredentialResult.UserName + $processesWithCredential = @() + + foreach ($process in $processCimInstances) + { + if ((Get-ProcessOwner -Process $process) -eq "$domain\$userName") + { + $processesWithCredential += $process + } + } + $processCimInstances = $processesWithCredential + } + + if ($null -eq $Arguments) + { + $Arguments = [System.String]::Empty + } + + $processesWithMatchingArguments = @() + + foreach ($process in $processCimInstances) + { + $commandLineArgs = Get-ArgumentsFromCommandLineInput -CommandLineInput $process.CommandLine + + if ([String]::IsNullOrEmpty($Arguments) -or ` + $commandLineArgs -eq $Arguments -or ` + $commandLineArgs -eq (Add-SurroundingDoubleQuotesToString -StringIn $Arguments)) + { + $processesWithMatchingArguments += $process + } + } + + return $processesWithMatchingArguments +} + +<# + .SYNOPSIS + Converts a string to an escaped string to be used in a WQL filter such as the one passed in + the Filter parameter of Get-WmiObject. + + .PARAMETER FilterString + The string to convert. +#> +function ConvertTo-EscapedStringForWqlFilter +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $FilterString + ) + + return $FilterString.Replace("\", "\\").Replace('"', '\"').Replace("'", "\'") +} + +<# + .SYNOPSIS + Retrieves the owner of a Process. + + .PARAMETER Process + The Process to retrieve the owner of. + + .NOTES + If the process was killed by the time this function is called, this function will throw a + WMIMethodException with the message "Not found". +#> +function Get-ProcessOwner +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Object] + $Process + ) + + $owner = Get-ProcessOwnerCimInstance -Process $Process -ErrorAction 'SilentlyContinue' + + if ($null -ne $owner) + { + if ($null -ne $owner.Domain) + { + return ($owner.Domain + '\' + $owner.User) + } + else + { + # return the default domain + return ($env:computerName + '\' + $owner.User) + } + } + + return [System.String]::Empty +} + +<# + .SYNOPSIS + Wrapper function to retrieve the CIM instance of the owner of a process + + .PARAMETER Process + The process to retrieve the CIM instance of the owner of. + + .NOTES + If the process was killed by the time this function is called, this function will throw a + WMIMethodException with the message "Not found". +#> +function Get-ProcessOwnerCimInstance +{ + [OutputType([Microsoft.Management.Infrastructure.CimInstance])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNull()] + [System.Object] + $Process + ) + + return Invoke-CimMethod -InputObject $Process -MethodName 'GetOwner' -ErrorAction 'SilentlyContinue' +} + +<# + .SYNOPSIS + Retrieves the 'arguments' part of command line input. + + .PARAMETER CommandLineInput + The command line input to retrieve the arguments from. + + .EXAMPLE + Get-ArgumentsFromCommandLineInput -CommandLineInput 'C:\temp\a.exe X Y Z' + Returns 'X Y Z'. +#> +function Get-ArgumentsFromCommandLineInput +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $CommandLineInput + ) + + if ([System.String]::IsNullOrWhitespace($CommandLineInput)) + { + return [System.String]::Empty + } + + $CommandLineInput = $CommandLineInput.Trim() + + if ($CommandLineInput.StartsWith('"')) + { + $endOfCommandChar = [System.Char]'"' + } + else + { + $endOfCommandChar = [System.Char]' ' + } + + $endofCommandIndex = $CommandLineInput.IndexOf($endOfCommandChar, 1) + + if ($endofCommandIndex -eq -1) + { + return [System.String]::Empty + } + + return $CommandLineInput.Substring($endofCommandIndex + 1).Trim() +} + +<# + .SYNOPSIS + Throws an invalid argument exception if the given hashtable contains the given key(s). + + .PARAMETER Hashtable + The hashtable to check the keys of. + + .PARAMETER Key + The key(s) that should not be in the hashtable. +#> +function Assert-HashtableDoesNotContainKey +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $Hashtable, + + [Parameter(Mandatory = $true)] + [System.String[]] + $Key + ) + + foreach ($keyName in $Key) + { + if ($Hashtable.ContainsKey($keyName)) + { + New-InvalidArgumentException -ArgumentName $keyName ` + -Message ($script:localizedData.ParameterShouldNotBeSpecified -f $keyName) + } + } +} + +<# + .SYNOPSIS + Waits for the given amount of time for the given number of processes with the given settings + to be running. If not all processes are running by 'WaitTime', the function returns + false, otherwise it returns true. + + .PARAMETER ProcessSettings + The settings for the running process(es) that we're getting the count of. + + .PARAMETER ProcessCount + The number of processes running to wait for. + + .PARAMETER WaitTime + The amount of milliseconds to wait for all processes to be running. + Default is 2000. +#> +function Wait-ProcessCount +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Collections.Hashtable] + $ProcessSettings, + + [Parameter(Mandatory = $true)] + [ValidateRange(0, [System.Int32]::MaxValue)] + [System.Int32] + $ProcessCount, + + [Parameter()] + [System.Int32] + $WaitTime = 200000 + ) + + $startTime = [System.DateTime]::Now + + do + { + $actualProcessCount = @( Get-ProcessCimInstance @ProcessSettings ).Count + } while ($actualProcessCount -ne $ProcessCount -and ([System.DateTime]::Now - $startTime).TotalMilliseconds -lt $WaitTime) + + return $actualProcessCount -eq $ProcessCount +} + +<# + .SYNOPSIS + Throws an error if the given path argument is not rooted. + + .PARAMETER PathArgumentName + The name of the path argument that should be rooted. + + .PARAMETER PathArgument + The path arguments that should be rooted. +#> +function Assert-PathArgumentRooted +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $PathArgumentName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $PathArgument + ) + + if (-not ([IO.Path]::IsPathRooted($PathArgument))) + { + $message = $script:localizedData.PathShouldBeAbsolute -f $PathArgumentName, $PathArgument + + New-InvalidArgumentException -ArgumentName 'Path' ` + -Message $message + } +} + +<# + .SYNOPSIS + Throws an error if the given path argument does not exist. + + .PARAMETER PathArgumentName + The name of the path argument that should exist. + + .PARAMETER PathArgument + The path argument that should exist. +#> +function Assert-PathArgumentValid +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $PathArgumentName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $PathArgument + ) + + if (-not (Test-Path -Path $PathArgument)) + { + $message = $script:localizedData.PathShouldExist -f $PathArgument, $PathArgumentName + + New-InvalidArgumentException -ArgumentName 'Path' ` + -Message $message + } +} + +<# + .SYNOPSIS + Tests if the current user is from the local system. +#> +function Test-IsRunFromLocalSystemUser +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + ) + + $identity = [Security.Principal.WindowsIdentity]::GetCurrent() + $principal = New-Object -TypeName Security.Principal.WindowsPrincipal -ArgumentList $identity + + return $principal.Identity.IsSystem +} + +<# + .SYNOPSIS + Starts the process with the given credential when the user is a local system user. + + .PARAMETER Path + The path to the process executable. + + .PARAMETER Arguments + Indicates a string of arguments to pass to the process as-is. + + .PARAMETER Credential + Indicates the credential for starting the process. +#> +function Start-ProcessAsLocalSystemUser +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + [Parameter(Mandatory = $true)] + [AllowEmptyString()] + [System.String] + $Arguments, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $splitCredentialResult = Split-Credential -Credential $Credential + + <# + Internally we use win32 api LogonUser() with + dwLogonType == LOGON32_LOGON_NETWORK_CLEARTEXT. + + It grants the process ability for second-hop. + #> + Import-DscNativeMethods + + $Path = Add-SurroundingDoubleQuotesToString -StringIn $Path + $Arguments = Add-SurroundingDoubleQuotesToString -StringIn $Arguments + + [PSDesiredStateConfiguration.NativeMethods]::CreateProcessAsUser( "$Path $Arguments", $splitCredentialResult.Domain, + $splitCredentialResult.UserName, $Credential.Password, + $false, [ref] $null ) +} + +<# + .SYNOPSIS + Splits a credential into a username and domain without calling GetNetworkCredential. + Calls to GetNetworkCredential expose the password as plain text in memory. + + .PARAMETER Credential + The credential to pull the username and domain out of. + + .NOTES + Supported formats: DOMAIN\username, username@domain +#> +function Split-Credential +{ + [OutputType([System.Collections.Hashtable])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $wrongFormat = $false + + if ($Credential.UserName.Contains('\')) + { + $credentialSegments = $Credential.UserName.Split('\') + + if ($credentialSegments.Length -gt 2) + { + # i.e. domain\user\foo + $wrongFormat = $true + } + else + { + $domain = $credentialSegments[0] + $userName = $credentialSegments[1] + } + } + elseif ($Credential.UserName.Contains('@')) + { + $credentialSegments = $Credential.UserName.Split('@') + + if ($credentialSegments.Length -gt 2) + { + # i.e. user@domain@foo + $wrongFormat = $true + } + else + { + $UserName = $credentialSegments[0] + $Domain = $credentialSegments[1] + } + } + else + { + # Support for default domain (localhost) + $domain = $env:computerName + $userName = $Credential.UserName + } + + if ($wrongFormat) + { + $message = $script:localizedData.ErrorInvalidUserName -f $Credential.UserName + + New-InvalidArgumentException -ArgumentName 'Credential' -Message $message + } + + return @{ + Domain = $domain + UserName = $userName + } +} + +<# + .SYNOPSIS + Asserts that the PsDscContext is not run as user. + Throws an invalid argument exception if DSC is running as a specific user + (the PsDscRunAsCredential parameter was provided to DSC). + + .NOTES + Strict mode is turned off for this function since it does not recognize $PsDscContext +#> +function Assert-PsDscContextNotRunAsUser +{ + [CmdletBinding()] + param + ( + ) + + Set-StrictMode -Off + + if ($null -ne $PsDscContext.RunAsUser) + { + $newInvalidArgumentExceptionParams = @{ + ArgumentName = 'PsDscRunAsCredential' + Message = ($script:localizedData.ErrorRunAsCredentialParameterNotSupported -f $PsDscContext.RunAsUser) + } + + New-InvalidArgumentException @newInvalidArgumentExceptionParams + } +} + +<# + .SYNOPSIS + Imports the DSC native methods so that a process can be started with a credential + for a user from the local system. + Currently Start-Process, which is the command used otherwise, cannot do this. +#> +function Import-DscNativeMethods +{ + $dscNativeMethodsSource = @" + +using System; +using System.Collections.Generic; +using System.Text; +using System.Security; +using System.Runtime.InteropServices; +using System.Diagnostics; +using System.Security.Principal; +#if !CORECLR +using System.ComponentModel; +#endif +using System.IO; + +namespace PSDesiredStateConfiguration +{ +#if !CORECLR + [SuppressUnmanagedCodeSecurity] +#endif + public static class NativeMethods + { + //The following structs and enums are used by the various Win32 API's that are used in the code below + + [StructLayout(LayoutKind.Sequential)] + public struct STARTUPINFO + { + public Int32 cb; + public string lpReserved; + public string lpDesktop; + public string lpTitle; + public Int32 dwX; + public Int32 dwY; + public Int32 dwXSize; + public Int32 dwXCountChars; + public Int32 dwYCountChars; + public Int32 dwFillAttribute; + public Int32 dwFlags; + public Int16 wShowWindow; + public Int16 cbReserved2; + public IntPtr lpReserved2; + public IntPtr hStdInput; + public IntPtr hStdOutput; + public IntPtr hStdError; + } + + [StructLayout(LayoutKind.Sequential)] + public struct PROCESS_INFORMATION + { + public IntPtr hProcess; + public IntPtr hThread; + public Int32 dwProcessID; + public Int32 dwThreadID; + } + + [Flags] + public enum LogonType + { + LOGON32_LOGON_INTERACTIVE = 2, + LOGON32_LOGON_NETWORK = 3, + LOGON32_LOGON_BATCH = 4, + LOGON32_LOGON_SERVICE = 5, + LOGON32_LOGON_UNLOCK = 7, + LOGON32_LOGON_NETWORK_CLEARTEXT = 8, + LOGON32_LOGON_NEW_CREDENTIALS = 9 + } + + [Flags] + public enum LogonProvider + { + LOGON32_PROVIDER_DEFAULT = 0, + LOGON32_PROVIDER_WINNT35, + LOGON32_PROVIDER_WINNT40, + LOGON32_PROVIDER_WINNT50 + } + [StructLayout(LayoutKind.Sequential)] + public struct SECURITY_ATTRIBUTES + { + public Int32 Length; + public IntPtr lpSecurityDescriptor; + public bool bInheritHandle; + } + + public enum SECURITY_IMPERSONATION_LEVEL + { + SecurityAnonymous, + SecurityIdentification, + SecurityImpersonation, + SecurityDelegation + } + + public enum TOKEN_TYPE + { + TokenPrimary = 1, + TokenImpersonation + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + internal struct TokPriv1Luid + { + public int Count; + public long Luid; + public int Attr; + } + + public const int GENERIC_ALL_ACCESS = 0x10000000; + public const int CREATE_NO_WINDOW = 0x08000000; + internal const int SE_PRIVILEGE_ENABLED = 0x00000002; + internal const int TOKEN_QUERY = 0x00000008; + internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; + internal const string SE_INCRASE_QUOTA = "SeIncreaseQuotaPrivilege"; + +#if CORECLR + [DllImport("api-ms-win-core-handle-l1-1-0.dll", +#else + [DllImport("kernel32.dll", +#endif + EntryPoint = "CloseHandle", SetLastError = true, + CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] + public static extern bool CloseHandle(IntPtr handle); + +#if CORECLR + [DllImport("api-ms-win-core-processthreads-l1-1-2.dll", +#else + [DllImport("advapi32.dll", +#endif + EntryPoint = "CreateProcessAsUser", SetLastError = true, + CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] + public static extern bool CreateProcessAsUser( + IntPtr hToken, + string lpApplicationName, + string lpCommandLine, + ref SECURITY_ATTRIBUTES lpProcessAttributes, + ref SECURITY_ATTRIBUTES lpThreadAttributes, + bool bInheritHandle, + Int32 dwCreationFlags, + IntPtr lpEnvrionment, + string lpCurrentDirectory, + ref STARTUPINFO lpStartupInfo, + ref PROCESS_INFORMATION lpProcessInformation + ); + +#if CORECLR + [DllImport("api-ms-win-security-base-l1-1-0.dll", EntryPoint = "DuplicateTokenEx")] +#else + [DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx")] +#endif + public static extern bool DuplicateTokenEx( + IntPtr hExistingToken, + Int32 dwDesiredAccess, + ref SECURITY_ATTRIBUTES lpThreadAttributes, + Int32 ImpersonationLevel, + Int32 dwTokenType, + ref IntPtr phNewToken + ); + +#if CORECLR + [DllImport("api-ms-win-security-logon-l1-1-1.dll", CharSet = CharSet.Unicode, SetLastError = true)] +#else + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] +#endif + public static extern Boolean LogonUser( + String lpszUserName, + String lpszDomain, + IntPtr lpszPassword, + LogonType dwLogonType, + LogonProvider dwLogonProvider, + out IntPtr phToken + ); + +#if CORECLR + [DllImport("api-ms-win-security-base-l1-1-0.dll", ExactSpelling = true, SetLastError = true)] +#else + [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] +#endif + internal static extern bool AdjustTokenPrivileges( + IntPtr htok, + bool disall, + ref TokPriv1Luid newst, + int len, + IntPtr prev, + IntPtr relen + ); + +#if CORECLR + [DllImport("api-ms-win-downlevel-kernel32-l1-1-0.dll", ExactSpelling = true)] +#else + [DllImport("kernel32.dll", ExactSpelling = true)] +#endif + internal static extern IntPtr GetCurrentProcess(); + +#if CORECLR + [DllImport("api-ms-win-downlevel-advapi32-l1-1-1.dll", ExactSpelling = true, SetLastError = true)] +#else + [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)] +#endif + internal static extern bool OpenProcessToken( + IntPtr h, + int acc, + ref IntPtr phtok + ); + +#if CORECLR + [DllImport("api-ms-win-downlevel-kernel32-l1-1-0.dll", ExactSpelling = true)] +#else + [DllImport("kernel32.dll", ExactSpelling = true)] +#endif + internal static extern int WaitForSingleObject( + IntPtr h, + int milliseconds + ); + +#if CORECLR + [DllImport("api-ms-win-downlevel-kernel32-l1-1-0.dll", ExactSpelling = true)] +#else + [DllImport("kernel32.dll", ExactSpelling = true)] +#endif + internal static extern bool GetExitCodeProcess( + IntPtr h, + out int exitcode + ); + +#if CORECLR + [DllImport("api-ms-win-downlevel-advapi32-l4-1-0.dll", SetLastError = true)] +#else + [DllImport("advapi32.dll", SetLastError = true)] +#endif + internal static extern bool LookupPrivilegeValue( + string host, + string name, + ref long pluid + ); + + internal static void ThrowException( + string message + ) + { +#if CORECLR + throw new Exception(message); +#else + throw new Win32Exception(message); +#endif + } + + public static void CreateProcessAsUser(string strCommand, string strDomain, string strName, SecureString secureStringPassword, bool waitForExit, ref int ExitCode) + { + var hToken = IntPtr.Zero; + var hDupedToken = IntPtr.Zero; + TokPriv1Luid tp; + var pi = new PROCESS_INFORMATION(); + var sa = new SECURITY_ATTRIBUTES(); + sa.Length = Marshal.SizeOf(sa); + Boolean bResult = false; + try + { + IntPtr unmanagedPassword = IntPtr.Zero; + try + { +#if CORECLR + unmanagedPassword = SecureStringMarshal.SecureStringToCoTaskMemUnicode(secureStringPassword); +#else + unmanagedPassword = Marshal.SecureStringToGlobalAllocUnicode(secureStringPassword); +#endif + bResult = LogonUser( + strName, + strDomain, + unmanagedPassword, + LogonType.LOGON32_LOGON_NETWORK_CLEARTEXT, + LogonProvider.LOGON32_PROVIDER_DEFAULT, + out hToken + ); + } + finally + { + Marshal.ZeroFreeGlobalAllocUnicode(unmanagedPassword); + } + if (!bResult) + { + ThrowException("$($script:localizedData.UserCouldNotBeLoggedError)" + Marshal.GetLastWin32Error().ToString()); + } + IntPtr hproc = GetCurrentProcess(); + IntPtr htok = IntPtr.Zero; + bResult = OpenProcessToken( + hproc, + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, + ref htok + ); + if (!bResult) + { + ThrowException("$($script:localizedData.OpenProcessTokenError)" + Marshal.GetLastWin32Error().ToString()); + } + tp.Count = 1; + tp.Luid = 0; + tp.Attr = SE_PRIVILEGE_ENABLED; + bResult = LookupPrivilegeValue( + null, + SE_INCRASE_QUOTA, + ref tp.Luid + ); + if (!bResult) + { + ThrowException("$($script:localizedData.PrivilegeLookingUpError)" + Marshal.GetLastWin32Error().ToString()); + } + bResult = AdjustTokenPrivileges( + htok, + false, + ref tp, + 0, + IntPtr.Zero, + IntPtr.Zero + ); + if (!bResult) + { + ThrowException("$($script:localizedData.TokenElevationError)" + Marshal.GetLastWin32Error().ToString()); + } + + bResult = DuplicateTokenEx( + hToken, + GENERIC_ALL_ACCESS, + ref sa, + (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, + (int)TOKEN_TYPE.TokenPrimary, + ref hDupedToken + ); + if (!bResult) + { + ThrowException("$($script:localizedData.DuplicateTokenError)" + Marshal.GetLastWin32Error().ToString()); + } + var si = new STARTUPINFO(); + si.cb = Marshal.SizeOf(si); + si.lpDesktop = ""; + bResult = CreateProcessAsUser( + hDupedToken, + null, + strCommand, + ref sa, + ref sa, + false, + 0, + IntPtr.Zero, + null, + ref si, + ref pi + ); + if (!bResult) + { + ThrowException("$($script:localizedData.CouldNotCreateProcessError)" + Marshal.GetLastWin32Error().ToString()); + } + if (waitForExit) { + int status = WaitForSingleObject(pi.hProcess, -1); + if(status == -1) + { + ThrowException("$($script:localizedData.WaitFailedError)" + Marshal.GetLastWin32Error().ToString()); + } + + bResult = GetExitCodeProcess(pi.hProcess, out ExitCode); + if(!bResult) + { + ThrowException("$($script:localizedData.RetriveStatusError)" + Marshal.GetLastWin32Error().ToString()); + } + } + } + finally + { + if (pi.hThread != IntPtr.Zero) + { + CloseHandle(pi.hThread); + } + if (pi.hProcess != IntPtr.Zero) + { + CloseHandle(pi.hProcess); + } + if (hDupedToken != IntPtr.Zero) + { + CloseHandle(hDupedToken); + } + } + } + } +} + +"@ + # if not on Nano: + Add-Type -TypeDefinition $dscNativeMethodsSource -ReferencedAssemblies 'System.ServiceProcess' +} + +<# + .SYNOPSIS + Takes the given string, adds surrounding double quotes to the + string if it does not already have them, and returns the new string. + + .PARAMETER StringIn + The string to add quotes to, if missing. + + .PARAMETER QuoteEmptyStrings + Whether quotes should be added to empty strings. Defaults to False. +#> +function Add-SurroundingDoubleQuotesToString +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $StringIn, + + [Parameter()] + [System.Boolean] + $QuoteEmptyStrings = $false + ) + + if ($QuoteEmptyStrings -and [String]::IsNullOrEmpty($StringIn) -or $StringIn -notlike "`"*`"") + { + return "`"$StringIn`"" + } + else + { + return $StringIn + } +} + +Export-ModuleMember -Function *-TargetResource diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/DSC_xWindowsProcess.schema.mof b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/DSC_xWindowsProcess.schema.mof new file mode 100644 index 0000000..252f557 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/DSC_xWindowsProcess.schema.mof @@ -0,0 +1,18 @@ +[ClassVersion("1.0.0"), FriendlyName("xWindowsProcess")] +class DSC_xWindowsProcess : OMI_BaseResource +{ + [Key, Description("The full path or file name to the process executable to start or stop.")] String Path; + [Key, Description("A string of arguments to pass to the process executable. Pass in an empty string if no arguments are needed.")] String Arguments; + [Write, EmbeddedInstance("MSFT_Credential"), Description("The credential to run the process under.")] String Credential; + [Write, ValueMap{"Present", "Absent"}, Values{"Present", "Absent"}, Description("Indicates whether the process is present (running) or absent (not running).")] String Ensure; + [Write, Description("The path to write the standard output stream to.")] String StandardOutputPath; + [Write, Description("The path to write the standard error stream to.")] String StandardErrorPath; + [Write, Description("The path to receive standard input from.")] String StandardInputPath; + [Write, Description("The directory to run the processes under.")] String WorkingDirectory; + [Read, Description("The amount of paged memory, in bytes, allocated for the process.")] UInt64 PagedMemorySize; + [Read, Description("The amount of nonpaged memory, in bytes, allocated for the process.")] UInt64 NonPagedMemorySize; + [Read, Description("The amount of virtual memory, in bytes, allocated for the process.")] UInt64 VirtualMemorySize; + [Read, Description("The number of handles opened by the process.")] SInt32 HandleCount; + [Read, Description("The unique identifier of the process.")] SInt32 ProcessId; + [Read, Description("The number of instances of the given process that are currently running.")] SInt32 ProcessCount; +}; diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/en-US/DSC_xWindowsProcess.schema.mfl b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/en-US/DSC_xWindowsProcess.schema.mfl new file mode 100644 index 0000000..34246af --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/en-US/DSC_xWindowsProcess.schema.mfl @@ -0,0 +1,19 @@ +[Description("The xWindowsProcess resource provides a mechanism to manage processes.") : Amended,AMENDMENT, LOCALE("MS_409")] +class DSC_xWindowsProcess : OMI_BaseResource +{ + [Key, Description("The full path or file name to the process executable to start or stop.") : Amended] String Path; + [Key, Description("A string of arguments to pass to the process executable. Pass in an empty string if no arguments are needed.") : Amended] String Arguments; + [Description("The credential to run the process under.") : Amended] String Credential; + [Description("Indicates whether the process is present (running) or absent (not running).\nPresent {default} \nAbsent \n") : Amended] String Ensure; + [Description("The path to write the standard output stream to.") : Amended] String StandardOutputPath; + [Description("The path to write the standard error stream to.") : Amended] String StandardErrorPath; + [Description("The path to receive standard input from.") : Amended] String StandardInputPath; + [Description("The directory to run the processes under.") : Amended] String WorkingDirectory; + [Description("The amount of paged memory, in bytes, allocated for the process.") : Amended] UInt64 PagedMemorySize; + [Description("The amount of nonpaged memory, in bytes, allocated for the process.") : Amended] UInt64 NonPagedMemorySize; + [Description("The amount of virtual memory, in bytes, allocated for the process.") : Amended] UInt64 VirtualMemorySize; + [Description("The number of handles opened by the process.") : Amended] SInt32 HandleCount; + [Description("The unique identifier of the process.") : Amended] SInt32 ProcessId; + [Description("The number of instances of the given process that are currently running.") : Amended] SInt32 ProcessCount; +}; + diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/en-US/DSC_xWindowsProcess.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/en-US/DSC_xWindowsProcess.strings.psd1 new file mode 100644 index 0000000..057aab1 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/DSC_xWindowsProcess/en-US/DSC_xWindowsProcess.strings.psd1 @@ -0,0 +1,36 @@ +# Localized resources for DSC_xWindowsProcess + +ConvertFrom-StringData @' + CouldNotCreateProcessError = Could not create process. Error code: + DuplicateTokenError = Duplicate token. Error code: + FileNotFound = File '{0}' not found in the environment path. + ErrorInvalidUserName = Invalid username: {0}. Username cannot contain multiple '@' or multiple '\' + ErrorParametersNotSupportedWithCredential = Can't specify StandardOutputPath, StandardInputPath or WorkingDirectory when trying to run a process under a local user. + ErrorRunAsCredentialParameterNotSupported = The PsDscRunAsCredential parameter is not supported by the Process resource. To start the process with user '{0}', add the Credential parameter. + ErrorStarting = Failure starting process matching path '{0}'. Message: {1}. + ErrorStopping = Failure stopping processes matching path '{0}' with IDs '({1})'. Message: {2}. + FailureWaitingForProcessesToStart = Failed to wait for processes to start. + FailureWaitingForProcessesToStop = Failed to wait for processes to stop. + GetTargetResourceStartMessage = Begin executing Get functionality for the process {0}. + GetTargetResourceEndMessage = End executing Get functionality for the process {0}. + OpenProcessTokenError = Error while opening process token. Error code: + ParameterShouldNotBeSpecified = Parameter {0} should not be specified. + PathShouldBeAbsolute = The path '{0}' should be absolute for argument '{1}'. + PathShouldExist = The path '{0}' should exist for argument '{1}'. + PrivilegeLookingUpError = Error while looking up privilege. Error code: + ProcessAlreadyStarted = Process matching path '{0}' found running. No action required. + ProcessAlreadyStopped = Process matching path '{0}' not found running. No action required. + ProcessesStarted = Processes matching path '{0}' started. + ProcessesStopped = Processes matching path '{0}' with IDs '({1})' stopped. + RetriveStatusError = Failed to retrieve status. Error code: + SetTargetResourceStartMessage = Begin executing Set functionality for the process {0}. + SetTargetResourceEndMessage = End executing Set functionality for the process {0}. + StartingProcessWhatif = Start-Process. + StoppingProcessWhatIf = Stop-Process. + TestTargetResourceStartMessage = Begin executing Test functionality for the process {0}. + TestTargetResourceEndMessage = End executing Test functionality for the process {0}. + TokenElevationError = Error while getting token elevation. Error code: + UserCouldNotBeLoggedError = User could not be logged. Error code: + WaitFailedError = Failed while waiting for process. Error code: + VerboseInProcessHandle = In process handle {0}. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xFileUpload/xFileUpload.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xFileUpload/xFileUpload.psd1 new file mode 100644 index 0000000..50b43e3 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xFileUpload/xFileUpload.psd1 @@ -0,0 +1,25 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'xFileUpload.schema.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0.0' + + # ID used to uniquely identify this module + GUID = '1fbfd112-4272-4fb8-b31c-fb5b417484bc' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = '' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xFileUpload/xFileUpload.schema.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xFileUpload/xFileUpload.schema.psm1 new file mode 100644 index 0000000..1353248 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xFileUpload/xFileUpload.schema.psm1 @@ -0,0 +1,670 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +<# + .SYNOPSIS + DSC Composite Resource uploads file or folder to an SMB share. + + .DESCRIPTION + This is a DSC Composite resource that can be used to upload + a file or folder into an SMB file share. The SMB file share + does not have to be currently mounted. It will be mounted + during the upload process using the optional Credential + and then dismounted after completion of the upload. + + .PARAMETER DestinationPath + The destination SMB share path to upload the file or folder to. + + .PARAMETER SourcePath + The source path of the file or folder to upload. + + .PARAMETER Credential + Credentials to access the destination SMB share path where file + or folder should be uploaded. + + .PARAMETER certificateThumbprint + Thumbprint of the certificate which should be used for encryption/decryption. + + .EXAMPLE + $securePassword = ConvertTo-SecureString -String 'password' -AsPlainText -Force + $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'domain\user', $securePassword + xFileUpload ` + -DestinationPath '\\machine\share\destinationfolder' ` + -SourcePath 'C:\folder\file.txt' ` + -Credential $credential +#> +configuration xFileUpload +{ + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('DscResource.AnalyzerRules\Measure-Keyword', '', Justification = 'Script resource name is seen as a keyword if this is not used.')] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $DestinationPath, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $SourcePath, + + [Parameter()] + [System.Management.Automation.Credential()] + [System.Management.Automation.PSCredential] + $Credential, + + [Parameter()] + [System.String] + $CertificateThumbprint + ) + + $cacheLocation = "$env:ProgramData\Microsoft\Windows\PowerShell\configuration\BuiltinProvCache\DSC_xFileUpload" + + if ($Credential) + { + $username = $Credential.UserName + + # Encrypt password + $password = Invoke-Command ` + -ScriptBlock $getEncryptedPassword ` + -ArgumentList $Credential, $CertificateThumbprint + } + + Script FileUpload + { + # Get script is not implemented cause reusing Script resource's schema does not make sense + GetScript = { + return @{} + }; + + SetScript = { + # Generating credential object if password and username are specified + $Credential = $null + + if (($using:password) -and ($using:username)) + { + # Validate that certificate thumbprint is specified + if (-not $using:CertificateThumbprint) + { + $errorMessage = 'Certificate thumbprint has to be specified if credentials are present.' + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'CertificateThumbprintIsRequired', $errorMessage, 'InvalidData' + } + + Write-Debug -Message 'Username and password specified.' + + # Decrypt password + $decryptedPassword = Invoke-Command ` + -ScriptBlock $using:getDecryptedPassword ` + -ArgumentList $using:password, $using:CertificateThumbprint + + # Generate credential + $securePassword = ConvertTo-SecureString -String $decryptedPassword -AsPlainText -Force + $Credential = New-Object ` + -TypeName System.Management.Automation.PSCredential ` + -ArgumentList ($using:username, $securePassword) + } + + # Validate DestinationPath is UNC path + if (-not ($using:DestinationPath -as [System.Uri]).isUnc) + { + $errorMessage = "Destination path $using:DestinationPath is not a valid UNC path." + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'DestinationPathIsNotUNCFailure', $errorMessage, 'InvalidData' + } + + # Verify source is localpath + if (-not (($using:SourcePath -as [System.Uri]).Scheme -match 'file')) + { + $errorMessage = "Source path $using:SourcePath has to be local path." + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'SourcePathIsNotLocalFailure', $errorMessage, 'InvalidData' + } + + # Check whether source path is existing file or directory + $sourcePathType = $null + + if (-not (Test-Path -Path $using:SourcePath)) + { + $errorMessage = "Source path $using:SourcePath does not exist." + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'SourcePathDoesNotExistFailure', $errorMessage, 'InvalidData' + } + else + { + $item = Get-Item -Path $using:SourcePath + + switch ($item.GetType().Name) + { + 'FileInfo' + { + $sourcePathType = 'File' + } + + 'DirectoryInfo' + { + $sourcePathType = 'Directory' + } + } + } + + Write-Debug -Message "SourcePath $using:SourcePath is of type: $sourcePathType" + + $psDrive = $null + + # Mount the drive only if Credentials are specified and it's currently not accessible + if ($Credential) + { + if (Test-Path -Path $using:DestinationPath -ErrorAction Ignore) + { + Write-Debug -Message "Destination path $using:DestinationPath is already accessible. No mount needed." + } + else + { + $psDriveArgs = @{ + Name = ([System.Guid]::NewGuid()) + PSProvider = 'FileSystem' + Root = $using:DestinationPath + Scope = 'Private' + Credential = $Credential + } + + try + { + Write-Debug -Message "Create psdrive with destination path $using:DestinationPath..." + $psDrive = New-PSDrive @psDriveArgs -ErrorAction Stop + } + catch + { + $errorMessage = "Cannot access destination path $using:DestinationPath with given Credential" + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'DestinationPathNotAccessibleFailure', $errorMessage, 'InvalidData' + } + } + } + + try + { + # Get expected destination path + $expectedDestinationPath = $null + + if (-not (Test-Path -Path $using:DestinationPath)) + { + # DestinationPath has to exist + $errorMessage = 'Invalid parameter values: DestinationPath does not exist, but has to be existing directory.' + Throw-TerminatingError -ErrorMessage $errorMessage -ErrorCategory 'InvalidData' -ErrorId 'DestinationPathDoesNotExistFailure' + } + else + { + $item = Get-Item -Path $using:DestinationPath + + switch ($item.GetType().Name) + { + 'FileInfo' + { + # DestinationPath cannot be file + $errorMessage = 'Invalid parameter values: DestinationPath is file, but has to be existing directory.' + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'DestinationPathCannotBeFileFailure', $errorMessage, 'InvalidData' + } + + 'DirectoryInfo' + { + $expectedDestinationPath = Join-Path ` + -Path $using:DestinationPath ` + -ChildPath (Split-Path -Path $using:SourcePath -Leaf) + } + } + + Write-Debug -Message "ExpectedDestinationPath is $expectedDestinationPath" + } + + # Copy destination path + try + { + Write-Debug -Message "Copying $using:SourcePath to $using:DestinationPath" + Copy-Item -Path $using:SourcePath -Destination $using:DestinationPath -Recurse -Force -ErrorAction Stop + } + catch + { + $errorMessage = "Could not copy source path $using:SourcePath to $using:DestinationPath : $($_.Exception)" + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'CopyDirectoryOverFileFailure', $errorMessage, 'InvalidData' + } + + # Verify whether expectedDestinationPath was created + if (-not (Test-Path -Path $expectedDestinationPath)) + { + $errorMessage = "Destination path $using:DestinationPath could not be created" + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'DestinationPathNotCreatedFailure', $errorMessage, 'InvalidData' + } + # If expectedDestinationPath exists + else + { + Write-Verbose -Message "$sourcePathType $expectedDestinationPath has been successfully created" + + # Update cache + $uploadedItem = Get-Item -Path $expectedDestinationPath + $lastWriteTime = $uploadedItem.LastWriteTimeUtc + $inputObject = @{} + $inputObject['LastWriteTimeUtc'] = $lastWriteTime + $key = [System.String]::Join('', @($using:DestinationPath, $using:SourcePath, $expectedDestinationPath)).GetHashCode().ToString() + $path = Join-Path $using:cacheLocation $key + + if (-not (Test-Path -Path $using:cacheLocation)) + { + New-Item -Path $using:cacheLocation -ItemType Directory | Out-Null + } + + Write-Debug -Message "Updating cache for DestinationPath = $using:DestinationPath and SourcePath = $using:SourcePath. CacheKey = $key" + Export-CliXml -Path $path -InputObject $inputObject -Force + } + } + finally + { + # Remove PSDrive + if ($psDrive) + { + Write-Debug -Message "Removing PSDrive on root $($psDrive.Root)" + Remove-PSDrive -Name $psDrive -Force + } + } + }; + + TestScript = { + # Generating credential object if password and username are specified + $Credential = $null + + if (($using:password) -and ($using:username)) + { + # Validate that certificate thumbprint is specified + if (-not $using:CertificateThumbprint) + { + $errorMessage = 'Certificate thumbprint has to be specified if credentials are present.' + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'CertificateThumbprintIsRequired', $errorMessage, 'InvalidData' + } + + Write-Debug -Message 'Username and password specified. Generating credential' + + # Decrypt password + $decryptedPassword = Invoke-Command ` + -ScriptBlock $using:getDecryptedPassword ` + -ArgumentList $using:password, $using:CertificateThumbprint + + # Generate credential + $securePassword = ConvertTo-SecureString -String $decryptedPassword -AsPlainText -Force + $Credential = New-Object ` + -TypeName System.Management.Automation.PSCredential ` + -ArgumentList ($using:username, $securePassword) + } + else + { + Write-Debug -Message 'No credentials specified.' + } + + # Validate DestinationPath is UNC path + if (-not ($using:DestinationPath -as [System.Uri]).isUnc) + { + $errorMessage = "Destination path $using:DestinationPath is not a valid UNC path." + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'DestinationPathIsNotUNCFailure', $errorMessage, 'InvalidData' + + } + + # Check whether source path is existing file or directory (needed for expectedDestinationPath) + $sourcePathType = $null + if (-not (Test-Path -Path $using:SourcePath)) + { + $errorMessage = "Source path $using:SourcePath does not exist." + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'SourcePathDoesNotExistFailure', $errorMessage, 'InvalidData' + } + else + { + $item = Get-Item -Path $using:SourcePath + + switch ($item.GetType().Name) + { + 'FileInfo' + { + $sourcePathType = 'File' + } + + 'DirectoryInfo' + { + $sourcePathType = 'Directory' + } + } + } + + Write-Debug -Message "SourcePath $using:SourcePath is of type: $sourcePathType" + + $psDrive = $null + + # Mount the drive only if credentials are specified and it's currently not accessible + if ($Credential) + { + if (Test-Path -Path $using:DestinationPath -ErrorAction Ignore) + { + Write-Debug -Message "Destination path $using:DestinationPath is already accessible. No mount needed." + } + else + { + $psDriveArgs = @{ + Name = ([System.Guid]::NewGuid()) + PSProvider = 'FileSystem' + Root = $using:DestinationPath + Scope = 'Private' + Credential = $Credential + + } + try + { + Write-Debug -Message "Create psdrive with destination path $using:DestinationPath..." + $psDrive = New-PSDrive @psDriveArgs -ErrorAction Stop + } + catch + { + $errorMessage = "Cannot access destination path $using:DestinationPath with given Credential" + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'DestinationPathNotAccessibleFailure', $errorMessage, 'InvalidData' + } + } + } + + try + { + # Get expected destination path + $expectedDestinationPath = $null + + if (-not (Test-Path -Path $using:DestinationPath)) + { + # DestinationPath has to exist + $errorMessage = 'Invalid parameter values: DestinationPath does not exist or is not accessible. DestinationPath has to be existing directory.' + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'DestinationPathDoesNotExistFailure', $errorMessage, 'InvalidData' + } + else + { + $item = Get-Item -Path $using:DestinationPath + + switch ($item.GetType().Name) + { + 'FileInfo' + { + # DestinationPath cannot be file + $errorMessage = 'Invalid parameter values: DestinationPath is file, but has to be existing directory.' + Invoke-Command ` + -ScriptBlock $using:throwTerminatingError ` + -ArgumentList 'DestinationPathCannotBeFileFailure', $errorMessage, 'InvalidData' + } + + 'DirectoryInfo' + { + $expectedDestinationPath = Join-Path ` + -Path $using:DestinationPath ` + -ChildPath (Split-Path -Path $using:SourcePath -Leaf) + } + } + + Write-Debug -Message "ExpectedDestinationPath is $expectedDestinationPath" + } + + # Check whether ExpectedDestinationPath exists and has expected type + $itemExists = $false + + if (-not (Test-Path $expectedDestinationPath)) + { + Write-Debug -Message 'Expected destination path does not exist or is not accessible.' + } + # If expectedDestinationPath exists + else + { + $expectedItem = Get-Item -Path $expectedDestinationPath + $expectedItemType = $expectedItem.GetType().Name + + # If expectedDestinationPath has same type as sourcePathType, we need to verify cache to determine whether no upload is needed + if ((($expectedItemType -eq 'FileInfo') -and ($sourcePathType -eq 'File')) -or ` + (($expectedItemType -eq 'DirectoryInfo') -and ($sourcePathType -eq 'Directory'))) + { + # Get cache + Write-Debug -Message "Getting cache for $expectedDestinationPath" + $cacheContent = $null + $key = [System.String]::Join('', @($using:DestinationPath, $using:SourcePath, $expectedDestinationPath)).GetHashCode().ToString() + $path = Join-Path -Path $using:cacheLocation -ChildPath $key + Write-Debug -Message "Looking for cache under $path" + + if (-not (Test-Path -Path $path)) + { + Write-Debug -Message "No cache found for DestinationPath = $using:DestinationPath and SourcePath = $using:SourcePath. CacheKey = $key" + } + else + { + $cacheContent = Import-CliXml -Path $path + Write-Debug -Message "Found cache for DestinationPath = $using:DestinationPath and SourcePath = $using:SourcePath. CacheKey = $key" + } + + # Verify whether cache reflects current state or upload is needed + if ($cacheContent -ne $null -and ($cacheContent.LastWriteTimeUtc -eq $expectedItem.LastWriteTimeUtc)) + { + # No upload needed + Write-Debug -Message 'Cache reflects current state. No need for upload.' + $itemExists = $true + } + else + { + Write-Debug -Message 'Cache is empty or it does not reflect current state. Upload will be performed.' + } + } + else + { + Write-Debug -Message "Expected destination path: $expectedDestinationPath is of type $expectedItemType, although source path is $sourcePathType" + } + } + } + finally + { + # Remove PSDrive + if ($psDrive) + { + Write-Debug -Message "Removing PSDrive on root $($psDrive.Root)" + Remove-PSDrive -Name $psDrive -Force + } + } + + return $itemExists + }; + } +} + +# Encrypts password using the defined public key +[System.Management.Automation.ScriptBlock] $getEncryptedPassword = { + param + ( + [Parameter(Mandatory = $true)] + [PSCredential] + $Credential, + + [Parameter(Mandatory = $true)] + [System.String] + $CertificateThumbprint + ) + + $value = $Credential.GetNetworkCredential().Password + + $cert = Invoke-Command ` + -ScriptBlock $getCertificate ` + -ArgumentList $CertificateThumbprint + + $encryptedPassword = $null + + if ($cert) + { + # Cast the public key correctly + $rsaProvider = [System.Security.Cryptography.RSACryptoServiceProvider] $cert.PublicKey.Key + + if ($rsaProvider -eq $null) + { + $errorMessage = "Could not get public key from certificate with thumbprint: $CertificateThumbprint . Please verify certificate is valid for encryption." + Invoke-Command ` + -ScriptBlock $throwTerminatingError ` + -ArgumentList "DecryptionCertificateNotFound", $errorMessage, "InvalidOperation" + } + + # Convert to a byte array + $keybytes = [System.Text.Encoding]::UNICODE.GetBytes($value) + + # Add a null terminator to the byte array + $keybytes += 0 + $keybytes += 0 + + # Encrypt using the public key + $encbytes = $rsaProvider.Encrypt($keybytes, $false) + + # Return a string + $encryptedPassword = [Convert]::ToBase64String($encbytes) + } + else + { + $errorMessage = "Could not find certificate which matches thumbprint: $CertificateThumbprint . Could not encrypt password" + Invoke-Command ` + -ScriptBlock $throwTerminatingError ` + -ArgumentList "EncryptionCertificateNot", $errorMessage, "InvalidOperation" + } + + return $encryptedPassword +} + +# Retrieves certificate by thumbprint +[System.Management.Automation.ScriptBlock] $getCertificate = { + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $CertificateThumbprint + ) + + $cert = $null + + foreach ($certIndex in (Get-Childitem -Path Cert:\LocalMachine\My)) + { + if ($certIndex.Thumbprint -match $CertificateThumbprint) + { + $cert = $certIndex + break + } + } + + if (-not $cert) + { + $errorMessage = "Error Reading certificate store for {0}. Please verify thumbprint is correct and certificate belongs to cert:\LocalMachine\My store." -f ${CertificateThumbprint}; + Invoke-Command ` + -ScriptBlock $throwTerminatingError ` + -ArgumentList "InvalidPathSpecified", $errorMessage, "InvalidOperation" + } + else + { + $cert + } +} + +# Throws terminating error specified errorCategory, errorId and errorMessage +[System.Management.Automation.ScriptBlock] $throwTerminatingError = { + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage, + + [Parameter(Mandatory = $true)] + $ErrorCategory + ) + + $exception = New-Object -TypeName System.InvalidOperationException -ArgumentList $ErrorMessage + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord -ArgumentList ($exception, $ErrorId, $ErrorCategory, $null) + throw $errorRecord +} + +# Decrypts password using the defined private key +[System.Management.Automation.ScriptBlock] $getDecryptedPassword = { + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $Value, + + [Parameter(Mandatory = $true)] + [System.String] + $CertificateThumbprint + ) + + $cert = $null + + foreach ($certIndex in (Get-Childitem -Path Cert:\LocalMachine\My)) + { + if ($certIndex.Thumbprint -match $CertificateThumbprint) + { + $cert = $certIndex + break + } + } + + if (-not $cert) + { + $errorMessage = "Error Reading certificate store for {0}. Please verify thumbprint is correct and certificate belongs to cert:\LocalMachine\My store." -f ${CertificateThumbprint}; + $exception = New-Object -TypeName System.InvalidOperationException -ArgumentList $errorMessage + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord -ArgumentList ($exception, "InvalidPathSpecified", "InvalidOperation", $null) + throw $errorRecord + } + + $decryptedPassword = $null + + # Get RSA provider + $rsaProvider = [System.Security.Cryptography.RSACryptoServiceProvider] $cert.PrivateKey + + if ($rsaProvider -eq $null) + { + $errorMessage = "Could not get private key from certificate with thumbprint: $CertificateThumbprint . Please verify certificate is valid for decryption." + $exception = New-Object -TypeName System.InvalidOperationException -ArgumentList $errorMessage + $errorRecord = New-Object -TypeName System.Management.Automation.ErrorRecord -ArgumentList ($exception, "DecryptionCertificateNotFound", "InvalidOperation", $null) + throw $errorRecord + } + + # Convert to bytes array + $encBytes = [Convert]::FromBase64String($value) + + # Decrypt bytes + $decryptedBytes = $rsaProvider.Decrypt($encBytes, $false) + + # Convert to string + $decryptedPassword = [System.Text.Encoding]::Unicode.GetString($decryptedBytes) + + return $decryptedPassword +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xGroupSet/xGroupSet.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xGroupSet/xGroupSet.psd1 new file mode 100644 index 0000000..4cbe3bc --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xGroupSet/xGroupSet.psd1 @@ -0,0 +1,25 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'xGroupSet.schema.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0.0' + + # ID used to uniquely identify this module + GUID = 'c5e227b5-52dc-4653-b08f-6d94e06bb90b' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Configures multiple xGroup resources with common settings but different names.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xGroupSet/xGroupSet.schema.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xGroupSet/xGroupSet.schema.psm1 new file mode 100644 index 0000000..61f23e7 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xGroupSet/xGroupSet.schema.psm1 @@ -0,0 +1,74 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +<# + .SYNOPSIS + A composite DSC resource to configure a set of similar xGroup resources. + + .PARAMETER GroupName + An array of the names of the groups to configure. + + .PARAMETER Ensure + Specifies whether or not the set of groups should exist. + + Set this property to Present to create or modify a set of groups. + Set this property to Absent to remove a set of groups. + + .PARAMETER MembersToInclude + The members that should be included in each group in the set. + + .PARAMETER MembersToExclude + The members that should be excluded from each group in the set. + + .PARAMETER Credential + The credential to resolve all groups and user accounts. +#> +configuration xGroupSet +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $GroupName, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure, + + [Parameter()] + [System.String[]] + $MembersToInclude, + + [Parameter()] + [System.String[]] + $MembersToExclude, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $newResourceSetConfigurationParams = @{ + ResourceName = 'xGroup' + ModuleName = 'xPSDesiredStateConfiguration' + KeyParameterName = 'GroupName' + Parameters = $PSBoundParameters + } + + $configurationScriptBlock = New-ResourceSetConfigurationScriptBlock @newResourceSetConfigurationParams + + # This script block must be run directly in this configuration in order to resolve variables + . $configurationScriptBlock +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xProcessSet/xProcessSet.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xProcessSet/xProcessSet.psd1 new file mode 100644 index 0000000..2d83e58 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xProcessSet/xProcessSet.psd1 @@ -0,0 +1,25 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'xProcessSet.schema.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0.0' + + # ID used to uniquely identify this module + GUID = '0cb71def-366f-4f3b-88a9-b9b37d266dd6' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Provides a mechanism to configure and manage multiple xWindowsProcess resources on a target node.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xProcessSet/xProcessSet.schema.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xProcessSet/xProcessSet.schema.psm1 new file mode 100644 index 0000000..1a3516d --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xProcessSet/xProcessSet.schema.psm1 @@ -0,0 +1,104 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +<# + .SYNOPSIS + A composite DSC resource to configure a set of similar xWindowsProcess resources. + No arguments can be passed into these xWindowsProcess resources. + + .PARAMETER Path + The file paths to the executables of the processes to start or stop. Only the names of the + files may be specified if they are all accessible through the environment path. Relative + paths are not supported. + + .PARAMETER Ensure + Specifies whether or not the processes should exist. + + To start processes, set this property to Present. + To stop processes, set this property to Absent. + + .PARAMETER Credential + The credential of the user account to start the processes under. + + .PARAMETER StandardOutputPath + The file path to write the standard output to. Any existing file at this path + will be overwritten.This property cannot be specified at the same time as Credential + when running the processes as a local user. + + .PARAMETER StandardErrorPath + The file path to write the standard error output to. Any existing file at this path + will be overwritten. + + .PARAMETER StandardInputPath + The file path to get standard input from. This property cannot be specified at the + same time as Credential when running the processes as a local user. + + .PARAMETER WorkingDirectory + The file path to use as the working directory for the processes. Any existing file + at this path will be overwritten. This property cannot be specified at the same time + as Credential when running the processes as a local user. +#> +configuration xProcessSet +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Path, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $StandardOutputPath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $StandardErrorPath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $StandardInputPath, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $WorkingDirectory + ) + + $newResourceSetConfigurationParams = @{ + ResourceName = 'xWindowsProcess' + ModuleName = 'xPSDesiredStateConfiguration' + KeyParameterName = 'Path' + Parameters = $PSBoundParameters + } + + # Arguments is a key parameter in xWindowsProcess resource. Adding it as a common parameter with an empty value string + $newResourceSetConfigurationParams['Parameters']['Arguments'] = '' + + $configurationScriptBlock = New-ResourceSetConfigurationScriptBlock @newResourceSetConfigurationParams + + # This script block must be run directly in this configuration in order to resolve variables + . $configurationScriptBlock +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xServiceSet/xServiceSet.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xServiceSet/xServiceSet.psd1 new file mode 100644 index 0000000..03da2aa --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xServiceSet/xServiceSet.psd1 @@ -0,0 +1,25 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'xServiceSet.schema.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0.0' + + # ID used to uniquely identify this module + GUID = 'c3ac5e1f-c1fd-4ed0-be24-b271c7062484' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Allows starting, stopping and change in state or account type for a group of services.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xServiceSet/xServiceSet.schema.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xServiceSet/xServiceSet.schema.psm1 new file mode 100644 index 0000000..433a457 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xServiceSet/xServiceSet.schema.psm1 @@ -0,0 +1,96 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +<# + .SYNOPSIS + A composite DSC resource to configure a set of similar xService resources. + + .PARAMETER Name + An array of the names of the services to configure. + + .PARAMETER Ensure + Specifies whether or not the set of services should exist. + + Set this property to Present to modify a set of services. + Set this property to Absent to remove a set of services. + + .PARAMETER StartupType + The startup type each service in the set should have. + + .PARAMETER BuiltInAccount + The built-in account each service in the set should start under. + + Cannot be specified at the same time as Credential. + + The user account specified by this property must have access to the service + executable paths in order to start the services. + + .PARAMETER State + The state each service in the set should be in. + From the default value defined in xService, the default will be Running. + + .PARAMETER Credential + The credential of the user account each service in the set should start under. + + Cannot be specified at the same time as BuiltInAccount. + + The user specified by this credential will automatically be granted the Log on as a Service + right. The user account specified by this property must have access to the service + executable paths in order to start the services. +#> +configuration xServiceSet +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure, + + [Parameter()] + [ValidateSet('Automatic', 'Manual', 'Disabled')] + [System.String] + $StartupType, + + [Parameter()] + [ValidateSet('LocalSystem', 'LocalService', 'NetworkService')] + [System.String] + $BuiltInAccount, + + [Parameter()] + [ValidateSet('Running', 'Stopped', 'Ignore')] + [System.String] + $State, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential + ) + + $newResourceSetConfigurationParams = @{ + ResourceName = 'xService' + ModuleName = 'xPSDesiredStateConfiguration' + KeyParameterName = 'Name' + Parameters = $PSBoundParameters + } + + $configurationScriptBlock = New-ResourceSetConfigurationScriptBlock @newResourceSetConfigurationParams + + # This script block must be run directly in this configuration in order to resolve variables + . $configurationScriptBlock +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsFeatureSet/xWindowsFeatureSet.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsFeatureSet/xWindowsFeatureSet.psd1 new file mode 100644 index 0000000..0c8d3d7 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsFeatureSet/xWindowsFeatureSet.psd1 @@ -0,0 +1,25 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'xWindowsFeatureSet.schema.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0.0' + + # ID used to uniquely identify this module + GUID = 'b18a27e2-f710-4a4a-92b8-6cd076970eb2' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Provides a mechanism to configure and manage multiple xWindowsFeature resources on a target node.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsFeatureSet/xWindowsFeatureSet.schema.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsFeatureSet/xWindowsFeatureSet.schema.psm1 new file mode 100644 index 0000000..4a218b9 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsFeatureSet/xWindowsFeatureSet.schema.psm1 @@ -0,0 +1,85 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +<# + .SYNOPSIS + A composite DSC resource to configure a set of similar xWindowsFeature resources. + + .PARAMETER Name + The name of the roles or features to install or uninstall. + + .PARAMETER Ensure + Specifies whether the roles or features should be installed or uninstalled. + + To install the features, set this property to Present. + To uninstall the features, set this property to Absent. + + .PARAMETER IncludeAllSubFeature + Specifies whether or not all subfeatures should be installed or uninstalled alongside the specified roles or features. + + If this property is true and Ensure is set to Present, all subfeatures will be installed. + If this property is false and Ensure is set to Present, subfeatures will not be installed or uninstalled. + If Ensure is set to Absent, all subfeatures will be uninstalled. + + .PARAMETER Credential + The credential of the user account under which to install or uninstall the roles or features. + + .PARAMETER LogPath + The custom file path to which to log this operation. + If not passed in, the default log path will be used (%windir%\logs\ServerManager.log). +#> +configuration xWindowsFeatureSet +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Name, + + [Parameter()] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $Source, + + [Parameter()] + [System.Boolean] + $IncludeAllSubFeature, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.PSCredential] + [System.Management.Automation.Credential()] + $Credential, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath + ) + + $newResourceSetConfigurationParams = @{ + ResourceName = 'xWindowsFeature' + ModuleName = 'xPSDesiredStateConfiguration' + KeyParameterName = 'Name' + Parameters = $PSBoundParameters + } + + $configurationScriptBlock = New-ResourceSetConfigurationScriptBlock @newResourceSetConfigurationParams + + # This script block must be run directly in this configuration in order to resolve variables + . $configurationScriptBlock +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsOptionalFeatureSet/xWindowsOptionalFeatureSet.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsOptionalFeatureSet/xWindowsOptionalFeatureSet.psd1 new file mode 100644 index 0000000..ab73a68 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsOptionalFeatureSet/xWindowsOptionalFeatureSet.psd1 @@ -0,0 +1,25 @@ +@{ + # Script module or binary module file associated with this manifest. + RootModule = 'xWindowsOptionalFeatureSet.schema.psm1' + + # Version number of this module. + ModuleVersion = '1.0.0.0' + + # ID used to uniquely identify this module + GUID = 'a88c1458-db46-402c-947b-7d43ab57e27a' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Provides a mechanism to configure and manage multiple xWindowsOptionalFeature resources on a target node.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsOptionalFeatureSet/xWindowsOptionalFeatureSet.schema.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsOptionalFeatureSet/xWindowsOptionalFeatureSet.schema.psm1 new file mode 100644 index 0000000..c6b8d91 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/DSCResources/xWindowsOptionalFeatureSet/xWindowsOptionalFeatureSet.schema.psm1 @@ -0,0 +1,83 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +<# + .SYNOPSIS + A composite DSC resource to configure a set of similar xWindowsOptionalFeature resources. + + .PARAMETER Name + The names of the Windows optional features to enable or disable. + + .PARAMETER Ensure + Specifies whether the features should be enabled or disabled. + + To enable a set of features, set this property to Present. + To disable a set of features, set this property to Absent. + + .PARAMETER RemoveFilesOnDisable + Specifies whether or not to remove all files associated with the features when they are + disabled. + + .PARAMETER NoWindowsUpdateCheck + Specifies whether or not DISM should contact Windows Update (WU) when searching for the + source files to restore Windows optional features on an online image. + + .PARAMETER LogPath + The file path to which to log the opertation. + + .PARAMETER LogLevel + The level of detail to include in the log. +#> +configuration xWindowsOptionalFeatureSet +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $Name, + + [Parameter(Mandatory = $true)] + [ValidateSet('Present', 'Absent')] + [System.String] + $Ensure, + + [Parameter()] + [System.Boolean] + $RemoveFilesOnDisable, + + [Parameter()] + [System.Boolean] + $NoWindowsUpdateCheck, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $LogPath, + + [Parameter()] + [ValidateSet('ErrorsOnly', 'ErrorsAndWarning', 'ErrorsAndWarningAndInformation')] + [System.String] + $LogLevel + ) + + $newResourceSetConfigurationParams = @{ + ResourceName = 'xWindowsOptionalFeature' + ModuleName = 'xPSDesiredStateConfiguration' + KeyParameterName = 'Name' + Parameters = $PSBoundParameters + } + + $configurationScriptBlock = New-ResourceSetConfigurationScriptBlock @newResourceSetConfigurationParams + + # This script block must be run directly in this configuration in order to resolve variables + . $configurationScriptBlock +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/DscPullServerSetup.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/DscPullServerSetup.psm1 new file mode 100644 index 0000000..7ba5a95 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/DscPullServerSetup.psm1 @@ -0,0 +1,492 @@ +$errorActionPreference = 'Stop' +Set-StrictMode -Version 'Latest' + +$modulePath = Split-Path -Path $PSScriptRoot -Parent + +# Import the Networking Resource Helper Module +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData ` + -ResourceName 'DscPullServerSetup' ` + -ScriptRoot $PSScriptRoot + +<# + .SYNOPSIS + Package DSC modules and mof configuration document and publish them on an enterprise DSC pull server in the required format. + + .DESCRIPTION + Uses Publish-DscModulesAndMof function to package DSC modules into zip files with the version info. + Publishes the zip modules on "$env:ProgramFiles\WindowsPowerShell\DscService\Modules". + Publishes all mof configuration documents that are present in the $Source folder on "$env:ProgramFiles\WindowsPowerShell\DscService\Configuration"- + Use $Force to overwrite the version of the module that exists in the PowerShell module path with the version from the $source folder. + Use $ModuleNameList to specify the names of the modules to be published if the modules do not exist in $Source folder. + + .PARAMETER Source + The folder that contains the configuration mof documents and modules to be published on Pull server. + Everything in this folder will be packaged and published. + + .PARAMETER Force + Switch to overwrite the module in PSModulePath with the version provided in $Sources. + + .PARAMETER ModuleNameList + Package and publish the modules listed in $ModuleNameList based on PowerShell module path content. + + .EXAMPLE + $ModuleList = @("xWebAdministration", "xPhp") + Publish-DscModuleAndMof -Source C:\LocalDepot -ModuleNameList $ModuleList + + .EXAMPLE + Publish-DscModuleAndMof -Source C:\LocalDepot -Force +#> +function Publish-DscModuleAndMof +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript({ + Test-Path -Path $_ -PathType Container + })] + [System.String] + $Source, + + [Parameter()] + [System.Management.Automation.SwitchParameter] + $Force, + + [Parameter()] + [System.String[]] + $ModuleNameList + ) + + # Create working directory + $tempFolder = Join-Path -Path $Source -ChildPath 'temp' + New-Item -Path $tempFolder -ItemType Directory -Force -ErrorAction SilentlyContinue + + # Copy the mof documents from the $Source to working dir + $mofPath = Join-Path -Path $Source -ChildPath '*.mof' + Copy-Item -Path $mofPath -Destination $tempFolder -Force + + # Start Deployment! + Write-LogEntry -Scope $MyInvocation -Message $script:localizedData.StartDeploymentMessage + New-ZipFromPSModulePath -ListModuleNames $ModuleNameList -Destination $tempFolder + New-ZipFromSource -Source $Source -Destination $tempFolder + + # Generate the checkSum file for all the zip and mof files. + New-DSCCheckSum -Path $tempFolder -Force + + # Publish mof and modules to pull server repositories + Publish-ModulesAndChecksum -Source $tempFolder + Publish-MofsInSource -Source $tempFolder + + # Deployment is complete! + Remove-Item -Path $tempFolder -Recurse -Force -ErrorAction SilentlyContinue + Write-LogEntry -Scope $MyInvocation -Message $script:localizedData.EndDeploymentMessage +} + +<# + .SYNOPSIS + Creates a zip archive containing all the modules whose module name was assigned to the parameter ListModuleNames. + The zip archive is created in the path assigned to the parameter Destination. + + .PARAMETER ListModuleNames + List of Modules to package + + .PARAMETER Destination + Destionation path to copy packaged modules to +#> +function New-ZipFromPSModulePath +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String[]] + $ListModuleNames, + + [Parameter()] + [ValidateScript({Test-Path -Path $_ -PathType Container})] + [System.String] + $Destination + ) + + # Move all required modules from powershell module path to a temp folder and package them + if ([System.String]::IsNullOrEmpty($ListModuleNames)) + { + Write-LogEntry -Scope $MyInvocation -Message $script:localizedData.NoAdditionalModulesPackagedMessage + } + + foreach ($module in $ListModuleNames) + { + $allVersions = Get-Module -Name $module -ListAvailable + + # Package all versions of the module + foreach ($moduleVersion in $allVersions) + { + $name = $moduleVersion.Name + $source = "$Destination\$name" + + # Create package zip + $path = $moduleVersion.ModuleBase + $version = $moduleVersion.Version.ToString() + Write-LogEntry -Scope $MyInvocation -Message "Zipping $name ($version)" + Compress-Archive -Path "$path\*" -DestinationPath "$source.zip" -Force + $newName = "$Destination\$name" + '_' + "$version" + '.zip' + + # Rename the module folder to contain the version info. + if (Test-Path -Path $newName) + { + $null = Remove-Item -Path $newName -Recurse -Force + } + + $null = Rename-Item -Path "$source.zip" -NewName $newName -Force + } + } +} + +<# + .SYNOPSIS + Deploys all DSC resource modules in the path assigned to the parameter Source. The DSC resource modules are copied + to the path '$env:ProgramFiles\WindowsPowerShell\Modules', and also packaged into a zip archive that is saved to + the path assigned to the parameter Destination. + + .PARAMETER Source + Folder containing DSC Resource Modules to package + + .PARAMETER Destination + Destination path to copy zipped DSC Resources to +#> +function New-ZipFromSource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript({Test-Path -Path $_ -PathType Container})] + [System.String] + $Source, + + [Parameter(Mandatory = $true)] + [ValidateScript({Test-Path -Path $_ -PathType Container})] + $Destination + ) + + # For each module under $Source folder create a zip package that has the same name as the folder. + $allModulesInSource = Get-ChildItem -Path $Source -Directory + $modules = @() + + foreach ($item in $allModulesInSource) + { + $name = $Item.Name + $alreadyExists = Get-Module -Name $name -ListAvailable + + if (($null -eq $alreadyExists) -or ($Force)) + { + # Install the modules into PowerShell module path and overwrite the content + Copy-Item -Path $item.FullName -Recurse -Force -Destination "$env:ProgramFiles\WindowsPowerShell\Modules" + } + else + { + Write-Warning -Message ($script:localizedData.SkippingModuleOverwriteMessage -f $name, $Source) + } + + $modules += @("$name") + } + + # Package the module in $destination + New-ZipFromPSModulePath -ListModuleNames $modules -Destination $Destination +} + +<# + .SYNOPSIS + Deploy modules to the Pull sever repository. + + .PARAMETER Source + Folder containing zipped DSC Resources to publish +#> +function Publish-ModulesAndChecksum +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript({Test-Path -Path $_ -PathType Container})] + [System.String] + $Source + ) + + # Check if the current machine is a server sku. + $moduleRepository = "$env:ProgramFiles\WindowsPowerShell\DscService\Modules" + + if ((Get-Module -Name ServerManager -ListAvailable) -and (Test-Path -Path $moduleRepository)) + { + Write-LogEntry -Scope $MyInvocation -Message ($script:localizedData.CopyingModulesAndChecksumsMessage -f $moduleRepository) + $zipPath = Join-Path -Path $Source -ChildPath '*.zip*' + Copy-Item -Path $zipPath -Destination $moduleRepository -Force + } + else + { + Write-Warning -Message $script:localizedData.CopyingModulesToPullServerMessage + } +} + +<# + .SYNOPSIS + Deploy configurations and their checksums. + + .PARAMETER Source + Folder containing MOFs to publish +#> +function Publish-MofsInSource +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateScript({Test-Path -Path $_ -PathType Container})] + [System.String] + $Source + ) + + # Check if the current machine is a server sku. + $mofRepository = "$env:ProgramFiles\WindowsPowerShell\DscService\Configuration" + + if ((Get-Module -Name ServerManager -ListAvailable) -and (Test-Path -Path $mofRepository)) + { + Write-LogEntry -Scope $MyInvocation -Message ($script:localizedData.CopyingMOFsAndChecksumsMessage -f $mofRepository) + $mofPath = Join-Path -Path $Source -ChildPath '*.mof*' + Copy-Item -Path $mofPath -Destination $mofRepository -Force + } + else + { + Write-Warning -Message $script:localizedData.CopyingConfigurationsToPullServerMessage + } +} + +<# + .SYNOPSIS + Writes a version message with the current time, caller, and message. +#> +function Write-LogEntry +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.DateTime] + $Date = $(Get-Date), + + [Parameter(Mandatory = $true)] + [System.Object] + $Scope, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message + ) + + Write-Verbose -Message "$Date [$($Scope.MyCommand)] :: $Message" +} + +<# + .SYNOPSIS + Deploy DSC modules to the pullserver. + + .DESCRIPTION + Publish DSC module using Module Info object as an input. + The cmdlet will figure out the location of the module repository using web.config of the pullserver. + + .PARAMETER Name + Name of the module. + + .PARAMETER ModuleBase + This is the location of the base of the module. + + .PARAMETER Version + This is the version of the module + + .PARAMETER PullServerWebConfig + Path to the Pull Server web.config file, i.e. + "$env:SystemDrive\inetpub\wwwroot\PSDSCPullServer\web.config" + + .PARAMETER OutputFolderPath + Path to the Location where the MOF files should be published. + This should be used when the PullServer is a SMB share pull server. + (https://docs.microsoft.com/nl-nl/powershell/dsc/pull-server/pullserversmb) + Defaults to $null + + .EXAMPLE + Get-Module <ModuleName> | Publish-ModuleToPullServer + + .EXAMPLE + Get-Module <ModuleName> | Publish-ModuleToPullServer -OutputFolderPath "\\Server01\DscService\Module" +#> +function Publish-ModuleToPullServer +{ + [CmdletBinding()] + [OutputType([System.Void])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true, + Position = 0)] + [System.String] + $Name, + + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true, + Position = 1)] + [System.String] + $ModuleBase, + + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true, + Position = 2)] + [Version] + $Version, + + [Parameter(Mandatory = $true)] + [ValidateScript({Test-Path -Path $_ -PathType Leaf})] + [System.String] + $PullServerWebConfig, + + [Parameter()] + [System.String] + $OutputFolderPath = $null + ) + + begin + { + if (-not($OutputFolderPath) -or -not (Test-Path -Path $OutputFolderPath)) + { + if (-not(Test-Path -Path $PullServerWebConfig)) + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidWebConfigPathError -f $PullServerWebConfig) ` + -ArgumentName 'PullServerWebConfig' + } + else + { + <# + Web.Config of Pull Server found so figure out the module path of the pullserver. + Use this value as output folder path. + #> + $webConfigXml = [System.Xml.XmlDocument] (Get-Content -Path $PullServerWebConfig) + $moduleXElement = $webConfigXml.SelectNodes("//appSettings/add[@key = 'ModulePath']") + $OutputFolderPath = $moduleXElement.Value + } + } + } + + process + { + Write-Verbose -Message ($script:localizedData.PublishModuleMessage -f $Name, $Version, $ModuleBase) + $targetPath = Join-Path -Path $OutputFolderPath -ChildPath "$($Name)_$($Version).zip" + + if (Test-Path -Path $targetPath) + { + Compress-Archive -DestinationPath $targetPath -Path "$($ModuleBase)\*" -Update + } + else + { + Compress-Archive -DestinationPath $targetPath -Path "$($ModuleBase)\*" + } + } + + end + { + # Now that all the modules are published generate their checksum. + New-DscChecksum -Path $OutputFolderPath + } +} + +<# + .SYNOPSIS + Deploy DSC Configuration document to the pullserver. + + .DESCRIPTION + Publish MOF file to the pullserver. It takes File Info object as + pipeline input. It also auto detects the location of the configuration + repository using the web.config of the pullserver. + + .PARAMETER FullName + MOF File Name + + .PARAMETER PullServerWebConfig + Path to the Pull Server web.config file, i.e. + "$env:SystemDrive\inetpub\wwwroot\PSDSCPullServer\web.config" + + .PARAMETER OutputFolderPath + Path to the Location where the MOF files should be published. + This should be used when the PullServer is a SMB share pull server. + (https://docs.microsoft.com/nl-nl/powershell/dsc/pull-server/pullserversmb) + Defaults to $null + + .EXAMPLE + Dir <path>\*.mof | Publish-MOFToPullServer + + .EXAMPLE + Dir <path>\*.mof | Publish-MOFToPullServer -OutputFolderPath "\\Server01\DscService\Configuration" +#> +function Publish-MofToPullServer +{ + [CmdletBinding()] + [OutputType([System.Void])] + param + ( + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true, + Position = 0)] + [ValidateScript({Test-Path -Path $_ -PathType Leaf})] + [System.String] + $FullName, + + [Parameter(Mandatory = $true)] + [ValidateScript({Test-Path -Path $_ -PathType Leaf})] + [System.String] + $PullServerWebConfig, + + [Parameter()] + [System.String] + $OutputFolderPath = $null + ) + + begin + { + if (-not($OutputFolderPath) -or -not (Test-Path -Path $OutputFolderPath)) + { + <# + Web.Config of Pull Server found so figure out the module path of the pullserver. + Use this value as output folder path. + #> + $webConfigXml = [System.Xml.XmlDocument] (Get-Content -Path $PullServerWebConfig) + $configXElement = $webConfigXml.SelectNodes("//appSettings/add[@key = 'ConfigurationPath']") + $OutputFolderPath = $configXElement.Value + } + } + + process + { + $fileItem = Get-Item -Path $FullName + + if ($fileItem.Extension -eq '.mof') + { + Copy-Item -Path $FullName -Destination $OutputFolderPath -Force + } + else + { + New-InvalidArgumentException ` + -Message ($script:localizedData.InvalidFileTypeError -f $FullName) ` + -ArgumentName 'FullName' + } + } + + end + { + New-DscChecksum -Path $OutputFolderPath -Force + } +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/DscPullServerSetupTest/DscPullServerSetupTest.ps1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/DscPullServerSetupTest/DscPullServerSetupTest.ps1 new file mode 100644 index 0000000..2d748b4 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/DscPullServerSetupTest/DscPullServerSetupTest.ps1 @@ -0,0 +1,134 @@ +<# + * + * Once you setup your pull server with registration, run the following set of tests on the pull server machine + * to verify if the pullserver is setup properly and ready to go. + #> + +<# + * Prerequisites: + * You need Pester module to run this test. + * With PowerShell 5, use Install-Module Pester to install the module if it is not on pull server node. + * With older PowerShell, install PackageManagement extensions first. + #> + +<# + * Run the test via Invoke-Pester ./PullServerSetupTests.ps1 + * This test assumes default values are used during deployment for the location of web.config and pull server URL. + * If default values are not used during deployment , please update these values in the 'BeforeAll' block accordingly. + #> + +Describe PullServerInstallationTests { + BeforeAll { + # UPDATE THE PULLSERVER URL, If it is different from the default value. + $DscHostFQDN = [System.Net.Dns]::GetHostEntry([System.String] $env:computername).HostName + $script:dscPullServerURL = "https://$($DscHostFQDN):8080/PSDSCPullserver.svc" + + # UPDATE THE LOCATION OF WEB.CONFIG, if it is differnet from the default path. + $DscWebConfigChildPath = '\inetpub\wwwroot\psdscpullserver\web.config' + $DscWebConfigPath = Join-Path -Path $env:SystemDrive -ChildPath $DscWebConfigChildPath + + # Skip all tests if web.config is not found + if (-not (Test-Path -Path $DscWebConfigPath)){ + throw 'No pullserver web.config found.' + } + + # Get web.config content as XML + $DscWebConfigXML = [System.Xml.XmlDocument] (Get-Content -Path $DscWebConfigPath) + + # Registration Keys info. + $DscRegKeyName = 'RegistrationKeys.txt' + $DscRegKeyXMLNode = "//appSettings/add[@key = 'RegistrationKeyPath']" + $DscRegKeyParentPath = ($DscWebConfigXML.SelectSingleNode($DscRegKeyXMLNode)).Value + $DscRegKeyPath = Join-Path -Path $DscRegKeyParentPath -ChildPath $DscRegKeyName + $script:dscRegKey = Get-Content -Path $DscRegKeyPath + + # Configuration repository info. + $DscConfigPathXMLNode = "//appSettings/add[@key = 'ConfigurationPath']" + $DscConfigPath = ($DscWebConfigXML.SelectSingleNode($DscConfigPathXMLNode)).Value + + # Module repository info. + $DscModulePathXMLNode = "//appSettings/add[@key = 'ModulePath']" + $script:dscModulePath = ($DscWebConfigXML.SelectSingleNode($DscModulePathXMLNode)).Value + + # Testing Files/Variables + $DscTestMetaConfigName = 'PullServerSetupTestMetaConfig' + $script:dscTestMetaConfigPath = Join-Path -Path $PSScriptRoot -ChildPath $DscTestMetaConfigName + $DscTestConfigName = 'PullServerSetUpTest' + $script:dscTestMofPath = Join-Path -Path $DscConfigPath -ChildPath "$DscTestConfigName.mof" + } + + Context 'Verify general pull server functionality' { + It "$DscRegKeyPath exists" { + $DscRegKeyPath | Should -Exist + } + + It "Module repository $script:dscModulePath exists" { + $script:dscModulePath | Should -Exist + } + + It "Configuration repository $DscConfigPath exists" { + $DscConfigPath | Should -Exist + } + + It "Verify server $script:dscPullServerURL is up and running" { + $DscPullServerResponse = Invoke-WebRequest -Uri $script:dscPullServerURL -UseBasicParsing + $DscPullServerResponse.StatusCode | Should -Be 200 + } + } + + Context 'Verify pull end to end works' { + It 'Tests local configuration manager' { + [DscLocalConfigurationManager()] + Configuration $DscTestMetaConfigName + { + Settings + { + RefreshMode = 'PULL' + } + ConfigurationRepositoryWeb ConfigurationManager + { + ServerURL = $script:dscPullServerURL + RegistrationKey = $script:dscRegKey + ConfigurationNames = @($DscTestConfigName) + } + } + + PullServerSetupTestMetaConfig -OutputPath $script:dscTestMetaConfigPath + Set-DscLocalConfigurationManager -Path $script:dscTestMetaConfigPath -Verbose:$VerbosePreference -Force + + $DscLocalConfigNames = (Get-DscLocalConfigurationManager).ConfigurationDownloadManagers.ConfigurationNames + $DscLocalConfigNames -contains $DscTestConfigName | Should -BeTrue + } + + It "Creates mof and checksum files in $DscConfigPath" { + # Sample test configuration + Configuration NoOpConfig { + Import-DscResource -ModuleName PSDesiredStateConfiguration + Node ($DscTestConfigName) + { + Script script + { + GetScript = '@{}' + SetScript = '{}' + TestScript = { + if ($false) { return $true } else {return $false} + } + } + } + } + + # Create a mof file copy it to + NoOpConfig -OutputPath $DscConfigPath -Verbose:$VerbosePreference + $script:dscTestMofPath | Should -Exist + + # Create checksum + New-DscChecksum $DscConfigPath -Verbose:$VerbosePreference -Force + "$script:dscTestMofPath.checksum" | Should -Exist + } + + It 'Updates DscConfiguration Successfully' { + Update-DscConfiguration -Wait -Verbose:$VerbosePreference + (Get-DscConfiguration).ConfigurationName | Should -Be 'NoOpConfig' + } + } +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/README.md b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/README.md new file mode 100644 index 0000000..47bb609 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/README.md @@ -0,0 +1,61 @@ +# DSCPullServerSetup + +The DSCPullServerSetup module contains utilities to automate DSC module and +configuration document packaging and deployment on an enterprise DSC Pull +Server, with examples. + +## Publish-DscModuleAndMof + +Use `Publish-DscModuleAndMof` cmdlet to package a module containing DSC Resources +that are present in `$Source` or in `$ModuleNameList` into zip files with version +info, then publish them with MOF configuration documents that are present +in `$Source` to the Pull server. + +- This publishes all the DSC Resources in `$env:ProgramFiles\WindowsPowerShell\DscService\Modules`. +- This publishes all the MOF configuration documents in `$env:ProgramFiles\WindowsPowerShell\DscService\Configuration`. +- Use `-Force` to force packaging the version that exists in $Source folder if + a different version of the module exists in the PowerShell module path. +- Use `-ModuleNameList` to specify the names of the modules to be published (all + versions if multiple versions of the module are installed) if no DSC module + present in local folder `$Source` + +```powershell +.EXAMPLE + Publish-DSCModuleAndMof -Source C:\LocalDepot + +.EXAMPLE + $moduleList = @("xWebAdministration", "xPhp") + Publish-DSCModuleAndMof -Source C:\LocalDepot -ModuleNameList $moduleList + +.EXAMPLE + Publish-DSCModuleAndMof -Source C:\LocalDepot -Force +``` + +## How to Configure Pull Server & SQL Server to enable new SQL backend provider feature in DSC + +- Install SQL Server on a clean OS +- On the SQL Server Machine: + - Create a Firewall rule according to this link : https://technet.microsoft.com/en-us/library/ms175043(v=sql.110).aspx + - Enable TCP/IP : + - Open "SQL Server Configuration Manager" + - Now Click on "SQL Server Network Configuration" and Click on "Protocols for Name" + - Right Click on "TCP/IP" (make sure it is Enabled) Click on Properties + - Now Select "IP Addresses" Tab -and- Go to the last entry "IP All" + - Enter "TCP Port" 1433. + - Now Restart "SQL Server .Name." using "services.msc" (winKey + r) + - Enable Remote Connections to the SQL Server + - Go to Server Properties + - Select Connections + - Under the Remote server connections - Click the check box next to "Allow remote connections to this server" + - Create a new User login (This is required as the engine will need this privilege to create the DSC DB and tables) + - Go to the Login Properties + - Select Server Roles - select "Public" and "Sysadmin" + - Select User Mapping - select "db_owner" and "public" + - On the Pull Server + - Update the Web.Config with the SQL server connection string + - Open: C:\inetpub\wwwroot\PSDSCPullServer\Web.config + - &lt;add key="dbprovider" value="System.Data.OleDb"/&gt; + - &lt;add key="dbconnectionstr" value="Provider=SQLNCLI11;Data Source=&lt;ServerName&gt;;Initial Catalog=master;User ID=sa;Password=&lt;sapassword&gt;;Initial Catalog=master;"/&gt; + - If SQL server was installed as a named Instance instead of default one then use + - &lt;add key="dbconnectionstr" value="Provider=SQLNCLI11;Data Source=&lt;ServerName\InstanceName&gt;;Initial Catalog=master;User ID=sa;Password=&lt;sapassword&gt;;Initial Catalog=master;"/&gt; + - Run iireset for the Pull server to pick up the new configuration. diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/en-US/DscPullServerSetup.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/en-US/DscPullServerSetup.strings.psd1 new file mode 100644 index 0000000..33fb44d --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/DscPullServerSetup/en-US/DscPullServerSetup.strings.psd1 @@ -0,0 +1,15 @@ +# Localized resources for DscPullServerSetup + +ConvertFrom-StringData @' + StartDeploymentMessage = Start deployment of Pull Server. + EndDeploymentMessage = End deployment of Pull Server. + NoAdditionalModulesPackagedMessage = No additional modules are specified to be packaged. + SkippingModuleOverwriteMessage = Skipping module overwrite. Module with the name '{0}' already exists.`r`nPlease specify -Force to overwrite the module with the local version of the module located in '{1}' or list names of the modules in ModuleNameList parameter to be packaged from PowerShell module path instead and remove them from '{1}' folder. + CopyingModulesToPullServerMessage = Copying modules to Pull server module repository skipped because the machine is not a server sku or Pull server endpoint is not deployed. + CopyingConfigurationsToPullServerMessage = Copying configuration(s) to Pull server configuration repository skipped because the machine is not a server sku or Pull server endpoint is not deployed. + CopyingModulesAndChecksumsMessage = Copying modules and checksums to '{0}'. + CopyingMOFsAndChecksumsMessage = Copying MOFs and checksums to '{0}'. + PublishModuleMessage = Publishing module '{0}' version '{1}' to '{2}'. + InvalidWebConfigPathError = Web.Config of the pullserver does not exist on the default path '{0}'. Please provide the location of your pullserver web configuration using the parameter -PullServerWebConfig or an alternate path where you want to publish the pullserver modules to. This path should exist. + InvalidFileTypeError = Invalid file '{0}'. Only MOF files can be copied to the Pull Server configuration repository. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/en-US/xPSDesiredStateConfiguration.Common.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/en-US/xPSDesiredStateConfiguration.Common.strings.psd1 new file mode 100644 index 0000000..88f50c0 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/en-US/xPSDesiredStateConfiguration.Common.strings.psd1 @@ -0,0 +1,11 @@ +# Localized resources for xPSDesiredStateConfiguration.Common + +ConvertFrom-StringData @' + PropertyTypeInvalidForDesiredValues = Property 'DesiredValues' must be either a [System.Collections.Hashtable], [CimInstance] or [PSBoundParametersDictionary]. The type detected was {0}. + PropertyTypeInvalidForValuesToCheck = If 'DesiredValues' is a CimInstance, then property 'ValuesToCheck' must contain a value. + PropertyValidationError = Expected to find an array value for property {0} in the current values, but it was either not present or was null. This has caused the test method to return false. + PropertiesDoesNotMatch = Found an array for property {0} in the current values, but this array does not match the desired state. Details of the changes are below. + PropertyThatDoesNotMatch = {0} - {1} + ValueOfTypeDoesNotMatch = {0} value for property {1} does not match. Current state is '{2}' and desired state is '{3}'. + UnableToCompareProperty = Unable to compare property {0} as the type {1} is not handled by the Test-DscParameterState cmdlet. +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/xPSDesiredStateConfiguration.Common.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/xPSDesiredStateConfiguration.Common.psd1 new file mode 100644 index 0000000..0146666 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/xPSDesiredStateConfiguration.Common.psd1 @@ -0,0 +1,69 @@ +@{ + # Version number of this module. + ModuleVersion = '0.0.1' + + # ID used to uniquely identify this module + GUID = 'b4768e4d-0786-4e9c-9866-6f6e5efc4d63' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Functions used by the DSC resources in xPSDesiredStateConfiguration.' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @( + 'Test-IsNanoServer', + 'Test-DscParameterState', + 'New-InvalidArgumentException', + 'New-InvalidDataException', + 'New-InvalidOperationException', + 'New-ObjectNotFoundException', + 'New-InvalidResultException', + 'New-NotImplementedException', + 'Get-LocalizedData', + 'Set-DscMachineRebootRequired', + 'New-ResourceSetConfigurationScriptBlock' + ) + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @( + 'DscWebServiceDefaultAppPoolName' + ) + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '' + } # End of PSData hashtable + } # End of PrivateData hashtable +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/xPSDesiredStateConfiguration.Common.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/xPSDesiredStateConfiguration.Common.psm1 new file mode 100644 index 0000000..5dc4407 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Common/xPSDesiredStateConfiguration.Common.psm1 @@ -0,0 +1,828 @@ +<# + .SYNOPSIS + Tests if the current machine is a Nano server. +#> +function Test-IsNanoServer +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param () + + $isNanoServer = $false + + if (Test-CommandExists -Name 'Get-ComputerInfo') + { + $computerInfo = Get-ComputerInfo + + $computerIsServer = 'Server' -ieq $computerInfo.OsProductType + + if ($computerIsServer) + { + $isNanoServer = 'NanoServer' -ieq $computerInfo.OsServerLevel + } + } + + return $isNanoServer +} + +<# + .SYNOPSIS + Tests whether or not the command with the specified name exists. + .PARAMETER Name + The name of the command to test for. +#> +function Test-CommandExists +{ + [OutputType([System.Boolean])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Name + ) + + $command = Get-Command -Name $Name -ErrorAction 'SilentlyContinue' + return ($null -ne $command) +} + +<# + .SYNOPSIS + This method is used to compare current and desired values for any DSC resource. + + .PARAMETER CurrentValues + This is hash table of the current values that are applied to the resource. + + .PARAMETER DesiredValues + This is a PSBoundParametersDictionary of the desired values for the resource. + + .PARAMETER ValuesToCheck + This is a list of which properties in the desired values list should be checked. + If this is empty then all values in DesiredValues are checked. +#> +function Test-DscParameterState +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.Collections.Hashtable] + $CurrentValues, + + [Parameter(Mandatory = $true)] + [System.Object] + $DesiredValues, + + [Parameter()] + [System.Array] + $ValuesToCheck + ) + + $returnValue = $true + + if (($DesiredValues.GetType().Name -ne 'HashTable') ` + -and ($DesiredValues.GetType().Name -ne 'CimInstance') ` + -and ($DesiredValues.GetType().Name -ne 'PSBoundParametersDictionary')) + { + $errorMessage = $script:localizedData.PropertyTypeInvalidForDesiredValues -f $($DesiredValues.GetType().Name) + New-InvalidArgumentException -ArgumentName 'DesiredValues' -Message $errorMessage + } + + if (($DesiredValues.GetType().Name -eq 'CimInstance') -and ($null -eq $ValuesToCheck)) + { + $errorMessage = $script:localizedData.PropertyTypeInvalidForValuesToCheck + New-InvalidArgumentException -ArgumentName 'ValuesToCheck' -Message $errorMessage + } + + if (($null -eq $ValuesToCheck) -or ($ValuesToCheck.Count -lt 1)) + { + $keyList = $DesiredValues.Keys + } + else + { + $keyList = $ValuesToCheck + } + + $keyList | ForEach-Object -Process { + if (($_ -ne 'Verbose')) + { + if (($CurrentValues.ContainsKey($_) -eq $false) ` + -or ($CurrentValues.$_ -ne $DesiredValues.$_) ` + -or (($DesiredValues.GetType().Name -ne 'CimInstance' -and $DesiredValues.ContainsKey($_) -eq $true) -and ($null -ne $DesiredValues.$_ -and $DesiredValues.$_.GetType().IsArray))) + { + if ($DesiredValues.GetType().Name -eq 'HashTable' -or ` + $DesiredValues.GetType().Name -eq 'PSBoundParametersDictionary') + { + $checkDesiredValue = $DesiredValues.ContainsKey($_) + } + else + { + # If DesiredValue is a CimInstance. + $checkDesiredValue = $false + if (([System.Boolean]($DesiredValues.PSObject.Properties.Name -contains $_)) -eq $true) + { + if ($null -ne $DesiredValues.$_) + { + $checkDesiredValue = $true + } + } + } + + if ($checkDesiredValue) + { + $desiredType = $DesiredValues.$_.GetType() + $fieldName = $_ + if ($desiredType.IsArray -eq $true) + { + if (($CurrentValues.ContainsKey($fieldName) -eq $false) ` + -or ($null -eq $CurrentValues.$fieldName)) + { + Write-Verbose -Message ($script:localizedData.PropertyValidationError -f $fieldName) -Verbose + + $returnValue = $false + } + else + { + $arrayCompare = Compare-Object -ReferenceObject $CurrentValues.$fieldName ` + -DifferenceObject $DesiredValues.$fieldName + if ($null -ne $arrayCompare) + { + Write-Verbose -Message ($script:localizedData.PropertiesDoesNotMatch -f $fieldName) -Verbose + + $arrayCompare | ForEach-Object -Process { + Write-Verbose -Message ($script:localizedData.PropertyThatDoesNotMatch -f $_.InputObject, $_.SideIndicator) -Verbose + } + + $returnValue = $false + } + } + } + else + { + switch ($desiredType.Name) + { + 'String' + { + if (-not [System.String]::IsNullOrEmpty($CurrentValues.$fieldName) -or ` + -not [System.String]::IsNullOrEmpty($DesiredValues.$fieldName)) + { + Write-Verbose -Message ($script:localizedData.ValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $fieldName, $($CurrentValues.$fieldName), $($DesiredValues.$fieldName)) -Verbose + + $returnValue = $false + } + } + + 'Int32' + { + if (-not ($DesiredValues.$fieldName -eq 0) -or ` + -not ($null -eq $CurrentValues.$fieldName)) + { + Write-Verbose -Message ($script:localizedData.ValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $fieldName, $($CurrentValues.$fieldName), $($DesiredValues.$fieldName)) -Verbose + + $returnValue = $false + } + } + + { $_ -eq 'Int16' -or $_ -eq 'UInt16' -or $_ -eq 'Single' } + { + if (-not ($DesiredValues.$fieldName -eq 0) -or ` + -not ($null -eq $CurrentValues.$fieldName)) + { + Write-Verbose -Message ($script:localizedData.ValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $fieldName, $($CurrentValues.$fieldName), $($DesiredValues.$fieldName)) -Verbose + + $returnValue = $false + } + } + + 'Boolean' + { + if ($CurrentValues.$fieldName -ne $DesiredValues.$fieldName) + { + Write-Verbose -Message ($script:localizedData.ValueOfTypeDoesNotMatch ` + -f $desiredType.Name, $fieldName, $($CurrentValues.$fieldName), $($DesiredValues.$fieldName)) -Verbose + + $returnValue = $false + } + } + + default + { + Write-Warning -Message ($script:localizedData.UnableToCompareProperty ` + -f $fieldName, $desiredType.Name) + + $returnValue = $false + } + } + } + } + } + } + } + + return $returnValue +} + +<# + .SYNOPSIS + Retrieves the localized string data based on the machine's culture. + Falls back to en-US strings if the machine's culture is not supported. + + .PARAMETER ResourceName + The name of the resource as it appears before '.strings.psd1' of the localized string file. + For example: + For WindowsOptionalFeature: MSFT_WindowsOptionalFeature + For Service: MSFT_ServiceResource + For Registry: MSFT_RegistryResource + For Helper: SqlServerDscHelper + + .PARAMETER ScriptRoot + Optional. The root path where to expect to find the culture folder. This is only needed + for localization in helper modules. This should not normally be used for resources. + + .NOTES + To be able to use localization in the helper function, this function must + be first in the file, before Get-LocalizedData is used by itself to load + localized data for this helper module (see directly after this function). +#> +function Get-LocalizedData +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ResourceName, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $ScriptRoot + ) + + if (-not $ScriptRoot) + { + $dscResourcesFolder = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'DSCResources' + $resourceDirectory = Join-Path -Path $dscResourcesFolder -ChildPath $ResourceName + } + else + { + $resourceDirectory = $ScriptRoot + } + + $localizedStringFileLocation = Join-Path -Path $resourceDirectory -ChildPath $PSUICulture + + if (-not (Test-Path -Path $localizedStringFileLocation)) + { + # Fallback to en-US + $localizedStringFileLocation = Join-Path -Path $resourceDirectory -ChildPath 'en-US' + } + + Import-LocalizedData ` + -BindingVariable 'localizedData' ` + -FileName "$ResourceName.strings.psd1" ` + -BaseDirectory $localizedStringFileLocation + + return $localizedData +} + +<# + .SYNOPSIS + Creates and throws an invalid argument exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ArgumentName + The name of the invalid argument that is causing this error to be thrown. +#> +function New-InvalidArgumentException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ArgumentName + ) + + $argumentException = New-Object -TypeName 'ArgumentException' ` + -ArgumentList @($Message, $ArgumentName) + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @($argumentException, $ArgumentName, 'InvalidArgument', $null) + } + + $errorRecord = New-Object @newObjectParameters + + throw $errorRecord +} + +<# + .SYNOPSIS + Creates and throws an invalid data exception. + + .PARAMETER ErrorId + The error Id to assign to the exception. + + .PARAMETER ErrorMessage + The error message to assign to the exception. +#> +function New-InvalidDataException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String] + $ErrorId, + + [Parameter(Mandatory = $true)] + [System.String] + $ErrorMessage + ) + + $errorCategory = [System.Management.Automation.ErrorCategory]::InvalidData + $exception = New-Object ` + -TypeName System.InvalidOperationException ` + -ArgumentList $ErrorMessage + $errorRecord = New-Object ` + -TypeName System.Management.Automation.ErrorRecord ` + -ArgumentList $exception, $ErrorId, $errorCategory, $null + + throw $errorRecord +} + +<# + .SYNOPSIS + Creates and throws an invalid operation exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-InvalidOperationException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'InvalidOperationException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'InvalidOperation', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Creates and throws an object not found exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-ObjectNotFoundException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'ObjectNotFound', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Creates and throws an invalid result exception. + + .PARAMETER Message + The message explaining why this error is being thrown. + + .PARAMETER ErrorRecord + The error record containing the exception that is causing this terminating error. +#> +function New-InvalidResultException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message) + } + else + { + $exception = New-Object -TypeName 'System.Exception' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $exception.ToString(), + 'MachineStateIncorrect', + 'InvalidResult', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +function New-NotImplementedException +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Message, + + [Parameter()] + [ValidateNotNull()] + [System.Management.Automation.ErrorRecord] + $ErrorRecord + ) + + if ($null -eq $ErrorRecord) + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message) + } + else + { + $invalidOperationException = New-Object -TypeName 'NotImplementedException' ` + -ArgumentList @($Message, $ErrorRecord.Exception) + } + + $newObjectParameters = @{ + TypeName = 'System.Management.Automation.ErrorRecord' + ArgumentList = @( + $invalidOperationException.ToString(), + 'MachineStateIncorrect', + 'NotImplemented', + $null + ) + } + + $errorRecordToThrow = New-Object @newObjectParameters + + throw $errorRecordToThrow +} + +<# + .SYNOPSIS + Sets the Global DSCMachineStatus variable to a value of 1. +#> +function Set-DscMachineRebootRequired +{ + # Suppressing this rule because $global:DSCMachineStatus is used to trigger a reboot. + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '')] + <# + Suppressing this rule because $global:DSCMachineStatus is only set, + never used (by design of Desired State Configuration). + #> + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '')] + [CmdletBinding()] + param + ( + ) + + $global:DSCMachineStatus = 1 +} + +<# + .SYNOPSIS + Builds a string of the common parameters shared across all resources in a set. + + .PARAMETER KeyParameterName + The name of the key parameter for the resource. + + .PARAMETER Parameters + The hashtable of all parameters to the resource set (PSBoundParameters). + + .EXAMPLE + $parameters = @{ + KeyParameter = @( 'MyKeyParameter1', 'MyKeyParameter2' ) + CommonParameter1 = 'CommonValue1' + CommonParameter2 = 2 + } + + New-ResourceSetCommonParameterString -KeyParameterName 'KeyParameter' -Parameters $parameters + + OUTPUT (as string): + CommonParameter1 = "CommonValue1"`r`nCommonParameter2 = $CommonParameter2 +#> +function New-ResourceSetCommonParameterString +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $KeyParameterName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Collections.Hashtable] + $Parameters + ) + + $stringBuilder = New-Object -TypeName 'System.Text.StringBuilder' + + foreach ($parameterName in $Parameters.Keys) + { + # All composite resources have an extra parameter 'InstanceName' + if ($parameterName -ine $KeyParameterName -and $parameterName -ine 'InstanceName') + { + $parameterValue = $Parameters[$parameterName] + + if ($null -ne $parameterValue) + { + if ($parameterValue -is [System.String]) + { + $null = $stringBuilder.AppendFormat('{0} = "{1}"', $parameterName, $parameterValue) + } + else + { + $null = $stringBuilder.Append($parameterName + ' = $' + $parameterName) + } + + $null = $stringBuilder.AppendLine() + } + } + } + + return $stringBuilder.ToString() +} + +<# + .SYNOPSIS + Creates a string representing a configuration script for a set of resources. + + .PARAMETER ResourceName + The name of the resource to create a set of. + + .PARAMETER ModuleName + The name of the module to import the resource from. + + .PARAMETER KeyParameterName + The name of the key parameter that will differentiate each resource. + + .PARAMETER KeyParameterValues + An array of the values of the key parameter that will differentiate each resource. + + .PARAMETER CommonParameterString + A string representing the common parameters for each resource. + Can be retrieved from New-ResourceSetCommonParameterString. + + .EXAMPLE + New-ResourceSetConfigurationString ` + -ResourceName 'xWindowsFeature' ` + -ModuleName 'xPSDesiredStateConfiguration' ` + -KeyParameterName 'Name' ` + -KeyParameterValues @( 'Telnet-Client', 'Web-Server' ) ` + -CommonParameterString 'Ensure = "Present"`r`nIncludeAllSubFeature = $true' + + OUTPUT (as a String): + Import-Module -Name xWindowsFeature -ModuleName xPSDesiredStateConfiguration + + xWindowsFeature Resource0 + { + Name = "Telnet-Client" + Ensure = "Present" + IncludeAllSubFeature = $true + } + + xWindowsFeature Resource1 + { + Name = "Web-Server" + Ensure = "Present" + IncludeAllSubFeature = $true + } +#> +function New-ResourceSetConfigurationString +{ + [OutputType([System.String])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ResourceName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ModuleName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $KeyParameterName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String[]] + $KeyParameterValues, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $CommonParameterString + ) + + $stringBuilder = New-Object -TypeName 'System.Text.StringBuilder' + + $null = $stringBuilder.AppendFormat('Import-DscResource -Name {0} -ModuleName {1}', $ResourceName, $ModuleName) + $null = $stringBuilder.AppendLine() + + $resourceCount = 0 + foreach ($keyParameterValue in $KeyParameterValues) + { + $null = $stringBuilder.AppendFormat('{0} Resource{1}', $ResourceName, $resourceCount) + $null = $stringBuilder.AppendLine() + $null = $stringBuilder.AppendLine('{') + $null = $stringBuilder.AppendFormat($KeyParameterName + ' = "{0}"', $keyParameterValue) + $null = $stringBuilder.AppendLine() + $null = $stringBuilder.Append($CommonParameterString) + $null = $stringBuilder.AppendLine('}') + + $resourceCount++ + } + + return $stringBuilder.ToString() +} + +<# + .SYNOPSIS + Creates a configuration script block for a set of resources. + + .PARAMETER ResourceName + The name of the resource to create a set of. + + .PARAMETER ModuleName + The name of the module to import the resource from. + + .PARAMETER KeyParameterName + The name of the key parameter that will differentiate each resource. + + .PARAMETER Parameters + The hashtable of all parameters to the resource set (PSBoundParameters). + + .EXAMPLE + # From the xGroupSet composite resource + + $newResourceSetConfigurationParams = @{ + ResourceName = 'xGroup' + ModuleName = 'xPSDesiredStateConfiguration' + KeyParameterName = 'GroupName' + CommonParameterNames = @( 'Ensure', 'MembersToInclude', 'MembersToExclude', 'Credential' ) + Parameters = $PSBoundParameters + } + + $configurationScriptBlock = New-ResourceSetConfigurationScriptBlock @newResourceSetConfigurationParams + + .NOTES + Only allows one key parameter to be defined for each node. + For resources with multiple key parameters, only one key can be different for each resource. + See xProcessSet for an example of a resource set with two key parameters. +#> +function New-ResourceSetConfigurationScriptBlock +{ + [OutputType([System.Management.Automation.ScriptBlock])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ResourceName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $ModuleName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $KeyParameterName, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.Collections.Hashtable] + $Parameters + ) + + $commonParameterString = New-ResourceSetCommonParameterString -KeyParameterName $KeyParameterName -Parameters $Parameters + + $newResourceSetConfigurationStringParams = @{ + ResourceName = $ResourceName + ModuleName = $ModuleName + KeyParameterName = $KeyParameterName + KeyParameterValues = $Parameters[$KeyParameterName] + CommonParameterString = $commonParameterString + } + + $resourceString = New-ResourceSetConfigurationString @newResourceSetConfigurationStringParams + + return [System.Management.Automation.ScriptBlock]::Create($resourceString) +} + +$script:localizedData = Get-LocalizedData -ResourceName 'xPSDesiredStateConfiguration.Common' -ScriptRoot $PSScriptRoot diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/en-US/xPSDesiredStateConfiguration.Firewall.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/en-US/xPSDesiredStateConfiguration.Firewall.strings.psd1 new file mode 100644 index 0000000..58c9d5a --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/en-US/xPSDesiredStateConfiguration.Firewall.strings.psd1 @@ -0,0 +1,4 @@ +# Localized resources for xPSDesiredStateConfiguration.Firewall + +ConvertFrom-StringData @' +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/xPSDesiredStateConfiguration.Firewall.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/xPSDesiredStateConfiguration.Firewall.psd1 new file mode 100644 index 0000000..d04f3d1 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/xPSDesiredStateConfiguration.Firewall.psd1 @@ -0,0 +1,59 @@ +@{ + # Version number of this module. + ModuleVersion = '0.0.1' + + # ID used to uniquely identify this module + GUID = 'e400c89a-064f-4b3c-8197-6a7be06d55f3' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Functions used by the DSC Web Service resource to configure firewall settings.' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @( + 'Add-PullServerFirewallConfiguration', + 'Remote-PullServerFirewallConfiguration', + 'Test-PullServerFirewallConfiguration' + ) + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '' + } # End of PSData hashtable + } # End of PrivateData hashtable +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/xPSDesiredStateConfiguration.Firewall.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/xPSDesiredStateConfiguration.Firewall.psm1 new file mode 100644 index 0000000..0dbe5f1 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Firewall/xPSDesiredStateConfiguration.Firewall.psm1 @@ -0,0 +1,106 @@ +$modulePath = Split-Path -Path $PSScriptRoot -Parent + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'xPSDesiredStateConfiguration.Firewall' -ScriptRoot $PSScriptRoot + +New-Variable -Name FireWallRuleDisplayName -Value 'DSCPullServer_IIS_Port' -Option ReadOnly -Scope Script -Force +New-Variable -Name netsh -Value "$env:windir\system32\netsh.exe" -Option ReadOnly -Scope Script -Force + +<# + .SYNOPSIS + Create a firewall exception so that DSC clients are able to access the configured Pull Server + .PARAMETER Port + The TCP port used to create the firewall exception +#> +function Add-PullServerFirewallConfiguration +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateRange(1, 65535)] + [System.UInt32] + $Port + ) + + Write-Verbose -Message 'Disable Inbound Firewall Notification' + $null = & $script:netsh advfirewall set currentprofile settings inboundusernotification disable + + $ruleName = $FireWallRuleDisplayName + + # Remove all existing rules with that displayName + $null = & $script:netsh advfirewall firewall delete rule name=$ruleName protocol=tcp localport=$Port + + Write-Verbose -Message "Add Firewall Rule for port $Port" + $null = & $script:netsh advfirewall firewall add rule name=$ruleName dir=in action=allow protocol=TCP localport=$Port +} + +<# + .SYNOPSIS + Delete the Pull Server firewall exception + .PARAMETER Port + The TCP port for which the firewall exception should be deleted +#> +function Remove-PullServerFirewallConfiguration +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateRange(1, 65535)] + [System.UInt32] + $Port + ) + + if (Test-PullServerFirewallConfiguration -Port $Port) + { + # remove all existing rules with that displayName + Write-Verbose -Message "Delete Firewall Rule for port $Port" + $ruleName = $FireWallRuleDisplayName + + # backwards compatibility with old code + if (Get-Command -Name Get-NetFirewallRule -CommandType Cmdlet -ErrorAction:SilentlyContinue) + { + # Remove all rules with that name + Get-NetFirewallRule -DisplayName $ruleName | Remove-NetFirewallRule + } + else + { + $null = & $script:netsh advfirewall firewall delete rule name=$ruleName protocol=tcp localport=$Port + } + } + else + { + Write-Verbose -Message "No DSC PullServer firewall rule found with port $Port. No cleanup required" + } +} + +<# + .SYNOPSIS + Tests if a Pull Server firewall exception exists for a specific port + .PARAMETER Port + The TCP port for which the firewall exception should be tested +#> +function Test-PullServerFirewallConfiguration +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [ValidateRange(1, 65535)] + [System.UInt32] + $Port + ) + + # Remove all existing rules with that displayName + Write-Verbose -Message "Testing Firewall Rule for port $Port" + $ruleName = $FireWallRuleDisplayName + $result = & $script:netsh advfirewall firewall show rule name=$ruleName | Select-String -Pattern "LocalPort:\s*$Port" + return -not [string]::IsNullOrWhiteSpace($result) +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/en-US/xPSDesiredStateConfiguration.PSWSIIS.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/en-US/xPSDesiredStateConfiguration.PSWSIIS.strings.psd1 new file mode 100644 index 0000000..ae88e01 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/en-US/xPSDesiredStateConfiguration.PSWSIIS.strings.psd1 @@ -0,0 +1,4 @@ +# Localized resources for xPSDesiredStateConfiguration.PSWSIIS + +ConvertFrom-StringData @' +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psd1 new file mode 100644 index 0000000..43c362a --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psd1 @@ -0,0 +1,63 @@ +@{ + # Version number of this module. + ModuleVersion = '0.0.1' + + # ID used to uniquely identify this module + GUID = '63b5d3ab-7f33-4647-970b-cbab5532116f' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'This module contains a utility to perform PSWS IIS Endpoint setup.' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @( + 'New-ResourceSetConfigurationScriptBlock', + 'New-PSWSEndpoint', + 'Set-AppSettingsInWebconfig', + 'Set-BindingRedirectSettingInWebConfig', + 'Remove-PSWSEndpoint' + ) + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @( + 'DscWebServiceDefaultAppPoolName' + ) + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '' + } # End of PSData hashtable + } # End of PrivateData hashtable +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psm1 new file mode 100644 index 0000000..6a7c47e --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.PSWSIIS/xPSDesiredStateConfiguration.PSWSIIS.psm1 @@ -0,0 +1,1022 @@ +$modulePath = Split-Path -Path $PSScriptRoot -Parent + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'xPSDesiredStateConfiguration.PSWSIIS' -ScriptRoot $PSScriptRoot + +New-Variable -Name DscWebServiceDefaultAppPoolName -Value 'PSWS' -Option ReadOnly -Force -Scope Script + +<# + .SYNOPSIS + Validate supplied configuration to setup the PSWS Endpoint Function + checks for the existence of PSWS Schema files, IIS config Also validate + presence of IIS on the target machine +#> +function Initialize-Endpoint +{ + [CmdletBinding()] + param + ( + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $appPool, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $site, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $path, + + [Parameter()] + [ValidateScript({Test-Path -Path $_})] + [System.String] + $cfgfile, + + [Parameter()] + [System.Int32] + $port, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $app, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $applicationPoolIdentityType, + + [Parameter()] + [ValidateScript({Test-Path -Path $_})] + [System.String] + $svc, + + [Parameter()] + [ValidateScript({Test-Path -Path $_})] + [System.String] + $mof, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $dispatch, + + [Parameter()] + [ValidateScript({Test-Path -Path $_})] + [System.String] + $asax, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $dependentBinaries, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $language, + + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $dependentMUIFiles, + + [Parameter()] + [System.String[]] + $psFiles, + + [Parameter()] + [System.Boolean] + $removeSiteFiles = $false, + + [Parameter()] + [System.String] + $certificateThumbPrint, + + [Parameter()] + [System.Boolean] + $enable32BitAppOnWin64 + ) + + if ($certificateThumbPrint -ne 'AllowUnencryptedTraffic') + { + Write-Verbose -Message 'Verify that the certificate with the provided thumbprint exists in CERT:\LocalMachine\MY\' + + $certificate = Get-ChildItem -Path CERT:\LocalMachine\MY\ | Where-Object -FilterScript { + $_.Thumbprint -eq $certificateThumbPrint + } + + if (!$Certificate) + { + throw "ERROR: Certificate with thumbprint $certificateThumbPrint does not exist in CERT:\LocalMachine\MY\" + } + } + + Test-IISInstall + + # First remove the site so that the binding count on the application pool is reduced + Update-Site -siteName $site -siteAction Remove + + Remove-AppPool -appPool $appPool + + # Check for existing binding, there should be no binding with the same port + $allWebBindingsOnPort = Get-WebBinding | Where-Object -FilterScript { + $_.BindingInformation -eq "*:$($port):" + } + + if ($allWebBindingsOnPort.Count -gt 0) + { + throw "ERROR: Port $port is already used, please review existing sites and change the port to be used." + } + + if ($removeSiteFiles) + { + if (Test-Path -Path $path) + { + Remove-Item -Path $path -Recurse -Force + } + } + + Copy-PSWSConfigurationToIISEndpointFolder -path $path ` + -cfgfile $cfgfile ` + -svc $svc ` + -mof $mof ` + -dispatch $dispatch ` + -asax $asax ` + -dependentBinaries $dependentBinaries ` + -language $language ` + -dependentMUIFiles $dependentMUIFiles ` + -psFiles $psFiles + + New-IISWebSite -site $site ` + -path $path ` + -port $port ` + -app $app ` + -apppool $appPool ` + -applicationPoolIdentityType $applicationPoolIdentityType ` + -certificateThumbPrint $certificateThumbPrint ` + -enable32BitAppOnWin64 $enable32BitAppOnWin64 +} + +<# + .SYNOPSIS + Validate if IIS and all required dependencies are installed on the + target machine +#> +function Test-IISInstall +{ + [CmdletBinding()] + param () + + Write-Verbose -Message 'Checking IIS requirements' + $iisVersion = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\InetStp -ErrorAction silentlycontinue).MajorVersion + + if ($iisVersion -lt 7) + { + throw "ERROR: IIS Version detected is $iisVersion , must be running higher than 7.0" + } + + $wsRegKey = (Get-ItemProperty hklm:\SYSTEM\CurrentControlSet\Services\W3SVC -ErrorAction silentlycontinue).ImagePath + if ($null -eq $wsRegKey) + { + throw 'ERROR: Cannot retrive W3SVC key. IIS Web Services may not be installed' + } + + if ((Get-Service w3svc).Status -ne 'running') + { + throw 'ERROR: service W3SVC is not running' + } +} + +<# + .SYNOPSIS + Verify if a given IIS Site exists +#> +function Test-ForIISSite +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [System.String] + $siteName + ) + + if (Get-Website -Name $siteName) + { + return $true + } + + return $false +} + +<# + .SYNOPSIS + Perform an action (such as stop, start, delete) for a given IIS Site +#> +function Update-Site +{ + param + ( + [Parameter(ParameterSetName = 'SiteName', Mandatory = $true, Position = 0)] + [ValidateNotNullOrEmpty()] + [System.String] + $siteName, + + [Parameter(ParameterSetName = 'Site', Mandatory = $true, Position = 0)] + [System.Object] + $site, + + [Parameter(ParameterSetName = 'SiteName', Mandatory = $true, Position = 1)] + [Parameter(ParameterSetName = 'Site', Mandatory = $true, Position = 1)] + [System.String] + [ValidateSet('Start', 'Stop', 'Remove')] + $siteAction + ) + + if ('SiteName' -eq $PSCmdlet.ParameterSetName) + { + $site = Get-Website -Name $siteName + } + + if ($site) + { + switch ($siteAction) + { + 'Start' + { + Write-Verbose -Message "Starting IIS Website [$($site.name)]" + Start-Website -Name $site.name + } + + 'Stop' + { + if ('Started' -eq $site.state) + { + Write-Verbose -Message "Stopping WebSite $($site.name)" + $website = Stop-Website -Name $site.name -Passthru + + if ('Started' -eq $website.state) + { + throw "Unable to stop WebSite $($site.name)" + } + + <# + There may be running requests, wait a little + I had an issue where the files were still in use + when I tried to delete them + #> + Write-Verbose -Message 'Waiting for IIS to stop website' + Start-Sleep -Milliseconds 1000 + } + else + { + Write-Verbose -Message "IIS Website [$($site.name)] already stopped" + } + } + + 'Remove' + { + Update-Site -site $site -siteAction Stop + Write-Verbose -Message "Removing IIS Website [$($site.name)]" + Remove-Website -Name $site.name + } + } + } + else + { + Write-Verbose -Message "IIS Website [$siteName] not found" + } +} + +<# + .SYNOPSIS + Returns the list of bound sites and applications for a given IIS Application pool + + .PARAMETER appPool + The application pool name +#> +function Get-AppPoolBinding +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $AppPool + ) + + if (Test-Path -Path "IIS:\AppPools\$AppPool") + { + $sites = Get-WebConfigurationProperty ` + -Filter "/system.applicationHost/sites/site/application[@applicationPool=`'$AppPool`'and @path='/']/parent::*" ` + -PSPath 'machine/webroot/apphost' ` + -Name name + $apps = Get-WebConfigurationProperty ` + -Filter "/system.applicationHost/sites/site/application[@applicationPool=`'$AppPool`'and @path!='/']" ` + -PSPath 'machine/webroot/apphost' ` + -Name path + $sites, $apps | ForEach-Object { + $_.Value + } + } +} + +<# + .SYNOPSIS + Delete the given IIS Application Pool. This is required to cleanup any + existing conflicting apppools before setting up the endpoint. +#> +function Remove-AppPool +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $AppPool + ) + + if ($DscWebServiceDefaultAppPoolName -eq $AppPool) + { + # Without this tests we may get a breaking error here, despite SilentlyContinue + if (Test-Path -Path "IIS:\AppPools\$AppPool") + { + $bindingCount = (Get-AppPoolBinding -AppPool $AppPool | Measure-Object).Count + + if (0 -ge $bindingCount) + { + Remove-WebAppPool -Name $AppPool -ErrorAction SilentlyContinue + } + else + { + Write-Verbose -Message "Application pool [$AppPool] can't be deleted because it's still bound to a site or application" + } + } + } + else + { + Write-Verbose -Message "ApplicationPool can't be deleted because the name is different from built-in name [$DscWebServiceDefaultAppPoolName]." + } +} + +<# + .SYNOPSIS + Generate an IIS Site Id while setting up the endpoint. The Site Id will + be the max available in IIS config + 1. +#> +function New-SiteID +{ + [CmdletBinding()] + param () + + return ((Get-Website | Foreach-Object -Process { $_.Id } | Measure-Object -Maximum).Maximum + 1) +} + +<# + .SYNOPSIS + Copies the supplied PSWS config files to the IIS endpoint in inetpub +#> +function Copy-PSWSConfigurationToIISEndpointFolder +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String] + $path, + + [Parameter()] + [ValidateScript({Test-Path -Path $_})] + [System.String] + $cfgfile, + + [Parameter()] + [ValidateScript({Test-Path -Path $_})] + [System.String] + $svc, + + [Parameter()] + [ValidateScript({Test-Path -Path $_})] + [System.String] + $mof, + + [Parameter()] + [System.String] + $dispatch, + + [Parameter()] + [ValidateScript({Test-Path -Path $_})] + [System.String] + $asax, + + [Parameter()] + [System.String[]] + $dependentBinaries, + + [Parameter()] + [System.String] + $language, + + [Parameter()] + [System.String[]] + $dependentMUIFiles, + + [Parameter()] + [System.String[]] + $psFiles + ) + + if (!(Test-Path -Path $path)) + { + $null = New-Item -ItemType container -Path $path + } + + foreach ($dependentBinary in $dependentBinaries) + { + if (!(Test-Path -Path $dependentBinary)) + { + throw "ERROR: $dependentBinary does not exist" + } + } + + Write-Verbose -Message 'Create the bin folder for deploying custom dependent binaries required by the endpoint' + $binFolderPath = Join-Path -Path $path -ChildPath 'bin' + $null = New-Item -Path $binFolderPath -ItemType 'directory' -Force + Copy-Item -Path $dependentBinaries -Destination $binFolderPath -Force + + foreach ($psFile in $psFiles) + { + if (!(Test-Path -Path $psFile)) + { + throw "ERROR: $psFile does not exist" + } + + Copy-Item -Path $psFile -Destination $path -Force + } + + Copy-Item -Path $cfgfile (Join-Path -Path $path -ChildPath 'web.config') -Force + Copy-Item -Path $svc -Destination $path -Force + Copy-Item -Path $mof -Destination $path -Force + + if ($dispatch) + { + Copy-Item -Path $dispatch -Destination $path -Force + } + + if ($asax) + { + Copy-Item -Path $asax -Destination $path -Force + } +} + +<# + .SYNOPSIS + Setup IIS Apppool, Site and Application +#> +function New-IISWebSite +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $site, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $path, + + [Parameter(Mandatory = $true)] + [System.Int32] + $port, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $app, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $appPool, + + [Parameter()] + [System.String] + $applicationPoolIdentityType, + + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $certificateThumbPrint, + + [Parameter()] + [System.Boolean] + $enable32BitAppOnWin64 + ) + + $siteID = New-SiteID + + if (Test-Path IIS:\AppPools\$appPool) + { + Write-Verbose -Message "Application Pool [$appPool] already exists" + } + else + { + Write-Verbose -Message "Adding App Pool [$appPool]" + $null = New-WebAppPool -Name $appPool + + Write-Verbose -Message 'Set App Pool Properties' + $appPoolIdentity = 4 + + if ($applicationPoolIdentityType) + { + # LocalSystem = 0, LocalService = 1, NetworkService = 2, SpecificUser = 3, ApplicationPoolIdentity = 4 + switch ($applicationPoolIdentityType) + { + 'LocalSystem' + { + $appPoolIdentity = 0 + } + + 'LocalService' + { + $appPoolIdentity = 1 + } + + 'NetworkService' + { + $appPoolIdentity = 2 + } + + 'ApplicationPoolIdentity' + { + $appPoolIdentity = 4 + } + + default { + throw "Invalid value [$applicationPoolIdentityType] for parameter -applicationPoolIdentityType" + } + } + } + + $appPoolItem = Get-Item -Path IIS:\AppPools\$appPool + $appPoolItem.managedRuntimeVersion = 'v4.0' + $appPoolItem.enable32BitAppOnWin64 = $enable32BitAppOnWin64 + $appPoolItem.processModel.identityType = $appPoolIdentity + $appPoolItem | Set-Item + + } + + Write-Verbose -Message 'Add and Set Site Properties' + + if ($certificateThumbPrint -eq 'AllowUnencryptedTraffic') + { + $null = New-WebSite -Name $site -Id $siteID -Port $port -IPAddress "*" -PhysicalPath $path -ApplicationPool $appPool + } + else + { + $null = New-WebSite -Name $site -Id $siteID -Port $port -IPAddress "*" -PhysicalPath $path -ApplicationPool $appPool -Ssl + + # Remove existing binding for $port + Remove-Item IIS:\SSLBindings\0.0.0.0!$port -ErrorAction Ignore + + # Create a new binding using the supplied certificate + $null = Get-Item CERT:\LocalMachine\MY\$certificateThumbPrint | New-Item IIS:\SSLBindings\0.0.0.0!$port + } + + Update-Site -siteName $site -siteAction Start +} + +<# + .SYNOPSIS + Enable & Clear PSWS Operational/Analytic/Debug ETW Channels. +#> +function Enable-PSWSETW +{ + # Disable Analytic Log + $null = & $script:wevtutil sl Microsoft-Windows-ManagementOdataService/Analytic /e:false /q + + # Disable Debug Log + $null = & $script:wevtutil sl Microsoft-Windows-ManagementOdataService/Debug /e:false /q + + # Clear Operational Log + $null = & $script:wevtutil cl Microsoft-Windows-ManagementOdataService/Operational + + # Enable/Clear Analytic Log + $null = & $script:wevtutil sl Microsoft-Windows-ManagementOdataService/Analytic /e:true /q + + # Enable/Clear Debug Log + $null = & $script:wevtutil sl Microsoft-Windows-ManagementOdataService/Debug /e:true /q +} + +<# + .SYNOPSIS + Create PowerShell WebServices IIS Endpoint + + .DESCRIPTION + Creates a PSWS IIS Endpoint by consuming PSWS Schema and related + dependent files + + .EXAMPLE + New PSWS Endpoint [@ http://Server:39689/PSWS_Win32Process] by + consuming PSWS Schema Files and any dependent scripts/binaries: + + New-PSWSEndpoint + -site Win32Process + -path $env:SystemDrive\inetpub\PSWS_Win32Process + -cfgfile Win32Process.config + -port 39689 + -app Win32Process + -svc PSWS.svc + -mof Win32Process.mof + -dispatch Win32Process.xml + -dependentBinaries ConfigureProcess.ps1, Rbac.dll + -psFiles Win32Process.psm1 +#> +function New-PSWSEndpoint +{ + [CmdletBinding()] + param + ( + # Unique Name of the IIS Site + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $site = 'PSWS', + + # Physical path for the IIS Endpoint on the machine (under inetpub) + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $path = "$env:SystemDrive\inetpub\PSWS", + + # Web.config file + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $cfgfile = 'web.config', + + # Port # for the IIS Endpoint + [Parameter()] + [System.Int32] + $port = 8080, + + # IIS Application Name for the Site + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $app = 'PSWS', + + # IIS Application Name for the Site + [Parameter()] + [System.String] + $appPool, + + # IIS App Pool Identity Type - must be one of LocalService, LocalSystem, NetworkService, ApplicationPoolIdentity + [Parameter()] + [ValidateSet('LocalService', 'LocalSystem', 'NetworkService', 'ApplicationPoolIdentity')] + [System.String] + $applicationPoolIdentityType, + + # WCF Service SVC file + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $svc = 'PSWS.svc', + + # PSWS Specific MOF Schema File + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $mof, + + # PSWS Specific Dispatch Mapping File [Optional] + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $dispatch, + + # Global.asax file [Optional] + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $asax, + + # Any dependent binaries that need to be deployed to the IIS endpoint, in the bin folder + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $dependentBinaries, + + # MUI Language [Optional] + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $language, + + # Any dependent binaries that need to be deployed to the IIS endpoint, in the bin\mui folder [Optional] + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String[]] + $dependentMUIFiles, + + # Any dependent PowerShell Scipts/Modules that need to be deployed to the IIS endpoint application root + [Parameter()] + [System.String[]] + $psFiles, + + # True to remove all files for the site at first, false otherwise + [Parameter()] + [System.Boolean] + $removeSiteFiles = $false, + + # Enable and Clear PSWS ETW + [Parameter()] + [System.Management.Automation.SwitchParameter] + $EnablePSWSETW, + + # Thumbprint of the Certificate in CERT:\LocalMachine\MY\ for Pull Server + [Parameter()] + [System.String] + $certificateThumbPrint = 'AllowUnencryptedTraffic', + + # When this property is set to true, Pull Server will run on a 32 bit process on a 64 bit machine + [Parameter()] + [System.Boolean] + $Enable32BitAppOnWin64 = $false + ) + + if (-not $appPool) + { + $appPool = $DscWebServiceDefaultAppPoolName + } + + $script:wevtutil = "$env:windir\system32\Wevtutil.exe" + + $svcName = Split-Path $svc -Leaf + $protocol = 'https:' + + if ($certificateThumbPrint -eq 'AllowUnencryptedTraffic') + { + $protocol = 'http:' + } + + # Get Machine Name + $cimInstance = Get-CimInstance -ClassName Win32_ComputerSystem -Verbose:$false + + Write-Verbose -Message "Setting up endpoint at - $protocol//$($cimInstance.Name):$port/$svcName" + Initialize-Endpoint ` + -appPool $appPool ` + -site $site ` + -path $path ` + -cfgfile $cfgfile ` + -port $port ` + -app $app ` + -applicationPoolIdentityType $applicationPoolIdentityType ` + -svc $svc ` + -mof $mof ` + -dispatch $dispatch ` + -asax $asax ` + -dependentBinaries $dependentBinaries ` + -language $language ` + -dependentMUIFiles $dependentMUIFiles ` + -psFiles $psFiles ` + -removeSiteFiles $removeSiteFiles ` + -certificateThumbPrint $certificateThumbPrint ` + -enable32BitAppOnWin64 $Enable32BitAppOnWin64 + + if ($EnablePSWSETW) + { + Enable-PSWSETW + } +} + +<# + .SYNOPSIS + Removes a DSC WebServices IIS Endpoint + + .DESCRIPTION + Removes a PSWS IIS Endpoint + + .EXAMPLE + Remove the endpoint with the specified name: + + Remove-PSWSEndpoint -siteName PSDSCPullServer +#> +function Remove-PSWSEndpoint +{ + [CmdletBinding()] + param + ( + # Unique Name of the IIS Site + [Parameter()] + [ValidateNotNullOrEmpty()] + [System.String] + $siteName + ) + + # Get the site to remove + $site = Get-Website -Name $siteName + + if ($site) + { + # And the pool it is using + $pool = $site.applicationPool + # Get the path so we can delete the files + $filePath = $site.PhysicalPath + + # Remove the actual site. + Update-Site -site $site -siteAction Remove + + # Remove the files for the site + if (Test-Path -Path $filePath) + { + Get-ChildItem -Path $filePath -Recurse | Remove-Item -Recurse -Force + Remove-Item -Path $filePath -Force + } + + Remove-AppPool -appPool $pool + } + else + { + Write-Verbose -Message "Website with name [$siteName] does not exist" + } +} + +<# + .SYNOPSIS + Set the option into the web.config for an endpoint + + .DESCRIPTION + Set the options into the web.config for an endpoint allowing + customization. +#> +function Set-AppSettingsInWebconfig +{ + [CmdletBinding()] + param + ( + # Physical path for the IIS Endpoint on the machine (possibly under inetpub) + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Path, + + # Key to add/update + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Key, + + # Value + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $Value + ) + + $webconfig = Join-Path -Path $Path -ChildPath 'web.config' + [System.Boolean] $Found = $false + + if (Test-Path -Path $webconfig) + { + $xml = [System.Xml.XmlDocument] (Get-Content -Path $webconfig) + $root = $xml.get_DocumentElement() + + foreach ($item in $root.appSettings.add) + { + if ($item.key -eq $Key) + { + $item.value = $Value; + $Found = $true; + } + } + + if (-not $Found) + { + $newElement = $xml.CreateElement('add') + $nameAtt1 = $xml.CreateAttribute('key') + $nameAtt1.psbase.value = $Key; + $null = $newElement.SetAttributeNode($nameAtt1) + + $nameAtt2 = $xml.CreateAttribute('value') + $nameAtt2.psbase.value = $Value; + $null = $newElement.SetAttributeNode($nameAtt2) + + $null = $xml.configuration['appSettings'].AppendChild($newElement) + } + } + + $xml.Save($webconfig) +} + +<# + .SYNOPSIS + Set the binding redirect setting in the web.config to redirect 10.0.0.0 + version of microsoft.isam.esent.interop to 6.3.0.0. + + .DESCRIPTION + This function creates the following section in the web.config: + <runtime> + <assemblyBinding xmlns='urn:schemas-microsoft-com:asm.v1'> + <dependentAssembly> + <assemblyIdentity name='microsoft.isam.esent.interop' publicKeyToken='31bf3856ad364e35' /> + <bindingRedirect oldVersion='10.0.0.0' newVersion='6.3.0.0' /> + </dependentAssembly> + </assemblyBinding> + </runtime> +#> +function Set-BindingRedirectSettingInWebConfig +{ + [CmdletBinding()] + param + ( + # Physical path for the IIS Endpoint on the machine (possibly under inetpub) + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [System.String] + $path, + + # old version of the assembly + [Parameter()] + [System.String] + $oldVersion = '10.0.0.0', + + # new version to redirect to + [Parameter()] + [System.String] + $newVersion = '6.3.0.0' + ) + + $webconfig = Join-Path $path 'web.config' + + if (Test-Path -Path $webconfig) + { + $xml = [System.Xml.XmlDocument] (Get-Content -Path $webconfig) + + if (-not($xml.get_DocumentElement().runtime)) + { + # Create the <runtime> section + $runtimeSetting = $xml.CreateElement('runtime') + + # Create the <assemblyBinding> section + $assemblyBindingSetting = $xml.CreateElement('assemblyBinding') + $xmlnsAttribute = $xml.CreateAttribute('xmlns') + $xmlnsAttribute.Value = 'urn:schemas-microsoft-com:asm.v1' + $assemblyBindingSetting.Attributes.Append($xmlnsAttribute) + + # The <assemblyBinding> section goes inside <runtime> + $null = $runtimeSetting.AppendChild($assemblyBindingSetting) + + # Create the <dependentAssembly> section + $dependentAssemblySetting = $xml.CreateElement('dependentAssembly') + + # The <dependentAssembly> section goes inside <assemblyBinding> + $null = $assemblyBindingSetting.AppendChild($dependentAssemblySetting) + + # Create the <assemblyIdentity> section + $assemblyIdentitySetting = $xml.CreateElement('assemblyIdentity') + $nameAttribute = $xml.CreateAttribute('name') + $nameAttribute.Value = 'microsoft.isam.esent.interop' + $publicKeyTokenAttribute = $xml.CreateAttribute('publicKeyToken') + $publicKeyTokenAttribute.Value = '31bf3856ad364e35' + $null = $assemblyIdentitySetting.Attributes.Append($nameAttribute) + $null = $assemblyIdentitySetting.Attributes.Append($publicKeyTokenAttribute) + + # <assemblyIdentity> section goes inside <dependentAssembly> + $dependentAssemblySetting.AppendChild($assemblyIdentitySetting) + + # Create the <bindingRedirect> section + $bindingRedirectSetting = $xml.CreateElement('bindingRedirect') + $oldVersionAttribute = $xml.CreateAttribute('oldVersion') + $newVersionAttribute = $xml.CreateAttribute('newVersion') + $oldVersionAttribute.Value = $oldVersion + $newVersionAttribute.Value = $newVersion + $null = $bindingRedirectSetting.Attributes.Append($oldVersionAttribute) + $null = $bindingRedirectSetting.Attributes.Append($newVersionAttribute) + + # The <bindingRedirect> section goes inside <dependentAssembly> section + $dependentAssemblySetting.AppendChild($bindingRedirectSetting) + + # The <runtime> section goes inside <Configuration> section + $xml.configuration.AppendChild($runtimeSetting) + + $xml.Save($webconfig) + } + } +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/en-US/xPSDesiredStateConfiguration.Security.strings.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/en-US/xPSDesiredStateConfiguration.Security.strings.psd1 new file mode 100644 index 0000000..58c9d5a --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/en-US/xPSDesiredStateConfiguration.Security.strings.psd1 @@ -0,0 +1,4 @@ +# Localized resources for xPSDesiredStateConfiguration.Firewall + +ConvertFrom-StringData @' +'@ diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/xPSDesiredStateConfiguration.Security.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/xPSDesiredStateConfiguration.Security.psd1 new file mode 100644 index 0000000..d8a9681 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/xPSDesiredStateConfiguration.Security.psd1 @@ -0,0 +1,58 @@ +@{ + # Version number of this module. + ModuleVersion = '0.0.1' + + # ID used to uniquely identify this module + GUID = 'ad2e23bf-3d74-4399-8fbe-93caa4713b6f' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'Functions used by the DSC Web Service resource to configure system security settings.' + + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + FunctionsToExport = @( + 'Set-UseSecurityBestPractice', + 'Test-UseSecurityBestPractice' + ) + + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + AliasesToExport = @() + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '' + } # End of PSData hashtable + } # End of PrivateData hashtable +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/xPSDesiredStateConfiguration.Security.psm1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/xPSDesiredStateConfiguration.Security.psm1 new file mode 100644 index 0000000..d6b82d0 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/Modules/xPSDesiredStateConfiguration.Security/xPSDesiredStateConfiguration.Security.psm1 @@ -0,0 +1,120 @@ +$modulePath = Split-Path -Path $PSScriptRoot -Parent + +# Import the shared modules +Import-Module -Name (Join-Path -Path $modulePath ` + -ChildPath (Join-Path -Path 'xPSDesiredStateConfiguration.Common' ` + -ChildPath 'xPSDesiredStateConfiguration.Common.psm1')) + +# Import Localization Strings +$script:localizedData = Get-LocalizedData -ResourceName 'xPSDesiredStateConfiguration.Security' -ScriptRoot $PSScriptRoot + +# Best Practice Security Settings Block +$insecureProtocols = @("SSL 2.0", "SSL 3.0", "TLS 1.0", "PCT 1.0", "Multi-Protocol Unified Hello") +$secureProtocols = @("TLS 1.1", "TLS 1.2") + +<# + This list corresponds to the ValueMap definition of DisableSecurityBestPractices + parameter defined in MSFT_xDSCWebService.Schema.mof +#> +$SecureTLSProtocols = 'SecureTLSProtocols' + +<# + .SYNOPSIS + This function tests if the SChannel protocols are enabled. +#> +function Test-SChannelProtocol +{ + [CmdletBinding()] + param () + + foreach ($protocol in $insecureProtocols) + { + $registryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$protocol\Server" + + if ((Test-Path -Path $registryPath) ` + -and ($null -ne (Get-ItemProperty -Path $registryPath)) ` + -and ((Get-ItemProperty -Path $registryPath).Enabled -ne 0)) + { + return $false + } + } + + foreach ($protocol in $secureProtocols) + { + $registryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$protocol\Server" + + if ((-not (Test-Path -Path $registryPath)) ` + -or ($null -eq (Get-ItemProperty -Path $registryPath)) ` + -or ((Get-ItemProperty -Path $registryPath).Enabled -eq 0)) + { + return $false + } + } + + return $true +} + +<# + .SYNOPSIS + This function enables the SChannel protocols. +#> +function Set-SChannelProtocol +{ + [CmdletBinding()] + param () + + foreach ($protocol in $insecureProtocols) + { + $registryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$protocol\Server" + $null = New-Item -Path $registryPath -Force + $null = New-ItemProperty -Path $registryPath -Name Enabled -Value 0 -PropertyType 'DWord' -Force + } + + foreach ($protocol in $secureProtocols) + { + $registryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$protocol\Server" + $null = New-Item -Path $registryPath -Force + $null = New-ItemProperty -Path $registryPath -Name Enabled -Value '0xffffffff' -PropertyType 'DWord' -Force + $null = New-ItemProperty -Path $registryPath -Name DisabledByDefault -Value 0 -PropertyType 'DWord' -Force + } +} + +<# + .SYNOPSIS + This function tests whether the node uses security best practices for non-disabled items +#> +function Test-UseSecurityBestPractice +{ + [CmdletBinding()] + [OutputType([System.Boolean])] + param + ( + [Parameter()] + [System.String[]] + $DisableSecurityBestPractices + ) + + $usedProtocolsBestPractices = ($DisableSecurityBestPractices -icontains $SecureTLSProtocols) -or (Test-SChannelProtocol) + + return $usedProtocolsBestPractices +} + +<# + .SYNOPSIS + This function sets the node to use security best practices for non-disabled items +#> +function Set-UseSecurityBestPractice +{ + [CmdletBinding()] + param + ( + [Parameter()] + [System.String[]] + $DisableSecurityBestPractices + ) + + if (-not ($DisableSecurityBestPractices -icontains $SecureTLSProtocols)) + { + Set-SChannelProtocol + } +} diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/ResourceDesignerScripts/GenerateXRemoteFileSchema.ps1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/ResourceDesignerScripts/GenerateXRemoteFileSchema.ps1 new file mode 100644 index 0000000..ae92288 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/ResourceDesignerScripts/GenerateXRemoteFileSchema.ps1 @@ -0,0 +1,9 @@ +$DestinationPath = New-xDscResourceProperty -Name DestinationPath -Type String -Attribute Key -Description 'Path under which downloaded or copied file should be accessible after operation.' +$Uri = New-xDscResourceProperty -Name Uri -Type String -Attribute Required -Description 'Uri of a file which should be copied or downloaded. This parameter supports HTTP and HTTPS values.' +$Headers = New-xDscResourceProperty -Name Headers -Type Hashtable[] -Attribute Write -Description 'Headers of the web request.' +$UserAgent = New-xDscResourceProperty -Name UserAgent -Type String -Attribute Write -Description 'User agent for the web request.' +$Ensure = New-xDscResourceProperty -Name Ensure -Type String -Attribute Read -ValidateSet "Present", "Absent" -Description 'Says whether DestinationPath exists on the machine' +$Credential = New-xDscResourceProperty -Name Credential -Type PSCredential -Attribute Write -Description 'Specifies a user account that has permission to send the request.' + +New-xDscResource -Name MSFT_xRemoteFile -Property @($DestinationPath, $Uri, $Headers, $UserAgent, $Ensure, $Credential, $CertificateThumbprint) -ModuleName xPSDesiredStateConfiguration2 -FriendlyName xRemoteFile + diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/ResourceDesignerScripts/New-PSSessionConfigurationResource.ps1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/ResourceDesignerScripts/New-PSSessionConfigurationResource.ps1 new file mode 100644 index 0000000..5b22f12 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/ResourceDesignerScripts/New-PSSessionConfigurationResource.ps1 @@ -0,0 +1,18 @@ +Import-Module -Name 'xDSCResourceDesigner' + +$resProperties = @{ + Name = New-xDscResourceProperty -Description 'Name of the PS Remoting Endpoint' ` + -Name Name -Type String -Attribute Key + RunAsCred = New-xDscResourceProperty -Description 'Credential for Running under different user context' ` + -Name RunAsCredential -Type PSCredential -Attribute Write + SDDL = New-xDscResourceProperty -Description 'SDDL for allowed users to connect to this endpoint. 'Default' means the default SDDL' ` + -Name SecurityDescriptorSDDL -Type String -Attribute Write + StartupScript = New-xDscResourceProperty -Description 'Path for the startup script. Empty string clears the value'` + -Name StartupScriptPath -Type String -Attribute Write + Ensure = New-xDscResourceProperty -Description 'Whether to create the endpoint or delete it' ` + -Name Ensure -Type String -Attribute Write -ValidateSet @('Present', 'Absent') + AccessMode = New-xDscResourceProperty -Description 'Whether the endpoint is remotely accessible or has local access only or no access' ` + -Name AccessMode -Type String -Attribute Write -ValidateSet @('Local', 'Remote', 'Disabled') +} + +New-xDscResource -Name MSFT_xPSSessionConfiguration -Property $resProperties.Values -Path $home\desktop -ModuleName xPSDesiredStateConfiguration -FriendlyName xPSEndpoint -Force diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/en-US/about_xPSDesiredStateConfiguration.help.txt b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/en-US/about_xPSDesiredStateConfiguration.help.txt new file mode 100644 index 0000000..eb30503 --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/en-US/about_xPSDesiredStateConfiguration.help.txt @@ -0,0 +1,29 @@ +TOPIC + about_xPSDesiredStateConfiguration + +SHORT DESCRIPTION + DSC resources for configuring common operating systems features, files and + settings. + +LONG DESCRIPTION + This module contains DSC resources for configuring common operating systems + features, files and settings. + +EXAMPLES + PS C:\> Get-DscResource -Module xPSDesiredStateConfiguration + +NOTE: + Thank you to the DSC Community contributors who contributed to this module by + writing code, sharing opinions, and provided feedback. + +TROUBLESHOOTING NOTE: + Go to the Github repository for read about issues, submit a new issue, and read + about new releases. https://github.com/dsccommunity/xPSDesiredStateConfiguration + +SEE ALSO + - https://github.com/dsccommunity/xPSDesiredStateConfiguration + +KEYWORDS + DSC, DscResource, Archive, Environment, Group, MSI, Package, File, + RemoteFile, Registry, Script, Service, User, + WindowsFeature, WindowsOptionalFeature, WindowsPackageCab, WindowsProcess diff --git a/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/xPSDesiredStateConfiguration.psd1 b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/xPSDesiredStateConfiguration.psd1 new file mode 100644 index 0000000..74dfd8f --- /dev/null +++ b/deployment/dsc/azshcihost/xPSDesiredStateConfiguration/9.1.0/xPSDesiredStateConfiguration.psd1 @@ -0,0 +1,200 @@ +@{ + # Root module + RootModule = 'Modules\DscPullServerSetup\DscPullServerSetup.psm1' + + # Version number of this module. + moduleVersion = '9.1.0' + + # ID used to uniquely identify this module + GUID = 'cc8dc021-fa5f-4f96-8ecf-dfd68a6d9d48' + + # Author of this module + Author = 'DSC Community' + + # Company or vendor of this module + CompanyName = 'DSC Community' + + # Copyright statement for this module + Copyright = 'Copyright the DSC Community contributors. All rights reserved.' + + # Description of the functionality provided by this module + Description = 'DSC resources for configuring common operating systems features, files and settings.' + + # Minimum version of the Windows PowerShell engine required by this module + PowerShellVersion = '4.0' + + # Minimum version of the common language runtime (CLR) required by this module + CLRVersion = '4.0' + + # Functions to export from this module + FunctionsToExport = @( + 'Publish-DscModuleAndMof', + 'Publish-ModulesAndChecksum', + 'Publish-MofsInSource', + 'Publish-ModuleToPullServer', + 'Publish-MofToPullServer' + ) + + # Cmdlets to export from this module + CmdletsToExport = @() + + # Variables to export from this module + VariablesToExport = @() + + # Aliases to export from this module + AliasesToExport = @() + + # DSC resources to export from this module + DscResourcesToExport = @( + 'xArchive', 'xDSCWebService', 'xEnvironment','xGroup','xMsiPackage', + 'xPackage','xPSEndpoint','xRegistry','xRemoteFile', + 'xScript','xService','xUser','xWindowsFeature','xWindowsOptionalFeature', + 'xWindowsPackageCab','xWindowsProcess' + ) + + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ + + PSData = @{ + # Set to a prerelease string value if the release should be a prerelease. + Prerelease = '' + + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('DesiredStateConfiguration', 'DSC', 'DSCResourceKit', 'DSCResource') + + # A URL to the license for this module. + LicenseUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration/blob/master/LICENSE' + + # A URL to the main website for this project. + ProjectUri = 'https://github.com/dsccommunity/xPSDesiredStateConfiguration' + + # A URL to an icon representing this module. + IconUri = 'https://dsccommunity.org/images/DSC_Logo_300p.png' + + # ReleaseNotes of this module + ReleaseNotes = '## [9.1.0] - 2020-02-19 + +### Changed + +- Examples + - Removed the version number of the xPSDesiredStateConfiguration module from the #Requires headers. - + [issue #653](https://github.com/dsccommunity/xPSDesiredStateConfiguration/issues/653) + +### Fixed + +- xPSDesiredStateConfiguration + - Export `Publish-*` functions in DscPullServerSetup module - Fixes + [issue #673](https://github.com/PowerShell/PSDscResources/issues/673). + +- DSC_xRegistryResource + - Fixed an issue that failed to create a registry with ":" in the path. + [issue #671](https://github.com/dsccommunity/xPSDesiredStateConfiguration/issues/671) + +## [9.0.0] - 2020-01-15 + +### Added + +- xPSDesiredStateConfiguration + - Added support for Checksum on xRemoteFile - [issue #423](https://github.com/PowerShell/PSDscResources/issues/423) + - Added `Test-DscParameterState` support function to `xPSDesiredStateConfiguration.Common.psm1`. + - Added standard unit tests for `xPSDesiredStateConfiguration.Common.psm1`. + - Added automatic release with a new CI pipeline. + +### Changed + +- xPSDesiredStateConfiguration + - PublishModulesAndMofsToPullServer.psm1: + - Fixes issue in Publish-MOFToPullServer that incorrectly tries to create a + new MOF file instead of reading the existing one. + [issue #575](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/575) + - Fix minor style issues with missing spaces between `param` statements and ''(''. + - MSFT_xDSCWebService: + - Removal of commented out code. + - Updated to meet HQRM style guidelines - Fixes [issue #623](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/623) + - Added MOF descriptions. + - Corrected minor style issues. + - Fix minor style issues in hashtable layout. + - Shared modules moved to `source/Module` folder and renamed: + - `CommonResourceHelper.psm1` -> `xPSDesiredStateConfiguration.Common.psm1` + - Moved functions from `ResourceSetHelper.psm1` into + `xPSDesiredStateConfiguration.Common.psm1`. + - BREAKING CHANGE: Changed resource prefix from MSFT to DSC. + - Pinned `ModuleBuilder` to v1.0.0. + - Updated build badges in README.MD. + - Remove unused localization strings. + - Adopt DSC Community Code of Conduct. + - DSC_xPSSessionConfiguration: + - Moved strings to localization file. + - DSC_xScriptResource + - Updated parameter descriptions to match MOF file. + - Correct miscellaneous style issues. + - DSC_xWindowsOptionalFeature + - Fix localization strings. + - DSC_xEnvironmentResource + - Remove unused localization strings. + - DSC_xRemoteFile + - Updated end-to-end tests to use the same pattern as the other end-to-end + tests in this module. + - DSC_xDSCWebService + - Moved `PSWSIISEndpoint.psm1` module into `xPSDesiredStateConfiguration.PSWSIIS`. + - Moved `Firewall.psm1` module into `xPSDesiredStateConfiguration.Firewall`. + - Moved `SecureTLSProtocols.psm1` and `UseSecurityBestPractices.psm1` module + into `xPSDesiredStateConfiguration.Security`. + - Fix issue with `Get-TargetResource` when a DSC Pull Server website is not + installed. + - DSC_xWindowsFeature + - Changed tests to be able to run on machines without `*-WindowsFeature` cmdlets. + - Changed `Assert-SingleInstanceOfFeature` to accept an array. + - BREAKING CHANGE: Renamed `PublishModulesAndMofsToPullServer` module to + `DscPullServerSetup` and moved to Modules folder. + - Moved test helper modules into `tests\TestHelpers` folder. +- DSCPullServerSetup + - Fixed markdown errors in README.MD. + - Moved strings to Localization file. + - Corrected style violations. +- Updated build badges to reflect correct Azure DevOps build Definition Id - fixes + [issue #656](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/656). +- Set `testRunTitle` for PublishTestResults steps so that a helpful name is + displayed in Azure DevOps for each test run. +- Set a display name on all the jobs and tasks in the CI + pipeline - fixes [issue #663](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/663). + +### Deprecated + +- None + +### Removed + +- xPSDesiredStateConfiguration + - Removed files no longer required by new CI process. + +### Fixed + +- MSFT_xRegistryResource + - Fixes issue that the `Set-TargetResource` does not determine + the type of registry value correctly. + [issue #436](https://github.com/dsccommunity/xPSDesiredStateConfiguration/issues/436) +- Fixed Pull Server example links in `README.MD` - fixes + [issue #659](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/659). +- Fixed `GitVersion.yml` feature and fix Regex - fixes + [issue #660](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/660). +- Fix import statement in all tests, making sure it throws if module + DscResource.Test cannot be imported - fixes + [issue #666](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/666). +- Fix deploy stage in CI pipeline to prevent it executing against forks + of the repository - fixes [issue #665](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/665). +- Fix deploy fork detection in CI pipeline - fixes [issue #668](https://github.com/PowerShell/xPSDesiredStateConfiguration/issues/668). + +### Security + +- None + +' + } # End of PSData hashtable + } # End of PrivateData hashtable +} + + + + + diff --git a/deployment/helpers/Install-AzsRolesandFeatures.ps1 b/deployment/helpers/Install-AzsRolesandFeatures.ps1 new file mode 100644 index 0000000..d389d97 --- /dev/null +++ b/deployment/helpers/Install-AzsRolesandFeatures.ps1 @@ -0,0 +1,38 @@ +configuration AzSHCIHost +{ + Import-DscResource -ModuleName 'PSDesiredStateConfiguration' + + node localhost + { + LocalConfigurationManager { + RebootNodeIfNeeded = $true + ActionAfterReboot = 'ContinueConfiguration' + ConfigurationMode = 'ApplyAndAutoCorrect' + ConfigurationModeFrequencyMins = 1440 + } + + WindowsFeatureSet "AzSHCI Required Roles" + { + Ensure = 'Present' + Name = @("File-Services", "FS-FileServer", "FS-Data-Deduplication", "BitLocker", "Data-Center-Bridging", "EnhancedStorage", "Failover-Clustering", "RSAT", "RSAT-Feature-Tools", "RSAT-DataCenterBridging-LLDP-Tools", "RSAT-Clustering", "RSAT-Clustering-PowerShell", "RSAT-Role-Tools", "RSAT-AD-Tools", "RSAT-AD-PowerShell", "RSAT-Hyper-V-Tools", "Hyper-V-PowerShell") + } + } +} + +$date = get-date -f yyyy-MM-dd +$logFile = Join-Path -Path "C:\temp" -ChildPath $('AzSHCIHost-Transcipt-' + $date + '.log') +$DscConfigLocation = "c:\temp\AzSHCIHost" + +Start-Transcript -Path $logFile + +Remove-DscConfigurationDocument -Stage Current, Previous, Pending -Force + +AzSHCIHost -OutputPath $DscConfigLocation + +Set-DscLocalConfigurationManager -Path $DscConfigLocation -Verbose + +Start-DscConfiguration -Path $DscConfigLocation -Wait -Verbose + +Stop-Transcript + +Logoff \ No newline at end of file diff --git a/deployment/helpers/Register-AzSHCI.ps1 b/deployment/helpers/Register-AzSHCI.ps1 new file mode 100644 index 0000000..fd667b6 --- /dev/null +++ b/deployment/helpers/Register-AzSHCI.ps1 @@ -0,0 +1,16 @@ +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force +Install-Module Az.StackHCI + +Invoke-Command -ComputerName AZSHCINODE01 -ScriptBlock { + Get-AzureStackHCI +} + +$azshciNodeCreds = Get-Credential -UserName "azshci\azureuser" -Message "Enter the azshci\azureuser password" +Register-AzStackHCI ` + -SubscriptionId "your-subscription-ID-here" ` + -ResourceName "azshciclus" ` + -ResourceGroupName "AZSHCICLUS_RG" ` + -Region "EastUS" ` + -EnvironmentName "AzureCloud" ` + -ComputerName "AZSHCINODE01.azshci.local" ` + -Credential $azshciNodeCreds diff --git a/deployment/helpers/Update-AD.ps1 b/deployment/helpers/Update-AD.ps1 new file mode 100644 index 0000000..18eee78 --- /dev/null +++ b/deployment/helpers/Update-AD.ps1 @@ -0,0 +1,55 @@ +$targetHost = $env:COMPUTERNAME +$AzureStackHCIHosts = Get-VM -Name "*AZSHCINODE*" +$AzureStackHCIClusterName = "AZSHCICLUS" +$ouName = "AzSHCICluster" + +$dn = Get-ADOrganizationalUnit -Filter * | Where-Object name -eq $ouName +if (-not ($dn)) { + $dn = New-ADOrganizationalUnit -Name $ouName -PassThru +} + +#Get Wac Computer Object +$targetHostObject = Get-ADComputer -Filter * | Where-Object name -eq $targetHost +if (-not ($targetHostObject)) { + $targetHostObject = New-ADComputer -Name $targetHost -Enabled $false -PassThru +} + +# Creates Azure Stack HCI hosts if not exist +if ($AzureStackHCIHosts.Name) { + $AzureStackHCIHosts.Name | ForEach-Object { + $comp = Get-ADComputer -Filter * | Where-Object Name -eq $_ + if (-not ($comp)) { + New-ADComputer -Name $_ -Enabled $false -Path $dn -PrincipalsAllowedToDelegateToAccount $targetHostObject + } + else { + $comp | Set-ADComputer -PrincipalsAllowedToDelegateToAccount $targetHostObject + $comp | Move-AdObject -TargetPath $dn + } + } +} + +# Creates Azure Stack HCI Cluster CNO if not exist +$AzureStackHCIClusterObject = Get-ADComputer -Filter * | Where-Object name -eq $AzureStackHCIClusterName +if (-not ($AzureStackHCIClusterObject)) { + $AzureStackHCIClusterObject = New-ADComputer -Name $AzureStackHCIClusterName -Enabled $false ` + -Path $dn -PrincipalsAllowedToDelegateToAccount $targetHostObject -PassThru +} +else { + $AzureStackHCIClusterObject | Set-ADComputer -PrincipalsAllowedToDelegateToAccount $targetHostObject + $AzureStackHCIClusterObject | Move-AdObject -TargetPath $dn +} + +#read OU DACL +$acl = Get-Acl -Path "AD:\$dn" + +# Set properties to allow Cluster CNO to Full Control on the new OU +$principal = New-Object System.Security.Principal.SecurityIdentifier ($AzureStackHCIClusterObject).SID +$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule($principal, ` + [System.DirectoryServices.ActiveDirectoryRights]::GenericAll, [System.Security.AccessControl.AccessControlType]::Allow, ` + [DirectoryServices.ActiveDirectorySecurityInheritance]::All) + +#modify DACL +$acl.AddAccessRule($ace) + +#Re-apply the modified DACL to the OU +Set-ACL -ACLObject $acl -Path "AD:\$dn" \ No newline at end of file diff --git a/deployment/json/azshcihost.json b/deployment/json/azshcihost.json new file mode 100644 index 0000000..6d7ceb8 --- /dev/null +++ b/deployment/json/azshcihost.json @@ -0,0 +1,618 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "virtualMachineName": { + "type": "string", + "defaultValue": "AzSHCIHost001", + "metadata": { + "description": "Keep the VM name to less than 15 characters" + } + }, + "virtualMachineSize": { + "type": "string", + "defaultValue": "Standard_E16s_v4", + "allowedValues": [ + "Standard_D16s_v3", + "Standard_D32s_v3", + "Standard_D64s_v3", + "Standard_D16s_v4", + "Standard_D32s_v4", + "Standard_D64s_v4", + "Standard_D16d_v4", + "Standard_D32d_v4", + "Standard_D64d_v4", + "Standard_D16ds_v4", + "Standard_D32ds_v4", + "Standard_D64ds_v4", + "Standard_E8s_v3", + "Standard_E16s_v3", + "Standard_E16-4s_v3", + "Standard_E16-8s_v3", + "Standard_E20s_v3", + "Standard_E32s_v3", + "Standard_E32-8s_v3", + "Standard_E32-16s_v3", + "Standard_E48s_v3", + "Standard_E64s_v3", + "Standard_E64-16s_v3", + "Standard_E64-32s_v3", + "Standard_E8s_v4", + "Standard_E16s_v4", + "Standard_E16-8s_v4", + "Standard_E20s_v4", + "Standard_E32s_v4", + "Standard_E32-8s_v4", + "Standard_E32-16s_v4", + "Standard_E48s_v4", + "Standard_E64s_v4", + "Standard_E64-16s_v4", + "Standard_E64-32s_v4", + "Standard_E8d_v4", + "Standard_E16d_v4", + "Standard_E20d_v4", + "Standard_E32d_v4", + "Standard_E48d_v4", + "Standard_E64d_v4", + "Standard_E8ds_v4", + "Standard_E16ds_v4", + "Standard_E20ds_v4", + "Standard_E32ds_v4", + "Standard_E48ds_v4", + "Standard_E64ds_v4", + "Standard_E64-16ds_v4", + "Standard_E64-32ds_v4" + ] + }, + "virtualMachineGeneration": { + "type": "string", + "defaultValue": "Generation 2", + "allowedValues": [ + "Generation 1", + "Generation 2" + ], + "metadata": { + "description": "Select your VM generation, ideally Gen 2. Not all Azure regions support Gen 2 VMs." + } + }, + "domainName": { + "type": "string", + "defaultValue": "azshci.local", + "metadata": { + "description": "The FQDN that will be used in the environment" + } + }, + "dataDiskType": { + "type": "string", + "defaultValue": "StandardSSD_LRS", + "allowedValues": [ + "StandardSSD_LRS", + "Premium_LRS" + ], + "metadata": { + "description": "The Storage type of the VM data disk. If your VM contains an 's' in the VM size, you can select Premium_LRS storage for increased performance, but at a higher cost." + } + }, + "dataDiskSize": { + "type": "string", + "defaultValue": "32", + "allowedValues": [ + "32", + "64", + "128", + "256", + "512", + "1024" + ], + "metadata": { + "description": "The size of the individual data disks in GiB. 8 of these will be provisioned therefore 32GiB is the recommended default." + } + }, + "adminUsername": { + "type": "string", + "defaultValue": "AzureUser" + }, + "adminPassword": { + "type": "securestring" + }, + "enableDHCP": { + "type": "string", + "defaultValue": "Enabled", + "allowedValues": [ + "Enabled", + "Disabled" + ], + "metadata": { + "description": "Choose whether you wish to enable DHCP in the environment. If you choose Disabled, it can be enabled after deployment." + } + }, + "customRdpPort": { + "type": "string", + "defaultValue": "3389", + "metadata": { + "description": "If you wish to use a different port to RDP into the VM (between 0 and 65535), change it here, otherwise, leave the default." + } + }, + "autoShutdownStatus": { + "type": "string", + "defaultValue": "Enabled", + "allowedValues": [ + "Enabled", + "Disabled" + ] + }, + "autoShutdownTime": { + "type": "string", + "defaultValue": "22:00" + }, + "autoShutdownTimeZone": { + "type": "string", + "defaultValue": "UTC", + "allowedValues": [ + "Afghanistan Standard Time", + "Alaskan Standard Time", + "Aleutian Standard Time", + "Altai Standard Time", + "Arab Standard Time", + "Arabian Standard Time", + "Arabic Standard Time", + "Argentina Standard Time", + "Astrakhan Standard Time", + "Atlantic Standard Time", + "AUS Central Standard Time", + "Aus Central W. Standard Time", + "AUS Eastern Standard Time", + "Azerbaijan Standard Time", + "Azores Standard Time", + "Bahia Standard Time", + "Bangladesh Standard Time", + "Belarus Standard Time", + "Bougainville Standard Time", + "Canada Central Standard Time", + "Cape Verde Standard Time", + "Caucasus Standard Time", + "Cen. Australia Standard Time", + "Central America Standard Time", + "Central Asia Standard Time", + "Central Brazilian Standard Time", + "Central Europe Standard Time", + "Central European Standard Time", + "Central Pacific Standard Time", + "Central Standard Time", + "Central Standard Time (Mexico)", + "Chatham Islands Standard Time", + "China Standard Time", + "Cuba Standard Time", + "Dateline Standard Time", + "E. Africa Standard Time", + "E. Australia Standard Time", + "E. Europe Standard Time", + "E. South America Standard Time", + "Easter Island Standard Time", + "Eastern Standard Time", + "Eastern Standard Time (Mexico)", + "Egypt Standard Time", + "Ekaterinburg Standard Time", + "Fiji Standard Time", + "FLE Standard Time", + "Georgian Standard Time", + "GMT Standard Time", + "Greenland Standard Time", + "Greenwich Standard Time", + "GTB Standard Time", + "Haiti Standard Time", + "Hawaiian Standard Time", + "India Standard Time", + "Iran Standard Time", + "Israel Standard Time", + "Jordan Standard Time", + "Kaliningrad Standard Time", + "Korea Standard Time", + "Libya Standard Time", + "Line Islands Standard Time", + "Lord Howe Standard Time", + "Magadan Standard Time", + "Magallanes Standard Time", + "Marquesas Standard Time", + "Mauritius Standard Time", + "Middle East Standard Time", + "Montevideo Standard Time", + "Morocco Standard Time", + "Mountain Standard Time", + "Mountain Standard Time (Mexico)", + "Myanmar Standard Time", + "N. Central Asia Standard Time", + "Namibia Standard Time", + "Nepal Standard Time", + "New Zealand Standard Time", + "Newfoundland Standard Time", + "Norfolk Standard Time", + "North Asia East Standard Time", + "North Asia Standard Time", + "North Korea Standard Time", + "Omsk Standard Time", + "Pacific SA Standard Time", + "Pacific Standard Time", + "Pacific Standard Time (Mexico)", + "Pakistan Standard Time", + "Paraguay Standard Time", + "Romance Standard Time", + "Russia Time Zone 10", + "Russia Time Zone 11", + "Russia Time Zone 3", + "Russian Standard Time", + "SA Eastern Standard Time", + "SA Pacific Standard Time", + "SA Western Standard Time", + "Saint Pierre Standard Time", + "Sakhalin Standard Time", + "Samoa Standard Time", + "Sao Tome Standard Time", + "Saratov Standard Time", + "SE Asia Standard Time", + "Singapore Standard Time", + "South Africa Standard Time", + "Sri Lanka Standard Time", + "Sudan Standard Time", + "Syria Standard Time", + "Taipei Standard Time", + "Tasmania Standard Time", + "Tocantins Standard Time", + "Tokyo Standard Time", + "Tomsk Standard Time", + "Tonga Standard Time", + "Transbaikal Standard Time", + "Turkey Standard Time", + "Turks And Caicos Standard Time", + "Ulaanbaatar Standard Time", + "US Eastern Standard Time", + "US Mountain Standard Time", + "UTC", + "UTC-02", + "UTC-08", + "UTC-09", + "UTC-11", + "UTC+12", + "UTC+13", + "Venezuela Standard Time", + "Vladivostok Standard Time", + "W. Australia Standard Time", + "W. Central Africa Standard Time", + "W. Europe Standard Time", + "W. Mongolia Standard Time", + "West Asia Standard Time", + "West Bank Standard Time", + "West Pacific Standard Time", + "Yakutsk Standard Time" + ] + }, + "alreadyHaveAWindowsServerLicense": { + "type": "string", + "defaultValue": "No", + "allowedValues": [ + "Yes", + "No" + ], + "metadata": { + "description": "By selecting Yes, you confirm you have an eligible Windows Server license with Software Assurance or Windows Server subscription to apply this Azure Hybrid Benefit. You can read more about compliance here: http://go.microsoft.com/fwlink/?LinkId=859786" + } + } + }, + "variables": { + "dataDisksCount": 8, + "dscUri": "https://github.com/Azure/AzureStackHCI-EvalGuide/raw/main/deployment/dsc/azshcihost.zip", + "artifactsLocation": "https://raw.githubusercontent.com/Azure/AzureStackHCI-EvalGuide/main/deployment/", + "randomGUID": "[substring(uniqueString(subscription().subscriptionId, resourceGroup().id, parameters('virtualMachineName')),0,6)]", + "dnsNameForPublicIP": "[toLower(concat(parameters('virtualMachineName'), variables('randomGUID')))]", + "environment": "AD Domain", + "virtualNetworkName": "AzSHCILabvNet", + "networkInterfaceName": "AzSHCILabNIC1", + "networkSecurityGroupName": "AzSHCILabNSG", + "addressPrefix": "10.0.0.0/16", + "privateIPAddress": "10.0.0.4", + "subnetName": "AzSHCILabSubnet", + "subnetPrefix": "10.0.0.0/24", + "publicIpAddressName": "AzSHCILabPubIP", + "publicIpAddressType": "Dynamic", + "publicIpAddressSku": "Basic", + "vnetId": "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", + "subnetRef": "[concat(variables('vnetId'), '/subnets/', variables('subnetName'))]" + }, + "resources": [ + { + "name": "[variables('publicIpAddressName')]", + "type": "Microsoft.Network/publicIpAddresses", + "apiVersion": "2020-11-01", + "location": "[resourceGroup().location]", + "sku": { + "name": "[variables('publicIpAddressSku')]" + }, + "properties": { + "publicIpAllocationMethod": "[variables('publicIpAddressType')]", + "dnsSettings": { + "domainNameLabel": "[variables('dnsNameForPublicIP')]" + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2021-04-01", + "name": "[variables('virtualNetworkName')]", + "properties": { + "mode": "Incremental", + "templateLink": { + "uri": "[uri(variables('artifactsLocation'), concat('json/vnet.json'))]", + "contentVersion": "1.0.0.0" + }, + "parameters": { + "virtualNetworkName": { + "value": "[variables('virtualNetworkName')]" + }, + "virtualNetworkAddressRange": { + "value": "[variables('addressPrefix')]" + }, + "subnetName": { + "value": "[variables('subnetName')]" + }, + "subnetRange": { + "value": "[variables('subnetPrefix')]" + }, + "location": { + "value": "[resourceGroup().location]" + } + } + } + }, + { + "name": "[variables('networkInterfaceName')]", + "type": "Microsoft.Network/networkInterfaces", + "apiVersion": "2020-11-01", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[variables('virtualNetworkName')]", + "[concat('Microsoft.Network/publicIpAddresses/', variables('publicIpAddressName'))]", + "[concat('Microsoft.Network/networkSecurityGroups/', variables('networkSecurityGroupName'))]" + ], + "properties": { + "ipConfigurations": [ + { + "name": "ipconfig1", + "properties": { + "subnet": { + "id": "[variables('subnetRef')]" + }, + "privateIPAllocationMethod": "Static", + "privateIPAddress": "[variables('privateIPAddress')]", + "publicIpAddress": { + "id": "[resourceId('Microsoft.Network/publicIpAddresses', variables('publicIpAddressName'))]" + } + } + } + ], + "networkSecurityGroup": { + "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]" + } + } + }, + { + "name": "[variables('networkSecurityGroupName')]", + "type": "Microsoft.Network/networkSecurityGroups", + "apiVersion": "2020-11-01", + "location": "[resourceGroup().location]", + "properties": { + "securityRules": [ + { + "name": "rdp", + "properties": { + "priority": 1000, + "protocol": "Tcp", + "access": "Allow", + "direction": "Inbound", + "sourceAddressPrefix": "*", + "sourcePortRange": "*", + "destinationAddressPrefix": "*", + "destinationPortRange": "[parameters('customRdpPort')]" + } + } + ] + } + }, + { + "name": "[parameters('virtualMachineName')]", + "type": "Microsoft.Compute/virtualMachines", + "apiVersion": "2020-12-01", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[concat('Microsoft.Network/networkInterfaces/', variables('networkInterfaceName'))]" + ], + "properties": { + "osProfile": { + "computerName": "[parameters('virtualMachineName')]", + "adminUsername": "[parameters('adminUsername')]", + "adminPassword": "[parameters('adminPassword')]", + "windowsConfiguration": { + "provisionVmAgent": true + } + }, + "hardwareProfile": { + "vmSize": "[parameters('virtualMachineSize')]" + }, + "storageProfile": { + "imageReference": { + "publisher": "MicrosoftWindowsServer", + "offer": "WindowsServer", + "sku": "[if(equals(parameters('virtualMachineGeneration'), 'Generation 2'), '2019-datacenter-gensecond', '2019-Datacenter')]", + "version": "latest" + }, + "osDisk": { + "createOption": "FromImage", + "managedDisk": { + "storageAccountType": "Standard_LRS" + } + }, + "copy": [ + { + "name": "dataDisks", + "count": "[variables('dataDisksCount')]", + "input": { + "name": "[concat(parameters('virtualMachineName'),'DataDisk',copyIndex('dataDisks'))]", + "diskSizeGB": "[parameters('dataDiskSize')]", + "lun": "[copyIndex('dataDisks')]", + "createOption": "Empty", + "caching": "None", + "managedDisk": { + "storageAccountType": "[parameters('dataDiskType')]" + } + } + } + ] + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]" + } + ] + }, + "diagnosticsProfile": { + "bootDiagnostics": { + "enabled": true + } + }, + "licenseType": "[if(equals(parameters('alreadyHaveAWindowsServerLicense'), 'Yes'), 'Windows_Server', 'None')]" + }, + "resources": [ + { + "type": "extensions", + "name": "InstallWAC", + "apiVersion": "2021-03-01", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[parameters('virtualMachineName')]" + ], + "properties": { + "publisher": "Microsoft.Compute", + "type": "CustomScriptExtension", + "typeHandlerVersion": "1.10", + "autoUpgradeMinorVersion": true, + "settings": { + "fileUris": [ + "[uri(variables('artifactsLocation'), concat('scripts/installWac.ps1'))]" + ] + }, + "protectedSettings": { + "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -File installWac.ps1', ' -userName ', parameters('adminUsername'))]" + } + } + }, + { + "type": "extensions", + "name": "ConfigureAzSHCIHost", + "apiVersion": "2021-03-01", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[parameters('virtualMachineName')]", + "[resourceId('Microsoft.Compute/virtualMachines/extensions', parameters('virtualMachineName'), 'InstallWAC')]" + ], + "properties": { + "publisher": "Microsoft.Powershell", + "type": "DSC", + "typeHandlerVersion": "2.77", + "autoUpgradeMinorVersion": true, + "settings": { + "wmfVersion": "latest", + "configuration": { + "url": "[variables('dscUri')]", + "script": "azshcihost.ps1", + "function": "AzSHCIHost" + }, + "configurationArguments": { + "DomainName": "[parameters('domainName')]", + "environment": "[variables('environment')]", + "enableDHCP": "[parameters('enableDHCP')]", + "customRdpPort": "[parameters('customRdpPort')]" + } + }, + "protectedSettings": { + "configurationArguments": { + "adminCreds": { + "UserName": "[parameters('adminUsername')]", + "Password": "[parameters('adminPassword')]" + } + } + } + } + } + ] + }, + { + "name": "[concat('shutdown-computevm-', parameters('virtualMachineName'))]", + "type": "Microsoft.DevTestLab/schedules", + "apiVersion": "2018-09-15", + "location": "[resourceGroup().location]", + "properties": { + "status": "[parameters('autoShutdownStatus')]", + "taskType": "ComputeVmShutdownTask", + "dailyRecurrence": { + "time": "[parameters('autoShutdownTime')]" + }, + "timeZoneId": "[parameters('autoShutdownTimeZone')]", + "targetResourceId": "[resourceId('Microsoft.Compute/virtualMachines', parameters('virtualMachineName'))]" + }, + "dependsOn": [ + "[concat('Microsoft.Compute/virtualMachines/', parameters('virtualMachineName'))]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2021-04-01", + "name": "[concat(variables('virtualNetworkName'),'-UpdateDNS')]", + "dependsOn": [ + "[resourceId('Microsoft.Compute/virtualMachines/extensions', parameters('virtualMachineName'), 'ConfigureAzSHCIHost')]" + ], + "properties": { + "mode": "Incremental", + "templateLink": { + "uri": "[uri(variables('artifactsLocation'), concat('json/updatevnet.json'))]", + "contentVersion": "1.0.0.0" + }, + "parameters": { + "virtualNetworkName": { + "value": "[variables('virtualNetworkName')]" + }, + "virtualNetworkAddressRange": { + "value": "[variables('addressPrefix')]" + }, + "subnetName": { + "value": "[variables('subnetName')]" + }, + "subnetRange": { + "value": "[variables('subnetPrefix')]" + }, + "DNSServerAddress": { + "value": [ + "[variables('privateIPAddress')]" + ] + }, + "location": { + "value": "[resourceGroup().location]" + } + } + } + } + ], + "outputs": { + "adminUsername": { + "type": "string", + "value": "[parameters('adminUsername')]" + }, + "rdpPort": { + "type": "string", + "value": "[parameters('customRdpPort')]" + }, + "fqdn": { + "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))).dnsSettings.fqdn]", + "type": "string" + } + } +} \ No newline at end of file diff --git a/deployment/json/updatevnet.json b/deployment/json/updatevnet.json new file mode 100644 index 0000000..1d09efb --- /dev/null +++ b/deployment/json/updatevnet.json @@ -0,0 +1,68 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "virtualNetworkName": { + "type": "string", + "metadata": { + "description": "The name of the Virtual Network to Create" + } + }, + "virtualNetworkAddressRange": { + "type": "string", + "metadata": { + "description": "The address range of the new VNET in CIDR format" + } + }, + "subnetName": { + "type": "string", + "metadata": { + "description": "The name of the subnet created in the new VNET" + } + }, + "subnetRange": { + "type": "string", + "metadata": { + "description": "The address range of the subnet created in the new VNET" + } + }, + "DNSServerAddress": { + "type": "array", + "metadata": { + "description": "The DNS address(es) of the DNS Server(s) used by the VNET" + } + }, + "location": { + "type": "string", + "metadata": { + "description": "Location for all resources." + } + } + }, + "resources": [ + { + "type": "Microsoft.Network/virtualNetworks", + "name": "[parameters('virtualNetworkName')]", + "apiVersion": "2020-11-01", + "location": "[parameters('location')]", + "properties": { + "addressSpace": { + "addressPrefixes": [ + "[parameters('virtualNetworkAddressRange')]" + ] + }, + "dhcpOptions": { + "dnsServers": "[parameters('DNSServerAddress')]" + }, + "subnets": [ + { + "name": "[parameters('subnetName')]", + "properties": { + "addressPrefix": "[parameters('subnetRange')]" + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/deployment/json/vnet.json b/deployment/json/vnet.json new file mode 100644 index 0000000..6f9f9e5 --- /dev/null +++ b/deployment/json/vnet.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "virtualNetworkName": { + "type": "string", + "metadata": { + "description": "The name of the Virtual Network to Create" + } + }, + "virtualNetworkAddressRange": { + "type": "string", + "metadata": { + "description": "The address range of the new VNET in CIDR format" + } + }, + "subnetName": { + "type": "string", + "metadata": { + "description": "The name of the subnet created in the new VNET" + } + }, + "subnetRange": { + "type": "string", + "metadata": { + "description": "The address range of the subnet created in the new VNET" + } + }, + "location": { + "type": "string", + "metadata": { + "description": "Location for all resources." + } + } + }, + "resources": [ + { + "type": "Microsoft.Network/virtualNetworks", + "name": "[parameters('virtualNetworkName')]", + "apiVersion": "2020-11-01", + "location": "[parameters('location')]", + "properties": { + "addressSpace": { + "addressPrefixes": [ + "[parameters('virtualNetworkAddressRange')]" + ] + }, + "subnets": [ + { + "name": "[parameters('subnetName')]", + "properties": { + "addressPrefix": "[parameters('subnetRange')]" + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/deployment/media/Add-NetNatStaticMapping.png b/deployment/media/Add-NetNatStaticMapping.png new file mode 100644 index 0000000000000000000000000000000000000000..f49a8bf5d670ecacf877452f0ffdf45f5968df4f GIT binary patch literal 19259 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 literal 0 HcmV?d00001 diff --git a/deployment/media/Login-AzAccount.png b/deployment/media/Login-AzAccount.png new file mode 100644 index 0000000000000000000000000000000000000000..e6990854ab7e279fd7e9c2705679c429aa086983 GIT binary patch literal 15477 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aad_permissions.png b/deployment/media/aad_permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..878a07bc7f38ebd5c4c7907d5c9a9b11b3dae379 GIT binary patch literal 105836 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 literal 0 HcmV?d00001 diff --git a/deployment/media/access_web_app.png b/deployment/media/access_web_app.png new file mode 100644 index 0000000000000000000000000000000000000000..fd8d6d6b82e698be25497e5e4bb998e04cd4acd4 GIT binary patch literal 19909 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 literal 0 HcmV?d00001 diff --git a/deployment/media/add_cluster_method1.png b/deployment/media/add_cluster_method1.png new file mode 100644 index 0000000000000000000000000000000000000000..0587861e55082f7abb3319a2057afa5e57d75a9e GIT binary patch literal 11476 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%0A&f$PZwwu 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 Ruo4+UR#H&{BxW4^e*m))1!4dI literal 0 HcmV?d00001 diff --git a/deployment/media/add_feed.png b/deployment/media/add_feed.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf9934f932e1aed7905dcc42f0f8173a6cbae16 GIT binary patch literal 3262 zcmZuzXFMC)8%|QGHoZn$a<8;XsZAACwPS`DiAvDc-mA2=TB8x8wMT1@S|unkD=0<n zozh|N6*WRth2Zbr`|bYw;f(h@=XpQ8&pE&M2}kQAm>@6+003ap)>6L%0DwRzd)%2* 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 literal 0 HcmV?d00001 diff --git a/deployment/media/add_nodes_ga.png b/deployment/media/add_nodes_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..6e48eebd58436792a9a43ef19dc33fc796d0a9aa GIT binary patch literal 43104 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 H;{87Xurw+5 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_azure_reg.png b/deployment/media/aks_azure_reg.png new file mode 100644 index 0000000000000000000000000000000000000000..8ddafe1c927a1ee1e448a1ef50f28d1bcf4cae51 GIT binary patch literal 8317 zcmc(FcU%+Swr?<E{0RgQrAX)^9Yhc*p(#Z`hzNr8Py+%|B|%z3SGq`16cB`nbOZru z0fZpEsDOZULX*&mfaDFHbKg7n-Sa;0-1Gi;JDHj6wf0)G<~y^$YwtaIeA_^q;mn0I zAP|T_=cdLT5C{wgfoSfZ2KFGYbia4NfyU>K_H|H6FKh{@oJ6VXtAjx033P|Hv>?!l z(%ZL;H32!5N+m{t5O@*@6h#CoR1zKmI^K?De^VYS{%7rv9t2nbQal1Epr|M!0%%K& z!UF<O6ar5qQAtE1ASU5SBw&XCAplJjkw_&1O@IO%sDN42v11~jAmO8c58w;%f&k=E zfRh2h0)M=bK!6B=AVwjuSS+<OY>^rHbCF72ELvg?TVE_%2Vx{oR;Qs%wY61&qOEO; zN^2rfw~LXB%mRDESvICoO{6_4c^L0u>QOyOrS`4>9*V;jEsC}Q+r1_a(=0#={EF(^ zqf(cDS_mvA^bV)l0McrYw7z2vG0HTHN}bHI0rq5KR&`&LO(}^AL`lM<NmKx~z62Zm zWR?dp3ROy`W|<}cZB5Zcz}+5sZxU~F+<Iq=47j3hk$0$*r8e5=>d8_R2!Wtd_xrLx zUQ3-IrhdGZJ#!o;Le<72;ZO0fQMHLG9R|GoDSOvahpSUR0=NL!QNQ$D@M}u`Lha6O zy5QH-4ftOAn%qcUYHYiZJ$)hO>(cS*rjz}ex*OYU8_8ucKx4A4Uz4q0kF8%@*%I}F zUt2Qp&F)D)HlMa_oGy!LTWah{&Ytf6(zBi*uvEPKUy)s57NGtItbfCFF`;OslM3Jn z;Dm_kL*Vh$Kk$+Mzz1Ll0C$YqB!E*CI&1O|SX2)@2>=VgDWMNQ><?Ifkor41Bq|EH z`G2tZI|_T$)SWOL;F0~y^QM^(2n20C-e`y(Zyi7&E>j&1bz_Y6&sR}dFzx4&coZ6i zLOY>RCSu}dP<gDvD+ZLkeTL`UOPN#2aXQ-V7nA7u(~(mK?NcngU?LZqIRDb8SAnED z_hYZHRM9P=QXrs8sgN9$m|s};uCTDM314`>{qPGjKRkjdDGAK4=&h!q4UJyxpkd}x z;LQ<$X!y=yqvK&r1OHcL2G`<@8mbq)>`P*UR|(cSdz70QhPaFx8A-F3V3yx(n-0V0 z-5MRj1{MbKeMtFoAA=UmZ`m`PM!OXgIt{xf+Amof+LGbEp8I=cBxePz5;r}<e=ID> zDBL?F_k3c*@4e?AmHhXY6bS@*8R#}^gCM?0C0Tb1YLL;~c;M#W7mgmp=ng5|{-MoM z=;9eqZnJ+1wtzPUEE6b%=7KO!C$4mU4RQoHH*U$G^_47n+gjoBi{NNgF@*x~?2atl zuFiMuHSNlLF#dfdyhUVD_JK)%AxYvpy$~&L?~R<MM~w_6m|N-QDGBdXQHF6#Cr8R; zc{-hsLVLCR6$IjX!loleHVdR#cGB=)E<Eh_K8^C?{3_VcqF?oX!MIWM^Qja=!qebA zaTNM9SDj9(MvF{WKwnjUTuNi<B#j3-XUAAsvf6ecW?8D;KQL{C!I*EvsvKsWGF+@{ z6`GpQeXakqRp*u0nfpE>b@*=;Ujk*rt|f=RH;<kqA~8#zNBrCxLT31_b1Gx+Xi+RR zVhBM>;)u{;*BDRf`x^swo>+3s!SrP!O}=41$q)&F-0<Z+l(y=3T)guM%T{)FcM8;7 z0xL`3>T<;FBcqKDYU1w>SXqf73NA$WbSbD0_Dek%8#h+s^bA4srfE3(aoAn8F|ke( ziswNN%ZeufSF>mSvnSR;^wk=c0jaY(MZfCihwbTNlWLD*Ejk<e<bIxKf57+^?ZUL| z4>~)tnR;uPT3s0Eg?9TIqudOBB{oia!^c0f)$60i#j03e>Q}-DG=3i3j1<i1`33Aw z-H!jGUaR`$=Zqtcx#aIry*333NS>m<*4=jbkxk~eDtym~G+AEKWP<JwRTQS;jpOWs z>R~!iil9$K#{KGN(}E2ZzN!jM_57u_2O`5~9i9Bi!Kn`uBBb^3O6y}cOwMpO1)s00 zr>T=_@i~0ZiRsF_Qyi>f-QlNOm}x0mCGn6^@%4`@g*ge#LsGh0a=r6*OT{yYq`0nz zJFd;6pTfO(8yu5pID4xh52oAq%68xfaD8XDHCw!yDcba-SXisc7jC>`s^EzKQ6-08 zszddr3#ls)c?v$EJ0<WcJm=Rl<GgF4%HmI9H`Bxcs1M%0#25<}2Q3Zc>-}mkagbWu z-c~m3s`OENcV0%b%%K#w480W)I3lNg`+S|7amkMlpU>Cb%r#!~5>qf&?#Ol@9txDK z4Oo^CQ_8hjc_0^DQjhbEdYds{p1hkOA)i6e_ZMxB3MZyyc|3wU*2E2OTucUklj!L4 zx~#H25yiI8Nw2}`u5f!roeoln`|4BruH8i*yJ9vF*qN_23UOAPI{)E*wHf%W?)O(U zU_X(`d-3`m^|us_oxT-17T0nW_;%5BDd&M-J_NJs2v`l#c!1R%cjL3B)I?LhJ85s& zS}47UlFnU`kpb&>x7`sG?v`vf_&DoC*L$g-l&QPUSDvxT=b2@pqD|(Vd#~q>Fi}<< zL9flXQ3!$~sDV_l$SF#Hr=-Eeef6hOX$4A&_X&5qj9$cbCX}qHnc3F)h2-=+HL2q1 z=9G%g$2<@<ae6d;a`)#Q-jpA!*a%mZws#B6u5~sY209W3cdzPREorxy-_N;=kWBed z8*o9Q@Zl+Yc$lxG6Ib8DwxP~1&<g;w^f?fz?86<{H1o_=XV;6q^XEl&i(}kg1ZXNl zDJC0v>>o2jB;JqW#wj<ZWajL;AF0^%PA2<(v?8`dr)(B&J~Pif)B&3qTUWS+H0<W= z5vsP=woj!9b}8QWslC*$alvflo|&EcGnvBN0+Wm|#@>zDU(g~NN|~j__$K}8J)2P) zGE<$+80MX5+qY52jng*=l_fr8>|hGsF&sKqb}NN7LGF!}*_ze8HWt6;Fd23`Z2~OX z)8HL}Na^Ljq)1qs-$Q=edDVNU>GHk##<!}MN8X$FV!-4etpe5Hg9pzZn*EgkpX2)U zxadW4E*-PclKPvj6e-Kh2SM&U-3~A3jF#gzg%~am>2DzqZl0IBuYE!<SZ+v{^z>yY z=6u1MtT?fKbm)jaDsR_6f0AR}d=&nm*taok74#%`VO3t#dY`-g)30JwV~zI3oFtoD zWgK@!Qg13h7|B+&t}a!&_SGmv(s57LJXJBQXM=82ve-!~HEf*Q=@;m>?K>q@*43#J z_`@@Ua3{#rlSk%$MTTQHmoS$O#Qc(6V8Tr})!A67y-(j(EptCGTXcL&0?QCgpq}S$ zO=|Wr$&9|0C?j9AV3vY7f#B?jznEG6n>p^^&yN4TWi!{JM6bW-aT0wJJFJWjbmkMh zGO^%tR|gdy{IjU!mvzj7<L$sk>kzZi#ks4-+i9uFRkRaEvcj?w5IOC((VhY>;n6|d zrLfnUV{c{3uXx^v=;nJP&G(Cnnx+GCa^?w?&Q_Kz;*#`tfuJBQn6Mbvs?uk%N2ahT zfg~`CvqHbkQs(N<hZk1)ARk}#T1q#j4}5>cNiStNr;@W7+8Y_MjA?l9D+ycVYrTG6 z$c=z&ULWLxZkMNper$SlxhI7Eqp<H+fCG9_e?43AO-(iHS~maKt^4Hnj~O6)@>|mC zzm<#`{c=dV1}ZG8uCaOT<x<!xIcNd*U{0AEe3_89>%+#d3}<JX@1c={JRhG@%Wd(@ zW`w6KS~U<LL~aY^5UTgUSQA`6uxIefqbm)C{qJ|nM#=-TF^PWRsA&&sy`}@^^(X|5 z<wQDPIlC*t80ox+j9%<XQnt2H7a2dG@GY|XF`T#`PT-&?v3c%Crd)<3E)>vO^QU9V zbmMtU%dQ6$ub+0UQH2p4_qXU$an}X3L|zzLr7Ef9Ra9EZ9mlMQjH@rw26qmAd31>V z{`qY!4C3kTw23Kf@pSV8*}}^{GllYmbkq0_Qb3tWdps;I-bk4f0jDsr9eLnbA$Yo_ zU;C0o&g)qH-qekw59|x^5zw$Cb&KAJ+x!Xasn4xj8e41Z68-xOBfg~kF!YOiR?#*0 z-Rp@}Tu(>ZRiPlsXM-<I=fz|td)(hu)pLlw`fjQ8{MrnZa#3O;X2P%dI1DTcUk3fo zhSTR+!imWp7px}!%0P8yl~8ObTu=#1e>kB8&2BhUlkc~pJEavttHBY=idY5rA>Y2K zvCX0wnETp+Zd$efm@RB=H!cikzE&~)rFR~3-yWWtve0EtgXYZ}{TN8A^i--xv`FLQ z^9osR<DlwkwU3z|o<4DBTFXD<niHEdTWY7(;$3zxWfr;EAt>TrAT&V@!8hbdSUYEC z1+$H8n`ect7a0-_xakMZ#}+xT=#GS+B5i^l%{0%npX*Oevi`DUF5+&xYU*rx0Z(yN zR=Az2rL5OgmHg{w1=ytAV@_>|CdO*p;*5vyX=`g=-nbVc35e#*yN}-8%Hfo_wOa<x zWoVD01q%p5>|fB$%il=9hggr*8ut{^7Df;^UBI)aR(g^gM^9cIt=%2Svd=`LUX05K zJaktS%xjqaiJTpj7fg9O5u1Tc{bH~XR|7thA3AmZswh425@hwaweL^5@L#m>&#t91 z5I270#1PrHB%F7oY^COs*5Eg*SG{-hz#kUJz{a*RBWRu&y$f;u!dz4I$`Ty@rk2b6 zvHKq`m9#OSy~Fcg#@>yb5&7|m(bB$CcZ5h$hd<D>%`~_E##+20qBvCXP4AXBLDy5i zTj-fy!tKb6O@~NTSEODIyX5dE720QD=>k|8M(wiYeQVR^n+GJR7G9!9JH=6uO(W3% z+DxR9!gc16mDuW;M_S4@%$ySnnY1SB`IiekOM=qx)O@F1iWy$62>cA|o{pFCIf?M) zZO9o6nj1Vc__Ew9v<3DkR(LO6)%s1eR>YeZKDNKjVZrKeVatLpFYKTpF3>9_1Wkze zomW7{4x=@3+xi6~R{!d3;@{`Xf5q}7dg?Vl`_a^j2AWXKf7&}c0(LqQ=FA5P<%5`a z;E>(1V8#H70K94psN9-Y^YH35vKY#`S2-sCeOzGjphJ5)Bw<&1J)Nkswt>LRBnNtE zCxM&OJ8>H+QEc#9!DOzt?CzMH=H#ps_XV1bvUYs~Rc4>}>DDPdft_wQhHeAH!OZce z0Sjsyt0efIf8U<3Vf|EuRK-t*;ii!fe_F{xw@a*%bADcdJBPo!G(D)BQ|njtx@LEJ z>*E*&9E!?MAMN&8%o!?uGFm7ShAmqwIusZXcOS*Pg06g0*WGx^Y4b$2s0%aN<@MFH zzCze~XZd2Q0Y4;EIu0DYiqnr|I;7Y`=}AvEa8=tTr1I@hJXo(wGem%EStd=BP7x$i z#)K?ids2M4EGjH4Nc{U${xI*RN3cXI^<gO@%8yBbDb@uxrO|QeMo@jzmOQfbQNXA` za;v%@s5#D(TbDmw#TRr{En|)_#URfZ;P{n6oGq8}smG`2vesi*rwPaoB!c;eC#bF$ zd9NqpDHy&TB!?LXLw;;K(bIg!Rac&REE5mlbq;#3$iBU$mXV(|IXk9@#!Wm+EoOtS z`{5Kw>r@7Kn#s=<dYNM3^ZGILoJUZGlIPG^x$ubXoZ97lPu@1?z2<vuc2zME>s7<g z!Ezkeg~#?&`6iYuX(1(+#FHXi6@7!aLbuBt^zQoI&24TSJJ&EoB@dA&XugfLy*FSb zod&&AH||@8W)Pn?X0KsC;;k2p&IydsSYPsaH)-MqHAB@0Z??=>um9NdZ;{^&MqJGI zL}sKjEenyrJeAS={qvr-_yY9j#a5AV7J>F%=e%ib+XjU%4_tf8X?c>(ef=CN+(LD8 z;KfPp_~34%#~cr{DHI_U|1rGE@8?#xvj+qx=-6C)KGbr(RY+_<k;v8Ic*PsZD(_wS zG&@ty=_@XWvidV?>kHIq<!tw?c*ns@vbY2ZTMA>R-?DOqcyo-+@WKcelQ!aX<+aKr zi=uihD)+tR@NwzaDijS^6l%6j8Ta=d%vc-I2J7Lte35;(SI*XFY;|Ulx0)~OPl-X` zv=u<G^B`8bhPF7n@Yy{J$^DU7p8hZzll<-vURY@C@HCCy&g;nEHT)lNuzh#hIkk*; zdXLgi&)3Gb$$tAi?m4PwGVDEP3Z1)>0)~Nk)kLS7PUq(?U{Pt%5r-$H`H&ZU?wleN zAz@y~cVjC%k6-5wzj|WXFjt|MF)S(I0^saiEgb1HQ?z8EH^+7;$aw9V<vTtrD>pDb zRp(3xPVR2n$Q8n+4S!h>24M;{Zc6$BE4v~ASufAj4l`0jiqR{S{e~&*|B||OTMb$% zQg<;*AoM-!ljyIVxMkPuNU*T|fn#F819WfR=p5+%1n#?Khbz**oa+{hc8+keQ*y(f zPL8{Fcy=hYI0bxIs<F;p8q6cyg>+G}MkU(Arg37a5}S3x#H(IQSX6+!zkVziUC05` z*r(z~cYcWZGpiXgrFs2&u-E8P(a88|W^*4<o+o{U18|EjnJ`}I=+jfpCE0v640fpn zE^zkB(S)$+xFe+tCzAkkmM+liW!E`Xp3#A0_2y;&57H{ng+@<kLn{-(&52+M;F+IO zqf=m_SLnYEJ$d8*C|(bFs~_IX6ZmQhdYTWSf%$*t<-gXjRGwl@_QU4k$7@&*O{V`6 z#)vY6dv{$MbH5!3HN6GLO?_y66jL|$c~522kTRJY#0Xy~PY5_<$)sGI9MeDUy<SMF z_mOEqb%Ky8?H8?3yvoldN?^N8R*D~*1z;Z$uBpkN^P_$KYg?J*r5sE%osGj7XGuu8 z`yaIn5eIf{dpl%iHT%iAEnl0{EWUZ#H8qvE^6FPa&e+nMkO%0?tKBv-roK%fK@W^Z z>Fy+@jZ^L%mRHO<N)aDgZ*=Bhz7{6a*F^&)Bn#z@HhoRdGTbIno*&sRty#veOj}Bi z5WRBfl-vkN8t%0_FPughq{jX?o@4|fU23O^bmxgu;+%aLzCFd@N*fuuwN)3?d{QR{ zWud&q6#n|$&x-Dm@bk-7Jy(gG()_EEz%3q9Ah7o(jggBgXTM)DyWCtbv?RZtf6e~% zO=!Ji9UC`34v6a+uoPyhl}_f&WyqRb@1xkoxVj|{%{!~zhWA9&_&Pu1;?GrP6aBF- zhn~u>wl^%RJ0{;HH5#xyhk0`gyCm{+%)<w`V|L6#*Kv^?grBzvUK#$B&h9RH0A>ks z{ZC|Ace6pSCb(R`q31}`iznvINxi!)>e2!AdqJ6(<Lf6`9*e+g@VBu&=~BrQ0z@KP z#aF>{#Btf`%6?hf0V|XV8pLFEwwu2?crN$qU-7Wt>G-p#Ufg5V!dG8#GqYKgIrpsn zZIqu4PAkn<%E1}&6NC!1JEib9rt3`vPZ*$F24{BXpy%399@Lk3zcll->{`~P53w92 zC3*f<6EwFr6hElEgApqG7c>^b7!;%hjB%59rs(6r0jcI`+sx~hKU;A>_(_M+J6+3A z&&{E_B46wz=eiVPnLl7omE(z(P*ku5jY5C^^4a#Ppi){0`{0t52RS%YU`aU(Mqn1t z-oi{xKKqO_<D;dX{2S4&M)VE;MpAeK`Fm<g<G_su9kYbfTdD?W&Nuc&&7j@T|3y%U zS<4Xujm-~V>AC`i#NcIN()AS9wvIQzRP|F*ZWguWkIM?Zz~!NdDa*H6!IW%J3RuqY zodR+t^4zW*Tc?uUrF40K?*0P!q$$?EH7$TG!^f@Eo8Y8cb=8Z;2=lha?zyWo{Y7tN zYR%VbpeMyt=pCy5#)5pat808Gx0NtGGza{?CEnO3cAry@G4^xLl9dpEJuW@`to#XO zWS5@=miRD$tB+=S9}9CXSB8#|X?G_Q)4c#!?l8zFYk)ofKl9B$TaS*PplMuG;^&>_ zs@c-Bk$h4Y+`lL1btsm}gpwZMl0W)d>VN;NH}8pNE_p9>CM_3rd6-Oz)Q|O?Tk!bd zMNDh#M!;s<^%cDK7;U5QZ$i<*VEc~hvcB+<Twugl!qa}MLq6VFD&E%4cQ_$%Y(Wcc zM?WR+xpgh6nagu#jpw(Y7c8QFO1j3YTXrDSj(m2U=9E`x(yQyElS|z>V3SW)3SQSX z4Gu@Debo28NeLl4t|_{9WabH)l4u4=dV}#Ea`YN<%6=9KtG35b!5NCv0&L-QLXBH2 zlfO30Wp70*>ulFDS<gM5!y;TLj)vTj<-&zd8Y#@77*RMh6&&z<3Oe^V_{_tMeQ>wm zeV^CfZ{NZ?Xbl%vY{cWKa|p-ePuv$jf`!%=T)AD50TVp4&q#Rb3944-O*^%47S-9j zWN<C-;LY(JiA=Fw(E%>PP3&W3>m8TQ*3YWfk4iiyHuAFCXu1zvZdgN&p>v^auS|4} zUN^-4D=!HCm4W%c@!sK|x;5~GaEpdcGd3FdLITA?dH;;+{~>R-$1AP_<KyK5GcD*z zdr`=v7@y1+-KSB&a!S06O663+)2svkqdqjDr)fQ=X}hawv#{}+%%91?@oGsiwnXN; z@RPNIt2BK_Re0?Ei<F&7N{<C^i^uQXm_tG=FEGkZ0sl@}dm<!s9YR5iWgaSBJ1P;1 znTebX@Yg*&;!%s>01~wQ1;`^)sgaCKnar&{DYk~+U16=m;t~nNN?UR&_aw#D|B5~J z+knK#C>6_C<P~38X&K9C*`jX<U!6`M@MNkTEhcPi2!)*CIO=vxXa18iL3}EIUunQi z!|XT>A9#e6K;9D0yw_UKQAI$~TPl$CDyG|Gxu3FRHmNgG8ylwNa`5}mKPhfREHn9a zBdz}h2&?$!&>i+myd42C@UlVTZLFI-b_SkQvQEBKLh46qwuiVwoM?}eFfhvG7{erO z<=LRK1FHoh?7L4?I$nSrEqH9$YW~<j`yoyKBz&5fo#w{*b406Kp^|ctvhqV?yULH> zu8Jg%$g;gyB`lIRY@vs(s^4*D>HsijAZ{0oeR;YIpmqTbK0hBWVD%$cISn~^SxNF7 z*GKFfS6%Ij;@$P(1GtQ%rL35l_todxnhssXJWLBdhEJZT45kQk&==b;)~AR^X-fP2 zrwj$Tb^4bab(c)F&7g+Uz1Qf$=`{Iovr25Q0Lk>%S<IAMfw<^{-yPbnXMy3OG(xa9 z7HmO9YGrQNP=m(Ysas7{Qr-KOC8gUvXWHDn=bQ!AmEGN%!0F=p$`UoxyJM)8J?TL| zkPO!mp;-zdhY8qq)$XA|JRZ$EbC`Mp<qR7cs)Vt>3~N(D!F@Ez6*{vZRuv<LK)bz; z*OMjyyA~*5GuIcndCb?RvgSY#RaH@^XXg%C&Lx7~&1bRtWXei)khbgqjoWrZe{Ab| z)*CF$dB{7vPYUx>m6mL0EX=hYu5|mLR-^k8FsC@8`(r7m1kC5C=;-^pCkH)3f2l@X zSWO1Y^nNl_gWk%%3g!J45VJ*Rc_Cq88rzq6`8SS10D3mfp0RMj_g=Sn_5O#)FlR#_ zkTNcUfE+PXOao(!&oJ#T)eTe{blAMeJlu1To(1|?@<)xAZU4~M{&8ac-w;z&zg%jW z0(!6~Bs>w!5C5nA{9k%A`45)zyc!OQuc(k(o_PstdN1HF10ax&rh!Jub!6!O0EkZa Aga7~l literal 0 HcmV?d00001 diff --git a/deployment/media/aks_basics_arc.png b/deployment/media/aks_basics_arc.png new file mode 100644 index 0000000000000000000000000000000000000000..18c1750f5f941587f08a8bbcc45b0cf6defcf113 GIT binary patch literal 24460 zcmce;Wn5dq7bXlXv;|sdp+JE`TC@}^4nb0iyF<~G;u72?Y0(13tw10+#oZ+Zio3f@ za1Cy6`rm!`!|reQ!|uE9hy3Q=n>%x7=AJX>nRA|VgH@EIpW##DV_{)Ela-NB!@_!S zkA;O@`s4xTN*OFg6;oh4sY!prDjs;fg*m}77gH3&{1riPV}y%2$FrBwal*nPZ2R}a z?zH=Df`tWsD=Q(U;cmD$|ID4v&4=S^m>n<qwPAd~Zck%K<q*%@wMh&XOWU%9Fxs^S zZn*o=lUCfwU}jbz)~g~{QMoW)-qj0>Io2@#L}kSZQ7!QD>nWB_vOEcs2t-1!^pl*c zIN+1q+ZTB4Gm7Op(I4RnRr?1Jvpc%}uIR~~Dz|2U-bf$p&W=0U40<;xbB5_9mKuY2 zjaET6_rK%Z8U@CR7DjB$;RyCH5vIr@$N*pp8FC2_rif(!0mT$=44&U&ijVbgt}wTL za~4BC#GG#VZa&5oBe?&4MV1`ShTO=06UR1^ATri19;d64x0se&xiS#q*EQzenWLSo zE)cx{QT`ng#MO+^;PrA}TtyJ;9@_E0+$nxPtn5?mSfl8<@NBf|^!Z((6rv)atbl!b z!=r?<9y;kNzti1X=4Cy8Yut8u>msl7a0OVk%Zr1B^;w<E*}6&>IO-QL<Gx=sNqyD` znXRT4RfrH*KN)Q=WHU&fa784KFMp4sNPRz8)o~K-+Edi6gc(=iHwDH~)YRZ7AJ^#C z$Ab+SY83IYiQUtI3WYj5WrLWZ+K-^gZ(kQ^dOU4EaXp}<S*X$*u`QZ_t7I4shgt)l zYA5f1O)>4?F3r|N(}yOP+8?ZKdQ5+ba@$?l>aqB)&XuSSbst<yXHfpiHjk32q3pDZ zGZ3ut>!hq8F>dpaGoC)d&m5nc$}^syBNcSDaI{H43wbRRi;R1%=Nol@F=ox;>GDVk zO!z!)e6DqFky7dI4D<1XGs)^d&d@8@L5=F->M`eg+ho|rxov6mRY?CXPD?KLct3hx zPwm2QYh2BhA0`)}+(99Od5wmZo~N7G&uA{jR10`Pyje~O-e=I>A*=p4-lF;N;})j* zb~V2z`O7h^!~O+5>jchnWb?2u=LOCaWqZeYrKhh%(9?Tbbv6`*eq|6{=~?GOy;@o! z*WFU)ioK*+ODBJd*YlLFT70f`Te}};<A3_ZR~tC=W=4G?EGj#h_Hr!l(|+JGRech3 z>|K#IhAZS+xjs+fL57)UEo^Go6~(onR&ui#V_--CD;P&_Y;|q&O!+YYyC*_#er;H< zxHJ>f$-k+4$<Fmei1%@=p>b3(#t93D;z?7g%_$Kh$_pSDK~302$(h1fGzc~?kD%tx zjs|Utkr8T!%xqMrtk0s>?eErZ_SS8X1&-3L=!Q9zv>j5)FS2b?agw~z#$hImkLPzZ zOLV;Mv~fior_TOf?FLz}#D-m64qL0EWOWt_GUI&7WOrFy90{&*yFhB^P*nyK3ymA4 z^NH%OD1XOoav!O8xR|&X<{NJQeqh+8>{!fna9=nM-7#@~N{EH^rRvbA;Bm_f&Wm1< zOx;q<W8QY7PK|Op{TV^eA%`><;#R-ym?A$!WlLy*`<R4^bGGc{-|+TQn(No$0X7Xc z6~wvrG0F?jxa@t=H<t4*|6YO7W1@ISrn74og_^FFsUHQC-{|}RVXYq5O1Cs1<$j-S zQa_{486EW3CExg&vDXW-c{9lrwL6)?oA14B{Y5mGUXczB=bo1#I(D<3h4%e?+U4?k zdHk)L^2E&Dkex>7`AwX@ZN*8&xJd7fH(E2UsllYrXf($x)7Fn1;klzT<GCS;JYMA8 zS_pKa2q{2{#>l^q8$RJX8Ou>zXgbZO_Y`k9j;^*b+OjDQB2r<iD-RPN1#-uNI9>(K zR5IIoO9|>lACO;!(AM2;6p}YtERn<3>q{Ko^LiH|>^Oh!N!A7i?NBR+B3P2!nKrPo zmd3UOuPnzH?W($8xoMlta}-!AgonxOR$$~bco@!j#!=8|RaW}bj(oph@N30rM$MA! zg)2U5Rk_c3-+Z*8lV_#9<yN2&bkn0`#-W>`p`?Dpk;-a&FmF~ABaTcNlbfg^G?W@} zIB5Rr{&oNI?daV&zjsxioy-_U7jENL)XJ3YR29z}8&kL(2g`r?a~y1C4wgBhrY{o{ zr^j!dN1|Dh`=_U~J?R>4bEY?+Y<yK!_?_vfJ$G!8X;`4R51=yC`bKGkxO#j0H2F!r zgV=K8TFX0(lB(x+ZlY8mYJ=@Iv+6(K_0xv0s#Lx@Ru2UI3Anl|8=;1m?;Qu<?v*Lq zPo?G!@CjU(>AE1DQXI-p@VzS2mBS9kGfdJ|5p$ysE=5~SgLvfustq>Rfn{ag;+|TY zQ%$3*vTW?VIsMR|DniaBifmQob$bnHVpLnU2<hd<c7T-2U}`E~mRq6a3-t<SP6H>` zj8*0zI~qY>u3tCXdLyB*vropJc9JZ!b>^>fYcRsoUoIBFzHwviavC%9qJ^|xSmkI9 z?(;j(&mdR`_6JEeQv*pxe4*nx(w?in7#%M|SjpAeSEEEnz5Cjy-Z%GOkTvL^z9xGz z(i-0y(Sc`BI@Z&{O2ltcLm26Y_(?WjZ5#v%X8?}ZB}Ug@=FdO&9W3vJ%)Mb-?#5Up z0iDgw(O%3V4)H`9E|)=^wHNBXN!SdM?+IMyZ7YI*>!YCM_3Ezf<$NyV1K=gvS?Kcd z@%Mv?v-69HmwfA;J0~?@So;v+bw)A-Y2Q6WI=QI!lj`ec)1blqmbP^AKLOcygidR7 zwNE!%!%Afz$QQA)A#QDJ-*QafcGr33o^O_C+bnVmop<-P<)-n~<r)Wk6&jaqxSTF< z1%DL;SNVB)+^2W1rzl|h`x%#_-tslh&Rp3v=k=G*6!*yl7<((0b8vrxYduk>s|g}O z?j;Gc*J2EmOyH(@3XrGFyqw1HxrmUca1Pk2$++>e1!(l2A$|+L)Xm+F>-*B3BQ8{2 zn++@@NSMQ1r*BCtIb~_M&7V)WNRa4l??Awll1u2&m=-_dcl^h`OMW=}XVLTg{wEe4 z^WXm-6!`zLBKqa+7)zp3+jtIp-WXf5e8^vRK}+K672blj8G~<e5*&h!#S;}V<;g4a zVS45qVe|)$6X_cJb}4cD*WIz&Kd9BT2YZAS^?N;is=Y#>$E$3-+Gl||8!n#pzpC0D zvbx+CHr^OsLy57phPxLPhxNQmHB$9LuRj4dipw%5bf*Eu+wsfVG6v!K^F(<pM(f&z zIt8BM;@smio=;)+8w6NOS--U(NgZ2rp}$wrBZQ_M24!1YlpVe{Hj1_(NQ0p!hw?bz zg_v+vbDr&%U37^SzF{@t#W9`#HJ(>068o&c3cM0(&C0Cl;AGn=Skf=lKIaHwfIq-i zqI#8hB<E+VYTi#=9j8UTwyI#nG)JqXX*4Ln(vRCa=Mu*DvDMj<KV8P#PP|Mfr9WXP zD@U&elE+%3W1yDc$(k3TR7d@U+X*+$v-X{u{AaJpo_QN1yTsWn#9T9U-+OM`g2)Ar zLHF!Uu3ns_-S>hg8!3#fd^7U?xX!XB$<pl;lkyx7;oUy?t&Q~(EW`C}`bK;;p-@kS zwh4w5y!eKceUY+<ngg&gp>(1ICw%*zsN>}%e*=1>@|a>5OXc6hDbJjww)b{9a-YUG zCPsb#z{W@w3=wYaegV-Uugm@&kk#L>GkYFX263v}BzV)4$N%o7cGLt3ds)4JV7aL? z^_+Htx}FWugBkz+=j^Z8J_^#Z%uj#Ls!BVF`g!O3rN7N4Je-vKC>yS2Y^_dw^RoQ% zlZTlJ*Ke-h!<|JA8Ke0X%+A4NBUuZSAP1J`x3P~p8}UTR`9QoHl+Icz!%0(rXi!}` z`F>naH9}oQA?zTo=UQTe8bxVal^&fp&s0l1oTBAOJ&m~Vt}=LCZ0r3ycI|i++2oWS zi_{tBk)cCUj}slgpIM^)1L7EXe!bI!Z?J8|)#*^2tf9Pzz}&i80B10J@kp92+4M?c z-$!vJMX4ItvDCJ8!3gk?GPpn`vqt$Fd4S}$-~0lD1BY)Gljw*Es$$sEEQ@v!XxA<Z zluW9U8v5?I)=qVwzhBO)-#u+1J15Vm_pUy(^BA8BH7SuWegwvGbyjrO@`11oRTxla z+-iYJ>YunJOFNg?1sh7yBNJ0Jl|5g)K!%RI+&g9w>?T{Z-(}%(-Ra!e&1#5+Dw+K) zu}dIzuJIdSY%&wl@>RaXo#d1`y3p1=r>0xp#}%x%3Fk|pDl>*nb%q4Fv-!HEy41=` za_SX2^+t9Th<M}<vv2)*kugEb(m&&B?r=>oK1m>K*}k$6G0)djAS#H_i0hD^OB2aw zBRwv{iqxK7(uk)sN*r@LP@EEYOvX-+`c3S%?^3tokd}F53KQHHZ(N`o;u9rlMDF}P zudEtPxEvA?(5mZW#AXX6t{i2IUeIF9)8NtT)St5wAU(=bf0J%3#-%J_^;FM-BWb8Q z#5%X=8-jt|S{jrw|Ky~Ge19g7&&V*zF%*|z#w$w2$FVw`;V9I%>ItJlWHRGihyWs{ ztm&7d-j9iw-BgxymUOHm3;Gg{K6~x0xSTUuLt6^YvQx}2#wa$-Q=BI3YyZfitC)23 zI0Z8W9y$r-%<zS)tFK%!7Jcyw9?(g#J}6R0=((uz@hiip*2PdM%%moEcFJ{m5Z<6r z3o(Uc+Ukj{keO|V3ds=r@4uS!KQNhB$QDoI3&b2XS<8p>ZH!s^o@ImrQC}%(=e1Z1 z>7ondU2H|&Bp=#-)q9kyW=LF((vpjwT$dOYa>ng|#tWEt!<>(?0!S+Alfr<H)A$DB zq8$Eswv`jE)57F&wq64Qr>Skh<#pjdxXU;x>Q^@f-}X6w)eCpamCD<eGR}d_JJqEp zO0}6?wflq?bCi6n?FpXYQ+sDgcUq<?G|BlV)a1{^VVc!SPiNy3;#7jW>vs-e#QvAp z+p!tQV&BH_O<ijSgX%yQK|NIT62t1xet#IPt3gUNBQZh~G5e`XZKNza4m!@J3AW+z zo1}Iye7lb?wb<7Z{g>Z4_rje1`3b(_)Rp}1kcLP2W0mXc3SL{EhLSI{KuPnqNgJYr zA6Yi?yRUYtM%1YI7NV)jN=W(3uEUE-+aYBFdsU3PJivBpfp}uR2~*gxrOu#u=LT(4 zbDr<AF&Xvki&K2?0TNwHL;zgu6uSCb)T%isoF)6#AXS_Bu6@75v+&xU^MJ)KoiiAG zO}zN)=|uMjpBo_&5RjK%`O_M6gx4PYhiTI{<I|=nVghHq&a*V(%Q%{QS{e5hWgBkv z0`qh*Zrkk*Q&+U7cSlSG1AEkxzncwYb=9YEfVjN<$Wfnw<vd^AXEK+AaQwCjkc(`R z&bZLFn418526en6N07@73{{XAw$Ok-l}*RbaI(7rrh29H2SPfVFSIrpGOlJV{{jR& zYx?@VGCZfgzP<!H;CFtvy%<&A9W|3g6x(X;af5HzS3p6n)|oHwqhek=bw(PvaiB&8 zLu|Y_SciW#(pe^G27B<2v~*{J;3<<If|dsYUiyD>@hThPlI48e#u0E$_AJ#{D@|L( zjvoB!`<crcJB498)X(u;GV)O0+4fOK9$_w(>a9x%qOVIcPk!@13(`zNEeFM|Q>|96 zIqe0BgWzl})zw2qy(hj1_L6$T8V`wtD<zpvY;*cxuZZm0lA(P)kY&(DS47P-EQhdg z_6A&-kFq<imp7ivV0^7{)>jC}=I?An@op*yL6(Kf6*`t%;w`t_VUMLv1Js7g899@p zot{FCUptfUof)Cw+mtfph?3hlXnj5Ka#*>ExbfO}@|U0S`3NTyjP;yhp)fp5BL6AN zie$>eFuX9{f|hHb0~1HdN}1dRWjrW5rMGttFJTmKLiRlF4M~}=kCNWviguc`0lymD z{{h#V7rV){yj3O5$Y)#1nFGl66+;}nK}kKwruT72&_4&#38Zq{FC%OM*e>T%<j<L8 zU8X6E*KFnux#}x5C}NaV{h1vKDr{cgsSpfwDJN(fM9d0X;ey+Zc)P3U8-HAp|3~N@ zO4jN5u-1@g^#^2MC(k9cORweM2@KGiI5~FiznTr<Ef}v>kS$4H3)?&(N~l<Ym^v?( zHM0G3$Jzg{Gjm-*JP&47CQ6qi()(%nikgM~T4b7MWU$%+VMr9rbme={*&P9O6r|vd zYvJVBFW|Tl@y}a}pVHpw^xHLFa7Sk;c@(R}FeLgD>Hp=A?;l23B(<8uRyq|fG=+@; z?W*X6P{R3;t{DfWTcZ};w_9T|&Gols;O*pRoE2-~=!{vZkT{h$Be|S*t<+mpAc%{O zS(@t7LdSg+&GkPm$xJpXeH&*QN^+AEnN@8o(e4^@UdjpMa>#}*=%xp8gXgOQGv%w< zIVf7Sb^82Uh=Rc>>!W0IA8G6B=Cut5XN76&nxSl$W@cmhbD_WO%1VZ&ijZrBY$1!E zy=B98+Zy)CRwmE=wLcs&WOY)=RTQ_I=y`U&@(?4^XsYJd8L@r`rIR`f>eV^g4CR<| zL+hzJ_ez{Ljs6g{M;Bk;W!TMY^_8uWtuC()SPZlxknux|thPZl3xvVF9`*5T;x+O5 z_fO?5wSq1y)|t@9dZ_pXoKyU!%E=kN4BOFSw>s%%lByg-e)NroBhz!O65{O*yn}7* z37ppg6SN_PT6^^f7v&B}?{ZZJ^H>|B1>d%{Jryry6n32EziPrOjXz(wV|`}C+|DWi z5?Ly^G35dJEDPOE)2>GNK1L=?;Y_cfDd(gvk2I-wH{CLe9_^99Nam6N=hy-wSr>oG z*q8dqG2lDv32x4-YYfu=Upws*cwgNfnmfhZ9Z=_iVb&X0*EUl2JymWExHrPm1(ORv zVXrYY<)@Q^S_eDwHOUn<<{h@mhH)|06x3R3Dllao6y_01shZ)?ZHIfDe9&bJxu+Yz zfpA;;643Tqbo+)|K#7?s)!NBNP{WQO>%k?9TQ%eHtv94?cm~d2xwo~Q9*2j#at811 za|c!5X1R84c)5aC$L%Z>hkEwmfHSG$h(*fY;YP2|e);}vPqDB{ffLJ#CA&J}3o*+` zI$P1tA__s5xwC4(djQ%h)7D*&k=<vxZ_Y1w=?iRAX3JMw@oB0~Qs~c^)1|qUVm4sh ze6#81VGPUJy=%pN@0wk+eGm##;qh<Bo!PnBIUv>TrX8{glO-6PXMpSG?QqGh2e(A$ z-ft>6)qz81Z|{o*%S+w?AHMGwmo{g2A9tT1AUf%1GOva>Ap1cAajU7gJHp5|W)jd5 zA^+odoSu$hhn9t3hE`POIlQbHjO+t|8_$|)8+@!U?VY%~R$o31JxTlF6~5IR0xAfb zxO|$lcuAAQcv^>ueLT2+xV{en^6upQx!x50Y%M544t{Gl3o&=OaT*e6sa5JbSk&0} zZaoPHG@J|=@Oxgv_(MxXa4};ksp7egC|nmbpD>%-+JxWT&whE4nU$XBk(}OV3JW{| zk^&RI_AMT}Eto^oMx79e)b;C86D@)VZ9$b!voGWUiC2e(ZtXUgX??1xEO!GX7mrPm zkBa*_b|yv{`}klM?|z%#4aI6L>_0XIMT{bTe3&na3^1)5W--AfEop^AhR)Oo4YQ`* z3H;k3e*W26ccrae^|cVTU|oeN+m&f)q+pHl;M`o9IU7cTmR_b$Wg)o1>w@>lIFry- z(-Mu<;iRjzE`{1}@d^shwum`-#@Fvh)p_skU-yvr7>Wpcj2rNI#lyCU!1HQz&F!mi z$(qo)s~HFaL+)k+#%iSN``0``w;Q?Mioz2i^XbH@U0lhc#{P6V2G~vB>L&(=-=gm4 z1gINP=hIdPAySu0&n2dH&ik3nUEEdjzhDjeRU<uy+4$C_#J$`FcK0~s_(3xKEaxnc zG;n96(aXIxdFKF_YqEGfaTvC6*JRg)w9m}OC>|W>BLNZ@M7@?_XYv!f0X1b3G}^Eq z{N=o4C`RH9BtDC0%_e`j<L)S8_sYa(U@IHsJv>N2pd`VC-tOlcXB5z>s1Y=lZCX~h z15x};m9|z#Tz3yGvDl3JEd=ftC<r(xxGiH`3t?@BmbAioJnl98PWPO8uYkJAUcevs z^wmxrcy4@8AWd(6hUNn-JljeP5{H5s&sJtSnb98gqF#3Ng#X+nq*^QasBBs|z2n<R zbCedEN2g?fO@C=TSvt9&scH8l+l6LrNgj5Qfyn02Tn;rjqhZ@$SLUlaGvkfknT}r( zeSeX3gHFLi;2}$-9Pl{CKdgh9%biL@i^2CL*<U2`mDf49oDOFNJ^vmdNa!7G5^m}$ zXgGERRjHb|`8@j%G&fSqF@F1R>gILB%9)&W;-bPMtME-)VahReVU3bF%mzK-vg97q zqLbOaSIqvKAUI(`tsi@^iL=RW(H&mex}cjrhy<FpDy}I^8<*l{{1U&^w;)1j(8Ck~ zn10gVIjbC#*k1>EeKM{8KydFgsnqg{+H1KFeg1X3FLj)c^<@{h&S~a;4YOYUvCN6s zG&eKp1E4TFd3n<&GbRk`)1Z7RS~`xw4({{Cr$=U#uEC1z{5<Ma#vI!3NM0B;pQ|Ws z-ej#o%MFx1#G$#;7;Mtj?!NR5Z=VixgXIk$I{&8e=F4}uALS!mDR7#hD?N0wDnm71 zRHgtVUC>OG+3w8koNkZxvIO-Grhw;)N<lBug9T3+*Lu<qseF>$v~Pu@i2gZ%;D%Rq z`{q`2R28Al+skQ+)dC_QO~4p#;&&?tD9}Se(wLz~dYKsfX0N+*kvma09mx%*RCYI9 zi`nxAvNqDx72L#?FfZPgINEO79;l)E$iWo-lW1q?ib$+T!9GHp5^XpN-Ir~K{HA+Q zQ4n!|<ta$8q2EA9P6S~#Or*xY68EW4qpn7IR9cqAQP;w(uX8r!J!lg|@D{krz&9~S zN0h#n=&~}>E5cL628emBr|jbVw`gtc{_R6zhi6&3C;Q8W>@<t<DT{8{hT@oz3jWb= z0+GVZO;nyaIls@Loy{XHgS&AKc!QaTwiRZ~g?Kw0|DsM<0xz1R|HY)Rav$PDwN|eG zIj*oKi2e`aRG9kzm%Lih>3Rj@BNX49uU5#B?vn;?)Wkdu2KwGd?Fk01iDuuRMllcm zB*nc&f7^VlwsX`8K%z(FIT{aJ$&nZBp8h!!B4(hQ!?ydI!F%teKi?|`MfJGFIZ9=* zzl4dSALgCaz^-eY;W>UsvkPZ@@*(wm)wA!~`uP{VyBQKb6FUbe;$v9@G5|6hKqc6= zI^wEFyZP%$H}q5+cDh|q!u}GUj|lHyYX%?D51CIdRwIzRrW{_oWt}!qW^;tk8C`_1 z<Ajd+w6OCZM%-_wzP<qOjh$Gbi^F&X$Z=Gh?{UGW!GWotzkLoi_3jZuU^L=B9%|`p z2Kk=Wr}5W}c#P!+C1FuJQ_0}7Z1vtHIatOp+Fy>fg8X)8E^Gd@R5p3sXg0pNYrFT+ zft{a43f`;<#14%0S@l)|G|>Ee(O`gi;@-9hW^k4-O9Q;x0o@;_a4a6W+O@F=CsyOy ztN9#-f-%!YFi)U<w}bYvyZ)O3gB=WaLa$hFM{xSpGT6=<Q-s`__gzXFwsMkfM3r)? zmJPrb)eru~0Jl0<0wp<4;F8IqpZiQ2Cn!RFevYXnq*ipTHZbX-7!A}ol4E00Hcru( zc~@yCN&^w<GZ^O}7S`2}HM*_y?E9kwh(vlB5O$<e;qU@ilKU2i`&73{zgSzzDj~Vb zsu>PQ+|ASry1$!FZdw(3j5s<V2mF09WL3LU++cXKLO%Nwb=%eyvD<VBhIEJpS9X~R z+x5n?X$+aY$%n+8{a#c|VpFQw=*ezzIqM|HDijlu0-bh8-M~-GwVG=Sk=Dx3@S!1@ znUW>CLLSRRk3j)PpXxMrd^#KV4D=$Pu+gBVK7>Kduvag|;_cmpTdHyBk_pgxGZOk# z&u6pbpeB!SKO>aA-a>GAkiU2~l6ldg_UbH5*g|e}5&w}L^hP^LhA$pz8JtnI+{xcO zN@n1?Y9tRi3EN?nW;_YD`%GDvX%kmH?x9u%8KGe_kJ*sU4cs*#qp*z|{nA4e4sY2G zN5;4A%BIJv1CPn4Mi{WaP;atb<xR@1f7*TGRLgRB{+vr+y+$Mm@y?GIy6`3U#Xk6J zjD_bH6EicDH}!~gt4H#NmO~};)AH^6;Q|-TCKUl6ZXD#Ev(w+km@f0IQx<F04RY<A zi`KL75Z|mdHB#N7Rqk^6Z#!B6VWQ_L2f&@dMsw&99jMGipl*h6+zk}zp1xlL@Se*N zK4>N25OzOI>qlp<--_M!v=4$Rrhw3klZ3k#s*(y4_{rkM<f6AqpjyP@5%~Vifz*fl z_5S-#ClDl*-E;7x0+xi>cry9@)&(u<vSxb`xlRqf<786bj6t4o0HV;V33I9UepBie zEOs8lgXMgdd<o~<VVho&3)X(8c^(U|iZ1iu3=@=+idKLR89s7FY4U3(Nflix0T0L1 zoS`Ov$`1!H1Om<9!{JY`CUR3V5N4U8u@wd(p>DXTDe(vnty>YCJ^l9!IJt@*%Xw)d zY5VpT()6e_i+e7{I)VOCAN3~UeaDUy%r4<(Z0Pxc^<2#Lr9-|r`{Q5iW|>~hcBOPY zmRc;YZ-$h(pTgX+3<&H+4A@`)qOi0_be>e^wCtCErna{859*)?{`3bac`OKB>-E&V zUR!KBshACiZUzkC6f&cor#0-FZ&C}}YxjTk2iCy0Mh_Os->yQYuJ#L9LfxSEzn|Ve z)jvyjYtrCuJc0mv$Eb{coD?H(Lca{#!Im+THnM2-qQZTxL-{A{W+yu|Pw9B1_x_L$ zCZZ{{dwWqLdX;`}0g2)_P{02SB0nnvaEApd1{@3efK5XseWcApSMT(~780U<Fndp` z=af%!ewDYgu(P6lw@1W3Jdnk+mK8Bdi1Tj>UBl6nT66n>z8RZ_e;0!<gr49F1p4}f zBjQ{o)O0e_+kijs{8zk%|GwNU^%UooJX71ttx2lNXKIN+GuBrc=B;fs{1t7a%`E>l zq46mB6_Iom<f*v@E9D)|dLB6+Uhcx#-Yii!608z%Vpv(*5_+30886EYsoTs5wPF13 zHGYz?(4<Jh9eOXC@XR=&?>pd8?x=5t2E>o&5+29E(fw>j<M*&Y<mD~DwW?G*(am8{ z?9F()SWS`UXtk`@STAGP_+96#1IyOoC6y0Ll+;<lF9+8HZQlPmIRAo@*c9OqdN*T^ zD@KM@XxDUWDI@eF92BAT?b?Bmrc?ISS0MIFSAR~jPByWN(LzFPN3pp|9tz)MNpVJe zsPB}FQjd$x`x)!6xpl6U)cMkn!Di~zbCQpVX#Op-kd41=&=cdtXLiSraS}LXPCCJp z85{0fVX;&7Xw8y|_5$nwNI5fd9=M<gg!ktD_I>_?4)Ntr)xB6!7gg$1<euC?ItJcv zK@cntg$8u8&Ek{|O`R?eZGc4hO!`zWBk1xsJ4@Z|&9YVt)!ZsM@Iw#XtDd3XQ8+oc zer?IC^)yZ6+=u%*whArORj;;`{Ecur>WU!gz|B2-EllfAlwU|e4)#8xi|_|*P%bo| zMz}VawPj46$z#@5E)N<~kJ}xv9XC@k^crAzbs1Fb;n&aTRm)kk{0wBrRH4A`X4xyE zZsu5b?~~){H9A=5zV_Iyc*F$+Nv@Rcoyzh&W;S{q2YPUT?A(ILVk=Ch8%V;EoS!nR zAD1yrTJXQPyOnVN`A=01?^m*J@xjx^4__NEyptxpbhv#$*rC0ME-k<t23ud{CPj9= zkEU<&#gT{|A`_J1c^g10xyd2Ilrg--MEtB9%cID!WXg2ZH+kYv$;{fY4-vedRDBxg zhmaZT%srbKKuY!miP6I;F+gIv26?+TYunJjA#!j}BU*FTP;!5cJX}E`Tps;5E0}E8 zd<ni=2L}cPLGJ$6MfLC(TMM0>f){pSJiDE+)4Ox_yNG$=Vv^{cpyr!}^PRW>lRJ69 z^46|isQCRNtiDBb`_%rlW^uH$hA1_1K(Ri{)Mmt!f%`*rM02+!#>d8Vx%<+Ij?|+~ z$PAABWuc1Na;+Qby!2|{M%_wZn5$F(`7$8bf38f7$*}T{MiF=D-HO5LL>joqMxwIF zX>32eg^*X=k!S~^`^vMOF_!y!h<w*K<{6;DuV;o=yz}7VcfzInEnv$qA<(=wLld_h zZ#*ryXf+7A1cPyDzS8nKPVrX+f=HX_bN6gsa!k<k8-I9C#Tbv;=z$us@sP7RZLf_Q zFMlZZD(~xlIUyHpRE1TVIwbV#ycCEV`5t^dGkJFraeq+&zRmAv^17Z~G<+Yoa2#JV zB~1Sh|G2#M!$f2ATrl8D-{*AvA3!RqS+J6&wr#%LK#88$2`HUENq&hnLGbhTW4_4c zT1<kW=hh_(agRZN7Z^J`67go<WzqnnPQsq(&8G7OFAS*T9u!vpe?i@<wfz=`f0Z?- z$UiR;WG?b)w2-C(e1A1rvSvEK?Dr4Ok^NU*mj3zwZ;@J)%?Yb2=SNFC9VJfpQclqw zC9wKcfM;J9Yo>m*ctyS4^X}EPpK_iYxOuuWj3&TB=6AbikurqH7z4}Pq5uJX?s@%c ziH1)#-%b?|8V+mXMkrIP62T;kf;-D=E<(ipw($0-#uu@+Ro2`_>P%8zzeiO^GOWA% z$N6C{m#WYkJY%Zf%}UnKMof9S-_%<cSi6NtzKwRStT>3;U$BnD$PdM9y=pRlHVX2T zytWnaTU%-9O4sBLXsxSefC^eGGHof%3<<F>zn=e<oOm!>#a}XWA~$ZL3L_(jq*~_y zs*TzLpWYv4(W`Ja+2y8;Tdv#kG>opO1uXhkj;GGkRMAb)noq#7yUk4A!{bKuMOnMf zp~io^X9;@uD>oy@z6A5-jLw|LnaoP@k%8Rq{8(doP0)>!-CqH5rFje&I}Fop{pP1z z;$G`mI}uINo=|hFLgUT|5R0_;ol#>@?j#6F@E|^p?5L$9f{<*_Jx%&y7=cOav3h(p z9-R~X6}|imOF8QyLCXjkEz+^}OP-k67#_w^ID-v0e5L*B%X+qLQGB(S3<*UE*{#i# z4EB(eu6Vd#p;*oIH}F7L;X;-gNLD+>U)mfg4j0qGtH0dCEz=&V)UpH-%DP1tYJ40q z!HWXYwy(;HHsBU6PpvGwP7oHpS>UM-Ub{R-@a_c_X9*kl^20l8+@WQk8@rGc`P2J* z9Yie1aIAtp!)}Ac=UBPH=BXYb5$Bx|HGoqccbl9V|JO#R-{{2YdEQ#aYM0M0J&B@x z$FYd3E+uC#f=(NCeO1PIi>LEPz<Q{3MM1(*54$;GS9q15DPlr)0~IxMOXlmxWQVhW z@7#H!78rq`yx5F*Eh}sP=CojKZUTQihs58j!1|*w>{%^Rze>X-$gG(69Ub)(S~aD$ zc4%)jXbDyNc)5g=$>BM3dp74~Fj`kqen<Ql@d{7fCBZ5e#TEl^fm2_~Mk*VXTY@&c zM$KB)uz`zI7}8jM_7g&XRw+5-rY#7hvk`T_#Gx=b5%jG;wM@tBe_XnMxbuq!xJZbV zi^xTIMiX9P-ey4%R5Z}Oe1Gf~AYyo|=Ns{Xt+!i8kpJLj9qUgJwqQM_50ND!U{H2D zLrKQWW6+YCiy`Q_2l;XT3XQF5&kzyENyW^tK8!x)pt4Z&3rT#7<4_ZORFWVX@31kv z)&xCN=dkLODo)}k5T}`ypB4W^C%sfKC5m)|cPTO|;Ybl!pjW#()CZ|?rqUDKuNHor z6m{TYki`sXvs4{1`NU|d88G%Sn?a1+QRjS^gSd~x5}Y8DznH|>zWT`bF|7YnG^Ns+ z^p)AH#%t7%xN7ZC+eWxybYqynZo0YRfoXeN_~w<M^;U7IMmmeM_4e8t)p$#r%yFBh zV>|ktTOh%MLh-ZXux2VOC1nC-QHL9yv%ZSKp%y<vx>%VKpXsU{Lc{azXt@J?(HR+c z`x^m<p|?K>v79T@;Wxc&bTLVYqx6yRswAm6d&L_Who=lOZ|g1T+ejQ0*4_*24qP%2 zN0xq*QH0MADh4nh`*ygD6aAzIjL+e5*Jhn6;hq9G-e=RRbHqfn_AWrzv|*yC!ytLx zP)~B6RuWf$lI2i`^_$y-TDgLOi#C$-tIByE5P!)aE@_(HuaqMZ(^WzX@wun>T|DzA z)b}&56XK#N@US;kYZAy-Xmq3*WOHwD@?-$?k4Bv9&rcrDex!NnHc8{|O9M#<n|Fa} zf#i=XKlRh{GtLI{lLm+mZpR8k(7mgoRPQ!D2v;{zf>f3bN4@ghl!yHjU9cs*x*9<5 zt3FjGi`m|dEGiL?*IL~KZHv`syI6(NXJ*e92>-<u9_P1TZhf5~#+ryg+@d){yi+|k zEbE8ABcSeXgTsSTB4%7r<t`aKYP)xQOCQDV7B=AUILDE6&5)sVUV)D1P!iLNqBUf4 z){n6)J5IxQozVC14n&gDj=j68AGmh>pqkh;=gc$)IX_P*90P*3g%SvQM9h~~jx!^; zT239w64Qi<!76)XmlhY|wRW*VL@8Y8wjfo}k?D@e5!zoF#j@NtuXtERHW+sk$gTSu z4c4*VV?VbOFOmvhZ49desKs)r)4_vf#rD2cwGla%uvu3)Ds#h?eX+NMLB|ygb(MB< zJ&sUlEQ2n_-RuVM3Ah0$R*a*B5=VqQ4^bw*4+N6b^?wP<>bK@s1QBXPDOxHA+q@%u zA$YZ{O)m{<go7Jz^ix`tXDFOuk3hkV`*S303Twk99LM6a6Ol(1Y5@2CEGTpv?b7nS z47ZbO<*zCB#9OGts9*C;f>g_(2_5(tzv!rup~&e}F30t%@R{@ZXlI1#<_XWO=xyvz ztYPr*%?e7K{`Ocb#_y@<LXX%tLVoX6@n?$mUp{qe8L|hNiuyZ21(gm{{xaWajo{ra zTh-#p#!Cpv9D~P!{UmU3ul)<chr4d71?Aqyw(GUQx$6gxc?vs`BQqJ5lAV%Q%VjUS z|58*+H}VZ0D?;g2bjE;NwNlc8G{TXY$v8yi64N+LDw0=pkN_vwIwENv;FGMTw1wjr z8V}zrKog%)j&+O8(<(4$8G}+yP-mtO^$rBBBH6N7T4j^oAR7r^Qyvc|MNH~H<n1=1 zJM|N4yB&EGFGC7!)6|7HJ7pl=B+}Gr_thJ7_c7W?p{m%^NuXRYvITlF<~B(>*>cxn zJ}9=o4?*Qsx}F=MLKum5&a9Qr1mLT<i#wrL$tTPusp6PDN|in*-OmljuL*gqA2z(D z8<%&MeAY!2!96T*DjvvK6@#@C-U!}PEaf4DI*ta+Sib!5=1MlE6CiZeH>#|<DenB_ zhxk*`Pra&Y;ng?sY5ceV;x!A_PD+~4W#cDJ#wJ5%ZBpT00>l}GSK>&=k0>wEtV3#% zi}Z*)NA>|L+}fwNpQ(9RaG8yF1ZoBp*^h~tyZk;n3Pj)BSi6l8AQ_oiAP$nzHi?_5 zsBB$A*xIYBLipv%uWvi3(}YsYc<@BCo|3N$C02*j2A=_J_5CDfax`)azpqUy_G+s6 zx4#I3bx3eIx_#|{z7rxx3)vZ@1zsdDns|+**z(q+zUuoLV~Yx$$eHNA#{FO^Tb+*% zC1GHU&ekPaRF?#%KijhER_{fQ#4JgpF2BqE{xf}Hm>(%rXP#u$%VS_W@N(Y4w5917 zj9;04vEJ1NdVTv@kmg%DY4wmf-QsBctjs#^LpyC|<qGs4e(?b2xQeYt2$j-C|3{YA z!I#pYmwWK^fmi@F&P-`kPF4`s4iVBE;%M2g%M0%Ey2Lnz3ap87iPD#?Vjj{%pSSR= z=W7(SCHch^eQdYF^B>2J69|r<P;IVw$-g<drz~%`t;M%F`K6oXnN*VB=&L;pJplxG zy2bzG;f3xS{Ghe-ty~lTt__d3G5WqS?}ReF?zKn4Pg2$*+wVTrF{h$lyz7Yi^~hLx zIP<5REHeuUpND?Pj?WKeec9$EZTVx4ejQ$k1KAI6O_^7gPElY&F?YU?I<*27!(5ly zmOFXu#&Fg0ZGTM;CX0&>mu`;p;1f$9?1e71oG^_p)55PxBaf%Mbg4M1EiEOJPxXlG zX$Fiu0vM0|g?pM{F-!|Nm4VO6$C4C2Fc8H5*;BzzERS}yqxw|ybN-qKR6+tW7bdiP z@l5(XS(Cl}-(_G)Q(-N#+oSdE-VVoPArX(*AU3}QUUXqCp=}J+hBh8jDT~?`A<psb zv=FtK`;WR5feHj&I(QIOZ{!9B<}lXlKhwzfBq^G39xfn^IC`0U@@RGifUKX;hnlF7 zsrGSg_FHD?Lo`Yb1EiDwi1WQ}xuDnx9seHwqlc4QEvg!oE1Z{_l+5B~`aX;xQSGgO zhRk86^ix6IL+np(H;z+B!><7ZH-6Xv9P}_D$qkDjePYa70=YaTYDgkA2B*7-$mo#d z&Z<J<q{5s&!wU4n670*<%~4ffNjHPnEUVRF&5D%c^Ml|wqf9BSwjM1D&2mwvN6h;3 zbScWp>jyc<<ga<`wQwst#ZruQ24oYmmjqlGo)E*z=4!uo7lbl!!bvCGEECLmcz?@> z9<gdOogAl~z@q@v<^BXD1wUo@>LNB0w$~>Gux%pWN9fKRnk|80nVbH7_MR%y+6t*` zVkKZ7!5x;F2XDOYoMQ^oq=7~i$6u)JWtHA)TA2QP_$J>_9AJ9D^6fNlax>SEC63`D z*dLUkLv8)jjp$9!YJKhSuS5!p$RlzZw><s~WA?k+aO7_c?@~Q;z=L@|K$9UU%+q54 z<PgUeE-f_CK{Qkzu%hDC8~K1jltt{KF(g`6Hs(aWTz=B;$IqwTGz;^cJBftakzcF) zFP7dsX3A9eEG(ZXdYe>A#m}U8m0hWnmt?P9G<ZeFtZ*zP)M?$zVETQnv>nRsGo}U? ze6uA1G)d9qN_Uz88?rR5R-In6g%NLMxh6sL-VQMFQWixxFmEZ?1KyHeA>;p=qH~G@ z&()0O2MT1*w_1{3l<SutH))}Y`H!eb=Dc9mI~*KQzGA%IDD44DZ}ZxN8<H^&4>p8J zoUcOt`&ntGPx?wi;un4Nh=}MNJNFL5_G)$wL~-#LaUPS6Tuvd?1PNn7hkMv9Ipu8+ z<wLlZ=TGRn-AE@1-$8O*RjDSfp;rg1Jrp$7N0Ofy@qK<X$|4Yy(e(K7$AbLw7>{D_ z^wW<p=fUD2WAfaQPaa#{N56=Y(QfR6JxAY5n3omcp)d`3T1Jt|%V4<lk(gw}J5TQ@ z52WaFjmhp02AwQ{<(@1f1a&xCOiLnMA(pv|<7U5$Hg{3%{FUMkZTIrxP3zo?y+W6v z_LS4>0t)eoaCF$Uh2F1dld9Tpv4q=r){!)_QpM?EE(2Q`TIT01jT0Ra{_hjaY-X4) zG1!Hak7A;qq`a#uf2tB8nKbN`80nR3#mFnCDTO~25r=PoUfWP^bgHdh2<Pb=6b4Uc z9YxGpNEPR03^?#HlTKt+J=uD-*udrlGx=WqWrwA|%fAmFrg(FQRp`_t2@>8|kzgyT zbIfa<>{0ov*4-aerp%Xs$eS?voUKzZAd|$BKsDma`EIOii1A%dro#SKnN9j;*iXUr zyrvK06}rPm%(m?r+~G4=ID12<NuS?N+EZTse!9FPxu=rR`Ks=l)+HcsSvoaMh`DzF zoqJ1fIDjN93ffsMkhxXb6mLueZlMwt_FbZh*9YD<;X4d`p{`@zQmK?hYKso6uSM-| z)7|5XqI;GnEi4V0+aS1ma&BAN6M+>k7FzG5Ht;cq>#H!``Og?Z1F|j0<Qm#D`5VF> z>DZfX%|ri@lIqTyG*RhN5tmuXP0yi}Vf;#$ycp|v_E&~~LMvf%$2fKFGna9S%<DFF zSu%V|S?naXV4-9E=FvMDs@Py{1N*5A^}y}ufO?lg+xy9BVvUrdhRSs7UWk*_e6i67 zoYK_Om$w4BO)mo&UaosL0QrbhyQ2$2Pcqe08GrH~1HY~IkmaI|#lCO0cQ{C%te&X5 zP&uy5MIDc%#(Xb%68%v@>AU6Eeim!RBl<=R36J@$@r(M!$u?X7FIwC6KrWorKjNh? zw>+8P^XH0@Iy$XLQMvd+{q!Yq@<ry<QVI}TR}V>2*Ljjn)p1!Dh;pZCg`s?E>-%t9 zymEqkm{KSqOb5R7Mi$wq=-e<h@wR-OJ{cUrBgMZ})W>P?o&iFj$99KreLbSwT@-g% z8B0Ep#X1bkelyuN?oj0UE8fgxWRD{qu8~CGBoYOY<mOXOL1_-L?SW>9$#^)zddY@* z>Ofr9y)OqZnW2yR?Idp)ggKa7R?--4hde*s?DZ;x$lsJV-%W+x&sMkWX(u_b<bVr? zOZ2qVC)FF?j>}xowSC0ep+NfT0r&Cjb@kkja~*l#fv58l0(wxN=Kw+!ZFPE%#NYN! z8W+z_m*L(Aga91@@@(5kw`e$MwLtZ9HvkTeJb8+i4_&W(h+4rh%#u~BnIOK~4l4Bc zM7;YH2heljbWr{+!NF&au*L`_;2teEH4VJ8sWUN~VXN!VDNYp`0AM!47PrnaS#23K zOSRU{6%|tTeDF_|kiBGK$E4~%=XdxHZ3^Yxz>}QyZ3`jwh&HGk<0W_Bpj|;%r>$|7 z1I2=S<NIUrlbbxq!t+Lb#0x|0V!wje8wJoJ`^k*zz<|1^U9ZW>5xr)&NF?wyAwhnt z6xh#x$(AsIiY1sml&4IMiv8kSuq<RLOCTq5yfj!j|5#^BEY&e_%(L|o>v!{3=RH0} z3+5sP!!K&w5Yg!$jhvUs_^&!;i60G%WUHyrYho3Gj>*d19{#c1-^xuLQ|1$qcZg89 zP>lc(9Qyf0yk19%V*#+&7&~!_0|4vEP!r#iP5RrJ^Z@(HH~cA+t3(O$HIz*DS}9{8 zb&rxVyo7#SDmrrU(iX{V(j}y+sn)GpWnte!sZ&q^YEyEf!mI4VL?!Qw3X28f(jDuG zh2Om4r{#6RTcA~oB+j}@1Exmy6yaJa>{kt@Lg-}U!etHS_--8$mkl8h`JSG-Q%;(K zQD*3nNwE}+?M+PFhHbYTOK2i|Q#wReDHX-u9WiDFf-?4e0bh#uo+??bvbN^a61P|y z)+fwWGI&hL$uRrGZu>=l3UQfpityHg!@O^F(E&P_40O-lr7Yq5$(fc3>xQf^3+?4- zb)Apk<X+9HK9uut_~4Vp6XKUe_U%;KaQ%+z!4mpx7i0f_(gpb>4rMxg$Q&jDXr0z( zctM*dGapXAmBxiGZZ^@pV+~u7an#4_evuS9O`I5;eD@@8Qg;cU6fY~QMSR-zbKyGs zRn70P<EH9t!P?i#NB-;^ghxro{B4K%$8H;{l-hZ)wb67%#^03h-`yq%rSIt=t2Rop z6OUjPsZfg@nG7^L@vTZqeQFE#1ik|v%-2@JX^M6$POHPk5mo7EJ=bHwtVCa~aV(Pz z?<3e#1-Mhh*odK5??0Q}{z|Mi=g;G;WiD2flVRbKc7rGESK_gEk4C4pyL{SS?Rb(f z7Fb7v<U{bh6}*kUs}%mMIg%8U6%)@mC?qnX_<qzX+sbW8sVmfPUyyI&;@619r}qy& z!!Aq}iCTnkmUvumE-Jina_Dksf*78sB?E|LFWQ39u1n_u`>P&<c6KjC6%PFuE~b`Z z0zAiJ+Z4Vr?)@QY?xfci=nbe+s;@99P}#5bY~UPVPQ+cG%->2)9;Gk(Snh!L)n_Q} z`{ei`D`|{{7@-wkx+cyrE@~K%*P9!+lcHz=HhrOdNIz*D)?*egn-`e0qCb)!_k^I= zhhEb<25JvOcNoNKywxd+%~7H8ij+pu_O?42DP0CjfbPDgFzSZQ&1UgHBx3=ZLn#VJ zDG0@@*Ub5D5Ka3~Q6%5ihYAV<N(~Z?FD|{Y>gK<8Io73W)siOgtB$|4f?Io^bpA$5 zOk4XCTgLBTe-2u6nLne!7El~+Nif`22)`nJ)crG}lb*i+>{3A-kRgqqFGWb;nj3^$ ztiS&R5V96zot`Yb9o5MY43y2%&HFxR^w~FZdrz9trA+jBQ4p+EdV_<Ai)%Y{Xq?GY zG!)3h+dJG32D5z$-BW^kyA}r>`YBjHAU}gWC1olP3r2<o(<tAD^+{Hxrah96!>lr7 zqp9{Od~fsM0R+7%bLvVgZ8`zj*MgN++A0*N7`{ExFJV0q6Es>J?xPp$H$a?oZO2EK zRfMY(Vuio%KWdIdh;&8Zc@nb$wqmODN9li!oYw4jIP1=gN(yfsCtzc|F&Lkg3$~K- z4X}o4RGI(>oeEf2c)q^D{}?Y5aQ`QbBwlh~Fqq^tjkc4bDaPww#h8d5{#9%4Ei<%y z^vCFLajR9WjPd%@k*tjsnyvS<VKG}~q*S`518mthA-C{8nmNYG2g#e8bTye&pOe-B zNZI;svJF0$iI8po`QC`3lh8f4t2a96fs*!IYq>(v1|4?K(sqZ8xM^3y{TaLC=fwdx z{)GTBx0$~=jvjT>DdVp+tVLFsQ!NVGU=K(vQnV7Pm-zoUmnq<Yl0@n?u_h?IsF|8b zv6Wb&#EIs)fm~fG63?G^eTCiAL{o#9wo_P9$)LAHY9#~qY`_<DxEW3<h0n%^L;3`K zADwa%l9sj4v29V#<0+j`sRFwbb<j&&C^rje3L_V(4Vy9K#q0#Mg3y}h-L~@Q{K&`5 zeGvndN;-nZrve_IY_t8%=f|BbYd&G}X%m@llM9-%hN~jT8~$1?2c<3A_B)6q+|k#N zywI>2bw+6&Fa{`xBtQIen?Csg`J<tU`X2*GiSFgiQaLZ?=>I4^{r?{A=YN(E|G)Rd zgs1bmMezezSuM>z*EX2%5=<biOPVHfJY)U~Zzv!G0bP8Lp~CX987C;U5Dj=^Ch337 z(MPS-p3nu=+;j}L@%>8^w3Y@BD^~#F6vcdyeT_64_?O4qafaII=kOOnNN<x~Y3Oke zxX&F_GaO^77rFb{*!62+t+n>|-5Jf-$-h&2AQ<+oebNromE}bKr6bg&-1cNg4cf?S z&^M#Ngzxdb8Y;i0a5!25t6EoNzggkEyCn*DqsG>)b#rtsthaQBxwuwKnVA>FeX3BK z<DM;jjp<Wq#?=ofhUD>+yeE66o)D%~4m%$hv=zE)4_nY1xTsJ)*qanN*fg)PsgUF( zvs(3PY8pTK<QkJ5*^eSUS0*Fc%X_U``V!O9XF&{0>_2=Ek~<6wDNHPIkhqR1$JdfZ zDNieiHwZ4Ge)mfL&2M&Al(|E0Qy@41F{V{2@}1x@^%JXTJdp9w%0KT%^}4grUNr?7 z(Y4e+{t?pkrtN+*-p$Y<(5;{3nn>3X?#0AZqb=pcHwmBTcIe9CUqAop75BaahUtTr z{vhW21&;oHfWc=lOqwAlh?j?lcX*vu6_bHlsXHoJ0u=60w;7=NiSw-ADqED7BeXu% zK8YgFf)oRh^U|B%1ibfKfcHJ-y`=szp+{LrN<WKnDEwTZ)<x8nYv+{PD&^ay>5e_B zorL}%eTiU6cn_r%H19<rk&wZF0f}g-Cc}3ZWkiy~$u%gxS)NW%L-izKz&PeZ7Jqs+ zdH=C+O!1(!%Mlh@os_Ev56Mb|i$kfx5)-4asW~WEJx&9i><2fFD_M!3x8tuA+BoO~ zN3=@+v*(@}|F-!3_wih9(a2`3wqpHQ?eJmi&_MqddG0eV@x-f18=BcQ_>r!Kf^<fT z4ZGJ<RP(<H(Tx};!UfSFUL3E+f4Irhenh!SCV}>q*76>Xl$DCc=e2tC%3w>e@{Q!@ zOMQjk6^|e@mD4-K3#_cHwJk3&EfoG($N<n>I%LEz>0^Xf|KC=Ph^TF<OQu3AC5lIz zo&Tkv>{u{uq6d}1avzzA!{Pb~)e^U1i+ikkWKd29YK$0{Q{Tt&FAEv*ryTu(n3Jy= z)&o$;AVOQnxz7y9V^vXiG9mp6qadZJm_*ZmyBfq!-bAwjH5J~VNq08V`>V|V)602> zHI=PvJP67NI52{sR1p;wkU<n_Aqpr8(m{F?5RoPzEeVODf^_L3AqWT=YUmINO*%*y zkluR<JqZcP-8g6NGxt1m?mhQB=iYzwBr7XBd$0Ar@A|$UXA>`3xLx26Q^TSC%zpD$ z=_Sz*vtQ#QZuaAg=C<&uaN7qb$&dJd#t*a3H<LroYA!2<80`7hzGZ`Y%KUtxP`||d zQ=d&|+&jtnoVd>rYK#DSl+$_cu9sV$@u;h3!TxOY-uRcrjT<dg9(K{PgoTnao($v? zzUWBo`<>x%7ct!juS9=KS(}bg!aCmsSs##xID?Uda@h3uF6ZU*MGVQYg)2$gr4;tn zalZ};Z_QEyjnRlLZUJ2)XKVu_u9s$AUEGzre*Ig!(`yf?iuV{eQOqonoYgsv;%?O- zKt#K!1|~cnD>h|1dS=1HyyjqcCw7qI-cDWXh&OzmIda&UC$h_bzDyv7{rjjMbT~t; z2VK6<1+Qz3;zQ>~2<EWy+$FB^!0xi98@g$GDMmUWw1fo-{3(}?iCV>MI+_r(_u<%t zI-qa&71i;MD6H%>%nxBb<iY?#J#}!N09Q;<>hf0zEAmHnR1fxX;PI}Gb;O$sDE_wy zEilcyeredw-oW6ZQ_M{Lg7A)9#*Up^*{!Ka&s5XdPn<I`a=1~QoxV_TwsyqV1|+wX ziJsZoLb<#a>J4TP<@vC4`896LD;96+V-YQv)EBSmZP2;IC?dUo`*>@+2`aw+q^k$a zYk&oWl0hfb6v05VK}tqwJ_NnJHEMiO6tYh1sXFF7EY7iqg4P|~<)<+v47FddmT`XS z5KEGmu2u@iB0PUyuL7DnEO(xM78J)yT(PlozB883Zn^}uw?6NN$(#>~j+%-5)g5t# zboB~dqwG<>UuX`hT>sg8P8D0TY#omWPT-`CmnTq&g*gG5eBN^bWLni7WWCD#@dVPc z=SWQ1M)M$0ko<b$NTU_*SB%kOIlB>)6{n4_s_G41X%*Z?&Q(}{MxI?AkJ)_^7h*ta z@mBSvoG&R)P%KLIi4xqeCUe`*8tTm*w`&o*q-=jN^Bjg}Omd3Xbe#Bvp>~*?50v+G zQ3asBsLIu8!%3Xs{#<Go^8CmR>3new7Q6h$>xJOdJk_X6q1x!<w8@LeSSfzrshp7M z8nGM=6t|V%Il--vf%uNO<YGS;35kW+bD&&*7l!VqK}t+L?6+RS^$leo*Qeiz+7P|E zCk1Z`(*FLyTZqQdUS-}gsBN|>{x;ezXhY@WRh!N>6Um9YEFe*R4$zoF<#H-JK%be6 zj!Id48_s9<JlOwRZ@rMZ<dg|w^-DmRFSVhLQT+aJXGLqqgT1v31B<UF)d+Ea`A8Tq zSgtAgjv~`LbzTs-!lz$F2-vP`g%dJLEW%Kdq=e#zMy1^l*#6~wcmTD+ymltu^<gFQ z6!ei9e+4O(%jen_c%`$yez(o~K6c9e!`7<{Ct3pV9Zzq_y=7^5=sMk0M)D9`X#egN zT1K~00^MU}dBL)4$nO7Bn$U}P@Ki0ejYm_Ffu}qQ!y+T5aVY;P+@!Yj(S)6=cdpv} zTtiiiIrD@oS}pG0BQxk`0Xm;=`{Jw_7o&>)3>pD}2G&^L3$?4yCYkl^#+ZCdEr2i@ zVuSju3*$KHGmZiY7wtp)rV<JjTo`YuC)-5khyg81aDwnH_0^Gb!mtyz^o+3*?S*0* z4@kB&zEA@LsrtR+|IZ8`adxCN8>R|m4Oaf|`98pU{157;>*(ZwZ$ss7DVhwR+Wqn{ z`u3Y2L;*b}`rP5}tjGNKte}59*8cz*`qw`AZ_-p4hY9Lpy(F*y?9`nkfc*rd*UgI< z6M=b+Plg$;S&mZ3z9}C6RZ*-Wy@EKrps1kIr|sM9q8n`+ZYG*fDz!S8V0rUJlD^eB z%}gJGTu-=i2${-B1DGqRS!C{{lx+4)F&cSjux8nw2A`tl>>|>MRT#nfuC@z)^Ju<t z`pYf|L4Z<2>aWS_e_B4~?F5v(fl0ybNS{5W_Cv9Z(V{z4A7<fIJtes7vXr8l?|Ur? z=$V5cX&QWogrt(Th0yR#jp*``FKadQ9t>@<sW-_A8lUk_0_#s~cEeLgU`mKZhxo&( zVeSD)rs9XYA#ZXY42pSQbFR2DrQ;j$RY<@?E79a+hOw)|hb!3zayehU4f@8lR14lY z{gh2n-DP!~c#m6csvn<@;+t@k18Ry}FK|a1NcuM?Aiu^;?M&Zn=WFvB)g3^Ycb8ZA z?krNS`p*yN$gm%DUL+6&4|asjI2Npwh(n=}eKSd-%+}ZGs3ason{J{V<09+X%nXUe ztv3lt_zeK66r`0oo}L1zm|)f>eDKmaW(e1#Z!8|ya&K7WM(BRmP2q3ta%}TOd+2aU z>qsmgFCIYMJk3+dq;BYz)}NNW5?8=s)Hf9I>ci>W5jmW)tzA<zm_Vef&2M*!BeLG( zHj7+tS`5Up<+=I3ay9PD?BB1yc`!C2JF%%SzJV4KS4?v$v1yO5akj$_3qJTBa5@}` zpNTG?r@BRs0(c0?uT?;uH(~WAt+%oCRfnrX2QcMHyA|T+6x`N>(u<pF#kxfGS0_2_ zkKKLznD>Na0^b#!@Xr@CHSc{=-2y_@Q{je!gQ#88))X$OHCf*9#IrX`e?8B+8i_>^ z<4<roTt~!`N9ksx*})3l6BVRJ`p_r`9hdiDK79f|e?qZzD!hh#)Ga&ywCDv>#jTb? z=`PEi^5yA1cK!;=vtL*IhRpZA2WSH2Wwn=k2#HuK2@svVT25ph<<L!h0#J}{$~k_z z@p60h)eiy5spg%JAHWn+D@HNBfzn;j+w%^`drp}c8_QC@BFg1}pO*WH7TG}7J?J(9 zGWFxrXPJX;dCuvD$LpA1JBi8ycITE|W%EuUrEJ4`eM5j^Apho`o`SLmg*EF<#4>)g z-Hbq4TmB^(HxuaN20SupO8EV7q>G9|$A}v>L_9{?s(f&+<lFR3Iu$&A&nD?S(Vntm zWu)LMzBKx9hT!VA>tq$Oa@ZxJm0=&I0<@FOoooaS?`Rv9=;+=$^yL1`ZMTS^Czm)r zw2#awqcR6sH!uIH$?r4^OsD#uaDHjAfLfXCFXFj#C~2$5^#eZ0rHIgR+y1K7Bua0k zT;@<Ar75NArpD#2GfsHNmVh|mLU+MkL>5LWY-a{B6T5nv>s^!fZZxWBb#=w11e){r z{RqDN&+oNs3z@Tp(6B))9SgmEJ=bgNsjE=^Y{OoOF?<dIyQ{V0y_Pic$ak)0IZGGx zqIA_ko4+{g0@&U8l#;LuCU&3(Z~<jG`4k^&M5Mjao^~^j%N`STqZWoFv)63hE6HZA zQIvs?K?JRW_otZF#wrIhKY!%u>+aT}u!iWtVBsD5=f}}eediq9E8oU1;5dC<7(png zwh#*M((HiP_^rcxlQin!IwD1W(IJt6v4C>jQNr}xxCFQrgR2!rN0ZNC`DvpG;|Il6 z^d(4`<-z6wg@}AgM-yqiFpLZ}#j1K=laK0t)_7)ini4$y4)p~*=Zo*x7%X>Ys9l;5 zTdQOy!XV$h4*V_DUZ8)of|NH?a6@C*g4Z#&V``APp)xk4mXgQ)oy$AaZArSD)qYTG zBz13bagj1XkE)@jAjy>a1(6*S2;drL$w^?1xKEyjTfN27CR6PNk)8(YLlRd@za<vl zQg*WO$k6Ho8y*D}K>sA@Du?v6;=P0pW}98kYE+B0oJ_E-=hFzynB+~4D|D3hqp_kL ziVL)u>fiFyNP~-Nx}UBYU+HQMjldj8CVxm--V}Lj@Z>BBnwz2CFZS&{J&xm4bzrBY z5wYe`K+J(w2}^0+Nzo&qTq%nqANyJTTO6Oyvs&A4IQ+84|5TZzk7Wz<)nC`KRl=nD zlo_*~JiumcosdnrKO1=~@Ki;HvW*|@vv!Br%S3qQi_J4qOM;^8a#r~_I(aTJfO78? zGIVDL{!mh}oYaOu$ZiPR?rW8BkASdqaeMlj?ndAwXdV~SgWz1nqt~XE%J14<JZX3$ zUXgZ0N6WHE3H0Jdngqyntvd(+`n`SUmde7&CRnh<e-ND6G6*l*3FU=W4`(i5mu9i> zw{Yf%FoO({+fK_)5C%{@2h%NLXFl|YIIOUn73H=38YePQo+y+u|IF^=!Petyrf{C~ z{x>jU2^tmXOYx}5UTBu}Xi&}Y$_$;I5mZp-2-=w(|6Le?n2|QV&xYG)S?wkFTYYHi zogR+eO74bOrk5NkFPGmmN!R&m6`QUJ=55dmX0WGSBwKi>8zrcZtke0Ay~O98x)?wM z{C^T!99EHig4BjL5XD~UE{5YNOKo!jgmVkpwsM2YK2bvD`u5HrmnGbX)vGtvriH-2 zJU%MT7#?7bRNXWt#Vy*7Gvz~%z3`f5gPB`U83_MXLM8TbBGJ`S<F;pyfeIoHGZ*BA zN2|<}&qW-n<%0@<WfQoXvL`l(s>~#(E~#}!&^xvs_FBhVkmm%2LM)gWB)ca3PXQEx zHS6yM)+8N%dl?XOU6}x3>%gpuPX1k_T~_{w!OvgA8UJGJe~#+-Z~5Twa7M;=S0`{Q z_9?KhnPBWr^%rI<hdv-w`rO6=J#0wZ$>V!Us8~2^g#((Dyl5@p6k4YSgf!40U+%2t zN^g3@j;Bs|*YpD9H|y}!NoI%Yv*DNS`ZcSVu^&riAA-_?gOmUte-*GxdW$c$tvpi_ zo}ojT-KtB;Vmv~y=G8t09~U|+OE8Mlu5+l+Rysv?=Vj1y)8==hTwQISgBP5^zPn^I z``*;#AzFx;xY;a|xmw@E=hQt6_S*+P{PF?PWA+>bX$K?|=WD;Sf9j1AUEi|&^)%1^ z`=AJFmJhAQ!e~Q9h#)q2>dD>&!fnMOh0^r(msZc&W_C+_GAC9HK1XdHcdutem-{U) zf2p%@fG(ss*<aX6JYJOSIjh{soleEUF7c)-8sMq8%Ib_PcTFqmKF{cWo{$p{K8V|O z7hf5{ACqVcfwojW5mOcdy~q&Wf4P(TaSEl0El4z$Bnj}{mXq;px6L4uMO(_ybcF>7 zcv~P?1|@CJ73Iqgw)rJ^MS<vFJ7Rjg=%8&NnW*R-rTMMXVu8K&WA{LLHGWot`gTSA z$v#R`K}cRkG~9nBMNll6z^tN%P~6rTd<WnQ;cpRV;{;88yECU>7xvh)E6v71j9^1I z_9ziByqVAj<l<g(rT7?m^8HFn)KNmJ2+zK~)t;!DYiUcS#q+Q8j!&-_F6BuI$g4>! z{_4}kdd#Qh)29_>;W4u0aY@@Fpci()7x;G$l}HP-1RF+s>P=zc=oPb@I^8oV@z4p@ z>keU_WrA!hTZE+NVHh=cO*cV2>FX9iOz>Zrx)!7$>Dwq5+2J45{L;Jn8jcT;TfqIb zB;pXI^h|?#K~|T`jEQHULhya%!q+Y;dONC6)~wvs^wGPlq)(Zp!=lw*cBwm1*1&c7 zt=dRIdCx_!3c${M6a^*~es$d6bqP(e+zW<%VfZLQgzxWl>ey~~WAT#%L$FnKhc+*Y z#Wl^;U?jskVl8H*6Ml3MRJA_Zg-Yj9&0$tbe%9}a`jnY9oDeH0zZGE;`9-8CE&x45 zQMzTL14&m0fgA%DnR}Pwgub!cyy2M>XWLH@Rl~2Ry{g2sQ-kd*H(n;RWaV_I5Jr|e z1fv^*n3JWg;6p{`E8B>O3>kI{37h!Rt#l)*I%Fc?^u%?)xk)nGCqii5*?;^Fx_o;& z;T(wpwD?Ok;c%VMW19H?>nr$wTyOqY+}gib;r`YFarOkz+~uGTEGje$*jlMfe-c|N zvnu4>6|RFF%0mV~qdA_be9nS6guwk35qCB<y@s|OL=-AH6vnc7yQdDW=hP=oJ?)!+ zXkPUt!6pZhG?j0-EYla1vPvh5-1OtKBG_A!JrWTu+~?&7-Y1_HTOT$&Tj_nO`QlSi zmsh|jwfDQVclvS-x96xWv)2N`EaMhT9|7310V8S*pw*kUW%?>#by1@R_w(xBOwwKo z4MiKX615^C3~!zwU^_bpT2`G)^`1Nofj#DnKkO+P_^gyB^fQ8G=8Z>|_sM#p7|B=% z-W(2Hb5eBr1ads3s*$qc<$xa>@m(R7ui?7m8;pMoC+zM$Y-SzOj8~RPF&c%KD3)M6 zp40*GWRSJy3V1(iQnbtcJ_oG=lRay0SS-(vDq_jJY?NUtP*!XL4^j70&^5%ywS9Z9 zMaio$q+B-4My<G;{aiUG+S>a$j%6!Y0kYNL=I0QGcWO6GZ}y=9rx@}4GvlqTYjHiO zjvEfd2mD1#nq=^dWk$#*KrVi<`|*!bJ+^kzls3Y=OTR<=#0gDJuHxv^7=zu5rg=+g zMgoE}mt_`CcsD^ZZXegVRvM7poOUlTvk_i+#i4#V?qw7nEu6HGec>`s+L2f2WJvl+ zMg*U<$SFrZL|Z7T5>_8nCUCGC@6xFn@RwmbPWKdW337F-?m{}P!xZ-GKlB$ik)9`f zZ{GgTnzn9`L&0o6-`Zw?IZ>r9cH&mCF8jGOfJ>~zclW-Ee)@2nvpZg#lfl#!y)6lv zZbWDzeB&j!g5*cmZWsGG$9Oh5rAi3|dl%tWrBD>Wr5iIJmVc3sr*TA>ec8ZRo_P{R zbgwEzT1adBlvvaloCR%!07nrw+=h<dQ2oU~X;9*u{Cydh;Z?8WZrt45qmw@!-UZoz zB<%y{xbr>t{}#6YsEb+_txYOj4*P`jzzIuKyao;iAUlnx%KTfxg3wg?5B=&RiIP`z zSUP{(oSxiD<tzmwE!VoGl9sxE>zMCUI4X4p7=I@Rv)Ej9%w$8YD7)0nsQK;}X%mlK zcf|9yzSo6!5iK4;MU6{1xXxK9**(@kbyFJwM`W+F%P$@6ByWC<kivfVo)3)=JbEnq zj_7p-UGk%9(=19oWN4}te7iq<dEB(HVr<^pf>rW^(U@iC!Sv@5tati#Oz^#xH4{KA z7N>xtWM6l$2iro5vtn9~Js%LkjStI7dq*F#jXRxO9i9G^ms9rE$DH)t=i7RU^Ze6! z>}Q#<ua?)1xyqW4CO2;D&l$oGjg$F5GES7MVD39gVC1}$CSZ4c8^0_kKWjUo{ZK8^ zFpxDJwigOcf76p)j*&+<-+(*|AlbP;yA5gOUaJTGOw3E^GJ@bJ;lO%um*^$H08K+2 zj0zGK9{bdMIjI%lb^74-#Oa0<7Xr<uIIelZRn{UYH!P&h&cy>xQhcp+c@h=lp&cmK z8uuA5%Y66oj>r*zv~>IY)_69&Srk;8wTY+3jWM2u?BKRWH^l6JjJN?Q-N+j?1p5z{ zn4Dd`9}blu@m{VvAI^FC`<dL4r7WOnxmxy>wAI1gd2&ydFiX<IEoBj4@ypNvl|WP3 zO(q<wL0W+udbDRCQ6V^%5osSQeRl>)S1vPF>@haC6+IXQ<@+9c(P!WcD#`wl<aT#f zEz9xO9@oNcWl1yws(;qBZi-i67$xRe`t}8Aa_1X2D9`(c+Yr~xU&!J<@HDSWkTcFb zXI0m&@>6WP7vh9!E>*U?w=cmKutsXPLC*=R**{|D+Gx^@@!YJ~Dp_c}l+K7VhTC|~ zPBiHBheMxji3e;S0il|%gP_j{f4qJ4w~SV+t;_n<m)OZ!gY+pxxnFNhbUOf=A=%HG z*VVptNbzuc7?iAULA^7ll0)_aBv4M|k&nv$zo*F`lVSbEmi{q9gJSM2?{5mC$bkKj zJSVg>zbf*U+U1oISfOv@p)N+<^Pn}nhkQCu&uHx34Q(@`tN^E=4=2v-ReS~%aw}2r z$fpM2&^Nzo&ol|xU3Q&;-DRJZ)AnCyvI9@vKW!-j=pKg@{QpZDEHFHf%NU`FbjFOp V;G+V#BYB6f+`prxny+jf@E-=(!219I literal 0 HcmV?d00001 diff --git a/deployment/media/aks_basics_cluster_details (1).png b/deployment/media/aks_basics_cluster_details (1).png new file mode 100644 index 0000000000000000000000000000000000000000..619bedf3a1d3042b4e9339b36979ca3d6e2f1e32 GIT binary patch literal 13256 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_basics_cluster_details.png b/deployment/media/aks_basics_cluster_details.png new file mode 100644 index 0000000000000000000000000000000000000000..eef51c8fb1ba5646a5da2350e3a0a19a45f9b21f GIT binary patch literal 13268 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_basics_cluster_details_single.png b/deployment/media/aks_basics_cluster_details_single.png new file mode 100644 index 0000000000000000000000000000000000000000..58bf96d8fc1375e248130a19f3d6714c148a23e6 GIT binary patch literal 13065 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 Uc|Pk>1+GB~GAhy)Ql?-22hNS3fdBvi literal 0 HcmV?d00001 diff --git a/deployment/media/aks_basics_primarynp.png b/deployment/media/aks_basics_primarynp.png new file mode 100644 index 0000000000000000000000000000000000000000..fa9885dc5beaac83e722258e0d0bd08f7dfd1407 GIT binary patch literal 14866 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_create.png b/deployment/media/aks_create.png new file mode 100644 index 0000000000000000000000000000000000000000..52f9528a832e131d902652ed4f309faf53afee39 GIT binary patch literal 30564 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 AEC2ui literal 0 HcmV?d00001 diff --git a/deployment/media/aks_create_complete.png b/deployment/media/aks_create_complete.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3cab4b528ba44c8ab44c17564661e1eef04245 GIT binary patch literal 6199 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_create_start.png b/deployment/media/aks_create_start.png new file mode 100644 index 0000000000000000000000000000000000000000..958b52ac8144073306760db3405c22c10e91e476 GIT binary patch literal 10144 zcmcI~XH=6-v@YtWC<uIjf^?Lo^xlhrfYPPcAYDr6(gFlTqz0sh9sx1*&_fNqhTdBM z>AgefoOtf}eb>6@ocrT_pP6^9*=x_9z4!a<nF-faS0W;yCcwkPBl__EofaP615I2z z^YMM$yTaX11_$@twUp%WN(N{*ah-o`Wz}Ty@XBHcugxFg`cGWm8@l7+5x4z)?sYlm zS>fTa34M4ctK$vW#mKn4`jE+Uu!NZ>>=)Rx;~dtjm?+hA;2KUcC^RITAS-V-vM9FU zeCaG{pb|A6#nSn;>>DRv(q|PRy-~g6A{(w@Qp%T9lrNX|=C_WZDTyh%R?i>C)#YyO zuUj~8Y1|^dUFP2o5##j0V>XVs**`neEBf1c+xkl@|Bi+79<I%p_3y!7WTw3@jf22% z^3C`-{NeKW90z!0#P=9*@V52k;sYGM7yZZY@8>6>fh0I!{PX`h*sQSUXOae7D@6+= z7@sCxVTVW{OD&l@si{$$Mrk>-iv(>BGvF+EAo(Y75LoUVQb^SQW7StPadtY~_mv14 zl3N6NML4i<qzYT9m>L7#ou9=oUoW3H2glAOJ)PhMj`j8wZ-yx0lxB3zbZLfSID2yc zeCC8EPk%m$H}OypU3RG55REU3TBs&WvnxAEOg4=PZPcquaM*k-oPj{i&%30rcZh_j z)$ZQwXUz$K>-FfP-d76Q>o(m%cp61Fyp+SmFRO#EzOfWZ;Nit|k`td#h#V`Fodk$Z z=pQLMX>jxT(-8n-Fi5{Y3U&f*lqibPfK?Lk%*`!)bfJ$hYg5iaw6QVcq%h6FZM4nR zxan@$?Dleb&>7LxylY9f2Nar-S)oTEVevPM(uPmAiSe434-;U2RMwSeEjGt8yw~w5 z_Wk1```|$Y57~00@AehNuv8_VTP)4Lfs}TATU(`Y>*$?%qC%6>KSEgc%W12;bWiFA zySNyLXxgn`qF=JwiFi8{hArv3v0;I&#@x4Y%QdoPcE(%ZLjKAmFYMGdkKZ=0_`wGw zNh6*e*NO%z=Z;MK<qBz**@orMYF8ckrpXt0o+=vz72Chz@zf3)ujY_wg%yCSLF^Oh zZO{a{XA;=FwCTW}pN6EX)^3SO`l&8bd*cN2Kg%-w_lMsfr-(r)uZ}cJGWMi%ez|KX z0qS?zzf9|ypSv2VhJa`!FaR~B%j!v@HO2Pkw4aK<#CTyu)~}2{PYBX@u_uIW2_ns6 z#C7?8Z8~O6&|KMQex4@9hrZM3+x)Rt8mZNB+x+v&MB`BbZ|oe_qsW3v4*kA@ept=e zkXmg@ngb~7m3?Wcj;S5Q#fG=H%dwzoSm}VPr#iRYO*zNj(H_iSa&}#1VEdS+dU@@- z%7Dw$r*(EVh7B~>!TNxZP&xwhJM#OSsiWYEsny56eud!7V8SVT6U{{7iKp2`i5wrP z)M&13^&Md%^wKStD`9y=Jk{0rPaDP06g$N2<Me;Ps(c`X)k-2xmQ0#|^p-P3zNyf% zwQNjH<3c}O1+l%R_NP_Js>HwOE#IH_9)w@i5Hv&=*eB!pNM~S=p06<Rc{<BSYbDyb zhwf{ZUbaq%n+;M2n)^zc(Mxmx4#3UT2tA;OBw?~i6+dO_W}0nrAuW11exC3E#lchL zPQ2l`R6K&bQS!N+`rKd%nx_kQ->rUXDox+Cw7v7oRXuhX;zcZ|UL7G0`>fN}e-R}5 zWcW!kzi9^AJ%#v(AGb!s@y<j5mQELa)Ub^b%W)s=O>B^u5fi_1d1F+3ndNIQ#^vt5 zZi5M=MEFEHNz;R<tj!($8i{ESn2}Ih{H+r@*XWGGs28^9OKBvM(o%=L3qRCMw?v;5 zlu+_m`E@LT`KD5Vs;?BSEZ37oG)bIyC}x(D-}*6uz+VCug$%9}$>7-PXwFoDed=<O zS?6~q{_Z}moHl>b)4TwF)rSSH+&0twt3J!g(z@=6#?kJKL|0F{$8X48HA|$^>AvI( zT5Jz24F*bUDz{txgLi(}y{}k%#+*<7PYCn8wIpd~GGC@ws*fx40O!2)eqV3iRBULp z^fBA*Y#L35Y^YwrT=wq$u`bJt?yN}y7$|RLZENeOZ91q(K|yRHe&f1!dTKGTaBx5p zZXd<xXg|a>SmvHcis6=8*@`QEUo+=Qreivb0Q58~0>}iWI+^|6MYT+-ktw;F<JOv8 z*`{lJ9`roCW4|$%iEuq?i?YK-@+(1Z%wA^Hpz8mb4+O9ZKKX|O>0#>%_NYSrrzcNQ zuEYm?kNL>s)bOQi^5`K3avx0OC7{0s*O(D-1!pP18R-|()J<-G!IrPj;m#||G7Gnc zx2b4vvdfb}&kDnylF^ZwRA0h&pR36QG`|-38jt|8e`6_59X9!`zw0qqQnA%<dY-Gb zS!dYIpFuFRN>v}sGy$r3nQ<nhBlJ5NT>xd6nAp4JU~52rEvvb7C7a;rkFK#e--Ke^ zwuzgBlhIq)x>38@>wwNquM`TD)2-&BWk+=32QRUVSPh6<;aR|+^l8p+LMvE+)b;3o z(+6vU%lyH>GVB1T?8h-(s&4M_b05eF66Se#zALinSUZiCseDn{j^B@+#{I|Iv`Nm> z`)p*>WiE3v{bZ5p=p(LqlG7W(9Z37}(v?qHSC;!J!9@RPcOM@BKbpxV7p=>`tA7L* zyS_kzMF)<HcXt~n@g<JRhi;7Py1c5FT#tSc0=n0)&-|-4ON@-(<yE{R97R8R$$`_< z+-SClL?)AN7uch8e0#X90S2X1-7=ouFdTX0iv)OGUyge%)%ab4n`m!WNiJ;KWw7P% zX#8MwczC>$7lDI4YrWS^u<tkb?h3(8j9>%x8_fl8#**Ua$7xGr83SwWo1G0Jo14&O z)AC-c)f@HW@31aV%j8dv-P$sQFjs*U|IT%*Mkp@Tkb8;lR2JmoUnRD9D9$^(vt82l zZ!({E?%vd1xf+Scq1v`chF_X(I20&?Z7nalf-B^qH+$BsAqG`DqU7#e+Ie5*dUnS{ z$uIt0gPZvtg?PrZZ+rZEO5ywuIt<~gXB2#RvUaot@v4d`K7N>HE%O-<@6+MQ15{Q2 zSMT=qNi%TnU0z;v2H)z<{HXS=G0ALhx>sD^n!}R#RLm*E*q}ros}p=8nl7?zMB)0l z8n7R=ax*%8>OEvXb0-$wFK3!=yZ|;UMjP2`BQX)@lWY{aZc>R^-5$MzU8Az~t2d<~ zwm{5w^*)T*5MWcm7#!S|dd`(H{Y$^_;dX_AaXggHROD8pfEVkMK0#PK??9^8a0kj4 z{&yTMaAbrS-3Ce7eQ8hffmhX?Q^jqY7v6fgHrgT5;pUAoDbHBdr;~!~T`Zz!p6wj& zZl}!s79p!fTW<O(bfRVS3jyYn%K?~qiBq-~I}O2e->KulF1x0luM&U(Bk}q-Je?AD zhE>24?i*PgNs_og9yMOB%dEEA{$x0@xz@kO-2h*tx+^4`Fbn;3Qn8e}`q4wSsbZ5{ z^|zrw*b0Z<(ZJOzshy>RN~d03I>)IS7o`@g_?~?lEd@Gn6UNDR)c-_K;NTiXe^RT+ z>7M?Nij32Mb+?knX(U$UWEP%z5uF#emh2qF`8lf?+For6G|t9O1k*^_I^N7oNozHI zTefw6;N0TJa1yyeFI5!8`F$O<rQ}qEF+7p2pmoDJW2tjDer+ojc6T!fzKglDx-%=0 zDfJNMv846%ee+^)@|aR&C2o0TJojmNQei!G-T5qXK3J7z0Z55mNKed}hd=I304<ZS zK^lP<Z^@(-k&_#}w#Qswsl0Pp4wHS7H<X1Pf+KV2P!7xW8J#_)+G+K<^?=Vr^;`M* z^`CNt&ljI}P&avb@a;{uquw{9Y-N?P%%NS4&?1e6ez1V);^FbSs{T5s;bZ+P=WKB; zKlk6A`xg`Q!xwq_dO3bPTu(`J9JgB_nF5>rlb~6}a1bJ9P^rzRTc%88@)1C9;CAtC z-Pp(CKgWk{rK|OubxCh_C?Ph_u`%k>Q728#j<7-%@DPqOGIrdu$u)sI{ErtZ?k?}{ z*1>n^rs5lQr?0>2=yg^Lb0CD0A92k7;2cMxaVA6F_V3^Bi!{ksVufnx&)P{s9BCI9 zUO&R|ieL0wxe({uQ?nH^=J3M?nMN7jJZOQ;@oKTJSPZNkN1wgZ=~t4tnUiK!8zmFa zGZVLl2-8xT@xO(G*@Qf1B&7XFYM&>wb{}9;7j}mGN-tpY=RavU|9_$M|B#O3Wd8TL z{QqsR%BN<Lw5K!Ua>5xF{I&LAb|k`L?u}J%V|{`Pc+R&#IKAh2+D8Y0g_Q2Z*OS3p zU$a#!%(>!$by+=7j($NJY?`&WCN8^6@hjJOPLuWx9de94YN0oc0aa;%m?vp%M>smR zg~>r-I3>tf?Cve}0V&wqR2yY7=jZ1Erw+BJLbd2UUrn?K#Kn4yI}yar+^zR09w5dw ziOP$WnBs9%^swRI(jc6UGKu7+Aqrq$D<59YE?zZ`ca@?{^6MFS=K1UBxmSgd1%7Yw z;H@53F@xyb#-Vs7t#o;EnpSUSYeN+Ss7UBv^8)udIrRcLZ)wz()A;K8+v&3z@BY?V z-u7e^2auU@*;)*z)w}C5lwrxr<b}m!iW1F}pRI{Kc_KZ<WMq<+J>E5$XvLFN-yIa! zx(@9#b4h9^s2lcqM~U8y<5)p$6`<nB@2tTUbcY%IT5hY-%-PyEqnGu|7b!D#KWYtx z9scaGJSYxGJi}ru16xh&_CD7R&_*bR%e=c6<Ee+!q&>bU&{>=wWkyo_ON6ePU2Fl^ z`cWX`a!o@<T;}FtRtL8pC+PgK{kzMv8!T8g_Z-snfeq$Vm*62>l&jnr%MtP3mc!q_ z)>e3L{G86Jj&JkKA%E-byVs9;&4it}>-#Gks$MJ8$B6&I^46->$`pnD2zK&L^45>~ zo=iEz8f?$4|9myi30`ruC*0JRnAxLfOTcyP#KkgrJo_i*eiNE~25uycG&2(<+-GVc z<ZvoSn@k4lahP%B|Eo+_{&7Ea+kU(zJx_klBOj9wEgyAlN)~ywU~*iYh@?OIWDI#3 zu`sbYSM+IZJx)Y(?`LOp4iv}j7fEZ?qS5gg5XkN%hD6^j*u{O=Th}q&Y<}pdYdO2Z z-L1!~LBjWNX@ky;S>N_*;5G#codCeJ>6O<d!Q-OKESmRdh+-oX8>*@n{JW0*cJ?G~ z#~HvY^{V^SsD6eRWTSolO0k7Jw6x5XaqH>vpOyaUP!44|q7&++)0MTh!+~RcrEF1Q z+Ci^62A>&{E;dP)!4u3ppN8v~fCD+AN5;ecwc`7k!!~*)lWwyC?oo1=-pA2IAD2x8 zH+GWU{3QdbhHHKjjVQFe@sydLPiJs^R-Y|2XN}yTO@0!r#2Hmwtf-&#xo{&V^SQZu zc;YRlu#qVimq8XuKLDDQ?rC68&%Rfb`7^4|R&HLOx>F^%NY*W`TSu^6gQ7$Ot&c~_ z0-KGQi||No!|@dGiIJ4}(Ok6V7mdwPFUBL{zC6)q1KFq%mVWQv@+P9xr-bb8-jE|i z3vBOHy<#*G09q4onm6HL22&%QsHZoAAGx^<u~%K)^GXxl#Uc#tdO>Fwt)e_UG~fjn ztwVq)d!Kbxd9|*WbxJk=TG8VSm7@0xLI2=FMKJEgfvY}4-IZ~4gN`Enn9+6M%&hJS zKx%~YTNK*hopsJepX3!yZ1CV}Pjqcc>kC8RPb&%$&ZnQ9xOwWF0sBB_XE3tG_Z6A8 z*sO$vu`%bya=vICphIq<QDn*Y8D)*!Z}EJP!^m#M{-kl+)q8!@jP;Jr@R~W+zZymi zZWugV;-$B5Jkl-rE*)1@+^NYktoJ?fw<4zpcZb6ZJiKOT^MGE@H67~Iu@)n(e21YE z8#w*!E$-E?DtRhIe~N@qzT9~7_U5|j&?WUwN(Ys?VB%GRX&FRO+UB#P(<&<t51<(h z0Wn`z&aA3};_|<><X<St4ON;=b7F0#?JE`-o=R|bFNXVwh4fE5J5J~M11t6bME29N ztA={g2JajB=Z!TpXo)07Tj%Oa>io}cI$wmG4S#_8#-r8E=h&@|uP1d%;N-Rf#b(FJ zPsQVXQ|MwhPk`Jx$ieS7dRYYwCzeyB$5PF<*1$r(F?8j)42Rr$Tq-#(LBweBKajTZ zl=5kUTCZ<TR|N<!#AIxYc9Qs>w+Ssn2AV;6_KC^>V{O+5geEgGDffPbTJzpdpDvv| zD#(>GWNN4SlDe!Yblqry)Xo@_xYqr4dYUqOT(GRhK55*w9a@!i5$t)A?Up~kPj{Uo zlZ}0Re?Na~e0oO;Y&M~RovT}rQGDso?6B!qHEOpyPt4|yZ@E@IyDgKTo0jmQNvLR? zVC~ZoDVoR6cw$BmlejvwmG(T#z2`NKNiUKrt2T?!RHp?WRz3DCQEHqaSzh)HS0LQp z-08GK$gEM;*k~h1sUo1CZATBUzAypO)HmXyO+>gKZ=wy-0l9G?;9)A~xIr-t_4rDm z=Fex<yIT4$_NOguJ{@5ZGaFUyBn@SziEd3}1^uQkb$*j$M`xnEV&}<=Z#WB&Qxo2Z z&<vRCe)EeD0P(KcAwt{!=ruOWvFGTw8}vKvX{7bff8+1_-R22PbvT);meEWtj;Sz* z3y?9%xL)PlC}%!Y@SD55er*yXk$8DZQcM<;II^h^m%4B}{0Z26HgntZGZOfauH<`J z)%XShC9?R|kW?7@H5W$&B;}AFTzot=pJ`Ny4I(41oCi)J$TTl!&+|;kel?bwjiDhF z$*pmgsqJ<VIMH9915C2FjG^ZljR~R}3?N<D>Z+JTc#|T|7EBtpDQ*y%?Bdhgd-ddZ z5BzKy)X(x<X%=<`2i7uU32UA`Jgi*rnm_((6Yn%&<}7Mlq*OGD@P<!+&O;_WAVFT} zAsRmVqN*lE;l;O^gZo%(B=+#g3LIHI(#^0bZxNN|ZESE9o#4-#Cv}(^pXN~5#DQ}` z5e~VvxF!$WhLzIy45Zc$*y72a%~-E)MzyiA_q|>LnhBKMD)&{)GQ$zhO#{Cv=W2!f zf8TdcRl|7ZO6FA-mgPu28uZ6ie$DGafzG-))#v)OTKTG|8CUi;S)uDq2|`KiUqS_Y z;<Wj9*Or;;zmVbo!+s|>-@S!OePz4cc^#)F4tC^bZ{m3V8W)Bi=@Zi!Zbke@%EL#f zsNSr|2{)Ht$|KKF7T6=b8cu8`hQ;YqRt%+8F8XHHH=3tp04Tkk=(Ei2RzJSliZr>Y zHd99@8bnR-So4bkO%4w08$nRqq!$n0uW^}D<eGY7*4ArztCJ-p9mf=gk_tUC<_}^k z9n|^aV^wgo{=tZ|8czmKWOr|aQeKi>mXa6mrq&DN*z=GwJH&}2_QV5A)l_B&;3j0Y zItS>_6C~2CbC;^Il|=s<NtxTUdZjNq|JtxJ?+1^s^#P{E!!6!0(ZuGC&uGwFENZQX z$fBt=wWp$g|E2ph=ju28+z|uumb`DdnbfI6o;b5Nm!syP!o(o;tE2_4{_$1+zQ{SJ zuIEtv$m`ouAIo@!H#~GcUGYv-AoK1`r+9+8#vSnl5KAaes1M-V6~8Xzwc79c#?Q3h zO;IPvOd+F{Md0tW9w%E7HV|nIP(=hGX8%2cDfg`~1ti>)pK?Hjny~r<gapEFjNP+5 z7A$D5Rj=u{1^fZRy<TgDApfSkq{NLt9%#7tS$};`uQz2pfL?sBonC496ww(%>H7<P z+WAMb-Lk_ejWS^X8YwA4n4aXfF%ZiF7Z5`jR*DWf$Z{_{Hes!_gxDND-#3mZxhj)P zQ9X3wPCw3>e;7$(m8ROR@a~l&P<%%W6EXZ*FOZh1vmu^t=bKo$j*wZ{s5(xGus3D* zV6)TKvcV?da{Ae<OVkV2$k!tC91Er<3pbd-w@p2*rKJ&OT@Dhu6!~24g&xvrzD>dA z_qYk~F)eSqaKcUai>LldDt&L$tb{Z(_3;nqe%=%5x~DnMBUt7wulQ-ye2~KTF{i!6 z3X;30a#GT91vt6*f<pFDiR$Xn76oTV*6Ou#Q0&8yxTDsTs>8|!PgqKJKH(P#|LaOG zaT=n6yWjk$A0Z^>mIY?-qqnO0#2f5UjPL%_h!)CP&2T6FqtM-k*@Ek{!kS_+kChua zat!bpRbhO3L#vXr-^L{UH<Jt*i>~1|yCYUB&e}@_^|2PC>YbbU*VUbA#UeCZb<2&s zvRsE=vb$xc+&>@+7J!%+^b4uF!;j43x}CO%Kj>zZOTPQFi(?9b*11!6PR`C9e-CBw zm{r*mFMStA{zmw@GUNZw8O2}0|Lp^g|M_6AJDf|XCi-gEE{To;-mK0Zl;(*$0AaOs zPr8WR*vCB@70RBy;pIvquZULqrXeD&=*l|(Rgh%NAK>tF4lXi668NYSEVvfht5UHz zWcV?2P^8<{sOB0T&)UnLv3QZdBRsAr=19_>_5sV}%CP87M?kBAx@1|O%sFk=Kc8Ex zFolDrdEl$xuPBe}*-iHr=B2G9$fBj?E|=pA7v|?D+}(ByR~Y`4Nj<A26n^IzwWQj> zBOo@q>f0tpOYNV0mKq9)L|oPIZ~E1G&(KhtvB&r1FEg-L=Nb&a8Sb#X9#ifSL3?w- zx~O{_b2lS@V1#?++p2nwx?^yjXdcj%MP^0ZUJ3s2qD1D}B+tUZnB?NMcXwb6-5_+Y zO%a3_qy0Cn#Tb-~aM25o>qpL-gEMqdXD%@xY~2QMxoUE%`6)?cNA~j8!8f3*TMFAj zhvFfi*3@|p)Q;rz5#}9i+2J8hr&)X{8ID-s3AwBK;>=C09_wGS*`zLiC)8!?8Ck9# z+bM6yk{B{l{?1pwl((~+4U6x-Y2SA?wKe)q8KYN`uQ>37UXXjr?LCEx_1D-=)pu!a zMiz8^2YYGn%G?yJ$O>OhLsD0SQ+{|pA`r-TGq_*vD6F`zl@gptlly3km%p$-h`B)9 zqP|x)&BLqjsSS^=N-!`^BI=jB<<2bJcyYHpp>sp9+B2-tw;nNFAn0EIB`2{YrB^>3 za{okeI-s_b{GmAFMFwvKc0)LPOTNyAzhYb2I?}`8<^lr9qdT;JmVcsL26|aQX8gK- zu2}mK%`y#*Y1ZrBJiUGXqXY4Nr$?#s^*U<ijf-MFMi^y<^)r8Q1)jX{^xophC@Vj; zgkq36Ff#X^w0M2Vy9v@F%=-fJ*`r8tg|kl>MNs?F*R!j_@ei*A(hM8)!q?s>q>>rp zwu@LccC*!EUrtSZ0=;q%f8N3o1|0SA7AqiVM0e+%aZl<nRVh0sP;<6Sykv;w)Z8<H zp!zr?kxpwPc3;J!o)Y8^k85)1kTs$?0W8Fxs(U~CBM=X~*i;f7u-{@L_GdpH5y3Wq zF2kx!O09F2yD|uk@s&XZ1(1ZUkc|X)J?7%on_Snq>ktE@EtQvUR}+qgPj53XCR&Y` zI8^jo-3zZ3eHkh~KD9PVHf4LIcpB9D%*@HCtZI_8$E?;s$mkVie?LkHEb$rNY*`3R zSN_PoA1%v~bk;-5{~V|vu0uq@nWaowD43zhQ?^<%r8cW$WLD8XRzPSU<Xoxh!hm2X zdTmU!mTJg5Y<TVWu$#iflLnw=Mk!x!ldV(7Y6)5A-R39YE#xzzM<^<<jlT~!puS*m zjzsF~w-IW0P!*r(GsXEh*zhl;4&$Mw^<SWY)h|z8Z_DL9MyPk@b!#<DKei}J>G2C+ zAsBShVeU~3<-KZ+B>$kG-QZ`l8+0Uh6#0F+a6I3teB*31nuU#b_ao#8QTDu%tpWNH zvlMxz=zHZ?yQ0hpZOZASR#`{yIS{k(rLFci=%yABB(!RjoDpBV_%c$?6^?)?vV&tg zjTnO)O)AJM9qqpRZw+N5*rg~YBKGd-c6V2SUS0Bme>})I=<K28$&R}S4b1u)9KwI= z_MrB&?w;;+u+TtOLd);e?XT=MPDrPZrR-qihvVEav2Q9_g1-6z`IHGKcpesv<-aPw zip&<84y-+MSG+HaoHC1>m!A!mSg8Yk7|Bhk-!bNLs3W&=&^>#b=23RL%4p_VH*hfG zk@{9ebjHC^Cp=i~hfj`?jr=q<k%}?1E<IN=B>wbah~q@mKRPL~Q>j7*#j#PI4@2J~ zg-YeE!nK)lICNPyU-hdNbbhk*>w)a9(HkA<BO-)7%YcyYwHf@|a;?*|cKH+UHx@*i zSkb(mnmvkkHn|aBa@b0>$K?nW86Y$M=&XweM8{eF<$-U@-`WW)#+CMsJqGjLs`|om zp%!qS#Oc+y8PYBOsHG^W%HJH;I)~!;EU7SWMfqn*yat;~zh?;IqNG~LK0|ZgRmcQQ zyharPvM-Kw&K9{rwRJX0^XIRK)VPpZ(o8`qbD5`m1_o!0g9l}u06}82%S?%Mb(3`* za|3&Qmz<Sa9c&+39t!1IRa{%mIy{NmSNCIWlYZgKSp(LHvC@Xb#wer?t`Ct*5lDUR z{fIBRCEL9$8Jj`=+2oq&_f`}<#F6U>jVkw$e@>pkUb3l?t0o2ALEdoh>Nv;ak0dz{ zFT12xydQD0Lr%XUna_DEfV}dG{1g9(tgxG|9}LlyhLF3(4t33Lr1&E;Siwt+`0c{b zsXl`f7SfAhV;!a(z+5sh2o8}Xf>7i8{)z!im6p=YUy$m)s_Ud_h8lc<_+|7HqB_eD z*4jmTQJ&NcBq~)OmwrX@Wlum>N?@q&YrcA_oSUK}7S@BWA80<M(Z^yUcA&L`64sCH zHQM2R!|fG)4dZEBB4D@YtrC^bPE&rTriK#T{<G<Z-}_bCprPX0by_*s<e3Bc<aylV z6!F^#X#N*nlG72zl7Q(ip0EoI<CeT}PzKYBRhff&p=(IyY$R>}Pz{?x^xAR-z|iAs zD_Em@Qj9Xk{ZNMVdufZG;GXE~EIFk}fb1fyDvaE%ri(xG`m_sOqSB%qr9b7!RJ-%f z`a;%PX^G%VqT|p^)WH~G>Irh!EqhI?M#3NAy)NY`cVG|yl%Bz}aZ<hWI0R0zOD%&a ze++?nx_eN^Iq-M2=Jds-!p+6UHz*<cG{cD>8B62?eY|c?q|V`9Ay52B<gb5X2-4ys zSu_3DFje_kY?GjOO)AYf>^J(fwaY<AD2mtfX!tZV-$WwufnV1?>gv?Rd9&Qm9I%!X zAHnt2^hE6^)j|U{NWJJ;f+t0$P9u-Ev<mkcEB}ow<E`VruWO&>xC?S$IwZeK*Jv;` z52hj)Lcaws&mrrHB0h;N4(D{B@@e(n_zQ7S?qggf_ZjY#tr-|@9u=#dyzhi9N|VZ~ z)<5m!6M9G@l_fvYXmUtWdvU+5iC`>qs)94&Mc8k#6mJ!Ax??NSwz;q^5)-S**Dwk5 zyDo>EQC_p-!QF!#&Q6nbn}0m1p9`=X0J~!wl&*DX_@C#)ye>{KLSR}IjYVtLV$6*P z`Z_?cum6L9c~Q9SKm+KreRt0n!23`Oix#TwYN~w&+Sgl2FHf}P6jWbCV7;IF^%wq8 zU+~B7$$~>Q0BhuY40lh$pqHs3vn%MOw4Vj)j-#2baRQz-{m>)oorcx5)S~1K=XplV zh#i7`pCpxmY=-@K1YZserIMiVP$!6rEKx77Vs_-UT%tQPl6!!rq%dCkr*7#dr{rHN zF`?|;FSbD((d(F31T>bs6tEC^#S!6_&HZ&z%B$qCm%p8b_kUhS=f4>$utTh0qI99j zE^?)5K`G`i0as~X!lB00Hu>XQLD+a`D7phw&ZyfseYa6EoNtL;<))D`%IQ&aaC720 zr?$MwxO#E0HfkPr?jfCQl5u;BRg>FKo;w}&LOQn@BxN=evI5iHCweg>Dfbs*zK3au z%~A;+_IY{>IG-{t(zXAHFZ>rS&sSDLCtTPGbNq<UK7q|RH=#rM`Mhp=okvh@6ZzUw zjZS?qh6Pn;={*z}qga8lw(PW&_UX}>|MXr+;Hb2xRMROyxMy2Kq0HE;z(V5Yd%Tb` zg*zlSOrnFIDxf}UC`1pmfvM>xQJ}sgQo0BYy&ia_3oj`VuZZq3cJWi1ZLp^q7K`DL zXe!vflIWU=8)}IP6<@;aP_0>-%22`xkEsJH#~)cA-ix8<x^xnk5^6HAGzyS}(*5ur zp%UVC7ieh}k1J#K{&w(kjluTx$pM`<`PHo1-2Tf!U-j>{Co^JwJpRUQ`kzX*&D~i$ zm7MPpj7{MWh3#z=`iB_5MV(#AxWt++6KR^$G%fy|$d2JRZA-qZ2*vl6T#Ce5_C+1D z)ycRhD=rwhU|>TI)x|I-n&b2;d*lv0D)2x<j9lojNWeMw_a(7KcTZyEcviB(q`HPb zpXGT_#Dzaw6U7+iL&C$TD&5}$<$P*>Z_b*GPf>f8t@md|;SKnU!a%dEvX5<Sr->D5 zdsA`nRRHn16tT2qfZ3kPeZ0(9o?1W~)Bxfsg`D)ka}<K4>8LOpbY8@ZySw%8SEqsj zv&&mw#>M*jd@R3M79nv>^U1|<q2~2hnMb$_Qhx1rmkxJb0ET@o)4yd)jReKP62brK nb+7+%HS|{io(6RJn#8>A(0T9o+rQV&@IEN0zbldZ^z}agJ5k8} literal 0 HcmV?d00001 diff --git a/deployment/media/aks_dashboard.png b/deployment/media/aks_dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..26eafbdb25db51a2409274e477884180b6b74432 GIT binary patch literal 15763 zcmbWeWmH^E)Fw)T1x;{w_ux(kcL**)65QQ2!KIPLo!}0^-GjTkyIbQ;Gvxj5{G4^? z-dd}>s?MricIwo&XNP}Pl14)&M23NZL6en{P=$ek{qR;!`SAYjf8t0d>n(fdtST)A zQ#nq2^j3j07gZF6fvJu`f&74ft0Otc=s3f`pm+ZJz2k#dqlSSIrk9lvRrfGBTSNMS zt<?c|Qqx!)qx_%})K7yM9+3t|jP)*$Dm)c~GybOl@2}PLpw(TeQOE{hf9$36`~G-T zYAVrCCe7$`r{fT<XDa=Wgyq2B@0d8e7J5c`Dtgsu2!yeUNd{%d{^KPxOlvl|<WLcc zudc_lCAqET(7O^fw11O_fk8%pWgDsCfc;l?SlQ-_Hjn>TglQE1AoX7X6^`n^93cSX zzZ|yv-`Zh*{`wC0FYo&D`M-|7ljFbpSO5G8_%DOO|9{9wKOs{2iWChpb5v7q_NgZf zk>>gcGyNm!LgV=TeV2C}A6Zqqghw8c0r4MQV^;SuI|ue|hpK21rr{ipnbpy*%nx=# zm*6s|X(uVEO`;#2=x^;ldmzx^Hyf*5FQZwj1|02%<*+qb-%TGtueUlhQJ9)NsSTV& zBpJgM^@<`IcM=VY@*<5T{|)dPfePRAZ*C*+Zd9H2za{)!>Ayv!(qfMAbdsMcrPh^t zAmUz~(LR~yY=LAX@YQg!($IDO9ULZT;bRdkW1i5{u&^+dZ%gBDNZK#jkvc>W8i}GI zt-w26W5RkzRK${BscANOcdD)0`|_M3$GdCBSYd@V?Sw1`B=wbRntFerx@=Q9e&BvR zYXz}d8y-#2#wjU}&Vo*M`uV_z+vJ3nr7!g|mJ5$Y<oDV;39&pa&FgB;yA?i6yzU$f zxm(FJTR{R-UmJSqb7~qd^@gp>Pb^OW@rH|enIW(znydwaKzH)9V1SS9sSC?;8?Y|u zrLp6r2XR6%X8sRO`o!4-=Qor{WzSQ8o0F}De>)H&+}t_5P{YmH;PdEK!x3&gMbn_I z(nuq&6EL4tOF4ma(uQJWWVD!|HX7e2M{=rqRU5BUo$eiZZnjWqN>o7PkVr>M_srGl z5pQkpZM8ZVK(}|#o?NAW*gCPRYSf&{V)_w?cn`a^Gu?17P%EHB>~&L2KV<YWAg?n- zh7Kx?BCFkq^{)-6WEwH*^WQqoKb)HIBZr^A<~?xe0410E(Pxi&d_Qy1Y-_e)W^&qY z;<rz9k1HT;z3POXj1jy~C1-Negoq?2c{yC*zb(i?o}$WVIC2Sw;O1sgvJNMhsAl_c zwre)8PEmu!BYQNtK}hyS>V>X3SZ)DW{n`B}H2F&6dbyoc;~1b*pEK({J8?Hx)>tdc zmY9?v7FRQx%u}shUG_))XyLH=DnUqZm+0VH^;1nk<&a)`m4WP6YUKLU0@-4t+ce76 zKPCC!xxK$f$d-9{&L!IqJhl&8u<x3)cxSuZO1z#nBKjXv)(f6=K3-U$0e-7Us`lc+ zcZ$%)yZSfRYb-r9vmu|OVokMaT>+trclm6ui$UgnbIu?W!Mgpc1vlQS)kS~kBK`K4 z`5HtzQXP@I;|tzr7rmFQg(?kx6vB?D9sh)x5}cJ~Q$)M7<r01WG&%Wyr~KRGEqtC# zMUrdUA+m3k@9jhn1d<UXBZNVmoS2*}GjbdWMu7DGW?GayFdR2bEL4}B7@~&1wNH#i zCN;`Z-%ixqbv4$LS}%3sP@eZuWmq=P#k+Z$X$qa6&TVvH%ze(3yiqdI^}<~{(-#o- zqh=oeYevt&9xJ*6LOLp|S;Zq<V}25&5x-Jyzi%`I@QDN|gh~M*omriDQ(37{&J~&c zzUb4(ff6&$^@mw$L%;2gu8R6|7Kk`3ltDNn`*l_#>)`9IcnrXiO$Ti1C|Q3WQSu5! zJ4>#C983EoD>7hptks{axXH%#nnPXY*!CHN-`3s5av%_>qU5)QJl`3gsqu+V2Fys) zy|$4*S92tX$)+IXTfp(094eOZi+Pnqo`+G=9B5#isCR`7|Lii(XI`&c<uIMyFHC?Y zU~07C>|Q<Bv{Xf}Xgg45IpdVz$EIG*?tMo>u^d$Hvqo@n&aw~ekVzeUSPINL!l^#_ zD-F0F1w`c}Pouxyrh4~>SY7DcA+A|w=qBv>;iIkawH&Rz@`UH*W$>MMXeq^ES{~3` zNN;I%zP?a;ttnTiND4zvueED(Jxq4k_E$0T6+NC5*ZL~Ei2hxmA&n;}QhXNqf_WIF z9yGj$7x(p@A1%_ZCgvWeTV*zcX3PAz&W8dl{8hd$kLGd?@V2*kv|KOFX1|!+P7_!@ zhMcFL)R#ab$02o3EB6Kl92()$w?z@J*#)(J8UB>td1`)}c^y@-)pd*7AkVPAoPrzE z4IYQ;9Ib>7EQH=(B3t`2sGg3+FC^+8`{>=cMW7;<63U%AUgZ{+rn*S)7CMZoWO7X6 zL~vVKh|edIO^?m3i#Ax7AK><$Hr3ydmPN0-YJzi<w9E1S)QCb57$ix%hn<kYo_aF8 zAm|-)DU^A+Yi0F}7g~w-r>Y?M#U)b4tMdCnb76E##H}*@)#2nTbX)zmsJvPsi&ls| zn^$89I?grt;>IHL%VpK$LDhJgfWqEM!a9|~>w$g|q6fyOw~6BGE|39bxESfZbUcr$ ze3+ay!sGnv9Ff3uVv;SYswV8XIM|FdYqo}o(g-Z^Q-biG!<Qsr8%;u4S|rP|1a@iv zp>I1aWa~z=c$LczBn#&$9bBZu<?5nd?KeDrwsM6W5#ELd1{5UXK{~n<3D~<cG4VV{ z*Nz`@_qvyZ^0Du}TD-Ve{5wB-47Pq(1!4l!VXLr)ZC)?3{*5Qn{A8L(7yf`rM#>?# zg2M?idb}QN)!qgG)bjoacN&0A7{x21KO~OD<-(4PmRg{YKmu(LUy=X^jwHn?^j{2( zJa3wWPHz}n3U}VHJ!UV&9>E-oyuKK^XHndGDvs9i4{^#;VFD(9?EL#Y9J;&^p2qKa zSVr5DC8_Rh!TUQM?&Yl)Ll<tXe!N+Yug~rGB+l#5b8~-s|Gi3%gW-1WXcBin+FxQi z+il+Cp*0Nm<~SZHkn(5P4{a$Uts7v{LpNW@pC@(Am`Kg1pvAK%(y}I`>Ir+A``;J? zucw}zfYw&15omg2N4(j2Y{Kqq<plbr%fXGmeUJA)*1l?WS+@8cjE~W6`8aNn_oQ5- z1zOME%x{akZp>CJB*WzLyo$KpGj}O_yFfYS{hRyvDb1a(Ywa(%v77B*KPnB)ES%|g zQi@xm6crw!aB7ynPG9I7yv&96$7?qGV<b0~=W=TFS!e4HhG1;189baWvsh;|c2*2t zYR6S?pKUXW|L&x~%eX!XynTL6OFvqb@VSPVLmgiAhk-Gh`G)=mS9i`IE#NWTabK@r z*ZlpSs}7xqF4J25pSEk@ITPyg)3|tdlI>r1TH`NRocEjZweAvLu8t7t{^;~2&;g#$ zfp%w{DCQDO@E&9a4^=Ex0K$UNCmig?-M#{pgm+RhlOicsV%>LGMe8HPz0X71|K8N4 zv_V%w*ndKogWwKdj6CDp(>H;M|Nl}@>pFXa`PscC5CeW<*UU1{5b@hjJk<-Izu1w3 zftdt2w2Hudzr2MgmAzi{UJ{-s9;&~t9L}LxV8S>s1&~s~bZvfcA?-F#%~EFn_3Xds zwWdY(r4w`zj^4>&qQ>fBc`pXjWsBhTCjRm2O_b38$(qj_d0PG)Ezx2B>Z5sPE$_=w z9Q6*yj^}N@KPmRvWSd6b?*T>jKW@ml1m1cZ^SWNZz_bUxiIw=(?+YjwzMgmQS=A|5 zh*Q7+u1&cxYkw`s2-6iNF+r{O8wAKOCv=S7cg*&JlpnhqP;$z>E0fateksvdyi*=z zGNGB7C_|OC=MjF7Pc`3GtHW`ozcI97Cj7`e(4y6yZWjNm;XO<f|92n;%=gLI!yP)r z?;N3q&$2dghsmvk^6!Q-RQr-umomLG6n~r}?a`I&S_ME|3Q&axkS{G`;K-F2a)J}G zw-(3yOk^7iSY6V0Bgec|?*?un9hHClT0wwW_4y|V2TCMa@*IaGOlg1F4%GVGlc2tN z+~@`c7rK<h-X`?PsksnV9YJIxj<8EMK|BerEfjMZ72wijT_|q+-B5B3;53p21_t#T z*k)#cv)7d~@pMcwyami|L%NEsHNs>6Tp2j_`;T{$FgIJo7|iKuwEMWC_f_?g4K8ZN z?ib>i&NgNGy4J8=Si<m2uF77Ntczg>0%4RXC89k{yhv`j2-TKc8M2R$zdEbWNeeKu zx^WK0rbTSwUnjhNT4<;$STUInzi(lJV=y-*O)wq)I4#w6AB$;A?7v0pQ5E8l`j=;$ zweKu;K)U3DxxbUPaMY6v2Bzs~Q+3%kr=*0+Z7VV&xSB*!v7Gp)s1)WWMbU)o>zLX& z_|C<hWbZgaIE)hFnqk^&KIK2Uaf3r9(Ln@WVwC(Lb-A;@AAgxJKuGAY4H6`EHG;q8 zVPVI-4#W%5ZHl#(239JGAuQ3MBbhK*gFueX5AsW~3zz|1lv}=ekwP5Ak8#uxYksZn zF^(n%m2g?U<FG+9X-u~Gm)%&4UU`~))ig@mS~dt7nsOX-<Ty4w48H1c_zvxhbr5M@ z`u^K4-py4Xk#2Uu3DZm(b7`BHNY_Mwk2XK#g0IO<#0OdPJ}4bMZ;hd&o1+nv1;Akk ziN9Ck&(98rqs=M`|Fw%AUPw&iy!krxaajbNR0f+x)GCUze3PSL)>u~pok(>{;C(76 zb`zC{&+CsSyI$s}BW2b7XDN(OqN!*&v>xyMpxQWQ!OP?>L}wSW%i{<6I2xrmPhz0@ z`^t$G+d(U7iad#T7eQgCXEmRWH@U3}a3Cq<;rT*s0517$sVn0il=lXSb8qJc{#pv< zwTU}GrHu6;x_~UVFP$}U_iuI0IrvfU__%)0$pD$j;pB&kdtvVAqD@_aQgVSQO=Cuu z;l*<rLK{}n@9?l_WjV!6(%_A!yWQhoV=JYTKvQKFe5lqL0zMGoVNkC~)c5=I0{%;| zH*lJxW~e3v9vwZDh&0>qlGt2S-!>|TeaAteMwXBm<iIoSAQOeReJSeo6An>200SMK z+FXWm3=w=P;m7yMiFo;TZmBG-4<H*wfLFSGnO9yHh1Xm;Jk_GaLf5hGRkuIBJDNRC zoQJ*B$2Y$TmJCd<(P=|iCu!5R9BUU4^#Y!T&B(L~vdh-cJDd1BREp;#hLuZgg^Bl) zmp!#FdHe{?Y0jy(^%CoeDGGYgn(9WZ@q65<rl(9{b|VMbB<jKc-EichTnamYe@b}= z6M}m5(=5K%z`EpI92*O(w(QUBU_=Om@la_-LIx#PItdcx_Q6Cpz+DRRw>mAlrPOx? z+OT7T_svCkdE$KiY3f;UqGsva6q=WboysX=TpYGZYJ9oOX&rfUnN;Ih7w-z2Ok7{? zHq9?-MndI5L5^ur2{!tv+l1Rp5=oa3mq$KgborY^lo|nM9s#l6jv=hrvSc_%2)WKp zp9WAenu`U4Xv@ati;YTTs24gDa)jX4%Q<$#c?#;Jq%b}GrcT^VDAq+y6;)-PdmIRC z<3^cI;{OEuHz^e--C;d<RN13vJ$J=OMNPSJ>t&TjeN7$1xaO|GwG6Wp)ro48?4vV& z`u!$kE>~az6=;IVa&aCXQ!NaCjdvl3(#3DFk!jY|q;A1<&TKf&pLqKRD`oIIn@tBu z#+ZrR`rJXZqblq+qD3EYD$s5f&88m3+~iwCV@6pbq(x20KWzk4VN9T)%Nk=z1<&d= z%njv;PHC~Ai+FI^OIZa4oXVU#I0%`m4dF%s)fuzm;Rd*u1H~$t>$#Q^{z}BZmu2s^ zO0=o1kLUU;zo4K=B;ue>jBIPwWVYuZ6i4zvgoNu9pIG^eNTPI6#UohLS_>swGBdMH z20<jA_Dbp6s<wAN+C6^^=#bWTh1@up!#ch?sw3!FFpoYv1iwXzW6s;ivuMks6X$^* z+VY(=SnzA?U>+G^6$n<FCo--guK?8W>-gKsS-09mV>nj5anYKvYft%uAf{^eIP~Cg z`4cv!_8{vboGgtDaj1Lbj%2EJoF}Ri225`^3nmaq6TC7Np<n}F%FKK#C)Ga<DTiYj zu*9n2!EZB+_tM_&bCOEVj>nW<ukS0^O?;T0J=nSS5l+8Jv*pI#FN|l|ymg8I?jjQ> zw-B-|W|53Irk1Y^s_TAn4^(HItev;y^pvD2o4#^etN7@>#YrX~C0RV?f!isCan=vp z60=UR{wm}CyWc)EJX?S-*S3uEet7Pzw~x8vwxHt2$Sc*2$g^uhlELr3`FH`L3x%RH zob1hJWyS>VO47yh(aG>JMAnS;=G4kpP-Sk`{N<iIR!V(?(EwerP4|9gk$$MlLhy9O zFcomc=6f)-E{k@}vu^*HEOGviYRK8f+<9%oUH{8-qu)dKQ_t(m`bMOCR;gtPe}n%? zpL~>}Im-a_?)>SaQt+m3?(HydUp8*r4b=Mt0MXSl>mT^_Gk-bn8JX9&&iy`1k*w`? zY$4P(E)iJU|0CFhfIke5iU|r&gDB9@X!0U>L0n!cI#zUly4-24WnI*3)<~i5T=U0a zX2H}vc4@g=R!CKcXd>wx3eM|ne}#IJkqTT2+r3@wmL)5l&pVA9z6WQn>ByY|4jsYZ z*Vw3f1L2a_>x*C_6rM_^htr$92Mnv)hMck@xd?!t`->sK<25iwg!SpX3BK{Ca%Rub zb_AQqvhRb~kvUoC^SR&!WM?x+>K%W%N^*zKg+0+3$em|?&IY<NkVr>3**6`-+xC2h zqaF!MQNxuv^ZH6=vkvJF&Gx&5cC58-tbnJ^?VmqWe}ZvPTmAiA-SB#SE8yHvnxsF^ z+y`Z7p(KkfhCn{jEeBYaKRB3QhgxM~GId}oQm308tJT(6OuqJqvFInup(BXbSVd`h z`aM-ile@jBW`1zS-BXWt3imU=_;gyFysHLLjjkdsc4~v!#gq9}ZgACh|9rmWwtD`E zoL4bDhq5%IY1*~g49aTrc?Bd6ES9(0=&0N)rKiW`*KR?{HaCwV*yyJ*C*pP<XG(yw zBmS+d<8=MUcIWs*{$qGGVOxqplpNtkV*`SsckAoy+}!ynF6`79$nujB)>Tz9eq`GC z*-{G%*}kY_HO2?-xw&Z^E28Dg`vwF7^9t+ZFF$s6dWTTO_MP`MayZov=#)^|dDZ<i zO3Sw>CTah;?Iczf6GU><aN;VVA2m5SBwx$SlTDuSFHlEk^0-4GmTAt2mK?WvC#UFZ z-I0o7U{pOvJD*|;Qxq>V&PMg*<jfMczkrlFh#~2xzU9NP-<PS*n3P;?`AF#r8FxDg z9)JDaeUyI;F`UivTYfB}>5H-Czw$ilCgh|mJIfVsAhQ>fH}EhM-47J?`9L5aq=pgd zk+lQ=OU+uWQs0LD8Jx?{Wi#IkGM1tmVs>>+4GjMJ3k5w1gltZPI9_Z*&8y7XoLOPb zEr$W{=5p5kR4VN6k>0(0{Kq}zF5$GY<50%qsRWNKo1e9*{`z8tZN!bWxcPDO*Gvd4 z1><>EvvZvJy0E5Qqx9thkL{8<dZe=NXHPQ-_|y6E)bN@&;py%JMo`Fn^bB4lFfBG# z!2HexdR(2k!uV~prw;z(m?A39w;swJGMzdH%~kDuOq(_!S>IQa>X*y8ZetCS?wsY; zqIF*HyGLVhz9nW|`_n}(m@gY^n8I%tnOH_-&2-%d%b6OXc#v%JtETDpiojawXk8sR z1C3~&njXbVZ?~YH8t{w-c2bf3!CIM;)Xd0MTeVZ6Sg8Mjrofc8&k}1|>qxWU_jg-W zUCbpV6ID4~-8de6f{1yaTwm|rkPK{9275*H(#t_t0#DDQ#`VK<a<ulP(6&w<;#Q+b z8K2Xsd|4ItnVJ28P!E@s&+m?dl+y^vWCJkT3Aq{Clx@+H<|8t{xgc6y$rs~EpS@d4 z%3J{T`;Zd+xb9UJP6PV4?@A{ZNl~qs_R2CL$B>bQ*wjna;N(?{;tTQs_wrkoY4Zul zE{H#{L@Pdd>SF46+A&AV-g1k?NNy^UV{_X-#z)5O81)zzvMEunX`@k>X9@%3ze*VG zI~6SLIS)*Sw6K%%X`7>@-rW?De*4KpTfk!I!uxHSQ!$KsZceuk$+&3zW9QDg|B#o6 zmy5$goeomoTpKnvkLCQV&WuJ<OX0D+-ssB^3Tc|pf<B7*0A18ko8F9#C?CEo`qEX` zY3P7XUo~T>BCT;4pOY_;+});Rc0o7YE&DSMe4km7Vke!{mm10A(>gem{19@A`Y=Ah zxL(lDcx-4)BueCn4#ea%sL4|qfK8%fTg6WhtZs`Za9kN}5F7s^IwIVAv-${Bv8)>} zJC+*l@4P3cHNC^e>?LG;_u_mo)@<$6^z;|%zZiIt2Ho7Ly-?1&zYL)HII(SA=Kq;1 zWJywGQ=GCtI^E@7_-3DO9q>GGwUsvp&`S!WR<!A<8_N4@hDb<62Jq~$5Y-I8pbK8i zvoWunn~iGrzsf7IyutG0dd?>MHYkrfRN6ohO8-b22lF%i0s%fR1&p^}c?@;!WITt$ zZHQfSGhO<ceIRgwf1d0a#ZDuyV@O3&G4%^~IvcWBjsEH-hnd-p88^M8t{mBx!EPf# zPsbFs&NvN_J+h9U>Zfr;(s`8hdJU{lG?!yi*<-3bDj|{gMahwKPsUb~w>j3FUXR#d zvF_=`D5WDIwN1>PW@5c)t8E_!8cx`*uc7#sh=c3bzlSLpKyPHZv;B`#qZ}BYz&B~K z0K+WeA-SiC15kLhGknCPc832~Ehcncm8%`@;=G*x2&*VpBe1aZfVG8EX_e)t;KimZ z8#HVl9v+!gLZa}6vpa3@AEY+A`jBaoZvaMSpV!R5@klN$qRZUaE64E-HWwo<gPhhf zZbeGu@bs<a_>LONsNYd&XB_7n&ChEjp(n&`C6PXHd4s`DapH;y?<fq`mX=mc?1b(^ z8?OP24-2+^E%E>^AllhBC}gLird*2gZy6VHv?w*!6vc2{*kwyxruf}<Oy|7Bn7`do zfQko039}o#ESM8?>2|3V`W<h`*YSPTzC-gEF0n#OtW6v8f+nKQY4MWEtN3j}ii+_a z)IYuP#dYSHh&L${(ji~&7{;=(fUJ7B+l0@79I?J_kFnbj%|nET$<9b9OP!yivMhKJ z*3mocO37V9Q5=w)OBXj1NY6#D=jOn%PzgF3v!Z;|qm<YtAW%C0vTKZN;w1b>n2XCw zZ<P<t^BcJU7X{DtxA+`+Mh++;%;#CVU;d#X(>-!Qcf#(;m@MaBc4U5v^plA#)4>ZT zDfg`}q`000i}F7lRI@tvJRA)oO2`Gd87jIyZ4&DB7nb5Gm)Vt|n6J6$w*?r22KogI zdGij;yoWPR4%RO^W+|R@FIr0a**pSFsUTj#5=jwR+Ml5Utd<WV9PfZJkvLz~Z1u~k z=W$8!cp2Q7hh(*)>di8oy}TkP&HMGg0RT32QSH30DpGf=7MgOPm^nwxA={gG9`h$m zk@}pzS9xp@wPn=V{<$m<`?XM7uWr>{X~($Y8s7Nd<Sq>#c8KZ$UR!f*<~2};ohx9G z!NVR~(kP8N<vOFRRelnmXy6STt4crRNF04Qk4{hXFgrg_u2N;m>F*yC;{l*Al!(HK zjwAuFh*TT}Jp}NGdB49et<$e~CNf*kikh|Bd~7JCDPajSg!atnOo%)yxXs72K{k|y z+AWY{9@wK)^M97B76sXO>|_vxqh;E<VRHzm2Mf@Q|LA3rm+AdB<Y23s*S@y;BMFqs zJPD+2+;m<zq*K`DI{0MjL=p=}^>>Az5a^*)(-67{$8Fx|zBKxPhb4A-QLx3w{o-r? z3yTAWYW?!nUB+2ud*s_)3wCGAr#ZZ&Lr2spD?CbdBfj2a%D|2w#oM|;c|AP@G0B4b z`mB_UH6e3UgEI+Q(@I8WZolSSzYQiDgTNjJTRl0{Wdkn+NiX~_2eW^+idj}1%aMZD z;^jofLflNb<`zP|KbWo&EB((G{oBzjFVMC4eDi>NC)vb6i}CtqkPDxUe#F6yawqhw z1vLpkB7`y=4KIe<MdEKi{M1t6@^E1TbT79n{c~2kk@$}*l$p3f<p|7*@vOqj!LLD7 zi#UXupNU6DZKmbbxz<Ob(-;pHk6~;mWnr}!5)n+xRf7aR)VosHLVEg!QURHt?SMO{ zePosT)*sREW(kSai0{m9xVd;J7=`L83UdnCxhOU9Ndn>4nLk(&lz{SaJ<1TW6RBx1 z8BCODP`Yu6&`G)hp4&sepGr{*LQm2iGB&?eM1KgyHnKk=uSQBe_5>Z+g4JaBLWgsa zF_$|J#0DIH=-;s#C(C_6M{#s<$T5~4IUctnR_}pRG?9=gmc+pTHmSJhexBpLDe*#j z{WfqkJWolX;nP#@txf`{Ti}hNB&+m2vsydSoaGP@!Y?8LofoC;d^&qUYM`o@vZcAN z2Ax@ZbeHZA{<gceTw~P1^gtTm!3gFFDbrmMZ2F`a_IvBN5?Ltv2S+nZ87e9w3~I#> zG9Z}dkq>Wg*QB7?WPhJo>el|qAt_vbV(iPa=Kd~jQbN)(GDq#TzE<6vRwbF9+Q`%F z<Z5PSfKeG{y?^4vNK0K2Ci-U04<=${&`Z=hJocQ%Gr>JX?bpl`l@38OrLVH$vOIEa ziHpMwL@LNXpvn8_?C8bFj*nVEBl)<tOa^VK%;;y7b3f+szkGDJ?fDy=I-LD2vV~XV zeR%S{&AN``yoHc=i_tw@t3KPT!lnQi9-mtyF_TqLXQrqDfoNPRRlYDd=Z~d4#|-V( z;-uj(vQ&O&Bko~)amLeC-SwY6X8G%7)WVp-qf*B49Mb|8sxB!WkJ~sB#;V!y>k`@) zA7pt3l(L1b7wgMvqAEUd*&-a33bZAbf2Ut->8<}e0B+{&`6@kkkbO$avXj=KETOIk zL|7U>qeas=oh8ssT&F?eCSCR}2HPk)r%$?7irapS&g7z?7UHAUn_HT5dYpc&opZIF zP9fOoari7y<9`7vMbXeG`gp#fr7=?ia=-;~ap6;huNEi+xWasrJ#kdw<CO?l^EqX1 zw(}TrtGCi$<~%GVX8(Q&wGeQJoEV383O0FXLu&?+`0zolj-N3DDl_;TE+3kWP3bzJ zU_D!Bi5_7jte*1>kpmIe-bAWz9YVHz-Z}fL;o?Q;$5*Leu~MC4mVKblYw2Y%#M~Lh zj4RF%#J>XyDfBM$S&-|IJn0T$M{oi(JxTMM_ICS>BZQ(mY=_Ik5ME-M4qeJBisr-B zE>&D?h?>qE-_DloZY;bGE?l@8Qd+B76s90B+rPum(5<P|=(Rg<17#PhSMu)a&1Rj$ zGa3kjM@;mpbI>TXF8+j(oK%mW(}|tfKxwPFb#<%UaGdomF7aE?bp-ONR>|9uqv4~e z%J=c5WgIrRo)qVQ4EbK69HV67<u|q5m!FgIUR(~E#;h4#w>+4uQG3y{Qwin{$yXde zNmL%1H>=cnH8D9FrfCM-z2s}q4DgyFB=54M3VXYar%|ejO?M6aK^+7S42I%(`(0Eu zL?TuXJG)khodSbLpnFqC<EWwtC!<kOpAAb^@8`6hhs!EMlz~4Y_1-U}itw@v{GGpC z>n_!Wv`i;AAQ&Fz*U>?5!`~H9GG9_*3A|K~K3*C3F(u}UWzxExPh@LvLVOP^EOY7q zfaXDtJF+o>&mnakNKN6z@R66WD~^ww9f3s}&V!S-l9ON>`OEi^4`f0fHQWMY?SG|F z$0NhvEM$@Sd&b;+meue|@v3-=L`<<E!)&?vk28nlM1SQObz1ITptjG$G3U0Zq=J4% zHMk}G^=5M0`ZMQ=wmkYvDkx-x0%utVcx!^}>H>9D;LFsDvI2`%ivzx;{AkCpBo!9g zp!iSCl@gr}zc=}R9Z=CKIV>uwmgx(dZs{ZGMmE`xnD=EEOG(Xl_RAftRO*RbiZ7JI z%fl%iF8(%?m5SO<QLzHwJjyE4-K#I8vBE1i-<%)a(9MW+|7kkN^7AS8*@ZN=y4gHm zxAtp(OR%UGm_0r`sIBeiCp;;QKKV#$u{(Rlmv2cYT<2l6NTT-$GL~l5uh3K+^?O<> zAtX9(qIKanItSXSuT<&A5*CSBC(JQMRr63r+m|%DTu$$XDdlUzyYe8qUOVp4HOg&k z1W75T16Y)Z%pWT&3(b_dvlE0?`h%r_D5~*3Z$@jc{24r`=5m;e+koJ~wxN#=ZThXF z*MK12*2kb<-KO^L#l5y4wlXBfnWK43ti{E`n1dEIewfgsiCHa0@J+LY)XFE%k>Ud5 zkt>;~bf|ev!{dHW7iajd03pFzdNDwX9>WZseQ}d(cZo|vk_>Kbbk(g}kKIiP?#FbS z2PV`a6df_QR>eFODvo^u*KJ+^A9mawu?z<l!NQgRyfvK_x-^KwDU3Oe2nil-yBs~k znE1VtN0@t<8?}H*C_)Kbew=z6Npk#UXdq$q6_3fs^FLNWpJjtj8S}SJGsF`ra`j1a zr()Lz1b^*dK3>XQOG~#L22zrvi1FEML5P6<+#nYL0<;T1Kcm^xY{2dJ-zms2P2q#u zW)RqbsW21nH!JL%r0HcS*^euLen&At%T5YAgAn!wr2o*{0!ybuBl5u<gV;@m=Mzg) z5QM--l*N&d*jDBb`HqvtIS8~yQ9Ad49b`TfsuvH)kAOvHyL4&esGtG?)+sg#;zCY2 ziu$(#5U7agN*yF}W+>_60JCzHx?6{mtR}K?;$24(y-1;YyFJh1H+bt|BtupNj_B(@ zr1#0OnPYPlO>RuSV-86Nl%JBVQ8`sB(E9f(ZeJ<KZF&&r9cFh+<}NcL3z1+*Lcsu5 za>Lx;wD&V0ThP3N6O}bca0gC^#=VX=l`TQDUhxmGm9zZTNqb~3#H?D1dj}f2KN^9P z$TGP>4D*@G&g~7M1+>^z2vDZuGuym)I1QL!0~7ad_Q`$yIxe^yIUb8D<`>7km~BLZ zlc2&oPSd3Lv{ow`P$z!!sgBSfa+INh-Wo)p3A>;Loet9y-~Cv?9}Ap8L8CpFH2G+v zIta=lGfloEjq5xS<q>D{;*q!uRj0D1_n(CG?-h+s2n$f$3~I@1$xPOL6p%&7DVSVD z8Y%%~VzXE<J869)7&?1`g}k{0Vcw8spTh=IgWzy7;4J*eQ@g0RH#u|_IxK#Y-zK)W zM3i?=!=(<q&X7_~!|4Y$?4<+s&L#!Gg5OdVrnnRO@Kf`O1a%eUGGs{F*!84ZZC4$d zr?J-*%|DB^DZHk2^jO2|{jw25a<<9R^NNR8!sf$awP|c17ZGD2M~iugR-z7C7K4id zG83PyyoW(0_~)k-l^CbyW2aZ!MLbcZNT@|+8rVquvU5!8G*7dUNC^oHCT);lxI>f5 zCrqd0CNRh9NOZ)|$+sDTwIt@<jpkIU%b2}gR=W-?-&R}Vk8IpBpd87i7BrEKr7_5h z8~i}~cS*vacSc!=G8u(L4v=_4Ne%P8_#dPWmBWe0F;m4th`b8wG7ihoH6&(s6hMun zn~cp=-wKZrAVF>3E~2XGa)TyyzOS8eWw+t%+7fgcW1rr^<Oz}m#8Zz5#d(re$*~Sm zsBFVQh<4a&0C6{s0~_8JNH7k)qW=czSXZKN&vJl-1`?4H2;Gk~SHC-F`lY4OG3Y_1 zx!*J1a(?1CECj}T_qoo2HNZdQ4O$hrIlIHg2U5?6qgXbTf=AbW)4q}4uz}xW^*5~B zUh6~6?eKx^aYK^gTB>g&aR1xIZg-S>|4se-MQ>BqNv)Xo%on6T2N!8|k(WOF`~mYu zyczN#g9s9WTrgR-s<Er#6?wJpj_I568gF08#&JSyj}C(`_s^foE0+x$l^r3D6=Db0 zbbJOU;dwb{9whg0zk|W&*xjI5O+<KWgdo!T6e(C)Tj@>l+~fe$^(kQG_CIhUev>}g zKc9IQ+W$8&W6IVwzZ8>Z`FFKnwyRAb#s4}(ZTJCx7sH2to8j$Mu^C#j3ovA>EQ$|j z;_XO~K%UP@_DioUFogk+{;`u>5^~z4pE*&K-?;R?1peJYe(hK(e0X&g?QBvOXMYz> z2J;j^ENgmWcgZfH<Pz4Qx85LijVQEjY|(czH{y_zyPqnjU?ZEoMP-utOEGYTP$X?| z$VkRuF68jDf|sR*-x{d@Pjp)ngL#hW;Foc+2aBf(QYGnjW`stj_#B1wVwQC`@d<<w z4mG1(%at=fnCRK>CX1Tow+ijDM-Fj_u=#BbYvcAgU0+fa3R65~Pgh~hDLy+;<BfS+ z8W@=_p(#l5;f;N3upwp4!+_p#i?J1Kxi3{(lapS0vwID}dg?tnBv}q&pIj^HH9HzC zMcgKuq}}>^v;0MyncKIFjATmm46*Z|(N$h>Wu?fB&$4A;VoTR*AZ?V1s9Q-uJ}>m) zMGSfG$y3D4jibfp3_#2ZO>$noc?A3P>nXP#+?)$pTw=_>e7({i*mXX15oCQ&Oy7ia zAN)CH?X;oB+dnC_ElEJD=jQxYk0?jJ^+M<{M8t#Ce%gmr0s9ik>|@#e6-@JSLvRex zc6q}K+6(5>{Orc%D#$;D<b=y4wfmu`$~WtEbSMb1x8;?K<>u!7kzYY8Nwl<S7zUD* z_<0|mp^4f%ux_{7T5{*(ShA~4e_-vZbF=l+gP|eh#IZnOi}kX6Le6n2Qsfq?ZB_?J z=j-0HM5(`2KWE4EutbcH3?91j#1+o|bWk^NBU@ydBQ1G=C3nJ)V!1Pnnx#H}R~s#z zTK2)XfRxGOrnqeOs<vhU`p~eeGvF+_pmghy0c#JQastR@DF;X1T;1Kws`zQWZ$!J# z*>wE+xe{|iGAnr8c;bfqcpW%k6cgbw?HWfu)4>$=g%3MwRNhjzqM@UuQ~%d81AF4h zi{UD-#=-(#XGcJf<B~~kqEQm-&AkY}V?kVR{639<`}<J4Y}cz{wyCD5#$y{q<v6lm zJcuD;+rx>=+Y8=gyE{H2ARb?Wvs2m$-94{8*}wKv8KD6SqC4KjaM}Yy6OI^{zvpQA zTYJ$=X=}z{5EHHa-`AUzN{t($T^!aFR4Tav2KX=8jtZiPcstmuPF?+D?C+fe<=F;c zn|$$y8L<u+URAFEd{t$ZA+9ThV5b~_W9l_q(}5Old=6^$NXPjM;+BwXEOORC6^2bv zG&`mFBh(;#uJF~3>I|s2W&g)|TaLp^b*ht8VtQ*x>J8tJAen7|=HvW5mZlxtud4R* z?`myIfz2e#)J^J0L9(k)Ok@`#i(q}KTtjMxv7VPuv6l#>+jXX}b5|)*;o>0V7qR&F zzunD)I3U@4$M%*jDvK5D1)^k;4?dV()dM8yGU)gG+Ky4jUKMwD9_)lA-C=FE_a5w= ziRCvwKd6M|PIc&{VOi8-lS32NLK;CC+?$S14;B%rVllMYw(u_c>9B$5WZ36+R57E9 z<C;p9wI7ry!R;jc{ZHPovTP@C0&hpY?r5aWbfqEDGSNNKSD+YDm!BCBq5tZEx)PCj z!62ILk>z=r`cskr*2xZkkR48neA;jq!(y;g<;i~O5Bh;sj0e`{?(X!A>`ymD&-_c? zB+3or7_de~r|>#Y)Z)r*yg{z-f*eG@8ojzhB18}KYt2=Q6^nO~8M%E@_^nK{%$JXW zI7|+0MpZx?Pk`V@h;5nqLOs6&6?J>igye~=VMJW>5vN)R=8_R)+~8XUF`$xYF(Hdq zH{|xrW!pZJ^kc6bVntED=kl-|%gN7+v){<GaSL7^1YpCvNFHB<`WsPq5wCpC7@^z~ zRKE$d^FCOCkgl*DM-oL*R>Ne1yGklw>G9q`NIbfOlhe@_^%p15f;XuTzFX_*wx^IA zAQ(tZ^#n`$-~Ie#<KcVFosNw9KX<)d#t-cOfu@Jxj!ROxy&-?z(ii`KeDE#(pYZGd z8~$Fn(Ri{jH&@N@uklX|6Uf8WCI9~*<l%gx|Lf}~(f=h>-Y#$DcI@nMmsBvT>HdeS zOq1#x*ZPOW!-ukO2ZDMd#>sHld`}K-K$oY*f)A~J`DtFAzmZjw{zK`nl6Dt2Yl_?j zx4)EHoROEvU|{!$N+UV@6_SbrwlQH~?3$itHZm5WipF!M;V$}Rk3*dO!f}opRGh{M zeQ#>4`!~2e6zRXh!4(;!p=&umBtN*iF3xpB+6;j$&+mTWynEx1lnt8aL$7KtrkG(q zC3FK2#*3}LGJH7i9DEgMyp3IXgg~IjpRB$>)kQ--yfxgwstPl9X5Cv~jr1|*Wo9E| zMJ=_8B|EGoqc=E^<KKRJ=oR4RrHFFWuUX{PAG(t+#YgehSKZOa1iI^m4Os8i)kHUG zg~`nO;6^UDIsXkyc0ui<uA`ggH^28?)jc8KI<6@~@oaLv@a8e{y<EO6W9{JIh!3i# z`tP4cUX2gEx`dPAJ#as}yH1#+0lysFL-t?BVR8nC)*qqv9U_YB$6npi;R~R^gJ(~J zL(R2DS%)$URxe*IGg;1bBAddv_SGjV9!_SE@aWp!>j_SK2U=(K;baw?Veqy*UTYOP z+US{UtDi$kgd*C<W#-I`<Q_8w)a)Zwm1f|a?NkvXotUqmjfy4-1C#R5xW;%OxPWgV zB~H|=>nEHas$v0sjL`an&LCq18ibjTAZle{nhvcMYWxQ6;uhqcZLGEgP@c!=a|9~Y z>-)Z@6AExYkfW_VDR4_JhheWZ6M<Rf(xI_!PRQv;iJ|~%21crzcb>gQ07Ltte2J7q zb@du2xt{4z1RoMb_Uk~9Me@L3xJ<w*<ML`?m4=m{OaAhz-;2Jq_=LJ{P{ZzIvZk%( z`tn@C16g#3%k6R-GYf<K&{9Bz+z>zL?`NH4ENQv!uD5yD>*z4ATkI?bZJ2knP@!i< zfG!}Z74<eXtzpka&~vTGEKk2}6M=87x1*i{?|!ny=kU{T)38)m%y!BBL~PyaMW(@# ztcg3}hznFPF9Y8qW+IAM$E4<Gi2&-_r<V0r!u_|{;{z_Th}`C8A>IBNKKHMsww8bX z;JgPB@~|1>2?y1OS|YJI*XYK9Tpkpo>4HgJq1sZV4jgO_p_i(9J@Y+Q08e#tR}Z^0 zcG->={u{jXlSG=zvL6N)r$Wy?YcmF}QT=BOj^H`G$jFgNB1PJ~^_S8}!=gr_C>sPY z!4a{O@ZF2&z?l!&+Xwfu=WMAOEbC$m2Na4rSZP_zXG@ES8{pQ29Jy<;GD+&&9uOs# zh#b20JK#L%HT5Cd+uXT%HSx!AQ?<sHssCkaS-4Dl*DL94=_#X&DJL7Htv}vk1wIk3 zq-i&>q+D3O6UY`=aB=mk><H5f%B?LNR%nP=Kd3WiTq@Hm%EOwItZGd&m0t>(*NQ*S zMYAow7P7{gsNq?fe`)xwhpcY3&$KjNpW8bAvm`$2rJA%TxAHjmCD5VX(FB32b<7bw zQmO2>;Rl{6bPgqof$SXL7oEBnMa%h6n=J?C@z=Y$PnASOL@>?gg`$%@t?kUUA`^}2 z|JuPIdzt0&8WJymeYm{Pw}&z9aJylP;|`^Eyw%I!0E1z1>f#_5H`>8kYIkh7k~-xc zH}$+jy3<>Yv^Jg{A+w;}IcJZ1I`~aByjDWm5rKjjiqC2)9eyb7UuL}ZKYy=0=LLd? zO$%<1s(Ens%!>Z_<&sWT(go;2gYa@O-W(ym2C3E5chC<!XG)Tt{Qk4P1!Jl!EcpC4 zoWZcssu4T#mV|-<H4zCTbquGvtj!MJ4zFrLW9nO22ncpFa`fufvNB_MHoaWGeX2NI z%08MJLkjuW+iYXY<#`>KyP(NKuWUCgw<k6Y`^|{!n<g!S-}rLG*W9+P9A@>@W>VX) zmBM?uvt0{44JWKr(+{xUVoPF!QjW#+WtwZYhZ*P@B*&w^gsaJ>dz5)3)f2?&k1n6i zzmIm5j!<0+{?kUC7BQTcxYRPczxw7QF6e(vzcXY-1}o(Qq|81uLhY@O5N*xDw=5*P zbwQmw9xjl``NF61nzOk*?-A>>4L2u64-BY*@kXa<CbVKt*kGN_J2E3FD8*(iS|02R zVAE==29GcMyZ8TYYU+ChogPC~Aomn$eh<x-_S5xXZ$s~!`n{bcRo;?rU+(gcG6&*3 zM1Ak=ekX7x0UcP6#pfw<=;KHF*!W)vI3=#}z=vxHw8}ovRLRb#HT8_B_xY5s7QY>P z-i6|(0ln%363u8ZlNR4eL<1;Yxu=P|2bT%H@l59Fq$f!Vq#VJ?OHtz$-0ob$^9Fac z+1i$Jz*s~~%yFs77C17X(Z7@2Wq`F)*gv~1)GmlO6DQ)RM--6a;J~sBG@e%F_QHy0 z2060Zmb`m*&CnMmwRN-3X{noTCQ2AGDfCq`>C?`%eJ;>!`0jz9+AYH~Qe^cp)%N_8 zRdS_11UjpsChdE($9cPFR-4N5WzeeLz*2B}j`X27<IS_WlTWMCLr43PZV;2QeyAX} zlfB9?Of-q?qpQkV;Oai7-QiNhk<t~qF!yJD%00xgz(Xy+OtjgnAD4l}Q@`=5B^UN7 zkcP_lhnw658}5Tfco3yK9jOosOcW8>Xd$cN<61T&;Q-Am<15|cJ2jQd2S=MyErVZ3 z(vD8uqs3qX{vEZAEsrd*I8cZB#=X16rdfB%`-=51z0&8E>OyC2X(6aji}LZZhzevN zJJRLWz|Qr<ocN)ElyY9&5hfMZ^>-V7v>6f6_{q}<3l^}X?uBl?3SkqE6V}wO8w0)@ z*i@YOKd@*O@Oc$&KR&G=Tbwz})<w_~P1uEGV!IipSQ$x6hxQp+o^ZHo6VVI_v$hHn zTRb41llD5x2(&$OCuLK!KHhF$B>NWLp3+2k$<dJw`@3d4OMn`S>ugqLUiZ!EX#seh zFtsZ~K5t5XTSnl<$W%6}lC*0bY)0FPvG74*uFu{Jsi)+GR^`N|)@_FY{QC}7r-noM z8*iWLt}1D;TuR3udU;Q>^X&_r$>;SiXI|r7GF*0667=a3w$c-?2<CZ%DT7~pC37&; zo^gQ|Rn-T398XzclJ;tr7_FQ0ANii}5^)ocxAfQ{_=K9?2x(|)3z`PB2RLe`W{xtM zf~vsqndJ!7I>9b=wO!ZSfawqudM0!rkBT(U80#*7J>d!WaI4oFAKG**%1j7W$XXbw zTaG>BJw<Ol;WY}x;GuO<kdu>(%o}HJeGbJ21>CJW#x#B-B#vIUSBM<;I&-foa3CH) zX>I0RgAL@fgs5fD?b!TfSy}yUDF5`wF%z+%w@ReT>H+_C7l1DG5Q$VrNaCX?KXjiU z#4#JhvnhNHLU&QYO~|d6OReqAh}1BMsMjG{9Nyh`*yB)=Gw_Vy;Gw`t?3KxX*IT02 z*}}$#OBz_hkml#*fvX2=x;8<8A6~eg?8}?}SBB^546hT-0p1pJ9aLgd!<%J}x@SQJ z8=Me0HZdSO>8|YY<0IatBggQ#)aN#fhpVRO!j!nAFxc2?i}oR3OCWlol1`~)3zdmm zJAc7*5%IQ3JW*VG$gR-r0Trn9W=V5AZx!3Afl@p(p?g8ii32okc3u$MC7ftnv!0Tc zdz#MiAiz+-I+HP+=88UWKIUeQ@~a~uroF?D>P9)h=F#;aTy3C#KmiyLv7~Vw)m0tC z)^fk@jkb|>=%m+5Wzj=Ifi-f13?J=_{;GF2^BB6FX!#a?!+g*={xXpzG8`5j_IMVO z4d%vQgBkX)`*5`BCcUn|Nk+wnfA*SQ;B&CYbc=^|(fYaxbs`4N2GBy!831xb{@s&p z_WnANkHh7~ebR&to8PG~MIE=C@gOeqoR61gNHCul2eaWGH73aXDoAf3*`)p^tCKIy zTs#s;PE(h?d*?=KjiL8hS+|fttfkSf_|@GXtc!7De18c3IWaNr)vz56diEFMcJ=%U z#&+5+fzCsYE{KMelj{Tt>vCq|&5K0toMscqg6ZGlSi8uv1eKGatevb~WT2?AXT{}F z74f8q{{YrN7FUNclAj<FAokpbfYNyb&8V8Pf2_~oucE;0Iuc0!E!{*+>P@YK=37(; zuhPqry^_sqVfAs1#QV6kY$4-SDuR1qj+>{~Lz*}98W8dp8u6AUrTOrpc3Y?am0_OX z{|}Zdu=k~_x3^&Wf65KMs8kFontQ>2deJ8bEy91K|JUlu{~@yXe``knKLdmRU&#N> f5C%qw0_+d-5XIvxk^kQM-ve1mC5cM0?*ab{zMFi< literal 0 HcmV?d00001 diff --git a/deployment/media/aks_deploy_started.png b/deployment/media/aks_deploy_started.png new file mode 100644 index 0000000000000000000000000000000000000000..e668e31595ec88ba38a45c6ca113054dcb00f81a GIT binary patch literal 19877 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 X<+2mtO4mOBF7Q~Gp-iid-4p%=Xw&lw literal 0 HcmV?d00001 diff --git a/deployment/media/aks_deploy_success.png b/deployment/media/aks_deploy_success.png new file mode 100644 index 0000000000000000000000000000000000000000..f81f838b925188bcffa8f261c54ecaa9f6d6c1ae GIT binary patch literal 14042 zcmdVBWmuct(>T~Zh0>M+rD&nhrxe$s!KvWxu0?_rf(L1!h2mD+-QA&BC={1a++6|* zQY2U)+3@?n`{8}B{j~pU_uBoC+-L5bd*qy%x#!GG!qipeh@Q|qxp(g#k%GLm=DmA( zR=6?j(LcEFi<OU$ahLmUnsOiRRl#2F;Q&0~dzJV1?$yQ+-dNz{;K$DL25$H65&ypX z-0ugK;2swODM-K9_A)(KCUH0Jh3p=iyukJf3C+!<`BRd-e0s!~@?&i}9}+4MMmNE5 z%<?_}8nQ5{wbVe6F2oj>F66A51-6st^f3(_+<QD^_bxpokm*B>f^A2ELc>EE!nm)G z)p@A%6S09&T#NcX{NNqTVrH8!7`2M=qd|0Fk1|um#5yxu^hj~+-Fuf?atU&FR#&+L z?tQlvFf5e1lkJ}Pqoljbudn8JGTwXoe-GSqPgD|=PPCF8>n<5`GBu%!kaeJ$xi~`_ z;BZo_1wZH9o;WB^M{WqVj?x)v>dh`CiIgO(GD<iqp=6}<M>99Cp71F^(uhhkvY6DQ zs^EPzV$1W7;A`iwrbHqSCF!+KrD3yz75gKI!Z*yx2G}(>NbG=-iGOX2+}Hyg`(B!M zH3<iws|>uBv&Anv;7!m%Agbeh$!%2$_!}#~l6|n3u&#Tm5BSTU9?!EE6FYDrI!VT{ zg0wU8zR*QZQe3z<0eUK8ibFAhi<4}mgFTC~B^TvV@fAj{^HE@_CDf7wgL7?rBdVn; zq&dbbHFCPr*u&9-v91J@OQD1k$H^JVl8CR=GKHY+1mY`9H%rzX{L0zhjdrA+?JYLo z_#SK5wmU>?{nNwwGr?<AvDjjTr>jS!ZELt~DdZFnk?HcW&^iotkraDF_P(nAst%bZ z%~<bY6)x{z<Y-;Kzf4*R9xGbOFMIjQ%VYRW`A*~)#XjAJLbt%cd03*7TIFZlItc4% zlXKGTD}YPYP>zE;g>F-DJ3%E{-Dc&VSy7mg9nbQXFF?L|^U*!~Rq+kWn&2=NZNp~h zHaTIU?8>>aBA9JuGRc@!YY^ZFi)-C!N_0QR36^mld>Ig;3@p+&j#a8Qo6n)Q4<Dr5 zwULk?^EoMMn!e@?h%X9qCEE0Ts9gP;)yt{BZK7-BI+3HIU+t5UZiT8Nk6^)}xu{1c z1;=u2Uamzi-Ap@B({4<s#dnNFjcw|&kBt>cQ9Orq_|LJI_)MC1swLVG2RZx3#a0pz zRa2<6(frD$T0`KXSp4X9Y*w1rZ~HOVquA@_X25V_h2?c!LGf}j6Lgqxp`|e}NJW%2 zreS7?LL6=?Fg-QtZeMKgQYyDMvB%&*uJAR7T==JVVb*~P2)M1U)GEcQ<eHk`CV=!( z02|wGTi+RTV(r6MiQB(qDRktglUG`uCd++Tv--ymzkgwPGgc>kG2Yd6_&w`P(H+Uv z;Uk71q!crn1)mx6FD0JIi^f=oIoi7?rn)iBKr`q}&;!IB0pKIQ>1L-hC(V7l<riV! zO-;DiljLQyOhAUs$`JD0INzoTXXb_IC@|-Qn+c3`IkQ5Mu}VF=!m^bxiEFaht{e(f z3e9X2`}+rODn9M$zGPVQ2fF)Zab_=`l9I~|CErXR4%ZOB|Bu$%Zjz2YgDadFy(3(+ zrz(gH_gL()dY^=6Y*14E5N9ZFCl9zJbdmy?tx%0%@u`DgWx3|1d>YR>12!W!f+j}o zeD4;z5bA~Sprt0;63<T5Zdk_l%c{%6+uAswTA7HEZ8~l4fI8dOV^Mx%SB+5VA^84Y zILE#XbdkE5$Sm)`%c>>KG--|@#&s%M+P!CUKI{#Te)yD>RnP=M(~@QOF*^lU;zG;S z2gSmLrtgL{E$6Q(j_D2#{I*_ud<%N==7$U_EULQfHzCs)?_2zg$p#*PlrEpupsd)4 zktZ<3kNoeiCSv3k2P?;&Yk5*$sbf&X_|nV6GEb7{lVKHYiE7)QNf}FQxLLJ-0*@_6 zT1wim%)%|$$u+H|DEs_WgjTe8ZG=}wDbLz5L=h(WF*Aq%qkzXNjSgqIm|(?%FR-jC z6R0tuV%e0~C^gImu!9dz(9RQ~<2hu9(Oe9ew28SeaJyJQ@n?J}St2!x)m`B`glviS zupnI?wa>NP;hH|p;_h;$Jq`P+9=wHjQi!idg_mdiW0&pam$dJ-Whm&#>RVVvgA?Gl zia<l~-;s$7CL*p(gR8a<)I+P%qts4Yg~5JEokXTR%+2357PTAXyuFODxUTxV{*nK8 z0n{n%G&<03a$iqnE5Nild3mWSJ8V2g#XBp`yHq0cq91h4?^td${pLftrX$Ch1J{t7 zBj0>`&w}ehLoU-q#*P&_Q@8HoHm9`K@sWQ?v83rH<3fgr;B~xmgRxNls{h|Lk4e;H z*zMA9`x#H{iz>yHwr)jd7Yj)z(O&zF>v(M#tOK`y6BMF(2fjt9)`%iG2i*!|vzxF& z{pF!^_rqW1=`$j=*qM;@#ffdEckiDlmpkZJ@|8%usV`=UkJF0X9`*2KKyUd7Nfk>9 z_7Sdd^U4Cqar(LE7|P@IOr=}jxPhY?q)l`ozm*D$v~5Mn?MoT*51kkyWUMC-#&%;K z@-P9!KyuHnC%K5&wGESYm1h#&UdD*5sDBC#BR8@LQHreuS1a4F`%g*z{dE2Nh(GBS zW1@E7e;98l<l3W4pINR|CXfV4oc=YN;%2+;_knX7)V8{zn>>8xOjd9Cy4m0_3AO%( z=Jg`bdrD!DFnxs%c`NHcUR`#-8s4^C-2SNoKN2S;h$tcVO&^pG>ep}S3U0p;+_F9P ze5=h+lbuuE4~a1G^fiQ(MDy@MVeQ5BDz|ZF2hqoI`{ODQ$4tAnt2E?ir!Rl(tGJaK zD!H%15A*0=M89U4c&YYts`X@LV_g$JjMC`&?CTm}K~`nGi!D!BwLAQ^rla9#`1C<) z#Y<M7m_zI9_lkXgnN*Ar?g;G&YS)s-H4Rns>`FWy=b_m8>u-m)C4{^2?j+2X<>GIA zKi<bJbV;3gDG+jc4a=&KXs`751=gvMm>EGomD+yn+aN+{M8gdY7ktlrZV8$}PD-Lu z$7<<C*#v`DCo4J!q~!*AQiY<G0M-kjmg9kabk}Wp{LBxIT3w|Ggivdqb<nZe&RN0Y zG;0xJS~Uk)YxFY~dOpgI87R`NzWGL+I0Fw-w9d-WOOa-`fQ2_ru}}B-?O}qa({)6N zjq<okjVj|dx{`b|o3$^1{0HT;Bo<5Al%L>}J9EeKt-v;nHv6>C%<#LxG>Kwn=#=VX zv+OLc*;M7CiAA^bE)tuC!|6Tk<(E|H#De$t>&}dUzQq)&)%L{noh|M%5l;?GTYaq~ zBn|z!>!B*fvu_h9a675}0V`?p@FEBw=c*+)#5F-af%R+citjzwcW0ScF&MhVaYq>K zg208!Y|s%q>$6LnZ6~zjgDil-Vn+XUC2<hlH{WKM@W^Azc9Sk$(byB}b9eU$;$*Aq za^P(U&-fD9@N#d2uj5<SC&RUodbQjhSkQy?{q;=B4vTSZ{=`v)!|V&Qe_y3M96qdF zfv_Zq_WvUPlhG_BkEyd6P})okYO%+$`4lidRaOBkWybs|6RYYt*K9l1h3qw=z>*Di z{pZ^Cr*&V``linH0L+KZGlmWO3u4ddu3vlE?IA{&59^uk7jZed%o;Y_z(QJ^!BtI3 zDNFU^Cg6EGoX;&XinQFhp3HPay#9gMp}=?Gi~=Cs{N5&F?1rv}OJuh*&9f%Lv=<s$ z3zplaE&_|DPw;6eSPW5x!+IX=t@A1kcE?G|M@b=v6?(&&6;1-@Gl`{VFnEQn61c+f zkX)e9wyZZPJa2D)ovxgIej?tqV@mt!4yRo^9OeUb^p#ugNG*`icPe?Tt~Fbc9q>H8 z%8B*3#t4&WK;WQWjrStD4i~b1b(QY*XaAh`%eD03EoGZDfW#TMEcdAEYz0J>dA#n% zU$qFkp8x0OGfteU-}`$1zrc*=|24s)myrH$!mr5xt+4lhCuIJA>DhnTF|;pVYLneb z+ZXfumIX~rhlCtmu8>4`g15e>xXnZko&r_FMzahhd=Vq1XI~<7O8&*L0rVH#Y{zJQ zSG_D(X~l^5=NkQ!Q`|5j@Y#`4198wX(<yf<z%9#=XtO`-x3B3cx^<v&AG0rZ)bVD= z_$@p@#*K<At5bh#p`CxQ?s4$b-rbxgxt5Ylb-dpEe<Y4x!VV=))_?sv8w8G|7z$br zF^+$h^4Zvm-FzSy<1buVhUgs4cIoxzM=el0CE_Wm-JX}Owx6bN>hzCgx*XmZoWjR4 zcx=KaR(%`57wEQL;%d>OG9*u%X=UW`nq2kG?l#y=QpCB=#}gI6PsN$i_-<qg;sst^ zmrS&N)w#BrZFb__$k!*uN1h+JK);>m`GJ%?#ueo+{C8^Dw@5iW0|0K#vaWOU#}0n$ zlDeJ?U;_^5N(3jfrds1E$wj|ZC?Erl38N>e{0+zWuJ&l9B<B2U8mm06&psJMXgKfA z<!*JdjHSB3iYfgS$N0R@!DG-_tm$yEAuPkSC@aV%?7uI`(FMup%dwRRs*w~CkGL#~ z{Xezw*hX|9kFm#Lh27IZS{oc)Uy>t7@4D^2LV&3-@`D7&oY7Gy>Jmhcoq6Sl%-|mz zuYZd;_p7-8`JXidOkFndfhIXXd|&k1qFVb+4*+yoR5E<V8Od+ODofBPF(h;Foq?5} zVi)V2vw5`=lPRU77IHcPyTA(jtt2R%@emc)bWOy*kvl}RJ4_!{PfV_h{~acvuk!a= zXt494$>04``>|Y9ZyALK@9jA+_|2Rjq<2bKo;;O^atZuz;_<~`%RpTfY!=rE?Zl|; zCGh3t=&S0PNoryS-6zvV$?_~t#y<I3j}DTse!~k~4k$cXy_3~=fM3NvXWL#rfGJxA z@i>y@fAH-MuL+GCic0uyFv+Y^77lGk)@1d)WuxPiKrI%-vRph<j;X!vVP&cOj<BMG z^fLk3;TY4aaS?vl<H^-bcy|jGEK3r-cc6x}izNB)xP_<u`Pwc*_o9efh_E;1v|q4` zm^9O^*0p^*(4nO3<>l8bp@Bl0t${k*hS!Oc^>`Aq08oKd+{|(O3kiwC#79ZzFBc}` zk!+Yq5NUSH7C+Da7mHN_^qG6^x8;~+E2h-`2c1)d{jp$w=i35X_X)WFWmQ%z@W@j4 zb=zL;?St)(5XjttNISd`Y{rgxYE7Dr87MYey4rxg=`twVjdP++Y;zb0J~)3livE(o zr%f}XOo#CSXqSbIrl}VL!mo_Wf?wdjF<m5>iZ>$L7|M@-K8D<LQO@pkp0up~vU-i6 zsTcJZ;K+TKuPY`J)y4~5d;MaXlXf&1^dpvs-l@e|+pl-?^&n>(2_4$`7d4{C>1sGe zsuXh}BJ$3~;HF(^`gv#kg9mM^QbjD`d-nF(p@4*;GL6yF=Uo#xw?X|Do;n|vFV^gI zySzf8hOk3^E1A7$uVU%G8WJ2gqDM}WkxlU&QHh8!n_;VuARQH)5gBtA*Qcq?(FisR z=N##zL07}YG8T5BhlP+2G(k@(Dwe2yiioSVT0<jEC`b#I7BIg_E}%^wNLc<W#9p{P zI#;W9#`dP?d>9R1T`81``F89jmS7}Chg>|bKR~xf{e0UP|MT2^NcC#wtS2f-QR`US zdVNa0iSC89zc(F(<MalJ-g;#`-AzG~T~!oBb}N>D(XlznlAX&kLVR0+mS^PKOe!C# z_D_*SMK1YT1TeXLoK|gLeI<_SDq*AGJn-FIdI3j-X{u&iF00WyUG>eZ9@4slV({y! zLNj;6%mGqqWM&P4ENJ@1;3kao@6IT1s;IG+W=V)<#!3u`SU%Fb*<<L`f1|0sd`pbK zNwQgX^c5tpS4%?dtRBL0?ub5q;D5S_^@4QznhkO;8Zi#@9jNGvsJIU+CHaVL%*44y z%GhQ9kd^$n-Ms%Hu^2_yA*#kPG_{^+CcVKm6V@1s@+OM7Vb9Yh;(sz!b|6#G;5Z4u z?xgzrqB{H}INTkjG9G4On+5aFRB8c>T-cW5aR>{6w2uGPE2-BJ`6lp~pDx~F2|8kQ zi>Q4m2-?A9aaD5Pjwrb*6AyBLLZLRWYD>1I?n%}YiCFW*X2*(g`*?SuzOzVP^_Aq= z@!4#QD)PZ{=kgKe=6RLZPc!4?#}0KIiB*h-G$aZ(^XRVQ7g`ZQFp~Y-n84Tp8Mnw~ z#qLNp9p8>-gL@D;{1By9{;51&O}BmLsab<EKNxQ?(kE84CIG~P9}jix{nq<w*_719 zrK?mw<Bf1zout5S3k4e~=fPa(X2v``Bg4J!3>ytvz4^O}9ex3TK(>jJmCIds^u{VE z#m3t>v<20z@pWJ68kl+M5K5wCQoUoNK-enwG;k)nLU)0DZO<t)<RiN^h;>IyOr!jY z86{LCVdUVIG#qm*cvALohI29k9~8XUM%rHA`$Yo$s199E2utwatrRG?xNUR<uA<;z z$aQ<Ej}4=yM7eF!iyj&ynm5-U_P0(8&HQ}A?6m9vg|X>%Fjeu#RmCIiawx_Y^Oc1* zC>Y8U^Mn}AsT1<IQv5xiw*PQA&&#pd?<3m0xz)w56Kf?)hA&JDc&wKhm5WfEA#C2L zcB{VSd{f4xEh<u=wJ$!2KjxuJ^JB0Net>QrTu+892E4>7RXT2fvFQ7>=fA+;q4Ry8 zf{i*D9)0;dqt^7nST#jkm~3aP_w4+svq#y!aE&E~^9l%5(u|#eEZT&{ozJJBftxZF zOrCix!S6gM*;Zi9?E-s9<WIkoy3UA!1e~pVp6t|WDZ9qaicO|}_2mA%iw-h<@A%0& z^-y=g3oQ~~=Hy+$<1e4fQr-C{Rx^EAV(}E^{1{unkEh|6a^`Ii9))i-!s#a_59P|d zg3;~I<g6biz3rY=<<q=|No`lPgGS-i;=sBrw(nQ1<F%T3){uND!;|TzG_BM*y}fjI z=5|yn&$cq4)0^XH9HM|Y<W8+?PKY?I<K*ewI&_EoIaCVvyBi<9#~&-jb3|t7uN<El zUsNoav=N3BMe^{xV1pdA#quy?+AV6~8ku}XZ;nMNxJ23qw}<gqOvESg6?Rm36PfL! zJA&igT|a;%UfNx(#FFtBk^46Oc3388l7(HmI+|+(ASVU4a?!{z1{x#LfZt3m-YetG zc~)VK_V!y3MPD{PaQ9HMsh@E)OvYM%or|gJ7-G>B9BJy)@@SkPhRi94neSy@tZ4Xu zYWe;(fIHOO4&IgNlPAzNn+GlGOG^@;HINO*t3=#{a=Qx(>ih`s_9cG9^ZUSW<HvRm zr$s$yjs;i35MP^Q9fviOE)WtUVrGTlE<3V~4pFZDDlpMgP*3J<4%Rt!<mRZ#$#0sW zX(Hz4={<5Y`J|J>%ga9%ok)WW@K;CLmo@TmzRmCX2k_V^{mWz0g!XV=x$t3Yh(lOC zYooz-aWMrO!}(3uKpM}=OsS+%-F%c&bD;ipn31R};vzRsdU77H;jnpd%FNUe`)hS3 z3yhXUp9&WJoBO5h{3uPT-o1vLobB<aQ}B65K1+Db2GM*?P03G<Q|Y+yNS4a4(s(S^ zF#%*<F?1>|Pi%HbZs@(P32Rp;Ii89`hRq~&MTdLrRy7Z{27(vUPDl(Be#*k*hI!_a z0-mUmtAX$l<?q|lbbY9Z-VZFWv1&g5(C}<uzm%K4ymrB&_d2OvCB!`InsaFsbnHZ- zPju~>tT*PhMc2rB<f0QeHExI;-hRh49Fn5p$z(iX3;5Tqw7?_kx@{yyuJ!g4SaJ_N z`u70HNk#Gf3B@xHxpAr8cywdvEBMIuuCas!o?sMG=V!tQkDMs4N3lt@AxGvoS4Y+7 z83pmz@f5X1f;!F*L{sy8u|8tmOSwWOE153Jd8rhjabUiuonU)pF}vRQ6vL68+q@#4 z(nFRfeeWMqo&A;OZGr+k)|K_8>=(~Ggk-ym<efL>uZrSL!3#;f(3YvHpmtS{`NZ-I z2Ra$f86x|m_mypxH7^GSEx;T4ep&c{ir=BlyLs%PG}2hubBE8hRfgN4(TUPTR*Kc# z6Z9#vLX91n7Em_t?47|^>~jZ727<F~9;GLrvLP5qmVzNu6V$Rp$DG9~c!9#Somp7- z`IJm!&jbD;BHHbLnnNEkA?vzd@{*IjlK9k}*L13fk00#nqq(N&Sz*UjL-5=|N3Z(D z%O6O>HqC6ZX~)_8PA`DxB3WQ+W8Gn;VVe%;)d^PJVR7ZQ3u2b20tel6FRSAjhD|v& z8mrS1V?IC)!8Hi@{8DHno|wx<&oTR|el$bu#NPpNhL6!@NWgww)pF}QQey~!402le zDlF!@JBY=pyvoVvx@QJU7CXy5VQ*f8V#kL5tXyq#ocyZae%>3e%k92;I5L&L_s~OD z+yxEpxL-^|359E<4vt5G4rod!4T_kjgK3>kNw|j`ub>`CB&Sv}T~_N#ycA{Ol5vgF zGBIYN5^yHfR++Tdp|6rj>QZ68uNEuMMh?(*^((DEQU%nyFI&v^6wadzO43&?KomES z?Q-J%EpDqzLxF~uFJUeRxnJTIT0G`HEh@eq3Xu$6iC9<i@QSp3pcy3V`TEho8?y#0 zlE0jxiT@1A%;$cP*%?Xsa`qj)<qv%zw@v$ZN0sL}N7(3C7O#vNIhEFW+zo!O9^39r zB#+&8BEpQbhlS%9LH4+%QT~}jV0S`;k&I`)<jh=(o@j)|c&WYZPS8bFj#eU8|Ath? z8mDqpBQ53^78kUlCzz%XXv<EnV~3MBkIo-7@kJOezEQUtKVL?`Jd$D=-j^?273E{S z+|*4dm8mE?kZ+}a&0Qo6f#{wMbyJkROkk55Rz1V)n{|Ex!G$hz2Q`V1&kTy7`58R_ z#8UFniJMtDRgm*_{4*&(*_@-wi`9M&PcJc`D)7pOn~t{}Ew^fW^RB{MStf4-vVOcM z;~xOCP&mi&z0KbjnDr>66Ejj=ZV{E+2k`<HBYsFF+9MdlX@~X<0(4J~e%g0Anw<+K zER$Np1&4%usOKx}N3nKG_Rwr!<Sdk%0}%!4U}E9AF!OD^Ve!j+O7Spjh4-b(>gkw> z|Jb^O&xam!79W31wf}8nRdNQ^c|v4D&(0?npS(w6>KfWV^Ge_WWl)UZ?Y{1fn)ct+ z!E=-L-IyK%LFaM08{M8?hXAu5Y<`pZ{$+tB<)Ai^BB0;q@U=m{HCUY4QUmnMzyqR{ z85y)QEx66|1oxs09jekYu*vq6KSVvTru-bi{asbU+P~KONiBEI`J=CSU|%oq#>rfO z=#h%w=Ddm1gIucu?Gt356Rb?v*0iA@l(9aJeca@k%tPl+nh(o2X>B?((>ZzuqmM3r ze&~BaQ=}&J{n>VYp5o7h8=h(n+jrr+vQz=T#7~U#=t9M~<mA*_SOMB412?H!(RiJg z=wJSH3p8OjM@+rZj6&G}{(T-Y)t_6Q=B<OpmMSVmm5Nd>qbG4l+VskR$uw01TJoD6 z`&Cj3+1R?uJx9B=!^AZ$I#s5CLR^X<th<cm`+PEhvvVskx^Y#fSE5JlA4teGw<wxH zf^_8eTj3gjRPF`a^9Fk>+pD61Y|pbXo|!29I*kgD*qET=hA83iw`*bYD+3|#^}1~o z5QJWMAk~yM`?~et4>qaneV&T?W~QxAoK#pU^%Z8{<xX(CjbhKc(9Nsv(XsH>P?JMs zmlTAh=8E>X@#LrciX2jN6H^HyEg9Y)Z<z5GE-Vkt%`#n6yb_zKzF)Hssd!IR9Y;r8 z24urKqL<Yg%}86x@9<%G9;Rw~Ifw+MG#)@fP7BN%g>NB>NA%toc`X)Y(eKL81M*Pm zeuduwE@8|*Pp#Vf774d#sYQ&nlZaM+4nQx%V>CUxnsz@3U!T|)8$|eFBVLV$?aKEm z;m*s7)2gi^4$X!K_a?}=_87_7bh|EOf;_aCrgO~ZM;}GdQ5wRLU#1fTbhj<tX@BUt zhP&p)^SzA`Cv7(D#~d%c`DvU$#jedP<ck>J%$ha6JUAqafa$BdKV6BneANegBGuRP zY-&*|uXXd(mF-rek(y6o{(`wmzfhi;2{hGR(16~^$n9*=X2)jL_*?4&8YNoC*U>I3 ze?Q8`YSGCuK|83%%-YeAF_H(drG(WtlY%PA5gSlU3lO^sHdOM=3LouNJ?r_CaOV{e zSE?8Fhs8RIRw*$ELOqYn8=YL%HeQ6MPsAr1|Fh%=4l_T<tqiOX-r1A~wBzljZR_(u zKn0hGez|s%bzHEINiW%Tl7nNS9lXO)u}E)RfIZ#hh3K2=-YDb!na7;CfaTOHg60tE zi)X%JU2<z#j~0CMqP|65cD^}A^+Q|K8zO&`qRycyp22Siq}Bh~Tnrt_K4$P?v!aFy zHvQG;;5W~*PFB3>+}ysbK|5dVtV0zV-U#@1azkqESZE&8MqwlE#2%4@QZzK4$#La} zJ=%J<iURAuR(`Pu;GN4q(bkLc1Ln{q>(~7*Mj)j0IrN;f_k1w5uXfHxs>O5AMQ0`L z*NfE=iHNc%Le)jOm`y7Kn+WuX=5#=W6k8_{#bJ7I-`8fF>T`t2`h3tNy@#N9ryEtQ znV5<sd}yq?<w%i~N8-=bFpS_sB$Pu#%p0Wr3Q}35%7k_>y}c&;Nucx}{V>n1OCzP6 z{yFPnarw-)Vo0tlc{Wt&-vjuAvkMn<dXc@?MW;sWO$^%~4)h$2__RxuQTwGpZG0gZ zPX}gG4YS>k0gjv7Y3gY2ORIe+1-X0xj~@Cp_!ot8f1Y?;YWUQ|<eb8YZ9{dZ_5rW2 z6k+-k#n$)*U6ve-gf!c(eB*`&nlibK{2&2m@3Msfh29bQS4T3_y|>LK7k*MF{k?>( z|H9C3P9<@NhmuJ0$A&tqjG|gMEt-tK+n>lPP+!yS(`X&CrMl#KLbQSKpzU925{yNh zlcUJF>Z6W}+1d>vhxZw(VVrK7I)CiUXInl0X=_$_=d+!7{!5@NG822gVz1Pm#9h*! z&^qRUZPa(t86y+;cu@X#`}4bN0-FSutvEN2e^?Wzt-WP>(%{9gE^x`eA0<1SWvt@R z37wlE&HY=~vkkj;5ny!#403<p1#H$L>r~u-B$9t3JAzArlFChz2~qHjVo@Czw?5x4 z)o(<YYOk!_cqYjbH6F}8%z|!<BNr;AweqJ<9ty}3_*KgW0|W&DLsq;{A~llQh>EN4 zKH1U-`7mWT6Im;Aj6PBCweM0Uj8DrH`6ieq%8q?b21H;YdeB{ZsPKC&Z{4OO)4ja` z`;CZXpX4|rPI!@_F`n+Tm;c(Vl=Ptf0K_C-i*C?DRF&VLNHz?S+uh1mLv!YDiAOKK z<}kkM`s0<#8SJ!d_tRpu#ufF!!-Di{hIda!-n?(rsyK(d`%Y%eJw!;s&gW)7EprOo zUpm6*1lR2^`MbNIQh};$<LzTw&$tIyA&~lve=Pme7otS4R^PlLKvKbt;{8=eyQ5+x zBpM_ohnwy3M3U3%S`32lOp&8axc|-ksziCQpurLuSmMUHGyoGn>*tEfD~H3VgTbEq zL-MgXI*|FK-Sf)lLciO4!h^Yen^C2q`3M@*<EZydgRVJJ#P8oF8H^%zV#Mppq<@P_ zC$${^U{+mHd0=8mFiq>^v%Q*@JHaXti-mS1BIrpt4GRz5#*!^DR8!J}>hDdV*z4ZH zhd2Aw2^vtw>Z9HBDzcPz8H%YD;xQu1b6vWVJ^ZRI?{$Ugh01Hedr8(8?zp;>^cx5M z7GjC-BYf4zVlwm&1~WbrXvUZ?<y`|<iEM9vxQWM#jud3G*k^%xv#@Pp@ra$2P2#i- zSOxuyn6C#S_lC5&emVvoF}=Vgf5hg~RtuRYPJ`mPP81kxF<2t{Rj<QJwIlar#O08b zR)_IxEFJB3TydqD;A_uIuS58CeQ)|KcCMpb9!kYE*VP=j#<3DG*SeuGV*M6(1U7BG z80V4j0hP*^Y9CmU-2R263wQb!i29Bkf4@Kj#t)Q|KO|18e4EZ`7G;Gvk6sy$fJC-V z6TSsNsFpoH5B2W?{yo5}TY0WuprUbE?gU+P)vzg1PvwB6U#<UI%eCyP_I~7Cg56p( z-^zzmmX}XYKgRTx%kxA4t0aauD5*PII&4-7zJaCexg`2mit7XP5hhz=_d&5Jr?u?Y z+XplCCcRcc+@6KZ0XMfho!G6Q>~?2ZkdJ5vu2|4yvUq6Zmz_nQe75*H(+j1|Yh#e4 z#e;Nb_kS9rbxAK?*p3cF^87F%$P3HHb~ilUcqMcj80t+qYFbeId)~#lzk20%x?}ig zda}5=GECuE@PU&wxGdlENlquR+Ue29a5?K}f8op9%C@SXIqlimO&yTk=mj?xHBnS~ z<~VtjY@lE4soj<KFd2_jF3X3-OJr1~|Jo5tpY4l4POXoBrfLG6J4auOA9fuN(|xgv zc@|OO==k(_R;I6Trgf&@|MX|pBgfw$Kt+pFRF*K2H-@1yC-}Stv@SM{^U7Z34<w!( z31B4)ytHkGUX0^X`A%c73ldZa!t8muqc8flsGRCKThw>;u8CAF*v$^ns_{j=2k4cT z(HJ{>n-sbd4xOI)BXkgH=R+wwt8X*UHmd@lcP3FK*Kug3#B^mpwz@vsTfP1bf^1T) z4nV1P!rbPI&tjyo{RGHY8GKAj*(hN;{f}s7+u2X}C7A(X)xRfi(LXjcY7HjKFnTxb zkdT<<FMf7#Og>sl*iY`jdt0*X`;RSv&!C0ZP%N2T+!!-ZB^#9*^F<a{<rs9368W<K zH%+ZNHz!7<ZlC;P@F(}Pi;L>zy7LNLG1>DNh~kU~`dy6Vl7(OnwfyA@@a$R0-yc(l zCxhwy+%5=M2p$%zNm%wJl<mc{gr&-<Wr(|eSsSP&8A~DWu<A-J%+mU>Z6#HE$zoMg zAl`AiM+JrozkRDN(bnpt>w!|f+B8^QheAI>+E!QTD#J}7>(d<ECb_zOUhk4JKMkly zMyo6WI%-bw4JKe^lHk6UQy`3r|KjD!>0vC`S|LJn;z!KFV;OaEcF)VpUxybl+bd#C z7k|TWd6@_i;8+SDXlHBAK&u?6R`}6QTIV_EV|4VsFJue}+J{*7W9Y<44$0lPQ{1{_ zfMyL|n2neb^uXT^H1Y3XPO;t}xzu!M$r{B4D8TdO+%XIa?#aL%8L)XRxKdd2WnD`$ z5o#GMOrar``zV}%Ipawn(_K|gxG_vWEKBTe`1W7@|1{-22>8!0{||zp;n;@+1k-pp zqF=|UqK0flWaX`oqX)=+{#QHTyWkog=w)8o9ar}rWncENPzMv-jj#UeYJ;bA2b#aD zxx;bq;r|~&jpNm|wVX6o8_-yMYJb+3X8344OV8An0u_(MMeyPVfHSk064zCC?^o#? znyBDCg9Yr3mjC&D|B-3)DLw_;V-{8DRX5B7EQOhu@<m+T+UpkbDY(#71#7GFP)l5s z$Kh&0#42C4?v_ZEiz%>hDV{FsV*iU4fx?w)d&_B7Uo;Cx6v(wS*w(Q;>ybhbku;G_ z0Wog&TV>pFyZZC>L~G#vZ*d1bT^?pWW$>R_>~cjNrAnCeUHYm2<onH2-BY`C9vxF6 z*SHF!B`{Ia2;9^6ii`8QCaQ=A_wV1%n;!}$FMSC@?frs*BwB{A1*B{HlKN6GoNbw( z?VYoV-;_1#j;Pq|C+>IoLKVQ>bO_+S+aT@cP8An5;BQu1eK4p9D3DtZ2I4#9x{(8M z<&loI<5PO&YDVC8VYHS0U2XZDU2j04o~hGnsT5_J?`YyG<{F4WRP%Jqr7g{4PB>;l zTzinuXF6A!I+)Wg33Zy|3(M^+dWj&lm10xXjZHm%(mk4=%yaaA``RmFlwJO`bJ$mU z=>8yF&UY8AJj;v&%Cr={HYCgz{+$wuqxZ|MNWLb)xA5q}EpIjjTd!ryh@M{Oc~Khb z{VK<HbN41!2Oa9Vo`QE?#arT?TFe+SiC0IDoz8AwI~x`EV{-=~=Ciy!a7!*SZafpN zvaj+aCRT~5lC|G7zd64zvvf?)Oxt0CDn*|#6Nyswu&$pG=K}HU-PjIh2)F24An+>e zD(^HSr{q)D#G)LkSbi%!ou|d73bQY(Xtr=p2u@fTZ|1Q3K1>N^`Tj?OP1H)`e!}wO zcq+~Bx~uxdvgh-32E9G@6>9?s^x)A!omIWAoJu!6H?_m(NMtICZj`+)T(GI+=ZJ4# zm}raokrZf1j_WxglE$O#GDt1MLPZuweN8}X1D|B5HyML6gX|zzp_)BP_hToX8N7}^ zq=>~4Wxyq_I6p$}2hxd=Gnt*|jP-=`odj3TOQ;D7&J;Yi@86y*{lW8PBT|{~&hZq7 zFm!3|ckf+KrdL;D?3t+|{BO;me|f&ePMi@Q0QkQrDbQr)#Jb3<MA2l;OgYKDPA$ky zmaFj%m|Ckd7S*9Pn|m;}A9S3i$x^lwUHqY_J(_xXc~cUYpj5~QQ--v{O2n7twCQmX zu3vqo6gOEni|VD|U5myR2PLP8DWnKPE%G<Q(d_y0#QZ6Y7@;Lve|=IH$TT0_9NcCw z#mejOCqp87l>Xh0H(dbny$bxg^&>nyS2-w{Q~2!t)CXWiMk;*S<@(FXCkkL_rsQdm z3PVaA5HU&QQD6?$aD#bC$;I{zDrJ6hxRaN)YVK|Ou+$Yic`qg)GFcbv?D1>2jWA8h zvjszK+VxR7?66Cfg0{zKi6E76?DQS7;}kL(=Cmqg2$5?B5_MpmacV?3OI5rRIZ381 zkO-J`W3pCq7xR7I4<Je-RL%&PdTjb1^Kkh;ea+cWQ97n>F57ToXXfUVESp10pT^?4 zW4<pGC_Vw=qH>{(p}1QROAeZ-B(JXD+u7*zWjAJI*u8l8((S=972Dmfztj`H(3<WC z7qQHkxVpUiC2+N&G$S$Y{#$yt`9B>md<nQR&cfoU)lMzT>Vfy^)?;2l?}=Wev5xho zOClwBX)g}TJ!iy^BRMkc_b2~x`fCju*Qx*Ol_Wv>-y3KCM;}e3V@-mRpg@7E&!<qn zL0i5}v^fLibyBc!;LWXd+<l`^2!%*pjPbPKXS+Kx=5xvgS%rBT>cXk+%&`NEa?HYE zf}X@pJt%1fT!k`F5oBq<{-gRSZtAbUq8-8OVfv-DEiJrpiZR7iFG;OXo{`#kcW<8@ zzD*|mI-jU5Y7vEtx}TQQJx^;Zngk~d%LyvI`)Y%Z;$v$yO*nOd;Yk&AhHXt_3_ZKT zt1pI16$z%i#|A~9ZvV_g^Iz*9zP^#W!}qqLPh(8e!Ld~}S`n$*VA#Q#dS2w!EU2nN z>=e-)iXZzuWqh7m>*EUNI@-#$v>-C^CN?Zdfm>Pde8^<D@$8-m@*U-id=cr9qTMLY z^^jEx7R&BXsJ)2z7;#{0T3js3)l{ya)C5KrJE7<h{fDlU$@ot1g6D;wBt2hd-w2&$ zYOR}>FDNR4HVXYLmj(ag{EVoZ;r_9D6sJ_opj)B+jH^&rHeRqpR3Lo1r!6gmS|*-1 z?PJg9B;{7Y@r@oWS!>j7kHe=}V<AhHz^9Llo>$s6T0r`Jkm?&#NPYts#Qf)EVYNm# zQmDZxj`F>y*)BIDans%nl64d0_M!3$Jpkw&Q}*OVfe%EwVoR2auiG`Rkef8zYopRD zVy=LjYldC2NVP{0B`D~_@NPu}Z@2*vwx+K3eVb@~$@J|V&flNfJJ;R^(=MxG!&UIu zb>$*|C@ki0gvZ?~!jN!0pm2I<0?jPgQ_dbjni`tYLldMX<UMd$T9mjhdykSOWW`#0 zOrwH%1@W|WxG=6Vto19a(s|pl>LVO(^R38D^Fi<N_m0w0$`P|nXN2?>_w5lPdG3rk zz`=h0hib9E=fz*Ad|^=RQDQK6m4$IB3zo%#-b=rnrE5l)eRx_wyy@;{K*BaJ@$oom zB|6gYgQ6rU#oU{1F`rPd#vT8xYT7pdVc`<yJK)|20UEla-+%9h=F0y=@&B*EuDORw zuvdb0Pgh?N#-X{eJg;61cAh6RbF^HXjCoLxvAtZi6ZLPfcOUCg%jlt|r^BIU9ZR|3 zoCco}vv)+527R<sj#&E@P4p=$Gw_=~Oi+O1*I(?o(TlIrdN!LVpVp@o8IwN(B9wi# zk}<5zb%LU)ZEqTH@QrYY{{8ME@KjBjtb;Cf>(Xwp-$>edT(h{ClW*h2{^zRk_)R_T z#7K8{VP2E=THYeb=_&1JyLT?4IQJMeqFGUev$6==!NuZ@FG;U7>m1}fqx6?0Da-R2 zlkN5ArlzMG{?Gt-_N<1?G-{G;wxX9(SGd@>mMfQ%A?A?RFjD0ZaMk!NC#KXfs$pgU z89G|Ql|d&;rR%lPGBu=aS<f?4Z(VP4OhYGZhwm#i!X}*77G59iv2pGL3x<Ugl~!cw z>`&qN`Fi{*pkpmpkitMpcn)WC%aWSl_EL%b)<Q%jFJz_GDNo0gc2AdM$imN)3|h{{ z1{RoGB#kv9q4I6s$e@&+^f)P54x8zQ)x8a&qMFMLW$YP@7^WcYS9Bn3>6fqk8EMR( zI{t>*+SSV-cjCG|Rgu{seb4rs<l#sIpx5KMfr6eFr^v8^thWGf$J=RJ>bY6NbntZQ z)(77s<eO4mheC$pyTB~+)h3Vr(9y+Tg$ChDhqnH_Cc(JDhi7VAb*a+LbmF}<cNR#I zHU%y*XV9J12RU*DR9e{nTx_c>C3Q&;SBU(*@`Tt-QK;N!bcrx}x~KPLF}9DXJN|RT zo}m>u`jPb$$}s-VD9L_puL@&PisK;t`Ong3-=2XE)tA2oWG)=HN+;_NCg10~oes&- zx^rTE@y8UL)(h#<izaI1Z`y?F%0Q*F5I%SUGdkrn-&$?!3}S*I?>O2TXIu9BSvmbo zh8kg^30B!L&9kF65+RL}b()_o2;O@4^F3WARQOyf<(;Z_r=rwmeHt~4AtTmHRWI7e zSmSjAo4-iEX*ZS8X>lK#qSyN*c&zL2GL>;NR66su;ScFE!6c#!%~_7*bW_Od?r76y zGr1auS1K_|<oDygEC){hwqa~W>e7LN`om|LmaGz_CjgZVda<NVmYE_+aYhU1x(#8y zuF|`(YI8V+KnWJggIs6ujZ6`=QbomFt}a&&=9<}mypUKqIe6xp)vWUhw0AI2ax1;9 zB_#78nAZww${}CdY9`HTDM3&;Py?e6V&xfrK}sdvljL(m>94=r?)cv7t8#X?<yD*p z>~AH55P#IQ)&>_Woa0RtVrWRz14r7t0@q&}7#L`O=cw=fE1f_7_+04j?>+aZ>Ha@? h$hl+f>sy9cEJ;}D=<0Hb+}Pb61sPT8st@J?{|C=@DEj~a literal 0 HcmV?d00001 diff --git a/deployment/media/aks_extension.png b/deployment/media/aks_extension.png new file mode 100644 index 0000000000000000000000000000000000000000..4a242d832740feb7232cff5ac5ef28d66ac204d5 GIT binary patch literal 53694 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 BG_?Q# literal 0 HcmV?d00001 diff --git a/deployment/media/aks_host_mgmtconfirm.png b/deployment/media/aks_host_mgmtconfirm.png new file mode 100644 index 0000000000000000000000000000000000000000..45a13b8774fb052c7907ac19b2336f7928d5c938 GIT binary patch literal 3200 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_hostconfig_credssp.png b/deployment/media/aks_hostconfig_credssp.png new file mode 100644 index 0000000000000000000000000000000000000000..0b834721b9d610bafe3bd15f80f5c7822a30cbcf GIT binary patch literal 13539 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_hostconfig_hostdetails.png b/deployment/media/aks_hostconfig_hostdetails.png new file mode 100644 index 0000000000000000000000000000000000000000..cac3352524cd0825884b262acd47c841d4a4e0e4 GIT binary patch literal 5698 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_hostconfig_hostdetails_single.png b/deployment/media/aks_hostconfig_hostdetails_single.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee7974c51a8bf0d9dc2bccfbafc214c2d5ce370 GIT binary patch literal 7854 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 JO2aw!zW}gLNSy!x literal 0 HcmV?d00001 diff --git a/deployment/media/aks_hostconfig_lb.png b/deployment/media/aks_hostconfig_lb.png new file mode 100644 index 0000000000000000000000000000000000000000..cb686cfcff26fa22a32f5917701ccf966a902412 GIT binary patch literal 6628 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 D%(@2h literal 0 HcmV?d00001 diff --git a/deployment/media/aks_hostconfig_vmnet.png b/deployment/media/aks_hostconfig_vmnet.png new file mode 100644 index 0000000000000000000000000000000000000000..2cef67474b962cb8608954ba4f95e2fbf2fc8a4c GIT binary patch literal 17574 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 Kxhk2r!T$q?|BZA2 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_hostconfig_vmnet_int.png b/deployment/media/aks_hostconfig_vmnet_int.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3f2832588a569aaa5588d2c62097dd79823f19 GIT binary patch literal 18852 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 N;OXk;vd$@?2>>P&zX<>U literal 0 HcmV?d00001 diff --git a/deployment/media/aks_in_arc.png b/deployment/media/aks_in_arc.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd39258b2f4ca5220414df760ca2b151a2907c9 GIT binary patch literal 55025 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 VU5Tru&+_1!k)Ek8N!#hkzW@bT*=PU& literal 0 HcmV?d00001 diff --git a/deployment/media/aks_node_pools.png b/deployment/media/aks_node_pools.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8579cc8664e76a63d06741a676c90fa814a791 GIT binary patch literal 10676 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 literal 0 HcmV?d00001 diff --git a/deployment/media/aks_runtime.png b/deployment/media/aks_runtime.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3ee72242abe56d15b7db4b59e20debae7fda22 GIT binary patch literal 28264 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 P5NWCDKd*Y`5dGf(%Yd)X literal 0 HcmV?d00001 diff --git a/deployment/media/aks_virtual_networking.png b/deployment/media/aks_virtual_networking.png new file mode 100644 index 0000000000000000000000000000000000000000..1ed3088fd01fdfe29f303d26d481813aafc70334 GIT binary patch literal 14650 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 literal 0 HcmV?d00001 diff --git a/deployment/media/akshci_config.png b/deployment/media/akshci_config.png new file mode 100644 index 0000000000000000000000000000000000000000..288ea4b26ffe33854da542639f1563f50cb87de2 GIT binary patch literal 60419 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 Sm6sj>0000<MNUMnLSTXg0y*^n literal 0 HcmV?d00001 diff --git a/deployment/media/akshci_config_new.png b/deployment/media/akshci_config_new.png new file mode 100644 index 0000000000000000000000000000000000000000..008528a8379529deac6e4231d4562cdc0a1ede29 GIT binary patch literal 6896 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 Uc`ERWHXH`1DQQE{im$@{2Zg2*QUCw| literal 0 HcmV?d00001 diff --git a/deployment/media/akshci_powershell_folders.png b/deployment/media/akshci_powershell_folders.png new file mode 100644 index 0000000000000000000000000000000000000000..3adf54c110ac10d711d8728d27350b88ba04c704 GIT binary patch literal 14175 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 literal 0 HcmV?d00001 diff --git a/deployment/media/akshci_wac_folders.png b/deployment/media/akshci_wac_folders.png new file mode 100644 index 0000000000000000000000000000000000000000..0deafd70629b1e313ba92227457c1be7b00f57e8 GIT binary patch literal 21176 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 WyWHpAkwDwz6(t2V`7$|^pnn0t3~ZbL literal 0 HcmV?d00001 diff --git a/deployment/media/akshcievalguide.png b/deployment/media/akshcievalguide.png new file mode 100644 index 0000000000000000000000000000000000000000..75ce1de0ca612df092c5ec23e7eb8730169117e2 GIT binary patch literal 55063 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 literal 0 HcmV?d00001 diff --git a/deployment/media/akshcihost_in_wac.png b/deployment/media/akshcihost_in_wac.png new file mode 100644 index 0000000000000000000000000000000000000000..02cab73a8f1f1bed1f7b4fe3fbaa789eaf07b57f GIT binary patch literal 19815 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 literal 0 HcmV?d00001 diff --git a/deployment/media/allow_popup_edge.png b/deployment/media/allow_popup_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..475c6364b9d848d241369a85613fe7cd5dd53ad4 GIT binary patch literal 4718 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 a&p5@O&ADjQ<Y@yFAQeSTg^H)vul@rLZ3{gB literal 0 HcmV?d00001 diff --git a/deployment/media/auto_shutdown.png b/deployment/media/auto_shutdown.png new file mode 100644 index 0000000000000000000000000000000000000000..46fbb700fb8e91027cb6c478335d31d8c3cd0964 GIT binary patch literal 34986 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 No~n+@CuPf!{{>B)o*e)H literal 0 HcmV?d00001 diff --git a/deployment/media/available_extensions.png b/deployment/media/available_extensions.png new file mode 100644 index 0000000000000000000000000000000000000000..72b2861fcf0328aef4212082de88ee12813867b6 GIT binary patch literal 20673 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 b_a+s#B<;S3Y#4)}doXju7-~eh<`D5uD!|e} literal 0 HcmV?d00001 diff --git a/deployment/media/azure_arm.png b/deployment/media/azure_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..31da8cc2fdc465a5d5ab456d81339d5f47d03b19 GIT binary patch literal 29181 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 literal 0 HcmV?d00001 diff --git a/deployment/media/azure_blob_ga.png b/deployment/media/azure_blob_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..d49931ef69055d0655aac6bcc1bd18997ae4c419 GIT binary patch literal 5405 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 literal 0 HcmV?d00001 diff --git a/deployment/media/azure_cloud_witness_ga.png b/deployment/media/azure_cloud_witness_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..76645e9a3a29ad53aa75c6b36616458d9139c37e GIT binary patch literal 36062 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 Um%?1y75Gm=R92)wSkL=^0MQ*KYXATM literal 0 HcmV?d00001 diff --git a/deployment/media/azure_keys_ga.png b/deployment/media/azure_keys_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..1be82a8665a48d00bc53d61a1cd1f8e8be178914 GIT binary patch literal 15119 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 J`I~oN{})zwv(o?o literal 0 HcmV?d00001 diff --git a/deployment/media/azure_login_reg.png b/deployment/media/azure_login_reg.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d449dd34b3e97fd7794cf36039331400813162 GIT binary patch literal 16816 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 E1CV6#TmS$7 literal 0 HcmV?d00001 diff --git a/deployment/media/azure_portal_hcicluster.png b/deployment/media/azure_portal_hcicluster.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8d19411dc3b8b2e127e101d2e2911592bfead9 GIT binary patch literal 52665 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 literal 0 HcmV?d00001 diff --git a/deployment/media/azure_subscriptions_ga.png b/deployment/media/azure_subscriptions_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..60de8b8d2c0719193195d83b564efcace3bb4878 GIT binary patch literal 12281 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 BeYOAq literal 0 HcmV?d00001 diff --git a/deployment/media/azure_vm_custom_template.png b/deployment/media/azure_vm_custom_template.png new file mode 100644 index 0000000000000000000000000000000000000000..739cb5d7742ae0131daf1ce49f214ddc47724174 GIT binary patch literal 59799 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%0D*KtHiNF65eid9f`xKOU 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 MJu}@Joxex^1Lay<vj6}9 literal 0 HcmV?d00001 diff --git a/deployment/media/azure_vm_custom_template_complete.png b/deployment/media/azure_vm_custom_template_complete.png new file mode 100644 index 0000000000000000000000000000000000000000..b0314bf140b3ed12566874149221bb98ae0109b7 GIT binary patch literal 49719 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 T_liyKzaT9xFIFm|@AH2EmXL?j literal 0 HcmV?d00001 diff --git a/deployment/media/azure_vm_custom_template_completed.png b/deployment/media/azure_vm_custom_template_completed.png new file mode 100644 index 0000000000000000000000000000000000000000..dca00a4899a68c1af0d11101528f19d7511d5201 GIT binary patch literal 63580 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 G{r>{MIQ{tm literal 0 HcmV?d00001 diff --git a/deployment/media/azure_vm_custom_template_new.png b/deployment/media/azure_vm_custom_template_new.png new file mode 100644 index 0000000000000000000000000000000000000000..42e027994512badcd29d49eb778aba0f80a25c11 GIT binary patch literal 41983 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 literal 0 HcmV?d00001 diff --git a/deployment/media/azure_vm_search.png b/deployment/media/azure_vm_search.png new file mode 100644 index 0000000000000000000000000000000000000000..96be86328048c2a073e773ac02b8a5687c94de43 GIT binary patch literal 46695 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 EU(%0$g#Z8m literal 0 HcmV?d00001 diff --git a/deployment/media/azure_vm_search_ga.png b/deployment/media/azure_vm_search_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..759ca179397cdb58f3abd6bef99880e7e8c2590a GIT binary patch literal 18103 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 QnsShUr>mdKI;Vst09o(UoB#j- literal 0 HcmV?d00001 diff --git a/deployment/media/azure_vote_app.png b/deployment/media/azure_vote_app.png new file mode 100644 index 0000000000000000000000000000000000000000..fdcb3b5d5cf85383b37c3cc07b973a771e2dc9fd GIT binary patch literal 21568 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 aF9?X)sCNrSa8IH8WrvNGy=9TPFX{iLFvb`F literal 0 HcmV?d00001 diff --git a/deployment/media/connect_to_vm.png b/deployment/media/connect_to_vm.png new file mode 100644 index 0000000000000000000000000000000000000000..ac824d5ae5b0944faf0dc02875ae5cf6c5e75cdc GIT binary patch literal 14918 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 Hp5Olgkt6*r literal 0 HcmV?d00001 diff --git a/deployment/media/connect_to_vm_properties.png b/deployment/media/connect_to_vm_properties.png new file mode 100644 index 0000000000000000000000000000000000000000..acc203ce0c76c5d71347d70adfb14bd775c013b7 GIT binary patch literal 37862 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 Cp3wdP literal 0 HcmV?d00001 diff --git a/deployment/media/create_cluster_method1.png b/deployment/media/create_cluster_method1.png new file mode 100644 index 0000000000000000000000000000000000000000..0587861e55082f7abb3319a2057afa5e57d75a9e GIT binary patch literal 11476 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%0A&f$PZwwu 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 Ruo4+UR#H&{BxW4^e*m))1!4dI literal 0 HcmV?d00001 diff --git a/deployment/media/create_cluster_method2.png b/deployment/media/create_cluster_method2.png new file mode 100644 index 0000000000000000000000000000000000000000..eeef2bc4a51aa3ea3f969c38663f074a05c5ac18 GIT binary patch literal 14782 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 literal 0 HcmV?d00001 diff --git a/deployment/media/default_browser.png b/deployment/media/default_browser.png new file mode 100644 index 0000000000000000000000000000000000000000..1582cd10cec0056ac3c8f6b60ed144a0ff1fc622 GIT binary patch literal 2433 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 Tx1TTflnMxIb;goqPDuGDs!Vu@ literal 0 HcmV?d00001 diff --git a/deployment/media/deployment_complete.png b/deployment/media/deployment_complete.png new file mode 100644 index 0000000000000000000000000000000000000000..9033d1f2273a8f78957a0073a76adb59f8043f13 GIT binary patch literal 18199 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 O0000<MNUMnLSTaFP}24Q literal 0 HcmV?d00001 diff --git a/deployment/media/extension_update.png b/deployment/media/extension_update.png new file mode 100644 index 0000000000000000000000000000000000000000..df0fb61fd3a452fca59644a38fe0aa4c98db0f7c GIT binary patch literal 2960 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 KYPfXc-oF6hAP9E= literal 0 HcmV?d00001 diff --git a/deployment/media/extension_update_needed.png b/deployment/media/extension_update_needed.png new file mode 100644 index 0000000000000000000000000000000000000000..caa75fc71268e78c66e603fb1911af4589f1a5f1 GIT binary patch literal 13406 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 literal 0 HcmV?d00001 diff --git a/deployment/media/flow_chart_ga.png b/deployment/media/flow_chart_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..c4416cd79445b4a85f3c9ea082b5f10c7ea1c92b GIT binary patch literal 10693 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 Bw|D>m literal 0 HcmV?d00001 diff --git a/deployment/media/get-dscconfigurationstatus.png b/deployment/media/get-dscconfigurationstatus.png new file mode 100644 index 0000000000000000000000000000000000000000..293d18d39cdef3d3f873ebd9903d1d8999d313dc GIT binary patch literal 16350 zcmeIZXH*nT)HR9`1p$#HSwwPDiIOGf3`0gllH?qQpdd*EBqKQoff;fbV33@1&T$xq z0fr0%1AM5@^SpPh@BX-V-F5$cz1H;f>FTPks;;iuXYbQtYAUjLI21ToSXg-Sa#9*t zSa*zWj<X)zzu617O=RBu-Ez^8mB0cGQXy`PyOwX2-(q2vN8w^j@7>rB9p&^~u(0sk ze*bQDITU`t!V+_lmwKz^X}q&Q;7APcW7=Didk4JsCO}y*Y+K!WIBi~ZmsH?Mn{(|K zX$Cgr>y%0(K*vLqXc9pa(>AAZ<5HuaY$PWgT~1FmVNZG?_{^-@!E@d5Y<eM*J}lU= ztDk~ie0fU$U8N;+o3>(m>FFI8)ajK{^De?~VT@aZI{;-_TZ-64?4BAo`(0kS61@3n z98)0o=8~WJV|^yTYpIMhlpZ$WA4)-W5&DEg0}g8MB@WRz3SO<-isg4WLE^?3+fAao zy?~~HS8Td-_xN%1nu+77{5qC;f0#qXoPdWRN(0hClg;zB{+CQsk3EFxw%O2k=j3&s zp5;s{aX!2|Q_KHqEv1%!&li9D1&a;*P4u<7mXgmI*!K}7?U1d3?ha0%+p~;9SOA+5 zjMc_>uUIF^FslL<>o-y>i>y?NEqf`nN=O80bt7Ch*_!oNTlR$NA<xOaO60Er1d@@M z7aOx7LUx#WQ~8R5J&`!_uF!$C)*QYu%0%)na!~P5a_IHF$oLlvJ~-wwRQn8<O~ae< z$+g=D;5a+qIR>1%cdhnNhYh_I$?>k$v*3GEi{`hu_Mz-z=o-A;LQjJJ@QU+y8x9v9 zC`KrfP4C#pxS$Dbpmqkm!16*<=U?}VS^UV_2v<D$<>OebPJCB8AJ*?&nRbP|7UZg8 zB7Bb)xk{MF9qJY{HvA%yeTZ{q%h+_<+G1zgmsHJlSiZN=di!!DIq|5mY0!tE3)Y;p zU&>aZ6~1nIWQnFlx19F{^ldl0r;b}z^9h5DjVHeH!LR2@uVKyJd1<FOORxOTQdR>o z_}3F`?LLufv=9z37yBO35`i9TXkJTM$P*Kd>(it*y>;(>+WN+_(c1Xda8F<LR+7qQ z!ja9dbMo!pP16Pj7!kK8?IAo7oTQKJHtkD-oRG1j{0}dhgEEQT3&e;wIHZ{vrE}QI zUaz+YF<<FGWXN!XRR%5+NxOdie(-KN;be@{<7Pp!K2^BDi)2gbhWM1Noxpq9db`BF zpHinYl1Z-PY0t#yF4otQcYKQ5A|0SlJIY0qp7PbRmM!+*ZzU%E`7)@9VfL3#&v}I~ z?R%~u>Y0^FG46|JBiKiiXSD>o9Jcc1-`CDai;zpTg@xbVWw$?~0d4Ndx90RnZle0c zOuKkm+t#ir2de=(5}}G~bLH2}>ZTe?qf5#ZFBkPjQ55c2AM)6m_S(p}q5&VCtwJ5@ zK|nG+&iK00wB}eo2+o|YKW@qvK@j@O_B*EOAPhuo<j92ny-oSF!5Vd_*n*DBK2C}k zFve2{yJVB+E|fyX&K_ELGXz>9n!Nm<1}u#Qga?|&wnx9Y)$eg^63fu2?D?6WWQ*f~ zaWHmK9J9|0IpZE8J$QOuJsH9W(RHkEia=A<lpc%75A})BW#|RgUv*TpzCSdoe1-v| z!8i|xg8acRZMwZ2*nmyvR@YPXwal0hn?0X{ald}rqRq;4QA;&F)KtcVi7#<_e81r3 z3_n+Q)S_^PM78RGhsw@Si`;$Ci+bA2x1&h3n0NH~+ML3xrSd*r?88zjWs?{OC@Rsr zhPVg6y`NvX>NVlFx;LhD4_g&`@fFAMaYEQcK_5u59RvwYYG-CT5?3^qMdGUo@S7h- z&P0fy?oF7{a#k!W7WNM`F{-}I{OmP#&m3Hd`@q<KC`A5%+TbNso-Jjt2YgOC;Bv;~ z;oXAQ+i3~FvbwVmPd*<Y4*Rc<Gt%$E3y7W2;4)G6G*-d{oUVe=fEHXv$(Ppsrvnvr zJCbA7Iv<@ld%yXY2`g1KYpm*_56w`oJTIb%2|p0|)(i518MJ$Y<)Jp%O5?`uj6b_s zpvYj3ed?S|pF|4l^2I9!M;FpssCdaYA;T5iE3Sjoi}?l*!_AV2QZdLWQM2GSu5osf zYQ;W1G?|DgA#q>l!~{qw59%L_!`MZW-A1y5-0~jm%I0V2cKX|_Y{mU}Zs(eV?Cq%Z zesweF-)wQnEH2LI2+%>g)87+VOgxakN3X}lz3e?EHqbJE>`y`@&9a?DGXJK2ks<qY zUi|(UfXGWC2ltQlOcJm9yvh4-j)u3K{Fk){%BPp9AVUmgQ@7pO+1;i~{_9-0RG>27 z>^SawjNWC=$3<b)49uCx5vKY4+x+c6d6(_g&O9Io^DkLjt_9JmJm-B}!|-INc*bQl zw)HwwMjoyhG-L6irE3!fQpsy>N-bz6Z+`2~dyXsUyTWvIdFm(Eb#($+r1(=BqtIco zkCSH8%F8rCH-#aRHMjUjwele`i->bH*naf-!im0_P$msG6neQyd_LPqwE*>vJ*agE zL*$?J`(J7zkD?GFQk09&ZdaM=4oQ>e<JFs2*+>mB@>YZ=FwAfwPPecM62<BzMlC!8 z6~@N*6@Dxh?UiqbSINLXkCi+Q#(S>iZ2Hx;thUHP@OJ~XLeSBng+(-J!d@{nex7<( zZQ+Ugf>$beybme@e%y^RRKA?H{2;kieSJuGx!NXtIY)wb6l6^sW<I~X+L@TVJ%p<- zR(ksQEe}pj+D`s%<y=KkQjLfrYGWzSa_-0{ZW@(WDhz;*F6`^_<29OALu3{UDqX+f z<9lI~dtI}O2s^kRoK4NQ9Ua_ri#GQBVKoLZ(wcC`;a8!h^ByB6CEFOeaJu}{c`vQm z^{YZ7se!eHE9Ml2jgifo^0m&IMOkq=n<i0L0Tcy`Oq5!QjH21_t4+)CVNZg~w^MMd z4LF6=oxX4GUi2pQokcv&=06uD>!Py)rBrS6N>#suN3ifK;UjI9OI$n(0(kIdc70Yj zXA;AU*y_q%1O2Sobl-GH6m{-Tix6D+=5*Vk9FHc+h^}vqr2lV7^GQgeY$e`2uuu5y z#II(Gj6^X%LexC=I%Nw)V4u!T$TdRL$>h#u3&bRcvbiyz(%?NLkHT1U7kzi&`dFqZ z<fZXiW~pWk1d~H~Fd{%QZQigrh5Lg>gyLkfm<f?U^1Qa>Wfk#3;S?w8RmC1EVi;up zQACw8*lU5FN4(2w%(h%fbglr}Y<h=QQ{*cnZS44*=h8!aCf$9F3qW}INl#P*2QK-( zH8Pi}n@2&5Vi1`sd5FFEedRI713?d4(Sc|?P9fuS7b{Fq_Yvvy)@}ds5z&NSH}I(C zNUNBL4LN=8VhX%A3k<5-^;F_H;u{eZ60s#~^p(o{QS0#gxfBB2+t`ZllU;=7t3me{ z*HNzf7lvkHy<QQlul6@5Yjuicv4@Nx3eD$;iEP<NmSRWN=j}}gY%4OsQe!I*WA40$ z2Hz!$U!6&@x=Pt{0{gyS_+*?D8r;v9?TcZaPFdjDlZ%`TbLf$6YsZu;&(X8~df(s@ zRo~3tn8r8YujwnR1QZmsQoT~%;*0vV^Gfnr*XFjc=myOy12u5`^boUf%g^w&t&o4? z0hw`rWt472&@a)p>XB4**U_&8t9Ly-+nHUEq0x)Rj1_*X%!~5Sot#ya0&4T+1&teV zm&ipK|9ckMS7^en?4!71`iSjWnL7kXANAdG*va!mge+MHBGWFYy=E+VXyTst>ay+3 zrvv^+mtF%I7U~zjhe&9Fp#2(ClFxd*jg{Qu=6P|rSWagVEf-HAwEWE28+J;Ysh5$V zz_sHW!Uy#U5cRv3ta!Dd%x~Rdd#c(|EQ>27O%zZ~NZ@Wa3$kgzq>r|7jp-P@O^iw{ zib}TX-UjN}_2m%1hwcfarB2~}fBs&ma;y-wzXrS$btcOrq1W{xi1z*RNa=%v%VK-) zejef3^gMWj@|~|U`_qzW4>zhiIC%K>?*=mHo9P2MD5--^>m{Vym*N*eFAbsu@td6z z(mfZy>FP%bFe<2uP%w`=oaCdA^20ppyAtMr7lR_N#k+9As0I92Lx-Sj6si@bmi&zY zUIPl1-M)8j+TYHdHtIyA6?rL_by;XidVqKO!ol_OcpAKZp+}qHodP`sW@J0~UTPjK zP7@%)u3bYpO|AtlFPIY5r>0VhY$o8aCB1>uuQIb;R##xv5#R%Er8$1;9J7@1?tq`R zwDcn}!#NLlU-<h3$O0#O9MQ5O&-ctMZW>)D&LvioXerGv5G;MC*q~N!ojw^J{PRK- zVEV;5X;I+fuABQF<_%<-vO_5*-J3@(Kf@+&C}w?HqxSR;xo`(wb=cl65!3Lg8AG(f zJpb>}KCZM!4O$j5j(_1_r55SRKvg6x1d;*K82NBrPNo78zfvqWmoBHo3Nm<n!miL5 zuHj~M+7JnaAyP+7&PDWE5v>?v;wOiC_9$vt81vewjIE@i{Iz%mXpS#rgLY0T=rfn! zx{_~6a*gFu9&Yx5FP~3$|IiiPeb7<(i5YWbVyJwUC>Mpz-2IYhDuZz$BPBioz7hJA zBTZLl^5&`PFg}t+IO}J&rZiI>`Z(+<yPQhr@fi5fDCOLcUQUvNJi<B-XxrqwZRX$B zP$DbrmAjo}R;8v0`TH){7t#)NSFB7-Pbc~0+8km3962tq^pml<J~S8?!_Y%4XB|R$ z-^^YY05%cVCuCJC1Xpo<n8eym6R~TiBe84D>jCufkiZh0!q4mz4Zc>dHpA?<m#)J! zmmt!p$PyyuN7rjX<P}#<jDF)gUT7c^GZ^O=$8KAgZ^qWdPVu(VtHBL!<!749R+ko< z=;xzMBMBvnbNtXHn-?!9Wg`_5#c(AB9fGYYICvz%9;8@(NFL!$7ZY-vq_o3T9?I<% zu30or{Uq_Ub!dr7(2|Cze;@&s*+fY>_~p;LSl33pB}%9%qTlH0q#oG!5|8U<t#cII zQ|*LrX2H-KK=4?6bn|3!>+$6X$$1A}?5FHf#xeE&l%dy7mv(hve;D^sH5Y>X_fWw4 z)F5~0fWg0Pt1|DQ{O#r5Y~SaPmJFqduD4g#qsab32yw*l=HH|42iLmKDE_&UeEB}W z?27(hlvD9C$o_rqKj1~t%JtTt;y#qnP5s&donyNC{@7TIY&5V|xqlE(!hZ#;&@bc~ zg3P6%)?2EZTTRXKu7~v5QSCeoOp{+vbnU-lC>BWj?8A!aR8K=Y`0c|xy!O+m#1gC+ z6HZkdjs0XB7(|zz2qiuD$V`au5Up{es<(NSLDUtk8F}`qw=pyzv@$eAcaj-8&b-<+ zR%#G;u}SK1_fL(;yZN1^eGa;tPemYpmymQtcwb-hTcV8ful%EKsM0xCR78sFQV6a3 zT1fV-=lVKtM#Mkn0;L+Hd6euothU5p)>~Zmqaw5$MQ=;`7Kl?)5D8YP`>z*ectH6F z?Q@~QDr+INMJoV)Sj7cJelOn;ak;YN$8SlkP-IGbIm}g4IbxMtRa3NgB#!dAJ-_o& zIf2WnL*RobU8aOFypdrD-74KA|DN!l%8K8|i2xD!pV9eFyZ^9XoRUKqy)QrWAKT=C z#M2TDG*ZT;jEeK4eke3Io{FAZZE5xLhX#K=QvuO&F^-7$g~=#I%GQS3!`nSvBHphy z<GD6CeVvAjRM?%+Ej%j^qT0hzsin^^L;Ymo%Aa#pq`J`A%|9#2pL0H!tGd&1-g*Ct z9ml!$F5g0uw_>|$NrUWNmtL*?3}Kjqizg$XxMB9dWoo!*?aq;Rfw7w8F)=CDCw=iZ z55AXTFt|roL4iC+%1xOn$_b7E0syE7B>$3++UL@Lj6elLa6WSF8v&xe=G^i24shnD z{a&n0cWuVKqsyAeG*aC*tD@w@|5aE-ii>J1hiqf(UV<=3-c+eC!;A^l)c#KnyZH%s z3-s7{9_bXdCFVBCLtYbFc%IhPAswS{Q=yCQEV}3UkR_e+d=eWfe_#qdSa8focoD%e z)Y{7qSTu+F(&$TuA0G&`l%>y~eb=Yymt-)+Eoxg;Btv<E>MWxt8`+b(U``5ksJn00 z9=q7HaqLvD#&n44Z6O7vjbD>GY#-XiN@<D4_LbWFG6c9^eT6Pw_9@O-Qp~J}XN(Ni z;*Z*?zXFWSRk=Wo5#I}nd0bas_$m%DMPF~oBL#%xYnu9MPo^(QmFRPr?M@6QY_?>R z57qF;LU9#it4xdBskVMhZN>}^Z{#f;eM-uA!_%|@vmVtw6R7j2qu$j(u2;e87CR$w zE7OjWYtxd_sYco8*Ee7LTB7b&gLUGg-mk1Q66Hn+Ih@X~y`LGK+6=w2$Xg#I7+t*! z=LnlVi%?ZVD!7>$R3vY%jxc_-iLKONXp1Qtlr6HH?>&78PPFoHPmk(tFoz*?jL&On zt+LY~uZaNZ((!tr#=dwESuO7v+xbOGmr$Vzf4boZUGE;D+UMzHQ=+VG)~oidFH0Q) zydi6p)aF6v{@6y_V_ir=<(&)d<PPIn5*4J2SvFM?3GIeLScFMh(W!G;YGXUvW8mw< zS@r|q=pkX^kfGsJ1K?!ypmy6?SOmWS@m>BaB?(tEuhLMYUp$3{SXM!N6}sd~f^_jD zvU<BgEKh`_(AFi;hG53YGeGcK7tG$pKXfr>Az5imH+VfW!&9Kq)uYDH))SG#kA0mU zJn4zBEqE9Q{_Ia68OPZ%n337G25A-Y5Ul>0$FQ=PX_*k-+N-Wsv{>{VXMMOx0@l`p zU-0W*>;gB*w%0*v)Fv<9Nk#pM-gpBeBe)<LSQ=voXH(Mb6#0r1G6mG(p(VujSIs!} zwK&-iP-1hSq<6z~s*af^tAux4)ehE4%t^z->s#MTrOkn;R}J0uSIU9RcUF|VBMs-u z87h;lT(|Ft6gZxNs7+Lhtv(mVZP|?-&0`M&wR8n&FGh{Z66+5vS*%HgI}O=X&ql|b z8cWiqMZ_=Ha0_Fj5X?gY_Jgn4o}+%^%obOf47uc(ZhXT&PVK|ydER>bO}=eVy6Pi_ zHBHk+)YOYrX{)T;j9|>&DB7gLn{I&EOFN%jQI}Jjy;L&ktN|njSga<A$QM{8b0c`L zVV!OWlNz-N3W~Rs?``Qu4n<q2uP7N=#K$IXaAuwCYgRd|vyOaan6!$aFXb-D$&HrQ zN6n4Oh5(Kd+=rHB?s4Rr6Ovf+-d>6Lm^4CfzrN0ex#u>_Fk;0@voE(bt*B@<waMVE zgyI+YdT>?ipRZ#D9bxwsUbH~=>Q&LP;(zu{7DyV2Ph0Y9DC6{O46(e9li~E$7-G2^ z0k7US8<G3I=-|l1Bye3S;xIPopg#w7`+RfhU~}^ec-FWhqe3EDtYBtKGrCS#U4iNV zeD&SA_Dpu$PtF1A5e(^o52LvvMuSeTk`BBfd$j%xi4FPQB-bccr<N(_;NZG0IOf?g z)w8V`E}YMyl)8mA7Rlu5pF?AF)~YVWV*%u0?}K7@mR65-iU@C^I@^Pi!Ln?*nJ~)z z6_SD?Uu!NA4`Yt-S*E4C+l$rKzLp=NP^$}x9gvXC4#{w<Zrj=;-t1QQd7>Ru{F>dj zDks%8lACd4l5}sJ+f2@mX|!YhnPykiA+AwYOSy%9r4!-E+#)&*H~eCrPkl)9`Sq6D z{9&{9{N3<X`-o@ttIM-0+Uxf>_huQB>viUz!3H!-*L>EIyfBu5fki<Ss4TTEmvs(9 z-4N}&A0y<?s&2g@TH7K#avsOZwHlSkF(?M_l8;Om=&MY6&4#Fc;~+ysU4Gy|91Ax2 zk#*2p9bd5dxeFVSYYZMt`}xVKetb<4`5`7ah|-P6PnsqL%p_`jtzI3;5CO~^O`h=r z1gmm|_Z}*EE>;J{AA-)L7w&kbFbz0EYosOHQgf=NaKc%K6gXm=kX%N3i8cMKOk7TP zcAmolyM|Bjf_cvyA)|sdk)xw;Lyp~CcRaa{t2SZg<LcQbKeY8zT$V&9St5UwY_H4Q zi|~uN((t+3kzg<oF)oy85zXX33YD=x0fZTA#Gi`IXKsYZ^SJju-R~YL*qmn`*`Aqa zChWREU8%>t;qq1R*VG>L&C%QNbOCA3ZC(=d33TB-0DfSswV)gD>+$nBcp@T%R19)E z5+bU|G8<i8Sh^;xzPu{qG7{)d0i>K=kWi!MD%ZQysiUmKvMqt3lZZ3Bry|Nj$l!+s zwcjf7;oEoNS-FmkN@O&=2B${Zme|tXx)BnjiA<yIEexE^<FU#qd<fMM=kvt*I}x1V z5LhxhPvhcfYy;4oZulxvcW_C5Op;bYgmGoz%$CWWU_`pOppS@J<>E5H=0Zq{!I+Ee zo+<p`;TCNu#59z$nz;-XG5zzXtk74m=W98M%1q#dl#6srUl4p*XzM=VHkxO&z3IG! zru7i8`CgHGfQYs)jP~?Hh9{D>8l2Z2(R1da==uTdp@QCEr0rW-oX(Ln&Qo0P035A- z8x#<zVKZdHX0$pI&w!Q(!%?GBsUEVrR_m-`7irz$W778u<xgG@rO=T^?Nw}ItiR;x zVe0XQh~y&y%CI=gk*WMvlJhhUW3FagK&$6^t5zBRn72vZ2w-G>PANnYar8vtAuc5~ zJ$brir_>?|?A^<`&JGc!<SIVu`>D<HT9X409(p_#IBX>KZc-e935S0*nHR|%E_%1a zy;B{ND;!ShbeYG2?ETKj<s=Bw%j#t&0xi=An_3T~qLp}tX9wJ>s-n)jjt`urcDUE7 zHau03^y&$-)OaKPa)Tz&Dh(|^A*;kjmIsGSg)aHL=g(y6{S*$LG@@X<%bu(><`3H< zz6AQ`vmUh&GTFZnt~sczvhfJRYjE%rr*`l!+N*oPPf^o+NuSIuJ3s_DQoeV+&4g&} zN4AfwRV^!EDo}n2GSIm!wqtTJca}$|LkW2AIwJ@V<uWfh4gL0b^rZC!S;m4$MmL78 z(idSb8K_oDT&WDvdFe^_0fudC?{oXMOv4J9dvVi&W(gjhCVPem?jS!L!<DBvh`et& z1>2@ucG-SoZCc}$0&n4xtGS^m^Pjn;KJP(JSlXCyG&#j#14&B*W#0MQ5^tXBxCCxy z*}HKQXh|tV0QJkA<XC($?Sf9R`i<i@N{qnTHaGjRuy9GYJYf{anDxSz1;q?dKdw^I z8iZIekHjEi1dTLkz)$M3JDn2a-4)fn5;FUpVGFGf6y$<L<7ldRrl`au#<_lqnqF+k zRzy~Lid;J>;Dy_6mKdqp0ku&L^4uwGyD|)8-U|wZI~)a}N5FI#E*Cta?5tx65Sn1S zO^VQ&zm))eROI8ep@FF2bTf{b3iJ?*QGIlm!b08Jju^(B_!`M<9hWlcW7K!y8gOtp z9i*z6Leuep7xFy;q5egKf+qhxD8J(<#M|p}lumz&yz5E;Mb^u?(j20n0lUS+{>g(u z)EAc**6kmO$2B685qKk>(e!WU>pa7r(*l(gA{CmBG-u6a@+4$HAK&thO6%%e8Eq4Q zKagO1_!Tw1lkA(=`}!22z>GK?J6MRlS2d<ySO`za0otD6ozXThcR;A;Q$XFfuL_TM zrIKomCq(2%Bu`I7-)s+6O_RtYWu5`a7vhN+9UdFCWiP`|lQ6wuz*i1hbWT*PnQ>=7 zx<VA<H|K*_C_!#!3D)I45)pUxzOH_EY_J-k7tWUzIrEc!0nl|-^(bI|j2)sf-2F{@ z+=A8R;bB2Ia-Ov4*M9a3`ARn-Z)pam_w8MrLr>!L*tciD*{n;2j13YHXc#C;8L!eD z?T_(TX;<A$u&nI!g+%BaN877cN#A+G*%Db}CR4%I(cKLNQeH1W4*Oma4-M+4OqAZx z(u#pGAAB%Z<dTE5)yyz`d873DTn;3T0(+&#27_PKcO2CRoA*Hz%nC7+8uyUQ41F(4 zVL8bM`y*dY5n_JdgDunZeNE}_Ie%#bwsRO(M1z?ZfWa^!^SRq%2hZ4!Y)HR$jt@<k z*;Tx939AVXt_%y7;TlOV!{O)eE|K}{eT}R<y1MuX9bLb&oW+}X7dWN}-W3sc)`jft zC<qh8D<lqkG_JO3=u@qZu_u{qeO~zGjfN#2GkLTXXJygp<@6E%w9ts+?>Md4Q#<#d zLFHT}97A`E;&Yz8;h`O?{8*S0Kc#rmKV1fvbzUO9GJkoP9+4!0Gdusip03yta$?<T zk&e`f{V0Cmt{Qr~x_U~#fEI5xUGpO7-H-GkGC-t4Si?*KO4`s@7{AZ`u(3fmod+M} z3(*qtWACZQTV3N?HTlAw<D&z0?`WwuN?opJu9cmkCOxLdE4J8cAW1|t%GGLT-|9qh z)g2Tlj=E6Bt$RNZs&#@dSl0t~_vqd8Z>_Qp#U$vpH1@5`Luz_X(`92$IX%UKJk;Cy zs8qMYy8~5?lzBeJ3$h<jg#{-+#68Uqq2hY#!4h6&4E>~kOkkNxNo4-AOP(2i&K&@2 z<ajEkl2{1*<TGw(fIU#PO55LH;dKK8rQ<EF!PtQ0jv#L3AMrQyt3F6?WSx>u+Zycm zsqM!k`MCO-C&n|EtCYJD+-*l~J%GoFF0^>4n(b(|5j|s)hkM?Xhq*WMV05Un*X>|| zlJ_G$6H<i6xOt#)Nwb%^t+$zZ+kt>z?S_}#^5kj18i~X#FO3cR@6ps!PA>;(s+@ab zl4kNJsH<%9YfaM6LMYD4>t~j(s`w9hx=~p1r%9O)3s7COu8{7oBN^4=u3em1FS7m& zV*@S@C7#(FiqyqTJ;#Q^!^dQUJcuWlp6g|IbyIoDkY#6JLmftgODV9=-m`vv6PN8^ zK+|7>=t#P$@XGOXa#gFkvgyj}dpXxZh@*-~An)q31{hBIY;Ymf19eoFWB8LMmsg2& zp1J3A-o#4o_0_HKrHO)DC$coVeCW=Ub4}R#(glrCv!Brri*Po{<nUL0QHL4SXuK+W z5>*7qyQ4`5+ng&Y=(;Hxr;$jT!$X4VHz`o@V#z3mUXk?5qo>ygjLTY}9|6)Jp)jiF z^5IzGIlgfmq=ls({h<%ky0)4|;&(%M{#aNFzwmNO^1Va;6QFu8dOZIo$=yZ$WpKnd z7~9M~@%a@XFP5&M>1;+eHf+9LX#UN>sB6Z5HLQyNG_2tN7@f!e@kHJ5!vn7WtpAI^ zg&}a?zy5o_%!8MszoRE^2q?OL8Ku|%H>Ikz+4c5a|K*m%&G!k&{-c~Ep)vr!T?#=j zpHF_a`P7QX6y=c#qsXp|d`^)Jt=S#MaQ4xDhL0IHo`2KJZWgo?>d5789?PJj@bL() z%Q0Cd=*Mfsu?i4+beQN?|Ggk&Ge|NIUS85lqF0mu$dW_rxgF!$WhV0w(#2w9teZXK z-qxd*m!vR$^@1cNug6%~H(hS{i)z04JHCh8*d4{=8-Lsw*K~_>AQGzcK=$G@<LsLr z`&2brXGw6cFpnL=#`VkKu*Hu8Z$$m!Ij-7uCsUzY-WHbr|2W`o76IpO=o!CHg_d&^ z`Xy82i9JsS8=k_^1zQ)5cae|AAi+h|{KKENeB!)2n}GFz0&$wVN!t`wtRp*7&QdM~ zn#IOX$E(dg{p&M!1Dm++gHOHRHKtQexwjbSW~0R&hI=9i5WH?L0(s1ggrw-^tvjy2 zvl_0QSPPW{Kb?1xsTH_!wnmcGs=66}tqp95g>dd5Cz0xWQ+v3S7dYq+sC{(ePb&-$ zbv`0{URS}u(lBesjL19aO~?wo#kipNp6VnV)oxH=U6uD^1A(qv8;Iz&e7I%_W-GGg zpi6C8`@!_Mzxs*SHJfP$<1Q=?209e=3KbSxd}~nZ`3j(aSa{V#{eHDB{9+sTT-3Ti z`GcrSuI0FhPfw?czME^|@aK3TF*%X!TNBXPIaG|EGLPWN=X6|v3XPI;Y2D~I>5iej z34V?Bx9QuCudiUA6;!H;Nz*^7s!;|-bGq!GZj+IVI^Nn@da`|712h@;9%IY#wjb{x zuQehDbvM-why_%6o|-q+_<e}BP#`)MW;iLHa+u_g(HP~HO+;V>)RFAkj(Kln4}_`o zr6etc_C*eYh;{|xs-a&arjiQk6$^bayxz`oL*Y0kL*KF_{Oap!3{F;`b7`v^a1Z3N z@d!*R+3;~b_nu>;uNx(r7&ER?Nx-#e*dAJnnZUK)7}2aU@re{O))Hl-^P7Zd^iJlk zxaJjv12f(mwKu)8(@W<|J+^WbPt_D@O&RZpNr4?x4Fn5)OQL28l!$jz5Pg+<z_Uhj zW!H8H%}kgg5syn}V3jWaE<V^U`-ctCZA}t3l)3KpQn0xW6ymwEZ#KU?E8juyX5IEs zjX>YPKvR`(Nyv!F<FvPb@hY+#<I^I0baZb9^~rE<iO&8EwsOC1S?K30qV1hRe!aYz z=%zqd4gZalB0!Nc)5M!q9JlZ(o1fm|DOUE`66Cv5K6ZYVD02NgHa;Xo8cJKnMws0S zC@k?4r(ZiS=UdPFxte}J<Y1I{QY|IvJ~L8ZSXgjLa=2;wE=|<}uBx?IH>R+C_!3~R zyci~8EcLrnpl;<FU&i9oIU{}Zq5KwvgWm1%I6*{*#zCG{<900V;4qss$>kADujq77 z!bpPWT!!EX(HU~7>w)kZ{$bJ!p=n*~!mA&I5sjl7n5^{HZ9d5}9!=q*R}-6z`h?7Y zA|D*&9W+<;%<9vO0r;9&$7;2W;<0=dAM<EN`#VKsT?|4wjUk4M`<)?0Mx<93tqmd` zO<9`HGq|!jp)ED3`EM=#k}{(SFA2She%3vy_Cyp{@TYn;owAraUyTD<=let<K26Q7 z+N1j=J_%t8LELm*qMA#Ts2HTf(j3wFSd-L{w!Rl^rv4R>SXur+AS;HGK&P3L_bohU zGz--FP|Y_hf|KRQm%(3ECCN>w?({kHM<EBVGk3_Vwjd?k<_tABYqABW{K*U(4%l>- zX0##Uj4G{Jg3RD+Ms!GnL1g6E@W{RKdNac4i8;M5CJ!7&_}|?;iWLRJ-00%$)(y8u z`#|C$_9+ti`bf&LpJN*xk~(jq_t9(j-w%C$m|Xupj1{i<COvKF{Tf+0=$BDV0<j9f zTY>Pj`HNE&ls`c?p)1%WhWwmp%Rx_W$6F^%4ymD)DZJ)UE+>}VEkJMrPJ2LZ8lG^X z&(h0PJ|&5;w%ElR`VyfNp9a3gD2AHCy(32Ct1OB{9!u<XR4p_%e>j#X4DY8r@w2d< z=Ks1nJ7{e0&_&OE(wFd>eMpGagEvMyxn62VQy&U_oRG%RHhxv7P+7ND--`aijL`=k zJEz}9fm#-<X`6-0h4(g-KZuBqDpu)5RXyXHzy_6ZY^5+8BHe%FvAST23*MvmjX%yI zBSHadm>X8@#ZvK#f*xl7`GKAiCVR5H(D@~^wZPga_tq7B)^fh-6)V1V+Z*yC*-Yu2 z+>U<P0=LHA1j`k#Vaf;<R%;qp7#X};Lne7=t`!CS;W64C_l!U#L6BCw-kImZ20gTN zCVSp8{>GaS>l0=3(Sqt7Xkr@7tfUJqjTmJk#PSd{q{TvLpOc+BpF41jw}G)Id9EV( zj|+O}t`|=?&ySJboM~Qteu*GI=d87T39L__TDfcop0<J&e=nRbzC?5WUT6yqo+5s- ze{*FB`D<f+5=`tXvH)4RPE<7g)o~o*tHFsh2#L0TWF1^Qw|z&J-<h#~QOiZRntuN$ zf%|-4;*rNclFwTn$nf$%g3(vh5@OZ=?C6GXYT9~aS91l!c<TdHw^)pRHsS9Yb}Pot zeR$(PfzLD<54Eo-EZ}K_^n%Q8B34+7^Y@!^uhT$WT-W!NeYV)H{-P9dk+(U;6~mhf zpqL0w%v$%K%3zWI532Z2d3q4>r<quvz7_gY{S~~hUI+e%bv)y6>Hk%-ByWOlSXsq9 z@X~}u#laq1_a5dg;NO&-X$(8`dV{7g${#)aEk*pC5|8^ML1-XIO4!fGDx-{(iUD`` zn%n)H*Cf4FdOSpT(n2I{tjdk;aqZzk#_uQrx~X$-R^h8kiNqIGwd%3-_>ook&cS1% z*za-Db6$GsD}W8=_CB20v~Fgo(oBA2QL%ZYoyo3deaPd6Ks%$`^y)8F+y{lby#yUO z8{CQEBds;(4bJu2d`VRV#@u<UW^*e_F++}vbl)o3qw2(n6WxvhG<SZb<qU7GQXaQl z;vyUY{32yqss@qB>c_#j+hhc8L?TPFmuucx`J<JAoF_$9sgrKWv!`T$$7eu;DV1Ti z1}-GS&sT0cMaARxgKcX!^EsG1V6Lak)+Qft#P^rte`09r<UmF(M&<#@owJPO9CL|6 z9xV$TDXXd0f*$vtc{zRGpCesVtFCWjIhj$cn%Q=_fjmw-IS<)9EgN@!LzgK?bkuLv zfn=AVIE<6VF1v>BjRC)szDsIUQeB)H>2G!7efdDFr1x8iJbO3+)7hJYcX!>WwXbO$ zr4kk8qe2ex-<F$uwO<aoncTuEd~q!|HIEqoDR$o}%luRg8~y{_^*Wb{*EVf7s&;TU z4d<jzCUW!cq;@Q884w`^KfY}Mf3D9fsx;?z&$(wSh$og*%`y|){svfl6xn0Cp~(*i z%zjG{RHMTc_i8mwy{cdO+uH_M40@^!2(;eJIpkv4Q||I7MT6jmn7R)-L=lm`nHB<m zvZ^Gj;&9brQ++v`lAX2_1pW=r{u=rz{gszu{))C>!A8tl**62c;{CDbwqw$PYCOrm zQPcA#CL))e=CX3|=J{G9CGYJP^Iz3#NbC4+520iCAa&v{cXj~^jor;&Bc>$m9D&_i z)!$DVg;3OyKzt?R!3yD(rX=((8x|G`BZZOIJ`)%42N3`9@irNMPH5Lm_TGRKQxoZ| z0eQ8`u@Xl%T~jKMqX?i~w+^wpqM7P|5~l6B9e=@fplE(hsgim>1dy74mGd#J#YwL+ zU~|tv=M2u7<qlDBDaDa3QzwTQ{rZh5*6rda<y+rR&rMJ^w6;5KzJmL%vqo^5tZPpS z(dMO-UcO;)BSPf^ERK5Dj10V3UE5!gW(*~8^R)A0YAl>8n<WCx2C6L9o@Wax!#!~e zEjzzM>>Gl^bl9U|LGqPlgrS!P{mu?|JLB$wcAh%efZTXLYR<pBgDpfL*uHp2UvRSw zdIh3Jaa>Sv>l_Csx>*kbx0~o!)9-kI>Ml&yeeYpqw)&u4)8-f09AtJ-p(&(f5@G3J z6NR)srb7SBy4wi-0@mBc;M%Qw4%ziC+6=aP)NY3ad;*5Zt%1#_Jv120&hrmJO@%~} zl-O&MM~03;h4WQSJKB#pK|3c==TdeB`)grB294<=q?Dv|whj7fQ9q7JJGf-K5b~O) zvp0ODTZfu9X-Z>b)xpORdPen&Z>=OeDqLfxWj`hphsjN0Ht4zp{+RBjLZ(HC!j26~ z%@f0BskR>1lGNWTbh34Na^IIr`-SRD>g*Mq{p`cc@I#uHqK2O9UbCa4Gz9MDv|Lp} z!=tGl@XHpbq0d4o$SblxF9eTCPTw*mc-zf*k^F+@)9bfzdbY|)w@GC~W#hc*c?_`7 zV8OFArP;=)Nx;cEzykD#Zj%mR+jl8VH=RMAYiW80j(ZaaI6RP?1d0vr+_e{QaxiM( zWhEjbC9N?sq7;;t)o+x2pq##JJ)6KbKDpW(`*3sQ)>z$it+dwbqQDwPZ>k=OfrmE2 zz4tQ#5AD;mm(sAS+o}1nfzp0c^knKerjOSL17&peekn9#Yw5g!FL?Po&burR#;sog z9@l|yLi{wWauiv;p-V_Y!`eXL1Cj~mvPIwWy2&D%gENJaMzjasm=$g__8MFt;9}?* zejnZ)nhqafsgQ}T(@-t2e(Bjp&=~bW1{e1tY*r=IR-ofc-Xeve{31eQ2tig5Xd6eP zj{+`5Fw9yKHjrW7&U|OfHN`o2mDphHMUU$~bBE<FZO23!ZdMM+?I;qEd}!?IFXwsF z%}Vo4)1*$nC!Q}<16PTE*X@ul_mS$wd)}{7GOswnWNJG7Q$H2fHb0v}>S}%jyE-&& z$Hzr|w30QcTwHK2AtG7PJTar6$7Nx?VhWhkHD#GKd6qhn%X-%0L0K1~R}jwSx9HqC zl;8oSzEZSnab4+h=s(S_VN)R^r6rwmzj(h&))9Y$>xx=?qolmx)y%1aU`P5_p29*+ z-}ZbVZSUb;q%}*=NL2hBas?th{V#czfnQi{^-6>C!=d(p`<3w1AQ%Hu_?1cW`3ZRw zH5{GRH}Sq<Ti&^`A)1ZgwV&+}8?v-wqBd0zd3HV{Gfq^u;d%6IH`&oCKG1rw0lC-` zV9s{XmqrI-SM|A;^eZ&LAn(M-jrrSTjXKHa<nKE)7Kth2qfeo-Q(%)R7lh9Zd0@4w zX|hjYB$lKvbIKj}Lie*g>yG>Hl|1&wiH;AF0XUP`yI$gsY@R>-%NwY93~&Bq=Yhl& zf5<7$+V8YW7Cf#o{zGc0iPc4`^%NzvwrcJ?{Ft*RNily=vhg>z!;#;rJNC>3N^@W6 zFE-f~9uXra_=_3Lf3Nz#w`cVAhWP)21@^3w|BZ(jcNFr7@)>;mHy<mKQ90}W$m(e2 zUt7%@Pq_ESmHcCUvgLVjPX9MSE7{i7^xudW%BLIuKq56s(Tswqg9vZZf69CK9}fB0 zy)=l7`nTAF{Z<xN&7r^9#2JdZa9>UTQ@4kWWB=B2X0z9<@SlbdJw^O`lRK~@roROh z)&(1K$_oF(nZS7Gp}r|+mTQ0QOy_<qvc><&b?rz;!}YiGy6^u>@4SBDFPB4l#!;cK z`qy>-|FZw>c7x_iStioXl6ccUvakzJ{J-8~WuEVO(*0?k_zmL}po^}z*<9bh<=v#o zRhZ?CgNr53kx6wIE6Im~f`W4M=6U@N7LlgAGP9|`b=B-9n?&7Uxpw5NsU1^(9i?<S zO*R?+9~$VkqM^W;BQ<z-wA0AWGC@q)=%dquQzw^NwA$gZld%F!jQ0KLRJdSBURnnG zfe-0udqn+#{j5(K%17UUsC+5ufW72K+A!LfgJ<zp>2gI8Jwo2_D@CvtVXfBc?}F@5 z*ZoNNS0JhNKwp5DAx*)T3zhHO_^;qKqoc-boO;`_c~Fq%I)mAMr|1%&ycCSPejaka z-_0Bj-b5}mH^%wqM^C)D`)L*z?E(2e!65$=407vJkNlO8QP%$n+xY)KY$LzH5=-1D z)UO~M7y28?iHO3ni{M!5Lw@QHq~?D~RP&DYhvG=3Qc)M|U?(^B$`P}r+Fp}_YZW3M zc=9uHj{At{)7|4(3MBvwDDNl&ZwSzjdgG#K#&@S6Wuy>2(1#2KWp{|=qWMjzHROQ_ zNov;8t^C1M4raL#Knjq+8SuQ7Ju{tL@}p2R=f?dXf_|wcn>cupykp4`;h~EsgQ|wQ z^YEH5@AM~V0C+9^x^$IMm)OJRZV$-~VE_4?Up!=rZ=}C^^*)P3`bTOwy$P5_)!P1K z(#s<V*3O_kvw@n9*bYyeM{9;DaG%!WZG=r0Xn7I(H`+Q~y%AG!K5ExX?}*cr2M>60 zCvS$v`{yM2T=qVS2Y^b2r3r*Z<(Q7W-FCI^ee27kG0|s=<+%~da`xE{rhP>A_s^q# zy0Kf&v&B#L4>r8^@z&Ey2ecl7I7(7II=HrIe$5G6CmdFDP*7}8<u&Q(YI*5={IPB1 zkLZO|nd`jq3Zt|ld(-R;f5MUb|0n=Luc?9vi<N13^T1md)FaV`<PfQE0Fd6k0mCp% z8qRS|Vb_aB%8Z@%T{?)>v8z{hn{~5^qn&?9VLK9*{cPJ%^zG#xb^b?AIi&Y$8VL>J zX-KP8ne<-Ow6XxplC40@p7ncFKC%nX0z@)olIs8&6Ox`+I7YVC`ChALZ}!*HxBt?4 zadofA{q4gdw~q%|mgd*Z-po@1UAv22!y3=N`lXJLV|Td+A=iK1jiA{a<DcBa7$t`u z?mobcFw9do7Vv-+V)6DEZ+LOHuM!%Qrin$A@q~-ju6RA~+5cITdcb}@t5qk_T-kwy zd8{ZrjWSHaIkC`374w|4CIeFtjx1@$5-g^sIc6`~4*Qe38?vb$S<Kbdg~-QF=C^%1 z<PYnGkkhT;-?2=ek^p<KKvFH$_rn{oi3LeYeDj-hVs3&Go`agJ%#FxL*BMm0c-geb z&09%)+F!Dl{@~6CyRY9+ADM8XeqCp599igVkvd5=WbON+SEC{478YY*w+AGf_3J?Z zd@%`@wofJuI9JNbxD5~pmhfiDx#`9v@07x&qn9Md_f>|`-vwA!89kOCsXuE3`S$LG zwZ`G9d2w%eaF?XBG^pVRPs~5_z5(w2cSxc&*3xxssWcR5#mZIYb4j_5DPnsTcO28^ zTvu1sj97+%eXjbokRLK9>5R$MaU01r#v9!koJC^{u>G4D>yK0(de*hX@s<yN$3Sv? z%lx9XDTz>5bQ##Em%1c|I{3Xn%7srI(iV)Dbq5d59*@@mj-e?$mG!IkTCYo|N{L4n zoxjR8!}Xwh&WjJiO)$PeRz02e(e@qG?+|_8dlM}=<2jKUa0V|C&r^DIyLhH4Y5b&& zx~L0FWn_#@z4gFUb)zbv9CP<muT?i(6Ein1pOKM(N@veZi<FQSS)y7nt91BvJuS^L zxwE|JDowg4Tk65o+IakP_w832NbM<02DU>vTg+sH_{nPs8<W!FGf1#>%Mj`nI-cnC z{bHfSs(_X_%RYA$K|Je7Jzg8XA+nQw>^=Gm#ls5X4!RZhk!)E{r6}*c%Sbs;*=G8# z3Pd4LlF8~r=kt%;@%3NOV;yex;aba{>M^-95bCDv7@}9JW{JOhjMUw(lh^s?Wr2ra z7nL$R=W-%AKeMK&V%1l_P$D6<9}mN*3-Db(Rgz2Yh*u<$w;7zOl3QQU%oct!ReRRh z`K5Fo$(5fP6_o+-dwuiK#5X#4lzyCZX)foG;b?-}J%$85mcu7v`f@=`cU|vHeI#a( zw<!v6i;FQ&nmkZfMxR-kqsFklb6mxHCTuPtUI+dBF}|j}-^4B)ca_$4QP^zW<NyS~ znC0*Xx{gXHwk%-BF(TZ2+sNqo+8}@O{zgms{O<vL{2%PQSyMs2$z?y_kcnK1?~MyY z+2VFP)sqO>z&iN2ADwPK{IDZFM`P9g1OX%j&_=aYEC{1G6PO|bZ8A6~B54(!?E}xw z!q3Q7`k6E0!A4Gwc4SPRoV`2h?jh2ba&14!G4>tif?T6^@m8PqFK|IO5g|wO_ZjMG zS_kdsy*%`H<ApGxY1W_WdMk6ybzY*J1!_Td2Tkzk^(Nd!)fFS+a=fnC^XCW4ngF5* z{XG0|VcF~~i`LdA1YH+yr%~_o(nPLIoy#_Ic&8M3ztfZ6`m1m6-Z<cPMvXCS(LAGd zo11*gU3!Ln2+~VG(l=Fy>CGZr;w_w3lr$~!dK6O=Y;<_gGIH9p#k9+g`EK{!h(&3{ zXb_6XM<_OD16h5SKt<7?dabd{wZZ;e&bL2p^}#Gkd&S1j?m$wnvyHX<>%^7yR|@mX z9Df9iT(`P<>vc6zI5`$gx!^vA+YdH)c+abIY7>kK3V}Mc&ALvH3bqvYeY87ZM@#y3 z$h9R;P5)%71C(zR$fOwrA4RVMn&rjn{P)*yxLCH`YC&dT3p)lip|zY=__3a7^*8YK zyODJzbBf(}w`2fqC15zMEe89qaJu{W-=t2NDGXRt0kC_`(F?NxX+(fJXS}uJ=QX(E zC!TOZX5V6L2=>9$?ae2Tum3U98bq%=oO0Mk2(15l58{IVJE8h0@1iUEumA8Y`u=C< zdVQz{_MgigEmz-i3L8K8V|@Q?P+!Dj-b?(ipj+V_`=2~a{GT9fWow&@Y07x}uQ!H^ z?gS#zqx>oUbIJC=?T1!m|7BRt2*2Lb`Ojl3Szh|re|h@vH9zRiuU{wxLvNe!-F$wJ Pg(WYoA_bCo7x2FT7;9(H literal 0 HcmV?d00001 diff --git a/deployment/media/get-dscconfigurationstatus2.png b/deployment/media/get-dscconfigurationstatus2.png new file mode 100644 index 0000000000000000000000000000000000000000..be6fee9765dfe024f70a5cb3b0cd46c318c78e75 GIT binary patch literal 7697 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 T`+Snr;RO0R_qDON9sd3=U!Ovb literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicluster.png b/deployment/media/get_akshcicluster.png new file mode 100644 index 0000000000000000000000000000000000000000..db1f8e50ae792e26982f4f863b20d8135c66e368 GIT binary patch literal 8632 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 b^NbQijz(dc3w3<?+X7BrS_KG}GzR?_cGj*u literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicluster_2.png b/deployment/media/get_akshcicluster_2.png new file mode 100644 index 0000000000000000000000000000000000000000..711810778c0e59dcebdba6a507a3c14103635538 GIT binary patch literal 13074 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 literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicluster_3.png b/deployment/media/get_akshcicluster_3.png new file mode 100644 index 0000000000000000000000000000000000000000..ac975447e546a843f9f3b3df47c84d05de49f0ad GIT binary patch literal 12670 zcmbuGWl$Vp*QOyraCdhJ?rsBvyL)g*aCaTt-Q6X)gy0UrA$V{L?(RFu`_)^!RlC3T z$JETz)zjTI-RGS9I_I7UWko4u1OfyI2nb{uX`m_u1SBu`#RT^Oyan^)F*f)O(pgnX z45DU|=n%Yswge~uARy}F5MPX8z-xF1X&q+>2$Y_`FG#C}2zUqxHcS~HK;7f>X%4at z_Hs(Ty^tyYVX**Hy8O6OI~%u0e*>j=^sqov5KZu=Yd3r(2jYxu)ggAoWy6QxQOcT} zS2c`nJj<VP2%4C7;4vh>6o+c8M*bOe3Nx1?&eR#x_OL)FFeUUR>anL;)ATEw{rWtg z>wI4Qu6JAc@}f3%?qgtEdDgDsdb}WXpRMPrXrSP|rGz(&H|tv3Zx|YmtsVJLijXja z%9|b`R2FKPXgx$a@Uwr6)qQs>rvE5&A3ER}X=dtEoE6ckAUufhqT5mV5*Op4Fska$ zV}6G=@S*6MV8`DvgtlLIC>6i1cBRh15^X_Yi{U}4^nrNsx}B-Wl(gQMAw*vx+@H}y zX3KxIcU>AMq{j-Qd-;9)w9eLarw?Ptb^zKj?qVIl-i`G*?5Fd?ZpAI7rxhCs?kH_5 zFLC?pF#4WXG9~046mR<M4Aw(V&;Cz8+8d@a;?Fxekv7kKbAu6j$arDj&&^p<<WV)I zTX%$g4rW7A*epxTswukrpJcSvRZw|RUd)K(rOC*=lrWi-P{wy6T)L01nMyZM=$i&Y zbCmNFv1gSe!^{W(Xl#^_sz*nBaG-F)Toq^l+9ecMr9L$rMNPaUb+{l|!nDi8D?tER zxCekBh3pCfLml)JinH1U_C-zg<(jt0pE5D|=B~{Ct$X82<EE^ac#GwILqBY<QK?q& zwl;5P84i@rqpa*|VAyzt+Y9n~@K=1<IYIPqN;u3|eiyhB@O7g}dW2rMT~=bxz!&03 z${6fs$bCAAd%H$-A_bBCiBK**uNBFBd`68*uc7_6<bGH6aD@|txX(CB`_`O#)ts05 z>~SDe{58yLFO=}%a*#)APZF)jz6&p&<6$ubmbu?8VloP&TY}E`fFB-_XxgmTYJ@+c zJR)Ap*dpux+h>|!uQ)IF-TlElKa|~zU+<3(Jfz3(c2e6R8u^L<S(T{YT9u=DDbGLf ze6MdhQ&YXmoI7E$hu0T3L^R1;Rv+F7-tPA2lnJ`mf8EBCR}`V1)vqk7UTN1g`;L_| z?io6K&m#m#H6=Koq(C8(p-dxp4)_II1~}VzZZ0xm&cK(byt}>dNDStE`0A7XwmaYb zpi%f`&pk`T@a_?Mu~1CbQG$VfU00X!-jO}CZRjqCw>~Zd+1<0@>)4$)>Hu~hwY`vg z>>4TC_oc4gMELTkNYgUiDq*uXyjFigZ%W0%deaz_m~>b%_@me1@wp7s!#E|wytnZ( zj18fS=kDjSuf~^s@z`%Q+K(C4Qw)?lW*pVh{M6W|qPv4Uq(89=roGJDII;OcGo61+ z+slfNU4LsOC4$B<JThr9T&5al8+SfHdtv0EavIB>^~1~9Tq4%W@fv9p>)2%)nb0c< z4Wa39<ruAKMKyFxGt{AtH0hbVyZYHlPFVW8Hm3|0^K^5)-;_j$+(>0rv*HN-x^OiO zzabjv1_*&X8i38j`Z>->_sjlV^7-zqzaq|$&%DKtr`rFHLn$IBJN;;YyrMIVyR#u> zMP}_pH%(gHuG=ZoRs1MUx9#&UlnV{*?$=SmTmi4=lxIV&_utQ<f=xAsHZ~n_e8KbX zDlS(o=eB|U+aF(s0+RxD&PKncphXXQvt&$+|6UUx{8Qc1ib32OmxjcYX1%oT-lp4i zHge9?-JpmySZ8yx?tW(5a*v#qy%?+0(IZ-H-L8CrjvD(|d%APi_(o|FZ8nY&h(NUL zj{L;e{-VP(=a#V^ga)8$_;~v|u~ZuwnTPZ1q1jd`=Y8QQ#*pr9eeXUto6zIQ`B(um z)bJa3h2eO*6Frs2IwMh2jzF&-hOWs&t<iI<op5;2U7wlt_Hn4fSL2iOS8VxdX1O{+ zyf7G1QnGw$p-r+`G!{EXS&jwzd5LomweL>x@-+Y++ul%S*m66;J*|a^2E5Q1<ie)& z<b&5}E0i`jJH{^rqos77b3vwlo@nJ9MUpnR@KT<JKRZ5syCbyHFWn{sqAhbBZ7BLc z2ThelanQb>WZ3)PW^`vgEO))Tyw0%XzM*dT)IWZ+&UE*Me6!QPR#&+!YZ2}iJKKTq zdRQ5<4Wx0((wWl3L0Z>sTZZH{jsFVsG2Q2Z&B?A^ehhnk)SGk_bAr^n^!d}bvP_m@ zTTo%L&46=s`kL`{^H`Y7TU#oogF~^zk#)~GEB0{Plr3t<6gi66(og2{dm0tJv*o+F z?$wvMc~a!p=l44;5hb6?xbIyT_T5*W<R!3fwJR?n{`7A*&hI{*tAmgSIE|iUWEd|f zg$ZBiwCV;t)*oSX8MDVLta8#(Me@nlab&pjgDuKH5;u6Y-_f&ScnCgwg{(yUfbXBv z`kVkYXG3=kG(cjOhgA%s)7X6KbYI{6&OHTV*6jwE3%Y*k8nQai8e-8dpr-_3`k;wP zd=QHKfd4LqHAjm2YW42#+0u9)l=AH@fbDcNE|2K#T!imtjg<7M_WUhNP2|PU|MtuE z_0%WWa=Nnb9|s5n<L8E=e6SFRjGk>u&wa>{b(<~~3zlIt(@xP7WOgE)qmQ4U?ptJI ztfrPd60#g#L|ID_malhUen$g1ALNhO2}k)=aG^pDzmp4-$s6cbLEJaPVqR_vc9(Mu z802N0XQd_?>wkk2gewp;o$`l&gTIhJdWfR!ek5L?O|y~?;OYW>O%;1PA{D;hV;OY? z=jOCJ=3r<5BRRZK(iW=UCz2GhZNwIXnW_nPRcbgB_>s4{G_r8&Fhu%{E@*UnjE7z- zU+!=I7yvXmIPjJP*!=u$fnPRusDF>4sw^W9Pca#PD2L`5P+Gl#g3xTX$5O_51wj>_ zo=Dc1Mz)Qb(FGJPuqXCpbz-_jZq?zXV)vQJC~a(Od2ScxOl?VG5Bt3AGAu8mMyuxg zMYxC;gqTz9f9f@Co#LdHPm8*OiZXn;A|#b;iEAV9>(aRUsqE2YhItk>=k@5MeUY8g zq}9{yoBVxYW5wLh9Q(0q#+OTXyWep`Qy4A|m{=X|Qg7N-*9{W@xNhH>4vN(^w;1EG zbBbThEGWz|{BxR%4Q(~%8qW5f0^B<B>(*M8&zWrKX*;j%MF?NqESIS>8f*5lK4qMV znZ_x8R^&O+49#HS^|OS9wELZ4cdXq2+WRo~l0&&1h0OG@+TJ-l)SbN46vra4ayF9Z z1c}mq&M-ytG}$<^TWj_URIs+v<T=~5i@Hk#q3V^8p%pCh^(5o_+H;eFp{}B1jd1Dt zh3JNvj0B8niuIVeDvszSNj0gJnhg8mh@wIY0nti#nT{Q_@#4OPUK4}A8YNfWp$F4f zv##}~7+QLFt-Q{L@5WAb-Y$`+<tfkn3P|+=N`j1c&9&dAYUs-niC7w+J)|~b@2c)l zo`){jG+(z1xSVDK7|`S>A*Y{i6Y@A4!f+*?20!J_gjFBzKD5=q=9wDGAg+BGuCWQ( zqF21x6woRD{VVC^L{<nMR<PcAhkOd#vz|d_xUEduZ}F^}dUFNWKKC`$5xSpK8_owB zTi5nbnSQWoD|g{r)otWFjZcNP8aJP-p`97P^wnOUi7!(DJ|NZmwW(yP#lV9Kvv#rA zW3;kOuF4=1!IZk1rBO3?oqO4XqGFv`Ik(fz{dQ@>@1#K674uw;Y=tMLaW(zKmdouP z;Ogeex3=q%0g(=0duIDJUE1%93z6)1`zLC`_Y*_8t-$XgSN-!RJMKUDKQIk+g)u!$ zp~A;BUB*wV2PW1DJ<cX{ah-gYiF|d*n_UgT?0iqzH{7ixRJsxI%d|?Yw7<U3O~@EM z>zX2L6aM90C11*SLnYF#t7P{kG5E0m#|DQks<^|=oXJs`cVQIe;zoSOU5ROFlMk|A zji_LBqO!5$Tdt(@eKmvN;be&07fj@Hjr(3Doo5?tveT8L--g7gS)f3~3N~@~N66FK zeW4Q?A~#|;3Q4|a)H4(6l+c<k$JTum!&WCEWc%AQqQzwZeWqL8j7n?N+EdDhMlBLP zh{a{7(L;*iG0s4N=E|TPWFm_=;TOi2*W>fkIc}~lzR4s}(o~t#Uak?AmWMbdWcaYb zIYp!U23XWh`rOvL?u?12*G=syuH;{9S^3rwz>m@{$G<L*a7!S5QUsnoJxy+SUyHd3 zWl(lWTx}c5b>>`s0Q8-5KfV-_6xH1Q#OD5>%y=uaA<4?m^|{R=YV{||!MEfBH2nY@ z_0&<<8HJ_>oTi&`JClYMK&qOGy1>y|r=?T{9iYFU`<uPLOol?JbzGCWeyXpg*@rQ{ zxU^48ZpEf;In9sz9YR+&A*1|U5+N)AD6M!0%9ZaTxH3y16`BH=?)Pd`o8k9Pp6>31 zl-EAyTa$Yz8wd%ZrEH6-b<`p{QXjiH&&YBho$7(EE?i+pE<8!?cHQ@*D%m~yq4Mmr zn)RzR<S2sOjxNbe+t4jr&>GPB+~ZJpT=2!LN}XxTkJpW-E|2)+vs<%xIP{&AWE>Rr z`D*-?Aa>H|X%D`#%NyNTt5MprPw6*%aVu8?qr9si*G_Zyc7xwL>y}cZFE-!FPU#`q z(|o&CI1QWdPEC@2m->bo+z1Lw_^zu9>E2m)qvs4QbU0scMO5jcKzMt<Yz;E9+f%TV z?NO8iVJj*4YK6*EaiFrPWXUkIH;<w1e0%#&jW^Z_PFj+@1^DGqGannfJRp)DI`~Ej z&ME+n6N2d6yw9^(@`52Wq;&nh56Zfwut>Qn?OExT`)>9lOXAkhS#26A$>OU+4PHBu z4-uP-JOlZi-Ny&ObL9Fs1am&zZFb1`UqzV2y;Hl8XaQ;5zF&9sI#>OYpv2^DD%Wp> zjHh*#fMl;X_cM%0%3P~wuSRCTSniMj-?fFzW>PpEY<q>OFgC9#CAD`I-Duf1lo6*) zOWbz7I8P70UN>KJ_nj<rkpw<l+N<3r=KX<wE4JxdhQ#~duU21Yrkh-EFO){qx}|AT zdqU9oL5FE&1Y*$;xS$dt0YI>21WXE9I4cmp2m`tv7@v;;Btf$pas-j3;`}NHm#BYR zL<4vJe*6nW0nq=YAZcZI3RLL>8*UXK=_qZub`U{|4+$K_A87!!40SlKxanV1`g!yB zOPut8T}V5?e3Zo|D*dv&<ka}K;arRUo)vs5orwg)P2qMS(4-{w(=Uw7@2Ytj^CC~p zZzEC+w;R4z=9jZmf-O#aYVZb&Mp8s?1Q$CT!q^OoH$MXv*d!N3o~m<=2M3jU;g@JL zu%AYisy!?uOsGxq1raPjFesmJ>POy3%p3x9;7uMupvVuVu)jrQX>g%Rtxe=?p!6Lq zT)F!re>j+FQ}k+9LF4DnG%HzH2tS@mHF9wH#3I$_LE<v*7=7Ta)yC6Pf%YD^uwd7f zWLdDl<j6A<&YibZhIkANHgYC!aod%`8tgMg8*q}?N{+M5<?&ZndssyKkP(hp-mLQ| zWMm)?V6xDiVKgNx>wbPH%Fsbm$705!?Xn2GV$dvJ9jV4v#)yB<kf-R^{E`7pw7ny5 zG1S$*3guRxwoI3}N)^5r?i4*r4Vem!YpTDCN<@xbI-qM3EU?`*c~Z0H>Gslp-z<YS zHGpcvM6t{tAjp;G2c;u6%m;6hu|-)vec||$(c@T=EGke+H6rmg4l{(sup;~d_lNt0 z96I*hvgi8ePJ|${M>pBxW5osOn}`UD5>5DCgsgJ?a@4|kqG~(dGHzEC7H%&7-Tw2I zA!LnFB2jzfyMheNH!Z3U7r0@)KE&}-J+`@4%nz8kfPfX~dYjAna(!9km{FL(vdpMD z5n>alj8hXz=c~@aHsUVA4VAveO%+?%KLR7fAt<SjK+U2rSEL~A?{qNpD5Iedm>)mM zfAl+6Va*lBPdwoNqmL?w_6QVfx`n2zD#U-oz}}28ln!_RS8>xrPUl5WaT2{Zj`v~O zaF3lb6#zmZ0*JEPdOtfja;1;iiJuIxOBkAeB%ftKj+^|UD}DVVf@rHJuA%-TRutao z=pek(PAgoY=m@_gSi2pP1OEH4W6eP`{NhT~28FXw<-z=wShNE^7r-h}!@_8fN$Ylh ze!chKu5D>@@ZB)PwHl)n5H6bcZtq(btz07EA1{nW7@Y+hz9_!HEohWu#yG2ZBlc9N z(9Z6$@Yp614qO2V&z3b8uO^aL)eGyTzy()F!~HN+KK$bi@nQ{UtZP$MjkV6aPs<j9 zY`fC-(_(E)of>gYl9QnrJgzze-Jacs*$%wr@Pdz|OQ2?687=AtpEF+j(6K`8r6IBq zl0iEqZLh1e+u%X9nZQb{OFI3}(&V-?BAqFJDSEazZ};Om%OfKWQKdE~`ucBn!)-0n zBbf$Co%R=9`EKs6_}^s3D%2x7q`rvoMMnT3&e*J!wCo=hhpXG1h}uQh5${r4#=O-u zrzXYS^?on0&dfM)8FV=cofBBAQdq80TkKNx<yV<ON`KvmZAW%JtwnKub#7~`)v;K2 z+e#Q8sMO^t-aQLdfNpS4HNfE0B0Ueo5)nF_z$Y<Ju;NLr8=-Z7NGQ0-X<;p6Pk@7; z<c+PjbV{n<%DrZMY*T;=c*DxsyGa>h&lp;&?zMZdJm^@~q_-xN{Wcky{R-<|pEzn` zRgAXjMl-6-dL(N>U9DB8z;kjMc!wNNeA_WhHd7<VCvGd&6Pg#DQnTF0^|?WKZ8^o@ zsBd3=TdVjI{^RfG1K{vcr_i5y2FwUny4)wX4f&SubCIq;q85M4@q7Ab_ztiyuaJ3} z>o>G0iftN>98P`{k4DTL$w54guTE*sH+s&h$i8t{(nAw2`(U5&k)(9&j<o7WGy;yg zo%tsVH5v?ZmCjt5*Sf~0Hh`Tr5igY2FVd5-wH-Z*UA*}LgOT&DzZ&Eg=@WpvXOx)5 z;P`%5$@H~CPeW=gQVZ~qP4tz{lQ5`Ax}ukmQHX!kU;6B;xzCqMd8)nwG<8-Bu+~ny zM2Xvw;Oxn76y%>F%vT}b7bY?^R@ASVo!zN})@n$_Xoysbc%UTG>7ND5c14*aZJGN^ zIn(Erz0-KqBnNk4)~z6{9g>i7_&uK;dfnFe3C6Mp=?=D4+fBZ*6&*sJwUmf_-Cn%h zGkbd`^Y*&S=^|t<0=;g7Sxjr;+p$llc_W-4GLz8J8*ppQVzZ3c#V4T>i66Yc`BzqY zo_>-6(CS0{5lMAKb+DN&cGacPoIffUD$HUs&iV{(>4V-%bk@r-5u-d@FO9zoD`rf% zxPk_EhIV_-8728USt4K-@S30hC@;tAUYa1=sm{hG67uXHX#Sy)|M79_gB{>!9fm#k z+0nr7A5lwSQEd8r{{XMoqhl4<)TD@FeknnTgSgUPJhvJ1>xkx1ys@Uxg>Fz{>`ijz z#3gIWr6ZNogeLm_&pI7KV~d;X_+9pP`U_*2A%~bKC`FV6eTXAsKjD_r3h9W-M>~Rk zWoJgFe;LkHv-Ip*oyE^Gkizv$sfCy{d1XMAQr?g#AK^VcbZuy@lglHdg)lEYJ#isT zhe64HC&4j&7E_{kC2&Os@A;X5ofZ{`ZKWRjLm$%GXEY?#8wCP3q?Bf4zUPGqE0J!< zoS0H~lp1cIC-FXe^BwJBJ;5_jIE;yjM60oGH>{hcO#7k;&7UE2&*xeqsYV=vFeRff z*b^AlK6BEl?duj<dU}sGT4*zTG#W2S^_&9=Yj>^2`;QbODYylx61%#D0(kQ|Nratg zU&=8Uvd>jYZuQct(%e`u_-SZljbOKoHpQ%v+JD|E2>jCA-OTPi)420m8y4W#2{wX9 zyDBB7u6oO#;WFhp^_m1S3d5`AeCT_s{*nMbfDjFhwGk{~4neI_<^}_=u02qlQK~Om z1+waK<fzolw!c{A`YoKcZ8><j$#+2`S(hu@)zFwb$}b~MC-nCLzzE5~O5N`Dtdi&C z^Ll{T&;VT#9k5UU&h$rFDJ2t#mDQ3%qJ{$R<LWxE#asugVSjLnM<W2ag}|6u`LU|M zCA2>;L|eCM0P*%>Did48zmO?Tg&e>rz6$R0hT|0;`qM6kFC{+A`Z~qXsY@4uWf2+I z(Y5~*3rQo(6&8i0+1nMt3w4a_f1X}6^&KeGiNHJ?RLO_q$<xO!52c=|tUb89dr=GW z{&Ny>n~*T-K3c?xzTN^AVncbu)x}lWS|k4pCc&-*9{mu?GZGde;g7_J3ph?k6sy{x z(VSo;dp*L{7RkH&&?i-3TR^;CEOH$lbFj{iP2rI(>}t-M1GeTS7g}-%&o5#=wi(UI zR+yXM8+rDMHEnj`OKm%};6U<n0#j`3QNc^)X&-UPHhn%j&+G!HI_Pym%N_Ue1BWur zF{b69sch!6zM#uPWQ;!GEs*6pZdu{x^v6nDJT1jlvJGm|AIe{Y*p@r~;}>|4LUb4Q zFucQ0<A>XyI_RaPp__vvVXtWAZ;<lq-|Qppwy!d~!h4y4<YX||L2Hs_L)SDv#-~>T z*#jyCS|XfN$w+>pcPXJ^WJwNQexBFSa*ifCG=ZslYQUP|XqC@S5+eDTS8l5Q1_*8E zoX6kl!%(lgQ9L_6U>p<$)_3GY;~ajt%i`ma33yW>QA7Hr@5sHSa>iVEHxTiM)iIXO zE_n|r`+ypkh}O$<G}|nJOupDs^>FcRGeOaLY5?U*o&tKAga#cN9qONWCHq_CMG=mW z^vE^A0|4>@&dQ78v600%vTz~?xTEis#H}7%yJFY)Qc?jV5-LPU9uTr9HQ{nG2M7~9 z;?P?Z$&!114v2*E&i)kOqWAR)-0Ts+uH~D`Df~@CD3DfOOSLVJ185GB)pg8$f$0>0 zkf4eb{KN0woDzvr78ZrUNDq=`)G%%AOhM<Pc>!J(yBUHu*G_3Or5Y)sEiq7?lSsy< zjZ<v3hqd7QD5CP8hCM?wX(i=4sXs6Rj1*6lTION+rlCrM7ws6)vxFVF&%%i?<9~G# zyA%FstYN1K#kAVarZyf6^~?gsX)6Y^`)UNo<U;D$rb}N<iNeYp_K4TWByyeL$T{^A zdOy&SO%4$!1m(Ao$yOYKTF@}}fmCKU(GXr4jU}y<XcCNae;CUXq&I$GTfuo5(aI5% znhEUVlqH^Z@DJ#BO1{ZwQ`$m0-B7EK*XGNnn4@Y08e46I_WBM37Mo!^H}P`_EV*R3 zJwk5Fv=uOS$hlN@Y}R4qvU0ej`ViS16@h=_KT(weuO&bAbXbP#u`loAWf+?=NcW_G z!=fBP`p`uHiZUbYPY)g2^!KV-`hC>+Go|FFvtc%?;w558QtY6rtLeN|nn@kb2Z*lV z6z;nbcA&?uBo-XIm&NJg8*8=H+vJD(Y2_Ova_ww3dH@<9IZVpjC%^#yKiH85_<lyb zF9qNJ60&4T>@!yYixwP6TbdCt!R9v@dkFsnjd6^ZaJDSdOI$1hOWj}*YFi73+>1tV zjAb(Pnd(2vj6H-*UmB1zgJtM}m*-(~ccW8e$+`w7x`l#)!GVrb!2F%B=<|ev_oTFN zi(_o#Rz^Q?swuCy3_4ikjIHu(bL2zH#SBMX5%!_Ut~(XM7E9mzx*$61-G$2B1GW}l z3hg%I3NK+{emtlRG*P~z<#P#~TB0yuOx|KSSQyjZ)8*FrK>NEPFeX+q+;F6pH%oek z19~gW_=$j&XN<{@nzO_j_2e^$*CX?aww4b4EX80gmQyyeN`N+j25~nANwiA^WK=>{ z!VsPY{###)L!!cM@kdFXIdCY}DbP0z*V2tu2&zCtVOwHaM9ZS-IL4|7T{8I4;W2wz z{3yG%g5S+Jv#<TZI9wiIj^OVp$gk6E-Jc|IGQ;}q_n?ESrX$6i3WcS^%ji{PBf8Q_ z{<^N*GBaZkpBN1s{DcsuHJw)|nsiL%aho<d97U*fjO^dL6YLB=6_9aeDYQ0VuibBO z3Y>>W|4NFFU+4CsFWiuJ4oHP*>!||rEe0}Q2ca0Zb1#8jdZOdRR$|v6xgwNi$3>#D zcE*HS2iPHHW2G%;3^_5e*;c*8sI9;*nK6U!zu=PVLsEXYvXG6_CVXk@`;F}isjF!$ zm=rvDDM@J_vzDNVS}L7F?L$juP<3I0V*964%GhZX^D$Y?GiqY(v_O3z`x3vXFzHEI z_O4blU;c5dp;e!cdCjEtY>+TIHz>CbLtb5~1dTabwx*r)d-oukjr~b1y>$3}C3_@< z9Z|mwTe7jzsP}HtEDOO1Ay>(d!PqtI0xh7Ks4^x;m9`zc2;eZpQW3i--6B+Jmd1%Y z^%BcfJHlUGHn2xwly!zflDf#h#Qz`;oS5f)`t7Rjey`1+bV7>M4#5?Obj?WT4&`?Y zjw;hrz|NV@ZC;?Cu&l`O3%!=`S5djBBN(Hx5rOLeHqPekkF(s0r(i>WGD{zzu5E|V z7Favk+AWo3p!4?07D|;cay%$AjheRZ<}Rp8@g_j!k&(yTmeG96N^C|>3hKqwLl6t0 z3yGFgT{l@>!<3cS4Vc2?LbJhXVZ9^pGPlmeU%`aosG{;wm+dvxjyq*E!qKS{dj$oz z*_Z0A5DrJTY7Cw_ga~~)Phhv~iO{FBXFEAVE}?LO6iVV$(9^m>-OXrH-&8K_rb)3) zwJeO!i24g{3FI-dXr2&X|Mnd)bX5{kA#yTT`VB#3I2ixJ`%BffA$I-vxizW$q5svB z>q{37?Hc~}vytDl>A3X4NdN4qh7;6C#Z`nkyl$rxb|4MtjT%`?=lHAFeyjACikAFI z@F?s8iSiTmYPrHjp!<1jmR)D%QuyWpK8F#gOj^ok4eo@Fj>4N}`9gB)!rOSE%zDjN zAbc-aR~f9V($>T*IlC`#HEyEmjXppLR1OSa9&`$MMo^FxZ3;NX5_fw88EG*lQA1>h zd%BP-<|(B6XkP{ig^G~Ur<aP7(!$&>BWO{Y)bCwoU|aeCW434b^8<V&2*SV$G>5P1 zL`8+|Zm$3aj8RO&z)>}9p&}YC52)A1<HQno?=J_<qRKC$PPDx)wwmtpv7<tjv*v<~ zyw(p<*g`v)ti3`H-x4jY(hG<XBK3#Lg{4Ej&inL+(P4iOMonTaw!84Ijg3*3n1Y6u zcX7W>UF6vDMju!W%=F)(m-G{`$`wmSfH)Si(&Z6mVBG+Z7iLD<zDyc|(m4>1GY0n8 zho#i0N}v-EGc~*POrP2YM5b-*pwad8Yc0Wrml7U%xB`n`9If8Mc(@!IFpdb%>ci2N z?H3B3yMqW)<PAaLeDFiv=VUG5y{YNS8+9*{oITJnpwSsbm7^}AWQx_{DTb)DO(axQ z5>_eTC{n4Kum>{=Q;Jo<GZiWbc3*gkKU5Z$A|qz(yVBBVjx@cZk{r7iqG<Iry%v^{ zH-Ga#x}|c_s0N5^TlRy2Fa8KUV1VG}mbyKS%tTQP%5`*4-Dm%^k7Xxow-qVF0Mq6M zL)H##^J(5MTAZYia?h8(ppt)7Kg)As5;#QC*~T+qnH13np|G(%aDu?y&vSm~S*m!U z$WinkMBfLtuHO*6&rkPrLPcg>Y}_^<Jt8SG<`1lE2rRU6QMut7DuxwZ*8Uk|ImjAT zU#C2$;t6<7ufq$QNSs~3Slz>7sJ%R2%YaqiUhKhAnAuP7b*7AvFuT)~e)v-@*lswn zAO4JpDrC^P=kpN(^PH1IR7XevHOKd>X+Kb^f8OPB=#~>ombqt5XpDJ8X)S65C>F%! zuRHk!74@)5xyn@&GkD{0mHu}BQ)mR46JSkK5KHcMoOnq*(v!U;2J$YcTtNQhcvt_* z1j*NljD(S*FvD-*%z|kcGsVx7=qTZbjZxy+K2=loxGM9d23DqDXkX{bRS%iIGy~EO z*=<Kee1GCR;1?1dec!kclr5c3-dXnXfS?i8eMgw#9?G-|#=AF`RU%=mK$-0%`H!W) zxB}`z6`G?VJOkrZhMJFBDvQOj78h%G=@$}AOC;7(GWGqNO)YZt%$DsF#6X{;=LkEP zX_x;2_LHzaB@S_p{PCO{2b6i&eKCPKPX_DW1$-OpkanrN5wy~k403~OIWHHicl3~b zx#{u6t*k=!vUBVZ`zE>H9hhy4gd(^7lfRBWwi+8NxD^Ilh^nAlM31g0&(BmnDQ{<Z z4?*Y(;u-CfSlh-y<+v#vctZ~g>soyu>&e)0oGd8*A-ekQbEKgtUjjIB{%XBf(8(-B z<|uoL?Bn_Ub7Dp3ns0}s=z~wqfQwFrww63c5%>%vA!j?R7S?GR!x|LjAuS~-gG|h( z3#8|(928|s?gXL6WyN2urWj-K-$)A31(ugAiSESTyFNNCxD=O^_5sK$3C#KULT};t znY7=8df57TB=%ON*BK&}$yG92Ua$6#jWH&L`n6{WY^}Eb<dR>Z;O!`M3(nVRjrv^U zf4L;)o0J3LeDznLFZ7wjMRb&i0(YH+>S+>a0Mzn7l$XcH^wOOCy;=uAZ4g>b>5N0* zum<eH`7$Jf%`$`iRN!zLGJ&gfSYsDz1;=hA*Qv=hewa1lQ`GoulDUc9fh2^&0+{A! zZzcn&m%fgi10~xgjKj4l7-N3>I+u?-qy!7hH5Kg+O+0!s4y_$D@Rp)8Z{l?Lb%x{| z9b_ke@}qO!7FYDqia5X5Dlk1I5iv&ORXI&aT^K0{;7J`QH1<wUCg@PnU8CBtuKh+w zEbBM}(i0BzK&0dZ5UYQk`V>1dg+bp$(Y>jaIrv|Q4-RW>&O_R2-$}Z@JSg5eO|Dwz z;&aU_^STs3Pp)+KZ##X+U!_UKk}E>+j|GE#^*@l$n!dz|#6ww!Tg}Z_TK=}fgk_8d z(+eI$7H>If>a6s5ZTwt*LgVuHgYptkI49D#?KnV%@6L)bCAN3ma4|V_^zmJ3@<TnT zN_4Y7@Id^6Z*0ozv%`e*3C);o%fcTA)=tG0Y{*(Om{=zar&5;<w!kTHwmmVb8_UAA zyZKx=BkNN~LPP%RsakG9t{oSim=ldWG{}M7ft)MUVE3t%_^Y?k;%YC6rkl?{N{0?} z`Y)vmm@56FbaoT~_JX}cRFikY0UKK-9tv&OCC*qptEoDKwO>QqC!H16uX7zD+m3c{ zBWx3SuGl4-)Rt=o=@W(4fBJEv18Gj%ntli+^*pU<*e`W<K!zX@)QLE=oAQF`92$si z4=}=W@ZL#Rx$bkz`JZOdo9{*fowFEq3jrjN@;eyL6Z`YRwZ%AX)lAXHd~#o-eZcAa zdpsgJc!)stcPPP|_XJM;au@`1;|(T@l+<7u2=i~CE)8fNo(|VytONQEGrhR(-#Hj| zP;Kr{I6*&qlQqU~xyR93JdV@`D1$&&X{yKGr%}(bdWYC2aW6=%hx9~__a2a{1nkP8 zblQxwX#(&Wr0gx5U0lq!CE+fR<Sj&mMr`_U;**-}Qa=Q|d&-tOKY|)AB-<!yX?~CL zwFKm{=E`)W!DG{jV=;bbvl`4~S7OED+=x$Lep9pC<<*lRTP>P*lDmT_>FfK6nW0(V zexYC18WhYrgNX`6ll$<l>eqw0@fhwhV*4F~T2d4h!Do7(cA}QZETbBTO+^LL6&r+l z#H8^GC2Q#8s>CabRgBqJaL6cVfij2CaJR$UR~AG=#{{dz%prqo#||ymg?S=MskY#B zC(}=bmQESGwBCa8BF01D-w@k68X<Lkq?0(O1TTaR>>Ze)Fc4F0Ef6gANZpBSgpYG_ zM{lN8<P3{&9$=G*#7AvH3wP(h>K22}ub(iSP45a-P%s}g|7)P@zx!)*_yGdR#)54Q z&Z~wVWMJL?&&VK32f)sC;d^{ShfaV(0j#+dQ{u8@>wgj6Ie?okqKgcI^zTm?u4RzW z`e_I=Bc~+>po<xO-NfNe|MLcH^V#`zgD!{S?q^4Iyh)-y;Z9gH?XBLYfCIoj-}Y3p zZzef|-$W5bkD!Qaoiwm5iR?MtD(n~~&GSI=x2+sfZ5;*Eupfn|YWu9%#n~O^M3D~q zC<pw0Xu_=a+*u8?sfG-JIhtYvT%~`uWx1zG)12Nn{$JHhu4JsVcV#O_Aff|EwLWW} z)NqA7UP5<ZEc}1E*sD5P_?Z3hT#l24fw%&XyC^O1e>>D>{DAcTgRt%Y5q7`Ja;R&* z-Vzhd&B#)}6y!fhhwg+?k)41~z%kj*4iApb#m_S`Y9-1!(C%!Z)%#qCmeH6mN#VPr zSx$Zsn8WDm6Mvemmo3|NeT3$GOYq3*h~lRDjH;<Gsesbf*`QvE89efWP^qqSr;LqP zdS{Eb>Q3Zh;606)J5%APnPe8ErR^U%&&fujipe$k$DpohS;v{G;~(D7;c;<!i0iY& zug>z5&N5?+A^n4I{Qocb_TW3`4j&6XisViEqyqQFW>)UPy*jn@03Q_26a}UfI11W- z{g-%<EXOn&F#Dfw|NE@`zlb}l%<*JYasX0J`F{uQc22b$By=F?(Ld7MXWQ}N0AHSG z?t^=L{E|z^TyRafmh)^bN8*%i_KuCm9~;@kLd$R)s$I(~WchCz1GT|%xm#Af;Vx`f z0vItDxLf}Axo~*i;lecu+gkd2>bc=bu#VhVLgHqF?7s7t3|$_DmNp5@IHMQ1F309o zPE1*hfta?-J(5!OQgHa)iH84n9!ESY>uMdW4K8&#4P3L9WZ5t$JRUbnkiKLX`!pE} zzJjWyq4H5M;TsjpA!|pkMstFf7q~USNj8<VT&!&crJ#~9Th#<1KM5Vhy@(ImRlHfs zrs|Qo<PBSM<+%^o!dOVSLL95JUd_-~^7k!T`l+Vs(&{1If+RUrzndW?&ErCK=9xp2 z8X_?ZVlnuFcC=EpvXLdG&~#>&EPTWoLKRAGe>NtAr@g#C{-sgz2fP$BuyZNqxq<~8 z&B0k+oJv@L0m2HEuZk_^5f^Sv!>kYJf7x35T;-I7#0dR9nl|&z1sWY6jMg8l)U)`B zt#)eo6y0?w47X6C3;J^V_Nh{#^CF_dV4rB1+?Qo3m4|RNw--7CSo45|hX~eMb1+|Y zLN4Vo_=gE&lDXWZbcNC>G*Tyva{k|F?f6w4%0-n_cI0gyA^DTP4tE;EaETt{Vy8#Y zjPo?6X5Sioipr;8#G=Gw=9p7^Hs}??_96s~?as<*iU7i4A+(hLJ6mJ4*`=vcf}pLJ zv*{(-CXn(<6?SbHcRn4}VZ4_oe+bM<UVg=|mX&;$eV-=Ph>tIS3|-ScZEpXz><#5d z5{@qB?^Bc@7z6N(N-0nWqU1|9`+}5XRf77Z>bh-M4sUMKj_MMp!B++taDW^7$Xq<6 z++A(|J3*Kfk3!(QKm_hDULPQ$8rLatP&x#s0OMqJEG`OklZTx~gsMwo9VlRh0b&Hl zN(!1h)YgPFutBunv4Rm)5b$G)I|hHW(<Vp$3~cqFF>d@3QolIOpf@|dluMUxOubd4 zia^ruWn&51_!ESEgiAH&%dz%*o!3omY3j=DM_+F8y>tf0CXhL~1<&n1R2987zkXB* zzBKJX>C0J0$%inESFQ@1MnTMwaeeUo9xV##A6WnEg+qWcr$uYQHP}?S$cm_50S$;G z6CjpjEKyggC!ANeyPGhT_mI?Lq%F@=>sjGrqO(m<R2tH)(yy`LmAUT8jG=qPRPKDX zLoL|<vo*}2$S<Aq;%v=vwtDd{bu~H$E;g49ipC>Sy;{sPD+4k3XRZu)#|(#?+F;{Z z7x91-s2$DgV>z$J43mqb+K?nf<pI7%5A;VjJT(%H1#bDzh2g_=4~p5Q!{;REWAJH` zDY1dRgsR^p;)9hQqIkR{@mUM%rD$1DPq#6Zh`v;u9VepLg#_Vndr8JvZ4;rwkQS=L z(G8U!)EM|rM+RRFNakOuOH7r^Ag_zQpR}1B8f3nIDae0F*^AvqL|rZ7HyG*%HHLO; z&u|DsVy*^t(|eYN;*S>O|1^(23Q|wkoWS)7S0#_HgDKKQ(wAP_y#Gv0SP+>D50`#$ zcEnU`Ido4E-U`L_KBN)-;x;E3LWd1OuyTc5YJJS^|8C}1B%fvfo%ry;%;1`Rp9O$L zbF|2D4U^|hN~(~Mi~(e34E>u@rEoOC9u78^e~yh!KcW7$WQT+mXutr(?J<79-v|#H zzJa;i#gKI-#02_W;1?xwgKZjH&#WUmI?`wZiCYZiW=|MEpZrA*u*O<~PKh=Eg)^YU z$o^pl3}B+Er%gdsC0S8}o$&vh9Zor<;8BT0k5W<M4F)j!g2(r81OqVeQ3NnAQ-%T5 dH#&KT^7zEj$9fkA1pj9OLPkOnSR-Zx`d>bYF=GG# literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicluster_new.png b/deployment/media/get_akshcicluster_new.png new file mode 100644 index 0000000000000000000000000000000000000000..24b30921c2d924ffa0315f026dcca71bab1c88d7 GIT binary patch literal 6398 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 literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicluster_wac.png b/deployment/media/get_akshcicluster_wac.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9300e4b759e4ac294a85e57a8874cfb6bdff36 GIT binary patch literal 7694 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 literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicluster_wac1.png b/deployment/media/get_akshcicluster_wac1.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8b64eb73b843ee9cdda5f2582ec1f6994306b7 GIT binary patch literal 9504 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 literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicluster_wac2.png b/deployment/media/get_akshcicluster_wac2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e17f1a1016a872a0ea61fa7f695bc10a220a27b GIT binary patch literal 8061 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 M#N<UQL0<y?4^rA!<^TWy literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicluster_wac3.png b/deployment/media/get_akshcicluster_wac3.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea0f9851f8ee931e02fe7f35aa4c09463262529 GIT binary patch literal 8858 zcmZ{qbyO5z|HlVGX%Qrp6a;CI?vj#RK$Z^a1_@b~Mx|5f*rlYKrE5h=i3RDFF6r*y z`aS14=lMOq=l93X-aF^cXJ*dq-q-v6z7wvYu1JVSi3b1xq0(zPEdapSN4L9i?xDAK zT}hA7Ul{IMim!n3LF!F(2g^oAO$Gp}V)3ud?xXv-?_TS>1Hi*?e?J)Z<Kegfz`(5} zC!_6UvNK2MNV=Yiy$>0W<F^}8_}V(1ApFF!)NR9(F29XL+FrRTqcw7Ac5#EzUO10O zQr(y4l?YQ0#6YH8BxYHK;%WWsx7o@;Z)m{Ndg>zOIiKM7amwY#iK+G*A2qjr%2%5) z!uQ&RN?Ch)uED1C_sUzvZtqs&<|g)hcX#<vEn-KLEa}KExcPQJvD*oLXvCH(WpJwd z^Yzyu2L#M|$WDK{O7c9<rw!&aQ!iB9ygtQzT;iTN0JoZLR=lfjE)TGY^o&n^FoKd9 z6d`}Stpw{BX||qnT$YsBpD~%*HD-5bC_~PfnZH6B3r>8n4Iaz&Kuk$oe4AQm{^A+g zdhaZH>M%&#dOi`E6L4|+`DSw=#V3*!#qgEaQ&)ndrSE-Ct4g01=$GBq<Gp+(&j1j% zUw{;%^ycX=zh#WeiQ3fTia7?lbEg=(ZXL_|TZN>|icJPc*iq+U-MQ<oD)KgD?@H$; zbIA9Peo=DxJ#Xj~_r|bX_@8cu--uj4EB~MojjXy&a(Nj>zZkfBj!cNpdOvTa%~o26 zjhR1&s9K6p{Uy>T#HtCCUMlKBo;=OqTEVFyBYo_NNea=|0f?2d;`A;FXjOgCUaDXE zFb}fJ<Pu4@KGRi!+%r`1q(HVPhPuE>4&-*Y@)$-rFfYp%GxrxT0qNdXIuC(I#5fxO zKpYhKA59*k3@qRgVb2f-!0<gxqAJIHJhXix`;0Iu^P=}IJoLeGax>L+4&)&7CdFU! zWFNEnc1d%X5CHNG3Ip3VO%?t9@4~q`->!As+)-b)Lht4~I*h#?=aFJOuBeO#A=k`1 zvF&zH>&Y3Y&<+6J+FQ}OU7U2E-L8M+wN5(_J^jUpXse!lBy%kpyL`Pciu&G2RAeW9 zDM;DXC3(^j?SHY-Zg#@hv)|5)>HXlYZr_%VIz6RL^AMt6YPR7=LOw90Q`wqe5H|am zzW)1e(plMq6n$Ro<33rsLH`ZShzZ5JWeD;DcA;Bh4(iW7&d3o#{e%&1k^38{E%W-m zI~zMaEopYYDb;cD>-M#AsP$f3yPDZIV<-sxb?xYLmaZd5=YPf~7QkDyCXY(uF7K_p zy<dO*Elw%qVWrbH{v*N7cPIQlk=#K^Rp-XYA3^}B>RRCKaypVV{RTH;TBvKU?GP4g zZbjsa*l`DEMuwLfDY)N$V@YrQs%7fwEDZfpyE{Ae^AA9wCJ>oy>Zj{W?{xSD6MOP^ z+(}ezR{>{Sv$o6J7+iFG1vT^=>OV?ST<`3Z6broFvV6Glu|5^{(Uk6PZubpD@*;dv zXyUGYFTh7JrY6M~xVbIGmTX*cHQDWx4MuEvdCRRY6V1kBFMv6DWp>}}*oVEU{Iz!M ze)Mq*YvIVyM>GvrKyq$i(52+_51<9r6@Bb*BBzPUkbogH3GL#KLN}q#_V^bsxMR2t za(F%Q-m8!wcsYZf(>6?)HiP&}WFCu6D5|N=d6l@&$oo|OvEGGA?B#mmz_K$Y@@{2M z6&i*3Rz&YfzkYh}vO=m&=&&vO-dTsAa=)q3k8bb-mngsM5}x%!m4Oyez@dzYrl^>N zTI7Zwl|vmT@%noARIl??7i^&}ou**Ce!4kRa6B^f`24!A6%M++aQcYa3Ye+a9hl~i z<rkvMrgf`X3{#~<nHsAiRzVw(dz_AE?Pj{DQOYz~>~cw`(A?1#+Of!_3<{--p=S%0 z5$_l*_Iwb{H~OG}y-SC)aBBfA3o$<z6XRX+kkPL$VtY#hzV9GsZqV;>tNqZs_%id^ zF5gJ~=eDO0vuT7!y}!hS4hqA(WoXhjVYtAGOi19Z>4X$p`b}ljbinxj?`#+Gy5C0# zQ!!7^qab{u0BbnS#%BF{flGYy9WSouO_v%+GOL(k@*RuMf$O_phnU@+&-gmY@^fOm z9HXti>W%mW7$Ur&5H`R^55bgR>Xwk=voG_Gogh*MPr&z!LCN#^gLh<vtREtyTC919 z!t8;$0mSXJUyd=MgJb9`=WQ-%LXD^UP+ep^(U0FeM&-~tzV(|iRohH`pN=XiJFdMR zi;pxTFz&+I)U;GUn${9$LyGodGAm5dXK7U`V5PG{;&9>l-OMGV!1?BI5edERt*Zdn zl--KoG-oZfS5FafLNk&L&a$EoT22n~G~D2MZ9*JRh`}+4lbVjKH{PNLx~5BnG<xOJ zZcI653(dM#DJzPV?Uq|%N!(jTp`o*0e5PG-ev<^#o+o*Q0lQpS{TU9r7g7i5YA55% z*h$!JgY?$-fT_MmLlrTHf38wPu<tB~KQhlZ9ZuXGe<ZRnz5exux$Slg)oa`4KR`k5 zcUzC3^FAh8FH-uYQEnef9P_H+{OeIWF1x-|gJJx$^(Y1^P7aCpAe(@2MU3qhN4G42 z8X`$wGKr5bVu;sBT}cj)1$iXfGr0_YwK}C!N~7eOLB}QZA9gS2NZm><mP=fA$t=Wk zD0*9VwCeaMZv3#7E*}~o7sa$8S`1hyEWj;}K5OAxglJ;{c{tn@;MH8RcZ0olO>Cin zI$M}IMoG<{5A3;Ich}#!O`P5CVAqpN+!lHQux@w7EaLW83dd{D%@Z<8ZOUTklYKQX zS$!SND5T~J5Psddu(~xEc8V}WPpU!AYGV*Spx7}Klrr2qo*kFUxFFsA42#aTQc-|+ zc=z#*{eG6uJRXA7qgno(Y1fG;X|-QIpb;f}c5B3Mn;EYEQB*XD4<nG;vf&N?0qo5G z$mh0kIXm-?Ow5~+cE4`4{kKEF^@eU+AuT5Gtp?})wiE!6A_-)<06>Gy+*}wfJ(OvA zJ%GTlZ>AjgfG`}(|71;x5n71cdnyV@%RR9Im6oQQEIMIAb}@kj!GDcq`eDR-ygSsp z;=aWSG!zCpS9b|LXp*Y*pAYM^wjQrDs+l<xDAu8Ky5e_#$1~L;Q9$BjKlY|K%EfIk zV{KUo8dIZ^Oex4L`DEyh%{1SU&)ufFYGtUCVhr&o<xlR7OXd_(PJ%G5PwP4?FEisw zPNq^t!0iOyTYF)?WA+)U89E2Y%#rc>%J@*hh(l(dt*aTY=XX;)S)yASUel<UVtDip ziW%G-+3wux>)2u!eTp(8%~<%wI#gduxd2b8BkQ}ra}k-Y;!?}p-e7<z%on&dKGE)b z8|!E~Vn13c2Ya6q<RQy7!F3#)q^rxPBL>N~{~1Vf!O33kI3e%*dAY!*tyg7YLSiHz zj^zrco8;+(@|xK+I9-wWEa|Mj;Uvt_6l?U~tnEuv;HIIYwJ1p{vKs;EudL*_#%GLQ z=pjAkyzN&TQoA9Hm%8t*#RC}JdR|#pT(8e1OD;u=(}OwP_?J7MGY@3b2_mQzEw4WF z%x`@Z?X%nIg|%J(N)4w^EE7xSqTu9Q^P7z?ux3x9je|6M+l$2S)^x+chcljgCJfxP zB8WQ?hlegie)<BKs#M0(1sgh0rc}$W+WDBrrMb*xV!mKq?dTZ7V&<n$9N+GRA9ALC zQT~}`ItLS#vK97K5r7+{k#f3I##XD7X+34%oBSp!cXc|v26Mexk!wD-a@eZKeEM6F zS7(7CMq+da>cCo{cqLle>$j0qZVIZW7K$IT>t=VDNmp2+)5CtkiKpapa?3yUi?YN{ zz{KF&V5!mZ^m9@cq87ia0m@-L#Fy5t=X3RfKM5f13d6KBdfC?5vM?xJT1#G=f~s?_ z?d_m0T|o6((T=X&CLPT=MXkqWwtR{DpRV!yrrPn4!j#vVCpd<zK0ouWR_Es7i*~w7 z%{$Yrj4jC8k7X1)R4yj-!R>x2&Vzv_^`>9_A?Gjqwk2{lmlo9{Xw+=BuQqk*-K4oi z+4%WA+uYP761k|=P3qmuq(}?AQHMX2roHY-P3mon?0>h{F>zSEEr>laAtmzm+{d81 zS^40wNh)EeQ?+O&5bi!Ie}BBzeh|Y*g-8#SOf58`P%)Z;HIunB0jP8>gW0IaQa3Be zuVVcoJq)djioQ8XLNo=_T9au4Ja%u&TA88zrf-g(A7n5b_6FFDZuAcX->0&A)^=Hx zU2OX6`{uW!KW{Q6yoB979xlA;3rG~dKGQNyo|YCR!HT_)p^D*JP}qciu-Q^;;Ye{k zjhrTiT`G={Zf6}G4jmA0?zNB|QwkTUtONU)1yp$R?T+uKcFByWQ-PwB(bD30f499~ z&|{8uW(Lf;o9&+^)K&gdYo}WlTa!t(-%k3Mt(6JWA45c^Jn!HSO1zE;ViDqOtzFtr zn1r@76Q)@17N=@5=~_<{#>y5AbAoMdDsHy2`Y%U*t)pnKPw&0BSEHuh1~>kV9r(?R zx=T`G14+60{cN<yJn_{YQ=r{fDz{-gTG0BB-S=1TSzD|LjD_dt>fe17_#)f=kxXUm zU68<Ui{;Sxy0-L0cj&sqo^iz}9q#p4HD^~Yzo|5DPX>BfW+`WV#TN!g<rhk*`ertL z6J#ujO~CXC$E0=L&h~C*rf(_F#-s(;(`kJxMJBS(@+N<TbRH#?`P9;7kB-q#y>01; z@d{~S4WZ;b`2j|rQn`|2!>PphtOur!Nk`WjCf*>GH)m*Tl7WcV8q({@Q{f2zOXB61 z7*h*n$rCS{*i0+0Y+9b78peHkXz#a;HzyELOyVyE^<I=cbD8Z7rDSPzUZq$pJPmC3 z+gTCx*)(s-yS|Jb#ql{bGBzS?7t$@Otb5H7=HIOAU-WXQ)#~eBO@@MEGdy@w_0_O% z-)n|*N=9>|vMHaVLoxGN>FfPHHr5xC1Kn+93ft)t_6s*olGMZ*O`?cfn9!Cn=4=<l zN_BmKK@_RY?-P)AZ786XJ=W^FIwW*yY18N-0^QnHc94)g^>B`9h5MJR%y}YPu{0c` z^pA8CQJ0-gf`s+ABN)qrAyxU0o{t8<Y*oqhUUR1yh(S$$oaUy@9vc61?nVMA&wD)Z zNKy7}NnbBZ;$ug&a$o@w)c5|P<kPJdDF8%J{nP2#<@@MA$_D@}`v15Y2J5tZZyW%~ zBlrh9&$2K9Ijnz1hS^7=!F3szjou^IpOHmCqlB*3D;x6H8$FT5{%-&?K(mgRp4a0O znsUFoE8N<H|LzFn`3pU1>A#0y{r}Cd)CarlXfEFS7wi6I$29i?ozY~Y-td234u62N z@P@s+mmZn_=RG!%j<@l`!Pg?|3Uk{g->=D1RWlt~p($|aS6!qgiA&nXtjg5F^>XBi z<E<{6^^JLy-_6RmUzW?;5)4hoTSa>=+rF!5Tcl3MRZ=34=uRCgY;~^~_0Hih6Zf0G zspe9-HF{<T)U-6ENjc6WPd=`%o<Q?u>1@zfXYDXYKJV3w^!jyDmt-Qj`WlX2k&DiO zBQKROxV;R+`ZPl1v#XmEXnt3<%gSeGHuw<o(CMmakD#S8ZEPo5qO1lsy<@k^c5y<= z9yjhD5zeXhrw9zHy*|}aYT4ECF#yfms&Sc61U{9c7;;D!0GlYiSdBl7AuP?Ux~b|q z-N_vgyXdYxU_>oI`!ed<f?*7nVHVP5Q8fG_+cW83SMJ8qlm9wDtpsNp(<K42$xuyQ ziZIkgGZzG!`_Rx7bD=cVqr;i2mkTp`ccz+dvxFxGNznP$Fh1k@;r;Pf28zuodK)jR zW<6B5C&A>-b&&xRZAgv8g*7~9R^!-F{HGks+-fJUD|cd|)=;bw%LKBcuAXjmlmvwF z+DPk)tkK*;U&Hd?lH)#_;#oZ>;_?^gzsA<TxOsedwV3TLo?HO3-qRni30YU`8y`g= zC{`Fvs+r|MV!elXhH>w#nh7c<=9^9QtMvFUaAuCsoVdIef|czRNW9IPG_dxK@5kOd z=GQF}r196NIb}vYE-MrYwk;6g4|yttI3;P8aD=6PCh?l96`SG_`KG!|u%Q$4lnt-J zSU96)@F*Y3S<*!me%%)v1*a*6DRzC^NQFG0dJSh^?-dRXRJXp*8>|zx?!msKqrB0D zKn@<3$4xERn#NCO#?R)BnE86?N#NO~nVx-_?FE8!sN8S`#XU#xpw>=(Nn~tT`+6b< z3nZrF{NAkn5Djtfx|6xm42M{^h6@fB3SY@YPn;n?-8EX!*+A*Uo_jPZ|7=B{k*+93 z!JI|p#}n_gb3U5H<%w%^bK<t$X;?qADO;DxTB|pn#l}m7CC$(#hnJnX5mTe@yBCS% zG*W!?!&AODQOZ87nSQb`{KzA7o>!by(3ls@3!SL#S_w?@l^mE+Wajr+!6R3)lOM}4 ziHIeGN5RFdZjLa2CSGNm4@j%8sKKFH3B!x?iZrKhY-AV?qaW1uueotpzfTx9$J-so zJYMCm7sG^&b-xUG$QRk<=$gT)Mfh2v>gw;*RBP|i;6&HC`sw<Evvp2f1pXDk@cfEC z`AbrZM-y*i_MXi(8^sAb5J)0~_$z^N;-8AL<)DRa%TvLXd%z=OoDKcQ$(ZV>xodQI zr!7rE5mz)bLM6z2j|<^`%28vKG*-vGlP}k%`Nrq*8zsInHuk5nhKKvsrUEQhJkSj| z5cgS3wg6=_QQUVL?3cHFp2`l+S;EdP9Ih_Du6dvB5kugw(%L{JnbW~3vg4?m<Dgx8 zz9<3Fr6v)wccOFJtyXqM7ixe5k3!h9BJq@$@`;vI<BWUVoEn-S^ErNQl4d{GtiYWw z6Pc%vR&-g$>kF?Kks3~kRQQeX4lxj(w1^INhO&7X?<_0Z<s>)Hf~Y}&CSS>sRptyd zLk{$w@alJu*Vr|;Ui2a}(b!|)`)mA-+Vq+9LC>qXl=a``C}u5ACs!HBuq3_qRLee? z0GgZsg$`NrW;~kYe)@Uz=HkSN4O|3_&7sib79NlA@}D0J0^Yi1V6>K77&m&S1QkeT z2K-Zi%V<iR(-;(im{#^bE$q82*wQY=MbqVIv_}@)^Wl-KY}?s@iW}dL1QmkuN|7q0 z+aWe4&=dKD@8|h?TCUNgKCu{MiKkY~`@Qd=^6jFEl>!B0%4POHhr9Y5h0n$?B0=YF z;r=XXXNpTc6oFdnl(KZTPR+BU7DRH75`TC{;NyAvwNXdnKTw0i%dok6z`dZDChhu? z19GmblZ>R|I4H3-0c^jOw8<!k!_qq7Ou9N^ZN3-dS?sKCqh9Bhmuf+5ld;^8zR{3j zCdlxNOB~q?V}GR4IdmaWVB8B5^<VqBMK<oGBDh@yD{xfx1GB#<kRY!XeLH-Zpt7<M zGyinsPoZVWMVlM#?~$R0Q;p>rc|Vs6EBIf5XzQ4PPiB?HV`Nr)xk>ndbdkFa+K6f7 zJo=mNeYkh|>EC$RK_F}L>0w+dhg;zGLuQQThxyX|{1>M6@7iWoIxWrSp-a4NSq{^G z*zY!&XX>ks2(QeASqkg?e08ytOIb<U_nN55P<0d@e0*v2Vj|w={WZMD!w11s)y@9m zSm1D`)*dC6>F=x>IM@D#%Kn&6(!G?dhlwxn&&ngO%khcmcD}pDWSj1S#!y<8Yg{pT zMWi#%r1g_5gT6-bQIQN9)jdl4;wSN9!anLMWIwd%J+(cthk@x*<u%vxoG*hbgZ>=5 z#9;Ox4kLXEb1RJJG$hyM>9gXn=*BEH_crF$k^SbFdIzBq1bq7bFs2P?jHD4pfbpx1 zbZ2MR@Lapt7Pr-LUi5=q^f*t_e6=K)fU|{-oV)M~6du$lZW>pB!?04^lw*I~`rGI1 z22rdb&lJ6~?M|{xvlD%6uxBL1<?@oeB~QpbU;<haw02yMzxSQcL^fqj^+3J6|Aeak z`<`g#z-VcKr_60;%<COXoH+l)zS?<Nj@#na?%MZQG|{YWV1hD*+nfm0yL@Oq<@*f; zaUIT56!YK#-za@nEIU&y1m470@))E%ne&Bo1Z{VYPv7E-r9DQiK)oiQ#X)PQ<$d4x zC)F<NJ-MhjW4ou8E;uSHK|^%~wi9papWT5JYdm?+Bdd-}jJ)(?Pp!6;bdJ%dv|meQ zQ1RmXinBDT(Yu_Q_okM)8<a_9+VCs@d%3@sub@T8V0HGyfh{D~*czYGfgNlpvq7#M z2T~;7wcKB9bmX~cE&qA>;zG|*F;0jpZ-mR0%bKtzxWarx4D|<(+?wly@N#%n-#eRz zn!BSGW&wH8f%E*^i(~_c$63V|0j0{oa`RyMgS1$PaiP{{hWjyys`-`R#S4{^R6TF6 z>4DL5o8KQ^=rd?H9~aH_#^t7neD*A0$#dkUqpBdm_7#;s94G#&pc(Ud5Gh&`TNG4> zo>FesHl0Y9KOS;$gQqnFf9CDOW4=ekabx(*j}@+#ezv37{A%0d;J*9hw@YQMqJF_% zmcHct`|(FX#)SO!5ZJ4#@G8{;iuzE+Z5>p=9z*l{=&>?ui;wy{qC3`G<9u&re06)^ zx0w%-G`u%rPu(mkFHFl)PB4l&2Q3ps(Sl1j;WDTClV+u`NF~31pcApXe-P8VO*0G# z?@EsZ8Y_?TG(!gujBrf_uIwf=vZCA;!?AKiNcl$pk(;FJe^Zlx6l55WW(Ip8>+Wo) zL^A-$t6Ob2UHy6`h+OfkhA@RWd=am|wLw9jeHP*m5h?tn-&D%M5^(62^>g9{2*1(g zsFodgOWB#y&Uf5Syl{0EWmig~8+b2{bl?n;JMQGdcSFMOimxO#lej?%<^(jFe7lES zVrJ{y>+On2m{%GB#`iPT-^*n_FTo1<HtXmd>R~aDiVPVy3T%ss!=it_D=2I@K_0D^ z?pk97nkSME?ex?-%7{pSgC+A3%0_MY(udU_uHmB0JK{Hu^{qCcMup(oF83M$NTFoQ z>J#o;QkfDVr(k94)IXpqV=W<3jO_8jcpdu(?>n@vRWH1X7n&{%^yAn)y}T^YbL(bW z>j}eW=woxe-~g0D<CkK-13<j>eGj-WcQisp!tq&eQk|tCQT&89yIx|0IC<bofN+sB z(jmoA45a>scPR7j={J5{KD4seT<RIp9p$8MRJ)_2X5G{4?jGuV4JpjA_3$)pU~`3X z0IbS4OlXs(5xvB&aU=eo3G+r+i~^OMW7f0RYKMHUT|MS&TEr~~WRX5C-71Qx7Asu6 z2WV`WTd~yR0FQ8a_(sa^(6cRx`Qrz&a%e{oSkp(20c3e-N~0c)bdI?crT;;9h4XS6 zOMWT`2@??=rZv6{#d9^b2w~sSkacxiVgG(cb*sZI9o{FtV!qNk&0x<$PUz1*z8fKH zUho&?Y}dpz03P#3tXv;~!AeV!9C)p)JmTY^<+y);WU(QHP3v+m1=pTM{eIQO(_K=s zlZnv<XF6))6JH?9vNLS)@yHKd!%^NZ6)2@BNR5zI$84jsuTL%>HI@Kr<j~T^Y5^)s zn^77!eHP4R#{N)C)rB(rO>rMdk?ml1i1}i8RdwYU`6j7-fYpKt0T?5pI>l}XB(q0G zBju-lv>vA+Tjiy}zi0Zs(ay;Lmj+-FiSHY#<*&v4_y50#Df9zn#C>u!CZDBY$|)E~ zR~SsNBA+CfzKw9fr&%C;plvuh_TsCpe?h#{0?#vhYFaCpT>$bP`VxcAy>m0bf@dYh zHUX}LKwkGt`?S93%xDl6;Y;*N*FoQM96kW3GXGaE7FH7oS80Fc8okWO?R~^exokq` zgre^K!aaBqI(7PT#_;<7Gn%V-e_qp?hd?I>*-$~%+w6ehCt&4HuCAp8J|VtZ;OlIr z8==)A%?UohBEyyy>BEX((R)%YXg1T<0dEk%-fm;u6X#n#`|yCw;$ZFj^hwS1h&LWF z`p1=&DF3U~QRZUc^UM}5kdXC+uak~!p!}`b`Shn%8Y;a|+gUD#{5x^XgES-EFSklu zWq@gUT7d-1q6tV-{@a^U&6KM9&+N)ph6@A6R%3qDYqO)PeB+k)!zZ`aOy57|0W*GD zBBt}~DaXkH>wWHSKlYB^l-qefg=kc+B}REaAa#f`!gy^Umtr6JfXd5+HaZ4;yc|o8 zk-$qk1eG{u;MB9V$_)w%w`qf|8gGUpxLv9g`c%1rRJ72oZe!}leGHH?vCE>$-)3h% zs>MaXZ9I8LHAcxDYUE1*%Q}mVYb^6)H<$b<S|B0`Z(|Xk{1R6`T|*2c5|w`0g}Uo7 zorx!hiR;qlhcKKRqYpcPz5IbEJ&n2Hn<yBS9mXZC#22+yz-}%@m9AGv2>@CAnjy63 ztt<eLfFtMrzm0ZQprjev-#^fJy`=n8o8~^y!=0EdCS|wC{_quJxR7)q{$wXOw&)NS zO26Qb9-=g;-<H}*t!0?)Qj-)65tI99(US*|VPj+vm_$F5UF@aCw?CW-@ky&-J~wW5 zpXL%e+0Xp|T5iz=)gp|;%QXc!(Q+y#+kx$&eeshnA>-NlaAvUrgVV4D1E}8?IoXO> z=d%@9&V2G@QIM{$HlHhFW6@UP*YRS!%?xn?Lsv{~>G_?lqE&IS*FJxYnf#Fs3ns4p zdUg425o4WpWggK>J;N8gyHUY7*@5a(A-+q+!mn$<1SL9^vI){)L7`~IH1#NMqn98? zu}iiPjTK)!up8;Xm9DWf$(Y@_N=vgzQpDHH5N+cwZSd<Wf>?8pV)7Oip0#9%k55Q} zah?_a&#4U`ip~tX)#kwi__RXchO6~Pzp-naB;Pb!$T}Cz`dzbI&#iW7g)q(=`6w4G zutOaBB!^mf;%SDR01Lwzd=-qH(b)LA98c+~hi|8sE@W+kx~(8-fo+c3%tNr!it%7_ zTHA`!>A7@Ahw9Hk@P|PW_J_aLIk~|E*|rzRj%8!!^2*~6pDBnSTJ;ad2Z?~EY`syY z_*Z|Uj~~s-6wXn)Wj@)LPe7Bb!4+hQ(3)sqI3Aw;*rrn^G^6;*cMlwq5NCH}hYM1Y zx&74VZ<sb{x81BSGO>5%uE}2J94YpB0$pprOewWaxmTqi72L&ptBU<tb{&1gJ+9au zqS0z#>i#!mvMdJe+*O|wcwhlDtZfn672MopjqHV7%Lg=y6&2gsE)P!fSTbh~HTWz+ z1|SzT<sG*0`lZzu!$<1OGh882HPH#hdm^3qHlAoMT$e?1`)92@EnNe#M^(9M8)5-0 zu5fw^bQY!dpUdvV7B6muxzKzF{Pl@|26)C`-k<XJ!4^7;N)Z3gc<BGE*8fwC*y4fn z<NN<5P5SS{=`lsQ<go!3C~wv>5qcRWL7bow_*WG6Z>iWn&3hJiMELng?9nc{WAytZ OfRenrT=}cFAN~h=&ltV{ literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicred.png b/deployment/media/get_akshcicred.png new file mode 100644 index 0000000000000000000000000000000000000000..cd61f13513859cd2f7285454e992b519c7423eea GIT binary patch literal 11927 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 literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcicred_2.png b/deployment/media/get_akshcicred_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b735cac492ccd3e97c0b33d8464fc60c5177f6e7 GIT binary patch literal 11677 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 I-aPn!0O}}xB>(^b literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcikubernetesversion.png b/deployment/media/get_akshcikubernetesversion.png new file mode 100644 index 0000000000000000000000000000000000000000..692fda228e2b8b04143be1b6c0a26512754f85dd GIT binary patch literal 6887 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 literal 0 HcmV?d00001 diff --git a/deployment/media/get_akshcinodepool_wac.png b/deployment/media/get_akshcinodepool_wac.png new file mode 100644 index 0000000000000000000000000000000000000000..df714405c31d986dff1d863c1da86d0f3e379d56 GIT binary patch literal 15281 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 AF8}}l literal 0 HcmV?d00001 diff --git a/deployment/media/get_module_functions.png b/deployment/media/get_module_functions.png new file mode 100644 index 0000000000000000000000000000000000000000..c178f119c48cc3adf2df00212194853e66122c73 GIT binary patch literal 170688 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 MQIRfvX&mss0N@Po`v3p{ literal 0 HcmV?d00001 diff --git a/deployment/media/get_net_nat.png b/deployment/media/get_net_nat.png new file mode 100644 index 0000000000000000000000000000000000000000..126eb52f1ba72652bbbaac1197cd66a00e6484b5 GIT binary patch literal 14775 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 literal 0 HcmV?d00001 diff --git a/deployment/media/grant_folder_permissions.png b/deployment/media/grant_folder_permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..4023f7a08eed1fe1e94f69c697b0e31649e8bfb0 GIT binary patch literal 14490 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 literal 0 HcmV?d00001 diff --git a/deployment/media/initialize_akshcinode.png b/deployment/media/initialize_akshcinode.png new file mode 100644 index 0000000000000000000000000000000000000000..97e781803c8e3a916cddcc2993c39304f2a5aedd GIT binary patch literal 31604 zcmb@tXIK+K7dA}q9R%r$NUwr)2vtP7C`C#@ML<A$C!u!`6_6^SNKr~qs(=In2!cpc z=_Mc-dIAALNcqs`dA{rY_x^c*?6uj+?CjaIGxt5`%spvV7RJmBd<<k{WXvYF4eyeX zkrOWtNjjQ~lE8bqA1_YiL3fSy$r`^4Y+YPXdFYwzk&%7KX2iQuUtH7s-*yNhBV+0R zdyo(L)jlR8i=sC%)Vmk%viF9zM6k7$<Wa|1owV8cIee-2hpWQiy+@CrQGQ$reZdN{ zx^(n?v3=EvqGBy%G{sNS4U{g^Qi#S*j|S;;9MZAfp_7!CKZBK!)TfZoZ(Z}+bUA38 ziON1XBJ2w0RbCs*1Wzp%e$t!p09fTpL>@3+kJ@GI6FS#zI$u6(PPql4e3*+Nbm!X> zdyqUh4$Li0F_1p4BAfdT&W-;?fi|Ox@JBX`x8@z3aKSZRRk-O^Y(hQSaDsL8RCCsJ z;`EAq+YP~VPtzZOvpCR%@Iving&Tf%-m|2&F>8v9&8pD9*DR324BkRMYGkJQ)nokd zESEXU-f=9rvP2b1NeGuqEFh`Kgy1F?uFShF(3%xn-wmqmy#%>)jBts6-``yj;n~&l z<er?%++=yMk(IAikYUOEwf59kot1ahMD)D0Uo+!&vneDbzg`^#(!t26UpJ+7KOe3c zNwgoZeaU8{lx>PVy)5L$4vIH~+@4id01c<hEjp&l*?v_!kFCCfXio#AfoIr>@VQrd zrNhjq#_+Mm^l3%f`nF`6cEe~7cCfy5e$h<4FJ#l;TMYke4bX4A>Up;=hkl;8O0i(t zn7E*0VYL6;<PPc~`(`wI1%M2skmzDg!xi~J&hlpU)(_Vb3t0=AHnQTT1$72$5>h~K zf`^)I%SKgA4~PS54wnt~n$29*G-xAxzp|Nd>kZ=^P1lmet<Seap4H~}@O=tj3KjJA z>qqX*KTO^*U!jT8x;lM#_ipL)FPp|J&6fH;Aj^Tnx!o#jPxYiN1II^oN|bG24~?r) z&(x2p<|{}aunHE&mg561j<+7!CK~{mCGmvY*c38a76CQ?)!uUN6kX>BPY{24<0vnR zI>EY#{1xhERM6_b0%rh~UN|Qc2=eXU-)jEI`KuD_VTr<taDZ~=+JA0R3;r1kk5PDm zopwh2Yc!5BrBN_`>U}~Saws3Ce({)#5;<Xe?0<iXFz7iP4|gZUEO{UFok_>=A8M+R zPFAiR^ir?jD4qO=V)|ccE*lZ)c$UwEoWf_${SiyTz4yI|0<Sm!`$(ULD~XU{V=T|o zp<_YI8lVZ2M(VxkO=51CAqjqwCol?-erCJw+Udk90&#wq34<$rAM#0j&wDWW{yzo* zmlpnKXaj#Bd<AxOVGI;Q7=j@>q*vlhMoFw-TnZ_*<I)Z>?!tv!gt}#;mn7|UqTgzP zJf6Xb<l+B22@pTHg4g|hoD{-HNypvD*zV*eD8qEC_izmH<X2OKdgkz5Iqx0|wp!TQ zlKWP12%|fMd$Ez?ysJz%1flrik@Ozzc5?|U<D@jZgDwE+uJKX$uYdXk54nk1036#F z;5n~ZHv;JYU7JK1bN(l0wHZd><c?VfN#g9DR>Y)n5w6LFb3Ox-0Oi!iSKRnMuyH@X z%`eb?LiWIuu(#UI5ppT9gH}Pm?(xwf`-eTef$>RLx7?xj<qrZHZ=YT=6qfoh6uU4w zc<U;mEPrbl{QIwO!|3kRu_nKIpKt@X4cqvz(l@|QqP}pdff?EN&UJZIJL!z|Fs2E+ zbI|v}u3IpTXawM{up|K&@Fac4lQJqP=i0Xa8Bic&1iuYx_gDY2Ax2s37O`z8B^&%W zrZ~hm31prlx%0S^4T!nnST6hbW4O}mDUjLSzio>E?EPBN+qof$TW>t0`r<+m??9Gj z8}g-*Y8jVfE9K83ByfIxwMRYjjb!*eh)BjYPYU<cLOR5q*K(hq>$;gTRqs>;N8IOM z$Q^~sIM5(ACa*h3=^UC?b283YKWLG)Tev}jC*7-Yl1zuna727lV|vh)TH;cy^5)@N z#x9(h`|;>>o9R!4hxfUn+PP+F^|=6PUJuGhna7^?BxdBd#N`d2P=-cLe2KL1LB1zx zvTagWBr&x0(b!Lq6DTbc?C-#Glcq+GxQJw+Mh{M7Sl6NF(&<D90$T@2RI&wA!6HaN z5yCm(+)oXaEB+QK|FR-xR(&NwspqWxb{GwxauB>agO^&J&G?Zj^90T{ow7lSAFNu; z|6;Jso9#>B%fQ(q>*%)<ZWDV}FWO$|>-E(uImmgq&>1hn>^1A*mL?-Kuj!BK4cIx2 z9ubRsu=588es$xK&e#a5eS?jdeJP7?!j2Olrk(GtQH(n(J{i%U!h=XgoVml!h4SF~ zx#zO;KYZ)Lud)8c37@JL=PyfT;G{!K9rlNSXYaTOemdt41r+{cZ{+*P#R2K@FcXDs zyl^k#Pd7tKX)Alr@fxh(>4c5>`;Am`U{=Qm6LRVm*X@Px4=m1Q1_rsPfpZFU)-T}f zJm#{HriMg=<bu><73a9^3jJ*W%})p#{L?pbes#wWGX6ka5nYz|VfL3;;4k72%AZxZ ztcmTXm7UiXQYCy&lDOeFK04aqWPY~Q2>pdLWG`Fp$r4X$Pe?+)L>P9S^PmD5!!YfK zz3f8B>kcJltPts|ojUlq<w@j=M|jBU{-5QPE(qb;;_<hb{<N93_rl_2P|}0PAyj;9 zS$Z~XEQj-DatVG4$G#r29@Q@yTeiopkZ~o_NyJS-U9g8=tzMu~2+b^@T=)Ktq)}Nr z3xOWwLJ#o-S3jSA7F3ZD!Fe*AxeSR^AWXqu|MHcTPpGkAniT!<t;W~m;~q5SFYIba z{l1Q`S;9RJw<Qs?VmKF8z)v{^+B|OxgrF@Gk;QIXOY;4S`MxJHFiYwC2A6;9HfFer za@<vRN_gkDa9kKKZ=URVyen;5{2(gvO2_V0n;2LTjhZ#1nzKV2ue{xxO;>+1y_r$E zx#O2Veghg&2tw$G%xMZ$5Pu|W<qNg7Jaf=#{T`y`HsbygBt2Ttv$f#hQ@rsPkKA?= zyAxwDmtaXBfDyvnix{DAool>mp6H-YJQ#rp1gqO*2)`S`4w95)2cVpmcV;}74Zm`H z4tmgfoz_g<zs__<AM5XWy<YWnBmKM$l+bj|yv~lt`p{v3o@C~DCzX92JrJ(Wq~8r! zs{yoZaT1%LnZed}7S|=!<|X2*dM4yaW1voECXumk-tGL5+*((hd!p>SV*Prphf6Un zzMIzQCpyhK%_XHnGUI<~%2E8nn|8~max$Nevi%Xx7^!8}fx2+{?sH53$tB@5&2xF& z$&f$#bIfxze7qn2|5Jfb{1o_H-(&@JgC6i-eso)4k-`6`f&n`<H~7D-nM%R<-x^ki zSFcQZ{Et7=uQmOTI*qvg55D`qwjqYU&TPY*>~=YM3*LlMV(M2gWAB5H2TR8PLNxJG z*tZXq?pI6%>dg0Vw&^Rjzj4#hR79}yz3$u21|(T3+d`_`g_;?be@xHFW$+#;`Zd_H zOzzFo@qJIKQzdXT3OzE>^fst?_7U==SsQis^|$4O0^e(x;6%F>`;PI0qj`UNiwOme zUwVQvKh_>@MKIi7wCq}X&JAOi4l@FVCT%oWmtd5H@~IK$3;k}1^DGO+pJHTuRo4$& z-`!rwXX?j(pd--~)NmwCm|Ev}CDE6#5wyhU891=2b|v0f2QqNW4!lgLCxmNW-dDS$ zJ>Nc<oBfqYI#}ji!kDx%KUz>8ukv=xIVjWt%ll+!l?VKxC@=oKC572FoyVVstC{nC zry)+!>8N5mv0$_!^eHkYDZ+a)rMcx}v27ptz0-U1DE`5>#?tvmlc)qMm7MddJ$uK~ zlRe7Cds7|=w9UlZ@f#g=9UBkbrR^5({LW3CwOwVLsSD3SNyS4;8tNtQh60vU+=(4y z9aclr&FK|v_kD7lo30^Lp$xV6JGM-@5!uJ)$;5jq`H$2;KAKksP43*74qiw);qB*= z=C#F7o`9vng_jqn*+kyFTDgv=`svlk2ZA3E(skc@?J3Pm8$LL?nPHwZX35zM2txlh z*6(IKo_6`}(X5R#%M<?{z?t_o-r1_3+$AmZszqa954L_QkxRJP@+7cu+bq>P7m#7e zz=64KcGGR9EeRPVMy+8|o|W;Q4K!}2pt2Hlo<W=zHR1#pu9UnO-ZLzE5@m|ZbW6|6 zJ-{wKl$lbh|NW5;#)`<X*6|&L;!VviXWnm^yH)Hd>7;T=1z@Cg##iTe!SUv9c>w_d zt!WKomca8VpEhI2#l)aV*ixk)?l$25HHRDWT1e)d(tx}pXv-_0k0ZeLLl%`~<FEVC z_kMBtk9d6Mcxd+Op39wSs0N$*OWOsZmu+s|UC)9Lky6mPw_p`94&_fxRa<S-7seHc zE?<JN7OH}-gf#>n^>OjoV5`E#sE13+=zv-|FJweEi!q{jW!&&D*yHi~>2Ds-qLNnr ze$w=lo#w~RI{!22z%)PLW$JGm;De$E<vRh@vrh)4z~yfi-@0BmcU{~YH<uEyvv~zS zXfv`uztb!^7#+Sq7efyEqA+NNfXh>9C!kU)d^qnI70KE}KPC=a200qbOE3K4elH_( ztAN<C<_@y%8t##c6@gU&r$*G1R;Dj(_|WY;>ro*z-V^3_iRGG{X=!+O)OBRrrM#Cb zULJMh`C<bjZ0hXtho&EtrlXP4(fUw37~d7DABZ}M8pdX0tXDA(-hHR+k$2QLFmmR} zb$o8M<;ND^GY3D*7GZ`xrDVw`@l!qL6fec_Urm2)RX~T+V74wij8~N<Pt4-d&N=h$ z>${tBZdJ(1I&*F->xInyQ1qokFphry^zeRTj4!C-{FP$_|AtQp5<CCr<D3wvdTMGv zN+FFVl)07R=76Z2|6Q_&8<}~o&+eNJ_&jx|YbfE0`ns9duk`beWpj&Von?B7_E@sy zaQfm?b*|ZxG6uArS2ZLVwGHMy79Dwl98WYK;{iExoarOapDl5`H_&7`+`X_n^da1D zbi#p6A4+fG;qHjexd1gui#A?_$K?xrdooIY2e;b~A6K}*IHPzraC{QvqJmqe&P&wH z$NwOoUCMvT(o?S>KdUkV`Y-Bo(aYd3?qISp{6FCFUmH~at-${Oq(TB!L%*96RnxOH z?Kf`0*l@QtcMiC)vP}FSt4}O5f2y$?T0-`y*4-bH+WyvS<MsEnHFFvuMq)8+vSKmx z+a~3xYt!qQ{A!yfbKv>6K;8w9wU4|99wPf08IRQ;4_2YIg7#CVv<Oc)=6Wc<Y@>U0 zygRsFb6d^8kIBhcO4NU4w``8y`7ai?RA(h`_|<g^M1)_-M(kJ$_w;=KD6GNgwfAQ| zY3_9ZUCiCYA7oHN%k(&|)Y?ogmVAXf{4Z;V11C>rFYyOb?3+%19e?tGKf32_`?#n# zKi$<|$*~Km(I0B2MJ0sEf3dsUExKW9CSgB3xX&BIc|`HP>Yh*7-|G+7U!I%lIm}z( zKA{wrHnS7!LggrUQFgJ>n;RMlS^tvF+#FdnWXN{LJ9(YWew(66YUpV>sX{zWxTCai zRa^`WLR>%*cUlW`@t8#E2%o;6+3k`cV}5!VpMO4d@um|mO;f}M(y23|N_XzIbj_bh z+8`3cPd}Rm+`Xd0XV-wm??KlTU|x>dIiWclsYyFwNgJlhU4E=7>~2L4z(tou%cW|l z&gW=HdRRL%3o!nANK=G1$0krnNb^&$F;Kkm7CYk7yXQJCm#ejhW$>MzlOuUl!HUFj zDZEbK-51XJwewSlt%X(03}K*W!qW=A@1@xqM}I#<u#VDI1Yhs@A(mGPx^WfM+=v=W zi}hZ6QG;5b>0P|iNb`VCrd7|ynB{FC$~>2IL4v#C0ny*}yVNZmpxL?T4Tqk_+p|A* zMSapwlDx`6g~m7&xaGs^gA#|%;|2>A&{my$IdTqi%f{)6kPmI=J3)i)CP4_lge9Iy zkF{nWM!`o<KZ+jBozJ%zEQqxQ^UkylG4{96M$nT$JkC;7`e`P2hZo@mp^}cN9}Uzl zygz^8eMj}d*K{x_C^6!ui1gjmDh1P*&+$1TrHlDu@b)HQbHsR6UD_9h68qrZ^c9sC z8NP}I>#Icu)z?SA<`uf66dDh`-aIk_e~-ChIiHDdnH#1TNTaKsB!x));u5#*vxjlX zezr^<R<#3iiYDf+I7LJ*l-`9jbU&9LOF9ZiV=HhrP<e5DX%Ba(O>|3DaR9CjUqV8| z754PN`M5_FuekK`6*_&SqAQR*2)xe|uY_?PyYng3+`Y$_yf~d}eb>B;XOXok8;Q>S zw%=70+0cSl@M(QYFRSxS8=s76X|%Px9mA@$UghBLa^{3U-odl$hLWUr2Cg53NE_eU zfGfB1sRSIiJ})Ax#esY+>#`L_J<Nj;S}s~W!D5J-J^klA$zH67-Jj&s+Z(K$;YiLT zeM5-Ez{S{@qUvNrjEmqBTLJH~By-5!0PPR54>T7Zi;Pv9&bk-*!1hYh8?NF5ul$^D z2~=+4PpJFruh&iQd_C9!{5pUnbI`*|-@3pZ+q-Yn9PG0p{icgI#$@*!dsHSDe)~q< z0VO)<co#8}&}+Ak=wUU`!8Qp_-{RSM*DqTOkt^@<Vu$vqma16g<PR?$utr5}%&j7s z1A6rO(Sw((x@_OveZ0F7?Ugjowe?*E8;x!sH*(o)POUb7%ej#W)mYmLGJ_woft&Xl zO|qMcYf#2@!lM0mre)fBjTBUy(xZz$Co*d@r_q<l%NEOXv|C9;gVQnoY^r<jpj7t& zX`MH(zJyne3{FoOPP;&0dyTkPD$P}r5T}lLT{RGz4kqyj>20(xMaQnGbHDI~{rMv3 zb!a!2)PB!jd-G8|`aSV4l1`ew`tT06Sq`{*r*bpzZia1$RbN&Z)GPnjd07y4(%o&v zWD3qXvzJmIa)1{`<ee_zToLjX4BCH3=xw@x7_Z=*U)FNaql;<aXX@)Mw6awtzq2F0 z&J<EKY&EZNec*0KhFe?qKephbN615s5KsdIG@B9T@S-X0Pg`a~)?bF0&T~b~G_}6` zSC6AG5%!jo5jF-@zNb!zDR2A7L5?C4TV1Sdcd;I=g(#1&&DW7&AIUwpzf9$(ag81U z)kVmUUcq<L6&s#aJ4}a6`B2-pi!L_K?CwAqs}$dl7JdIqJ<fFNcLDUI0a*^B1Z!Tt z%DreU=eQh7F8`%lC05uS1GM-Dc`BJ=G9%bq#r<o4SuEIn4Zb2kA7dhczl%A#1ip?l z{OBX_EdegT8FO4Xuzckz(&6jR8oi3~e+0?JZi0YHI$_=U@}@m8^nhv`ZHg8>*JvF$ zu!#Jns;zv5A><!bN{VEf5}E@B0rYovZa=QNaw{LFC`U{09_`5Y_QrHS$t|L@M5uZ+ zkdNE?7m$l<BWpX;T>qYf`%rQztF_8tTj;xgB%B^sR=)z)y^VlSZnWlDV-?FwskAtV zCBwzis1i2QNqOIrtHf!Q4S7x#_=uTuK(&^;!~m5!_pUn=f+rE);Irj<HgKOxFi&g% zqH{zQd*RP59MuNll(qu6#KuMZWM!KHzXO*aD5eU(L2S<eTUi3>tu!`@ljF_d0M4X) zud8lsh?p}p$gPgtqOUN73B2=!lTthHy1veVLo)#MD*F1+%BqZyq9=(RMOXLIg6oaV zl*2dvPA0g>)e$_>#McoITP;^U(K5FLitCBG)pX&neRyqE!U5*+;~?@%tTv-y9K^3y zaU`#w(2TIV*noJpbg+9f9>|>zlM>%kH@wIrOA_6*7&Hj`x=vVwiDVAK#|e*rk=e+= zMQ38S!{6~4+yHY7f0Y=?DRZ1Qq)SZw{tDgNAky$Q&Gzh&Bc{-`dY1c(7u?D~KWl63 z-ZKrVpO1rRo{h&%iH&4GpIA@0nG*{Zs101@%48Jhsvu54{NcK)j3e~1lLc10rh`;h zxCm_4F7z=Lm<`c*F~Q)$I59c;;(wicFqNKk(i&9OO?}P8$=f>9<i*R8FKJEdy|xnG zw-C>YvI7cgBAFPFq7uAnj;WCj(`JupEI6vy8HA||q;%0NI7@i6QhD@5v_xGo^>u>P z?9Qg{Mp;gIg}dCnRR)M50GYv=HlHSe&k0zIU1;TO5|ZLizsV4M;R*%whC>s~rI*MQ zxTOS|Co6yBB3MgyD|jeEhZ8L5`UK5Q<h5J4``F;6;Y*(UwPG=Y)1DMP>c(FQUjin) zPd~9?ic;X_`Pi+y8fgUO+TQW)DA0$8(Cg)cH`Mebyb9>6T03w<c`;rIC0A05N!$MV z)=D;uj#l%r(lHlc7`yQ^j~2n1ev>|Ce<uYw5*r<yz5CKP1L-~d#TYKH^C+S@=<n#R zu4B(-QlqomxK;)vuyNhxa(&=6EyZVdy0#z9wH=$tJKg!yJZ^so8kY|sk_kCvN|U~D zmKm=baydOHH$~U`lt?AQ%u*H8l+(eS&XT%CTO0uA!y)|rN7lRIWwX<UZY;sxI_yW| ziDi)#>FCF`K7DC=oEo(~ImQ96;o0#JPNIpuxS|6Ctl;*rNs>ACry%|?3N#|j0BBWB zK+!(3?JE|JVW=DbSkrz}&{;SKFxZ{lslRY0@F<=ADxQj-^of<oy{{1?wEJs{Ay4## zwv@4t8cJTTe!qS;!OcU@fAJb>Bq}B@>bqZ3C#9EuY_e7KDBpt%>kQP*g$5W(8=1;F zPP!;;eQ<2V^EW`UULd&+URFkpNt}Ny<Ek1aFr1OdTqkCp=t?qh&Hr`K&krGzKQYr1 z7%AR*1xVL!#D1MbHbxbZt^R&XF3y653GDFLaUquzIyn_q(B)<0+&OWtI?-y9eI^uV zHl}uB3Nf4(T1{ExzpVA$y#nKrf{!Ze7-A;;<(xim*<h)5aKG1?6~<rHXw(1ASTtDq zIW{#grqmrY@8*18K53kwxgh6<a2ToKpm+S44sX13c3kQG>GJLv>D}lNQ`Gs;L87Zf zBg)!r6gL(-0=6kLj^SF7QnpHnUr?ZrRLPDTp>ZP2l&9LRk9-DLaQWu}m;Dr@H|+fS zKc-2v7_cT0{302NMBI@=W)BGv%G`~^L07xRo$0%Nn8&k^3MKnBf?0pbsZ&!&Q)t|- zi{t>cOe@<o{vNC%t$+A_?In7mfqds_NkWLMF7SKeRJFC$FE#cNer{cdB`%3NZEnIq znh^j~lRh9U&N7A^ZBmpVdcxvH9u{Gx;L9e1@LwFOz7E*-kTyfCre?I0V&<Cy)ImtU zyxa6xjc$ASh2=uDS(qilyX@X;Kp0IDI@+GlABI>TCo;f@!Ia-Tbtu}P#vd9qc#^<! zT6FULA^AO22c%<p)Uq%cIGS*MqTz{LBYZr*3P8|y3eigUJL_S~1k(ETLS641(@z}L z8oLs-+j~FD6De4HJ1)YAP$7YcBV*K9vt|6pCnbgx?w|mpxP4*W$?BgP=9fb?nIpep zRq*(sm_$I#2`?F**2SfVD|D}wm5S2p2Wt$)FXEX2c0UD{6cdA?4d01pyfPahN_B3Y z93*t66OI0M&<7<EHL)u(1is}3%oQfqP2H~nEAYY?<=eIQ6&k2M)~EhyxW6?#@BS%V z9c$?2V9V`w{O*4G$Ft4!phsJB4|PPU<s0Jym*;`-pB`Qz&mK^pCwcXpoNX&Dl+8=7 z@15)Ag&+>6ee!!6bbz1N^3{R&VsO)o=fiduZ^h?JeT9oQ?m^!E`~zPE#G__g=Q6jw z&)1dIyeYdsahKodSZQPd*@RRJcC{TrCsf|<170?ch=JS+zFU}KX@Q^VU0@OHR0)2` zw18#0pd#bGtEvQ^?#|t4x)aaApGV3_2N3@vY3Nv?tH^e#xjbr`YBpfvbJKo~<!Za- zO6tQb3efP(YRw9enf8@^dkN!=-^IFC^zP$XmeEZ7yf6Z0E1UE&ZoT~RBn@__SruNo z63!t9+q&NoGZ}vQ1Ktj`dS+Aha8*>oyW(KECheT;4)TV!w)=zvIZhcuZn}bHcTxch zVCn~d;#TLHK*ut4xbJa7=Pu-SpU>#bp!~E|Tr>X6(dW%Pt_Xjpxl>_Eah(&(So7@O z;msr~4OgL(!vRt+h)3voPJT|n6<x$-&QK<1m!jUZ4u4$*S`9^{=R@d=1k>D=`^!nP zuom7k2Z`$5bT#04OHY|E-|nFo#0B!L=D5|?f_eB8dC`ai?pN}{cn1)TLk6{wFob>6 zO5bT)t?wQ--kJ=hd$Worxts*a_GauBd^3g%czc0SQ^yEE=lIcuW1e6Y?wdn1cT($e zdS>UzzqrwcDS1-xUDpg71w?COv1yLwe{wfazm)*-nmvKM0^#fOt6QU%Ngv6Z2i|wJ zgsN+yh&1;1GAfqUc%+Jlblc<Fd*8EyDU@gg=`Jx(2e^Y|>xoAX3V!+vP_<^b%|QY2 zF@&vaSPYa*xW0!Y>0DPvi7%eod)2tzg-$awf=i_*Mm&?BXmmOFCqHV~{pd>B5FYtN zi;H+z%{$TH&Ye5Go|t7*7L4V%+=k&nWwU~5$5%d+jZku7`%?529xCQO?`8%QxA@5p z2)sm;PA`ebzIqTtVs=t_f9WZ$d2)^rNjy5_gpLlEmExSd{?;v<@~Rpta5kbB{UPp) z3bKQi{#;j_Rzg7c;bUPg=LCkcTWvlG6|CwV+dZ@Muj(!7YlV#8wvOM2NQOT79NB3< z=&>tb1E~i2c1<Yf`#L&JRZkjoPu}>jF?!>}<k5ov#@NH@`)x1QZCWkc-$4>YmO^FH z@XwE+y(-ud-!1hqg*R~pDB2n=CWtmz)ocYN_RSkFqIL57?rhkcB_gib!(d#)=_;#X zTmz87TW67u=LaNnt(#1$DBDnxcq5vy<l%aklvAd;WC9H0)xyM#_rmqCpT@uXk2)T} z?P^M>u2()wSc#!RVVQaK#^Wl>d?pD^US~W3*8zM|VWsp-?;jw_7M7C_z<V4mX`C6T zef+b8Cw(VTV@W~@9(qR8!AR?7fDf!6-Ejv<HzY$6#IG2~!~=9fw13@Ximwz(I9-Xp z#PVK~yYnU_z9-Ybk<tG~pu)YjZ;45kcupZe5TDOX6iu$(BU)wicn%-qh@-+oDjubC zY`xBm1264!ry}>Hm#jJqiF~d~^eIhM^cF(CXa-m%s0U}puC$ZYhK>;;w9C=~d~+Z# zJqJcRXJ01*U(TSn*ulJi)Lv`p6nM3DJFH>$WVLH}tCiSzhz54O<3izdrL!1OpOtXs zZx7HnJ8+%tt6$cu%T_DdX0itIj<2J7$5r~`DXnVHcNyJfYbwK+=}vn{GT(d)vu|yE z>5)d1!=NdgUP&%N4E5nVg4hwPI@@lP<Zj54C7H`m9tbwx-^YrV?+#f{vidl58R>G9 zQEKM_;z;!~v!9%C@o#~29r~CErC&EaS?)2tHO7neKaVP9=!-SDI*Y!7RH53j@8EMG zAvhHxvIp6i2x3n7KY-px`Ev0~xGeoi0Au_cmV{W_)2yS_ff}8JgA$8umhZ2!$$nXK zsWQJ-`Nk>u>b!LJhW#83eLRip!uGAr_6%!or{k^1f~jvCJW;u8>%u55u-<Xi+)hqi zH7Y3FYXxKU<5Q@C3+T`3G$Ld231}goyL~S^V@}3O?J>k_?P667J)QK8e=ck2-1o^l z@gsC$3To%v(zk0IhF@5f76+V<dxeCEKpy40X}sz{38Qa@ultc=k7r65mUb-TDfhAT z(U=-x_@#ypzWpQjaH2e!Fzl2!8sArgLK{PRSHLF%yAD~L@kOJE53G<Rn^S`T-vUOx z188qiwko{)7T3n6joV!H3jBU$js9tJS_kObVv34Tx2KfyBGEDY(OjX`vbO+6K$%~v zSgaR3x||Gj$p}TBM{_*6I-<meV<uaC_B5$%`=LEy61X}ZLle#lievS+QcJ{NroI02 zk!ww*Uy3RKuNsYkl6q5OaDuqAD@;&r3USdPI6g$U?<m9nh60zk$e2yJqwG?bg3u1X zyyigQ)cYLm2US<+U0>gx5n~RF{WWzXqs8`?biSD>%e>t0SjmW>L8%r_;cp_vshc&X zR`kGgr(^2}&u*sH>tt-J(g595h4PcfEkE}>UZ{-3>|t7JLGiOXAM-1HKLbVQPRcb@ z#%_2WSCyY;X@r7QHas?rhq;9yI*6L!l@GbK&F1s2^5Sha-@UlO)y<qdL_~h2r)8p; zQx@$_alNKfYAc=J;j@jW<W?U54DO@WR*H|=b6HAh`>x1zn`%EBk1eHLVakg#PuMeM zW%v8F07f2nbn3X!o&KS5U9R?;s8mhgk*jnSj}-8eFA-3dP29t=>Z9K<X|oLC&6}@a z7s;EZdkR!s*)g61v>V5qzm>4TLBh@^WnH)(G5u4JT(ax<qq3P&`zLJkD}<wol*I02 z7g{ayP%XNJ4+}kPOaipzIG)`bOl|xvmqS;w_xFtf&xPW=lqT%nf;+=WWX`@#A#BYd z6SRcJL^f&ziQ7LqA3E|TZ<P!r#k403Sgz58bgVUMu-|$5L~s0oQ`IzMP?5EQbxD*; zDa9oW-!i$eUWB<crnY7VRYCU1C34+meDlLZ7TC>iHTvq0JlSAXq9`2>aYxWd)3Y!> zUWYdHvOmY`Hw^9xx7J1DsDzT<JY(`HrCGSyu740$SuU;(1sZwTOgNZTM%D$0#8wFI zW^pFQ*@s=47hgHi;1(xeFMq{n<R{GKNAos}Fy7nY&=fT7BT;kCI-Jt^bwY4Qt~{Tp z{Cx<^+XNyE*bgZ<rYvsTbUmHQYid;P^8D|s!458Sg>l`F43VRc*kh_KQ$<hmV~VT| zx9m>01McdMPt9Z-l|v-<*J{EJXhVY4!3_7xQl~9<Ur#XzNtX$qupjI~zZ@!)d%m67 zu}Im!DLNp56rIOZYCTR!{N%+qUm{@$qp-uTg>?R|$7+++=ZlG8Oydli%#@s&%UZr# z{Spx-RnDBGL+SnRip2c(NXMGT?yvDsex+H0D%|fzXZPHq<MT+zJY&vzDEK#pqTu|p z0F`fBZm&AdPT>?Mz5X$hYb04+q8>9Eg(*zrwwo61PCx}IG03KAX@}NizG`~q7QgnP zKKu{tb}`d+&-O&y8B7oOqqs|7#+uyWE7|%Q?&<drk{U*yyyqXC{!KZkUN%a?bS{fI zAyl&r{6FeRpLBjwv(_bfQN&fqiHo~|(GV&~qOiD1IY8N3(pY$e4gDQ__@8`}0{T)6 z<x)vX#q$b>WNEMCqqc2ltovuyggacssm;kI)0Izby9$;)O(}*q@x0DBb3)+TyU|}5 ztdOSG_$U@Fb}8$E(ZLbnBbBu~!gibPKc~xc<&H9>={+;RxwJ{Jw~_JKa^c8iNFt0& zTu51w%}!Xs(&Q!sv0PQRX;iIt{uA}cQx8{=y^!5WaBI2Gs*{W=C8!U7b5<;}63A?> z{5y~OX*UO0eX`7sYC$vYUy_U=03obQOMQMhAi>GxP4r@enHiOpjQ1b6#bBh$zFzq8 zI-u94#to57efUbp`GK&1cSpBNa^22;D`z<mLwg5L*`}I=cL^ngKTrkpRE=EfJg2FW zPBkm(RguX=1FHoMlBTzlQ&E2YeW}cvv{k)H%hnyrzr2*Lc306~tQxW1qq->^riw@P zTdu|(ZJkFyKvWhyT29wHDqoneDO=FRTLLaClPxsSZu08dF?xy^WYs{ae?J8-8c#$y zRs0S6H7K`DD8P4Py%-<DV@|f)5slY_-17SxIyk=E$Ljsj^+!vSd2?6Tucb#L3)wP3 zbS`JBHXVQBZEFFkw&Qf5d=~@h@J>CJ!6Mu37OA0eJxIpt>vkd&gh<RLL&?X6tt3;Y zL<_~gwz;CV8;HIBrI9att?SS2*@#7NR1U10GRTqDIG{!oQ#pDN$e|BFXgZtSiQiUd z%TyBt<Djr!Uptrh2;|H$@-Fc)7pc(dc?IwmP-!Cja3US1f&UKSla<?%MnI^lf{#|o zA};mb!qls?YyX<IF39E#QFiPC=U|D*2dYCMZ9U7sw#*1yhu1T*ogJ`e1qb05uY4gp zLv1!-z7g$_w^Yx5w!%YeKGVS*yEyI?d+19xmYUXCC3>R(Y4Q!#CcgvnRw{+;uq~0* z2gt26kkm?Ig~qBGc4T}dj{l3Rd&2WXf*(#1Pxx8m<~im`_dJRWOzdCjmA;6WFD3>l z35`)?LebbT)Gl>R8OpL>16ih9y!PbtSN(ylQ;LDGV|&Z?&z5Xq2M3c;3>cq6#*KSn z%%BZjK)Wd?M`x#Q9X<^S_%hi=GV0#~fS}pLn-=jSxWXo9+0W4ub9x$%J7i1q;<r3B z6@MzNw6*vO3Q;Y*{{90Z2TTV+jucnW1Bo#ZD3L>@!JcU&YB?6J!S~crq2J4UbrKpw zZ-fuFC#<i)qe$oUKE$0-g}Ml>-HC9K^qnn<wq`^esheg7jBv-U#t<0}V63R=V)>Li z=$+`A{+pPc==BNPK^?Z1#w69%KMIv6RLGEBgC=4RKZ5uN%wmiIk=g2K(LO)Bh~Z9x zERq>Y)Kd8gNX<wN{|AH_%l=C^CJBH)dGy&Bpl=gKjz6x<U#)dMNi2&{iI+aFo@`nV zu<X}_e5M58u$)+0yl{8KprYE#La9=f;hRFfX+T0HR1x`QFzzc)T|u+=40&e*KJty1 zO-$(GM$J~`l>}rFsOmz<bw(^IfgfkW=6b?`U8gUz^-pBY&7xt-e-4!zpw7o<w~q!x zn5y?G@z0ko(o>*KsXyrEiAVYVdzCHV0L0PY6Q%d#F|Ctf7B%cgCV=lwzNfnviHBO{ z1^X9m*^iec%+K_>A}y3=p`9q!F1!b--@OJgf`8I+KArD+Yt+qu*c=vnu;NdXd#uiJ zr)bD+p27Z@XzD*A6ilnlaQ<R)0)$#Z{WgZc4@y5#OVP^5uBLXa=Czl`6Zot%i!G9N z0^t6WR8HlpLX_t*M?5GXE09wA6n>ZiObmm3;yCH?l3k2GW<`|ei1nh1!3?J^YRn@k z-@e?}SW-*1NX}KZNcp(wV0BlO+YWcFe5e-+&w+fVnSOwLqSrFx&sXit1U%cg)q#F- z%`IR1i@y5O7QmAp^YrbXGcS?2&_v`o8<02m$7DttvMyN>{hXaP25+du>YAh$-kR{d zZR4x1cmpAJW;8>&L8nkYa=p;yJ6EK&T)(T>sF6yJ*E0YJ+=ZHZ0r@cgkP@<_`ev4Y zGjKStnt2W~+2$=Qxgf_d*S?mXh?Q9|p)4z^e|z?Bq1@L<XXw@Q@qEMO0mW2byYtj3 z0ZQ+WCBKB;1KJ^sdrFp{xB$o9EpL(x`CCA_wh-2Qc?X~Qkr8kj{u^z8Q_AsH_(Ex< zleh20Zb46tuk_UOGyQQdn)ACnM4kK?VI2@A5~+@$3CDkh^tbm!s|z%(iKBj8IvR9F zS9LsX^z67Kg!jKzBC=lwNqHEph4JjUBt)9FblaauDEGONP5`U+5rlilrgy%O5j0jp zU=gguV}vGZa)rbLCJk3LEv)vJaU^N0Ar!HFvL0}jO5r%W6-VmzQyhnK%-Q|$-H#4d z%Z3LNL-)agX*WgozZfGUq9dQd0<?npZ_`p(=+jKCM+Uo^=?V|^)<f}v#4{pvbxac) zUlytLBL++nZ17T^2Walvzq7SXt_RuTB~3O_{=CNGqg4<%z<O(jd|PAnw@Kx~wU(R_ zYlx10dh}*mMOB7_-xp3GeT_P@2Djzeo}D;8A9^Fp0<|mNVBYaf=Ng7^7g=UC+;hJN zx%Z9vg(SEWr{OF733c|$G<z<1@7kjU$M0%i`cJqQJ$eGYz<di16Cm4KP|Nib=ZNOn z;JlDG(>iZu&p)jDcKHckpJ#hB{Z*ONCbCx`f03hT@(V$*evjtT0pV#1(BF3aA0F%= zJ{Ut2KHGLvhrLOFKhWeK43)#w6E(CjU&9c&Zov`JI=Ob1v8BhR7r{plW%E;uflE5+ z-Z1%oPRM5l@yYdznOyQEzi#Fk0RT&UKQsjhrfG^Cv@3rbAxBlC!vg3*Fxu0I(-AIm zj|3{U-`*r@K*yO+Z7naeduxLPUIO#*RU91}!ce95390y){9el<RTzvU<21_!&Ic;- z-l_ZGc5H8Vq^N+zt@OeGXKY}?>?JE(ZQ47?n#8Rha<miRvv{lvn=(77kpBA3m4O6H z{w5jP${n)f^aSrbQJ=XTB}<*=Wlw&Rhm$X|wom^j;>hML|FK8kUbCz$EH6XOiD4zy z9sE5d{-nV#)(k!UbH?j@*a+vkr$)mJc;&Splr+!D{G%vK|6Jx+>*KlC!uNPTVc#^6 z-Lj0z^tR%-m#~iG@`aq!G?Kp}NTYCb#rCb>QDab!iMSlzc##5T-^@@N?Jc`&1)}=q z63Xb*jFIg?sBuMb5z6-cCHy`y{lf2_E1dQ!T74LDm1qD^hb=NVA^c)LC0O)oNqh&v z=)85J$Tz3M{v3PsX893W8U+#_cAauu4kcKUyO0=^k2RTY)#CuO!Tm{W7<G&285i3a zt!UzxF;vc_nn&77{uO#*s7h_L{VJD4LowAx$NPg;@y`n+GrIQ{2}6K$MS*)ag(6uz zla@|3czw${>;&WBFuG9wa8as;u>LQ9T;j_6zrckkx4wfPY+1gl$ZkuW+MKgm#=2`^ zEBee>T+j)VA+en-x`iwGPoS0psO=!NAQcdM$mZEjhz8DN<H+Xs&FHcCc94kd)9lMu znI~sf30Xqo=Q8id7en_dl^N#Sy+k(udcFr2{g(9?S|@P-n(u<6g=S+eD}zI0tj<y1 z^kG+f4q>amJ$q{V2yro)7?U~1;+7Ln3L{w9m)rha!_TYBPKy-d&?1L?TMWDhI-Aaa zs`YU%Na{9B14*P|zus&TGYZZuu4lAvsOG=Hk7@_tnR;#zIk={w{kRME+aj>8P6K)v zN#UnqsBz)O<Z?oGd>M|h>2Q6<jo8D8Qep^!$oGDZai$HTS^M*P+I6lvY<239hyHcK zss$kn)!QZ9SCo;R@MR%}8DJkOlzXhf(m8!C@wn0r;tggl_A?|G2J_{z6lGInsUQh> zkhreVu^Q6IZ;#)fdhz(`ss%L`vjix&fl%PLSv+@DDMo0bnM?7zE2v5Uk*E8t1_lQ# zpGi6aBKR)mDO8utb0&r80fZVm%q!HR&tpO53#&?S%DYoP!Jp;klCf!<M>!LO@*Lpc z`NSypTq#PE?&fR(dfPC6U?E@Sc8A2{6&%fN>+kF0i0z#g(Bo@kJS0WoJ)WS2u-$F1 zSG8Hxr-gM+>5#-a0I1`{`ZX?kHX1#b3&|6{`k`&d>+7ShMiuqol27ydbH*mXHBd$S zf|koSOo4pqBb~hx+dWr=B?l*Q>N700LW95P{V9+1y6Zu6dEkWMtlOzU*^mxnz$FmX zMbu5{Ztz5JPQl6H;4U+UF+A_uv)CzwQklos@(QQy@)_6VO0;VMlP2a(3Z%wBJ~Hil zqj6uOvf^xz*z02ErSn$T(!!>tt1||?pTlDQfLuLr8$IuvFV+ZEa&L}NMV^A`ol9#* zu_2uOmq=B*Frr-=g%C!V^3t)m-f0p2#pWW$^2}v`l_o`eIg->wZKdc>fms9t(cg5~ z>0ul(@!)szgn*v!i5dtWuQ!6A)ut+?1-XY!H^oGib^Ypwq;i;bYT9Mjq`|n5o<520 z;FRcNWiGUrl?m*ZF(A{xZ?mp6weDo=@Y(rQi6+eFsGrJczGWdy*9pcYx>FMB#dj|? zj97_%rKV~TzgJ}4Qas5Gf>=QJ8w#1L)(WF#46=9W(N&}8n4+bx_T%AbFj?f=Y>DzH z+5zV?8^ce}ZcZx-8kK;xYU#^`aeegq>J~DQ%4R8hj@1TXQl>dHk!hAU?`EuJx0!yu z#d613_ycnr%eK$&CtrB&<le9giFV3;&0A>$)!&#~4T@Y45yM|d2p3I$@LT`b68E;& zHI?N2Y)G4wr;|S&hQtJxa^oze1G&)i@2svaH&}|8NpHQgx^u8vQ%4i*0lvndPLLA* z>;WkqgZ6*KM7nh5l-eTHtR<?3Fvv~qmizh?SvkyCrzB4Fv0GKTi1qNQd%&@K^{k-E zuT<t1aAgD|5$f~y&&ech$?b_meKVQi*J8L&n&(Cyu7Ykge<Nx$yX#{3r8?xBGtuRa z?PrDA@h16W)}qA$N!r00_b!$^S@(zA56jtDOQ<g;Y*vt28uLs12$A?9F@T}e&^s`( zN?wyODwgV3<9cw$tyAB@=R1)V<yjNFYE~<tOnX!oZf8CajL}<UjSXSc`*kI%BVE2K z3}-`$Y(M)djFUt}Mpi+&LeBV!Ncp7>RezR?v@QDquEv;Z9WEb3SNqYut!e0A<X>2T zva_Ash<LD6d0F)(TZO{<`!}}R8<f^Q0q(L4?3h}i#vg;wKjo{hr@~MY74D*k!93tg zuMOg=?bhEzmM@LZbGA(J<e#CHzT_0-mrF1r#QSPYkJk31>XrV;&;#<s5ktz~j4Nbq z&x0?KgR1H%F!RedM&xY|m95L#hK0{0`;|Y6Pb5Obc-CrSjI{r)$cLm|gt9+<xU4z6 zI37oWUFhF-vs>tpo=XRkYjcPXx`@bs&OuIjxCxL(y91BqfCC0~M^+dkfw|l*{d$wx zw28hFREDyQ!OC1l_ixSy+?F(*Izqx2-FPLgrjG7Y9g~zWz1Dnx_;unP>>yP<v99yq zDtE>O5-?oFx9E!p<iX{WtkY}Qytw8|3K&EX;)+$k37dzqgU<AtAhAA(5V6Kr^4r6o z@@0XdxL3E!uHE}o0u0V3OVgm&XgEniN(<{FSofr(0=h=HH_C7P_pN~2P%(sffOuc- znn0QeJAH#L=h$tlb-3l(?<(;1`8$}GPJDAY?vEpq<R&zJ1Ca(SnLLJejQ5rzBY%rO z^FE<+6Z)r`cz>aqa2ylhBBtHVY`y=9%P2`o;0xp960Um&*um>z91))cFE;2scqg5U z%3)@F??ds?`@@^Meo+sl!u)^f2|h){flFN?L~d*+f1NqNwr=}Ec_Uu+(*9BBh^f~@ z{+Dnlz0%bIhs`Rj+<dv8qs1s0IP_2iUMk|jNvN)&2|QVM=L$u8{1c#d>X;z>3StM6 zfILQ$xT`GI+^HY25L^6h(W!Zlks8i)Sdr83ft7D5NR@}uAVFCu5okOc+8X!IlFMIB z38MH<#b^ai2G8i57eXFM3l`Dbaf%JUfsbo}Fe&5gF(Va`uDb=-0&L;(0UKlGj5_RJ z9FIgsp0^14{*(3FePJWcNu-P7gT-~k7|2<ZfYG;JGFey1mm+uq3M{hcCl_$YGlCVi z@?cKU5-axkE?Rh!N}I!7a-K_Ej*!uP2cI`48#{lAINoY<l<?248;S_1D1ztUyB*vz zY-cD5(nIkAZV9L~Js7Pab(lZ2ghM|^rwrWdewFW&YKp~hym1&dLpxZIy<NSd_#FBx z36(K)bgu{H64$LTk{W9CABpW?;-9-P{Bt0z7?^&YL6jbJ+krCuV`{(hhk4dP$K30R zdF~t6qe?`TzZoKbezLb1FzL%%nYQ_SxT$sjixYZOnt}?X@}X)AE?iwlpUejS$vdU< zKM|DtvwbC@Kb2+-^V}jA!U%dLj-@L+3{tQ2FWpAut0KRe=sRdP;s&X7=>Z!y`eqfv zJy#@T@`sI8h0;k3hvqB4rX|O?hzi=6n_v>fzeatT5H*nB_vKOaG0fRFcx&NzC$0y& zTf(JYh8<P9uE*TeV*@h(_zI=_af#AeMGSX%3C3lt$~+Q9H%v1pK51LqIV^rWXI7*9 zlg3oY+A`Pf;O{U?-b$ycx=%}aH4!Gq1x90?Z4s;olozRu%2);kZE^g?DCqQ(z#jsx zQfYVJeGzqCfdN2}BlBfM*qzm~aCj>!(kE$h?G}{%nYv#jhv%}~l4AXtLNY+lX#Q>8 ztyAQpbL+UOq#huP1Ac0^T)I;%rW<iA%C+xcrGYY(QQ*Auw4Vn*0X=?MHZ#$6>M^{6 zHV$BYDrTV05Rxs%5yiD%ZTl@79TKGQ=I|Brq0>5A|C{vomI+0sw-yU;cEE+Q$4v!O z3t$&##&Gs>4h)p>6M6uIK%n4jUwEhEldl?Hf!3PzopxCXfjD&_?j10b@j;WI`R%29 z7!U4XzXEw;#>vghA+5?m(v8lK6N!6#YVwon|1jcbDt%1$vPA6t>9WTY;SzJC%e9`o zjN0d|`t7(gE0y0qTo1X7x$M!Qu&cq6V2#|<Yl=qbXN4Ig>(q0L<o%mAh#+&NGK!?m z3VLcmaWcKVv>R^>+v$zkH*S}3mATHiY0Y`-2=HbEOqY4An=}RWf3lj-RH4o43(P6E zTbZ*`Axna7hJQ;rX6X-1Kr#$6Nz|2+X`bkCcOGBp0>7x?K*Vz8xIR46APf`pCwcmV zAftb=n6PK_78}N$>E6`+)F(bG6Gm23@q4{rjiK}JnucOOHEAzpD5N$rxE9m8YChfC zxHVm_X`vCi6eNea5c<%!HVBFHsUz=veJs&O&+3exEq^BTY<ghxvKc?^0%D-{l^Ac- z8#%%S#DFam1OckFZFNPIOEd_ocWF4Tg$XUrPUceTyeyk?iUs?$&@Scy4Nra1<&UX^ zi5t8N*_;K=+5I3za;aJ;#?85m`RscL9bHIhZ(H6YBAK{Juu+xcwbz_>2DQwyJ@eP< zX>Z$!cnY!<UyThh-Q8lU>>pyBzJEbS<5FBn^Jo4<1Izv#exZcc6$e&vK~0wAeI@SB zJ$25J2m2}KstqY!!kwJU;gPZ>ZEQy2Lk8u4N=^Nzn#i8RPW5J+p2^Ap_RNq*@c4M= zG`JXe21ZWZw3RUtxJ-%q@#B%}AA(m^3`MTcIdw<aUNLGn+a=bnM}_j~iJoG8DO1;8 z2E6Um9F--kMa3V37ODT_L7fThWT0j@%B5l)gleX5S=^NP;?WRS^Sz5LbO8jMeKtEM z5xEktxf0E!LfoeAI9=Xxjo!PEwrttcg%(k67&|j%`-O9tM(>$~pS-kN-M-euoFc$d z#ms1(3L`)5CaQH4o3l_zXKB~FOG#ELSXY@8&OE)0)mmerc%IS-u4h{7Otausu38^B zizx6RJbPk>VV3wx%!d@f)4$zXyjmsPLjhg7!TJ7F-)%q3_p-9^vxwcB;hT9ph^iV$ zY!+0D8CVi<IbD(A1Fnc#oaMUO*K&RV>20gu{7=>&dkQ(>21c9Etuw2o9;&Wqe-Lk? zEOcKQqnFX1vqIujnr{dcTBkqOn?jego506oRx5#5f``7|Qa8Vhv^L%C|ELjhJqaxK zY21ycHzEw0z|5~=Sl^)xF8jCnz-nGlL4`X;Qs%z9kUdR8t1?gDD-ALMtMy%mQOCWr zW)9`d#1Jc5Mp-YBH?)VBy$Bm3o|l<NS8UH^U6%8I%^}T(Ov}$jvMx4snU^>|aTXc> zyOHY->%tpN)tT(fwc}_+&#!Y2L}Y`2z8CtDh$w4u((2B5_<3dzy2@*B_Sevh0+ip3 z0ynikdkJneQtjA^>j${wfk3=|X5C)tSU!9tAI8Wtu1#<ELgMw%GL7Zu4u&r*dXs(k ze>>C($2UL!Ovc>+W^a50;GvGu%Kf#@aLH~KgLRqEViafbfdAyr@2{=?B=NXF1tV%7 zJih0T)paU7<)`G_$Me?rteVX}w><$_#O4T}X=J`Dq+M7~?>KG~h6~zR+(H|m-|G#X zTMndA;U<HxM;})$tSUH-*|PL~g~xItezdmt4HSK9vVln|5Pzwz@&k3F2mwhhU0gjq z;A_!{A6{09;VKx7ZE62g+=80`XmH|y${s(vr%-;vHT&UIMh$!>)<IyjDeLB5xba&{ z?YMMk6=VIUPx2I+P!)7Lbx4<YDfPC9Y!95y2=+V?z_r(@w2C?Jp*LpMpWM&xSv(Hv zIFC=7sN7fkmf$-}P;(-Tr~H4leRouoU$mu&^j?$>f(S?p3IbAsbfsehX`!fq5W3U^ z5C~O41nJU?(n1YL2@omLq_+gbfb<qRB$Nri^46O*Z{C_&YvymlSMGQ3x%ce7&pw-> z17W}aV6ZD|1|1I>Hd7kD&J{km{q}lJc^1`GuiAob!I}Wk4CLZ-`STx@M!%MPx6i_| z7o69VqXtV{gk(Toa!Q1aHS4Ui-HP{~m0R}e97z&R3MA+A#e8cL1>KMPeQWeh1O_Ka zs<DZUykQ-AA1NYjahh>+FMiXr9@pc<LX3NVBj2Im4r^`Y&Ex~+JxK@2K5jGQ2b%Uf zmCBHKHJGe>ZnNKlg9NZx>{e6atE{l1s2avoqe1W_dU6N_n7=`IwEP{3D~tz?0>JaL z<3h+e*Vd<Yr>Sn}?}lxu+IkTm&l0j<T))d{vQ+I79<WtUaxgpZuzYuio89~8=Zc*n zI=8M6G9v_`(x`Ic)?nQhl^b3ikb?s-mgpS+;BL-Mwn9s@#VQ;-x%GCi-QN;oO}CM+ zoGiH7K&Qy$J>`C9T?r@nMaBNEQqas*Vvdj@BJ&gViLhi7p}I?CjM>=(+eCfOVtWVK zG9HW?z+9d>1i;Cp)_b&ne>)b*crQ=IE>ERX;%+OoereKO%HXnhr^k}=rGfG$jYx~x zsJb@w5+qfCoHg_m5D_?09=v2Vd1Zn-BE<Cl@gXOP;(FBnh6gvT;ug^N%shEsltUP( zn1iENp~D|Mzf`1xQ?gLBr%xQO(ZRAN_s09vRnB!GozxDLu6m<iGDBP@Exu@i#w`h& zlSs1OeJ+XxiKX24>J?CmR$%fBnGfhtV!E(*Q?PHuW+IA6WErYZR+|qMY2njI4%JU@ zNu4e}t#Cs<nFIqed~2*v=*#4XPy-Y}B#Y%p8iRF3^4`4np@zXct5Sj5_}8STXcoe& zle=!`Vu0^W-{W92>7CfXwxiVqo9*U-doWOB10%$2rmh87!eUfLzn7qw`OY|vbFlAI z`28}`npA%em?+d#@|o5hL+1}NtI{LjKTeNp<DOX+f|Y+x0B9!WvuiY}OBf1cfz`(x zYfgqxe?QOjf`V^2L>rdIQW@REOSKDNhzqr7$b&16Y|rh&+-mvhjOjNb&!dp}-nVW` z_pn|+smcfn!o*T#^%H-#@hWZAehXPp^4<)(6a8S4+>jF-vlAYK5#8Q8>M$q#gmpOa zh403tQWS`skQk8n5QWV9FsI+|F_IxYL<Ps_e#!4tZI@tA7hj%o1sn1`2d$wp<!hR2 zSLD~?lWkTY7OA=Ny@!{wBjx&3ZOkq$DeYahaFdB<n8BF@DV1xP=UgT$v2B$RnFY&o zzZnrSMOa@>G~uD1IZUH{*`HG9&%17PmqBQHN5JCFu0sthH?CyWa=8#iLW6xr$O_fe zwmzv~A!_*amY*szX>yDh{ix%sxFiJk<&gZWdC2fCyv<}Lu4LRZC;t_H&95U)=lXzq z;td;(ZX2a`Igco1hh=#D#|MJl>y#;y`<2OiD6qwTgD*sQ-px(<3S>0Dx?!PssImPf z%vYB`O6iTDs_dxG$@{XZP%gK*`z&FrcGja4RuN81{q5b|+eY68ZZYn)TqzIS^z+4b z0lxe2HqjHsR;-IE<eFTE>OmPt++H`8c4oF(H7T;s-)m=s8}wQjlS+>zl}=IQzGnsY z*n%w})zUj9riPK2WO_65!|8KP`T3u0#H%%v%@TgaxSb!{+hLYFyDN<zy`fFysbqfE zaw4B0?Q-qOGsCwof+w~1sHu`)gOd9yY3WzK=$_~<4K5w91^U@)y8H8{zT!*lYkEHN zGDB9%fizw(W|f6BRQ7t~KebeCVtO<iy-LG|oRIeHKPznLYoVWI9frK0{QPB4rD6v@ zoLGwP{kVvlC2s`e4z$}(UE@3%d+~6w`mok90-^7`a;F>|$A((aMHLQ_^KIJ+Pr0Nu zO$y!A!R<j+e>B|wb$`?*vXIW4t65eVe8@8)0MAp=#Gs(Lv2tnRkDy4Ir&i-!ahPkw zvz5;_?Wvy|`UXSW^N4xsdO)=KuHf?9xiOFJP#o?i+jkBpBn1ehCfC*<9@Ps92lRg? zZ<b=1Y2zD}4C`<j&#RaC0LR_T$<-bAy61nUjN5q+3Zrf)LB6DZA|tSTpDgO-hA%s$ zZ63FGDu-fZ9p1rL8bz19<ZpjdZQZiV8*0Lf<XBxXZs}ZcNM2Q&eFY_z6>qs9;eLm` zphss!y{vr4i2GV`c+Ak&IVP6PD@?kuFKvUnT7rEWBN_a-<&=6lsQasfohWzENQ~R} zb@w?cvIgT1<udEgU+OsKXj2}%rd<0cS;J7~1{-=4j6D!1V4-49k~m>aXlJ>+9Kjq^ zoL=r`)X23gq~K4&MC}U|qix2y`+ARgIL~_Bo60F-Cf8$(6C+ozgfIOfgHP{1b$G22 z@J2qK8Qc}cgmBdM&sDX=!@C}mjXyO2-8MSi-3ntPa-y+aRJz?*vEN9x%!m?$w8(@! zqS|uh&e5uFTpLHk;A2_`hTg=vd@ZC3|Bm_5L(r{3``29=iXO8Iy}Bnmgfn`kz_t5~ zpMSqLs-iP3Pnbz|Ar@HeRLkOsb^s0i4iyy_b#1jgBg^Ls+@m4}r6G>lx+`oi)$2;! z_EYONZtYL?tQ`##3!i@PYVH?V@zt78605afGpu~zl~)-^36-UwCPqonF#0!&RclQ6 z&imDmrw)p7tgH3L`!T24Q2}%Hl24AH#2Ey5A^zc1>d|OU&#iRg+(GtI1)bw_DlF;B zUzZq$KIX;CW_YkutMgf`$o7ZuO3Y_F<K?i&S@2NvrOYdznv2x^M!remkx$)vo2HD0 z&P_%5?r@17won>a?kbgLycNTlS(Hui(^06_@h79$cp;3}Xi-nao<^%(+xz?$<wser zVBhw;z_4{>7I`I&!p5v6br32a?Xk-`S>Cmjvso&P4OoMRV~H5?;Q&^YgRF@_B4Rog z^E)iUq-`Z{vF&H5L9j=|H}G}p!|Vi`MxNNWi!@dtCRP^Yq2zfCjX%4(JLSKmoXRLQ zZ*$Z`d#D_UI*2?!1@VR@x}&+v{(sygpX|v~z8<imfj8l<PI@joFMsQDoRk!A<SI0g z2##)+3?Jd^+)2<<t>}HReD_68z1sb_t4Xr+I!K~D5ee(eFsIp+VYrUC;@)Zzc8bC^ zEQx=&0y<(%XkM<Prhl7#n8RpoaX3RC;UbaTR-0}W0;Ax&th`#WMVO}!Eb=p|Tw<N9 z<wMlHj;_C4bpv{JXzM}gq5N{AutDr<a_e2gS&FU+UMfY}W^$sA!DV^I>xx$ikOSe$ zNuv#&r>KCS*_RQ*max{djX0Lz;+47EeRmqRY}pMI@OmLL?k}?xMLaIUU6ys#OfK0{ zJTj*a>bazr63UEKn1T|g$~S#sBr7KhY%c65%^3y_O?^#3eX8d)519jy=Tunew4{(G zzHh(3=@^i7YMnHYwul-d&jJ*y?BoAj`n8QR#K5=#VZF&Uvh|G6q}>~W>)*df;`#LH zoqseP*hvWu=K_NQz~DV}-{b+L^Rf-gu2xsDan=n9lV8kr5=2;#caJA%hJ$zrV?a$s z{Dkq|^>i<YOkFlcs1~&i6S6`^=(%VVxg#$ttvx&H{@$CzVN#}8Bi=@@T8YNW%X{wk zx@~4W&NkWib=N*W`2G|2I~b1od{`c)9x)$nIbCZ|V#q3O(Z5;y=eF-kA)xI;^O9Qk zX8oh9KFxU*bi53wa0r!E;0`A{f~WH-A59}PlebG9gy$hwTo1T9UAf3LXrXd#WU#C7 zq0y8Klecr)rGAs_Wfgb2^(mIMVg-8dd-s3Ius!LAVUUN+8B+e#5Eqf?^Sw{F;l~pw zl4c?W5?U+<3fltiKV?V9ta8yQZb);5C>v!Qb{^1YP`3TF!)Dxtf1eTtg!kl3{`!17 z_Sy2@<!rMCsyKx=oYdkoLxv{8g>AoII@z3Vn6$Oph)g!>w?Cvq|AO(-5g~3ue{i(2 zkm^*X@VqDigB$*wjB?AUe=<I#$RecPKUsjQwdV^?WvQ5{;ae`$%8>U`v6fwbu%)>? zK}}(CB2aoh&W76+r#xt(y;h1RhaB%p=Qsm0Ap4diCdvVP8S-HA^=Vhpy==nWPAjs* z<`d<VAo+u<%A8X^L`>oexv<)5_MpkJ0*~j{thuVsrroMHIP?3Oj2p_3A_lXv8}>JC z9@C1X=|i7>`M2t{wX|yhd($O#aWh%m_Wm+>2ccX5M2TnJ?T3}n0YQoK%livqvm+C> z=804IE*c`+S4JoKgzw8nN><^37T23SeBVKbhV+Rub#3gFkHAm+5r>j*WeGL&%Z4|s zxK%25+cK|x@}X(D=k5?wb084-wS~hZRp0(QN1PHl8=r^hI=YFHE86|8$ndE>%7CRj zBs~kt%o~KYIoj?d*a%vB6e+F|03n{PL8P*!r~J;oXAgbd=k0K)5{5QYi>KZtS(hS$ z=I<U2Lo%N1@shoy^USUx>xg&RB-W@+H0_a}EPtxQ_S30^OiZYd!j(MPxSJWMEl)qW z?WPrB`%OSFx>*dRA;eV~9mv{=El#$=S39h@{zj+X$j*=)7=d2ddxyWyTA>UGPUkZt zg}2~nou})0GrOwba1hyJ^H|hViSiE&1ZE{1QOt$&0m0+~-2m@8qIB!fq}E;GH*sZm z<Gyp5&c?tWK>@8kAPBe6d~}wJUX$%cFAnXg5}uqjdkLU?PT7Pz*>LO26t)iNRHvHZ zpKW>i%SijP0;39ps=KS%WnChh|I2rqZu01e2Djrw+{`lxvfOvMH5*sej!-^GQrG5M zDp}yEU}@tL*PvPglf_2z-Mj}3ndFLmex%dq(+L&UqwYp`UML)3qKwdxYZhmHKEKB% zg2>WkArweY46{gCju@wOcGUpY;6{ZLHhlod;0igvYg%`9+f<h2ki=4zJ@|BFi~Wnz zs+Q?#kD0vF^g|;nX&PbONuQ@9*x~m8EiwO?<(SZdJeN%t;d-Zn+zxYt_38C2N{XBp z_XJ-_@3c+F!hcf|TJsW02iVt9EHgFs^qILXP$|#7m>wsdCrZ$y@q={&zj@kDH_UZs zZV!eZ=0C~J$b(<~jP*61gzyiet>>79$65*ps;s{8z{RXUk1Xc*|HOjIno0p2S!-)D z=|4R?rnRRI%0##nlX3%b1<x_oNp#S=1gP#XIwl2o=$xOv`7@ZK?iXE5XU@^4EVFkm zTaOGNj3+!t1RMRWtM!}FZ3oW8xoD+jZ&v3Pz|207-k)BD#G5Pn@@V9?*Hkl^$()3P z>#B$E@;IOksP5j;C}!!>c_JuFD*Sy(YtV8-yY;}U%kM@sW3)LO>h`hnyYX^Ycf|;0 zX|)PEM{)eN#H1hN`a7{j)d(QPEaZ>v(aC0!+AU>W!-W-zKreNh*@uHrzLO>jYQW4B zIaU*tB5ec@#e6Z60llnD!^xmb8q&tz(&aWu1(V56X5P5Nf|%uku0>=yhDcojJ5Nx4 zqMNrSd>>E`>S{HRAnG}H7u1W|ya~4c0DmkaBI=jc1E0B=#uMWgE28&z1-EGfjqXzU z53M$Nb0+5XZyaP%wH?%R!WBqF>6Mwz?Sim>iV4@9?cjEmGxGeeGX&dJCjEFJE`yLs z$0BuNl8!F!^ghVEtbCYGv5=Kci<vNd+v8s|R&sUz+I^0wfDOp<-OB|3R`xHGK|lkC z!Q`1ic-mK^$~A{&;BOgmPr>y&>rd7(_vVV*m*|x!psfnx6c3(JGoAg6mFK4$%58fL zdN?IT@vKl@WY5<oC00nJObe_1;3yzUyW1e*rjsm6y52T$@3`o9(+%NPNr}B;s|F=~ zBF>&Nvg&_5N{N~&DTixHXJzqD!`CuzfhVJSVZ8NtiGsR6IU))5iE_VRytTTn?mC~x z^~;EIMXUaiMOpF(hmS|m_Pr}Qm&PBfaE_SeXn*%wjxE8v=u5jVytmbrtBtp8Fub&u zH$gLUBjRQK+*Q|Nr;O`XPe!V@H73icG%NfNIKUU4(3eApZy#sVuDpFBGt?hp8eYym zI`H;Ue!!`7sVfm9FC4=;e{s+lDxA1vk|Q;t7aWa$wjDsaaM#nVR)s~!_=9d*rGyL# ze_K(*GPw$CfFBD_^Nw$E{lgC~daMb&8P^k^@-Zxonxxb*LzlJU&W6UW`p0DYHVD*c zCS;N~Y`c)-6<JQTvfMsC7QkOU)Fs6W3-RU+N#dUw%IO(&P|<8!mu5kVxBvm!%^vG9 zmxS-%JZj14iBu?zED>r>Tg)x{L-H}aiJH;s*79pqmg&>$=$<w*njrT_%S4X`9(`h= z)!@xjG}+)9vGjlp!oFTV01?@GFHl24O&NWUicI;?QVpJ{nZpS9sv0k<*>(eK(voiI z6PY|QII|?^^@J%}qI1X<7c()GTcI<gM#7>Nd-=)xT)h_3`^g0zVi0qfWrJ=@;wD76 zJ<p>`k4#O4S#b7)+*8U5U%3`WL%ovEF)!`&z6>jqu^ZazsOhKy!anZAR}53d*iJ{X zgyEkr3rF9Jz8O`x$Iv_Sm}+d91#hBecx^DhfE;t*=f?=o`CKvSvD$v#`4fc8HEI=v z<uuk1F{rXVdI`}OAC{UK)+*!7wh-?#^_b62g;J#(5F#WzStNodl5mch>rp_K)3+!? zKdvsCS)CPwAe}ro&mhC9Q<~I%tJ1>gVgGIgtv>LJ(qf0NzqECoKbmhl^n!O=@h38y z9>EqfNwm4W3-j5R&y&ZpeFs+?s5^2=OuiGD^2zwg!5dJ)19^`7Lt^UKqQ;-SZknPR zu|iB<$I4BtR%Y+T%$SW>a~@gfn^*&xrQ?&^qr;*zW3(#;ZkKVtL#!|ZEs^lfBT-h- zZI@sUQx|e)ZP)L4UJV1mLfl@@Eh81EWEO<^82MvU;=)on^=(bw=gw~V-dcRZ3uR2; zz*q8b(_ebWvTtK0sw;3Sj1QVWfD-Q0WuZ0m%LBW2HA$X0=$`0R%G$)U&}NugtL!_p zc@JK_)L;|0%HO#6l;k+hyT{?F;mQ+=gXbNs&nK<K)z5zC>rC$(62gVVQ<BSV2az8V zL~3qd8d=dHYc6IZG<3Cc>;zJ>`eIq8vJrXbb0&-{+Zyw~tuMGPULx1^3}zcUr|wF$ zPE=wdmK#F}f)GkeD{X8sC7*eMnpVr8wpf7KSgvZr<?H2_Kcv_wQQe6WC>XKa5<IEF z7f_L+v$bd2S3m8PT>VlJswVSc#~2cs!fNElj9M{@N+8{KR_wqA`K_2!!I>@I-5^}S z3#=9nJYlnJV^k|y%|9^a9E)(b)sz^?SDt<bj8+=vJ-#2PBhn(S&cZnbxRVvO+UmOp z6OtHC9z+JOKMooe3;4e0UrO3LDEPJ<5n00hI#=VRyULHi!Ui?PT<EB*cwB<m>Ke7X zrq(!MuA6*Hprw+bBY-Vz_Agz95K&j*^x&u~PwGeVz=t1+IZ{7nXG|Wv9WoBN8TLf= za`@n<OSf!I`J=oH{#1y&q|+a(D!ve_5f0NWh|juWAk!X1QWipm*AtL18JJU<Vm?b4 z6rJ1XiQTmO!*I%W2wXmUy<u|Jh0e)F=0F+G;_yAsg2K{#O~EC|>b<Nl!Y6%1-GrBA z6ABPUA$_ZjE!QxFCtA<IIqbu&?d0=^dmTO#YHsQ|#vyFB3JKSRd>`7PwA9istqsEX zOd6S2;`UTxmLFTOop}v;3oezsR!NFE-U`M8dF}Dn_`#hUoz5{p{-8hJ;-4>EC<;X$ zP^-*XBry_gEp!IeMGS5TFLUbbX}+{+_`%ZojWHSLd3^V6t_+QUgz!<=-b3a>nzm#R z;0IXQ@IiToj>$`=8r=lSn;EH;Fj?Zw9@m2<^5R(oRSX(?T%kc>?K`)LV`|A+giDxQ zMP;!BG*H~vqjfNk%BSa$ty7Qhrt)Lui*gI=;~D@MIr8SyJ(nvBoDVdzj1~dKX2?HE zBYQ`5|G5{0YP!c)>mAvY#)ye5H;|WtL`?~eQiHU6*?M~~M$2!`b<>lw#iChvh+)~@ z>iZUs?4Gfv(GxwJQ8Fzy+!tD^#}?DJe)<(a%z|@Nrc3UQL-Ne`n(6lYhajg=orION z534KW#ymptfMJ8CQvqO@1}IRIX)BAnhoPUX8S>LR))$$<cQHSP7+C`SE#MkW_aiiT zU?J_G7lK%Z4wX8zwi;6m$5=aTkW7f#Rf2))Bl5lAPRt!@3FWt$1MQzdY=Ms-*vSuX zAV%V4^A5V^JOv5D;fuN`SsO}ZDj?}XH?gwQ9+)r8E>F?(S}6BO7t1!6)mwVyjzOC5 z@@2b^u4gCiRLIyqyIt5{G&H9>)-{!;V9#5@zcbxRfrTZ|ZwmB_AI>3F(E%3wB6~6P zM46BXhZ`efJZ|LhD8-tx<)}Q>XkZ~C`3v|m`q~%&H_pcvtdD*@`<vKiCSEZmCf87I zbL!bi4lXA7cTEe9#dzjmPi98~zI0&*mQwz};AmwL>2i0k*H7nYMKQ2PV|HQW{J~Md z@|sUq9UrP&;(FFj@#707zOaOt*>2wTG`b|*3FA}ICR4+*`K0;0!}$pM|D_JnGZ7T| zsz4c196wkTm~xl&?_wc}Yk?Qfb4#FIEFg4MJ=;)yg83|a-*}St(pu8w$c5!%A-f|B z(MwS>c)>NVXA#v{(KMD>S4PR{67mKIHFbE%vce;B;)rDJiTt!BgdZ-|{o_Y4X3rV^ z?!AP<r|0@AgX#zN&Ysr;#aYO8bT`du{U*h)fPy+P_IvLE`c4#v<e02>cNSi0$+=_9 znT0L8P%a%zh0{U*_G<>Tt}{&zk!*oR%O*qkWZ_NsW8zkIr~w62!j_H#5*oA8@|gdb zZ23B04L-3Oroz?hvjlLJLkFbvFhi0kI77o7OZpzsKjikzwfmHsxxwNLCK=mpiqxXN zEK;MhpXKBn{b1y~Kbl=-QJViUGOE~^k4$+ce1Hu#7A~W4uja;?aQkQU)vaBN)XQO@ zq+JFCf@I2GnrIH19`eguT7SRVXZB-?!+y7zfDM<DV~s=)*I9w8Y~LxoYpVRi7f3nL z{!7&UpamS%esWu5;*-#Z2EP**QB<?mC=RaZxJ^5PsOj#97UE)5P3Xo2`U9(C+RPwH zp$v4auUkJH_jQLMKHs@tPjQvDN3Mz^S~C}^^h{h5#4P(>_9#1$G33==S#gXIV6nBh zCn`JYx()rPXruz|P>qdK-b7*1#;bHai_@=sCTc$h?f-#nfgr3&SMX*W8W7c#3%z4# zMzA>QNrl?F#K<bfnwX@O4!DeL#VAVnoOFcrrH_-FaDSHq>#7~i3%ej#jOee}Fj1qg z+p$HsU3a4`RXdVE>5`^!dX11riibuM(Ln9c=joI|I$Rbhq$R5?sakKktyuy!T~xyV z0s|Y-_J3k<)kfIEsl6J@V|%C25|x)K(}Jr;3yJ!mG*LLAXbuv2V8ca3Bd7VExM2O~ z*`r`T>_G%bJ@FxPU3&-OLERp)G6UZpt{`ReYYjK!*1>KI#Ob=hL=?G@*UUtN=!91D z<vRGENwQL$zAz!xN^{GnV|-42)iZrvyA6zKU(hw<vM{CiQ^Aneu-pQ@Z}OuF9q1la z^JQSx>H_PQMp#lsW=>$T*mLb#zYN4DiMdAY=Ai4`77lHWnOTEwS5gv2mV=T95C<>Y z#O=`&b(U{1JsrdEPM1&<<R+XQ)i`OrrTl(a7NWzNkwuhXUDB?qGBp;=-|>LUv>$9N zgqH2T^JN+HoI;iBZ{(C)#x5`o$ORr9T9d}GvGn7r4Kw<XEbhQ`E%Scx=X@URAkOW% zqbMHxgPJdpOcWo&Z$_so^yS3-5^lKuc~*uD`VcmSEL~n0Ud;nPcDPzD<0x$&bcD9n z^`vQO8F-R~!N=RAAXHDpU8jQ8vt7BUTkd5?zJ2@C{pzUoB2%ETq(w(J<CIAxRXBBy z!`B8oepz3w(CBXx6avbEYhE_Hum?_|QMwsF<oLgY|DB-5gdhyxwM~_3gV$8Yliv;O zze&^A#v~9#FvzPf?YbU~G9YD~xZYLCdMu#u9ospzCMs64^MCGdB#UoU$3HXJVrd3C zJ#QX>IF@^k%<Co{#KRHY;U#nr)7fi~uZSO%5e0fw`w}&Kl~Ld&t&B`X<1=Goyrr#{ zU{0LizI<~mLVY$|xr`&4Y%N;doa66Ud|mhi8f|f5z(WjR)_-Z+QUv}nQ;d$x&OI;^ zDdQl6avfB?x;T8X7p}GbW4frpILb?+x*@Xsj|-zE@4qoJ<Rkiq@lo81f36n%j}0T` zzkfIV`*xB4-cCTIOp#iL@$Wyc;5AUQ^3!R5N##<?)s3D7$s}Hfa{lvAB`i;5cxi6F z&&zS0|20l~@qXXEctWymXanWx@&A}QCJT!=$#aH;+Yz0G3Lj9JMSOonX+6Unpg`RC zW5RG0bTQW3q+HhD$>)qsm2`TQUUN(f&q+9%eJk+H^-XAFQ>H$&tP!c>sXlJK!(O_u zU$DaJJTd{Sw&*-at#|Guq(&0v1fJ7BcXw18$WY9cF>JYYXR2@E8);|f8~|3}H(F5b z2E7y<l6M_T#i@l-_!0_BI)M?j6+|1xtqY;WisO%+H28&OF1Vzo2)9(N@`(?>{adHk zp08&A%qh;!%iOlT$Fh=dekox}_#csl&$<c|e2M1p6LM=~KCIF(O3C?Jh-*vNKO2O0 zKt_;cyXC3s%<XTD_=QVZto(Od#fB0>gfy><-sot%`EFQCkh{vFM%lX~JR_Je?6p&! zI!;84S2m=((d258wfqQK0nqx23{{Uw@Q5=rYBO5V7Fu=#e<#krgJ{eatXO~pe8t#S ziae{@G)x7cwLK~lF|W*!|30#6rtYNo`Uug9*J;~0OAt2Ed_Js!zH1=jOc3aQl|wWW zdKb6eYbUo(<C?~qjP7iK{E$2m)I+yQhTUf|j@M3nLzDOIj$HhlEt`so8Bn&mM%AVS zPzH6ZM`sWBdH;xd2mu{wm=#XJp2x%W<1^E*cL+a^QsRJtRE}62vE8*6rJ^6DZQck> z4M$F{-Y>gEi>)g&g%|}wKRo{7JqdkY&$|H_8m@i&BLbcQ-zWqya{1;W$Lq#|zbu&? zL?R9}3owj?cJ|*-TXX}a4wIui&;8KW<}cB6WZ&ldW+tkfF?&U260#OuMLW7GT{~4# z8&}U+&K{f3FPW9=k)Qy*$8kK>ahe%juOw%N0SK8fz^_vS7Tq%7J!BXdmp_CMaXp$~ z`XP5XrV+RMP2)bBgxR-`!IGWl&tWS17L-+M%umhDkQeWbEg#sh<1Fm2A(~0X)Bk5P zNo>W}+Nq|7+=OHtm$16HK3(u?{;+|qU&s;p_?L`WabXHx_qltkvc|%W+>YAgJan%- zS|brKfSGd5=Y@9fPrJ3sSY3hs8T)ei+%l-KH+T}S4f?utpxFu4K03@gHyw^A$ST7* zTwU14vxX{l9iPX`)|_VZWZj{IR%X~W&~c3x#Se6!>LpNN1W~o;`JmUc8j%W0^I@oU zJEo=Tl?}Ea5N1_C1A{_7A^7^$yFwj{n@Z()Cw>tLv_ng;uZ$!&g&y*I(%7L3ocVj` zv2FzmPSUzu&I_za;^yzfXJhsLN3=*0vYauO_gEOF@C`6B2&QiN4&0Q-`p|}qvzYPq z5eu^vDmBg$-?o!~Zd$Z1jQOa>1~~Nu*7x{fT#lHD#YI8rosx?;90I3Iu2${48{B{A z%Qt?y<QV#(sKL(h3|P~Vj)Cn77nI1_TYh3e&P(?jvK30Lo{EAW%t8ax2!=J5io$Q0 zSiukOfxyTjwAUUD^kBcXB<qFBJJvT}JbDTN`k!V+QGBD^OaUe>x<>`<%m0l<C9C*w z8at+aLbmeZjjCH1F5;H?V0|7E2BP&kc-tu_k}6ySw@{Mcu6Q<V?J_X0&i9+uku=iJ z!@lF`PmK5XWYa7^{74e0g9*G5Lp;2XcOm4}(C@B@(5;>6Dks%E3?3pkNgv+1I-I32 zN^dCxJ&GMD-MGyZ7(SPIV^6V4_575ewfM=e57DJzHoA1!yVyAKs>iRS;^K|M^!rMj z1y?=u7kbR+(CO<aSIPu1Y?WCnON3PbufZ=ng8m>h2%`+THY8kn`Vg#_N=r%jcGV9u zJ0-+&j2;~l=7_3+gsCVEf=N^SJTB-`!j&ABNlDfxAo;;amLZjt6nU6B8-*R_?vElY zD}^CupXAO&T_rGv@Dee*?x|@`uw5LhJS=L?NR=bL(QYk&!9d?$=>qkNA<NJKZNim+ zpdRq^tf|aB=!=6qE6IbY>Mf0XGi-Uv4V3s!Dp<b{T)%A7!s>!7i&)iJygT2)&XTlS zpt*44{E0<CC`yGI7WAZ;sF3I9d_BfS70ldzR4k?AQ>IYxVY2sln7a1X@MkdYc+NE| zrU`A&q@VskxQF91k8744b5c>iFEF4HHuDZ;sFBOaZ+LJNl`(luxcHf*yX|X7Y%u@Y z9Rr}=fPd~(Sg4V=;5JFy#aoIkIR&`DLQ2h<x1^Q9yFJ)%H5x%oY5fPdj))SK`R(l* zarwinBDzO4H~q7|R{3+ivGLfitx9zb5;`<KKqwNV7r3jjM1WgpBz&FX+Xf~mcgCzG zeZRgd>IGyIVtBFA`ZEjQmIP(w`5bgbry9ZkQl;jqs*$c(AnRGD7Zwl(A>*eZ8d6T( z@y+t$t)l%y^fv@NI$G1inv}Hs<D@xu`P!KQ$%XkbFdsL;7tiunqGQt_`L7T1m78z0 zFAufYeEE-Dh}e<B_Wrz-6Zu6-WYa*jw!heh|5r=pu%me15Z6t+zj8E&|9Ae%nzv5c zQl8=#yRuNL)kMK6@#Z5>SER66bq7S7xQ=J4xm+^hp<{fm!G3>jyBRbluK1f4%AJ`8 zUir92^dv9XFmF(yE*uX0100Vns_iX3)}tosrbhN-<jd!~kdc@g>VwA^8$K_@L%@3m z*K&EeYjv~Hpw5H%GAQl$KZX$}58@c1z1K0kr1saaTMsP2)10}+4xc|8{QikH`ryE3 z_EWQHEg5Wj)Pa1soj^PQp~Jn2B9$sMh4x)HD}8B#+tq7|Lz@0IYSI)XlTX9k?#sbI zrJSfXH9Daxy=mce0G?U{q5es~5F-Wmp!5iId5*D62^8gnA}5ERLZ73v@wY2Ca5w3y zGp4-JMbE)2^*zV<24(!qUuH_Y1H))`7Nt6XW6FM{{Hkt5c2D5=>FBVU`On?9`64(} zGQWAbsTR?}+$E)V7O8u>A$roO2TUp?XSi$qIy8|xY)|!8;Bd@a6BbFB<cZpz#G6Kn ztI2@GLOLD4Qf}}Y&23oi4D6S8fWMX^l`5{bEfdhs#x@*2K7nEb2Z`S9j<<?{TL7Um z*G|<ibCYASy67ZZ^U1(NeyA*_e1a_s@uMVG+gNV#J=lIt+JvxN&CpXM#0G}GA!hTD z(>^E9!&HF5ued%8!)AfOlN922aT=jU!-d>^8fWkJ(Q~#)_Wjz=IK|c78p}Ex^^F^c zJ+dn?5AtL?R;vlu#O57I!32oA&6@dR`5!Jo*{cW-N9YXi=^QgkVrok=On*b^L1gpz ztZhL#`m=-j6UlzVtU*F2BUX3WX}p_Q2XIW>T-idn1wV%7J=mrFuo%1`#%7pDLQRo# zRmR%BWa65=%gFsdoE4CI$o?2{nLqO&EfvZQ1VKWPa0`E6IzSQ;jSGmYMr^Ucajw`v zx!Yi&FqI{)v$zFm3}dFrB%5R4HBoexLGcYMxr=O(ag=+g+-JY!!nKP){@{2@Ie755 zE!T-1X`*S_O$x?pD|3s!WC`{U1)m=%&27ix+m}$}hM)grZ|&ZUPEOz+sXOWI*m<?C z9&cFf=)wXPC7LL^zyou@K2USy?3<5WL=RFb>;RgsQhp_7{Mm+u&hE$<Qd|U7rN_(> ze(N1^ZVCvW$(xEeSU;eZTtu+%)p}4djSQpSsu6oANRW#+1IuWc(0aR?^uH9kNoF-& zI&}Y>>`g2=HO9Okd<3E){Cfu%mhpXTpnJ+zfaDG~w%1wTdZw-@(GZ&uAYIl1jb$xS zrauA?<28?7e%|)Jd6*TSIcyK3ZV5!9hdIKhJi>4+CyPKiTd6zb)|}JSOnl)h&XYnK ziyDbUgh$;N`3(U2Si+}aK6ASd@nEw!Y{B#u);^`2=6@Ggj1y7t%?FE$5r3JB=6w$X z1&K#r9|Fg5MfP<aJO334>hHQ_iq`!6>78dXw>|hy&g|M>3zyB^qAL!{l)NJkvTr>| zd{=)g^^&g}n!WM(g%d(zJH>7}2)mRS*w@)h820cJ@4E8cD-uUDw3V$GvCuu}NAG3A zRTu8S3Ow>^f&<&<KaoXx=PX!wH3UwD!)75bWJ|IZfs<)!!qCcz=7O$hcoWg&B&%|8 z69r&UIw$FE`6)cI<Jd?uVz`huz-Hc14AA9zq9TOgLFU^eNn>0BHvbvbxIipuNmpP) zbE%AYEbW6VhPAyBpNb_@F8^@Q-H<E0ETTfAJPSQFcHn&6M8wU^tpXEtA5%1PO4X|B zWVYg|cvONrT1%*s)shl~vlyYeGl+z?Et&$y&_}#t+UAzV5F4;hPTfpq=1?qq>+qV~ z{Qiav$l?K)84;rVI+=xSW&dASdf{8-;OVA1-Wg#D2QYKQoAAWty7X~jevaFh9}L;^ zB?5$-I0kN4yFmF?fZC2WTxtY=KLvxTbqWx{qbn_mcWMxy0O_8G)Db<+?bx~esDdDu z`n|IYXj)E#>ljR5|IUF7QSsE>qL7YPv1>-urvS8|VBwQkyb^c<JZVJu(OjjE7a0Dc zUx{BwcJ%n7?_+=<i%I-AD}7aZoIb3~!VFZW-BKUsrhCvxV`<%vxOHF_<g*A`^8Az# zSnP|M^og~5SVKZoc)iZZew6Y0JgLSoepjw^)<-XY%w7yWuS<Na&vTDjc3=EZug{a= z%*N#tKSToZHEGr?8@P4vC`mjyb6_zhrcB`E*L>*)q2neuxN=rsFP*pukHgRHj{9W8 zmOe3S#brGY8wxK?SdE<6_`WBdlq7UA8SW=<F!+)%CYDs|N60-8JRPm8UiWcTRCc7b z%R7asa634MA`f3MX3Yq*e}*91RAlcDMY-PNcNUJGNTwAoq;b^7C%p3+6$Y}&`mUw~ z5};9YUtJSQivN#7ge-myQkYdKGf<h|Q)Z<K4TY+0FaYZ6o)Vn*7x0fU27jBP69-^J z@<hYnWc&BCLDfw~j&_8+d(D3xGhhY>ruTY-w*>0uZh8db*LG`XG^?Nw`M^j<f5Oqk zaqd6iAr!(-n2D%hQ*`}^0<68O6Z>}lZZ8qI8<oOv3aKqfPg&9zm~j_h=*)M^iaISl zd`z+tGoiV>&#_eZZQ~2z8($UCaGbqUD}wSI5i6hbo+aAgOsze_Mu7`KWt^6MhqihH zg~}pX>ofbmiy_$(dq3^MZKAn&)l<N!^elnf_3s*PODfr*=g9?j-GN*@e!~su|1OlA zYNYpj?cTnVXZVLMSSz*N&ME9XW27>UtRV|LQM6GTr|_CK{!EzAn^bqhjRydWlh{1X zTu7<l+0|3HhvgfT?@P;(U=;SJn7Jp;ko42@dOdp5iu7X~%J66G;aCJ?=4Fk>K@Uj< z%NBW<N;HcaZvg!?wERcaBye4Bjle+d(BdR+RP!dw8v#uO6rP(uUWRn_CLL7&6?j^% zhYUC51v>z+$%>sV>c<nuFU){o9~=Bv$lkH7uF3vO$I#WTcEtB&nLdwK81TSn`?jY) zCnh$A06fIW(s`Vn6}M9zFvz+xDYQMiW6N$11@1L~SHha<w(Hvw6<qtz$L*}pQNweD z8DyM-KkY+=<v1L27hLR%sVwihI_hnleCk_SYgxBaVhDgAE+rM-c0q%VBmgbl1z$r| z=~BF`I}D^wgX6ZW-5)s#SE}(Xhb`N4SDYY?%)DBcsy%APu6D4Ed$ajtHdZ(`B3YE0 z1EsBI4R$+VH97mWvXhag9Q52wD{qc^7Dgt(Lx38ISj&z2d@v^^&CC|C@ANueP0`yE zYIo02L}Ev5YTy{Z#6`m@n~prwQ~YTGEZnbk;?rEP47B|w%dOt$zh@_9^H|X&5!wua z1ihAhuK)r2@BoIxOE%8%7Vgi7Q&2y2k31DEKY+FKFJjgQippYLCf-qjtkW0C6wg!s z>!5}B=yv>H1ubr`?*DXzu|;TC-XzRuu0yVKcY!yjpOMyyu#JH?6txMSh%06)zMYq0 z{jbb|it#)57Dw>t+Bnu@{4Eu(u1^R+22`kL3cB}MEEk%hb$&cS!I5C#{&m)`;t&6{ zv6;N}HhlLXsP=8!R*Y=6FGM#<cffwPqvIJ<;FkON!RZ{QDaN)XefhHFfaalwo-4eE zi)S|yn_hA%nXexdnBHG=_T<l-zM{Q1X-8M*?D_2?dxPRH;u-L4U$s+<K+|I8Zb}Z_ zY7+o9GTc{?-;joYv-4QKd$dl{3&H^$^cHNxv3tTCTVD)`+}6&q)ae0%xuch)XHVkX zqq2#EVDx9iISr$cPEAzPVoE>`7|YqDEgv3C&y3$qy)~z5c)sg4)G1~cOZ;}5{?n&l z6J~F3@qr+OwhepMB3FCmGkxd%Kf_8((V|@~z#o$iK3HK7VWmw78P64DsHSrasjgVE zd`@kRo78Ozg<EI-P%{pJn$*P@ZfCELp;0l@I$=MKSKtE^-fZ0mH=#AehBX`Wprsgm zLm5GH%8M=pw(i3hwaY&ZAR_Yn()_z$cgOaI_ApAXs(<s*%x(K)>i)=k60MU?T`<}} zmHsoSx_!Hc9|H|iWSLiDJ#S77*aT?Km=UO7H_rPqIo<;Mj0x{LZgY$z8tT~)&lj$1 zk)*%me=q+L(SQ({D4;K`jRK4K2}i|GrP@zKn(7?`F+TnLf7{09e@g3^636+-h{@nT z?RA*`0|>r=XhExgQE>wNhde>&;W__-%>Ik@USQJ!g8!V=NdC<juL$BB{=dMni1t^5 zZnwm1+l!ds(ytp=0b^YrisrLNBJBg#4|%Rss!SvP5cAThB+8I9<NNI}m3xE5Z>53P zXG!erUjDJ(WY%(2Pm0GRs-SrrZPg80p^gg2Q+iIJ1Ic>_sV~69Lf$b(bFO&6fmhm< zg&VCJ=98?@)H<Abth5b<u!jwZ7U{qt-VxY~UUK|1U&MH}e<N?>Q)AVUG;MW%g5}Y} zlp2!9k#B`^1>!{3c=P)|eT%ACVf=4FPfZp&E@CS0@E8lKq`h_{)G;^wR1=zqx4^^8 zSp^Tt^vj>5mBDwnrTI_j^7wtZOwM#s8{^n-P9$@N9dhs5CB(&qsIjv>LuouZ6K5z7 zV%E%~YGma}$>@lJ$0V^^xZ^CGOWR*OZ<NBfYpQx%=DybLop_ZbD>A+R4XXFOCe{0R zN@CcCLp8Bn<2^cmxY|&Ny6)=|#um!}htMLI=}q4m1>M3XpT0aQ1jj&MGX;ExoXEgH z?Pc0IT1?4v?@_-vJ7XROPyeI}FnyNa{C?2>wqIm9=N};|tSpfh4j?97vpz!wYS%|w zvsmxcNflc5T+3Z&|6uuVcN!QR>Uf0KPBFPrCD8K~E*8e9b(X4@`bo_hQGgpk#_#L! zecAdFh&g*k063Xr^o}eY>;2_AEM^TXZZZZ9T?rx57tP(`Cy!{oNFGFI>#|$QUIiNO z#kd6$A=kF0m=faUokgjyIT{<VIOg$U+J)W|FI|gUa~}<|z4JlzWY}JL=7nw;sAaT8 z6UA44wqJEIikjY7xv+<{sLo47#BA1jjYShq$!0BGM(23hG7?ub^~98rfKIu?!FZs4 zTjucdloitiy{snD1W>0wR=OB->m+<@QC9zQUzO1DQ7U5~v-g{BtHv6@Fmp1VhuDyy zmnx*nNnlmK`(iPQq{2Y?QE#6?C%DSW6R#I<1^0VR6hDrRY|a3b8Kn!%Oc4S7vx9Fx zN}$(n-+}eN9x)~9!YrkP)mHXfWO`o<#ET0N@ys2kh#v_NS@%eu1$F8uXO`<<Rzd*~ z{k^A>jTcL^hLm{d=Kmu``P_jay)S9#8EW<yu9EnTD(4vk3DMCudbTC&O|X{v*lM-Y z7etZ3Yr(L;I)9{;>k>_%KK?`aTp_k0_<O~BLH~^d|B3TaNck^*cl7A*K3)IEZMbCg cVCM`elG+bBp3YzN*S_>n(?FwK%{t_N0C*g&*8l(j literal 0 HcmV?d00001 diff --git a/deployment/media/install_akshci.png b/deployment/media/install_akshci.png new file mode 100644 index 0000000000000000000000000000000000000000..3e261fa5bac0f22be9d79e6129ffa02e7ebb0bc2 GIT binary patch literal 110248 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%0Da;+s5AXLsh{O#>FWiiv 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%0AK0&=U0k1 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 A<NyEw literal 0 HcmV?d00001 diff --git a/deployment/media/installed_extensions.png b/deployment/media/installed_extensions.png new file mode 100644 index 0000000000000000000000000000000000000000..c45092d35cffa761f069e1c3579a7d4ad8113ff0 GIT binary patch literal 16165 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 literal 0 HcmV?d00001 diff --git a/deployment/media/installed_extensions_cluster.png b/deployment/media/installed_extensions_cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..44c7a1a58967f8f9a5b687813540c9bbc1a79505 GIT binary patch literal 23146 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 JLftO(zW|>ZFlzt+ literal 0 HcmV?d00001 diff --git a/deployment/media/kubectl_apply.png b/deployment/media/kubectl_apply.png new file mode 100644 index 0000000000000000000000000000000000000000..065e63dbbdc88fe5654e7b5196e2f95f5099fb20 GIT binary patch literal 5025 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 Q9joCz(a;6gsoBB)2b~?k3IG5A literal 0 HcmV?d00001 diff --git a/deployment/media/kubectl_get_nodes.png b/deployment/media/kubectl_get_nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..a789431929ecc2de29cf431faa841b75e1492b01 GIT binary patch literal 8835 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 R{5XOnC#5V|BX0WR{{bTysI~wA literal 0 HcmV?d00001 diff --git a/deployment/media/kubectl_get_pods.png b/deployment/media/kubectl_get_pods.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9bec7e121f8abf564802432f896af40a3cc105 GIT binary patch literal 10895 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 literal 0 HcmV?d00001 diff --git a/deployment/media/kubectl_get_pods_scaled.png b/deployment/media/kubectl_get_pods_scaled.png new file mode 100644 index 0000000000000000000000000000000000000000..896c104064a5ceae3ef75e7c632e80e8993f054a GIT binary patch literal 9985 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 Bk5d2u literal 0 HcmV?d00001 diff --git a/deployment/media/kubectl_get_service.png b/deployment/media/kubectl_get_service.png new file mode 100644 index 0000000000000000000000000000000000000000..2f3d3ac0f3fe495456eb1009b1fc4002c136e4ce GIT binary patch literal 7734 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 Z_u$EAFT8IU<{zj`{;@DBHF)sqzW|;<ddmO+ literal 0 HcmV?d00001 diff --git a/deployment/media/kubectl_scale.png b/deployment/media/kubectl_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee6b40c3b03fcf3b4b59d058ff42cfff5200e59 GIT binary patch literal 5804 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 literal 0 HcmV?d00001 diff --git a/deployment/media/kubectl_service.png b/deployment/media/kubectl_service.png new file mode 100644 index 0000000000000000000000000000000000000000..c56024a47c3fb16632f10ed3fec2297d2dac241c GIT binary patch literal 21426 zcma%iQ+OuN6Yj>&#<p#n8{4++jW@Qn@fX|n#<uyzww;sT|Ki-7n{zQU)$?@sGu2bm zZ@pDD5sLB>2(UP?KYsi`kdhQr{_z9U{aZGL2K_z<x13^rUqD=xB}9HyPvM<>H^41~ z<%ECysEdPpH-h+X!#GN6x%~Kn*#F-FGVD-l`s0U+gp`=D>TmsvY^XozgCD~d>lMpf zh?i7znSWsC(2&vLNa_rGEzy{0kUk1ZnK{JB!y%Nw$^S6J3ZwR}BmhbyAjHKKkqZeQ zV%>GUpVm^pt~eVy91J?Vhn-Tn2veWjElRGoe2zFf9DX5bBar<Of(PqK`k~Rg;YL*G z$jZF?Uh<@|P907-rHx(Bno1L8PN&YH^87=B??7^@E;BV4rBBItA$D(H)kLf4hD_WX z$|<L=e<pihQYC>Wca*u;zeJ&R>m07Ez^}3aX38DshH@fkB`q5Qb=bZj;7Os~^@cZ( zDpr&h2qUm-h{?GH*JWZdfYOp!1nvHQ9(4)$Ij_-YhYE++V*+X14gZWOlXbDD<(l7N zuK6e~D2EAmM0~#P1QP4ZCu+lfiMlZ<GAMwQ?HhnOoR)+pkI|Inygy9VJIE95(p=Fc zKSTKt<q3ERujy%}7}@gR$)FzeO+QLvA%?z>zPP+M4C!^Sc*iEm09u6)LR<9-D=)=H zPMoa@kAWH|4eaLU9)8#jBYtWjoy`l(my#7L%aqrt1kQLFCUlJP85b(EplYi==Wa>( zN@b6`dUDR~$Gj+H(%!)`|E&o|I|o=P%V!eb@xmNM4E(bqm0{51sbM~S6qbri=N=HT zz*4}$!FVkRdt`}!#T;0zUb%3>nH$viE+2K`VI;Vm=Ud2e#be8TxF$>!Ro8IRisc0i zNZ1pSdz&)-Jg=O0$@Y|mHl~cnQwyza2K_|I7M}QRJt~)t?FOo3kwg5eYZvMi_iH+4 zs5;jRrG)4~l&DJHZl`*!<$`xUpnu1a3va3p5PJiT81`R70xC`Oe-aJ^Lml3K5*w_p zG53Fx6<X_nGuO8?PvsbK@I4N(L}?pk{J$CG3*u+5jMJ)UKCU~EHqnpc93isCLqA)d zjK*)<DD-k9x}5$ScxOXN8qsyKx(lYg{)r!+XJcR+ft68yrnJJ@SXx~XT78P+H+EU+ zL1<|c`rovON6T`XV1tXoZbwEDSVPzP`_)nV4efBM>g=lO@6mSnI$o1ZQgpbK(0i%r zP!az|=X18K2^NNyN)##vEiNo@38_L0!f!&1k4_W%qtD1xh(t1fRTOEGR8p|eg<M?x zP0RS!*-!d3b)`vX4Bdf%>iCW@1k7l!z1Mi%hsj9TVAk2~^8WO%NvM?J*}Tef9DawN zwW!Xte2bsCkGl=!9aTc31*=0V?!v&&4%72@PP&-Qc29n-w%=vgn0N^1TWzuLoIGF_ z_RN3iSw{zEV~9*=0$TrcMo|mlY;u;IDSj`@R843*`Qti1h}6xWSbN5pttaOcsx|`r z#Y$h+1np{B11E|2<QzLRR#`rsGzJRNt4<fPI`Sj`q^V7)YT$%4wD={r3&m>fAP)&? z*q7;ChERzPWlT)jSDndtXv#_)z_tBh$;dYDKTW$9=<9GFQP$-*)p2s#3n#9S3Gp}i zlvRd?!Vr9rDn=Rnr}xNMW$}vtx#AGi)NxryW<B1U&xc?qjLUks7^WDfr{0i8DrEL2 zN?BYuBEfL!Gv!uht)wI9=jS@@Z8v%v8WV8)@)R)R?*{JKchY0g5@WQzT{G~@RbUL1 zSYWDZ^1^RQP56)TNF^XZpHIYL<8<a#G@LJVxu0TsI^Q1;S0dH!Y811?wXB3l)0u~Q z?mKd28BmcNm$YR@o&vOeB$<j-m;e3ly5Yk^*sAR!)709<qrKeV8NM<P*sYUm<%-ec zsJ<J>aaDB!(c;T(Bc`R4Cx`p@uvvG<i1ce-Z^eMy$xB(M(|I>kMmblHV>5b<=@0>z z<EKw8^PJ~It#(^CuUHh6V=QQdoUfNn;It-U3_a_zfgzk2-EWla_Iq6^gk^f%+7STv zLb=}K(0g4P*^9!||1^qO3BRxBT>9x+?sfEBUyx?nEWq#fDP*p?%<6pK^P3Fcj$?~_ zskKLsSTR877egpPqzbnQ=7Q41zT|(l?vI3wBj&=14z#UEL?fJ^g?nqa*qmt;&AVNR zB2@U>wwAWOma5OSUg2_@d$s~Q&bDN0ezUVb!CMBo-AeAq3OS`KM5rzzqace9cw2(D zg{SqoUHvwasW>TP6!pd*D~8ZmHB#ICsxnw7Gv(aJxZ{hR`$y%)0s+O!6-_Q4$y9g3 zwj@$73R;xZ4Ms7NLC~>T1F!Vz?91xz)&Mxra++~ZUs8!Lb23E>^%$;GRO6TEvZku~ zDL89%R&lcbzHdQEe6T?v1{B1Mrg+a&{W<RR<Y(UV_DDzCdD-=*&w*9JlpXVFmdNw@ zOdmb<R?hIK`CqPo<=R&4r8BKHWObZ@I0$P~j6?;*gKLl^Eo(JLw&~n6t~OMvxv6&g z)4_0WXt=3EuUNydE_^@49iN$GO`<jv%Bs!}&*V=obfoDMNKNE$u_ZC(N^~$M@HEfd zrif6!x2~51m9T+oU<k&kxbJ3(s}rM_$0i}cmqOcbpRXLd8vYLK`Q_Q8rc-6jg5P&u zjT}J(Adgv_wWLJmjTeK&YU2Q3FKbxR`rbcFLdG|Tc6^U#+(g8*=}BNCd7JqE=qL~# zcyd&S0HLoCs3)Z~1nwu?{<~t|tEpF5nY6G9VBzwj2{)wNF!&mB<zbQY1#wHuRsxQc zeKm@9jOR2@8HN<IY*05z^nGu7U!n`db-ajxf$pB_(+ntJX2*Fv?U$HHaLCnF$4P|3 z5dZ6EtHf4^^_))4r-ee=-mS7gxOj*g+ehPzIS#Kaf$th@GzIDRdl&|FdB&6wque1n zVDkA11%CqGV84>h3e!|0;c#rFT_>O0e>e-GfHS+Bpu^JGT>B?BPX&*lY1sIT#4NjT z3UX{)TIN{@@<>G(9A#Xe_aQp#)xs^5Y{?=G;n6aL9W6UjoAmpEv%ZMI^A4!Rb530w zc;!4j4Tu8ii6fZ>8bkQogY20-1)lah8)7-1{)ZtuKR~UR0U?}<Z{U&tVakr<smx|i z)c?>V%mwZL#g%{Lso$NrvVH}~(ESgfVnF|Y01CSB;15QQP}xd0K5o4bc+fGZePAr^ zNG*soJg=*nR{LW%z{&3Le;CGrlA;V_Lsp53PNt6RwpuhQB1yE!1A{7sdP31_{`$X8 zVM&n4l#d<&>3pKdKmeS`3XwG$oyH)NkC>wDxH=`IZLz~QR>jP^4QNyx_ONX5eQ#TM zl*Q;a@gOyo8U8D4=M+IrM8$8>AjLK~za}M-ML{90KCTm~e|oV0#2&iN%t{dDi&-!) zlFgp==u7UeP|oF1f43ZzjSw!+@w)0S@yZBmGK^0w(&=uW<>SFgGy#+`F17qy0{le< zJYC2YOps2+N%Y&~d@`G_HJgI=U~>tIW`PZ!+2b-bpZuwNDM)q8iZ%voIo}QGN{bVb z*tpa*^OA*t9#Yx&oIm<gr@_F!iHbCm<845P@1;Kmv4NZITGnsy7T#ObBKI=NvV;UU z?8&%xnQj)Uci?p>oO!wbsyi?Wk*j%<^KWsnHhC7`^U$LIRb>Ykb~jGGs3Vi9&InXn zC_^RI({X3ZKK&8BsRLQnLB9xuX$sn_>Mycs)^ky!$d)TXu&W54-)^q@r^H&!$G36Y zX)0!L`j_SR=|aaNZoAE7U=_Kkqadqor`B{JZ^!7=$3j`jn1wWs<^+U?td_uU=dSZV zDp#+Hz(9<u`3+en{*D5|MqW;!+MsSJlz9Y$z8AHNsC||N&*`1?N?zSTl9A~fUzkak zqdK&0>=>t>W{40l-*)lgC|+NI`AORbK%64mzqX8T$9R3t)Q3V(If4~6Kc#%gDN0v) zFprJVJk)`%f-&zL2bWWQ$jV4DQzJSXyW4dLQZ&_LED^GC&xFXEM_Li@wF!?m759rK z0;0>R!Tv<~JTJ~bY=|*>^U~^MA^)Q~5#dl6AKG;BUR=CIb5fUQJI-fq;V;6b$0NbK zlT>ce0=fUcJJb5jcJvrR(IJ(mb$5i0q~<@Py#dK(PrNlx%|A7afPwb}!roxp7t*vT z=pCssErBJ(YNus)>5^bkFn_H4faoS+7(W&4&s0EPUsqR$vzI(a?9SxURBd~j`frRa z8hKkbYBM687AKw_yJtPgT*%_mjo|}%;<6B9TVrfM7^Y)PmaM~^5QirMAQuRDM|10A zeO~z%q{d*ienWNfEFH_xrz(olrn~cW)Z3H1yTzN$@6-gT^G*uk%`6Rvx>%;pQ6_^@ zp~1;OCCwbgxziTYnQt7_4z(yR`5eN`hOykG8K^9LW{j#*Trm80K2#}`KVk3QR6ZPO zA4~`Sw}25U#*>JK*jw{17|JCz<_e*2ZpXu2X@qve@v((+-402fBbxl)CmiGYvQTVB zHU80{4(oW(V?8Mf=Z)I*pv1KLJ|DF0VE(oma~MqGj?yBhGi=dVvd#AFL0rR;lj?i0 ztcTi?l3l4j6f^&f*Z!r9<%;B#?>XJ(=@=M9zk2B(P0OXZx?)*Kn=BpThqb#B7h0TL zKNcHF$1IFpE<ksiO7_k-oKfaWhz>oZCz?1j*5QJAne6W^o?Jr32k!()A5FzM0MC*< zeGI3481R<1Tt#DFszzL6?Tayr84j-nj(pmaKR)_^x0MPf&+5`F@*}ot7%7*UY!C-C zvjSx10(PfMe^-lr*Vh`E{GCR2-rpr}=$1T(S!-WH33dTHR+(2-<h-XY1){?~WoE(T zKjfsAISvKhRPYprc7Y}I*Bz+{?04xT74phZ3i9}wp(JceTGMNJ-5(Uu7x($A>!qAc zhj&;QNgxPXtESF6_yTY_pEgi)-6TOCIaz47Te3YK_X084#jUHq9H&CpDtEksG>%m6 zoDCyvT?%v16NSKNS5H%SSl_hVRuYOb6Zb~xh}qUCFelA^>2&(~OgM<E6T3!<>*N|2 zlk5e5`*Sd5kdZ3NZ!TJR#-|UeG^}X?(o#m+^nZIQ_pof<vC+H~30*W{Aby6G*=;MZ z`7hMt+iB-poHrIP9l8!cv^W;W;=4C+%B{0k)coMiUAHfrS1$bPdpFAp$j!+~ez9#d zj?G~9=Z?)Zn+c}BpxqEZ9PC<(dZc1<Cs-+#(rrIkdQ=r#wy?A6aZlVsrXz~SaPVpU zkUulB<1=r3fGGb+<#3m=ODS!JEt{m0-7fvM?{Tj<tk~&un=;ci!Q+%?q{2^5`t8o% z*pI5ep=g5xnM>z7dqvo)?QXPg61z5^rIA`tO+`70UK{_}u#g>!O`KL9e?Y;ol{XM{ z)#VCZ<*>PJ>(St79FgnXBt5Yf2nEG`5nO8&LeTYb3eF?nhfHP(`fHaId%i0*Y=Amw zeWh$(X*b_)eG-w^h9oRA&N-}!&@?5S0^FjcA#A?l5UAWqw?mwj^sRohF({y>1x;b} zeJAM}M@7rW42I45)L^u#X7Bncd)=E?|EXyxn2>aj=gAkbVPQ8Axr<lu7tk>9qKm#n z+5c`hyZa#2thnI8Jc(8Na6~^PvJ27-LLpQS=bIDRuL#O$5Kqx6j|WAEYOvI9_s`uV zh3&9<!$u{=hR@9^(LM+A<^atFjM*BJJw>+Xo3}4;E1B&FwI!)2x~ya-g&{hvCV%}) z4|v63b(#BKqkTFjE<tWkD>rF4k0$<r-8dM@->ZKU^RW5!t>OLF7PwC&TNx_Bdi51| z|04q!f<@mnbo7r~E0&ySltS*2Lzwe_9O3`6R2IL@i2r;BJbB;$OHYY**SLdgvc7No zu|$vI^e^{8r^q-9Id{Y;)|$!ZDd|-o@6ZKEE()7?G`1<4SXO7nPgf)!?tFv}QyxhF zI#CxzBNu+cQ6jCWQ0m^yT<#?*50DAOJ`BCcBu1T;(PfyW9OcgG<g3e{D}}+bE{zkk zRaI}@u!Gkqk|6peInFRPtrj#C04v%D(EuR|WwA2RIb<@VKOKW4^~V{e9hzE9Jg%mI zm{2)7UP&c;zTK)?hK*)SOe0-c(Nfip?cRCzh<*++GJ}@4B^#OUP9}vwiw)F_-p8+? zU3v5dtJgO%D%@V`x;6T=e-eE#{+7(YTB$6t^Rq?JW9b9GQN;(jfW?ySs?ZWD+Oh~a z)_npIC&L`8Ep+D7;OwePgz~aVSQHjZc_1Dz5&OQ&Dn3&G2iThbyOQqkBw7kOa|a_x zUqv(wAz21VY;Z-70m(qWbpy4Wtz48rlqERaXy24wa7wMLT@Al{puxWc1Y+`Xw;W!Q zhPk|Rvz}a3IUI?VrD}b!t!PY$A30e4BWfccagVY}i_3N$ElUZ)pRCr@xdd}^H0V|S zZ~Z$C%d(f=)-eysA?nj4=ZVu+tMD<%PE9EryibL@GvnP4>X26;8^`6Qb|*v7GGdo8 zFgrFaNPXrE^nHvmtl_y*9?*W6_%g+rRF@c5S!V+o2>&(HT~U>uV!2q<iAR0q`Pjm` zm8CjxpPKkP*ZsOxqwBolg_W%Bd<h|<CU72yHgFfXPF+w=`@UCBWhLM{`q5)YFoEJy zglBX(az^2Rn24xhug`W^P?olFZ!I%<mHsgH;mHVOIz<qtnDpA<^V+;}Cg^-r_=$N` zKC^cEip?o_Uutpr&wHsOQcO*SZPRQhu3QLhR~g(x_4-dfKhxPO3>fced9jW4PWge{ zrDsw8Z6T-nrhlxg^};Pq!G6*(LHf0}rzV}M6cf$DH!RRFv(ZpWEI-4FQIOGKDJdz6 zkw^q)>%W}F!tu9(!Ym!X3HsgF;cjth5+77R_;&jowHMDys<7AFKJMG3;VFgmQKs@S zmDlnZj72^_NH7qxn?xzI9uI-};~w&KDrku7p-MF~ne4mWMKvI5XrQw_ydMUH>_uJ) zx|!Dzd2ZHoE>r`jH0<vaYIB35z8YHJ^sZ2aF~HMxojo5$z>Z>H%*|^5VlixhiwZFh zz8lx=fSHC7=m42f&d3oYbo7{o^vfQ12$cB5+>-zs4t)=VAJu!6b;}zaqh~c%C~j$D zjgPEfen;&5nI}871TfR-j?>9a=$ry~W4TZv+lSYq0ok<r7fwfEn(j(QFVZP3nq$}) zOxVLhH`Q}1x=0u^NQIh#kUogLx!DiAakeh9rI7T2+%a&=%b~<{*(Os#M)GYTRVW|5 z2bymd&n`98T^Etd8hZ)c^cn)6G|U|1!!?i2hIiS$`3ls+3H|yey8qcuv}y`GO(26P zX2Ok%%?nH={~&V=D+b@g;yZSt;^Vh_5<3~mSG*iatto@8o?TcW7T5kTGQmq|<$UU< zA^31I^5*C7mn1LdnBw#Gm~P^5mDG_?IvZa63qIx#(<^C94pRHRLZ*DjY2rC4lvH7) zSU$0ETCdRP7=~C6u_w%5w@``-H4-s~*8D(yQP5dO=CbG8ywNxgLKd5Y%PJK}J<<*C zD!!RDq|Nq5=ij-+lhZjfCmY#Slt2L^&5C$URCJ<W<uz7oD+M;5N)+J2X<}+@B>B>v z0~c#dozsfIbX2(MwPf$7V;f%TU)#?iH8Ib-uekE3u3C3zf(%(cgJ8o^%4~En>~R}6 z;Xb!98WWms5BoQwrU~y)Wrq-=83;aiA0G!T`pzc8alond1eId%49tCkQ_m|r-@|l= zBV>c>ymI2YRVc=2pTjZYY)HM`Gq=qm6#-%#%Pw;<lF#8SLLJ|Wjh(^#nN+H_`sygz zQ7X%+OcHQHW)F47DQUx!?93$7FE^AUY-<EOTNiD(_+#R^s-u*k0uzGI-y?0J+TmM5 zs0Dz-!ePNIC;glJz<CD;zsneL(XZzLO5QGRxrecfT=|}p)_F?vhgR?7#wIQfkh<-` zf2}G9G;QDyLoamh7q|OT2ptp*!a?WS9a)X%GLRdq_Q3mH<@tp9k#9eRFe*E9)+8)J z+<{!4)s!*eo;Gv}B-v}WBzokxTN#hm$JUzHBu&N$<F&O2W4vs))mm`fo(I1{O%8%& zWvRr*uR_lo42|ZaY_%eG`l3hPiU@$~q>F!J+uH@^J^8F88W{$H`sC*2T+-O*hdFZu zfrgt%HSj9QG+r}bN=c;NMT~hIN!WNZxU^oI8mFA-j~pb6lIVUVMRlyHh9qnwJX#7A z&Em$f5Xm`3z7AYcgD(A`ArX$R(PDFsMOa@u7902?QNB_0u{&v&<8QQ?P#rX8d!@UP zD*oAx23`D^QvlB2yU(HgC|FS6%l2nZ1HbDTPKdm~!-N?BHZ%L-@hKEG4M~i^)%9j1 zjiot8M2R&oZ3$<|)U-w_q`uIVe72H4@nm%~H4tte%_;^$f2Zl?uZHyVkJM)uDRqpK z6-I@ZA^PU(8E5jrt`kL<WKFdoL}`HkqRdqdb*HmxO$G{PS+ZM@RHdlt#EsGO2;hBU zN$g7fn(I`{!wF`n8?cPVEw)hUBE9AR@%Ek}jPF7tsw^h>doe!38<@^!1yvRve@%>{ zW>cRDF;25duMH8Ttcl>|L+)+8p&9!OU!M?Z0;g(17qEQ9XmVI4cZ<T-T8g;(<mD8F zjQWaX1B*4py)?iu%6jDz3sYe+ox6VcszI@h7DTPC8<CrQqv6GU+HkDGB63(EqhwuX z`n+!SWo6euza%_|mMO@YI3A12Cr7+jLmUA|T-b-Li^|`AT!G=ErT5AS(;<K1Vf7^E z{i$3#x=8jGCh53!=Wu`KfF!;`|GO(ggzTV^_0C_jE$RFf!1gsZ-;NakplBnPLLp;n zVVg0URO}b~84t!Ds_Cjb&qt~(SB`ktx{fr9j^YOTXa`-Wk+vytjo^;wlwxIXC%6CS z(79!*$4j$<(cI@D{f`_ITN?>hJq%BPJ6cxV=Q6IX8w8T(F?xJyWyBlUSY8du-~cHn zEuODZ$Ae1`qd>P^rhn(HNYigIN<*o)DB7n34hK=t-A_{X?r#R)Xxa0L>AK$PQtizj zL8W+EiUfo06~lm{Mr6;F;3Bf4!q~YR^#nu+rFBKAM5A?&!u|BTD4_)2Jy{?MI4xNf z{&VyPR})4{kj(Gw>HBzW$80~!xlk&M$HEXl{yQ*`=NHllnYe?RFIm|Ue6<GfvyH1Y z$*6rM#>vm3Z`a9TYdvWpwC8;EX{*n_Ybt43P_2@=JG9;(=|RuCBD~W6oWd=taLD#> z%G-9nfKIxj5cD%$?2Mcwtn7X#N-&FtZaA7Sy@eRe+%9#}uA6c4^Togxn8eA<FBqUs z1*|G{dOUcOi`Eds_<uc){LGCiN%$8*W1#CX#ophn1(&E;c_8N)%*r9h+=C}Etl_%$ z3a^nStv0%ph;os-*5Bisq@F3IaQdHfae%N?BZ|BrL^0ID+DhXUevA;_ote}6lsTQF z?R4vsb8{6b;UzKl6ZaOxY_mSh#ontlsKi6RSwjuHYV#lKoeXF4TZmm;H-6`9Cr3W5 zj&r~O3Ji{`+A;}^a75MA+1$f^$Cdugl?ABHr?su_Zzb0_iA};pS0&<KttdDe5M&%U z<e;{Gau-jB%U2hESEKBNZu)%gpHL~3Z3s$z7>Uj2wdwR#hAq7j!1SQvIwIkB9_h;R zHqae;2fq*dlgJaG@5aSLCMG@5KXREV1M?tw(D|6X)z!dlv3tYZPFK2{v*tx_daJ`~ zF*)v4V2|Jlqf8)1OxG|Php29*YDQeqc9){PgoX+(?D0?nqD$OG7*YNBQdf^C^9pbI zHW>ypE$3rx_zA-NJ)sqxq@Tj-+H+g7C!;yUE(Jh`lPK8)nG7Xx5o0DG%$j6)G@IEr z++C$<j4sJvxK(*iSF^Giz{nSTjRa<!n04XY^gbDaU(tN_nzP7Qqr$+`E5X*JsMKux z+5QXB=j|S>r(=7T(%(|4dj}xlM2K1bdEC98dEYU*`H=A$)y1HdD&E>n=dFGY{b7zB z!A(GZgEDSTg}*+{_s`Gul-v@~09?+<?=pe1Z}<$S(`yJM!{R)g=RFFlHeh_vy^jFt zlJedmg=D~D0xT^S%>_;yJJkgUFRvfsC)u?xmSyy8S6FqEFqv&~H&sVuMk7wvk$Emm z7Wlj9oe6e6$YmzvDopT_zCp89ZiUm5JbyiU*xg=~)KtHSxr<B1p@yP!bolnJLka$N zJMm30_kGPJ4o@i6K_}ZRk_n&@|49Rhm6LNz-yxWL(=s3SH4A*w&O2NDBCZlu4j?WS zTS60GhF}Ls1i`KhiY>8EevFFiP4hWjgN4`)eN}0~U~R?k&x@_jF3l;#BL-(!O!Ure zdHs0I1JVAoLpDN-98|rC=_=4P4B(Agi~SnD?2POjp$uEjQvVG(yGf><lu7@z_-4D( z*=FUgm2@2IgbCa*+NA_Gy?t14V&?2}OXj2hMW<e;?6@`6^Ej)wZyj|1tejH1HIs3e z{*b75n?$;K&=E&*ivib=f3rDLG4OiJS0T9nrGvwx+KsrG1lr?zz5Qf{OcG$c*PtN- zuZ8fp$P7hm+&s|xTu@EyG<0Uo#QQtTG}$MONt0{;Oi@>SVrV4e%$A6L>U0^CooVoL zUa$y-@#$eZZ2#eF0bca8qPgi*z|e8k0|&VxMly$tDimkdI=|f@jmSRe_&&z;S)t%p zTd|ckxhqZ+0=bg$=v>QT^9g_QWwCBx=%X@sRxa%crmuA2Qb=4pBwtz)*i_M!{>c~L zbL#wp(R%TOR;%mOjJUYMq6PL3%Zu=q3w4LyQ3kD#!yZ(@N^Z~Nbadj{K{1NDEk+B$ zwVhxo^dK^g!mqZjO!{sEELW%bSx)zp&uK<4HV5n~WwjP*GCk(xQ<^knSKLrc*|vNi z$8`+?w2eqw+8(;vC`(~b6gcg37FVT;St0ue+kVA9dRO+jwfX(<W%~VQUMwzIKAeQ_ z;I-!Xlr0q$Rc$GHYj577q(vx^2p0(OlROZfguos(dPH1$%c$ja)J_Axd=ycl+d#SA zY+|rM=jiZ|T~O2YwesZci0{R2)ac3HV^+wZ`mw*o|6TIjck0Cqq&A3_m`7^tc2qhi zA2nH%AFaF^u{z@N<HE|qezB`VSc6>no`yxTQa*6C&to<TRvTZ*<pbg^{HMeZQ&EWs z{(E1~74kEb?n~3dr9Mwx8!b8UqTEM661PaK-?bmLzU{qL`Buk}6s2OXxwCgOd-E9v z*NW=X<Lx=``z4!@m<N)kv!4+BjGuQ^CaxsG(T>&7_~dHyfl8Alql!m7%(Xv33_+Pc zN(>Gm*rldCe5H~#dC;`h2)ysh(g0-;Z#%FChr37rYVMpD>W@{ty+QDJv}H7$q_m%@ z_7;n<npAI3S7kH`4K@(KPj<*-L%jR~mZ|d23oK-tfzEwtkR!DRO&Bx`t$?J>tCkq` z^GRAo>9KDbwrTc~7I)G!yH28fc@>|lhY}rnmEKf$eV=`s_nDTv<n-cE#85@iddB2r z)>GHH_uNY}3e$8~F**IVmr#yAm|0xq?|nLBTh~yDQWa{cln>YbqqriI>P3wEa_}fu z@9y&g?5<<d;Klj64pl^Z*zh1jH!ozZqyecCZK0GxGT0JpDg0lPh%dXGW+Zjxv9oIx z^NL~XPK|M18K%_3ElFJj6Ce}%F}*xAUx{Dw^kpZ7m0-*BLonz0{o)O=%d5BLNY+z{ zhG^3{xu2JFgyHE?FPGlWv+ii3Z5ehTJE{y<P|PD7iZ73k8jabM1dn7lRFF>JcS!An z5%GcO^w5&EhvWD28zCc%&*Kv*p`76JoTrVy%TpIS%8gZ<C&=_tA97MPo&Vb)WB+Ob z0E#8d;cBQIQEE{9NITM&hW1X3bDp)yDEnps@y-^?$RQ`9G*RhT;=I+^@Y3T`oeb~# zxVQ3pS;0Zzq&{ya|KG9)d``#B&jQ3A-pyyPsSvr?(kfUfGe8ka=XK5zt@`Bp%K`0B z^j=x(t{I@MAe$;R9Ce=jMXVUQ(5wd|Cqua|?Bw5fI7yHJ5?L5bTn<SWR7s2<jYEVu zF!GoLT#SJP7R9!l28-rHj#?Uxr>s4)XM#9?9Z4kc2l9-8r!?dztfV;a><oeuD5?UI z7&3=w5<GonKssd*BZRyRj(vs*n|O3+k)@bRM7xX#`k<?3hYc+Rf!3|GFmf+OMt1Og zI@^#TTi|IBF)fl5S-cPQz6c7sl(LYin_iMB6I~ILnzLkIj5#BgK8>kPf8R06>@inK z-tL_-Hn;>?c`Qc@C`3sYEZ+O%Bx~q~;L~HGRnXD7#`u_|JV(H`*pg)x%FOSTd<J1R z+_V@jAGOizvmOKdEt_M*xj@N+DG~dsFN#{)!3VBCE6D5p3Z+PBV#S6N*%=?jn5WwQ z6A55Uh<UgFG8T7!g-430Ch>uDwC1!E;~EWyi;+2~K4Sk0|Mv?mor*@Y3JZg!s5dNJ zLnFB2N1d_fb#glAYlr}IoVh?8O^2q&YE}J#Wz)=t>-Kk;j}Wt#$W%#@EI){&eC8bn zg)M?8JTR6dJSMjihNy}}U<p;2K-gegFgQ7!EQoMcQP=<h4Hs#d32~a5D<~0KDQEy? zg$X0vpx+(+K`YQ5WB6ymFSf`@YRgt4ntB=0ag<C$MYDIY?2zLL5J5{zVjZejB=*wg z9|k{~N1uVkOOV*REbA_7jc|&xJ}NRZY<N(E2D|wkh_}K-nSjX9Q0zq^WN|8nk*eMt z2@!N7IzTs|WgD3Thg~`dgawaFvB5~iZ0lJ4=t~igEt(%0yZ*c{zw}<*j0Y+;L#8p% zzsu=x@2KZ?b*O*G2fdvn9uZAA?CzQn%DgTLln{x3lCTi!&5>R6#YzL*y>3X%=QPRy z34>(0mduf=mp!Gn6p8UU)Y7W(8o9>|+FUGHKZ3;M2`sL+(M;+@)o&*hIgjVY&8d=b zMrDNh5U&0QIVzD$dn|Woc^F@LBOA(N|2D_JDEXvb`1JHKJ_o1&<y{4tXCwoO+R;!T z4#G>tQqgOm*j3{KQ}Tqspx3Br0M^@b!y13?sYYPfQnneWE!R(t^pX*-3qqX!V7iVR z^rfQgV`_6Z`Y1Ih;sEGV#L__Ni(vz+E09qjy%CRCRZYc}e3bOq^NnnydUZ|ZSS(>1 z*MBt5yF#Z(S3=wIHIA-ynpBoa&eP4eu4q9=T&a%MLxWliiN-l2dck?BF~e}>RU~4> z1j7GO9?2hv;NUr>FNYM+0@uKU;dGH~LUcwbN(rYqXf^c(mehP*D@je}K$jN7t2fAi zekdYH!WSVnQi~;%I!t_7=l;c?T2|$UK1f7|F@Wk5BPPY!2Oo>PQDO48d^f@r3th2f zTRA~8bsd@oZFF^m#uE1&(pDuK1ls{$P^Vbe>{mso6aB~W$G3QpFJ^GTOx)dDH=d<1 z))~<$uzc4L+I2-2P}7baa0xBR6YC}FFNSpULa$U81xd-SXe5<Nj!@1I%RMB!YpVe2 zKC;cxA3a>JA~7`A`(Lj6eE<LhO5csqJFBpOZka2Nk85H%E-ojoS0IP?*J-A8H&ev$ z33)bzp|l3sa>~sXc*2O^%Q_Var3@~|or1UWk7>{<=Xi!rTOagqgXN>4Gtm~3;NLz# zndR#YuvY|W0r9=B@z`5|D6BT@kUgu<NcvS3i8<5o8FFF?%WRmW8EWQ6!!d|a)t1I| z;fHt>Mle1-EBJf}+Hn-OWsPW)5SI0q6pFSP76?{>VX5%v>?LQE!r;&ST!aT>ZYKIt z(+meRwC6urGWiT92L<fXY*KMpN_4P)|8T`3j0)KzA+kb{L|IIr1eU?(F`-wA2FY8& z`{jiy-rlHLVXBjKugKBjy$5w#&jj_I_ct-IC9@^lU5^(|RFkNqBZmFfEH(t=jyZN@ zw6sj@W7g$Il9&J&@c4(a9TFNX(reUzD`b>6{)2(57DPERl_41ftRVA83r@f~bU7r+ zV54Rt*1|>=<GJ*A9ov)wB%6DAv3Q>_Q<abbfPCTFPQmgP@R9_t7P^F%p=_Bc?AR;# zH+Q9bZvn(GF2qev{A(uESfzA3^IvEnE7LZZ7Mil9L7m*PP$UtxZ7B1P$O5VnhQTw4 zGelb=eAhJ}9dvLtp$bVTYGtJcG@5=@dsDV<B67=MH4u79oZzCVS`Xs^?z$uY)}2=B zQp9kAWVAu(`*rdFGw8McLKuD%7$JLNjrj6NNWP36I!s0M8Mi<DigXj1W%Y)&Mjt}w zhPeUChBYB0iuj5mOblgAfdlREE#vWKrRt&xiPl^oyOID>kUW4pS^h|%L@JSnDjm@} z*906tK2KjHgX52p-`PS-rJj)rfxV%SnTpA}*Mxkc)?Ad(0;FMZ!e$s}AjbVJFqsgO z1tD&!C$zDoiVf^&gA(A+``BTurGQ?DFc}z3#7+_4e{!G?kT1bH;GE&gP}oI#gql=} zzSoq}jZdH+@X39$n5U>cj)JLiuYuhEWpHwlY?~o^C@>=J+OgW_D%)33D-#P0bENAP ze`&W%z97!hCxPLTHwi_*hE$@4i1L!R9F9#<n00L6$1Wd$iry=(f|<Z)cr#fI+BVTJ zGNvsgw{~h3dPx|`6F6DqshR{yT~JDDa^^qdMC&MKv})sH!iGBAxEm(Hnpf;n(r3_u z7=w!xws#hk1cHCZ_*;0CNjhx8Ya)=T9=sde5+P;{U1W7kDIm-X@RnJ45obh1;sE8f zqh2WsY#QYoWacj+6rYBx+Iw7s;kJ~ko?e6ItLVw^kse=0N;Sw3awujXveQiWFf)8f z1GZ@kbGZil)zt~nrH7<BA7Nt3NmT?RlaFP+U4cM_u_)eezinz>7){5OY*9yCjTpJj zH_6_JQ3;(>HDxXzy)4#L?P?%e_>ssap%ZTrHzqK0vC%ap;KpXHNzBqZ8RwFsx*vCj zf(*IK*<$1>_SvjoK~hf5TZ5H<7p}s1WO)G-zRgwG^~Hs@B|(VQ*_7}`l5AKZgToGG zb#IpKm?f_)O2NG@DbNi~!^+WekqW{`F?*mqDIZ<AIT!rt%wAk|gJD%v+W$J@BAinp z#R*;v(wklOo(Q_yP*OTAtGb%X6*QT`Z?F`)os6CrXL9NxA>$%YgH@yhZbPmhqi3x& z;twpG{VNX7am$~dM6sy`IRiMR|7hJ55>#-{pHQZNxNPyE7S!q8sKsQ{qaJ80o&~(> zW%z<-QbS6D!>x*fi0+@+W^C=T&tr7n_%3G_SQ{^Q1RK^L*p_sy2lST|uBK(gFSft4 z(vv*NDbx6|ZG|BOk>Ln^?{hM)^!@Bz4HRm%BgDjOLn5^kTqHCw{FR!Gy`KA_ywV&} zgIPY#qsBbCRX#r#_#Fh^ACm9-!<tcwerQy%UZWdht7=n55{C?I+^UQAtUOCSL|RDu z{pIa8QM4AZQ?VWBZ4FrZiDUbUhbYUgkwjS{2Vd!DG<7UMm2TKZ{VB-z62?FHMQ8A3 zY`AE!mB})vv9eZ5tkCrpH~E$Af85`;L#Y3L;iSeb(18t+&0fSo0p}EGMDWM@AHiDv z{b<EPWj5PyAIGEe+b@BJkL)r+1#E!&`NI)B5+7yd>*0s!nSRyhaRjxfmyEU$1<l{& znY)>O5<~}SBF)t{<*2aYP2Kjrmk)#Kt*_pKq-pL^xj^Arx6*^vT-*1;^Mci|rRlCN zs;q3%6T@h)OndFG&xD#B!P@t^zR0G~ux*FnqRJB$d;a^EKJJ27BWlMBL3;0dGXsAC zm*vx*^S4(AIEtK@A<A-mfo*|v8_w-9pg*S>QyJZz?r)uw0LEsY`~9uBV#3#BCAaZi zUL7k#Mp3AfHK^eW;74Cx(_L&Qr_EXjzL4=((`m{FA)nv&o>rJZ?$gSF-X=~mc(gR0 zxj8$kfq^<b&*opG0)Hu6=d9mj4-(R!-rFD8X5+b)+K&rU=s)3MliLSqTHm)dlpu(W z<B3LS7E(I*gsyX1au~JlmZ2amJR3+Dq!6M))T#if0$jJf{SwVn9o=dRX8}4Sl1*C( zb2LE_@Ew*{1ms-JhL@jSSbnq5dP~xD68r}5j3`Gm3|0s8b<h)xKP_KN=&@xe<kCCF zT|tgtxm!U=>EG7!;O0~L@3w6bu$vDQv?SawTx6}Vp@z7d2I)@kn)Uh*=W<XhOlf~p z>ulx)yvP!kr1K1=``zSDNEygPz!cGWvphpOY$fnw#74+!y)UHNb&UNC)zvBougcbS z-BjIUDO<iNVdwS@ecM<C?l;EKh+^>hIO+n+Rw?87cP56raXhEQ59lM*W0U%V{9r{i zl}S({A`>k2-!yV?yU(^hoq=cVaV|eU#~)g3-*GO;7uYF+Y)jQixexr`&mIE8fLRS5 z8dl<Ed11np52ZaeNqdL7T<zmlChuVOd|%xjHjh^n0w2vT)yH!-vPx;QmnWWaaokPL z<1MPp#2n#ipCvl*B_e;BC^@!d`+zO4Zwqs0uYB8rR`=8vf(;%MZfSOBx+<#&gVWV7 z?x&NUA)=lBEBEV1@?F~03$gphhQ#g!BpqOK9uA~5FlPZYd;hxpvsTOZT8n*)*?KI# z<er*GtHG;|TlQa&-!4zm)@@|dGIhK3J1;XXbRsrhUo3PsnGJQvt2Kc4{cQ>YN`DQM z_Y-3}FryI!+wa?ai=b!`QAn*VUqaU|b_7S~q2f-LjAh4NwrB*t3M&SMWV$lk<%08f zU4~@W+@~8avTxTzw$im!fBPNv$_UU@wVrT(QF?Tk_dRwJ<eXMm$Yt()&MjNHs`u1+ z9?7>pWgG84uuoIAJm7DhG_J!|>#|+fL74C+|Bj|f0Eh6oN?VeOY|m%%cn*d&k1Nf~ zAD7u@#NeRjX;|e(ZGaLa7VIvTdue~_eA~=~$k&KJtgbvKZO@R%cv%yxaN*DPf1AeD zmiK<oEwb)bM91jND@C)~^}1NCcJT%#`#$PXX4kz1Vq3ISzTkzW>Ew#ga8M;A8j9JP z;}weDNWhrRn=ZgFeGJ4r$nH1{Sv@foMDk?#zf67nuilQYt%4w`cXeIv&!fu)SDlBg zInfd|haOQ<oxxeZ`6>XLV&Hf=&r;$>|L#vB&z)3R!>xerB<DB{nO-VR&^{f=C?;a9 z?_4MO&R<$Vv+Lx-Hc=GXVB|a9Gj?gMJA{C-iG6R>!ziq+qb$Ag;(0A(M|ZzOca)R@ z=vW$-;?mTJE32%-&IsH{ne`SMaSxLL`w_^)d12kGM{Dq@2R<C3HEn6>(y4k@cs<NG zv0MV*>D-=8z*vZQy<p*ULH;_?9RG*3Jr=h~M^9I^o!wk@3`KI{Nb|*+e3rY8OD?VV zS4h|JIlt;`qwMS$Ih%kGW3Rr`4wx?UMj<e~;gKP|u~YH>x59bXlj=t!$euh{M93pH z5RU~{kg0&pS<`#pBZ;C0NO9<HdE|^r8hte&=F2;d=xyfwXT-k8Ujk6HofPbt4q*G) z4!gj&9RFRQ^HVMUkurZVs(mb4ld7q0XR|k41Ch-DB0#(D89LQ<v-9SR;OFL?SgKyf z^y$sITT#&kqBo=9&P3c7_Z66&)u!1$Kxe(<6WlawBcJec0lMEZC2+%k_~jy;rc|5A z6fgW7h&nk+Y<zRWAH92U00rxQ1W&+WdX@Q;&W3z+>(ck>-Z9tfwKYfCa(ZRQ;Y-IU zEEBfFL;b1hMCXt`Ry9ol_ij6v^V0dq{cQUdm0!B>&kl{Cvd?ZQvtIC&5=-sJ%Nwo7 z$m$zl3f$+Qd_4Cpi|=h*qibx*5rUadS{Stk#|b_474bEqr)<4x@2#10%k%X0tK$xx zdl#dxod8jF-yJ++GY@_IlOqL6di2o&)2G8`JHn1Og)a>$xZNDx<Wm7gyLyH>A2Uwc zc43iC6`goX1O@h>ZLwp>-RC`lMPWh1W%#Pc*Y%K+k-zz5kk+D;%MO^<K+yHiK&i=m zCkA!cuV`rjT28V^zSCNjq>F+7tK+M4KN3s0p7XZ1+z<$S;9`}Dk2$xu>CwV?_q*9? zlKJHMgnt!TRRZ0lS~??vyQ+QdNsS<lSJPm@WU_QG(q1Ev&A%}j`CZXr&4AlhIIT<z zsXX3T#C4*lr16*rYyv6<R>3!pJdR~QuBFFIS?g)twJPJX-371Mo^t`~xo6|}vr@8N z(8^T2VjNnMx$7Z5mCehTCDV%b;V_R_r?8re|K`ft7syzEjrPtb3|Sb5`~cL{q3fKr z{)%7+Vr^IEE{p|7(-U^OUzQYmhb|!FL5ZiDbLBcdxr@_QK9p^<)CoWhjDEJ_{8b?0 zo@(_ZA+ESlVJ4J0l^)T01Q%PS4`&%sQRFaH6E9Fq2tMa4c!QvfSAacy=Wev^O}Lm( zGnm!$fEmzx?Nf`3Ip;E+&Pa>i;;shv+>2`^l}2A-b%56t!ilg+<}2l6<Hz1{(9!}c z_hUWZchdZACbZRXHhT!qne;G^X$5EG_lU}VMw`8>#kKrGDgaTN7bEcoCnmFcTla3T ze;tN1=yCVAoMc6n2c9U?!jp5hi~^pva#}q4^`;Tl9M7VEO8$e&53Xt4tzdgz`04K& zu?z~}IeTsv3V|?z2U?}L9Y`+i6<qbyu9p=7I}PujVD~V5Fi_gvQ14v7G|=;;8gg~n zo-^mz^$-lgTZueSR`2awfAKEV7m*2#fhuiCe=fAqnq%3RR||CAmZvQvmH7^<zr1)y z`p5e$3qA}a(mu51qF1~<9s^FF**MEXU8YW4H|}tcW)0eedV*D9km(i4%aPxU67gnI zJ{tVq`ZnzS*FHXaXrX-F=1MIDRh+Ly#6<&Vn&09@Gq)nPD@H?!cNEOSt+yS_u0dLG zs*!0V^EN6eT#2*+WA^VmEJH9&l^E0^B2+VMHLO-^SNT)G&bAHOWNPBg666qfP9jpx zICJtM(CJ+&2A{r^XcPy<d;A1Fkr(Qo+~$v%jz@oVlI;ESK6hUaM!cIPTsuZ?-$_!; zX`SW0<lg6@rbCTr9N`~!Zo=vi%yWGmcW12Aget`-HHjXFf0c%9hS{T3E!^5aF1x<E zO)6)e@&X(DzTU)h$05<qsUo!M9vh14L;BY;?Za2OwCSDcD{E8z1Ddgpl=?jlsyOiN zs8z(0H1GqetGg0^%16K7SVu$g4w{dX+j{w?np`}Ieb=q(ikT^$Ai7+d4TH|Yq$^~$ zH({K7*RA5z;~Xo+Q^-&=Wc6F{JqkIE(m&P;XPo88;^ao4gI2v?3l~MG>t)!0lP&q| z)fW8a>oonOA5_WEzwwHUEQ@mOErVI7&2}dH!MU$uCrgSR?q+0QTenfajr(_cpX<bS zRNQ>>C$$se1%ZyW!gmlJCOlCG4gFOVRWI__O$kQiKFp;PE_ycuYDbq-$I*rgFW%Qf zFD_%o;w)*|#Zb4~x_7|ONcqk)Wq%+)qb}=+|6fV2vjh^aO&%u+5izw0>3q3NhmHO8 z2Fsn+ss<gs_Z2UPBXxa3u^0trHGBbbFgo>72P_7>uY1D+9n?WgRrF*{aiIUY*^_Cu z`_pJYC0vXD_5Qg8gUdn3{g|`clV=)mtNbWP?{n5?u!58DYAs@(5AYKG6UME5r^e)( zn1Ec#0Ho0?y&JavmrvD||D%J!xxsSz)4=$h{6>eRDdx@}2?xD*Gs{<<8iX%%<s(|4 zr&JloyKuZF+jcpP!qrO&WvV?|NGWtmQLCEoPz;#EeHJsdjnV^U6vHJdom~cbl{RKh z)3pQVg-`XtV4PjzI{s1UJ&_fH2tupHz8${4ulML`Y0Yzi(g>NPZBwbZo+285t{6}3 z=h@X^lta^{(@C!Luw9Oegg>=VGyo4~?8xB${*k?)8Gm4SC6r;_xEu*tx{|2e2oz;q zml`_wv0@U?5ZL1knVsNDV$(qz)UeDz{dwQ}PljJZ|Lduz;^3Ek__4ryFC)6fgcSXX z#VV?n7I}Ak<@093JVATgd{m8}E)uq6J)*dKXnoK6t*&Pbu)$;~@j+WYL9-1GXfWSk zN=gN*4gPrZ)SGZ?MtkWk-1^nglj?gt@aUpJPcyaZ2q25YTdQ|kDdlFg&9a0J0E2SP z4Guk4G7c5%uyCH;Ky&|j!f9k%f_bJ(K!)&LH(lg^?aKN<cTi4RVZpc=%At6M93*40 zXv9$RUCI18Tzb&A7|L!N?|JP-q1sNZMX0P-Kp3{TF0*dn;#-30w8@4v7%c8~TG+g8 zSUoG8#sd-qGVW|SR((3hPP?{UYYldX9fnS6_(i-AtgBJUR82d?N?^!a8<S7C9!3d; z6)9?GTP=wK$+r?VSg&27yFFly>!eJS-;515_;74%F~gKPUi(_eVm#V3C~s@&_8Xob z4{@n^{SZKzB8GB@2&M^A4K@`l`*9K-{1keC`#H0dyNvj^fwQ8~KQk71b?F|7dwC!_ zNJLt%kDMY@#fRLY6M{i-&W&)dK>;9FnnluUAC@qvtg>BdB-Lu$aexwt8R7QK&lIC2 zqu-q)zj(oSz(j2SLVLao-;NWWbuSX^3m~)IWh13PHhi$=;s&oCr)jx;I(q_gD_qQ{ z?D~J4tde){G)!@*+tXcLhZ%)@wRT?xrHG3xWB797Kz*!Qqf=KnH*qVt(?YyGTIZLF z8sza<i~S47yr&Nv;l<T>3Hz!RH64s)T-O!68Az)+WA|2YA3dq!#k@M6#dS{8dsM5? zxzcwRUY}>wyZ?NA7`UFvt(9&y&e>H#XQz4Ya#m5u%)`vC|BPMlMnY`+a$mn-T{Cbz zJ4umy_mY#(q+V{y_`KyosR|eaRl)QB3@$28(!e1R1BIo((Ek!`SlYZ3B-I|6aYZ-9 z2O7Dzj7P{HGv{AWa~@=U{0q9e0tk+>Z%Ye1X8BQPkFj7rS_wg0_u&|F$tW-2M?8-% zic+Wve)N6oQPEF^gUlwWLefrS$xe38L1K*sPH;yl0U(9&#YG2hMvf>uUQJDx2zoAE z3m!gokUxcv71J+cT%eH}?Ob5THC}psT<m<Uzvm9ebTGnKptD^R5QlKZ<sf@|S-9de zw`|Ult@p7BX9=kMF_$YA^>3Z{SG`3V`h?p)?v)j^Cx57H93P_tnPR^wy_xVAA$Wl@ zPqvKyA$h=}jJcFnrf%E_VRaTcTy+`RZfu~qIkw^i;GSzc7_Nh&Z)+88ll;wp0cv_T z`6IG-YlI>taP}FsPBu>@qfSeC%>8d!4L0;RRR|L$sJ!xU?yRo5_v$7doTw<$8txVm zrg-}7Y@)6e3~G<3M9!snYNq{>Pq2*L)uO0Z%|r>1xvo=rlbP&l&=yD86z*%~Hk08L z9cyYyDHj8d45K!*diVa`8eR7_JIHggVM{H~56j&!zIUTTrTH4m(bzr;lPwC9+My`x z_gpOR3U58XPhxf?B=eA+0tR5kRM9QN(gy-{0|x>}X^)KyPq$<BL~HQ5jYS_SX6wPU zp~=)$NnzP`m)*GCzS3B`PZ+kRwd)o+IN8oi$BLIU#tSI=D9S|Q?`dZ;Y3O^t|74VG zYEhZLF88(DxcYpX6f#_Y{2=Qoyx+aMT5Yj;>~K~~xtzAbp|*S&^ibG($-LxRz-JdS zmO_hGB58D}f<FNY8`K&m)eQ3H{B-7ESkIH1EiY$2+CblU8DMn?M0@n!4y$?d_3axq zX)f2&^37xE6m#5>?7I9F;Z|0@9rsIGWQ&yhZ4J}4BEnpP#Op~uXR*V5L;?}rO96*Z z_QiSh=s-Gkot|n2wU-bJ7f^E_VxmV@UlWl~Q?>eX_3?42(2hpAuFNindQf^E_Zu;^ z1!+{T*vv*)qZR-r4^6$BqAXSlS6*Wd!Oir*-c57D1R`09<@P4}%1_!ct@VHExX)-f zzkPw@q9kf`!zhW85yCLhiKrnXqDBjX(aR{&qW4jTA&A~a86^Y}J$n1=H8O}Y$|Qpb z(M36O?m6q;H}~c9YOm+T-fOS*+uu*a>9kJoZW_G=buNIW#kmFKbc1{QA&+j7abu{y zrsIUlLsFRv<%_kfrk}rgR&nOc+}DM~M6|U(_~aZ63sqxuM85rH`q*Bh)U^H2ifV0R zvKz=OL^HNzw6IxxTexpHBOyFQQ2%f6ApEksKlh&s0`h72cxveQ+mi_tqCWg9G1x%P z4=d?B^1L%jN5e#UOhP+{&9ZuGMhdO@G~Hh#xz0=TY5hY@SlV5}I+Z=`+`Fo*Z-l-V z<1mQy%Oin^h^{kA1Q}<^Wz|;RwiqYX&YR%u+*7qyHG#0~BP+8myWc00F2aD9-Wg}} z=*mrwadb+##qNlvaoM<BwEzzsfdl?(vdXDUHi4%m2v||hbOvJLQ%+R@pV?N^v=yAD zit~8TskYi69S_A(@A1H&zXI9=0$<~37fag=F1u<<D`pu8t^AiwR~3!<f6kGFE`tu| zKfNKp77J5GuUaljR=$Mz!I!19feRRa{=`<?vQp8YPp$0-?RN$cBZl}LKa-cAf~0p3 z5;{cM&X)j3@EjxAw!W(GZOyi(wh0BT+4U}h>SUAr(O(+$4BSIXc62cp);mjw)BN>| zQ)_#^w=0`gaKC#59e<C9j0j%%H`E>urUz6CzS#}vn#dYlV-aaPM2=&&FD~aQ_I=G{ zjuf05w#E3!?7v2X*q70Tup0nIsch+}g6M+pC%mIIu5{x)A^y!jzj!`gs&~cgU97h? zULTL`4Y;f;%_gTSx4er0hb`xTOA+ZEUxh$mIcP^n`_<#QV>Fm8dj3-c*UdrrlllD5 z+a1pY8^N->c<iFo*0BZi*_gQw?2%Vbf<gLHqvg17-LpGxuLqh%+?Hn$;&)_U&#<)3 z*~%RUH~-lxm1^5vmjG7<G;HnI=YRWnR{LlE=k~>l>Del~$dQZd)#36$&^LS<AkXYL zpAhyX#6fJWE<iGR-mgPpYY1m?v9UqZOpHC95N2=}RlGHAkd7knTS{sj0X+6v*Lm)P z3OxSuRSWL#HhR22+@7od@rXbxG6!&H3p4*IZsFG;_4JX6s!!KNms;Q?W+1<1-g+yw zNzg0rMgY@tz{5^f8U%^`H&L~q%juB%dt5b$ScW49{y>24aN_<E#fBjZCj_<rY3GX& zFwL~>e2B4iR<pgKsPU?of9R`4fFBge7&IXNyE-brUFxgxsm;}C`YTxl#oJy7wz(%u z52|<m{2r{hx-_wPgL|f*FRzNaOn@ml_-VW?ZFzC7n=g1h07E5kt1>D1FqYip{~Crj zJal?F(dif&vuecDQE`)oMjhnA#bxeE@ydX@8^n5YmV$d|$*7_WVbZ;)z^WHXO2HaU z4~>Z_1cX4?t6o6gsXgM^i*tnzC(mTnJYXdz(dvptK_$2i!oTwR$@?eVWCuTZP$mtD zRC?jYxR|cqtsd##9Jc>`t9R@0jXYR>!PdqoWr(gkoW+99-B9p+QMkL8TggPYz_I}3 z&XDE$#l88nUtFVdHHGsHWv3Wjl}L~)_nnHq&U+pccGD74E+?vtLh3T>$tt)Qm@0D( z-y)d1kjz_{k96_%L{UHmjkaR?@0grug}oV-lO7#xVBt#oHzj}z_dQm`5DTF=K8w#G z8RtP?jf~{sV`5$}(567}B(uDWNq&;*!tjCTtzgMlH-$6Lqo2GMr?cec2ZYAT@;D4a zelAPSl-fuDS0NfU6b+<>>fKjQe$7|=u%a6iRwdM=D!(emqvVFd58iw0#7();w^{RE zKnu3!B!UJ_7P0E~xxXMYoxjIGd+@?bk8otr>|EdgZhFU*4`zRjLa#f#tj8E_$<Dx& zzz)W|YIP+JJ})R41o(R7dAcu(D=Zh|f{7cGSm+Lci`h>;>wGBS*JF$yH^D#UEA?)m zwuRftUWZU)i73mJ&j@KNp@To@L1tCXkUQbOf>xbX)tLB~tc#*{!}Lkkkd-qw#aD{) zdt^rBls<epUC;>k4=>4yUs(boX|)7+=*wAvuvD#pP!d0BnX0h0n7fTPKd>wE-b{I+ ze8_D3NrziYI8NI%vxsl)phJ4Ox&mmGJH{F%#yOecz*1gf!0r$;N&6H~CB=Ne22)i} z3Z&z6@4bC1$StmqvRvh!BGlcCGaV3aX04OMnzYHZp4Q%qtYd5y6}&HrWE65CV+fyG zRTi7@?K}-|JXBVs>?OJ&nFvhi7ub{zg0zw92y#$@<}t}qR~K_!f$XM|!djx%9<ih` zlwk6Mo9=tSN^Sc5DrNc?5s@?uWFf}+Sc6c?Sy9~_`?p$g(5;bq;}RLcu_f;ow3O_X z=qu1?Svqd%)fG|UyLKEtD?pqJ`+;FBEQE$+YB)O2!<Jkn@~rnYQRNXt@N;GXSEoWM z%?C*P{Z7}oBE@T9#Sw=$yzbRc36>ut;h;aC6n*I^9F~6|TkylxpXB>|@=wwEDEBuE z3vfKyyf=`R<Kdlcp*$%SJ$i(862vRa({M(dC<m>Zk)I|O{E;_{$+OR<lNXtV$zcfO zrTnaKTNEIqu$us#p24MP5c}K^QuslmFb6@X^FPbUxKqb9kw_tjkrP)qK*H15X`n@D z3QO`Va!R=iHNdW*qovxGE;L3%^LTWWxUGvnf#LC9PVW8SX&U_kE={BO@STUocM(6y zv96UU$9@OPx^831k#(1qj6B=#&lQ@Y<v^_ThrN<i-=g%z<v(wr^lau1*ZvN6SzM-S zZeWZ@InSd(sCtjG%1>>c$``emlrEqNbvS>SzA~@9e?!m2LFdb^DAFHTuWf4A1}c43 zpcru&ECcm}Dcuk_L3>#WwMIL7iL1Hy(=dehvq>V%xwnZZH6sQzcBB&uZsBeEocpwn z9c607y+l~1P_we)9pwe9S>*n#XR_jF#s#c1vHm4;Cst=4<)<loBk4!j7sNW?ZUnS} zn#!u3nq`0V#FUOYJ|X;jm1d?E#O2nmm792?m$ii73^qOKZzHH-yx=I|cXYdR-nQbS z&%R3pFf7|o5gkUL2#xBbtuYX$qUb2ovE(_(o*QDCrtK!Bl%K1;i*2Y&xQReysKwZ0 z8#f>{hD$`PSk~m519e2%i)m*?ADHmrra8&n5baux!p!1{eQ|2}XpiX=VfU|(Y`Cz| za9x;^2R2<ph>nU%4n;E#6P1%{P@oQHuiu&&DzO(e8mZ<i1RGn8@Nn1iIrvpckB(}_ z!Ntir)&PA&q&)|{4~Hc2Yh}2<CQq=_Hijcxwc>i_J@6QpQ(issV@{ZByJocak!UUi zlX3eR`8c}0XiG3L6dJuDt*`I~5j+)iuoKhoBd(9${3&fgWymI~bo1FiGmdGL7n;m$ zEtvu@V{tcJD_Nea*NM&oybJk9$|l+W)F{`u2`Xql5TGk>7MUa?HG%53h!$s3yx+ys zpY?NU2oZbrS{~?SEwPsSrl9#9z2`Ox1*XF@EaeMu@Y{C!BNZPLM@G*IPh;V%cg{=s zfiVKLV_z?<>Oz9;wY`z1<_hYu&!1&q-U>Vzy~GM~P@hNT@V<^I<?6V4Pb;8rf6!N6 z@E<N=-90#S;s_-Xcrfj<=75a;1?k&*PX^~9)NU-}R3Q;E-Mu|iwuVA98f{avnUWhP zgB*^UKP=@|udsk*$xPPT*BQE#KOEx4Z7J(vdmTYsKIIuJYWKitEc=#>`f0|7*Ljp0 zFWO@*<koi5&BV;}nnZvK-4i84Q8*Q~_63@eW(|u)XM(*8p;KE9n23q#U8RmWfc!^! z(UIw<h*DgND|I{#41?43#hj+KSld8#!|RxDL?H??i>|P*R3Ozni@xBVa2QF8^WR^u zs{0jg*^4RRO!5Ie3fpcz?$eVrT20h$nNjjrrv|sdhqTjb5kwLpnrUro?!kHtrgD^? z#loQA3En?0=K#wy6j`Ah9(-8`oowiTsT_*v<b6PMjzLjBvb%gvOYNUk;wE(^pg5cy zgr%S2%p#YIl2uY53^u8jS^UFE<Ays3E43c5GbDh6Ez6A0GxEf^IxEOD!+%aHV$|{L zG0Vi}4w2h*qSmPWI6@XX5frC(k+EcKxYliK4B^kSshyl6!auRfD<JiX&i%+!6YJ~# zrn}ObtS5~3d@____%}nu*oWx-Wgqz5q*n!r>|BzB5&Y52ZB*m!^bd1BqfZ1v!tz3= z5e){tj_wPFmbuS1dR6b+Zkl@-mXn!2+m7949Pww#k<IGJ_1%%OdB<H4)@SBEkh&4U zf2T)4<oXdIrz~c`=edk1yTm7DWBq|FU3{F5Mde{!z15FfQkyctNI6<XR+fz5nj)rA zG@A^vGd>OWC!SVG+cbD;b$5k&EXPscI-Igti9NH<D;L$}*vrrX0Lj}Xu2y7Nh-3QP zK;Z#)Ga&bs-TYlg!UNCPpapbi*pm?y{8t7?TN;x(3f6nt*aqtAUcH5!)Ide`5l^#I zqDKB1X>yPcO)-c(5n;zvgKFD~!nBCtJEkk!{#$8a+Z57CC~`9gIZ!M8GM8K$pr^Y^ z8UPKom4Q2rAR0i(L9ec~)c-gTQe%P}#+y{1FQng7OVnf#nTxn=Ppskyn6c|aU`HDG zw6$I=`a~0em7?W@Df;Hj(<24QV(s@>NwP=5`h{;Ykc7Ci&`}xrVqB$|5O`l4p1j7O z(fyn5`>>FRrx<TfS<=bOt{nJ&M4p<j80E>hhHYM96gogWSj-2{7Heek{qdo;O3f7{ z=hj#dH7Amm85u0IT1%v0yf-$|7q&EN-pMv`kO1lLb8MMT9^iTYbh>+cUdGJjhX8P> zojH+s;F&YDZtDhqO8m}o|LHhtNQ*dkCtLh`s{|ngUbEq=xU#0EB=)N2p7&q8p}_w7 z!ck>9dUvcAroTBgZf&2^WTtucfAI#V^?^YSt+h}%--7i|-O7t%)132OD@ltH3x*lC zZ0`n>OROD8**esRE}woC0&5(=sMRu}k`Aclo@@8jD9=(3Cr0IlvUR*OjRr7AYe#Z| zT<<&J%ZOab?HG?nPfUne<v?`#F>Eo-FuHwl8aNl4;vY%>UcF+ldlsBX9)73KJx$QC zF*EsLXi){$?>hp8cRXWjwZo@V9CES~sdv~F@7nHgl8s5lRWWO)FwtkbiQ+3|e(2ZK z+o%T_`jD`DIA--JDSg={Q_JW~<hS-Pn_)SL2e?2vAIW&nh<P5Fn`z9V+Xn*Qac5f_ zYpN|%=(`&(PzS!2R<Jh?z`I0Ov7jW^-Fez=<Bv^6wnK%YiV`qg9NyhN?am7;A&<18 zi&H#`<&cw@IUt4o2tg0MQ=5W?LZH-ET>P?9lx$ZHrAOaCo}4s%)h{3U#xxESpu&r6 zN%sRo8VnIil~zvdOeea-KA#+8^R_xHpP9K+*>5%}S2YI;ak4a=Q6}wMe;(2)V)mSg zKOOckKe(Ec_#@pRTUp!OYe#qZg<u#U2K|ze#g8E*!~Us0V!bc!@W`R2<n=gpTFHFb zgG=fZ429AQ7ZR-fVsVT@58oE9_SKBY6;t#OPb_36bKF{&PEsca*f7tu;A8<;yBo06 z1{?Y&Ih*y!yKRMpJo{C?t-|wO37e<gqV@Yhcf4{UNs28)?V2o~4XsG}Y<i_OIV>Du zQ|7OG0-)>TA^HC6oudZ1F=1rZ)jE6JcHMHw8>)~l&$^ob6v(R{PAm$l^R<T7>^*Nt zRCJ-pjxauXb8M}stV~!<^t6|$4np#C&#%AG8*rnSbI#XjHsKpsR@{tF@_+hkc*Jz| z$*sGZ-T1pp&e!F;WCSwxw;np1u**x#;40F5xVAt2cca3jvp>ZH#djmER<pbPlfZAi z=nF%(a!wZu5K>&gB2J6ky*uwyogcU`+#W}qS~eO^Jz2sU%OE!<KH1`UgW8?nQ~G?^ zVJO9yrvBCYZeaJj4@jIqK62z-)Ag~3-CCkW*qlMBn}@L-VJ2mDpDFhEPpZWZ<2UOd zwXeySXL}q@G?KCLzoGJ9{5&zdYxaNXzv-une>UFOIJhZxbN4ha(<NJfpvfBSRXbzV z%Rl*<^VPYIWHy$QujDGSZg4>x^^Rs>_|+#^W^0?RYCquKy>D^<H3I+Mgs&gaCny*8 z0+X`_|JPJ<?fZW{K}A5Fb0_=Y{}@qv-BtfZ33a6o)=OCbVuIH)AsszGVwI%t-ya;# qCyJ2&tOG~R{o5Ptk<lPO4WW|WosYWTId<)A5<#D6seVwl4F4AtX(3Sn literal 0 HcmV?d00001 diff --git a/deployment/media/nested.png b/deployment/media/nested.png new file mode 100644 index 0000000000000000000000000000000000000000..fe94adb248a13f892bd4d434bd352e335dbe0284 GIT binary patch literal 42889 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 literal 0 HcmV?d00001 diff --git a/deployment/media/nested_virt.png b/deployment/media/nested_virt.png new file mode 100644 index 0000000000000000000000000000000000000000..da1cb4a9e31d0630310e73c82ac7f2dbdfb18020 GIT binary patch literal 137872 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 literal 0 HcmV?d00001 diff --git a/deployment/media/nested_virt_akshci_ga.png b/deployment/media/nested_virt_akshci_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e828ad14978bd7f5b5c86f4622379a7059546f GIT binary patch literal 122736 zcmce;c|25m{6DU`-MVzsElXOswAd+?$QC6#S;k-t$x@af%Zzns(?W%W#2^hCGJ}|5 z#?mGGmVFsBifl86EHiff&XAT{_w)VyzJGkr<Dr;2=e*yq*X#M(U+3JvXsGok=RQsj z4vs%{w9lJxaBM?xaBS(`{yXr=(aU?Ifd4jmn`mipV4Dt%0e}2<McqK1gCjSBYuRoq z@b@3rv@N|kIQai!|7@x|I-|zH@i|TByt<j6&G^b6g@+d``xla|h>-0Uy65HaEjya$ zZPc1e8U}NPA{eec(*-JX`-Xc<1$$C*8=c<B2_6$f+qlp>Z$|!g>9@^0_Uc@>;@bWA z>aOjWj_U}xUWr+k4F%M(M9stwwPU<#<Dd6?BrYe<3@1#g$%)9xosgSZqK~v?7`|0o z75GcwuXs`FgPJ1s>FlzVkIBfPrKI^)5C6$MlL5f5ixmx9`lm}Xk{W~A#C|!RYNDQv zZHZUw%S=<9S}}nzo>*!{f1VggUL=A`=k5zNI}KnJ>^IKl;J98o@z^S>-CAj=>%+$w zg4)U=n7aBgylKa`Q#k4(pV1jcWu>NfU^12&{d0BX<TDJFQD5r9<@thWa5>aSI`qW| zxO^s@ZfEa(Vwc8t;oIN;Q}asGCC%hSOfRPWVp{AXDmgeeqv=`nzHx?8h;4?Hl0{zA zYBchC$fv21ifzqOxB2q~M1Hsd`+g>g{IQ)g`?A`tU@IV(Jk+$?!yuV)Hcyr#CqChV zKlXf@Fa@9CHu%@#+lA3C=wXQhFf=@-_f`8<rH<amwMXY;$;r!^6Qf#XpG=<GQbv_| ze%vx}lSpDzZ&v#yxPiG#eoPpNrAtXx4Z^gk{Cr}%NPz`3p%K?7y=MtU^e9}?$k6*Y z54H;%Xu0GOFOcVyd~N-g+WIp@-|IquI!hop0NYoxGB!zn;u$!@X7s`Rbt{Q~{IuwU zqtO1Mz$McRCC9#r;%Qcft<e6JjtJ$15KGygPL6Cj?~-qlMG>D+U0F0#^p*TfX;x#x zam6dO{PwqelZmbIPret}8VhS)iWKys$|s^_b)^ZWov4Jsp}^$%DTQgFpyh?8!#@c~ z<HA8qk2}9_|I*tC-#VhVch7awz&-9H%h8jfKb<T`({4nNa+XRnChEe8{flIyRm)Sy zigWU*&W1k;(4pPm&J)UyxYh16VzW>xTB^2lzR9Sp+gbPLQ>_=8lx)o^DWatz6A<ds zThhRFTP6Rrwg*4cS13|Iwy0i-ol{}TECf^39&DKiaKZfdnK93>JP4tCTOK9Zj-5R8 zGf7x&hJ2@ITDsDl^kg8dN8$ZKCDZW4Pa+l`3~P6{KL~aqdR0!au0L#S{I8SX(uAxW zy`N}AA8aYG<|O^Jf!6X-E1A%rG39LMBkk)D3SCi1iby2&I`<qDm?(%SWmGi#Sh0qc zRHtq#8O%O96sIIj@@}5#>SOhqa=D^9DMeEgT<%Mw@MNWa=N{BT%%6mkqccOAu@$aD zCA3E)XQTrU4Hi46&Lt9Cf$x=)t-Z*um|_-|pTdfIbxt;~sf5*A%Owfi$-jOju8$Sf zU@Bn~_z)HcJAIk#NPgIj=s}#qL-CY*|I3eji^&sWFGe1gWB2S#Qd02CV_a|}xsm=N z%aE~E_<H>QT*m+UBN!QBpJ05UnXJu8ns!J_I`)&CoCEJbO_`~#MTf-4calPW`d+}P z%6R5Mgt*xF?tg!$o&4a%uz-;1#qJ~jmQtjufL7xP)%28K2o@>#=-HJZeRaFIpTN54 zaNtz){L`D|GCwKzY;B++wDzGKF;?#v7h3Iw)~EeqE$Ii?p-1SP!0B?`M?bBmT{LPn z0Wjv@o8P68soCWv{tJS+Ubq(VAbv7aXrqZBFY(iLzXs-5v}d~+TsrQTL@Bsr5@VGf zmrp<@%AWkBZIL<+Ij)&D0I&~-Qtal8eo~T(1_hU-spDIJp%3h3l?UxPe?ecX=-^BL zs%oBJlJb8gZoUiu%`gC1rGUD4|IFq(fX!MaKci=tiS++}G5_K|k*fX-sO<0sfnS4z z4MZS9`Q?QIS_YuC%^gI1{%PZK4gXJp|38R$|72<8en+2ma6PGkP^bAeBARzzZG2zo zJ~B|Eu<`MAL_B^S_Ckujr?j>UNAH`g+_dp+etrIiOd@q6<_0!C=je6p1#AQxFzEBe z{M$A@e<$-FiwHO+Sy|M7Raf1&fu0-Ja4^{XOV9k}?bv|+q7hn6(8j+sYS2|bUb=&n zPFvsOnrP(4{bYA;+&Tq%C;l7iO+={STQ<JB8fWM9&A2?d_XBNDzq3|9GV6Qur+xo_ zz0~l>(3n24FV^B096P9EH%C@o)(4Ez(NjO{(m8z1VgddzTJR^qux*ld@+%yU^gYe# z8`{E|S5zdx$InmsrGU0t+Su#_W34@H4{R{yENRCHkD|{e?oYn>+Q&6Cnu|?)S`HV- zn@=jspDIw`_Y*bOa3vY~LKykS%^|BZ&=r4GR&E5`YHpYiOef&Uphi8}5}u^s#j$IX zC36Usq!H8PMYAiJUQu%=TR*>uP<_^1)|GLDQBq?Mc22HaUJg=ys4V2z8OYmeD}h<) zdUQ~!)0vVW*OoC*P~fotadpUtQ2uFB)o8oF;EPlSHC!359NQ31#fGB?3Lc_8EM;Wn zmQj;I8A_<g5zEfdhK#PeJK~rY`8!&x^x{VpT~fJ^zZy|J6@t-T%BxP5k7iD4#^Q7X z@4w>qc*Y}(sfKB^95*s?Ou!IJX2YQqW<Cib7(ZB+On9+O?W!m_xFuIqqSvVoO*_7s zgTw5^cVK;6TUB+z!onhj&7XTu#Oqk5>D-Ez2@;266sKfF=S#Zxe7<#l*oae^s0Mo% zU7MG<VmO;&crU~7JXqz1`=NR%dXC#)x%ZT-F+AB_+J@s9tsa5;DyLWQ(*CMpf?eS} z!gYMVn=D=Esqt>Zy^9L#l9%XpH`yBEzteQ-nsISyru#^e`qEyOw^~hU&!k1W6KJl| zZ0V^4`F33Upu8}X$a6?&`=|7o9eE{wx%H?pchkeXI7SLNm@<g$G3!a^;5ZBaPQ`qK z20{-A-`3ZSjg7^J6L}DuIQEvxY4!xyv7%f=#U-Tpcy};-4BqmEzfd<iTFnC$PdFo- zbmlLL+3~Z6>8Cx@Qg}*>(VZA`vy=InoO)rGY{J6qHOcnzPb|~bh0cl4)2@Eju5^_& zq3aItraFAy@1XR0<$fl)=t`vOg{i*NxgN3piFloZq5ySegPGQvl*x)eqX1HN>JDQ@ zpB{<wpG#++%q<!19x~J<h(8YN!rym{>e`L-Xz@rGi<77p;NZAOId)?FStdWU9#AUZ z?v*_n+R>JlmSYk$lkTk?m*!2j?gRqCxhISlFV8~E-e@x?4cg3#_mtgA(ti|n`E2IJ zsCANjj$eAG@tEiLl3B@XPb>*kA7ffweLHV!UZTPIFm6rFjCMTa6khv9+CV|fX3xyM zF;=nagyUpe<75!0418&Chj)K_siHG@BAqqVE^qDBFS``*@d&f<)?@DSCptYaB8G9K zDp>mvFC|@D!iJn4dxTjW*W(ms!cqjxFLTF<Z$9~aCG}=}xeN!#izo@@7?miQ%-JZ3 zOdeh(#+*%+ANY8>$V@7ev^DDi0hwWVw0^l~)f9}a(%w%l(?;zwLfvyG?)_T;9ckuM zj(oTIYD=x3$Nnf-oh#YQPB#7J-Xtp-f9e2U1id}Fx5?h5J{dq+0i~We9roTa44fww zMc9Eiit2R_PqNQ46nYUfVLBt)_I3oiN}04U_HlE2(SH1Fr&bJ0e#PBhwiqqwdy!iD z5qUNB>i!lJvL4D$=#2IkSvBB=2q7M*N;G~YkE|~NdUS$=BZc_A9rgh%R($erd74m8 z5(meQ<V0(xNJR-NNdl>TT%H$~@>D`9%`g@)3^5w&Ejo_mQkQ>HUy8*(I||oOhKmq& z0~OU}W}ZAddZAONB|BtECvDUrpll%aFz8zB(DVTB$dG)uX4D*dT0ssMwM@m0O3*u0 zV_y<OY7r=1muF^fq*O<vY;rqZgsj~%^PF%3XVAguGcAZPR+|G28?gwf$iJC;VTbES zG}kE33oafz1z3=S=V@>$&^U8(uNiG(`)=I!q%c?<8=ZA{+3N6ASbst~O&%y$TyXu~ zv!MJ4mmaM-&v%KLp`u2nm6GBq-FVENx0rH!2^)xTXo8s=`HX0EI49g@Nka53JwF0{ z(afyfkhiH`yV2AoP@C5YR;-b&ts;y6Bo<+6hNcr5Gw|N`U+ImNji1zvh<R4sj))C& zKQt2?P-;pCp&v`otT2<&SQ5nrw79q0+ZHYmt~xt_ob!aFv8vly2`-aq{WEJY{bY06 zK`C-DGcI)!gnMxnmBwl`E5;`QKL+kgRBs#je!!Q$IQ3oV6DdWf(<h{#9$NELCq+Ry zqrRJ=S-n~<I@ZX|*4Q)CCT2eRZ1oqtS0dt#imt`%S=o(4cI+7dkzH4?muAC2j%fT{ zvrR1t+#W^fYXb(!0m^|LRxRGfh(KAQZWAdpk5(#dBJ{g9><VU7o*Hxev6-=)ZdwBi z<Pgb_&upz$NLo5m|1==Uq#3!tcG_P@`dntooceD9v5OZYKFK|Rk3j7tmSD63SR{9y zg{Dxem{sQ&s^IvQ_HDAoE3Y>s^+T)}zraJesW@!|xXQEMG@hhaXOK_CZPI$pRB~mf zdc)dzN!0uEfT&E{w2N6FqkCP7H?X|CSu`8RSSu%-g-o%(Hq4YNeWB#?(>V(a8JRv@ zZ|XCYK{(jnbK0a0jel)6FrT_PxQuZ)CN(Rley<OScU?eN1hQ1;U{88Ko7P`!r|Pv3 zKef&h^>{r7r&`IKi^%J#VeJ8!CE-7D*`mBSn2TUIK*mXGZr&FvHlnl>$*GWIT5FNT zRYO#HG$<n?H4EXGn3%$9ovh0Mc!1F`pk?N;NuVD+Ww0g_h-UM-7}y)#N(heX9T~7% zLVgg?MrNR|DwbqPhoh5Bb$alcba`fCdb*BgRc(MilmZ@Rm0~o~&xesTL(w9)+zF{} zLW2PlbSZn<Exy*cuF{7N3&rSI;SQTlxC;`UbXwK`M`~BDL<%$Qo@bJuiFOds{o6cE zrg{T_pUxhZ=~Oy~_;3@)^_FK};?zk6FGV0uh1CPT_rq7TWf*>_%_M8l@Graul;NAn zk~>^5-3YJU%5Yv=+HXM}0NBcN-%4H#%LMc&@hrgvxx?$RGPAFD;1<{?dPK9zf5s8V zW59cz;cem5;nFeSK;!$cn?%i;*sqBU1WSgSIap_I=k4-T!;IOZuS(UodX(kgDWdeM zRx$g!EUVg&>m+T%t%L5MkqN_*q<iq3DL5lQN5vgVT^=1Yq22n8)eQo*;K5EyfD@$a zRJuaoWTO&l{mgg)?nfGL?`rL=5qfJQ-1P-=CZQQeA4}M1VxnK0^nEhiF-Nij@7V3% zXEvp8rWh}!dDqO-l)5dAQy0J<7&fT`+j1-Muo3Ddfqa|i66|tRd4g<Usv0w~Tf^Q( zpq@`5+sy658D=3uWqS|HB(x+o^`Zm@eh7$0gw64$&bCMMLSiWsCS=&2+?iw8ky2Xe z7=!CLeo|f!=8GBB$wc;PnS}a#B!7~t@odm-%v$+d$3@NX;M`Kwn2FHt$JG*T9)JNe z0{of;xm39fW3Nx!auGA~T))^}mV@JJCp)WP2d_@@j_&^)@MlM_DT<g>tv%x2n+tSr zWauBybVon!p8V)XbI41)7U%d7{RU*VW5&>33ly#nA_tm~-~7Ebs=dPzZ-kpa7;b@K zW)rq}P=^-o4TksX&}8f-rWJ_LmchD0F{UubeK$Q#vXcY`b_lK+piA@D))XX+ZrLqz z%ERET`;un!4R^5l+668GjOAM5WBUsdR92r8;GqjjO&QEZeTEPM3aFWKph<HyMa>jU z1XJcxQwPtLA*FTKMVZjca$KpjPtxXnb40Tl;*ub~hm^dT<NB}xWIY{oIBLq`YlvFQ zGoBq1RlFM`Cwj3yDJ5o4Id!%(C8}D7x8-+0lu?_ZWs;M1e79)$IW+!;I+uuzC*%&( z^+i`1KlH#9ryv#IIxClcnXsTfCo3K_E7^x0$cE^k$cuH#XzX77Bk%&0HjKa~3{boT zt15{lul?vp(HJJm1=p2vU{5i_5?>o!9Zqb1U7fH^@%J7?UYQ@pJI1dirVo)I3AnA! z=&&xtJD6>!GYxKm#>dNH@|pm<r?QdT#n)Ps5RKCB)7SE!FM<o)T+pENK9BGSCgL?s zl}ztYiI-a8<$X}lPSoc0&D<aclhrWbJ;tjxZXZye!9}piZIMhmUGf0a4J(~kJyH)s zd<L9$ZkC%+lv`QrmCQ@yM?mKd+2qJTTvT=}6?t41pxb;<G{g)#xF9on$;^0(YcyDc z9%ZCQm$Lf|bJLynZNhb>v41FDNM{i;>toi*!B602LnniUf_GzJ>H6acpb7Hq^mmc` ziMWD-Qv^TAdS2S7!>jU4yJyeK6~orp5-TuTWact2<#!Xqbh3sUCAxM6tJ-QJ`gSNc z;p$`*lkWKLrZz1QVV|p;v}M0Q`qHOf?SIZ!)t+GvWV_;obWoC`=Oqv&8G;1c@c^;M zVXy9*8P||Y>mQGOEHdE5x)sB6-9KdL*Qsu+2%gwxdBH!J#s_y)eWr`DKTDf3MW*!z zE}eBjRlz6In&kWzkryj<DUXUqbrA-v*X^!P+=M`!Z$)_59RLbu8;j952BYx;W9I}( zHHU*O01)bIBrQPgg*vlb0L1tYloApW7HWlX-_wll78NzB*XI2_iznmbZC449;Uyr} z;>BdWIm~i7XW2=N+B56O>5O6i9YHxCXq0&tJOZ$XhCt`qdQcfb8J$ILd#JoVn9I=2 z8mXyXejVw!w>D#_-m*IM__lo}QJ$Er9Y?6r4q1;^!&%V#bBXBms1co{895V8S%C~8 zSL<eE8FN6B(=@NKU7E;cxtcCg|6b)nRQq7YqHe*QjhaJQ9Nb|K;kYb3_MgWiFEHpw z#^#yFq{JZ{9p7AreI1WYmOIexxs-n=-mc56WWByoF_FAWqt40Szel={HOQ`jTpvbr z8iB&{41jPt$6UoY0f>BcQD-B-cP=;@9@X2A`}B9zp2ZbTdCZ=HR*yZ5>~=XF8V|P= z?&^WAIDRE$Cdy5giinfAz%PBJL$c5$RKuSNBg-vaF#eFM?|C{#K^30%{JbD!4g_wI z(;i2tjUpuLSjVyKWOO>QZU$Ey)LniJs#y;?<!PHO!kovHnlPBEscA`DoF@+k(xq<2 z1RygLf`!Z_7SCSj;SRFEbfw9WQ4Ki$rF{ZS^64SJ$i=fy(fz@eKSyH?`kh@}73JkO zA%%?UwUS9=RP+ZM6VVP8gV~n$`@MkAH>TwtaqR8!f3jx?6Fs_OSU0C6ta>$2@>GdK zWY+I5+G_(npy}AZnZw4Mh15@}mwjl8QNhJ5K}%7LWMat(e!SG!Oo0aesD0#7oWG$o zX@^H<iiKHU0eLWmoc(ew8ao=ByVIjTGeLqbs;d&5i8EVD?c(;J)OlOasy|joC)E>m zkQ|z5tZr=0bcc#eM(p$cDNXbvBMdwtK#Ii3un}537?-&r&9B9r$oTuqn`peS`cLa2 z*)y>^`4%lxQ5Vyx-V2!O*eA{-jrK7japtVseiW8fi!w{{Y+Q`Qc0aIA{jwj@j~pjO z@Rg*drfOy0`&&l^4{E<lXv!MjkCAjut1-^E2BJ$%Fb5xHA6~yj^s&EwB{o4FPkyN@ zH0U>xU{R&BkpgJqgiK~76WRx3V~AGp$eR9Ys{J36g?uM!?jAGoO&9Za9c{-a20W?* z+>B7HSOE1`q}0^ag+X$p>(`}(G4a!NPK`)6Y)=R38zx)#i@zL0fJTnPy-1^(S?wp+ zC^9xS2DeU{KX>G%l(!uP<$vlVoko_y(rj;}+uo1`?TtbUlIlu@$>(XhC8?7Y29<b8 z;t_8eXSo9QWzK;#7WaLmJKddN6{A|k&buE(ixnJ1cbaA*%eo@kOC6&F`tnSwb;a-1 zDbGfS`4&sM$PT(KNzka&qR|2ocmp<%k&zUl<5Ko&J#N|eT~{Do6|gJ?9^c&ho?4Kh z$mtE~0I_n~Zis%?nF!5Fw3%>r-5*n#j5Gz&`UIkegwwmtH#;V$4&(2+r*S5oaU51E z$gZj>);+G?X?wVA4syrr#tT}halT5r`w3JS3~Z(l>qpjqpf5U;C^27OoVLhHA_L`w z3>Tpn!9U0egFG)uB%V6TEObmu`kV)ToiW@}`a8Pwmcu*8dts~){~eY`<GF>Gd|dX& z)&xumo<pZc2bZukg|O3)6fy9Q_5h&vbL;!+U%G02eZ6}wo^w6h$#D5l+jd^a0QJ&9 zbGVWQ=E)I#PH%XjY$!q1nE+x=Q-))YgS8oeD)$bM4;T4qs-%f#OGo-~4BR0`{CAL! z@eNVtay?L5(^j!H`S=N&2*_-YCYa&B5*URDAWKN_=@i2x3LZEnpEJ&gFjk#2kQzMv zcxXn1{z7*t6?s_KAPbP19QtaqF74dT*dT>B;p3-s4a&Ho-GlxD)Vp_0W=upe+|RcA z2gzb!Wmgx{WXY<`VzRxdF6|Zwh`$6X8rUV)jT)_7M^AV6-gy`3hjmlgF0O28Fl$_} zH?q~NSi>F#7>!PhWNEQv5?WRkFpwA)Tx6>P?wZ2O)U1p4==bjp_Q!~8`?dKy2qZ{+ zVoKib>Ny=2rb8V}yG+*9)bt`zxc7<Y`;pDq8TMC#G6NFz3uKoTjeQc_bZDOS+DvJ3 zWEa)cXXK8>ffyKO3>~Xf05z{YhF?jwFJ9r$1OhEUGymY=c-OxXRHmQtN^O;FHy>Kx z_(|g@u+)gm%Ii;#iik2wE}K#OrOx~T>oNv%91II&I#iUY+v!*~OIpl+*)5JCqH2_5 ziZ~T`#Vz=t*#aFDAV1R?$47>_zo^aQhaP+xK7Q-Gp#4*VIF?-fGHK~(tmkfarpb7L zVL3+VOb4Z_Dj&iGxV<x3VJ-a~7PELvT`DpiAEW-*%H7iTR#4${TVrrLg=N~-!+j43 zuJQyN5`g;a3Oi0@w{<f3I=yc1lB;`_on55ad*(}hfEX&8eP1<`Z;Q$A_Y;+6o{gvv z=e~?YhuZ@2enxNH!$h=fpk9kQ5AW_`$v73q@F-9XueYYAuq>$4l7f8k(&9)3JPN2a zC4+q6i83{Hd7bz5Ge%l6iKxKe8TQ@H$UXH6_cH}WO&JM(E0JhHLUJlO7Odiw{%A`c zu6Dj1FQ>gIO=vJ}Io@%B6(c8fbr+nllFI#Ql=KIWO24CtFPnxT{dF3EW~=~Q{`Bb? zwZ&o)*ugJZC#5{P^Slr!e3Lln&{i!)J1Nmu;he^oBmJLfoTVKmHk@+<GjIE4A|+aF z!b}}w2|Ahty_kim^xQhWYI@|DqoCtT_lUUrA(I`j%oJ0nelZEDvB`V-nsY<qy@*+P z@p>t8xUvy-G3qTNbNr013Zkq$0$A{}MKjWL=Ctz~aaqN|_u8j~nT0DgtZ~iNPG&E^ zxP(Pra8j@N?>g~Av0WTJ1V>6O-u)1=CLq#(Hr+@^+9)1Y1{l32EjHAM<li_r#I9_l z)u!=7Lym;AkhmY(2VcMCFS7Erv-?N-UFRAW*URkJ5du!CUK1`GMfOOHUK^OcZbsJ6 z$ge+k;%h5PA0#g?zpu;+{8O_5Xd<!!!|wSUx*chE#nZDzx?yMC|JWW8v4lXp!}AQ* z+~)df?4tj-TBB*S9W-0=hnCKFO~o2Bho`^V>zDqm+*D6r-vL?&vHZtPd~1*C2br6j z_g!|2{?`fw<b3?s2Fad-U-(ufU;D$2VC!v($ooyx(|M44uxCH9o!wlV@E!r0i>(e9 z;04$p===_z7k>FAyC>@)@;W#7cwQDf^rxG%+g*F&jcxwLpRZ|A;e*95=JK1QO9%JJ ze%$Cd#uu(7PNh4ef4DbL6#UX%MA`P#06nf0f$9$8z&WACi%t8#_SUK-ld6TBe(cWI zj5{0v<iReMt{?gQp_Dsv<EwuNzmD<*1SvKS_^q|$oed9Se_hU!=<S9JRRCw$J&X0@ zY@l&BOpF~K%dH5EbP$1d`<HJx7@Bs3=R1HgfSTDWiT|-s8wv<se^}^+*m&t+&CpkQ zW;Yk&I(gaMg!SVp&X@;L{nvUo(iz@+?dRRhDThb{MIO-W;^J|^6s?CpYzY_?sCtUG z{&7*Za2y^u*Z+I}?316!|BDsC4j&EDudH|B(J{_#KVEeztbAgv@5r7lXeGM2yW?pt zP<1>0F9cj?rRI<?QawL<0S&u4H0-}P6D<#5<yRumH|q8KndmhU9E{3><7`T3f|1of zQvF2`J`Qkrhss{UrcmgHlzPL<-OmXCjp@j-nt_4Tz+>)PeuaqWWFW_#JKM+iFG(bS z*O_e%%U}4B(tVnCz6V+g`l5Icw(x3iMUCxKt*k6KFk-;*R2ghrtYjUy46dMIgm%*B zK4<SLy$0Q$oV?y<J-a{X12HGKzrUfGQlof4F>VkwC?3w9dwB4-o}S)>dZ7WpoHq`Z zim#hL-}-`%>?0#S#oj88>?x8+;VVcaMTLX#CwsLW;ms?a7G;wjg&}*_Nl#h%*!L)L zaH?sA=Q(@Y<6KjLYggZvYvhaFTd%XCPcKu2zBGKFDucpFYY@2ygf-i_xVR=Z6~chk z&n|hUt;7AzY^1jeRWaoW08WqMC5^B4IoA=$8CB--e*v4gdb-qf9R-&b%@&#{Y#<w( zcC1Y%MdmtqdwXBTu0cJe1Y7DySgKO9Qe+;on<^remoJA;%&zZyuZkl0(1_c|zK6bs zqQu4WILeqbC+W{2kgswaV9KBB5Us##BoJBiIHJd5WnIO#KIipo-wAr{tX3i%!m6+& zCr<KhsCzVTk<}cnBWvOYA)8HBV0O}?-JC&LP;Z+n_u7@$Svt@n$q^ub`*u+b8xbjF zCjb#CC7qK?2@?syMKKXwg6nHB4vlyfdn<cQRJ(e7wGoz<*494UMA!vD9eO2$KAf2| zQ0vF68<S&-AFUtxKGJGh@nf(la%A`4j*3Qq0Xt);^h2{BY+cgtY^aKY9|{V@#^s-| zXIbJCrKF{cw)Np(0G5d{RMNw516kijejIR1KUg-vY}>h_nIhva(<K*TnN0ZHC8a;s z2=@12g?4=zcVG;m2LG~wxblQjJkPI}8ZX4Uc43RQk#)|p_gx?OTDBO!e*3GklLsO` z^;)s*BYUXmFAb;DKni0Acy5($!_9yy0b5N#ekfp1&H{C?K>rcH+g+WhY{dP!hK+ZI zY!m!HoOK@CSrWj^3`{`*LpA`bi%&0=yRNhBI%~RVYCA4llRd_?59qgN21cR||JPY; z%d}i~;VU+uv%S7bjp6S9T7OM_Pl48Lt$<5sXJ_A*arE>5VDTCXn?&QhZb$aipIo=F z0KGqR_N&D~I9Y7~{+C3pTP<xRZ$|H_x%X%8|Cgw~-jL;JZ+}QiN~&;Mm(KbBNmOiC zmM;q=VG}ptCdO=qpQes;;iT7v+FP$weW)1!73z$-;o)JkbvN*TpvbXzjiMV~!^wfl z)~XAkFq{1;&c8qaz}vZ`5!}#*dv{g_<80vEnb8l*-2)rc{E1oDp7L|cCi#*L6BcHg zLl?9n?kt>`Lr9k`Cvi7d1-3mji4LVKyq=qsvS)eV9=?k>{rRm9;bEk|q*Vx+k*7NA zN7>d}y9U*()Jofxt`Fr2s{s?O)zpvpbtMw3SR=DjjFU8YZ+&*@<TJKXUq3S@Hjck5 zU3Y&Wqqz{4abM~M)LoA=j++0Xy{>$sa>i~osshST&Q%Ge)DE(hjcoZBSGG+qe07%c zp`2_}(sp!-u%iu#wE?WKk7omGI<;oM%^KK#<}AvG2SHZHYIkfUXon$emYnUv)5M{n zP;n>K8SSSb%k!PQm_rhacx;X&{hx(n*F_D_+4)ZUvEhU;cjJelE@#QS4XgKEHR+nq z1dzdA=6br{H}&F`%U<)Xj1-Rww{Un{kdjl8L5_{NB{#W#KUbkwxE-jtU~8wP^ti4a zB%&;6u^s~U%VHd{4WU(R;z5W;%sJWm!LEeL^wBQU(;_~bbrpsaK3jD8z#Gi$z!OQI z;^%Jb2@#K22aULv50TWy3G4o%;QKw~<>!AC)X&%yN<lmg8BJnbPT(0K2FG2_IMI0W z-B!a71-WA5PHhR2#g2jEGn+U#Nzv77B73dD?_r<YLA|*!&>S3S^D@89{FENRoR3wG z8^O@k*fq-rs2wosEw_LF{)rntRu{VumM!on(PZ$oF_|=7^P-zwhA+q&Z#7a*OX>3N zg>O10Bs0_Q?8+78FKh*Ml+vtP_N?RC*Em;E=f!W3LAHX<$j&@rQb2#lEl7;oauOCg z{y{u5v{SL{j)A{Ouf-**eC})V)3S~$#~Q&%M$Q>YN`VDf>-ek;y_V*zPrWJ7HC0xU z^qD%&2MKilCulxerL9BVuFGQ`3Yjx&CW~#1lpa|(ZIldJwPWMrC|kzzQ*xAoiQ4=g z36h~_px0lAYN*H@;oDqdXPo)wCD(PiKA7m%#+#FVja;qBFcL!1+hlLdf=@cbIcs!b zu1bp<q$AwzDtWmKQ|^uu$+Agy92>#9F1jJdO2bD-Kz^`yGHc3+;w8?DRhkzea}GLX zjDhpp2WMviG>=;d6Z{^5w~Y{_ngng<cxyp#i7@IaMXi0NyLFN^KRz{GJ*w=!8rXUC z5x-ms4>k>_AT@c~xFL2@Aa<e8ed%?7X^B*>!GV$cGrMA-GEr)HtGoW>oA9;g4c?sm zM*G(gQSKU$?XqjFfq$cb=&Bk==QM_s9mTu-D`q@VA9PF(AU|M|@NiC2fT|A(n-w+~ zlVdVoP@#lOA7w!=-vAfD$#9>>5Y}Yzn_ltvx^~6%%*zF;l!3gwl43)<uAR{$9^-_2 zvzQFYbGUFU?3}c(+V|+*T{rg+f_JaMUve(!9P+}1B?S@KR~?d>r6ztgfFU9vMD8ue z1~(KcPx(g8WydPkd8kpwPKa(Dc)QFgz#mSc&THe^B<f@MLs0S>IG}P498RGd(EM|# zz_;Y-q1*ab(pT8Ap>Odx>?t#*Xi>g$0hI1?CW{_s3To#iSEMDM355#qa}nfZ=;YvP z*Dl_io-#tU<4m4P@%0rOJ87HBVoE2U>Fa)`pQJ3!2}Z;|=&aAgor#5uhVCqRg}R&# z>F%f;kl1QoK&_`qjMF}V1mnsl-cGR%JLA=;#O`OCGfFu@uBkb6UQ>eO;DG%||6JCc z>gu`?b*3=Gp-^VLxB3$&$>dE(nd_pi1=J!YWMn38Ou&7SFraK^DN_{SM}j$#KA}`f zc|zcu*5b(PmLI-Ywl7iil;#(Ay$f{|kY*O0W^P(sK-h*S*c;+c5H?Tj1HaB8g9>A& zkXWydS)Ua&XR&|oDZIFGcg%vMM3TE~mW)RIHKu}j^B@g=c&pp%M`7qrQURqb-?SOp z1)}zpF;8lWjT;J1HkN+sZQ_I;%MZO+l-ZeZR8}<;kt-%J=2=^gePFs(H&D|>DwFmB z5j-vVV6f2878*)vK>Q`YpWg%bs(M7Tqv_h%xrp!?D(H6O+f}bMZX+u{taKX34AI8I zA+l@c?0phD82ajArySWC#C5~{fX_(tz>p(K4!#~O8t4+&M?AzCcQZL7@MkUF8ba<c z%3P_7JP1b>_(L^s57iRFE61?6#zqjRHN4aKFAp2#Tm!11itnP!M3D7AL9U3BfbUfE zl31vIAju9A$+Hp`8(^K8vmfW)Q9Ksr9`dS^HEqg0DN&9XonpCwky|~+O*t_E&qQ*Q zgXu5pyn4#>BFEB3_v6ggH11O8hA}2zyhBkFb_iMvKvUZ8luyi?712Pm)-95nP|#i$ zXIW|%H|PKl2J#1ea|+lmzp_mNoaM3rd$gyGwn`e#Had=XMZJWW&?OV>LmW8=qvi^s zWeIS|dBKptGgnqFU{;xV9|s-CVp9h$cB7Oxtc-=2=J`N!|FVSHYuVGr-5nK&JkF@R z(sq+o8_e+|+v^#1nO=hr8_)F^jc3%Ik=Q*V{8`n;TN7@GRTwsJ;JE&KcNb}X-|eyI z$+jN~HgQ~f{4au(*+m)dq_%qiL8IhjalBkHDw@!Roz`t3?WantOL~jayqjaPiGIDf z99OQ?hyxQcsZO6`{b{~OoNeAW#Gd1fArqdJ`jz@p+vmnvJZ1*!Bv<Q^si7-0PBJzt zU1?@_IC{ZHvp+YhlmH%uUp#C(q44l^@C$4y{DVS58FnFds%LtL@Zr%`8_Nh3#H1RC z9lnAS=_L!QDW0DYqCHE`xf;)y2}o2G?*pAIAo%0k;O^P4!sAui6lRN0n|GfgTxDT5 z;}`i5k}_bKK<jw^Nf%pe-`4A6mu%IFyX43h-gY&rcXx%X?0Ynp@?YGDk71{ml;g)k z6`_Ug0h}*UlGe-^ym;=es~%)BFq4wX@l-;YHsGKu^(y_z*tw5e>lGeaijrYxX2u@A zHmRrGhn1AOH_wRm`|jt;+B)k+_s_kYP>hlpcN$;j=}7``vtd!*iO%7T-m4<h>9KDY z6yW8BBWUksK}ftI()ZOn(NK8H$+Fgb)A1*%4qb)%%T$QCgs;INa7I<R3(GXPivaHw zO-qm%@6CGZm^83lIVHzUlqEeH|6?w*-m%t?QU=}0@x~z!Cq#9PM?N$xp@PzE&xHp6 znd~@yMwYIjYH?}|M_63owMj6J!Vx363AL>8hub((cC6<k>@o`Q#EI7n;GqTfP<nfv z)LQ)dNUJ&9XRy{&t1Bkm3*?ln;lRUn0|QYV0k<FJe6V=jB(%EtjSF^P!85V(0Pvx} zP=-SCM9jOMAi$2q_c@=zFEKeua(%D*&7y4D>R}_AbXpe=LUXknnY1OBlJo<2X8*7b zylfd3v6y)gS&4yVgmfW$2Vh~U>XZ{gJ1I8FPYh9`oo&5)@&g33nn)A%e79aG7=dE- zdWS>pLHeEb;)R#_Inr+-kvTX=*1Rl^L>AhyFOmT%+u4+f<-Y7VzH~?DMVzJ|?7}~# zwzIv!_~xCjx!y*F2osZ*c4Y32B9PZUx?2*4AC+iMBCn`UU+S6^C+>RM|M)cDxwIMq z57|VqW3l4n!yjoMUctc6L5t0?xR(|OYZ-BlHnTw=BgD75i7Sh8RxJ299dvKbXo%)< zQQB%Gkkr4A*eo|huNgDFGcvd*loFJP!Zzp8hnT}hXf#umWT=CGvNEOPii|2Z&AcPv z;5}^cJKZm~VG;dI<%T5Kcy!7uP1nWR0e83qNgKEt?1%#&Xu31D*+~_ZU%=o&wnCDh z;6*DAsbs6DXN?#)1K}WZ7(6ysU*wpVl#y5OXfzE;^BCH}akV7196R@1xQJ$Kq_%x! zpTzjmO-pn?|8`DN<JI~g;PKAnZ+^LoB>Qo@a9b2R4Ng&P{FYlG%txbLR79^OBiw6W z_12UP`Ypuw8!GHia`6aH_qrKCnqR<!M?#z0V=}x%PL;V_-~~HciM!C8(fy1mnnNL9 zb$HU{SMgdZhMiia4a7^5Gtva72`N%+|K(omG5ZlrgV)eXP0(1mS5V&{YX9uu7(H6e zWZ0J!AAQ;N=hBVm>1y3CY|qWCGU)Gjv`%upMVC#`9RC7v{x1@4?;3Dm7gw$tp7<ew z-CJO0*Tn}-tD#eF_TXQKYLm-ksKijp{PXmAb=ieW#{X=~y{&ww<iuU6yDOy&-SYVR zjA`yz4EKd2<l1Wsh5?{YO=`0a6U)zs7|grafo*9GG0pfCdJ99dr<6eU?TlXCg<4ih zKDvLzAX=pPF3%!tO6_ybQ>)2<#COQi51uP72vql!W2~0Z<dh(xE}&pWEF!_EKVGz? zWD9`j4H4YlbvZ9L_b)y^zP?+-Cx0khTsMx^cp{^(^ISI!LDZHosnmlc7Hri32=VE0 zF46dacMC4|&p}$?|7J+zkPQw>;(}Rr<UD`6xN^efT&=}$2JFT=Q-X(Z<pmtnER7?6 z&JoXT5PJk)FzBNeP?&TykA6NvlB7&k$fkR`z5**n<o)Rj1X(4UIgWn6Ke_Pr>g2cT z#NJbc>(1ezrWjn5^sAjF-HeQ^?V`vz@d-`h-YX;3gLp|Xhp?oZwk%Rt(__aPasqq; zL-w_K>09OM$Q9|;k$Ji#Jy}%Aa4zjGdBnUMzWXlNQqUtYU5G#nXv`R!DUN~SIIh=j z1XVz}?<G({ZTh%gW6h6S%gKQB^+LAoCR2BDx&eRBz<5e1rTA=bQMoy19b%aUB3UM2 z{To*g3PCtS@bCF>FBz892iCbHmD08{vP@Hgb&qq{^#GL~XVPMGRS#ra_1JCHWTCz> zs+1AX5O;_bCyi6))~pQ7zOqy^47Syg4z;C}xl0aQQ!?bYI7E^e_;jZJ1({35upQYn zt{ldwZo)@*Z{xTWu<n}KnLWE0xA80u+Q*5xUKagUIeO7)`p#tQD={W2I~9o5Ablsc zwp*Nh4W`qw#Ac?3JqLq&K9ozAGV=q;Sp=>oMR6(mRJ=k{(`!b*3_<V;SEy$xp}K37 zl(B2EscUu?a;L<qE3j0GVuP+KYA&(l_w+*zwJ<^t+RiDyo_QG##1Ug3zg4x^kC1(B z7e>}Tw9XD>(m->U6uG`x0iYOmsoiapDJO^(s1X?UEKJ(3XLAC>wl^caV^9R5{{S|g zzw)-+qj|b?<`gu7-=AKIZyD4);2w@#85K!Ibz+;(Ah|ped8THV@qX^oq$b#L$_sLM zyMo6`uj9iCx>N+rwYm%06p)0w$*s=uonow4{_Z5l#PH6YRb<z|zZG3BwfAivZo2|J z^2_A(NX_WJ!Wo7CT>L5asd+@WNgLUD>3&;LeU_lCM4Mp*zh|K|i}|7}9%UY}AMFts z>djyDuz-m23WJUysLI3=?T0g+IH<V_mNwljACUNxWV57V3$O|(HGd!Tez<_`gtF_F zPhPXz8{dJ@fYX?GjF-y|QJB*Ykyzwia#PEFLo>*#h7pbvC=X!)f`pGTk1<2p8@q`q z5iy^Y<k{Iuuy&LH+XoWJv3AsxRwy`joii+{ECE|b|8YM6Tu|Ifk}SuY*{LrjzArWW zYp?P6VZp;!bjX~f8Q#^L->y54e5rR{H<pyR#OiyjXpg%+F5dKP0LM7T@4?8Y&PB6$ zn$A?dO`5cnUZAA28(m9xiFe|P96j4{7ZtSopUncXp^Z}Z6_jWvDxDnuQK5)J*e4p= zft`xSPF*M)YN=o-82gs60!ukK+Nysnk5x3j0-89z=G`Sh(_9nRQm{Z(YJ?o~G-Lox z{{5=tTAl)wXC7GDZJKc&iES8Gat;hbS}s{EH!cN}vq)9^yoi~p++&F<h!)?Kfd1DK zE0vR~ywmfocV+OrGB}fTl%VXurzG-k_1QPlF78$P4Yl%Qa{<qu!IM$a$9iwVQKgQk zUgqD7aeG*V-lxu@*<9#&Ty@j1X7g*9(A|;2aeP#xy{h4`H2qw}9#7(#dV3*B+bb?X zD5eAet~cZV;_#>P4k82yV(|+jg4{C^f`86%Q(l`EH>{$#l|CmbJ$xE6?ekR4d$Q?d zPgzM;TH5FCqaJZ9?&Ob*B!!+1?3JL-x#dH5D~8%^sbhMArkvUQ&2#y(_JKVeUT$*< zfA+g;+41jbSS#~HpEc~O+*7>phv7(J8)EUdMAahYvGG4f8J<1fJaLxEZreD{&Pra= zJ+2qQPu^Pi06b2=9PW$cBx#P*@eOyonp!LI!S#?dfI+hg;@8Pjf+`PlLcOH%m|ov_ zW}+3hc}MBE0woSy%(#q4DL_#}xtg{(C~8DMy=!n5|2xN1!ygOj0yc$KzFa_A??`2j zMUD?@)$3`<2Ml%0?0H-3)|O(}7Qob|WK~(3+{-rWYwTswP2aM35W+{9@{?;(%|Tw| z;|3e}iyldS^xs#F&;|pwlE}?XNq@^!D1GR?vzef>3ANAWO8h2{wk-WkZIWSQa~!ps zT}LvtRP@Vs_RR6(wbP3TR^~!B5~(8v4b!o(jB3ErhU~@OOF9}S9W8ye7Y|y((~IsZ z8}X{nci>X6T`>nUmTJ{_A}!4QcP#Z)jnSkckgA7NaPXuPN)Z8&Egbry--6<i_HPf< z)m|%@*a?)}>iJAnOxj;5Ka@Cj(xh8j?66iE7uKZx6nHfKt#cKqyAdbWBxocU@+5*Q znR@i-{WT|4PjqlU2#zT^BLaHTF6udSIBrLqXz}zOJ87}2=4nQ6I>fyKz~0^Dg@?CP z?21$jQM0il*t+`=K%*r=qds8|7Xr61RnOX(62dQALj22wLzT#7!Hj~fXBMEnz9rjg zZG4wXn(F3*_MM85la*^Qgt++Y;oAm756aTDRClHK2X41KYN<B8SEbEidJbZEyd(=6 zS~|0uXU9@`pf8CW9m##Q?EiS~NdPHw1lm~?;I`tYF(*8pM;jr_K)OzziWM!3$va^H zCWSS}!{P!A0g?P%5I$VdK~w^C0lSQ-^OC#_a*H9$lFLU}C;6Lw`#Be)Dj=b)Zu<hm zKQdN<jG<0h_l7A{C2=lGsEsGZbXZ7@%2ZeY)lT0f5C?o$<F)Xy(yOZJ<=7-6pnf3Q zeCu>EW35~WiA_8?eJ9S*1M~EZWhQwPBC}J&@a>RjJ$2=rBCauKY|k|i7YRc)c;sq% zQZee~NUiHFX}H>f<D+*a)+$cXjbCk&*V+Txa*7{ZDDFInj0ou}ckYnkDC~ztB|ioX zW&b??ez|*CQo6p~Y1y+`)sd6CJGWAJI7z#vmHjHnO>27Tc*;1RPD~wQQ6c+TJR#ht zy<;+DGFjHb$3<@OAkxH2R6Y-fMVtYXP6GGxhj($)dDrS*315S|$oN0Obi|7sC8XOX z-@rl{bY_;<jHj$}$0-A;_d5%6vaqGnpzc#(dYxAQ<CU2m!L`tTIdv!s9vM=ND;=1B z9*AG+TnX^8UEpo&@sUFwkZpdrqH3|E{IQ~a@g3|#LOb*0TID_OnV8HFp^47Jkyhhc zO`kNZ_b9kp)pcqtl)`}MJ57^SGy7*CpB394aE4N*X;`67N%mG7<Tn~ue+Zutz;*)N zdf&xS$Z`5jM`K~rx1J00=j{kmWI~7c(iPA(gE5JxPHh1&WoW(1B|9)DHlUDiY4n*< zHNw_JA54Gq7-Hc;IMsa4Wi?VBLtpPY06es&`D(g@|1qK5DSGMm@~)necu<w(E!k4~ zHewZ|mCCXU$JVCitje539+_6M9prPT^C27$R*v0P#>zz24>I)!U*VRQC<BWzlc~{? z>5X^Q1BP4trN*?3fXS=-6+@k^)62B#J<}wH?Wp{Mw^YApMj5~Ck}r)mQM^kA*658M z(W+4%s?Q|rl%-StMjLtfslhYW>RS5Sex^UHrX$(w2u5PQa&xwrgafAs(GC!HN)J=z zjR{)XQ*Q{Xk#pj+_!<ugu7c=K`#dbA`|0E{$Q=DX5)MsU`Z$(tH>~t{FovYkd`o<L zwQAIN>;PG}hMs`F&+k8!#RYc^zuTI;ihLRhRWdTSQ81V_P0Jy}dA&!J;IJFkov5U$ zCWy_rd6|~Ku?4R$37DeA_4rX#Tl*udSw;8hR^21Dtt)f0FF5C(`Gyi?bRmn1+S$o9 zO-9hxxYNbS#J05_&(VrB)ezr+wWbI=E@ijpHcA3Mp;>Swpdjara!<B-EA`*hNFRNM z&<>?6%eN54;#VNU6j#@=)sh9HF{=r6E|SaBK2A#`dw2mTLUJ~yY`Pf!(3H>`tASK) zQ0A61Sbp>|kM7Y~8!&T+fLgbZE}4Z6IF5%Eq*AR;p0PSUZrDE_-JwuRK4?zEh-u?3 z8N)8=@pN}mAL#GX1baNaUh?*Z0GnB5K7&Jpm({yf&BygdKLn`MF4qmxm@kq)7k_TL z_I#;@UeO9(qTMVMmGSM`#+g_BaK<@V52B1aw>WiY&eZn|8{TgmM(2Fjvt4%U_gkMG zyVfXvYpDe^lZG@kAX29^DaBBAVN*9FS#|=i(5K6*LF(<EtcjUS%f9$zoLGKpiO^Nm z=3obIzEu+^43Y6rB=+`{V=ei`Jxc?U?mq69eQ+?3TKoaF7Kf4Zo=M2`WF4}<ak1YD z+<!+gIo)CEBLDEThV{6TapFTCAxAD!ERXn5E_}(XrCs$x*sMUtU&O+fU2!szBW>}_ zBZGta_)D0Kju|mLS5;3yKDew(#HDBCsH&`>z?Bg_Lf6X2X3vbj`#?LI+;ClP!OUxx z7of8-A=Qp;^^OE3=mDw?|CY$$;twnBDB$534vu32iz}3ouR$&Q-6BAf7I8NV-UgU< zdF0R)n@^@-FIGNs_9~c!^~7K67B`azb$3Ka&%z$mOAs4<qAqZedIEAQDK$3#kWV%7 zAv)~&b$AhQTd^x9T?t>r{i@I*%za9p0Ig_`NlbN{ddD}M8eG|fRh0nLD4XX`=4>yJ zs<n4Cmh;uXTe`5afdv@lQbD1+zS6F&?tp#IGw#=4WEHi9_F9O^6fepfcNY*eCy1$v zO{U2ZkgH~MvN=mpQe?%iVhN*kkWJYox!EOB^H<ZqHoVk$d$Q92FuX<RnwQ~7|J-(G z{@S@h8jG0Idun1f&iBsgi`@kgbf|&#9q?Nj(*szx8E&Tm7SGMb?YZTsBYmGcfOad0 z!yM2}>qBEtuSKx29S)utx=R~5<W<(LD;^b6F1*|^sROUxA-gx*xLB3!@U%AM<%HW3 zlk+q+kXv2V7Q<RonMXcOl}xP+8yoGZ1_!&NUuJO;d*s}4N~f&V;>fVZYabfDT^5vy z(7!y8W=H-HgxvxJ7H-^)vW^MAHIhtrPc~{Ra*>zal?73xZ}tSRi!E&gWyd(o^up_% z$Bf)Vr3gpZRoSF*U+7C|)9ywOTZ$z<D86y<t@EoSc;@2dKI#Itk1^(!tCV19>r8pQ zg9ot<Fj$RWe4wQ@jo3R2!%dV9WqWtPh6bKL4-c94P_mh`<MJb3+@H}w&~D;tp;ZV# z2`muOe`}2hE3++lmbXNOuGg6Sjt=PzIY2!X!Sb(J>`uB+<;z(MO5TrLau9z+XFcQv zFmx|f5&@r5hFAKUemwr4fL$9;`Ui+aDgn64Ku0B0!*ijP4Zp1*bMYxJms(8#BZ~Zs zVylZ<eH;okwPrjP8`rg6T!IC5MwDLen*D2N5G7I|%2e=Fr~~}w@VejJCoK~%Vh2`l z?z>}YCM{@1oWH`A3q(j;TP?QdZ!Kq(W1k6)$>IqFEkSfn7S~(HO8Av7a4=-3NsjE_ zUI|i(F!}U=ZW@bowLZ$U$d!G5x4P7!XE0|u*RfO%TItlG+F|rD8w~a1pH4&|tKIQC zFWV96b*`39MIGLKs(H!Nfu*Zw+IDIPR_v!5QP{6q<KT#X-rtY>S4b{polO=BrTlRu zR2{TN`vPzJ)~%X>2_KWn(`Z>)(9E2rhC|Sb@X^(<k4SUzuyjt+eRx!ek>`MUL%`FH znUc!%h^v9cJo^%-dJzy#(w1*bcqSv$0}%)>9;M}HTPf!kSGO`u2fb-whPWIE8ew;u z+)NS#bEX(7LEbz7C&r@Go_EDdQ`6rv->aA(keU57uRzR!oNorZ6l!O81=r_6f0Lh? zY^hh;K34y~BC6Jb3#l0pmg_|t(25u)9H+X^)YuWOx(ZdhMicaS5sjZjh-IY?0!hl0 zz^&6`vL4cU@-lb>AYo+3Qb;{lpawdNvJxDFWS@?*t#suaP#n_=Bc=PjB5QjVjTA+a z_3DomU>P$hOJ^0MiPZII)4Z+nNZ`;*Z3-vBW$K+SrBeZK^e|5H6#T|T{`px@6?w3K z;h9NjRd6Vj<UXCHjY4QNYe_vIGaYev9*)Pngw{)dcVrDr%NJ#Wpdcu-C@L$2`RQe? zB*MFA3e<mrObc*#utdp61yi>PBmMtJbHxO3Jp>GF9RrFl6IY814};U3kS@eaFG13R z0UtX__`O+VJx^cKu6ca+<Vws3Xr&?OeYAfEcyU<MMEvMc&WE*|(G@o8QY!(B^G50? z6J$M*LyR+_y~~|%4RgDj>`NcGplalLC$q9=`et9zn-;YTjQ-?b>2zH!rf<ecY2kwz z_@gVs^pe+)ZtIKE8)dwqtr_2i5a-IumViO7a#z=fsX0oI)?ZBIq->oH*$E7_y}n*P zu`^6B`o+s`E41#EKnKWQCVwOP_;x9K0t{C|uRI`(h5~{4G>~^c-O7XTy=eXH05AuF zsq=o`@e5}KjMQeb`2&pTtnnwM@T4LznqnF=qLK9r4*=DuX?J2bC_nuJ<k)YdQgTSQ z23kL+<d6+PNnF_zK5P}cUi)rxQuSN(XBywwXn^g^zE>`D-SVuR@3zXcT6H@DDpQ%? z>Q`F1TO(bLJvpS#?F>v>H2^bSN@6mbZn4Lrfa8;XfZZIs=e<$>JHc19Hps0qDh$kI zep%tjrDMRg?DLa!WXB(Eyul_u_gaCw%CGKvu{&Gv+gmB>fH|jIS#Y40&2@?IVmC$I z^N+nd0AT>f^}FTn%(rXrV~T$c+zp8Ee%>Q+x1{w~W1V=sHrILA>zhC}|9)<LSoQt$ z9Ei&L3!$72hlhtx+}QaQs40cN?YOf(So`Lj9U)*~?d4DnXMyU$HJB7oR5|8Xors@d z_ugTaJaO0m0T9mKo}bvbxzXASyCTJ#hlh`X>GCNLL!llD96N5V0qM;pU?=P|m7{IC zOMv&OZA|RR4FPZB@Z`Ss5?J=vTs*Y)qNhmlN7mV-oSgT9?=P}PKfeI<+kJTuSz2qa zV_K;x%2L#*xw<wd+;{Qd#>oqZw!FDijLiBPM1K$CBe(V4fQRFXtO)A=!C62~!0W?m zo;b0m>vEn80?i30VE*SIn+rQkx+$#T&;IoZc<Z2<{+i%^&nfAU6V`ruERU82q-*!1 zaJ4By`PQjeY5tIb&+#jzg9DJyh>3C|x1#w@Fl>eDIVJkKUrEMcFhB0&h|wzQphrw{ z2%%nYdIs>*qdWRnO9s_eN)CENCx6Dt@Q2VQ?{d{uCNFO5X%<^rVSN7E_xa!e`Lo@` zO|Pkp&vAWQrw|KspOx63HZO;G@t+x(^z5!oUeO}Ud{iqdA&0C!lHs3D{_ILfrXz&+ zr$d*EK6@0VSO-<BH3d%;&OZv-EhEMsvYPBvvFbcG8P8tq^XDNMAM54NkXX_?&neVr z2x}>pYkCHS8><P9^DNsNGC5xvLS@9QR>s<n&!<g}Gwb_fRvw%wlZ;!fcdgKzs)xv| z#C=v-LRP2QF2ogue|D?~egPMS|9`A~cU;nI`@g52bF3__T$LqlGjn7)%0XpiOKqFE za%b)ws3_Jc<zy+D<sN0Jl>^ko0ZK_`PAXGT6e3p!0xl2{_}$ok*7x=LJ*PiT9>UMK z@9Vzq>v~_;`+ZYN>6v57kK$HIo);}*^hP^&Ummk2z$w4;`ChcLL2H7Vz+NP*F(ST< zYDJ)2d!vN4TFD5ZfLQ;D5HdSM7`Z%R4_&HN+bpW>e}{|GvAac`y4KBx-o=pvMoh%| zuoHM&k+9lFm-)`mRm`f~;@aysi}O()9QG4&ur~?x>DDMTnYM#46%|x9X$!q0><t*H zfv(cJM3{QmjS=4#!W(iaW!X)+l&Ed6lKyuBkqgVYA(to2uDZD<nJVt5Xf=`K@U=YH zptERV$=v@@$)gp1O^B_8$cau&d^6+@4Q3~Lqe;ILFjfJxn|V{)dtmS#lIH=fZ)5W@ z@ka@PYX!nRT()L1V)z60=J>=0BzCs#0TagO6&>LU%*(QKb}(~hXFvH!E|03&E~pqU zF$fm)8Tj$ZNzG%t_+}V>lihLxZg6}JGy(TMfX}0*;Wo0!m-#$|E@0`8v;A%m%$1F_ zgdz&oe%6G~&&Jx{&4!4dtRZMaY1FqXxzgQ)hlVUUL^TB>YKezVr~32dqVxse+S$`2 z`pGs??cg{>XvaF)FbEAdm;7ZVn#CUdh#H^~ZsYDYBgCh<V60|`jVkQ#WWz)`V@LZ; zh0XR_Zp84{94&Ef^B@kf$?l{UZK|M~v?f_R-KE=2Fwzp=m=$?}W)(Y8qPTkW&g^Wv zBS};<D7j6fwd6J=JkIN!2;Q)X&+q2BiqDz~RQgPL>EId@*@7bPb9aRzJ~RIf5h|u? zO*mGX2&!B}GHjXTHOZ#hrTUV=af}crY2%?1OS<X<mRYiC<={<Qtwxfzkc$N?t$7WF z5cQbS2ceD+#^a*$n`ccR3zHw>fHjETX3~s?2zQpq^D9yAgs5%6h-a;%3}7}92SkzP ztji6vHH2hbgddM>ODxUi2}Rgu9=CcUlr5OX9_2NWpr1Z1CO`$SjYPJXs5K!MvEJ_N z5M=rxb2y$)%wC+V$glArU&~&Ue2*{9Zn0;jK*vXV2jlr0U_Q8QP!y{&Lp<B>+aP*G z8H2Wh6$(C!dNu9MW2=?Y;+k#JFN$6c*SWcg28PR=vcbTCpOh~rm(kzOs`J64KG7c1 zg0*CePI3jwrBQyVP~o6Y^5C!;%tK5q72>!Y6I<2Kq0<^QZ4r8cCmB`NjR<JEP$ARF zx{aC)yj4?`fQUE54K`ItU!GWFt-32C9h&bGhwI(0-M=HbEWlZmAYEafl#NpD9)F!6 zvDmkg>$^1Qj+gB)7Tbr-PRBRIBQ;RjuSGt_0hb&4)rj}hEZxMWipBWpAQ3N%$Gh;Q zlqG2<1%w+(HRSzq$XDkbUwuGb%JwtM%)Y&q<X2Vdh7eum3gY?A$#wUdy9oz|c|}e} zL)!L>tzQmmP9$r&64)t(>65IcT+In(lAn;eJ!+kxrvHe(rS0u(<yvfi&TK?U^PjU3 zBhm3~oKc!l8<fxwEXyvLk2X;$-ZJ3`-z-?^Mj%WdV;#A>Bs*$sWcK>uo#MJvRT>`; z@Og<<8fzv<(2~*E86KBSGN~OsBAO`iC7JdNf*%rmNkO<fOWKFBcPWEwS!IJ6ONp8} zR+-ZRo$}Xb(pj_})_3{&s!jGIlBxsi2r}bbTGZucMSfM}xVpgpl}WMX!9lf0Esakb zu$Hc)8Siz~@cR+#w|$;19#DHXp6F>iF7Gq*lEQ7Q482?&Sn8Xe@tU%#BJhr%S1<SQ z^U=gVZL2L;H<3bf#tJje-Hl3@ziqF!dC-H`*xWq!(j9TRjF|C{R;yc0hu;;`U;}Dr zAGTl4DGwYkcM%MDBmV5ncz!QnW}_b>$68cm`HyB&v3$L3WR6WwkTC0nT0w>7IaoGu zUx9T3l#yCp$BlsCcM*)2VaBP{T~(@9SXfZ@Z4%<MJm~4N<WOi+H^j5~T8mww7GoC* z?%$VLT(V-FSai*Dud}%WMkgr2rQl7;sed%etP6A6uXxmX?2*|bjguF;wXmP&-I`@8 zcsx3usO)`gnR%>HRU12uZm#_2z;H;yW1>>x?&$n;K}|B2M;z`q-8^mk=&yUqrOqcb zl&Z&_yOKto&o!Ja@gC+KiuDS+T2%01GxW?}OGJnwb70snBq-)d4vlMQyPCOmb*)Fi z{l_x5GVA&Wq2&a>ZmshnhfeI!_TEaVC*h^GidhQgf!*xtD{12Qzjre8)$6zlo)*ix zl)?jb@ke1LhT3akig#hLtzj>AX&>_t#~&Dh_G~@vr(6`g-4=n^r;IbIXP;ZletmQJ z(mCtB_6X6{t<}TPuv2$QGE+ucpZ7)SvvL#!6MqtNOjqBI+Ot;t{EA3wFI#%a%TDCd zIo~z?;CH^1nP~4HLV8U6EKx2~Zr=dpuQ!m}x3e?lteCUDrmiJI`c2uXb#b%TR#70I zZ_D|=mfpognv^<?|8{%UY_09M++UyMZoQOC7=Ua{h=Q5AzAF)~yDJwguGQNn=$>*) za^Oo}s5V`?0opI^zMF_MJ-z{og9ar=EzM_K+ck8}C{u3glN@hyF(bn8;;`AiF*CDF zxn=coioroqoGpSU(3HF4XOIh@MOWJEY0n^6nh-s5hr8u0cR`+g7Om}ULp~dqyVNLM zJ&CN^4Vn2o^Sle!k7+~JeMG+8Juu&Oe6KG5xQ*yVDGU&j8?E?D(;`-AmI-lK;X17B z#8t2_>@^g=Fr2!&Yo!|GQ8V;d#U}CnOwotTh^5+M9fw(ehhbv)nsKMvBDqOV+kPzc zA6xo&7(tewhOE8|#z?VAdhvwZs?Tz&O{7_~Sm2fHqWn+1l+z!A_%bn&KbbRE2E4GQ zhU%qL`T$~=FmAsBs;*5yfUL2j+6<6HzN8*?S~@8QLHGy$TzRqseEYk2>!~Eb{p4MV zk%Yxx6PsV-=`Va<AU>S7;re0&(A+)8D7o(>NgMtp<@hx@z}9J|Ad&wjNCuH;hy0wx zuIrJ~($bHruiq^GIXL|{A^K|&qE}o{)&0M|1}K&ArDlQuJ&D+C?B(Uf`fYLR|B<$Q zc&(YD43sD5uSh%aZ74r3*IDspB&A4?ltZi>&VAGGy}eKtJmH#u_k^2k=JHjEE-#Hs z_W+pZP-$(g>RiW-a@vm!@yE60qWeC7;j1lN*NU{&K`DJp3Sy7`a|Qu4h;*;c<s|1< z{1W8<G>)jb?mO2y(CG6*Go|6mf0&go;-0A(f0>~%K$-ZLoX+E&4DM%b&11(af1jBC zceeA3mB}ynePIl!oBzdPctFg0U;NUO+JLmw`)63of11HB!oq+y<JvQqE<MuO{U5IT zHL=tr&CKksxZwNSznhpJNuUxK<O*}p%3!VKIEkG9Tnd07|30^TX4v~@mC1Q)K-O6| zm)HL~Yd7X(rQf|PEH18=-h4~?-_0AyC?kIo@jWC1*t#!xpRtnEd56<JzX{eCWbmKT zc?pG4q8|QCXO4KduwRlNf9>VTjT~JWWq9S}x1{xZav9l>(7bEkA#q`0VWsrOTgu=T zfGZ|x*`Bu|p&AnZ!ECN#sM7()0$2$UmOi>bT_Pmp`=a+G7}_5^uj<AddaYjV&yGUi zr@CC4*bYWg&%LW6cu1TBL`(FU5JGtX?cCIJ413rw^ry(k70{_4J*GJSe61AUiF~$f zvT4v!#Q4eVmRo8&-7*aNwv{m&z1nwziF#9b6Dk<(Yv@3U?^4=SqqOm(9lkgT$Hp3W zq6TsDmbWZpxzA?GBLm|f#53JePEGab9HZ|mGwzD|)MV=HqcYR0sUIz&o0H|DbfJxi zu}pNM)$?$l7@yS);GU#*GCqz%JA>`+(fUHV8F9X91Ld!=W#}i#(21-ped3<&rMn7` zK1=mZq;g(=Mfd@}bEpnXm?YZ!Hkwj-Z`wV2<vY}UAuj%7fT^M9s1PE=N?j2#6|v*h z<aRB1&3m8q?9UGB^FHhA7WwR0tgs=SSiQeMGIgQIA1$NbxR|$gMW9)(66(@7CgJnR z61D7!#AFHmNAb|*o9??t`tlOfLTc5SGk}pOY-D7Z7B8Y4EUqs1xgPQ6HFk6rTk!_+ zy0dHGx#SerA9yZ2i;%S8dXNWzZ*o}If4N0aiS?En0g8tTaxl1w6fkQS{JHRuQO1$a z8ZxfC`z%dY<Tjwj1taPQ^^w6h4i9}V=Sa};W6ly1iG)|h*((5k;X9x0LNz&&OdZ|W zd^<7wa{V0^KnxuD>02s4Hz?|E<H{okX_;QN$#0Z`fEJ<2Ht0Hyip;Y@24cc<xAi8+ zP)Y$TuX$*%Wm9v99k%AL(e>!Kd%JD6F&t@1wnH7ZQNl$y3eAM6dGlGY@4}}7`7r3F zEICa-ZQ7|PkR9pBYKo%Ntvi~%JucQ=UKy($&)5oAIYD<0u4yQ!rB<R<+Pu;zmQyan zl=x&*xWmnljH(Iyx@zrp#PKPzjh0_``TN-+MnkRYZWQD&^j%();Pw{Fg8am;ruX>Z zCzZAPYrV%qhpLi2PqOu{JpBSuer1{hv2)3m^kJ{j&*Z)f;be{2fqy*gD!#qzNybO} zB3BAoo}Q+)xhL_Rs^@U#?G81E1I$yM(QCRk*g|zt0cpS>`%PH*!+TFJX=nCxHJG0R zRBg`M_LloJnL-jW)tceQq%O+C3*5pYZ}u~b(tK<qGqAsZG_-pkS)(pUJA3-p-Fc5x zlL@SX{>!OhWfN`<6t`sl+tH#UXk_;+SHV;|6tX_nf#K@FWZSoQo^w2ap30%k%xn6# zyuLJjZPwJ#&|vMA21WYso(J@)IazUf<dfX)?n+%XrD<C0Gu)(jv>4HiI2M@Gv0;?i z=xjyJ&rmpPJw54SRoycdZg(U#jNxoqD|eo(Xkh}$`Sh}Kv)Z$%AgMQ7y92O{l-&5> z8AD|xqyLd<?MT;?;;zo$9Q>MU^SVRE#wO~X?J9;v9x@*)a(q!`rfgj^mKNFiEIg^; zL%BJ*D`77cdDkZYJSos7Ao5;V5woK9O6fmMNmEbHDq4ZjRp2YXH}vV4%qU6=#w=fb z);JYjytqjrb8(XVqkss4XS61#C-DJwp{;Pm<=nX0XN<i)-n>m}zO5a4*vC&A7Mf_~ zvhi;Hqm5BEY5_9{Qf8q_nAS(#MHCOh;1*%Tp>_MS|4JUcUnY7K7nz04pMOQ^j!U+w zd*gO3NU?*AbHE8@#i{Ljvhp+2#;+L`w63_eF)H?E{UP`^tTl$)lD^HwquXb%t`^}9 zF>pw4EjQt#mURU4DdW*c!BT-;vx^Vfs%pJ00oyp;R^1{fE~)iicAiwQ?dG$a4A~WT zzx9F4^)l+J1K#-k$3_o+eRJmF!;#}vi{YhbvhN=&e_Map#EzVp%DwJI3Jtu|6Q2y2 zPIN`Z;F2<L6?>fyVsw^PeYydB9QP^d{+TQz8`Uu5FhuwwrKg#yTH&3rk9>?8W;EnN zatBvN%I8k?J&e|PeSe1L>ZSlY2gsyOWQ)qc)GO7a(FQd>YUq1hL(PUjqfCSyA4UqD zN-L1b2sr2JIDclurr6sAR-@`JX06J;(f>ynWIe-Dj+a#BQS)T5xUAOO$r{1SGP}R< zhf@Ot?AIFseSOC^Ev;&4m1n<tXLC}==BNJWVoW{Ny`4^y<+0ULPmnSunHV7>vES_# zFQYfa()FgU53~9mDi{2N{SgvA*m5RhyINUrIw-)5(6aV$KY7N!y77JnJMqq{BT*!! zbA)TAcllOXeb2dD4E2xh?LE%-S+;WMneg_B>Vy=kS6A?$Ct$^<JkB36SJoXhWY_FT z$l?b($W4VVLsGhOx3bN`V~l7oY<K#Fhe87)yM0{X5!}^dJ%8nWA!tjQB{mEff7APa z{ns3k^P<kmU#Bp<cz-~#q58YPeI1^OyB}<w^nZ{q|74$Y_t*h7*K%E-lWINDs#=pl z>et%RGa)q&aLd(%(GLEz%N=)S-}isqxlgX5|9Yl=@q8m~;is_QuXL6`o`&({g6&hi zWS&-E+*-dkvL0=MZJ<+u7G?M;ZZHvBHr^GUFZH=x^G=#2&*ot2;5$jztz+`!&V*5D z?H{=@$`%E~7INAfEIrU`JI8$roSjx5`qJSzCr$B1dVl3!iI&Q>#hWF8(vPhaS+nH9 z<IDAjNDI%fkE|SS$~Ux>Qx4zlBuJJoJo8E!c*yFWjm1}v^rfBpMBitXeA1oDymz5G z&SZ>G<B+@dLG0qo^LAM#T6rXyq1r*qXu^3~h{M3HiuQTWH#VX#kFIWiwDc+a$^|s@ zegA;r6VyHIxfRG^AB|e--AIdxp6>n%`#&Bu<PWtz%$IjaU+<O#`W^!+?Tf*DG5dRl zo4g(l7kPz7Pi=Zc!#^)TKZ=h`?ee*=^{tqr(sWA3Yu7&a?FyjF=a(0|X`;SWZDl`? zKjnhnJr-Mcz-Ml%LZ}1#FW!?(mfkK;G$pL!@wQ73B}N#VX<)<VUVo;U@>zb&q<^{E zQ+Q|U*0T#tEWwQJzZ6MfrwlyWdF8Oj&4L-d=ZMgH)%kjY@ZG?Zba(AU+l%&Uo!bAb z*{K0OG4!^50oo!#w>h`rreVZw-Z~RhdJ)XXhZJ&usE9RF>WT=0J{eYg-1H;H*#kIT zKxG2RO#G1;{d320d%c5V8fXch*!RHnu(~)Y5jAuDVa=k0dF^VkaLW*n{@}4vP>q&F z4U|kypF7m6>Q`&lsie@H^$+&006|+9GvgL%s4GhWEBq9&4|TL;V)HnkT?m2aSbv(g z7qqk#KEzvj?Ap(?Qizj(GQ2^1#bbJ%FZA8n&cKX6q<RX6r!3y0UBYbH!KYt)WnEJH zBdlg*SFM^u`^nLnn$0|8Y)g8$1&Tf2b>&B$2l>mw?N)x7!0G2~vr^#Agu9uF%qe__ zjiYYdWPu|oH&bgUKg;_5)^GE-a9w#>ZLQ@ASnN+R%oQ#!$b)Y?GOtc!z0%wEriF*l zaptP#R-oA}ppNTv^H1vGu0yYqO%`gY1&lWKZQSKqX!#lhW0LplL}l^-8$_d2>20J^ zocsY2QuFL1^6*lr^M@UjGh9*>*my40>yYThDoV(euJls0=YdgI5$@HKuog$?k(TsG zJ0k~_#>1A&BV+qeWoU~7OyK;__n@*Wb~6fE@UOZ8FC72o2$%1><OZCeT}^n03Fd<C zPk{%J6G_}h^}l}z(Q&jfvDLmEkjA(-j!<63R|vTZzsp$OZk{exdl8*sTv0(_u2bvo z=rBz1@o0dD4_R1Z)si-8Z**;bns22T5?vF!<<4LQ<23IHk`j=^;cuy0Gii+61F=Ay zyCG-#U=cgT9euXX*Ne3_p+Y!qRprB&TUr{I)KEoW&&=ja*UaFRF(}F4x!twVGI0os zgM5fQWLl&i;$>oeE<LQEx^|{DpBFCo{)Y~R1c&%m&s<_2TP-OD?)^OxAh6%N;h$w^ ztQe1(A88V~8G1N1`@X)~)<M^Yiz}>g`>8>fKc0`hb@|LqgE*EWd5rsy$JPohR=17R z-cJN<vij4nImyw|pVDy8jbybz%@X?=Tj%8xHjzY&KcVR6Cd^f>c#KhL@Kcs89p1=w zNw%<hD0%ny6A3-Ci?D0%|K)8)<?K#l%CwVIJ)(K^EPPR*^uow;AJi(eftzFdOgY1* zm>F8+m_JB6`R3X0RwL#yl&+w@gP*>R0C_B@O>p}$L+?~xVppMeZBvWwy{SzU)MOFl z=umRkq4#gu#3Ns3`QQoinmN5Cko>>9@aQp4LhnDW)BV$~ut(5%c)g$D748=JpQ<Ur z7PWa}GYh0rl!OlLKjI++YUDce*UyG~%Dq@G{*j3Kc_1Nb#aFq24s^GDz-tv6C3VH~ zEnDwLd#j|!$<u6(EWa@CXD4?NYH2rr6rdVg@*BH$IzT`_Zw}2X?bk?zHJ6VrJ0>T| z_P#2Uyg_7C{?P-T;kacY+7oX&Pb%*Kp=;;2ML8$@<eKr|v60FzuNm-h)kWwc+@4+k z{uO~B(d~ff92WEEEN8UghSz-|xXj>Ae%dR>2B{0@C*c-fSn=QFqFyC*baY@O1zcmD z$bY`0l#V9&Na~FjKt$#+ov+~Aqk}-5WXtC^2}tzIdr2LW0Ut?CrcDA_rZ0QnlNGVm zWjFq5$iZmMX;;;J&&LJTq)gH>-4XEOxc~GRfEPXW_28#tX5jYv|LOKQpp^clJiXk; z(J}wAQU8Cxq~uhxnd=(C>;CVrE!uZNc}`yFE4*+K%HIG1y1lTmq9`NrNKI$QTUSRw zzc}@MP60U-(V*t=`m6TB?fqx1t<^s}tNgTM&KVQ1gLd$l)MoosIn(cP5p1<Y5=L@B z2EuKF`Rhm5bF{Yo^4dbtYruv&`F)0efhXU&g1}?T=bWG8j;}Y9$U;elpZMOJu=V8o zDcL`y{`IN;`HPv`w6$^4^Y;9*Y4pF;1J(sTlDZFc%|6fJLw8a^&w+bo$Y>gTsnq&k z9vUoxZ>A!dtGTuZ-S!8MZ<hYI8JKIdXlywcTP=Zx+T_mtgtpul8U`!@3m<$W^-0o> z4O?B6@zsl_HiCn9kOkK0Y9mw7X7K}QkSq|X=RgEQMrsdQ(i-xmsiDOV_!_VzSd)7e z{g?6h(jqdaE3;rFY;Hy5DE+tBoP+hW*7*Px*+mEJ-~SBa^q}OsfbWqAmt6rEqNHa+ zoq6ZUw*kZ@&UgD|i~FbXo`cL>pKdtN2MD+@Y3VsBm~VK>D2zTVDlu9OtW<)fU2y=& z+?s|i(&zKQ?sdz-3Xzkj;lO<FZ~f`%0gQeyw^2@G?1dT_q7=!3mYnYdbk>f!fp?uY zwci>0)2f!h?ov9YLes);sF<%=*c>W%Fae<NFytS9NM7y-DGz)dM8e<YoB-Ilzm7NJ zobr<a%v}?}Lcf47oXF}GKQH{bFM$mAs}#+g@<8e+04B%57kB^qLO)AFefeVR>!M`7 zsXge{|0yt+ToNFHb6r?pA&wS@fzD>hMjS7**bD%uD5wZD(L}>qJdM6FuKwwl;wA|J znq@2W4Xlah$qSk(oy4Z0KX!MPPL)+vt>`pBM-R4^w_MUUwmqs+uudhlh&br&=CC-O z{<$+e^Er?d4Pdz4S`D76tj=iY*_RgYxfUjg!<|#(0=r}6B_~bE;dQK+3L(}8X6G6a zzSq6oe6-xf=U&?_af-Cr8cD|1mY0@B`MQf2GsfA><c<#SNT2Jin60@S?;!n%y1Js| z?UrECw18lyJ!Fnm^s9Il$jyFMm8;rY`o3gYry1E!*2`(rHg|%3qg`u^eQVUmOXS5e z-Qj5@*YqfCyndP9ChJ{Cx5G@lN|f{sx`;yu^)LS^xfx)I{O6kivA&!_w4+P`<ET@B z%Z7|pM_D%f!xK)7k!1{I_CqS?8apatNcdc!N*TY3Bog?XYjlAwP5eN*j$s-R722O~ z6^(+1Y&R||RZZ%&uInkUUs@Vvbp&|9$|>Df@sf%FeNAA`7v9O7>HK7cl)G`!{yu@~ z5u$DlI*uCYH=WlNwKbwI&T(-UZM?%@C=%2Km-*6asu(<z6~2{&5B&QyJ&4qF(shO( z!qC>LfmqQyevk7IV!BKfUwOC4yvn|;mt5VKV5{v2bol#rT|EIpjSFYLcWeEN1eTK9 zj>2epW#u|v1m_}oYKDaDL#i%<%VsWu%dL^Y`5KiEo((A7ATpJ)jHxnHyNr{|THLiJ zVv8V5Umz^efpOkq1kbxM!%3&;iUxi1wY>RA;z)h2cO+I|6w=k%S=Uiu-M2=5g)~?g zKsV+;n(v9TJ0QCernB|71cf2rU8*6p@U6^UDMDlat<0o(Lq*+ntHU=k`=Zv{5yY;Q zzT)nd{(IoZ8~(zp^eWc#{_a`Rqy%TLvXIfJjTHvA5N)GSLuPAdYnGW>-4bb(J24(< zFAZtyq}<>rQ)ezrgQHu!&p*+;WtWS?<6DZ7-_8|0{)<iWB#e5AoL6Q_9cyr~oWsSn z4OKX1;il-bN9;?6Kiu%|yPC+yR8drcXsj&G7rsrvlkX;!(fo|;d$dwR9$UJh5?dK6 zRy*0){xxc)gV4k!@SV&yghSMa(4qZgO~$9BemX-gbAjJ9`3a`7^u0~l=ne3Em6e}Z zx1Lu@nj|&wE|!#kqq#PxW;e(CbzX$i*3?28M16D(<+nP@1|n5u;c}`nU2fwACwVkw z-%9=jy*eE#AJTUjmO_DT6olzAYe)7Eh5oKqSFD0E@a1s{sOUbwP#vZxnbif6#UW;| zYN83+Eq!;3uG!WuACh$ih36JOo5;Qw51qPdUFZzitOd|<qXuGqflQ{Jk;wm^)@F$Y z<$v@f5?w#*zA-!B+lQQZaZy3L@ysN6UGLQ$PV5JXPHZrYnlX<2b~PfDAiT<{rqvqF zK9?q}LU69}kX@0WI|>*X!*u$Bx|me~Sqz<huz^mCn!eaCLdij7pfhjf=}-~t38x=o zv=U(~fNe0v4o<-`78yj&9%H?NhHmMdy^%;aXBn;(b!vm*kyTw1SYfh?yL$JU5H?iN zA%yXS!#2IV9{=na*`}<&6_mQHN1WG#VB<edfJ8yZGe?XDLw^k%QS3|R-2-dGn+*SS zn!JIAP8SLwk(^WxKe;#>U4)Jqw(hFq-|O)A4BLf&R=T_meYRwk!+Bdu$b*0MIWRoS zYO{oPa>`u>b-7HMMJ0KiIEzMpZQp%PuE1%7u_-|T!E{lp3l^v@0M9KS0@<w+!X|an zeDa9|;ipE<#}pZyUG7cE=KH*m6Tj;VbLCgXM2VbV?hTQn-FaC7J7P;OMoa|{Y)6K3 z9$;YN5e$s>ghL?kyhCSCa$S+Rm}Q+i(${$xADzOaEpe&2j`!idshWm+WcVaQ59-5~ zG>W=hP9+(orz#JlV{E}OsuOe_7^A&A+(@w)H+Z^|jztpX5KPxl#I0!i+M~*ebM3hQ z*)ysfkry6y;(f@>CoU0G6qDmBlxh*QF^&l#c)fA($mPyUy9)gZk&5cR?oi^;d42ET z&`08_DQ3gLbA9C7<|I)fJ<q<u{or{$HxoOG60#_!oawQEMADA#60=f)yV~HydeiMs zyxJeOY&OOgvWlWOH)J40`ag&4JYLCH@cs#>G!llax+WKGQjxU)C!4XLYZR&~8WdPY zn-8OhMmr61pH*cjFRRdcc`uuYS*HK!es#%G{Z4D*yP@-yY077lD;CwVb`sUP817!{ zj18hT&3;;gx?UA2=gwe+k^{HcItr|YX(a+8AI9`8LZ65(2-*(Bcjl!iQn%-S;Z=T- zT>BvtS@B@!+b9q$sHC6lv~LpOmg*Dhy~z>W%A4K&=%e=c>U`C7tuEgyuDJGF;`RTw zHA(bkBwERm^vm*?6L0oixj!Yd1S9Y#2QnHljOUHpl|l@N;|CXXb(YeSlg-Z6Dgoh} zD+S#y#Z9ojSn5bjkwtW0N5>go+^r`d4*QouZ88iTT6`rYRB$f#M~M#T{tm|W{Z?2M zjj6tC(m6heDGk@#R_J$KBfXjaxn~elQpK{|;q9}9Sq$Q9N#vP7Z?odRc$zDRKV&LM zA4gT7?$M`yzpv^CIr@VGj+an`*Lu1*!CWFu3enmz1y0)|L{-i7xTxvl)A!)23$4&- z_rTI+`Uagl9@bojWklPDMO2OI0vE8#0(5`R@+YL+|AMXF()>M6x)~Z3D)qR5($K`2 znKyUe!6|9UeKm*-nLQ>{)3Y&M%2&eik=yFOk(rcoaTudQ+wC5s1_M!y)bf@i<i!Oi zb6RJX@OhtoLt>E36P=|C+w3csBSbs$iH?Fs^z~#R@*!OtPZx3Kvv;p%?czn8vrE=3 zn7mg`nz`p&)>dk&U;4nyh6EZa-DL><Tbad0MbUFv$a0+}63f|04Y<GUd)TG<QAq#o zm#0kXf=HgSa4}k2Y6?uvN(V=&&tu#Yg>PZA?cKKuAv^erSg+JU?~nDEl}U9?L*biM zYD-c~p5H4Jd(l&K3+O^#mW-I0nZ1xU8DkaQCx}N@*=8?>%VjLlCX8L>h%2X#(uYu4 zi+Lu(a!gveqoboNqrfJ+K*Pz!gt0E2RNs0Jvp%{XxIX)CqtA843PE7_L6fz;RN_k` z*}H?^<EaC9sIk=h{!tgV(8%BB#(#Wf{?GINZTyqI2~_&t)Sb26jz&&-?^Z8&Xr8fY z^Y%W3w1Mz7?<tr4HsRzMxhZ12q?v9+gBwS*zd&E_GXNU|H+wNoHnZ7yHCMG|=<pEx zc_LlK*LaPn%}P~<Fx~Az+;H?Vafpw>hHdgL_7E1i_Z7KDHWSLWr+4?empKhRsXn0? zGFVax-eTeZ{uYwWo_{ZHPD5M%6xoCjq}dxXtb-=^ZN(J3w`;ix4+X%?e4Fu`tyx;p z_X@i<XxlGAia5un34JqF7{L-=bd{ME=*l<EZf)+TS6@>jQm-}C`KlWd#`dSc1BW`z z>$1`zOQKkL0wOeQxP~q?&z2+kytYW0Sh>V0Oz(OJ&|A?!vD>Wmh+51h7XUgPe^cKA z5?!EQ)^N4-dys<ti-(l{#iDE+qUJ107hn6!#GU+-{LE2MzMQliH@=>Au=B-1GMW5Z zq)v;1YX<5W2MnH^9@Nf~i4uC$E)VI8*vT~I91pFp6%Y;F9kAm4p?poANA0R&BhG~s z+|)6Bzu~&(GCEuiba0Mb#V|UF^qF+k#c2FsEePz5R<R<+b2;TxxtNth#F?Ib=N!8i zt6X-&7&s~}DZ^+~*gF7O5SY@19!cnR7~j9g=DX*$eJLQ$|9NE>ZbL(VSu@|>Q2k5t zBnf%IiSSKJ?$BwmVP%0pLkd$>yZUS?BFllYfDkz2MaLmVS)5h_s$|DJM-FD3N^PiX z=0arAWSG_TjF9IhM(Ef@aYD(FAgBobbgU8~mIpz%i3&&z=uDn~*sH>BT`h}~Q(dAB zC-%|BBKhov0@L925mU4G{PnyCte-bsgHN39&{>3wKxs+(*j&fr=evb{r*bS~%gO!n z5~X<2FVpnRzvcdrsZ0Arz+ot}inz-j171!$3PWn0c&SHk(pzDxWyHj*+SjWLRxg2b zO;&^Xx#;k+FYwa?9p0-3VzGg#QV4CvpFEYPM(j<`0wI{G61T~Cjp6bT!uE8+HIKSt zAqv?ittuCYY;zwa#q{|#i6Waf&<CNSJ=2a+L(TLy7b|yEvdPe^llqWrj^z|U;+^S- z2VK<!Dc`Z>Y{TP8-xCg{F%d`V7uV3tko#o<zd5}x`_b3<2<b@fTU?Od?BpVJ=CTJd z7}dHORILJnQzLiX&)DCO9NhjE!%G5oB?OD+np&M!)um~W5AmM6fY4ttY)c@c8^gd# zgV*g-9->BUYdIXi>um3yMiP5{P%#W3uUSbSa-mnN$RWjJ`Etl?0n>#ZUC<rjw}_u* zA4Pq7F$bd|JpShQ>c7bdH_t%0MJZjS*yePGlaKIxildE8vVN&&Syq<q`Gstg@qN<` zgxNt(Y&uB9xY-Lqgt?5nI>HcG-Z^sMr*oC8=Z*eE(JA^&WImBPzZ<{Ccv*-C5w>Rc z%AtW+sx72xXbPBU|9rZ3&7gnfV0=4W<l(r;x=e(Qj>9~wU3Rv!)6E?|RPb~!keZ83 z{gXxGmzxuNAGF(3qi8a|wyo)`Pl?JC0fgE5Vfd>9x|yRuDgY8TdR3z4^1p9klE^aK zv0BL&7Z_^IEOtBls1jGZQZz6rLm!4luFpV>og^<{IO$D%x>rCSbqw7)i-HDjWQGwV z!5gcAInJ-^^~s-LcM1J`8+#*mgUI<UX81}kf}en4eAwW`d$EJ=2BNu$=31z%_+v$U zG%YM>ot;f`Sfsk$Ih#cgBkr+jbhhcLtSZcH62ZXl%zJfaQ_#3c^&BSl4=*vqr2Ukk zP$UN(!FJS&TIGT*9?D=3MB6Wud9JQYP1hRF`%MD3{ja`O0yJ4nLYZ~I&FXutDfTIh zp;fZGImxn!-Lu!SMg5#&xatxsEii3NsQRoar*~iF$U_i{R8O(|g|(-gcvscR!a_lo zn+nW*WcITizqqf;j0CpKOj+7AKoX)R1G8la!QxZ&xAo<i<(<T#R}qF>CZAJ{GF1}I z){<h_GxxNSWy2MVaNR9Ii0O%Ls}9L_FKG{5v$kF%N8~7;u&MBw#6rWc9;?)sHjIIu zr0Svu4Sg@_&OH*T<iBZ|M`{ek9a~V~6xM$!l$U^xhE8<KJF)VliP<DocD8utEobc1 zFfrFnJ>B>EQARo)MruWhNA1mtj`)!YI>QeSwFBv1iqYh8;J6bof)7HvTSbK4Y)3_; z`s_eHDf-le*WMxDO%v0((Huw9$o1e~5b7;`5nGwmsP(h$G(#mz!uzT}^|MhR!YWV- zD$k*8h1X69trW0qYw{?}XefuGBjdN~zC=!b^Ns&0{FF$7OHR>{AbDEReX{)czKEtc z4Y~o!7$Ra?WyuB#+M>~fK{{v3&rntL?gft63Ncy9f`^;FZr@~0H4Pp;5=x3h#fS%! zS+ZTU*^WYCBZl`1PK=8BWJM&1U(-3=`P$d(XWiRW=-plg^!YsKGSQe3VRbEi3GaFh z5?h<k8?1=X#}C!;q7#*q#`z@oya_Pah^Go6HF34u*o(Sz3NDFftujY0dC8PxF@i3H zdOB<hcStdQRPiOZ<hsF{<B~$b{}>T|I|e}Q8Q8;sTP(v~CJuJQ<#K9?BqWrV<l^K@ zGo#Po|BBFWaYId&8bs*fKj+sjr;e$45M8X5O3iH+b(M-O?anVkil)anK2Uxt2NlKF zp!2L879@8*dRe`yxJWC8lnLJ+!Goia1b>P(k(JJp0oxq_xn?es;U6wmI?=4_pyE~{ z{eg__M0RW3to8sehQ%2&a627s&kkv!iLx4cvDv%BYV(UU=fR`xt7^(rleVs=tS^I2 z75_a$0U(UI;P|M?nMJr}`h2A00@`dI$di*!Il&xO7_SUz>~}-K`&yAi@!%`q+c?9f z@`wq}DSBN~=M>HwV120?H|gEc^&rb7UhbqtYHy3NMX-aWn=26dz5eairC}x@Gz;3= z(#Jgnkdgi5K%Kx3uA!~)c%P^SUws4l6J$l~m6<6&#A_ek2AHc#+9fq+M+Fw6VcmD+ z!8y63eepIVWDAiOHQiV|@;6z)+-n16(?-njhY^2!ZfKVWs{Cm2azwkC6ED4OsK3@z z+((DgU{RG5%v}Gl1I0Z1#VQOLdg{#ydNP3%I?aGa`gO7-QO$6vsb#b^Q+z438$e?$ ztoa!y-piLtAvKikN3V8b%YMIr-ouD&U{OQ^-C0i9wchB}NzOXa_KPKj-v7~(CGT+= zF>=0gw2j^uTU7vHSs8jdEn?$q*br+M@JoRoN?NLPV3Zp=ygV1DE)^>eB18@+XR>U_ z*L0OAzk(`n8cI9mv<W^dubfneLVR+a4m3b)2H>Ema8%x@D?Mu=+|Nj*mi6Hpedbz2 zULJ<g7tc4MiT7I>QC{J4ORdTG=$C&lR&~!WuXj`b;}p4GM*^As&w(>`i%XR=jMj(| z+*VM6kW?p1n6&&ls+n92+K97fIwn#sCK+P5s+a=X8PN=&b1|Q%`Whn6%GX8`rY0Kd zdgB_1!O|!s8tNa_De^Zhnk?tNX#^utH9HK*2GKREtZS96QQCnWMTZna1by+{)EJwX z6MxU+ONu6-D)p7-9P&s82jYhZ$T}8tJ5SXx*@U`bWtHAU2`5+@vcQ08q*NOwF5&Em z3f&E#?C>8*O|C158oQW+8@osj<hWL{KHR_<2-MrzjWc)VG1_2ERk_63HMlz5nu&bN zESjn#7k>FvbRUn#+ehM@Tfy}uZX>EQomcz~krRM~z7W~v&y#&bXImIHlqrA;>L=A9 zS#Yh{dP;nB)qD?-gMdK2BC8FJ>4O6}G4jKW+m0{b6c7Y=f{<5aUT3g6eB0{T_hsD= z{bC-H>}1iR=zb^Gs}0@LJNQ1y^(-@wxfqK@v5c;<iRywFr)oA-fdJzPN1HnF0W7B6 zzr1cfo(XA;66Kc$-(HcQy9l?w0|`@cUuo&2Oq66b8~^vL#sS`SvudwytVT#K2G^_3 z6!C1tffZQ`akS8_OcTy=go@kI;(<)uU}$LlRTrly2l5j7%N;Uwwy17I2iD(+X?~Wx z52Fx55Iv8it8hJpkO=*BaiXNiLj$@S>8WjUQKo{G!A{n%N0Wn>={el94Jt1>bDDgQ zJ=#HZ5mS9q!0z@p`2`6weWEWmEWl+`FG9@cG})q}tAujblh@$Y@DU(<6}%zZA2@%a z3X`5-t3z<62?4y3pb?+F2+mt0C;n)HBoc>}Cq~LrM`k(0W!V7=AyEVI-exBcyg%n! zPCQlNq;w#<@ATDkVpSlVv*quxH*n<6Pmy|sGqptnSKt&7s6IOrsU72I>TlQrQblg< zSZJjw+}QqpNA!6#MsNw7V*K8g+<KEJ4QgaOXhzsZhIkCa8<HkM;av&-m;RK&QAbm9 zk4xeSc!b`zU={Zhr^$-kkQVM%YN(1kz$*VP8%p~mo;{8xxAqkIUB^_XSX3=Vh#$z% zqeNDY3j@*OW8_E*h@3m~iN)9QEfUTalTFru%9oO;<wZaJd45(igfJc3SC;CX3yIKW z?()~iGxG#>QSkPBA__5ZF*Mw>U?YR%7}mdqxd?9Lj;>6rUQ+hSnp_@jSGDz=*tQ}U zbJOW>%oA+4H!I@Oy$YOyCoY8s1aF!h>rbvD2%nqK2{n8ak);B1alSv<&9@;#d5MNX z$b?1+K>TprOj&K**iE{hXdu7N$P~UlqdG`0y?+}u;>^zCx?-4-yAb}?C*=S^^7GIk zT8z!{zsK`R5SPs}Y%Qj2|Jjyxg~fg`_u>G89Hyy)RdqODrGyxsK1yecKaTkmYtg`G zt(L*bnXUpM*&*(!MdiRtYpT^{@A5b9oiQi5qH0&hLrowe76}T<le<AiynAIaG-$nD z)NxVdRwl@Kt04p<{I~@S*(DTpb8;t+(l2q(IR&osE=0ScY@87CKxuNyx1mt6FUDq4 zLo#K5=gUgAnT|E2ujdU>4jd^Pryb;?S~>}JRnfT|E-6bks(+Ms9l(~$xXh?+Ae;BD zq<=`&fi<Uc;-pd6v!`FW*fe+ePmjph(n{bH3HX$maexX&1%7zpFVy5+_uD<q=k)N5 zmzvIS_#8X#1>Nj*+uY>JRR6Tw-m9lQb*liQ!5mEid5g|X-DrFC1us8h#w8Dm)ETgo z?leNohE5NtLA&d{kd5>;(oNv(+^>Ra>!}dcUopWj;TJIX8<_qpi2tq4xi_{dJFXRj zT~;?Z)yjz;Mqd|m#^mX?wAp%pp+!Eit8elc8OII^<);%?`3eUf^82A2X2djw5V{l8 zGOI>!=)gYQ;EboME)a9pILZ<NX!7)t=z0vcYW3OVGQK@dNxv@qTw|VXb0y00t)UDK zIEfR4FR#abdIA2;S-|kMvxC|^1y$7QT_3R>%%E{xmv85ilVss%YeLVC(L^g#kjdjm zvZ6%%hz#$t5W9`--L=LJ;)E_l57}kUk9yAk7pf>Z<WptiFsLk2SgW~;xcIoj#4}Y^ z6QBvCfF3>7!6`A<ieX2P8aYkki3$3k-?VdRx2-I4KCG!I#h`9J$zf5{M6xBastW=F zyxq%1<F=^l2Gl8U!(h){4EIgxFOv72YwN5pA1owUR2?@U_`)oT6}YN|oB*YeQxz^O zu=SqE1CxK|1y{cXblJsRtz(6TMccncUpeGdkpW<y@mDRD8p1H2avZC=z-yH~=AO@4 zRGIT{h6lh&R|lv&+h3{9fBL;pNm<WD$x2Oy{ir|u-!Np(ts)GrYMH)%SKZLer3D%) z{M_=(!J|7gy6WKUNJIRL2Wt^6;)4d=f*{_nKY7G(_WddP89(T9(JY7<p))UB=%Re> zLF>VoxT!)Es7eSclBU#Q;Ymh1$T%j=X_Hr?NsM5+<Fxu*=}FRH)Gz%e4!kG`KeENM z!+qQn=`y&J5fK9k=HnVDw_UIJ#=r!oVjl~$lx=*C;_xqS_Pg1W$I^Tm31ift1cTOR zZv|0jejv&lMJ0d~_M=wxe<RA+E&bJs6R+~_+I11r6fOXWEvbxNpwZ2V#;gE!X1jBX z{lo)RoU0@-(aA(2sb(pa3ztLkpqz4!UKMg8ruQ=6nQVtka-7DclrQgI?Jjhm|7TG3 z9qX`~2K3V-PSzf7Zkxa%BeQ4llBP8yhbMK#TdH?ID*`1k%gKlv0j5?!FZIA%pL-@J zTeL2*iy%d`(UhAY>co5IS@iN4Kh5dCS><|rMR{rI>5Ni8nrVg4X^&Mw@Oll0x8<S% z7&_A}U!V~+h^`!cR#7`uWZ%AE<xn|TL{uRQ=7*~2&na#GI0b3cAF^myn5(lDsE4cp z;u}0(Z^-#fPfUOIY+}^AGFkBlIni^Ug0S{JIJ?Hz)@OyFW;J}uu&4#0<qaaA3bn7l zOr2rEjGyjU67t&Aqbr-~;vm5x%@G6Uz1UUg8-3qPcS+l>rC>n=)ODp0^RRkfcat(~ z!c@)jv-;@hdvP6@YV69hXS;~yt==v+!t<e?^z)U~%j$B=%O$0L!aP`Tpov|doy^U3 zUdsA|ZOu*_RKTy7EGu?5L%Tz*2R65K_wU?+4wk`f_v)UVYvEaU#YV|-DL$b8gQ81p zXms}BlORa6oiUwg*^!&~5W`S;hSBhAV@~R}cxjkUq>_Tl%cIZZ5cpx}8AGh~QcA;e zYEb)TmLT|h50K9?p|pAX!2W3AwMMV}j?_PlVy4W4nsh8X8{u+BT3Z9>?F$u}I|%Z= zQ~)iUpsQ<6u#rT=8zwge4>&Vke^!{PGi5<W%!Ba?&1}#Pl-EW#?A^t}cBrsDYotlR zn~8AdIhwR>4UD)g>`6a6X{&r~oLd4)B5BTDdsBxWx9ud4$q+a)CJanVNlWd)dw{I@ z3c*%Xe5ebVy&c(+es(b&{`EIb<{z>JrXlF`6Lw|=e=2Xs^YYw8o&9<x=@qE2g@`+D zOTQeoYkQJ>JNt565qZY9cS%)dsokseWS?A4`jTeRrs$5fK4l{V*w%OZ78Qp<GvPW% z9n-s4q-sGj7?HhC|IlQ<dhL^@&Y5TQQRYtr-_>~MW6RK-9fxB<f^i0ui?MCHKL^I} zXi)^p*;o#?2w&Ci!<<PNw(w;aBD+1;uPmm7S+m32Ez&F5T|b%|4t#{D5Z6ZGyP+xg zIpcIW7qvfsaldOOp7*A|5Mk~0I@GWFb$Xuq-0HVJMV2%7doQ5tSUQtFBDUZ~X&;J6 zh=!)!?f28IkBz``6K++szcw8$FUQNjIv|Lx0BS0Q6yREXyuupR7tsQokAJ-obN7}& z?_yxpp_DL!^WzFOIK>iOq<2e5)!2GT7{83l2-?XUZJaAyUpkVx-Y3)ZO)I5MplCMA zNK-)8gs3{m!@k$(HEsUb-h%&j?#yM4A@z1}R34JDb3Tw@ZB@Eh<D41c=S3I+19mdw z?!0`hwM`w*$Im&?(h6PFU3&`52FF}O@j2u+t5_I(WbcsGYvUufshcgeCpNUp0@5OP zS3<*BPv-96rv;f9Yg!Zj^H`~ao5^RV@zC(JLjd_POLa>$NDioZJsE=7eBxLC!bQbz z?ogKn=G+%E_QRYV7%*qj99(Px3fU41tV0;8KJ1l41}ujw@yzH`UH|ZlJV{=&M6fpp zfj$vJ8|`u^2=Az=VE1rC@SSWTggSe%G%l=Nul~z0#o9}|#a;@|+iM_rvFXHQ+NYX> ziscn)RJK4dWJ>y>aR}m>lb_Ys36Pvi!+TJh!@Eg^w<FlvdjB$>x8~I0fM&mGIVS1b zK5nds)d*3m2Zg%r3ZdJZf3-*Ny{BV?x$yJ3Ivz5YLx7$*3iYV+iA+}3d&S4t51($3 z_V(4W)=sG5+0Qzd9hf>s{$KdLWs#wjEKMo+@8?r3E0&eYGIazI&FpY|VIm^BPc1v5 z)Fa|;b%sI!4Nd&f)<A~tPTRlN(^xW~33*m?{=uQ$nir1ezr}l|eVi-2>qQIwjStp9 z^dtXiK-ovC-gg93JB)>k^wSI?-%9Uf;=|N(r$U`jqyr5LYqH@LAMX0Jq!)iPd*<%j zQzPZ=pO0Phr6MC^P1m|sbRp2Y&bA9`G`IE$F`x9hYHKNODqQZs*E@q#vB;z7PmApQ z2%3Q^Lw|L>TthYeTI@fXw0H3iV)2vkFNzQ8pTxO%3|zMt!){gxky%`ZQQ1Hv&NbKV zeEuv}djYjFfD^m@0KSg2aSRyn%d&bP5~Oho9C{X`esXO`d-wq}s|eZ8KtnYZO1EDJ z&OpnD*q&CT&XV=VU$p@@?gq}65kyct2Vo`-o%SG~F`!Z`H^))M1wRG5W2iVMOw`4N z=*+Xgsj0kzygiU+YNN(BnGE$ymw?-9%{9=Tnvs7R+@6v8wQ40E0Z;{pC<_eZ6p*f6 z!ZwqC(zS&>wXGbIOO~@x$lO^Wh=JXD(+?)(^yf-vULc#OB(YrmAC`OBd!om4&UUNU zHu>UmK1Jr{j|izsiZycTdGU%fQ#KBiQO3xReG#ned=^$C)`4^~)S?&6_}6;2>&llp zJD6!tlc!Uha~9$Jm|K~bHQY&{vatQ+he3Ggc8z~F+MP=NH97eXR6zO!rz%>bU)ic1 zbqvAV(O2ecr=6Wi;wOfcldjGd=gU(kc7B=-qj_kI_PaEO!hiQs5InBqZkl-704F7H zd+56XKed7AX8+lVd&yBaU7Dd==;)NJ5d#0Ekd4X<jh31l<;hDks88!HvI`S=s^NHV z`H--ttc(fKMP8m)>|BdbhXR*4wsH_bo;=L7>6MG_a+GJzD1gYO#^s4I6pK1-J7W7P zmm9oNo0P7w?xR27#L{|yRulz2>ku?p;HyGu_P3!{`n~R_j5NJ#KJh-e@9ZhYv%g^F zwXo<!*wJI`BO55MlnhQn=9Ns)Tdh-v1DAgH&wo+QC**hzobzeOFJ4jRGZj*dlnL{7 zrQP$KWL)!3eBy#0vd|DGIX%%}ot#)VI#qjOFxI4%<>*#npD?rbM8aks9OuidR(#@; zVG`doQJk+)wnVn>t3$tJJJECSKzk_L>(K`f0jH;FLcT)V#O~$rtJ>nmouy02Jj<-7 z=o_WSs*7&BC5PQ@xJ5a2X$FDs%F?A2A1Z2JPZcrOnBn<pd0qRzH&JbBUK^9@)OETB zup>@cll#baOBhZzTdPyO_lN>Rya&8Mz%N6GF0R6;NZ5W?l}~Bct_|&f^+My7!q_5c z;-klVyl&nYk1Q-XM+S%1q22E}-`CvPQ+FSn-U!&2v9AN2^QW@%_YRYA;MAMdg1+Z< zSamb%qi%%rvh$M~EeEMH33P{L`o(hmC&-46-e95K=EwhjIaLi8ua;0qtp2I}M0D+; zCl_^&Ufv#?=lKy85@z2{JTU8GgZNw*oq@U0k8k)3?>RU&Fkta{AWOL6^lQ9c@Oa?} zG)GXPR^KE#p~;*nC!H`}_5|73KjOLG1fnZP4d;Hho4a{DGlAV-Pt{7g<!}_ea!Awo zXVWI8TAk6iP-)+#bY9OvVcr<`lpnN&^1wJbAfpS(i|`zuc`87;8g&Y?&0oPME>apJ zy7_-KpmyW?le*eiW~D5A$N~JmYMvcs_<$+}yR16yw#zkx7E2G*Ln?P8kr`z1Q$RKP z^x`VNnmlTH&!`6LDAiOglFUu>ZpVrr(@eMFh2(TgtfmnpxI%>;iSJ5|j5|`(IoUpd zV6Q<9?0QGUcb&u$ns(pzoWksl_i_6g^^IZ65tK7;caB#(XPdM6OG5<j1b0-m2C7O( z$(vEB;iz*wy|+eruS+TX+fL!tTL<*^@&<jbfo<-6sS;f;;O5W48L<W9_0-{`OY9AG zW|pJfB55f9P$eq~w5&XMNROEh%Id;=;*<at6E#KMK~K==8V|YL@%a+@wf7(Vv$V~H z?q^r)_Ig2mPxhJ^5LP3mVWb#_@64qXBhGQq4f8-Jxu`%zHgf@Vx<sDN_ew53+v*N9 zIOb{RosHPbc@=lf`j+}fMa1UAC$64dge=*je0V#W7DNq2>u4~nD&B%qy%H1@rp}b9 zQt~--mS^dQz8}}50Bz<JFHJJ=4Zv%zWdx*EAU;-}hJXVqlMAl7g`R5G_jFy;`BOKV ztI;YYwwx1iIy)`oqn<T0(o|I&x}pAhY!vIY5#23JjfPK@x5zT~0uBk0W^6NTVorsO zg0Kg$XKmQj@Xq#~tzVaJyWjzD_O!{3Rs^}P_=)g%(h1%Md`Ji%pGYpNge*c6Hit6G zWNU<>4Skg;Pi|!a&)UyXo5+$cE#gt6H?V^#*s=KEb<rW!rFb9fm=S$y;Kt@$%H3S6 zwK9IGqt(3l6Z<Nb>1H2@Ug(4}8P9+>dt^7{eaX2kN*MQLahg4&XAoWe(bgMpG+41$ z*u?O{oo~h+V48ktMOJ8c_W3dy*Em!tS)UqEbZgEHxvFroP8k(N+9w5H;0b@Sr6;&n z+i=@S>ijTLZe-Cr%5_zTq)88&Ok;m%q{Spqwt-G^#ijWE>-K*LR);l|mxfwA!Wdor zVlN1vvGazUMzuPsZF~&q;a{vxi2@kBzZSE0)NZ;ND!4fPLN0r;fEBuBwgF|VC=#+w zR)YUz%ZTYP$U<nR)QGvSmv<v4PxYa?-}I*ujM&ATC>J?R=Rk$S!2BZRuA4|(4O=tY z))=NamI(Y1JlD|hDt?{sErl+1j&sjT<$w6~8iv-VtaqS$+#%1))pA(GZaS@A%uTmM zX&mJ_q4#t=l2Z3OKiPj^JcG=oPPkI;J{Ts&AGJThY(;eyFIHD&AU>X{I$%vXe_&!m z^L=E4XzCtiOahnq2LFHnUW(qn-6)VgZ(mK?E54ZArDuZQ#(s1YR=1@-t8x{$amU*M z$Xnsgu+lboylZ8o<>)i)>vbelMb^|#i-|AMt?n)18{YzIV^&TgnThQ4N$ZiT30{VZ zOsHVhxP02iLe??R3xg}dj&|m<x=bNd?862bVMKnsTnSlQP$>Lx6(h(QH6PMo8H|U9 zKrxWbZ~9N-g@i@8V&>Q$U=B5r<=gx+M-qpqUU_}i8z`2Y1$`vf?#Z3pvB6NL&$Y2# ztCYUy<L{j+4zT&yhBNTh?*&g`w{H1-4B0?I_QedsYV5;EB`jiFexL8j38y8cedKw! z`bhY$?KQW~=#|qb!SWTq39??OQYQNw<aYG*58iLUBIa6C(Rp|KI%nQea(K1vwdN&) zzaqs?8xD-Ge$|j5JkM39985Cjxn#Rg%-?$DWHu-WQqF`jnri>(4tplB1W?;ab{EjN zNAx(z*L-Wo1v&i+_Za(AQ_CTzj-7Vmy@6yd)W-1(oLC>8%&}V-Z#IB}DP&348qnHb zIoRyPuHE3|D+YC|=T*#M(D#!hO=QI|dxj@^;@g7_AhHI%lY0P31=N(W-ooB+edexE zW2Q-{p{<`s9k__H1Mh7jXpCqDh1x9=?U%OSkEKoj`5{h48olDwOO4rMcM!k#oK8oy zj|7}~Ig+d62_fFum#=xDDbSe`MoRQKb@tLs=%%v4Ipbn;-%>g60fhc`_R*r3Gce(r zD$qhQ@e9CeQ4;mOGgq*B5*1>kbqDIuf7mc=v7n*wwx<hpT>7zz%_G5WYzTf*B_C4X zShiXG{}{XWxFqkl-D<72N^8}uJh0Z5m5Ny&^R%*Z%hbxsQUQz1BNCb-D!SRq$^%=P zmZ(&gmM8K6iYQj5l!Rm+P(UdWP!UW~2vB?<wYB#C-p~8K|MW3Gg+AZ=blul|-Ou+b zxZqJn6p%BTq}MWIl1$&=K(lw0-BtO8!5^W^l?qTS_vFnvFKgoJN+-G<KdX7fLksSO z%5zoJh7yotAHL_70=R8$FUnp4&6YaBv-xewMn&A`34;}3gcH31kBuia>w}8_g#RgX z8&d9=@z@tymv>e2R3=f^ZkB*`aExHW5{scd(gl@u2+)N^_3X=4#&e~v&c^$kVf_|w zjC?Qmh5sRQ1tnh2^E{(eCCE3QtL^7YCD`@-yN0ythL+=9oe4;`yI+mM3JT(mj@uY5 z8I64F==pasy}{`&uA~F45l2d=Evp>+YqIv2Mr7)!U`UL8&E7wD%Iw_f0oo7F4XWa2 z;7g+>s9f}6{lW2i?RlwHJD2`Z#rksB)iWZ;qVk1xp<G`Jn6D19QL_I-A+UEN(#f5Z zI&Ko_IOgh^!DzGE_Y;?NuQ>LO0TSaCu$tLl06lBmGlq`ChH%^OYY;}fsbyFw7geWy z0=UzYExmOZ2Vd9Q+{#3L^p4Rw>Hb^xG1l=Nz`{cdaF?0bn;Z^tEI#tK`F_g3TAE?+ zJL~%qzey2sc<|`K3DI-tqvGLx1%Ha4lgIOoxrL>jlK{E*su3X}nKZ>2o$DQq+=d%= zH?N;6pmW7t&}RMl(cVe%KjP~-R>R-ZuQNbnI5-cj1b<8xtuTA0S#n$n_Z)ly${_2; zz1ipKd_5!3UAqQyMd~@EGLKtGUg&#2mYd80xQw;^vFW(oEB{Bg!teRpsQ}JN@@Lc| z%~Zbb#_#A1MLE4!%(ZtK8vn~?cGuySUa>dfPWMIqqm~{+!k~Tap_w%Vol5=+DiKIk z(av20(>{;qQ~4uJU^fTRdSIaWv3G4QzqF@*Uv7O-J7O}<ATF$$jv3o<J2pJb9((w) zU{Vr(4&>%J#&jKN@PW)g*Gdx#=w0peKE(U#y85vuD88(k4nf9+-1yi@Abm@kWXAoP zeUAM!8xnDMZ0;|PHvQ8@Ehm6Vm)_MMH@LS~>eUFV)}$GEvr8Md#{RtlF~_bTfL;}V zNZ>%H>9>^kWysnsqcou(AZ4D@7LL!&Y0oIj0-I!)j=hNg0WdzG(9(dG1F}8Z^mosx zy5|MUZaQCaxv~P8V*xD1J$gTZbp<@hfRUXjJ3=ntM_Wg39jzPw<pV<_(`i%}0W!vS zhOToj8^~J~ME!RH0%kbx){k4-=b5z>hM(}uT4yC}J+8@X+*gw!ex9zJhe_Z4?B)HE z^X%b!&dmTZHx7CXm<0E$+Xd3;k*Tu(@E1U=pL6!#{xbbVc@gfqM|}^f?$o+o`kRh8 z<1cfZFk5rfTk2Mh4W7)K%R%et57dv1zaMz{>fT!Ornd{Nf50itJD?-()lIGeaj<)z zXS_OKe5dSV_f{MxKiV5S8k!#tCz!;Ytqq!eQ;+%U%&s=Y(JUE1-7Rl9E-cQBv{F&~ z<Jr4h8gWSZA)x18os&*$<CHCNk=}6h59R3F2X%2X+<<FizhBR9I`fe{0_e+-xc1h= zaDwg{dM~^HTUH#AS}h&W${ZU5h6I;wKnJ*mY^WOornt2ph7R!UYHGgITw17zqn5_% zKW41eur-tf<Qd%U0P@qlpP+VL0=-~YM+^%c2Im7Hsm92B&;p_Vj_GC)NZ?lvO!m`8 z8yeH<6+R&w>)|Kk8y=61rx-Pso=$Y1{Is1>x$-Orcmo2!B<0sXzM=mk{x%#Ix4mA$ zZu~ZSmY#vR8=)*yCQEekRsvg{deNYmU86Tlj`J^qNB2yg>bW@sZszZmUY~6v#yhgt zBxaBI3T~3SVAD0&Qov`X-i75Eu%v(ao&?3)j_!%EekFC@2vuA$znnN#qI<;)hG%sb zX13DT(k|&`Z2Nb=2fR~i9mFoQsEYrW$>rDglHjK!njgx%hsFV{G_Ky!5%gNs!ME4{ zb^LVAUt0D0dnFUVm^9HGm}bB4#u<(ErQ20{yJiC-Sv<oQw+rbWwnR{<oGt#W&6_DG z__ZHI25z`~WqE139W0%USyMy;{A%c3!0>Rx+Qm(_nC?zcdw>;cF8d7FQXMK1v5WVa z!`rWApLzcgIhD@5w%@#tK4lMpZrl2q$B#aP+Fso$Z0jBN?jslyF?k&G=DNb1iO;TW z;5xNl?^t0EwgUZyAg*^WsX6)%LH$9t`_g-;^4u-Ma^-qlxXEN}6<v2@5e!(P1989m zSMo{V=4=B#H74Bo$=Vewj^2ddN9f_c?w9*sfqsW{x=vn0Y{<&#HmVwM@=uPVm+r~w z8Ix9yOr00|w)8508DDZ_UyB6wNc!k+3avOi^xmkY0+TkjR~qLvrs@`4b|^$_smELs zjLLma`hBMgraut5#7If^f~6KF<!kMEMpYxXrvBaE7n;q#IUsy(FYlD@3VoAzYsKY% zG|sLtZkj@VI6Su{e8rL2Xg^8;=K5-O;!he?*G{yXg3e{qn|Nu)yOmcUy^kwJ;haiI z3$Q|ie4(a{1M3%}Ex>N)+B2-D8E2Gtz24Qi(4S2ur~l#D%W_PvRN2PVCjmnEQE~qg z-DHUZ^fjA*5na0(KPKtF;HkKUMl;<Ykv4|?K3Y8PywNKjNR%*L@=hN)eJn;wbl%{k zeBSlg;AE3X6hwp9Yy;k@3oxe^|0baTacKZ1%9rUOCf$7Y*sSu9{r1(Idv_;|4;<cZ z*>dKX?bJ7wv3rO+w_|&g2JXm>kva9lg6Y=!!f)Qy5sK@%7NNUf!04`qM^0<lWLGIE zgq>l>fk$I=_gCsjJ|p?my6J_O#GY7bb!A8AOaTPSo{ZVtbP@k>=y{3}^gu3c^yRe| zp~MG;h!NaS<><?@9-^U<XECN;ye(axMgOjHay{;VG4#sQg=VmIr_v>E@q^J{!xT;L zWXXyT8<aNoJo`r*nSW0QJWrcLxerGzp%$<!y@GPE>HY(nY!TCq*WVyGun`q|1~B@T z%6X&5eYv?w`ndDv=!ssFLZPZk<I-3%8RdJIjd$$k=t7<=58fNHGx!I?Pjb8W_XZ!6 zz#31EJll6%xFML^3{O%{XWh+i#^dfGp3gl83AE=LA^<wMbL`d$*R`4k$jOHOdSL}O z$shwBN6q~Y2PHo=avnYRKc%|L7oKy`^ehyJrcjv6xqd`qzeP#;>4g8xbQxYf5Z@L0 zfFdP$_aDokw{!uFb^L>NPO>zi@Ol^Lbm2#3gCSr3dx4>E6T@y3O#|o|=GNRl^eY4V z(WcW9WuDILkhjMljWOJJJ8Q<?0h=21XHm%>m-Th#_Gt2!tE6eVj+rymQov)MMxKVT z{%}^dG`-^j_f7yic+Q42F(5u1(>__!=5RuZ?Tt?ylNvWQPCvQ!9s+XsR@=2qCmE!9 z@$!AXxwF1e<Ks+z5(c|lGb{4<K4NowYAWiR`k;n?m)#ve+3oZBFw5$1{FxDvFUA@# zx>5K1`i<MR`RBG4mQ}3v-N-yA93W*{`Ba^}Q32mwHBhmIadxXWH{w=_`_a|E{`sx@ z%gU&`K@!oeOoaM}Ygs>W?yWm`#WZK#s$+}xe)HomSHDCpTKzrvkDph6S)rtiV%y4x zi&&W7$Lht8Mu;KaQRpsh;~ShUb)<w?Tp}syhp@_JWFd#M2ZLd^9IZVCHby+XpDFdM z!oG=G7MacSgh3>I7hOx!d+QH}3l?*yEnXp{)=d7zc;;TGWs~pP>@;mNmFDFLJ!K2r zRF+m2>Rk*uKZK8ND8DH`(9vqW8JUuhjuB2eoyDN{-a*(uCz(f?*|*?_eBgeik*uS3 z&d&MMg^te-pfqKpp<&^vT^F!v0j;Q>=%?p84umNUY7CoFo3t&pSFzvG@78Kt-YSX| zDWUpm(+u<TBOA8Cbh+A~?{P$OwB3(cwh0rFAR--`$#Ao4qYv(TA0MyNtF^}PhfqQ+ zG<|(hn28XxbryU)KkmVF!6vlBO|1LVw2DpT#EL=ek;u|6a7N;?H<(?sn^QHHHlfo^ z3DmdRhg%Z}5p+c%+$54~(PeS0|A29LU%-agP4H9=&k3|dHJ%B#(AMr4jQp8t5wq#z z6TGPC4!k{Wf4${AJM!DsfI5y)i5HI56=B^kibEWu*^26k&|gYRrtK1HKutgZT!fdV zQCqf@BMRx?yOr!><hehNi>Cyqr-N;>apsoUM86<#o?mc2<s#1^N_$NHz%4r`(Di*Y zDTP_3XKu~%J4LzJ$s2#$!31ebK;hx)NRV&h<b)e+_NB-KrqP#BqmXrFu*W52n+EMW zk;t16N*gyrTa95pJQAg3d*&2%OX~b<9udtU4k5Idm`(@m_%ZolF^gXpL!&%aBO`^i zc2FtZ&HIO*E>F#gZ(>*kXXLUik3+|k-ioA2E8umtZv#EnRZo50zs{iUZ8d_zd2eYx z#yK}a_1jvD3)Qh(Zd8Z8hizY9xnpG%s5e(LY?5dY*)wVJ>K@$MJeylfP3p@d<C7q= zo`%2d#iRC02CbG1;pyWl25mwHI5*X%y9eE=P<Cs;eQ7yq`uyXSkcp+aG-PbD-|Gz_ zsW$D{T*cYExb#*PU=mh_7DA4afW<iGf`Jd)=_Es+pEvNZ*P;K9&Lk2SNpWBCPNCu7 zH}+@gRrG<rtvyog28D8koV3lbKUv~i<jD5b;H#2NCLWa1L9sD1aT{R^ik=ZyP9JPJ zwTjI?HR1Hou3K#?fM&N61iC*Qk{JxQ#A=u5Y}YUZ)n=I?0y4Z9zF$!4=joKL3D;~b zGE`#tgYfU2^N(raE%E(%6Y<8MJCK8Hf~B(iIzYc2b%S3u$j3g2Pji%p-m~|n%AcN^ zIQ7C=iFF){$bzly+Yl-!AHN!kAGUarImN)`!no&eo|c6r^_dtOOK|XTFfqD&JkmX~ zIyPczY|8N=6Sz{>6OJ{OkY-z0#q@k?&-86{LNR4Har#JPhrUxs{oqt1Mf-~|yIxC+ zdK||9l<+RUaYZ7VQZ=S;3Da3ARa(z>**m?7S75LP6CnuW<dRuveR!OQ3pb(q9<sfm zT0PwQ5)~<&Kt;w2&jnZ|b_J1ayd#xW={Owz(xoN#+kS^!)BDl}spq$$qj{-w<Qtow z^?JF{W<|ew{tngIyMA@3-O`&X53kEta<Us;PGYyErr{jI3&bs#i|u-DZszJ)La<qk z5IY3?m5F8@+Y^KU(Mw^2ewrH!H)tD)q4^<kWmTtxHDWEWYX1YetrsoJ#-b3^Or&i~ zmbu^6Q16kdSAW__V<9HotJFIK{h8S_!j#b1svdD$5(4U=FL1vIDrz_-&M%0d#W`$F z)(dyemeWNG#x68Ub^)K=twYR-FvwT@pg3)iJfPOU#3kUtoeD_d%BTr>U$h^!qCB9W zp#|xbb)Tn`MyYq2DXs8HcQxFdBho&+<9Cv$@;8;$ABzx|cDy*_yB)XQ*gS*4h&Nif zM=x8-8}E$vOKtuvMNOUF3W5oHf_&TZw*1uAvB|aEUB)7{f9UE-u^w?_QPc6$d){Ud zMmC_{oq7~s25JhXWBY9|e6(Z!blkNpGcnrG6Mg|+dPNdy>XJ@!VhoB443gF81dn}` z!>>b68i0IY+6M1d=@EVr#{D=<Sb2{QC2#cNhF%@qd2wanlvR6Lg|%!Gu9ke;=+fcS z)ECDYrf4TnbE*Ad&-5J8MC(m~=uqT6<aJ1g;lpfCFo82(Ob|>Z;=0RAwPV98=uG|D z@g^n%IwN5+iBuv*81+r`R35cXquA|E@K<JW6RIe~_Rj6o>Fk7RRk<?0PBjp_$~`iH z)bGZu=qubjxgq`j>6y3#v*>^+d5C#guHUL?PlZiSTHVFrZ@(~C9IXGo7DIje>=qdO z;fu$9GKV9Kyhuf!CIIHg1<TUtrzS41KuHf_vo=l?LWrTlU3-y>3mW>*QEdhT63ami z7A!RHQC@$l*rwP89F*G<%-^qUk3zXwLrNnx)-}O#4wzZ$j9(iFuMfBKgTZgd8i-OJ z2z!F5r(W9DxAzEkI-8&NyB`+$?}7yuD5{1q5z^+gDffv3K`+rOkvFnga&DU;{I%VW zMDtpDw2ul0IfN;-#oUfhkDy=6JOlNm^4LAR4JGf?o80=BS<!t60T<(i?DE$NjVHH9 zdM~P0UYmY~-TzX&w#LxQXbXhvL+i%9s}?wo>7!TH${%UqExdBk28UHPEg`kEmR*CV zB-GS6r~4A689O1vU_)y#bZsAH53b813Q-alRupyezvU8A%3;#0h?;MKRS{Vr+r!J- zV_g#T=noXyPg5~dAgtSHz*3sG4za(1`zs>%77=Fxoq9M6?e2TRD(jBwiC29%Ciiyw zKoP;>XOeU9G<m-$iwh(dU`@ly93w5l<6+9%qAd39MK#S#c2XZ-)dxZ*j9$W7*SUNc zYW+1bMtCSP{(vNkYb+E5c~v(?T!<q0op#qXHerSsUVj#)lxxLx=9!D3Hb4K4xc*r- zS(L@dTNXlzY@<asj;4fin;XVAq{O*MfkFcAP|g(+KaD$2pIL5Gc$yYeB~1w|!mjOO z2ZOsQ;%zl3ji;VnC`V`wk5~v6FI>}Ry^4*=Hk;!99qk+d{R~kLb3t80wUKkyEtl7b zNO?_tAb9mlhDe1eO=tF9HpR=%f%fTT^wsfBp(Y|^1~+G4JiDxt#YAA!UVa|mkb{kv zL;?2^qqULe*tVS&87|lFMAf3CgYs+K^zFF6roT3SdigHgmRZZvv=}at=@#?G_Nr8m z?7s4BTKJrmKnVg1@^y#RSd*GAO0^`a%;ZNSb<R**7x253A?&$ryNgi&-Og4~g(JoD zhE8v9+~?PPqmElmsaF$#&=lh{)?$0!kGS?xd~KoE>|-BHpPub*D5)D$s;%qf-XKWn zEVO|=bz8t->he{m<Xj}RfHG_aLWZ|1M`?-<rW-UaF)}3yvi2>RvS~D-Sk=H+`pdmQ zaj~Q>ddaMFSh`0(%#pT29o&HMZdMG3_xH5u)u=|`G3{y(Ug#`XEa9vF6uU_X<zG<` zMTysq7Oy)9tG)14=eWQAz|yBo?oz#$i>Rl%zX>D6zx&8?tHyZdngLEU3hB@?05+vW zKcF!tu^r`X5|1nyxLupF>#p_jRy_n6J3d;Cyr<d2Y~G_Z5L$zuT+s98CA1-0K2~(H zg^p$pHb9ZZsF<9To<NkrbqR81cw%_n5&Lr+ZKA2NwrHtUI4OVP*~6BiLQ>lBov23; znK!+*Fu1f%x}AH-s01FW>AM>W%R5MWVG8;E=k4a=wxcS8p=a@E2MX=)pR|A-fGiQk zmX}#%a7%Ozi-e&C>073}B6CNS{taIZ!aZk#>*CxI+;m>JX{-ST`(`ROaZ}Mo07TTn ze-_g#(`q9Nv&^`Mv9!ofDW1j%;)|cWSsMSKvTTUbK7JSFt#~kOMSqml6)hImORU=S zoI726&xggvWAgBduHf8e_I{fdPHm{e0Ox${%3T5Od5`L@N416}L6*jSb7B22<<19V z+|lo$r)Q_1-49*Y2Aw%26j&|A>z#Cl9S@2N=wjb2ne9Ti84c^a?P3`l>v=N_%Mxj& z8<|JtlkF(ENY|l1o{8>n=S4^yneIeqHgCEvIVYQ@(24>aW!(^}lqM?l9Sfyt<3J$^ zinXjVkauJ~hn&&W6%Fx2y4BWUIsF-3(M0mODL%t{(vgx)3`fS+L)Kl9wEOjWRy3Ym z8+a<)92Tylt1JC&Y2iBa<>CF{+MR_dD-sr&X4~s_Mu>B<;)Gs3HaR6uV39Sw^`sy5 z7(YNw3ua4vdQVQCKi$Dty&pRg=#HMrT-QCs4ALpAHjH)n=IF%byv=%+9umt>ZbOO2 zBvN<srDERs!ynO`zTmZEAcUS3%Ceo5dI~H7I2k#}F$<n^9*>FU!;a47kPQ(Di$W+C zC!40MjAP4Q3W_D*r;z&Z-i<Dl=kSTKZQ!>iHxUPjf0Y})&en$`cveOz#O{XZ7nyU> zx}$r0)i=?aAP;cq^vMoC)xIk2sQ~QriShPUVF{QqZspxr<Be__S(0K7IX#8Ch$2lt z5LK~2R*4FTu4T<MMc3LqZU!qE>$;g;FUw%M!8F&5K+V&5CbI@xM;Y$+v})9tPal-q zIIG`>xR)UI)ZOp0G?qwDBj_u*>$ndQzN8LUQxK@Ml>B}o<ad*7WXvlplk!0e3G@9w zYA|mSGZ&12M<(Tju9y_gBdXlVhO125=b1pg6RPnU)5%NlvbL=~&2!&)r_RZkcC}J( z`H2l)J$m-g{5dnPX|{OHthp1a9}$-XnZrp7$mFyiolsfWb{x{YC!pe~?4~FpveWOB zoe#f^N)t@oKh1v-H$FI_zJxO`6GQ!GB-6#ss;RsNSMPF5?{$k{lum=vZjBcxu~>!W zV_hRVO2&ervE0BMJUbzBY7A#%j-6@P`UHWNOF%*4>b7M$iSJgStrE3*&YbD2XXpE( z;(tZ229=Qo1F@mzWwTKjcV|PZWOgphof?DSPCaGVILVx{j_8>~t1szo_`l97_haJ9 z|M_b;YCfzz)N?6m{tzN&n3uJ;?iqM(N>+iVQvLP37V4G91jryf7Q5xM)BE~6tIddB zTJ**{SN`^;s@intzr#D?QlE)?<i+?m29WTa6v^muesSF6ks(#rG=nKTaY-QPvc$^9 zh3os8<04R`t(P0z<sVc9B0~^>($I}cc24#T1%`ww_F#)-t&%Zhc)|>pX;y=+$Gns{ zqg-ORLQz+xdYjmnCRodC9EYH7oF}w&d{Mf&l^)wd8lr!(U_1nGPV@t+&R7UFUD!H; zDjo7TOR3E%B6#b{>*zf8u|ptMymlI6fA#l@=PQ!%H7mfW!vjg6MGRrv5)#iYkWYar znn}`u{+L(4@)v;pir>F&8Te2C;(DtueUtXnjPLA;Ke_0`YyS2r>FybDvGcvv*y;qk z{1EMvq)$gm2sUW;b|324aV7Op{mQ4{xlh$cr@8uZ57Q}!PkRLxm!Hk6<l)YCLu#@o zQLXGOWV-jPX1cY?MDJvJj)_SfUip6Tki7G93bQC5LsRiVv1Ank?eJ!Lyk;g=ZV!_; zTEV8oV<F)QW&3(PZE9XfoEp?MNgTc@Z^OVI^V4RU8|?C|M(J**TjR`Kk&v&FFcYVg z{p{&9oHH-}Lq#B-<($}K;76%@P$&Lyjud5FBK0aW>WcNL(yFFIlKf_GX?%PP4GqV~ zU)?(Vf5fPhy%ZnKWHDB6J7YQ@Zqllb&-_kmqW9HhcYc}v@@R{n=Fz3%w2{k$a^g?R z!%dND>~{|rqS`5v7<g9_8hZ$1_j!!ohT5MCK5?FsvML&f&k$9JSvF%dWfc=goAr~! zLGhKUab1V@=^mnE_w;Lx5kmWn=)mKt-NZTG4U*kV!t^747<8P>57H8lGgBfoO;s-X ziP%7;sJeA+V5+(}JTay(FvoYYp{{1;d?cgQ4cd6`H$@bX`AS6%gHi0l6EVG^V@TRS zH$N;~D~kibsV^g;UNyqz^-rgF)oJs_H2dYri30`98f~5?$9v|I20s?BT*6eAlE;_L z4i_+WiDZ?lEasjHcz=6$y_DT%)fmHSVtR?A(5Ts&V?H5s$Gq?VbIc9pLgDhvo!|X) zjsVt3bvX<`L!a_SY}a?AJ39L&>Fa<0#~Xzf>n?gXgcAPo+$ys2s(Q(Opc`O(J9-wd z841OXc}`*u?9skifOZLTsb^VUq2JEl^Ha`}02xND5;@Pjw8s<Gganexxj_VHHcsc@ zEMf9GDxL^c75h5#>PM~6RyFaOWIP^<MMrjwG}<K6U32g-%{agY#1~_((Oi{LgfQq< z;_Ny38+PJZX+UUBG~Y^%KFmMYrHv{{2-lpF->?~KBm~h0$Z>d}(t9z@h^qaO@|whp zBr{MjbV7=@fsN<r+RXCGK*2OMNom<AjRO7<blc}7MhR=M8VD1lx`wk7)8eHb{gXYK zQxU_0+qyu3fAZCptN%Oj?*Xv=T)n9`{ge!x81QYKpSyF3!B-8ysu#?&WL4DV&yRWX zx_ABAnLT38o-e7lZp`<58q>!7VO(xVqWLP}#J<NV6}1-KEfB#Pwsl8nvT0eXDca<z zY=bcACAe6Vzb8oho|^yw;>7wA;6OnkG<CNo2anX819%pYpKA03GUh{0@=0gs#}l_j zqV+R1_k%aj@{%Q?4gEHy<l)N*iiq50-Jrb-^hr){rXz`}!*cFPfa24&nr+AR^W(Gp zYl^{;x^v5HUVH!lyzM6ApR@>^#KW-zVJ({r0nBR#ye00;e7#+~Gj;x17hM60&H^|2 z9eX_cWIz^m$Y1H@X=q7|;nH*PT5%lS7dpFNeuLe|2S_8Or8%|_X=xtU=NJkbPr{Y) zxbe-Q&J|14F9OSE)lyY)S9HRZL>2~(;37-OzUWnaE^iXBeBuXVr%nfTJ<a%*e@)@! zsd<9Y?uZF=HLo6W;mlz@z3D}#z-Xg~!p~XfB~NzFC#Nqqw9Lhd^P;BOIY_nCf5Ut% zEm|q~J4>hfqj5WuZ$M7YRzXE@PbYr;0NwcwZ_=69#hc`?EX`-q0iT~v*R`(U#R7g_ z)>siOM_<8}^BN-9I`J_FB#EfFaE#QE$)L%%FxmAY0+6nAy6SyFL9_`gpr4%~jD=`3 zKr<KQLvp%=K4g?wR&|oskkauz@Tvsk|4u|K`~09ueu?u3eMPe3^9NeMGaH}EjBc*j zYG0ORryNy@%xB*e;hoiML800Y{F%dY<JmSkes;hR6iS;iBm`*(`80DCQ{+h#Xhojd zvSs8k!xDssOQ;KvqX`XxKvmT^^#eB>%bQ9P`RwTmbUayQu5B^KBe7hhC0~>8Y2yib zTW~8m(@1%Fh2H3I%j#B-F6I`&m5yT=R+MeNBva66{tum2Yh(1U-#ubx-WZ$8%|AEB z$A*HtJi1Y(DC#Dk1{|r!Us-Dx0=5?8Q%Vv+xqiX4TD7XTtFuXT&Z;5!F2+0hZ408V zI-)u!;Vy;e&=4Z`l~`xzh`pT?&rHc5tR=n2HFTdYFDTezKlHoxm(-aCWy4s*=FARD zcJw!~JTxE3S9C)(@3G-n;;e=(pL9C_1=n;<P~5H0ZN!XL&~r30DzZ<j;36B#b)_cm z>}g<KV&ZbZWNmA7#8`t8$|i;uXi2n62tZqOjc?)h8yV`N`!V7uNhE9UDru;h{>-2_ zD1_tb@(<JSAin8~w-^5jqW{&lz1B&6kaNYrVessuJ=0HuEt%t}4nHTKs0#@IzjYI6 zpuA7YcbQe?lk_E1Vnkhi4!YBi7V&^m2_UsFkCQm@M1a{^t^@D1xpWCFPLH%aTGPIV zaiMhb#THyoK+BCKB=?C43{BmNsH8Er{doLwZg!}bQ*t=J`%CJ**Og(}6k%%=l1nDL zvXY-^>&tJ5*ndz%3dCEMO?^r2i1?d4S@d~6$dc&Vrr9*Am`rz@zD{1Oq%2x{W4@PJ zn)=Q(-E}_pezV|3u^~(bOglk>&2+&?h%6vRKe_ZTRtIP8GM^70^-dY<Kd>sPFQIN9 zBTh!4gLi**ImGS=_ebSlVw~aVjvg5`O&IwwQLG|8Ezh+_%j(EK)$qXSgvVvl-gP5i zks=u>`QC;~1k3EHtol>q|67M`3bOmsd=h&Syi+F`HRJv(D<kO&QeBAjNnW+rxe*Yu zkQi@^DWmpDeOf=5#)C!74}>_Q<Sq#N!<YPP@+F}<15r<yCSByF56h#el=+?*WtiBS zv&SoHy(F{uOX@nS00=FfV&~vcZM^vB&&UW?X6pr$We~3fgGd6^-$k~C1=`(X`0dCc zmB9!flR)tImLRF}PP3X6fpHi-u6nFhOG-Rzs9r9L$Pe<7H6a2IKDIaeGzEDyyoy%> zohlaT)86TKBa4Nhjfzmbcm2S6zah@g8u3kHyilEXVbp%cw?iRJv-tg3Vma}Vg-$Zu zKxPBjgQ6|GC;lmYbDAT>KP%#Jov@|wjtlplNLqsJMGq}-+BBeFpe-~II+nDM#avGG zlMTF2qXp7|!cxe&{0fiFJr5q<14HYBJiq$+vx0N`x@@`G60^&>Le{P>YvI(@#iR*p z!1|DonH<?ZQT_C(r{&$;=)i}IhvSXQ_W94eDZqJxmD$?7?6I|@hq#cAa7siU*Lq4( zYhO=dF|1X%r96wO;KUW5%(|U_A*_kZ*D9tCoNBn;eW15?gT7u+&G=WodVj2kGNr^R z!Pz@Q15u;Y9zx)->=JeXgJy0>ZnDr(67=CfEPA!03g8EyhUDuBws;cug(c%_h>8II z-32;V1BU8bFC~+tzX3&kt~Xz{2^O1nL4FAMj>V@kpCb9-)eYXoI#slK^w{woeGPFJ zF8F(XV@v(q{>LL$7up*{-g#sl-rMn7V9MTXbvMlVJ}xI<-Ka2H*msx26O8JQUiT&X zmX9gYf=7T0@&5Q;6@H$*HPQ28zsFLskX0%5SGp*jEaJpQGf9rKb_)XxAme(q8=m{d z`8nkE8_T}Ew~BD?l6JhxZt2bn<~KJkw(nuF=^k|}cs=0xNGyD2Ymknz)debL#Ekn- z=|9;Z@uCf*G6v0M&NXUj3d5&h#m)IpiM%s@;BgA}Q`tOBG}{#*{Xw1@_03c80aE8& zMY#4wpx3<J?|lDAS8w|8-n*xCs@Ek6an&d83}@--{T6*~^$FZ=R!84WyN5s=Tbz81 zA6t2|e2j_^7zMgNF0oH!5c-tOb;7!I5Yy`y!lk&G(hF7fUUg}lhq{j5!im_!*c#Wy zA4B-r(y1!VhjTB#DCHW<Zgt1DT64A{8jV~XL_iM~p6I3<J(Y9Mrk%Syt?qgBtL;aw zulT*L;|-IZu)w11NNswzAzA)*4%zUJUo`Eyl7X^m&|F&FZgHDV;*1EM3c@4W^Ge%Y zzpV3^Tr=sqg42DA7+`fJk~-uiuXe9UCGX`HI-4G~XPRp|q8l`QW3;=C);{Ndd0a9T z0;zybz0+>k(o&}_kzS`i2(WR~8}XDE@GFVDlhsIuc%P=V59LRdmY1nJE8cQE7N}mV z9;-^xfCq6n!C^sA1K2%r&y;tZX(k=&lpe`7CA(tjvDJv2EN+&hJwk{vPH)(tc`y-w zS84+C;?|w(pp>~$%7l|cuCr}oDp^WcF>gcB&#c?&W;VpmZZI$pmj@bEg|MRy4#Lzm zS=Zn-q9|6w!D_<{VQeegzrC?<j3~S{v^(J^+<IvWnf<^tYkSd6?hQIcoi88be`*~r zPPb-~QeN%u-VP+XuA|vtNTu<zT*rl(Z_<4yzxTVBHvE!(=45<W*|YM9y6Ve0E|(xE z`TFjzFH<+0J0E;pBKG&f`;-%N{Jk~bCo`-V6oKoRK%MK{YV2s$Pz>sK^o!qtm*=*F zbZf~!F<F}%^DkAV8F|?`XCm%zy>D3g>XzS;JvLub&EMcDF>A%56!lU3gnNE>yW+e< z_t?;?bCa88%yXEdd-fAzoAUT8C28fNk~~qcs<N@Z4Lp9ZW=!9w%$pH{^?^#p;@aOK zka1jfBZPHeR9^e@QN_(>S{mX8Ib{{;Oj2lxHq;#aaoqOkxrM#Zb~F|Yq>h$%=y*E1 zbhd<^mHl;y$#`V1cZ=;LkV&p#iCB>+d!Q$jo2@b^ooyMvBR<V=#mC61`zLBU8(n&9 zve@y!R&zwW5P?f!S+q^^BVGmTUrcRo?1CAXhh)&B@lG1>Lqw@D*+l(PaESY0Sg5#W zM9AuB<mRUYfp8B-OTvm&?I*c+6S}sx1oV<wWLIt_>y&42xc)rE;GoAHYV!0ig?byU zumGRU9p(!s;D+=7d*hbMtQ5hv?g9dXTw&zyt+7?KB044=XmG<#Zm|v_1+;;RP-wzo zD=`^dQKm-PK|0RHPUh7#hB+?`p_#wu6La7^Qi)??7W^bOlYTdyV9*m%_gn&d=m-mn z8;CKdpAQGkv<R-se+~0}Ws-d@YSOTglYgto=^mCz%kIgK@S&J-aP4Ty3^s8Ya6!S} zE$PL>FEgh`be*cm%pFyJNs#NDBkCYgQ<F>FjVHZp=Goe9ypg7*&R#Fhz&4KDM4vmv zrCTUhMKh=tT}7c=a=fd|d6ih<>u$%bGyA;Aj~>wf)D(XmWYvdo-55(1PB?kl)@|R< z<VBY4>?Za7h{UZZ<pxn10X9qf?kalBZb~1NjXkQpb1^*2X!PJOgTO6h<1M7JGWA~{ zFdcYQ8LVR<EvSA?_C#8gpXD)p%v!^lK^w9USpBAcXg3+sNf0$hKVl8R5Cuf=c+Z5I znu=-PtVXdecNbtn)^?ojt;~Ba__MZWwZ>#DB__X`Z%O1KRrmH+cUeC~@KaWNB=U9u zQzduSQo)5D+f)Jr3%Ra}4YM!<82qmVkMktR9ecvzuo2Abo(s|+TgnuOd~w@TRO(Im zp-xYzXKF@-&ujTZOl&w~*r$jLX{}g|4UWZxxoU1@yR`T8bDS3sRgL}FwkCYE#X4KF z!>A@5X6B{fPx%d5(5;)Rhumh(xGnHDjkSa-<(S{#W+BK6lV%`2$qQ#jIm5N=>iE<l zJ5%~mK74bxFdZ0&Yuj)KB*$SRRih@|TVyfma7Sla&-s@`V_{vZ^eSzF92^&71Pcr8 z&+5@BtK!uNqjN9+{Af^}v&7MR51ChgBh))in+mr9)r5%EU6$<?$2EJ5L-6d)7CIC4 zr*K9t+L>KY!h}G7S3-e#4M9!|St~J}%S=kIT;smbF@sMfxI>%$;KXg=w?O?37;k?S zxIm-cxljTWq*NyM96|-TuYx1j7vE$c2a=u`+zHXQz8vpU7)q!OP`7f0i^X?YDOn6` z*O$~aZ$(GQypuJ4{T_NclJNtxY9bYHqs(YJcI{6ntH2jGm{2_<jCY)EKghiSLaLG% z2`>h(fXVkv$R(N5%l<Wu50+8CMYiro_D|@GZ}gWILpC1&QtxahZ6ljip^c~u>K!s} z+?;NM7e=&a585=fL$SgY2ZVS@#BK0+iw~pLM%8;u&#*2(CB}mhaF19CQQeZ$m}mK2 ze|!!1^V^UzUzxpfLJSlbAR*1r?;7DnloUn<M5w(^YmFApnK1>6KG_0DqzdoP6sBa3 z`vt>lF0VzI3RM;d8E{ihbeeQELOvOjA7v`Sd@Ej414YwbTQVc{0t9|Ha3nB%)E+1k zerQbp1<lTGye5TyD*Y(BZDf=AX+DC@(nP%D&d(R;y+fWCs@K7zG*~K74*S`Pnmm*0 za2sbMPi`$*eEHP*A;C37S0ZCLXRFNaYGfGnJa|4;%{hUU_$1q-!#dAdpsXPatP?;c z^hXI<73p_-u8;+`vuzs(tcr6%@O!KeX;W0T+Q$dl8eCz9VEs<sY`*)S1Tx8c@sZQg zjxJdiy3R_uXV0EW;}xc`1zhsBc+L$F9m=6Pf3m{<{Q61Z_eW-2Z=H%bli#6O^RyfR zv-`k!dS@jTTJ0w*+1isfMG<d))>bZjzEq3=!Ey=2$~^8@dhy}kJcl?7<6q())rZ#P zg53bILTxfIJ$khLxns)H@}Yazz`KUiZfi?yP_o5og(S%FZhWvAfp5w7dzETaAY(?= z-wlg%$*nO~-<aMokoLHC#Q}ug73y=vHF5#M9!_nk8(NKPcGMfUZKZ>-H>GFuIOK@f z?x}h=owWlM`J#bmrxp&6vrh1s6}bknF?mXGggd5Aq2FR9wtL&9p?a88HLEx{4tqS8 zB8DL>&6jD%bF=6PsqRef#W2?+H;Rz49`FQ8S$noU?JTdB{vEc<FO?Od$SXw8B>c%X z<Z`T|1s_<f%j7M%jmlcM50_GKKN?GRR9x=<i<Qj%*d3&ZI}J6!0H%eUFD@4rq~VQo z_+s1s{bC&iUVXIDr$(I-VGnnNh!f3-*5NsE2%Q|5Q=yaC+L(M|)~qNrC$r;OaGR&* z$-E=kJ;av#QFG*h1}+FX;*~l5YC_g#dMVjOa;$NW49@$7i{g=`DAR04vqG`4G1fqR zy3x41KHbiTHtKcOcS7(@g&{=zat`8uq~SFOv*zfjoBrANvW^4w1kf18y?GMR{LiF- zP$Aseh4n+|EDd#fb8@1OR=Is$xA{t0`Rg0LjiGF|(=zISEdOK>HJIWqcjFZD$f5b& zFt9nkJ6p5eg?p^`Ag8eAG7;#D?HPdaR~7YF53f2?Z*dX%r(kiqZ2z{R5-hFuM4W{e z5rIH%60CxACsb*O$p^y$)H|2}&70RYMX|dLH3zCe6WVJwEpX_?tMBjldDmC4^i~xR z9n4_wqt6n$uY4Bu+?@*BQMuosxZ=5O7$})jbIc><$oFINArnuy0XcF8k)eRpX9?xS zEiOipIo;jX>4<g}Rl0#C*#3N+@~hnyYKzyTH(3|uKuUYJ384Y2`|taq+2li`$_dKr z5A14(^M0`LSdJq1kIme2>D8G#f&;*sVEitth0Xxtz{2NukfZm652!j(H(3Q<26V{T z)9tAH2~noQjX5X76PdBRh;W}m)wj+{yBa$LH;3(Y9ZQ_5Q)$}%ZE4JO)OH->)=7nz zOQUm${aH+zFTI}Z2K=}5W<!Pxo!EA?0>KINfeNbp%2Tp3A~=Nz6xZUPu&+kW4-MwJ z?mHeH9v}Mqc5nTRA58rf{ZjNjV<}Olb69WaCQv2|rQoBk4647?;7o>C_v`VAT`oz( z)|`Hxx6UdEegaize~090V<ukQdn=nFc1QPwKoguei%)Oo{z`F#utKxRH10EYJuze- zrxGjO1%H#UsWmUMFuMCv-yNIZV&&f<S8~DUZt5MH+R7%CHQd^Wt+PqXfo|cr!i4&R z$HHNIq<Ak!atxeE_q}qcUAa|Q2ltuIZB8&Jq|}CPU*=6A*1qi{6Aq0RCS**g?4`|@ z7y3?;J3PIKBThnnxaTC;3D#!A!Tavj6Cz=$O-#Q;ZXveN-&JD)%0`tohvF5Kgf{Wp zJHtX0z><i66lHh(nEnNm-N?=4ZopE;?~`+iW<{6~kfc?vz5sYYI=s>y1MXlUxSP)M znj_c1chB~}Q;%>wA8h7=Il4K8!s_}=@fc!Z+{hosyiN$$Pua|&h@s-44T5`ObEsG0 zp7gvJEc?_BSjUfQ)0)Qfj;L4Jf`an~K{TVtd}w5NB!_IJ-d=RMN9mJ{Zyftn0feBw z>fksJ8=wT#cAV-$brw1R81)0?N)~(U_zji`>TrmoaME3JO;|0paL3lt4vpWEOYjNZ z5#v;X77xR59yVllSR>rRT-kPT808c7PW$U4An4paGSHl&82nxMxx5hG3TomdLwg{E z0VlPM3>+n;ZVP&a{goDK!vbyTiP97)!i9%ffwB_hV{UiL(i&kzctUUBBVfAxJ(q-I zL>~)hz4o_JKcq1HTCMjzws%VElMFvQT90Asou6!}tADswuYtET*B#k%U_Scc8<~=C zr3FNCieozgZ_^DpLVx|Lc4d#A;pB8C>oPbu(>a;PE}S|3Ci(!kzTrVV-y;(B_pt5R zDZyhA#ovJTkY(E$xekybNM|R+$7Cs}+S?MO-ayP7nrV^i+iyW%@S=6vChPaVy{$<V zROfE3DCg1KfRTEJI#@zvRZxEIM_U|JPxg_@Hg~UOUCv*ox3!kW0|nW-kR3Z{Y2!or z+1ux-JJQ&IZlCqiq48y3*zGhM#^BgJF|s1S%;ktwc#T6=NO!^bU2CDGV;0Z*SFss$ zEcO*dY+Z!#wQ_F_KJ!Z60shFCplBVpQ1YJ=vfot5M9a|Hi*Wz7Bt09Vd#=}jRbi(> zT_5ZyL#L1}jz$P<Qlwql5sq>%B9ee72XxrM37=bZyQE!=W6zPrZjarL7L^JF@VLcK zD?c0l5-bqv7XmN@%@2WwJ5PFex6@wC2#=sT;sZN&$*BH6$^4~Fj#oB6Eg!Uh*e5>) zW*hf(nTJsj@x~E4=eUXr>e_l<KF_mksNlT)r0bUf`Y6pV24nST^p>86qkhj@k=+BU zs{8+-UpCV_dv1gddDYoy#cT*pO>x1*;)hD4XK^CZl#K}AF?}VjI7MgNV3=}sMY!yT z^D>is8+5z9{<mAtVL$bikd1K$WJkSJ7h<UIrS5{6M~U<Ud-PTdX&aL96m9ffv!3;i zv#~nVwx=GxzkCb7le@K@CW`qQBKQ?|K+c16EU##Q2yQtqMfH%%_F{*7y0zD&?7B#M zws)AI@W@_uIJG0n!ToQdVeeo0M6!5COD3mQb=pCx5?kQl#w``To?$L_EpSJKz^293 zsUP@)t2a~UU(y*3gstLQ;jeaPsh9-L(gkASd+pA<lG<zhs6IP;hM4t%q9A#9LV5Mp zsM0$A*jWuXT@VqUb@tV8{Q8cwj#xUeLt*snsQvb$X7V6?{aH<@ns4)|^#f9PE9XF= z&w0vR7T-7CKxOECCeLYk^PP|4o$N{1iiB`>RCb9`(X*;@DhBdPc2m8(JTE7}FR0l5 zs^$tcHkU%U`?Oq<OiiI22aBDcy;CN#xOg~JCzFAB;4WcEhSa|V7HxeP&3zq}dU=j5 zvPtUGCpBy|HHXsi!OE>{l-};H#Qg8h>W64>G*17@(EM5qoMy+=n=PCJW!^I_c%-8< zB~M~PuBgBDcIDS=bDi|`KB@`I4_oL!2q;qv9U_qVH@D;~aAcSyO6mt>=<xE!?Lmn_ z{95r|4OG)0#k?86j~R!db)q%)Ex-EK4s@^AdqFD0<agugNOsJ1L3f&}hfKEc+f+F= zfLm#4o_s=WhiflKm^F`=&5~!naPfsz<bmV2)fA19(Nc~37rhIr(40%QTC4Dh$P-3* z73OutNWQP3*SM?0t}aw=Gb*oUcbnZYqreKIb_tY{N;WY<J6XdMhb=_or3ArvHm=K% zpHr9+l2k;--U~kFv7$YZsR{-yNRpO~#}D_Q8eLm#-;B9n3@8GV^xGSBeYPfKx6-K( zaSjl~gIw~j(>k|tp^k+^M5%4G`09{3i0;xtYzvg3aT_{hQ+6p)Ssk2~z^mFmc{NY~ zK1$Ss`7Z!c>7%T40lt$42jbA#W}lbxW^7^@EEZ+1>CDTqyKsCbXZ^!rRB>KbhqaJi z_8T~Hviu>U7t8{g^hAAe_qjs!n>Uv@^DQ6i>%qdVTowHQLET5mUC{#RDUY^$0p?P0 zg>CfTf}BOsLPgMRheppMGVQj_NLQV^p^bcs-$8)g&ujMgMqZsd$ZS~CDRK9E@>0GZ zxnpXp4>Fv)Z{^fqMa}xpCk8S(!8z1L_igUw6iF{24|RFkIjTdbJq4Hn(G(`KI3+B$ zDvy8P&F{`O5Gzy9u#*S~G3B*_eSc&z=)Wm~DUPwGAtiJOd99f*?Hx$)3Ej75&Y}CK zwgyf*BwW{4Fs%l%C=zR-Lj`#I)%4OKTXw>?j^-ACFQti{vmz0e5PE*T{ZzqhOHUi? zfB`jxNDd(ExdO*q!k&6mw^!F|Z^>FRvN{};wbp6x-n_=@2@WuxC$w9X6RaA-xTLZN z6N{<(#&5c_^OH}ZM}4nF9-QNrB!SYDnDVm*p*i;Gk4ePtbx*3;lUFgEzShw*7Chw# zFifaFVO!J&D{_j00p19k5s}(#J#6uOk5z+#pd!CVhty?BN|U~U?_h7{*yQM8Tk0lZ zGp2U8I(Bhv#(Us~$K-p~a*JoPI^bAg^=t8THEsbN0945Vx?5_qtr0g}k6B`um?a*w z?I)#b%Yw1#L~9=y)HMv(-9^gZpl9K6mTGA>TVANjVFylU!S^8;Q9+bSgg)tJgilzC z*4IPVhak!p6DR-?{BgAgyTz-!^L8<?UekBzv3=BR=d?uZH0~!y&i1$fI>cF~2&Qr) z1Sh;-0;{zSOo#%MMsfQd-K7H*YQkVHB3YX9nalwG@{9b0Xlarrrq3V?@y(<GAeHHS zF(XpJmr`%IJo6D+*U>Qm>&esVVC?h;LubY<7;2(sxpdcsDEe=U!!N(eA^O)MU^lr1 z(JI|VlT`_)O=p+?Ea|pHy8;SmAE)kji-*c*PPH=Dj7Hn1JPofuoiX7a?N|Q>Pmlk? zc<9+l07X?5sbak-!_3;}`X?Gx$KxP9>6i-eQP7B+^sGI@CPQ6QIE;E;eQZ)N=bf7n z2XMv;h=UHoH=)3(>p*htt?yMy@F0ns#zF)Tq2fn8BS#?7#D<OMwj{hxEI_CX9;Q97 zBz;PH$Ey>ok!SfW6_zcwqZ&V8sD^7g1)bOf<fqi8=(()NABi!?5qel07(SieQ-cuu zPeF{fv?I9{_rzoe4+e&F(ve`HxR;joa;CZB9T|oV%Gct>h)qooI!5iK<~6X1T@Y?g zb3(8$(i;|Q%E1X~U4jT!sFWP)(@V%|uOpRL_E|3=4Lu8JtN0N8QCkH<aDsIvHLnuO zwXkYN<qj)<i!kIEHRK;40L0YPLwD7wPFL>Ox^@rjBX<n1MLn?#%R-#yI$hJY2Jht- zVK`8mME*kNGmh=QXmFFbc26`f)O#pWdmI!3QxM_%=|SNjIV0H0@~g=WXH^?KQHP@q z={b7b!r2htKEXEne(8rUI7@SqLCO>4o+{5h8SZB1m?>UqllX5$6RLMRu+(dL^rQYM zccf-?)fe}ZdfkOtac_aEn%eMiNPSFu{&DM<n&14<iT}bm562ArDfYIzl@-s|Jm0>E zA-8Ui2=}!{adWt-8%M9NaJ1P@a8cTN>W|jh-{)p^$OmQdvU|T(kGfpxAI_@@>@cLC zrj%}*M8u7rrctSGP(U}rJ-sq|YU>eXA;TuMa@d_blonJC5-@A~YeQ(9VfWyKEye7{ ziL`3Y5Fq}SPu*%A-kgP&tLyDf=sVJSM0cEcOaIu}d|=tsqv(+;L<0mnym&7K$pyDQ zLOLd@?3ncHS}f-uzLNv<N^7FcF`gf6JDsj3@ZyI@Qcyz_t>UkIU8#f&*Xda{FXuRu zi1-H1nZ(RAUs(8iWAhj+9E!gy(3|;(0#qIUXCN8N)=w1HgfIVowv*+ILWIX*nRq8` z->z>W3tETYNkIt;4iD2kK3?Hiaq)jR+*;}mK{*2q?)3T~mJOEPb?T#!L<g@Jj-Xat zf*gI}t-p0)ZmSIj<{RiDvRTmu8~*Uf^S&yK>hZA7c^f_g*L{@gEU&x=kM5YTN_>2z zm9cg{a%I8WEMMc>%2zMx`Pfsh5v-0}7)jBNZX==|e&5errno#$^7X*Jq-y4O*33t3 z(u`4Z&g#+d<i7=*yOa9<3K`KRcRziQA!6te{WQUiBaG~FOBN_^?(0M7H=;!oN}7;I zqR=MWTQM7#K0m5Thg^OF@2k*glXch<^_H=ii!&B1ZYd+%oSWf>j{q%yD${=7GZnF+ zkN}~+0`BKrah#h|#J-xaex=EsPDq8S+#i8|_RG?+5bto$M}7wjmq#CXH&lo?@gbMs zT!U*_9^Kq`jZ4ZEZGZoYOGM!A^qYCVF^>)bF-9s%JPo&Cjgq?`%p6htB&3aUjF?`) zj|@8P=xn6{o7C(D3h$axMFF*GvM^E)o%jW5z7%j=Q(a#DK0mM3>_-o^7z$Lf5P$xB z*k7JG@R-V<|7Xt<I%2-HA+CBVi~i&lTY3y170MESfjBq?YbAuld#X!gG1VCL`w7w` z%~4qW1&V4*qBxQ{I~GU?Y8wl#<ths@8ij#Ik}zVT=eQxYF2k0H=03Oppk+dh@oiHi zAm#$j=aYn|@Ze)#PY}Bpm)q&;S*LnJTNpL+ck0YB6~Kg5x}-0!#JTh;?zw2Osc4?< zG9NWh>YJJ8(exDfmW)~qVtI58u(9!(93pBK>vmUG(m!)feiNDS5Yvlxd_8@QkWh~q z@ppdKXKnxuhpLnyUj&;nrNDBX<16hNIsI4@CF+&Xu$Ho}I}5?Uoyo6MZ0<Rcmz!&u zoSdxK@72mZ^qA_r9JnX_+Jf%=(VEfl!WB+J<*|r&%RVwR*r&G7dBEW^rfPHtG=Hui z9iiTa=>PxDdwv#fOrTWH&2o6V^+us}@o%Pw(T@G`Q%XRyd6C;S7LOgq11i6nd=@OU zf~#(WB@|;`!eY*mAOs&Ifh=#-s_6I?ao@@6aPV$dL+TsX&0;cS^ZQ#Q^QYy-TY1d+ zhxlx`{%O-=w^dRf^M_yF&^;pBm(2wgu!l+WH#i#(_=ixv<a5!=M{U)Asv>9XLB8B5 zhy(3S{fJ(E7_E4D6f(By5|fcQ^i)J}xNxDYD_lZwis^~(^EL7Tj=zLk!|_0j)y!<^ zqflY|Wur7bcGv8L8=<j0ZxDw_$DIM+6fWk}B!1`>0SJQ^#l1^75kLixxSY^mB)0Ye zXB+v(7ZGW3wP8fM3V88;xTozg@_N8S7G_`nZBqfT*kT4SkY5E{G&?8G`(K}Hd9>c~ zIxi(_y1=-c>ZL5Saq6j`Ue;zc7We*+9Vg?}@m?v>F`lM^I8VL}(Lh(CNqw_SmUD$S zpsT^b)9+N58Z4sX&KP|=IuaMNertBe*%@Iq7`}}9O_to+u2Gz96y&6Mp@*~`9*hQ3 z)g^zuC%LuqpUu#1w>LcnKX#Z;*Z(gy-sT5moik&6tRSzhQL-$m=)Y+D?yx4W_J15W zP(kZJWu(^Dg@CAl$f}}ZML<MAfe@7<GaxHrC0MPZqNG+Cf`EXE2m}#G2w^yh5?KZa zW)K-kSV@EcF$p2RlVGjBZ`a%J_4}t+uS@bg=Q-y-_x#+Sn|~ra&Zo|b^I<d~woBR~ z))FvK!e_Cd1Bu_81}<oD^)_>SDCC*Nx1EhFx*ky-(GClyaIB{?vTM5UT&FJ{=4+e< zUUSbh7Cc}!@$slqVN8Po2~$ci;BTAQEm0yIKQ>jIWvbqgIxxpGt61^aXqF9^ihRlU zhI+xN)=~huL&{sgox|d#v`nIWyxFqWv^%&~%MD`bnZkdd&$XLcd8+-F<J3#HO&*v$ z)G_aD?{zv;EYNfvFwz@qBFh`{vupTwu5*|EpH_G?wa!_@kT@{u*5NIlT_swPAsd+c zC%fiqq?g2!&zUj^Qs4L!)_g`Jgrt4q-T~G&kEU?Qv!d0jhXZ0}zmTl#3u8Wj&L&D6 zx^WFGLZJ*f((^*oVJF*SO(zpFo2bHhKHV|bHV^R=TbcWt1|$9*ppO+HDhs3+Z6!m4 z9>xxQxLoJ##ws9^kb|6<?j|PWNM)=HY+GZqWtV5?$SkK{+~-_7jBX2?s{B!8^!mY? zC&3>3Jv(scn4W5x%O?gy3*lXm(zu_A|6pAw-gZrLOifLh5zgU5#dw-{r847e_&O20 z7R95Y;X-@Xm_5P@M^YrB4PTR?NM?Jr0_H1ihsj*%bLic_RS$x+p70H}wu6uO5#UoI zVdMPur(*Miv5E#b^^6i}4iHBfE`IEJlYr5P%-Q$ufw>=fpvUUMG2?GL+esE74``2Z zIB4+FCqc*5!YVXsIrh|~8g=%l8d4YsZuTxP)zN_weLKaRd+_RUP2$sx$$@Ee=HspH z0M@4fdf)Zlf8tKk8rAEg0Cb!iEh4hubd8+IY5-J&CTvslKWWK&zlhaRJ?K*6{=C%g zp}CGSLzBYcg~Ur^s#AL1<Y=}Yj8HqLH|6G1%Q@h^(<<>zzwtpXS|{H~eXsRU#jcW{ zf(e9o$VS<x&)<ygb^O@P3(Orva<{nzo(I?m8neX-j*Qd!e8J>T;f>a)_oq$3xxUFH zLZUvz35gxu{Bb0I3U4jn6COHViFA?lcW=FN<o3WlB=dy1;-cmc1<;>hrGA43(PE42 zFMZnI8#lmZebyiOgXYtQ#N*zuD{OnK3)48XY$J6?Oy~~9cLFal`Kim*`Kr5C>q$z` zu4!BAjqZkGd&{(A*X-^pC86{!tuoIcD$s4ydFzc4!zm?!t4T)Klhp&P;J5IW=sn)# z#%C7O+0Jhz(5+tN9?at1R~&29t9<hB!71X$%76Y1%x$FiWx(j9X$bR|IWS?-?{1rQ z6qjtnk_&n9f^${jq8u$gLsll=&ms^r+Gr^4vfWhe4jgJ>S-|`!Sls$%x0l7F34Lo} zXBC`oYh;@&{P{1oLN>skQ}e1r3krRmTsiNac>-fAYGfTGADouLyq(nEsxHc$c8>NV zTLZNFj+en>V6B+?Y)M%B{u~of@H<y8Ux`^tncl?t5vHhW+{W)C<Im)H$EK1haP}n? z!MdF3EaBaY)<3@yg!3a0mPD^k@J7$v2N{uKGZLb~k3UAv)WtU+;gX|M0Oaw-Y@#jT zi?ALSVxaN)d@XEOfplsWX!^N#8R%=VMivp=c{zux>k+?j++b6@cG-dhbj2-6IPONz zrr&r{^pqZ!rR$7-Ee=f~7dAxi2JXq{mOaI;SsdFX%;F@O^B)RJ<HXu63CcTz2h@BW zs-<y1neDzCMq6C{isV0ik|iq>t~^6=l^8FpH!E90?~4MWv+iYsC!Dum-TSC86n9A% zugf)<wIyh}l=;<j=mb%6?&4}1NaFiUi_82Tjb+BVLct^HS(b4sxR9SUli{vKb3hB^ zH)o;eZ_0ZO(Nh<IhQJEiYU0sA(-lPYj#!%^TY!5ITpcc|lb&xjO|YfMKL&P-oJ|BD zU(tA+s`?t6S-ZA!v&e|-vxT^^ygf#Ueg*%p?{8k&C7%+N%zCbX!ZyJ+$+m`ZGm$2E z7FsG9Nt}35BkH1Ci2JT1Zo=P$TkU&D&(H4E2=<Bsvq{p4f?DbM-hJg76^0d#WSp_g zhuf4%#0o^Uq8hF2rNwy9eR5Z80`sVJH$9KHiJA(Lt~@!c0cc#D*8;9}-brWAcUFz6 zeqDXu3zc@9r&qtG_p~A~2A&~i*}{PxuV*+Nq-L^>ibLkDj`uX$9`{DFY%?kIQf?@v z16JNz*S_wlVJq$i_iWT=2l0nx4uNk!oLlNtx0AFdV=)(79e>hH7E3`S1LlSoRTYqO zYX<WsduRE<;j$eVPVF9g4hR#<N|e5RI&ozNh`}fAB}s)*#c#q&g9x7J;-u)Cw0#*n zbjhW+y|-a>E|t0)7^3in0GvcC#4xa)3H5PTvPY}aq=z%YrhZi_*oxVq7M0<n>)_ts z_tM7maRDG{Hgx#P3H?;q^`6ei280o!LHH9I(M!^2A&Cc~83C}$QfI6UeL2RSyf34g zpJv@hc#Hg$!5*7bG+=TD6b+af2tz0cGhSQAO)5lUYL-Tm#5~e8`RO1mR-qqxNWK-Y zdZS7o#tsUsar&mt#-Gain`oYV?;DYtk96H$H|G@Hcrpx$CIx)IT-d-~{uP&)e*QSp z>a$zX>~A^IDZVGrP*GtW`C-qlBi@ETJF9U$Grl|gP!r=JS2xlZgvg5C2S4CGX{|ab zWlXxGB$r46&c>rIA0Y5$LG@@ooA$6(rp1Xfd;2|xew}xyLS2*3@#*nxHN53Rr|=gP zTk9516`pY$O0-sQsUuJ1-{t8jYMnsDvb+2)XJAc#W|v0^k2(zHTD75HYW>jFCtPPe zy~8CDn=fWG?Wm3^tqdx(0%JW(g4PF%Yw0d0wY@-n9$+u6-i$2sc4&^(mXB1Y!i}x7 z1YuQq=r&grQJk?S>MrliNN!{b=^DTSw~lpMRXA&*iio&f6f!BV*HF@Cp+l4$8`}|{ zZ3L6OFzGY8BTmPH^kJTcJ*ynLOKRA(tCYX;`rz6+UDD2S`;m}K-0hME>DG{;k7#Co z4?#OjU1uw{ry7d`om2E2A2PhP+ON>t0^Ly+o;_&ey-VnA(N}WvqA&?SAw^8=Vs9&4 zaoi-^<Uo-PCGRT8EgBX(Q%-tv;ZU{dvWP)bMeysO!&%qKMu&8XV(k)fdOj{4Lh`IO z*e_1M<LxT+2D#ETwCA0N<Jsb`@3BXg4sFc$Uu9p&#2(5@EDyS(V^5ZD@5qtYTm8Dy zm*zHTTOLH18Xb?@_*t&})u(1(b;R<)DGhyAL9Eo5BhReLIKU!E3%O0Eby9sbWXNO_ zbAd;#%UjjdoFVTt7iU#s#!T)b%%lu&+;F^u*_tt4<LxG8zklD7b^9UoGuj?*`8W5S zTkgsSRcRF-U!4yHL$_`pvJOOdu}WVbX+D=1`69fRLmi}GXg_3m%}F05@#e~|eXnjp zmjveFcCHgfFc%d?$LKZ;ROy-G3T|PEmzU!}vLqV;^NSw8NxIarWJWpN)TW>$2Xtrx zLoeHS`=V)5On5Q%epFr>E3STTW|+HHS0C)I&-SaP;%A?fI<NPTyu+g6Qm^U6PZA7b zO^35Xq7}enPOGDmp6JV5$7Xz1A;Z86!l>R%8~hL|BtCz%^WJEngW0~wq7>nF`*K-; zo551jX)BJY<vN{`Xsz<Pla}m=@oveRaz7XmYSbn4zQVg|w4x!h&-&@baCnzNv2}Ly zZ(!(r?wcC*psf*}FG@Fvqb>;vTHN$34CVF&4PYD1bQ^eq=A48ew=1oa?)M@|fyq-k z6mK1xfxdH7qVP=Y6>+KlbXq4|lk}_9GT{0SECcfTh2Z#3PQyT{72fk!FEe^gM{<5* zlJmHSF7+!JJM^m|!~8{Wv7??h05HcRDd%Xy#3l3i3Yk{{g24OgQ<{S^bz|dDMo4@B zJOi{*mVq`(?Dh!<K%gPxri=7HI50hj%#qfyAkdpIM?yjjptT*R7qIzB$@bGq$b~Ja z)lWwCv#|D^V@|I(iFTaj_csay&oZxHU;313x%ji9oP*t(<e3{)PpI8pcAJ2(%RS_X zF;1w0HpM*DidSh7CAHzEXnpTYo{!vw*!<k6mP{V_iXO*8iE6g+%B8!>c%5197#bcF zVNarLD#M#Ve38(a;ZieyVT^OX!D&Rznx?4h@ykO-9h;SS5fnhzVtydA6NkPcMP_M& z{QyoN_$P&jd}m}ub8*(Qc~Qpt*0x4-0_t70wIn4OtQR_g-@)C26ew02&JbrA;;1b| z;VD;HI8u@SVIs8DUOaB{ymC`^_R)k`?NX>s(<SNCX>>}Ww+$&fgXPm-d714QrA4mf zt$LIhT9iWXoJf-fr+QH$(BzWtHC~!zK=Gvfaj?v8y0L)qqO{c{i&n1FeD?#h(!!V2 z`LcIge`Uv{g(YsABkMUl?;gAMLXcaKvv~E29*uPk)Via#Q_m6?%LvhSpxy4b{^1A8 zroogaSbkfLB(qB6Dk2|H9oKbE_Rr0R*UC{azp3u^bqtHx9II96Nx=P;J=GcB2#aA+ z8s#xm%?wAGtB6_PqXPvg40*S(QA1wln+}<*$fwfdy$T{Rm(7uN`~+8NZxxUQ_joQJ zXO%+W@jI2Wu(i|0UyGshf}nx=@zL4-$}(5E%hy^gd`4>XlcEEZ24Z|gSLa-tv(V(H zOa-JW_bKA@yfoz^QKwh^Rb_9>`5(X9<))=yf}pv|7%Q^&?oXffuzx-6If=fhO^-g1 zdU4*^o}q!V_%<&xKwXv=I}jXX=JBu+bQ9exjO<50DaZ3jqx`q&w=0Sv>v4IvRzRpa z%^?tMT~3>$cqPD0l^+I_SeWGwM8m2*tl7lbL{$HxlaoHRT^H*!UTCBD&t4H-wKQb& zcsiGZcZ$_dWqqFtBn#KoM^yB3Q~*a&MmiCc*Ky2&TF%hyeLtqmrqE4e9L5;~M=y@# zav#KbwXdU*Mqt9YeGu`{;vBZgRnZRL8<er|tQE9+Bt31DKcv6<j*2ar)cI;CAoevD zeww~qR<2rVWSzC`Qe<VRR(I*dF~aLxO4DfU3nztM-7$wz{jT2S7Kxsu(?}*iAH(w6 zN*{PTlgel>s)SWE-EbD~GMaX_GYyu+I%>OWVh+5HGhi{mF}yb2lz|`k5Lh-aX^@_Z zd7-E+1kkh6yd22oS0wF$)wH3sj;#{pTL(%Q%m%=zkeP|w>pYP~d6TlTWpx?-m@G!% zyEngUj_`E~iaAgNlcvPhmYeL`I8U}saM?W4I?`Ar7UaF^Ox`;%n<1XTwLA!_R%|VQ z{H&3RZa&v&Ew=<cr=+^ELqfsi2j2`>Wk{q7{63yF{({4b8ame~?>4k*i)##c8xQ`c za}o=g@)Ty)O^P|>)GE_`Gu}gF1?$t}#ZtGSsjh?$v=lZKB!o;gHX9?Y!lv8{tK4}h zoLL&#AzoAGG?pRx=)v>mNW)vn9%-7MZdlLK^_zlhKkGL#TcqlxmitW{BZ8E3&wR<j zdXvFA2|?e2vNhN;ech5B38STYFWa`CzvAv?O_Ge0_r8T?^yir@YmXT_dU6#gNS<j& z_+{54UToLAkt)n{R2^0eGUbtux&p8w-hYUsgfL{5R7mlC60N69CtZx46dUC6CXPq> zATF2Y+5t~fy_@o8LLIcEDm>`*U6TV(9XxM!1Rn7`w28I7es2b?t{xfU75H4s^)q(~ z1Hc}noQcGad~~F?Z7d!O&Qj|URB|))!#C4`?$wzGGU?DmS~(%FF`=Ckp1w=g;dJ8R z5f+@@*Oz+n3$w<{Zt!+{)EP11`MOAkjvfu>?#2B^l&}QuZIEJ^uZo9`beg>KcI)9D zq-(>s*K=3wQQB2wUn6y4X!R@qdY6NG82qoCOBr3b+Ld~_;a6w_jGm5m91pnDp1!GJ zlfmu@^-h!MqVTgRkzC5%=`1(DN0fo{&TG8qeV`|eI^=jTu@`S)We1nlj{!XT4h)O9 zSMDl3nhNOmFbH;eEpVdY*Ta|@9XUptLrZvgtjzp(Pr6*gN5KK$F&{yCkeFJsUH;5a z0&;>RkqBhE>@*EcS(B9Pz}itm&!LjjWVpywJ}9zoo9u1Y_6$UM%lZ<4hO~<p13p93 zA_w&sk0j#2T2VJAUh<+DA52*b+X)C99OH1&AQ^p{`DpZ4Q>&KAjCghqr)#~TS0L04 z#O>L)%!6wA`r;;LLWZ0VvcFAB`AxNep^o=Tjq-WD*X9K@&8OeEuj%!?vK}m~6&FBj z0WEyU?xUMiXW26e1!s-~@SnP972BYacLk&##RnGpr)N`jr0YUL4pOU#I4X}cFOqyF z{JMR!?GL;=x9+jG7oTFC!q%<n2_4dWnbv{OP9Bvw0@e21h<$c4r@ThdQwnV55WK2I zJLHWwdeT#C|NC|F2fuHsk;qg$9jIy5caKxZ{=0q(_T0RpqJ5{Zc77}NRtJ*UQwq;z z=YsyQ9fiGzJmaO`W(ly?X&0@3yx8j~$Lb`+=sU&MT&NVoPZApxvK7#9-1O<8tHjAl zZ;<%KjokJpC=?tjux7B(o?s6hnn!aBRbQg&#Ga!2D&O4*tu`5(zu0jb_GG$b1AR{8 zQd4HJVUylY)4pCuQlys~9S8jBeh+eT?*=_7y<EL@M_brPb$?yB^w}l%kB^9pK=L3u z7t*~qC5a2-saHg?F`LD4xdZMdj%3t06B`vYlCT)wV00&&*s&xc_|o{LDJIv#3=~{G z=JUrqUnvmbzDtKUeJ#UHW>$s7Jrq;X@1Af_8d(BVK6bE#H68>iD+Us~V6SnxKwhFj z7Zjkz-u5cfyX}t(m!3Q3ikiX+P?h53x#}hQp(vSH&MV-g2s$z=sQjI^P5J2_T~S!j zE&as1kkl^tX#lub@81eRrNFOU6d?8XC}&N9@?)1L;|*!6Gi7-<KlpP~ne&b3>lp!z z7lp)A<bfo9?vb?gSqI>Sl9j86t8P2U0-^Ana0}4r*Uj-AG}JBh^B_)y28FY@Ya|Bw z?H5|2tvlvCJvK(MB~)j)4s9pTvCJRLn_N5F-#qC+v@D;g3I8U_K>ql|LR!~HS9`pt z(Tkb^Mi*nJ3KMT*GoNKl7D|HMEKIuk>RwL!T1%Vf_P!q+3rp|+rqp0zViGINtH`>< z4ww=YUQcpLyB7SN!tr{8*zB_;xTCx=VzWQNsyioXfqq{2nG8sewv$65Z*%_nsOp^) zj0jQZNo~#mAk{F@-L8*c6ihss9q9EIXGh(+mDf8jN;uW&_VL6mkTJ#K!c5AQ!W~Gw z4kkS{_0j<U!)5EQLb<BQVWQDD;Qce%R@_qip_e@(jZ9O{`_)uHg9JGD!t+_}W1d5i z*yeB@Qq+_T+n3aiqo%eXihveM_nY*O5le$E3ikp)bc%G42!*4NZ_ASoHrwAK2c+Iy z`a8Q-lM+r`271yXK$Eh0WTK!ADiet&-`kwyx48`DU6S|Kjqe9M4PKK5ZCa=YVlFE# zUbstG`qCQJ9NwtUiqzi$FH4vE#&^F8w5vYa46SBN>Yjh9)gd!PH_IBmn{}Wb4{Cdw znDMBJ_y$?zxH&R=cwF|R4c(z=r2Jt4<#ULtO$8HrU(?UN8F_Q38m-MF9#e#Kp(M;9 z@{>sYW%@f3#n3g`dF=Ac(%|zo2HUT~`7yfN9eL$~w*03a`p*1>&Zcyk7Q7<P!VqNx zy@W2e94t(v{qRv-4!ET;f73Br;m$u-88`dGeis!0icb0Fh!e3^^AzxzTv)sw`>CtS zObpEwPJ#_=#yqRsGHgI2jwb@ARuT-{r+wfkLAi6Or65MvMAo_o1ism4TzmL&mRwZ* zN$s`pp+uuBSRsI-_^;6ov8wg1GS@YR(tph-Nr2N+e=bmqfp~$Ym=y%k?*{4s=|u`B zu1=q@CMnxXOM2y1PVc5V*B{f@2Uo>fUYcT<tx0+n28Da$1&9~D;oen^_ab*JsTLjk z*kR&+HVSK6la$gU+9C4N+f&Cr3Xet2hm!&h8s`6SMNhPIY00kW*Z%JOz?X;@J4$3V z$0<8+trUojHiKI8$5N1`@1t^1$UHWi7=jj18r>#e0F+0qvuHd!z-yx3(NrMmOU=-m zwHw;LErHZ1h$hb(s>Ny?v2&ven=mEncaDTe*4F__iGBKl6e8y;H(ma2eF&o@J6dv5 zNUuXi?!MGg(FklAWJnzP+R4qqAssf^22@C`-B9JkN;j$CE=%Yqgcic{IWTTBs6ZPW zT>BX?ZedRCvON{3TOqT5h0ZwXc7KITPn#^f13zXD8p1C6062)V4PE<$m)phuthuW6 zC1Iq|LA{iXBAeOC#`INEBQXCJA97zWBMb8@4Zu7*U=E<3SeQdvg*+0XMkh}Ac**@m zdkf;a0<)Ue{BDC@WZ2cb4Hus43MzzBGx#ReuekP8D?f_I$mBM4*^Vny<(AREDGwW5 zVrZ1*v@>HrIkG2O6VYO{xH&{y6Ls#}OQA(p3?qH_c)}v170Vy@34g}v&3s^SZ#w`I zukm7yhH6s4<SP=?>Qu3Hy#p{HQK#YO=my1WJ9t@I`q%T3#WwV8QaQRqxRE{fvB&$X z8^{ZTEU|dG&U$v~jtEZz^|Hdb;U|?u>5${Am&JR2$F3R+u_t>Y!P$#n%7SmBekBD{ zceYsxY%lppvh=vqeJS5<Xl{?`VuoW)c48Z%jXD^R_X7-FSu%z01=~$8r6DW^JKH1R z@zGN)5m!C%i_+Jz%h%ACa}9Y3ar`&UVpRXV$jXrdfA>=_V=pSQ(!X`598!Q)0Mmnc z;&BnSIWuHRU_J4cb5DT&aK1$dSTUKP*dJXae%k$z=$K86x+}(`4<gGEbBVB#dcegt zmeCCJ7<?hoLt2!n2g|~!MI3oP05VWhqDr$SM?;0?Q$2$}=L$HHWT^0sKypy{c$-Yn z>4F-0`h&1o5EoRF?bR<_#7&PE+Uf?QnT($fHkK&}@?I_I{ld|Cu5%%y596<{R=ypU zlaf&aZ=b}yFVg=daXf{xd-Kwt{4*&0{7%!s!dn1K$Q*}sXHB@Nf9;*o%k5t;5<EvA zkuSjwX>Oq6$oIIQjR^FsoT=dS61GuU>vq;ITQ_8cEOwUeMj?52jfM~r5Vn@83RFz+ zsLqi0Cs(?dI==7lnEUb&T<_JG?Bn~}3`0hvug6b&3p}N>BgDOk84X>n$!1oaj4^}1 zL;xi2bPb@kwN#UfxT<+|n<XhU=;Bl{*D8secF+5{Wu3!pv)pli@nVY5=!ij{_g<l~ zKF*Eqj7#;)&bQM>y8C7Uv|=x21VX}dNEW>HAnQ8uD0|uq@}px%39XX0{0<2BzSYnn zkMZSFBi#fVQC2yPUv$45cJRQJjhDRFL)>iYlO-+HxDj0$dteYosfa7GrSztycFxhE z8Z~XN@pPlFT=fXLGxfzvP_Q`KBFQVU8rp!jLp|?pDUT|$Q&#(_hi{N>^jE$yTEiY2 zUD;4l6RN#0R%R+!2cXA%kp8rxm#(g(`dhlY@<z9oE($ehsRP(fJ%vE#(3g8#*4Ly^ z#a~a@y~Ul<iCNg{Xrcb9&fD;FO{eJWch)as6wf9?Vn(0RTB_pi`lEYCgrIq3JO{|; z)bN5`Y`5wGPa$cli#rEZ{;;-c!lmv#;4aGWT9_Denl1y*&wEed*psWUN78QFW|*uN zhW9)QAA(88eX;sZZLfY1&XsclxJcD!c+@?y2;Gwdpi7OKlfn17AS00x&ne~Txk<U_ zr@BsK#j<#IH)kydx^fKl92m)0gGXbg#9ZF|g}tAXyP`Hm9r^k@H9T!YOW2d*6iiF8 zUdy0bGwo?3_G|kY*&e5YBrE;!ywXN-^u=H3Oj!{sS$dh|B!m{ZyKOER_sbsQ*3Jlg zi^+f;1~B!3R1^C^;xl66P>G#|gH9}eEx`^d_38;tg<OlHq1KdIx0MjDM;-iRD`n5M zerVNt61BF#^yiT|&YHN<7mx}UbE<EBMqF24c8b!3NjGE#wuUcnuE;9eF{f#8#}Rqy zB6rxZmQ1^M3-GV*+%kzEu1qilMYfco5XgWAa;&;P`c3%8ky~tUn|RN~Jc(7ppk9eB zs=qT}fo8=)ZK;p68VZ_lqTTliPu@x%+i~(rpbmSYzfvDkrhBg5?@IP>lG;zhMg^C5 z_1o|w_%FFR_CptW$@bFFX=r!Fw>$TZRUN9m_X9ojo0u*s@V^i=j;(ccRR<JnOJ607 zFxZGc#@nv$y)b#`O`Wkm<{Bl)%?!Jjp39?5ZKflNZQvEm=r~+vbIP>FyxS_w!X)6R zhyBgfjT^7hS87Q@verXM50ZGDKxy9#v}6Zf!F?y8HUrxWngAWjpfq20^lf-N+&!Tw z5}R$2l?rlk)AhESS#xhH$r}NEx$9Y`k;K}}KV8Ebkt2==DF@g>?-1z`;Uj?+zBXJm z@N8;EKNOP{GL<ZdzfTxgB-zgfkd|FkD`xd@tQEC-JjvHpuMYRUlcHoPpMW}UH<h1n zcc>0FJ2pNJ1#Dw{M~gQWBkbNlJ5Lxso^x9~XqxRYx6*WTJP>TR8u1fOzSRVyqGNpg zwV2$9uN96&_RF3!Uxw_UPO>8M`GX??)`!Utlx-=`DnBdOIKpCPG@VFY3aQI@=Ars) zdKbbp<dBwXL~zz_<3>PtvhUsCQ;yO2BE)#vJ>qSXiO9EZV=!T9Lo0GKWEbb&Axp9> z!pZy<r8la@yFpl0K2F^?RPfex4USxa@vd0-6vT-=Vy&;jG;%(x((JF-YP_8--1{)< znHGFZ@F?3p>Uwj=WX`micDwRyBJ}<O28|OYt6Ge;VpQcq&3N1CFLqQn{0(>3!8#%N zQypSH!bQ^68LMl}nw+W|Js!&C=clLE3_RgrrfO_sS%la)_8swDNGw(ire!>9Yz#ri zwdeEarP!vkCM-2fS>uI{rp>SbjVsooyLlWB`BZPC8;Z4b=xe0RsZ|djCs^7D`4EUH zI@gcW9v=;0#`msmHmQ?In~Y6s27tMP7EA3hCNQBTHy!ffv1WQ+77J1Y;M`@|G3DaR z?Nd?Rv5_Ur0%>bIZsFw4lL2!gBO-ouJh{^Gv((Xm-IM!g3+!btkWW%(oMyn?mtKAm z6Q)uGQ`ruc%qD&XnLoVSUp2S_DGZP@p(Sc_+wmRO@PH=BqDKFI`&i{O6G6#5ZKh5( z&3XxK(5!(>ni^WluR_!AXZ8&&*_4QbVGQxD<&%u^aqjaG7pcVo3&ZG|(i*YG43NC+ zA!r3!1m}(~oX#7mrcA?Alyq6-@wuOKmwkjQeQcdrGMse8d!oeLfeK1LdDOE<m^!h% zCT2)9x3@;XsEH8Y5%>3MW|+z;zUlH0I@y6!=d$DOhy^U!5h2D}7#AK@Zngm}c~>bO zz{C^8hVm!9jq)LQHhikn5fCkYfWiWF<2Zggdyws|Bgq^a%&m~F_l{ZqQ}0+{Z#Crg zYa0WnM67_Rfpc>kU$i5}3k<XB7}cY`V81<nu5tqv@yD4}zPAlLD~~(=xRP{C13_N= zrqOV(hw4Q&$aiNCocB{}yLHryUWm*6-c`8lUIAvFA9>;{9@+mpxXtYPn1yO@b7A&{ z^M}6eSW5mm%-w6<+1>EEjzZMp<{vg|(eFgJHjTT17KudJO&d{XLbP}uvm(g8lHP&I zL-cU`q3*urtrHI%FPZxa9|gN>@n%)Hz*<Z4VBe70qee?esdQ@)Cc8UO8c6&$3q#{i z{_Q`<JIyApZSR!nZD|LvmnnQ#6qhe|12SI=t1NsieBb}0%&1;1K;ga(Trb?Djh=YQ z=HOk)4=@Wz;|qoiXy@$KH)^VvV5Q{3NKsAM1fhK=5ZtL-H44lW8SGuY(j{A%j|45I z^Hz_;Osx~o95ke<LDu#U9yTa3-?BDh>3IHQy_wauPp})7wTJoqazC=)h(O%0W2p<b zdz-NPdwYrn{)(U1<~;ensC@Y4EvB3o-jrrFNdx-qOj?+{pXKf#^RLYk;@G|7ma1G- z1{VFObA_p6xd9w6xr}==p&c|>vW)a%ow)LnPcNZWcw5$+ltAGpPFB*d7<uiL{VTb3 z9;*W?yLG`t6VrMGFxDArPe_k)2pyWuFn^HlTf%R%42)zqERWs#Y#?(SzzVDX9jx$9 z`h$4pB}pquJ%c58MHyoGjG7Rg;6d=(DQB60k?CQH><$yIM{|t$ZFjMS3f;Z?*#Mxp zOIwOmvI~M#?mxeh@U@+?w{z8%gm&gb$K5KxN1g|FaRt8~NXYBnM#^0BLS(jCHMk~% zeDlZ<b1KL|j;{d`<rQkSM7$oWt8pG8dwhN3+k}|^0|*c41R@J5c>h!rb3LdD3le(G zktKEEAdi|dUiw<1>xBd$uGk?2NU-ALhjR*t4C2TEL=zV;2W#iv<xlwAzr+atFNjmy z2e#SPUKx*W_+SA@t`snZcHIDApdcfFG6b({Zp^F#utg2aFmxeuu<E!Qn!mIe8rYq9 z97+48Gjq-pgEMBKO5S#W=7k=QR+=j%I`c27^8hX4>jR)jFb3RJL2Mw{cg8p1KZN!P z`K4?zxKSd$PF#Ml$3tl>D~#{H07h3sKt4RZ%b9Ea{(R)a5_pU>A-l%J_wC+?=8OJ4 zaCB8iJ1A0YXT4vm0VRfuOkn^5l!-Bg?YQMzsQ?m+%XqAU!b7oiz~XxO=?feUkRmO{ zdnPO%mMqm7{I_DaWVoq3f;(udYaWD_15(jo2|poY2po6oTNIa{>PDBYN5{nT+pZ3( zA?i5x*}+}%mhOraswUu4W1nS0q`n}tVAcjC{WoSx0Q6X}8KZPvm2{4P<L`4S%8zu8 zAE9ydeGjE&8rnthGC+2E?Fse(@*(;tkoSI@GH?WmTtj?U0ddNK8OTF8L7!mDRdIkb zA!PwVF3D`}yskY65Y7MgwlS5>qkuQqrRw_lAi&o|0CXu!c3hY(8{<v@={JN`zlkH8 z%QCCfijk4|!AI2n>IUG{nPX>bdrjN`?;h)V;qAk$Yg)WW(}x`{6r|R;xE>}h*1E?f zUa6R3aN@;xn_(HT73E;&)qx=jLarA-u#H;LZc^x2Oio@<P$3JD+jfog$He=&2c<4R zw3Ea_E^G%u28(|$f&T&sid%;q&Q$9Dd%4~}O^%d!ctYF_G6l8WAYun6JWm(gWNvzh z_$DdCw@KhzDIGqq*Qh6-x{4e`*8q)jO*mx!D-vq9$L0111=ui>vTP^k@gtK?m(yA~ zK3b|7KI8KdP`|?W6`SEU!Fi`~MT~XLa)P4;61s)C4`W;c143FQD+ySDaC9ZTe)43O z5LPR^rp1v<<9WMczj~hde^C+zQq~c*UDl&VrI|!ECs9EMa&YQ3So)M!h-}!4QJ}>> zyZ8KEvn$MHwN(Hw_W-_Zoh?|ei`i*?>0$P5_puKR4Z8xOZA*4D?YkpVo<TK-IYhLN z^TWaz!7NxXnvR5--@~>xLt^_9C%(O?`EP|x;bl3CV9thUE*9MAQqG7W1Qtl3$BdFw zGu&z^;5rN1m<i^Qd0`h<&%iG5S$p&dTnz!;QKVvGweA>-Emk{34m;sTSmb0@*+_qb z$cKxsHHz2XCr2Cj8CWBZ(Qi<5NUmM%VckUMrC`*nxK+c#-|_z@F~*Vd3We?;;xk+x zju&w5hM@Z{2<(|IC{k=zfR{vb%!%+Kv&wq%w6L3Gzy~VX2|5F=ZXTK7|8p{wTrlQ& zLm1vt(9rEuOTn3RM)GpYo6=IAQAe?~QT{QRdBZp_X`4u=#>bqB@q^f2ERyf5WUd(I z$Tmrio<fd3yZV2V41qInX^CMV>H<LHxfvqMs44eEX2)FJouE9Ipc@bz^K4cjJodI& zQYU%e1=Kngd&YH_cWt2we*<&bFh^`w?!tb!P1ODLkbQVEeed_~UD3DB4OW^H76Kxo zO_~pJE>x>f%-w|z;e_$Q(mrl4OL8rI;`v<6zi(i;lU^mSy=x8=poimxC5nUz>_gVv zbUI{5P?CYb_H+zLrT|Ylp|NgE6XJ(%_RtOH)A9sujqS_#Jz(hMs@a?ByEPRiOZ%4& zb6QOJ_4?NLj$!Ur2fE2!+2b3&ze*e1L2iJ|FJ5fYV7WpQVM{n}8o$0oQYQ+BJz8%S z^?&dd>ZUR=#R}yuIyi^8i8-TCP$UC2uZ|OgR_*NeiE0t!gs@rHia`cK9&px<dWsUp zuC{6z1PfK!xtp@}rOVfu&)k?s88&UB1~hw2SrL{P%k*}V;=)iqYB2(N@q+)u-YT*9 zpqSSj^sulBM3Zl?D|#K^^xCchEtjR9RRT;S62srw>Eh>sqfFd@lxnjwJkZ<A?$?b5 zvnF>0OgP@KdP)e=8ai@y$uMVXFC9J7vp4qtD5KW0+I;GL9~by(!hrglYR~BWq6pOR zX%D4_3hE#kk?QERj&7JjPlJSFu{zAZa58Oq)jqI-2bjsYR~nNvO5>9!KUvP``PXiq zl7tbE;BK0mdbj!(F}7mzVsAQ7G-4T^FuId$9tvDO7k2MU3=BDyk}P<i{HWx99O-nh zsq4c+V*WU@iX9;X{UVd|7gPVO;a>}=Uz30sRGr@1$M*D4ePEX6Vtzg?)E0isU~_v6 zZD!A?I`iO9en+A;gQM}-nTOrXT3pSG^>8+rHTYM%aC8U&61hxSooGcXDRXyKU;Nh> zFg17Q1ILGjVGw%;&eOvqA6_HwO|~;z*$64qZnHhcH}DMYeso|)c&#1cdK_1f1~$$* zWYk*T1AOiOi*-1B#1<rOmS<HxtN>#UPvhZY++tVHErV7DJLlr6VomW&L`%p{Y5~OE zoZBX5Z7x@JhO3A-*}mw!shN^vd%kQ0IjXBflPY_Y{*rwiclEePL-vOI8ym_ZEC>J_ z&KE<;8-G4hIcSAFN*>5NPq*?qcK7?T$y&y{vrd}d5+8S*FK3gC@yU`mxEsj#gRFE{ zv_&`;G_@uN=Aniiey+UyFZW-0Nfiw<3Lp{Vu3q4>y*wneD&kevLPf8O*YCY9|M(LD z;qhU6ruAN@-nLh-eh61^>R$8()U^LLJlGG6;<CM0-E3`bCw`9V_;Y{Y0{g=&Slqig zSRD@eYM>$yb3rVHq5HBpav2Zl$!&79@TZ^jnjXM2-GjUF@@jl#plDyX24aS?sRs@_ z3mwK!UVwU<t5C!^h@^i}@B3bnwGVw}nyYSN4{b);9Ph=QmS>slFy&l^c?jDF1=9Qt z0gRniR=D*q%E0)R$H%6@_<OH@e9)Rs)d}0b{PpBc1@&}&nc^J(#jks?%ptHbJM^Z( zx%aQJ9wr9PJ-!ok&rQAbc2a!I@r5&qwhxJ(%CUb6!g4%Ac((%Xs$^eW*6z-zkb=$# z72osItxd+GT8L1d%E5%=nw^m7&6mN`R$tk5Tr>}nN>&a@0Ko$>ahmrt*FBMlfPpLV zuIMx%)mt*0yAS=$0IPFG5sypPV)iN?bk1nru<jFn*fjmNA_0>C#-Q(WYMZ=FM3j8f zse0OV8dd7Fw(f)`RsC@UXke3FBjr{iRPH@lIU9jFjwF0MJLu)yrnpcl-vt=YCbj9N z#ehE3Va4&NgZ@R}oh}1U*uL`IWB!t1gH+{E)_s6`Xj#Pr1^Dq-3p?QG+*;1RrHEDA zUWRnOsF<}y2ZXKheWe?~!u_|*`H8u<6KbFw4RZx>(QOEDQ3&9-(JA1Y{-=G0#>s-F zH`&F-SB8cD!6tK)S>e=0fICFI`f=1BtsSThq~^_lzj@4`o|U4Tx+|<XwPVBO^bpWh zd~1M+;OY)r$;K!uO^ZL}Oa2FWHIGyn<3|<?zH}J>*}=EToR?K(zJU_?KSr<kGIstS zmJl1+{ZuvfsprlwqyE2@eUNdORw?ijtS8~5W15}qm&*KaMSr?EJv;Y4ucNy=$I{<m z)tB1s9|#l@xSjErb8#LDp}Ir(@k=l8Z?8ZZd^Qnd6<_@u^KR~(c7<0GYOwr&T*+@v z8kh}<?j>d&&D#)Qraamn&rSdHz8dUxI${UJt8*#$@Rw@(pB(GP%egxTpPpYZ(MQ<x zKW@i1Kt7y%KS`;9o4*6P<g;{0;%f0CqC$rVZ9}Bvpy+(PZoCM-;JEuADK+32Z2&aJ zbLY;Tm|eB~e_Vy)P)erWZBus9eg~d3ctp9CGoh>h$F2M{PeQ?$)>bgs*Y`Z@`_v0x z+W3E<@XQaRJ|61L$Q4#eH~+;0l$M-W45o9$eg*yNfBcS5SB-~jdP*`{`bECzpUA{V z+bU9C^>3hR|N8w(FzBU-jsIF*K_V57%sspB|3_V+$g$<KL}N6Q!q;K*5y0UnR?b}b zS5Nw6aQ77|c|Qie`UCA*%bRPhc06&a1sV7LLg<J5I{8|h{uzJvv|*ck(w;_EIydra zzK!9Px+wi`JE3zv+BxJM$t!7XHL%K~fdvrK!T<Q!h6Pj=L|^-bz_}_aD#I#I_*<t3 zOoEVRuao5;{eqE!0Dr2YGV|a6?W}-H|Gkp`elD0vlTD29Q8v;j)^pX%ZgR(|v(U{q zldg%Xxt7%K%A5GGNzrt*Ztqo0JZGbd%IT}bG#+h+%IS_u(e*S<<u-isi4}J^U`(l1 z+RfH>GK*uuG?@$UMr4BcI=Dv|nSk)kOuAN`9e~M@@`-{AKE{m|`UG}Urn%_pq=g{^ zE#*<iDfQ!!lr8H_E|psUJndSksN9BV4p%8QCVYC{w<1?nH~CU*4E!1geO_<cd<2rL zTK;I`_uqCF=XrlC$fxykN=drJ6K~D=mCtbc%xG>VRsZ@ddYG5%oX7BGlSCh%`Q9h5 zuatgl&6%O1A^~2fii#auIZ=E%8|LWLHr4({p$L$88fb(4No@sl>m$JvY?c;0@9ZHN zwc_m@xNVmsDoIN-*9!Ef;)?yeg5yO@B#gSQ*^rI9xgf*NZspR9exr|QdGLmQ;C85} zY)<~@WPNo0rEYdou>DLX$U@#7;<upG5kf?xStoO>wBaTP9+1sVH9={IQ%PIMU)4Wf zXEc#8?K;j>Q5my&xIjfEr9tUtezLW)B5rnkSC%LDB3OLYS*ZVlCG!zO{VQM5Dcs6X z00(2b6h`}aXtt#Y_s&3z!`)7McI}$%0$sCJ>>vNx-b}+eUqvR(Lm&e|Lh^VEYRvFS zu#V2!=vaxaskk?7`TZ)yug_dHXQm3-S)jL<&&9plk?>kfjQfY%kM3w~y=F;hTJnS+ z%s%6~=A`=E<&$uChp>z{G7&5OS!Ryp7=$-On|uC}d%U{oc-h$(QR*hDZ8^N&y9vSB zep<^fq)6@Q`S3Rr$*2RY-g?yJ$Xbj=n2otTna5z_3HDt`FhKnl{u$g29Ynj=X-Hci zOyusvgl?F2lT}o{w+41i<#@rDaS*L}r<qyldaBtsK+d%XH@=QwQPLrS@P~z88zwxu z$srQYF2_|(d<RdURq;Z@9>%8gmMUZhf2*=qs%r|Gq<ceC!&+!7T2kQ8Em;PO4Iqh6 z-7S;CR=vXL3$#FrEPJhG{YOMIkbD`?Tq<YoP6tuACBx|cR|`HF&VV<{aHx|2I4$%w z0r5p`tnu71<0sgeudpp;cUm5Lx=K4L$PP<~vrb8$GuL={zYM)T>m=S%Y!)cp&wg~( zFLso)iR%+ySwy_g3_oIp!*L%DBa_A|FDO{Qfp793QucW;v#!`K)!^;YVFsWgaaG^5 z_Hks6@6Y#x%`Qc+nR|86aN?$<`Gk+Slw{_&Id!?rqx&S`;D*%eVMM$9w^o-hD-rOB zgb<HTi@wTN$le3dnx#{jTp}^}J3M8gkC<0s*x)lNSsoBb2utrHrC`?ZJIA@18~=Mn zN>5~`k3L(e3<~vbN1iwtXFGWBIF;F$E=olka8r>voR)TG4(*<&gXhCo8ZVqo9Pe+U zGJ?To2-23HFExsH-r})|{zH(X`U&#!%7uirw;H9kquvzsWff1<^O0@7F;_meC;Yd* zI1E&%(h>UBeEn=9v0~$G{aKcmFk8FIJ+oLVUZ=pny~jQ7w!N5V(016XNfn#Vv=V(_ zirx>de8sx}E{l5iXz#D#XBZPkuMgv{cV^+N7^E$Mk~9q5VQi(6eEm;8dUcM{Kt2iw zoB|#hGu@HC5BPn|@>>f|1wJ1YtGE5i-`p;N{<4WsL*tm_Gi$5kJhp81F<%wK*l<W+ zx>3-;tD>9efv?7Z9$;HJ-#g71N=~LIF6h!fmB4wxGUx8QuP7t`nz<CHE!wh{DigKI zu$LRyTW!u!!m_I(Z<Oos^HAYLqjSv8+Uja_)6hKSYb$?&QbxzNzK?9c9S(L>zi3=i z9Y~x^@@&+jH?)vU*8k}ygQ_!%YzcFxpGrPv0Os;IU8jCk>zfMnTfkZ9E6A){@hOjF zD*;70*IZCd!6k3?TS#a$I0qFmEA!2QN6}Poa`OqGLG9kUHt=47TmNkQ!^%@&+Kh!+ zqj$!FKmAy6-S`T`pkii6F7B|BV#-_-9I}hn@L(wiaqO+t+_O-Ki>D2QScLI45a=!v zN52$86+%Xy;YWu)68BzZZztJz1*<lg{n#~T`P|22Bc25Gxi~yJq1=3(gRqmc`>%A) zprYyZYVQ3qk8pVw6zundMTqYbE+2c_fwIL)JNs&vz2~5X!e4-t-@HHxhD~)HbIK-U z61RN-ubt}j+4zhK+8#HvAN`77pFmi{(kW(#WiV24ru?n0QC9Uv4+H;n*MB#KRED+E z6auV}nhSlm_1iXAYrV;~YQOy3hWzLHsZ^a(K;sVyG}F94*qcQ5Va9}KP=d3i7k%_0 zNPq^3a|_wQ3+=U<V-Aptr(Ti!c>Z+0_Ah}1#yU~5s8rfNOlbAio^HPf7Oh3&iGhmB z(M_LxEoBJEaZ*GZKbp@4``^C4bGfMXX^x{uzGnw>V6akvgD+TjHz+=xcikSj1#iX+ zrBrmyOCk38j861(8T&?=I4tz7n}@XzB>WD^_{Q%J2Jn<s9v)F9dp>#Ljd@B)4=((B zaI;Y7pafx)dC1Xwa5E+^T|f(RHgH=y{J=gM32$MR!-rn)df&oZ0A2H_Qk-uYyzC*z zYA@zlMe}G_aO^1b3E#m(-wk(-p@|&!YE}{q{KXe4g52pZ1T;JF1rAUTr`Y242^E7j zl!&<jQ}=&V#j5=ReSH661SPXz(2+Na;2bxlO)zVJ#Z`E^lKq)#$0M)YKsBrcB4?Nz zS%o|1)dY8})jMj<H8IB6OTWe?3p&43xI1aH{`kW=la`>-^mB5g|I~O22uMBBvh-6( zjdKr|0nz+|i|P*y7eBXQb1Fy>-7oHVk*LX=k7Rur`u>rJR3kapT;#NDuMPx4U&;pq z+ddCi|9c-5*{8nrA<^(xUj$J9{bZ2fGTzlV5{sDs1ykIAT05m}Nx#kc@OOK%WEfZh z`$OTA|6m`K>4Q(2%%j8%-3)Zv=Sg1`l{07%f2lk^Je>ms9y{_{L5dO~s(_y4ZMb|{ zY4^KOd%p}k6dv;*o@)tb;_tsfQ3nQ|?_@wQtIY2I!-FjX9h46qu2(SL3^72IfYZTp zKM|Pyr_g*#8D|;i3*LU$$rFI!p?1xU>m=RS*EmQ<M|iWPXgiV-Y8x));bHhi0+b*& z1DJp^0-%OTR}8nTVz<=>>9ON{UvABfWW~#6L-1CUWO86edx@@1m#>ex6EUndaIJzk zCI_05`Zn^HszzSx(biB8T|>nbO<wpf6_%-kc9iYS`liWo>iy6D<_aGRmnhUUdRZ8I zi}8kok>o3Thg=tPJ9vGvvf|@zGkoY)4Pj|FxzssCHSO?UGTA;&2OiQV66Wn{ZU_G9 z$yAr)UP8~oXj-|P^lS4B)O4!%kM5u%{`_<Y5w0KK8-dJSfZK!ozRIV*XLpA|wEUoA zrX<DcC69Pz`S9i40tW5|JsV8%nb4TAtP3>AOSQxKg!J83bH}E0@&9>Qlo?gfwyFpf zdFATr>cjJ+Sc?INB_>P%Sy7y6?-2-zv3vvmmDIQ4ICB4eJ?}ZhH<1VXa9~(nh2iMV z9&A`6nS@Q^F>Ed5F~N}w>!F0IXH-iTedTp`(xK_h@_$OaBI~UnS={HeEIH6XAv7M2 zIj-uD!rq&?9POX!sv0U@8&To7tg8UkWsSvz)jAUo(n+!a@z%x5&a)&JVfxptYiath zCM5g-6lu>@EJhffFM~EA<2U~z-?9tU$39Eru<@mi<PlctpI8InXtX^yPF09raq77( zs)gdb;BjaPm~Xg=y2O)cP_YJHaB7vM2I1;LaZ@+LmUY~X_Vfh}LEp-rsI=aFD6O`@ z9^Dl2I@Q{DXBU~x6dL3HLV^^^t0$eTP+lEmh-Km8gUHt@ly6ykwaRM<ymh5T8B|=B z2_QNV_ZIk2L`>W(S=($t7Ff!(J(&u>qqo0(G-jcA1oVLG6d9AU&N>(8Sp=Vq)_i~f zT&?+}W9Ya?l6I36q|My(l|HN<8r!>y$7h&C%PYBoL4OfeDiVFW8@m;{a;OrMdG-Ak zRz>HEfPh#s!uaGd&4-)%hRQTNAy{a^shbusI(zr?)dWM$WgHXQT(jFn$FTbQ+s7Ck ztvhMD`MX7No;OA(F4J|#1!sl7P9W9ALhnNvVd$65CG-$@Ih_6I&2k6KclA??|5z@7 zCX5$f6aF6maE%j`$CF14C#%>!@qA5zCb2D4W7v;&(LHeVJwJJE9;($a-f)FJc8&0> zO?6I#71Mh#mg>7v#6DZkSeJC(!cuVEf_45EF@dp%v`Za19`1IZUJu7CIHLoGVn7?r z76vZ}3dBIyCy?HV3`W=Vh;^U-p$_;m8^Tq>u%AkQK8|-#?`#l!6A6i>uYVV|>o##H z(s@gvRn^R{jc1{nJF+?0MuwaHLoJM1JS(&-fo<`MUeLP{-zwB?zAFhkaf(km|15n4 zXh&$ru}ugNJaz}a&CSaZ%;gdjf)^l|J3Wc7Ed}tQl^%b3hZU8^ngPBqb;IRc&*`Hy zb$*y?Q>4w{+{QK|UsqvhE=O<C30s<-9=py-Uz32cNk(<d&P4UqdLB)qKbMT9g@5mL zA(I{Pihfgsk%UQ&tmnq?$zt)*)0mufi<@PAVj7OI4rgk;0>3ENij3%?C5N3cpsC|a z?!Eha1wU0GP+W52G4)3bQak5#M@1-uS(~x@ge6~_;lp2h)>PlQaG0Wc&g{(aS`mBZ zE5<#~Y<hO+t-gV1bJIqRK|}o2$jWGgJE?#aD|?8fnlCoH%6mxxdbqeOXgxNwKQD`E zbmtIK3-Uz!FQO_1mo6w*h^flCpHVQtMw}v;8Tq7;IIB#*Wr145s7@*zd1<E_rHcQq z@yVS9>;`euJ)aA+DbO&O!7s1jqrDMph!g&1_9m(Ya8l}!p4B&RRqw)^eY@~LC!hnK zn{aEH=o@j9<rU6#;-kxDGj@rYwe;KYRe$IG!lY9Q3(f?=A@#5yN3zf??)n<c5A?LU zSw}~q&w^3F$N?${d0SWUFgUfAG<x50w_O41YoLeR4f17KT%@HY0Y1j=xSqNwnw3KD zl@u&NwK04QqO}-Pi1_la^XI>JT>GatPoa?&<tSr0O{BENuEI<le3?O&)m~&2XCi-o zgJ;@CpA7po#m;3{JVF>xXl{Ix>Q#dMs*7_p_ibWqjyFi9lpblij_b8U-sj)|T|MD@ z6GKQ9jx_GPR&t-2G&y$$+vMT`{&-x7_i)9RS-?N?Y4r25;-{ixw|0Smfa&S?HUXs3 z&ifExqRh(gP}T46VX7mMycA)+8iM{*Fwb22QZXpu1w6LEvk6rl=26G*%^$xNkhS23 zx0gRf!q{1rggNNF)-aotNWTzQ&G9~PVhm>;W2Q%nhyAfK`fW=pt|*<cUexyw=}qSY zQ3Q-PVn)#d`GHmdJSR5%;z;HQl9w0f4|_j2PDQz$zR1(32gVxP3r90+qQ#WiL@50` zK$?FtMR-oC&PvNCxi&3DF7#s(pae@k_FXM<7nhWUUz^Yp0PGnl9&Lbp@`<_h4;%yL z-j6|Yth1(}SNVG7x*T>LRmYhyi_@&VOcQ)EX4aTQ-&{>#6`Te1-VZun($l!v>pGX? z>uf-V;-*^Y+6cEazJ&Z!pw*mQ`=3W7$SlL?SVpZ|#^}nnx(X(($wIdZ=K>FZpFtHQ z$?X}yvVF=J|EB|?P(COj&#@Tz@saHcO7c|#5PUeU@l>y+@!xGGY}w2YYn$LiXFT_g z5LWf`DWh1gn_D}RagQH?sc^zc${aAJ?3Z8<Y)D$c_r{{`nLVqcV@;T$x7c6+X&tZB zSIiF%ZI-Q@O*91+t^dliDvH@JlsP-aP7D#u4+#idT{^A}LCxn7%*{+MkviAEbFNIW zfetKvbD@^pKO&001uPAdv=*tK&wX3bT$PjnqDrF5TQ~++gNUyhxy?2`Pvm1%o?D7C z6y}rtK|uaPqcB|&Cs&jx)Y}kS;FSDff0w=Iyux>z9SfIWoXC2ck9^&KcBg89+G^s& z53FBYFKk|$fpZbItuy4(f&<Dnb}rZKK<MWaeJT!ip=Ct_#-y`Z3v_J3w`cdN^B=+d z=~+>H;AoXDmp&SbrjAx+?6gjmytSOW249ln;|cSA<NcA??vLZ8k8AsauJymd2!$t< z5(ujUIhQX8kpCk|swnKS;-t>M+vk#ifAk~b%Om9J;IO7pfjc<d_1#~`lb=F^V-*-> zOz}C}?0+r)V;x(+aN-|?d>?IqPrKFM24<f$Ks61oP>O#YoqjB3r?^S~c`P;>z)~c- z{%+I1sHO%O2L7WT5$|s$D=Rl4f!Tle5(O3ipf6+xsC!=?be4`OOi@~fqFfXhteevO zr}{`481o(`B_$2Niq@Qmr~$PAUme|AxlDi;rXG-vfru`+OA4wFi*Ez8)<mZ_=B*D7 zUUVFf%LWx3Zzgsqic(7ub;ZK`w8n%e5tFK*12rr!9x#kmkbr_{Pk0_3QYV|Z+I&f3 znA$45508L@X^n1!w25$TQ!&ZT3nuO)-Hz1w*nakh3gQ_}8DWk$9Cyx14=mfR*4<;I zciZ{mdbK6S`Uz*%mM_=Foj>n<2_7Mo+~@f^FD`s%GI4E6ORAqjCI=5166I4;Sii>! z>;!W5{d7)JbM=*}Lu+tO*4&A7gXowJ9B<H>VjNs<aLMQnTxT1jz3Q(ryR=ZAG7jk4 zkJR1t%jLyn)f0Aks8wrj5f>cUl{52onEU4Nlyl6jEp1i}!sUJe@*CZOAo$>Ymyj1@ z)rR3DQ^qGZK2Hu?B{QGdT^$U#64EI+Ui!T)_*?5jN$=B07dtHfI0dFCs4G$opYjv2 zQ0b`RuuU&-d9d)MC-FO{_xDIehv<z+5TL5_0{k+;C?F@gqet4RPvm$JJXYlbJm521 z%RkHMJf+jij<6@ocEIUfxT|XA?N$lR`8j`f9A5x<DyS8PirXD)sT!e{yR2h?Te+5^ z<XuaxoMnP;LS58N<gitW7QR{5@Pb6IBKndA&g~Oi6Gc}eU|d`EejqeZo(u^r<_)^r zHf}Yl@pR}RJXqvTm%O4qecf3fg$@MM%=V1AI8b^8F`ntE@}s*bRVnjra8O>wtqjwj z|7@QWslstZO9(J(<HabkBIX|gOW3!eY9Pr*wN`Cg**xl)z^^d-uBTOhY32ByU+#@R zXWl$KQ5c<mPb`+&FGr-vDlS<C>~>PU=^j73fL0&HV29^Mv*X}y7IQTD^(On{kR{JY zTMcNHK7lsSP}z<V?Hd?-dWruuMb`l-<$Srjty%H1Aw$u1bjqVl3X<+U*=PQ<qs@@+ z-?)=0Q0aTcu~HMiFJD+A>AJb<M9S{^uqwqYwEj{*FZI4}_EStY?0KEzvza@yv389o zW2Er*p<M-m&X*%oa{_;mu~93e`!FPXYSp+P%<CTFD{I^Pg;rppuVm$+QYXwYN&x?K zlf=pp4m!)b!z|W|cWfez5BYASo1yTQPvz;o1u1{EyGk&lKJouC_nu)*WnBX(V{c;_ zy9kKmfQrC?QUnP$L`MNpiX;S72uKM?2|ZvhgMi8iQX?XrB(wxbC>A72XaY$f2}D5z zatMf!L=pq{oT&3!-}k%EbAR0Ygmcc`d#$xsFCw|&>D&<%d<yI&WNZm`5(3L63bpRp zsDLxP!nP$R&a9l*#=bzgJGyruWEXa1Ys|xAEB*<Z?O)u4e&mzV`Nki9sR8W$;*Fc? zR$tnD9|!LzKXqB-zbM_U>mDtiwyi%vrR5N3Y@?4%QW=+wj(fRt`ur0QkM5rad_K9! zN`Uw8JJTPOUq2}}LkF+kYS=yzk(ihH)*jt0=6F(G58bET58Zh)dMQEkB%_M(vQb!h zUD<aydXRTHySND~6G~{WX^nglbVlVsEy`HtSQ_<5g7%Z9nhe5zQ#L`1?<{EOvuGbL zgXcKdl{s?yVh8pEn{yJm5@EnL)>FYk^{F+FyAMUe;o|?|M3HBZ4YTD&a`j)Yj$cCg zL~^a!!WUF_`aBvp0_<KzL_2_L#Yl0zZb})tMGf_kvvMO?wI<yzO4?k;2>ORNt%zn2 zBMIHjB~~)X!Sf<6#ooVV&+uw-m3Nyk)#tZQy;QOgwGb7SdT{6i$Y~|xj+OZE{}D`u zM+zj6V}ba0Tuk@=Q+E(fza(5ZF#Fz!%dI~oXU8W_fYW{bk$d3VGKE{;dbJDv8uU){ zUZbOhU@L&Y>&A&I&%Kc?i`x?E6F!XY&}Y*?TiD{hiUIL;`bC&ZOIqcW{)@4d^h%jh z@5nm>cCAd_*ziptntI{Qnwk5+i4^|_608l9K{v(T>}1w7+4^Lb{)kpx#o=O&{kAIT zS4ql;3u{xA=@qnm!CCqdRUS&CxJm0wN6qbB$iQ-sF8f`vgt&jS^6+OW2fYqHTqmmt z{X@Kd|G9iwZ|qeqWJ})ixZ~1Nw<H2qySO_P>=uwpM%(8WU_6aEQ$?q?{S>#LdTKh^ z_@A^?y=b;j?m3FO>J#z7XKKo^J1utz9Xx(z-czpm;MVnws`YI?3x4_itUysq#4rGR zx~%S~uW81bP3x(EIs8PL5?xfiy>d9`FehLsZ6DA0ih)UvLt%~^?_gPQa8rG8^2M{C z<Ve_JSAO5ovXP(1s3BK>FxXh1RXbh`rfTG7kN`+M!j8FIq{4dbRutx?%_zK^eNT7f zCU=D=REoYn*x1vFchUg%+X+=qr`kwDb-eAVdl#(5YfdYLQb`s*l!|+HSX$q$66~zl zkytCC^%ZjHr2n*VesF*(nw>t=Bt0b6^EixI5))hC-;+I1_MksA%7Ax$;18AM#no*4 zP?Z93j_Uey!5A04&eY|_f0w_Ra*GZ?Z|KD8TxtXx8=zgfmjw>hE+D54+CPHNy1Afx z2eAs+F4@8wxKOq&!Imc}m)Lf$1N`Z(-~dAMko$GmL`C=1^+`B!@9T;b2hP2rVvFP) z*nQt7I`(PbQgqa=#j?UEbLyGnS_Ln6WV5bN2`V|j&eni@+6wHDPJN9=P9i->n3xyC z_B1_EYq|JsU);RY(}#E2`%Iq!nM)EgE2y7L3qZnxa;ye>%zn=CA-`grXCkjO9IUZ^ zXK4+VSX1p+{<9^wt=3>m`SD*|FWtE>^i=FPV5*^@!OFn}sKk>0n0td=&&ECo0*8UA z!fTZSLI>Or#i=J)pFMFUc)^D<B^@hS0WRbS%5;zPKGzhS=6!VMn>+MFlMxkE_fm3X zN%FvMK<i1MNBCk-+;QuaL1MI|k?!f7(2_$YqSIc~H)&L&!93-7-Bi<Gf6gVKWJQyF z4SPaoyih;&n=0vVY>$trjV5yQ;c+@RoaKK+RQ?^~Ay<LzKIX{&AKsHkV&p;S(tIe{ z?}uwS7D)%9CR`NeNLp#QB9~tkim?Ai7=>3OhsMG30qYz**n9YA?=L)A;r#xgyWqr3 z1#jHf8AI*`L1Pd{`Zh@C_h`krS76-eWYp(mvyUzt3|T%P_<_j}Y^sWr3m%>YKUHM< zb(V_}f)pL+qV}Cd6Spv1VG)=HtRQ{zb=Fa-J!cBaBKvY64HVCb80;(HB`GX=2f+hc zi1y7w;UvKi7E(Bgs2LsYfmRA{{G3KFZ7Me<{TuRdbD+^^qB@h6-z};@z6@qsiBjZX z`!asfR6>^X@^2ug;JpwGI1d~A8*dJSk_|vhXI-g04%~D6>v>q9Ar0;if^_ZYBz+K_ z;f_%B_O;3E|GuA(+4VG1(~nR6-B+EUtb<uF{r}5X2T1t;`BhMId_lqlG<N;=Z|{nN z0%tFT;--I544Zg;8DivH_%B~ROs}JTQ`G~);~^Q$Q+gN~@Kvn`-<zfXT{bQF@HsS? za(7Pl=Ie~RE&@8@|FRj#MZ4LP|36Rq**Z6~koh%!cU`_ix;)7sHxJ5m_{QA+@qSli zQO>@)V3HJf{=Yx}Wy=J4n(}GShX1*D2uom#ga16A9$pk(s(#fKtlUWY9IpBv=%1p) z$&_pfbQv2h7C)~e&D8yz(e~{@z@T+gA=LeKzN~CskdDF5P0Lw}pM5Ni0nzl;J(AO{ z-V-B3!y<KI`-aY^+}AgcI2vyV_?#!E(76hv(N5n_j1F=cEdrp)<PRd(LC%8px37E6 zb^Yv0{hG$UEU=g72s~vxe}3I04+nNjc%$~;PW@Gi&MF7!vedy={I9nl_mO?n+a!pl z(F`cluy~1CQFP^V)uf7`-EZXmjX_VMLXjrKvUp#!tox2i>(_V2OPBtyQ+-a!+}yx` zG9I2|=lyS#d^9dr^vhG(xmW);oIm-ttkLoTt`|n5Pp%G#->2&*IM?{uBl#_}`Y0C6 zNOEWFBk|V<H^vl6y|hbf-<nQykCRQH+gb{KQ$dtS=m+HrMbyW32dVSllG=~xVnJ0E z&&7Mbf}t_GD136n^kmeKX+&=jM;ZLqL$Lh>$XO1v{JDDRbd@QwxAb#m1(fp*k5E!l z>WYs5=W~5QFeK0eY%a#8$g-x}u*4Dp==4@d1xI@+6x9Z5(vW>GNGdEC1nj8^X*!f0 z!8U`6D}MBu)yh-zrH5-BB@<o(UGOss&1w+QT2Zd_5d_aJUybBy#mjwGnh)fxe}eS& zy~z1BXi2){o-E6BkZ2;bhD8j3nMw)@&^J^lc9~xK=wSYpi!HoUi7oO>xmCw<s=Yw} z-4`ecVxP3v>W(UqJyn5T{mb;dy$@BjQ$~v#jq4;Uoa=7aQwi35rV3S9z>lWAfeN9% zxX5fU&&_e_ZLJp%dRt*PD4Nbqwvv>Cf6e_BN{#Edz;C#tA#!yFXVrbNs=i%O`1?9y zrvU^!g{6>~fd%4e$eEs{-&9&!gF}O#JlPlin0M*hFK9?E<BWr$FO<m{c#fAb*m<=J zDscNW;2IV@)UXcR1VL^bzco<(iciF>9iCGY046~zoP$!ArTCU$zT3ZST9^m9e%nS% ze8I}JLvqd~dbHvZVf`-Qqc@MAn7&xwEk-x>FPRRv7zZiTcMWusR3(TG%p(P;rhe-5 zLkT;E@M;hqORYZ+_FMT_JCqC4d;J9vMUQNt^fCnnSDrX{6oUNaB@s;WY=y>!p9`L> zu?3?@P{aB}gTwM%sZSh>4)#y^Shi`yGcqzNQJ>QPUk`TN<Oi@omGKiN183brAowUT z{Xb{ft<ZZQiTLSL-(^6$Q=raC3wIy*eB&O%KuQ2V`;lcieknkb2y7~7WPjrConX8S zI=);<N`RmwX^meER=nL86?=}b|M-ltlPXZ=vBF2TenLxLIkf#~qP8<xdj_aUej-WH zFLGdhl<55%A)+<<9b!e&y&#eOWJ%B@;oks@Uaw<S=lukDB&d+j*%a|H@x+=XFL-*o z`zN3D`aI4KQs)1r*ipQoai*gYd(MuZ!~P@ZhG6XHKYCjwBmkhgPDlV?iJ6(1&ET-> zC7tGS3HUvPKI#TKz{{8SgtJwx=89}TlIJ&v{}?*h?AZvGLik|!JZnFXz4MdBp;Fkt z*HN2sroPTg8$2Gu=#c3728sV(jTof5y1Hm~M(Uj5Qn?)c2}yRWzznrzDLO4}SUvwF zt{)Q6-=a}IQWwnO%?2;|6ToTdyM?ohi2euF2uejuK&}8HT&@joV}0uhwlPOm`u9^- zU;423m*IjR>_U#Rj}7i?$B<T#YqY5tOi?~q6x}5ktlymu)S7Jq{QdX-w+A{XKf!r4 zRBZY;eDzQ76{y`<0~>!#&V+AE(EiTf{1ci6I~aXrZ;*hxzZEPz{=`<lrzqbD)^f<Q z3()+@w>HYB^~%-Pj~m-|LHDEz_QQ6o?z2^%$zBkJD&&kIqxzN`%%Vn#Rd8PEVG;-F z)H;PfL7DhTa9e<~4`NMnR(?)B88OYK`GT1-A5<bKp|7vI4@<oi9!4yc_jR!XGaWI@ zhQSH3DfZCE6`G+kQ1CkcO9$Z1Zj1>ZUjY5{p#x-b{fEVMbU@01pRbdADMJ7f8<n8S zH8mtQss7gz%l#WVOltUqeESL;CJD7;^PyF8K`4KYGRXl9t)XykQd(0Rt^)FnZ7U!* zdb}7L8Ut$d1V}Z2et$+mJl#=VECr!ozPQ30uy=_9$ge(QUH<694`34MLy(DnLN>$! z!Q@s`Xmtq3El5hqSNr_-fqx^9oAd8~yAsG5`^}q)5FLYRz}LI@EL-v*-3a=foRS0Q zb71oC<nK2A|II6)Ye5Ao1qW8Wnu#NUs?hkJ&+-UD)>i-oWq>JYxcytZZe|NA#`4X6 z0vjk*{>>J!F_V`Wfd6ikqXxWJW?<wTqz?HT=O)4A+jAco{C(y(3;j1tv0$^QV8M>5 z{3{A`Li#wc(-*sIWzj07;O_eZSk<&5Py^8vM|k{Ol4iZ~>jlC`DB?9=Y5EY!eSykO zli=>~MbHH?07nu)3W(#^coB0kqdH&R2uQSjI_q#cbp)Co3Jn{FIOEr6?uNFw`)5Fw zZ|!GD4{AY*m1q8|RU8LlDqr;@_(v*%9+ytA>@j9E?DYRW`=|8jZ|U^kHRMgSz=TOX z)(=4gvZZhC(x*3nfaXs}1~Vtj@IQp(_qXjM1|Y)#V*OCB9mp{F;bxzJl11JcoO<V^ z_{BgRl$G`d{!uAWP#A|e5OshM4%*c}xiSC0Mkd6~zC-3cx&gM`Ko6YU+y3hW>@kU# zjqt4|g-+6)YkHJr_NLUJeXnVXjtB+0>QVGBy?=}Iz%JHFdsPC5Q2ZFlDz6|b$Yu7) ze*uDvc+>VD>K}d#4gf~YjDP#apteiv>X3|2oXW>qz6QtVQjytB8ct&iI4uQE!u-|j zvdaNkC0Kk#bZIogXMs<5FPrQ~kM=SqV}A|ekPo*br8SPc+Z+$miXbf6<pwO_;K1)O z(;pnYB5L2=Ar50L7x-cU1ZyBCBE2<iLXs(@^h;XF&`@FlMn(;Kco$-h@@>{(K4jS@ z_4~**wdC-p3onEhcj}Ax&I2nM53Od<qr1BdBAys@_7^F!r$<7qZ}zgwpJyBh0jC4Y z_NFACw10KDYgCQT6UJAfa$Yhu324RgstU3TJp<k<oyUqqu*qJ9e|88pE7L?5y;$zX z^@A=Rp3T4B$J!{?@wu%*ks3o>y@@3^$~4hY9lh+CF5q=JC#U$Otg%G9k4~2rw$|Xx zK&Nfwrs}0&`5nr0q3d5RT%F6OR-CCAcwqG~pUUu*<o@d0@Mp;K?pFhnXWWwGXMt5L zaty-BkyA{Hv9FFhD=5zr7<P-yb-X~Zff1x3N9EvWOqhY>_utA**_*F*Pb6mq9OS5^ zlnsr0{36-3z@&zNspvna1IaWwcen<;hlW?lVU?d7vgfS!D$X0Hd0=V4yTM*6^<`Sj z%I15ugn?ZBljw!^0Y{H14vXfWct<M$v1j=Rk8tGZ`-J+TX=EbUJ(U|XfS6Vquezn; z`%F-#;z%uBKg?f$UngZW79SePZdOVO#I{`|=lJF->SMX3Z&-6)_=KK30?A@ILG~I= z{UfBur8@tc9AIPi75Zr1r~$1Cai#H!J}+rS8~bIUreo8iv*;p3_^#Zj@~XZB+yw+k zwP^0UUUn=Rcd>g*C2gA=Pr+b11KF>7=)()L%Kle*38M?FG44e`xnNDK>71M706SJ? zj=+!XhgJ9wy6*AfT^rc){)ln`v~s2PypgA;IoyS+VD*r4@K}{VI!_w$L93o2(kVv< zKfO#gjzsS6y>N@XH2Y1+vta2^+#L1{#qtj;xRj?PbYH@1R**Ls6Q@Ja0lOb7s>Eee zMHzw<^z&%k_;F5+Edm?iU)EmBX<msA7W_7R8cc-$gsIli9bdGU_oYa?Ak(7K4(!6b zIvO3IeF@YM9M~h--clG7rcxX2hXISg)?P70XGDj?I2Vw?w6jfPH!miU?;Yg6`-+qV z`yf(Ed~D+OT#hwZ#_$^Ka6C9joU=0rtx|Tmh@a!l3c5-(j$FBcO6LDwzEW&B8H;?D z(le2r_P)hgy2QIkn$MY{piTA4eHBg)L9%cVY?Jau<8iq;l1u?xdRL$DP6=0?rJz9X ztufXa=?z>x<f0su3D#P3U?V%qW}hF4<&aN408V)HO`W}`dGa?F?Wf?gvIk2W=BlCx z6oX@z3XhY4aqDSG<{hqG$5k(!N=`bFYzn?VH{to^RL;u_-M+GBaQ;<ajBl|Z=Z)xB zg>B#*S(7Ujv8G_({_z`_1&~Ja4aq&dT<*8pjbj!jBixp5sYFSxMV2WW)M{Kiv#`pa zO0N06%=+#<VcnGVwN_E_6N;jRbSn`-=l_m3xJ<y7&DMm+d1<2`9Yox0Tctqi-pLZ( z%I%HKs8NlUXyfK~=ammF?zeascF~Jduc@t53oHgKX!|)zF@6Is96x23<5F|lUp_fF zy=t#%lF78rNZGIKnt1~aeP`NB&}AlUb#{&JM7xUanXb;Bl9pp5zU}V`er#A^suyS6 z<u?;8!IPSSIl`f4y%#ynGyBImqKLpPD$X49cLT;}_i<nvqabseMx`{GIQelhXoc7e znN50W_q$_S(WvN?<6yB1F9~WUv<=cw?(wkDZFsX5SRpsn{{|-rh))-zM=mb~i_XnC zG)?oP2CrvSRX{Le@4Y~{nX9SrOu&{f-z_lXrWM1phxZA}wEd0EU)eiFULzMBeRK<i z&H2I$OIS6Ui`x1y?bO(-^IZ2`I@e!z%&A7OM)OIIsv}M=DGqmKYp&t!xZ=NbbH9s^ zaWm$I2ba=+7#x$@TF@c-;1!18>CqE_%^oS^ez!f+&;!5wVJSh_*pv+HnHyvi(^zE$ zOU3*k57y_{{s{=<zm1oY1NL{hb0%|vHGWYWHjWv3RrEh4J=I+X)pr?EKa%mXq>`Xp zq4h?WKdKvFQSht1hb}KdDF&Z1Er0GWt+}rvvwZy~c(wximAMa#S)Sm#u&?aMHsZaf zmupkJ7o7Dh!<Tbwjv?N24LaMal3mm)j_N;tz02e^jPkgUOJ2gl$$8f?vd6+~YW-2L z%%eLEEj0`F%J((UK29YYD<i{Af>SQkkWrj^Z^W~Kz?gEbFYA3XnzLwVUtCVmv^)A# zZF*)6w!ZS7U~=#ntj1zosr*K4%3U7W0zIJZfyiFJJmvdCiov`3(?i}fE^s_?^9jh@ zvM4kDV%6BKRTv7sZ-Fi$Kh!Aq0;n3hU+BWgg4mvQ=u>bNu;!f`G?x&51l4+*ba`_! zYn2hD@6qLl%hU#jRK+hu5r6q`t^&T>LXqfGXVzOKDF%cs#&FG22(q@T3y0Y0(}dz; z4+jIctFsc&{ycPF_#*TpH<r><5;t<)J4aeE14Q3-ntgy6-<NRfE>D!)rmy^<#g75r zAA)AW^^;I8V^=?@-R-HZefAG2x^X*m%MZBs6|!-^|8CZ**WipOwK3_D6!Os>QC5X) zN)U4OIA`xoE&)HP1wTM1&tA?}N1fpWiJe$A1sRyvu&1ECb1MGvE3SUo<;^;^BAx!A ze$k!w!~O5tf<B-ZB<lNNWB(u)prgpM$F$}(OM{Ph=ICS#|KcbOs>TAX<Z7h8X2DRu z(E~tdqAT(_cF9^Ei5*)_R&Z{hWe${Rv}(1eqFs>mfdEoHrFkdYc`Vg4RE8*XVkKsq zD_%FPX{|*{EnHeOf7huMgtEXk<bSb!eb!n83zQ%|<pk(&22CpWM2NM$mw7-F0e^7* zIja*kZ##?T?7jAG@nbmpe97KhTwJ8OKborbru_1pN+g1}N1C(f#ESca1LS*8XQ%Wk z`*I>jGBww0mpicc4sr<{tM1oDtX|qrdp)B|_gUlk-Y)Z_&dZWLO!)54itQT!rQ_hF zA)VuMx-&GdvBuzJV1XH?@ebOIULMo8{?BrgX>dgJG*H_wVJ9@XkkPnn(#)BHM6w`} z8`=II_UmeIavH0wX|i&;pq#AZn0}b8Ov^sY$iw<PZpBbho8FWwQGHA=*KkIDM9vQI zkMk~kYh-!f%gLz~TPqfF7i>pL$;Q===Q^@9%WhX3E_}ed?#LlTPogvSK)1K-a#@>5 z=NWpB2Pcf%C&)w_`)_{p_;(8pjw@RAuSQ>LG`Z?xtJ3y<m*(-kjksil_ykwN9x-a7 zo#%+P6sD%j#agWiu9!5p`}a?4{6%$xYodllI+<-ELvp6clg<KUY<G!U;JOz+N~sQq znd_3$tr5}r>y~cLH`}8;``E#mu+3-E|6a2D>5SK>W;X2mC8I<aNJ<huYiI~_V`^w@ z_iCB!-c{R+GoCiKObzHw4OixsGs{P+ml+2QcNYJ?F<{y!m9uUD=~9ky0`3uPEiEZ; z5FF3YZLD>*$c$4OyY67R2tc?~sXn>cchxbDU4>HAq5FU#h2K0J?&IynLk=8t;~XUV z#vldS%;jlhK~k4US0g%Q%OlX&ywQi)RV7}^=V|-5Uvn5a2GZO)3~kA!;Zw!lrE^s` zZrn(y#UIUD$u7H4Ww$gn@6Sr1brxR6=k0fxBs~9McjjoK7eiB~f7(ssVUnG|w4j!V zKf3vf7G5`gMuy$B-{`KsR`o}Vot&@6`yqEEI6Ua8xvI-?2G-@bn60XF@2l2prbeFH z4V0i=x3P?-<0DmflgaqF42;rK=f%$&$+s|-^243nuAxpH`J<#IbU5s|1M3cfdPt@w zO;_abpA5gx?9y)o5Hv2vD)qme4m_^H?j;{~KT}>s*AHI`o~>8Hk<4p#NL}IB$#jim zDPEBnSd%SSu904*m`c0u_`T6~vi5wLyU@x7*d<9V>pAOPjr2yS{<SS0TUW~4(YUu! z(iaH`_2mc4n%3;0d50$ntlVllmp*B;TZ&5~*7Q~Ba}Lz&j$b;1Ek~20+GLwJ2blfv z0dpA=M@zsvpL;&C3`=LYv2JxtA+s4dq;<|nUz-+xr_y)vv0iQZ_@Fu$LK-TC4SxB~ z)24qQ*0`*k<=qoLPc~X_@jJv96ckL}&QuLQv5hml=Nk9}&>Fjv8H5dw$ZGv7O9E%_ zgwBPuU;1Lf4Zc5~qJDW5UXo)gZQ<kU?cTmF7nhW8bh+7Cf~h&3#N^<N2-^ztd7JPo z&Iz|$ZqfvYt^|l;G!O%H)^2i*p0YG{ob9c+mR{Bz#lpBteW=ewbO++-;10}$ragyG zluX^kmW3V`7*L7L&^g93?|UIy5<6GpgF1YP<_MZ;6Lts3$qnVV{SUCr+^kNZmm*f) zD?{w}S*HV9F|!p0&#TPqdUCqUZOPvK`}aHgBI5a_Mq4&}V`t$XpC`n{+<^{+wqKf| zpvuYCV&#V)ThpHJj83jU<l7`FUU~n$=AbvyKIAl`#+yTN6wS#eGwxoam+1V)G6(#l zbvfmY4dh00qJu+Tk*3C|bL_JV@0r?`6G{Uwm{TZ-5aG&nl&Cu>K}7dfbVy7QN@6XK zoAdlh?Xwc#Ony0g*yWx3PNI<Hji|lZ&M&QqV{XrgEHE_!Law`U=!M&SvY|oD*D9*r z#(VbVMoFKUz57QacDUlmX)sv7P@#3E>C%#`PfMDVFM;T)=y5y6ts?LJOVd||eFpQD zkU_mm;T|SJPK1x|+CBVp|54*;hqw1(zDmxxAo7fR;Gx`nn5GVQ9TST&m1ao-gc}M0 ztz6i2Vb|re4ukpQoeNss)?UT$#w(AP&N@dPCF4cGvXZN@njrn5+^cIc+dFREiN{p3 z?as0>$|OscjTZvJ(xHc<XSYn*oMSW157XY^$M4E!T=SOg-CGbrFI@aB1qw&aDh~$z zemn;1xAEQOVoTmT&OVsT#kp$iXu4o*QD1)HD&eF)dx0H%xr9D168`A2L|vm6oD%8~ zUa~vecj<kXyz)DkN@hrY)872T)Iz#ugEvoCgQE)(3tE39P=?AV;8ity&(1{l6_G5k zCgkQQoK8<L$L?e&#`g?E6DTQl;=S<TpAn*2+C^m}_LLU4{_VEr0IWbnE5V1G+2aai zUHbUQ#`I<Dc-V&Ll%^8KmEp>El-<?FhF-V7iVhb=U*mY`kD6SPlt(*mqTb4@-xj>( z(a3#ZuEL2OksDl>M59tn<}F*c%nyscyaoBov9gt(Zs$*VIb)xgb*=1Ro<C%NbDN7p zUX(AYUv0K2zFc{w)5PSNA;MDBD(d5mFbCd-2P^NPP>5e*&}pNEg^dmQE!8T*(t10< zf?30ql0Mxx#U{x%=^D3~MDOsf1-~KsiZoW>c{Rg|&2FM@@=E6OZHok3wSjk^&U-l< zKmGz!`!_aAe{g^>*5m1J5()3$p^OlERmQ4v2rw&r01ix7LNU~fHIdSm$Wsq~h))d& zpW_p-KYoPI;0rY<mSVC_)!h~B_dH|GJ{SU>u;9sxrJJ{<t@yLvC`%N72Uz|gP;glF z%7v1UT??@5>nxUU6Y4FTy<Iv-72o=Y24_K;x5km?h6akG#z9=UN~sabj*KE#H#Qtl z7bbPAp_56<R+?D!GlFx-Gf_Ku6P*(A0xH`6q&g;oeZbPlZY_{7?#K&DHd0fv+NDA< zFKh4&U8LVVN0WuMG^NS-1I$T0QOq1W7&DV(A<ezm$<&@Wcqc6|wnQ46K$2`AXW6PP zj8;!#{9am8k@OpABy8*zB{zjH$(X|avHH1>YkE)4rtf)>72=nq8+#saLS$sCy&~0U zd=PkXacXZ%bu|%tb{8He?~R2$vhw1<EWz_)+Bi2#gm1jF_ueUtEi9aoTv&*{{M^C8 zArSyMa7p`JhI(m<W~l&Wr=JgKa<uXTZlb-Y64W}q1b~7Vh&q<?dIyKx(0m#x-o+|U zBgYcLy`2H)k|d#1yQd2<wFY0FwgMj9C3(7dCosv{ekR#Hp^1On!GU{ZJ{ZAW<`>@d zruyp9X}kDnR|8$E(c_>Yq%iUDE3uw~KWF268`X~>_w>9=iNe1OUe`B8=^4(C@vUdp z8=*A*98&x+G5`2>Dbq9td*QLspZt=Q6|N{05c7!e=S~f6z#l)p1^DtX<e)a~ZDlk3 zIQ&EpLM`*|UA0tvS`dd&e%%X!p;LN7iM~4zE0y-Fb`65T(SygtbmsdZ{=O6?T;wTt zuw`@$f>ipU*HZL?iEZS^|Gzp74*7_;<2-J7!MZCU2z#b<c==XCL(kbxm^6IfUH$h- z`p<l3JB}L-_1(=0eS%*(1)U@FGPQ?EZ=h4SYLP2Shbgg=^$4%jf?7CGNXQ}pHJB;s zjc$)}M#b>Bb??;vbKYr%fD&Jlp0&7}m_5G`v*blh358OBD4VT61jp@w!D$9fe!{gH zWIZ=e(x}5eWD;Y`cO-^a`#Fi3QhPS0Ot_tN({L3?5I5TI3XThGWI88~8c)<GP6=N7 z<6Ac}{~%e|`5ZeFpZBMQ;Mv|Kn#a#(1^j7IVT4Bxgs{s?5PJ^W+3~rq{nUCpJCJKK zY8SU+n)MdH5zxbG!8T5ER=OQgyP|a<Q4`+BWnJLs(g)qsIEPpfzz6Ysz^&U(z|>nI z-OppOf(y5=18(ng<c%{k1bTL*0a+;c>NtGX<0C>GIgfTDlIf4fsZDgeZ^f$i(1q3f z<Q-F0=<ZeM0_Qh(`;&U5RQ@$g*rGw@n`ncW;+`{hs|=1qcFlgSQ)%d^YDaDV>y497 z<G96ry4QaoK|lrVgIn#qduP$NY8B31tH6J8SzqabO^!BvQhqjcnt^J<ey+E0RA$t1 zC(Kw!BktO@@k3uQ^I6oHV`Q(9?qv!mk*c2`U-{DQ5n)Q@<{k6>b(5REP(`3<RwtOS z2XgskegO>L=BB+!8TLitu8kX;wZG7tp?mdkF(~MvUrNRla{7U~NuJ}`N3)H|Jso$p zrZCQf`vBAP{uL_eG~SLM=>XTRby~@&u!VkJxT%Sp9M10>d;k3Axcg{UBmYq#Kq!L0 zx~3wlBIzadU8>!ymMyy)|Als#2zI49ki8D-N~Lg4dFe2y?{3`ab0z))61!uZ1``zr zBKGfJZ}|m2HgzgpD@O*5#wsWPpcf5#zSr&UY-${K*d=%d5>F@Z*<bhSOO>sqPy4o+ zd;VG-I`Xd~>Y(Hog;g<MYHso^Vs3x2tNB55Prne(RM-agaE1O0{_0+R1^VvuCjw;( z3ejMDRtWsy&(H7+u6FZe@P<`LQ-z23KcNx)!gr@IV=YlAIx{Z_eA$2pZNGmkF6u)p z=n0dy>Fx`CG<)?wCgGyth$iOm8wn|r={6S?Y3I8-b(jv4cTBuD3BPZ+pdMHMqO8xV zpOi*!VJ>-9h~~`sVjD+WkUy1_KJivjlJ;P=gF-!o_R6;W8;wlF<)vFQH-N3kV2r3l zNB`%)$G^5Sbq*WK8q(+7Yc8(;N7^^vDrB#FRIUnuPM>(7ekZu9Psw94w;nGEKNfON zR-jaDLBtBY+DkNnac`yJp*5?pO0PWgrnLn@MI3QYJ~^LThDMrWwTA+hyr|xT!n8bR z5=%<ckMrndSaRgNa*rwtjW0--U#YSB`M`+bPwt*ieEJ64HFxld>8T0$hkwO$<M|H% zV4qyYSpSm#WaeCB-78nSf>H`+z*TB%_>R-Bt)^c8UVG%;sMNc!bq|MhVQq}xY@My@ z)W<Vf#PKZW*lXxywR6E#8(d3ypbVUZ`)9T_tD4VbdCQCn0P_Lg<0EsE*16-0T3!A? z7~rv^_{i8mq(;hVob#2Enz$p<Xyt;Jg#$MIr0$KQnw%Xy*>}DmDk1ky%7I4zM6l^H z2jRnp?)caj_D}`d=$dEsvfSq$i5?bifS`>aj4tziU!)aw+7SyU2Ar|g<^>9U&0`)J zZ4;)v;%ncz4y=FJ(f7DE_vYmpa4nLyFK@w;T_gOX4g+V}^lUjRuMDmMEw-e~o$Y+G zyA%<OIbuY%s8n&~zlZl716;{Ia1%>4VV1Otk!^8|RTgV2PV=s2U<&*xKBdBfk-~v8 zz)Am~pC4m}LZR`Os%E*xY_sG|=;~9s*FCJ5WVO;nog_{PbOip134IjV2O+FgDaA}> zT?m;{$}g)g;9bJ=*tVgJOaaOCj>qM>6s-phOklmT`>O~y9AJ*dR2Yw9-gvq7gxOi+ z%D>-w{{t^n`-ChLu;6xoK;@{W3R6XuiA?}GrrhJp+iDWrpS|o8i+O+krpdMhv}gl( zBf0uYdr`hK!e-bmm!>y1_w4O>Cu!QG8Sm$?Xn{?fXsGC~3^;3lB{Q_`M7{}}xe~TH zFd8k6EaOQG*PnGqKYP3nFfevGm<z*;y9{0*2ScTJ;MhQeifqWJ1Y19KETub#Z71ju z;|(mjmtd;*4O6u^EW-oUM+S<VR$+`O&DVjZ$1_RQq-IOF3dZydt}6`iB8?E4hQv4? zEp4qByh(j~@<#|jyURmXX@?)f<vAMDy_F~^(HRJvz+x@(usSy4$%aDdBiiaw6G|*_ z6Bhdme%$1K4a>~7ydf9g6*gMxM39iU1NtKz)I@-r-2omD@f7AI3^*K@NSXF5C0kMw z-><{Gbzm){U9;iznUKlKD*5IZW`CI@K(a)?g;7RklaMV(0CFIyGRT^B1tTji6x~VV zIkcD$^TLokpgBKMpq^lF%qPDZ_>%Gd7r1YBJ!Q5?Q!gWbRPXwFddO|t<wbs#3C}AU zF}Y3xtL2UGY%~(KFz)od`=g{7^&FWky%!wned2)h1}BeTsDqsQtF@J#`|{`c+M+a0 zem@(>Z@(1CJ9Ne>oh9RDU7SPOCmn~8jtH)!7;2hvSXBlLoimD1y-KHDf1e>zqFZFL z^NmiYRI9`^onVGF=7WG5(skfam=5^3zWaw6?TnsWzD-v}Bd5R$yf=}!iy=4iodL%l z*6kawZZQwtX*XiLl8LHeq!{+{xGhfc1P-f)jK8>1GjZzx#g-UnfvGHH6a9UnfyClp z*;nJ9qA@8Gda;6#bdodH7pc}Rd`fu$#1~t%iB;nIDtr^i#?Dkq9-7j^F9WQ1g)I{d zl=={M$cx-VX6K{u;n!QJEun?`(6KJhWl1s1h5|-lV<Na6&)l{)k$NLF@P>7oJvviR zDqI&0SD_7TS{;f$p+aTm6_PQbvi0=lFj!SwScFwT_aRgJ2NG4$)$;b5Uj2g~g}ygr zNrq+9f9R;GhzYx2mi~a@Z&A+=$B%FF+Sd0lGkrHpcWt7FKa&p3kD43Ec6TI18H9wg zUK9DTz^+HBvlsSgU0I)ANW2(V0rqWB+;yIK-BUIUYfwwYtQVFXxidbiLSi(>CkZKw zw<wXW9}Fq8D6G}E`K)>RrZn9amw3XSJetc%OH((_yTKgV#h__+$CWrG?#!#UPK;sY z6CQ;jNE(3R(0D7`S$`yA%GTXcnaC;BzV8!`C7uzI5<+psBO%_H)?o@?dcGsb$X!>2 z3&hn491}%ZXt>OlLs9pv<RIsIP_CY-lvXp;OGsSc0b8*pBNlW<0{kFSqh!-|uL9!v zVW<1#4#4qhB5hpLq?z9rq=;QY9&@Bo%BmZHU1w6lOtF|}cV+i4azJ?vry!%N^s_6i z8pB`_>-|jG%z^tY7?!P*saGi3_aj$A>qDL-llK0NmG74a3;v@ned%xE<f?o0z0OyE z(|4&-9U&_XJh4>$au#$&;w!pbYbRy}I3`%EFju-(M=mH#z*u|;qZ&>Mo=ZZuEk55Z zI?)5{T01IZW;B&~zGKU_GMJPoyi^@Q46CY6oHPtn2A+p?8Q~Te^o}j59`z9JER=?~ z-5uHvQ@b-((>HcV$$nR`ACi7Z5Mz0qDMKcrHE|EbN{N%{e-1@ZOo6GAE>aE-wJQB7 zpsOX0<oCDHkXPO9Xc^%*qk@qB$u$l2H8$PwY@*QQD7^&h-bVz1>l$<e5AzzD;(K+g z#U)CnUIx|agJqi|>LoP>I~8uoRtW<%M`&nIp|i7|nyu9bv(*KnGe}-|Y8>_j>%d{$ zfMLD+PL(#9B9JVi1WejVu@U3xPb|K4HVTg<LdGQHZvS`2WUoGd!^SJWrtgZ0FHR0& z>fT|sBv%m1OW|65C5M)iyB?e^h)iJ&p}HQF3+p1dS_@~auX}&O<=WuX+gUYg6~a=r zd_;U_d#=&?-<}on%Bl*Y%3zk~sJ?L33)0=reg351Eo<l*;%<9kxfE8Qp=fTcN#xjp z)XTm%UZ~4oeJ38C4f9hhL3<&|jGi+Eh4tz6(UKFWjyZSe4U%1f0xMQU{keK7Kf13K z#Wlw^=ZL!~YNh%NX>=IR6G3(qKJ9PA4ge%lk13T9#uXPYE{O1L-T6-YP=`1s#MeU! z=dCF=O2PyA+uH{=#f~0{)5EHivx+@KvD$t|*S1{bFfpciv}@&gQN>Tfu<I9kW+wdV z7bOy^#64+g+x8Yc)CZp+sY-j)9ceoT_EDlrQCK4NP(L-+m-7u*-`Ev%M9;1A@cf{t zL1g*JJcS~{S8~-(i5sG;ml7e~U#;Gt6zjGe0HLgFH7i`o4m;Kv{~Ecx!XXV~k_6Au z^_$W2%i%@&J3>eM+BXHK4%*=u%X$3FHShC~`1$;rd`ldzQ(xuDCYNaoqq&|1Oj_T& z&}SEN4q29t!tyme5%wnW&9$5!J%Z#PYv-Ye_Ypt=Xz*d3<6;ux*@~Dh!)z|m=VC*y z5<UzG<KXy0lC~0mh#S6$QW!P=Udv=4LTxSQHL6&dV`S=-PI@l1XzNEv2Qwwk9De$J zT(>>nnP;H%da`ES#cBe!JRv--k!caWOIba>*|(r)*r-+aPK;QmD+i4U|1iGEMQU4{ z;1T7t3SUlg2*tUi)rL7}JZK6`0T+1*EyAaFI>(PJ#~a-jPTq7tf>rujMDkOdm$VFx zz!X&q+^`p~RSe1fu>%ChP0`IZ+fOG@|2Y}_(H!}TLF8Xhv`7fs3+J&O{iEJr&5iF2 zBh&nk(NQ2{m}L$eI)!Dl>^q{xqKrtIwqCYRKEV_(-hqr0XBE|}o(<Xt&*@LU$7C5! znnv@(=O$yO4R`yj72|OT0eP`#{a>Np@7*hNvB7zijzs?4w3Nad!|M{;(4(GL>5acB zmpv{>z}6Q8R`Ub20}kF5UYAk{<s?UmV}W2S;&6GpsZ{{18qc?#Oz^{PRS~a7r>SV$ zBmF7^u|k*^vW64~^DOj4)Z+8KwlXs@$|}l4Cv~c*o1um;0KGNJagx3LE;!d92H-Lt zimB~*<c=d(n$+aHcSmQABJzD$86|8rt!U7fEP>yQgw^Q-Q?Cciox8KmoD|!8)ZKQf z=mO5NZGFYA%zjw_8b?MKI6SM2`3AbwTcKgN+hES?y}4iMu^{j9^zY))p4$OutyPc9 z<~ZBX0Zcy8mRP8MS;<wH<QR)#s$$%LHPv{vS|K*|fjza%a(UO{&6F7jh75!@ak1(e z?e?SX=#h3)l0y_D%ye;9U^=G9CCN-c&Eh;5+nJ}*J>V0C=VTa_3fl(465c*U3-V3j zabO^0dgrB<`V5*sk_bE(u~r_LWQ$vBu9V?UXq7S&v}|D`+H8naV~Q!VcyB>wTn#KR z@&k5#Tz>m6)iuo8lWn9?g1*N`GVKbX59hO7>S%<3rBOPML>?*oPTyg)fVKJw`KC-A zV&t5yfoX5Tu4(nL?}}iz7}f~fk|g118LRujJ1qMO==DecON&2)mV-rt=Y96_>aI;i z>Qbe2#`#MOqqT_^3l@|ddS&RROov;|pc$Dw>hVmOco2xap>yqM_tw=cjfpnht_2T0 zOXt6J2t2tajv?E=Ww<Q9`MeF%NMEUzUHH!7VC6NeJD=-CC5*4dgpy1VqdM&j9~E)g ztMh!D+T3Z0=&=5X7k0!pxRAwhlfIkG1B9W^L^=HqwUt(=>O!C6*&I`gLEF(!0Ml{4 zN~s4hNqFpptt{8?W%yrJS0|^2uyw8WK>})l1zf!p)2?jA12D&`*QxLq#wB_$s)%J` zGEs2#YVS5odY-<gqCgvAiigEX*elb6DsOl_p>>O4I&|<ZPg{m}S4M~$Z%v60c~yZy zNuNx4&@xHuXTG#LG;?|T;!P#G$z?%nvG|$u3oyD`DJxdE#y{>kAT3b8Yw}Afql*Ev zdQh%*rP|UNc#aa@;xk<<L@KN;XRf`9!64(+K47@{+ck2+ut)r=FJ3N;ng~!@b;M{c z6I(#UKbL{z##}z>=Xj(915U?1r24lg%O9_EJI_U=*RkLa-EQXa`@kNoR-iJ!_!UNI z7>q*+CA(Z%SN5e>s3;|JHoJt5nhSDi=Ohn>XVQRX$pLg>qPw&dKi=2hrTt5;COlD? zX%kh~4}z2-D->Xc{n9wSW5;*~6cN53FD+$0_wFvEwTr{jY>2dLwQk~rELFV(zEF7p zgWyJW>9ehnPH3A@fwmUTR<KW4>D0Zj)F1hg8g+olXOdthprt{KY&Ggy=L>qTIA`RV zsuta>L@_BxyajA|tPu8c?p{&R33AuPrJxrkB_=+*%ay>mR6s|?PqYD`aNn~>e@o#Z z-?_=jADH{g$Shq_rrx8%`KQWDdo1ZCf3_KIyNOwAu{RuP(nSaY0}=bAe@g+r6(GoB z6T%(<H-&zGiO);-p#m4drcT%aaN&MgLdLMCbfX9f_+><%#ktlm-QCxQZVh7RNUfa_ z13mQtU2r0%OUJ7a#VNBf=^EQP>}OnZbW`kF(j(f?ct-!$<>l5UaDuL9K||$@mRsel zFwzrrJLQCZ6|CA~7^oNxvGA;J$cs#5v=sY*25FMeufRfRH2Opkcgn7cR#|J)j8)=r zKsHLjq4d?bmIA61i{wk<0NhC8_|)l8W5HOi&mCgRVZnnirAU4V0_AwM{=$R_r>_Oz z3*aqt1?pb$iC$5Dle;LE4s&y`$O+ObR7neVWBL-I7jOIppXWg^9@4MGZXNX_>JNHh zeLy!=c^4GX72ZgQe!azheV1QS9he#Y9s6{!dPp}ayAjrA8(#vNRbjol7R{axCWp|7 z_{YgrEdBIZB3B}tW9wd>Ht`_TzG&dkpm(pK$QpT->G7^>`2-=eKsz(v>d`s!bxf|z zsE6WwpM7=TIRcs@DPYQ&BxjH>n44&+CB-O`o?!EWER4i<7>^Y1MF-P>PA$Q{fyiUd zC~~Y7HeX~VnRgr?CnE-J-s~Ucj&9pIKFP4ZBQ`=0U}~5h?mq5?G*525{-Csw$nYIY zJ;*2!03}W;iCu*8Ocy^y8BQW;CojJ4c)--XA1)m%km?xE<<G?*KWa+^*yWNfWK*9} zRB=_BC}daUgdW0I+5x5oii=|~gJ9lO8w*WNvzat>%M#^8z6gm%+14`M2VCqhM|yls zuH^W=VAbysUk9yd`)N-H9MJ3;+U>+x#z{b51^I3a#CHeXM}O$JkozNT*5qy=u8jDN z2_--@`#={1@*m%}>aPA>;UNVqM3OsvE0iQI-9n~2*$Ipxeeon%T{rWi`*dUPn*xJC znIA<++h`63X274j0c4?k>0pLD%$!PzV)+!ceBXyOCvXe<8=(NsO{iuh=#z7MKi3fl z`UM5ENDG3rD_`F(JMxd*LFyL-xzeG4)j1`(!xLHr`VBw}Jw}10HBboiBQbsQRD-)W zjIMeWcP)erG1A|L7uT6DF)jM?Y#^K>^i(qA4o3~Us8E;RG};6@ADvSYa18ZbujU&| zLwM4jL;}tn^y1c)e%$Q$epyF?>14cV<?_F`p0)kcQ|YZ6r*SI?nBI4d^3(m`h4e(H zup!G0`DewDN7ezDDDCNup|9$12fgC&-qTEBNS6J7Uot%s5xmT|)iRU4p%jA!vkUg` z;y_pH8^<%(LTLAQ&x%`AlgdgopLedywa|3VF`&=C&f-N>i~nHlDbQt6|JE_lj|T$# zaFECkbQ(VZmL=xVc0osYlO&HArfvGU2x?#MO<Dk3dEm@x%G9$OOpw8aZpf)??AtIn z+Ef{}@?CC}@Wr(*{gm9PUvpiE>Mn`PijEYt97pqj$Fz=t(S=(lth<Kala>hRLI>Hd z(a!5aGpTYW-5t1(Z6-<%%5EyTcgIq0Foan~6gD?&uRSXsUtSYSjWw6$=)%k;;8>za zj1MNlzo%w+yViiMi@o#&IP`Yv#ohK|kE%-I4maUg`3K#0x4iM8@f5sR*ee9pL-9c* z*{<am(Dh5T#1mPSk<KYK^;I>PQNpObkrwF%`litp!^plMN{ypkU!(&|abxe+{{t}M z-I6y%*U#6p_y>JlVdp=|3Jh0@)Edj5!WeEUMJHycS*|oh0jn}VSoAT*X#ElgItix5 zv%va9)ObS>d2LjpYZu?T)n27mt+>yX#QC$M(@%-O5}6!Ge9knp&1oPt6CW!GXwqo( z7_67<M2LLW;8{tiu86Cl#4<&Tk3Ap=3U5q|HL_zJ&`6h*`}OywQ9a>_w8pL7!EdZ- z%ZS|}=#X6_2VQ0Y2tfn$)rYY4wAOY>*qDi<_;*v&36j^al&2-sK3eBh)RPl+{;4Sy zJ>|fWgsKax1Er4jeYVpF{MIs7ateg-HwvKr>E_G9L><`A-7k-JRoiRbmWNm9n|_eA zQ-Kb<poz#iWNeX8c_cOBiBI1wPZL!SMlH4{)!`o>1lea<{*n?b-(9msa;DrS+?7md z!Mt*Lx2g1T4CMv}DIBB5dLu}udQKk3(7lm3mti)HjfvEoB3UjU?}7y?<tc>$-E_Dx zuMkKPQjXy~rOfJP-v>igd`UCt&fMA#uRVxhb!M*_&6DK&CEo#DSQU;2dQO;a>k=tW zCC;0VCNV3V9*hilD>V~au%gsf;eDNDw0%`pf2HAu*S)QNu=pSeA9em-Pfo(qfnxyI z%Yp33DrIZ*nV7a?I$HKHGWzp>*D~MF4U~gpeD@Eted^GqdXHAc#MgIS(n&Ai1tsa7 zgkSN*sX3KmqFa|g6~as=3xs}?KKY_&-f04gR>TpVdEQ84uxUPh)!N1RkxBScB(2ju zyvwL|EHf^rk{B4XnvqEsdDv&im1DY%-eVL?PQDm8?hIg}$(R`Qg~g2+p9m!Cl$|rR z{)N#_i#23L3a%7mc*966M7&sRh!E?>gyR&Gs$b=Y0q!>whA8b*r*rw?aU&T{Oe1lR zdo_33haX@;i5>2GC7synwB*{gXkCcOcgI7{ac<Tu>eW~r_xq?snEy7!YR2n(4XEWq z$-6tkYM-j=t?dj8*gQuiIb?iOYKM67;R!v$@icsGLGJT9!$Wz`%}HB0we&ia-)-l5 znP>No<(JZr;??0&BXpD{Cx}>J+eNui!-{0!B$WgWAXwlmxYqw5A@2w`?uH<aj>7KZ zU-e$ZbZNkNawy&^)wSNpG7PfL#h(L5k4Yr&NrmZP!#sv|Ddq)J2b>pzi8QIfR*Okq zRdvEH${|Zi5Xn+#eD0d+72#AL={CuMM+G_Zy166Ek>-*vl$ULJeLV3nI_F(+vp2Pd zRnXvpT_rlh!($B#<6O)zG_MoVj=O(zgfFlJ?2&*t+uA{+cT<dnkhno3b<Z5>2~0&H zGtUGwO;s*H!JUcix_P4vRxy_C9)$B90=6qgV+&iXaN&hG>#_HMd%${kQgLdbbT_Ad z{B+;W_Nj<!S3$R$$(&vj+JJ@@-Nu<RYHQ^<5QdEt3Gq0SDI}BSzMcwmp6c=hX;W|w z6O<>gg&_u9TI!c>?9G-ZfsADRBonfi+?9N?0B!Nct5Q7}yi}gaFUKzxsP*s<d0J6I zPoHomHF5?E0EP&@T0I?jZp6v~9ir+hO0S!;mM2zL0c}$g)nrzSXSBM3`q2Dl2Q{|) zP>TnLfYB-llLdGanTM=ivpdD<6EQO7mgCqDY&$xmr-CaWwiJ+A{-A4nsdSGt8bqOl z-<Ke)k?;i&mN3>T@f@40Ds5;euwg_u<Y)2|x+rIWHBuj3nsZ!%WS2;%K$~CF%oM)h z02O`y<qoR1MctmY30{r$D2EhKH9VB&8{@|q3O^SaD?I4Dx{XC48kZx53{IXC9tf!B zEB8rGE4B66GJy^!&0t<79!3tqGC7vVu)j$eXy2HbN*Bfbvcp(n*aWEumcATaK=drF z@vQ79_DBP63>-$eD01zE{;aHiwjHJd4Nn(_XSc+Y=}asCgz&<K+$wf1%5TwAX$qei z#>yE*7aGJK#z)K6(jH8Nw)!Xfbr*BVL*Zr3F^PGmIcv?g78vykUxuf*T;vC*ISssn zJB_x0=#Gao;RH0lKM9G_Q!cB)`0oCf@!I^H(<J2iCm#{EBrob{(M{PsehKY$;RIRD z$2LdpMxW8_t?)!mB5*7HEP)lu^GgzI0J~|zx<l<+$V7=cg6GeiN+k*4J;`e@*yQyi zVd00-d2z?ltvYA0i~hkJ>4J4ng*0jvT<@h!6;^Tjo)6ckMjU4RQHmjL&FPDw^Yz1e zk^THW4~xBkyEwDCuZm_<5QZWXm}p|6u&V})CT++iI$-VSWtJ#D2FoCU6J7mA`)leu zR4_Qh;WNn0;wGPh!ch-pZQa<!khol;Fr=G7Go=gjfn29I{fhzqcus$tDHSh-l?Je~ zMqaU<tKvc(x>@?l0o9h^XUWZns?&h>vB5QcI+GC|NODX~eSeQRGOor~h|cD4#9b?d z<n|sH6c+uytB}&`KSbg8mtbN$(!GZ(w1l_Fd7SE|e5(gF;*iEEWJjBrU}(pv9s7_w zWyo~w>F4{sFcQNPG{rlKiSC|K3C!Ju(EHx(vk0jEZ-{Y76ux#yomVK_gh@Ro41#<h zs{!-_^(7{uI}gcH_Vojz%BhOR<u|)#RbKcN?`5%(=_VBW$x(vucTz7UpW$^q2;Z^r zbOel#rO4pU+Vsaqtl+diA7WXIY!4fxF2X+LPE+i2bYV+;BCW)Z#y@Alzgr4RGGis- z3z{0j9GpwXQ<TO*{e+>uF2HEIl<8$sQ--T>WI0ud-zTcs^w0x+NQH}SO7wwn&G@dn zj7mcJ*oo(a!$W`;8OsD1r;xi=@vKUUhcRQ6j+QQLB)qgH0mc*h33s~j4olOQ%Z4!y zgM46z6AnMlu#Iam1J;`(gyI)2x>Q_Xw+mvRUFM(-g#lpZW66KJ^|fH0j>WhKMtLj( zsxUFK#%-N<C?cCg+Wx9JB+I@>9FW5S+=3eKO5%8k1=*&OY54Yp;P?`dyWNEpR*<{h zsuCoJ2Ro|$Ak(%EeLUW|YZk%{$&3#|#$R1*)H@5oaxH7{Kzcp41YD~f(XFrV^E+PO z<0J^w3!e157=yXjnmJn((@3W7XljB5f55wqH?aAN5y|KZWr|tZ#3tgXGcqX3ad~U@ zH)is0cTw1d-a$un7shi%6mOeXSIX~nk+$Or8W1jox=LP&>2-0moPJ?RO&I5hKw}|2 zn}HUQ?p{t<{IVC}xme8iGBkF=62U|yIy^2qgn+aHly8B-g?1;RLj`C8Mh%|m)8k`` zr%l{2i}3nZZCKpwbDk;8r*Ex9JKs1oUk4p0NIU1C#VF9f&0dOT@XXN$bQ3a(IQ+iv zUBwZJA!6Ve&^P61kF6OSXBA0~i;2SyxtK1QHAm88d$n}&4dH0MWZf`a9dt*~f$$40 zm2BOi$PE8{@DIiCIJ5nA7V;=m_u>9e-u&+}v@6h_?+&{Go+htWMWvVF)jLnWf1$Uh zFiQOl2xu)%j@nkGx)6lLj<B}c9xJ=6>g!0;6<jw?S>WAUc%Y;ORwCy+`WB`f!uV?2 zwP~xTxklv}DbnY5ae57!Um(7PFR-mN+TfA4TqULcnmVBy1a|g}U*m}0y^-r|uQoCn z`Ht8d*zy+1W0o7vg@D0&#?>U|TVc0vSu|L{8CY8P%Yj8^>kU1p!L|}XRL6QZ?91Yp z0<TgXfz)x^>L&hhI6C)8l~Yzde35scvv6$7rZ)YN0I|caxeKoEa#GSq)oyFc;;4*< zGG7IB55Sy}v|aR_FTfZIo$n>Y%0Z903mf7x!&Kr^-PWUMDv2~yo6tgcgh*PlD|4ou z&|0bWFENf_hV{idKi?a~8?ecC8pYtz)wN-jqbuRWam8|B#ar24)5CXS2D&-Yfn4BZ z>V{r@xh(?G`7o6I1ZiKj?{66g%~CjF|7GsKPfGF!kQ#Gm{CcN-e+tNMnajPS7X;}Q z=g!~lPz$nbzN`at&}z45iX8GCuk#z2f+SZQ)>XFCi$f~(H8rO;JKLZFojwErT&5s+ zr^Qh(70o^bLQ-j!BFU$?lC_eNt4n}X!=(X;ZV_{`!1iqR2CrnaE~&baX@;P621^UI z*H@uVJ={c<1Z~DP`ryP4|4(;c9@W&<J(_AQpF^S6Pf-!lRx4H}Q2`+g&giFt1M^%F zP!J*_2@sMX{M1^6)FPlVL_|Rd1Z0Mg1RRJEAtI0fA&D3RLIRN?37OvwIG}Cc`mOiY zdvC3G{?N<0_uQPb@80|D`Djt>b-dUsD}uu560d^jhb8STRj7=IKHG8IaE2#>UW+#C zH|^N)GLFGTN^QDDxAl|dEf>?WhZ-qk4cB(LVFPn{*)jfo4J9NuNW<u@?#ri*fa=2% z^EY;u5LKP6X&T;{Pb5G0@DBsW?B~>aad#;T!ulm9MPXj*;E~Z2nKacAE`OUh!$#6z zIKw$uK>|O(*RjK|k^g;{SL_fG0#ql@jZFNFc}imyX~=BbSMm0+1(1aRc&v11!?He) zyoq}a$hhqrT>>90r|#E3`E<;7q@e6!iHkMBuzSzsOw+V~JNe>_U8|?C5WmOi_Lh#C zGb0I(E3Ws+GAhNxCE<(;l5$-%8Fp#g978E(V#6V=cyo*7Vt|0|Ml%gfGHvXgFB{#A zWO@&qRT}LT;A%280+7d09~&B11a4?S1iN#z?^EtD3x(C3hU_v&-xb=sDq$KBm&OHI z79cUd@$P!&RQi>@WR9vvg@Fmh*ysU!Y#(w*vG|vJ$NEaJp-5XBolx%r`33_lvp*Vn zn%SW5soq!Z6wI%XRYYwfXh7W`W7bL!fu)ROlm<TR19aHPTY{+6P;dE8ARuPeOw+v$ z&;eP`Y>CbX|B?m3EZBIk@*v~E!epBV7anw4+$uXbEHf#`FFvV+?BaW^=<qUBR`OqN zh%`22jmJ4e>z{x5Uy(IOGIP&jpteWeiz4(|Y<~3H^z_Jgt1<VZBPzuNwU>wiODXcy zY<D5vj7!-UoCb84+#e9T^*s+-M3~c+Mwc>5%Oa&43`Ju{;~dsLR(WMk#CBI_`DR&$ zRo3=2c+i6b`;qj9vKfQ#`Prhlbhg_thq9UxR-X|ow;z1HJrMqK;y+i~9tyc;+D|Iz zl%ET&4cQyLGjq6tb#3^#jn#Q{Wf9^aM}FUhbDBV6R;4}-o+J6;17mnb_1Uq7fQ6Yk z8@5dI`RB;GtlJyfH~QYs?aMvTzA?qZ9M^iGs3H<DcE;N+9{@OLTovA;s5JVe1L8PA zJ6B=(M~UPF<440It3#L<MljEAEZN)b9=*mSIgeg4OUA~Re-t&G)#HN>h8I&VrLri? z8Py%(bkvnIeRW;5ezXtWqTn9op!?2$yL#R#Jpo}2x!v44l6^puw=l!Qje~<$-Z{+O zEAO$4BvKqL>04dhg88y_fedk{oBsnRFrn=frFg4NVWcmXl;VUK4_}ugyIt)ZnoT&o zDuG(kF7u;SnPyb?-4t8)hp-I5A#TIQ44kX4{r+$;qaL&FT}$*<h@(B;coU}BWHTew z-9_%+7n8~wj?Qw;q-ACgWyfTl&5`KxsU3NO;*jHdTagMItv)mBgQ6n>Y@Toy3;RS| z7-RUrsJ)vISFHoYTZYe?Anl?w+tc$d`HjEZp8j+ReYCx}^+Fl-5lHXx*GIk!`^jy^ zBki*li<$2+viove&NN9;+0UzqQ|B7PZXVN+a46cVKuO_QGK2rrKHON^Kdg#YcSm=; z#8%d@l=sG}u^#X+J-x@v_48{|fL&a)7sVf_=`XXXl(7mQme9}K0_0D6;II8JPJ}17 zOchyH<CE#;`?$TO)P}NqZ87TcC{Hks9yI86h{0_L=LBB3b=KD<y4Z)V8@cXaHD~NM zD!0a06a>J!v<;#5RgRjQ1)f{g-Y<wM0hnoc$_PC=FUX$W(BX-9=Yx*Y^YUsYY<ku( z4w?X3GrrEjBrL^<kNDLMT1su<rb_(BoaGXtiv#VvQ`Ic3S2>$>F+6H;xd+2fk3{|$ zJ<!jNi)Cp;Phb{Hyp5SQtFrXT(=*4&VaynxNS{z5<tqR8prA0Y#=|meNRAr<Smr-? zSeV@#&J=7sYSG$%TY%XN>bzHOm_$Sxy?J~42ReC0Ba-OUpsG6@er@pgjlZwlS%;5v z@YGM+c&##A_TXyRk+TF8&axO?S$?KpBOZi$3#_Usd@p8q@sZq{nYXjunU&no941~| zJ6cACrTkK418h-Ua-6HT+($R9<7x^tgHjPW@Fenu4Jw@>i_tb5u?hQNaFp#Hw*KZn z711R~IUN9QerS^TKI|0#e*d^-2-h$8!)`UUwo4S9M>>H_8_gbytM(e6?2D5e6Bj%f z6~`4J`7zu5_!ZR=A^dN<y)Zd3#xlR~cQ(~e<yc<!X~3--B&zQCRU;d`xL;E$_o3h? z@}jWeU29iN>^Q~uI15v_NmgJNjv3**>W}7#c63^b>ID5-K$Nm&mPWYEtv`P~UK0TN z_uiA`ky9?KUo6>Rxl1X(-LxLwMYGdb?IUV6Ht;wDG>`!K*DNL=0=fu|*gU|W5=$G3 zUmb@&3F6oEh3}APJOFj9Syw`=LKEEuY=Btt#e4`5yJ<Av=e<0#vfFVjKhVB1I_s`| zs4EzIyObGRJ2<c&`0>{;&CGuUl5IeOo$uWWnm7NpgFI)MpBG;~+yC3t|Iz?WxI8$H zQ3^3ldmq39R2Q7{6KMX8L}^TNK0paGy<4HPfwb(X*VFUjz%_uH4aWyuCkM(Q-zDS0 zpn%TzLFIEdJD~6VBoAlfz=0~0bN&A>2i9E+ko=5oKv06d|2z(U{*<Xe5#6MJhKeRC z9%FzCa0D`Afr8Or0_~qXFQ2=3W=G9I`JV>Nx@sndLjvbA1e08s%=(Mo|K7yezm4ag zTL&KhckZcKe5q^Dcz5QK*FJfFfLl1A@cvHY1{5e^-=6u1_kUx6>H1!~3yL?X9}VFj zd|VpW*IplA%~HRa%_)#0(dVdt#lzA60OAt}@)`bVfH2SVHVc{8|NRFW094U+I8XUB zsdo#%`t-4vyE8Ow8z7EZ$M_$1>j0PdhZb2qFHumUY&HRy!2DLS{_|*~`S*-J$%FH| zw_N-vCjReq7b0K1{kWp}FETnXx03mNZhze5nf~0XEH%Q60d<z<H|6`}@cDh9o2heD zGrzOshdH~#{Jxt_c7{&E53!i@?`T%(GKcVg(+vb?NmyD!&hq*9Kmq!m7Yc6A+0`{{ zXnqR-l)j-6WZV632)9gf&p*9h)u;sWi_A@9Eddk!VXC78oN_gCq*4<cdY@O?-~E#j z7|FDdq#nvm$q3<%)e?CHk*!hEJUHuiM4<m<5rOhEZ7BZ=_yE<h2eW2WQqqX**Gknq zuKMGGn|(1X=<SY*NwHk@DgzkT35b$%Z+8Q|Oj|wTues@%ngBuW^@r5nl&!Eegbd)K z`kHSGK1i??mjB_xBrx+~*c!q$)~5FtzSQ0zL4QyRE9iU4p>n-fL(<s#*z;3W^9Sf@ zUh!e%?125iD`qdeT1*2Onx8wSxxmYMeK$sufxT(2F5w4Y1=!3bA$|B;^M85bT+G4z zzJNt@iCOdenwHEl)A@Y~E8qLH=6C)Rj%fl&=eNJZ8IN86-%pVBdoLgs*7eN;M#<Jl zr>ub5pTvMr6Hzk{M!3V-T^oB#@0fu=mf&&Gr#t1^G4|fy3*24+p#oVtlDJQIJhW`F zCW~Q4Z<m4++OHrqCA#0Yl7+dnjIRkRrx$^mh8`0&1-IWf`d74&Ly4><vIU@ksX;%T z5B)$wSi*4S&&?5wkY9nyrRU1DKHf=)Zkp=*GoUt+1f<Nx*D)4;ywha!N_zHSx%V!A zpjfQ^0RIyP2I#+wui5ZFTTV%+|G;^{sn`*J_A!*=h*f%~Y8cXHr;}|^wkB7{5A7d2 zgyp!|M|Lgb{``3AMbQ=NN_UPoil?m2<fsJ?&kLHL>g#}ZeoLFT><<8OD>eIf0%;H` z{DmW()N9L~l4RJ?R$I&B1_@BT%+;w$a61<j)`3(V-}BTx(~cYyB)vWCPh9cNz#0|m zb8-htz5<?Z7CYn$k;iuLLr`^89nF(@e4$?1B9Mo%t>hyB09G}(PLKPfnRgfE)HFXU zn}fQ(u413^T7gu(-=FtZ4vinIhU5vq8;DgG<<wrJ$*aRUzNYA=N}>jD{UG)BkN1_1 zVK~0y=+ifqIX1p+5+B&(TgWpGHl$98zk(`n>r&60>qAdJsoMZ*I{B*p)0g@1&7N+a zewqSza6t|F)@G2^jmjX}HoPMKP8f~jO;Y!0wT)Ou(N`22n4;g+2l5bpv9AuF6YQ*o zRVkL5HWVwGp!%DIWHE5M9&QXfQ`~8<FX)eK!o83Mfl2uT(du{5B@03S%0+xy_6M94 z1p5z2UW`l@lS!5F+%kW}P++F0<?J&1m5r$x=*LUTOwf^I@nCO-yOz+*8O1#kMBA5- z+|=#*V6DUzqU{S-K1cG-pwAuZL!2VjhN|DT1@dsF23iaesVBFSM3PwP+<=eU`8l;` zZCD6$c{lJ0_hzwjvLrw<{rKzC<H<pH2PTmWHn3a^EvoM3)1?c2rPqi&p&cA8y;aLO zjwf*QCNjFB9_NIxzd;RjFq>LY8?Cit)XimnCs3k=wVCTBx$79Vc3{H9#mO?1<f!zg z9zBQ9{?rV+Ay0W58A)yDRo2??U@rj$pkUnjl(XgAwg@{cP`H%E*I^03+8l}_r@<`a zsfDBSjY6XGob+{wZ}i5~N7#PI?n?-&1A44^QpFEOACk;m?c(vk^_2>Dvu<XS`_SOT z_EfcM+yNyO@s3~{fPkl*kiq6o7*xSTw4tL$L?Nl<h|I)s0HMoBZ$>8vBy6{ckZTK? zK*sXVW@Mt7QR!iKr~vhHsXg)n3BzE0J)oOBG;{R|^^j^Zb<%=H-l%gyG_?ppwIa?m zO!i|quH%T)HLqMQ@*#LzKh=m4bd&!B%=uia7p3~u6P>ii(BXC_W?dcm`AuPlHwJ4= zLkc@5d(?xYjSl<AP~E5fIj9j4Psag%cAPx56vS+=n9s*Rm3Ia7slN3NMFEl=zjIIX z<dmm1x{{|qS;xu-Cr?0$(!&X{yH-|>e%sSISr#*{I<LY4t7`}mV|-QJ?K(HW2=0*( z`_Uas4_!GfDsHFs`Kwrv2otUG+r)M>e5QF4%8rkcF6hBoGURJb<P{-fMwyMmO@pSO z=g+r(Hj}A4voqn;5A*%tuPprD71Q+fbeVntfZi+uH!2U`@zyHM5AwH_$;c#C%jCo! zook1jY0U(K&BN-E>yy31DI8Ra+~XcMLDHz}LzuFhWC4t;_Oy+Gjq+S9gU#iU)$I#I z*jwmXEj=g$i%GactRx0t(<2@&^SN<=!3|cNy`1lderti~KqxO_#fgSw`LnuS@oSRD zzZq=Q-S{qmti)Lj+?~^l%?PB%*i^DRg0rWPYNQ_RnAGv#UhIEy`~{dWz?h(HMAM9* zH~E2S!njv1u@hIuH~GtPtrS-bN+r(pbB}10zp2{}+KFC;oX6flH!}^@((8^xmFXkn zv5G8h`|+uz+Uedxh=plGP91pFQ=D4XvF*qE3)_<MoBbyRNM5~=Sh|h~uOT@^PCnPe zbL7PfLmts&+#EQyGtwULC$y1O&Q=*1&JMZWGX`hkC_sW>Q(&t6l5_A2+2pCKgqHgt zkgW3U{7tLLb|6k&<TzAue=E!G<n-f}elsmf3gv0-3d!TUGkp%W@vw44GkX%PVw-TQ zyQXeE*13U=>1yX4!devLP`K!oE{OeOaRXD+R!Nu}-l^@X%VQ@vFlt|(=m8s`!*?+z ze_gv)P)#n?Aoi)#1EUTE>mpY2J6c6y>ffjb){P;L6hu90rP{|0$AqJ`*~ki?cOkXu z6yFN6z#6@1A<IjdGtl`^_1K?W(>Pi-o;@NIj*boFyz7rnl}-EtZ9LPs3UtRInKW<9 z1U*mM>P-tWqUuu`5aM{{AsxG+Myig%L>t2|_H1LTc+lSC-_8dUS?=+t8UiHI*hWG; z{}3Ls;yga?jyEm=enG)e-%jG$F$N&^cToy4B`pBnjRk?aDn18h$tIl0wq~nOP(9Z} zvTWEF#WkyIf|JIE&eQgEk&o3cuG3ldw6S@-wM!=xJu$j4h-Ma#7u0X+u5{Xb&7fKh zF(Z;}V<rbDt{(yNv_Y3ocFq?)5<HLY$Cc2hdfU!XBFFo(;nF;!=`<SsRy;Apyo5m? zTQ<=$uF5xTqcsBj@1;Mx76ly}?KNvGR_LfFcGkZRWowG9{`!}f@~zJX)pA!$d^!k< zmO}gE=iV$;4dEkKGLtaKW6PEcZcF^(P-!#A-b3uOqu7jI|NH3ro0@Ho_mq+D9zWeN z*|bN=>9zng#V!B-9P)>gD?Dlb!We0avp%KH8UV>#X=D;weI3%`8m?tOzR&zrxlyWJ zOoL+FaNJZaI#dQZQMSN^L0mE#{u<!8WOQo}Zw(rDZ(SWfFOph#<!``p=IBO#Jzw9< zVOkLx&uot^bC?;b8?+?W^8@|<y+?~M^o&^8wymtLG+u<Ri!(gndleI6pg)|CjqT|$ zN53x6YB9;t2SP_z|GtkiPn-hD&Ua)rXkHe1mYJk;!%Wry2qn=aJF&wh4s^oEOpNYR z<L2>pic<!;PRu^<k5Q?g4{A}#$f<UoIn6+=^c9BO@~f-09lcBBAy890V<`ZWx|qfS z6H2NX1E{+i;bhy=wVE=fM**YVJh^bo;-In+<q_8Pw$tf7sVA7Z*DN1!29zDOEFV7v z@8JaAas`-w_vX*N#Isc>n$$f*!>4&=IxGjj{&tAOz)a0W+nx*dk3=WCfEU`?<U(Vb zEqE_=ILF3g&z=7cIZZmjixt{=kzT)6LYNmGJ`0e9uu+Hlrk)>T>7%4i<!x|Z7*cxG zisND*qeOB|e)WD~239Bt5hl*@?H4C4$S{#LcTXVqia-2;t=z75?8c>@;Lj1u^hW(= zgeYFLMu!wDJ8E@Q-R>);0a8^gSH<Pg7ehVp>+M_inI9^bKhj}G4sp{RgUF+?a;lkf zq?C6VVyG_lQYu*hBM6Z?nl+3c{-NO+@ZEaU=`=!vVgLd)(GsFg51R~_jw9X<PPRC+ zd`V+3`EB{#VDg2a*bW3Hl`$lMm3!mD1E!80z-@8RTWI1BS&J+0{~Xpwqxi@|*jBfo z(%eGS6B7Ca{Cf@Mo^VVbvkTE$k5vpiw&CpIB|edFRg)tCc?}**a&oZ!h3@Se?~{Bo zBS6A%xIh_R*q*%KpGK~T?@Gp-lqufk@YpNT<g%t5opgU$+Ik)pOF++%$&gTnZYoLj zOfSM1Y}YFcf31#xtmOHt#`7i@g<g@LbfG;BTP0}IRr1ETYXeqDl{9u5DF*^Dr=F0{ z;M?nWBYpEWS6J~fSI^Nj4)V?Q`jJYPZxFMTR`J-pcv=@A=U3M+6zUD#y$R|4Hm@MD z6D=-Y$fJo_-Uc>3`tNcLN>y)CfK49x_z3S%Zfvl;ax}|Lsn5F3LH2#ilc>jgpD2@+ zwb)G#@+-9&W{3_|6ei?IlJ6x{`K?XeJrrojF!Il@2{>mM$8pxkG-qkL-R5IPp3rSE z7o41tWg5gik1d0|o66Vsi*#CO`D~xLN4Z`N`gx@|9UI4Q=S5usuY-0DT};!-tVN4G zq=w{3<t^A@y?3K2gPr!|A@{Oh%v4lJ+nD5tYDWZe!}L;z7=-k)t`A~pM}^g8N2<F? zZ^~e{svyEh;R^a!7R8EuYP(<BR4F+hXI0JRboNNrnyK^}|2oe^_f280LpG`YnUA@g z3-2O_iK-@NG>fm@7~K6EJXP_AK~%kH&-*oue|NQQZ~Bt|IP$@8fFJb<t-T_wVdooz zvIyf2u71;bOe%x?>h`v1XIae9guMY`LNzH=&Cn}%m#)&ujjwAQ6Q-sM<DPySM7xwf zM%ex47z?*fu=WxR+14DFmZC)@QXQdC?LH*<gY6429&e)D8ZmSvO&!jNdsUcTni}Y~ zdI4N~*W*BWnAy7YH9g93K)mpiv=U(Kj+`edrh&18-0_Nodg7U96QuYASgv?nMu;44 z?`f^h&`47^(8|kMZTZ;xGRTYSu<r$86T>Q>UFQ@#{E3TXE1;yJZL1kJM5)v_(-%!g zO+Tc0i3O4YOVe0WuR<gpt?R}t>Y$@~=pKH-6xZ5=4vwRu<D0${>6MRSmW??>AJd_2 zqaIa0fo6Ls+0}<A5TicFEwmM*!Aji2dsBIVQz{^wr_LgHH1GoX)Nt#Q$>Z{p)|LzR zaAUHyw9NiD(YREhi0l3SsDfFwr$jGIU*Oe)?sVm8q4-B*g%*-=1(J0z{;f<7PxM|? zhpB=pGRDyI-}TzE?4zAy%PE{r;$X*>HZq!VeKMWK^cQEN3-pJp%%YAYvTU}bTP&%r zutMZ7nXJH^8=r#v^0&C2CeR(V99`k7mW2%Z!W5nfYl|4vlJVbUMofH7gfljfE<3ZQ zrG)5-b>8Dv*y4j6@LJW{5>znSnp$b<&M>P$?yaaXI@*C>1UW=D)6=9Nd}s+4A?p); zA^k%D?UyN@Gj%d?7$<GdaY$r?kID+3DU9h8LBbV)8te<`*pAdviXpmcYC_9dxQ<dw zdeg8id`$0cf2SpYE1UN|f8@Bx#{#*)t>_O6(xu`b&K`eY#Q)==^J*XOD+JFNT@0ri zd9?Otem;JS4`ra1d=k+OMPfWf&U-9ZHL(92-$N&RlApYC4aE6zf>ssKgDx+D$vrSB zuE0@MA0`Zx$!_m^5a2#q%A8vHa#lxkq=rj!*E0I|?;58%#5>kcK6|reX7I|PS%Di% z9Bq1Aw_pA{#WKZcwZQ3kvycA0Akhpr+O<ZTKOJ0ltiH~v1vBKDfWz{)ST8-{+7W(Y zi~E(rCHn%ImG4ZyDGJUAu<ANBcwe@c5;{$6dn)dhcTU6*cXMPhfeubTg`HsOB3lj( z?B|38h3Yp3^P&%r>*f$jzGbrydzn?l{Zv|mvr|3&x*7*~FeS{*yEF#u53PLYtWS9u z1&mX$GW9n>rO)k%D%JP~dn7f9SICZwl2-V$tq^y@7{<M><sMfW?xK>bv|m;o@of>E z3V$YE-nzTi_=yXM;cALAT*?bx42y1@NO4z}_Lm$ne;bka-9t7$A`EG}L|^`={vKa6 zcH;ZmB4%K8qqd`{r#YN;S&;d!z52UxW$PnzN+|iyQh)xl+Aho)W-qF}=&m_8^J4?> zBrwT$gp7p%x{nVkPzqQzD2SV>-l;jpv{+i_WZfY#_6%d+!m98iiN1?Mv^R!TfQ*-N zM_+V&6+r)H(di}oyuT9OJ8F7d=<bkJG8W-}52t;sEVHyWsIms~MsSynU)kTXwZg2= zyc^jW()c92LKS|g`mQNX8FbhNDrzXn6?pvAXYVz3YrDOh=J1%04VYSf66@^)`$d&Y zSa`yEoy^cw><(WI+o9I_#<A9a73n20#vd#<0!)<`2ewD=)qfHMwcRg*1?$H<t++Qb z*6LwNVp;$4!}c_>J20hp$Dz2E^GHr{ySS4=>Q-*xZz0p_Q<a$_C_kJ|8s7Z?%C9g# zP{s(lcot@S{Y?M1Gw~(gYkUwNTUZDEYr^ECV>$V8VD+Q0Ht4nfbAskBu3c`5eU;P< zPb^c=$Wd>fTRv3osZVUiKQ>wvBx*1o$g${6`8A8(QR+}!Z;2|I*uKllJ%M4>m{moN zBc3%s!d%~HFY8^hKCEJ@^e8d;pfa-*Gi<lD2!FfbY)Nfc&d6Hblefjs<DB5{k0hI$ z5db0_K;_zD=<yt>;}A*l7@k3~MQ~0s%O5r4pV1jmpWq;w$CdCnBlle=-JAGU@WRC} zN6D08%mPc~W5Pi>jzL`&-M5eYkg54`@*pm%Q)J$mCNuN)$HKQ2;SY#2;LB9}=sx?( zNWEJHc4;k?zhHV$xsjttjpMXp<gL)v)l$V%Av!(DH}8ik+%<cAtsh6W`Zei6hirZF z{e=yJz$EWYJ5qQqWg~j*p6Kpo-&GAY&-&Sg<k2zNH;=lGf(s>Gp`3dvD!n$5CE%ue z2UVIE2K0CHE8;e$<duw-lCyl&TOZxC%7L%=0$swASjVz*ryKMr2-~c}#)+XyX5+sY zKlHXQz^~pM40WzqP=2N;X}{J5&vIQ(@Af|L2M>L)?@S@2*hE&z7&38ZH36u^acj>X zqAM=vibxpwiSHn16sJT%KjMmL@OXmF@hhrm4O`j5IYlo2uC+gxcr`00^Q<v`$>&(2 z-8^3ZodA_980%Y|5ZqianhNIPgvyN(16M{nnQ30SoMk;UQPv;kTX1`JruW1#@{p%? z{i+n7@iBA7Fbgdi(a&NNeXsWvp{_O;rTSkiW8Q@^l*ho8NA<l5kk5B3JA1m;(n?8X z4EQ2~=UaXGKFY0>KAUT_jw{p$sdV%G6*Y&#`6@Sukl_uvm@nDvkG*!fi7Z+gvAP&U zZ7wCzzjDuv1bgaj<u@Jvm9t%b!+eKD<=3~Sz9Do~*@<0O#lx(Prv8iYkm$Lif2H8} zGm;!)3a-h*2-13hF18<CSGx7@R-b#s&GK^S5~E5?ZTmI(+ZBRhw(*TI0*x--{cEKA zv*J4swIhbVh3(_iFoxG74ps4NH{B5+?8D=;T%Uh0_+2361Q+`x3$i_k?Y2}-Z#%mx zb#$P_=5K#0WdXtXZ8CII@wG=LmqMdw9t15>jmkuo8H~JJHSXt1WG6jt=55`qC$Vl9 zdzD!};da&7*Vt_6rd>DQE7*f0PZKjnxJi{Y{BO_X5aP&er@Z@|f?QqEE*J{PwZL|F zoJCiDL)a}E*)ggF@^zq#M9asFBFcoy>(BdoF;)F|o=vdX)D9d)RIE8b_hTy``c9Bb z1<nZs{jtq?6R~aXV7>RZORT>p3<Hms6F=*2`p@oigefqDsX3hZQ!Cl<fA(>sH3HN- zam8>ZUZJo|K3AK>>YT8X*Z~tMU-#h<tl8Pnvt5_LIQ5bkX~nPr0_k4Y&sqj^j7GPb z35}rAX*;eRuxdc9{A^Vv*0|MzTvXi+i9h0lKEJ&mw){u_gO2-JgyN_->giF9egHNz zjJ~7)4==baH?Z+FRc9gEYRQ6zZP7m4@qzzx6q%Uxx)K~kNa`WHQJJdOm)Cn0V9C*% zqbB!!u`QRJFAs}o7(N9kX%R;LqDEy%q7(5cUlts_rWwD0bqqlU)KXre1LSx_-BjL$ zflM?0%a;iDmm~UaG~=a&$2u9aio_vwEJxAIzY73O?5`-nwP7%+>NG36E%;a)%?UW0 zzJTC9ErP?u(B=)u7WSkbxIVBE7Uz^}%JX&CH{(c(0prZ2kVhSkqq!}eu%(M(X6wS? z&8|Fx86mGx8AWNkdV+;^tWD-f->`<iApnJP7A1@T=W>3+6_2P@`T`YMSSQLpH%Vc~ zoQRDPH%49I8aidp+DzKbNaDlFE|rp%m&BT&n4-B$0Zm8tLZ3ITB?FW&Q`CfWYBmd= zFT~2|S(LD^Kr#(5KeqBAW1C*2lEX$0nb5yWKy?BNm71@klgTesWL2(Vup;j&6o8uS zFKxupw09X=pDKs+3xP5@Xlb8=jgJ^?XO0hoX>2b(;!X%P(2R|S1t3-Fyr0q5a%KnU z3z8_YPS%F$fFYi$2`b(Ja>3OjR>hv2(e?56Qw>6>b~+tu7~db<Kvulfi`eY{K(?~Y zDJ}{ATL9c;XsM%II(W<u+@K;&&?}=tyT29I%h;33GV7R)%P^EJGHDo^H#!Lz7gG-{ z1Wjv<JRe&?yXS>+BLLqBRNYP4C6DP#%Qj=ynjl`|bTZ&Vh@VqVu5jv>5DnM>YG?x| zNPMe^-Xa90j{MfP8K261MC3vIV9Jh%EW}AwfEQGz(#YXtNj6eS0!&z@GnMPPF9A#5 z7bt4HzSq?cF#*)JHAB)}rIepB8FsQ;?&)f-B;pq=AzEd1T-cy?kyh&r_>lm?rf>1y zt^{~SfV=40sN4+28$CaPz+^DT?JU?QVdLwnUD0V0uq`LNRE)zqQq?@6!Dfn9OywF- z&6oQpKmso)%gDSg$qi_1Yc%iJk|Sot3l0+(LA>w@Q&J(BxQ+-Vy>Jn##tCD4WBZxV zR!(A$Wv>Q{@6*`sxw0DXwh$<?+}4&uead?RIPoB210(fxy44M{qyF6&@$0Gwjj*-k zY;~by+gOxX3v?DZ?(ieLL7=dXibUUhay?>@fVolD7^A*b3+E@ee>DuaEgYmNe5w#o z)2*$CDcg(^lugl+bnr~+9!&Sxiz@eWK-$I506c^x7e#h*cSqeJr^%u0^HG31CUum? z4xrm>%#pL!59<r+7$Z<Z-xoxap)a`YJTS9U+G#c5LE1Z5u%~<TK>V}@xyKw>F80Wo zixX~@`Q#*o)KF;3ksT+R+ZL-8MBWtwARFWJEfx8?zTSRH20R_{&CKdIvrZEfEu2SI zq~oS`x`Rcw{ljpQLN;08%&MHSO8N?PdG1Wu_aFdNARz70_5$D_$)K%cF5U`H?2vJP z6HPoH_V*;o{=`wSKGE@wJ@Fb>s+4CGVT6ellP1@fk<T<vpH)d}***qJfcr?%ao*N3 zl0Dq}Qxip5U}H7QC}Oo*pLOmUX5BD*vJSA?ONg~&UpIk3d%oDP1i=7<BuGxhvH=7v zL#ld05}g<2n9sxm-<Vj|n3uiw-6A)lc?o83N8RMJBwm^JGWqgn4l-F*Tdse@q=5UU zuE4}!R)XXiYTPr=O=1B*;t&vK_30}EWOXTk5kESl)#gkT4NdM7adL?PQ0b7aFJbDk z(B>|Ag+kwqfEwOmU|pc$PLd$28xFE;70e7wSO!Y|LTmKAAK<=;6F&?XIOTrPuMU3~ z2QY_yfK%4*T{DyNGd(R?rKrilq>Igw$}-;*C}k4-2G?*%%_M?AX>(`izMq>%l$%Mf zMJ)$jte{hbrVf%+Z>mtqdN|qCDnjLpI^@pj!;QnIr7Cx@F?rh1u??_zw}gQ}t90h? z)J?Z5i#2~Q)B3zu!$HfXU+jt+?9cjQ_<#FBZYv6iLyxD_qCNo^<Y85D6%BMB{;WG; dWe6=-4Mrz?+x#_o!EMd+2lqMc#qSPC{2%`#_cZ_j literal 0 HcmV?d00001 diff --git a/deployment/media/nested_virt_arch_ga.png b/deployment/media/nested_virt_arch_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..11d307216c029ca1ecd95e85ebb3052cbe58a88e GIT binary patch literal 122329 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 literal 0 HcmV?d00001 diff --git a/deployment/media/nested_virt_arch_ga_oct21.png b/deployment/media/nested_virt_arch_ga_oct21.png new file mode 100644 index 0000000000000000000000000000000000000000..fe935403675339fffba6323c075c07661156a037 GIT binary patch literal 196512 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 Y#$QdZy*6D`)#^^WxSwqN@|*Ae59XkKN&o-= literal 0 HcmV?d00001 diff --git a/deployment/media/nested_virt_nodes_ga.png b/deployment/media/nested_virt_nodes_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..ac10fb66e2bdbf712470dd510536e3d86af82ca7 GIT binary patch literal 122317 zcmce;2{@E%{5P)7Q5`yI!L;GD%3jKrrH--{VUWa(Y*7qZX2w|SloVwwA%tR(b*wWo zgCbjF3BzE_2-#+s$u<+h{~0Z(PUrmo?|WVE^_%PJbb7Y?{;v1u`}y9_bKm5G-tPjt z1^D>*emBrR3+Ch7h~VS<rDxLy;K*V7ol(GF>%75w+I$7AdnbT@{ObIt(Vu*LMQFiK zcKpD<f4iY?<;}+j+Q$2{?#<!ZQ+#}@83t$nH1~y0F8@|4w*aT0=qm58^d7n`b^KC@ zWv5ZTJ0<N(JEZKgMOrwc>?rMR?(V|6D-O4%*1;V5z*{`JO>l31`2)>gDtGIUm9};q zzj$QFwMe=1ZwyC1%(N)XR>sdh@lzvCv~r&WH$)&;$5<t8D-HMW?bzmAK9Ks!v&w%+ zV)fpRVa+1r*O0`611laW%eOt2J{})fg-HaC#?v{|V?oDf8}WgkUVutgd6Itl^*qG6 zW}+Q~X0OW4C$QuD7>I<jq)(tz%l#_Esr0r_`pP@F^}BxgdO08812~p^Ib*Z}5(Ja< zSn8Q&2T>bR0=p8{{e8*lU10BJ;0#^9RyjVelkE>&q0Tm%Bd}0PpGYN?n##8PJ2CN; zS`x|n8HK%3d(*x<TfhHLFD&YEHrX%(A+2Pdoe@Ows6GjHZZY_s<Iom7fUrUoJ0>q< z5$l6jD7ITti8nNf(Jfp5@rZqQB8P~@#j%u28Qs^JSa1wYzOB2F9kL8)r6jdOY-OU2 zxKk^D)yKj7_S3EA56LzeoE+C8a8m5<DMT60v3Oh6ltWvP5pwQK_3GvFigs#>@K3iz zRz&sXlCQvxE?zH<4I^+a&{8#4MiJZ}h2!0p7)G{-!<4JN@rIKF<iNH-tOwHIpIX?5 znb0@7NO5UcX`$f*Cl}bA2X17^|1@f8YLq(i6z3Bc7VoJyi$iN7wUi%?sqOe)p=&oy z96l55&2?x?9*`g2G6s|IU!fJXr>-=IFGw&C{WQl8BaE(0Szq!Hi)Y9&dUNn}XIo$` zRf{v3Tl6Zl4MG)<{lRFwG4w5?E>B&s<Mvu+#1SCfkjs8lz0`#$)emi}izI6LPuFjn zI0-Hh6Gom|Y(~4q!{g(ML9B<rXrTrd5#B$|e;-8eI_`E2t09%3qQD4Rszz~yazM2* zGS<|VpKa)qY#E35u~X4ELQcRWf=8Ez1qbG-Sa+45MODlXplD)qhFHf3s^`|?Wk_&! zX0mMR>Q7qH&J@X})t_YX0?9VI8oQJ<9payA-RrLVll2@gNA<z-hR+#U3J}n*K^LIV zf&b|$<OEe~r9XT+Bt9OGOWO96^a&R+h&{}5aA&MKVxz*`;_`pZj&Ye~Vi*6DsvF(T zQoN)lxBv6Ojhl7<`?$KyBxAx?%X^|8K^kmiLYKzXwU%oTr1npB1AcX4l8bNe%TVP) zy;n)O?*3CRm`T+9Q16C7EMY1gxlA9KimQE5LHDM*D%wKd2l`H><AYflQ*r50c68Nt zy;ca-UG0f~3dED@noXRgThcgDvS$>En=3hey%Y-GT4?MSq3Q`7+A#$@-RJ5?a3gG^ z%2VB6<4CyNqN(C3-T%`=oiqgDL5hk1;ex6!>)pF1+@5c@@BaG4|HDHqeYibTpIw?B z$-)RHr;Lj`e~QOuzrKQOzxJ~J3jzcf*Z3#DfL-0K)TV0m=fBvf-tm9&)cXTt1tS#? z3P!*^KZQi(uK(dU0^FmywCES{lZ)xU7{BZ;83OsIi*4H1mFD_F81Yk(I&Mh+_v3~v z6ygxY$ww}}=I4a>py|Z*oQk;f|Diw&2x$saxO6LYp!ugLYShS_O3VSRT|q^x{uJIF zS2Im#A9M=;+guI*7f=0{UU<g=#~VPgbJc#<@(7@1;OtLozGEK#e{bb~^NM4ru}bXd zfBDR@1YIMGf6pb44bwAo)+R?~rT*kMea$DXr+6m*^&htW-#aD7txRDmesQgH?|+f_ z_zl!N_6!$=kTMF-Z`yZgD0%PK<1gK;O4pp8)@D-?b>L1U>LJqW>q)*6r}nQVaikCb z^DcQ_q)2UJzyEgqRZ^PHX9eot_m$lE_4rZizGiQViZ|p-rvB;V-|=wnwYu8Z+iv#q z+}W&aEfb}_@HwEjY2WPb?}s~|bd8Y70ESeTn#9pg?YmPd_T%XU-In7Q%uIj;5xIT( z!j`X3zJe=FxJK3(KEeO92<MajU*A-M#g2XTxqnPU_Og#0KBk6+3|I`=yYEi3D>3F9 zRDCSRvlx&H0F%v%e=pZJEjK=PgTY>WuV_)ZFV+|6U~_9{W{Um)X-!^yVg7J+bsg+0 zb7eJsgT2jh%Co$j1K;(<P42t7xxLqc2oU)AO4-v55(8Sl2<bt&eg1FeqOKoU=!ma6 zK~5bjNnM^qFxx-PD6Gyrg>(@)eXfHGW2r(yS|8uNozt-WSOdZ}NP`xVbr*wYnj~iz zxQnHjN>BnKmXmE$>8B*2*R7W@0u7mqKX-kl%q;5y3@>h!Fl{#7ce(iYra4>GNbINV zV<+L=4(6pa|EO!EQb*_<0&-9U3p*G{TAJC9U7c)O$x}~>oR=kOk9IQ8K;uU)&52_k z#w#+_uBQpLcUKs<*h+U)O%}PtHO+AMv$5y=@5>5#JP}sNo=|=^{#Y`*xW$|Xt*@(M zoBJf~&-R7oR)N$MnpPyKLG4A7(tTIoU>L{N^YNK?e)dNj0m7ZFLl_D(gh|1g_3-mO zJ>V2pJp5?ljC^;dfPs@dk;EUQz^Pe17_|_y9?ddNnzJt^wt0dU%|NfsKxw(q)A%T^ zEUD0KThYC|Ve_y!*MlIA*)F_hW_L?D?0mOgyHBP5wlp`pKgv8FJ<Ln;42du&;!N8S zG14DNCk>}+b*2|{Dw6#VPo+=6Pc>Dku`Zn;<*>rDImaw;zwyM{2Zx45Dg5d?j5^#4 zCH8QW!`#gPolRk=LA2q(Ui02eKEBg%-ctT$xd8<;V|gBU{^G@p8@^Z_YiNpiQXGis zGYAt1*Wo{-4&6~yH{{Y0-gHa{`6g5TUY7h>6^qT0;S)yvQb$4*6tbOiL_~gvMb$*_ ze;l7Sbg7+l>97;M6Vn;l=q1&63P3?&<l<=GkR!dThkIMyg3}lXRsses-yOJP>1x76 zb0XPOu}lc9UhoD&9<J)&iZU=lf)$N*8f5P`6I2Sa?oa77d^1v#uY#BS^rGl6F2OU~ z>j~h<U1bS4*Bt0tNV!v&cWCR!SlQZ2NHf4Z8wF;s4<)k7xR0jNpP#lif2lvue%NVF z6s(Sc8b(CfpUyFfs`w+NVk^z(*p&|LXyFZ&4`gmUvcl1QO&P5uvRKEAR?<CTiLkH> z*)aTdw<z87b*?h}L*~b%=b?vb^=`pBffuF9$y4dM@Bwm_ng^1V$r&Ll+gu$`@YkA& zPGn);haYtUBa+;&``<6J?a<f3OGSrKaM|4G%WNlHLfRvUBp=_?6y@U&6P=%AKIO%| zG-q40Fk&6wxNgn|bB=b!^A5e7=V0^6(qOJ)Jt6#<NCF7ff8df+`II{RnAK<-C$+*` zNw=?OMTha1FGJg>vyQLnU<f8nkQF0(I$XZqpL);D3`)%u@IR(g_kp|=JuiwE*{AcE zj1Z6UTLnDdj9MuxgWUwp^gYBrG(*2VWro2~)8KAh6X_&)YT~I~k_E^GZn=X_dy%JT zM#Q>ejhs^aF78hM!9z+k1JqJ9H{*U9?Cg1%0(>ZN;tvs8roJ?ksz?p$U#WBwjp^f% z+>d9QtF`j+-DG^fY`SF)u*X2R+)M$$#K$)k6P^ow564z!os$4RFshR|k|}ULJA4F~ zV1|i_k7+Lsd%5t4bXZ2c0c5K&<X%AsR6dfVkx_p?$_YF-KHv$Ks(7qbP=3fj<jF`N zYC3FoX6IyDBO9YAmO#-D61Vh;9l4%$D2HWR49SY#Eh$1R7_ZEVgI%|df?-?&$ETWI z&EV=>^Qm+u+}3HuF<7Q=Be?Ui&ddt2aprjkT{jM`QZ>qx7}M&IZI7iiV8F(Dk-j<~ z%-sl&fKau-1*$=XVM}yX3;Z!YzPI_`8<jdO{%S9Zm$lzM$qA7(Hmj47dfJ1_7JQvu z;~)*S-WQT&?nXTciU}8hLzkpMubHK2jET89`GQC*Nx#MHy1%~2RTxn_Uq2sY?fYm# zSY)CeHk&<Vv!4WBR8YUrUJ9Ol+}8?jhdI*0O!YDw9qH_}g4jj>4mjRA|C~hUC9cJQ zLwh`wSRJU53tn=#zGPI!Rdm<nh1+&I>J07|wE{n>MFImZELTFVN(iHL#{iDn1RJm( z`xkkva5!AQ-cda|Z!tL`X;HWnxek)sr`N7y6S&TXb#ex5?qdkV3K(>+a=&+ScvH6E z@^)-sm*9{E)peM4WiHIZ34;qYU)P=_#11qVe7)zClBPf9a(l%QLM4cHXpClI1s~X& zt?&y5S7Pq7hkZfYAm_-g4Di(@X~ibQ9*YTw-OQ?1f5ZGNaz!f7NErH=oJy|FuPC|s z4DrE?hfZTOJLx4DqhGlR<dm1Da80<90$3>p_yfl+lR*l^<r0Q6z$#UAU8Muq^o9Hv zTu;!_L0^ejTa;ZcB-g}PWT6%7a?O)+K%7HR>!=C`3Sq15n7!Baz4s|q4F2hpptogd z_7*fkGnm~g6DQ~)4yHch-ZRDS95s@eFK;6Upu$+6=5V)9F6mx>LPo@$+Y2>+DS=PM zfPLaUcEz~k)7I<*r#p1PPlbb*f*G2^Wn6HnEb&C;B)E?1OPs@%dD=dGzQ4?d5oA#7 z$~35RO-gJ?gPl@}K<4FDJY2_j(_IdL6}-yBk&-pOtvPB9(Y0io`4%(gOnoQ?n_~pY z(0ba!qcDoH#d8Ci$VHwAy_ouJzdwoB{c~M3&3iZGnG;7C`M1f7T=C<KhaUKtH0}fq zW_7Ua!XYQBs2r7i(&%AK*yfm##}x!@^KhV9h~a%<WVnEV&S9FnPOnyG8H-75AcN#E z3fN`YXztjdd2#TRlT}un-t|h<HNW1BQ7M*Swt}Dqty?3z>d<i2J;2G<9IX|X8m4lg z3$~e$&&Tx(0zKt3bPlN4uF6$Hu^)bvi4)~F`P@d;81j-MaQm_}F4^W+V_IE&1)uG_ zy;sf+*=d1CX`gMAZ!QsIbI>^7+B)Dvn0qnQ@v(|6=R&*rx}JjCG{VJPQAsoOrud!_ zD16`ugG#Wr!tAdF>pU-i&|vUT;((3=N@19DKDTA6n{zB5Zab!#8DUT?PUMv6(^KQg z(+9htxLoqF6L4fsJlTgiGpZ*M54Js6*ieuYhO1Ph>H)EB3}nL`Y7iqpf!XV73*Q5v zJ=*2Z2pj;@30;jF?Xi)rUy_6QVD^1Xn58LWC{I|0C|Enp>K2JPo0%k?a$g!0lQAAC z?f!=SXZBy<wNUa0Q(qngHJO1JQ_B1JFC|^Vd>AD`$BpxMSi2ZjHWc$;kP)#izhFd> z-?)zo%_+1r7e05W%*}CEoZRa-2<a)(Sx#Fq6>^;b+m8?jte4A5qE~HoSW0oqo|1=a z7?h!x^mC4~r*=ROt3_C4qsnX#8ca2053i^yLK)|^74sFBGl$CNF+*kf#Z#n3BQXcC z?ag!fp^DQHmB6}Y^|k)!Et8tvG}_3+`8P)~Vd6%ZW`43Xe~Mz=^NJ|@q4MzI?C>V9 zR}i}ELH>d?`^QL6^_<I_bNc8peH#u--NUftO9K7s*q2_Plk=z)^PQDv9@wIAT{3$~ z+$?Hh9HG-0YiG(h&$qodE)3UV4yNidBIX{E{q%J*t>^fEi%P^Fw#P50!JkrNW5W#f z@aHS_)Psxj-an2C!)vw`lR43s>De4VR3=A=AX`a>w55>!ikF-j7q~e~P;;Mvop`Jc zunuXiEtXZX)xOO;ve%bmTq-kg35rEaQha<a^siMA!s(6HUurYF!sDr$S5!&<qZc<X zbJpkEY~|GB4?i@Nv^bme-oE&(fX^_CC}X`jhq@-D+&$kq7z$>yr}9(f_|QGe4<B%` znF9{eh@@1X)##dr@){#)dT}fnm4|IU!-#lg4n|V%lM&Rjlekm)0Qm6FD^_Uxi-)C% zW>fPsj~xEOYm$`JSiYu6O@AUP(jgKixfC9M5_um)Yl7il@E|Ww9!VO<DIv49c7IvR zBZF8cARjV#)giCWYb<DHFmkM48m(1PPt~&1^ma)3uPbZTc~^{%fbI91rpsh@RX&zo z77=++MlRMDLFVAN7~Cxb!Ts5U=AnwYFbPB=eW^3V8rw52(v}p2&hCL#u~rVTb0=3~ z&b623x=BR2Rd+b&T$wy%aTX{8j9ypa$zCr0G?i&_CVf!ND0|rPIx4G=I+7rLg8^$k zPn&nk5dSTCas3%a_*SPjC+&!+?B#sM(z&{|tZ0p-#@BGm6;9nJE1Mlg5C8z*;(EOE zc{byVM5NKtOlzXtS~Yyy8?1vq4Cbt7l!uo(vAadG8;O^6(6=6iPvEv%bM0r!3FuNX zzh?qs$CPGqK&9d3tp>}<v`cx>@GA$f6Iw)N@X;u{V#7*bQXf+fJhtUzR2YPnJrNNO z*`foE8i|w^Kv9uaiYa+i^T9XuR8gjA&>PI;NkBZ~8F8m&vK-@0z=_zC4L8YiW`P-f z{!6E?C)7K!Gg|#WJXlH#i}l;<-JU#|IO&}2{m4ziLg4j&5p2FBPz5E!Z0TkRX$AVQ z;~k-fghq`ZtMz<0QC~_G9*M`TCME)v{k1iS6-*q0eJ<G(W2F7`i;U${;-aKCUzEDg z#7{BLv3Yrcw^Ac-8BEgd&On*E@^9m%Fd1>T4GH%-Ddx8dS`YY_k%#pis_8`P!UZ|+ z-or%oad2IQd6d;qnL@Om?RNhx<n>kQm||NOeVw}*EX7B@=*awYiwb?nL-dmd4-YU6 zx>38b)8aRGb|!XLNZ@UV`gZ4V2^BiXeeCM&M*k0)rU#Xl&26(e^o27Ve=A*O&por? zG0jWGT8ZZvJDoBFYNLz!P2|4Ge=5^(u<Yyd{SWTasRV}`6?Jd;>b5mzv1x8Q0x<%4 z77An_T|ESY-VP@}GffC@>Zq5|(0~8eO8H+#jK9j~sAv6U=2H&B!#2iQo`@ik!o^N? zUBH1n2<Ju8!|Bdl>gC`NZ7VhomJpc!{KKWp@}zTnQz|-5_IGv%c3I4cA4CvReF!2> zOOJU4XlkCB)oNmMsN80X#avMCVOFjMCNq^G(*<Q8xO`nq-=E!M4TzXMYesvpR19th zDZU9BtUZ?;|HcieSPh+2Q{0XBcr*RSe8|zJ^5x>M(*8~95e{2hTMsVIGu;Ofd)LT< z!~>w(N{oDtf8uz0wqO|$-|6JiLr#6Ys7Hb$+2P~E@^8?DKeVp-%P3VjMiVxqlk5CF ztTI`D%#WH1l+&3yb>rldQ9(qGxYglo^(U2ZYsA12>AeqSyfE8CNg7#n0+DY1XVLR= zSA2s3-r6(+eJyY4Fx^3nUS*+T5oi1;F(?OXzLYi_ig$Ao0|iDoZqJ5WsbniWy+?*L zZAS&e(WGqdQP#)(;D#)6v5^tUeJOjkwtN`;dF9V-F-#xbl_hlq;QSFr?|*r2St?ii zdDS>!`UsYW&XoUb!Oplx*Tz~LV)w^i<oxAJ<6Lgnh>$rQA1l4d7imEH<QwQqjVF4r zO^G@>X!C7<MknGd$f5Y=+{r!J>aH1$rgK#QR1RbD$@-meOGq<5IQuvZq8#IfH;vWG zEMg`3qGy5i9b_eL(FaOCg&DV0&Yp;it+0kiH;y@YT&__ss56{7^ne^A^+sd&$uhaD zZqr^^^*Cv}4m1B>?6jZBWV*k?$$qwxS;mJ)9cLwsAkU5JT=!%MD1%Kpr*c{y7(<A5 zh-J3tB>!~9RC-!kfn$HVHc8s=PL@%Q%b*<6<C7=#P5Jtk^7XbkNB0{T5#Choqn>44 zs7$L4O$viq&gqYm#qM}sGPP4XHzl#1;Ldc%U;ZY~kuot%oLSCt`K;dcfnozAd>*+7 zERd!sG>jP%V~6#Tj#8__D$q#zla`o>UJC#sFUDgyq#Wu_KECmb-w|Z80gKB)Q-5QB z_`Vl!blx9cbYW=20JIZTk#24ue$8U6==tME(in>ue?ZGBg~#46XR;#05=w7gd6<;) zTC_di{FPZ&b3hiZYiEL`)ZxaN@b_b$?0pvRo>zDX!_e6chFSJh5s`>PbmbifhMP39 z1XdJ1va0}({92?9y!L;h_oX`1Dnq;IAo2B>OzVr+m*XpwG?mbty^)u<L>mm8F)v*u zop`U=6tJl`%ZyrhHZEM{_o&^*i}QV;z!z`SM=^00W~ATv_zW|@^FC26fG%?{!U=q_ zS=op8*FL-7{#pBnG6Fr}Z{ee+nK5C=C;|X9&HYgxin7v4Y3g_eU@@3syI6MGxO?Yg zvSRTY;oCWw=PzR}ug+9ZpqTD>VKt(<vsuy9*>;FObQOw8rsKlGbhdjWodX~n(}c{c zyT6yN%0=Qnc$fhQcUO4I%pkDoRkXrJ->BuoxLw=~L4OT}+NBwj>rlqQd7T~mI=Rt( zoN#*eoD(&xo1m$jfvLI#>;On?zY4U(bPGsd)^_bI3ezY6U-02GP=N~=U)&LBF1G=5 zLInHvlC${8UvNf*0y{!-f^;6>6><WT_1Cq^?7fgPE>GSmrRqDZ>m;z9?kkQ$8;N|Z z7pY-R?$N0`=;4>$gD^FX>UZbH=nBZul`Q~k{Vk6LIwqUr)Fz>WZi)k>(arJby-Vbz zq)Dp09(wL}-bix3%8cq1TUs;)5*wZZ9RX7fdku??0MI!7mE<gb8zmSEeTI|%Y?scn zrnviBIikOS6YtrSa>GpFV@2cpOCh=z3iq=5ERAB}7O}D<&s|8awP}$V7_J_LlJ*AO zkOmjZR#+d;A$VZwV|rlwL}<D(T&NH7seG~V_5|G|v{V6A&yrbnpR0;~zl<`NN(bhR zHYnCIvrUOI*Hm`N4r&P8R(CEi;SW)LGwPdz29+LG(3pT1b~dJ#WE#h8xL4sG2A5Er z;Ftsu(8IjqjK}%%81Xw>JDikNRA~EQVxOz$EcZbJ*EDoa-OWb^`$6dNQB*WaR{G$? zkR^cefpHIjCP-RfpY1v!zp`7MjC<`JMZ6kpOidfl$2wg^0{Qu36SJZ*DvZ@8U7>yf z<Tz5<eg8q$So=4&aLt$2bZ_+J)Ik8Cn9cRf<TNysJx_C#cBS-PJls^ym74`B_OhtJ zjAqd8vos)?32H1}Td%_;7&6><09f{k4$zPR+Gqf+UeL+r&I$!Wqi|ckL<jx@MyXw| z%l`DaF8x=g@;gcV%rxysj~&G`wnkRmlb_v6wW$0f<$7vZY5b6R0+)(OYsh%>$#?jY zQ}{5v@uMQTIAGE*jCxP_Op^5Yqh6ITf%A(VXEW25W`tqteo2qGvefWANsk5nA%q2D zS4O60!H0CE_D~mBnu=2JY$n4~v8(FM!Wm425Fp(FY6)l|k6ESwHZOd%tWlP47_G>* zZe3UGK`M@c(R3FhNB)={f0!EWcghL3oaU|b1P!1?WjG$l0Vb_qalEJ^F9F=b$*+m{ zxr^|3uR~Pc3(uNoQfTX8kTolQzJN!lC!AOD`r7pnl{Xs5m-&I<|H8lWx-wSJ=lm+` z0pR)L696tSXHC_W!&MZXyCCA?<7qXMm>-|>kFMbU-u`}{@M5F2fc`w2A6g!bHJE$? zJmmXMPsaE8Za<9vFEjnp^i||eaF_D`#|r?~6&YS+v{v~1Jv{s4oZvTR#arx!HJ1lh zj^PY`5Siy%JkM%|cXxO9YrA#+AnBKu$Wp-o;R%3g4|jIaDr&xO85O&H?py<^(ygel zw)~+D^)+!Q#!t-qCDZ;P<JST;f#iewk_^92p4X>YBUD%&^ZyvI<Lb(gM`iTawwof- z3Ic(LV`2Xg{u<dFz83af^H6}tINWjqDCSca$yr|Xqn}6N<2wqOJ{k0nmX;&eaW|4F z!0W<%{x!=B5Pr{?TKR1s;Xo%Kpb5ZjfBs!TnD)Sq@LKl0VhP=}3ZNhP<qTg*c#Zp+ zYlL9!#v$j#|9D(@>NUWqM<#(fY3+BEaAZ>X5pGHHjw~WG5MS`LQ1Hu{my?XN!lh?B zEWi2oRjtmdAEyF0?Mc@CqO{E8f<KQrvJ!6zI5b!Z2rbsS3RfP@{rUG8!s}5vh9$%j z;6Q`!%Td0oAYQXB!T#!qJLFG0(3itEdv$ny^vp+A|Ih_*0`;k>U1hv(O=Lo|EMV^M zg{wF+d10-o%Ny)?d{Ff%vwxZ78Oeh8oAzN0uTK4QQ2et}pyTN1sTltAZENNUkFg^D zsFSbev3k%*t59+8zaiAvsr!Q@Umkj_xTt7Q{DJejAEc+<?EqT-k#&u{w%*Yc{vS2A z=Nzx&F?uQ~DT#H<_u}_%0jMI7wRrX0dT;0$2PB&BZwEA<we9o115R7zqXT!gDwG8M zX!0~(KSIpW$*E3rQ``0*{SgQ@FCGc}%ZI#Y-+9T}EppCqc$X$$+wPxkvG=QlmIp0Y z`17SG{bMrha`wDUeEVnHWjn!OEt(%&_kZ_<0w4<hF6GUEX6M-G&lVysdn=4=+IR43 z3J`4H4<U^BqAnRAbwAvr(*FxPFYSk!Q%(ASPQRipFOv#Ylsx#iSPF1Lp?WpPTNS^X z*th7MjY0i~`4dv}^76_z_FL(FXZtQ4J1(ResrGf#2&RPB+TBP+o&ND6<nAw8X)Ug( zV2Hbo{nJNgqP!_ycOq#?LDdokw$-ekE&+n*+7VvR-9kXW_Yzaya=u|dl1VT3tkrzm zD)^&RfQ?TpD=YWkp49l>#y}?UhgZgbO@AGJy!GklYt+})F<xFTO>Ai~;_|6`d>@Rw zOapABYTBlauoWHr*^q0Yrd)F5KSHe}p{vV+`|c$ApU>oFuV(01Kf95v_is*cRbfpV zaH#3Oq|$`^xuxZhf8>_0ft-*p+qafyO<H4@w8Wsn1F2#k`o3hQ)15$yp|8$d{~CAt z!!JCC@A{i0I}0P68<MJ5hR=l55`8~@;>S;=z3^M9`cU5xq)MDF33eJ^Cbi8}Z06Q8 z!7(8;m6f`IJ`}pQx>8x&nBCG=)doA@NDqs%b(0JnAFL4KOD}*1sM@G4ExpKXdjh9^ zo<M1Scn#~smyJsguX=lTYCdgM7a)|>ijKUF^$()M2>S0e`?xTJ!Hzxn^T(}v0#~$s zhiij9o+nG<vI@g>whHD$i{=?4@inotwzO+8%hu3NSkBjV;40vG+MBW;kBm5RZ=Pfy znQYzg;(!IHf4@{8Y6=u07niwN1d&?3wIE>nz+j6pEg4ixkX~%Hv9k=TXpLW|;kj3U zaOv0EY58VuT_HUIAMY4z{^QY+I+eTxn*96Xv1Z&Qd?VT+uHjcESDIw^AqX#6-k}Tf zfZc-QMG+Z=`JvS-uaN!3T5FiX!i<^imZ!k{kD8ZT)OF{!rAUZ#-Zwp)X7pG9%9Iby zRnXX0pcQ!1rt-s;^2LtMAoVqky;bA&^}+jOWMo*ce75lh_V^UT-YZPSsAdJXh9|eG zhMxwhhEVF$3f27pRztz5iVq0S@GH-K2@tn3^p&c`o@LatjtJ{6cj?J<`&6nZpO$&O zXW)0`>e?=pXaIPyZuyu353iDGICaX#&3~olZE~L1My!|~-uQmVX?EEWiz{UQm!IGX zSyMRN)&x*m7o;BS*qmjS_SR)pE04%doA$9j-)5<0Y&B4ET7FfYVJm=F?2p(X$ZV=9 zklmvc(XS>GLV0yV&nB)$-Wc}QSr@DBk1yy?$Za^^&b07_-Lz6M4|os)S=uyenX+dW zc8dTZ$ojJm@__^<ankeK<~2-IUVi?IjU76F+94NxqU5!dEd}5ee9nR)ewWV4{^|#i z;p@}o`Q9+y)umiSKRu)n|Io}VcO7tM-Da1orM8wIfQe|X(mymNDM<b557U`cvFOP+ zbL=9O$X2rM*0;sQvk3Q~*c#Vgnk$|S4Ig)&ZP-YqOsWot#hs}oe>@NZLD@{lNNz-K z97D^tW@49iKk#43c!onQNk*Uztrx{Mw`Il~JNQ>Dv{@yoY6Q#eu@#_nP~Is`sF*g# zRUem~RdZSDS-#EPPJL~cqAGNI<y;k(m~Ut;S4)JwQvAHzrs{{)<TZeAc}&_DJ81>t zvw|jzg(r!WSvx9LvT49tb7dh42NxjtY55SI5yFO(3lpL!_$9;ksnFN!vDcY6YUY^j zN;2pY;HBW56djjJ4cbug_N93N0!K+|ramZKKh=+@I9L3ZdA6GEd1TUl+h&p9QnfT~ zuAI<md>&Q9;tZs8!8X>WXr3ac3ZJM%L~WKRRSKa!yXIb<`q6tOaW0=e`wou!G>1r4 zliDgdYS~zLsek^io?pU6KU?r8c;BYV2Wxohr7y77y-{ZeD(P*qYL;E(r7M<CZ^Kch zy7#<8*et=Y%eVWjSXRz+nGIOy>mmrJOS1h}YcU>6D$r2Y&6X9-opCLsck}BxYysD4 z`O!bE%?x8x=Wm=JwdmVS+m%mezJ)XtPZp!v*-E0Wl{E$8_;a@`6u8BA1qh6J>CTL` zI6QcQ|3V-rr~9lOMJ98LW9?AsY&AC*itc<f_UHV*sTqoe9pyr;+@uy_^=(^X)sBmx ziz5RIpA3p9Rql)UAq{hstrz#h(|n?+;DF-t<i{Mrmuv2NMdK?N?hNnG_aCnRo%=_H zK7i~fZ)y3NzOE8NZW0Yot~*Qc=Y@93O>Pl!KR(Rz>YDQ%#t0BmMM^j+)1KG`8R?WQ z^jvvu=Q$r)b=othgZz^MAz@@M{Dx)cxr$Db{z`s>lr|9Pr$L+b1fChEA{v^)(G@g= zsp9V4anh4-jzXTEKw|3C7$$?{X5*kx&%HPr#l+4Miq^Tb3%Bg+q^Y5h<6bQvIBw@j z4-G3!=&_Yw;$FGbZ5a^Qub4AarMo!PPFj=5@XlAHKDPz}PlJ9Bp-pt4$zly!5mr6w zL6tQaacEW{Q$!qgtMHx}elxW?CDbznVs*i<T)5dOfL$3UwOtQ4W#ZXorK>|kO}|#w z#;OOZ;EyDFw8&dxe?Q8+D{!~%i5RNCP)<M0Q-}1-?tYCskzg@fFXQ*ANZBQI*|J*8 z{0=QMluCfiixF>Y+3s8+)aq<leqg0*L64V{9m6^gkLe6dsmHGQ*lE;PJe3*GTMhUs zTmTao#}c4*jbfExvPFm;_JfR%M1|@RFnW78|7q+8m+&kL*2S)whP{&YUCT_=PRj>f zq_d}@FAwzYU6L`|i6%}kQm2aL_IIL(Q6!af^Vos#M*PF=%$qgxqOVMfOv3Js7F91m zo@c7|>DyUWilc@nC}FQTGXt+&sc22y-TD%KOJ{L->hR{p?7|0On@9JlAMRDp@%C!) zZ1Dy<TZx(jb>3S=L!s3`>fw9o{-@m+?0s?#@uh^{t6|NJHyn)@5sbw>Pg?!mrZX7R z5WoIP0A{u^IX~y6YC)l^V4By)36pI~OZeu_a&?2*_0AkEjER~rd2SY@J7xqlh@$?= zk#b?$c`nWjki~FkkVYPD=Vhbc`04~ZSgz8b&*J}#`V{Da9+n%>=W3d(wvKwZR2`pL znQ6Gu@RtE+;G;f6RXhYDyFSoU!J?74_<H)8r$BhzV*6`FLx`}rbYfqF26Y-Ik)Icy za9~(<j;M06M+xo1VXep2iy~yIur|uHPx6p4cUx9J|INCiUMn|Rop45U_a&m*{ixaM zlc5gB#^+^-%6xp2qTh@dL-XQcfAvF|N3#Uu6Xl-PtJ};c<D`nVx=2vf&$gXO<9jTv z!5DHpC!3cE?0S38Pnz<aRJ=bF;8&YR_Md-^gW4e-HQx*n9)@(SUkqfTitP6sGw*5X zS&-V^@C?WZPZe0d%fCCf&Qvp6RU%V<C)&m*BDmpVy;-ojGVpH!X4<u&tO-PsSy=R$ zT1VnXq(`c%mPW+h9rkt>neoec63je>b39p*$4DA=3*og+;y$(qNR2i(u!~i)yR^vF zC<(rs3n#o*J^(3qZ?fuuMMm2*R5fF7Rno}Vf}7R*;0<=IZFs+B0j!bbdt*prJk`;k zbN3g%w>V%e@L26X|Bb0AD^6Og9<pk+&f&+my*z_Vyt*oGdGCS!zN7Pv&M(rHf%Upm zUqpO%eeMfa^7XVrChg&*2yQr_0;%mhn{A6{H;Fl0yD>!(Bk+;{GaWypY7cdVL>5I9 zp`$f*jCuMsM;KAGX|7H)a2*ADsWlwUC@=|Z$cAMFi!(ZfJ<R6#8Bq&2HkVm~GR!~~ zq4i22mwAng$w*qf+y<dOw>Gm_?jhK0O_BWJTy6q>Bm%;BX%pwul{P2NM};xkE70x3 zC%oKE$6nE{kB46>Hf(19KC4>|8Z4XmYdNqT@cz?OUNL;&^UhH)0Dojyx4cb(`gw~# z2-Xfs;doYie98?zI_DiG|LZ9F{lmJqLRAhQd<V^M6&c#8#JAu}#iUEmZBz0O)~RFY zi&x9eri~p)9X++sO6*CL-c0gE?AkJVJSmH4LV$dDM9J8s$<iDlHBOj8+d?G;2sIHZ ztV$-A*>WDUL}q&5%e!s6I{i$`o67w2RL*6EUyhN5j!MqyDEY6mWToxg9W?mrec_*b z{3Wv)-p^g6ksQCe!AT{^%jSj{94<Lc!H*f<!Lj!}aiZYGY4sCmKYE4<vjwZz5zlRO z)WjYdh_7t)hz)vlobSr0hzO!m;rAv8+V7LWxVH-(zfgHarK1}3o&==f16Q52`1lBW zLTGorfOkU1Hth?K%FmbMK7G;1t20LLS3OtuT4yQ#o0|mpd3bVf_3(`aj}_Iy$$3YA zvlFp`<l948!agGf<k!hrUi*})U3En)XZ7~KIq-?B+QGh3Ua_;FZV<J{`hn8y^Ux8} znNe$yn^V<Ddoz^{AxRvAvFDD>nvVvKEH?&B)ObB%J+ZyAfp2rn@Z!5m3S+;*>4mmC zuP=scF78d_dbHgpM6Oi+VSCs+h~CB4@r6|!m6=_~*F)oV&+f&Pl_`ClHn7St^hFSQ zVFe&@ABk5Q9j(Iq^%gDbtnr0=s>#CD<A-czr9bYEi@eq&>D{<g80?{idkC{91SB%T zO`8xii?g7+0`!IWl;)UIrNqjW4vSA|k6z67iu!0)1ZrJqs@gb(kB?c|4q4Gr+a<YY z^kGbN@Nb4y!dJsrXPl0e_0J!Dw)7U;Fp}Hrq^L-Iz0^MJ-#>BjQUOAI78N~>A2aY^ z1Jo-}C~l2`VnJ&a><Q4W&qT;+G4Q?J(uR-#RfWEZ{nu9f(tOpxPn7s;qE;-PxjNcp znW+9zr{pZ|CJ`s6Phe9FkM~{(YhaYEOHi@)Rj#u~&w;4a_0O{02T-eRLaP%3x#!j? zvPo_diNyGx?k%0m<CJ;TD9GV6wdblNJRU2bpq(UjHK)7Po;hWCsetchogR;CGDHl2 zBiEj8!QZ?VZqb^IZP)ii0MJVHjE?HAU_(!Z-O^7J7pBXn1OyW7G4JA+C(BCSYrdaq zQRI?Y)&ldbH}c)qfmxU5>nU@7#kD@Ri*SN_2;}f>iVP7LIy1`}{$h0aft80-ybRwJ z<mcU>%R#}Ge{*z<ot7^j>AmqA*1@T&U$awDh;$#Yli?qU8k{bm<+Z#ezJZibJ6k1o zxCyvVNAyK;Woq9~zw-QuSam0;dU!c!Nv&s$oR~?0ul62Y8h@t>)#`8Ma{PC1#<t@j z5erNAmYvv^-Dgavp?i9@iWj<&;PZo)Tr4&0V})3zU|tkN^ftwnC_#gc+oiEimdrjD zLU+bZITD2U_|AetXuNl&zHvAmz4_m2_nRkm1uo~@RPvRZR<YKJ34!3todus$b&dly zN>#X`gnJf2)0Q(I@YpP1&o$&q?(M(4F9?wQe6JoYNOtb54jedBYxwMFEBA`;!zuud zflE&;$Jw#F=ey%GsNv+JNLrH9G2hDirS_>1F(@+mVV;78;|9K$08{aqg#a2CJUT35 zt73H&0q)UXJ}54W{N*#-ar30xIx_(a4*O1ou+scToT{r}6mB&y(91^2?QOm24m`ET zvtgG;Tu*CT$i~o25Q<cXYp>M_pouQkx9hx)(tZX>QCbvb6*jP{Uuf)LcJH>b&3w#i zpVGPh7#}d@FGhq8FZbXOzBIUUag{*TuK<7o^2-{r$0@0*Vu>F?ej#3Np6p*gx+h+b z)ju!bvG5Vs;|xqCSc;fYZ&AAewtbiiOyt2>rL9usb3=7ao7WUrk;mT3=E-uuo`Zo@ z^(Uc?4tZU}kIZzt;}cZS?h4>q;)v@2^KD@my8)Q<*{P9}R|D7aJ^e~%TvGwKFdnt| zv|sKEkHU!5CY#t@C%n9B+ZLKoZJmhUV>Y>GBAD=!5s`cM_r9J6mOFmeF8urC=xnZa zR<gMK5EIv9$%(jhtiVLobij+t>dabhfH`AP!!Gc+7oR7gJ_DWlAi!?eLa9AV8#(Fz z<0N?e<)2<E31u~`B<?5T(n%gHzJe1LIjSe#BwO2(9C@Hl%j{EG;P}u~V|nX<q?ptb z7-)x{K-HmD+%?G%nq-7fC3G~ZuDx7)@L-^82UhN$-&ARoQ_3YoqPs$L?R(FG>yL#m zhTe6)dw0(;9UVm5vI8E^ET8A+yQ%vH1!8EE90I&9PXu8La5`|?jSRnG+fVrcgzX+d zoIv+Iyg7A=h#sxfQ%tHhPzO(v`Wl8j=-dVD79oWrlcTi`c9$|CAMiny)g{u)b=851 z_$d3-{`TxJSP0uvs`G*nXnH=X;a5`ntqhZ$?Der+PR$O~v11X(cTz-m8ojExFi>nb z<<&?{xc2+qL**n5ri003yjBUSeb$ZI0MwxfYUAiJiNni|KuNJb!g6f+f#LbMgxyeQ zAZhSuEc4S}C8@lDXBi12#;81oivF=jC{$&o3ArUKe#Qee#aLMC_k7Kxq6QzPF3YG7 zJFZp@^~=dEHz;cd;b3=!4dLqQHj6<3E2KaK2$s!#jVETca~Di(y5Cjia<?tTQXBwE z>E&dkAaZ)WN6@X~(8<IDi|e0Mm20pk`Nv-!eX;e$a>{%i@P_*9^7Wa*C37E$MzSxP zZe;bSycQ+b3nRjNW^v7-l-7<qoF^N94)El0J1`%<R@3iEfQH!-$_AJ;2Xa*{EAF;M znS#38bA>El_1A9dx2LZYC9LP>`?{>06|2NE@k)GrvR{kAsSqHpfpD+JsO}MrD-fzW zV50_<?9)EaIy?AH+s^{Iay-W_PS{>X1X+R`UKB3U41sJCpQY~&jB2LC(|grHGie1c zB9+k~>>R(U|E==P?7x_@!sS!^<76hB4nPObSg9+1I>(mPPZz(e2&AM38Ks8m24Rot zD7FNWix+3WQO{6v(?KL$XKjdhX7y&vv*;KSJx0!@4`;E2Bcbl(WeM1R+HGk<A-&nM zhoM&`9O;W)5PNZzwxvFII%sn7!5p#M${8U(kK4d^lgAE!|GMMBT3UrVz_=+`8_w&S zmM~NoTWPui1pbis&wXB5gjI}gp*>P<EfpXX=Q;W*F3V>LrqT~1)R)G~b0%rqvePhC z_hdjXW+-HS>?iG>&B7;gJ3#Lk!fKTSwZjleqe77E##*wDhZWL7zJEQRsBN}(mYG{~ zu!>3b#zr-`iEvEKWzN!FVV3Tq<rviZDQT&(PiT2dbTYCb+1bfgD<ZMs)06nhs||AV zLFaiI5KBqDJyP_FffS0WmbB99J)v9Q^uF3dt#0laLS(UZDTdO_KB`zS_l)9Twcr;$ zAT^KJ$ArYaNW`V2ybav61f5^Rv0*MxcC#ge9~B>OH6esC-7paQ<n?@ie1~15HzS!W zpm3?4X^;w@3=Iv-pZVxy{c-Pun824}e!?@MtI(Ci2M!WZdmFA{3X@vWH&c*8W6O+d ziR*pdB&AmPyPRBrG=cA31ljOdOO*jCr>#?ZlCgj(R1XAp`cjYwUbwukgvJG8>>2hG zCVS=^>kQt5hThvJ*vyf9VSSkjFD>LIGsRWZ^0{eEA!jv>p?msI6r7F(BQ<zAgO5ja z^WFyoUg_Gw>K4<rLr(YDPrjR12yz^UFRS=YIV3wgD+TKDF!3w^S}UB+z1BDYl*}|? z0m9a`8KfT$L!3dDYN#!`)J6@lWm@`2)XdGxkorE3X*H}8b+jE089;tP%`gx~ka7tD z0B!+(HvugH+o)jW*2tY9v^odD^6B|!+Bp?6DiUKK$3pAx^Y>pABrsT1#SjRv3=@s9 z$+3Xol&QIJI$HMjCy!4I^@vp<Z!C5%`}x>{AID8Qep0pRei*bDSIGPm+DSTt4?&NV zrr#d|uZ$C?);|?S>D|q(PL4Zuy?ry*l_f}+-WH?ij$0L4mPN04*G~w9&}JC&5^*xT z={*ICt~-&CU4Tk-0F{jE9b^9GWV+AnwcUP;9yt;R*4uE3`IqY(lUFD9P+W)Ghm9`x z#Qv2V1PKq^+>+(+HeR^1OR@0%w(i@wtD2Zmp=+{PVn)L8^|UB;^Fnj9oxHR-gOZUf ztTmkc%2MIsO0ud^A9~I%te`2aaK+kX@q*)mwabM;oV%T6oatWU_nj8}UJ3L@)z+Ce zt5w!ERWtbU_Yv2;@$5#8lbz8)ck8nY-8T$34rn!ZV^g5?!%Mv!g}Z%?C*$;7nbqNv z=$;Gx0N-7ckq^A`A2fqdG@gON)h8&WNq6QZDzz@qrg=j1@jzW~?4Uc%R2TtjoCUel z4RQp6icZUf2_)3)!9J`h5IzyQvZYY?S_z8Vcl`{q@#Ji3+5i^=5P_)38YU-zM5`_G zpkXCB8SIW&Jv)*s$KzmwI#RFuw$!Eut*CmhzIJoZYtL_F3OwPk8yVV=i6Oi0fwygP zqKGLCE7ahLF5}o50Cb_2JQxwejU`ShCn6H?#Gd>haiYAAokhP`qMj7-YAt-})lvAQ zT%|iM9uCk@#&N7*j08&I`kviHR{vmrct`hJT>K@isN~cNi~@V!lM%7@^5<hAqd?Z2 zk7-ZkSa0k%EcomOz5rdrvfn8ccXe_&ARGY5F8y%=gawB*xTzw*r4T6H9n1b}qP`A+ z%qMCHSfL$$FSF<bQiZLR2fz!bmu8rxR$uMD{b0wcu2=5}p4#L!3mtfvC@tTsetIL8 zS$)7Y%*QD_6!(sTu(PC-OkROU%|Hck&kA=tmFb?5XA_Sbj!{QOM6}bNt<M79pYU|N zB)f@vt*+`$P@s!iQ*vvsPiP$a@+xYTiVc4jM4l;}qg7S>!Me}(9~b2B^%)L`$UASQ zfjzT04VB1Z`SR>}bK&ji*pFPY3Gg~y|1U%CdUnW_5gl!7StT8asd=OD?djv$HSPhl zb0XTIeUGc7WRQ6mrOs_x7VDcFfbKB{K(VHfc2FF5q*9313K*+c|Ng8}vG}=_K)cDv zk<rSkJxcTYYUyHXN47Hbm^lqc$7;`s3WW-IgYSh0N`{q0vC`e_C~qW$o*4N*4@`5p zo)xt}u-<cK+T7FA1(m%XrPVBp{nTDd9gYx|g?mC;9JFLbAG91u04Q!9axwF80m!(j ze=;DOQ;`}V<^j4B8ulvTl~>CsavY9Ytr$;QR<FW8Q`p@zbzwkGEWYknjKue5hXt|H z3#lerA3h|hX*ars65yS{YNZl5mh~3tb$Mp|3hjc>9;v<VAn7C^%Uly&-Z@+xCVm`( z;WaQo*8LAB#fSjPx3e@R=;svXE@`XD;>8{YHWupOrvm-PmEe+DM<5y}LSDGocp{#o z1wtU#WOUAGRw;Yhsdys2wVH(+L&K`BqIwBNPK$mY-@!G}y`}T2+UOkvXC~n30%b)e zHoja~TA{0iv67FT_miw+=$!7b?$nEjWD#J`E2SY@U7TmqD_W%sFVJ5oS^eXK9?VRD z7qJC9lIyC7ml&nt@7d)HPDSC#6O*^uJBf6F;J!d1B$aQ*-h*VS+T<3xvYvO<-f0e( zJ0ZACpJM|345b3OVt;^di5S79Hwo=JgG@Si%UEP+(&6ze2ObuB&eZeb=6O2--)zr$ z|9iDwIVR7Sb~CaZqf7=~os6hTFLgnU)Rs*6*EY1Ii%V|765TP+a|J8BHoDs&D)e)^ zN1o=RAiluoc7nxe1^4h8Inn<mPUCwZ_1FW@(6VdjX@Aom>e#T`fKn3ZURU}P_^tB$ zH3cjxz3Z}pGWHDmNoymmWWnLS!!1j?F{ebH949q7ipJ7|JQn<wJMRx)LL@L&=9$wT zBf7XAx#0=*{3(B6Ay$i{MjSrnxS0l%4$)k0v>q#<zNtIo@cd)^GIfgtqgMFCU4b&{ zFhlR)Sjf1FyVi`FL?*k~A`r#jxSvzd={YA>d4P1j#a7Ek&ckZuHf3I;Z~h9qGy<(y zQ0_iA9Fw71Km}+(i_S({g>nZ=P@5StKt(5W@b4Tu`>drc@GG-<SP01!O$YFS&ok^j z`T8v)$9K#PgqQK_(Bc6azi&Exd<D#yiwFL9h!J_#&T_E>_*{?U!niuZNWxUBUkdCG z?!1pp*8rr_J>}T5|C#)FLc`JUoVqiv&p$c~6xlyV3o_X4ee3OHCvz5}RyIt*UtPXy z1n#lmA1dAu?B5N<T+tgU8|5f&;c3z40KG8)O_^D_d$-B={^!*5){;Zth;1r$s!}{t zceP8a%lN&VCB(PQHXfd{TJMhAydmUT;8+=P%&q6jQshE3uJ{wKA^DDBt$*N?is3aj ze)LRI>eAP(JBFgbk_sf-Cw?n6CTl{EA|Hzi3r{&j>j}i?D9Bm$ED!13g({>i$wYIl zo*hY)p3IC3>0f^0CtMQLQj9dBYNe_6YhCU;?sDD^X%B><QE+1+T2U0$-sNgt<m-a! z?3gmE^<Ip)kX2}nLD+F0l4?6+*FW!c$J~4o*l?|PVTWHr?-1;q%@%s;5L3Ha>r!`4 zq4n7|OU690`n8uB7rH^`%JEh4<siv@fha86>@!q)8Q?POE%CKBZmOYG0EJDmG48FU zBWCB)r;tycq?w(=J-Xr|lOnJwAEGjV6w0um_T`7Ml^b6SBi?U$58(b_1w~n$kq9EB zKUrf=-xcLpJeTZyO3_9^C2F9~RbWVMLNAPv>6=H@_e42D99QEgbHzC3pWItsm)zA8 zS0e4$dquMK1~1BqU(RmW-N0!YoZ$w;2TedHfTry2K`&>Q``W|hHLONRS#KLu{g@Aa z7Gc*fui&pT`3~+a$#|>rMyxicT;mU9Sq>p5w_wkUC7`*olm1SOp!R}#QB#+?`?AUm zG+8+c%8rSw`me;Zd;{;U2JBs!+_2XgabjiP8P>U$MY7K;libT1bB*ap*s+WF_#xKQ ztw-uezT8~-y*cYsn{%r=RTQGn9Xn>~Vkr8D7-x(91jSWS7ue@*3*Z_m40L^VeW{r& zZuT)ZBmTZ{Maw{Leu=wo+&pJSzs$H&zFv+JP{~}6HB_*!LRiNH&5l%6KA2f?RC6M= zRE<?&jQ^4GnLL8!^Oj-+s@xh6^!ND?zeLEXACYfCr`fwkN!K}>TRK5p;0<eS*XB^= zQ(PYVz$S9L_U?1U0X7~1ir2zDH{5#v^t=`XG|7!Dx<fAh;1IyONZP=9LP{?byrS~1 zr}*|z$0s1uB<17@=6|;gYw-YONK1YFUH^Bt(KYfnX*V56Tf)xI0v}*<%PE#G{V`g$ zYl|u_2c;6=GQc*V|NrMU_w^<Ezdf@Xpd|_G8sfx+<8L;7*-PU)T3NW%>Tlcf<wFXM z^1ROE@*<r3H1x#Z8d(?fWf#qdW`8^6+H3g0Hqb_SV5eO789UHR_m@RZ8|w~TQT(!F zMO=W;_4(r|yf2V|<tw3R0^IfQ$!<To>&t!}p%5D5{@N#CdUb#VzX)(SJ-@5sCZCr7 zYIyhaHl~+n?C^d=YhS-W81VKV|04DVn9diu|MgLate{YYkk66Ozg79t@e56)A&khC zT>H$1Bj^qRE~yd@=*8tWvbp!+5&6FbHR;JuS^I8KB)@U>z?eI2L$kdd#b1o?@T(tX zO+hJ4(me;5Ut2I%AM&tR!bVl|e^U(a;xE06NdAZ~s^$y5{$FB$-hAyWPix$!UD3j` z<Bc=$uc6f#x|uI#nv?%GfL%i}=Qkx#f$dnHc=y}?{aD`qP{BlA|MTTtzwa-*8ePMB z`9fj9hm)B*JqDw<4O0USEwQ&OSXC>}%r1ycm+hPJd$jtgs~(~mY|9xCJ8<e0qB9o8 zab}n0qG_pwV!3(mfc){X{$ZibFYJRj`g>Zclow|y#jC8y)OlBqGrlDxslbikH~8w7 z3}b-aHllHYkv8jnNGKjr2aIwxI06f)oNF`!Ni+q~SGcbuENAc72e)eW-P#ehtTyW? zCYdx(&K7+l&ncZPQF8y->5S`5WuDA+JasB&*>apR?3$6B)LioBUD>RhzgyDsi<jQO zecX@AOS1>%kMy>+Ij<%+>ZBVcg+a?7MXl=2%wke*1YLys1j)}~?1SB#&KuL_hHxKe z&!!ZNIvrYFNEoDe&Ga2ip<NB8bHeOHb#M<?dgpCsp@CI)3c^c%LuLCEPM*R~W!S|h zr^=vEURW4)Wuea%>v)R&A*dVMn@U2JB~nC|yjjdM1qrE|MJ;721C6KHsML)~rvZ{) zF@CL$d;R&>(2r0)<;X|)lNRXWLd>=Fs6cdfeVkQhk4?i099L=kPBAIEK~=>Es+7+{ z(KD$7Zv9;{9>9rXGqXu5P5jaQ9M{{a$8jxPDz?Cv<3s_4S}dq>>s{9d@6av5K3oY< z`)t#z!3ZibsIv@456L9Aji`buiGmKXzM#>7Vfn@0)M3}f{liM|C{IOt$lLXt^|>o* zW02>t#LBmM!L2>vT^YWhddYW?^3=zcS4@cOLoz}MFmPRTh2b_yix1haWmGM;3PLJ+ zMnvj&I|&9%kFCeucplu^o0cwrw%bVn1Kn2^t*B!|&D@XuL-UyR5p>-w3_4gDDL2DR zwYINr+!~y6kE;{Do+G&TfGy`9)@c8H#v_<Rb#rtPY_3h79j>xtrs|Iq+t`AJVcbJU zmJUgA!_8sGZAE9ROfKH%hTy{9hx;%{J}eNsxouHt$y<#M+9cScaF~(mO^@Fj{(F_G z6dTnlNN9t6`<6`OUl{{zZ@jzUx2Px-G|Y_poQtju{*VCwTHEaT)Q*?;)>b<coArl* zxaWcKch3r~H7nw%26o)z@$SIB-2acZFAqxsUHi7_G&NdUC(Fu(DW|Ml$QG9royp7^ zE6Wyl&An3G1rdd2$|z0EESF3jYtqUT+!s&^Q!Ka45){F3Ur<mKR7Ac9wVCF8XWsX_ z-uHa{HP>7S&vLK7`*+{ZSoYEk7UJrIQq%Uu#{b1IS^O~_sLw0xAHg8<{;$m8<{v<N z*7z@Ln*bH<zc7b(*QP{~YOlMb%+F;P_iyc7z0|&}Hw*r+e{{fD3VN?t+w@<X^VHsY z^^{~luUxt1q4~dY5mHN-5g7^lLLm)S0V`DfcPm^x@g<&o_r$Ogpo<O^mXvH-EVhx} z15VAq-IUt$G@>ge#=llL{Qdoa!De?28|UUK(eID^?Qt(r!-JEY@l^Gc9Kh=MyUPP3 z|Mq*cH#D{Z&iDW26{TCod}jYKT57+A^pk(<Ccf~!Qxkb>28RFcw3iMBJ5lBg_^2a5 zbV0lNo<GBlzq-ez4+GMD{bO$_P5F41(chiS(uA-B8K8!&_S$&me=QSU2FAal5RLY( z!cLkC&t>(s@6OPfKLvi5vUaHydJRYMn|^ZzGzQ#g3<&!NpOaDn^r`q7WgG-Ke^G#C z&wQ*%$|+CTr@FX2MFjF|#Yz=Y#-$vwFQRiG1>8&br*vKEhh>ciBCqxQx$PE`(jr@2 z8n3MNk`lsqyGkA2E1lr}b&^n-r(YtW-JFZ@i_I%yFlG_p05gkj{D+f($Pd60*%6H4 zuh0up#eQ|<$rsH|2C)s$2C(^KOLSbqtv<@bfs!kopS+vpPo2XEI#<Xbl5?RjSOlhg zhQN^TEzr_!@JO3-_WuSDQjdEB_MT#>_m;(Dx+HL_nzt^Wn;M?)d0L&a6?*yIK7SIk zQAY!R3Lp~S{8*F^C}+ID=?*@|D0sdqXdxFv9E7ed86BBFp<8IEW!bpDV^<Yz(WiW{ zn;}*f#V(qyeKoA|M=l}lO8d@rP2}{AXtwk#b>N-D_K{^qORg{uCMifmp!QE1R`L*= zqD&^DWA<2C1H)_ZaROrCQTTL}#<9-gU)(%`ZIe<w3r~gP^?w23!|#baWT-b}Y3avK zoTXKqN$(NpuCf8_mxC^f2yrRsemgc!Xljm8A1mZP^*eBRw2P@}{v-2PT?xGN$E6h) zYx>XN^?#GHf0ySB-ra*E=Ndu4hQVPMy>*UghB}*|f`;UOpWo2b;*#<_<{_eb4`&X( zLZ<gE>NLcr_IR37#+EDUeKE&M$KD6vk9YkuI-$wc&aLb*fOW>PD8MG%dKyoA^2|tM z`CF;1tottIkF0+w-V2z2RbVXEwcD}t=}y7UC&X{R+3Np{soAnlfy?8zox9^J-|$c3 zrsdqO(H-=V+DfBKlN1<`Hy|1v2ZA;*P>(#e22GqBxBVb~OXeG4H?FdQIc>++VtRaL zyPFSTlivf%K><{3kNN4Mno-^yO*{bbiw6<?^ESx3L{!*Z2u42{4s|2e`?x>V+1xNm zi?3}?eqJ<Rw+XQti>9NYAKFnrJR7&_6W_Om*t47$PCw1?(o+a6)07$dP~Tm9h?<`j z{7A(Gw3)_jLA@+Os^G(_16!1v4V&OOq5?kr=3r!J@LA(bBdn#ZaA#jhgrOf9%B}Kw zKHHQW4}%<Ti~l{7bSkRb?6JZ4`>-JSQ;m$f(G8Y;+*8@!w5mIaGfpdq{`to#NZXxO zDtK*Ny8TkRQFPxoPiXmfE1o^-VdfqDQ0KUY7NXngd|%Kv_DHU9j*`1&YERUe1HMN~ zBRtf44HDqqICK{(@z-bJr;6HCZRnqBj3=Gpfym!ay`A3Bfhr_j`R0{YLA-qupK&P# zb)J9RA@ot{s-Br}la~Xt*&M^XXIu8HIu6q^<>vMVrJ{=XhxT`ErWVb%j^+J4XlAEV z$}@b;-Ts*8nA{X2MqTdO){r~o2(8nG{wB8!u<ZAjc77=wmUi$g-lH3o*D06edA}lM zTdcN8Mt4PU?LDH)w`~WN>|rRQ-~xK0aF0^dCsmVPdQ3i|TrJ7ki*=J8!`%p|QRha@ z6rHxv`hG1{Q;_lc8SzN<u-9;K{Nd(W+H{~bq<ac=b*Ss`Yw60HN@Lnu<k|+xO{R9L zrj`Y+8iZGtkF29{4BNJ$TviRLxwfb$&Z}8_rCwDZE$o@x8=S9FM!KeRW~pDQ-q<rZ zI1y+FZdsN+9RmYYxNa}24|w)9|8}yq_EN=<hs$RSy}C%Tdw88OS*%rztSh7-{)XG? z4L^0hsqUlXRS@eo9|GhS+|xVhWxnNAGtdT)eG4g}8V$$V%_HJxeX?5uxlg9%?jE^S zy&lSVEtpKyQy<*}fbs*!<09u$c2djdLqm0L)tWn<|498fW4};&*u*NRdMlcBYw%#3 z-x+!d)h&4SXg%pI`VN<=_(QKqX>R(F;p#Ug)?LC)IZmOe=jUN>@_ka<FQMM4cFc9{ zswqqMG$GYZ7Mc%bp_*8hCgL&A)h9Q8kvPlnDm8PaAqXXaRY=iRSK9fhc5weOozfR_ z_uuNhFnBI4`U75}lH*taI-yg(1=C)`*E@aotdfys+1XX+#Fg)RpN8?hpco~Se-=|J z6NTz+iPHzH31`NpM%_G6yV|Mst9*-8>B6g`RoCq9h2JOWOxE^3(pDLWs^`rA=F&zb zooLn<*gjO?*OgJbIF5!vkDB8K)q9^0zaxX{QE<LaKppMdnnuG*j}n9rv<I{Jt^#fr zJN0$>#(A|J4SqwRTo|K2TaI`riFVvoU)14%dsV#5XQ(&+y_<`Zrel|`cPw?<fIZg! zbiqK&%%xbdbYE&&fl|ta71m^(sW6HF4~<LS=9e?(Sijk`^NyD0A??NO-DzY9%)7S_ zxRv@H$R}uu8FKY%u+y#k66{$BXD~0R6(Uo4aPsLx&K7;^mrR|ySW-r;Ps}fs{^IaY z{HA)8`l0GJzoF)H6}g}G>>3HIYmGW-)F^WLt-gN#@SvHLwK0Zz{*Jp{9dCraUUnHE z#Jz9&J<DQW^L$kU{oZJSAVu_56X}Pui}i$c11p!U#GS6&Jzas;9(}*QpzR9$>B0~# zO3mtb+1pQXN{)9wy(>Q9bXjRGG>dAP8p1j@V4+P*kfR1|FjdyazHt}0z_jAjr$!Me zgx)&OOM{*&FucsZU{3PYzWkp<z4Nu7$ur-IriQbOFk=O<>hX0k)`Mw<gX<X0?^>o$ zulVTW@WY{u@uEBXxt4&=5Q=vG(7P6lo-1ql={Ze~dV!zq0(F0%Q*qt4p)4;tD)6^; zz$!?)%s||5eD$KC*q;LVVkjVHDK6(<22ktkS6$$q-a6QvV{mfmW}r&8n(LtD-{-C? zIl)}<Anahyd%PUX`R7!Wa>d4zC0i?akmOv&A3_q?Z_~-wQ{uf@IJIn-vYMk;QSptI zrOjjIGW)D1iH^OxV+A5y#<fdaj>@(qRgLL_51ZwBM`sDq(p??IGwUZ9q}93yjdlIi zU>Uql#XbD$selcDzL_h%pteJ!@8C}c;6u~04VK5rs9$WlPpFFa55g~PlY*^-`ThfI zI%2b)5x0DCh|Y>l-0`jjG^UqMJWYBWa8_9=QnwT2TA?N9=nrB9W@C>m&TlShm2M|G zUEgk8@axp^*XNyXLAEAUo`EOd-g|Kk>?GL_cl+aHDc1d7%m<kP=JCJ_=_@(OHXPkE zMT2cXf1b8nIZd38am>DTxtm%a;LS1)S7Ddzu^xyVX78vrc`IFeQ<A8@9AR{Ze-VkY z+iz+n{-Is-{Z1)FcDt~mV(Vhye`%k~mzA?NJxm1C#JzDk*6+yuJx{7XU*`V$mU>Pp z+Cm56T@yMHblG-Swc6X_DW2_dm9_d<v-Zu3mM;G&Q}Tlvmj~;bq;)66P_iMglS8h1 z5Uisn5=H~nd8i4O`^`_o6u;6tlP2lH?QYn|ms5`C#gi`m26&(yV;Vl14Tf<mWr}?J z=Cg<Rwybuecv-{2=Li(zyJmfLs_>(scB@~PA<Cn3zyI7LHLOBC%Piv5P~Z)<i^o!h zPjN9bb8pBv57SY$*`RCACDUS)t6I>l7IUhHGcAq8wZFUxUsZV&fCJV>U{;D^sL~p# z5?%AFH~)bf`hBhDj?G)Q33~zx@VA(HV*#*}^lJFo_r#%X{WX@(|45E07xehub3Axa z$s-E>1oxDVQl>Ve3kjo&b}>UHF*k2No_3Adv<IR3&8w65_`f385<i;;(Ts3?E-wq< z8V23>VL6*h5@#XXvIlfcvG-H-jhu`e6*QkTiar2_h*!%ga}IaA!0~YN`@)w6q<4)z z#+fVI7FVk&#+Y_Vd-4dEOcrC}p_`71lg_K7`;b-lNp$0b<I2fCF3*bLoB#&*_*ued zP~F44jrn{;CxbzCiMt!a8S#5mUs_ZHQ|IqeVr=B@g#O^c4ZS=McrXyJ@g3WW-?GR~ z*_Bq}O4VJmG>eY0SNUd_?(8DJe4~_kCJK472$?J2`B39{A3PJrEz3hy??Io|ysFXG zUNgzQYQl$x$Id#vI!yz7u6MhoI-`3q;@57o$-q+u4$2iZosABk`VaY;RPkZ^q$a@h ztI-qN;uJ%r8SQo1fu*FtuRdx!H}sNL#jDx*s5GT#O;JBr(0Ai=WYt+=LF~g=&Sy^v zw|RIWO4Sc~E!_O|{5KWBKfxduCwI(TBVkcTAE)P&kQLuQDyP3-$l_!Bn;aGlj$OFl zl<eYGX&%Kih&W?#_nX%UQ$f{mpw#m1E-|rY{PenXrD6iS9$gi;OGN1@qS~<|D>VE^ zjek1Q4L5pRCk-*+j>H7v&cQXI8O<%`R+(yh!hSZL9UXX-&sYO{xnu$n<<I!&;|D{U z?@#nSdeCH(ipnh{d5GSMF1Ec(HXS_v@%?~a8=yCQ0eg>MPk223?p-wc$JY@cy#(VR z*Hs+vtCGKjxL@_70tay_qs_n+uy4%M1_5xqu0KxX+_Ir?NZMbnuqy?-XgMoiNBLY5 z0I7I)W%5zo>;@Ua?oQ*JFD_8aLz<G_y`;OCkqv#Tl>dv=74FV?8@z4MLgv-u%lt=Q zC~s}e(u{rm>z>6Xy!Y#L99I?r@a)X##KD8j@iN!UTL%ndmkXiUTcaz9i!SJzUjTbs zN~9v<m!OBnIf0me$Y@3DwOsiU59Xcu$b>Cgm5}Rlv{xLk&HHVAhOvBgnM-GjQKzLv zV$f%M_lk$RySgJ8!-R!hn)qX}D`a98d)S{yA$8SE%=Rzo=^<dWPMk$1FGA>xOO@HY z*eQOjNeZSfb;zDyYtCfemS$@|>X!$sld%O;(O1Z9F$d815(Z4faD(FRq7=Z#V*dVP zI@@E`gWW1G*$S{*aKzFb?TZEp_)@jwXAd8rn8)Kfi&4gJ%8upV0xFsmjlc7FF|CyX zBD(C;PHUw9PloxKatQ2Ry30$70IOeGt>TTxI!g`C%)1J+GBS<C+`;O55}Fb1Q>%vy z7)Wz2ZLk=yWENqG<<i3O9m>keilMrTEyByc8x5i%>0f7)XFL{r@TDWo!FX(ECvN|m z)Z{ZCqZZ@6-<08)`qeVOS$+|+Rf{WGp83BxH#g^5%!WT?49JR9E?(^hWr&T7GnpRm zFn8i!0!(et-YAu<KQ0So{Z@<PYwHn<Db0%S{}2EmMbggwYk=>vTreP-0OR&DKfiMI zithm)Bh>*QcwcVw?3aoGXXMOBbGyG^%{?dOJtO&`tJ=u)(vpe%dPP$4`Ey#qJ*U*X zyu1L=D~6=52Biy-s7STw%MPFYSx?|p9zQFcQ89j6;rD;L&n0xDO41L?S8dG$1G~(f zK7u|m!0h?Ig#e(I$#?DQ=jINB4=r~6|C<j1Nm(4JWD9g08T1<<H2$5ycx0)YGao$I zgj~IPsU!D&tY*CF=W2PGS0t%gyjt8xZ%fPKw7Wt=M`x$3bmRci?>CU2gKq_kj9xPF zGBPo4EV)10=?m`y=)8|R{P=8<E!_#-qft}$oU9hEFrU0V;>ve2R}<WCsaW=<^r-qQ zev8bt?BZEZ5KFA<UmTV&yhGYeEx+!h8=&;)JJ0@1KfHhqmOCi3?{=QWf+Ob6L>z4C z4_|35tN;4%uvSX&hk%Ks=ty!~D|7I6&+_Do0nq%mNRH+SLt0Di_Hf=YL!38!EA#LN zt5v+XpO(J|wC*pO5zaUmSuXu#rQL4MJMb2Y>^_<I-!2S%`LgepzRUx8Os%T1yUpCj zD~mu39KjQ7l|Z>lC79$6o<x%V+ZVH3KPN&bhx$PdfuyeL+$R^sWUZ7ub%;RC^RcLX zSeY{qRLn^3F@O2Pp6UGMS-&Zn6hHq%MJjXRSi;tDSNJ8(mqIkXG*vqjgEjP>wyCkl z9w<tv%FuqwI#&O!S3`idLyG?mOnG2%MYAg?%AuzAA6Bwj!y@E|MJa6<TqiR!8K+G# z+6?4X`mgA6KwfUGF*5Ri)G8wVWQoe+_3cFx!I4tJTtkOxzPH~ELdmWNCTo3}j<y}9 zq7KuVq<JHetGl{`bJcqVWoy}%Z@uv?c41Tdv-f1IC%HOJMC<HmR+jnLuj+6EskJ-@ z#H;nQJ?+<}8T-}Jc?!GUzAJU6%Vv=`>(zwYHe)K2DiW#?>Jq3QSbT<dPHw7CYCmUi z`g^3Ir7lv_r(o-xIPX2zbLHS}<M6F*o0qm^{x@6ldA;=FKw5o!`&ByK{<{V+BqAVG zJ7PXzkb*Wr>dn8>fZl-2Jjg*-kwp_Zesgbn+1!Y^R$gQ(SMpJv?UV_6=!Io1Q7+h# zSRQ5WqHTx0LRxOab`MELG5{d?L!Kv{jJJo?RQ7CgI{HXo=2?SL=^C!>KbDTQ@$u`D z{8eBEP4g*N8?`D@r^|OP;S=^V;|iu*s{5HPYq|rd$u)UMtaev8FDszI5Bd3ZSKey1 zb!AMkZF&EAjH|>+iIRtefs<%sGsZFB&%e)Uxna?5`!?x`alW0JFN~330mTE8XQc7I zB<u+9W@xQu<t+n$nKQ{q-wmvSHA@RgF~9EPBnMsqNKd2qnfl&5;P0r=Eqa^i+Cn5N z3e-?q9HSr|j%m<djv-<^`$-Q6l-K+M^t4nB6B+0k-|~K*dj}TkWoo)9N#1m;K&^6% zfElSnnr;@=bT7P_2*99rI%E`y^%45|`ZdxK7^)jnZvMY5XZ+Z}xg03Y6fvdgIy~Oy z%54pH?PhbxxaO!T>sQ7Pt5VgiZirX6+;C9HSXZV(N<mfLb5JnZ=m-0l;UEu7Z{nWY zx~Ejnr{%Rqkf^9XP{i(a#g_UCR1G)!8Aa?zkA={KXC{0r(!aw_SwPm2d7tI<l}6Sc z8~@<s;LzLJkYYG-<MX=FXq%7?fh@os<<fV2rMlnJD(xG;yo6z-AH~%4Nn>k_SEZO@ zP{TvLv+0#?-RuMGBr|V5Eh!F`Bo;={gE`MR-7OxHW{e4<x)`?KFSpsV?d`yH6_}R8 znJPWdAtK+c5_r(l#KLy7oCDqzXS-v_O!@AxzLQ}s-Yrr6(+|dW8W|-JL!{Ac`i7L! z|K=pMmnQFnyB+sw@L`L|p?akLeEiL)>hU-+&ML}b|E$yV)ezY-=JeBm1}B%b=<#Z( zma0L5Sm;Yf52iK_%QoMDAs_j5v0js{qN=#4gB%|^3kgv`WBL-(SmHCbl?NQYMVhWp zlJ~?z4AV>t=aOnPYBE;lQ1n$yHez_)8S<d@rMk)^2QvPl*7%mjKm2WNNRMM~@xPS` zMNv1iRb!R}@tWPi^7c<|f4s!8*c^FcM-)@Ifa9|TM6QA*PUnW$qWPv6*E|rv1;en) zScjc<kH3Kwr->-t;yxNhA!3rv%eV3{#rA}S(KI01{ai_!MUCmq$J;yw)5yX=Nv2h% ztm#y)H^p?JB$#bsg4UZqF5n)E5M(2<<BsKg8nkbGCYDNZ0w*>9d9eAWL@*eKi^N&o zeClp>Gt#0NSGBq&iV>e7hn0Z)0jVUz5>W}fUXPAbW7L0l8(+=OIx2B-ahAi815COQ zpMN2Q%(&69eU5Yutc$)#=rYqM$F{`h-NgIDZzSvM)$~ut@&-EX!{CuHN7gepby8`C zAus&9$|}7NUOt*4?!_?oTqRcH0`rD`>02^h5MJR^l}FeR&K}OyWaCWHySjotClEq7 zQ3PRqEkSsxbUrR!LBhvptizwKAT&5trs)57vVM|r=mIqGp&Rf3`23eq*M-KL{fuTV z*&dGA!!ez=rDJ&!bnIuxnNdj9mJAHvzWwUXDayrc$PujN3*4uvJ9+<{EbaI`cw%tO zwbaQZ)^~i{Ju!JhB&xfkkrY0CtlUACh*VXuw8(5pVpIe)Fb64cs+xi+ucL_Fzh^UI z)}b=R;{SDx`LaYD*AU`o6vmHZ&Rk|YC_Iwy7BzTNg8iM}+UG^(u`b#s_jn1q-*-1U zGcLzZkxL$kbCmSLVX5H)Qxvn9(cW@AH`_Pr(=Rif$LNg<%9I8h8wwFSc7%=;-X?_f zxs{K-A11BAFj}eE2&xWp*e#=W<FEQJHJw3w7HZ|SO5m`0app^+{Yq<_<LFggIPHAZ zn=8>3dpOmlq-}ALY{zo(t4P;jp1W&z>jBr6EMP6J=hSr1%vA9DJ}IM!dDZvzXp=j7 znv?_k$?&1548`+knwh_k`pYR`OG$)EMA7HbxHgjt7kvj=_S0OT0FmQhb)Q>(QR(uc zIFE+W&$ILXoCQFv=dc`|ouY^#y4;@cUMsh6!Vm4}A+7k)iB(`8M%}Tr&P$uu<%gD} zNFTS5vUZpc!z1^M0^R}|HdUkC;bT)YtmEC*eXnwF6mzWJ_^neVOa9x&#Q#p{2foZ3 zk_HdSHWzCO&~C262?BShgE08M1Kh31HBX5$;w9jB+OP4+-R|qLv8z72Vmo&9;+;5J zsoh?VABeZ;o?3VQ?x(IXKTq~I$ZYEwbBAwn9JMEagbB$xeJS|Bjo1gi_C7Y0xw_bZ z$XuoTX&NQANi&Pq9Ynpt&{9N{m6lRKZcIG4g1`4~f|K_q+{Xsj!by=Y*W#fv(_tc8 zWnlX^Yb`MZr0p`h-fC?|pdB1seS8eN)-<p!p-$g%#Z6R-DOqxxH{X6tPowHR7w%bE z6^wis<&;`&j7TMh6x{miCN@<Bu)n$H^u|bDabhw2(%#R#zWOh}YUhlV8JQ3i>?c*r zeC!=__Y8|%@r=r#cJ3>0FS)c-AU@?$PGGb@NhuP*X0Z;bO^xA0xOID4y~H=?xg&xy z7ln@VdPN&_sxaE~Q%Ws3Q@*>x4ThxkEzhExA235ChZuKZhx-Ynot_tmHGMLtHJM)N zo{>|9Hu^;w`h^lbhne(?uE^lv15%)fnQ+Z~{hwi0-YuJ%6@+q9?~fZ6J!R_-zDbyj zbcOGDbKjhaFN=TBKfU@lHGha^&8XauFqX;1n>3}xEv{RRL7ozP`jK=$ulB-(WHZy3 zH>MXZ?m}0UJv#N-zFl%P%(eg6%!Ad?D9Nxl8AM4imo;dh*uZ406Dc^Y^{?nn;9(EX zJqVxyyQTn>OcN4Hx;yRV9F*-cl}EG69!%eD8Vth1URtsZM96bU0m2D%cj&}B)%pEr zw~^jP@l%d>W63&ngjrv8YMQfam<s>k+HSFMyuY6lmFw#11B+OAuE{2vgddJ*V6UdI zjDV9_-EtFVq2sBhAX4z=|G-BMb?{ChA1O$f@#(UrLL&60#>Kv0nrv#kB=$r8o?^HM zGtWD+fn2m*>|5F4n}T|gpG(O<8AH`^*T4Ozo4xo(b6&>Qkrnvct;M+Sasmos{1*Xw zH#xU*@p{<PtG>RT_M0F^-5k6;c1s%KG-&3s=`c8}0A2K|G9i|DZ(6;UnPHrSIyc_s z^xdc(Uc;HVA#Q#kiib6rL%VX(YO<CV8FFYA)-WwOr$!ss0-QGpBdh~3+*HEULSw52 zrJ9(r7CY38t8rQASY3mE6k$mEn26gqcwif)^Vk~YtrhMz+1zHELvSU8=QhBaQ4A>< zee<WO)$G}Xk<rrO8k~8v7+)9HlN8kcswXJ%qMrOAh0ELYsrhVg6Z7RUwqvLbWyzuM z<*J;aqMUg#<5OcSudzhG1{yJIJyT>l{Ube?_Ld-g@6HBMxP14c3i0PuUJ?<~9HHG6 zG}KB6nL489pG<KmqzM804b!de+S1y~Za0Fg^Cyb3cq<{MTgOp?65e#)gZBzHHSGh_ zgc6nltl|JY4Ika9#d+rrLOKxBt+EaI%F9KEML}d@8vch?;j3s$XiU79_QRNIbOl*F z)Svgh+g@(e&a}l}Kp_J~;V~tX)x11pm$F}l=sZ1ms-p26TX3CP<Dk$5sh;?3)<K4> zD^oL36{s012~;Z9`@v>ThK;5}Z-UIjSTxHfOtDrUpw_TJ=r_i#fX+iC$<UiCT?{r> zBWCT(H-yis67~oBXS}%jgwW94x(XmQDbWA1M7AMLeOej}3x6zOQ~dZy&b!0}8#7a1 zUr7{GiRCEIm2^Glk&UKAuEQ{mn(CGDIEF$-V@$ay&UkYYOB6!qvvMe`C-FEK7p<pN z#jOR`_nhD|F#P^DL0Hu>uUfrcpb~MI1Dgu5JshO#gVp6kx(K+$%r*YA2^JJdZ%*~L zal>g}y(-^_RS$ekc9DI`KugIK73|F~`ah?8(w$mLK`tU(v#8ZYt}0Kz5Q~o*b=Yn^ z)91rpZ8CR!X24A0CJdReR>U<?^Mi%$;21^h;v^7n0*fe8fISc!Io!3_ZvnjtqpGb# zvxH}C!2?W$A8MIT28-D7IB8Vtz!DuTAIm?-P6Ad)GNKWW!wQI2Q8s=ae5TSQ5+O$A zJ_cPHQ)WLYZTTv#{$JXAZD}x^Y;a09CyF@$sU@YBIF0&8HRXK@2#q{I>S(BI3J<^H z35%F|qsfMfDK<3@+_|4^4~K2nQbq6L7|n;3PxGD=xb@Ei8nTMmrPl{3d8?a2Qd5YM z9zc_GcW|Gt?LDLLc$1{2(P4rx&VrIT^J*eMIM|HCxd5%LpL1DPMJW6vH=5?Kzet^b z;nNRMPFu+*e-e^K$spcWAH>bSGsBm|5BZZ4TdETjL{U((@qVp)6TU8LcuBpF!ubvV zG4J=sY5ZYj$Cw4gR6D@7zi2v7<>PN;E{q*u&*%Ez1fYm=ss^69#&kl|5+xbQIejCN zi`v~4{`n*wIpb)17-1q2RZ2RTsl;X+L*8VoK=mFKYPvz7g4w}=MQrcF&{nb;^7E%> ze8>@d=NTG!oR7nPJU)s>v!QrfRjpsZk|Xz%cyrSc3svCiPrKUGC6b>=r(Pi~2=WU! zrDL)=-M|MkOFQ+eB?Vc5A+JlH5j5Ra7?|Hg_nNZ|e%$mQG-1-078ZHtWz&VFcB6z& z#u~{;mQqco!90WABI)DaaH*8M<#9T_hCC&S6s|hdNddVqGRxD5V=4K;0(5{D`|2rJ zc}jp%Lk?$lr)y$;ki+$IuH5v&8hx_Jk`0|N>XswV^McuL`<n=ArANrfLyy8Ig2HHc zlT8ctzjUwb7PpYM={Q&0(VM)yM5YT7apy`1nyZ*n%x?AZiRfn%5jMOPt{llTtv1*n zr+BNE2WDk4+j}>q9r9QCE&8j#)tp38xK`V*x;i>+G5g(|Dtx{2FVT<|-gGg{-0JM| z7e^)yZNFp@vTC)YyyWj()n88g-B8G!37=VM8oo=5IeU3Vy<=)&1e&pyj2RCK3qJKO zyNWjeWT^9LE?XkD)Tn_F`Ic;DZkRz=(2Sey;YnLy?~l^aGwc8n(?t$DcirVXQvrC> zq#`%%rvX10e=3buBM~sXDVYnc_#01&0DS?Ni-bl#ys4R78o3&70$~E6eRD|3W9nXX z^{7q89$(XZg3)+jqj|jR=KrubNJ(K!^_g+KS!LpEN|g`WB{R%${x!r1k|gga+Z`tC zWh-|FAD+KmBa9+qrhUVPW^;eKnB0XDb&Ztp5^x!7CBjTHv@4uOD-?LwEEuV+#m?7b zWhFe|!nh_9fHpz~y5ykwemAU)=TFX9nu<R0PH`(t0Sw0HPF44hcdx_tKT(JR9oBvP z%%(;Gc79eR=Vw<MW2j+r{H}Iot{{GXCMv76^o)-j5j!wggt9S>InSoEe)7%PNt(E} z_v^@iLe^Afb23t8ch4doYVW~Xt?-xoFC;DeHC|f|r%PM|@)mK-V0$`z;cTOWodfFg z<T3x95%V(*Y=y|r=WP%3Y|9Tpcet#z>?robw$LaH?EEjhEJ>KIap+jM-h&5(hhlDH znkKuRYphz`ORe6r@BwPPenH$pt4T|<c4Mx|Rc>Glb*i>i4?fAMfxrYM1Yt9d@}V`S zhV{e>M02NaGUUM@jF3&#)X?IAdGBBV(e}06WDPX=|7;WG#0_lho=wQ<Ds?eHqkhlR z{ss+3Es}~b+7}E;&AqtePX5OKLG_Ske&A_k=B^J5Pg0&{fJC)~ce@vV!#}bc<i)}Y zf<AO@#yYe|ct?nT#c0?}3wI`+XSz@Xy@>@cmGkE2nnXxE-0!9wEvY7kmTWczk1Bad z#yQ)`BPB#W+e%H$3}B=yc<{sbcLntUTPrvUU>jg}4T6V!XEY&(hh~(C9bJv)t~T^< zMu2tHEn_NRbQtf?8@Y0;OQM`AMlZ_N&Vi?GQl=y7jUyyEnX22Y!g^O+_>YCOiy-<Q zjvrr+=v`A?GgzbDG3D2kU1Bl*PfWMFD_5j5P*dIiIg;&<oo5HM)autf2(9Qw8cvnw z<CIwCVC<DJQyweOfHZc(q`{JPJGFw>e%(c`3}Uhs0GZEaiQWUC86OsBCtF;at}TOJ zWzY5JV5F9B@}c$`h7s=RmXoeZ@UNi0|78xcjFSr|-(598SfS(H)b?^rCV!r37iO-R z)DIS_N>S>m^8?nv_w54V+<6e+@jFJXa8(u=-&rEl*Gi`2SrC)i_rb2Pw1rgQ<`g1F zd}qv%5xSfzKKtbu0AEDTYeex*Yr6wxS_4Me=j6`Or`4$QPUOkP<3@}+^zVf>^ar$l zc}MX>Rodp{{~tRHqK=nlfeDH3!dD#x;Vs3@na$a==LOtgS4o0JjlN3w4-sv@SkySk zr>`wjG1yu?76-*)=eTNbbFdP=4FxM|%b|Qwm1bF1IDg}*fcAwjll-X?Nqq+Z{;U_e zLBUZLt)D;d<Om}*I+cMwMpdDKmuQO@3UG}(|8p6z_JFiNxAYP*Gf9V&A!li!CWkJ% zGHx2OCyljnE9xNsId2^f@?Dv#!KUiz&(C@1$S9Mvxnl+s6d$&#DRRFSGjKnMWA%WC zI!Om}BI~-7r+2PuPbU|k4>$6=>6=)+DdYfzw}!R|8FVg+>4F-1kU(>HrK8stkxu_d zWpDG+(+JI1T+3!Hbp1WyWk;aCf{T<KweUUj1@7R;vtnF_tCWB_9ON7M3L({?Y7)My z56M#_ZV{+N8f&RW?1*Sf$f2;Iq?A)tkki!xJ4wCXr*Th>PJ7fq`{JE8qvIXdh~zWn z(DCVVqM`*qScD!Ll1y1J8>G01>YoHV&>!r`*M2-g-6=_cv?TrHmIB&{qt8QF?kWAD zvc$_~f7Y4Gb~v+Fzv`KcTWP+8K*ltRKCk#XtG}2;gZu?o`Vwa7t(Ag*e>@-{<>~96 zs08iKvP2(76w@?gnhcU$x`+h?GK)G%-R%&h!TrF@0ZC%I>}o#6Z;iKex!Qs#(-4w0 zZlEkk5m>KDqKxaSh3}4Nd;L;U1NGu#^&*5g$TmepQEJCRylG}{h!cGi7@p#EG#1&v znF;p+lk)nxf)Sd#1Z)m)EsD4QiOM-_!1GpK3Pe$V*|CUPJ~khS<jMR6xo8+w_)94D zHDYJKh+r?Gc4fC0h~bL-Ab(f{huy%2TUbRsy&ivqq0kLs1@S!S=)Q@p9eK|j=}n*& zraSyI8vrp4s??S!@#@n!vLK<CJ<-rGJJZqVE1_n#1cF|D@#_{(<$HS{*X_uSgiUYp zI(wdeYSXRhmI>WPz%BVtYS)*v>CZ#~7G05PgV3i0VRz2=nBi~w!$N@69o`@y3q#5e zrDf>6A32g|LyyEMBDgBroPk<)4JaM1hO`(bOiM!OSlSadcJAp$c9)70qKc|(nI&kM zkI;*pwja@Ld<+76PH)PX6Y2loPE4bi7rFGNPWbc@x@~hENo_&wj>k#(lDQvk!-YVz z+?6N`Pg-y=Tua)HysiSYi54?*@BA+{IW<{O(tRuPOdK;N)i(=*(c>6}=yqWS&DaXv zvkW%QBzV6uIjHD|(H0jJ=);f|8F=B#ABL|j+G0a5iE^yaw3RrNfziQw|1s}t6C-^p ze&^|PyxjxOKy%<4WwA2*Q|vU)$cnsmVbH1zvcPj9ZxpZs_0k4<UE@(I!OjO?o}o8! z>97!8jv*)qVL;&*%XfEK1DRtUV0WeI7aBJAG})Mg2|?lU?(L>Zu$y*wG^PI?H}(HV zM?jV5v>Xv`9Bp_bHV<RV&5Lrz9zw%4Nu|}>7RH8Y6bUalrv|>ddb5BPxt9Z*2O2YV zn?tsK22)BJH`%!GDyxk>gbmxC7H;|ovv75Wi=8VVgbb#FbiE^BG~oanQ2Kyhv(m$t z&DTe=;ann=G}`U5)}?~<Pd|?~SusFsOEOLsQRa7@%v}sMG?y-IlOV7$0kgIUj9vdv z-Wf_X==^Sp?PPTH=b}lnvmm~)2^(bzLItb&@mU^r_O_@7j(qf;NZw=<u+O?(h?yg{ zm7*gv12q~H$)tmor?x(2V$g*=tB>FwPEb169W--(rbQmM&96$dz|+Q&6<Jc~2ycQh zB;7xCa^S#?2fq6qw%4oHnDMP!zz8i07<ePy<!%sp$d(Fp8=oUe*PXfWFQ)yLyo$m4 zq@<*qVPpGD|2I&3|JlagsX5moCCY<5%#1i0ABCM7^`?}OB@F<zY{B`L^P>ooSF^k% zAy!*OJfAo_1wl<*ogpuDy(NTr56};|4!=JDo`^H~=K@tB^3Z%PF5|lv7Z>?7aS5Ry zsfjyqbto#2kP%y!8kpnKdQgrCuCBEljIjWtpSby#K->X1TK^g(f?=P+!G*5l?1|M_ z-fCv)Lscu#i8Y2uR76N7T^1VDdl%~b=WjAD^6SvN*Q@!ig-xBV33t3jlVM^DXOX#k z{EFWHNm~6SZ!j81!}L$+;9uT!7ZyiS^PeP#7H)63!dhEJ*x=mJxh6BRCzj^~F;r#= zBx38Z26VNGp9FwPLux3+V5sqAPa2y%JIi++W@=CtjI3^$&OXtgpt+H{kI=!|qh7GI z*R&(H4N0{l_U+y-ejl5-4CZ~KsH$O`gH05_k-)}YwHmE=iioHxO}fcVyEAli<$uW( z`EN8i(SfUu$`boeTGPd;nX{=0flp2Gd4l$`>d?z7PJ{>WiwZ@5VlgpwYAfshcO|8( zQA`YUYA!8{T(W@@4kedd9M6w*jXV@F^_p5^gc)J+@^ETvxFTVT2i{qZnu*pSi8W5& zFbx8ROd)deeAvvaKA#w5=C3*Ge!$m5!f2ekuK{b=m|_MMA#GbaJ=y|tTuwcpjJLO6 zv~_R@*2l=y{Oh)VxIh=5!;V;0j6Jc_;ru)?Q3F{Bzzi0U;;-cAoRB3tZwT!QPY}YX z3Eu>&=rmB|X(0~rHoonoz|FBNNdxbHT2lkX+S8+F8>_1CJC;$h6)))*F0>cY^xKPQ zcw9eWn_5_;;ryFHXq44_zHu~4+j!xFCi}W%e1fML9|4PS%3yaTTIi5B%%$bd#*!QC zG(mS;yT9Pb-P1JwUcA2e#S2A5XgiGtm@!S=wQ^ej0u;3vpV)*jZ)Ii`fjMNMj|VMJ z2E)LZmrdsJ7X-(3iO;IaB8mg!-F1N3;MLh34D5z3k&OOr5#$hiI44s+Q!+n@dt?&X z30MBKb#={nm5`OyuVIQF(=uWuS5NIMOGk`%Rb&O;APtm!B28q3_1u0PV5GHI<V;#n z@2DdMJ_JQpP<lL6t8*QXna=ey%4;^DPn6&z;T~H}M4Tc&hbCoif3gdLaTU%H25~;s z6z>;R5X2U6f2+lkpUpW^KX@egytfMHZe+8LX$O^5`cR*Bd!t5I>9)Z)t}K(q!qZ~X z2cqr<Bg6qv$#iZPhTC%SH>X+0=yVQlIyR5c*`k*ei^tIbpGCQ9J*%s0t$%)AKk~ER zR2e09!OK?Oj`%)V1B!DN*h5F3DEWEdS@jD<9R=6s?6yWyyEdoJ*NaaE&)bZzf93Zt zz;>#JIlw7?2ad~1^86!s+#oV>Gos4KBWC=CSl}-aEMhy!@ns9=qTJD|3(}K#bq@b> z{-+Y;HVIZH(oW|dkVh0xZ$JDrHYU_rSAB2riX)5GDjSrNLGXRb)s*8*6S*oY6(D;t zyGaWVKWkgb62|}{hqFjxm&=v0%sKl-TsbId-+t%RUt^h8oP}JRooAdvp$ob<I<Udb zdih{E`*#<`joi7eI%(LXQ?sACA04+BJ$}WVER2pmn+nC$SC7PMcCs=SYuWhhk9$6} z0~x5EsfEUAnc>q1#D4YzMQVS&18chWo~b@^P<&qbY*`?B(!jGKRv*gvnXQl379}fQ zyk6W?mq^vKl-pB2AoexAZZ|jLZRSCm@9!E4$$eN%P*#t>lKo1K^A|W^bL7COv#vJ3 z%a(%afvLp=pP1)8=;}dqSE==lGB|t#T?b<4KN;pNwto@e8`H>Q5?Ns}yT(PHON=2Y zX8L5$B)bW7X|nT5Xx;0$Qj?=O_0>7ljfu`L6BRy%ryLshTeo#QRteR6uy(NmeN|TE zDy(EFFv@RLDGSZm)3ks1qvDJ%N>6~~_O9G0)}vh2LU0A2*YC7Xr_+WcJ}U5L*2&X+ z9U6=_U+In8m^isue1GVc{8OrXaC#u2hS5yjWL6bvgBhIav<K4eeD<s|@(!=L?JR?l z2<qMJ=}-3$n|B`Wy_8ax9<O<`lmAc=SA|e(zHJ1qKw9<I9vI6+?^y&iEp(wN*|NmL z#@SoJpc#1SkE5GL`?#fX%6Jfi*PhrDF!Iggu60^%lXLAJTP?S@u~hfACDM9TYY`Z0 z64labKlaGL+0J(cff1>Yt;i3Qe8T9_?A{VlD@5Fyg`lt^HTf@a4M7k3pSdIs4+rjm zLG~+nveFc<_XZ_QjLkPbDd#3HQ8J|vWIT`#d8viyoLQg#p|18YJ|%0oRPA4nlpPXM z0VxgKfYu+!QAY9Ku_k{fFxH989|sQZCUWC^@E58^Sqvl`ZRDsd>{sx|6zf6V<Q6Fa zxqA>>@9%jb{SA&%^3hhqRwIi|C1np;T<Rvow9*q}1g5yOOk?@8pr@-wWbM+*jbU-K zdokpX1{&i$LBYQyt<uLX6Z;l%qLzy1%mO25=Wb5jna{O<)o;f$54}sj-&=cFgtULU z&s#1CVLWT65dVAmbGeL+kE+i~KM&m={msu6d2e<jtGoCUhe@D}=G>|}cQK5Sv50tW zwJO_CxR&FCh-_#HFV{*8jAC}r#CC7l>RhZfXx=4kSR&C%SsWJUcJDrAp$vH(b1<@? zS<~zC+_-bRzUf2#)904;kN`Pt0SrLfUkw10H-6ue=`_e}I*@<q3945q@~4{SG~`)( z1tr0ZW5}cTq6*=f=D!?g{p8f5I_#T$>6QEhSny2<v?{W>0GuiOZ0k7Ae9#e%DdXmi zjlEsg3GnDg0mG$LwVZ`<7|?CpF!)Aw+5T?+OPQ56Ng3}5VElpy=HR`TtNyVCc`g{@ zOl*^h`HDB=kYLM6wQ&YdFNKxTugC>?0>}J%pSkSs;g0yr(jz^+bfl_<o^(uIf%ye? zQ#`yEW^I?04A;Ojrs33*T2DJfuPl)j;BS<wA1;B`{8`mMRRAfzv1m?jmP~A~yv4zW zM{LKV;I-v3p`|Ho_{Qgy0<l+xFpH^--?MBH=?XbdM#b;rpt~ymP<x^=;5PY%xja0c z{)EK0yK4G#fy=|)m6!d5>$qF8aB`ylXCDJ=#|Oa^B%P#N+RK+j_xzr!hflxgt+KXg zaMf7^W0N`ACVc5+MfcoBY_nQgg8a$`+x{Z6Ipd|8(aqj_9&Pjo)?-Opm-tn+j++qO zM(61u5YNz&CF)v#?&tE{%Dy&}M=?KT0y*6#SMJ<;j@%6@N_Yb;B)-l<!_oy&-o@TZ zg>JK%OPWnYm5ly~Y482cA9m_6mepPKKoDrZzl-&ga;?b=LgZW02%9x`Pxy=h%GdRy zg<4>ikDm)H5|ugGSxx~&DOTSfm52E3uqc_uUEaAmXBLu>4Q=mmyXm`8Af^ZIKslB1 zO^VUIhyJjr>?xrBdXayqKLQmEf-zRX`S$oR^-p@vq?2Q#`yJcU6u0+`P6n&sZ@t7a z@biu#gSmdnjE2!kOmFq}wzA#_PrEJ7x*!}*X}9fQG3QvSr&;Q{RYtMC$_`z}Bfopo zjMI1VY#;pLkE>W;R<gsqx4xiL-ioQ~#TXfLB<pxE>#H?;hxpfh6Q8@|2VynBlr?K) z*V6&B&e6yx?^MwbndEnV#2wS-k9V9J7a}_7o|@KF1GLJ6>3phY(Yn)=C7t;Bssq3C zn0ap)nRfhji-2A7V0vR2R9ty$v@V0@q0;d!hkH8X#o$qtRb}2?p$>m{+a1QatMh@R zV5?NP&F@K9Huz%&aobrD+8+#Cm*`oa+?K1DayIm_X?@B?+r((UUFhu+?s#iM@~?^r zJP!LY$W`A9H28c2-R%5z(l;sh(O7fu`%bsV^RRYXEfs)VAd7z1eZP4d-1SU%)C<sp z8eM<5pf`N<%7<D0c>8p=yF`ybfWPCZQB`8zyE(e*O(w;Y#y7e4PTrLOWGxT@-bSmB zpng-)nCMi;Kc3{e=}$QAa<q88CJABRYEYOlMtA|~j4{z_0F&sB=+HrAc5sKkV`_#Y z>4Z~P5#&fzqr*9+mWK=LVR2QvFAB^`2o1FSCt=&I$-COxdXI*ic&L&3Ik7awWfOji zi$gfwdZAR%p@3r?DuKKceTux_VRZxfhxj~)vwW0em8lG?D)AdXT%k_yKD>f|<dq=I zC$UAL>ZrIyy`~CPJmyi&iFng%p~?zu@bMOIw?jA+cQ|inI?xbR^~G@IEXEo`y)b;o z1Sjw#Bctz-k#pi7l5@t3xOW@XA^&;zsWHJO;ZFa|L=#{1snRP9>_I=sW)_AMtHDT0 zkFR9J3ehB5GR)#>^P%2@72Rm6x}C+`A+F<9p^e?Q`|~mId+rWfzeKcfco*Wr!MH~@ zobai39D$L{N}d`$(jM#N^6=z=X(Kmg@MGl31fk!cnR8q3h3$j?U?!KX3n!;#vwSu* z-_}PhkqVa}$|aI*a<UDD-D0`{Fml*{aOwdFrvN|sJR30jI+5*<nK}~I(|MJ3dfcA5 zrs||=y~{M5a?Fdl9giN%ITcMz&d-m+@_dwPw2>HXE!A)>4s6oa_Fd8^xJ5H)Yv82v zCP&ija=qF{r+4$*T)*P3YVIH(Y$<yDO`f8>`&pfPZmjYN65HAJVp68x6Y!#jh4q<_ z$fj`LOp1e5VsoZyH?T4f_F$6O%<V5B$-Z*+g0t@u$|8CQ=OLxfw2-SCMo(3hq0}1) zvVW2S57vsl=ajTX*Inr`BMP^lzS*Hr{!o}@G^rD2$Ewxm_8d)ImMhNnN(j3Nof;F$ zIy`Ao%n029x^4@*s`_72uRL51u(E|_{^Ijhx0)~pUHQ+&XIM|hEyBh)BEF6rw@!Q} zOnm6ILq_P(7}aRJF7jj%)v1acE(+g@$h-@W>@wMc8iX_Ij5gPkIw#&umO7zMl})rK zkf6+Lt;iL2VcZTKG<VC+5asQByYngQ1$6b%E;JSa(`#BX7ST@MhSK4!e)!2EH67B9 z6ULZuYW;o^|F*W?<^s_*eF&@C7D+4^T+J3QTw;V#OZGqP;*J$2z+XA!ARN)oNuHO4 z;uCRj&*fa;IkCwh++hl{db0f~%w`yVgzTI&<&9OkH{1@>2xt6W1_>8o?O1`7>ea+J zQm?(;qm3X#eF$hY01w7P@i)yfvAZ~Akq2mPXblj(mSXjmuG|7kw$(zSMvX$moUZ|| z0x(k-8iU!81yCY1ofjrkOy^28C<^*N&LvQ{IZTG1YrFgojhT)xnCVDlb0g;_crKE* zM0V-Q_#2V9mO&&(NA+-OcYz3r8S@Rp<jqq2?kLjs@Z4Iz#!+`bWCl{T&y4gu<&B?w z&@)m#F-0g0fe7T!pOU?MK{lBcUI>5pp6`u&I=)*lK=rY?sTdz>I+5S?m<Z2%Jewf= z%_UwuYE;%M1v!~Pf0i>^6-6uZbeMy`LprMz0zJc&oJexV_6R5!7)mWi6CsbOS0>%k z%i{V%iKoZPrS~#Qb!ZNMlns<jnr>ZjH!WtoKo;Z-?a&jk1JbeuX8v|>++F&#!A(~# zr3N=D8Kj*J)<Pc|u54_GeFV?_II(@R$TPFV#dtl!r5L=GQ!74}?JZm>^85y-Rm+g% z5*psADfD^6x)?SMlS!%7m&el&j8$*zKomNTVRms(#k=P~sqX&DcSfIS|B<detMQ9r z&6QFwpjAGKULfz>f%hQP893(6e(x$L)Tph{b+FA(|M@IoSBIbPin?)c7V0FK`r=_H zkfGa*YvT0RYK*C=-sG)g6G0!`83xN={Las(cL?4ps%l$^a|6#Oh;r37zdd}XEkSHA z*uyx+iXW%uyE806$ldH7o$j@XRaiLqy-_@(`#Htv*ofGE0gi)q{$I{3_yQd^3DLR1 z;Lh0t+CL!HND=GFqoCTVQKJo7BN*cgS3wWJQQN~afHxPiN5s8N7#z2#Vcp~ye&%<c zZqo(~|1#$6@$&x99R#jzX+)g!T2T0s7b$?U79)zc&O#>&DIV$I^;`{(chh+XT7`+h zEBL#<t^pZVv=jxd>O7wo*gNcc;myR;eOGc^Ph_=i-shQ4M=T1}&#@4$M=5D`qVoY8 zX3~jXEXW)*ef~|sf}JGR5nyM3VuVlj2+ZJ4l`SVsi*tah!_mSvoX&PNZIl(eTA5ty zj4`iNxZ;DeBnQsx=wuw4-ClVoTc;g0dfd58$+~A%;c+Wd%x}V^BDI_=%V*z7SEz#L zzBBg~)CdG-BFw1s8&)h}fX?|GxtfOmIqB&*EkC}zQ61e?GRiPAsn^S8tl=I(bj4Ni z3z^;=Q5ioAH>_6xNlh9n+AC7ytP%&Vdbqc5%kQFp&LKC=mZ^Es(y|%1%T+kl`SHqy zoSxB%$j;F3cR6MEF58fThTr5JZt>g8n3$=<8^R+|)Z=L1O$g$KN=W4VCWJ{8bCBAE zyGxs1@M{rX2;=@F)E`$lcj26<%1JM<qcfOfQrgk$Z~QGi^mAU$u4Sz`0r$Dk;hy4@ zi4YZ#S9WwKOc9PtSX(-Vho()2LF#r<4h0Q#Nsxr|FGNKu6yia&pbNh@j1rHP20t!~ zmvU8dYa{x)N~H7IyJk^}{1N+^+vt`XfQJDJsPCl|OaLtRO^`0nCS6y+m8oD3avCtK z;6Ce_o7XicQYNaO>D1-&vAf2lsGu@60ScZo+-?Rq4rW#!4FkizTRr1EB_;?R(5SXc zOSKvh#6NcgQ1KaSlWG1Ym6f?53nayS#mzj5F--C9l`W>A*AgOq{oA6L$HyB>kT0%Q zzTfSUPS;x&rA#oUnYu*|@3fT_epl#4a~<*XVrxTSUHLX>CI1L%Ey5x0PiFN)H>l%B zPf>c`qGy|Hi`vYNl=&p4%Nb6(eh|1q?T03a<zel8xS{>N*ds024ykLqN2`+C8EE$w z3r1V_+$ek08`AlC31xd4D}K)?ec|}V%hcE3)OTcuz^_XoisrJB)NhB=vSi}RO!`U; z97~a~#(aP7%x^dg)_jA{{>FTl$Y1Q+;742cWp!I@jBY;5!W@2!fpV&|p${42^9n^F zMjMjRFBC-1J-YbIs-?>jz0{qBMH$SdA1iAm_tM>;z?#w2`j3?bV^g}X<=Y0C^`|Z4 zxlI-$$dbys^o?VfC%8|oA2I&Pr@Fq4o+F4Z8{2gD=9j?^E$5ffWqF@mg&VoTBe1Ro zzpE_=!oegCW&ee9H7_zYR=Jl5jV6ER2%ckIibb(%7ioT`8sUGoS4bJ>C5<_dD#dCs z3{=Ot)rv`RCV<B%<sqYtIk0eD4ooYm(VLRt9uFuFGk^@cQlUTodluS2+2nb|HhD0i zy!Yf=ZO||X7!w=(Ohfi!C6*RCH=epH9Z;fVNCA4(=V~5wp>1}a%R8+uZ7FX4wz2YS zx?W#$0_tKmL6fv2!;4x}OaJ&Jy5ZjA?5@<Sk^%htF(4^yR`|n^1>Y41Lz7=>-;u>T z*&(W{rte8X*`#<izd;+QzgSxBC{y`51adBa)*vu?i$ieD9!1E|dM(VAoH_fPw4yo1 zQ!}hpzhpx*ZfBbuO=dfF-HSXRU&eooyTUpgU1J?tFBKCvuhyt!y=9HR;$!-#4|p?I zv?z<Ibd*%@7_y?XbJ^-VfSc?!ih~Uf>mi&v<Z8@C$pcL>q+K<>5YOR-F~Y|vUVSOe zn)_NU`KVS1qg%7?6nU+~c^dU6U~2|8ecr)5{ia{1cL<c^1yygle~E5)b@(HizT4?s zyuX(|y}f52+P8S{#a`-hhR!&bHK%O`fs$r-cj{FM?5~OnsV~D=58xNbI=i&J4wZB> zgfGfgh%j!Fa8nxDf$r{=3J>__vi&5%y}Kr!H5#zy;@}+akF2@&ny8a)r5jkJH?9bA z(k7}<;K>y->V5D}Szz{W^q`!`2-7;%&^b1E)E^=x^?zw2mJX@ZKQWhj&IPMY;wwSc zpd}L>q%#%5p&E9Qx_3>6doqP(2AVE{a3dm}D40ctEV?lB>5S2H*hKeiIzG9yHq$dq zuj+%JKuH46`E&zj0o>Hv;Vu)D$26N-lTo8o^Wk+7TOf?sIp2hxxNIPt&h7Yc-+DHL z(*3#C_-i8gQIj8=iVCBg&V~%WRBc&^b=-4f^Cp#sdq&4X$ww5DL)~zr#FI}>3|dK; z9mk_vDr2Yg^Vd5)00bRzaI1StR9VDS0HD$(R2fx*=L*Kv;`qDy?Qit<!T$v!nJ}S) zSE%;)o}A38dWS22EC-#NE?kr+J>b5kw^zR0C3RoB<%_r)U>MbpLqgjS_S1D=d{?JJ zmE4iQ6qUs3QNge4rSjx@?rT)aPRE(?jAQV8`f3X<5O!rzmMptiaENE^M3idM!+0P{ z(RH5~&v>Oy8-%GR!Ukcers{m*rg%Tish}dN!q)7T8f$tyJmzaD+UMu6(UW>YwPj2x z%*}QCi=aEjV?DaB9mt+T!k#9JR=u7Qnssld`^B!+oKco;Zrm;b8obpLRK(Y=;c$;n zqR;w5Yo-Yw1s}hpnit9rokge+oqM^z36SUfBS+asvabO6!?|Z45z`ROHDB<-0bn3( ztmJXvn69SIMo}fq>r(-v<@Q(A2k?L!e218Iv7F_gKn@+YpMhWoe9Na{pi7n|Cc1VL zxpJcMnV|A%rh<n=Y!Ax8uL&WvVL}MCqw%_{mB8N463Hqaj05dGLJx7*#BtC<a+@HL zrg1#L@Tv!0jtS@3?dqTh21M*}9{j+WkX1Pp?GCIE5^mfT#5-CJ+Nde;j)?Bb3{lY) zmi|F#s5TQdKOiEHdJMES*0>H^RBx`Hjl<tSF7!NM3o|M<v{Q}^35kFiYYv_OR}9nD z|GJWPyEX%L;VD6rYg6`#6Xxu&XDwq#ZgJu_S=!tF4{L88mUR044>zCIsVUoSa$#DX za?2KXp~=iKw^lV3sm$C$Q&ilLNk`2rsVuGB%2G2^v=kKt$4trGaREi7Bt>LPK@kx6 zy|rehKHukhzR&Nvo`1T$s;l1jeV_9>=e*AA-1l+xskirzc*i=fEb{uz1;gI7yTH)n zM0S|6&Q`B=HYCo+>vZB(hVxlKc?IZv_pK75=*BZapWYc{0kl*wls0OLx%9Kk$8U)w z&=q2Y`#{J<oF8^-TiN)V)Hvb|)3|}u4R@$s_P6N0$>XnhO{Fv}%F64EC=#$q(J)5; z630S2)u67j;VT)FC4WNv<J8PNxB+uCR^VnuJ4pcTy&3UOtK_RqdKtmIfa1;!G8mFN zW7wXRSwoB=r|ut_eY3{C-S!ea(1tb0T=!>P5X_#@;&q?s?cSfq05vlTu=JJ0Aznp) z9A~>SXy<qE_SG=;(WtWC#Kh<CjVQQO@{(Xh#uH|$3CM<ieSRT<^<nGj@9V~?b>1#o zjy%Z>aRPWb1w_z)XJm$}79Oaw`kOC1-UoNQr$ye}$I8t4e}Xn<>KqmL*yPWH^B;@2 z-bUbeT3qg{%KFYMJDh<DyaQrmlQ+j9f7*K0ZjBomMtqb*;>_o60Rl3nJY_>|J&_*+ z2??dQQ(Mh`Cb83t-bmu6F3r;G?@DKjKUag}z;lV{xZQw&joe7N20)oNFbkfRy{cNv zTpO72*)T=c07dD^k>`AYnV!s7B(D|daU!`9urlk9LgjnuXCerFFt$@iJ7laFFKiu? z2cvmcW;ODFfggFg&Ku_3+sV(3d1e~msXq0_9zZ6IIX^t%tEz_#X!SaNVYx2<7t1wg zSpsx6ho2^%W)%!Z^Jcv?FdNmUBe$P@uo17=Dbl$iIB#%KUi`uj&k|g}5ARR&rbjOI zkZ&0~LkMXk!(pPozH4;bo~~2Fd0CY5Ov53SuF|!>Y@4{WMllzt7>KL>V*}a^1g7p9 z$JpxzB`NbM7^RUfuK*2thn$RTb(HiS{K{Fu1<A#$cC!pF#&AumR=)<h=*Tk#uJ5=r zRr#qjLI`A|7uxZ2Mv<O67JkM@GsfsN?gtdu0p<Uf00!tce%BkB@us3IL9S28>d}zk zyRJ*B>ApEq=Ze;2!<o>rXxQX9?g+@2Cp;pf>54N0>iBk&zGeTmM+W-er+K57-(@{h zY`-Z<+$!8sOoe_z74KGpN8xl9PQNt^gTt*uspotyEKPlq?su`in$I^r&%_L?vocGz z$Nco`H^gQRy!5^4407XuNov2{GxDAQUr6u-Gh7E?7RUinLNB`A0OI%T45gVei1{ZY z)=B(@vDSC{a`8u&$2Q>Nlf=^YzVbeg)m(*FBnp_+!N1Zjdx=dp(fE8UNWZQYx7iEU z{xbMaEI7(+4uTduDHjXUrB5>@fM_DfLhKh;EueG<01xR9!ai}z*=ag&=n(Pw*|{EU zk_k@su`kxWL|}O~+y}m+uA*+80k$+b^EJ4hgj?_OT9q_>nbwxUiZ%qEI4&Bvu`$vW zc=hPNZb7j5WZhwze#GPco2-p%h;RG@>RvUSwjfcP?~<lX??`IK-ffQOcI4gmIeF&N z{fo~f?=I7w&wiDrtQxq?kHp<Vx|So0`2Uj`r>O<J2`oDMb5X~9(&jl)c1V8VggTVB zH2Vc8n(Nv1yd*`f`>aEBMTduNbPWm;ZPijA?h!l~9oh3WVXCYJ_0JPkG(jBgtqqS+ z16ql#-yPX{IwO^8{9=C^@qs_pdBT42FiF5)JQG`Dc(GM@KKjAu8>eh|v-@FQgx$1N zQ!`uA%{TXb+%$4yW)nu+l{W3ohETY_M*<zkvaC=4H0Srz-S3CgiS8=R;<g<TrQI1O z1=atxEest2aokjJs!r+`sBuT(;7kr8pJk)6?IbaTE4+Eb*-ieP(XWl9TMqyD)eggP zReM=9MThbV)$SR6#efsfce9*;?PAmH0AQ*Zw9r1-Bv>`We!&)PCrGo$zYJjq7|qWd za`)pi=JR;3`aDRQ*%hBvfuevF8q^@AMg8(apU?@&_0pV|bk!}0y;lu>vr<_ET4fK3 zMFT=^BjDl@F#6dPX$KqVJq_=`U^ZSoJ)_wwGmG6*H`>ty+{Pll^SLcNN;A~BN*OxC zta>7S_-C8^*fHe|LG;XNZ2iyC9$6P&Q#&s;zCJcUX-n$33|x1!a0f}w`Ue@`<@o9^ zqFjK1p1L>w-I1q0q{rv##~;7u)|`H%fY@{9M$-N^<?3@B>l+o5cgTBQ1=Z!h(C6JS z7pb>!DMi}AbX3&M#;`n~LwEzw^^*a4-n-BWRurH2svMYq@fp@Y1BqtPC)8)Z8^o*I z0CN3)$V9B41pGEi{mdm#x|77$u&gDyX)khfSk&apZ*52tx80-eGr%qk|AR-u<Zy$F zuR+7TV{xXOZ%ha=lsNc;HJ+aaWft=X=~SN~n%4}Bp#P&4=vC(cr={~1c0zFy_j6Rc z{M0pV*GO_gVI+A|yTxV4H=F4P3D`)UX#{kTb$%!LBBO(zdx~!JcXyKJbK<f`$^JA3 zNld!4wbSC*jmYc_1#sK3Tr~JjsVn!ovIEr;oyl*`U0ydyA3Rn!@}RJD+VMeHeRXTI zfjnR0jW)a!GW|K9U;N|OJagho;MwL1uC*|EDwyE3-O6bv`(+L4otP&i9_dULTeX;- zlu=kKql9?J^i%A$7gC=%(n|kM@Bg0JWwTGVg(mx>cl=rE5PU#<1g1Q7#Yu3OF%j%| z<p9_BfJ%6*EK?zznz$S(42Eb0)v~UYvp?6COUgG!j0OwdGpg0C0nrhl+Xk}u10U5u z=Gwr^s^mru>Bb{&ErkSaV@A{q>*2<v6$AAL<|Tm$+`avZtVD*Aw>iQa5bXej=jHDR z&-$G|(5$`}<sEGDs#yz!q4%cYK<5lJ@@MRdn|z;`De!HsvM%mZLM@TyG}w|HBLA(b zW9cnB2iZ3Kjr>%PBN<o|uTT0O^xe~Oys3G9>01kU1rE0$3ZEIcyaJ^KL_;dMO*ho{ zoc^zjXu@<jbn~m+x|uh0D!D@aNg~lZQqzK@m1`bx@VB&W5rA51c(+eIFMj~l<V~(1 z{~Bzu4*wuCz*ipdm090N`04%pLEYiE<`VLIg^*%Y^>v3vi?mi_UX_H#N-+V!gLc@6 zUi@>~^ksFdVu{Z&dRd#X={NB4f)xqevaBGDR)NTye`?yvJ}PvBOZs+iYA*pkqRQi+ z{N}6L9>}~Ee>Db=?Y6@j+H~cf*(vfkW%63}4wk~W8y_4j9b*s@pWV_~lS$s>YxN#o z{VC`}$v|aBV^#a~=hqS|kn*oPa^O(suM7e%N_qlZ8}#H$xi;MB^n=NTPT=_{Oug#N zEK?9;@J{QE1~JY}F#YDTb0N1quS>YYrb@`Dsdb1R;GTqRc;)~59#27Bt^zOk<<y7i zh!c<PznyM;w_IltA^E%MEue=AdJd$%eIYO6{G3rV4YK_4IdMbpD|I-Y6lu&!9)GdB z){R}dgWl{B7kcNlg9W|N?(Yh0SdBYR_GtErzxVGiA;R2g!v4@JMif7>8mq2V@8dSH z#Xuf2;dXu?gnyNQHEt)YI(L(hPFz#_falmsceRYL6mIdUzw~jFh{$i@mi+zS%nOA| z&uZDmEw5r-?<KLcb^zDJ4n$nJv;D4rq`Zo(?F<A6ghqvPWJ=vdzYV(w0KRz=_k-E8 z3F9|%t9NC2`{^J4?#A{G^uI`Bm8zW-%QN7*WJ<os{p6h*!8|8OM^*V3OC7X)cUOFK z#@`AH(0fLXpF1TmUhOfUY83*P2q;LFS4`z61w&_z4@{<cJwa!nTZtv1OyO0HT9K<Z zR8K{W!g7I;-H%1}Ge>4SF>#0V7~y+)_v>HBj02a7bS0Jp0}H?@k6ykYsrameo@@Es zlAigx7PuWJ*zAfJ>njXC8~2{gFEmAmngnN)bD~I6?TAmvksy_aS|+;HI+rTS3)&n} z@WR455t_2`sjI6iLu=Fck?)$asT==bG=4Xh4<wwc>;X@oFnuL}$J~*12~gK{@sYbP zZS{iXUpd+0RmqW!3_JtnmpuA3-=4Ulf&Jqn)N?Z9HN0o%*GLQHC7(3}(0xtd0-^IS z*Jma;0?!GlLsgFpu3(A0>it@%3uk7Wqx7qsZTIW@`^xXbJ-yOVeOVxe3vGVWnOZk8 z`gZbcfI)<{UA)L)qxag2i5E%LR#B*bxH;%DA6ymSnyq+0R4dq<ZV!5uGl6(|#g^jy zkbfplEd%ifW9Auf9gam&;aDRs@J5}Qh1JP0Qr_F0^HlM$@h@as#<57U!_ThO{_;rn zSH`jf=Mt`YZU%RrvuXAq!{r_R4&Qplf{|J0b=l&6h!2TxZfFi9oN65FYX3)d5R3MZ z)`0bd$$#^PfA7gTe!+QV&8gdMpdH!i7LhU1&V)>yUC7Ls_k9z@DVk?{oL722+>l#> z6xC0e_?moL^MS{XL+fh<?@&eAFZ=V>)hO=+bK{w?pO|5vOD+hnZMeXBx8XwP$0A_1 zM*WTcCP9C@79d$)lf8;L*--Sxx5KlY=}K!GE3MCNr@Dg;yW6GdQogS!r`>LbS(-bS zGgO)-3LFkzw<oEUP+OZlGWFgoyAgP@DRF)fIC<&d#%~A0=kk}Hmwf(i5(j8qZF7m_ zSH57KQFP_X%Js0^?bpS7AequXbegtG_XVsvy&p6c_w4#bLtby~W20g_@KM)8EluXZ zT0lNAHFHBc9EyWK`kLhxq$;{Rd~N6%)LcbZFyzMpCa?17!&Dm3D;?CQ%u5N!Qiu=s zaLIw{eP-ZAJ_^-<T;1<nnVcl7i{-4_BW`;;X?nou$}Lv1W%lIp{pak@H9o9bkAb~& zpQIID+QxdD1~<FDft>N{b?21$OCE+RaXVX6ex={^PN~%E-u&#>{XVCj?L4)8_CL&> z*VTU*`R(?S-`2B-$Yzq^N20(Xv^NulCPcgD4EObglT=mUzpS8V2@$T;VH6>*T2^D^ z(pXjHEcQyrl#mEZkdt12zHYo#v9+uem9EliS{hp%2JMb{=ApLb{jG}4{Z#x`7p_C! zS>EZHy)><S;1#O3z68O0HldHYm#dqB!8m!wHT#&6#vU^1C4>vpiA|Yh*_9z-lb7W7 zjG|odgmNNFz|WPN3=a@LYyv?QUeKuFRtUvP<pa|Ge6|h5%@w_O4r2$&BPB5;xq<<S zW+v#wm~(o%ckv4e_z9pz)Q`FWei5w0<pBSmnp3v;^Hj?+R|Dqf?BqfAh(vfXU^3}L zhGSEr!Fm)oeHnOBMrZqC)X>oOAOrXPk_K<)Ptq>Io0ZTL2=0HZYriZ%$?NT9&HP;^ z%>lJDGj>X~<;IL0$MV#Sp)DmJ2M2Xzo_EvsD0b|s_WFfpV;^+0?<$<XL4t9Z#w=ps zx54txtJ6oC-Bxh}p{q;63n%u@>`7f6fep(fJQci2dD_RomsogVBT5KihF-)v*$B(N zq(I$S8K%5+OH^VJgDLaml>NGh6k2RyIv{jLeNGXm#ZoQs2xc@=GUpoiDyHK-*-1Iq zAdq5bZ~u6;HCJ>ahJav(1WV{%;jR)B^hXrKcat%<jAf5cm>quxQg<a1D`h>Sn-pQa zT3!g{r;1dntjy4hG#RB<@h3iVGGD9iFI<yGyod27b^Pz*QfF=1A~$0bHE{?cwWiju zWoS7DwO?#)ac#YOsQ1gHz`#7eHBRK-!c^K#>&j2fZu-<=QWvD~ck;dF3vrpzY3J4T zzwYD|`f3eFaqFAk2rhsAqkqqIVD%3HHAek!WbUqw0XfC^8>si82@G8*GAy>r0zVY4 z?mAE$S0ZSzvv$tYs~>`b&wZSo{bYm^PL6KCr%EQ8(yjLJ_;}k+P&gJXX=I>hiS_-& z55aRTlK4z6aw0df$%=vSn(P+TV&~3F>Re-IlRo1*5l*;1S2Ku&4jED?g|W_(9l_|z zn3362$dFAvx#HhUw&sbYQz^Qc&Pp@|>s=c<W$85Tbg?$_l>;QtvK=tT6ZU&hRwAj0 z&HrT?ZrAYIp;yH<T{ii_sHv{yf4!=WdW^~Pc-wAcKL(EEr9S};{&=tJu7>v^PY?N} zahog6+vayLBQUs3jLchs7NeKeT9Y?67<}E=4l(kiV#msES8frjcnsvWmbYMqHMlVc z)~|7Wf09Zswmo=Xy^Yp{`|r)Gzi|%9@S;%n!003kuvFNilWQLG@$E_E=%0cytGeid zn2|S40+utFp$Jy9>_agvv?r8p&cJ>VykzweuxS(FM6PIm;;X#zTwO!e+m^gdy>WUW z-q*R7!b@~Ek#|WxZ+psWt1gCEtG-X+suIH)khu>D3<4<Xg}kjNnbC0HH~K|P8a7uf zn6Oiw(di7BcB__2=UNtrDiGQM{^4O^Z>a~KK8&=!+FCerL_LKx-C_+|)H*hH4IC7- z&O}}Rq5Ol9Z;_&_Y*cEz<T!0J;DW&7d6nuFKPUUO+^TRdBi4pqI6)H=!WaL$Yg0z| zCgfF18gBW-L$9PR>^5R-xbp}T%ds1!uj5_x7}^qe0aY4!;r``Xz!x!u62=baJfQ%% zpA+c6%25mqQ8XzKs$|{_jAC#HLygG)C?KFm8w5C59hNZdn8#BNIip?@q&mY)1w=So zDnK&gTqSjx#G;rExKKcv8U;;|Mn>~^xh2dJ`Fl)wr`2SgYxar5@~IdCJ6A7exD{*V z@^Pslp-6s%4(_*N69j?|R3=VwUeafXLP#u}W~M=Nd^IF`gv_L(L=dSTk_)LXlBZb+ z`6Tu;3}m)M4GD>*ut8B|;4|w*cLX|de3C$25LX^EQYSFbj`KWauTRSTS^w?7u8dg) z+{BcbwOm$HYcu3oc}b8!&d!<n#+5sO&3jRMz1{TaJd%a-+t2QyoqbN=fLxcvL+71) zHMKu`)ce<QQHlq|_HPh;^qS&(RI&JIH7PyVzC0Bk;{7slx~eSk?4wbq^*qw2cITJb zg`WG)g-+%583VUCas&|I1^IB;G_$@y4k3vbGwKx-Nd!zjB?*I}MoNNWkbvI~_gP8k z!;Bnxza)(9q*P@Gqk|>cnW*xZjuP;&m2<tVWE8~l`UN}tJAj0-k)um>qj^uM<DHYU zyLGtrbI)>I;~vKhmxxtrNZ90iwQ!)7OD3>M;zkC7#7F6%qJkxL!7<K~O@=6>BzS0M zSWp6sKuQi7))VAf)x@WAq*H8rHKR|_0#Y4DGBdG^mMkmDwhT{M^jKq~wMF?gqmk7O z`dK$tL3hgfb<|Lc^s@fn_jcn!b;2~_ADHwUz0l>sl=b&{S3N2F*SqyV*1~8iVcF8x zO9=C34#ZotR%WLdlO3S)+DhRk{u@$Ol^kr%*-2v@t3Ce;Gx5|}GYmZf7-f!JD3~Bk z;FjaDB>qzX`J{IQLnT7UWU+7EL_?sqsZ=_=0kBTQ5tTEi;<n22&%nScrfZJapOG2p z6-6m>wd}Hz_^5@en(ZM2sP+^DnsrTpnH#ra6s?FTnV=NdM_gTO{cVugI=jdX{9TYR zv*0I3{Abs{R^#^#<f;8-x)3UV*g~FPp#CD(7YL)i+1nnfuEmR+OGyxn<;@;O3b5$s zF#=s}Zmwi12G1sr2n13?G#W4vCUI(0Ajov`i9pwD=A%}ZD>zU^m9R^kWYRuEG~kb} zB-Jw}K5*8WQJYC3$TvWgS&T+!u4KsuUjMyZ?gDHt5BPQ!|0C3?&3_n>1uZ?VxsU)X zy2+Y%g3W(~EQJ66>`T+|)_;i&*MCXTL*8i+w4hz+u^%Rj2w5s65QowHGQm(Qc)&_U zXZD~*tAP?o02gvP7&FTI>{#1KW{M=cCUE&M>WCbTgLI+>7>rdU7Lh?EiB0g>Xim#3 zx`0obDgg0wRaD`G@-+xB)z3ZT683m5y7aZn5HYpqy2+C2D|-#X?u>hY)PalS48A>u z|Euq>K=StD>V(B2hD0%<gNIDBK;z0b)l`e1Q<1I~fmTj~#!1p?kU%-4n(J;O;~^4R z4Dbs^m@~|Emd!xWb9iNJ4;MmVOkp52ASjG8bkIsaNfAs{Ea+4<V#1hn8-zlVBoo|i z6><%GQTufCu)2X~`C{$y4Z$md2F`enZ||-K8_fPN=EN4%BG_e(QcoQ%)uDe<w8h^V zj(eHacjr@sTR5MEWQ)5iIPRj)`{S>NnwAmBjFZR;3ntW3Dr)G{WvDyF#Z7$bZWK(k zu%Op6paa)5<YAn*-7PG2JaDh6Q@@lKkYms2(Se|qpV;=URY_<;RY$0nme#;;YWKbe zRCfZWFe_-qsQ7_L^-?RLM^J4+%w#Go)*9j^&Q~wZV1$shOs-^NOZcMjP;cCw>bg;V z2EUp~a#tl9#(oTkkGpX~^y|50gns&XQ~|dIUd@Pr5`wg<u!;ii=uiZ~9DQj*IUZXh z9m~Sf^I}#9jJpNW{dCZ`+<QW{zG>GV8Oz^=0B#KY)-*>47tfm}kZCMx2H-d;aMk?2 zRh5(a`^qEk6c?TogbHcI=&+F^R4ovaG5R!pSw|iK3-4PxU9s7Et^Qek`3yHcMA$Q$ z?qkas)pf<|>foQIGWycl2<a<a3K)azw<rI>B&NE5lTx$d^D-(s4{F*oqS!eRS@4#{ zRgP19(P)4!OvfZlBk|9b86y613bjj%{^-2xM)$(`1#(D5#%IxD;N`$h$$iSyqpPmm z@#%L7(eVt$2jG6nZxF(zwQ6~Gvn@o{Ey#@HWa8CO<JJ+<y9?>%(kqSUG%;U5h5mV# zg+T&MWe->Fs88z%9hAQlq(Pg)N0)2Umk{WF5Vc()(Y*(ngu^zszR5vC8l3G>Pex0t zhXbkymL&#6J;vD$A0x%m8_MGOPf!jpYlRuiOM~~G>m|W+`yFff5h2Pyi)F9(^saXA zgd0Xf!-q4yJidN>QOIV<%jFA+%O5@GHPcvwfp*yR_#|W<ORJ=O+qkcS(F{-U<+WDq zplNkf9YRK<rp+O<9}*&>o<r5(YkB<$I6om0bhY(V759RCMFjmEj2qxqdf=>Uh4Vnx z`OJLx{?XP<!hAehw`l!0KIH%5K;prn_X%YgFtX(*1KRECJBG~5<rcep?~4!h=7~nF z<DvZeFm^FLNS*EcARl5L;V(A_SE!+uBJd7kx8WqNZ`yezq()7<l(Tq<fn+j>3VtvQ z^*qC*UfK@Kdrcb{gux%PM7feW-|62>({hwA$zxLu4-WgAQe6UXHcoCy7LCo<175n( z&=E}vt!L?FJMuGn5Pf6Vb5PKLXZtAaN#2(P4ag;Gzf=<-zu3MdxGL@s^bcRlra<+F zzP!^bBKGVpPE|J?Y+3X@;#KBb9O*f1zs*<nx^m()33T#thBD|};-kTOZR9otNr3~_ zSsmv4{6CyIC-=m^CM{q+tO5v|uJ&U@K^V1?ZorWAx=YB6k2$L0(K*nn8pP$E$<1HR zuQH5@l9U>}nP{vuc;DPat2u1ZwEPNmtxIH8u*w}`u<V9`7r7#p6$K2{KhRw`X7`Jl zX=KxE$U?Yq?~ZzkIMxtA(rdO=My~2stG-e;7Ru}DT!`wmsgh;!(6(D&DuTl-d*QmE zb1x#S&TD+hP)jcGw~KC~RyG*e_!JP3YHQZ;p8fG!_nR`q^K;K}?LRqd$d+Bb=0WtH zE|G&|+o2~{f*dps(SN12QtgFnN=I|qUFThg;usOu@@mIYdAe%Hk{03R2=1qP9dlt( zyh!Z((43}F#nLU7&DVJ0MN{eZSMzdKd4z&2-Mh6et%SUVc2T_X3H#8o^hyxw0kde) zZrRIU?9@v|qgxjX{$o-&Iv*8XbQca?-ms9GyNq~-wiZ@m8U&tcTCxQnJ%n6B__|Fq z*P7KE491!P;vg)?$-UoTe<!VIE$`HsCkCE1=XI84JAMNzK&7s~XJhMP{lxQ9*TKDA zVf55hhvi4FzhFN!>|xxGI#F#m+>DE7%ypdL$Whh11X2A<2zZf+Vn9K1tA;YAPkmN$ zL?65$x<d}adj{R+0oK^Fcw%l(mvTJFLrWfpQt(LNb5o1@wKgD~*vRP@&J*>ywwCNz zjd;e#3~k=AU-#Si_4<Mq7u2kMZlTWzZA(}<w9<WR$ljWQc?Yiry4AI3G@P0lVgYF5 z^^TTU&p;^3Dssrt0H1zn@cLnDigCO$w}8|f3g^Zb`<-s>EutMmonVU9>??CKiulDa zH7jw~YW{t{ETe|9nG#e}Twju$yv3-08a=I>n~7tH-Je_OV<LKRQ{gsbW0Zc_%ONdt z6$;6H;h3{3i1CGyctnWI3Fk4UPPjXJTeptPttU2@5eE_5tRzz+Q<#am;v~HSH0_8P z<rd1jBRF*%*j_gkXUt*G(Hz8HzP)if97Q1&Vr(sB2r%=$47i1Df#+Br-5wTH>r+gL zmd@^N&yzmri!KoD8>Hk_Ic5_M31b9S`C(3layw>%4LSmib|k;OJ*g{o>#q2fXgGQ? zOI%TDC^dDZ%jYD)Ce7|$;pYD52=6St^Ny6;pR@|+P<C0Eec+{hlgcP|d9PeqN7<)K z!ns^<mDSuk(q7R}Rx`Si8}Ogz+rjm>&bwk83c~|xaRKpAtprQYvVo2q$Vv;*<C<sU zs?K~-)6(H>YB!svZB>zfm1a?<EI&~LZ<jq~-!o9-n4j7}NgKGF<#}R|3<S`A_(x1E zJ$UHzmIlFV@dX3$+uG6mh)O5fHmtBQlE>^`{?5;OD7i(PA9me%`kIAm-%B;Td)aiQ z1HFhpD(7tgg(b&5?u)A`ohjm1sh+57%};IjspMX%reh)3w!?MR$;Pss1*xmI(m6{P zYq3oWv-;1<tJKwTO$$iiGLj89TO;>c)%>w0WQ)8X(OUhZyXy$MvQ(4Rh2U4MCwr0G z^qrfyF!Kzl=1Ub>`j~o-PBxz$^snbc6+@CM;c)DzyK^gL^1j5%08BRRQS}%VfyXsd zAtgjpSfvvfXP=}=cpUBx>Bjo$fLtdswVmZU(Q$)LXanNria5*6%F-~vy2AU^s!GBy zdKPlmaAIC&;eM9eQM2N|fV4Um;UDx<5K-)TJ!Bor0qs=H?2pPWW50Flj|kCjiW4L7 zK|EVbpu$u_A#o;SW69uy8RFQ=w80zfG9M}8#Y4L6C~R6K4zb#dv86|;dZr~QU%?OS z+HNN3FUf)Q7?l`PL?_tJ+O&y~6iNLF3)pi=2&u^X01PsCi@i={C)Up>puYttrNO3k zGKz1x)sNBa#X2ZGerlR`WzGzGoY}yBGmk6$6YjvB3!;|$dvx1Fe~j1@V9hCcsHUdI z-+Arzj&D#@te&yw(*@Ypi2~%M;~egT<Yfd7<3T`A=?-@ngx(O&dh|(YjFS|aS0&b* z!Ug=t-AW+4lQbMen0v5Cld&;>Y$&jFUw<jVZWyHQmie5?!DYn@PQ(ZbDboeL5xP;o z<5K_{sFeQZ+)oiZc7}o?b7nudySws#pL;1f%*_Pf3{*wyfv-0&53z%|k!^OAZUE&! z&6!Im#iimZ^#*T}QU`lpjb{$toT&<`?9<8hAgRFgy79IA8tM^w_x{oim?j)2dVQz$ z$VF>S?3~+M?lV@Q4=3cbMG$oQH|`o@O}YL;VpK(m)(nc)-;&H~zA%@q%{`+>MWm81 z(!;DSXlBd<81R(cDQrS>l85ufp$Xbp>yV}<+s(Z2DF2f@CFCx6v)DY~p%+~o!at45 z4AVR65p8Kz?X7UjNY3wO4x*Rr`$V&ATNlJTme=FGsndgv#o5t?G5X@{r_PgZl?AFI zZZo0-0}t|JhI{UWnLvH_E__xyw5}s7?X`z9o2cE|xsI5`G2I$%@Rl?bRhKd*oU8TA z3$TY5!kgmW=5&UXu{#ZAdQ!O^9$N|Ob{RIAE*g{Cz(k~@kjhRmtx#bac<pXrAZWab zQahSaFce)S^35hlqe`Yd3DFK=27RQ?l>T<fHlsCDJ{2IV<T+vHr1Bo5-iT!~7)myS zxa_LvTtKUk8&MRZM6h@suBxohxfh%>00QyZ&9L^^Z|PBt@@~%~`TIdJ^3E76rsRY^ zBW{EGlCd9N$jbM8>M=%<-@*@^88%cm#h{>-&|w$Ha*ZE?wBHw^!s(-mu#e@ruu80o zK!_4WOqHM6{*1~UpV<**F@eT=V$m<3l0J2sD3TX(Sf^IPM5s?#Y<ijD5`v=RV!7_* z69@4}ebt9-3irh{<?;5KwNGanBV)%q3@5JRZbeL~y`8*pfMGCrcdqg3ODt|`l?^AE z8<qv0Y;dQK(`v#`0VdQXaeo{5C};z`fLqXM2Eo;uMjX2E#@N8%D{-b@wKds#9+f_a zJZBgB2u4E1x>jD@E_g3lw#Yjx)f?&3{G?{aof6Vx^FFdP47j-cXtup{YRglO*=Fv{ zE&f{W7>3M!i7<lgHp0{>@X{j~|A&NMH4t`jWzz%A73rqP9#oMi$s(zOSx1aa<7^2> zxG*DIR`UsQxvhynteB_#47}Kmq8txHZ3H4FfX<%Wf>Ic^ZyK!j(C#ccC}7mBrQbw> zyImC!lqV)7X7$Ci_UZxk1=Hd$Cb}F#lz2E};Ey0IVQ_)SSP9NZJFU>8n<wY16^Kk# z7QWXd&%>f_rfg%G%m|0Mf&MXepj6U5uf@~bn3rKd<q%)C>OBSEC3Jp_K#vV4Y`QTh zF*i4VmA*8?@LLqgyx(uE(1xnF^()iPEk#AGeLl0p!J&3v=N^<zxd-yO<!o!hZ$HcN zeuTQxN9Rpu*j~viEabQi>e-njk|~-<nf3&Eey-iK7Ri6sx(n^Zff6{ZSI^G7cE+qQ zslJ|->OR{7ygTynrwAK$$FMtgpf)iYbseGZCwAlHzXCf1%IB;R?M-cz<O?Zk_sol? zeC|qgfa5oNyZl0k`i<l2N%Etrql#ar5p;E}p=8<G&K)S_{8{o&qwGPQ(?r4D<R9rZ z|A0mRMa?x)`WK<i7Zj#vRM417O_9`a@Hog@a|Xe8{Ed8)Z0>bHA`8^gZ(Xd4bnHPu znhP`F=G8lXZ2=x-e$+fwiS5p?sJ}Q=!`=+<^Ss&Fr)gm|ERiI{GP|i1+AR?Tt>24@ zZL48xVeXHm-Rsw&NK7{m+JZq&?O*d_YHyBwPqo)gII#l-gu9@Je$v~b$PMjU6Ip{N z34_&x>6LjEc_b-}9;hXG5EHz{Jr`WG4Ux40)u-wqPd|8uN$hEJMgWxrKwN^Kqe_RO z4*_ss4VXbjk@rzZ>jQ*~qKnj9)*%Pp?KQ{Pqc8|FhJnoD(%eK8P@Gv+jG@}PXZ*9) zqgwJ@ug8ho(-A<bJ5MltrQQmj@48QVB>nK=FQ=_;W#811-LQS`t&L|S;Z;$;x{2=N z?lSqhSw}9Q`YH&z2S;aw{TcxsKt4k#+B6t67}PU$Pj(MWuXd0-S7$oPTj_Sz^fUOh zd)kJH*d+vh&ggkp@wL;SLGiVH;4OHycOgI6BDX&SLham$3%|)h^2GS<@@C46bUEEo zJ*H9*3OO{>SPXU`hpf{|o|}EUoCWs^yZ-qXhHGqjr{UIP9#U`V(qNr5fB1v)TdAw& zJ5<01ZNyovNv_*0<vzHmnL&P%R{9LXaSP0vdteLv{hN*Zsl)fecq2r;Jl8|oQ$|JP z<J{(2{YUlo>_~9#k?g#zXWlizmNqdQ*|v@%%9gT|<`La9yE!DeY;VX=5A_HOh8gv4 zuG%ClDxmJX$sx$rk$+>SrrG#|{r@@dsGdM~cW1U^U9LHHDyp(6YDfpSDaSUzm3>!< zB~z4C9vRNoZuPHy+i5*!T+~aAg%q343}QXN$S?k$Fi3r0>UscO$cE*K>u!=M5dq^u z%!KU~EQ*`$S}zve7P$@8T1LzTq}?EK9{9)H>I@@*2c0Nn<LRbp?|F9z+E5EL<b1|( z6iSS~&m_b&e@pr(^Skc~?zSiBsn_8x_CX(Kp0bb{7Z8qW!G-aCw?TQa(g$mSTH9eC zG+#LeAARz~LkE>BSmUSF<4CVPY@9JV#4WVAQl*EsI)3ftGp^lW9*J7zT+BZ;`v_F> z=(aJm9-vMre{(yVJEF@q#6O$>4UZ%|@oEi=ie2PrcyGeG%%ghd;^j&X_~69k)(VpR zkL>qU=N#bJb3J0qsUk<~0>7B_Fy^G&Ty`oem$W&AdP>`K6yCH{NC`RKlq_?kP@UOt z{QtrF(}QECFHt~p(7AR08rBHfd~Ey9_ZY<RX4cgM)ZyN+wvD`T(=oPBcHrc2p?6uH z$jo$nQfvuO3Dlh#MHsv6#qMR0%x9>ZxS>c2-n~%8Zmo>t>B5Zvw20`A$WGtI@hr@< zN3Avzj8t8(c&H*aR`nsXPkGA>%-2La&;itC3yT-XR)7W33d^?lHhLQ^sG@3Wd3%aw zO)<wyM6?tM@>YS^$}zvaQguk4f&goQ4zUimPG^hAfeYr~2jqcoE2!Y1sanKBa}vk{ zj;p#I?Kp=R2hq(@MHMeZ&v#l;pXSWgCgG^e;+=V}BiX%i6tW3l2X~suGOGGGc)SVG z!DNbG<5KJ89F<glGNnILT;YgH0sQ~xZ~cE4t>F3T-lkM_{-<lB-xV*3`2}-<50blb zs>&QgU<wUnCVpD}t6v-a?pzroR%#p%MaBjQT{<|^ZS<{Mc^Um74RCypM=tK+1lL;o z-HaA1%*sxFz?gQ+I6$yJGfZn6jRB5la5-;I#zwXqwv8u*N1xO&h^}2_dPx0%Jt%1x zuKN|ZLRpw<)t&2sD^)9sCPjhr`EXcR7dM@>8GrSz63AVRwTkY^HgU%kj-zD$!GFpR zD6QZ0Wz^TBpWbSdB|ArkD9r9xH<=E#RaLJF0dw4dlJLWN*bknM5)jeQ?VsD|H$?|g z4i{lk87g1jB)8Y8n7EBSwp&_}YPA0upF~QcIoEBD*7AJtVK7v6xbf#6Np>3irmY13 zwIMLn1PP;Wd`yO{c(=Ico|hyNbBjvqi{go=jXD@&&ldxj=Hz}mP!FPoe%ybUGDTt! znN*t<kS2`mK&$B4c@Y51Ft0>dE6QoU>0vO5+>^r%in=N)(pa43hYD#ue$gpK^56_d z5!Dkn#MD3Ty?wMf*g#go>O=Ap`rGM4y_t@P=Iq+9ZRhA&4(snaVd7qRZ0r@CwR-k- z+iHAHhdfC=%9M>8>g&U0?^$3Jk{NK0q@-CuZOGe$4b?W8=p&8ctT^?TZ?#@p*Rc2P zrrn=g6Cg1!q_6%lViS$cZ5AHwSUf;6ia^E}DO%{oo8Y}-Yt{8%pteI5ZKL$HyqO&| z;z`f9?;$UnmiwVrU{-k;ynR=z#+t0rMu4`mMouUr?JCdWX-|C$W^mGv2UUMDCi1Q8 zjz#N_#Agw%Kdjz_%_5BFXl&U1Dap(8Yoj#6ht4V&yYE{=B$1Z!ZONz6{qnqi<PRsm zdbGh??nGL>7n+!aLX@9gX?O9bXBfMeFa+sO(&RICzK_5RzO~W1##`O{^^7Ht8+gLQ zygEEKUp0s%<p%1?YWAGD{RD-Sbrk*0JFK`Nj=t|zvgNcpS--O>Fi%z24tQ(`Z)OAP zcXA}J=wO_8>?d{%uc)`)kGj;Om@+hWFD*qoU0hM#F7;Rc$}>!=ZIE?j%@WG8UL&M) zKSQV_$&G&X>X$n^&PpVNaWu!$iR`<#IeV-mQg7x!*qnJm=i0P>;2#;cSJoX7*B2^k zzxE%Ks!|;eeJT7_H3=C|(s$9h#(hs>hINg_Rp>q%GP5MN=*?>qAqx6?W^z<khQ%Rz zP1hOZTD8^4X-iQ=^D=_Dw!mQQ3_eF5?L#fAVX`z@rw*GzGX^W`V?ihwhu6ELuS^Za zc6$f(<N3DbF;6MU4dRh1uRz5B>RtFng?RDB*u&wVtxwge__iJeYK`u@g9eNt*<<Re zk*HvKzO^N+N&`fimVM&Z;_@+^rX{`(4?g@<`*$|RKb{&gK6n$65)uiVXVR7!bMQp{ z3>Tn>jn>G4(yeQ<t0DxOkVZ_4;e=D9&wM7)Cd&ydE!MM*Wi_a#rJ>V@V1<e?R&}st zQxvy3R$O{8>9ltmbZ*CD{np04ifl|biBvc;*RQfy{qdyNMck99=8sOAAqr{1E8pS1 z1ZdP+c73y>(!GFvS!q7*8ICROD4w;oq)b?LG)3h|4vcBqb-t!y#!-fhV~QK>oV=`% zI<cl`@?{=NTGZK>!;E&|_bzcR@XjaiMCl!s9}@LwE)auNY9rH>T9#7#XV&j%(0lS7 zi~5o5l*z~N5#cGR)F5C7+LL=+M%z7!d^cCukGL^&oL!N%BcC{DseK^sP+o0)%-aVM z!p>TnuguLqHp!1kbV9KIrH=y^8qvx&;&R=MRi8#A0t1ilJbPDZ4HIN>Mj76QKYc(= zbJNY4r2)~o?#}dLXQ{~La3*@X%#RU9jFkdhvijQNViUE<KD1WmETfvkiqh~-fbN;r zeMYZ6Ka|LKH&lDoGd<*bnt=V(AJRs(m$Tlew*6KsxBW2+GPM>zBe5u=uV@IWf4zk_ zvA6>KyjCq<_Qz)Rt5ZJtYWHPpOVz3i);=9;tnst50^Y0TBs|Y31_`W-2kk%@+;Jec za~OKH4dfJl$B`YS+y))_kBuzW-7D+_A=>KFJ5k!Ib%O?w<zWsz%JEu1sFg6xsvE~y zu7rF3jSBAmX7f27K-98Mklna%n<SK_`>2~)<#~bFL{ncIc5Pbvcz6og9vfJvtjO`O z#c+pu0*fNVsx5SB;5v30AoKFi;@Cj-UCTFc$17r0lQkO7gHEkOqQQBK!a#4T!#9v^ z*fqd)M;tr~<yfFjW0>AK<q@rQkr{Gj*VxT4#x@kS(|q%!dy{FucaR|9OOG4%xZ-DQ zUJarrM<+T*>^@ON$?FmQg2rqKHSl|=4e(iH6Fah-*sgQiOfk8~NL!u~2duC#{3$Hj zi32`LKGvGwPRmqc^LD9?Ro+T-w3N`2d+RzE2&YLJOy;&_KcxN67rJS?mv6Upy|+;Z znIg^i0ZIaMG+9~(7yDWnf12Cdt(-y~MOR`;inle_L)I%O-cn{?rDto>O=g$_U<jZ= z18DV8z#!ekHY#V3+F)Krk*Je&^^5Ewsn7g$I3O(nnoOniqM7=*nMT-zQUQv2Y$3UU z39lCkV_(S|V5+&QU2<1;XI}M&<EyPyy&&Zsj$uG!>NgZ9YDK^<wa?<$9)>koYJ1}= z$7{Jy0V&L(sR+?1ePzThwI2fuP+^^-gFqd@(wgFX-o`4(R6VXrpj+AVS6|NJl{K68 z2iC@aq*NT2Kb@XJFM6D}siRP};;_8mTaY$9R~sm&C9ircPxIc(OgmrA1o$ad<D+Mw zSFDlyV9PP}tMOhew<7Tc=ho>bp*_hVDQYidpNpr%FIZ$Wk&eQj>zAr493T!sc-jVj zjgK`ryBVL)-at0UO_pV#PXvc|Z!_3^J?*|nQEx_?w_d8Z2KMw|-nMTEhSKrbaoXF8 zTL^y**46RA22)MQ8t<4E$<N0DTx<1=(I2Nx#5#B8nRb|aWp$8EaRp{>@FMo_l^*7< z;=w|;Ki&b=$Nkycu)o_lDkdbTMp?32zegqV$!fkjaggjpZq>?+%_5P;Mr!WO(5V@@ z07n>oWx8&N>rO{nW#Ee7mBD;nXz<D})kEqQLr!3U=nUeDf8E5Pn-%G0F!Lh!Y_gfc z>K8_`?5X6n-vNdz9#onRR<AlKv#@ztgsXIl9&T1n!IL`RwG^Y2845XGR^&7BZ%ML& z7-Wv2NPf(*5D;~LdI;%D>UXA7&GHckVGtm3?(5ppg}Bc5wrnyRKxzk`6FaJ0VGPml z<fHuAK13&`6sOxB;&dewoH4TtW%&$|<N@~mx0M^!3{E_sxz*E9nc~b?dwA~y#+e{O z3<T}ZdWCv9-!8NBNuS%Yme*nX9pY`$f6ll3D-?NkY>2wvc5TrjJs2(phd>Ry1>%Hn z7GO|ah;;EGz_=<K$_Uo@${a5pBpU%*`pjQr|BREc4w5A>?I@t%IKreLI!BR6NlW!E z8Xvhi0g77Do6Hd}etJcATVM9eR&Fq>u?AcdP}|>=d@9G9GgY%?E!<yA!Rzk{wJH)% zuB8*^Ehj+Bs(u`CLPPMMBYq*>zrh2ns?H4t!#wbZZ)?*jHfB|&R713*2w{T;^P3Xq zB}PesC7ZOcF8`QK_)qy-)t<7!i<;48L^BHai8s`o{f8Ogl|c7fRJG^ko}Z_bsgnz7 z#+$k(X8q8syA>?;#(!JGV?WC`#zO<H5@oL780$sS%s4?spndCf6;}E-oc?Rut>Yjy zY>ebIHACR51p?7i3Y_D9S`oqimP-!XR=gDH>N6BRKu(NasT#`3KGa(%cV~bLZX3XY zfhO{=pGsD5*o9g>&5o7&CqP4xMH#r$HCar~#9PK|>CA;5t+t?AE@tLrjHL)}!{!z8 z1C<R&_A+zNSA*)kky{d%$+`yAFD@bgtyQ3A*ECvFp$4pJbTCUJacXPw$`MBBd4n&D zj9tg;$XWor2PU_4fRuPeMA658qax5$?FcK6xylKUjHbGlDGp*~Qw6$=9$Qx|@G~W+ zGHQ`jNSq-B+M_rn_eJoHYi&mXg~*cOel0>U`oq;KEJP|xc7=&7eW0Y+0Vji99HX`I z4C(jn*(=uCNgUs5ua3lW{Himkb`W+QfA1ET!^MP)B0_whN#dQAv`VkRyfgS)l`A4_ zK8_cX_QrO=Ajq4zb-Wvd4b{OG`lmlUl)zA!$HVZ<Q@@r>dwW<RtBMgoyz3%`X;N@I ztujywfCo?4UJNgx7LCzHDPSPPLgE=0!jKQZVG~smt=GO7LSWjKWZH7T*#T`^ilFP3 zMYD)da&10ioHr7ia*N;vAOJ2>%YCb_yN#BU^hMuu=q2=0ZiTbi>jps+tAqiYtp(IC zGFdXAQ_G7qGj2JtO5Fg7p2~~G%T<atZ-(??62ZFOT$(lf`FEjAhDc>rlvt#Q6i(2U z$h<h2zeUTZDbo7yz4F;LwLeA?qQjssWZy5e(jshNpR3bEiOxS~`beXB+f1T{ca>)h z;xPd+t)@GoTT#0x6}3QdZ5~TKj~xDL;r^B>9xg}9Emi{rw%fdDV4>d@x;p`yh_4=& zMoR8iL%N6`<^_e5MS#G_^nq=ST-w;m&{y&9q{lI;Cz#c9sbqpkN0H-Ei}iLA{?%@O z0gexn9ct4LT+>iCG0|7T`1tWjj^C*$*pJ`4fhX_|MD37e*L-(vEPwNg2$P<rd1A?_ z(2vXK6EnbYJ@>7t2>xQY3A3noD<h@}4;kiv4J|MLiPG(~9Fqm|cVF;U=aG#2Yk5w9 z^n5{N-fx>*SGnJ(;GE#$st7|UX;3k0Vl{}GmRQnqVnz?ti>9U3kX{tm5H&Wql~5|2 z9o50JQ4(t%g>3c(dV&oco-JY3fmKKb)reb?2IZ987KO`?e1P|R#zW6K)?`WUpGShf zk@k_7LKbDT{w)*_xON`-dc|FFRl29R0lWY&fd+t8nJie<w}Q66bz}3}@9qYC@6HAR zwSMx>eJHhwrOPOVs3Ik2?ErP#Sqaia(WPM2lO!Jo-3g^IqN-eur-H9iu<~3E(+<+d z43=i%5lF9kHJZZ9(-nBCBW?^oy;C(fHoJA~jJv^O6oZgAF`sJS%RsVo_sgiZ@aF-G zKg4RmGc$8N=A2*(!N)L^RcEGx@-*VjoiHe1+n8?(qL2o__(H!izNH!eD)Z)bHwyx| zuL7&D0=R!vv_PtZ_?1yCcU6vhQyIlEg1-3${e@!C1(5Ny%Xc5{B`B(vcOvWM$pQ$6 z`TAp-OreezRGeefa!F}s@s!G`MKsiE(S!4@^~tUmLS=3|2<l}gE&;l<H7YNgDYuqH zfFj3NnK+nBqn8jw>%P&s09vtf&miq_*4X9{#K~1l2!Bm2n9%<h#h%1r2|<>FSMhU9 zhKuC{^a<pIb_CgVZ2Ay6(^)3!U*5rtWDEFe9TP|a9_y_vG#QHYjUc7Tw~iS#1Sw-; ze5eg&gRRs(QkH7`^!(SE|Nr=P$jOE>c@8ii5MHk$3E*nkFvd0uGCr1qWzP0W1(LZg zREe@ohT?ZH>Oa56bnG5#7dH2~sudLw0(wU8qF28TZ~$%?KA~||gBD~#>l2;)qm*g* zl7es<&k0uP=0#56?Q~#H<rbiCq!z4rK!QE`w*<TDaQP}d%t8oR(2->X{%^ufnMJtJ z12Ba#XYH^|cKB1l>H>`vX0+-zNjR3MO0qzzCOSJ=9Z*Sl+q%my#4(q9d<20H&H^=* zmG*BHq-AD|>HzhIvbdtF#Z%1M5*BiDq-pwDy1|D35m>%aIzC?-4?Q2XfO`vyOaL9f zmAwHY84GUt1w8_XMZNFuebIg!YQZLv6BEdZj#(#0T|ZKweEf#N6%Hv<A#y+D1+w$e z-vYKCJuW-jDy8lsU@y4b`Z2<OTZsGV<%Fm`VJ@^1c4@eXwT^CEll6c7g>E=ZocJlj zP(d*a2g$mUd7(EKka6=&Yl0e>MwGS(3x+4tkhIYUUzB__LkvV2DFIsA;iGqKwJW&i zxBi<4&P)2XCqMz`<K|%a{2Y8#sbGjG1YiV&pX^`&@PXmabui`(dRKUcFNe!&YQC&y z`cP-q3*+)qs3A-zexP#Wr-?1G{J^rD7%K{YlVGg%f5Y_(-Pm`*UywpigH^7zpoAGa z&c6NT_Z;h$yGNnIXje&>wc5ZmxeF{t>Lngn>3<OtjF!_01R*JA9owKG$YLSp>bIjL zjOwje&TL;E6A+cXJaV$S9Sp#f+Cm)2I3~RCNFJWsY`RhLQnHM=9M7Lwil$}*fBJWL zJJX|wyn9}PQH=Py6h4323YEAjo4iei0N0NDKoYnLAwyXf;UY>7p<ekxDnMetoHZ6e zBEd+DX!tCrB)MnbscVHXb;33Dc@LL|K^?Vtcx<5{Jvh%$=X=Qfep&%=6^k^3jhrKH z(d(|z)xD*+F%=6I`RG9NM~=}NI*?<`k9uq@3vl>#1;wpfHU0X{J$Ux%t!#5hPlfvS zPmGxwYyrE-%+FPBJHL-LxQrw0AQ`DJM3c3*IZMgI<;0JzyQN?Kll)7?ysMkJi$&B^ zt~+vlvbF?$=?Tdne6_Va?{D>3RmU0VLevT3&O8O)#ymBbgRc)2{)T+%0h81i<cU?K z5^e`$c~A{Pf>qipIv9*+{Q~ZTP57}3a1P*=_A4U#@?vX`1X)!FM>p;$3AcweY2N=| zEuHZ(44DAF#7!tO7(4E{q$kHZDC^1WZA{OXU|F^$`DWuhJr8V0npmQJE5VYcX9Ye} z`E;@fHw1Zhy&gS^asG{k*67>-|3VKf!DoSo0k#;A{^JQECX-zyE0nnZvkwK=(JKn- zJ8LCIM7F<XkVs=+()D^F-iPM=w|^AAx9kCiiY~@8p0>IY>ct3*C%Q;bl3ROP!jBPK zgqxfNd?PFFGf6|R;QQ|;0-qyKN~uPK$CctkZ7)#3MyO(Q4n8;=nPt#}c%O$*TK4eI za`yjM6irE8ZK@%DlxKk~n->9J$@G>^nVsM8cS5J-1R{n1rdR)$=95!0+LqXNWdDWr z9df;C-TZL~__?*p#CGdqb2SF!Y8R`hmgRIIy}5=LkPSalP5>>KlY4wk>oBppJyB*` zPSE?}Ils*<wz)-~6TU(;Fb`z{-uMOSHa_(As&GDcw7g`Ws9v7fIdrv1;0VM!36Cl4 zWt_oJ&cc|;E)*j$xDFu!UPb8)OSbKSTmYb%(}{vLzI?Qw7XAYu%c$RBsxLXz>c5Y$ zr?M|j#JY?9A9$R%A_m8|F^ulsd$?}8--AC@fM=yy;Io2BwJ{%8!D^zF`Q9OPcy&0E z5uVAod_20ndL3_#zfM|$$7VsDs6&w95p*ukB;WhFcd_@QGLIfFK{z&s5e{dD^*Cz4 zHt<at$Ivbo(rCK*<_V1KzQ7PIps)3=&sdnR(qGG4<BF$kRIhPH{P0LkN?W$zK4UjR z-kD}we1W9j(ZcSi=PCj@+&9Y7_~4RTXwN&<P<#35a!us!8_kZzL^oS>zxlej6xrR5 zrIVi7V(Fgje%z#*(@}mvT1xnlHmGzmg)e41DvonPsy4~{L%JrfB7F<xUB)487q#2z z>!%x+$`D_MWJswM#R#%K^U`?D4ar`(I=zrSD(tJ!D+>3{F$MKhJVqP<S*-Uy#PCX* z(Y=qcF2x#8O;b>QZRA-yc2k{xX}SSy{TB@QrDM5?PVlL%i?>qCtV&D5#i~fy4WpO* zDakWaWKI}yiv=h4aUNqfgs#SS-3zKV-yFnyCO=U>QtMB5(_td@K%&96oWIMM{)a^+ zv?3lbMZ=lu6JY03ZG&r0OA0|XXe{6ng{RyUfoi$JIE*5PfQeAwO+rvnT8I}y01Qgw z8J1T!GtOmY%D4J35?``6wTe!-P|nXdla!YZ?`j3&#d<dK(5eQ3^4khf;e(<NPi0iU zY}}KG2+G-Ys$9L(1HER_Ev^m#K!OW4;VH^SH8kaJJ($84X6$i0I}76eO1sI*NP59B z7F2*&-h2w@+iySI2llMV3f=&**T&_}xcR9jJ*Ux2>jq(StVIelsH(D;xou%eU_L)L zMRjeI)PUC(Vw#f4;tFtpH5ViOr6oBQ{OOAr8;DTxHRPX@J3aNBsAsbRJQViS4b_US zxB{U63Bc4mG=+hi9`tav+2}d}2k)+pMapWPMpTv!MzorAOR@Yu!yLmw-)L=4r_?yw zQdTrwnMUe|qPkcdQMXhb9`LXOs?dwhjmoO<<lBIzjGm1~djf1B##lUC7`Ifb{z1Y; zrqS-cW6C&9`H8%d&h=RT%KM<!I_!Lh5h##IsnpOmP4mm1O?74AJ^zQbD-TNo``R{* zV`EdcnN6u=O{=ACYKlwcv}tN(rnzA`Q>mdDD!G7VQ;wBdS!x+lmRqK1xq?ErQJIn} zh9c#Lh(IccfWUX5O`U3He&77lA3cw7IrrSNzUMuNrQ)0Ldg9@IcXJTt=qBQzapRe% zQHkW^&muLgUqWe%Q4xnpo6d`R+{7dGmNtFX@no|!PF-=KgT?F)Gah@lGAJ(M9mosz zK9~?>Z%^J3#_dLwC;DA&Y8+V4Y)5UZ6aIp^@2cBj6FIfO{`|_Kq#Ct;7fbX3E0#BH zOMK&y{%yp?;@E;)<N@!wl2`JMIor>#)zL3nNHeBKiqXVbAC0Z+p*wj8u=hY{yopZQ zJB+~x$U0?md%9gZqfC-0sX>yMMe4|a5exz7m(y$2q?;eq%kCtCwnZih@Vi}kmvGC( zgdgXjlcYelZ`?n6$lw+!=!o0*!RmOvd^S?2CiY?Jq_+b%c3Sy`qRYKglnV94uOpE< zw+{4$M*7!*)vnz2J&+$eD-UK@%*f3_tci3-PV~F#8O;x*Uzvxpflxi3sJksf#X5wq zD6F8pB*zR*pHK)j_Rh{7rBbT1`YU%q@&q>xEthsfEIZQd#V$WW2Cz5b{5g;T^80o( z@NHdzSyn)(F@q*?Cu#A5O?{vxO#{$>5Zr;$SobIFSvag`K*e5BSikH|V%Gr=jFo>V zws|jek1RDIZWktpwZ>v`FR974BnGkGifLl81cM8O1eJq(=<t11lukY%rJ<i3r(nJL zCQn_q2`|bQo=^50MEl4^5ys9+hroeWByv$+2?ZU?Yc@ZpBqdYm>!}^0(7A;~aRPup zMHfb<BhWiY2hMl%ey1VJomrIr<9*iBI%C$oWVKerOKi(WeE}fu$avZ>HTpu0?slG+ z8MBV;9qCU<?f|GO$qR@UCezo%0=I}(Mcxi_wj(=8b!AH#NWO`Vb%BP?Oq0kfGS6(m zKycE7k50+9ZRD{s{0^Vjr|ZG$10e}p!eh4;zX73{E4@qt#*cW#B!sY*Ti4~MZ@-hv zb$PAu!Fwz7mdoiS*@aW2uXAS_qcrcou!z3_4IAt-s^m82IRA(|G=B^nD+lhlEq#N{ z#^g=QR1f=CEZUWo$-EYgM=9_Wauu&0o$T}>n}IjRk40Clq9>(jF3*g&<%@<|0$^4l zH1C@nTjq(OTLN3k{`1YSm7iSrR>)p~-l`t!n}i3ig(ugOqel+C)06W*hI%(6?P>Os zDoFgG8Em%10f41aQ{R_sZuif|<$6AvbX?#foBL!=*3WK%{ylR4PzW+Fy#dz~ATHI_ z7Z{3Dg-dEgH>E)xCH(7x<c1-A@nsU@%p7MHd#2<lWue&Up#Am9O3yH~@A^D5U^y+l z$xcU@4_lg_3J&eC>TtJ{xP;YMOVWkwsslvf$Nv;Q;Y*E%-llHlS8*b<l?SCE1N|>Q zb==O1uz$jctv7`}-C}8Zs>W|61rm?$jt^)TXORbrpYp+%6QfTLtIcFdV0{ba(OP;m zL{;Lm_jfsauTLT&sWOk-fa*r}TILr)gBik}C)}+J(H@~RKoTJ|v>fQ-W=|G8e|HO3 z-XP_x5gVkK5>%c9!V_;2_EUx!m}^b7UHbGEh&e<0F2MY?^bHQ>-zXon$yM9aS|$m$ z3OZ(<M?eTqHu73Ay?$41kz{}I+=EV4Ue4*3rO>m3#{4VK)zdm^T&1v+M@ESB2#I;J z6RUvFg>g*cDnUUZ{isj@&f1f_WlRBF*fI+VeX4UQkbHCU^IxL!X25ZR24|_eI%UBx z)f4j%FKLRwl{jT3<t522oj8Y{_1B7Nd5fE4iDoQI0dqts=w+7kmX*YcXOl@m+VzA( zeo;-kq4xZRs1?LKs3$|uJ={AR!#C|&-x;6Y9-1k4d0R+Mb11aSx6OzCVLAUP=_OUI zb~ryd8ZzVLW?AV>$O_Q~O7uwm`zaV;M;?*)^LI&hK&alKZs#A>zmJ#w`PX`j>dU5e zY{of>@xB-rs~Y(=>RQ?}O5<FBB0C;$x)8O)iWz^pZrC6;`*PgL?nSEWX_imziMTpM z2>S;r?r`R;$4>{2SN}5f_GzBXKj(L|gDhjo<M&{Sy=L)#k4@hss+!~-&^5$BT@wRl z#tQ|G%sVx97>cXm5Qdk-zaBlLPg|y1P++b@D$o$D^>A*8Tv>0<N;Le?UGuLOIp6a^ zYptxJJZUySt#ImfFi*8itT*;`=JmV6n1#i)*m?mNF=|RivzWxPZB_LsvSl49GNYZh zSiIGNYjM<P)QmQ$F5xO9=k!~as@{z3vJ1@QlCeKN@C=R=^5V)Jg=^K42q3-1vSbcc z@4SQ$d1WMt35j`<D}RU7?U9`#f!RZ*mAK2#?+QB@iMlC~B3l_!p1f%yotk<?(jse; z(s{DC4oF6S6_!Pe$R@2-KOt{$uxOIDFe2~qcqp%~l1N4-Ue1T0@ZnTzCN9^>c}aA- zL;y-!Cek+*&oKlDi~$1OyR8q)-{6mRoyBCW8a-213u`FZeljU4YZAnS9+*YOOj>*^ zUQ9w8oIXT*%Gnyf{reg{6jyzXAbHakI1cMAFM=)9fj68<qs6D%9=QcNnqG|>I`uuy z=G{>PL7|1&Cp=DaGCJn8^vYQsi_$~1bC<BZ1DWh(94mwq`<A;jo|*2Ql$TO>Os9TW zq|m$bSpL+v^}8dZk19wUK)r;%zx@%`pzrY$A5`=C$u_L$r=^D-CAfZiG<9zO$txP7 zh-Vr~Us652<LKb}hQL}GKuLDE02HIH17u#kq4eeYh{X4n?beCi2*PCFh5XpA)l+S8 z!S<2ZI&u0S?pLNaI@L5#mQi^hofuTH)7L~7DQy^xBY1Bn+qU=_9Fwm~Ti1O+!Y_Cu z)}+7_BKmAbt~+AAbz%c6Ed9Z3zoIJdhkdgCC8fj8er;ZR0YAdl=V~e0R&uUj!8Px~ z)b80OxZMn(kMu*>pb>vs^wV7<QWr#2aquAPlLzCOq$6(qR&Tl}u!b#NqI+)8#KOuk zJ*1<bUvMK(H<CA7x{pmJ@|i(W7emyM!ys^mU*d+>TY{rmrFAqRBZMEKXXTLZB`>5~ zaR0y+E>0RH2erfA)VIi9bbosncafEp#nmTCT*G6S#DP>ULnKqfM+%;w^7CW3Sc$lX zLGmV{MY9FdN$6gZi<Z%NsC)@8^6lCumKOXcx42f~eurR+ye1sivNu)O8&0s|BOyJO z{NX2le$*=<F{KK1LSRA~NLAGc@@^*HctAr%g<i1z*NuB1yqcL@E=tjrdalkHJ<|M# zMawkg{*0T{Wa!$3FV7Otn^BG4pxnk`oc1p8&^_E+W2bt1H$p3~sn)V#@7&u%F(^W? zAUTl<y21%U6J096Z?faO|G@h^D0`kkU6?NT1+}AvRdCHa1;L4(PJvEIvSsdC&XD`W zZ^o|AbiZJgD2D#=F)eGVXSWC|S6SXB4-A(XUwC6JTMH7N)D{2>HQ{(OtU3vb>1rdB z^N-jN2gqdgppF9thdnrJt&H`WY$5Y#xa0mQhY5$h>n&?~*UzH1U4P7`3pEzEL)JVN zWm-|=tSgcZqbj0HyB5{r_~wZAa^Ii(w#>N`m}JFkjs#c`bAV8w1MPzQk$iK0;W#oZ zqvD)i>ZQ$JZh=O;@1POS3D4+FX!m*QWS(JM7knx)CcKqn*sWPTMI_1`G-Eht^Q<M{ z0|-IdU3Ejo9P4#ci#*B=#3Wg2M-%-6?36Iv%cVsI&GD_tUe9!sd#ttOvC29JV|1y- zB4EG42T)eZ^nTrLc7~4tXXs9B#`XXN>vPnHew+eLOi%H0p1>;UBsmH}{ant~Xk}Dz zWP_)84Ng)Aq(vjDi?coaD)V}w93qd`pfMaJ?;Oc=p6I5;zPN(ypJPnw4u|xiyV@T4 zxw*q42P08w;anuEhUSOVfiXMi2p9?`WXeSgmr(qgXV!x%r@#Tj^B3PtD0UD-P_=;) zTPxvVWMCTZ_Y9imTdw~Y%<JxgmD3HnC-}BL$sru9C+pBRXRk8SSlZ}ZwA#2icq4{J zCEDCXm}6-Kn?_G_=Up&KTp&NRhdm7rTHI$|i30CV`2$f~GmSOGEpW|zZQNtzG>>Jq z=|WxT<rl(8n)j|5l?bthcJW53&ik2W&@^H{iLM}OgtDUDr7*3H^suQQ++JM>i+DzQ z?`aS-acUj!u9EA?ziPz<?{^83WmFxIi--!>@(R7V<@}>V?`tYc(h<wF-X5&Rn__Hf z{@adc4Q^^VJoRXm^~>oj?^-bLF^%HPObu_fD47#2>S!N=&D9870W&E@KUqz^7eu#2 zNuIIhY<-XdiT_}f7*G5%g=QtKrq!iq%LqZ101;?s&aJ@>Z(ZQ;d6Y?<w{T4%Z2D4- zt7K!&Laj*otMUR3Uf>5xAs!!TRM8ZMoj2f0HcgdF4Z3O?>m;^IF**Im#mR?9Sp9t7 zeZB5;5ieN<<+(Sd%ZuoT>Mf6j!4DYZ&<|oqL6n6Hnx*ZcDk`_Z4xPz;E|27CSgq={ z_W+Re;dpsRG#-Hq8$#Y}>*=7ALM0Y-Xf<_#oKJ`Krb;l>sQOC@U6BGNgjD?Gz99Wv z5`mGk^Y|m89LYd92%jaz<-wg`flMwBYHG>q59>y9EiHS5YL0_<L9?@Y`((~2{cxB& ze0?vA`*2e20AYuYD%{mXZgH<SM;9`$4-eJ7RlWP@>?+A7%dIWh*n)u56$a~KErk_R zT{8qheGM58-QWqj(LIN%`(uNPP;>pK{usQ7wkxt>F9i6t_v*4&{IKt%rd)KyE@;RN zwTm9@&cf0)O0p+86}G*ayf)%l<kMH^em(h?_a4lSHDZhD3Y?>LhQ2wxB(hfdAfK!+ z2TG*qqoz?kaE~$~*G=b5Uh~ThO)18vg=GX;GrL238OQMHaha#4bO&T|f5hM*R2Rv- zrRxkEAbSHXv+1bJo##$!FZHpvp>pa=;xA2Vqu+bqOZH<t5oHRW>UkgQD}BMxKjyla z8z@B2;FOu_)jSV^r58X8Vf`bm$p)_rHI_sP^;-Jg$MlKwJ=u1=TiL_m*Clr~)968W z6Wd^$Snjbv$A5WxB^(<gyzyQwR!h$YdP;;*c9Nq9%9)h?KaPr+!l(DO$(ks^u>KNV zRuix%nh>7nyIzN&0P(XVg8sry9*qgnz;vKE6*<Lu8hacmeau)$c|Vdv?1n`aLxsL@ zUNND&Q5Y<L?$CDJ-AYt;jvgRy3s0TmVe1*{AUt^zM%E7Q>TTp|S;~ThQM?ArJPUF{ zhj4@!S}LhYAUaB5N@$Z7ZB#7?6bbEZ;miJ9j=}_de+f0=04!@ZM_;=tX}gb`#bTDX zUNL~5WS$Xg@AriL+2g6E+A{qZdB|74cze9{_g9Rh=R4-;mCLNwHC(a7ZM9)<f8Qod z^uwJ=J=D6ZV%ZTMG*Ki2N&IdW+jB51?xt+&+mBsALHnb0%f7O%jgaCZPewF%hGplV zUL+W_1|(kBQjSZ1jz(*53Ga0vt{B4dY~#D&u`I2QcVR$*08+qiq~phGo@fnbV!!xl z=<0RbF3lnPKEl+`h?Jkjdaqc1;yLq2f&O=QB6hG8=;VG`A{Gf?al-!cdgfgzx%s)! zX|9Gp@I&dS$3(i{E%*RgGIUeM^mesk3oi5fKNyuC>!8*kw-9JzmaxDimV24->}7>F z!od116XhN0!(^vRT-(SdZ&9;OJuW%El`$n~$3Q_#iAF9KvNZ-EkgiBTo()jZi?%U+ zE4W-Es+k$C?)TMAtyXX9TXi|<@kvT;T8W7_Lkdd8*cwQfdq<OCWBhh;b29qLNP5Qw ziig-#u8sGB_($}vhOg~j`xw-v-&1qFCr?l)mw+`$mvhLLjTlLu8uca<0Tab==P}-G z6N(-M0)PXn{R&q@p3FVW(Fh^6H$r&mes2d@OYdtjfp`3vW~-Q!XSz>@l_!AzY=0d# zQU#Q8*bVUf@Cl*x5URNxYW12f>3jzbae|c|Es}JbSl%<UXB)$UVZvy1XC=4frOvYk zbdv&oP@az()xVsnHP2q3yQ=jU`L*sF8*HmIeapIfa}tvt-rqf6OJWC^TwwQo#-dCM z`@ka&d&LTnVxDx8FsOV$WsO+dYAZBUVz0fm2(mw%<7}5{T%o&65n4~rZ;G%$))bY* z)EJ(A9#(^roF^np;?ff{DUw3+g2RkntY^wdoB%$?BB3C^Y=(T-@hBu>CuGJ?F|;mg zOUQsj)%($={o0=L<839)4(QaUn?p-*$ITVRlR44U4|!e?_epDBe_CJ$b$!j0TC9LZ z4*fZvr5%XF&D<DwIFe@hxI<)m+5Z+|bCtk_?=0O;O>(h{bZ;-Ow;cSv_Mo|Zjyw?U z7rLT8unrMV%;a2tdP=v7Iwc*Qj*A`2G%k`S-#XK0&AyYnKCa)qkO+<YP`KWG+k5wc z9ow%%MWIFq-Lt2x)Q=S&HjH%Vumj-`No_}9jV*s8Gx+>ki&SpTx-C!nwupV_^<pQ) zs&cGobMM6$!h9E|M(dtq;@2sS@5;?#_Axd3n3<O>Q&X));Q`m93y9$6b#_!0?NERx z(-B58&rIoIx7?(FnW#U@Hbg3LqY8lVkt3u7cgdyHp=%oLrMKBleby8`P$Sk8F$zAH zlML20Dk+ep)nvoF=X0x^@my(qDvv0OQv)P<g6!a(B28QwPEs%D*WV(#x{&ZgP1wkC zsPNjMNA2^<L71KaDaT1#D`QE&3F#Wx$Znw&&w02VCa(;z2!)@!o#)As^;nsi4x=jH z>07;)TA@cya;vne4TtGFVP>YfhM|uZ(w$SavBBXuJWg^dQdr5Yh<BeOko=h)+SHhU zV1cFH#WUv=kLGRQPhb|#GGBgS#%Z@j>V@t{b2tlw*pmyzKub$sYu#S<2GMdPh4=$a zU?ILvnmYX$fq)IZJ5byn+Aw0Um!n@yMF+hU48A&H1ShX_@UZ~%iYi4x(MSl@6MH<> zOxWstEK?j;@p#alv;d@ko7#_Oc_5ec8)uWOmCRoa-&Jx~^>5tG-?++hTkpjE5f2(d zFTh4>@vfAjs~w}%)buRXmGAn*FPFNa=Hz{|sf}p<M#(wvTUc-HZb_Z@B}?OC*ry<C zt2i1O=D{~(6<t1FJ%F&5m(FjRC!TvJH^R!-nwj`C%qL~NuwF2TKJ7wTS#Rt*yJJN< zbGo;?WSivHpfM=RO`UsdHM%aureh;uCpbeyKk>UI-7?SB0kPFm15Vq@cQ)1`o4!v9 zw+F@bp!84<33Z_h!syZGbJinms=&;2AO}j17yn$f4h$kSh0Tp#eWnh@qJ*u0EX-s% zo8@gr?UDzX*9QaZ8{Ei?h)C?dzvz8a(ua>{GObw^du*6DbrBuLPtVA(h6zN36ElQw zEBTXLgymaoLB$LS5SHD1Fjt7lfPun^`Az^!9lBXoQ<MNwZtzJ8-m_5v;FiPk-p0Ie z;X*CET*8ny+~41)Z`D@uhQM_LmCmw9ZzuG4XkdA0rqJpYCj1I<x9Aq-%nf~PkLNoJ zESGznoUjB+D&DwzYZ5L*E=U0+ScCK>YW;Xl=j~ixM7~5La^xnrzz_ngs5oqJi3Z^N zk`kRxgg+X>m1j!swD5T7-ia`LaR|yHRCY{Q9S{+u8HVF+K{ul4awkBHXb#ia>bp-l z?y~BL^Oy>mcIK5cyZuA|#4)NLxv5?XD-SXWcx9&E)4JxgudC%R&9M&}Pgl3BTi4u3 z32Rj?3cOoioF=`7bBZhWmP}e>a=N#y9AoL~FhK5zc!hY8Bv@ADoF;A1PMIb>#wM3t z`{8Y-#q54@?2l#SoukSUZ~10qwdxz#!E;{yCrz3_p(w<-7Cn4H-q&$bLzMEdUHWKX zeS@mMz?4oh_#<aZ2@YiLee0wLv@HQh>|3l*A1FA(XZ8W?i8l|;j}WTKxl%<12SiBM zBm^sg14K81$?d<AL${JYNW#kpHOxWIKD5<=)}T{4uv2Kn81xci0z~dYe)=)55tgBD zFk^(G%OUm#SQV=ubB1Z6+RGRc7a>G?Dthn6pk-StBJS}bhubpo3|R?}T~pCrPc621 zE%ejn5{JUMZ1fwd6+>srh_n*#D5S_59?_kzYsU+CjTIr8T#3DS%>Z?}WBAUkTepVH zcr-LB=#Dq=$0SDWQguwBonxq`{O};K#K&&wY{~P9Zze&1-v&m+uRJigy!XxCa1)%E z#|?8@pH*BGU(T4`*Bze}<!YgeZ0;uOf43D$&Wv;Tqc|*ffYUKN<wv9kbdloT7VeoX zfKd!#TjRTMcG(t7YH&2_uJ+*P!g<nax!wbi@0W+P%#BYuZ1u^i804EPt-ca&^H1(U zv+qt2nFZigvYw*(PDrvRsP(3_4fni(A{EHK3P2A|=a9s|3CS=ypbZo~kH*V~YL+O< zDw%{wx2iYxGpEK8u(CHv1o;5giY6sRwmZ_Xvh1yRQY2N2Ai<ius@9@{gCf!;)zLLb zoS5nm63K@E#?MUoyPMo}dCMUJfZN?59IwOa2~H0t5!}$-Gz@-wmgFS{uLXLeKQ)}5 ztkw7H8P2Fk77(rdbn(mu|Ip=4PA9V7?OKqv=g*7{)iIn#SgyYMZ$&%yU!(nb!q@`_ z27d}Ji>I9|NIkWw_^@+);~&8@Br)(!Vi%&__ou-GPmcFA-1Z~$P<8iQC`Cz@8o65J zwHow}Io&N=d-C9Z59zz1aZNM9TyUMGw~oLWZqsU-62R8guU-8L@2gJ>9w3|<L@cN= zL`K+y<`qWQ7E5p(#5at3QvVnk^^v^SpxJ5JDo}5io<g<)_?z4rG-F2ck2+svzO8L+ zq|VXLlGZ)Zr(bY)di%~1z+SNyulK^;*XJ=@khQw*cp6If?kXx$^c%yPcUM~X+*01> z5J_vx&S7L%Vep4Crvd_w-_F#J9&`ZGoWAjvjF-q<FyHY)#=F%~d6ujp{KU1JOm>B< zmoIoQZ*Je&O}pSpKg7_YQxgd18fpi3!Rm}>eb-xHzHW!lz9YBfTaRa2Zcd(8)n3Lr zq>A!^ZkzxQi{KxEXATv*<3fET$1MtRE~MKyj646y%9$Kn>0Y;jyvv@a>^SM|<;}lX z1srHO4(FTo43`dqO8tV!wnZ&-aA_fDJ{C;>wHVhlI{^q5YB;I_A)Ln;J`6(R{V>qp z1xn`p0`yBB17YOmxtASSvi7>?D9c;=M(x3|Pt>sh+VEY~D9*ue5xae8yp~kv*&x%1 zyo-;x8f{<?QVtYpg;zHTW^%Ej?6*iR*A2yb*rf>9Cn0-xQycsH3ox&anvDvg|5p&8 z^CR)qaE-kgcR?|W?d4nq5UWxs5_g)=4@ENG9Tt|I`uz;SLD!S(FFN!ZgU5lu%Q})b z0hBI&#wkEK76{8<(0nSSBtg4(R1I@1Z7B#|{;8Q!R@EfnAYy=K!0==bG|0Tx3Rw-^ z(9@-fx`r)$hld8sAL!Hr^e0c=Jdx4|?YCPZrR@=gh_BK-r}q{AS4dL@F70h*yt8ZK zy_by`g4K{0l4~Rar&<BZDgb{d)9SYOklNE35j`Wfk-c~?XC;=m_>5r`y?Aqe%jo9S z|EeHG`G5>@dlWs}2FWGzY6t0%(uLq@6E}l`vLS{q2MXa6p2-alc?S))t>lt~G)Z3W zTfaMA!Zr%57yXWEMN%JX%%oOGvi)omJ-#QvNBg2N)UyBbjy(3{=Y)0F&?nQ+p*v6d zA-U+j*Fa;GZ$|nPGB}gF(#lbW!K)W#=IzecSJ$#N+MJ&=&4eC3txp^?HTYXtZ7mmF zWw%sGkGPVmJDR!kBR%3rwps&V`dBrMLd#>#(n_dqPYsHCiY@>$dRrmE5MY)po{5Yf z!EK1`og6|MGQ#$>$sW8dGQue?sVj;Ok;GD(w@(%P7sojxSS!@MyJH_{u|5M$OsESZ z7mAGJpR6Dvgp-+uTD%5@y7;j<Y2ql4Wva#CHmXz!@_IsQ;eYgarU2eOFgR&o3}j;8 zbO_DlPNV_=hldauIh1K-A%P-E5&bqoy8u42cX?r3BL=@Kbc3WFTRQv35<b*_aPEx0 zUSa3*tOnk*SV6E!{*Y6BNDM7PfQuM9LmniYF9Lu%`CBb31e~=t9X=53?i1N7<c&bF z<$$$lAKVv~=e{jh<|kDSnUJmHH<R4+bBt@SR;1KcnW5Ej6r{7s#3F+J{h#dr!d86v zxqz@3&4yy#UvFLp8rYc>q@nnt8X#2Hth_}`6cM>#pyRNxQxpp9m`5q#Ii>i679?8$ z4ThMJ@C!q!SE94jXOUP_;@ySGo5<$*cc+ACwr)ARFU@Ohu3lx{WVj|VBi*u-z4W>r z;KYOhMps!~aAi<Tsvj{DkSzz3VNU8HxYX-w)zsAJk)o&3{w^|z{FH?A%b$n-lb@-K zfR$V}ZY8AbSy4pc#Q_XKeHU{N0Gcz7b^ttvJkFuI-JZTwYsK;v)sLF(-sVgW@wnld zw#w9ZTYk=qiPXZCPP%)}rNUf8FI;P@&Dn``T#u=G<e}Bqjg-E~@NyP3g_BxQ)gX|} z%&Vm+kozGs9^d~@o<-5QmurWX9a_-rq|iV*u%JQlXwfk38X=cViYOy=#mbb1)U-8w z9=MC?Z}2;fqc%5Ycu`M3QupfcyVSUs=sv;M)!-*P$+RnKC801IBrOB>`g){lF#e@# zHH&JH;~=u+x7HD^(-DDyTaJo_NCjlhf2d}P!K)qlIj#V3%LZ#y@&)}|FtHN!h-XK4 zLP-oQYAxghfm7LY4BiT`)pNHR)O6d^vxp~*HK4)KK7U+6wPf>MZ&wZ8aJ&+oB*GLI zRpz-F+DOim2i_S~<QP|k?~RN*1}6-@l*Y9MSy1D8=4}1*u6%2$hkD3h$8xdjK@-v2 zE&qwTr)>r^bC=hGC_WEZ$;bLU7Ml8@ZAEQrhD*g0qv=%XtBLe7XL@*DNjL!~57(#x zXp!zltyjwrzvSJCh1!^?5<~;$g-%`j54D|{Y%NI6iKv*gtsWXbc*BfqZ~utF54<wj z#kLW-qZP6J)IfPFTHroF?a+`v<7>SX?)y(dr;v+akh1HgDq%TYBu?E5FlszdKw=D8 z2txvh!h9&+JpK)T*oG?Yl}6J^f)XwV&GUowaj(_#8me;)&+jRN{;GM+9}EWX)erFA zmY)(`9B2Y2rK-aW0F9IQ{&GhAcMVx~l(o4d`ZqNnZYg87Kjbb24~CTB%!%x&hZW9* zl>Z0gI63=K(s_`5SMSxW5bpQ^{F(_ljC~S);7T4gm^OAL$jSx8M_dzK^Xpx}UK>@W zyB(?zVcpZK1J=5GLeL)>J{NK}m}$U*$wze4GLW_YVW~a>I-Q+*uF3F<pMK^IVJgKl z|Gzn_l7RmZa4#OjV?`;?WAP@J#l}=<@GajcTcN~zkgyf0)3?0Pj_L@uFSx`pQc}=H z_p>Va{)~~(25sz8)M*9Zpkq<2mq`GuL8#=0)i60bYJhqS9rnK%5>X(Vpxg5$NsOT~ zP2YV^^W6RMr`9nHDjfHUi6NzX0CldDt}&aP+(AiaWacoh_$Ni@igbv(?~Iu02gTC1 z07o@IwFQa2B~?dTyZOgy)UoN#|2Dhw;aIjS@B5wt2XN0A;Iz_nSkBti%ag6^8IdW@ zL<--&br?gq!w>DGz>u<xD~z}LK5n~2I*$N!T0JCKScoq12W4+Gy8`{)<NqX5QPBL) z=-YkEZ(Bb5;qwat%qFKB*VOL2I_Mp2-IbC!*|rF~d&Bj%n<<X-=U!<$ozj+@bE3gX z_pqM@M_+uCc>$N8_L_VA{Es0{BHql|?*X4bw(t87?9&Gpr|epzUz(lDaElG#&aTvD z920q1*B;&T-LU)G4O?8f2JV4x@7YX1pp*I*i!h{?pTI%bizB64x+MwoQ#JpiQL`j4 zr0ro1W-l`hj;w?`&*LT*8=lT@kJ=>+t_}6dAs`2XAETZeyBtL$UNAk3F>i2!Lz{z< zYpdq9$wQ&j+kgHK<N?w%Z_@D94>UJGEbD++@{0nXr!S~G)2W(%P*l-T7W;~m`nq~X z(meN7y-~kuHRCTBOYz;ivsVfhRh)7L-6s}xEwhN@<=oX&yE<g1Uh035BPr%<@4SC> z>9)>$m!7?b^uPx_w?8w#Sv4OvdXV&F*ZW~zB@g^D&e!HG-*aRuKd}XmI-6GP=#2B^ zOa&Cme;jZ6H-XekvW13u;6$)#T}e2k+*B}nu=B%Qt%Aq4AsFm5`EAML`v#+MsDGJ+ z9sL9L|BN2Aj;BA!jh1#lHBzJ|k7SZJ77nfN(8I%ru=m*QeV<2nm0vOCi3eenjhm-( zzUzI96Y*on>Hv{iNFaN{VWt#2{BlaiyBJDf|4+%TmQ$bPs@>3es+S-BJ>e)I@R<9F zZh2O)wE{D=y?@1L1NHeczb9l}jP%kf(LE6|Ddc46GxE(+flA?{_1}lYdui2(!L}Y{ z004&O&!!#G(bc8J^xyq#fB(nN38ZpI*`*&;yvr2JN)#ETZzrT#`AfjGpYA~5Qhy5- z&Z?;==?j}r-&YXZdxi_OoE60fz{|Dtj!SEi<nCveI^ltfa;prO(>gczgPfwhw34GE zw9mR}Y=EA(_7YACdHZ3P19+}!SqH#TMn$dv{3stYZAQe%L-ozOB+lR{=l|EEfYJdt zi*zNIh8k4`Q1M#v5t6()c4Q(!aWU5UlV4i@<+2rC!&af4PtDe^&rj&w_n9T$L}gCZ z#{unK3*`?C6cPmmr@;&H)(Sm}4xH4dTWN3|G&Me0`B_B;adB~dzl0`!&i$vTJU#XS zRp`<1%qst!LY!a@*Sxc1XKR=WZNK(+gsu6L5211ap?N!%lA$D0-Q^VA#G}Q2^44F} zmbSqHa=@Huto)%C2d_eV{v`!e5c+>ln6=rdaUaRg<nzl@S@mf+C~b@Eq=(`tdd;fc zdXVV$rirhnc1&xwi1JvkSj_c4(^c%M8R8n|?VMFa3KsM>u0>J(M+KLy2#SSD&9sl( zH5B2*-~HOr19;2MUdu4>EI+)Y>i%e$`d`e$-`oQrwNfNN${(D>r3EK+?VI*37xm8{ z@DGiOI`<!CLErK;fAe%c&?M-A_vgFQqwLrd`(#_K|LAyBMYDfh(u&VFjQW2FZ%W>+ zTMMB+2H#8{{!VY$ijv+(gX6nL5$eStvcH+<8VzXlDb=siV3mew{VauTofG|lJH78A z*zE9;CBUSdRiJq`EzwcS(6ewRbN4qL*0;^#2U`RzbfPnGfkprSPXjCoXVbP&7248S z_Ur#cTNHR&rJ=1=HXtdBKKqVwt8B(RHYBR^sh2R@5dA!F@(s+_&9`G?W#viChNQ*+ zAB_=!KI<{X8X4uUws%rqNKf5o>zDi2>h!lS<ii3M1)21&%sV;GINFavKK~D$Q3N0# zCZFfE@tc9ask(drUGU5Q$Hf@kZMu5r{c0&V-E#9TLaySm#29QJWe)#Rh5oz8@@b97 zS+iiwX`FZ5C)59}%l?`l`M4Nkms_?1jTjTO?Efjk54#8&_Vx}BH{0K~{bp4A&#h|l zUQoyjS>qA)+5HRt!nN@?9(-;S4Bf(1wpA37jjvyDfBR<WRfCQHkLyshMm~I)XyEsM z^kHrC7>Y{rtAMh=;XsnXiI9Q7(z)jjeu%-ssnG!=Tcf`xjN&?RK=Z5gXKh|dN)-PC zbyR`A+xRF~O+`hePo>fTM5!Os-CYf@v(wQ!h;RPdGm=+R!Jn#ZnBV;5Gk@<{n(s;h zNYg*BY5NP8i<VJqbco_FRX~LK;aipAQj=c{06BisdA+qPoT&KAX_G<<6agqPi1k7_ z+oo{O@QTFY@jrWhkG3h2+Zwz+V93o(=JyedW8iDvFUnL=dGI4ruLX$U!M;vQhfkqD zc-%@WnM+l4>h_GQcpbvFhP1#<zK;jP*XR21%SteAyu0<Lmmrz6!EP|jM%wRY(XCih z1lAQ%bCZ}=4=2NhAF^r70y)u(&d1mt=%ap$-c(dhgc&pkvnQyiTsImM7|8~#na)ek znn8;S$G_aZnOd)2WT;&9Dv7JPII_Mm)g&Oa%FVxd=!qe^z{4bXu-XJxVyD}jQFY8m z#Xao}1Fmm7XJ*RdX55F&<$D4Up<q%7_}22V@EO3Lx6~K?g|AH54QASRR;IOV>DKM* zE!qXq{G(Uyk6D%l5e3dY)>b-AkVoL&W1mgzVl$3at)%8A7&>&ZyWN|wyFN^A{*@B= zflwV}mnte*AUIV~d6SC^9u>aa*}jr9UU4M1XZ6`I=r<8lLk7_tL_UG#cLm{E>?4f` z^{uC_7NVxyU$KA3kr|`L(!WztX;`TEl6Pa%uEx8m3Kpm`?yWI)fnv#;9Fjh3!HmA9 zTGLCyL(f7xxEDBtoV`_b!5%wP475~-!DxPEV3=CJoe4dN9&+!G)dkznOI<&vHsFWs z1i2YdCAUwMPl~*8&wc#Sw^0~(;jS^S=n(dZdWhyvc${oebM7s~FFeYt!Nqd3gQ|D@ zEuKHxtMy%GRacW+Kn0h%`{?!Pmm=Q4l`rXx@&?<+=7ZN7Yilol;R`z_<ZgOwuD$17 z2_V6uZda~HYyJ5SR?tZFm)=;lOG0^MC%x;n8g%9-1TRHZ@S9~Z;;dEcEc|=1;@h%x z_={JAPf^l-46-fsQ5Zn!Q|PD^TmpnpM_tX79+keprif>eH<KR=!WliLp8>#Qb?kE# zZIq*M!Ow#sV`HqL?Yh0oUIvjejUw|veLbq&{BpHV8A0D=e~z0~I$)lpLY8QRIMiDy zbPvyYTx7v74+Qpt0==S^n+~8KTU*(j@80sumfmd~+*WdNq^yg)r6s*ecrmqO+E;Fi zBpN>bk%RcGuWNL4bVwB4WQ-rjqS~W8EK(U2*VK*~Rpx#7ocL;O`m0s+z2v6cB&c0} z_%&G!!MgZq^59~PKRqG`sCW5SUa-v4WSy{_>j5dzRrqtXiY+XJe#IFdf@B-T@5>M2 zQ)HH*T+LI-O&O=A&nMPSI_lB$v)-K+`vd!)o!U~QMc%<-?*Cm}L=JtG?5{7r|L{pr z$_4)=J|xFX7WT38PlVv0=zwKMbP;Wx$PSw@tpeF~LnM-JLrfJXFm!UgFZw6&U^k14 zZ6OIjSj=h2KFg}=%?kX(=r=UVDdeU{jB^Tyuzb}*gB|A?7xAE#hP>ZRwzbNvsweCm zeAP(5>3Ye3i9xdkT;4k5Z-pN;f(5(`O<=6nSNHZ7Wq281$y-v3HUGoz)Z2BPaYv1< zEH7D^=wwcM(75Hgm1M`)OvWckbq60k>b2xG>T`Cj*kky5Ny>M$b*~bJmv`8;bXD0_ z9>K>w?g-7-54#(r<-43wqnek=!G_DY!gsye&#Cjmfp8{e!ji75Jxj;!PYkk%kzJ-8 z1za5D5>e|=%-3{BkvAv<%4&A|lXD@L=u5_F&Anwef{_`$_HBTH-m7@a5iH~6wK_~X zjWl`pA{dO_&Awh7DH=-ma;X#i))#tfgAsg5g?<Uozr`J&3aC)+#K#MH#54Qi{RsTP zecv*nqvWCB(EgG<Tub7<BbonpIVh!|(kE;O-Ewztw8WPYQ33yfP)mvkmtN;Byv=^z zJoxl<U)YLB^C=OSAdl^m1hvPmiETv~S)BVyTk4ep3LN|O_bs3iNTmvnxc5@=`;l~L zRA~Stj`tlvYwtPfhxPJ(bppUeau!Vl`xQC(OFzWw!483`W(mDC(==e9BafL#Is@2H zR<Q7whL*_9y3O6=ar<Y(lME8-%}Y=>nd?6dyNyv)MU4$Wla(>nB{OsL!kHZ6SOi&L z0uAi;FoGE-<zdyLP%tNVYZ&1!?vOoCcZ!I8!4O%=^^qj0-AE_=Hi$DxtiNs&O43}) z)EmrTSYOZ6_laz!uFkZ|L~bJ>+SgIwu&+zwJrOooUjiHGUIL1%W`rW%7X)(3<GJ+{ zcYK~ir;O{D5WV|BN=XW7s%U_3P=Ayr>mnidHXJ0T64nl{W7^4zsxF<ur2w6%gD>Ja z=ysnO;U0!3;Sx&HWluexs#8h=r}ka@n!b*&&UV8jfP8tJ&aMGf`z%*=>2LLT@xHg2 ziBH1R#qIX3LE-f2ImC3b3)rRL1Vdg2<VGnt1Wi_kb7>k1EV)a2#_OGuX%Wy$^@_Fw z_a-t9jkJ;0OgyGM-4%$pu<^BI%h%rXs1U&Sp0Z%Zu^fMGppRdQn?2RKDYy<!$K=IH z=*8(?yXyqN8@vuuLp=APq!6WB@>`cM7W3lKHPnkE{%$3nw7uDw!dTR8rqS0G=KT)5 zSw{OjN{?3B7fZ%gitam{`GIf@#8ZrXJ0B>WbB$57?~=dsOt7q!&!ycU_}EHbo_bRt zos81ESK0+cFe|?sel|7Q%_=E?35={}AGfeEgk^TA<cSVJ>9Zw&d?8k7_)S^HZb6ML zEWKXh9Yx=Lw6{q!7bor9pG$k?jh|>Fzw?`Fp85rk2U+<+^_Xm52X>eA<te%g^00h& zuOB|QxSpu_pjUf)3!u6(5d}`?)aRyDl^~?gdFo9Rk(m+2jyzxdg4bM;3ijK4Jsk7B zM`JSX&-+$1KGwktrUZl?`INUW&P7Qr2xIhXJk8zc!0D4YO=waqclZN}{8xXf;CWQ+ z9Rn4dtd0(E=-V2PF;UleeBT%S+bqo@-1s*-j#Co^%)QeU?(z7CeKbmAGe9H%8%cdE z>>7n~I(V-?*JHnslq=GMkD=bj4Jl`@l@Ij``<{Mn$+)6!53({)X$AKapeO;O9;N8I zDH_zuq~^IFBobg~KJQuhOI_hhRu$~LMuCM53IS&+2x9tcoc{SoC~>YzM)+cXEU2vK zpd|l7H%9k+?0p&Ne|h*1FT5y$R`PFdX;j&lb9aa}Uf?HCN4c$KY(*v*V&P61MO6w? zfg7NN53a66k)bMa4uCK^Eeq3VDNUu13F{pEN?MOqO}Tj;tSAmBU<afOA=tSkA%^Jw za|A8oyVF#`Td?Z5*B^LFF32o-Ts%9EU0g2)p3wmL^vFV*PzTvs(0fjN*&k<_;{kT7 zC8x7vnrxE@!JP^=uPN-V0eFbcZTr`dSWQd`OEi$CRq>4YLs^|)b}>IWv5e#ToO#0T zBa73&I=ZcT*}y8Jr8|OKj+`6HonOOgc^*&M10v)Xb*o==?LSB?2S9^2$!f35B2w<p z=u4F8ZF=Pw%)}sRaLr_Dd14sGSVs>3#@C|<Zoxc1sqL4fXN!l{s=B2?=hKZ_+BY>> ziu!#3exbR3^)o8(elA#d9L8j43<xNj^4%mF6K1vHp~&d#2yT(D9(JO!V)3eimjOJJ zFFZ1uj}k_3+<$D5Yb7h^Q2i=>Qc6K1NIz9yECOHob6?z#!M_6rZ$4(G2yd$q61-vn z_1L4!H4#fND;YFy7f}6j5UaQ^8g+<VLF$1WzL3xG{n0N~3C{rB8<5a}I#5*H<0%;k z4;foY$z9s;;?!O9;Uk)}@h6-%y2~{2W{cH%g=lny`#jdM%#f5is?=AqZrZHV4DneQ zJRuTQ)MDwuZQ3rN8)0w+zL!ZPC#bx>iwl|DDPOe_-r1s>n-XC4WVIbRa>~d4)|eDs z5nn1hVoUGr`NDxZHzr3lj^y|Y2%hxf%q!f5r2=uonZoRA0NUNjewNHIy<W0<UGtUQ zr7ncFJ+4D!>B8?%vr?L#!`5O3Srk(Y4-6a&XvGmzn;(DdjD6Y6W)>NaH_!Dpvc~)B zl|keq;^a<b?GFMI7&4)`X{A0V^R`odN~A^65i!_K8wv%Pn<VUr@JchwtWN8;Z#Z}< zBK>C#I(LnjsZoxcg%$w^!nN)U3ARe=2X~Mx_i^sTv*@oj>iN@(O9cZ6d=S!qJ36A3 zT?Ah}<oBsP`j^X7RG~QKLvP1h3)iDC=)AZ4(bNOW8umoi3w$3J8+bWAGwGaDYTOzI zWHr#$n>2a4Unjim#wyrW@_db@e#QE#*<t1|YOSRW#qnl1+Vl2+>?}K;hO7*=AwxAp zgUlPjbzORqD0-m&E=C<Z-SB!_;v7lQR~|E3baPPOajz0NGOK8i7Cqh=`fNlpGbSWP zmAPaPwCjIY=hwkciBs}QV!o?rZjxFy+*svb@7!&p+a7zRm<1O35-c4<-3$)Dq{blh zBF(K9i;ih+>c({~Hq#h5>TD%EjbD^!WuOu=t2G0;jJf~lviw{NB*xr4@h0+O{B#`h z6Tj0KWm5!$0F|ID2iCBAdY;)oM2yYveDpM$>lmARi9;dV9&|-*KvLNmUVGtu)$)~K zRmgg5cV4w}*<UI`CW#yLPBus=$C_aWg86tduzBvuS4%n`?zfnY+7;PY5`ih#DZ#Dh zHS8r~`H=5Aals&ol^g{t(%GIga&Z^p!Q!tJ4n8#ijCi5Gr_+|cXtW#|XWJ>o%bKgK z@0yoZpTg^ryqi#sc@NtoEVQ~!)tl=!tnJ*-aPdho+Q^&+q__e|QOYu9P6(YFk`Zs) zMj08-T8Y#iq;9~W@a9%pt%$52AA^0BUA=BZd%j7eL7qmMalPPiZqkd1LA$J43w$fT z?tv6T3d$#35-b7g8CfkIub#y#HSV=i8@u1$bt4BNCI0HC1?7Wp44A|P$Lo!Y>Wn>B zC97Sq2Fkf%4QvS=3r!77?TlwiTMNyzDkA93(Qe(F!k$xYg-lvtrH|~|7OMd=J#ZFh zt%pNvSQ;)Ygn3~TeHk&z^jrDT#~y2SnsOa=d)e3=;D{SqD{HbRT_-txgW=MpRlL#_ z^hLc(cd!YkOf(jIEKM>1E1}jdPUa?*bba?c0y7edzu-Xz`?8Exv(pEwiZo#t`=aXV z*jFJfg;sf(xwXu4I8u9&Riq6&n?B;MDV-R_M@sBBqJI9wg)znoDLU5gccP!Yw)qPZ ze2$ueSb6$jUiF3OfHmEw+3_NtO5#Y~{t{A9*?pgR%H3lj1I6yIk^%aPpuT%>TAgY- zE5wW|8X!^^z`!O{$@7vaq5?Zf2Q7O#yrK1XgHT9oe~A3>M*Ep>uv`8?#j#<9FL%6w zyl-bjsxSWaZJM8BQ1l_9%qMD%)<GM5O~!?$?AK2@CR{I_<pE^XSdp2}{JHLPvX8En zn$qo=yYV}0m`U87)zn5=;Y-zfqM@5OrPQ{-tp*~eT^QQveiTOyKU?7ZPfD*wDPdw( zCg(SEwJ||G7Jlqz*E9wDZDJP(&xir8YjS}2g&UIUk1u!1cT*=V?9*Nl;C&=tKaZCk z1QiNiq=(R{4s4^wHCju__Zq<BDHI<AF^!FlkVKT1T6Qx1(DuvDr;2lu5UgR`Cnkci zdCKQPWOaseGU_kK3Vci336ABV!hT5Fb2oFS0k^KRzF5S&qRCkTzvYzAMmrz<Q<lNb zA%*Rz8i0lmavWy%4GC<)KA1nR8fb8l!%x>(lmuNZMQo7NDE1L?)pf(Pf@H0O=uW-D zCWj<~Vi70ut4~(ZKvp(C4=TIS3H{n*o1ev-H@fH^f#cm)%fsmAD_UmtT<L6Sc-8{f z1nV0di?+0p!J>;Ok3cfCv!!glqn`gCT=ja7@X$BcuoDaH|L7MZi0%WjQg2*v9b#wX zUQ#0^!kjN~Vs}>t5F?SYfObzD-1cw60pX$m^Z{V_?%?9$<G*mVJ0~Tn!P24Y9Swdu zN6>C$M7&<yuT8&aiI=Ra$Z>Z4fv{VBg`{);0pbW)cTx(yZQC+s%395=Zg}a5(k*RR zJES&qp#KJy#BW82==63^iQS}-fL|4DgU{9W550TP)!k#~Q4!W?{}eGUf&Kxh)|*?> z=1aA^!WB2HK`vo}Q$&9sp-vsx>3rso!u>tQVKVDf<}5{c&`IR*%?JVniuou5n(T3+ zPkf6=)pan@EtF;)rAim71mdKN6`@Md2=&v9+82YzYfjaIzt~tkxy79su;+xB$@?|0 zcf~jU$;{$t&R#w(Xd~u3Bh^?G`M1N{^u3EO+Myc3VhsT5q!-ozWWT#hO9_UX*k~LI z=&N;crdoX09&;Otnp7KkG?QbKZPia>yL2-5YF81d9xZJD-jSjP3fE|oNNiLX>*trk zcmKpd_T@<TONUiik(8n){?sh{Vw_Wbr&~NeJRQ5VVO%=lsVIeg!fxy}qK=P1#;p|? z|7<_3mOFdRLlK&94^0{ynt$`VLoO=l+JC78rK@FUUH4Z1y9Ao^srP+9$5b}X&yU~Y z@RjzKZ-~*qsuGOKKdbL`5B)1if6h7gHMRba`La>fwU&QTod8JJCZuKArvmW(yJh2( z-ERr%QxW@h)AfII;1A6SiDGnX=d8_BvQ7W;t%;o0GK9YW&xv16(mw-svQ{e#aZHbK z!N((DMDXewFn*fW>n_`L@35+sB|)GaSZ}tW5i4kRYa5tNsBS3M>}x6>Y}X<k2ZT4G z3~vOW-_E5@5i1x@m8rV`Z^Y?Rl5cmX1bCK69%>PfcKD?Y)q`B=PP{+eg}l;MAdo6D zci-|(i7i%Qe3<c#Tv3s3R2O&i$16w6g&$JX8(Yn6Z%s2uz5kur>EmhBcExwyys>Gs zYIJ&j{*|6vZpOdDp(#-=swIKv`SSJt1s+6B#?UcjYakg9KV4?lHvLBLY9zY5r3bS7 zSBL;XB<d!O^t)&Cd>!NcS`Wi!cyB||50>VjG`{R+KNY#y*Q&;=(e*^G`JVZjdWn-C zCT=0G*|Z+1l@+x~HJRmIP`z(zNc{#!@={nH_;<+^So9ABSJ=SOJ-BFE?LB^A1zJ6D z5g;ay+pwNd0v1`W&TK$hWUMkl?P!mC3r__Fk*~G-G^|kNpS3fu>@VTE&*nK-e)vtn zTKg`8d3R^aN@UPTi4LvtmF1I_^U{hjyOV$Z#9=Fr3urx^VmTYOkQ>$AbHApaA83(S z(s5br*?a3dcrG@Yl6muMlKH$O^X#?Y>aOvA!rpoUCTi*FV6iFpS&-h<UtcvY;hu=a z4jTVT*<3ZCvSLcztQSwHEqKDAdPe3Q8I#Tbc}CwB7-rp@`oX4tTT+v&w6|qzwQ>J( zJm#^V)4ak&+Vd+9U-o#H6N_vBeIPtNo+T1m7_O|67ewi@TNZ=8&`s13|JQTAF1t_J z&LOUa%gv={=ei<9;|h4#`af|cu{(q6b)wZHG!J$!aIeRD13GTj&_>D=&XTBgoF&|v z%Y_~*>%Co5<!Hy#7@zP(wOj0#-kI+xiJ$L;I?u!q7rQ1JIFs5<OOKj}=l2uB7Zt|~ z4(OD?;aU25I!ioH@yoL1VRwgyGXT{q>p1?xUdc9y?Gssj$8GE)56aIp;T$WG&cknr ze$1l4rM|C?{*nco#!mXR{*_-3=IZo=%YIXE!CtbQ&37+cq0zZun<He_g6^BYA7Or1 zeN)f9wLj;^&W+h_OEe|+*3`?is`!1{^DH33(xF_?13l*I(9WC`+;|WiJ`}o$yS~?y zU2qM09bpYix^%qFr&Jra9j%+*Dihql%{H}`=)R4t7VWW>=>C2FfvWyXf#K<Ly2l)3 ze{WnpKX7Yh+NQl)JMT;Z#8_blu8C^Lrr*92g?Hg@0&Byqxyxf8?4EUbNcC7Pb9cVm z43s_O+|IIYqgWY>V*TA)_d-W~j+=S(YUUfC;wfQyVKtYCL;cq-*JuSws1)l4zC{#s z1hW2m;*iDPH&rBNmX^f{{L5n<wf7aS!JeZTU?O#g&S{b>Rf=}AFc5X5fepB!^R@Kc zmw7ebBffcAR2GvOpndKz<8($Xlj!B#!gA>;&4QSnsrARFqVr6NGg>m=cE8%`oTekl ziKkJ+SR(M5WM9ldx7v_&rVcJ<=%QunF>vYv4+wI_^<nZfuKhrL9r4TY&}d}+K^S6q zyne5qWx3g<JCUrDj)GO>$bMbl4T#)Je@};ls0>LlDt>*t0c%%xqQvmmpvt_sL)vS1 z9nL}DCdo~joCxBwVysV!Se~pnY{`l)&r|CSxWTV)^Ni@faI@NG6$^E2OCrHz39HE< zX5t7k5@)A#A@36v`nW*qvwN?|@{o@UM<{dpiwaVf-aXc$|6up4ER_b-%6q@g^S_#U zF0t#RJM6;jmcu0V5gRelzHEzjN_jv*BxfPYy}jml)f=MzKbf<vl2XHCnqmds5dR9h z52w|GQ7{M&JZ(_F7(s?Urgx#pYruNcdWy)~9>&mIN1iihkPz+X^A%qOK<J+WsPJ6` z*<VDvAiqv-JIlpK2dQ<SHN9CY?N03O;~C5ufXzD|-imOtYBgTjiF|Ftf2|s8w)c{i z0lsA&Tt9Uy!`UXYFb}Ym`t5iy7wp4aCY<~0i8~$bHPMzRT=q<gBl-Tp6r#6bEpG&{ z#35`@&RIFAJJ|Hd=KPgkw|0v1>nBVZXER4U-bA0Vu{J9)e@x|dldPPPOM3h3=;eBw zRtq)p>RXFeX!w|%J~6#?>J+VLuxGqCP^;l-K~2lqAwS|?Q@SSwTC5Xx=orl&Tjw{8 z`REn&j7ddCS+hfR!9^Da-Dn=uSN9M0`@>TG=I2tZYrmqe%61TFFq34l@ruwVHutZp zu(Q9Y5(Nv?S8pmz{qFAZ9UFgd)hk=pa8}wm;b<!->v!u@^kEyX(^(>!0KviBRiCJN z9?zU6c_zuVEF(WrE%Jq?#@}Xdebd7o-ZRhVa7qAHm!$XBzs(*jcYie)!^{q@V_wU< zHMrcPm}O+=BRR}ii3D^tl$ah|oD=$d5%G4sX&$ei2A^xylJ+%!sE8E6Ai!>b-@B#E z$1P5e>5))&POs_OpEQ&Gl(?{`POf>xv^FoQXwrO5ywAQc>Y>5}E=AR+ta&e-P4RW! z@7GraPdF$2Q=EZaM0+(DLSB;SM^eAo;eQZt?rp^u?tuT=;+j~Z2~3&%xUP6#WSrmt zCdf@Sv;R1}luZj1drqv#2(zzEO!d|#@cV;Wh(pI*x3YWJZz0(0z9CyJ__M>X-?gmc z7I{&mc_zxIq7V>lXHw`t&%g`6c~w7#EIUg}p>>T9hJL!(wyZai+0J!R{ayVISawo} zUVh?y{_aAUU?aQdkg69;#z(ZBxkc=pa7*kGe!egj>@uCkfl*8=2G^!DXSOU|zvB^9 z72Ugag`>oGNvb2w{#C)Ycn9<Nb$jA|XN6oM>T<cS-Lo<7)qXcnnfvj8frUohQ)piZ z7S?sQ^txo=GR4lcLw7q8)7=>ho9VwyVLAYJ^kp~n3B(%E`{Igz$i37}|F{eIX)4B3 zi4xCu`#k^jH=R%CM`6|Bsji<|K^1ot0OTJDMPu~j3+V+jiXN>SKI6eM3&9h^*Q?c3 znjxPtmI{?Ca#qIseNAIM)L&D{)X5<euD8v^hQEk2Re2!$Fd{a3{ngU5Y4&bPxPOS> zm@?NF+TIk^-75A9(BKe50pat-WaHlxg*0&-X9XAgYK<@BeW49qwn6;?3-qEN$j0Ih z8`>Hb9rWAu-G6s8h?BEU)B~vG3F){-Wkrt1c%0W48t9VdiCER6Hefa&5cJSoZYY4H zpKEKJ-|eL1@Fjm0go>99PyYB20HS)G9E;X0N-`2qSChZp<5oGbOd)_ZN*rlYxhUon zl#f=Wh&*N@_5bE3zyUyeJ%7jOZoZ*k@81_DR5BE`sH#F@)5pm(YMb<lqB{<6QjTfR z|L$R^B+md%;uZBDpwqyTFFTv&+Ms}Nmb;BjKgZ23gSv={;{tGRzq`JlUr{2i!rdJI z2C)s=`s2P-X_MGWsMK)rSTyEeDnO%z{V7?m$jb)HB)>K60cz+fJ7R#QC;BLd(H1z` zy)SJJ;WNZ$-GB3dRaPxhs8+^%)l$@dfS4i&`zHg8`>vI}iY*iEEwlaxqVoBw8uQ1t zLNJ_b?c)*0e|h>U4=yY8^XfSL6dFDGclxQ^W~&_2n%*e>U%&NF-+%O|KI-(SriJUT zMY4Y>?~fgsl^M#8%pm-qYo)J?6@pj!DTrE`;rc)6rt6NPk<o{qpr`Tdajx3;qx#gN zROCY-VL8I@S9H(WzJk#PXyPW_3o&jQlSVc4#=U+3aY+Yb(03FC?LW|?_8<NIpDJNM zfl558p#HO%=1m(ov7<F?!>DTUm!9sq9Oc?@>AKHe=!ZYd=g%zBoi?hOJ4O*Ht>O8f zsu|~$fa>l4=I=ivB`*daKYn=0P{BX{Zsp$sVM!GQzfHSl89C|b=)8_WjUN5|=0%O7 z>r~7eoIR!#oN)EOIl@O&Pc!~_e;THh{7;2G8ccM64fZLA9D|J7Ccfd>#5G_Jw{jE` zVXXZcJdaXW%#oeT8)Q;iene+|Heuh^&QZQ`C0?Oo-&^hZ?4eIwQ2PxGDMo$V;xNWm zgW9SX&@q3$Z``R<6QR#FJ`YTp%<r6VwN!B8%}4TWg^w8HqLlrl*)RpA<t501&nEku zKlmdcB~k>(x`Db6ZL_k?GGP6=A2nrC=!V7q7V}5-3dVVg_t+6%YVg~Ks?b{M`-wwm zG+X%kP1j6P&>+|_sXV+&t#*6&>}peg1F%mHWV|2sy*-Rtx4in8!dIEi45ks@BVu0E zs*!5X7^=LA>ee>VQf$oyfAPVaE6Sp~Cf})VErLdS3ENSOLyxpn4sS%neFQvyFdB;$ zW0hH|jaT%Y`+kFYg9Y2}|Hs>x1|*qwf7>)oWs@ydR;IRUi_7GcmJ7CTrskd^Qkj|} znhUO>?YmkzYVMi)0^|ZH3bvSJxReSgh?Zm|w?L*yf#`cfGxOL?J^%lQ_kH~^AEul8 zzRtPM`a9=bS8V?j?U&zF9@(V!%TAfk#_yT_UdNy7;)XS>s{Y;x-%>@wa=D?|<09u$ z`^44xCsj^lY-85!EMBVYzWdWnr?2hi>{kp;gS|a)QkXYbHUrtAXx5&vdB1r0=1-}5 zeG_7n+cVC0Mh>`6zIvC7RrcWj>8;hD2vbTGrF;9mN|z@^zh5%^i+qxnw;<LlVvrb{ zGyjargRAcswr+5owB@W)^q&2-2aARSOWcWeppxb{f$X53(Ae0ll<?5q(<%G84qB>+ zJ@?PY<VFY<51-2UDo?e_{?NbK#W8SJ)K4B>Whlaw&){XH6?RGs_t@k63-<DV0R#J9 zyY-Ypa>7tKa`dM{-8d0pO;;QgQM`5gyB~hEaMMMOBDDHDv@`2e7_5GkkRQC(@8*dJ z4e+jEg%D&7m68#uCp2X1m42gT)<0Pj`)4c>TAp4PKKDn|fa>10qL`Ly#5TRK<cT3T zsG{&B_vcOD<FyLkVYUu6IT0m0pqNhkK4X-xDpAb8m|g^rML^$Es{Q+m(*?e8PI$x! z;QMt3Z6n`Z(V0wHG3N&#{#&?|QqMdRA%MuoI>}&AwBk3@AFy57tFN%!5;HS1K6>w2 z+WFf5Di+8p@EnhuL36%vAFmozTACk72EmO=r9L;kJP~{%;lD}-TWLQ{FOO|Kf&CvI zRC4Qoe$as5QDALaza~Fu@netwx=45W+qZ8~AT^q^emnRb7J(w9JUa5PTIEfC$re|v zhve#=278szKYp-f_FoTEQFK8o6kJC!7Xr%YmhXJv2G|a|@g^VZNj~!E7WsQJFh`LM z6gw~aktTwMYoovO4^-gm>)n_BSYni}`)@PmwEqX+Q7GTv{a8z!?SJ^a2y12cw}Ni? zt^cBLN>fB9eN~U)v^&F|CkT^GiGAp2J7uPEV>81QJ<BRPFsb$LVW#JP`2rry(%s&z za$dgsQC)$*VldhXSlj&^(rlIaQ>f%1MPM2jIh+{FHV=yYRq;!A@VJTda`2ko=?@3% z9J{bnITEPy2%!j#r{;tcos^M>KX|5Qx1Mn3X2p+HHY$_hfB#yM#Hj3A0UD3t29P5S z6NGk*;+#lDm)f6PvHCJkqVU-&DqLvn2ejfV$3S;cSNwGz<!0%|uf_r-MM9iPO<WA- zt$P&4S=r>OaIH)*qf@@1J5KRy52ZSHm43CDDk|eTifmCs5qd1aZ~psbia|=+e#JWW zV{R&q2<Qc;6j^bI&7$Ghp^oIg4d=tn|9(LDcRp5p^IzYGmcnB{On{+u7iF2!aDpy* zQo*7@(4RTr!A|atr6^@LJh<**D{xK64KM!XBHY2HD#`i(`V-I?Dz7E@W_Og!P?0I{ zmK4M^?_j@lztRV)C?#UXiQ2!F?(0teMbcloHvK)flp3s1v2Te4oxnqv?L{Xf*)c+; z*r+_7gPXh|VV#g*L=(j@9hFCDAxUC#bkWz7Pkyw}@OGG_@9MwQZ`u-+Py7P%o36Ou z^E<o531yOr;LW^$I$6fI#7cTmBIN2H>|?iO1SdxG8!h?Xm%j!B|JdpO#b@t>yL8pm zlJJcIn#S|5pI5j+(5C*aWZzo>{jZ@9G}!#9d_bZ7^Hl11*qET1-&2<V2mkVH$rGXC z_>doJny?n=WB<1QQQfUSAq<^ZY2;tFQn~7{Dyw{M*L34G-6F&&<YwVt@tneleibmK zWf;z`6O!lu9me4ezsHWh!bl8gqW^Dx7BqBLUtSyG{w2)P`p?gegl$>o5i`*VX92q* z0y_{0Bn=fh$Bo6whZ&md;wVor^Hf3=;k$BY6udP2Gur>lVC~AO{iRMd7}h{oDkKq} zfAjoIFgE6|v-5QSj|r_i%Y;SrJYL@$D-(p9S4&ce_0K7~pGZt{TcD$2mWv%8NES21 zW(8*rld<qE!hvBf0r5lt?Imppj0pz73Cv3zhla5lXxv67;T<rvqegsn%u5rgfA{^m z_^Amz<1=M21^P?-;kOCq!sD%WUo3LvALIvRDE9nZ3i;y|qk1fwsQt)BVaAo4)`*%Y z_`Ap<hyj7Nn5z5fG3$O-QK9AE;txF+_TKUwTU)19n9CJ;YRuXcD8FaXH3uBG=0#_v zpKyI^%@XSR_v4d7*@QRa27#Q#L~;#^Xt02O5pu9bT;#xK5}qFWcC9w8y{pX*;CGk5 zzuGa8($TwpTxWTSQ9)eS0An^m0myx|Ff|Dc)qge{7T*L@Gl|dE?UDm?R8&$*mb}O( z1XGtZ**|#enY3m`nb4)oFVCd@@Uu5IVb^jH>v#m@G^RoQ>iMCUp>dlFM#K2HQ;guV zz@lNu-q5JtHBcGrgU;O=uKmN+;hiy8-{0x5GTF4^6LN-BSJkqCg02yqM=Ib<rR7+I z<r-nWPAY9IeF!1~WVfTO<V8QJoF9DsJR;(WIT3UAmuF(~0sIWaCXd!j_gE()4n4jX zNA|zLCd?uR1p_HHg6EhzWa#|x{ci*7`=nDQy!eSPSI=2$%_jDN?Iqi<ooRU=L1olK z3TnNQC_&N3;;vpLo$O><BBGEB1%z+e(_i^b<NSVSMbd71tEAR+59l{6gofr3PtY$o zx!sfwW-{X!--5H-7hFYL;;=?{3+e<~MD)DC{sD$TF#8rXg8hEgFyUQx)mNEn3wZ=x z$;^14*b%(&N)d}<w2z+k1k35zxoT?pt|Or?{k@LS*&DF)Ph=?YN2R@f)t{8_EtuxB zzu7S=%)&?xdAbJPa7(Zm-HPmo1?PrQaq|v&{N|u~(!cH6M4**C?}Eb#E+J^z&S^do zia&|NR`r6DW~LAwOCbZiA;@4sz_k{;0<SWZSlnEZJ?W9Y1<WkK#4vE$V*LJGjN*uM zW<9S&0e_=0ARrR7%rP|RG8l=t9f@#EiPZt_;QF73i@|&CS6<yw@aj1^yWj+qv(+OM z^6tseO&b?~%cUdKV>#=3rPgo%;?&j4mFzQKwoO0R73?eu`}N40a@Jwy7S3Cs4L<8d zAPj#Ow?!EB$vk`wE~*s~KF|=^V?_k#0UM<Fa5<y5V#fIbg)7`07jZY`+Xj%E{xGmW z(5GMczHiP9mB*De{aMQ+f=Rc=Dt@iA2jS@sX4X}Qg&%}92D8?oc}H%@uFWhsf7nCQ zpay*lN^C?L1#*z<y2+lD?1W3u#1oPxUZ(~)=(PKgA0;^Sa&cA|c@12Qi>tne+v5KW zlVfE^_AH2dydFDWKWX01qK~F<v4mt5$~Fp*<FlvetQ^ZPU%dOjpr@}I)CVFs6OmnE zr@)SHmMZY3|FG91QZwRYieU#J+8kxRiP*aEb;39|MKWtq!Q(A(TvzyI6IJ!<oE;F= zMMvP~<#n&a%0HnIP;`N~@D=L1!>fn#8gapr+kagA!$HM~6p9^7E*@yh&0TYgWe1<l zDIpH24cdH?|3VDB!S*~A)vv|KXuHt?-WAL98nQ^NDB<RXZh+fa0V5QyYqZ>}w`2hy zemQg~s@jjeSbUJWPj0=}O1}3Oq^8`4eRNQOT-m?fmVLD?RBRb%`w+Y@cSl&@v5Y|M z4U_E)@^L{!;txrXh7Q+HyofhfJGNSjum<r{VOg0mlmYP2(sHj{?jLPEfiZ`P&nx#o z`a&R*1xG=vaW+NaTpu*Z4$=N|GU7i>S>70mwx}z<R>deVW6i@XheNM47AOC7{v6qX z&GO8>UiZ5TJ0E$*QtQ?^%Y$!SDe~n7kB&XL3xyxKP=0X%F?Q3h9iym3N!EfzFRsp+ z(Mfdx$M!?F&Ch8%i@d3nf+4el69JveUtZdEI45+-g1NIW7$DdUp$_fEISq-K+yVlE zU?aKfkTW{Ez6hQ2eqAt<B)*zy>cxJw+<**8$cFY?CEUqHHhDNkTT1iWabu*$Pab{= zhuHe92hqIive|1Fw^v<dd-jr!gP0ZQ+I>?M?p|7Vz50i;vD0H?$(=PYDy+Mm**pj= zSSt7++7}oFS2?C?^+|jLiI6!gFG8M*nPp%&!8z@C-Z8JbzdEkO;j_iI?#{~eP~Dni zCQsi@jNBo<*6<kw)ZVhxm2%L5I`Sl}fB9x)QXj|7%#Z|iMAmul#JG~UuQ51gpyMl7 z7Gax@^_rYc)4osPvZe@1VDo*Gv2*^3ao8o}!1k3apO#q#%se~kgo!~!uZdaEsi+dW zf-lxb*!f<k)D@ns;^@zcVd*wQMHD(F(eQJtd-3OCQDC|?U1N<uv~AW{_U`STA=?tl z`3?+x%lz|W5f5#EcSkO`Qanop6qWt#Gwcp6^7bPqSqlqrUWS|tK(^z`>UT%h+)PQ{ zb1(u@vv9{(I_;w^H^3w2F#8DaWSg(#215pW?{^}KM-3T6=7xJ~?qJ8HlK6NVHfgK5 z?j!wXwqd*oxp7toI${YkgzDFV(Bip(GOXT?doP4ik?Shz$Fdz(E--#qzgc1ZHE8?5 zi^%7_84gj}qPV*$|0$N*F9i?16}F!87sfACQPJN!WLs<TV9Ttif;!szNr<C^>i*Gw z^)eJE8m%#Ez2=aDFbL}aJLTeBt)y+$1{^XoV%YzTPE^LgQ<g(_{@ERH(?9n7aokgu z`AOU{S&&%NAt(r&M5?Bm1S12j!Hda9^k<D2&S^^&6+W`_Ix0)<(E6~Z4LHUR%CTYd zN5XVEB&)8D!9NkGw?*y+p|~Y)tflA1+{b6JhE_SO1Xz%qvh9rRybqDj5v2mL@9S6? zG}?l3_cK*PS_O^k><(og(l;UtS#Xx^5o#+kkIIoI{7ZUABt?p-NZI-EtylfkP~ZOe z8-~G^g+p4G@kcIH?zvlUDbIR=VMlCjShDgRkjzpugZMpuxNyH!>cwRm0XJhP1zd}L zn^xJ$^a~c6!Ht|%?N8OtyZ(vy?x&t@FIrNsRL4Ictlicb+tqeI)F@dLk?{$g+?KZO zgId9APacBg3Ex;6Y6x?!M*FSe%?KS5FL2ie??1AWxUx)istUZ;3U#zT)chee`XbF} zlK9n}sM>}rY5#)IGYc%(n%TCYfLF1}1LY6T_$|CYQ1iwh=y0@(eybM!n`)`-mOdEY zC~hbDbArMjuDGWz<9S!F<{A~1?l{$@y|V(Zqy@@5vOEoU@f}q$>xGN0hd|}!P;PxG zc(ocd?1Vq|xNkzw581TQKtQ$ZUvotMV((TB?V*aWERRk5!0*?c=`^3i*_j04opZZB zh^a*f-D1Osu$>bYXQ_R&9v6((i+T;n*r;Q!?sg{eUpffU7BF1c<oK1V1s|P0p=2PD zwU87~xQ4?uhnlR(bvG!y*Gz(=jCHw#BJ*4qtk~eJI>iS2pXt~7p3=Ix7bqI;6@Vv2 zan0G^G1JtM+#{Q+H-XZ<y4(J~hqSb#BUT)-mKfXre8S<(9h|E_bRckF(ULd67Rc+y z5y^XUw}oxORBc+g`O3y2Goi3~n^Q|F@9k-leloW69$P}Fkta7Dn{=;P-Ipa&5T^6% znKbr+4)GD(RAJo0)dk2=-m#Sjhpg1j_L|(oF-<9Uv{@N}mO~lV`R`G~b&hV_Biz8w z;3O7P_m70!n8{7V_{L8ip~4LHYvY{ns_qZucIpUxhFMeLo3(!!zL#)L7B{HZBBh4! zQ^%7)qGBA+*!#zA6!hb*_6?zKGxNi)c?}5%j;Y#rpn6>`s99GH8(SKLrf}^JlzWIQ z<#S!+e2}klFzA@?cidfdfCD(kWb;50u%YP-G2v{7DbrTHK+R_67Ba-F?+b9;K|1@l zz=UF$5wGd)nW+lfq5JQ{V#OSL%l9Z05ESj1LD(c-hi<Fg%6`{7KEQZxyl5DNp?1_M zkbvtAriR}SyX7vbiB0@@i}wsYtlyJDS$!~0FN7^tL>L=EK^!l9^{{L57^?vhcirLR zk_b_4-P+F875QV)1;8J|$*$3mlg_bveiVy*p!(h4sY}6F^z-FsY1TY1K~y$qEJ(IP zVv%M<Za6zdo?5{*-<}`O5{DFUliL>v%UZ3g;ikBRC>TdN<hq}CL}WBnu~EFPA;!`f zoZWeE|8L=oSfmg>WmkmL{^{A43=?LLF1Oiza%jt$rD|hnWVym8vMH<g%(%$bRg&{t zVHZWZt+BAq2LYPUnt3b(V4mGYDUZ;~42^i;56w~^@)E8(oLclr>>eyzrgVwDq=%1M zF*;K_p3WL6h}&TwlU;N~mKsLx0C3b!aV85%9fK=G&oum8(ba1EI?upECrYSCs0KWW zZd?nHo;Y|+I(uh<SBfxiEc;GBJ!fSMCI4Sr^r|17?@fN!YNx!T=1*8;x-*OoJ=yD* zyyu9er&NAtdxSJ)&qa#LgRu#Pw+~YFIx^##$wk&ykB<+%JfmZ`%k^jN`VuW{^N2X- zaX%BM{tZ1(W<{yK_4rWAtXT3Oe&+(~3+}OPiE~x<3J3+061mp`OH*R&R0G-c0ztnF z*fw+4ENjP2t`VC`s-4w18@=(!9(PVP{-rl`Lm9O0Z1K}3A^rp=1sjN8-Q1$P;-3EQ zJ8O3Dy19Ep?((IxckTXVh5jzxS(k6$ezA3J$o1Q|SFH=VxhbN*|CY>pvVz;tZYiOJ zit3(8Fk+0PZ>MaysvRQBRIi8=_38nYRi6E?{rE3lHj_M%TXqP{65WdsrFaYmxIb7= zxab?Vc^4AMEAaZlh-!(Qv5yeDCfAwb?Q*T<<v{ci&>!Ero`EnCSzeY(9%ky9-z{kZ z&&beFc`!S6_2~t-_GehmS+r<TFbau2hy7{2jnJ-gX}ZsoEL|@2$zIprG?BBmVCKsA z|7?YMvqzqkoI~Wx$}Qbicbd+5UD3sUN%BBg(0$f8yVx=Y-+L2+(vp#BNTaGs6U_+H zWaTS*kf$%<;%jVhH>;4M4dpeoFBjDzxBNCtGOgyPpnBYJq7U0p)lveWaok<9h2vZG zDXlaQmE$b)>S2%{mbKF-12SB!eA?&4iy(uiIX*r9d&hf+jLY`=cn4c<=-$x1zp-_D zhD3XhoV~v-DeHxkS4!QT6A^vlnJO)sRtqbyJ%8A$efj$J>op|8(?75(n^>ybs~$hX z<0x+*4y*bDkMp-2N~tLCY9LmIBwfs5KoeDsr01%`T(2A7g1tRPE)QDRq57(_5_7(Z z&=%q1;^R%{^(9K(yvoG72sj{Tl?TuQV$zc1eb6cBU#ps|3FLrTH!#87OK&oQ;N$as zf0qTaRe{sXu7)S4qQ3k|@19P^mk%WPbBcrJSST|x2w$abg$Y@ih>_wwsCSUAIYo@x z_G}|eB|oV<1uOS$_^so+`<blR&#35}d*9hlf%)$KN??BLa?hix$O%zaN^lOw#QMrf z)j3O2Y*m+gWjV;2UyA3(lEw=b?%nNXp?w9SHc&V>MVfx)VjB9=9hVRHl999A2}^Z- zy}e=BrTIZbohmbL7lJo|-172(o;a;*IgNnVwlhE@Utr;pFUC8~rrbSKF@idz>j^#7 zIo1JNGnW-W3cHpf*oHc4mK_NROFWZI|Fk@SG~XR7%ZyEs(c3YjP`C)gy}NR@f5y1| z><SG0!`;p1L#w<cS_TO5?f~nuqsx}r8J8XW*M`fEC^p=JY<Cz0)?Us0X0y`?KN+vM zbonr0kB!Y!1lsj8n^|LJ^TyZPopAB|@uGk$tI*(P6VREu$N4}$afLU~+H>^EW;ZQ2 zw^`fV+}Nr~Rh5;7%%#ie-bGu>?0meTK5SZffD;o+fI0D2vl-!H+BScECW_cLm2cAQ zM?fZLJtqkT9{u4gGm@|ZjfrdaVZ_*!#bab%)qUX(XE@$~hWWd49=!d5U$&b`nf1Tu zf!h36dK}1yQ<8&vqGM=5llY7Mez#>nbXA!NWd&3d_yhAeKj>qp-qF@!=+w6HxvIe9 zVw%gFd&$Wd(_iYIzALXUr{UX*%4xP<E;%hP2`z+Fw;tBvhDWbd8<A!3!rDo9uT$w~ z3E?bcU7s!%NjCtZi7{xJ8~?tTvbt*Ywg28!5}eRv=c>aR{ya9%yz^=uy00{AP$Qx; zkswsQ^dGi{nEqqg6c4LT7S5eG?fUAsMmDLk&o}4TlPC6DK9&LjTGZ+%?bW-(x4dCt zlOPFE>88EzZ|z)M2oU!g07+I5g5e(AO2Y!h?G^Z@T4@=+jqlDU2^F@bJ1ZO-PlM=e z5Ze9xg3(Os%f*V^_^;&t>5ttd3k6%s$`F~SOOZ)f@nLQr>Rjh4*PMz|P_IH4S@!m> zWVbBiEw_M8Pe7l#HW1rWFImX%_YcV)-uHe8eFV%$&uf3aaK}=A8FGB}zJ2=|=~aM1 z<>8=Td<c6O*oNmj;(H);Te{ArS@^v{=Z5-i4VkJ2r(h23(}TKKOwv?4yAt%rUK!7F zHJjaexvZ0gN+?2asaslo+Pk35#)X0i@E-JbaghTmFrEkZL><~q#QaO@e1O!Sq!X3< z5t%agV_K*c^72sgq4c1vDac7qIlGiYx_T<-gG?$-KppUcg<J<>>QHB5;_1U4erb&7 zUWk(49OXqw{?@!4ya!M;*K#`~41Qe_g2s__<E?_A#Qki3>Q0}i!q1afvr}2xGfA^g zvu(V}P1BQ~i~l$Qx{5`n%z(a_IpUz5JMFT^o7n`9^;^Lc=w_*WxS%tq=h>;(J`47M z9ND+8m(pYO(?*XBo{`GxwSlFI1owJPt<PxR-kR$tBJ{2+!WETW3+9A_4rkFKCR85N zpoS{wvu$~~ZtcMM`f1kuBIiOR&p9G!uF9j*g~MwVe^{dG*{Tz+Qwv`F`)RN&(has3 zDBc>3ruT1b-2;=OUzb~~T^k5jU<vzrJ*uKaYu1BnK5y{X=l9C%CPxzE&h4C<7$pXf zOSU+hl+9eUh-frT0;09!IDajBV%H1pWw%UX7Alu>%1SJf>NjH0e8-&hz{Km<pB<X! zYH!U6U$DxuVsPz^f6)94@<iyRBkK->?%TJ@cG}uJ_C2aoPxEg9dw^!BM1yS;pwGHq zqiw4iE`HsT^QFbN0|^qhV=maiu_!pS^*#9-=;l`UMbSCXpH#{>gPd0U0VkIYXNR`! zgkHchyxFVQ4t!h;#=mO^-lw<5EXd`J@S5v?r{BImXt=&RD?+ZKGTOA@^6<%uGgY(K zD5+Yzc3|`2X>|NtH*>2<Iz#3Cd{8OA{tcX+_R2L+gu7bmVpYyZ?ftr9a1A>$r)~V9 zN9GGhu{tUz`u^NT@Fi+`(>T0%Sgo-hn5}Z(R7nCL@`a41efn_FDw?(+?(;Lhv|I~t ze`r`(9f9HlEL!AhBaa)(3~k$#7}Lw`5F4P3{^&7lr1($xt+Fwnbn;~T$pYjH+gJpf zJJV&iH+l55p0S<C5zGcu#vV_jdO-I}R}ln-xab705<9HHynGQrcAk@KtP1V~u}CVq zXKfgD_FgZaXKh5@#_>__+R3;d5@#`9kti5mAoe1+a&@LYe-cJCm>cNOYn<ckR2Njo z;nxv{Ku{FzPVh!&V=h^0J*&s9^Dq=o6=bP}%le>nm*flrrmR@B0WDlZGA%9_?(C6z zhciO?F=>Q$#)7xH@kGDr;f-a)pv9M$Nb2`>uhFJMJzq7iQrwZ$S-JGM-@O<I%hAf9 z&yO~5ejFP4=ET9KkH4`4vz&JUT&8Olpa&Vbv0&2p0!366zjrp0sp_+>X=!6|=CJAl zkA}9?*qv($e(5TG0tYmtzeCK%!XMv10F#tLK?aqTV|B6`P_;Uz{WI}T_ar6<aH_}2 zMCr~B6sG(ZI(EfNDa2S{6s>=$D%&xc89rK14Csi=aG56QU7@a6&8;-pp+~a&#QsMc zR34WO%-%Ep=y-L{rG=o3cZMybN3T1U)M?n6-ojuPzyO|K|HqTgV~sV^YERy)QcsGI z-=DDZ66!eL^cfw#S)IA_d<peRoc)@4v#LG(;eC{)+L68V+{(7s`G``&mS10QEp5gA zKChyPj%*(%^7;3}0)P;!7hNOxrUFJYNI`VwQNFb#s>}w+$NFiN3C(+=%K(?bFb-&X zId1KKOme_RQ@?tfEz<;-U%Q1FuhgVjD#uaNjYD9%>dkG3S<%mqsdr|VBW-+)P8k!u z6(n?3d_cYo;1u%XtbBk8>sccc=1zX`t_^dc4fwK8r3cxFxXqoa3&LQBk}=Gk7Hv<z zv_P1NEdJSuI%XO!O~9zSEv?7U<f|R2%$2F`dR3@Sez0+gksfRdP$<%Y1q}$_8JW+2 zTh6O)CkNC8vLZ7M{G0RtGTn_fook%Nbsy**+g>4R9v(K>XMpQJ+F`sR_4$Kc;xjpF zWlKs?Hh&<p^x_LxdET(Mm-Z05!$k*Wn8ar@A{bZoEvjRye!qH|-x-~Q-U~@)5_(96 zDD1@R9PB!_@30ZR2VIJ!+oJoUJG<n^nC6WXpb{PL)kO<a1HA2tc|c}OpT5O0HWV1n z7u!oNji+IV6c=F9KYmpD8Qq%}+)pvF)XwJ%Nf66l&RJS(xmu?5x-c=HScaOR*n|B{ za4=P4FDeJuLee>RZlo^{s8Ji@E`Md#zm6XRb3&EfW~E~!5MZzrPD2NBDX;@pzCPY# z<TlsgDi<r_SY(L|XMzCoV{YK=XXl`_f^Q$fTlRS&fRWs2CtsK?4etqb{UXW(Jdd%( zE!Bb6t{Dg(3VEEVL-U9Ce901@Yn;R|#bjYQpBZ~93ZECK8SDJN<NJj@%Ul{?IjEOP zJ(FHk+}3m3K0`AVk#?Krag9%(-1em0o5dKc`nd6z%~DTxWC#n6*AL9&-t?|+ugT)y zRPRK+S|~n^GPzqWJ=I@}amUI_AU202S(nG(MRD3;W@nC>S6hi3X<gaJU6380x-}dG zo#9f-(vX^Snb&pv`zw04m10WQ5qe~=yKj4AsO2D|z$0k!7(^Cby2Fs<WC;_*m)a)B z)9T4mCu%-dvhzB%Sc-2OL>n|O*Y?YD+KF-0>I>=z9NEQ|Blick50TIU1lw$5M@UHs z7Alr@JEhV}<(qkgn%EWW2k6hodtHc!;oR;7o|}v=VR#$E;N{jN$O`s)^wh|X1X=hB zoy3%~1rwq5t~Id+?b4%gSopoZRM7S#%P{T?QtIb=Stix2>-~<D-khH0cOg8XdJxWA zjCK;o)Y4uYrY@&P(M?zoD6XPd9DL3;B%66vT!F}X=?_f>r(}oAdCz3URLM4G)>!EN zQk_$Ak>-LeftS9ztY$^5QtV6eFg*qKWc)L$$SBr30vvWXV4g0gFwN{Ln~c>g_;bSy zl7iE8eaZFNA0u`Zp_>M!5tmXUY$i*EHErrGZjaswPQ7^BEH(RlohIH+c%uF}y_nH1 z%nNwxMzuGhIqkGNUxxE~lhQ-C>RDgcej(u?yHQ&A(~aSY1+^kKanuczw=99g>4~aL zdU+<R%@N((A>Rm~(vn!3sGdj+e`Pt*xvr9O7rf(L?#*rE!BI_vBcxX8T0Vg(x#<E& zq)Ao)2~?Nat=KY(&LLz`sIJ%4Vaeg%Hk2QnRY-^9F)<HQ>Nu!7g)!Gt>iVJRwNM(_ zwv;@wir<Y&sKy4m(#q|Os|eDSFN7QXt;ubu$S8~c4sJOlkoa11LbDxJZp|*MZ@WY& zk#xFVyWL}CR%6psRaC&<-j47}mo<VMr!JD@A<>3Xj|kYHxGKe0_NP@kt%%CHeuuRs z-Li_HrrcVuXlYeZvHUo5P0Vq9*6?mHoT#}Geb2-e8+{65dq1X<Ze@LKR<Ofye^5m% zZe-YuTig9c_3qgh+;!nlK;27!H)bP_cq^$tyF8IPu&^7MI7n_w8tDttVjV5h#c^;B zNQ{h0imMctQrR(SiF<h!+2yI2(V<71wWnUmvR!hXks9>k(;!?ghZQ1o?VPUQ=b;)* zd}deQhi%@RepC<R)8Xj;;55<Pq_!eimCz^y79(}@dFxhh$PEz{c^aa7QIS5VRixQp ze3=`HhROnlt?3wVseAuSygoa^WYQgEt`D`FUzH-nQ5eWiktL!9fd>P;hJoSOwLnbL z%*Wk9_EyY+*xo{yDY3JcgSZhMR^gw>5R<82x_M}1^;lGb*SVC@HJpYDtRK!iH3;8N zC2~S*5~jsvx!FUC%%yOpVi4&cnM?0Jt$mG;o+K3o8@s5tyBB_vx~Vh8;Vv|94->zq zCK*ct=|NRyWc`dWLiYVcw)gJymzL`weqF@T$$rfInHbC1he9llS?PRj?@wvsjFbp* zB7-{jti)!^zOy<X5FXg@#^#8fV-#8GWO%<X%A32fbP&b%*Gsn749j*tAb%L*K<m;A z+)F@WXatrfGMV1p8ELNr+UN%%Zf-f(u=1gm%;m2lUD3g-NVjFh?O(<qQ08eyVRW3m z2#Tbolu>FtNTPFO0z>A@bWW5(7$=iO^UV%UZnz<(ED{-DxJj5nPtZ5QP(ISk#*wU{ zib4^0+|0!QC)%L4nHzPMO%m#fmyei;jlz%P61{dKyDHZR+bNUW;LmR9vnU2=k5P)r z>3-Q|;Qsq_ha^FSauLe3<Q#JZNtzbg7W1%w!f6p;7;HzDyf>Jk;<9u)4v|rMNz<;- zCrOlDEZJB4>~+8?7|7-KH%<h>p?0b<_v#TpnU+;y^&9~wUE9azCvNOc))k@8rN2v1 z=kTkd2cYOBGp+Dt+jnzZ=|iLH?Dt;xPY*X7=Iuh#rI8+x1#Ta=HT#Wo4&wJCfl}X& zFA?mzCg&Vu{+6r-IYDT8yE|3{RJ;yxh{-e5r2ZkJBaf}X=Q-nOzA{HLWxQaoWmZh$ z?o_eSjIo_Lfwc8r8TI-MFDQ>nt1_vj944JZ=%AgZ5KxZeSe5LE9FP@Wvgmj9dc?$w z7$LZ%9+F=om3zA53zD7zo9$j$IRep@Rbv7Z<FZc&H1L_mf_B<NF~MYuD71Xk)d+E= zIxVnsy_cr)Bj^<}L<jnz^TBF}j&Yf_mE`pxo$xsnnL|L9s+pK_K;Uf=lcUT#6|s9? zn*V{85RJvdZOUweJ3U}@bUvHc>|l2YkeS{8lwY43vl!Ywe%#i-_BO5Z#+x&io62$0 zsO!yx?o3#NTfxU8>NIKJg+j2Rzl5>l=eC6XKy|Nrmvp7xl&?Knw5v*}Gy8=Bmm&@= z<1n6N@7<I*e@dT+7a2OIN*&}6LX(p3!nh730Zec<&F$$Wmq>bLdt@@!6)p5un_C45 zj$?`mDb_g%yk&OKP`H%m*H%PyCU5RH7CH`cCm&))xr3!!3{$bVK3@!tIR5%zyfYFY zI-_i!M_0FTpK<BHX(pwPm5)Nf!dYB<c=5U6q!w&6Isk$brkZ^o?ld7%B}=Btkz;6U zy1>lIh27}=Iv~akKCh$wTDK1;XJX<*8G9ROds(tZecoOld0CFPMM?{)J`OABB-m`9 zx6}0XKe+pY%&3rm18!p|lkMp7*D~CEy0rhzE&nL8tr*Ww7Uw^@R1Qg^RkWGqw*_eB z5$W%Ul*FVl|5S$GTK0_nu8%j$3$yvJM^1Z7`DjurT3TcR;M_&j+&|i?+G6y7$DxT~ z8QUOw;yhWe0EaSn@+EjmJ=zy**I;1cgFtY<F<^D=W6zGU<5&P?*)vJHxCt(s>|x#+ zSEqRsSRDl~sq+0wQQhi7jJt<HkG*DIYfEfM<l3Xm9x$0wjiaP-4qX?c6jMFTpfs2` z`u68;l-huiZZ`xOdZ@foS_|x?JBX=fgtD9qs<5J3?T5E&ObW?%r%_!D1?S8K3cb%E zfXQ)Sx)Kqp-NI|OJ)PZGq`(rs!9N;pT#^dXi^ul`namw-j=koKT7434+vJ^e@nV3( z4%<v>B_ru^g{|EqB1_kD6HLeJ*R@W>m(Rtj<m#h@pB}LSemb{IYk89wYU-$}xgbAu zwR38M4Hainc5azNn^%9DnS_M}&K-bx3fdVlEn#>z)e;%`z>IFhZ=lHU#mn4tV(40c zn9xHx7t4=EYgfwsq8LF!M>nG~_8&vzcIwe|*)2j_VydrK3o{ox5)JbK)!W(1f7R#g z#iEmxxM-cNW63a?&_79;6Hz-Q(OFKorfbrt+zpyDv3V%YnKZ^>ql~aD-%{{0Vi}EL zSJs|K3BOVVGaO)j43?1XT0$VF84aDD5r#RIq4`tjj+H^62hTX8s6Ip&(xNKW(~2aU zlnBS0=^C6QZmgbpqx`lm26g}r?0V{-b(^L;YgSMGBjW2x{#+kB6<<_1zFmC?bK@kg zlNlZ2hR!E#UxAfVQK~CXMS8)Q`E%p6i2Rn9C7wEt9-<R#03Er<wOL7R7f}6t1R^BP zQ-&4qi(RFW6p&>_jB>dC5MAPdxP6*`A3Yzx=f+Xuc5_HpM9#ddYtaFbFv~WMuNxV% zpa=i<j-K!!b<pJH@jjWoIe+T|$XQEw9;u3AuL%tHOa=fGkx}E;D*m?^-tvufo!}^t zr6?;zj8=>Xj}TekC5gwP5mCToIm#GnDi|3fd+O1Ftpm6o%MR3`_=0FMHHx!L0w=_e zJEpp7I(y1)(R`g{$Iw_;$<uO=)UVRm5)G-G%o3AmFUxeQZ3#`9AWEaF1az`#Kg1_{ zPjmDAOwthB-||Cx)|1DiH31IC?%1dzI@lKqbsM%X!U*t31!ru2L+t4mloLBE^>0_J z%{vV{ko3ya)s9fcamR9BQ3fVS($46Z5<;2wklAT;W(WGs<gpc6mlCZ~=p+|Q`v&ig zbu36Cni=g;tkbKPw)N*%HDQ|7S>r>oT}(zTam0hbK)}LVRw8;#44m!4&#A@qCg?A@ z;dKD{F<5%;Ozq1?q!SqL-)5DD7;;133GkkRv+Qa^#!{SJkh;uFXzrQhjteR6_ZEki zLuscye9*oAj^sAkS((@UrJ`V=QF17pIvy^_OBDL1#m^-=%CJn704f+aBlZLJ4afUz zV=PLcgTSbRd5Pz>9J4-`70ld<)#&!|&!eR1I>zX3Su^Y1APeq6(Sj9~U+Sc^$ygta zdw7sV?boDu(U&t~5tu84W%NRlB{i;^V|WNrA<_X#kv>3+`ZTJuqxwHM-#0iwW%l`0 z)R`6H{4!ndDshLn(K|hpUKxFlMbN#nJqm}k01bsFo><lvZ9a5(6nmmQ=~Yi-@NgbU z4b%CqO78>gpey`<bI!#XNOj<t3{{V6*oR+mO$Ejd6T4z$7(_#ewk#pq<EXKwssA;Z zgCIRjh~amb^en$)#;ky`uC>YYDK7)Ga->dzoUuiP?m9BK;MlQulWna0(D$QdxXmII zs|`4ZDQWL*JDy0diATPYxWUW%2X@{qb!9WX$q>UT81Eo;fN;i2EG|N7Ev~&C+x8Ma z{@PXI6|UB`z`f`}sV5U3Bz6pl>+PeRiZU0BL{5A_5c<YTn7llpmnQIPq&6rY#||(r z`4rr8L|`X>II@gZ8jERfqn7jU*Y`*NYR9d|#rp}>tFjZZlk`dmGmHL-L<W;m1GX9n z2dOKt&R6YysCC~-4#2Ir{;cG;W4k@Kd|qF^7sQ}5l`+HI@Yw?e@S0F-mGjP5z5>IG zf`1>Qk^oG50C|1){%KFnP&olkxhe4LeT`z*pbt`R7?8LhjHVTMXIr3RqZLWXBXF=z ziGU7BONpUk(?EGd(6!IzWW^HhXMphP8pWJM!0tbB&>9K^M3?(j{g)1VhBR;ROWUaY z`M|Iu#XJP&mMYNyAfn)V1N#-Rj>e*4;eVp`|2#0D|LLmL+JUsMKQ>>OV;0$;qM}j; zj_E4b1X_dv`nlT>LpcbI_NX4xx<{E5<Lqedd<EEyL7)5lOvjcPbP%Mo@%O*L<M%Kt zmB;mKl*~|2?@?}dZa|&5#~!?T;{ax6UqFT%SYO@ek*V-}|G;S#RA0X}+F@<PQQfyx z82kSBoSj}-u?%Q^a8La?5EFOTmVY={1W3W*uj`S8KYT-H5YWb*&+>E9JWasj6cDhl z!m|AnS2i!{JMubXZAg)xsi}=z^S6xKV(Kn`v`0dXp;Y9iCO6ebK$*+41#5-osU9KC z3`m>R)I^x&z*_NrJp~C?%0#mv>77N-jh0T?AOFrW{h}{oT%Hs?onv#9snbJzDctu+ z27<aVfXxayd8Y)oM_Y`8tlY}>(V{oZKn;WU8Lj;(#ZMenDu{u7zAv3X@4f=roT1e) zo{O%9l;sf3!%v}KQ>Y(4^^nfwjFv$htWHzih<S!yD0E2z)+D0j6<vH9z~H!8uKiTW z?e@E|y4@U#8PN<<%b^VaZb&R^!j4xIpKz7uZ7uTZj0}bQweYz?U%U&&4!lmDDO3bJ z2Q0P4qPwI3O!mypP@{+}cQ`IoPBB5pN1=f}SU)bz!#|I`8ue@NM3W#4U0dEHe~2~R z*XV7mESQ@g{$af_qfoDP+wNuY>i+2)+4(9V8@JCWZ4Q&<NxS60*+V{T!#y^co6o*v zwC<H_9;23V6KP;pk3f4+lBB(#&-GB4R}!01r@hN{bDgn}SesMSW`E+z;tH;r2Tl-k z+b{`p3&fNVS@0_}Scwu1_5ivON%oN6Nv4OuVuC>rs)Z3~<sX8v-Bt{7)9_kVEK(C= zfBb&QRJaJH{W~qJzbC;gAyUwUc*YIZ`^gB_@9#=bBjTvRzgl8&8vV~uR-Z<}TaTJ3 zQv!#npZ3@P0-&WD$0w@T?{n~&oCt@0Yht^%g{L@ZNvb`pg6xj-Ry*%}069*8NqqM; zqP8jc!-*NRh*H#`Y7c!E3@X&?u0*9*cb-n8H8z_Lo7g^JsNZvuvw5v)Q9}f8;C-%i zHM=O5@u@s9{0RP_4<Pl>fauy8Z|N<j9cMc0GypFM&YA?xfRey83=n!7#y(irhHGkI z_??2VuVL4LWkhm}TNxx7g|6~+<vSw#Nz5<t+p=6?{cbDp&fe}IEDo%MYH%%`;oEJi zLeRr2Q_BjQ$`bZ-9hlbR^JZ=CT*(~ml4oL`34qWXOT94inWK#(3q?r|JiWSK&KZ@= zbU*^|)y0w$?~&RrGl_eO0aIK){xY(?Jxog+dJJ`@mVccF*6F@xVHS4)Fa!H{?A94z z^JqUeKiK5tZC`*0^O=8tSuU&S1~Y(TF}5$5Y-cwK>M13u)Y2I0TZf&e<M``OP^Rsc zZhB?Z)k~#tA0U9ab-c%u&=xfDf$JyS0^{x%7h}+@<RLB+MpTRCT-855_N9v%&8bJi zynqKYL$fsDu5S0~Ol)xV5nJ`Eg3Cf)fR<Wb8(QvCJ+qBLKFaOm9q<XNDeaT4$oD1* zs~eV=O8fF+ic|4zWQm)Rq#;A<k%V0r6aE=OzRjGucA&lm^fAXIr)vWn^%cqdg*-jN z&nm~Azwzej*{f)b{o8jIhxF_t=`O_g1qC0n`GwH8>gJPcx_uUN^~B_7i_!6blP}n* z?r*%+*1`XiJ@Vza$T-+7^Id9igS%<#&$)U|;N2w@TXs$-fdlwE6Abf2c(}MI77M(T z!ep-Ir*@WjZ&sJA^OA8x+;kG9Ycwy3?}ucu2!`x~A|t2<5~eY7zn9<wt*1a@4a)TB z*PO((09ZBZHkufe1y2lui_n6VM!{%8;JqX)4C5$QTYc*KN%B-A<}{Ka!P+tLO&4VQ zn0I5td)(=mk#~RtyX0K??`*6{TpHq@bH$PsfzVL{xX0}|BP$t@?S%v3=&&4wPG_$d z-H4P>ABW%2w~o|ygEa(k(K0MU`P*@(uvCBW>=>Z>C_hGw3dk8x<M5zTX-m^79bmMR zrw#ZzSxicMR#DxM`g#E56=9^lJF>0X3U1^UV|qC8LS*~Mmzy+Wda5vnuFkCW?9W4^ z0pG;9RIzvk72BQ~M*w9LWK9;#KPI`I@uj<J>*eb;SS45+Q=$NC!JZ!tl@s)l>A0aE zLATo<n)Jn8*bKvTUQXBjZ1J}A1`!Ouk^-}rGh7WuO{Dy2Jel$Q1~0m@P3&jR9Gv?+ zV4xk0(+owVYAZBOAg*E!G`Aj(z8IQvW86&|$|4}LXr-Q0tJr0z4)t1-ak3uTtARS| zq|-p4hu}>OBV@p6sQ~XGaMfvyeKmOs+(L@9#+!_zM9UPr1nZ){Goin|7RCm+l8QFt z1ZgqJn_$Q?Yof4yc}#987)-bDZ;^0SDD>F4nXsl8>2f_EO=RH)S5^hPF?^W0C<h+Y z%L66Vevsp3*}=Rrh8F^DNLREtywnvmGB^^ohI0JcSY)!;4DU+gL<E*48hGZ22}w>l zjj<>;l)H=i1|2o!&|jvF#t;*E``G+4Ryoey5EbCgGvj`7=;{7N;!N&E`PCAfwE{Cz zeC63gqxphLaZ=`>cA4>JoQc2Ns=XtVg(Q5Rcqm2_i03*0r{bEnZbEBU_j-Fo=o9^< z+L%zTH^1Gl>F&$Ygh<QJ*}TyQQdkkQwmyX^8wIyJKLwwH$cT>eadnHIjS1ptf_Tqs zMGS;8O8&8>@h;8Ob(B}>&J<U*=)STz$xdILg1G^um(1nX*j~8F@TLLL`FfcEsxQLh zz5J!wt6<CEj%sUW!DKUon2ERYMb@Pdbq~ODbg$L*^*KQKTqn)2U)^<PdTTin?1)y{ zRW$#HHCU@HqVY)Mx}Z7z4yfh;80O_rB)5_jpB?F1D~)tddL`|V7mwC(yh@$P#!y#) zz@$k7`cafq3%i)*kTP%gB4aU$!gsgV64yvV;9mShlHIECYV7N7AEGluvMo_#1=YI# zAZXO;g?w(#U^E@&WHcIb4JH2488Vc^VMOQj)B+BYvjU?&YJIs7p_y3gS>)}m2j%7W zwTXu!!)}k<KS!xHWFLTouyY<*10zaJIt2n*z|Cm3pQxgeVloln0t>DUgNZ|W%nth7 znS^_!N)NHS1bwIJdJg?D7Cuvk{zEaYtIGKOk+Dv3s}P2w5OK|!tQZ4YiY${!`yG!) z=TvFC22X&!7j;VT!*jEu;`#3idSOrc30gTV`jfux&y47MX10%`>jD;cC*2a8bR=EN zuFuS$Y|RB5u07&B-p_pzaM9z*RR&&n5u!>e+kuE{V~s1&L^o))D4@eKeb!cpju^s; z#o$uCPZsK7yq3SA0RElZN)6L6WvwrLK>cCxnrU8cWnQSqx~LYnoR)_`3xn?CO)kgv zd}&RHy4OSCtH<xmnsNj1+HjVg2Nq$}7c*h4zFFjLMs#<Xz1b~8OipPIXyJP>*^%X^ znFV7g4K@T2^B);%-xBHd93Lk|!uY&lh!w^SZk;2N)<{=Xi3-r|H)6+0`e9<!N*rj0 z_@z|dLsUW@Mk@QTHH~8j_I-hsgvs*M7%Oo|PF|$V{;ClkY2b5HC#hlERa76TDb{D% z@DW%{Da~uG=Oy=|kvB*Hs6q*y;e=jhRJ|^=)B~|9vV6Q`_M%|eSC{0l(@xprVR-Mm zj4x@%1za?!G6W9SVVn2P)(XCeK^VIaR%5rHEJ9U!VolD3*rWVIULk4YN%Xg$DzaV& zWTbTd5#PqjsUpB=y5dliAyMd(y;<&Bdtq@vuaAJ)4!dv+mPmE_buA%}f3JrGb~uI~ zHJ+E$J5CC4dV7_a+=KregWUpk%}5p-Yavpz8xyHTgW^g`H2bJv%RE{k9XXD_e<elj z%>dM2O~Oa)F!w~`yxlcu?uoY|u`oM8`!0RRyVDcrR>SjhiTiMzyPc1!n6mUi{faTM z>p<tsI`5ysc>d9DeCK<&wi_TA1#^Lit9iRxCb1SG>HP<hrZh_e9yk1%`>E!rbO)68 z0^m-1xS}Z|Wz0uXM+t7&tr*oKw`WWHoUc`>-4=^Vr7MRO%F{;!VlKAVvW$mfb3;nO z|54$dxE~DoOq2ni^&prX9Nqq%G_%If|C6;3;BWbMSzLBCMz8zS=hxeJm&fUyfgzq6 zvWs*#Yc)nfZMH>sH1yfIT+>^LpQ`EgVONLUzl#AX+d=py6EAQ#v9SVA1krF_k)<)! zYX)9a0}H%YkxfDJ%OrO(WzMx`tNpUnbuyZ+>tQ({vkQNkpNI<>hy^Pxpm>*hpg|Ac zE`7@M$??LX(Ef>()KWY2@0)%F(O%xd#u*2G-M?yw|CH2C7GCGk<b!@w@kW5C+A5HF z=xem{hhvb%N9#Qcn%sX42!o49Hm&b45r#_KEM}|Tu<+C}@ov!XC}8V|q8M*OIXnm) zMzx^rd~KG7q45!7w379x`;ehtMzl^+rq3#Gs!l4^yF+YaEX3g#SYT$li0!pr9g*Z< z_oIW*@a8??{XC~aPZ0`(BsWCYik7<LMm34znve25R@TY!JPupND+W$vt{%`$Q*<T? z3;rxu^<Me8&QA6YscdSR-k@x1V-pKXg42boFZ~|2g60;OONg3PmwvqK=LhBe`+{NO zSiV`l-fFy!M_?7w-9N<H8yG+OH}4t5oIDuMsMOfZXtEXs-jGn2sauRsOc}u#$a{-y z(9SSps75PxUJuH4)%99TU<@!p-@L=|&h}Q5G?u3i@DSrQT!&_8sP$F;cH$lkZT<(u zhuAJFzvPuO+d!n+Q)vRk7<7`3Gkm<<t!T#$)9GpSq!Qzi=w!7Ms}}o_!D_=fEq-)s z!gDnD@nPH0K5jUyX?0oq*7gwFdYnSS%d}wPqyBrVmj>8%$d-T7&d`eU&`v$fEE4y@ zeae+w7C|v14`MsF3uGx>+c9xfVd4^+?^NN4I1Q}V$8gjqMC;x97dW|kh)kN`s;@)n zI>f4#rta-Kb~oB6b3P6z;%O0u>5HlqeE!;(HNB~^cbjE!3g(uNdg<1#>)v^46$9bf zVV%t5E~S~E!5*%*mHN)!xAjAH_PcV4BXf<O&2nE*$RFq3co6_Li^@V71cY0EYyt^h z_jJWqgTfHB6S7V-@2BslZ>U1OCJB;KthI9Vo-J*u5nx7BdzP*pcV;W&SABL*Ur=<3 z4yh@|$F*Orfck)4B*OQTGI0lC>T0{I!o9)p6%*}kQix8xKKRfrtI8AC!RAl$MPBDi zb5OmIoF4R!((z6C_C4h}{%8xc1^&=N*?R39HVcJ5!zO9DP3_0q`T&*E%FvB<{IssC ztVp9~hHrTMPzuJYqGyCU7@Rg7n&1zW?E+gF!@icLUH?mttb4fXFtd2(EwkdV;@8{L zaEEzPgGbo8r{w0l0eAH_cRhI((6K&PUymb<wnAxzbX*Q5*ra9$BnDa7gfNsQK_Ql? z56Q{FAD1T<paQGL>!#er%<%XUHz!aaeWA=NnPIlQ8ma}o<1Rfd`)Ad`sNKFXJ^Xo0 z3@-S~dOfk=ShUs3XOr%!BT-%W3|NK<qKZgYiXjWlAmKi1F9tHj(aC)-yngC(CZaYa zN(Om5u+1x?W8}!SmlYzeky>LVgSw$;r(T~fG&PGmyy_)3S{I+oke9?9?w1uf^`EJu zu&WcE`+QY--XQ^&i4PEfosz+w3MA=RyT?wu@U^33kPXW2&Tn(3^!2T}u!8KK>_e@( z@!PkSHHVc{24{`spR-)l3tG@<&{LIQP#sn=4s~kT6DD{5BUfQVi7)<8-Ph%cT48W2 zmr*X?iD2XPudWf30yF`Y!^l$Vl>`oT5fk5rWW-+c>#6B%XT^Ciwio7854-MK;_Q}& zaWv<=ce!solzB*!J2U0DOMh8V)q|tleKNX9FqwMLgkkLL0_NqbyqM#!UEsyGI(08k zQ$Z6^6b#Fu#M{OQk*h9A)A4rxnRQ2(ou`$zN<C@ShAH@-`{O1oUyinpuM1C~S>_Cb z96;(YYZF&}Y(g2EAB14_Hzt-EY-akqI>}snA`>_~REBeEdurzU%*c#@EQtm{Ys(!j z^>xrRMo*Z{?lIbVSZp(#lPgk6VUL&_&g329LtI2<_yr&+X=AEzPnMwy_w)ns%Kx5| z|I=+CMuVe0RndI*v&}-pS{L=FY5|pV*?&r8*VX8(G0H?0Ymg8<m8~Cs-(FON-RmFc zUML3(9BiL^YDeoaEZ!t)steWD0fq-0dA<Ojb36i}srhV?RvsZ9^x|L*1?VNPaAs9f zPEkcU!!M1}G|2Ee$$I68ywx;XVuHusVr<>d?Z(hZxcrxqQ^HU;oic{^TX$<FmxS#1 z3QGfRII7fxp%J|5Fuq@KoyH}=#NHsUF)w4LU~>LeBd@c|T3N%P<*15sWc&~VmFo>* zklNg^u7JuhMs6-)#EiazdDws%OUKq&86e`f05K<Bf-tluZh{0Zu#-v1PFA2*tyb!K zwVeTIzX)a7hmmK7g4dvWS$)w_9JL_F#JLivKHF>=2-%H&wr@bNBRzsW{K?cCz)f#& zgbs*qW+<WG==U#wShniyTJKk=du)3%D}6X|v&!rIM|zjY=q>L)q_1W)sMn*(wxr3L zqsZHDZ|dG$x~m2oZRMtwq<gyxDJ{N%unDM(Ei);Nt9s<eQrH52=&&iC3b?boN^P?5 zr>1ARva7iMS!^uWv52FE$8RbzJ54a`l$AL{WgZ$yZ8zeBQmB=|y^X=I%wm(7(nvME zAv1(bJCEiIJVZ<P@OJ)kq!Lw*mN7u)=J{V5F9<&k6tILQzFbcq(3H9tf(#a{>=dJN zDURqQe&+jVygTnxPqf5-ys(%*9$kV4BDZ-0mH0qkV1Ac-VpgQS)D!v94F6n~GnjcM ztA*h$#<!hR#0IYl2pE|M6+4m}nuF|IsXnsfG;lm1e8NSdo-<Rh1>0GBEK9uOwTZZ9 zm^E8by;9)ix!JWL*%t2wrUBna*sj;aZvOSmti`~CNwm$IyLCdIwxYq?l&we-EfX6+ ztmfZyOpAiaT@98?h2kjLIcMjyC8h(FsElFV%oqj0-5a1V>SGp@q^}Op?#qX_|LWPe zUgODM7cbtL(?dep>)=Zh?OGYg%8au@Wp{biSMVG>T86OtZ{S?<YRXrL`zMvh%ao1G zN`M^v4_m3cij!*o>QGm_2Q;3t|EUl#*%cGi7jpM6D*ye~r~7}dQ;u^fAS)Qv7CEh3 z{%cj>Yf%9#hMf935cOx7L&1xEje@U5i+?w8gR8DVD>${jTkCohbAiflL4Wqle_c8; z=xa^nU#;QbM+e4#R9%?Hq;ERDzhRVuBqRCLEa>0)&iOy9H`AE*y<viXtZby@lH|wi zm{#%mh85H6H_B!G#fE8P1JgeQcKJsPw735?Pe)twbyDFg?+4Nh!6U@}lTUmjE*_rW zt5AKVF>1s2*`DeOPDR{TcI{vNhAICaegNC|DCW(F8wMJOza3Ecx_LGA3R34PVK@nO z@<X9gslE}m!DJAi`-jdbnDDQy_}@Q>TJ%KN`G30m_OK+g?ok@YoOIN0YRoAwOw*Lj zm^#%Id8Nt9na|3s%*+(OF|#ryFMtS0*_2JCPE%gW!Ww6?ynvS!6alT23A}YtKm{zr z3m^yx2nhUMt7)un&Uw!Boag*=_8<B_d$Zqn@3q%jd#|<EB>+7z*KBa!>*aa%w~#Z- zxc~B~_{HBDFfRYABsb16-O4jQ-T}xPb4%qHs;<53UQOtgFX7y_j=#Om=2m}m>a8={ z|4nrnc53qNjOM;5`1{wOpIcY(%PRwP+yhY%ps$`=PG-K+WWSEw_O@Yr&_BOpR;4qy zY#$=Vmc4Z~nA=j+vhz^+Yww?bsGhayHyO1_3+A?gs?T@$?&&-iA={kApJgX=%Qvr& zj-t({`5lX)=2L-3(S~~=f(@SNl~%cg@7Y0&l!2P$@pX;Usi@yYRsGMta0lanTbaCI z!p{ZqqKQ~R<^#%0-VDGicam#nS;z3N@k)UD{}7dmnIEe$`vd`^(ro66?k)K5ecZue z)U|2O5okj!KJ6*c??@DItO20c4z$CI;zgw%pHa)=q-&9-7o*yVvkxAzg*6FFs2BOG z-aJIHxpC41?Vhm^)|&^;TI3QcGBg%->7j9<bUp>08J0vC^!uyls}9?MSG?`{szWI7 zidPQ>HEeD@@VTTbvk&Y5q~i~R^3Ah5#@ter`&t1sw{G>a|6Ymxn_u5n&HY{VPp>zT zxpgrMUb`mEt!r7h@Rhyj+`5x1-WcW1t^8l%;`?~?|JeY^Uub~S3z0kr6zuKSpRVLq zoim;SoUc6oZfIG%X!PC!r2Ci+=%hLu<NtR{<p+fBf)A+<Q<k6>{R5io-!1#*b;k#1 z@vZeAfMSf#qvsGx#mUjS6|G5@xOt#z(+QH*+de15T2#DWW5|FLJZL|j!m)VU((?6? z?)VSYk>9~Upi1bV<aHdq+2$CBNo>QH+^U;iAW$DzrheN6RBfFe5V=sguLoe&5_@gN z-!1zs{YpIkx6@(wJ3?H%L!&j}<a}7V#8wn%)-|MXaAoZYXGdc>f;|MCBl$`<|Aa98 z(WEm}w@KHMk17;S|5+unXJCJKZp3FYEkL^-q|TZ48-SdTlh|0^gqsGaEPMKkrdmle zKaR6*TP{6%(iGXg;%uzhg~>Ln${>aC#%Wfq<Y-|b9AnCloF~6k>c(7gb{GXk1?lwh z(KYoY*#{}qnV0ejFEB$xP#gfA)ZPEbFN!aONU3B$Q%>pSwC4_S937QSG{dLDa_MHG zV-(FnZ`V4ZB@AXbO%Dp2#c3z7t?5w5>vq2~<SRH=ghuHNkzn|NRQ~er?#!2AoEw5d zP3f=`&Wz~p-$T%sS+NBVnC&Y7zdDQVIjHd$lnZWo5gDp<omwk6XfmlZ1yS9UnTk_H ze>h5~;K<y|8m`v4`T`&<B{_cuRf=(Cr(>;}>Ptni)aMQ&H^GUU*q35V0}YmFrf@E5 z#$!0S7SU(=yvz?1MY))4{GQK1n<fYU#+ARY=tnoh3&L<2D<J@f(Gi7B`YEQTB!~AI z_Um*P4|A7eRFp|6p1>Vfz~l_F-*XShl_<wt&8=PGw~h^lPi#!Xao1_Dl+8Te5vRR1 zK?^gu6@tGKrYJU2h}tU6MUA?YQAcWy*FH{3q5iNIw8`?n=HC4gGQ@w=$r1YgFIgT? zteP)k!pID4RaT!*PkuKy$|OkD7Pv7aw^KS3nas$Y-3W3?rqlGLNVtWY;p)qcLq;nv zN_q28DY+mJRq`3f&%dP6L|2kB&7077#5v&gi9u}F<i`XhT$mZFQ+8_e$RB{X0lvv| zND5RmKaLELDAiSc+XAA`KCPX6OqN~Pn%w(5R`iwJXFpx`oBK|ysz(DA_Kh(p-6%;2 z3rOjd!pB|xk>$-VE|Uw*;;jH;DE<5h?FymL$Rtr3n$<R_L|mn6^&qrg=7GnA>)@U= z&6I*OvAYK+kSVJQ4@M9Sw<1|p7ehgxo!ly%L$ILRTX|KZb@}7s9DX;Z)zKa<A4YKI zY1^8;Go+`KPZ&*A*Z~!ZWf5h>nq*48SL5wwQyuCGCbxSrV5Wi7ih|fsoEjlYP=|I6 z*rp`}C1SbjNZbsS=CVQNv2KJa8Yy*Sr9#svSP7o8R-PA11+VSrXki(Nx?z$tPb1V> zp6omvI+r7yj0i<abka*D;nfCLuj!Uk7-riBM{S#*ce41DGFVPgq@6@(I@}Z6_C8j^ zGh~7kL5Xm85+y;C7iGGiqs=eDux-nr;*B=J*}K){o!z`h6Q2tAG{}l*op{uwNeLGq zV|7b=D>iTpOFax{FKDg=2Vjd%ID!rz{^XsJOx%?Asd&qUb&^o{pw`DLy)!)b;)O&{ z*#)%nejY!=r>E+4-{V@66V3<|rr~tbQ-=0G%Hn6a1{$Av=env{F+fTNtJ0h&35NR> zWWhGNioR!f@eZb9kNp*`EZ~62AmpL+wz0IM2Pa0CEytTxs9azdD9YVBm$8BxPS-|u z$3w+CtfI-1LCAz5&MW=C!9M5pSd!IMOcu)A*Bej2>ua|KY)~e!2O1RGV{-4z@@72= z?q!~AE7d!U*%@otI2ZhJWnQzsDG_&E>7u={+DkW`C>ntMf<34n8<pdE>qUCskc+_< zps9GlyU<Yn#Mn4Bgl$;MkIKuGn1V79t*25{{%*{zkVV=D&FK?maHz{}pPS8-=auSi zfHBXa-E(TZ#1QMYlkr?%O5&k>W-6fqbeXfu=mXFGJtj52iH_CidBRO}O~bJ05kLj5 zKIM{&Cs1kE8QMnQ_CG)%{W|&FZLS4L(Frcwcf|$AHBldqW!tAekJPxjI10B9+N*#B z0MkQPTV()OHS4S(Ih>u{g?57QOhpx>ARG2=c|~RgV#!|2wuy|Fswv26`~2eE4%69* z%L4S%tGCp51ZB;Vp>z+>Cj1C)F6DCVSjYVf{goDxw}>0HIfl$mcayFp3At+|v&fM# z+2_<{?FLid9bhIH>dak>L^E3cZdddp0kEU2_&6;=jY<h(>h19ovGN)avhy~BQ9({6 z-%sFpi<u>Ow(W2|2xPpfox5en_^zr`A8e={Os=FRa8S+CmgQZv<K|@~tPwa=79V$& zoklBEKU5o7Av+zVbcG64AjgcaFAMC7vrkKKn9R*Jzv6I{<y2<Svpk{k_(Ex}ei10< zz`HXma)_%ZF!!CUSdDU)5Jm=p%?RN*-HH<Im-z%3o$@6o4KdNjAzc4i;`558lB9Yy z3E<9WGxq&(=5eXUJoE>rz!2j1O+f7<Ad5lEt`5W8^TjtdEFdsPhHK;!*~Tva%c)+z z)dOct@;srB09!Yy=)SN_z~y76_oJ0myMk<JLbsS!UlGd~I<JJzFmWP_aAi9XH~eE2 zea-;{)RDFJK=*&#sV+=Pe5x#t108S8S`M3rpe|N$ov~8YkLO}I*q7I+>=2X8R4d5} z#np7h?FF}D0d`26<zdP_<U&KP7Qct{Peb-#9rnl5M8JEGIuDOr$M8;#GHp#pH@H)H z{gP?QXxlHX#EmKDyGla|wQh#vMIA|_S?`L{uDwJ4xqBeWWLgnk5Z^4{#X~U_$?URh zKt4VD<GZAEbk|Brqr}6@cXB2fJJ8t(?>9G4p0A`eN@59)fmYO!9=;oU9rQ%7uFrfz zwC|UuPr==OK3&=Vs`FK`ra@b6PNa`7U~2fyr|&{$N>m9!2=AE_hq(<_U=MrTvp56P z#l2_LTau?H`UVKlYl5pW!<QC`yhwEF;L}nwBW;!;3X!qshjmOmo@0pk-BIdk-*^J0 zyCmd=3uuNTjq)v8rf0%L7}?dGEW{|MvgZH8r?+qBNtWREpnhL_Ag+G+S%X`ttr&vB zPu_qOaA28-nk&=~nLb{J7a(El4=^OnY<4$IbXGZTq0KEsstEibws{(?y&(u66#Dft zH|6Dy`ohw~8mAVK^Qp2D=Ph9R=pnQq+pZAalrHbv5Y@4ci&IjQzNQkq%c&3G&FLY! zTj5cWnTkZnmAoiScX}}Q(<!zULnA0=4@Z+p*a3Jnx^KFNJ3S6@UDa(G@`#N4Pvg5Z zche@0$cpxd;rfm6;(%wi&+w_?CKc3wzo1roq!E4Jsi5LqUUGEDLMeSLmVCpME(+zr z(E@>T3d(3ah%&rngjFyYhVl@8wCV8$lDEsbF4geWAT?g4BCclW3B_!aZyua>W}wZV z30?))-M=APQy9I+^*2+xUL^7c`}jo{*F9}bs%ki;4q8@qf9Ckd_prtzmG@KL<$#+y zJGIvbS^M+rGYI<c45l6Y9{?;>hb#?iFjTr+#NLNFe@)V{E-6o0XbZet1NPbFE=?1k z`k_Xkd@+2@vF<}EL#-H~FFg{yQJ*0YiKs9v0<A7f@<M@&2RVi$Xf(kTpUr{<pyZQy zJn9*d<bpF^g}`6|^$g*_L$j_4!)DAFEkp^=?6hrn2p7UvbMw7S6_L#KEk4R@7~LJ` zi~99LD!aQ`K3526T;(2ixLmq-NqOxvw`OzC>C~t3cRtqCN=m-XjmwVRJ5DOW@JvAb zMotI1W+Ddi(>3dDW?q6OUpvuAb%yd>CJ9TcOfza=i^r*KMUoP9hGCt!c%RXQe+fEM zE@6R9{7XL@95HbJeVL*>xTkRPIxQaDeI5vaZH(~`y;G4V?CLUnxd2&MBBcY7HU27; zZ}J<Xkw(B{kE@$>0jTm^s*ob*Z1bIIiLl+je6%g5HHmBb#Bt&)##F8oJKRnH75vtT zb8}rK*DEh6LoyBhPbZ2t4D~uaD8*$C*bu+=(p3zws<hip8<TKfPF)B<Cg{2xqjCC; zwUDzx>_QK2&hzW0+ez*-VW5vBOl@=8x6zkXRgBUKNd2(zaj$l%m&vIafM5tx81zb$ z`0CHWli*!_<sArThUeKJ2Ex3&8~2nB%Y5dfr6oN(r@c5cQz}RsYVWDeM?`<@D*d<R zAEoNN=9es`)ZWz-5Te!yYCB!Dgw<ZA=_-+Lbb9Z2lN-)Yl@1;~*i4?GLTS2-yDHj@ zv-6svE*E7-qoa6;)*}YuztDTNYptl;Zbg-(RQDem{thlzJ|2(+zB4*!R`OxJ?vmX5 z#vd|6TwKL)k;B=R8~$EElAeB>ZE@QW(2*wzEGH<Q**DO5nTuf?Md7BGL*Y<YZ=3WW zggCYYug~GYX^lROeY*oNL%{J`hz&#oNB=adCgj#EK3()vf%`|f;L!^5COkmsY4e8< zltG~Qu`mvy28@%|75E!YlP?Ana{7*zsD)>Gk>z#uu=@1{g}mh6#3$XCGH9P#Z!ylV z)GrS-JRPW37uWhM_TX^YJ!|48o+!Hht@)&5U;(1e)Vu$QuBQf#k0?eAE?uWy(*&zk z9RdQa;`$E7`aJ1H;&MiV6O~PIOs!r~1^!!@1?|hpw?kHm8NdN(5q#sWfHWY83Lb`9 z2*`wjs-b=JWTz*b7;y$6UD>4U^BN43$rY$H64jWl)5`t#(sgJIo2c4J9<J2H5x=jF zw7Olp?bbfcVffzfqBWm%;Y`E?m)q8f9R1kP9dTFI^VQAlT&T^i<?4*9y)L2nxPjij ziSg8q1JJ}ji|Qc~)zLr2&x$JYBH3T?C>?wKdC7euv3_eq-uHb-OBSy_CVpJIHE`Br z;IC5sqH=3>LeKzqI8}QE5QkzKm6I=j5fNg`SaJB&c-^T&7`3;3Rt6S90#Yc0*feF3 zFPLV2)|ZSG29vz`ee_dAm&Ce`R^sM|tFe1q!k)Ut<XcA!N8Yi%zw%5|t=$sCPp$O` zO7R(#VtNPP3K3ZwAhv#h=)f7=8-k2|+M+P?w})bHNj$~_4jGHp!5>GjZxE}a4*%y^ z)ZsfZ<UBQZ|AxO}_rDtTzU%eY$Ug*4{vpdI!bFx}|AR@5hL@DS4b~|z#m@sQQTEF0 zR(ro)EDQ?lVV15pY-6tP5BF<0dhmV>>R0O#@#h{DOfadU7O}q!g2`dEA=YMoOZwm- z;N|rwqNqG2sW_|A$1iNv(gDI5)SB<t1KjiKN*k|UH=li_@-WYaGC^K0Q{tfSV>%g< z7e*9|>0|4nUu@6^xbKk+t#>EIrZC0^;}Rz|ho59z>RoiSK59bYwen6BqJ-TfELbpC z8+Xznej+Q%*R)>*&g`WtHD3H)iCn((#RUi-mO1VMDS)T<5qK6+)E`@kS#3Vg9MqA& z1K#zC;<ZG#gg{_f7dOQ%yZr%$m=fV1u?iAgT``;kZ`Q+sEb8aKL)n};r$!<oCBva( z+(PMRV!h#FA!P^OwPF~tv7BU=B-wC?vE_5|zYgGBewG~acioCyeW`LH0#mEH%dl;( ze4V1|4Wd+TOmLF^+iV<s%rT2<C2Thh-&gP;Z7}WS7Ic@DePK{^tu~G7>3lQMeWCR0 zjj7*6T(*pf_$)jdX$Pv?uxituRsGiKZf8<1Wia%-Ly0Kr7g30F8MNaxkK%g%vUo=| zvZ`l8!6n?I+*`5>0mCbjF00}0l@5rA39r~E=n77p`Ve#BBhBMu-M=epw!c3#7wNVj z^;bn<W5~`#G-Yq<6!)&Oy;~UJnmWGTe*VLw{5r}Pt;D^*6j`P`efA0BUxhTqXT1Yg z5tH6Kez{F{i{(utM}I%rv%Mcii*C3dOsiVTR^uu*3<QA<yS0}qAIt=d`e<N%j4E=3 zfnals4%`rbPKz$ItmV~gxqbAXhUBzJ%Cgyp$Q9$JE)c(F_#b<4$q<sGO<$?+8DTW* z2}-D0aO&y6Lyf&?;e4tc>C-E{lG+ofz8J{a#0+1u>CQ<1bWQuy506I8ixy5MJu!*Z zwQb)f<{dJO#kyateAGqWtoB@~hBX8bw158IbWB`ZBOoGfCmcL?w11t%o4?>alF6|~ zPHe0+_G({(uNuyW3`V;ur2eYJ2MevJUqr$f$yf8oV_h1?s}5TJ95s(59K5me`wFvb zMSwMT%2vK|f)wo)`7CbK*q$`|ano5+*H#X5ONf|p9ETHh{@(NjFH*2(n#74SbhIZP zx~AE_6wLncO|q9)7}RpU?oun!xz|j}^n%LVn$gcjR3i*?oE`E^Ru6Hlo+8M=Nn+0# ze)Ey!tuC+|tIe}bx;6A|!5-ReczQS|)Cv_b*8fEUro>cEmN<PB5{SDl2&uqb)_X+? zt&w$k;Ys<O?box8?jf<oSHC@5+dwuYr5M>CT^6JXes~`iw#cBwj2R~qSgzQfY4U&& zcq3@a2dznqPqgh?gTd4~oZJ!Y@~zKJb{1{A{q`fl<{Xj!ClpVS=*I2r7r1@2mnxa~ zvB>+w2>kb!g<=B*YFTr+J!BtjaqTrdmPxKyju?X#UXUF6ShYiAV*}6>ub9F^KWcwb z`#SI58=9(q@h>UCwpAAXNI=M$cVzMLa@q76x?TW((T=<0O7p*qP;~Ax9%L+7Vo~Sw z;ogWUluLim;!peFCGG0nY6|XHYE<^%&T98sz;k!a#$JW{BqH*etO+WPU0fc>zLytq z2ilZzV7ReYtJV`^AU3pE#@NQXHIdm0p6<kw-p4-ez_xHVkuL<yQ?EZ%)f|71tUjd1 z2UZ)xYRUT?V!SE69G@ZaTG{f1z{4&@UrCD(m#m#%cDUg4RBEdXKulb|Wl2;Q3wfW< z6|8oiutv7sGjs{s!-lTq-#GMT0tSr8Em-m{?*ozz9{&j0{iVB8;QBN9Jm$dRcHGng zWEgxgOT&*(z}%{)xE~7Z*>6Q20FqM(8#trOF~Rpl$X%OwT5SLHhKiyUTnC<z(Yd#A zG0(duqZnPls41o$b?I%4K)$=?&RP7rWnBM7mdJ=6N8zr$OU^`E_lhS&*`LnzswMFr zq`-BFq@n%lw(4&J<MsmPjMo77(ZqAiGC*g7`2J4G@`!WX?0xugz%Y+#6`#m)dg6mp zXVPwL4rc72MLo0P=`J0(ow?h$&e*wBYTa8ld`DYRQs3<GEa)DILZfSg*2c#|pB$qW zNQ!73!<DWaHsEge1`U9JE$0KPF&l~j_;2b$ZXS;VE@l62jA;W#?vxdEvJ-GW{JR=d zu<+HSEV&2YnQP2f|8IXD!HUtwk_)0j7&8?E9S?vYWI;^rpgnM3)AHl%^oMW8xIejI z4HpN*rx7_3>P9<ur5-`8<+}75)qvt!U}~ebV>)KjkKOw3PX6jmUx6F-GUa6kl_709 zac{zJb6@BU8+&Bf=%42CdIQU#arJOZyXgWztYz1GXv_XgdJU6X@^zuHGfHHDWp<AH zcsg^|{8Xx6yjWV!FV)kve{imFGDmV#UUKg$2u=Su3UBUu$ROf3ztPj=E3+cs)9=az zF983krgJgjr(}0%!Zd{-#bmI{mn1<01c6Xs4PsWkvk?2P-}nfSedDSVOtK-Ps8Em` zi=M929EYagKvnzpn<So1zs=kqn}*^a;D)c2ou1ViyiRQR27obbS5ei53-F4~PvWJX z4CAAL_Jp$0hj(`iFl~>Ou_RtNGU|kn6k9Dj>YNBEjL~L2MvlTlGpEBi`6!&|dv9c| zK|Y35U`iM&X^hrmR)+VVbys{_+`F1j^UYd5q{LyTX)rQrm3;>Rm6SZYeX;<VmOi>7 zyo8AFXE1!zs(npdkv!vZn5YfRs2W7W7>v?^wx=d(&s7{mZ~8$_Np4;Yx(WU7_d|>m zH_C)R+Rhsb^a2!sBxt~X;teId>+r$Uff{9kys;4rh|7NKKD_brmsZ&khHz?-HY+E@ z@G#R{N&(M%R`W6|Vs|yB%dehNqYDcQO}$dMuSLtq>wKec=2QKm!<Xxy{&I_s>BZ1= z^o0FKgr>4fVd)5Tn;RhO@)<^QBosF!P}afex3E>>@KwI!wt{6@{Lrf;mx<A`AT@TT zAJZP$-SsFGf}Lbh*??(~dHfqc*9T*xaC4438&EAmJ#9ff;CDG$yr7jxk-}xGVWlT( z?IOJ>zxf@yCru{tVFJeJ5pVP{Oi4FZuCQYHGSb3zw}kYh3YiBG!DC<n65$MJU!ar9 z1aj_#EOx;Dw)(dGvJg={LmQPo(gOPYStQE=l(XBd-sKo|03xC%+Q0z^T{9m$=$I?= z3jC#4!>^c!?UTNSHKGmh-v!C?N6KO_tsZNzA@*Bud3q965EHJxC^mRy4zp4efN~{L z7T_)T5t#(855r&9g8hVvRho(tKsO_jgI5JvrPnP1ZCLc)WIt&o_AozY7%!mm<+$<n zqGi@QyedD~PP6nqKs>3^fg9_c>G7CbcLhd%D!WE`1;xL@u=Gu=HeBS3p3iEDr@D$+ zg>X8<ubNhPfn9Ui{t8MSu-i0VL2`$c((hPAc^`WKfx_Y5@^1V5NHPz|0>^ug$S+tU zb4(*LOF0w}qF&I-gn}xIXv^!Pa!>P1GRXr!Em|&mxB*Itm?sS)HI~ghbh7i?PY!$< z-AbhAVh0nn`C54|b8DVWqJ{CsAYP?$Vsrdc_u@74>on+A2T{BLi_^UXZXzP*fjaEo zgZvnvZItN^tZuqauT)z@Tz=d4eB_mOn`}-C)V*jmv`2R4n(Sn8C5$?(kUiBtdB>yz zbPzIYqyr_le=;u`(7#NS$ycFlC)fN50sDs%jIEI@yv`|n<P<SLjK0?m#<taqs$i4^ z34Fc<=;L|s4Pg(Uk<0`Xv>GoLp7mOCR+oPGoLbQ_8Wl}f|LV>ziAqju?$uDn|NL25 zX+OAo_Ou7gDeXb}_|+M?oKoW_{mq>PTv-J3@S_UFlL^HcC%KoI?@n?uyYNq3w09kq zDgS(&9H0#(AGd4)fdb#7H0h!01VHTC0%+*$3*mTEe%a{|%NuK^vF$QtDTz+J?mTI^ zkG7^VZ%Y?trpG8EX>ARk{0TMOc486BV3{Myk5s6_Y}mcBnHK{|t6@!F!R<jUNPrW+ z<xL=9|5(Od52GmPvv)u>e)miRb-?-xRWE>hmC2~BQ>ZNbkcgAy!aU9V7GO?*2!#-Z z(0^m_*-TH1mYMhWm9MxCEQqkqa70(bk@~v)L?BcBrtZ75Y@kR9<>9fE=di(Ab<LB2 z+w$qo3KkqEZAh8oYRpJ4P|KI^G4?ncWM`H3`fB(za620=#HH#^GkkZ;d~5pQ_XL>$ z(On1BFHlpzQ8bQ6-jVuak2lW;#hBj1VfIqMR;J~|d$qF+RAT?`a?gtF)$e!zKmH*> z8U%zRKw*K<sBg>3u;s<mv(;(uRPRqgPUy|^KF_>*qP4CaHT&})w(i_Q+#HkjKh$qK Ai2wiq literal 0 HcmV?d00001 diff --git a/deployment/media/new_akshcicluster.png b/deployment/media/new_akshcicluster.png new file mode 100644 index 0000000000000000000000000000000000000000..a41eaaa54c967e33a8c9908a3a3d0d6b2e1997c0 GIT binary patch literal 69971 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 WJ^jjcpp6FnQ+T8zTO@7t=Klk{REfa= literal 0 HcmV?d00001 diff --git a/deployment/media/new_security_rule.png b/deployment/media/new_security_rule.png new file mode 100644 index 0000000000000000000000000000000000000000..78bf1ea2603f295764d552d3ccc86d0b042262c9 GIT binary patch literal 24759 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 literal 0 HcmV?d00001 diff --git a/deployment/media/powershell_vm_deployed.png b/deployment/media/powershell_vm_deployed.png new file mode 100644 index 0000000000000000000000000000000000000000..3da8b893af20f8e7cb2d2b971ab868278e76cc71 GIT binary patch literal 14678 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 JO727W{{efFZ<GK4 literal 0 HcmV?d00001 diff --git a/deployment/media/reg_check.png b/deployment/media/reg_check.png new file mode 100644 index 0000000000000000000000000000000000000000..df5ee15b63351a9d05a74961d0c8ddc2e08a0dc2 GIT binary patch literal 21423 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 literal 0 HcmV?d00001 diff --git a/deployment/media/register_azshci_ga.png b/deployment/media/register_azshci_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..f6be1a40a82fb0b31590cc0831cff8d5f3ba953d GIT binary patch literal 31338 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 literal 0 HcmV?d00001 diff --git a/deployment/media/register_wac_azure.png b/deployment/media/register_wac_azure.png new file mode 100644 index 0000000000000000000000000000000000000000..55014e74e04df6e9e0aeb9e0cc434a225393514a GIT binary patch literal 12397 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 literal 0 HcmV?d00001 diff --git a/deployment/media/registration_rg_ga.png b/deployment/media/registration_rg_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..f325ac8e58d689beb2a08636ff76be4544020586 GIT binary patch literal 8623 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 literal 0 HcmV?d00001 diff --git a/deployment/media/registration_status.png b/deployment/media/registration_status.png new file mode 100644 index 0000000000000000000000000000000000000000..b5fe4ff0df8d8ee41f5ca16c7d446330bf31d6ea GIT binary patch literal 56216 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 I^*QMO03Bb%<p2Nx literal 0 HcmV?d00001 diff --git a/deployment/media/vm_connect_ga.png b/deployment/media/vm_connect_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ee91ac501bff7ba403dc8edfa90c7871a10c79 GIT binary patch literal 11305 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 literal 0 HcmV?d00001 diff --git a/deployment/media/vm_deployment_error.png b/deployment/media/vm_deployment_error.png new file mode 100644 index 0000000000000000000000000000000000000000..3261791d4b1e7ad88626270489371782c1f761a1 GIT binary patch literal 36555 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azshciclus_ga.png b/deployment/media/wac_azshciclus_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..ddaa6b981f3487948a658e337b608aa9387d064e GIT binary patch literal 16607 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_arc_register_error.png b/deployment/media/wac_azure_arc_register_error.png new file mode 100644 index 0000000000000000000000000000000000000000..2937c75270d5f02317f894b528f2669e2a731774 GIT binary patch literal 6860 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 ZU39u5%TGv)y8iJY(nRVZYE>Li{{a%&>j(e< literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_connect (1).png b/deployment/media/wac_azure_connect (1).png new file mode 100644 index 0000000000000000000000000000000000000000..a7d1dbb2bda18631a3d11f7d4b3b7cd53aeb5247 GIT binary patch literal 35025 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_connect (2).png b/deployment/media/wac_azure_connect (2).png new file mode 100644 index 0000000000000000000000000000000000000000..4f85133d6db08e01c5b48cee1bdbee2a2d5e7b2f GIT binary patch literal 37997 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_connect.png b/deployment/media/wac_azure_connect.png new file mode 100644 index 0000000000000000000000000000000000000000..a382d3dcd62beafa053818fab198a85b56ed47d7 GIT binary patch literal 38222 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_key_ga.png b/deployment/media/wac_azure_key_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f7a0f5445d5a77c186b79eea39f06228e99052 GIT binary patch literal 17323 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 XfBa>${&O6)10XN0B2_8zIrM)4rah<f literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_permissions.png b/deployment/media/wac_azure_permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..64c4434699fd4075d3f09ae3e0186f6d756f3c13 GIT binary patch literal 23900 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 APyhe` literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_reg_dashboard.png b/deployment/media/wac_azure_reg_dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..79b4b5d9715a6b1ffb4e453b0c5ba4d76ff6a9e6 GIT binary patch literal 5673 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_reg_dashboard_2.png b/deployment/media/wac_azure_reg_dashboard_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4b820f0feed5e9ec15ac57ceb70008cd3d098d GIT binary patch literal 3501 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_reg_dashboard_3.png b/deployment/media/wac_azure_reg_dashboard_3.png new file mode 100644 index 0000000000000000000000000000000000000000..40955a5b997ba2033d0ac2436bb3ff9d4acffc43 GIT binary patch literal 3300 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azure_register.png b/deployment/media/wac_azure_register.png new file mode 100644 index 0000000000000000000000000000000000000000..07f6247567bf0576763c6be237fa61085a52f238 GIT binary patch literal 6777 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azuread_confirm.png b/deployment/media/wac_azuread_confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f41f9797e150b2e53f26432307aa5b9bca7573 GIT binary patch literal 44113 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%0DRNnrD*cEiPl( z-LuR-CszX(BOw-pT#6(4rQuFn`eRx^?_e(s^aCh9wS1#U#NJ#beWYs`krID;%LkVA zv{sb%1t={$=3z27S2o_TLEGcawvj7MPNmF;-SLm%TBnv#X;6pA!n64+uk#Vmzo~>` zm>JW(CDJ(PCpo1;X!P$AfHBW=+!_Z_MCN*B?rp9iFB{BmD>BQJENkCL3k^nvo&mKZ zW|wmzCj!oYp^X*oJJY(1K$g2bqEuNGEtWJ><9R$V?pCeggw{{uvB-}wa_g;)2(^Un zokv#&jf}4OvbwHW38>3{q8!(pS^nCf*`HFVkidbN--=+ZPCN>Xn5B>vjoA6oGBJvp z1b02~RN;!s`q7AuT!Bt<<e#r+LWfjsI)-4W8S|e?1-2<H=ipMvg`=5mZf>3;e-fI! zl#ayLm=g8=x2o4LjKiOR<T}7GqeCU)1SC6$Wr3}2i$iDsGgF))BR)%IVxI60z9@DK z!IH<Gy*7*vAt^2Y9Tn;IZmo=AQe~|B#cn4fW{HbGsmZIeP9IZ377c$GtI7>>a=ZI2 zQ~T`FeYeDKBJ{}wHCK#G3xTK!|9Y^T<>@c6!t#zQg^{sbebopb8SEqaSFl{R4xIO? zof=!I$?~Y*#|0Xv6*vYO-2**|w4(wyDPiuPJ9QJ(Iz+av!DA)$W(hkGTf<28*(Tow zPmSlifLM9Sq82QOs6@XfrX(9?c$?E30DaD&;;IbGT9A<Y>Ep+(*xLRr^q^*d)Y`-K zzNm3XT)Ph72dKy9LA)Y|;8MKPw7FwznFaDOWJ|=l@Q{9ZEdr;8yu6*uIjM0^fx!Yf z8f3&*{GuOFxZUs23_i&cyrt*@DrP4O*UMPy%%f5ipJ%h0xT>!?Glq4KUpC1~#ucTN z)dtE$y!oh<P4)HqifL`8Ju4OeSb*+xR@(;^749m}lcmeXDkuQXgA$wK9~IoH%#{-x zbUjmEA3oDlq7G|lY2fW-$$QfWgVKty(7fMbav-U`ek(_?WgrVPS>{tyKGqgYW_aDO zsKNu?culaY7SE<3le<HsfcSFl%8EuG2nXGWvdFY+Df_nlT$J8_7KL9pMo=`BGfI>t zF=7%$%x4=yv!sw<5Bs`oZo@P@mn4-SwUE817v9-CZfrYa2__4|mM}iPvh3eMO|gK& zUewnzR=wyx`YxHhm!cZBcrrm!#okqEq7)~^<h=Khw9v{WOGx>fKd)t4a2|hM=y4>I z0TqsMildpBKkk0g+}=iC(wH8x!m+{LMRk=3tnuUMYt$c`LX3|LS(bzvEG(Z*H^!v3 zLZB&u@2PWEwwdc;&GQ{c&(v<v2#zP2Bl#f2BP|AEUR8kvHz!<+@SOrbI!RxX%Kc>l zQYjOpKd&yhpW^%sbq(;>q{N$Ge<*A~Rx%a6GGATDbsEYxA6XKw;ujBLixm%7IybPY zDk2UN*85_;^-~{o%iPHIlB#I?mEBQ4I%iWR)2*4hxqey`C%wC77`Sgud&<CnkqkRx z5BwdWhUp945Ga|+W!|6(x)Osn_t$8eyO5}8kZ{BO@vRKxH{w_ZX>A$BIDi|5DRfUx zb{(qndm+Kxz%?wfQ1$hKz;^S|KMs^^oJ-}TaJr=H@DLj}XQ$<P)TCsf%A~{>q*|Y; z@5wE2&Pq;;4C<b4_87_;esl+Jn&S#vIHq}2Rg|5ZmW~+OOr2WQGcWvv5rpp0#;7Tp zc2?KZhoG?6s9wjIIJ;S@k}lzw#x5SOGs={Mi{8jZBp8fTMJ=xgYs_#vW~8tKrf0US ziRwxXNgryUZuSFPK2=>o&3t@Ep}F#f0gv?vG&1%prf5EjJ;@ciMQCZH+9Fo?_<SzI z*Y<#Y|I+5B?S;L64!qwn=_PlhUL)BpRFXVPN8F1R1JjCE)Y=wm@J@5pHRhmwIkN$U zq3k?7YpopDa0f967%#d<MMdGPvgPn3{v=&wWtgyYR5$@`sjQumYt!>>m!NpO!`ofQ zSOhZ{?#WflsmcYOwi@L&N4%?X*U|_${wsYB{%O|s8^x4?>^00UlS-dd%Nt_YG=SRw zAxxoZ8oSnBIm}dXM3(iZoi|lO<$?Q^;-O!CX(?>d`ixSNg<}6#(BuPsjb;5>0x8Do zXioX|6`d^a$rY_gJW3p}D<Vh^Q$;Mw0KEI$wbzj`6pw_~Xysy0hgk(El%K{)5e*ut z?womC*~?}CSaa(o?hH6F@IXj&-2irLvn7%Y7DpNccvRbC(VhFu?+emH6w#U5!Izm# z;aV+oVaAVUR@nm`J0N{3e@X|0@mWv%BHIu|>~S}od|b8NQZhb4<CS<qxLPr97K>n> zV@|&4y^dZ})krB0^A@RM$*|aH7)(pLsj}5FR~1#y>BL2-QV22JIa+^BrQ_5VL4UNZ zbZoB9I`0=UwCz|`DptjmRB(Heudc@BsmXA2nVcuJ>3k|XLX))xRcQS1Eq{l##Y5H! zmxQ&~G@kES7eEbA(B}~<3yS%!Lj3!b)!ed<z}er8u=58lZZYN{zy47r%^{X{Sb~s` zH>T}*{tv6&;Ek_;9Ze*8O|`a3fd*L+Y1<2lbAZUPre>4k)SD+w((&jLbPTXM5iux? zPH)}b)=bkMV#=GW61cQ|ZUU;X6HD-C(y?O{WtSvWbUT`OIyEw8tv*JH6h&cZx%V+) zz-qCzFXJRIE8XY!EL`V|`B2w3t@-N8kEP<16n>$D2TCzuG0b5Y@$}_Pg1n<E)8i^% z_NmC9Gu&IKLoPb1FXWVt5Qr?`&EE~j6}z&i;e1)IG))tqE*W*eW74Lhq02*56CNC- zm>2$FxAH-Dgnv)rzP6|RVm$Nn{5<gkTxh9>wrtm7Q$u5S#k~w863Ma1UMDfK(f^pV zHvS`N9a6{Ug{y4Iu^9d2phapq<4Crv(t~prz#st2SYJqSdA`07ULZ1jD~j7Baw@=f zgG~o?zUJ*Wk*cAob|bZ_h|P<FKf$V7m=bV_j=TpkHrmpy?rT(-*OL}&)ON{8*Yh+A zzKn5l(AsY0Tz6b9C4hnvoC+U(o`b@X8;npX0bXZQ36tH^Nm~)E%%k}GkEibRsGjx{ zn3$OLH-og!X|^JqeuHQeeV%BdcafZj)-`VjhfSwZZ%L~XRmr<t1Y$l<cRL~%%f@*a zq?;33xY2IClbLl|FmLe#gn-<U<U!0Ayq$<fTgEi>EHDW$a~8|0@8Tl8tt=)o{m_m0 zH^u$%|0K1v9O^Wo?-b<4kdNNl`ZID=)mAR^*E<wp%mOEiVOc8eHDIbrWFwJqUsT(X z3t3!X8X6<vd&H67HAr8p;w!;+Y0c;`I1aJ#W~fnFvc|as3@*1=RGzzF<oy<atuml$ z`1qwuWX*XPj~@LMDRZxuuZJ~Q`=;ZomR(CDs0_s@3!Z@rB1`nE>1u*9$$OpTH(rQx zY%0Ok66hi?K7uz(jSUQ&l!WOMQKr#i)9R~u+a?AJ5qPCR`^!p}YCTwmb4#_zy3JFl z&9Iv3HIVAeXE8ykE=RR^)AZF1x_LbJ$Hj7DQ;2J4)p66%QgbeOq2(fJ`y(3$y=FL{ z-z8m<Tnw|+(8(W(1y*8+wYBT_JOr0N<R5*+Z+~yEcA+a6vzZf$Lg>~p&(p{%Vyso_ zjhgmHZSg>bz+M{&q5cj~F1$LUNkf5ob8jQ9ma#Pi!^ExNh{e5$2$3M|Htu@s)N~Sh zjTl&##`d}5=gNXv+{oop%J5S)4ul>LppfnKSOua?B-@9|Urrnl5aKU{H#|U3tFhax z@?}lpIIqZI*Wh}wjkTbFFs>TxXn_ieNqo^3Qf^FtpTypZ{G2w1kpA5ogLM1j%>VM@ z-&9%!T!&W0#bIFm4jLe|ztWk_7B5s84Fz}uXY-CfCtYCc&Fg<8o&Rn>?VpI(Utlu` zg5W~a<0v%=0BX=&e(j*yuT(z2J;(RcxyjK+LGTbE>^F-T&&Tz8$mYuff3DEvE&^YD zbrRq}6SuT4wVFh>0TDv^kLRo~Ro~-t*t99!pu`9R2yRFpu(H8;Vx79dqA0k3lit^q znjKdo++5H=y7wDTxvsUMKvBp%Y5`T0J2eVd2nfo6PH|baAS}@RNjqo0$kK;N`z*2_ zT<6+$eN-dVWMHoB`x~J_@dhexMAo04329lpxX3l+m5S3N3LCT4&y@_ys|yt)GnOZx zsG_^Qc4eAMWuA~jFb|3`Kf>61#}^~$>GGV1+3z<aO1Er)zGhLlPJ@)};IIZ#g*uNh z=B(-^vq8z2Ml^JV<xTG`$>92N7JuqkG!ecdgaCHz(6+s$j{YxaYc>l5wY9xCIo%@b zw1XH|f4D~?!3VQ{f$kEYQ(U&^4--k8)MqR*z&LM#v;>7IZ7#KbImSjeCqU|b2UG0c zrG%*ef%dfJ^NX#*-!oUN1qKF8BMzpPWI!MDYg--}pL-zG_2e+GM8DAWn%Si9@NhHA zP=R~OtD1_8L%{@RuSg>eWv1p2>YeHb?~WC6?2jrp#OUJI*q^4~Pv&8PgZ_&7gYc2Y zkQ*28@M8-k0wyX3S~>`swG@Z3u&eiPg@{*$R@m1(sUuD15Fc-Zi)MWn8=U04RFQ#G zhxC%3c=?mhn{A>veiT6Huvc5H2$FRZY)Dk$d~xLL0|PzU#EBn|VjRM}!_S+6t5o_> zVTjTFYeDeOVcZPW=Py!>cinWg^v4Xz0+#cTD-LNXY4TsEad^DG=^4BhUal!G@}cNh zR3-lEhK4#$*Y5o#2-jX=K)q2(M%b|8@)R)wKxT}h7~QAAD_W~5vL_#8+92S=U!^hh zsFegRD{2)?u{K^+i45VK;6)KK_Bek7fW4>tg_A(zV)GR3_7jH%7>?E?`M$Wz1<vBK zlcCq>pmmE_&6i7@A{4hd5)wHdM{GJC-VTplsfrq836E!J;I{$QY_8Yy#1X|ZElB0e zbzQ}R!OTpUZz4<WH=}N1p*6bJGGEqCHQ5-~#R$uNnXo(i8F0*?MJA6r14i&ivd^Xl zj%2{bn=DpO-|LQl#epWGd^8ji>3p6ApKcD*dTZSDlRTp6S8X76ufly59#OdRsu6H0 zQqEqRSUQ*499CM%e{U%~hd5`7U{esIbQF+w$5~HM0?_aLT$R61<(ja+PvtSwSO+mh z2+jWEO@obNtC@mLe0Xvx5AV9MZ7(`iHN!3<>8^X`{dP|y$1n@Ta|sR_NKx;739D}8 zN1#1p+51cw%Z{)kmNhMoH&Clhl_zZmu~KN9rvT`zOeLsaFTt9ruMByF*Qe@veNZVQ zn5li6MSK5;K%zb`tx#2F1>XhMthV`-f6wTO;O&g6O5(mnNT>V@v4Y|aIW`W(`Jc*} z&hnSDU<IA2X`TS?@Rw!m`783%R2@qO2O7S0T4K||=q6z2cP(MZ@#HB4CY-ZO>ajdE zZy(pEgP2pkzU-Be-UWP!`@jL=mH{bR7wn|Fq>FM#b6*HmK{9vUU+F{CyqA{8?S4?X zaWakTDU{^O;o&Oy(p-Cc9N5lNen+f8`-9XnIT(L55lgxBgfaZh5l>D*wJ1eax0llC zov;SRKk2cHtfK#N#&=HUr=Uz+RC5FMXmoMDCO7hECy{_+4iajDet=Zeo7NTEv_g+= zwIkUwj?=0o?LyiysJtpi1If|@cL((`N?@XRCGxY;TGG6FYa}GI_`le(fubdVo!A8< zpEw`kzl#k$!#&-$y6+Dd{`oKT3s4m9)7)26I~4R{NX<^1c@uk<U>tH%sFhkYEKsxF zBdeDRE4@59GU+Vx7UJM?mx{PcNuSV)DyB|fXmdPvSxylxtN_w(rpPLphT^^HsIxTA zxKGbkuwXe$%hHJQ5sFUhuOCeKSjt>1!HuZ#PEXT9&WZA0FAlV64$n{40~g$n9TX!n z#T^YV2;Ru%0C~JzY5_HNCLFulmKOt!l!Xy6ZyD2^S@fp6^lP*dp@^~vRz#p)-Oe*Y z*BI$0&wmpFBq9A|3@$GWi)_p_^BrHEWo<?tt!U@4*vC;Q*a&8AdL>nfpT<pQcf~cE z{G9}R099mbbHbkUW{oJcnWU4OGG#O@wh^XFS=AyKn@786m`tG7`LIXk+M2R~+JxdA z_u-4eyi6dZ8eU`{W%k=y{CwS=pv9TDNp7KTiX%>Z=)vE&U)#7V!(2Nn#LD0-B^@|3 zJ+C~P^?g9>T304`sz{5>G=3pf5U~L7Lv1x&fjPbuO#it@cM)AzbB-3aIXvIwj?`ys z_+PnSxW)AEzQ^QX(~`N%Fjq{7w+-*A3H#`tXZ6<i>;PZaPo#NwX}}*3$7Rv;CC(cs zn}`Bf-+%RVuGz5!YE>7$6KM;|2a24mW}i*3-uJyElJFvQa3r=FY<}SX1bA6?43eM& zO+nqUNl{#jj<pmk3>0dNtgbbt#hA8~iTGuO#^|g~?3n>flkzcL(G6R3yH{_Ei<91s zdlsp8R8fgWxApc2ZZ`~}PVH>vyW=9VXcz)zQb?vqQ$CvX-b8~s32d&zN)4$0V^YOB z^|tpvjjCSGwEDktuOdxOt`s6~o?dLr$XNsqN{CQtYQrlPlV?f5`YHG8Lh;~jQ(+l6 zrI^F9JmZhAw@5le6O#IR@?nlony3tF<d2p!5GMya&%j%t_*;dp^DUGdT7J_{lX*^t zA`4u<Fn+1y|M=Ke?7X%Tz2r-cuol@04$+tW`Sr|Re5CJ(X@1M<V|l(tiCC9*B1_^t z8Asi6k5MMjxJAx=Pd}7oMDh=X4VyhXY%_2{nHV&sK&wdN({(WCvo{ph&VLV=4}PxM zs#o#&3PO%-N{a@CvJTfmPWv3~BXp6NhA;5o0bE%N?o-*9RGo!4KTYO7dD&UMw|IxJ z4D$e)E1W2oY8LipYFT8(a@Qk!CFhX7X4cR!9JqkGKZUd9augYpWjG{KQrfZhoV|gE zzJj@bOSpW`)F&hqHpJcueS-;$_l1rmZzeNtKy{EqQkSpdjUT^If(I2<_Qc$=P^fj) z`u|3p8MhrfMf|i+rP_RPD$F@zD(DUsV%d`@jvWU1!QC(GRkB#(l;8eUd)oKH?bw3P zVhAicN$56Ah&#AC4p=NQ8gT_O5kE-;M$hNP>$19)@TrTPZ07V<pTa_-H&g$s|0XH{ z%(`SHjv8#aBYTs?tg^fOM6y??62tQ^ClIedw<}WM$1oG>K`yUrq_G7h_v<hV!6Fvd z-XEpNZuyDH{9o(2$lr}I55|&Nm@;ya7tJ4yG*G3U1b;Q;qsbEw(j`zs+eq#!TQL)= zeq#PKxd~9tmFRrvP0+>%ZH+T*g0B&b;T{#`KKg7sV##iIpAg7-h`U?mH7eYKkXKmy zWenwQ0|r3Z^ulr_@GkfWEsVUZE?7bSC6B89@-_A*!5J0wVg3_wxgFIwWVWsVN~~mF z{m7A_g9Pu<c5GnsD5JMTy~N=f3QsZknc2nH66#f^rWd1O)emI_MU2T**u#th<tO%p z$xRWT4v&}6te~%Hx^{gam*zk@$ve(27sM*=?yFV<IBCO08pn2Rd<LpTSo@OzVGX}o zq5UxU9xqyc%oHCVbUu}^N{0oEEBN<$!P?pZs4D?hpE9?EV1)$biz)cX2y18=1xMv; zuq~k5zB=qZ6#72L7Kya8eZov#AxXVkPk*Hr+_}GW8Ab{&%w-;NleG3_;zrBs%CYf+ z6($vjmDii9KM&)gFVQA$a+sXX@D81ovA#7)oI*Rw!Z2D@a>oxa8EtTXElGaB;AfHS z3_&2B>i!J^Z>31oD$owja12vW#m#8rY&Ru3T393Y3I*Es#gtLqZl6h0OVT}c#;Dzg zglehV?n=#sxb|sU2+V3Q=KRM58kKAFS{5%~%NfqZe6`dgcH?$!RqdgRQ~HD{^ZP!K zs(0_~+cu~Pi$FiVNfABcgkeINW0x*dN<H!&dKC6_j<Gwt@r7A5wMv|CF?92d)ji|$ zm=aOqLPgv$4s@$9$H=?bgLuq5+E>f!8te0q`Sc(e>f{6Kr4+(WE&`2@MPo&rtydD~ z$rdr*l>-4Z!%}nT<4c<7P#^8Fg!znlYU`>;u=<XN3;`S|Elr`BFq~X2`yXK0V?t8* zQe1aMGMd(5Spg<4{>wx5v)8IV=oh#p3&^$f-$($gOekEIF<>#|7<ahNMTr`x6viz6 z$O;V&6jAHtg<{#McRWPwF?Vzq5dfY$dj++v)b6f{Zg4z34gzJn-Rw7N?Dq|sqh=+f zPweeQgX%xXHaPkQu#gun$EzsUTz9>knsYV!cxqpf#nPHuG(7EY`i;M^FRR{B%L*iU z?wG%=@MMZ-oBp;3kYo}q;nb%p+oPow-f~LgoW)VrG&<7CP5K+dU$iDPYTt#G0gmDJ z2P*lzFcCP{IUe`r<lAIW(CvBM;!xga1qlW~&?A16@6x~G(y@bm9Ao0ufM@2gps2Ms zUX0&GRFy#LqFAN@m4K~)FxKH!e&4(MJ*=bpd-ZHz4GkTcuWXGcPkM=WG#1kf1xUZx zevl=a1Gp6j1jo_&BNnHJE{QVG8J{^zEW32NXcc+pI)9g<GwV)4?FV0>rf_6q7mrU# z@Iu@=cF+x`sn-7YV107SKt?_~j8lui`{=%Ulcf|+TeH%qM~0|2na=p{@IJo`^w##M zSSgtHM7nMwX%ls>uhy42p>m7~UQc(O(R|#f3YyQ93xZP&v<cA%%{{&(H|LIv3MwHO zXJ+ARPil1cUb6x_302QsGFiSfEh#{l<}7*2*nEfidT`P}FS({%@$71S{nG+q@3X)T zhll9M(JG;MoDl#7RuV72JR|oyfDmXAD`qbR*p*sqW@eE<l3Ji#T@&{0@M`iYRaLay z!7P$fSZqn9LV-)Yq;VZS_$AeJ<}{k#BIT%b%XV$(TS_@Ih>oHkmnt}KOP49-C>{1| z79FJf#<zn~GxfQpT{a4c7I@qt9H9%8YZe8Si>B>n@$FMo<|EQ83ux#=3s+RZnM2`= z^0vt&4m*)b8ft`-HGDT~_WKZ~S=r2s(;n`){E2p@2GyCoI68c7;ucd3i_@KvN{C`H zY&4Ie#>UzRZEqgc`w5tPX)xM$U21lFLhM~*^FvWg;)h?h8}t2-5fAeQWJ1cgN@?TJ zPc|1wwJ*k0(-xEv;=KPCs13UA=Ed)RIm#uD5k!b*!bbdK-y$T0Hp&<5Yuoc*rA%!Z zF3SdB@-H#~TQ>_BI)qyuzt6OqCBJFM%y7?6Ww~OuPk02<53h-r|9`5Q{|Sfy(!pnC zsH{cq9H9MpPkyCjj;dj-aJY`Rr-SWm&%`4ky<}c{F8)rNSiR~zmdo?3ZEt)cLW;6i z4ws_T9{1GF^>MvqUj6l)IUJPMaJ+_9N;eqMY>gP6-VJ0x>SAmiw^TbLpnrzR%Zz~+ zRw~4j#X!E%^<KH+Q&FaZ;9=l2`T#dZAiiLoHv?u7s6@W6o7=No_Hd?-2b=CzSo~=5 zx$zzoy1(5rPBIny7YSk0r9GndjL`L>%xdvn)A%}?9~#H$e8rw^{RRHEW8Q}*S0QS9 zxyUh^^dcHN$+1{&$KGo{)f^Rf<YpbzcZ^^Ymp)$}7P9$dLMmHlAzn(~)byl0^NN%a zNW502>Qw}XfnQSm7Sq=0I{*QH==IvJ2E1!|YLbB^z0Rd_$5<cju(XC=q7+|^7G$uX z84dboOsNupe;_LK6mUMfX<lT8`-x7yFVSzT-7h7!5g&{pP2T%Zm2iUKWNX_@v~%^! zW-ed*-ifYNSh?v0?N=$s{dHxD?cR)?LQu|cBqH|pH<-PK36v3FhQ$ySf3w0`*i`|n z{py}R3&CH#j7<hS>RUtiY4so1pBmq%-_#s|bB3g06qmkq^hqFZ2#9mQIy~Ex`sd3{ zN}9Pbh+PHS8~{l~o<kY-sTF+ify&$`;=AsOJ}=*@^w5xvBW|@|+JY6&e$QAISUI4V zIB8*0vXp%jV#8SF^b&jyjS8RQ=*;<%WE|5BHo%t`C`jDG4N(XDQVX6|@M{)Io89IW z>L`R^{V@0HhLf&kaSuyKw)mgaL`7V-xPBgIQmXo-8<)iLntzx{+L#nz84t9uOtac_ zIk@FxSu{l(%aoy84t4y>U1saENRV)W_v$_Lvq7*<6}9PkPq(Grkx_Kq|5WjFW6KYt zIjC}0)>@56qFm};q-=Rp?;It2CYGEes*$wy^_K8w7SqPpIN1eq6g%VizOoxu5j6<c zmr=}x*O0Z_4hb{H75>mrz-L#OI!fE*ce79GG3^d6N{B~sC?>GvNs{>Z6B^qGzNVR~ zO&#M|VKF2)TPk}NrWf1cKe?TDe*_Dt!Ft{tGBT8spE%f=du|f`mN{<SOS#8a${1o1 zkdC*8REtye0Kg}l5mfDs#|7Z{pS<?U?BwBf6wrpdE*yI4H{=?t7oTSy^AS?jV<gKf z-c9Fq&Y?@+55u=B8Tgr<<`vH8v4`X$ro~}B_H_t*ALx{!w^!aX<X@S5tdxtrr2vXM z@;FsF^O(wF!T6cKfuehr%z+jjwnbZ;y^!iZ0Zwk16!!m&Q!K=is&~1KAXIRM>-0|G zwh1!9^^juD?>M0EG+oam56zHDk3blTRG8#(FAs65R$0Jj`kywCM>{1pGvVh0=??jz z!^0((o7yrPY?b##Y4vRB_19QAyZW$8gXCXqS<X^Ls(streN}<{a)z@}`CypjDnl$H z;t9X1VN;eaE0g$W<0{qQ<(hXhJZbeMqaYrYvS1_`X&ORPam<*GX`#d()dCVf)_Et@ zzSm)2dF!-F6@~T-N8_Cn(5f0X*EPmqM0V>Aix9ix)K`gz5QBc^x~AP-lnjNn$=N>O znH(S89AP1sdnfYkER%LkC}~93jo9zo!7)M&UAk{0XK>{+#VS%5xJ_vNAE^zK!Az4c z4e<|Hr@a`N+q4KKtIfLqHnk!AXKDj0@*h*1h|YheHWIq(>Vs4kkwa8y&PHm{Q*1Bx z%#IkkPLKn+ueqILITVjDG&t6|%9b}WD`nD%S8zc{*pXPR|0|;^*!iW?+CXcM_F5wf zx%baKLyxz2aM^<mFy<o9*b~}`ateC$`3VEb<hAS*tsgLk{!t=58Ll6AsLU+>Du@oQ zpAWtUCoF20A|8LPuv}h9A;3Wteyjf@f4n)lL}uPD9_}W2$<{<p4<-?f4Btr;%e1dU zeMSlle?916wy`|q%~y1|U{i`f2b$tfUD2I20>KW@D!bx6M3JALG$Y9eGd5HGQ%rx4 zwt|*(%T+nHmXk=3^a52XgJir!H(ueWib>;4Q+C$WP-`cnEKAxFZX2qV6A&D|#TXZ> z!qbT(7qb5WNOz5i1<O&)1!MO$@@ogBso|2brF_jC2hmFI{WaABOWh->m&Q@}%1Q)O z<e-~U{AGeOtUToHj7IEfn9y<%BB4nJgT2e!d@)%@%FA3hzdL9hg^iH(VOwGazwE2} zwQ+DoS<PI1Pky&gTSSFDEB*fBX^izGox)*4aKXtzO*|ge2U<PF2V4S13i|O5X~d)Y zR4kyfAif%(<pcKFdFUW#)s*!25veqd{B^Wso61b5=}CES3$YJIl;SdoTaj&FcUhzb zG7nfR^yc%-pbVxA<dP9|_6w3i=ZuqS6dC=ytHvIxc80X>W>@3;Z`#`z>Q*w*o<CZk zp~<0gq=63>#B5icYlQ(}$!J0mpxoyy>X^?*LGey-<fEgjCpkdT2JOU|r;WVWk^;%6 z`cEkij~5pfZ4pkL$5Foix|FiCq?Tr3L(7t#Z3;q)+Xu=&&s!N9LuC9%xk2`Zq2hmJ z7k}D+Ykm#D5v`@6u_bXqODrxgfWaQe_Cls2fO5nz0Mk~E^W6Ch@$XnJ{93B2MoJXa zL>2#tT6{&>iN>#&d@u+z5Q+TXRsM+o`^w)rrRF~?f77B3-~_-OXBuW&a`}X?pH!Ch z-Rngh+M+}5*pP`iV*(nUWS-3mlRP$kUtd66hr<JLC}hqsRdPfFC0HZ@Ni{Jk32-Bo z2v9ccYqJC7-<f*lq&nL+1MaIu11JU!o8f|B35%pym$$wZLQIJS2K&shSPJroof`;q z5vKI1v_d?IbK79Xs3Jr>4a}fhn{a`Ph42Lx8f$ez@wQm>$z3zYfu4pmRE!-mjG*>3 z!Lj6%neCBFG+K`N^NABmoY@Pv?6%chgDRiWln(b&fDJ9R^_!Gu>z^sgYK82rTOStg z?`6IPXAJOtQhl!OHIC;d^{-_XI)kaRJ3KlIo#*iZy)8E(QgHsqp=t83=)pzXfpy1j zphT8^x2=xOATmd;tD}?t`phM+|0)l8367t5kPUxcFjB$eNgq}#v_ti0m&T-ReZ+gs zPJONV3}R8dsQelJ&BX?^?I@<kMyr#72DwxQB9$YNDb;?>IkA?<A1fT!<nj5q$1T7< zgg^4N*x?p5VSO{3L=JN+Z+v$&lcm;(P$OPDlUc$_KYlk0SE<JQi)U(oVE^j7I_Dg@ zQd)HZO>n~(tdrA!Rsn}D{$myJq=s1a7dAYLL6ZjW1Vg+K+ngZpj_pn&7$l*i4Bk_& zQ7hgp2>$UK@4&%oV!hQ3k%BKKUII#fWKa2+uS1u`GRLr$m^0_p?^Kr$sufNo?)ks| zB@ymYsWi$I@pDEsHAqr0Sn7ODP|9Ok!REuq!~KL1wsnYV&Cc<p{TZ@Ns|~(5UVZ6+ zjlRM03L8r{#?$oT%_=l3e+z`suwh3<VKH?!2l_mpT*U)Sxk)e?0`%kiBzVx$%lj5H ziVG*yyp#*)pgMUA6xWEbBljUUTLjvmd_>G)K0`plc8rHyP&9rgyd0T<X+>b?V{28; zi`3T(Hc*>q^h)9Mf&46mje{GuD}|VCrO)4!#9;T`Ju%A^Bs7TcgEce!yV6GzEvV-| zX;Xz$gt&DwGUH|%t~oJW1TA~cP|AY41t?`kmx4vi7}O5MC3vn*QdK+-2cODw*te+{ zt9rCkCB)KI&8{`xTrC8l_^i@J*UFO)s2j3@rl}gMtewlQYSY)q<yHYw-lj-V&0jNV z<Za@Q);5jdSQUEFP04VSll(w2e#T&igCv%k35>^27IpE-yd?YLeJl9VpMOIoZmY-D zcN0)PAk06-z()49lYpOC$>oFmW<eGleo|@2_<gO5?ObE(afyo{H(foBCm+nU5Zxio zRz|bclrM7KS0gCT;yL+mpO<IT8d7s2gz+LF7*q_3R}}&@Zp!_KN-;LDvUi}duoW`L zp5CY8S<>BuN<FaVHEgU)ce?feU*RVUd~h6}FN)U@PQQuNR-hSLDah^b^i&a4y_U(_ z4+IF5o>mtcF~Ps$82mQS`+3E8)@b$MX>OMo>_;5L+TGC(w<5=$%C)3&hXur>E0+Gm z&)>VN?isGPklPL%9wYGI!gR;F=j=qaW`m%Sl(O2&I!>n(wC);gerco;Eq|ru8qMrX zoQcq~$7X4)V_1PT5kSslFRG);3CPlw?_;qJNaM*aKNFCj)*U4{nj4bK-`vf5liaFi zRyUB_D9y+}pFkx2m{1d@CZtWIePyBhQ6(vFBN0<GoTzPCb2&>4Bd0MK3w6dShBmk7 zGqrL?L;hKL$=HGwy*#D1!ntbwR6;SY(=|9x`EmZka~-f^TA*(+6p2>R%tw>I_;l{U z%;Ld);fqP^J_23Ji;l!p0rYBt_))c-Fvjyx#_$H~vY-kFv3qAjy|Rt(=pfi`oR5;t zsv$eUekCL0`wU3P2D9urx}Vz2^)n?y8(9?@ha37(d$GJUH0ae#ThdSy034<8_7V(= z;W2!rEf35#IS|VWrRZdIuFXdtS0xYfn~Et14a;I)5s~D>yy3Do^7F`wRS0&aQL3|% zJ85+RLXLct9WWg%b0AN#m2<Zl6AY<bP)@4&$AJ9OVf`QtpQB!(DZvS%0S8|M=D}u$ z<YGz7jJ*hQo?cjb#hi?~Hr+g2+maCsg+97z5U6b}W{+fdj1k3bt@z83w?kJCRyKwO zQ;_M{d~;{!oB=jbA<-Q>Vf7i+sB}d$G)su-t*M6?W2V%>O=rG)k5_)^&Rn<$m+=Pt zr)*HL=5Rn%bF~bSFD)jA@HHvS(GW9TJqVEWI{3}@Tm--RGOpS{9$|SJ1F`W{+d#41 z-jv9F3_Ttd)AE1gS5SC<eYw|Ey6N*$a-Br%y`Y2kLM>K4lyO59)gVFq?NDY3I9aZL z5swNqXYOCn9c!lx(kf_?4_?lO-@kK5d21a8C|BoxD#etc)~5hf5ct2%LBe<IKyvc@ zcrWvBE_&&{?^O{K3x@yQQi7o4NnkdcJzS_V=!W>ap7+Xa70~zrj}LGEE_D2xukx3d zuO9OGU8-?3U2!^*-hE7$n|2=RbTuk#IFU;RNv2USK+x^~uvB|~EkHOlTZVJR1VZ$D z8)Y3kot&y>Q}o&0EG-0zuJ9kvaRJE33gT-uKU$u^=S6EyoPQRqL@m}f28iSH<@aWG zO<eXH%0nBtJ@+Jy6siXUxPbS1p^s>y3%JXJ)|)Ab-A|a`K~fBAxnmKAA|(hcaBsSH zT}`W$S#EyUsNXmVY=9HBR~7_8<oX|dqLTXtcd7flEN%kkgf70oAUKjB1exhXIdAj; zVus_G^ixvh>jsU9P#*F9$VLlR!zJjRE6q0$0R#WH!pDDsQY2_)Ny7rPYaAsJYBD~_ zk;13W-i<>$=2J>;b-*gMqrY{hmQR8<A(^WAyYJC|I;`8u`eS6|Gzjps^=o8xzDz(t zojvC0X*(EwYB4`hcVTvaE<H*BMRQMEN+iVSD!i-@Ni+UOqHHQ3)tK3zcdBsSZbEA8 z`pEEdpPDTS<39>P?{%6bmI(zkw9S=3{=rGMA}Vxj^?HM}yX+r7!dT&%lrZ67FKnoE zE{qBG{#$Gbhrn;PB;}R?Zhg!f*ftSy-9Popl=MGG7kjR{%~;%Wz*48hci3DwcDA;w z0Oe3A*#NeJIs!+>0g5HhenYj;b(IeivC$YUZLMrMD>y_Hko6PPKVv9XOeGF$??h8u zCu-6qRDr850zQ#qlq1Ha>U?#~LyBL|VB;l}N8OO*{OL?Kdu{R9wvM~I7I(fCs^znc zXj?>dfY!p4(%vKvZu^_IN9~*}C62&X#G|tt^k1ZVZ0-2o`l0*oUL_59hRmwP8695& z>`I8^yUUn%u@T>ql&7x5@-^k~C%p*Djs7NN7k|s1k(56RqI1h9HW(0eR&+_mZn-6H zM#5*m(Vd9vB;dXe385Nn!oyo6a1H=Ah<p&ZeUe+vF@N460#i*(Ok<m5vo0F1bJ_O1 z)<}r9c=@Il1Ks0Iqh<R7;$F&+mT`f#GtI5}Eef2)Yg>bYtvOsur-644(u1Xr@R}HF zc>9DCzGb-5xmz$e)fFExSnCCMdkwcI+fg|VQ?fe|@Z`aNc8)CJ^u`RY%Q53TDD30r zjWpMqeQ|KDX$Y4ZFVqnkqA;@Bh7?3C)oGn|?}TRz+rDAWR57-~*lbFkwiir>o?n6% z$7?2!&KzeqE6=RRs#XiGkL+it;l>WNa?uOgAML@S>gu;;#BVde;M!ruHmfN_FeWiC zVx+DTypCt*t%Ecm;6e=K5VeD*i?l{VYkah+VV701ZyoN+P8bOXU!h3o^R^ji*}t#d zyu(*<koIL=KA+CB)Npu6P1-mSwzcfD91HM57{+BkVZl=LRNN0Q99Z1W{AOzi9d~d) zOw8*lZ9-WhJ4jCdL!p^lHvW~=T>KW$hW4F$LDAq6?^KIa|Ke~VZSdN66Ux)$|7q^L z!>MlgKW>D`DH-9&N<_y#h-{I)Iri=t$0n;oDWi}i%CTkdjErMDMj6M-$Vy1|ULktE zRQG!B=YF31`8|L9{ypcqzW<!-I@kB}9<MjuVXEpaC+BrEl^1C9VoJguZj1n^pPgYD zyhfxSt_jft@Xadweb1xQ4DJr&QA;Mow2d@rRVudJrkI@4GPMi)1s-%>!R&t%07>z) z(sGj-F5T@4fMiBJb$ol_EctO2!%|Do*TNCq_tu1MzqTR^+dapl2z$}Jbb^_rs6&$k z={_XUO&Z+a-(X*#)Ty`j6$kbYeF^C;Qzj01V~POgqz*sp(=|u6UZqh?^X}HR=`h2+ zH&on-iXbzIdBy1v4rVh+9;GaRU=gKkqhS}<PGqI{&ry!8s6UNzOtZhovdK637VHJ? zMXSb1?67y92^Z2k%=Amm?hX9x^exy|qH$O#rC4<*C{s>-?Cb(f@JuvBDsF(#mBoVo z+Sd9b2vY$|boRB@j4?}k$g6j6c5fz9`*e&Qw)pC;)ZOu63>P4zT(yo8@9r_+@sO#d zHr!X<HK_uz(`AcR5A&yw`}-3=w%&)|oRGQR^51nk)&g`Hwe9dog942^{!O!^eh&4! zXofj74D#@bd&jHZWoCT?L7o(Q`NEIGR2gk%)0QloV>2Q1n{NFQXNlsup<@!g{whO+ zj@cO@F$SKapS0^u%I%r#*Dd!~mxjI4)6*YCSFa{9QvDXViMN~w)MEoP?{9b*-?<9J zD>BlJQ93{^<M6hH2f?eWNk%0;LT92S(V8A$H6y;Xulf-Hr=06tZ}=-LwsvM%bEO3{ z;brYp-Tww?3yh_9f}fs5Ij$-{e_=k%AcqEPY3<~rx;!~@7}WdimYsxO=68HTYTGm{ zPhJO}<jY0^LsD6gkeBBBz)F77&b71B8Xz_Taj^0ZyQjyrbK`*As60d%Xul>@50=8o zUO3Doljd*j#;)5QSfA*KpG`D6Ko_js&rliwZnbzxn=FtA8VPTH55y)QG3WS<zHGk8 z3FmlJHM^FHuzxppn_5G)XoTyXi}q`7mbmMS?CkGWf(DOn^4SvdHj-sdw3FCvl^tkC zDQI)zK^k4}TE0BJWVcnbXX^ODSbe=DK%DWgu*5>OTYmq*(NIWKVRpWLOuy*ONB1CO zrjo24=F}4zK!pwT2IpBFruP9hqjO%y18J_Vp}W~ntMX74WgT=eyh%hJWfH8a69Y$3 zUiMXt+!WiP*tA`HPILy6G`9V|qMl{?vd?VyL~T~+$shYm(rB4jxGzfTfdAN&UqP|4 z2+i@d_U_F2vTiwjdv=>yKpu~Hina3#*lA8-eJ-m{VIhrGdz?oxq{<L{d+%m$+zHD^ zY@{+__VjMjr*9(^b#5spf>+$pq!kZ~KTn}=qBqi29W#mGR6oH!Jr3D3(TbWyK^~fM ze;J_Yq=n^emq`v-^37q)fHnukoODa8jtoZ5`y;Iblu(70rfB|EtTfc0m=Jonf4Dy# zxh<cF7XL_6)J(ToKI8ofh&$a<&^*fNW$~qBC)>tL;EN}ClUq{qbVbMfoN9|3#zH9y zxXYpJbYqpoLbSF&&vHwXCrwG6R>+AB`P)&;FGS6G&&2|UPnDN!dZElBi-&x$Wdrpk z(yqqF(3f9e2GtH{kc3a8+<DEbnXV}T_|xQz3X^Xig$lywqz>GugU(`Y5pbZ8VHWlB z!ExFa#b}Z8wHBS5d}F8=!rGzDd131NkPtGE5l`Cj(NXH~SEH}=F&unceu#oqKP!_? za?XPOlfJouJJPo#ut<Gh3^)h)Z7iKKgtBK%I6~1<yzM|w^>qv{iUK83Ehniqx~w}C zPqUyRkI_4bR_9y{vLjZ>FM^DK8Tkmy&sZxDipLj#m=g5_)!7zcHq~e2_-NXKdk_^{ zreyIK0a%ZH!xmYpWHt(D!Q3VUvj9?wvso*-0wT=c?;eOW4p&7A<#$c5{^ru%{>~dA zNUf@mGgt$mq3KGI8-YlPDq~o(o{#Tx{O4<<K&d$Dyb&t75R!tf1*mrm4<dtm9ymDL z#Y3Nr$Fv!3`{CSytp|&xszhQ)3lU0(HQqZ`h-ck765-BTzQvNNRzBI*Ly?j_;QX~O z9-<iFwK}a~AakcTt)FyCC{2`Tv)}_&N3cC+1TK1!Ac!vAUREl^W*7b=-2m`{0Ak%8 z?s?^foit^BAM=k>kb2|Ib}ABq!@03(=MVu53aDp9v1h3qJLoT5=3Orw&Pc#e%=Ke= zF`Pb-bSk;*f!_P6r=G;gzgkqj6rUYd-ZO0|%5#VakE>K4WL1L3w3%bm(q6O4Re(q% zT*e0rJS=EwPY+$-GSqjyDchwpX8}^8+*{r$X&UJB)|4xw>^;k8BU}o#hm5KQ+E*Yf z!p&PSoMm_yOkYFUFAW8v>k)Jg;D)%|L4{%2_jLg`A2(qzC1(unS}n1D{pKMEs|RIb zWP&h5;^4kHc6X~T9fxtncvwtuacPaf2NtWQ*GDCjTGdv`xGJ|F*PpItEDN5zbPDj$ zJ;qI0yMEAdfX41LPG1=z7R1J{GIlFcHY(nrhZmi;@~onkotdsoFZ)s~dH(p-0aTI# zLZuoga<tUG$TLFcc$w8Y0?eBan&*vLMa92I1R6Y;)pOqG3^|QTv+Nfwk!o3&aT+Z{ z=$JMaLGS2T000f_P7|q|!D}8KSq6r1*j-@x$5Co(J0{uefYjX5>PSxiZhtv79n-&n z*tm=X3)#yg1y+SkIL$B1+%%acrZ{j5scG)vv_=D2dq(HoTA)I`J^%$Y)??$k1f3Kg zHJt2;Z_atb$(>jv`9`ybP#<YTF|^{i01~Nq=qhF1i+cgU%qB#)rq3NfqBq?74yrj2 zxRbLFb}g(p0w0C)(1<L}$T(B9G6GBmfOd0y83H#h(|nk7!pX(zFZ*j-;+L=g>Nq7^ zrL*DU;^IGb@~DPW7K6Z`sZIBb^Y}k0@(Pq|KdCqW_44@tb84<-vZOx8&cY}Y2<7`P z*Hv**;PUBw6?$%f_$gogyp+DR4prTHHI!S@*J8Q#i8U=PzfRa*_Gg4a$pxH0A`eEE zL!Fpe(3=YH$EUz&ZEQinFI~--<*ni1Jc?uN3?xBnvRq3aqZDh0V>kFduSp$K0UqOG z?SL$tdPM@cQTV2D))>@y?ivI>1u&A3v;7)$p-?!c$FAU<qsznGDIJD<7XoA4-ZwHC zc28maCPp4Z=SA4yN>SMS7Y3cXgf(ap(@6INJhZ(I3TIOVGvb%^#cO=HKE^Q-puglT za5=V&9bt3CgjG6aHo+Qn<&c?Mduz|LBTpRLe)1|hwJivJZEkx#7@^)3&%^TU`yzWL zPKbHarj&17{6TxnuDG<8sB5J9*AdTf5(LfD_f;?U?gXL^koaI;Hcobl@k>s|LlU{a zy`9w{ja^II)pxE)oU}5my2XfXB<X11jQW*dFw?62_Vn9TN6Jhf?2ta%XNXo@r=793 zUO)YM7R2@|B|%++oMfibZRYkf1G0OTA>VC(ZVjji2~4$;8O_}=dw+ght^13%a}IP6 zyL`qZDk14}ztZvS<K-BL9-Zu#gL>NrC7b)J=f7eTNHrnqTEAcuX5+XXP1AqBrxjE0 z;?gkuP4izc=daEGB*_-d5$){Xng89mJEt$(>#X8CV3&FGdM!a9LYZ`Xdi3SH8PY)I z=MQ{evDE6$A>skqGS7g?8}uB?LhYq}qy2MO#!0`m{{;1$;zw&2t5vJ$j9YAa@7Vcw zw%43|$dpQ2KG;oBOI^hd3<O@R7K2+I+~wvj`x<wHfM*YLR%v+qNn^*Qnj7Mm!I`kE z-(AvIl`eZ`t7(0=@oE|)CE)X141yyA!xj5L;5DTzwEg^N)BV*Z@nigF?z<q>3Bj(N z1mo*0;kT+Xb8(H-esX|6mzm&~oN$02z(C4|Y9ay9bG&gbpv|%s3hVz_Cj(|NiqmT- z*s$tTBCvd$rmA6-jf5jt)W*)gZpbBaZE&L++3S8ctr(U!;t#`=UvCO6`oQBV>=C%4 z-!5^-jRK!45mz4wHU86mUUP;2<wVJ=>tsf5ei59a?3nl!pM`f7+@eQn*mbXTbj5Uq zjcfy<_1Q$Pc+$L~+&dXUKBLB4E?u1sZhpx=vbN{0s%Gda(XtZOgbv9slzg1uFG)x! z@pmyy@k#r@nzRhGhmqx38{*7+4apNXB`GNWqM+fX@ms4O(fq5`|Hp!c`>DR65qR(f z3%TEl-^Nw1{1L7y&t{})^&2^OnwWfz$e0BGC8)38$C;$0q#-j&>2FjVS!!jn!jxnj zkqTe7=Cz|I75t>qNvUloP|*n*J4>~jA4BIaAAw7P0%VVi6eu0m`}&0fZZRQufqKR! zbYJ<|^BL&DZkI`Nd$VPsjK#o9ndez$b#-D&zQO~}CG}k?H%Pat89y7kSCl+d$~;A0 zhvhJ|GeY4c)_s7CPOnyCGN3t=9aqHd#Q0c0EzZhu9P|0nna)ltCeI`i<tA#|4;iC9 zV&BOz3}3~*W7*ybsMdmYtIm%hf$0bXv($sa;~^17o;OS-xGe8xoIX*|isP2*iU{%a zSL5wzrZ#&z7iq;`?})xClBVe<g*C|ZR<`SNrChR(N(1yCUyN@%n`;<r@3bb08thoO z5BPbSX~fv^Bha4jgHlH+tN5ies$of$^!*_MiP{~m2jW#rS~mI~r&RF0+o_n^XykxB zNJ*yFuTvtd@^;f&qvl|XU6$*xiUGNZ+~P8cs>n9vgLZR}`6DC)1nYABNhMz2Q(%*~ z5*=-npEa<!wO*?k^R%XV^~kag0=ykv%mDBS>rO(k44~N-<>`VC<y=|8m+{7nqe1<N z;|?wTD`WR<1>W&M_b>ES4u8!Km%QP}2hIla+}MdvIulSNHhJREgS=YM`D^0XOLqLN zdVS%9F1GbB*!HD)z4N-!7n@#5`R$|;^HP#aeoWx!kv#vzSg*?`Hd8t^j?OhB^H%px zqGM=<O8a0Zb_*I3!k6`Iemyr7<_e%4NOs&k{s!4WiXum-zYnL8v)XY(bA)?T@M)Ph z-=Wvek|<Dym2DsQQYKR6`sk9bMM%Qg-cHWZL@=Vq$`VVgia)bhxusKegI-AyUF7Ep z44TYi7D!BW#VVTDXj8tnh37`A81db3uR1>dpI=h!+gM`XwVYfPEv+$Gm<A>_oHVUL z3cK6x>$wIG;7HWB!e=EmK~GC_7$WW%&Sphd>;`#9p}byg;naZ<$qPDpx<>FY)d>&M z7j{^ev#0)k69bqSgcGzsn2G~k5+Jc<d#Kg-q{gBgl)~Vk=S;(`iR?VPAPl2goLRd^ zut3^z(_g*16*nD;uh?okr}pt2uff}d1!H$v)QZ~1-5a|s+uZPooU*}KzcoU#5%F&C z>lcBH++9Il<`pjO10yE<tG+sA@Y_!CPbTKJUS2{B8%K^N>jH_?K$gIBv^*(}oe+yd zgV{1NU=FYIlthr*h02+;3U{e<Qr;I2Pr5ddhmBw4F!d~&O`Fga%Aem;xL2>*Vf}Dt z@d**KTukpR!6oEtx=Ram=Dv`wTYWC1O!JV7T<?wB6S#FMh;~lt3aTewxcxrR4)(TJ zIKe$|82(<?!yxmfG$w{pq}xhzG@Q`Pr>JPE%_PF_K$KtYnb*<Rab&J-n!kz`<&Q;a zKn+gY%U}pPz-gBHZEQffdj2$%bWI>fiwm#-b7dh2s`x`TfGi^HdS>Wy5ae}4nVuWA z({4#DW5{RU?3o3feVm&#$#b+5k2@I=XFG<kRjq=zaF~o)Q2f9~i3_p^?Omu@C}yV} zKQC?2;^f?AGVg0fDL{u1fooAZlo>{UUeDVdIbU!O^h7}9%UHNWi$+T!?#TWtCyyt+ z()fL^8#;>b|7c?*U*$t<kLUVUoL;5-#173BX})!>j|Qe03|AVc<evk>SHzlZd!f%W z2#l?WZKMNe+x&A*;R|K8cBatc1jODwyn7hiw4c^B#^6GrZ@E<^J>~XqV80@hycul( z?3XqgbesVQvim7EEaXx)GI$+}4YQ{IPHYh7{2?|#O?k~luSJlbm5)}{Q2dX@22UBN zAkQ?SNppp>W4b?huKPZ=zGcESmOM7?!S8hjpRt`Uw}>s07dEAYS5a;o&AM{1X4S4M z>7}b=Mf27BRHr`+TST`2_=xK^81kIFK2wajn)&|HiPNuV;%u1>r6)F9)|M#Fr_N;M zEp{lNDf?~dqFMWQrHj08KS~#H3oH9a6ZhxJn=#Du>3jkzpUD=7=m_ooX-|ZS8n8ou zKJL5CXGbb<OmS`xt?gr%dHdRTU}dHpF1($r)`k>Xf0EMG&kOj@yJ^;S0%K8qf|RV! zaQ?&I1=Y>p_b%H0tatIrJvXBAxOcHytDmGZ{C7ALBY1d9HRxD0PsA6Kip4kI!+7X) zo}AGL?zT_A2Jw2f(%d8JS^G{~9cfUgrzY@cZ0S)OU^3nqY{eYtTLgb~du3Ykso*J$ z@+C~3D3n|n!BAVs6XKA{Jt7lfzg)AGCy1DmurlEk&s7meAgE@d3!X3Q#a|AEvz8Ku zIoz?Pf}QV30VVp7Ug4XpDll5a@bi-uav8oZntJ>wA*ZJa9L>Hlx(t7qm$9B2ir`44 zx9oDUwi$$#$DbZ@8o+=7mcIdlfV0NdMnkrc*!|vs(0c)YLEVDLl8_=lA`g9$R-v$> zV)mr2sBrwZn34O0?|Y~msos>l$g|LvJN2By$dX1^+urd}FHS+(3u_~zx8ws0$C8GJ zVHr7T#(cr^gq-(PQ9=dWplP4UjP(^7y39ndkOabO35sI`C>qnO7LCBzso0-N8Y$l; z4Zd5EE0OUAth}I?fTSUw+4^{@yGBm|bS!G*p5c#GAea9kYUHp-%GVz(IOYl8*nSfF zfbYXRu_?i;?hzdBa&M&;wOY?nzyugEE`}Pax@G^N^sr^iZ2Q((BPvsKz(_g1%y*Q~ zwm|Tj5hT`mpJrj2t>c=Y6yuG})3V|5#qpZ9Gt>h~y<H|X+D#ANO5hjW?~0kEerZPj zBC?q`j``0C7L6Wh$odM%>#k1{XZ)WJw#(i34a+)(bHOFYKjbZ7=tfi=9D9mi7GeQb z5U_@0J#5^KZCg^W#^t?m`TW+o*Q*{u_ej0Vt}L6YoU_6aZVYW<Xz?O3>mUjMwrF6v z-WgHXfYt&a0^{*^eYg8ry0!<+nvz=yh;fnU`bGnl0rX<<uLH;bJEy-9J)4C5Md={> kzb@yU$SKDvj*RBfy<DQYDboPbq~i}2<<w*gWy~M^1A6^k8~^|S literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azuread_grant.png b/deployment/media/wac_azuread_grant.png new file mode 100644 index 0000000000000000000000000000000000000000..ce839ba38b035d66c682add7fdd228fad6a74a14 GIT binary patch literal 67200 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 C^#gqX literal 0 HcmV?d00001 diff --git a/deployment/media/wac_azureadapp.png b/deployment/media/wac_azureadapp.png new file mode 100644 index 0000000000000000000000000000000000000000..dae8819f8b276b5bfc7e280b58bb4102074add0c GIT binary patch literal 19583 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%0D) zFd)^d!SOT4x;5Rni*U!nEc$c(Er8*U<zQnJVZ^i-HnQ2?UQU0%Jf(0Mo^83tkssz2 zU^uB+mQO|1QdIp4DmK><TbR8j$)uP+`^{iCRnAgeki%-Mu=w8V2VvxM+Y;EGAY+>z zwxV8Lv5ZMUv$9yGoYvqh7k9uzBmf`SR2;B#2pNsg-KUyMN${hjXuBbhARY@vTfBRe z3sbFU*@A2%m!>(^mdhHYpiqI>G{z^?qdk<XGqDEg=+!Nb#3z`e9hl`>Jdeu&$E66i z-5HDwEa!}MW>4M%yk#8B?T;Pu7%I_TytbAxelh}`y2(P^I?+@-I{C!xA&b5XT{3D< zupo-qi`B0xh)WZRiPD3+uwO5;(XUQ(YIiyIC@(C=r5390)nG$y;B41vhQ;M613emD zn<XSO*@&6Sba45KPX=~TWaK^&wTE^S#+L0;BI7A+?EAc*ALv!VHC1ZoVL1aMY3;UJ zk*$QsL>-l@&SGgve3O~}q*wX|ym2(#Ea$75x>nVV$DUdo6!3ic-1gO;w2CI$NOzb0 zfxURtI;Ud}z9*gDmFMb%(C%0V<YSozp$Y2Jl=wXTyG(7%hT`^3Sm8?m(GjZYZ~}*% zioQ>(azi?=2~@%>oev37M?<n@gQUWkIaoV&{zvb4Wi+`>gshKZdp&FR>WXA}pjMk_ zvyl+b`ufCGLdjQY#k~T4Tam$ny(Aq_Ls~)?-hLS@{-yr(jH{L%c1vjF%`%l)hf7xd zfO<_l_Y8)Hk_b$!wN^AN_8jH2W;f7!-I@fjF<J6TXu1Jx<?a<hmq?6^*CV9;NFO6c zdw5liJrx<|qTbe8x;i7;^$cOVd$#0+@?ZknU2x#e_FT~0_lOd9Bs>exa%5n}U@0t# zO0~rTvsBC&7+wIv?U-vaa?hmoaXklqtVC={pd*Gf8<v**!l?)r=?`1P$a=mG`nuJb zd4<d6BGuqVLu+b|43{spbS!)?p%$~A#D$Arb_I)PYB2+Z2x0*DFP8ydk1o?bv1Mr@ z>HgM(WjJjF@<PVaj~V5(DY|Naq8k?I_sy-_E9ek=f?sod(yjd~VI^~-)RCf=m=t0_ z2%YCMN4gR?_7HC+%Xo5mZCmq9eIvpnizm3@{UeaI%j5Bob{_O?n`$H;Ah)ofjI3%{ zNh+Ro?PJ^Oq>`}*k;xlbUOun*E(66$>x?UunG+IN#kTF+CW~fI3XMCB9sMK}<u)=O zB*Zg2e1U$Zx5);hB7U1e$isXz9pcR(NsN_%)yo0vxEI&2W2NE~-+IB2O(<3<X!Hau zJ{5{r$al_;YbtPA_gxCPx)2p?BjJ3XUB0O?Et(^V^5ZF3NY4UWo1jv1!k5#8tPxHY z>2j&chc}}=h&2BTq$GE3)9Ib-@?VlePc$sK9Z(}W66hyS{5R%6+(G0nkHQFRN)I9i z9=RC)qgM*o^DjoW-uRO7>N8S+U+-QVz+W=Q)&!elPKe<Dzg+rDgXa3IEbqYrPiY31 V*xL(UM~%(<XzzhNjk}MZ{X5MM{kZ@D literal 0 HcmV?d00001 diff --git a/deployment/media/wac_check_drives_ga.png b/deployment/media/wac_check_drives_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc80a06d0d73f0bcd9f98270decde323fedf0aa GIT binary patch literal 39795 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_clean_drives_ga.png b/deployment/media/wac_clean_drives_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..20beb6c63aaae2f44bceb43a87442c1df3b326a0 GIT binary patch literal 44697 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_cloud_witness_new_ga.png b/deployment/media/wac_cloud_witness_new_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6b43daefe5b576268d82394d42d96407ebbb93 GIT binary patch literal 12373 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_cluster_success_ga.png b/deployment/media/wac_cluster_success_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..5732a5cfaf1eb6d93435b1249cb3b5bdabb262b9 GIT binary patch literal 20638 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 bqYEMoIqm8a{+|4&;3X|}s9L3pb>#m5xHLGV literal 0 HcmV?d00001 diff --git a/deployment/media/wac_cluster_type_ga.png b/deployment/media/wac_cluster_type_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..37a9173d2fabe1d2e33b90b6746ca00e74b792e5 GIT binary patch literal 26949 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%0DN*}b?vF$V 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 IN#E~Z016V()c^nh literal 0 HcmV?d00001 diff --git a/deployment/media/wac_compute_vswitch_ga.png b/deployment/media/wac_compute_vswitch_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..93256a399294a227ddcc1a95df533dbf56026b87 GIT binary patch literal 6266 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 RzoV<>>)QHSWg2!5{{uxN-@O0; literal 0 HcmV?d00001 diff --git a/deployment/media/wac_create_clus_dhcp_ga.png b/deployment/media/wac_create_clus_dhcp_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..390b352d066f4a7a4a4f915a6711192db05f1ff8 GIT binary patch literal 20218 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 D6cfqO literal 0 HcmV?d00001 diff --git a/deployment/media/wac_create_clus_static_ga.png b/deployment/media/wac_create_clus_static_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..3d22d7b8bfa31743ff2f87e2daab46c46681871f GIT binary patch literal 27492 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 C#zyP_ literal 0 HcmV?d00001 diff --git a/deployment/media/wac_credssp_ga.png b/deployment/media/wac_credssp_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4241c3f35b727253f68142931433ea9c3ddf9a GIT binary patch literal 9844 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 H^KbtLItB7U literal 0 HcmV?d00001 diff --git a/deployment/media/wac_define_network_ga.png b/deployment/media/wac_define_network_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..6590a84977713951e8bf99dea70ab48cd256ffec GIT binary patch literal 33021 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_domain_joined_ga.png b/deployment/media/wac_domain_joined_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..a09a1ecbcc17218c6817252fdd3fa170216b897a GIT binary patch literal 22192 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_enable_dedup_ga.png b/deployment/media/wac_enable_dedup_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..9b93a8a80833b146797a01ed1b5f72e89e869323 GIT binary patch literal 45885 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%0D7PH=3p)j$ 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_enable_rdma.png b/deployment/media/wac_enable_rdma.png new file mode 100644 index 0000000000000000000000000000000000000000..2c57cd8014938249649f073297966df9ba79e064 GIT binary patch literal 14575 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 J6#EwNKLB0ZDeV9N literal 0 HcmV?d00001 diff --git a/deployment/media/wac_fs_witness_new_ga.png b/deployment/media/wac_fs_witness_new_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..3792d5db722ec39e8ded1063e35244ca9d782aa6 GIT binary patch literal 16012 zcmdUWXIN8Pv~6r~Y;Xh-=_pOQQl*PZ?<F8zkxuAMYEVR^OE*A>(nEkC0YVFiG$8?` z8+wP(TR{5ToO^$~`@M3%dtdq9`vH5eBzx64=NfB{u_JZ0Rc>Bmyaob+ZmOw1*9U<v z`GG(e3jewYeBzWJod{emc<HM=1(kL)lYqiydqpip5a?U{_2XApfbvy$RTD1|h^qPg z??Ss<p$!Nme^2eXqTw6MwQ;Q&4pQ*smbEoQog%1Yt_3fDH{0fMmQv{I(%*%Dahfd8 zc?dxm{?fd7Vc_CLh}*^Iv;B#xQxjCopQIi4XIw5&j7cXv{Tt;UY3Ef|`0P7P(68dK zC$E2}@*e$S=CMSBh^CK)2|LiNf}*Sdj_7fno?ZO@YxD;&dB8x2E_x1)D2TcNbP}|| zxZFq%aN!1SL-EdHj8MG%W#In!o-HuW?+W_oUmSD%M+%Mh$s%d-tiI{7%FbtVTPnVH zfGS+kwY;K?s85A*nRQZI%_<STA+Mpe6{1RFWtc#F)Jr;e{SLf9akH7o6wf+(KE>6z z<$OZm{{C9d!7R^S!glYhiWP=BjCkA;vG?k40mSo#CTHq($uPUcO*|UMd>OIaa5U8b zLl2#7b_5;nO^5uc5(E}6bTr$wGl&#Y;LM6sfF|yl$j9aHC3vPT^iU(7Pxew<jyF!~ zpNX;6%UP8S<1x)g!b=B=WzsTl=66o4jz(7NV!mDifyN{%(Rj#*BQ#6}<G`@^luiUO z64BYOqIPO7FW-OGFm^quK?CUY7z26Z)Ny<gIw-5&MgXS<S)B&&bV-tT{kpSLLdt?@ zV7m+v1P2JZZwygHgCd3Gd>clPloTIA?9&`(mzvuPBB<9p=D&0WQnP9!Z0ckcf;=VU zmzG*%jjGQ!cRi%dg|FK_XyCd|o@vHBJ}X@)pq?cgw!*`(9QH~;`)~9VY$^7eDHocK zdi5hZz~1>0tyUY%zLsf}O#*!;n>n^NG&Yj;^wgg=mRG04dO}Ff8z*mb2MeH^6EY{= zW+WFCJSOZ29rWrCd1I-yiMmlHa8Uz+8y3Z~1>cTktKYuD5OwxdbGg+jFx#v?b8j7b zs<F|sf{be1A^Z1<UI+SM<*N#7lFQ%<b9+v+C?6y{Y*Id2Gg)ho9?4Yh>pGa*GS|UX zu}P4_GVL}XIC;eH>vCbe)+L!_5!=R5**~XNMMUVqnxq!}az8p#iJMwThq`goN9_}W zDcCIPcut4A@vxk4Gd6;U?_((|PVTr=X#Y^s7FjfNG<oQx(YHQJYIa+Cb1+gjc@!yd z&~Y$>Wvk}|91%3tFT^W~yYwKST+>x}SWmxI6Mh9DA5ee82(L<=J1PSeTIgz;mg|5D z`vl0*-D~yCYp-HM;7+o#PPhNOQi-bn72y75BNTc_caW7EKhx0B9?vRws;gD+z0uU1 z6*C6C{aJ`G)j{M4_8?vF+ML={bflpGoQP{RQKVlcw1HOc;MauZ>GmZSu8j!p>z#?V zyEpys%2pHL3XasTF?1s;rkSt8rr<q|h3Ha<nEV!g?<hG-z__dX?Jk6G^2GEEgLw1J zA1x^_O7AlPeR!B@xxI^<UQ{@-&LK~2zDJ2%0D(%sYx9aaj6+{u93##makzT=iGHsc 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 G-G2cCPV#O5 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_host_config.png b/deployment/media/wac_host_config.png new file mode 100644 index 0000000000000000000000000000000000000000..52ac064fce0d621d1417a2eea1b193abf4e4ff68 GIT binary patch literal 34365 zcmeFYWmH?=yDl1_Mxi*gxI=*g#fy7!hu|&&g1b{_ixzhY6n70$G^My}fS|>TyW35F z|9!^3``mrT8E5Z1#{F_XWUS1UWM-~+tvTQ4eV%8At18R9dP(vU006v_la*2j0MK{< z0MzLhsK_%%Ow6>%1B$D<j0B)^glrqxcmfhv5(fZkVleJZpCa4nPO`eL0036!-xo@+ zW3dGQ@O45?N?g;+X#XA~)56mK_hWWC3g@@nPD}}&5FNIN@7LWcxthDpiPV8<=kX2% z3AXHkj4h-S-usWRL91bP>AMY?T6scIC=AkSbgR-cuDxfM$o5&HktBeYrRIuw4;58W z5fd#!^U1c^7v~=;U(#+w8(l|SE8R=0idsYupA?O_X3cx=OqDnakCxazM~<>d9p~}< z*1rt}0QdygdP~5Y7K%LE_k5KLdBTrc1P$4E{oie*<X@G~kg&g4tH_dz6;Mh8T6+v# zoaoLaqdv#?MTP~?R1<#+65!OE_$k}#%!2bC8RPOq!f&HK`_tv#KQsmQo4pfDbs*aq zT<~1EzvHWt?g3emt3!)whM04Cmv+Lx(c&`;WkBA9XG@(%ers%I7`D^~4GiR~k!QhW zq-*Vj$4Zx}6UYQzQ@oxaJ18?3^D7Kyia`&>WD%Q?O3jy~s_A`Vj&M&8h(m;<w=Ai; z=c?4iC6Dbt)2oPKu;i9<A`)UihD59J=o&hb7?IXfxV1578dyn<4`M77FiM?D)$pDA zW!5yEolTKYQYz+EQZr*)`k|j-Jc+oF+IPmTY%w7+nIU^li$yTny1PI>fmkb9r>!!b z-4$DW1{wb9=4V}?fIl<{(}Zw)5*~b;B+uQWvdMk^f_R_eWb!p_!p?=T%3L(MM$Ue2 z3tO&JL+Iks%i_%{pjFyWmSjy=tN7S%B>*5610zcmgO&bSUkNLheqmm=cutI9oECG* zu-N{l>3j8WknNrN9``ebt;yDl$-Zk|_CIIIAmjjmlfi3H7wK-E^Fnl+g^dwg>CvL? zL&fyBa>}Iz#|*XWJH;k}?30Q;-nZ*?x_+%iwEVbz{l8gR12D(HxdQSE>B-2aMTZ{) z_Bd27-n>lpo=e-diK})%hb>&wmxn`0%`&&`H%%e1d>Zw3ukAvjloXnVh0vnoSl&%^ z^9V%61^`Uz-wBB%a9IRNOEsYqH}1`*a`kVd`=jZrHd!q$PN!m6oWb<JM=2fh4il95 zR*(blqnZ?VGf;9L?<7c&fA0VE*ci4vLyEk`I)+~*OmR;^f8Qb_i#%LQ_&r0$hyB0O zI1UUv&GJ3qh(Y#K9n9AJhvq><000n+KDr!7#?B@53KIaJG7cL>etz=xzus6~gDOK+ zk@F*jMx#ex7)mdFTCU<Ptc+mq2vGN_I37!&^Da3N|5a0LIG)>Yre~Zn74&ZWlx63o zDEa4)Z>vBvFC#@=XBz9zrb0*d;5CWtaC*)&cUQSS;J$Mo=X>zAL|*i0J>B!TP7Nj_ zKR;k4cc#z$PCyk4ua&<2?yyWgH?t+Q{-o>0)?ILWrZ7R(*!akqA8a|hgh(lUjerGS z^D}|&e69jfW7|Eb<@iw$o|c}<gAEOH^tWf8=`x*4UJ*LrmSM=;zP^i6z1nG)KRH1i z>30%)2_fhhw)8DwOa0LxU_P#J5E1`+&BvV07%h*rTfv}RNCv`xJj8N3sqBgVOfaxW zJ^0J{u)59A_7z&r(pq=;?0)(ah&po`Yk9B>)5!=W{`arHpda&a+cMqe+>iItqrREx zh4xBSgGK$G#)^f2;BED(EISc#*{Fj}m?Oy{KDX&h`{YJ7dh<>*n&fHEhE-zt&21yP z?6@~KNmln4Us-gAH0tm3-F4yU&W(AyxeMrOXQ(RW=R;OK`{mDkh%MmRiPA6l7#o!w zc60JWy94d|)YE+54n`@BmP}lTx9o|u-0lx_TDtiMq_?qBhGu>2SGXALKA$3-X@+dR z9<%SI%sBX}txOb;xMxk#sy7bhXLigs^tD6jP{AfEFBupfPmMhMsD2FKGt{=gD^Lx# z`(?Ky9FWoBvtiW9T6w#RUAhfR;ZhAUu99oSyDN_~kXM|i24V>+T*aEn&(p&nR-$QW z5+yHx?%}UHw2=>3+uykN@)Uv3nzuX<%P)`h6D|0wm>p9pxpGLVm{=AMz9@g&Emb*q zMHiXN@!VzuJ*E2Po6ZaIh~b<v)gcr;rU25A0kd;u&(5k@Qrdp@v@3P^#&Ad_Vn_M} zgHy~x-B&W{dYIH@`TH|>YREcY)>yN?-UI0nM=>#MN33a<NRk{w+k_|YlmzHYkw7%B zC{e1w2j-Q?tw^UnW{dHeteRTHD$?g^>fc_}!!7iN64JG7QPllu+snP~&7b{zK>jJo zA)!AY%jR6RP&W;~EDii4=9g}3ZwG3SUGnwzM}vD57n$Nb;F2mwVAvk{=8@*=Z;FA? zaK=yX)(&eM?+QDEWhiGkze-pR7cT3!4Bef%DY68Stbe>q_OWyCVZiPgE<SzQ(0a3) z?XU4`?<J;&Uyv%1+H~cB(6m1%X^;cmYiu0fvwG@QZK7i=xf%O&Va>)C)7K}yB{!Bl z-y7FLezDW)B<WUQ95?Mv&AN*5?85P8<CDDFUTi|c?TlIkGEz7O)pYiz`oO?gt>Oyn zj~(-6bli-TO)*Nw`>e3m!Ah;yPK{Dp%_xRNHt$rU7FC)$*J}i+b$o-Rg@VX(lJDKX zESf*rSK`t_cO<Fc<Zgnj2GTCKKxJL=lUW2DA+wVpSYA0mGGz6AQ`KGEECqpII=prG z!ZMuu&prmWj6rv^+ro(Wa2L6@dSvq#ZT;`4x;^ujN#UBC!pgQiY<q1C_N7c^6xx1e zD+@tDcrr7-Y%<R^X(@Kxy@LXaJk}4B1_@Nj;@chJqv%Qb$#UVWAKZp8V@^q)4$T&^ z51z%fZ;tuR^pozn!>1+tM=A6nkknbpCfd0|8qcTTbMUwQ606r3R;LYnSxqrqaQj() zsU{PLz#_jyO^s?Di^1KjZd)Er=ptog$~(#@wsm^d7yU*$h*m|LZZwOh>iO(0p-I-~ zd{c$X$w@NK^NHIl&E@tmo#KRtXt81RCRA^;FIaC?soZ39h=hXNbQelh9d;n-_ZVR| z;ujsmTPflD^4|yYH}`JL8glFPyrt;PqdwMQbB1b-vEYb&tdgq!WE_XbR?sKKo}f<^ zTkNIv)${8dPROBTU9=M~i_BYBr^y}2tm)zLiF7opW{yH~W3$QmTTR!xk12+(#R8qm z!*kya%S<+)eVR;jRprAvy-BlX#Zqn>j$d1>;UH~$QKDA$oHH-Z#`VU8snP+P!&r0& zv;b-r9)pC$DFh)y^oQ$9p4P(`eJu%RuM`X7+n*}2z05d#)>nl-r2Oqq74QWuKJ+3A ztUgd-yQHL80`Jp*(l+&B@t|CT67HQp-fX_e4BGx-`~;UjS6x8h(;F7}ZP)EL4d2wU z!gu(sgM;Lcn$yD8)29SfEntVVqilnia<L1Z$qL9xIK~A`hglyawt1{LlzO%o`tnNY zBZia=r`r1rihb&c!IX1@JQ0B@`x=i$m$Sq=E(Rf>vt-=LS0=g*5+^K7pK0?@=hz=y zRFi65tvBWDAKVKW$Xw9|f2P<ph$pNHkW%@6kBE4kqp{f5B2d`aOn!S#<f&I+#L|kI z)@*Bxp*QR!x!3~zxf|j5LqzJi@Hqe)DcBq0UBUnb9~s3`2VoSsH+u^xdCvzlkamWU zs!6l)2;kF7`a|gteoW|NMp-&dQl4~-TA6X787HXM2+;l_^fq<pDy%2*vd8if{N_73 z`ta^uOX9L9m-ZWk?rCdrS;L1{-M?o;Eke`PhYZJaw)lZ|JSW2*`C8{|%XBMOyeGe6 zYtk;Iad4@62Pekg?A%hFPLg}~&_Qg_eBbaK8B#@ieq{Ix%57=s2K$zp8`jxx!c~(& z*2!Y#LFUQgo1o<+9TRcdZPG%oCf>Uwt|iow)K8e~iqyO_zg<nPv(95XWN=S+@IgPY z!h#R;h>Z#n&+Ok{_s|-BWfm$U=$_9(qz`jCA+oMJ3|WETSLf}7twirm;3oQGQ0SG0 zAOep<|E04Y!f}O0=*2VZPAL$zu8P<(9{Ek4Nvm}BNhH4^w3UG;PQzg0ewngwx)d3P z_9u4ERejPi{S&g`qf@=5(^HA=nw)<s8#AWqRSLVl4DuSjbzjFXQ!^Lfv$m61=8dAS znw&f>VNVSrPukb9z;x6&v{|LcKSd+b^?6emVm#_Xob%&DIQp1C_*UMCx?`idOYuw; zCb!g^6dD05pb$(4k>#%-5p*Owz=mb|XElyx>l1$OYSfa%$Q%8T*M;w?v?uth%SW48 z=hfckXlH-uBtOpY9>!*bDTZ1*y!W1SdrF)Yo<p#bz91ja(NrsZs@uXmM>v{zzeFGc zso0GupW^%@W&9fooz)POzM74X7W3$c-*`&=eOYNpzY#BtEO%VD=UJ!_3N7W+P|-?c zTo75qD8u=!3}~(R-1=n^0aXd?D4rCH3}8&yHoK2vva+6E;nLQwyC6fXtL=HSe}4j{ z=5F2t@r2FC;NPmr$}F35vc)|VZAM@h8mDG&$zl<DWknzOh2Hp<u29Yri*~!;)aO`n za;-M!vIgdwISeD5kR4N<AK!e&K{p;XZ2SUoCq`7zDaO_$%8YZ&!q#@f9F7DPb%O$o z_?x|6xwqeyE!g||G!yKpyN8n|zgWvLMsH$g^Y~!!o1>~5r!Ez+QqO#MHL=M$$DH{& zl{bcG<j*XYVW&4!+Lf~Xb43T|y#2j^9^c^srz)O4S|_x8)DM}+JTeldpV!pwMzqQ| zgM32p{Y^)eZ%{&%BUY9eq3xQlkAmyMuw?QA5VZlH)zC=N1r;2}`1a7PMP4>@sbGAl z?9MtN&K~|^Wu_eS$q2l#6D@kwX+U9Vbd5JgnfObBT*L83&YUI%lx))OBD;w%hFLE` zaQFQ?@R=l6<b|!Nm(f`DOuCzm?pqxdKOUpf2ir{Tu8MKG*;ij~i>~?cU>>Ye0wjAy z%QE+d=54(@O<MNJ6a!sfvfcuRf$W+bU@rM2jExtBc)G#*g_ItmYx6G}9a3J92Ts)V zKU`~FMJZe)4}o^-v+h-gFRc7fT4HF5;K5ozqIxWr>NHIus>I4coh0x@xH(CUXQ{=o zqvm_x@(1Re{ojSgRWsQAbS+FAO?$~`hPAWa<paaiX;FQJqpa+nZ0m1@rXPMfz&|az zNqkJ$W9a5#oV-i#O4btjVTs{EwE!`JbSNdwY!rsPe8JhBH1=G4^W|Z^!n2(-eIjY8 zO4W{)Ta*1pk6w!JzY8<+e-<vh*ZR_oJ4@#DgbiklFpf=!V`s=+L^hX;fH_{3hK3kQ z+HF-#M6j8_i!4PeXNla=?{#G76ZgH!6&;%8BEUWJk;1?h#kUFuWt^;q6uOZRvH`1^ zbq~=>D0)5n>v0$HyCO;y(l1wUxF;%Dud-64iF#kIcuxonOF-*50$IGTG{i8ITNTn? z^8pQWRAu#-pG;HN?{IjfG4<0#ntweKvT;dbX?@cu?)1_midLlahVhW}sQAzm>-^d) zuDj;f)aak`Lzr*ER}p)@>1E=zf{61k=g4~V6B#ZgN2=)mD@4KnmT6!Ld%U@CUjj@Q z_}^Zn$pAjp9}cioamP%T1XDdwBL~f}3Uz-pd-my-8Lh#Dv{%m!vS=4;$H_+4XzLiq z#Q$nkkc#r(#mxw}Z;3#WRLykxzxWA)baLp%4!1ep42p9dlB+=Ie9oFXZI<NY&tP|X z2|GI7IaV3MLe_uJ3Wl<yqTJ_#bjoLJJ$ibEdPr)>;!?uYPYLsvE>|f9?gROJrf!!h zg>5g80pfXU?+-ON;I5c0oN-7h(}D((@jupeih5mdEv?)=oHMr1BkrOoGo9hrR>&Gy z=kvrWRJ~xQZqDJ;bXxjbZTUrAPbgEMu#(GG(NtZ0#-8$fY3O!=24vy{l-v4^A=@yc zZ;hyyq4O90l%{U)2&4K(1}hNb$K0}7BSutTO~L@a^EDIT_>T2rNlf!_2#b1mm-E;3 zI_%#0HFEI<>b`uZAZyp2#caQeWqw9wKa<<Q1^>O;<qvm1<d6k3SZ(JLO&+f2Z6@D~ z0`UO(c<Ksk4%D~vZdp1@%}!Jn*L_?ZYL%{aPp8G-;7_WXv4LAs5ElOlzJKtm=P8M7 zt{+zM{D_e-Vst*n5!IcN3bCHMj)13KZ`agpUkAXf+zs7xwFpbpom3LPDYyq}0iDHM zUlmcSTa`-VvTjGCyN(p2r&%#J*Me6fxG<xCQv}PBaD@IL40BZW8Dt#!aCf~A(m@99 zXL=GzcKD0jiQ>VGvGocNTz)*C`9N{RdU4y$-HYxQ5qV;m8FaBy{-q^ynKyUH)GnVU z*$I**7>^tP#^M_l7ME1$FbhWMY4NgAGNaS?6khK5CGDinloTtsI4}==*CZ*6@qyZk zFIHwj67HOju-;oA{gyqT4zpVH>5{xwQAhH9CJ<trZ2pbKNr+Y1q(c%KO4N&YADewH zKmh{RENJ6)G+l2~%xGwN`Zr#V3U!mTe^KZOD~LzDDb|6+Y4|75FuZ)nMB>6Q%#*;g zslgd-I`%6AIkmvu->(#vrTOvm@HgbCQ1MKY(VczvlYJHRG`TY}V_jixV_=^18><@4 ztn=4$&^PU0q{-u3=t!u_csv)L#wa|qarI#yXV{wFt5U_JUwflR1Sbojb9{)5?5jy! zCvf?-clHu*^nAw?6<~+9##R54Sht4dFw5gie%_)nQ|J;up~67J6IjAsR64^ao!i_$ z)OS*tTK^@YTgo+vjArgc0Cxd@()5zz{#WrDyK4I3^C!$C7caA&F<B#Rv2;9G-fZ># zbYS`gI=`Xd;roRu=0MODcpqTwSkCPn4spAvRSdOka9nO@scN0Dv!Gx4AuTJiFme5n zv8P-&opO_qRr^{Wo)clcdGV=RSlD5=pv3g{mC5<LKk@B7Vc5~1w?>myK(@co{kH)+ z-Y(2Ngrf9$47z7Su|CE0%FBI152Gc;egUMwlGzZ;T<ZZAdlgyTsOOs{cW!Vy3EV35 zwB&-oAPS$PoryS9PVc&dKaSN;m}|NyYOJE??MiM?l}H>wG7MJd+FuqF`wig*Yt3|r z`c%wlu?j2{*}B@}YM^K^Ezq!P(LK=4vQn)vut5sHXwSNh0~DZYS!dp!$|(xDA;-Vm z(%dZSwRmIN{xY{=fheAoNId%bI<={%Jg~~5Xg~EZw9h!!IYIhr#l6(nW*+SBl46{1 z9*E7a@OZWtulSmrN#)y>aCuC+vClC^pK)XwIQ4M9OBvjM(@I%J{N6A5&-cM<dG2x; zYhERFi6Q*?fYjShJeJ*ST;4YB&fQX21Z7K}34=)=uRsdx*cbehrw>g#0gpd)DheU6 zgVB;d#&PI&O|1Fcdz&eqOwmoEy)+V3jie{9E!=AFlA~_(-bpkun9)fdoG_~^wJZnV zKD$&IanvV_jJ`6CJ=Vh{Qx(w4=8HuOVYm4Cy~va2V#@(QwG4Fi$L~XTynpAG=T%fv z=+J6oL`;-+81m;y4u}<j*ly@rc9paKkhmNZ*xIvxk~OhE;xn!gwos4^c-3_CC&WkG z`91;0@#lUai%S1Y0MCx25_s76geMJdGm{{Y&gL-onbVzT@bn3wN!%~wmGU#ZC7SP| z*XuQ#nd^5^nGf*gTpq`hi*HA&yXT)tuo6&08p9Y<E)BxRvrQgNveuQ2E%C47#7)E2 zP9Hvm{N_!c9w*@VOu<uKh7phjFyX<;HZ|X^+g+^?rnY06v08^1O)n}&d=tKd@id5) zyy}gG#m|H-)#x%uJ*AQ5PqF9|6^gUp=7_#CCr6*O$G|(VPQC0E=idELmnd$$Q;GU> z2bo@btU_NwtgQVt-U31E!?#vZmD|#`F2_!4&v?ifKI2?gmKuR443{-MbG^kQ>m@zf ztO8ra_Q-Z-qTu!h(~U&spH<@CFn;x!1lLQ{_oFytcZo!=i(k&Xe?6rI=;K)Bva{>n zF}m~&#@LtN<IKC`u<(99<pl=!->R)kKl18@gnVAFc--`;l`Gn;aEt&<JXUPVfvOA> z_L}BH?xL+Mi`|9!xOvhGg81fkKgexHVZ;pZKxLVt>N3a7ipX#b1-!@#X2oY#vRYR8 z{j^b#xB2|iCWx>GH(+RtKG4Q&95(+FaNT`4iK=5h)oen0)$4)+0An8$R~I5+q&cwV z{sm${xpx=nXS&s+!xI=83Sjri|H#n)AzlBk8b_Cq>WBUL#!(?uK)FBZ%Ap|cKY2dv z#i-6QlI8#J3m5-eJo29iBq_mHRm+FFuS^W*8XdE}p8#}jD_c+GPpu)$FIFj6xyl`B zMD#D&tpKxByuauTzktdek#fhsgOh(<EyCw$K?!zzb)h0+*?>%KbIAnR=Xz@=^Jscd zb9GvQ;Z#UX_%#ETXDghGG=l#H4^~_rt{`nV4Xb8%#E;vAn80<G5nYhrp~&Hr^DBNR zt!~w%?ZHxg8O`2YJ=oKA^EWOOssF5t58NSU&-{$bl9VP~!b4=zSe4%ElxsqO^E={2 zhK`zNrZInk4v|lV707PL&TF9lL9yPN7dWKhsmR}GaKC4{^tkjGkH9~aZ2{VQj6yQ! zU@+FbWmur?Wy5^}T=;o(I@w=dzoxz9D=IgO5PqC?(_~$4uThIuC2+XM)^|fo^uyZ2 zF2=|KzUU>^)}^D++7Y9X%|+L?veLnFy{C%%7H<L-A&Yi>dbe-_7mMgMa@?z!_}Tqh z!mL)cgZen+j_ykFzX_cc`nD^Rhjz57<)amcMwGw(0EZyv;?kr?#+x-L-Cb`4+vMs^ zJ_k*p1OZraviJ+c_WlRFf^NsXYFc#k7~%*cXq3CuF}wLw6xFEr;P<_xlbu8^_P}?w zwG1+PKYele7&;ty)gj4u-$mE^p*C=|qaV!TVCP|SsCBz&D-YkSoX+BPwf-AfdA~v$ z26hshnvP<wq8Y)hvWhqpze$^D#l-WaHs!Jd2BJB_BnAb=W)A7LjlF$+a8UOSlA%o1 zQ>sXMUYD0k3)Qw@o4NT5h47@@Y5It5w1(67GP!o1ayWce2K%XtaNbJt=%eVp7fKjc zs1V{PfO^hBwiiE7`|jrL{M;%M%zL`HephF1ixXPrLv^`h)Aa2#V~W;rJhUy==fNg4 z(COyZ*iu;5>Fj3!NZUIS;gV@z0GYpIb-rpF5r-llM4(3U?WhI!*sceO>w&*@w{3-5 z<6(d8<pAU_Yzm6NI$nRGJ2O<qW6RWNQ_x5&Q81yi7}JU>bwBC5SUT8J)W*-=*x{f( zIw6<mUNre?diAOG%8}w*Z8sT<Z<-Z!p3Cn;Ro^8o_H0O|q&;)(l_EPyB|Ry4l~pX^ zCQ6`%wIW-kzp(n;LizBg;!OH`7NSw%UzdMp_UD48M@1=-O|{rZLbQ&kW+Lffk$rat z>Dk&?S!w0^CK}Jv3;?S~h+>!Tzi`-O?jWX=)AYM-wY15c)HkgzOobzTzmveL;svZ& z!XjeiCW8%TdUx(;)}!glNWfLb2=)WMOWIwEFsXuLj=b;RroSZeY0?l@Jr%andJjGG zz$DHe{tBATRPRqaB2p97z*qLlRTybQ@ZHE11ME2iLKF`&-ay{=x`E!f7!668LmDWG zR-UOmu{nL1`u)CPznpBF>^&*2jNom|fzXT{vQB^}dOwsSVU`Bd32)VJJDnz8ZC-`Y z1ZAyJjHeO#DxM|3WdcR1+Q>catEn8-HCim(Xlr8{eQ0b?1*kn`wtDw4Yg|=pDWP#c zloJ$UmIT&=OX&6ez3h8QixfX^`G<>PMm9zZep~gbpFe}OskPhME>vt-gGRIL6PC1} z^U@tosZS_tD{W#!q)K0EaOyy;Jamn5iN~TL8ZNG(6KMV0Jg7ehydMxljl)8|>)xj? zMB0Kwgq&bZHHt>5V1tXA(d9=CXvzIq`=iK3&35SUw9i@Es9%qe{P*PaitfYf?Ve8{ z@x&LRYO75N?2Nvz7Pq!uBU<0p%1)eClw#~<;#1<B6)wCsmQ#cQOtkLy+Dr7=9}+@? z4?omorQIgzvuEAJAxJEK)BBU-I5IpX&+fk@EN_o)7G&i-ZOr%C7p@1->klNkO0%?m z-v2yOspneTnzc1@u|My*k))j-6_)j|dZ?PmmR0OQ@1#&rUZC$VwL4;P22`kr5_w`+ zO>nVIY+R<A%gc7$pgxaXAOMutfdm5uJd<269+n?o_aAcTo;=Ano|p-h$f@RD#{Ov* z=Be4HNC<n^G8K_jRyfDyYui#Vmz9>*wk!C7G@pxyBjX5Sc0SZq@%m%?>O5FUIdRLD z5K2sQ7(!-iW3UwZVZp5Vk}$!nK!B*72Oj|J9UO!SH}`s5&tyNmH_dVV^V@EXN<`m( zi9Hvcg?GQkGNWMyR?7sd!M&s>D6zh0j!^mnGDlVrIErq`XAAv%=&%7A7#-f}{-T2? zZ;8|wyM^cni=s{#IU1mho?eRfgMy@ANR(2Dghx3cRp11j$X;!5Dav@-4Ux;<ok10k zh~8!3!6?XoP`j2vr=nlzaqGBz`949ufa9?D8H&kycZl^95E>E_b&~R?$E_q3O@6yh zuPK;u815M!bx)_MWoBG5wNeR6LkFIJMag~?esb;m3FAgi2%tlqgA?`J?)_hEQZO-F zJs31yTXfSQa9E|@C#sOMS$}6!IeVn2999A|OUB9U_w5ULL9!9kFvPabcnmPv@S>jU zxPJmd)>o$H8Xd!9u)Mtxw~MyV!FLcW{;G{`L+6#WEN6u_xa#71_Kp4kle)GYa=?FZ z_T#|lBb-zsogcL;hx?Z?8?;~evR<mp^acb%4Qwnjmf}}*-vZ^^$%ldE2ase@MCNv{ zmEf@2F2;+Tj2Qrxic}bI8z<9J%nwP*qv!<c<*L5f2CCD(y*%8&jz1DsyqpfuHXvXC zZSILuQ^Q{1ToDBu_gjPJ9-r3d-!1~E7?rsnX$WB|k>`%Y0YmS%JuS8Mjc%U;6uvGO zJ&l!m9G}Yc2dh7t^#1JD0EitRVGIV%YiU<rm4fz)*o!taz)uqK|GIX4cdt|)czdzW zg%q#B%O9_9GyYM)`F}0TAX8}{`G42m@n1nn|KT_P4w;w<*1g-`w<48w7R6S3+-%eP zgsp4GeLhmj>mfEHa=<4-hNXu80Pf^sMv=1kFRwCC15l<YtqCKyMWF1Gie+3DYEHpE zZMH+wye5}ip4-Ylu?X|5Z3b&g&(@a-G&Qzi%3N;_F1b7&wr=uRVE{fQC6i<$g>9ES zAr2m@Ih_!lpApXgz@1`BbEbEe@0)X@DKh7T5p$gFMfHJ!`m-<?y!<R3UUuQB6kR|S z487PWI&1g5%2q_;ITlt{k%Sf90-(**JosdhY<F<nV_$D;4p^bSV5a`XehYZ1sD*6+ z7jl})e;184g0<jxDF{3MCWi_z=`QF3F$=K>S_+Cmi;T|JjKF>tW*#19`6d@(7M&1H zjZ-jW`bWm*rW5#O3eG$-vx@9&cyL8TD1J=BvuBdBIJ$hoOHkE(oXqoxR|!uiuPgn- z4X2Hp*!w}h;Ba$?#YkaCRe|7T5-Ib3bpEaj%lZ-V%MeGmyrcdygTlvM=X|rHqof2f zyhsm)&j-Sn&^C{gPqcW7Y(zsbq@11s`oh<*%DH%`JGmI&e3vFD<2s!*H=jJc52z?# zx`#Bia~j)6{ZQ-QlbS@ZOl%I&#DcZg51Kx<mC$~2QF0ihYfENs*dkGu)Wp}B-Q$+g z(;ELqmmZNE`4-7I=xsjaE4M5ae=W^;yIXnSuIJ9jG4W_tA~dgcc#mYChNc*8SyJ3A z&&Q9B-_V>K3kq$0+wo$Yu!*y;qYYIlc4M^CLUb%xSqdjO<P&Pdc?D?72L?3L-oAcg zpk|>i%pUwF=fj*)+4gi?mDYwskw(dn@wBl1hW&T;Trrkk8o;32Pr_H7v>(s_>oR73 z3~R)MS>drXr+A>Md7Gh<S-H1Buu)UZcH7QkyCz=Ff<uzHP~xNP0ogw^Q^JxZEebHi zrCT13UA)jazE?SrRr<W<-V@vS3ka?UkE=-^+M3=Z!a*pKfx=$7P6bmkhX~q(@S9r2 ziGS`EX}hXRTS+L6xIDXIbZhb1)R?%B8~^j=HE>I|%F`mUzS6r+5I?LpqF^;ny4(pb z69wQx&m@9>{7vtP>vA*KGiwa0)ugz}EX{P4aAhf3Zs5t53THAt2T=DJJ52+pX^z4d zhRty?0kK_oh;4yENkr+;z#*!XAZxV3zHZ%B#6J+}x|*N-b4XtrcS<IQ#;I>ogV*$F zeS4GTATJ|5K+xx`n7q9kaY7lmweL!~VA}BR2?+41RW59F-7Vp~XP<Q`N#5KcpMmyA zwONTlN|}W`5<m^>cH;%bqqj=UCXjLUm%N9@7FoVyL@fcfzz;N8f=c)Z-I{jeYKwNn zB_5@hlzmI}@wCDm+|m=$esPWS!#W`)=(tOSc@SXlM&(F^!3u30zMju2t5>GcPdnS_ zD%ofDR@A%)*YPSKCp93x_*^TDI}<~2aH|2EjDr++@#0~kse|#us`ag}sNm%UU#J9k zFc&}!tGgEz2N!GdVq8W}lk6-YSn$B_TLk9WCE7s!^>%ccM*^R56Zk9B`c0;hdB$Gy zqW61ZVeiIjaQDu)W?!W^rS7CiYKf9?bjCVP=0vcOdxA2YOaXZb<mb_tqh}o>R_VeR zZeCMq8c>aK<=17tZ4C1Te-urAIrEb7_tK}Pudzh<x8HTVa#M?HXt`mIS<=rO{_0Y{ zVC%8KRJVFHrM2WbW^XuO3G_^_kP5tvYGL6MH4jB5V5B*34iFd!oqSivazpxbw_89c z|6Maz3!@;sWRp$MVQ)my$lb}a4CxbCA~-I*yySCN^f+pOwM=^(?oOn<dNG1b1IXo+ zaZ9dCboYk5Z{fJU-7M`DNjAC+RzqdQzOXvUGLv?A%X6#fOkb`2(qq@jLt*F|m-tuf z`9^;BhUX)hf2(caf=|q-)Eh26%8abh8FuM+K~bdH#4<6(j$j8wgZ<AG)H+o^hSuxP zf>r)EIfKvHz<B@TR{(mFY)ffmTGMe}wP(4$v_Tde)g=GspgKpUEFbbfQ!jU974qit zU;O>Q4p{$pl0ZS;kKvIZ@3!&R48^$bZIvg(4mVu9a{n`u*WZ<M@%vlhjoPPX7i$L^ zw5HL2|LagQ3P08@T1;DNi+lK_TBGi+XOGH_{Oh^+Rj6`{5nBmNuY~BO{;)(x`J?-~ zWWT;hBKUK<F7;Whm$xQ8IYgzfiC-}YrRA#=sRufYF<@}GK@OMZ{uJrgGKA3Jd`AI% zGLQ`$^;sOzDY4+qM1(sOET;s<=y!?QU#q58H85BjOxZ-&m7WSHv4uvw%NxmDBJ%#Y zkZSFbyS+zf<GK-!tI=<ecfiV2xKFe)l|RRX4^h*|(>Dv4OG}NHqnWn`>3J4RKvK1u z%myMTR1)2>F9j-^2N(zyHV~DRRmd=wM<gCTzv@{?QpRoIKUWhz=jP;K$xHjYu4=&* zGiYkLTj!@E;CgvW(<@W6XGTdCnk25f_}Ckw@^c3co*qCc`+>i#xt8Kq@>^i3IkVhZ z4;{a<_hlU$87ufw)k9Sn>2vFgR6I_zA5v6hs&{e9wZG;b`j*LU{`E5vu~5&;BtqN_ z1ac^`lIX{}ztpo8r@`TD-jmZ`^tQOAlABvlx6hF3f1Vk`BvGX%$?0ne{F2HakX^;J z^I>a*OSdsFiChyqKPiF-*~bLkaCUfg&pX;@iD0A{5B*u<*vJk9O|hCA1w*8l(i)zK zj^kQ)-tdZr-9%wdy0lnK^O+AMgN+9AHO{B`eD{+zD!P=1{{|*=9Trmwds+Qt98Qu0 zlZ~zRKstP@IoC1cuNXx{5>N(Z8ym!F>R!25Bkg>!i8Z7R7EsQOoAv7c9;tN!-m(0D z4wn7{a{9N%zsq70;#pf5on>f%>R(;+M90L_qTX4L(*aP9#L>M~I0`_=bk#ocAK4CR z?(IYs_MCJSYQIlVNn=HZ!6F{%KGa|flpl_kBgrbJtEg*fnISP&WWk`*qjWqU`uGeD z%PPG8IL1u{D^ZTD;ZibzJZwAI?UIr5u}?b_I^wb9zl6SX>}n-bYg7bZX!{3jfoBdj zhdOAjRIu8vYa16H1*^QH5J;F)K;H$T!FuDqc{AWw(z2i?S0gZ4l{DN_i}!p}nruTa zuuyL*=5>E1FZ?~n(roIa?Q`aR#rjN+Q!jL1$|9ujR=9Or8g(=-?B1K`ItU*%+Ppu! zXHOG8j;;g4tu7b(OYU#ye?8pa7I`?%i|Q`A{x0s1W2E^2HV%+K^bLLNr$b)y1l}st z!Lvb)14W}o&oFKbof^8~;*FeFn*#gFY*~@oM(3Zo4q)xS_e73e51j%Yd$_OySCgz% zG7qNK9}ImjH9Z};(A8^Pw90fBxcC$3iw(sEJ_tIUE*{?Xa511Gm)I1X>?D?`8*8_Z zvh3d1Wk$AU1(PI=lbWUSI825RJRInJ_V;7Gu!_o!5s?y`w|rHi)Px#y2erjE|DZmp z6tyHN*KGprg^n-j=vuo;Vda>SF8_c&-h|A_;;^Ee{ew6zJ$U?@gI?R^F2{aZ9A{F9 z0E=`q?*eX(eYAD!`Qq<!n@eHmCHTlz0QmOyv2#=O?srZ`fLXjb83MNTd%d2Jk5{nz zvh@DoMM~+gVTJJi-B1qhUwA>Y{Qz~T5H+?BzqEK%(rqnkWU=ap&ZToZ?nCjFKvjzA z9%lwBMf{v<(+YXM5TK!DE#@ri9DH+VO3m!yrubmkAa6<2KW;pxk%8r=(wwkOo^ePs z@*k>eHdV1&TSJ<Al@ODaxTld~$D&xTNvCW`#nWxnAa}u_(<bajii`7^t(N=pjjOUE z_q#+-U-vU4Mpx<r;pWB|32#;-bwL+9+l>zM+|M<tGIzA;B@gNg-ywl>E0mcJ58Are zcx1xW%LuI{vj#GdzRebIV3|(Ig~0RS9_D{xypu~b#Z2m@>fucJ#=OD+I{usq_@tcq zq_37N?UHS;z+%?WbSjtQI+Fa#p}2as2OJN!HLE*F-RUXx?A`DzW6~xmW%n3nF3a?0 zP9A{bGc(IEpi=hQ)6kVP<|v1xT{D3b&BBDO{yf1A{d&kV*;Tzm4k-z*ZCNE7vzZ~S zH_>FuBJdYV>!H(^A^P+GB)sB757BY{0ebWzlLPhqj!{ZVxjz;f?_(W2r-dSt+Vzz; z+|Jjh?&_Lxjn>&yf;)Our!=(-SaS<zubG$%!e^I03KApB6DzrxNdxXXvh=XhbvnbM z#qbzvOMrevnwCPGsbca_vVC{m)$X71EFMThYr|ddviI%6bI(*(j1FP|l_PSRC{Jb> z<Dz`J(N=1i^(^a6@T_bq^JxQewSG!#*YA>KnEg|)&&*At3Xwjm64|-XvpR48O@$VJ zy>3J8US)Vkpl`Q3t~|Hyl;%`5sk~iDTbk<hI(%a<6}dJ)4=)YOgM3+Z2_CLuq?=5& zIOvnGo7d%^;5Xr=iT1dlT=cF)=s3vCFW(}XQrh_ma{qZY-)`Tcv?v@1ub(W@@n{1p zkvj7bYLS1Hmn@PxOXf?!NKoeC{G8aVUs<^gNm#7SN=J^a`yhMX#*<o|p_oUAa3pMJ z?_mC^B$vE%MX%dLDX@ZOXJAgbu7!D49qBOVGFm)gs2PJe5{>`Xu|S{1FJ`<ew;)dF zAP*<4E00)%J4`;>N?(_jI5*zpL4<u9lzfcIbv*tjpr)r07^opdlrXZiF7~X+t!|QR zS$_cvx@-cz^;rLzwdfn+Te#YOT)i&!dmEW%$P>t0_YW)Gjb@t9EYX6w9v&EwHDNzG z{_&`u_wxx)58SK@>9&ikx%z$9je(|B#4foVrJDylJz;||UGP7HXnII&zIcVd$yU{4 zFwuxt%|IsXBIWPxI@myX3;cu^G5Uos&}pk)Mbz#3r==1y!~KlVN17$7t;etaNq9da z@E!Hh0*#U23BVHZFLS%ja@S4K%<=0G?dJfKug;JESSy_VIUM{?b_-<Q{h#HHe=}nI z|DXIPp;EB(n+8X{&OZi@=F36~Q~p@t1bZ(iN?6MTq<s$GuHsL%>a|1Oit<mhSLHe- z(fxs-7Q^}qqznFfRHt5DbH2x}%)Xn4VRB-^6i*Eg0GNHVI>WaJs93rP&Nb2&uIq%> zaHREPjcIxnCZvqicKM|xg8fT?yz_r=FV)HeRQA&}xY4RxGzbAjxHM5e9;0%TXC>ix z5(m<c>p!d4CaloX;4@^1+Bqs0VUEuTEI3W=ulqfbUpZAaZfr}~ir}k~l@We1I^g|v z9SfRs>O~sBSMe)g)vL_%HFDr@)F&>{7628KaA$QzF9uC!k57e+%>xDT3$h%79A;*0 z*IpBmT^|`NNYnewLmjfn=?U+*e~h0ExQUG(ZL<wH^@Anx#tpx>Bf{0nc(kkFnqNs= z!xOB|)nFOtYUH1v-iQctnDQYvWW3MMzZ!ZqruYY+GArC<=;fH3*L1PwR2KI?Y(-#z zp7f_1hQ^V^mrhb9bi+;cL}gq)oqMH8?vVlxdmc)v`8#9!8}WZ~OOzVTOYwsy6NU2% zGHN@k9l#TAH1^UODO?csMW;@wmQ!TtFp}P6KSf6BMyiubP|URxnmE?;{(M%$ZS#P) zEll^lhH+38qnA8AoV7-!e%87VD@?$Ru+(2eKMx4MXFZ(G`JRTEh)gP>0y`tc1u~!m zl=S!GFEQIBJ@x-qEwSrY$P3V8K8wH@y#v^*S72J9kFKWT^g@m}&Cuv4E0neGvhAE2 zzs*Q7&euk8)c@ESE_>B^ulM;J5@xsHsO+`djA2WG)Dn>%&^tf{JzDJ5(GbR%m8D|s z*wK(;1VSMeVl{DpF71vnXIF+uPZEziC^*R9&P!V;<r^jk9k_sg;l6>l`B+Z0mAzwG zq=X&%(BLAqy`YIzE_Shm8f_OR^IU4vj+Hcx@@Y4EtDs54)kMX;LKuuml1h|D6T*3% z-olhd--8IpEn{<R;!<mB`2J$pa18U^2$C{;r)ulBxk!^Na=DJ=F|bF!xD4O_`n0)B zg(PKPEskwSf7uxXtSFV}K+xg5+1sF@J5`p8`8;$f@KOq@l!Bl5Uwr;i{BGv(^88t{ zSWyXRjHDm-cXv)~zUtfj(QIn`$6lMKZLP%j0dJ8;Fy1bZf(l#V2xjxlD<s%Q+08(9 zz^`uNkB@9Q{vYk+p?|ovIc(aZIDPSV3jN8AWLrH%QmcUV7lES41C{6hQE&h2?L+h; zBD>reYDjO|(&S#M9j_Lh$7t=zEmWRdNAF?fOm7WoLz0S?bs51nq>#_|9A8Ud>hN=* zsAqI|KhgDSY9fLnc)h5!h`t@WQ^b6{M)%9pZ{PL~Ib#@r9l=JrWs)B5+f~lTRi-b% ze-?CL$h}A|6;;DLnKj$q_g;m1+%0RxH1)Lzy{8J}L0{X7*vqHz^v-LHKOw~n-g#U7 z&guOT0p&J(!(izF<U-_z^mvIEE!&1s1do9m-HM_R;U#?;NH(ZEBQ)(yF9Cm}3GNp% zSbuH9xG8&LhvN8W5Ff2P{#{BzW_#^)I?rW$M^g<6k(0NnKYm#r(wK#`ZXxhezIpiD z*$r*GwGD>IIu8_(8B>}eIR-D@Y3pxKC6whha6{9R`VJKjjW&*2bSijuhPCeBpaMwy zf30%yoR@g5d{;b?aKX)LF<X-c!?b%ee;=MG6z-io6^I>s3S0I7DiOV@5QO5>npNp{ zG2^gOvz8~CY=sMEn$Cu@2~O=@)%&{dl3PipsAX_2?&dSUo+MA}f3Z$Tx>Wfy?uPu0 z<28qlSkpvx;h=>VumW+cTs7}ZLP(gb<3EFK9<6fHLd^ec_r(Ha3Fj@R<nP%twlahK z5$jJxS;DUJG%|0?w-uE>OxBko@a{gNN9Q0Z)~bQ2&PL{!Gl@c+H5I+|5nC*r`qr-! z6W@oReH^d$t>WzeatxHA&(Jg94JVkAL+%w&_SejB60SYDme~nsHLFjVa!xBij1x-} zE!x05YC7%Gg^iLp{NI-Y?-hZ$aKbbaSCPK;G0T2|8(Ht`xAnfj6_c29T5Pv*#}2do zOWXcgyHzcz8s-MQX|3lYl)E2L4aufjlPHuErO_nG?Rg8~vP{$sP49PA?-h@G*)>u& z7i3H2!}lB5s2=%Jbz`p=k8xYY&l<nY8Wo(;@xs;*$M$aoD`<}WUt1i^UX(lNZ*!Iv zv-nAI^1FEVe`GUasGi{?jH61eyWZyLMRKm>CpF3!l>NPvKAt}fItgk|O9xta&I+|W zf3YDb@5f39<m)H*r<!aMc&NO7aKd233$?8IQ+IBiN=dq{4&E{Qoi$HMCx3-f+&)1J zzi`pEP%+q04`EaUt|r%K@E{f{0A>7><fkzis|WQrY?M6|#^0X{=-UOBvzGBdY-i{( z2Bl!}KQs^{xJ#T#seuMQla6{9Q()fB@-tU?PS21|YzJxH)(WxE4GOJ{OEHm)7J|KS zQ^wMVS@H?3dH7S3y5igb2A-*A0Z~s0VRUx-r0)4@j4vm;sM4CJ==wyu+HbS{KbbYo zsCa*HP}Ut9*+SoYpO?KrxY)cHoHFdFJK)w4ewekecG<`Nj`D^F(M05jz~&<@UR<ty zTKlxYjks!S<z<EIkP^Ay)bxrz`>Qw-+nzZh^kYWre9gKhoU{XwUXv?rQ)#}#E~=3) zuhs%<{wYG=$o{x(;;ETWe5`1uOoM$x?U~{07j{kVUrB3j35o{=a#Jy^U&2q0j?<D> zFUJp8RNIcY%GPQJpYAHpCKaI3#LTTcWDJe0%xuXs!>ZLqSVFzt@MnJiv9s4&`;6st z_F|PDI%fO`p{)EWC_bkA?jc%Lp`*~wCG-H2La!R>Nd}BMF<m&mb|((-F00$*Sv|y+ zb7AG2YFN&Y@@UD~bFTjpbI%RSK9*7j!}gq=G#vYHg5h+BC;FK6`yR}Rd*Mp2!#8Cu zRG!C}s?(24=}xc<xCsZL<}9oXU<&FczOa&eOM9xTHE7_W5YXuoqb2U=UQ@zkh+cot zNaROmv432qyk}ILmEU0Qo7FX%Ic@j7{mV@!BEAfZJd|j%btKVgswU})hNRXr1b+er zhJ!0gO?a-!`|(kFPu-+KZcxpIjuxX9VJTycea6uGVT6M;mfF$0+>V^;dzhj5_ehU% zljVDwI99{A3zI*wz%dYZ11lWd3|0$&*Pp`TF5@yIs|8A{-ltz(21faS%xN+bC3IL* z3AHSWOV*WzxUcxrSRCErF}PjS`QA&X$xh=5sgIZXcWRbX%X@Qu&ka;ynGFi^Cwl6k zB8X3mG~YJm`;I|{Ojl#qhs|9KITN#f>Qf{R2Kz8+EF~4%s_jCiC308~u5!^1BQAQu zQfxIlB7;0#i!Ej52e^M4xH1Q(@rnWo#7l|VVo4J$$8?#n-@Tn*@!c}K>HA}er6khm z0toTR!6cDH_$`!;C;JuUJa!epxsD1F-SYd@N79S0+Iz!%+h*6ValQ93cjOnYaX?2; z87qCaCAS*eG*kS`5Ph;zuSiG(jgwu6QrxD9jY(FRpTF|Ip#qorIdo|yE$v^8N5`dd z<Y<RKCmg0Er_@fS=38Z!Z7cu!l1?+D+r>{*%>Ot~R6F@O<*BU}OHD;-w1HM#6Xq|| z(g?w+OERSE#YG3&df6pf^Vx!lUL{|x_e|~MpEAYvVtm%$=z~`injKLe%DVdxqSIRe z5l%AgKAf=jsKg+Z(gAy=<yHER9d^U%sA$TT{TO2wH9w9Nr_By3v>UU&9-dJ;0Sg0( zYVyef<|@aERL;Lv<QTpE+@l)i&-2XE8{RdYa9u#)n_m(ljFR%vt}JqYV3qAdT8P6o z`z<lH!0D`oK(Ak9pv_y|P?15ZD!8jTO31#J%ftGyuEjE!!88&0x*f)(vi^g8qpY!} z36s{e%_g*94{u#i&!w-Fjn?%uERtc1a(%v%y-kZ%pNXHJTNs9^0*V;BZT*w%P3M-L z2id;<BHn-Zg_v_1<54lhn;_?ucfW~~Cs;#6u0}cj=;t6nCGt#WpNm~jx18mV;E`o9 zb)$qmBV-``?^d3bwD0Drz>`dq9bFrL3B`DqrGgkmm&G_X`tG4^^S2jRcL3sje@zKt zgpvHV3<=|Txg7PN?p?<S-CSw)Sfvh;a|f}@A0mGQAI)>}K*D|zUfmH6;~O=QKXx4F zEB|EiXo}L<`z!p4g(i+~roKtBqMRa2Hg$dNpr&%xAj_~(0i{D%=>_lr1;=%#vPU!` zT<-GQYih|hwNv8}rj}ppZeNoO>vD}`HYt<h{orR=wN9)h6<E3h?Z7^=oeoZowS#D} z?`n-Pwn>wR%`E%qk@QPB_sP%5vIq1VwJ9`zXjEYnXKkA;wMcx=Uj5OtleZ+tbm<M% zsnzj!t8<upy%?wOFps?VlA>FA_%?<>b3t5JW=tU#OYG;yFVsg`_Grzc`AQVbUYLny z=f{}-D&wF^L^6@mGBi0^XDRV~PRBANy{z#b)A@1aE;53XgY;BWwng+Y&N+t1><W=h zzb(j`r4263En6cjC^Ft{rP4nXCm2_RJD!(F9wrTN_T>ouMP8qfu}KuY=GHS<h8j$- zdTG<~XJ>k_e`>%y)-B0r2&Cs<euHi^$aCB;xs~c>8x(#}vz^XWazU{ECEAeNQaka1 zU&+(nJ6}J}QL{Tfg>DP6CNi*Hq-dc!nt1iL7_^%-Ypxc;u2p_;elt^vDOg}vl@9WX zFmzd1%-xS@`9-CSe{58GD9E+=GP{sTMW^*A&XrPkd=+KyJ^3r?_Ql98-!VnY)GI}B zGWi#zX_Til$S{Y|xN)<d-DoqY;!FcUC>-_zF`_f{)%8f1NnYR}iBbB*J4J+Z$(4m$ zq4qPnVSKjg8t75ISM}oECj1TFpL^NCaNm<PV|X|_z5i1}-zf#U3)xOo>4}kaf?CNN z7aWQ`#o&r)53Qk=@0GJD1=5C2oUazm*lv$GjihU1l#uJmYu_n!_Nd>2VyY)&&*d$N z*MH|!=KO1tnLVseTF3d1y69rOG>YT=OP4S4@oOi%Ac$A4Of>x2%sBe!z{)RVfbRVV z4Ov7KF`?G*;K_$oJ6<1%qE*wagCvj9`8PYS<+r(IIN34)Vj}(L!}<E3T*I$0``U6_ zsl5reDhKKdZq0}Q<v7=E$}tAs#u_s<cmJ3>Km9|v-~A_M(f^Fh|F3`T-+dJS9qTDE zCx5`*(Mn9RPoUpVB+>B6G65%>Ty(1WP8)WTijZhs^W@>>IpEK_*^gNBG&Fu=93R&T zt+|eAH>bc>NNigT=^g$U-`jrnFbMPdaNv}6@3?hmaZ!-qk)?U{m8*NL*HOg6gHB+g z?OY|GrFpm3xP5)X_#x>M7<dY`S4M8wsnz>^hcGky>eb)TA+J9->o%!hbujApTM@dU zk63H_5wJH%DIh6wGjg6m>RD1ZbaQ#X*PPA&=yBGhLO%I8|ERX}N9ghQ6s+l_C!yyt zkne7J`D%CG@pjiSpzVCyQ{-ZMrx$in>^iiLtPcB;R2J3O(?(H*u;ns+Z{Xu3WBb-D z`tnu4vFHJJOK$Yz-i3;v+38_pK%>iMq0-5WexiNV?O5Prw)R~o>@m+bW{djCbEMJz zSue<wmpAZcM6i;@j+x-4&yI9{Vio^Giz7S1QsC!I6rVkX!=-nD^7a}X?=Jcg_0zAV zR|)xq9=cwwX)la5t=w~d?q??xwNQWglpmYX_CuM^>5z<v-4X#8>m_7Y323;$ysPw7 zTCn6b<zXu{$MpstVvAq?@K|xWMq2s7+-wu9-8v_#lcY}(Ikfj-HOy_`IqXalvWnYs zhhXB7y!bK60sdYp%BO5>G<%oD?$77c>hfdZz&oZ5*s2y~O0F=veLWdKvnbpw_^6U* zT}rs^SVa!oG#h`O#&!1Yt*BiI9i+o`rYP%ic#YBD!teI+lJEBLhEGMrc_Ckh{O&IM zQT;TJ-qlFhc`)#1q3tHebwdBqb-3vvQdIr}5diRefIHB`{ra(KZ?@*4MzE@7Q{cG4 z-}zo=t63?#J#QJdEjjNSc>NIgIPuy@XzB1WX1Qj&VrID_^6tQxNGjJz<90yiad-4S zCg5>)&Dc%k4g?7{5WD*cOJMp{BWQe=66G5K^Z38od+Vqu-+%8HMMVWcS|kMlDG`v4 zQ91;q8>A5ikZwllP`c9sBu5xv=pm&CkZ$Sj7={^Up4;#5+0WU}I_K=Q_I~zS=b!Vp zc)=alb${ahetr7c%KN(!hpUw<%#iGg*0ZT}nZxsR+<8Wsg~$e0zEe}wY(ys<v*@PS z{F7@;<;x<z8GdzEAh^glxOl}z4GrA59E2lusQ2)zF^HxrFXaX1^X)ANChC>=0@Px) z=~B)jIM5#(WPx+T8(x*OmZ8ttyH{JR<1O4)T>Bgm9#>n;ErzHKO-%VB@h$oyJt%th zV7{=Um~&<{Tjqkto&lv~c)Fo>)qG_QIom;;?nHO*NbJc8Rm}(EhiMPMQNfDQme^Cq zulc{#nYkspCR@&+O#6M(KDa?f>u&t9iL}6&&y|;RwXSCXy0*0IHMn74V<eI+XKT*y zDoQk|fnEu5nOF!j0OMBqHLx`xA42t|a)i%}W|4PJZ7(F@kCM;)5mL1mEQXApg>2Q# z4p`fds(eFW(`FB@qNf3k?H$1`d;A9D8L=pJj=F2PDN2~}+C_tzG}&WLvjua>U=-PD z^<WVQ2Xvo~Cx~#%L#y`;vo#=-)YiEbw~HD;Ip|AjXd3(7Z2p$QLs2tw72l8(6V^Vi zz@x?9iBJ3A!twP`|AvLS3u{pZ#8GxbmjfqpxaPdqnaS$6V@YT>x+qd%U@SKorqov| zBNcE0x=J2JPY6$%QF=f!-eHI3d`jQSTEcR4DaT_TzLMj9h)EfDdpl|ZLF?pSq{Y0% zPZ}&3`(TQrabeoO84zlkL|MU#&Jt!fY?uRUK#kr<?2~3e7_+Z`_I!d5DG~Y!p~C?e z73+v9#UWN%_#(#U2goG&jMyKniCNpm>|-r8i%3^07e+Z<jx<YX8(==Om1~($@x3kD z0c)Vd#G(_Jrh)ACbvf>+qGHt+(6I{1>OX4Ub4;!%@!!mE(SKS@Kbzh|)Z$?GG0gf5 z9^<=nJlXVXH+E_)o$_s7JYtaiN&rKV!BTvJjyFB!Ir^YQ(|ynoeB$MLQTgzzWEO|O z^73WnO83*NU+aT*!Z0jS6Sv^(gIkU4=H#Z;EAhb&GO{)VVGx0hy^OyDF7_)ee9NZ| z1x;$f9&uUS0&z^z4Ysj<Kvk52S3-s-b>Sph^VYuJLqNiI<g`4w%PL=YVzJ<|_+IZ4 zjl-K%sB!z?(2*iRhXz&hVKZ+FMzVp;cD`p?q{k6_u2u7nu7Kmm_5Q#TkX`YZTb_d% zt?^<?AL1w+akXAF>w{bCUU1aDC5{n3NPd+24qGu>p(T9I)Y9)4Yo6Y8a_(fKnxyX9 zyl&{)u$WYunZ0n?KUnV?)PlK$=dMvLqIWzdEzoPR3r2C?T3jtBG3`oCiKg8DyP`+o zuSA`K_nAzxWehI(#nEKT<sLk{OLd3i@_DufemMQ0=}!k+;m16T){^W1ig3aE><j;b zU!pmPT0GZa+IDe$AT$3{PfvyVA{AsE8gM1*v+OEyWgt_h0s;M5F5SQ{yTF(n&s+Ak zktQ-FlOB-9*Y}{VcY(DbL4PXn$8dwD(Z(H~G_R(=I~+QhVoRCr%41sOD0MQ4@ApDL zG3fI4BHa(S5B70`_JQco{Be&2T6{lz^5F93bhSjxG`xvND$*dh2<&tc(DIvDig?M= z;^)8D|Ja^PZPivd8<h51T$%Fa+F3T$ysw$FWogiM@WytJ#C3VrPCkSSmAG5_iN7GA z?>iad2sS4RIPW=GCl7SoBQ<0tTf|oOSKtsEgK0;Hg9zb?jDR+9`Ol%ib)j{wocahM z5yowoF~D~)nju8rui)9`BriiFYZmLR@A)c9JPh1@lc0aq9;H6-f0QqEssqbh&a4O3 zpDh<NXO_SG&A+u1T6f9cc4hzK#oNG=8jP|>Qx&E}x=*i>r_ltdS8kjcFccvuB0Zmx zoAD|avt47N;pJK`FzYC!aEnD#V-8(8B8`-5#GOVK!yJaZai06!8@pG`lKqcg00ITU zDQ_3Ap;rMV^(JpMYKk0JHYz^+dG(Y!4(`7|@x_QHrT3qD*O=yLe@qtK|3|;i7*pnt zNuH~m{h5L{)bM0E?wb13+v?%=saEx@RqE{efC_qfZEaD5Y-H}wE*u|@GI=!|HS{yE z7OXQdQ8vBXsoeN=J-vAt@M9iLirSYbP@8?KF0ng$S0N>^9BBxnycAv4mH8qgQCw?# z?@UY70y=*dBZ^)9Q57?sBnw53g^>)&*Q$0D!|x0etg5R<DZWdKxFEUhI52+d^RTb6 zsN1gb3o};7#_)Ob<c&An`PB5nj{Bsx1A~Tu8&#vIw5Yu^!oW04-^HDQ?hCv8yIk*} zSK;<I90-niL;&?R{d-`s2Rvv9{zX)5j{kgIj-60x^39s_tu^9QpFVa;W7x8^E45d( zi+0ivf@d7Euy!Fp-sDGfcjPwm7Mlzq4J&qB*+*Q6o-X^7M4PK);S+sS%<XczhI@dJ z+&kk*ht%I6Uki62LQ(!Bc_t|}<esIp>`11x7(KD06Q-p5B2JmiSE^+eO?vd)FVaLT zitzp1@S_>FNs52|gUwpGWdtpQ<lrhjb|ppCdf~v*Gm8+Y>G@%1c00qe;ggQWvDwCz z+GjgA-!o7=GA@vNmv-%lE+L#WUU4A)Ezoy8E)0TI89JnSlL^qSBO|s_d%bNBFAF&k zPu?)~Eskg0i~M^>CPF9&5z6fN3r&kFZN8u8fEVl^J2*Yy3kL)K@2*In_5V{K*Z-{C zBM{MNfIl^8ot)s!-t27%B>A5<sL};y6DaW4%l+5Y*`4;l0{<m6*}tLt!1qNLd{>%L z3jr_4vn5lB`I`=7cq)eJCi3t3_7MD3q`q+k*zQE)?DPEAkNf#Sc<hPK?$j4+s>C1P z(m3;cmk;o`1J@SxdbtUFdtj&ImXr;F;V7^vD(AdsomsWXmwF1)%^j0MT$<1H6PMCV zT<TYo)L#952){-~M=&7)==oV#wb3ge+zK@Ktkh0&I$#mA5D&qwq^fp-p+@wF3D@2* z{*~V!4G0Z2U5-P8FSm*Y&sj|1E<wk=oSHId8(8x#=T^B}@6TR_*#|->i}!J>E3=T5 z!xcNHz28oOc5H-+MpOdyZUD}}60p3Ps6vIAG>p|p<Xk|$7rFS!`667=Y$raJ$ZB-= z^)05V$7GWJ39Q0OM5F{eFSG+W79FJkQPbcH)8cQ_)|5mhRi!OrS??57%qX_n7zH1_ zHq@ng%BAGg8)sZeYUcgId#SPVlg*oP;g8)2cLxk-{$=>dUF38&<Jr`%^2APcR-?~e z$?Zn(y_xwOao^5eBeTDc0KJi)?@6d%*8j9|SKZZrR9$r5rk3rWJ#XUdWD0nMkf#fd zBjAdP%|{lP8s^Q6-5z58X#8Ylmh$sPA%-e@Z!32d^K^pukGW3lfgWX0xxR=BPnqe? zP-oM8m%NEu;pqPJhq-p2FDnJ?TQORd60jSgHq7Zho6Y(#w*08fZT@@XQPd0^Br60% z^G9bbLSCm$rStfpO~Y;8nMCjMncX}|@qdZeA^5R<XAEa)04am8xc(6E`ZQX1lfn|G z0k@38OBlHxa2&xXbzC}m^M3e$OH1D5b?;$)hzUjb_ka!Mze>l7{7I;(+<NQwN8W+p zXO7__$^9iGFVubsWd>~~-{g89j{fM@Q56b;``97s;=SOuyx}c*(1Kfw1R<_SU_6RG zj_&x1=717Oc;<~_!}^kO-u=uRqdlKvLL$;l=F|s$H)%~1n96#%svDx$##g6Z7-e?o zG`sQ-Q#{IkRRuNt3?rS+<0P*1xhG{)uAQy+X}Ii~;RTf-0oY-B1yHB2nETGhRzMz+ zHf_}P3b@MSW_1tS`C=~W^-LB(moL?5bV~z)uLscTDY?!c*}J+f5)s6f0%-OP%fhZd zKhv0_J2Q^?Y1h)ULhtIO7qaZtYoin7MXA^PHOI?z{S8)L3+eb+H-EBF@`n}bFIr*y zs^KYDlGf{h`O7BVEzU^Laho*)&s>YZ!!<lBg1v`=IK+P?UImb9n47p+!w3VQGY6y= z#WQo`Go$A7;??0@_8a*STo9^&p(ax{xhO{1kE44bbCh!EWVvi)$mp-gN~G9BPtVsc zoD|*4Hk6@64nh4uI2}HsUuKJy_H#(w$PguPyb)qgO~4YHa`CF`ZW1l^n9?k@-$<@g z9qiUxR>R%c$4()=gB+Bh`ITKY0l%k9&(Ah;UbM2YvhY9IuHN~i>c9?NNV+-Bz4+IQ z7@%&v8@s1_%biOr%-(&0lj1XVX@Cyf^A3Odg`Mhc7ppcBWk}16yVB$58C`WN$CP_F zRRv-e=s&Bb_m{@_it1{9eDI+@V)VXWnfuo%<x<CqvaZblO{amAk|swCZScEadK)JH zca4_XM?0v;Ft|+gxH>n((LdRq`*pTQ{!9Mg<X@`nXHcDrbvtTZ<3Dh?ZJ2(13#)_< zB@9RKV{*{2S-P|IJ^_nuJ$@h{-Ur&arfOYVY9BdAmpRffx|Id@J~#$<o2tS~?W5Y+ zAA^7^mfTlObj>gcSe6hrgwDI``r4toiddgZ21bwUcsGTn9}NEWI+7=BzkZ2~$V`l- z8vxsYI##UL5oO!oI!W>SXRSK0KNSy@{O6ZxKr9~qM0O1mVMdj{`-$UMd9BD?NwOax z$LA>l2hFGu;-}B(RaQq$p#eU5(L!?pRqSqeOCF`l?I1r@L=8VWklLX-dD6a+x|LwI z%<zy{$>G=rbzQ5#kelp;`v$?2*arM7WRK^W%{cIER2W`pY}bYOlxKhL$?h`#9PX(~ zVHwXX)%Svv;d3wCO8ij<MQe}Gh8WI(?*=7;FT>%xX;rsU#p^UrLJx_@rj{nP)T7JL zZ%P3Zo->YyhJoITL8x3v@NwCfQr(Bd5s%Ngo)&YOs&AK!x1`?rEgKoQhcUNjQkZHK zWUBhY+0B}76k^Xw@a7Q>b$+yRTa!TVA4PVR1^0+1dx`sw(eSFxwK=wx{E0E$(wv}@ zSNaadJJo0IR<cF6v|!r$RKom|<?RRGwqvgkrcK9i8(^tr>wgz8QK_w6NP5vIi&zaA z_iz!Pq;1B%<P~^=bN5&+Hu~r+$)g0+sfR|8xNnj}!t|vp?Zo_nz&B)2(e7)H0<D>i zh+tBi@i92jIEu8Kl|Om-kpXfV2Wi>>!z{_80Xp6TT!L*F#}M~{P;3q#@l$)_B2EGp z7%wUxE&4h9N4BeOVXw<{eu<-)v)-!(4u&k&Qe+eXXZ?(OfhjZ=FOYp_RX*E@N4r$b zU%Z%aCY3^hy2B#U(c8wCCdxpb%?&l!Gh?6pO@_L4YbD#W#7?l(ROp05^>{Vf%d~j+ zvh%^Oj~_mNt!sTibPIGm#;fYqG~;~f`g^Uk@Yj4py!ZL;w8&PF*BdWWw=U|%t9>6= z;FAl>ZR3N_9k&vaeT<LK-ut+kYzcvB$!{H3qLm7wd~I*alc8r&&HE;ZlQcDR$Tkl= zhXrRLbwB%jbvlI9i1{!KRnJnrIqjr=x#)D0fTU~S!8Kx3yXi_*d=L(opQXN6gt|gi z#;b$Cwff^8L(*`s9er40n+j*{=@1?}WXG0jszAp3hA3@((5k5BkfEnBCv7dE>w`S$ z3&xyON3zx!Mm~Zvw&mmA#l_B~ts2x=g|jP{0g^A~)BmzzHh9>#%(^13M)Pr}lL(v_ zEO&SQAlRqb9MUbhU|Bm^_D`%r+7tftZ?KX!Ji?|lmM#hho2<Fs>~w(7vfi&puV?c& z?g}PTdG_<cO@q;Ei`aG1N%ikl|0@g;145sW+e!-;zeM+^Dp!E*Hf&+g1O!G0jR!3q zkz~wLzOTasIdeUekWDh+zww6frwbDLG2lb}_&OEiw<vYS8dJ{^1v$v0H+xg>BS{FH zsQ%?Ph&lvoAs_$^=RLd9{}-{|{{g!8KNVp9Uoj<cw}Np%L=&)IPiyY`5}XHYGkzTn z=`-EjYgtTB1XPzHUF#F&CTE5MuL*tz-VM0`7`XJ^mDb%Y_^SignaB2Vn!25#wA4p0 znrO`Nmy<iq^f?cHL^Am+->~7#c^4AZ+ew)C!&+ECe;HzdYMA`H48z~3Q|jt;6m-!> z1^{7j9w3wl2iNB2$T!f{mZn0KcOO?##`k+FBq_I%NEytoLDMod2bXgEV?rQJ{Q&#{ zJvy4wXPe*RWBv?)IVA%x4*9X|{NSk`xlZ#)Qbzyz9drBI<mmf*ABB)C@`UdT*xQBD zIDbCc9B<%l%Venv!ebUe!PvU#1?AHhws(*>5}i9psQ}&o`jAKpXG>6rIx642H}xPO zRAuTJDU(#4Z9h$b(MdEAMjy5j<p*EBJ-VQV`gVzL<ao@yE!r|`ANi&PIfvypFWq}f zc-8}2@K6qJY=xnzq4Q{e{_9fMD?&0v-AcP?o^36A=J{OzuIZAahKyNS0y<B|E~%ZG zpGSbB%Szy_k<fN=QJ#e7=J1XM-XF%u|4u4a{GqU+|3`v1^FXmVy9+dF9#Fne8zp+2 z$@~fH3Z3R=4qBr3Ks_Oo!avMR$+U=N7jb(leOMFZfed#Q8-)D4vHBtq^_{&0{DhdH z@=sfAxd~Y=>JoRQ>C$-k{UCU0LXI%MuZRhaG{Bw0%1vCR5qL<=EX2d-U~MB0wOxMv z(a4FESq2Ln!kdzF!sOu$V((r&W-{muRbmd(ZDR5U(hQ-TckOq8Qv~1Sce0+WDPvS5 zFMXAa{$^qk(8iw^ROr3?4%H2kIGsydCe>RF?`UT0hUcM63`z#FUIiR|*HI^>cESEB zrqo0n4sL97*Gi$1?e9Wo+^PoPTY4^4Wf$G%&Hc(GDHn?d&D(nZLd4`}GC+o7MUqUU z%CH(ApSOH(tg<5>altLl&3d)OMi|eXv6Bj=5WW#XMKF;Mx(EgJRJWjyPZl5rr#Ki> z{gxA1M(3xOVTz)Gm^){O)joj^>>IgdY3c2RWJt-O1<2^$0-nk5_ipqVmJBh5b;W2l zor3U7UXww_b^8q<>|Sgh_5^>q=yH(B;1rE>zCA>#DRtCJD6mnfOw~9Lad|<(E!Jw} z+H_b0eV2zDLD?oGw=Eqoi=Dy@nkMpyXK<IIzXo`7&wh<+%AC(7)0LXtaBE_HCQP3h z&HDEx65<!*JUArVDH9b$-y{en@xo8P-N-#VwkPE?8+f035`l`oxNJ(7WZUS)*RS@C zy*@!71n$Rj246t%gK(;~c+CgUz>W&MY2#@C<aipA0FtjPltRsUT>3n(CSnd8mWui5 z6U{m#gDIQtalq{O*u;Hj+L8_$h%>n*cE0SfK63206i%zXPMi#$ZxH5_37C$~&dq1M zcdwTX?;CGAE`5I50W3EJl36aGBl7%6Kge!n>{CR=cb#BI?)T;T3Fs0NnFCw9n}P4q z@ak0n!7kBL{e#9cgch?tqkG(4e&a)VB4}%h@v8a6ebE-TM(*vkcLrK=cM`8E9GLS0 z5A!&EdXyGIr{ZRc+n#QU<fZ#KNn>D~`v#3Za|ckt2*H@gUe7og>sL68%<3XbT60d0 ziCmKkJk3hXK-NDwH9oJw@+do6__Td?ANfU-Ng>WQ^2AEW%>Dj2SzOHK=b|c5E!MNv z@Wo)w?~!TDxV15zgS^0ONkupwo}C{w%b)v{Ip1*3Z#y?1lfBH2s4LXZU<x`N(a{j^ z!c<lq1RVr)Q@Xr`Y!#$8nXC|pw~uOq%y?<e?8ZhxnGj1DLcf?%(tYzVma~Vw4v-#3 zl3iW&6gqGGf{usx^)>N3iw8~9igmrn^;^%(7A1p6@g0NCr>vt1y^iB(<FOZqn(Ofl zuwSwjI!uyQ6OmrWY#>~3|3aC*CtPYW02^&zOXWkwR=<1Giae(mt<>z|znj^?xo5b4 zbnSg=qF2!9S?k;t(rBap02O0;I_i|aA?*=w8b^85wl|b<HtZ2M2Q6Z@qAajK0J+C0 z2Q1RdV~;-vK5oL7DY;M!OCRk8%&{{2cfVayH~CIR{`D%GNn9<x<(Oi_8}{y^brP#9 zocowFGeu3K9<qPU=m;|uP;We6W1lT=;p+2rgl><0(f$C@?U(*aawxH&W8Kw2>4}6N zro|+bP66*3!_t7NA!6lI0%((u-Q<tYAzNlhwv(#wN=!KqB@SMOFfUy7h`XX`?c_Rb zB+W4=!6a_WNQhqGVZgwb!ejebbFuHs_VHe$cn^N2*}&!g0mYJzMf}KXA?JFJ33?z% zI87cm{6650-pQNwX#$_LZnbwTLXN|eHBl`N?<RI8_b&)u=oVh=PGekWIHP|&zHE8= zm3pfXldlJVF74MTeqhEiO0Ni9l>hzgC(YO<E$Uz?w@o^7#E+P{EDgyks*wtxMiU32 zCu5Pf8-u2=Z6sn8!j4))PuOU0#Vg56mlV!!<aUOej!Y)1&H3(C`<RLe;y>??_p8(2 z>2EDe5WC;~oQIiPlgV#_aV4yf&8wR!X<m3*=<JPyCJ2q?DKD;}Ws*LW4tT98xs$4S zv!x~j!kHgfg*zcI?n|fKGy58Kl^XIWr@HGNwT28Jqn&JN&&yJcf7vvp5xnAI+wxQF zO@ZKtCxX78Z9W#d3<ZdZD<;RLUq+Q5RB(u4S3QhYOaKsJ#AWb{(>!+a2lFuXgC=<e zLc!sfD0PyPhlw_Fj)FTmL<&7$*CS-JTa=jvDVqJ!A}7w$3K}Ym^{@2+nuxK{aoRJ3 znN@vm@{LTTShwQ|%F%_d`H()p0xy#p<HM@-=7G2&r1%EI-<*d%CMv{^t#sE?Zr9mJ z1XOEMyf~5YVV8KDEQyp|C$JC<xk3^H7e6&B9n_Jj{>zU0erkv%m=#0{RE;<QVJu1% zQ8zv9X^ML~qqeMCFOC}p<A;-nsLj3Cy)*ZinYP8VEp`tsx`Z?@B9VlG1rThckJRDE zC-m7*m`sH8y|-&O_7OYGV=DyYsaM<l67f<OzPp9@_d<OSm)B+661gs4;>Q@Th+5pb zAB}!Mh}UfiyH0%p)Sy1t68|A7)G_01XDIFq5d^>~F|<gNUae&34)QziOU`OSx~vy* z+j0^|!#?{vxktYyQO(WX8k+bz5(kaf3UQJ*=T+J~p^!_iStfvi8vVw=3Uu?blGn-$ z$Gk7GnSvA_^y_efv=r@Zp&&E3My2M6h~o(So*ohYC5}6z7CluMa)!lUxH5~?e0Nba zk(3?jcw3Z9gXyqi9l_msZn=quJ=#YbSg=RM>gp$oEu@?K_kwLWVn_sD3qJjn<W^o| zEIxJ4$0^P)m0UVP_@4dw*p<Cy_~_z!EL6sGc0;BSsC`Dp_cn$ShwJbcH=z#~ds2cR z=VY@(Y3Z|5oe82>J3L6g^I5@;mY{re&c|T?#Syhn7#IK30f@A}qQfXv?2cSYkI+$^ zL9nahI(m1b#jhQ4c?QonPiSsfu1ddJ`B>t$ILW+;*!n8k?1?WMI2i;Ag9<ozXwS(n z7=zIv4aj@$Gy)aZd}K7gY>zk}HnK+epL1mTwaH4OlM!INZkR1p;$Wb?jUL1!X?JWS ztI)FYF?iG2{nbMCj&|<FGzfFKo|r$G8R^|-TOf%zgb!s(ZfXWhjyFP7K%P0>Ek|e~ ze*YoySc!#Hco4>${3f%s{}{N`uWDpugi+G_2O=T(t1pYlUawFtdQ3-iJlm*;j>Qk* zzn-d$hSBje+~q|v;&7mf^~w8PFQkDW<We+1$R7yXIt>f%jj`b!n7_ol(R7RKF<GkV z;PXP{`rC9?5a#OzcCFKrW<rBw{1J#OLLvgSPYCAsV(~#Mmmt5-$IQW)<<YBxfpjL^ zd0z2B3uXn6`{Z;u#K!~#s;wUg+1QK>TA2fOD^G?%i<mxpUi8(=0D)(xuya=Pe!$%p zQj;OE+*d&&{hHSF-G^zWRUjRjulKN@dC_ZKxy<L3GAAw3OCL1|6}z$>Vmu}VCGd#7 z_a6T;LiAp^j3o*ZHFSTanCKjjrgaV2uJ(vIRw6dvl)e~?Gh<!|+Cn^V@8SmmmE}z4 zt4$?r(CLTH7ia#>FCkSbmpBx{f|mvjl*oTpM-4sei5&u+H8n-=b(TZt8h*7<-<OkT zV*M_5Hl_myPg^C004+-H5SRy2+&;9M!T<9=@qNp0yfgLe-=Kb2jx72?+#eExGzOrW zowL#%AKN1*b)OT_f_^0xtfhs?oowFs+Un1u4}0*0{6qAM^Ds({sgkJ9ja1-$SGiHe z>Tms-;Egzdj|sip(u8m?f3(jJ(#Pk7-Ig&g1kZ9HT8ZPCo~VPjUwry-{rx}IbYNNt ztCY1L;7<5&nC<c3WCHkqw+H+m{L9^CL@)v>`u^VXFM8L%88g`vD~}>~Aj&fbDiIQd zY1AuZ1YG}?<OvN)d7#(Qfnp_E(tCH<@`Li&hxWfgE(!uDLKXv0fV|Mlj#vB_Gr=uZ zfOY6T>kN<n^Fp2gco4-ZcN@+oOcWx3Ho{tx+EW1)Ly3<d0-L|+M)?~=5NtOD3v>v^ z!JGjHKp)`<fI?~)XE^iT1Qrtn7W<Ey2%owvvDa86$@7k`)WNs?jRwI__K3(3C-?@; z7~V7c0&?^MoW&T^!yA+F$rI?VSNweIvGNp_siryi?5`pQDrF~PVD5<>y(fUvDB=RW zZOCFw28sYi+J7xs-KJZs;m;Bts3hnbIrlgfJP}{m&b(&;Uj9uH`Ne-5*Z6q#8Lyf1 z*A|V^`hdxbn4eCQ74w6cp-KZxB=1%}iRJ;f>s(rMGI)<jf<yASU2PffRmMRv=+a%k zTh+gCS|~d2IjU|asjy*!$6N$-L(vu}h9MEMAZ*1B@k&1vHzUZi149fsWrTUnMA}_; z<F*Oyvj(YY81Wyf;t);OKS_85O=7D@8F5yR9F6v!NC-$cZE;|5*(hlkEzltl60sAZ zO8hdi`MjJbn?zNyLD-{m*PwxZx5WNta@Y1NguXr*?cRR?@>6yLikLuUr33sU69&2{ zjU0$jcsv6Gh!C!{HwP7~BwZ1OerF40rnqQVuhseMQFlK<6hpf$nr0LwM^DcC%M8o) zV%G%-$}HdRWUskDJ9UKjjh9TnmiN^MCItK?9#<g8<o%EhrZLw|d1=cfh3g@c3)17c zv#&yQ%S^`|X;80_;4%W=m!u40pCR2ZVH>@&yJo<-*7oOO_reTv6_AfzgU2=P#8fU` zeWNE0&~b<l+A<Kumw;5(2Qz~<F5A~*oshfK(5GPT=L0FT))xLKJE0X*UxZ0?7D3~3 z1VA!XfojAoXQitjQV_G^R|FMweV6H&Tc*+TaLmoCb<bPyE^5Qfd%%?uc3YS_+tD8_ zWngn0hN7k^ZQT0?6HaCwZ&mCAqZ=}AsHFLz&o+%E_ho82N(Ws?31|Q;5RYE_7lVSa zT;c2xk|FM{uc@V@6{6g4brdIThb%5nD&GC&Nmx-RXv5ffUK_|FxOH?cWHUXNKJLlM zgDYNVn-dq_sSL2O(l^`e3a(tMVL%oiUm9G#CJT+*UG#W&JQG8o%{Ub>9xUqfuik<k zsq_2Sf$#n#+7En-LIjL0dI5EvMW4kWJGM5;@*SC@Vm1CbU9ob(qn7CjxPNHj@PfA& zekxbpezzaA&wMbc@RH6f_Y8#JW3&5Jf07ozUuQKF+uU+Ig1_{@%N0P}5x2MQLOdsu zyW?UX%6Oe9Re%|P`?Z|p(&F_W-vzl`?S4aWeXA6LT&2-6<CoWvMF*SRyiPHHcFVT; zAtq^?%mLVlNq!6(_VWTfe1U3U<h*jHlxx}_OUZr?GNa&HGe&?W-~H14dg;JrUd~ot zf@C{S<y0)A-TccKD*a7=nQE?0w>Duj)Bk`VBKh*_y>^X$UWVX^W}{H^Yzs}_xCVJ% zZ#0AG3rgC7%A}@M_9Um^K5TVnHVm4cx*tZ02T~n>HFJ7<`OuZ*OKz@;kH{Y}5m_$L zbm(Y_roGtnN3zui7M~TaE|2HlUPf<AJcaJY)P?n1QV0)e#upPe13I#&s0BvBlktft z`h$9dOZ3}r#<d4ZWV=4zsqhTG?rHs*`oTqt(8V2w=k$ivOD%nY*x_=Eyk=Yyysx{< zN58v8WL|&NVEXSSXC9Y1q=l@9zoxa2o@_$%H;WC;dL4DU_%0Trg3ypahsN7mBF$%g z{J8Bw{HZ2)>`84rMD~|o$aY7ES!&iU5`-U~Kx_tKogJ-5w-CWy2<`ZZ902Umy2kOc z{yYC|VB`u%1EoRSB>?|8_^MSAJ=KrT+1}$m$OCK+gWg2<qzP;Q99DFxMuAqk=oi1X zjG{>wagHwH;h2KsR<)E&m86qb+@%-H2gW}te6_(}S1atI)L`cE_Z4?Eie{6YHGRLt z@5eSf6QdrryI6R?V9d*5AmJ;F64My}-uQ;1Lw;-~!(*k!s-{p$_Z@W43i~T5mU+u7 z)&%>0V2d$h%b1d>Yq?(OBCnM|(q~`lGcGQn_M}W_;M?th$-kZMwwtsWpA4H_gVxqH zTVQ2Y4eCV*VADeb(ISv(fn*odx@^5?#B`FXy_pO>y>+fHc3E4X!o7xq+d0iCi;w}a zQ|oluMw4#lfE9Wug+m^aCk9rID~%SGb=7pm{;AgH5;(nUcjJA55Q|K5n@Z92cD2dc z8wb{QA&_j+hq$}Lo#6xbWUQiFdw7X@sBfxNXvueSL<nOKz{PZe!kKz+WA``JTzzM$ z_vAzpdtZw8+O^yfa1BpTbN+XnNx3p$TmD;9WgjR}|Bc|loqk`XgOX38V?|uGp&{*n z_-$t(*zJ(Qe%Nlqz@jlhg(baVe7BIt|5!?jWAZtXF*vrv#4u3A0oygsv1YABAszIT zmM=N9I$XW~TC4U$s{G>K%IJ}3_d^*n@c=u0GHRH7kzM3~<LADKySyxYb^U>VcB^-| zRrC&??)PGX))1A^*97l>G|8rVnYkH*ctE}ow<niUCxsDBjw0>JlpW{7kWxbY6mFGr zbLm&=R`gRFDm=|2@fjMZ%}r&??L^gn%e_+a$#W7(`15b=nTQqL|Gf|MjzMb`@JR~N zYdN~<Ec~(E3UtRquj(7-TP|kc%y4tl=E#F7&p9d51ek4`-pD?iXuNHFzWm3FPnrwp zH8R_Lve??XUD=iVk@rUi2HDeLl7yYHNGWaB{EO8hco^pHDmXK!>!-yQ!B4AOzwEcU z#b}z&2F&Ni#!5cqh$mmus<B-kznhG737Alibam9674R_V+Fsa-)8MIAvt!~G8R3w* zv7^}<Lvnk*K+(@0YAQnF+PHjqpZrHKz;p8Xd6Pn+iG5P~Y~2RF>#e2W#yVnd2(-PM zza{$ooJJMezGi@WXY;xG6$Flt)dh$tNd}yQvrk(j-rq0)nmaxS%)E(f^Z4KF!u1Mi z^3?CD7&_-3@=u5|lWY&4bMGf4lX@m2<5K%gA|Kx~IGNd{KG~ISI*C{pITKc)yOn9U zckzWD2O5Wpck9w@Wt`~2Lh83p$%2~Dsqr}agX}yXbCCa_*Q5>pOVz0AH<wr>WjT-B zPIj)#V^ZQ8U+i#t3l{%FssD)tj_@86<mJLc4)cNY=NXv9*NR3ir{hlQ{`p6MC8L0g zRxoJcZXqcKt7(<H?y&j`U^bDj!$9sk;q||4nK9TakZ|^l<^krwnmIdo3jApP|EY<j z0cd=)D;h_^zH#$tuA(;_<H2*6lb0()g+7Z@82YPR^*v6Dl%v45dSu|iaa>^^C)%r| ztB)*Di_aAJh%_&vzxP5N58Y$(HmjH~mUGa^!ot$|Q<v#|Ms<X^Yx=TiWlmZkHmGfu zstLn{%_ap#G&b`)%)nU<;mUQrE=guZ`RePx$Lmbmg7m`)em+>9VLM12iBE9-cQA$I zz=JoK&#=;o99|)xwCO$gA`VCuE`gGJ!?ecvz7L|&9Ew<BJa{&1c=vDA`j~dE6Vz$% z)ctS$suh!K#KSJ|t^oWX5C~7(re}Wt{5R4Cgg5wgQH097p9~Km1U(@@s{#oqby!&6 zi?$qn0;1@;KOw}YqBnp5YXJkC1&2!=L}W}<BOO2&?z@n6uK<qV*?l1I`H>Bb1L?dW z!FxYj;&mNhHNG{M5XatrLHOeCztBYFOVfWACjm`St19b%&-l*&UX#NAzuJEUCja-N zQVqF#seQ8CmA*_1%+m3i@O!+GW(Fo(DtBO~xkr}L8H2ViJTnfd01|{+r+w)+fWVp+ zsaRwt8eeVYRmcxOb~pfiEciZg^w5Cp_w^xE#!c~bY4X){hgx;*y9icSf39Jh-&q#2 zMA&dyXxfXL-t(3B{FSUI0F@KV3~}S@I=?O|a<n3cuCIus0ILpy=lJ74#E0YFs$jT6 z$z+v9ws6Z|s>9m)Sff=Vpc!{}p1ODyah)S+SYFEVYn+SdGd5jj;jOPx7GGt)5GLE4 zX;C)bW)0L5P=L}$@y@L#d?$7InlK4C!&RWJZ5>+judO*_<Vc<yFn^+nrur>^g&X-H zbK~+kZvc4vTZ7IA4m(bcGMP^AJAk!*KH<p7UN!tWAd_<6D+f&`L<4FiLG34#x>?Ub z(j22E&g8K-VmGCWA9|FKn!$BkV;csI^S_Sjxhu;OnKlp=5(0km3yV=vcrVUW4}5B@ zPB(T#f&r{?aJND#>;7-X%wUB6`8GUW`CP?w%u~)bzZjP!Cgah>4dta*o3yF&Zdl%& z3;+G+2Un#TP#~xmH4U^|IHDJ(%u4auc_ycDcfvSJ*naiao$(lM?Xroo+pHSjzJ3G7 z7bze;=(vPrD;eKqGEwp9LHo@KV6!)#u9b*A6S`NF#?+j3O76I@G#kUN7s+K?SnGM^ zeqH0Y^km{vdqyRf!PtY6tXHlpihLDnKv@DG5j!Ny6D8tGt)sDO2(u|vuD6kWC~8MH z;9531rj?X+r^-GGtiq^FzMsA9J^V_UF4T229p+=ccv=E2Ud(URPV=PczbBx^UPBic zW7S|I@^`A~J=*-t=xqPdrjbUc^l??K?whPsiA#~xk5g2+wcTUo5%34=Pua5$gkpL+ zI$1u6(>-SY<pcbZC8oIgWVPyP$FqU5WJrR0n~?RJZw7{5%Fk!_vaCgS5ZXocouh^e z44H3Pv3$et(shBUtvxl@jxvqtbyjy{jbuEM2g6bk3-;cIP6_+|U#BTyhYx5B?^SP4 zY!Pxtd9!?KeCUwH`?0o6{$NUpL$Fgfk=l^l&_A}`<tiAlTcadhzILlhaOeI@)6M(4 zgz-B`Gr%TrckVeL>XAGnbc%G})8Ly*by`q0wnic;o(PCY+o#8kW}I*fCR+jn6W|HT zN9Pfby;;;R-i>J&VMSy=r%ur$wWEVesI~Cf1X*6C*^6d_5`ABy7G?<3o=X90J%Set z)c=}h@}}GaqV-LnI~}0b8D`%NZ~u8>-$U<2J!;Z@Y6lF7Zha^pSd09qK6E1b1weYt z{)=Rrc>N#rgx`NoM0$kK3>cC|Whenhz2Qq*Gf(n=u_gdXDsaXBeUj880G4PJ_0aX~ zG|#Tv23E{k8E|W><`;}AW%~QNMK4i_P`^fPy&#|M&(FvVdv{BsM|U}?1}<{SZMTT{ z%Zsil2b%E<2z&RRC%NZmvUr(B6a6rMw1YL(fbH_HrApK+_jZ`{=y}u$z774M@pBE* zEjV})a_`sKGdr+N($Fpm$5TvVD=l+=s#B12#S(DucDjKn(9?`c)WxZT6G=P3tl2(~ zD*76fuKg`9JMxI&x9b_cW}m#rM&aO&nj=H|<*MAhYi<S;!liX({N{R%!0E95d@T9# zcaUa(;F7V$1i+zDDBEP83Mfrm@1tbvkTyD&75ZIr={1nrXa*aC2p7kQ-_h@RXuQb4 zlRCg=WAKzblTR2aPe50WWH$`l&&c=Y;D9M=uX_|RDyBKP<(u@?)B_M6_4l<DG&K2W z%De@lfXr2e@d;BWEGGmJa+F5<)oG+k@Wf$0lRBSBH*3Jsdn;04KG7;*Y2#CHUBb=X z2vc)~4-{{Oxt5SOJ&c-(y(PU2q)K_rdA=qkMjI8$I2NFHDei>QxJ=93-w_{GDvsS^ zJtCw`ewaTZ;g2A$jDBhq9~8w3gNy4r2m4o(tB6pEzbxyMRlgC*{$%E6=CYT`y-zZJ z?L$_(Kf<#|XM^<-#QJVL!YW{EI)4_}1;&%SrW}?zc7fcKpaR*0mxr<EO{%+j#`Beu zuA4cGsY(a65^Ecx)c%;=EbJ{$g^4fU;e4BkC$O6lk1TyDxN928>#&7hvLcB`tMQhi zZ}oB}KJ#QL75EPJ%J_zt4=j=Pnt8K*&8gX9R=E%>v#$0*^C>KJkZ3(STu!A9uehT> zufNt%boq)>m%lmZ{LyzFeJ3NfV)IfX=In)BzlVMk`9>Xr#>#>E%)tDhzDy)APU_O( z0-VN~p7}df+{*5u{4Jm8AB&4S&%3yGDL9vYSf2x6ImPk%CkA{?;S&z>%!|2GS@I=| z$EJE4r@aMn%5uy8V-=g%KN%gYL`mIp<u*iKC`P<Ik)X|>O@o4<J|zJQu|l>6*WJEP zlvPj0Tw-nX{a8JAn!P7?0@=hI_H`zq)m`ILsmD2Y&a|ZEtp+G=aoGK_&X1icQXk6< zR%DOndjPTf&e+81&QS<5nfQ65%ll=})7*^T9m2v(uZAZ3s@hs%8PA$j>*}Xy72AcF z`S-c{CPD$cie0lXfW4bm<nyHI%WB%5FS38D`Tp}Y+KSWIP!Y)yUA-R$x<z}a=VChK z0VB5=Tn~j)M1Is-R(PqTa`;&Hlz#j1WNnp9xru~SYI{lwIOp83>Uyysc^`UQ-lY|* zw$w;joeb`q;*d&jsZ)D*sGTVoyq{T!WFe;zRVxWN&mMjQOm?VME}6|`EY+7ipt$2d zPpWpCM_Fd?&Msz%D)CKGk9xBppQe0sha@}Yh3#_?r0)B8!#sKEb@a2T+zXjH$z8|g zo9;c1W&W#$3v?x%b2%J>3hu?u^=t|A{P|V=uJbhNXPEVL^_8`F-L*-o{WLw;+*<l^ z>=W~r*9}z3RQo@B1vkao8BvaLTp7di-{b1`xx5>E8Oj!+X8SRG`Exf9ET4ro+loGY zEJ`~=nkrPLo4L53Oryh_k}^kF-#uST+UEMC@VK>7l|xg^@3X^)*C?#Z#ns211oib- z+Y#e$o@B$jUA18`VaB!RhF_IF!`tiU8SkX_IaYbGMdY%XYRSU&THY!BmUxhm(=A1E z)`KkbEx*acZGL_T3?*yS+$TM9Ws%MqqMUl9hTaR?`FVUxl4?H2sc#21$j{B(b%gqL zZgFQ<kD7g>>o>XPknH-<t+Jy2c%-}PWZ>`HYSAqU_xWWkGTxfLL>7|8;X>y}ZYDW$ z8w^Ayh7I`%ECYPtmqRB`?lg^~pCnBiJ-U+erlR8B&wcAF+ErzVe=c^N4kQ#!7LkRr z6fjP88s_AH>Mpl-k_5ieZXXr-^HG&X=h@bPvdo1|XkK~PWl{r6iqBti#Bs8p4N_f| z!JK{0^xZ6o^XpJx(xy&IGtmS|R+e;W80nAE3MC?kV&IJn+vrGLTfXm4-NSWXAug0X zMLq6ypVO0|*UoO5Z`(82b+dkdTB?W}iP3(l_kpsbfrM0IJ4MR<NQ2?r!QLO5nH3}b ztx7p~ujr%mZx+%&H9}(-e7kke5e{M{cYlFZ)SVWd{Fok?Dy2+Y_=|dg#Hu0{IL)+l zkhO>6)rUflYB|JJ_>ui_QnP|)5ftH|GWm)7It3qFhxxmfpj5|<GucMz`75Sedba!e z*uR&K^&m%8-;?=9(MkJCteeKOi}7;$canw&YLI7o8QIurFJr!|lTt~<{UVuM9_-7} zMRt*tM<7SHzszDS<hsT8)}QssnvK!iXqKm9w?Wp_CrfA?u@pMUC{98k{(_~1`GV$@ zB2D`)$H%>|@n(iG62E&4%nKhSrZY0`aULmI)(KI@Rs}9Dra-;?Od?vo{NmIM_n%cw z$=7<04pEC=hN(hT%=R`OuHTBd`5;iDJ25|Fl}AwU`a)i{*_~A|(Dr;SkVj~qyc}9s zw^{$_1E*;!*jUXE8FGu{)j%sz((nA*??S3Ijz<{hshi1Je;;lK$V9bI%RB2>B%@Qu zqxFz9?Qoz7mjBh#|Fd254C4{UQs<l>1JgU(51g&qeg1B*wTkKwxMF*Hmk|*(sA`Un zMzRH5^UnlHUwr=x=0xQ4^=lQaZq;yb_IaFd-49SSvazMXQ!_n%FqQngb}LkDDx{mg z5h&ZARt)*B%`e;w>Ph?;%Hf;A?pu?J=L~q=`v=Mk+_9G}(OxKPXw9$?#}|%LS-kLr z#3k)w4f`EZ>z#~H?5ksctA!%jf^zA%jmzQjx^WwyC%*?tSN*b3_w_Z9oUTUgvV-g& z-65nDI&>RS0AA_MkJ?15-gEmtuiCzQ@UHzyzIO%YiY}_h%tbrOS$y<aWTS`>g@xJ6 zyqwc{{)%k%!$fv6ALl-DW%$XdF`w4Zea`neEyll#tLwh0TOts45@y=wa<Tr#$r?pr zs>zLs&IC=R)<1A#$%{kww*Bs7Dt>d0V_bIU-FaHI-}~i{oj`72m^qmaiBNEdj)lzq z{IjZHnq-UmcN~h>M+>8imXZ+X32*3tX^tv`@oMhu?EWE9@ooMEvW^D31s~kigINR{ z@3PJJg=}bBJ8`EqJ+2odM=cp39OWazbVlzp3w9~JLWvO%YPS=Y3K+cI;XN*7g}>CA zDP#R1?QNj#&3>E2zCD4c9;#4mc4Sb0-C0v2p!^J)vcdZ#_>I*q8C-o-(9EqotxJrl zMEv~0RLGqT!@f37dfc@3asx|+AFISDDmRm}CwP`TbB$Uc*jGr+e|@D(MnUfEMN|AB z@>hht?4O*6Z^a#vK9<1C((}&kcETe33|Vg+aW<GTIlP=Vu_`1{@w?N7B*2Sdc~$d& zeqfGc3*+h!UV-jO7)MEe3sgyu{*xHSA6RLfjrPy5iaP4&cvoZ&7g^Q*z8Tk8>rCSJ z&}s_^p@YuUuki|>jPI`biC+7e7TqrgtDb_}5bUJfPE0?*0mOFRdX6+SZ4m)j9#FOZ z#5OGoC$0`ic-RwY|7-!0!UVQuYlf5mvZ3lfBeDfTY=XybIe5^s_u>v5ELuSJOF*Ea Mpdnu&`zGXn0Jh3b5dZ)H literal 0 HcmV?d00001 diff --git a/deployment/media/wac_installed.png b/deployment/media/wac_installed.png new file mode 100644 index 0000000000000000000000000000000000000000..9f33f62dc1cdb5fcdb25a4220b1759083fcb9b71 GIT binary patch literal 13112 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 L-I4r5=feLNRJ=R$ literal 0 HcmV?d00001 diff --git a/deployment/media/wac_installed_features_ga.png b/deployment/media/wac_installed_features_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5537cd32fadd22ef42f02eae428c378a8564e1 GIT binary patch literal 43884 zcmce-cT`hf*Di{pqST*&AYJK2Kza?4-a)C-k={e^5K#dU=}o$HDFJDrgGdk3d*~8+ z4<&{Wa^id5@80*`JHBzwxOa^EM>4ba$XaXex!0O|&SyO{=B17*88JOE0RaJ-x|)(6 z0Rf>W0l{sh`?v8|=BZyL;KeN;JyivQ>QTmBeB+LzytX_6L2Uxb^_#o+_5)8f6CVNs z@}9q+TLYkPb_4{Kx73y74FW9>mMN^MHoJi*nh)b}&y^dD#l?tI-s${&*#cwi)_$Px z{6k95QsVbk@mGd!V~*t|P#8*>AvdMDLt%dY<Dv|`L?rdZJqeCqKtQPSZC+{#_D|z{ zta0F>7g?)kOMndXN%JgGcjsZ$S>0UQ_E8=t!?H6duk8aNUM&LdsEBL9BsFffzYT)B zLXSx~-2VCd^Q+lE+_(Np?)#~K+b^l_X#ADj#J4&AO6t22lz-)?cP}3NmCEv8@8HGT zLh6gYt^D4E#<1(-S&9V4>+`|rd?pSK$6WFA91)$Z=v+PVgH#b6dDFjUd5j>vgVsge zwnud677_t5?L`~Y1zfrQ8bi)p6i;Uu<$@3D*_fgeLgk8!5rsZF47f;<`K57;92$`V zg+kvGQG`EX<8aImyZrc&Z4f8O$0xHvniDJcj%vcu^IIEPG&w==O9?{z>$CWa#Z_R? zeN^P6zR4@`5Q@G8KX#AygQXPRLe~h(i>v(_&13^Tz2s2iCuN2~l~3ew*JpyE>m(VL z!93Xv!DKp0`P~Ia;*8P+J0{ByQd#<B^5!R{_m-wcCGGF?O`=Y_5<0@xrn0%>Wv4zK z9j{O(4B)j|@EMgVtE)?XWPdiPDaa)4>jZCb=E@Hh=6lB+`5!tec1H-`1gZA$K{CQl zwZ!xC-9vz_%71<iDURzboc+C9uDrl^=BVM}VUwgzECvOd|NiFkV4*D6pB_Kdf8MTo zcLcJgrZG2UYY5$-?GnZayzJ&u^|;cYV~A$PYsCV-K5g;Yt~<T1GHu)g-fRHJPsZPS zvR;vr`!%hP-+FQUG^p-v-p*i1ej>YxQx^NEC^?;;&3xxEl{h&7vEZ2Ban!m$ueMUE zovlJ+$2Ly&AAM_J5--CUfi!?WCe>x0aMbnhiMjCFO<VD-qxSXwWg<BYLXC)FO#Xa4 zN}nuYu$0tE?}tu6KXc-1`C3ab_5yD%uKemsQa082XZ-wOXCo2|lGH?8g=1?k0~pAe z2+pCQZS4VFxP{pc77Iy*ZHKHTGY8Qyl^YrLKa;wg4qZLoW0?G~&3E+z^hq1to|LVy zN`?hBy)d7j{NL9P)b2s5Mr=FT?UfD5Ao4_GpNL<c>~TXu%NCAN3Ba4?mKLdyke=$Y z@V4?avJBl8Y`>73<Z=`l1E+3Y6>jqhk=5%Chi$IR;i<`ar4H#3x@Dp2De|GV%C7v5 zXLB(x$qR%-`{zx3s+kK&%l7w_*qz5JgB|Kwk}bVM6MRP%`8C<$5?HbC`$dAG8zB<$ zyhGjt{&LY*agO0AWXRsdNv!em%}Do2u}^0P2{yx-Ia&wft!tEO#H|UwHRO8SV5HaD zSBxSeB)}#=#R>e~U^&v~?BdA<VPk?>@u4V%-0}*2T`BdelT|l%hKZg@_6HX18@#3r z6^NLYkL#x5sa!maJJe=p#wUBh-4TRDQKUoR$KBn8r94gg_5FF>jUJ}hpYq~QnM`sF zeyaF3dIY=BGW=o*k{LI16@2W&wlKGm>gAnx|F<k!Yn<wIXw)%Q>LDT#HuOr&^;y8z zZ){7sKEC*SrH#%~YrmK@t2Gxv$W5~+MB(bL?W^^qdVznsM`#(yp<J)gR~C0eAE|&- zHpZD`Pih&F)U9;YmBu_l0LVhf$}^*pL;cau6M|3!c2_QkIBeh)2%PQpY67=G@HT>d z^+nLh6kFLY7OA}(32fP@s|mOm9C7B#V7&ftlNC>%J|&!W5~%ueihS@Y&R%0%h`-$6 zwxv4<&*2iV+9FDTJ(%=av$#=4<xDZEo(ofAQmdLuq*gn+Ck@JAHH2{e`V`#X{hnw{ z4&x@C?9n@8%y*1t8!gf9%Xg|iFtt0SK!8L>3qlX(MOq*6=rT&_C?T~zKMq-;>&yB0 zUa)HA{B+&~{!HTc9)oW4R<?O`R&RHFQ-1Ip7KVw5zJhS@c4tDAg*Tc5_NDu!ORfh$ z6Sb9g5@vj}C|0p)A7WG;YO}{7wWX3v!OT{j=YvT_HpIf{YzNZW^lp>hL*Ii@0A+&V zLoIUHfZgc=Me;EJ4{^SwTk6q<HHu$~#oePNW8T9L(k=RhgNvO^$vF(m?oPoqXjtnf z7X|e4Osk;M2_u6nEzJp!CzJ~l7nz$yw4_^ndha8}dsNPILN5HI*f`uJZRcgZ^-cLu zL!)BeCZ>vyAE;#YKR9I924u~WnDQDY8C4`|Zf-h5s#wLpRPi^uC|JtyttdzN1yno< z%Kexd0(`oAZIjzHU#-(yy_K8qv|8oItr{E0-BuZ2>Te;(?yEB*rMIQdEUL|~kp`pI z`zAH%rdMGzlGW&E-+ud3GUjDd%<s-OwgOTTb9W)Jihy^(_n6|2+&CUeBFmd8mYXXh zx4|3jF3jOE?tJnVTu1$<>jvx*jJf)Ci$?&FYkR7tWygWwdXqRn2WH&0q@uABxD^0% z8?t{?j&xjk(gXYT3Bm3@q73uek^7i5=djNi6ep!)KpTDJHbu8IfQDu!l(W;OHHiv- zsg=-?FTV5m4w5Vt@zZGSc$Zow&i9?kXo@p`l!hD?)|<T&l-~9;dw<B&_Q@})cd+N# z$zEo*qPzo=(3h+aeNWz*9ja!u&2DbJ%$qLMbEzbAr7D?xpzBZ~;!q`k@mF_|+V2`G z+wUYmFcrpfMqB6(p#*k0AJzrVMI^T;4JLVOLR|qd#6y;^;VB$lOcNdxJe%h<yn4YK zUxa8gz;yv!X0OAK^;Z3zmH=nwb?&06#lb$C0z%r-&dcYseGRgZ?)T4FSAS(d-pBW{ z+drtIE0^G@>&?n_tV=T=a98hwRNimV{g7NWdw`f+q@D8hW8I0EBq<6isJY`eSC*qn zEIgVdtC_A}J{WwP8j_v2S*=eq5xV!)Z{pHmp%3KjfqAAEuc&RaS}y~X0$-=r>x}v( z!NR_ganNeh2XH=!hX*=JqAHF<kGEpA2UK*>-G{5VQG^efs7>`1Cb2S&slCHxi3^PD z(H}wt=p8_eqfOP(Ih8QAqtE_YMh@9R{)5nyQvV<UN;=%>P=?3NE&eWd15v->Qg5O% z__mJA%E=wGVl^r9+)x(6BuwY$YReM*?oqpe&lZEL$CWWUlN;NQrS!zN8$}7ujnVfs zrkoWiSOEPht&z{<u0@vxMK(q>D5;C2<KkU@r-o#aRjsxN(WjC4WsZ2q>(js{zLxLS zk4`=|Ii3Z_tAN^Gx4?hHWR^6@4~5uE>I!rapJ#cw?sYs)0n+odj2?>;S<Nd5=bCn0 zM<r{;(>rF5z8ntdm@&1i9#u9wM0{ay>f+dcb4z?C)T@6U_6zX!Rt&pn2SC$Eg+bvp z(C116;m7?R@N^)?`gm4<v^XvT-Lc@WVAE{L=d+Uh=yQv-=Do2X-ufJZ89Lh<eV3xx z?;l?5YoznZ%hT;WG@%e1a^IirU>5A!ixTR))IBpEK}TRG#{$HY6K(}dXm_Ibvf+Md zhB_=FZmXkUUR(3R5Bcmlm82;jf_um|QrGJyw$@p~13w=8h{$L<1iH8TeVWX)6yA!e z>>R9MO<9=_IGS^>8tc&dM<ty5FtCe@(tgyq{PS`~(jiDv5LQOrQZ7<Mv-?Zt#SY)y zra1yqH@x5S8I?rWhjyN;vY3SS(kU*eIX=4@iVI=nY96}#9Ac8tDCWX4|FkuDGz-ej z=~{r&a=?<aUU)re@t!5f6zn*(*{tdldn6muzaZt|tOw_m0Z3&=Jj*L06pEX?PJGDY z?8COtlQJPU{Vd?YB#NgbXKN@H)ZT1P#}+#rlnm`E*)BQXB58T3zp=rO#D2JHOMlpj z$daxp9zaMxRJRo<E$8jf=HyABN;>?pl>nvOCT)<?wcmO$u9lxFThl_r6SY#HbM2#Q z79A0CY+tu4*p>0zR}Ido2nn@3i}I<tIzoZE++k|)0qie^DuXn&29|5YnTXc*cQ3Tj z@I%L(^9iDZh&0=tD6$MNzk<B*Zx*m_!tU`qQ0TYoPfD1l-XH$BnaOj8r8<RpaO@** zmSJ5iYN4qUcUJ*H9UAt*+XDHDWuf6&%5ve=yV3^!HzBDZKOgeky7xVlkOO#-+M_Dx z$hM4J=mKt!Nk_){_M0(j6#i-kzbd&m>e3}`cy5<lOH~5Q?t{7Ue|@$;BQbS!tnfa6 z#lPIWh`Ge1p_yn{<|%DJZoqxGQn9n_q~FO}cPL@WWN2cEss`o{XBuQ8ky8Wyn|pgm zsG%=8u4LsEG1-%47nR+T)FLqJU}j(h)AOsrcSkgM2SVHm;OD!P(`Bid(N06>z+^A< zeCGhu9JU_T3}Ki<<FJWD?)8gKac<n4Z21|{rKav`mv+d8?d11*69zkv$>B;cYWnDv z#AK(t-lB;M!yA>IX;uc@#Ui59)9`ep`om47D4KO7tO#@~S|{j$(-9|z4H-nvC2m~O z6Fk0;_to}2I#T8AbH7Tc1kC~ljL$niBtO=(d6M=$>6zM*ZQT1R)cjYuIDXAbI<7KK zOlcz)PDdx=C&*c;=^<o?-EZjAo1&;TSh^6A-L0Hj6wrQA8fjr{_79em2(F|goN@gl zQj1F=G2p)51BPAt{UrF13dx|9M(jp4A<HnxNYn~u>zE^v-dQwW?kurW=287??^lcu zf-~_Qy|6SyNlFdy)Nygla`vEXDg0~7M62{e4UFepQ^o{UVNy%%d05`1x<gQxfLvW^ zV(TPQ4v-CC$2o`tB0IKJPs+H2SriT6Y^Y<Mu;HdjhXpB{WMn!@juAa$#+jd;exIzQ zXY9(!s*cUf#GH;ZWiTc&_^IxuwC{m(D?W(5s+mxru;_Oc%Jnu@nq}abUUY4}mKGt{ zNx+-UF-OmPU8?L5K<&737ap>6k^$2JVi8M~MNG@N!8vJBimVr+afKD#<-UPu<W}Jc z?bDU3$^y-el@rgbX2#+6839{+zR=h^2m>!eMW68OFZe8|&UT<~WwK($F2DGUS)PUq z{}4h40eUhiy7hLK?^#0Ed9)2C{3l@+)!F{u8a<EHQyH1`k?fV?GZTI%k&Xf0S51en z*y)EPTpuO!IOqHDY8(bvZ0Au=03T|6(BDN(1cb4sKF^<x{Sw|_@9koQdQ~5rWimBo zfn?m2ON&ebd8zeV1&fF9wr)#Lt7n9t5uJHtCp88o4~BiC!Uq&*Q{}o^?uE^`XW>gy zRTXw+mmC>ZHf~{3LDBYRK2zi#2Z&gaxo>fK>|!3oApO?%7N7p`H}k5XP8chXi7a|K z6Yl`%fyjD9y^LMCr+%|4Gi(Cr3#WCiHnVFDOgjqJ!0e@hOh#8`TlRS<Eyi*R+jut{ zo9hQ|<ZgYXm~b^OjKwtS=LJICdo#K6P1eSOz>L7zo86>LD&iQy@id8*z>OXXV2*5% zFoR%ktYD{P=${j>jd?1<h4Jk|5ipf%xRL4Ez7(ukmOCJ;LZouj<zdK4Mn`OM!Yg>N zC@Q?pF(D=UE0Zxzfk?t~OICP^u*FB3I(go(Q~^l4ZkleUJ$%v!_-AUEOCb#&{)q{G zu9zA|D@Ni%?$IwbnfI>YtW@e2d?Qnc$6eHr)?~GJJ}VD1kzxs$K3~rRUdOG(^I(>I zy)H%$Lbzr8AyzHUKncXOrbjV<{JH#b*~-V^2ih{(=g2*=<2bGOQeH;yy^^$|m9Skb zU#D)5z(@v|j9Uu%S+i0g7P9D(CA7^O95k)NijNiK6MTcHIxxK2A?RYu7rC5HRuRI; zpS$PCM62(aBDY@vRWUY0U?fGVs+{ii@mAQz7(;*mS^dRw!nRR7qja%j_2<O%X?<Po z97!+4V3M0G5OaALtHe5I1qLtxZ`p@1@ZHn-z)a5_eBLBYv|Mm>%2rHLqerj<VAtJR z+=NJ?*?UH)R8=m+&ufvV?R<7n$Z@zqn7!1b9q5a=I~<=Q;#1;5R;loR(05*7-Y@Xy z0Pb+H%Crodq2v=h=<K3fY2y<G+BI%{HGVX!P%i2H>~tDRsHj1@O(s!S=yu60y_B?u z2PDjkhgQz;NjBi-&jtd*njaM%hPg~?ik9-(dK}lHv-E@=RapDRJ;8jeJLY9E%Ii{N zV3Pni9p?GLcioVfprd$A00cS2$SvT(2wSEYd@{J(kfN!>q;ZUq3O%29RF#&)ptiZl zgg(om&IJ<=x&;%X4&oW5kO%c+>FMcPo$`Bqv{u(AJrp%<N38{l7hPo3pWgl_RPibz z`42*EAR^(0KkU!(`+P>j@UoCU&RhwSw%p)Z9=ylh-OKdYQ3rLRw?d9PB<uzg>&N6m zdOtpd1%!s4bQ2NT55zOc;PI8S;6H?)-v7tgMzs-?S82L<yyHg%;ZVR`J%ttC)PPvL z>zL97T4a(1GyDe(BmZB(R5I5DAKCu}gL?AvFE01u)&ENf>wmL*-;0|JHTKkpfO~|w zWWg^p1{m>^TEBQA|B(ORkQw~^&t7E>@4vydmTTnj*&g!V+oOd#`{CXgs)hRm1V5}l z2!Q@7&rS2c0M`CDwfgUHx&ME<m;89a<8FQh5e#?rV_?umoyHGX%;jLlhuuWW=Buqc z&a#9YGf43;W6=i&mSDMlKgQR9Ve2oAS1(oHjm!X;YL-CUbb2^qhLN%E8ULQd{rsgd z6{5^Bs}RKAgfVW+)k{3DVB-gTvD35LU6(opfyXG<KBNYGO%<2hdF*pJ2wJ*8$Qc!S zoi`2~H6Q(alOf5x@JEgh_LMmYkxgs->-toaOS@yEAUa*Z;>vw^B7MGVVY(CP;j|vW z33mL>IY^q%G~WS6t&eF)&j*%%p^jrgf9`lJ7ar6Xy7=W<?(yGeg<#<>O4?RkYPmwI zmN}aJ?%C;|7wek8Db9}D9`{0&gt*5lY~v6umteVl4B8^rT)?<Pu)*7iF1w(n!2_F* zdqh#2)a~)*aITH2X2n%1F3yp=CGchy=wtzK4UCESjFo{S7EjWJ?>=GRv6kSLwYhwE z!^M2MFmjI&<QK_qH2q$QVi6qjB;ZhQ-q^Ns?JSFyz<O;^<|T2g0`9EGnKq+t!k5hf zjXTIYvtQ}$_X$Le0Wl-DhI_iqyyK339fMF|n8}BV8Y-W$E5`xgQvaX+jDe@?dqUfJ zZj#Oj!&S^oy5i92!aQGR(40jud5i2>hUHmV`e&8qonw#Zsh``?Lrn{k94H70@Mujs z4?RmeDYIZ}ma!^)b&&j&Z6IuWOeUGBw-yYsJdcaj803t@Y*FCgNIE_pJ(>Lg<@9>~ z{34G6+1+9~zC2SEiM(b0C+?wkqkVS#ieve{`!!ZqA7oTWtis<O{M5azD_Cdo(&pQ$ zg19;;W8)$2-9AiLIMv+u5TH$ldaN-oZ~(r}RwONFplm4e-gGIl6+K@I;K~IHFN}U- zxWPou*CH-cG{om9q_%<dLs}>;&I?%f)74)upc+y?18O{WUy>Vt_K2zrO7Xx<g}^Ld z)M)glhchf*)u=gzZ^$stL3bZo{R!M`cKY!qQySbCWwCHff1BWOGm<<NfJkA=&S%hD zZ-{r?$W3jx0HQkIuVV8D7><}`>h_?K5dqH50}=gZ0=4%>TS3b@yK%s!z^^w*x~||{ z_Al{lHG$RHzT5haBj^#IF#xWttsiH0*i^DJ4H^q^D0CdLm9XfA*_FEP<yqb2K3z(L zVe*!m%a2^2Ez(~uffoV!BUctD;A5tRx~udMTt-xJJR4{U)b{5{qLe?x7Pq)hn=Jvx zWJQkIyDrG?S|$9#p`X@m7No86U<Z~nz$nzvXTO8;tbyiMej;+9P}%2{+3<ZnD~c~P zpg_#BM7Znfehd8agaPK(i=_bg^sub#s!i)4R>nGq&3!L&9yC>B5b3Mp09>?86!5Ai zT2jnu>pk=zlGStO&cg(=p`#@;uO~ERkYx2oBKfZ7*J8pa9h+nBaNmtD$?<GSS2bYt zsKxAN8>*w@=tvN|A!Cf=K7Xja*QC`fCVX=<E>IV=>H!>|otUfP*r7XhV&4gnf{d=M zc?i_cryE=R@UqvZnSC8(G&|7ycHc`%L#G1dq03GwubSYdCOb<>9_V`Tj+RA)V6B;z z78-g;q9wTQaaG@|BGQg{+K5GRh^NnBz}3GsI?=sy;#pg-7xNvxmuP9OH%_*ZJ6mm1 zgc2bmL<7>4W-Ofzh)Go_bILXwpXo0$I!)CkIa&Yv0odcBDswNlGeJqkA#C>I?24?- z;78mapDTm3KyZw|=3rFX<I$V3?ccC(fx0mfnAz4@+n7tS8IC20D+SMH%<}pDrBmO} zalFD%*`#?4#+e;*<25EE9)s(vv=g*j%m~lS{xf{|K%C3uAwyb%<=*_>AyPAMJt}$n zGL*hGj<F;YT&l{map0tyQl_$ySDtXAxy-D=W5D}r^wpj$v?kMaZL1pn#r=d?*l~zL zfyHl-2u)OA3lIL9Vr&(bMt1RWE7;rR+m(ZnUV~j49viRv<_aM@7gMMu+coek9NK<< zIVmr_o&X?V1S5!jWlhsa5A&HOLZm-zROf^a4Z(~uxqfMRs*<M^yq6L0m^khK`QSXs z(*;SmRGX_R$M<wohHABaCOASCoJD!MewQTg&t$S6*f(eFQ|siLF9s%FpM+&$-nNAw z+#DV>Z9t;PJ!XEbyUi3aYBS|f4_`L>x(v4n8fk6Di!~h@Q-Dg)3ie+&e(d7{a~HkG z?4wdruRd7$KZY`v@FhQR@E0sU5>U;ipmUqEDqRV&&Uv23SaO|~gNZv{k(Isf5sd3R zB3~6b?rYsEI|_8&wq-=kSBWg#v--p0+7kbs<$BR`=(Cmi!l}&S;IPM){ThcXGdTf) zC+q(H3n`nW)LQeijj?0<4KyEmizOg@yxJ?{Yt&;lOpVby39CV$w$=F#E7Zi+?Q4WH zR4)=ddtY4MSOx<UkE#G3+^qdmS=oW@p#V$13a97PmuoYh+>IKo&T+-Xp0D($)$5q} zY+r0!+$@(BS10HW0iHtd)+JnvsCbrHUD*mj{YE-|-WtoPu|UQ}TP18T!#3p4o~wz{ zBPH*OFbR?9)I7GW|ED(n$suK0*+ltemUSw>naS{$bCp0DRa%>f?ZiKa_nLTh6HXo( zm2u4%o<a1{6LL^0(5Z~`$X@POyE9oGs6d^U09dL1P^pSz&4!|GFoec;N?swXf@7FX z$O0&l>KaSD!p;-s%^75|IdgtwR{>2H__8#g!<V82&vm!wO30J3LQd})FFJ!_bX3(b zzhfc+;&sF$w@5M58KeN*%1Z;Eo08{YLEL6lTC<%?1Zzsuc#yOHm$}_WUdyq^2%De< z!<%Zxy!-BMLSIBRG)Ogq6eWk5jvky<Sv|w_1yyc`FP;&Hd@K(6wYAH!Bmz2o<C>QH zhVf^qOGg_xpWf06yh%q%Bq+*fOV6<#z6<lA)Wu>)lIveva870Rj9Tl9o%=8JX1ByU z<}K<lc$Cl2UhK8S{2qTuBb49<u2$#bBWFT49s?RW{n~1TTd!)jeZW&G3$h{;r`P)- z+KzQ`<8CJ=>6rnL(Ata4V@-zRl@n8_?d>qmJ-_=?t}Kh!<V-=1XST7tOyQLDG0i)* zak(u{%0<F)I_~BZg<DZo#fh$0kOWz%a|-fYZLwNAVP=%k^+E+vuAKbSasZORk*^tZ zFE_nb#FfQ%pOpbM2%+L-yk)<!aK5KH|Na>=ZzS|Z-lVNC^czT`JT@)n2Ik^@Bwm}M zI<|Zb`;_%^Y^%xXhg73KVMy4ZARS*=@W&3j9ki7wR)O!qimyR<!^ck9`G-X*J@DoS z1YCuzw>JyO0zQj}Ufj6f?H4<v2xt1z2S6`tcKz7|wYAs5=@;EylWEV~s<XB_D{N<S z=T^_6U$Rr82SmU@C-P{s=9(-l&_~PFqvZzEDYowU2LyiIfE0t?@v3{taJ`z13tIhr z%&U7@%;47@#}PB)Itw^!a<m$mv6b<L7qaBkUmWd&kkvtljgT7IuA_-#ATN+H#d)W# z>v}yG9C(9{W4J!^=-3}g3Rsd!8Phv_1ck@M{Af2J!BN90V?IdSk<GhUfV=wnquJk# zCO^nI4iO1&bl50O1Sj=0J}t;o3jcYL(tMHtDoc5{vXE!o?>`#IL^Qh;ww<59%A?LN z7}ayk*oJ_`j@qRdhz`?h%vPCUm#D@Lw?;F)7Tecr_&e9lC~9b%lzKgjKmve4rkd-$ zQY*lt1?(G9N>b2pUS5Hqdn`$KFluETP&v=<$8i0IUZXg%$-mzGIfy@ul0C_3b)jL} z4I$aBts)G%@gec;b+T-(2-3y8F->+_eGQDE@vuZtpkBBI7DN3R7}(c)twhd*vP?N= zK*eSOfx0~h!pX0g1JDS+K7~B`AZZC_uax!(h<5BIWLMtVY??2-SLR(V$iH|D;oB%Y z>Xg&b;OtoG%{gyS?H(B|F0^lK_O%~wI<h?(*gR_47Gs_?>>zPaz~><NcBIiybW3Gg zHMaEGDlceueRj(bD%<&+kl<dU9H@X@APd{e!0&q0btCGvP^cVx)B;9t5nAQA$i-@p zjCzk<K`I?`YDWRKKR-NZy1CY!?6XP|wBFiV6_*e|PsZZLPA^<LH?M}d?0cr@H#>L! zT);p+m7tbgd7*mOz}_lpN)<&Ck9L6P+eh|}t+ObNDeP+C@tc9(7^~V<^jhTx|3TEC zuWDE8dB*CJ7tY<PYklQJs=CYV=E7LB&fm_A27rRYDpK<O!p>k1GRDv~UG1n%ukG*Z z&c6QW20n0|!^qF!l~zots|OaXY5eR0TNWzv%+UMvkPq9G9k7gnWV_yY|2p)`mLY;C zr;IUmVz%Q?H#coTChpDqyB8?p+|C?i#R4v5ZW=&=9pDGXg&IwI^-F{$U7&Q6m|JR* zNIr*OW><S9RB9a@+wsrbo3Y4=9>J@Au(AMVBOSObn#@l&pqjR5UnKw22`c5tr<~2+ zLML1u^+S!Dx}XV{#p@;z9r?(iZ?VI&%vzkTCGhj}Ox{$aXR$IJ_ou8L^0p6Z<8AT+ zW;<RcyZhN5ow+m(fPX$Eo^akX=FS(R4c<dwHv-La9Sh8-eMHTAFLpWo8il=?Jcq*e z*>O|)4<$0w^lR1Kc8A1abqkgLuzc~`{&F<rvS070Bn-#{13ft_N1lR(2BN+`-u#_Y zhcVZD&ORBX&L$}7n#y*IfJ;1>F2bf5$gy08P=zOqRXnBWxJeCwmc@!}xmfTuxs=2D ze^pzx={ujY))^+MHAo2NOSpgb7rJW(DkF+*3!jt}8~7PFl$N4x8)-651~(mpK6T%h zcK1oo-3g|u_jr}yu1Awgp_jqOMi;ORziLU51_pew)h&06yoz>*RRFvrp0&JRNQ9Gv z4C$*3X|=MO%x`Ge2_(IeT)R)53hum>>s=(|H#6opID4~LJ+O;S%=-xUTu_(&U2Di| z)ny^>086b1irv<>O$ojY(gLVtxB+I8+{pF~;rx4x+IuecdgIQy<x6xS-NiimTLR{? zW+<7^SZfU#0*iyM6TiuiolUc}T8`bm2KY(eL(hG={lXXzG28>D^zD*0szsY+XVlNa zM(oU)2U#g!dbH-$g_ccIk`sk7JC2egk2d)3%+i;-v)k=-ylu}EYlwMu5%V}cRz1kK zJs@e?*AJ9Z?1VJgQ}Au9bDFPNs+O!N2k=JqgoENbK4zz#?Xyc5e|MN_@Yhu7=$qX_ z#!e_<MjH=~CZGd^tdtx-9*{-Uai!+SIBK)jI>aN*=EEuwFcvQ9__2yN)`{<!DVaBG zbi|O4Xd;%$)sJCCpH*fN9G?z`U2KGCWNludhdpih!)vT~cD)`MWz=1%F8K`|m&B+l zcMWr`$~#qCcU8<7?IS<z&h{2XWMvH?>Qe0nT}incdw<>nUCpr|Aj8^q^RJ^SAo`up zqTP~*XF3}FYU{rA3Rf0~@+VOv{Z{yk)H}jn`NZ;#9W^4FU%Ui(1m!7Pe&<v5Nm)G1 z0JU=bu1!yzV{1}S2^H0X^>Nl)znV*#h2dXN%y%^2$_oexWXVC#4bXgqntZhGh4!?+ zAhrpcud8&@6PPnCHMUMZa(2t<dPpo@{xC4rlb)qLggE|*dpA75{1j|`6$ulk*Xj6< zoK=0DSUdfFcWKKs$Q6G<`d6((2Yda@kf|jDD9x28cQ4LiG__1XqWtHseRji}S0zWB zn`N<S9J=HS{L&>$bX%`)bk*|&J$kNd?Kn3p+4;$#Ne9pJf(!VbB?QC;1TOR-5>}-n zIy`mwnPkF}kP!LPdA25_I(I;0yD2%!UO#<ykmAv;9}h?(D6Kt3vfR%qO21Len?Emi zS($8<VGD1ASJ`_-X6Z}xzT(W5So-dnWzGupdWeKkFr$cz)@aNm1oDkbJmeR?@ED$@ zOOz)Rr0f>t+PS7OHCs<El`yc~%8*rm--Oxa92VixWs2<Z-gXN(|HZk<gMuMaL}VJx z-gH&^KpnR=0e!?peYw&#NE5dQTODx@s$V1JNQ;9Ov@*?BzsgRJn$e8r7B0YBNQ~V- zf3TnteR(@)-U;Z;itZ307%zglEeL!4RuaDrP&)t4@~7Oz>9D^^;5NaFG2zFg`2C1S zO5PU!ces;mD&ctS$xD1-O&T1?P4pL5`4sto<C6V%eg79!G@j=#HQv-LyHTjQ87LBC zT-+YDcU!OVG3I%uJ__KV@l94H6$g*rRieloV5_SYmEy#MNCYof@bHPon}niwg88lA zPMM67RnBGFg<NyNw)*d<7^`#lPE_Vob8ObvY|Twf7Vd#p9#a2R`YNrR&|Z{Myyco9 z!?^a8)FFDF(o@FGD7$9^W#pBOU6-XSp+*AxN6rEdmN-GrYwrAI5fWgvRwDE~Bc1Z0 zF>wyRM;yd^y*TB>a`Z(JAjH-}Owbba^Bwv$Go?*(Un};0;zv@P&b_SRvqT`8oLh}p zed3T!d*=dUJCfn$t)mx%_99b9XCLQmp1;=5J$co|zre%d`e4u}DQ(d_BE4DmJ@t16 zQh%#))yj0x{lQLe{QPgbztJ+ok`y`#j2-F?zI$0rcv=%0+c$pEqH#4eE&Lqoftfa~ z{n_Df`@=Q1Imc4`={7s$+p5s|?8g#;hBCjhv4<&$Ho20oJ;Gwv-bBs?7DxlQDAO55 zpaQ!nC#6TXjbHq>_+4fHvTyA7Bs`}WjYMb@0^Mva_>ERaX94m}CRNZ@g`pRVlB;7g zF?y^!YxULt!cYIvMAS4EeA=j>H(hXYJRG@5k*s#RG{u@2gcxb7&vMMkgzp*!DfGW) zt@V-0OsNEMzL(-Gajxd-JIf-kf3+}Mve6hTE@<SM>^OU5Sf-ub2F*QKgtxe<L8EoP z%qgjCn!xlJlH4~vZGtamj2G~1#~)9WZFCc$FI5P2H0>dxP4cAkK}Mx~l;<A5OXu$f zsaSs3U55rKz^336PHY1UcVcA~3|_mranBWt(l9)L@|9-e*A{`RORDM5#b)<d&c|P1 zM3Nq6=DQ7?cYIt@MvS(ptA(^MQ?@qWlCoW!vLvfZHihCt+#Gn!ZhpGd@#twmUa0w9 zIhsh}AIy)hGd>Z*^q%);o}T@Vd)UR65W>y&1}7fB=(`{JEO)szW&_^d?J2xgvJA-# zFSCnR=Pl~vhk`8jY1l!2C4GBw--9cS4&COwA7}*KOXe=~;(KTF88I}_97LYQ^(Z!b zKA9K{MJzdQR{hJ~&-cn-(49(Gut>}iDdrhm!jwl-HfY7&v`pIqiRZQ`V%X8A*VOSO z%BJ(}=1Qcs1?DNzLM8_SU`e=Wjr&yL%MTkP3UqUiJ=V48Rm4G@^)vF6_T1FO)oV0$ zvd-ehNq$XA3x&iT#FIv&u)iz+UJ>hU`)3GYhC2yMm$VOp#C`Ou9(f5>eNr3h?;q_= zj7F%JO}){so0BZ_a;LbXUMRZgQqin^mMeDiQj+l;&Xi}@<rS~)tW>ki@L9=rLM>5l zUtbwhbT>PM67`zwL2!W@J0<yD*}ShF(G5A=gaUJ)>iYcU)#KVB4weg0Wq-Z;$1xw* zzmDw=!~e|xpJvFU(cqzX-e}gQ_?45TM?1Pgr`@Yg?Y2?cd@yA8lt=2PSHhh^@AjT9 zKlH)tliA()EP`$FKz*hu{MI~e=UL10e6t$~ZT)CJW7PHjQp?P|08)9-pBQrW;Q>{S z->veWg{wI(P^n5d91b)0uY?mj*P(k$gDVlaCQ@(Sb@cO@J~OGeDNC#WpWAcr#Z8%P z9w7n1V>q3kic81t?<vCjq;Bh-iL&;;4r{IV{fh_BpO3TnBDt-q`o<~I8JWq_V=3`k z#+*}D0XDIF&lF>QW(}!FG{mweF$k;1y%DB;CX3v;ZWZ)tEvqFp;_WW~%9P-(<vGxV z%tSP?BzG%@<n7-<@6QHTi&wR*X}%Jke0;yG`mmvRB?}9+(IB1M%F0pk<k~q_sja;| zE|C*XAFiYu)c6EPAipj%JJ4o$uy=K8GDvuQpK~W6zIKAy;Fso$wC!4cJFfWS-MyIi zlZ_GB<PV{E*G~G+c}Qiildzn|`U_h_Lql6pwArb5%$D(mNK$)dKptb2HxrBG(>0F7 zyX3^@1o#l(*1IO@3O%x9QNV25^1IR*VS4u}@7E@=_uVP1r^$I&9{%dO`%Ykt#_qj0 zS2I+O)t2A4p}jS!5@L6Ex1M_TMUtO<$(e*$jP~FGRjEjE&F6H3S?{=+&0S5QtW24j zjP&9|8vb#{yQWDFpu=0QsugnC_Fd{~%x0bav|M_;Js?L&-jND@edhvI1J07mtRcMz zNjTPWG1yt<R4Oq-{*%CnioU+noBmtcGo=>N?i^LzOc35Pj;|1{`kcCOds9>QhWM%h zaTDE&m*wnYzwA6L9MWLSWh?;cQJB7%AN)C|`?_cr<Yh+bu%9$HeO9mtm!k*wqK@Bd z<&465e`z<mv%ys9DO|Yqj~8F>Jmy9ym5ZxQo;!(8g?l#6=#kD<bUo1!7~Z@^gz>v_ zC}@=(mQj8)$e=S{VPL%a+M>vOPv646_)EA9&EaMd&|MJsy<>8bE3#;ath@&D3#@of zTLr0F4{gY)`lLPB%<@8KaW}5kcPeXtLHB&hTzh4dR|<LxA+ssDx=ge0F!ATh=yyqI z4@2gd7%PtImT-d}@c(jSfOWP$3(>Zd(Xeo<eyrn8QI@A+;$Gq%KeRrCdXzfAdVc?# zO!oIE^<bXV%eQ+uP<$q}%kg4Lvrf20+}&aFz*OVXHv6K6t>pVu?oD@6UJV?v-8=nh zQd}axzNEfBm;4hAL;_8_5;T0_yRteOt$jR}poYOjMBKp#R6o{6hVH3fSVXb&Ty7P$ zMChFx`;f_9ct4X=zdf-My1<V=onDSI%Gh(%^-p^ce~<xQS=aIS$cgpW26yxNtqwlh z`_Q12$)W3zd^-=05Eyz?e!RZCvX**fM|M^DsvgMWi&)Y#yt1ssz~dl~oZ6tz4ylM= z&8*q!Bg60dwcH2X9?~x3<Jv8;9wMypk!@?Dtm}&_hpD-DHY{r$n$At)q(z;dm%p9L z&Eswi(yM1Z9Db5tKhrnrz%jR&W%?#u&_MYJJ8~KzUwjj8ZH?#EKbB0c<+%{B73a%* zK~?C~V9@%Vx}m0ArbUf!gSpb~Q_5UQ2|!8Hpbbjwo-=9kGOR}LyHc@wDiUK&`{oI~ zJr+cIc%i9M=>ht#;8W#mq{v3dFHo#67*-=jylM)6%~4cC8i(LTg8!%bt=V~H)3;`% z@|H~>EdM^w5X1gRhmYLm{q<*m&|qhGmR&<Cs03*U|Ab&6<U~rDSsc2FX9*<y^zG=9 z!d<sYW{rcN;&=Cxsz;wX0pB${LQgs6KbaRc(%O`e@RbC#CLmP1H&;YD4AiG|>Rc-m z`^(?a7L$n}8SH{nbjZDN*-=Z@lZRxpY3^bTBrkV!o*fz0{%lH*8nQ!iA4X13#Th4# zvH}?Ysmp_UR2R>G%Pv#UZCbKZB{X7oKl~IrY9!$g%`OwD!H$G8zj>mFx1XBRd%GXU zbL}JC*fnPDPlX)iW0($|aFkPZ&4pdi_SbcR8E2!n9?#SY#c1zqqBn;=t8S$r%>)5I z=|xu^%bMu#j%=LEseq4YEW;vMIHU?h10IpLof1!)DTQ~tw7zW|&~Uf0b*eX{^^JF| zPTSGD@oW%rkt@51QqYk=Bh;Y$0eJ>M#VsFbYkhsDsu&eSzi3K+thP&f`{6xFykm<{ zIwGrt%s^FOxgCvgYK~RqlAzDZ=e`p>%K*J6nNLMlw33e>!BOlJ`Y$NF187pI?Blp< zF4bGe)Xx5VXcd&2%MK<ft}h3r>V4(x*nX|(D3(Q)%%<#zjnBq#+nZT3Jo9!7l(3YS zjvW-7w<}e%DrpzmbLFn7ukw-gfhbw^(@gcXwi_xKzNFt9-7Sro)KAIe62s^u(C(9t zZM*r|I*O1(sqfoOSD=i)c6IH^?P1X+1tZ6~0e7y1{(9!f&H!(7Q-{Ks<ZH0DE8hK2 zI)<lVQU(nda&Q}W@2-vH1aH$ED%p=%!b0xu?-!zODn%k8ch8>$xXNd7GccUBmsojD z%~C<JQOIwGmKp&a&TSlHDl7S$3oepY@rT2$^z|m4nr{o4W=*mlPZ^h~;<$GObXi`j zdo-Ih4Yx7WJjqp76KdmmHz;Z3YdhVB`#EdQbfO+yrVZw}noOVUjPe;iUUKr?_f6^A z>+k>d%XnsO%jLCp;bl-}^_WqBzmaEsxU2m`fg+sQam^FVP3f`i<=K70?Efl|8L$68 z@|}*j@DcUtxVG9WkqO1yy5U2Iz3D+;cVcB$f02xD4-yeJyuAHm?Fp)NW*a{Oo}3cW zaMlt)_!WnD+HY?qta#WbcD<*Aq&)x5W3{Ig(lGJ(0U=3i`>o)I_%8zMam5S?{0p9d z8lNEkmH&?#oBzs-h)GlR=3ONmF+pzwMR)29PwxG6^SNvKyGm99-6q$1gXg>Nh-T+@ zUx%lDT|@}F4x-8^TKSkyO-GDC>|GmwD}bKk`NrHO-v?fGXXsi?{~_m7r=n66YUBFu zwE^FpooAadGUo0tJ%5Wo2p=F)y%VcBu_N=|&g!pPc0oiiCw4b)w1mJMy4G-I{cLU? zVpQ4Dzil$u2>ICXod@u>kn@@PEsXV_c;l222JMd?u}N`%XC(~`BGTx7gq)e@)p8Rh zDoQFY5w2!P;+dti#%_g1Li$-=F-SG$PG|@QeH?WzJ(CJGX-n9cNE~ps_mgV3xxAbV z?6p#?ELc7-;O4U{{yxVu?tHI)?Yy|O6!f;vTK2ckxZmj`oi6wy3ssnyzfr^%CxN>l zI1lre7cyRR@kddr_T%clVD_Qk>(}y~zaJ*JyZMd3-dJq*DjFNQ3(B=VQ<?82jgZ!z z-n*25)MYd0gDOb^;@{M&eN*<l+j|KZ@k>7`)G+?;Q~dcJBb5hP|6yg8_?2s5O;1{D zrarOsGkw6Tf@<fD{!(d8%|qV;mBpB2h*t{P2_$O(6lmAl<Km<2w(<iWta(stW^s!n z1p4u5eGiq3`*O?d!;s>v56UggDb=XIMN(f^|05;(mM$AZFA_2{+f((OWaPr`=E^~O zzSCb|AkM1QP=JdZWd6F}i$r2FtHCvmHWTVX!Q`MXs%bydF4;l@*$S?E*W$Xku(Mto zWG8OVZ<Y~1r=xLTA{Mt%%FU;}NKlt%_pId>GRvW6L{>ILxGCRVOXBkGy)XYdCBz4v zq<ZY5=jJ3OL#9nhuiMNMm#BDix<4}`sv8<)`@P7YE>t^L{c|TiR>K5S0eR$L|5hR; z6KWqa$U#GfUOunZ={83b@M*Fs_lZ}-9A3$s#?kO;_U24euBdQ67`h4biA>uNS1%{} zF+=v8em5@HNHbElKa;<h*w2++Xw63oV&oe6a`_vzeab*5-Y^8`jsRNjxc0~oT=-ST zf*cFkuFZO@Lkr3}XcDIp{M~3FxlBvtBHL+Q90O(8Q(xX&z_JfawW&<?DTt+O7$-K( z1z~Lh)94NV#?$xmnY*Iv{&^_W>t*QB5;^L|S-|&%Q{SmwnYyKpST3RLt#s@MY<3H; zaqbkS!HK!-zOiOjVBJc;CsOFkYxZI&8`7cRvny#y9wG+%LCS+ZA7{HIB-C6O=QGoC zXcW6Zo$zShoCH79^S9Iwxow|jEIbKBC~@8e2!Nk!eYh6L_PHxD<UR%FRV5BuwyYWU zuxfy~6=<TRpR62J=Qp?~EgzN4+yVFxur0ZP;u_6XYkH=>bKiUa<`pU0T!7L{Mua&2 z>U4>?Y+2Dr4GJ&F)b<Q?%m5hK2A~yvP2)CZ$x`<A8LL3j6r3q7pEurhzvcdPt7&*@ zcy$Pm!Vq{eUc4kJNs{OftuF69m!3E<Z4)_wU8Dw>hgwe*zR>LZ*;r^C_gSTz$;Hwm zHpDU6)LedLhW#G#M^ER#=qBd^<s9J5(YcR6e(a+%Ha^m73n%CDT&bDexcioeZVu7F z_SwGZrKvI<zu>}jLo-E>f<!mIW`$wLf$N#Hc<G6~Q{t+>>>BG6p+p={!ZyK+gvI~l zN!dMr9KR3v7qja52|mEU|MmYf!)r%Zu=8p(8g`%H{5uL4lW%zk4~&ojJMhFT0)jq; zf0s1=m%IHBI@x<2o3Uh>JUVa8J@hJ{nKY$_m+C-48DUKa@@5;xjaN<gZ{X%jO1pyE zF%;C1L$emGx2Ncx)*^NiePBS`CKxC&+_g=0^q3F7$GPcmbNsMQ!DHq(C_Yq}-VKb+ zszS&K&ZaB1592YuxtL4Y!eOk8r#mi~h4J;5=l}c#L^+bw+|X0$L{V1PO=w#U6O(&W zjZI<h_6s*4h>PuAX*}OW=v!2tOuzp&2+C;FvE3>if9-lv2r@SiF1G7ctf{R#+L8Po zoZkK1_2Ow`7c(Bs62TALZI3fT?K@UCZ?q><5;``IV|V5_lOsqKbuzEtYdUn@T;V#W z49)p6>ya(n5*|x`ddDIY-T_-f`)e%6maAK^6LhN=;VzivsWIHxW>5Tg1$?FF!C$02 zjem?u`nXjPoXPOB|01Usyd5>gOnPivBu&bcVOnKiIAR+S?SaUW=xhW!j^r~f1buGX zO+Q|&BH!OhF?ou2K>m?;HQt~9&IffJ<cYDQ`m&$jcr6<L63?)_*{P)4q{C5~wP#p) zrh`c`Uah>xk&CZ*w=C4I69gb@3CF^_&OfopqPuI8KL<sH-y8$tj#zZ$_BGCwZzMvz zY+JDjOu=tu*(nckS97%t0(f55wt;l@`87B!5to~)N*>nh_gR!Kt@d@DYsiuW_|IJW znA*cb*8BrbLX?(x>f=4D%}Yq0y`*#hr?Paz1Su2(1W6B>FNsU|)$#{Vi~2XSNiU!5 zQxx;{QSq5BXQScL$*N$lUiSHo|7w#UlRRu7{20{+?8zr2cmYfc_$qty4mUd7CA1q= z!m#p&V<9Is5VxSZ)JDbR)*cW_ZPJKnO9Rit%h_r?RRjJklNk3_2c6H6QG}z<i>gFH zfMyPYJ`vB_9ip-<bo;xx#JZ`j;GG_5yg6-z(hx(^^O>D&neAwhC2l8IU;9Dz#vlV~ zQJ@nO=RCYJkGs6;+ZtKzbXfO^ZvK=x=5BgpQ8$fB2R1oR#nA?ka`X)3RRn#mT=ZT$ zq4I%AIv+N5A}`)LpGGyUhHW%mcH~vMQ*_C@gzQ?bXRq`$VZHdu4_7`B)=FaD^9Hqr zAB7QhVSot|OEMMqGwvjW$Gn^P*YheqB3TUy8~%P5Nb(HwYhm@`1}LjZVJ-x%T!FIo zq2#)@B6Hn}C1Z-B)vvLw*z`)yW#2wDSM6l`#acSSxhhj72y-Q-U#63b-XA*(I?KHv z>7Oza0R~^)<a_uFV1@xuFMEeKN6R>=4);yd)1G?XDyud(MiZw4`#E!Lqh>UZ*h$wn zNXsA67LuEbA7gop=rvG=l%NFo&1c9ZZPQ~*Q*0Ac6vYbK*sRcIPt2;QG3>Ztb!o7E zUvHqh28)bgS+&MqH67zdmUGs39j$sqr16li{z?Rrk0jg&hpHA&ur69)jO{qd4zcW5 z?>fpf-4O$x!eOsUYyRXdVhs+NjI#y0uDwzDO)T2u0beP5WCZ!G*4p=Sh6U;UdfX{g zZK5E28t%a0Pg+;`CXQkD=Ymai8l<(5O7JC%U0#j3Q<m5MZ%16_F-kn8qWa5)h;U-n zCsHudXhU%|_eDkPtpCP)U99H9=c>w`b`GMvt5IWt3J>W)xN$=f%+q%8xbsqzY8w&+ z6hajDVt%uD)a%Nk_=*Nr>i$d|veZ7lSphQRIe^b#_o^s?2E@0JNo!hL^%SZl?ODI@ z)!$dYPwHVB-WObtn=w{^*`#^eE8VG-00EPptAT*_nelE&mQ)VlmK<zix?8=rxm}4X zZHpu=BA&1Yx8dh849K9<(MzWaUwAX`eeU@V*B=04X1-a^P_YV#KF&mmVwacFQUs+; zT2%hcJR0u7ubgB2%4t(bw%WmApM=_CQC&7R%6Elj{kp)bGfjZ+TV+!kxSOfW;XXD+ z>G<~FEtk;=eU7r{uqd$X4dAR`zKe`D44YZfWTm~;gbT%fn(-IO*qO)f(S&d1g54Ir zub-CJrZrZt-iRa_o3WL{P^&&eFX}3KKsOF6q9~c4J>4UVELS)4?!ea5Zd$n~B6b$a z+x!J-TZv9rXm~tY_h6;Y#z=}Qk|xZrTffJ{thSM-;aBjQMAOO@gP!B{CWqZu+gZ@y zJ=s6+Pl@Dsn`xPK?CvS<?o24ocBvmb9q3`=F9THbv3&w8t4~#QDy@)3W5#2C5V=7O z$s;b^CReoM=2b(c-M6crBMS0bd-x*o`Xri4lXM%7W9?}2+N{!_T?)bm;aPt?<pIZ; zw+P-c&)G&GbGuf~re==?J5ZHnO#2SGF?GiyR@T{`Gh!m)4W4>KL?bc*^rS4z*K_h7 zzMIC?tvd&TmU8=@9J6)t^(w~k9jOkpf|kJ-kBq~2tCW5|KPBqQ!a;^r^TS5_rab&t z66euByW|G<r3m$AdNl=D2{jB$l`wo=HH$%0HR(%UBk1is;QC@f=r)79YZf%z>G{7b zm*hHQXd{V<&pNj9qzS8+MQ*_j;~ZDdRy9G**Ch5uWh+-jd%aL#$JJJCg53N?#JXk% ziB$=M=Tvgv+~x%*S)%Caeh*3x6HIG$q!=oIb;dfPOuK%lw0Td835-d|<h7%=1$z^` z9L~-uk20Gszle@L_kX0NIf|W3+h)(Z!enze*4k^8ibUrYXfaA7T~|Y#!uI{G?0qk6 z$GU2$Zxj4@F(DFxJV{?&+D;EgSW4ccvS!g#e|yXWWU-bEKzz8<w7-hGS@In1&F(b3 zn(U}Ao!`e%ui#!?!gMv-S%S7GD3&bz77r@7T4!q~e{xWQaP_B;QHY%Kt@=*yf*~7b z+(uV`XEZ#)H}!mwSGt*Rc+9qk2-W^QW$|>FVfWKu7oP+FX8fUSXexu;Zo2EJ^G%=M zMtI;VOBSkseu)6hAk}@gnXnCLZDJcZj2gJXP9Cp>UJqM!Zoa$D=Mov~z~rrC!WxHH z)>L%N&foh$SHiH`D`GVr(2KO~IlvWGwJrWTLU+kXM(E)e3D@;}1vA#9lc=`?_2GhZ zUe+Va0XJxLZt^tJM)G>JR<pW&M+=INo=E=z{KKt24@Y1Y_6MN2D>FRn#CJk$SnVX_ zWFOx4pzV-x5tQ#7zEw7tcatEEA)CWJUrKN3z9(?0aF}|G4Gly41*~E#9gS|hrL)J~ z&t^X~b!1<ou4}4+b0_i?H41OOSfUO>;C^8Pdft;QQ|)88vw#bc7VuKoz%(phVuC#2 z?e)av`LULH=nlm7e{lDfQE_eSwkUx>0tB)W+=IKj2ZFn6A;I0<0|A1&ySr848X!nP zaCZpq!Gpg^);(L!*=yf(PkZgPc3*z*3sSS@oMU`n?_ckIBpq9f_>6o!u%&&p*IwwS zw4pbIzvjNSbbahyJ{jj1^l|9e)movIz4Bde3noCL^y%^04ycN3sKz6AgwS~$)g`D> z3hv)*C7>~6o$2|y9}lh%uSv-Xxc)lI;_XdJifS{iTdORZS)tvys1pY^Bj5A)*)n9q z;KjNJSCoSlTlGf|4@6F*Lf31(#iXodxQnbV_2JfI->jPjQayLu3+15_?MC#hK3(6V zll#TREU&BPGTL^t8@@}zG=;{v#<O-e*^srs#Cq1?*UA~rz0`pfxnwTqOoz94<MtbR zB;H1pWsnXxcXN{S`31y!+&Kj}>-FoqNk@uhuSZ*sHZ9(gI_5^n6ry*&2p`O+<f}jq zV*6xQD?axP-p5{2zBLpv68H~|_X)C9i+6cLgYr1{zRp;#?pGW6^MI3Ne)9F<pXvhp zgWWW-*f)^FWkDOCtCuA%kC9mF_h#Tzd`{OX10{zmRj25o4wGTKA^D4R<0fZ!vzZqJ zeQ&dlecgv1LB26D>oR)x_7jzGwWT{@WshfRCOmq*;JH#*7{7<S+fT<D2k;{*6QGsL z#x)h6168!ZDw;<IEQYpdnfvi1N*#fRbmg<=B*oYFYJ)dD^6ZcMtGAC{s$L&QBn>;f z2;0^}3z>(j%|HBn%zO|pgK{~1{^aR1w4&$D4nD$?_E{;VTR_Re8%}W=tSBT9)MR^{ zS(Dhvs=7B^&pP&U5I5-8EZVOSZXs73X1a^D4c|=lJ$v+NGCwQqsA|4wsM71*+W+=5 zp=zX!<YZEw;5GlrqM)l)lojaKb7kU~GDu=%`Rb=$YTk<i-w;L{pENvAP2EEQn2cna zZ8`6K)4XffmG-kDyx_(5wS4yx-P4Kw0bktX>)n|dE=Hs4*8tq7Jb#aDaLjFj?UA^9 zxU%9t<*crI0$G(@(ZsQn%NN|@IH$eLS`@hWdc5`Ewwo4=mN50O0>Zi-Y>Pa;vq`gS z&^E{0EgYxr@HnVxK6&BmIU{3vap=k}0!Xp2<VkkrZ87HQxl^$nLYr=|u2wDsb*>(_ z2_Bn1_6uKGZ$qwms3k!jgU7meP^a~<iz!Ie<Gj4j**9WH&o_I@*R;3W15J?1;^Ox0 zD9V+anHRoXne;HDDBX;AmseFjdu!%>KGKhEhZ#2u3k)r%>HZzI7%(vJIOl!O_jrGS zKlm-5JP1<CrS}H`pc{cSK<I(yxBtb@24HG|edDhc1OJ<;|9=F~jArS|kiC6^bmjEg z^{Yi#0HbEtEzkHHFxLD7h66tAznyCHpCKSTf)w>ZUE1NZkO&KjXDvd5q+moI5qUyZ z4AGXLWl&n{wr12*F3#7GcgOFk1NkG7+P(I2dtEgoo817W#4*WMWsY|Cb0!u_Q@X#S zK6&G(#v$O>Vcem-3Sy)m;|4qI-7)Y+$RyJm!APB@rA#%5{PLlEr?Vz+^<KpO!!ILM zMpyMF@=_p~WTIdMIpd0pROR_|Vt?mQry8K>A@KpLDVZ@L55HH*tOF;?n3XfA^QIc+ zR`oI@L;0M>-b;gYS%`4jrsfr=B?(cQtZKK;L)V?kH0&LeOWfEt?6o!zH)-*86(ghP z>Qmx_650xQdrio8PERX;VsOY~BR)wW5d1PdsKi4<>6i*$<ll+%+jKy8k;^NpzVNZM z^~yVHO&%xPS$<Q(nxAN%*#08<))YK#4H8I_Nd>zd_C`3X;o50`i=JCUtgAl)?SJ7{ zI{YbW=FLyM;{Z?3@Yq`?O-~=CqP^ec05EO+YVhlqs<L?Z?5#6vQcGz#VV||0tG~Be znE;t0GL|~QLqGL{hm=M?rr<I)1vvE`#1@Tjk>e4(ZVB97Zk*_VILnXf5cix$^*-I~ zK2;Lm3KUg*^{LSTF=f;Sn*`eoD+>)CS1Fvnh$>rw?-T$Wke>#v(7hh4OQc`!Pc*Bf z#Q1J$VahsWIZ!OgFjW60<Qw78rTI)Y!F2yD!C`Uhw^~)t4Md|y4h9Omx@eo+R(Hpl z*dgUYwxPjx?x8UDeVLW53h6$_^&}frv3Ty?;?@W1L07N=_H$kD3snwa1u#j(gik2b z$BQkKtnipSHr^3G^4Vxxzo#qrmaSI7P9TP8u5vZG4;z$aeXB^eskC#0&3%BQkH!Ak zlz!eTo6{VVaPiVIFa-sNmd+?IS1G){r`}$bBW(WKwpK&(l}b-8aYsw9O&!wKzzYpc zN+oGGyawyB=Wrjk7crw8Tc@~NtS0ViOtd2y(M5fqc<5KJ_%W#J;=hP?tJj2MHq5p= zS7=AKP9<QLamJG8_5Kr;MzMHN{GA>0Q`)Rhq_rNo=+;0uq7N&aZ46V&TeZxk-m*zT zfAjE@*?zC8i=o-WIWqllwoecO@F_c-9;6Dr-xNsIr<W+5SW@U*k_7RsQ)lYU6^qZ7 zV*Z&(Gbf6H%F_*#eB^sOY_?)08T3O#WQh{ZcB`@1j%8s$89k=jmsNeU)N%eZQfAnG zuh24Gd<=~iR~&+LvDot7IYJ(9lDzviv#$pA6CJ%X68bW}CVJ574?ZdI+cp>Zcj&0W z0RlzVTZYDvHdLX^GOBzvTc)=WqNJTn&{%*Td@*lTNfPJZsX&DuBSYbc(+3~$Oc5Q< zCaEY}jDOi6?VGj3jGMnvcN=OHSEj7KFau=<I;sagdzAeIpHo)2f1VFtLzj7xvanB5 zH->?uBi~S}QFm7^_Gy#SrpP>pqyG?ph-Y~a*(M;eMhu1}d~F>O@6QmMp-om2SPluq zV=N{(0xlfpUPHc4;k1={CsV+AZ!#q_G4!VHV@Dok*B>S9|D;IxU~|54=sake)^%1i zGitl~29&c2F?`sQ63;NZa6=BO!H|0_b>B*yPkGWcTsE_E%x{*l!du`go8B1IZ)(HI zxq}t$Ud%AmMh6!1w7u!vcZ8n3ZS7vD9VHpgvT(hDf}sv1-f7%nw6zJBRxL&H$xNM^ zSkW{){3&8+D?jYR=^2Uk&+&9*g<M}7{gyZ^o4k8eCLH<1mfNSGslAf^zBs_Z3b020 z_!eRXtOI=}Kt<MO{~DmXU|`bU0~_~yX{7rOcgaDI19f0CM@a8yaiRa#Q*F6(im)RJ zS3Q{ae870oKWhQ$J`urT&HK6(1DVbW9Y$ZD6stQ62-avSmCT7Yf@n53j%IvK5^{2X zdiG8fZA%;vG?=LFsT9PNz~JUQS7=;VQox0AMeN0Z$wLxfppS#z0);%DV3rr5{P6p2 zjj#05)6wM-K*wlSSnEPBUbY%LI2ac9=mKP#eLWFnl#bmBjd#hpZ6c3dXZhvmBU@S% ztNXCAHkqK@c8Y?F05=pDc$dftgKhxxkmzbTA#baGUt7W+Gkddh7zHNEq@38ujaQMh z;5Y<9KeA|+FnIH5mpb+U8x~O$$Czb~2g;=G>o}zu#vzr%@IAZwz!%7GDaJNYU~u~T z_Ayv)Izh2yHVY1$^-iaA&4<>TeQ^EaN8zyy5m^OZ!%53FmfE+h?)EpIGAsSI-IYGK zEI-TkU9%RXOzOH`JhhVFMEAhiV5C{7zk3WkZ8bpU0*tn!fkt2R%{Wn-!Yi93sME4e z&Xlfk1od<^C|oHuF{5+JbSY-GIz8*){hkeg^&fs&GZs+}*nki=otpjfn4Oq>yu`Af z`++ukyV=dL1g8rnUXU`<UcE9OBiD`WuTcnXEnhUq7Zoh1f@0!HmflsR;A^7;hOJOK z>0SYkG3l8eV}<tNnwO~p8HEGGCr(UXKXAjenc4Bh=ea)*UIN<iG+NiJC?Y{0yrM<- z%6RC=Bw1DyHJ)H*9D@?kfTVYZn1lP~rSs4Sp3`EJCE!kmY>g+ivJ@~l-KC}{33-eS zCTBMPL}@m4*!jQ>eBZX0ze(T#!uH@lM{xgBX`-GL>S&n9&#)nFZS5zm*?V6WhYbmU zWYztwHvqtIp{k#H12J8?EpvqZcQH;B({JtOXxwhXB27AzZi7ceU#9@AMa^=yPQdcK zhZk+W-;(|)|NHyp!Pn92CxET?74QnbBLb#r)Ccw|KR1=J*xS3MSiXryS(npxwRqui z+E|^=%9gioi+*4zTE(x<vCif_9{}@qFb_|B7Xw<b)z3+;+2LYc6iL48r!*Xy#0(ym z7VBXF#J&+r7IpLZHo<|id-h5jF?}3;voFu<eq~+^W-TOOcm3^;(Luy|5f#EkOUw)i z77eORI{q;j=wiF>sAGhVkj}5_TwXC;Y3O0Upcdww&6;)yxwX<w;KX=NAbrbwka<kq z5Ubzch%k+IG?yW@!HtcoDw*yG5t5G^6~rf3)@lIe*HuKRJ}qp9BX)n*1mTlwP|%#m z2&Hk1fjMfhxM?TV4eQiD0k^=2ydDt)+cuBe9wFc08{MyHEm0)>wv+;nV;ql%d~M(R zamqzz_u=?}vcn+a8NnvOK`OlE8s}?3n2d5)0P!IujNQ(?6nOj!5V6bvL!PYdbJomJ zNaWGepx^t%)-G@iT;_Gudp#Lbzy5?5SAH>bvM!mQ?i^{lQg61?c^um#IfTJ^cZFQ@ z9R;XrenNS{?Ht9Tuk1j9%zFiIsQ5o^(kpC-Xe~Vys=7?9pIJM9#I4Nr>HDlrn%F#= zIh`ROE)y#=-5fEv9ZRi@S+&$yGb{yX6Nb&g%a=1fonc8(BVH<rTQIfBxLS&+33@2p zgskIP5D>ceko5=sb1%fsd+tYRbS935*zi>p&Imcc{<gF*;sJMg->wFaWeD@utx{2i zBzN*{;=n+Cp!S9rjx}Ok0{8QI|1`r1yzSd29z`j>zqW%~)$`$8@_B8`3#MJPu#em= z+aHA?)0#d~&kKb{eYuir8E$JbuwOrmdc482z57`ooG@3?pzCoI=17Rz=D0f4t4VY} z(qOB3$s-wx!TNZT-{SC+bA$JMI4A`p<X~a?$wwV%>+yQ!vajNHMc3E1=aWXdzymz+ z!Uw4RL*o{gx^FIOJh3M^U}>SjR}sEmSTWyCVM5NRxKfTI$?&eq=x)4X@3XsXZ~|gD zDA}0w3xDe2L?yAcHSR8LViH4H5v|-rD_36O<N%P~RXMD)Ff8_(b4XgQFfM*zUUIk9 z{cNBy5D%I;%4|#(VKT7^r;s?mcqrZRUG{GC^4s=rQ>Tl{$wO9IW2~(}4dWmc4g+)g zebz|NCbf~Q?=K$H<mSD@Z#DITBOA4<_h)0&MrXd)u`G$Fa@~M1=nB3t$&UQWHc=dG zyO2h3Yd)k*bU#yrT5$LI0!R-415*z_q0rC4gcdpRLuW6RTs$80`?gcMtbYc_0p+kp zEji)YGM(LGJ(u+YWOk3z{!cxsU-2z^BpHGiL(!B)#UG`3nwrmIX*nh^8tkPy9O-aR zTXs=${F_dnHIa!joelV*V=Oe%q=~kneKo6zr7Ny}iCRgI9^!B!VJ4a|b!cbztR`?> ztBbbLog>V_(eI%U*`!{T;DzpE-~M8vCj)D`NJ}pY!denR5WRSm6T00I&#O2ZTDgy; z+j<TtebyG<S?jrDbwRO~?U%-pOMh_Bv*_St^Pslgeaj0=pSEo0u<1%K()@^!Va=Pq z+Hta!798yRt6*$qY0Yzs|J)TQ)UPb~(WxRpI8Z~13sfn`zz7k{l3&}^5&ztfx?37c z(Ww}gIKjJnX3Q`Ksgs|9>`8PN0w=tgb9&d2#Zt|XjTuUK#n~53YiGCY)4nBYgkdKe zV136B#u!QhhQF$sn=iG#7UGpYRNn@CI4pfFc(?W~_Q;i_0rEH?HRo##rLO6qZ#*v( zMDnrk9r3yE!{VrFjlnRDb6yy(dldDsT_4aaDsMWwIb(P{Qhs~*5zw~#36%uH8V9b@ zt#{E|#2HDG0W)R`H0>A}%$7l-NRA=Pg<7h~-OK)DY|vP5)83*>S&vm{ACe`;6dK|! zr=w~mPmyf#YEz>P3&)8O5ngwy_!r?47cn&JO3)kBFT~3>%#N-4SzyUmAwM|YGMXcs zW~S*n93@rqQJze$tk7`}=JPnt;#id?=G;R_9c=cwz~rsE3`#hc2fW#0&4-Nq{AA2$ z{>TzT+g|)*Ck^VZuGO~nzV`{H@z0J%w>rwX%zmvgJ~&QKN)MS5J?vPkWfE`Kqx>h2 z<cc~HP*3!KQj;k33Nt{2e)fMHFmrCCv~HYITz?(-;Q@F1PBw0D$z_@m^nA?n3W0P? z1F+7;(UlmfK$=2j5D`A)D2TA6d^g6&dW9gO_^MGS^M|%5btZx+IJBB7$cq6hq;C!f zUi{w8CUD{iF$fyjf^QBPe+dorYRB9}#E0~#VV0M9dhtahi7co21Xj2hkTBU!cL@g8 zi;%3LJc}~D*X599?_%*b=-X;JzU#U9>A3IXeHJ^@3q}OTM#8;rw0Ph=U!-twvFUK7 z?9g8;e`6G8;!_p6;MPa)`mlDr%~^S-Hsm33Z!f4^k|OWKcQHfxEs5g=<|AN&lyrpm zUE6TvW}*HA_4A`M*=;?LZsB;9;p^j5L{`^|joRUO5KGI*6Gx949dL*8BJhsG@2(D+ z|7QRBwJmI#a^V#Ok^iOz(Hv>Xap|7sSMqj&s|CE@Ls{QZPHm&Gwz_7nGcZ1{3R9u8 zMr~@j#t=4lTSm8&ZLB^Q*4Ft3wkTT>Vx_UI(iT`i&lGG6(k*+gZgzc;+|fL)NU6oI zE2LR1@ed6<chX2tD4-cQTAdF}1p0pEjO8z@vRMfNdu`SW9OUxjE+BF3v>QLpn5)9S z_SZ>bG*muxTW=jc@}Dgr!!G_1KW>js7zCC-;fad%iO+GW?ecxp8}@zOyP+vDkClxt z+z&HE&iEb%4{YKnntRY-nuP17SX#hZ<#HxoX7jK&^msf~C2&5fTAohTbjn-ibMCyW zzH)szQt#`abZJe?eZ9EW;(LUxrz>!oI2F{Asq0&1hpUaRukh|u3CMB9(Yk<x2Wl?$ z;KK^zhxXD_<OM=W_=~SOjBC`#UHvO|+4qEj?MW*X{d!kl+wVTn$6U((A*tC8$~84> z$fjy@{C?Y+^4zce!^5IydEi?Zgb*{T<joUK8U}<9+$~I+f^^-uhZ@JGxCKQV)|cnQ z3mf^hauWcR32RQ!0gaioGEdm6Vqot<GZCep@0nFH(6I3-Zy5K1U*3!ER<`ESB!?>Q zHi6@6ttF3)JW6CT<Lg(<#YK2!Tck50(P{fNxYF*_#QOIK+eu;Ux&Ttk&&h<A$fdxi zLJA}57l_1m$l0<MeM$uP`l@`~KpUxzAeHP*o9;)jzJrosotG`L5a#G5%YJEv%#fNk zwBC;*r*>*et#mh7MoPA%LQYS#S1q<cBG5{3>c#6#TOR4Riy<Nk?Yxx1tx@Qd$xY|W z7fzb494n*=qFcG=oX|<xK{e|KURam_JlM@uP6Iin-}En7(XSF4K4~U4liED>m3FJn zT{F$`OYqU_I_bpv`2s1;G9A@`k<PLlx;e_d>3o)gc;_?@v0cu063?RW4<_NY@Z#B$ z0>@Flt5JxVTcF=Nyj8+dD`Z!@g>vM}E8SLMSQVI0u%W~(CEZIvKdKbkh<QV_zld%A zk#w*qCtsG~TJJ}iAgL2y5oRq~5lnG>FtvB^5+>aaK#AFqTA38R)O<Gn+zc(Esi3bn zCfsjoO!((v#qv2VRk=5UMr#uV+0~jf(|-`4TDN2ejlUT}R3m2}=NcHdbokg=B0~Q5 z>!f~Jd92F58aO4qBHo(JG7~ND#g1=i+`fc;uDC8nhz*<Z;EJV?zZQ80H$*<=kS<L; z@iAskM6(tMMWf3me07bzr;_F<4#@OB0j?&^8kyY-&oh}g3sj}~YK^oM8h%p6T6P9* z<x)7U;MCjZtBZQNSH|5G=DrV7IPWIc&MEc$BL_9G6Vv2cAl6NhDq=qiq4ddCH8T7D z!<Ao13zn{A=E{cZfR{x0iTUJbQ`Q=qZXGvbai9{SqEB-gkf13DQ%5AR;2VtOzm9Fr zQ$l)vJ|RyrtyOZq^wxs2p?je0(AO#!9W@_ZG%u10iY!+pRKbe%be$57O{tZ>5vP&< znMln)NT){A_RAxbO9?8vTLB{iez8bnRK?L33G)>Z0njHpFlm(^1aF@eI1SODsI$~z zNN0$cXMHo#DbQgnA#c%3I5GwMgRWW8_Se<0)TXJfmP<#>id-#OEoK^<@l)u6DVz;A z2$U9fGz4o1or9GR!!jb{aa-AG*=FJ7DYNoSATBYWGcKiECF3Howc7iESqT1=%lsP{ zt`mTieLu2FAW&ymFLhSO?amI0foH*G<V9OF&nOMN*gcKZ2QMV&de=(f>CeZP2ALd! zoD4kVD?N}u-t=xju5o$9Y1Bu&fOP2jb!klu`+OG6f->nN&25Vdm*+5Yd<dr<pYI|7 z@Vovu<tISTVdK0)0B8cB4gDX>k5<Emo_Q#C+#8$$snf|QK-EMy1p>W)<IawFpxFr^ z^r8M|OWZ$t+Q>a#Ww?uQumjmZrVvGw&RxX%Z*y$G1;Jpy2Lfr7X4i{X2a6aiyn++V zRAxCX*yt;MG=c;D17)Y!jZd`PAA)cNK)e%sNIkQky?R6d@J3?lFg12h4qOP#JK1Hx zeuS6?dWaa5R6F>t@==yqI!DYVwa=IxT+%Fq`H4Z_u`%FN4`?A&0y!<Z%8jkopqqh1 zDf)=<cM`lga0&jjA`9m-Rx0YCS8kl~^iI6r%il4cXoRo#;!VAz32ci*(%nVA3N2q^ z`JG%ry+Lc0X%~J8NmA#G1u#gyf{hg!^VoXrfb=Ow<VLK+WAhT$`Iyw<GwQ)ubCwyh zu)60U4z(Sm>WAy^slNf>h4^NO$fPYRw$*@}F2>GpZ&UW;-fpmi0kPg;{fUj~%ut*N z9Z67#!dGk8%4D{Y^=Mw`f7sWqYLCw6$mI)$@Ya5OY+zc#bG>n`KSFG#&DTi3gjDJ9 z1=2COUiU`e9bz~H=3sVW{IPJwHlx`UMx)cI^3F2-czaKT8VLE-Oq79wDU`5JW_z2p z$_1K6>C`N5x7pdX%ZE=E3$y!eSQ5UiBG{yMTMReAD%U4G5m4uzA$N5gD)u1N543oP zMkA%>_?*^LgdC;vl~m?Z_q{G0#5K;lZZ-glv7#GmP0q_Zy;Dv+HYx~LlJ;iBll_2Y z6t^)qFm5uT$Fh(*KQm0e>sZko;kiS1mfCN&oqAPHBAGxy>|WZc(T-uH&Hc)#s{Mur z516(++q<ubkY75x$C%Md(u8(cs(U?V7U4Fuk5Ir0k*JOUjyV5i6i~uMqN!^`dds|P zW$KdB{$)t{>qhd{h=qDH|4$`ee(Uu;>;J?WPaVFD6#d}i3h)OQ-<^c$JJVOxjJ1`e z2cLpgzAM$sVvRqXs_cK%8Zs$!M4G{ljE4UYXWVJkyOAY;`|}g9+ex@+(7BosmA-md zIWiPa$j$3>d0bg82z&5YvfkI@&PNw|{bE33wj-j<LBpLR6H7U8Vm+n4slIoRgj})C z!n7q(dezPI-F&ls!V-3>;Jt7dYx4DwsLD6X7Q1Ffib*%GP6;&YoCDN0c6u8F?Yy50 zkYftT_=!dgA!f1D4Z}sg7ejHOUNrrtoWQ!szLMO>#SgnWG7(~#7+dnh;>Dd_i_jX2 zds-|u>xHv{{-<QdE{#}8)@2pQB9gf*$i^VU#z0ncDo!I@_p%AR@FS4GW=7xL+OTQ# z#@rAnp={V3jmC{Z_Z#&vC~gkaW1o{qwSXVEtdna}7C<%tP|KiBdLwsmG*a`tte+6+ z{jC|VZ@0CpQ;XbK-0h$vFR`UkX;In1uxoS-`{j25xc9cRW3~F`GL$l<k-dow8bsV( zy|Ftpj#rCW4PKgYj4bXm(xwN)#w9OBpATsC8*{t_{PC4kqQYs7ENKPVeJvPbmJz17 z4V{OGJzSkzncx1@j>brk;Ul^635CS@Gb9Nvl1S38F-fMa!?U7TINWUbcfRL(kK~?N zuJsC``-#8?5f>aCj3-SF)Ke_0u~u0vkhCn}p_9I0#y{uwe#7Bw>X7@Y5kxzHxd2bj zzNIa6x%3>nRjI+Kfd_Vzo52tIYr3v=|A4raG}#W>DxWrWk*0As&uf4Q=A895^QXwd zoE>ICocIcxE}_NB?ayZKQ-v$h0QUM%%hYoL^zn)(_K^@*O8K`Y;yU-g>M_pMq<%Bf z*Uf)pr0FPz&3<U}Mb-fE4jDdqWz;)rv8k&+8Ph5F6%LC@n-X2!(lE8YT`M2T32vV@ zZG>Lr)0ZST%TlDtTa`9QEvF=)QOsJl=916&q*@P`0_RY$B=KKYduC$n98i2k^!o;$ zMi`sOlXYoRq=ZR->0)(tY#fl0AeUKf1+8;kW;coFYo6)w4(1!RRvHXN30U*gnKgBX z*)ew;;4PXCDm`b6kicY{fegltFH-qFe)9LB6z-j5yK%Nilpc;LZ!FEp(Y;=N!J>TX zi8cALDbmDQmxEig#wB65OhRo0Q)<O-D3!&OY@=ik)`A%3JYu?|GWWHU=`H6O<<KdS z&zZal1+w~mf(|V9O;H&Lb0cRHMY`zE7%dK{UVx+9{%KR3#Irt~YNxWTu6K+O)5BJC z!-0N@x#YRQ20{wRAl8=+_Rl&t^Jz)Lg%GGCwH`?xrjA0L*KTWjn@#l4;oOr$(Zhe$ zM7_i$XP%LUK0?YO&wCI@`Ha-#)yFchMj5HX2W@&$z&Mx<a_|OaCk`d+7}f=!L6JGX zB=EHDD1Ft1)<`!lrpWSk8<%IqTXDGyW~;kf>v3w9^R4RJiVuN|!ImBMN^?K9ZnSE_ zu;<jfOWjsq)_YgjJRGR;5*H}ob>ALqS6>vUMEzQGb-WJ@U29|?9dDnq26Csr^hf<M z!r4rEUd6iyu0{^PN8e58G_r>$d7FaiQ2+hvGgw`w)UHQ|B&DLq^m2}GjjJh^i}t>i z(;*pC)bmy?Yxt?p6nyjDVLaAWn3Beln|XfMKh@KMvQ{nxq_?@!O9GrbftRPKrLywf z#%F`zNQG30Lls4U9B!Q3vU`qUT8Zl`JJ*D5VZLi`(R4CFO17F@{nXr7_}K}!y=la0 zkNW~3C^Q1saVBGiL6hT?kyHlT9C@b=Bsu(iyRfOg7=8Ua<}ExeNKXEJJlM$*Z=K#J zY009Zddg<~$J}ivDe=hGP+h|L;7jQuf$EA1(NIZ)YWvm+^Yw`Im<DcqtKoLQJPLCk zxKp*Y(*Pc)Xek~?D%nL=+ssUrtccSm5Jh@Bm8*DzT+San+4qC#1JPGz+WpCM^JniL z`?7p#@aEeFowKM;x?&SJt0raRiZZM2Cq@E&UerOiEX`54!im-0MP>I)&y0YnnieJZ z-I|>=*%iFpgFAXqy;baiISYB##^J3k_-QKO^C`bdO3}Q86k0BY_(_Rtl=>XF3^8R& zTTEQmn?88UQd&(UH;tr*IZy$|`_MHNPPe>yD~av$1{2TXwCSQll%j}Sx{nr?d!G+v z>K5VU$6!FKN!PINqt^QpGKLYFE|cmR-laJF`m*L>9aoeTLHjdmx*r)esgM0OL;v%o zz|T8$2FyHSCc?OR8I$F2J$c0U$RL2M(N^3>9+Z|K_LcbI7G^z8k;O>Xvwo83H&gX} zHW+vVR=F(78Io>4qab)(5w}31U2bVM*%d!|i)>e*Hhm{GNlT@$%t&7?bQJ_64ya$f zJTmz-q}|P}ftR~jQ1KmWOX)CFRk&7+A-{ol&r34e1>@2$zK(+1xzINbAMnpM1lWKt zAEaQo1bTJsZ#6h1MrC$A#tSAUyfe?h_Et=cZ*1Y^9~a@P?A`l~iOEgMENz?~Gy+Kb z=a!@+GHVbZ{ARVg^$NHZ&T9z72XyS%ZegtbF)#zFT=!)({==urv<CulOVF(Y-rtR` z8!F6sBcPa&N#}}*`07Uvf54vpTIluaXK<eRG(l5)Xe>3mV6%yb&?kpKNKUZ-%s5Ty zmDQ{7XN!;6!M4z<J@_mihxA*f;WzvXXUZ}$lCS`cCO8te%}Ms+)j5c2bQ5JX4EO=V zv`P?Oj;3C<Ks4ta{!n{0N}NYWYWn?+iG~<e+$R@zQeX~8^7KDppWFR80sKod)M^gC zpYEhB(ZKbu^{C$?7JDF#H|RYg5HArA%&&oXi2*#I&-y=)mjGrz*;s3yz&S_=tpPF4 zKlYq&Nn4@_$PGUPhl9h@nZ=Vo;^fF6-0;W$?%V+|r2h^WuH1MYFSMi~KxICNXEbbd z;#J}gi^-e)G62qhg7GWQcSecqnVTT9ce+~ci41ani^o3(xEa2lkiZ{Y`fVA=^zxJ7 z9Vw>J{@@xj+{sXV_Eo<o&%ARySuR<HAc9_}TEO9R1bGZ?IPrR}@^c4xRx0)K*8Kw3 z%M*4~;0h4<m-kj-KMsj%yqcNThUb8V8HKh}@{PH0q>JuujB!RJ1<zjzwAy6xO?r>% zM-1T{l)!jAxv{^lCdE+2P(FLtK(KJ{Ij3)05JyR;?Qodk8i7L|b#!67Lj2k(Z4zwo zfo@m~feLswJEkI0h4R4>(T{E-^C2J1J-jAK>ST@<QAfMZmosZcLiiA2nk0GW1&jky zHrS|t#=2!$&e#;}Ow<!V!;}y_BEYw>x@mLzs}+?B@tD1&0!8nUULim@g-uJ!HyeBR z9Il1Mv}tMGSR$(Ievvd&vr>2vIB~dFYG}pG9ieSroKpiA!4<hf&Q=1Lyb}?JgN%OV z&5azc?&@0`&!%Rl2JYc<3&ajG(Mr|wz)Im%ut*^<?S?4EJ$=n=<nfl^xj*_MI?T^E zlsM9*;*jgx<M-YO-c{;m=YO+X#5FTt+2auS@k)e?;YZ!jQ?(e!aMtAN%rL9mZY&L& z7KsKO%3!L$BZ)C5HXZbmr}FH{M^axTkDb%<GRYc3i;Rn!7?u(|j=(Pz9c%9p#|NHH zB&i3Ytc7)PEVA;NeA@k9nx>cvT#*PvN?ih!ZXR1zAXc573+i>MbHFmKl2VTD{ubtx z)8f01t8R<Y-1As!=W(N?=Pg49EU9$<36^0}%)?eSdevQ<=g&o`rQ!0Kmw&j<RZJsk zA965cwgs}hJ+)c}X=_SV+7&1h%}!5~^pG*naxL%Ho`?<iFW{qcn65k#Og_P`jqtb+ z->RvKKIoXcvsK8(x;|$O)yzEr%fY}r+$qnE9_duxiiBV#mbbbW*rf7Zcr_7`zgD6f zPO)lFoc8O+c1Td4{2YH|p-Q&_o|Z)Q<yw6Ek*LP`Nh^cZ^m!312`+*f8K5<tYu&;E zImhQ8{1eCq-fK8%#3k*{GwpZ3xu3$P-yRY+tP^~UB;Zz@cB^%Ug)!=mqUFs%aX4hO z)_Kpe`SVTp#XN;PBcA%IYR}&{aF>ezvVrILd7&wAVE99<L^Bxa7>NV#h(p%t>m}2? z+N05<`m|wnJ6H^f0Dq6)!xyrFJ&VXC0qU~tE-4}x@);Sy$T;`K3KWw4v*B&t8M9og zcnB5Dd%5+>MsGSiGP6P_{@wB2U4aqzIWCUmq%Z0|JH7ARA_hM&AX77I>p13}_2J?R z4Ik-RoQJa~9}4BkHUy5FRUmV|{AgOz`BghzDDt^NW!J8r>KmuTEUk}MDF<@EgXjbl zYUd<(=LT2Q@{7gyQ@e&RFl{#C6Xm=P-WcS{7Cufx=l-yp??iquYXQv%Q7kMW9}gT% z-$di?AZAJs_zl4a*|5ZnpXN$WeA9jS4m0)uT%=m9IP6#Zo{?f*h|@V$h61<K<W7NQ zsp%>qF8tpNr~kOSjb#B*<VNwv8{yntuLfTlvy3v>{+?DpMe_s@9{ri>WAIo0tKX?U z9zS!^4f}ZdAE|vI@pmE_B<z!t^D7*9Igi&@Z=?t(@9v9+G8_h=lr_Y_jwttk>uz0} zC9?HKGiQf+7A{5IOer~?*mp@=N(^&qw1j-W&_%XoVQKlR&Cb>qY<jT^8@&eZ1Y%ri zUQGe=w0LB74Vef0Zj&JAbt<tQ?P+Dw@NBR;7Shuekq7K8&&TH9se!|?R^^@(@Zr3h z8C_5H-Amg|R0R6oX-hW;W#nF$G&|(-;-u&Xj0>HD+cac5*!io^l=H(u5ULEmo5GV* zh1=!enZvl?W=7od8twqN+cQF7<>C9bPAQU$-R@7tlhpvt`AS39<+D|{`I@DUBor4l z9``OV`OLEWOtRwXj_%_n!Rh-3NqSn2Z$GSz{GQg!y8O91vQ5E-jJZ-A?Byxoq~1FP z-4BHqo-k=9FK1I>(Owu03#nse-%B=We}K32woX>d&d5R?OiP{bRe@M+g*wF0Dq%?+ zRxOSs(8ZOZ_IsW>_0nv{)JnxC#MTUGRn{xvB$-OkcNdGAhf&hL;1c@RCB(yb>pW`U z2-(frB;Zp+v#_ETcGRzQSZXHh@5?W5KWy$?L_QRZPY)nv%B<7kw|}u22oKSHks+H& zo2X_~e=Fk7@BRCBlXA1*zDh6%V68Y#a(%81oRpTiW|h%(4*R`^VOLE&8-)6vjGP>q z-Mhttxg?klvz~@Ey1+tXybQ&zy_UQ=npyDJ4pJ>Sje%;1N?QfVMXz5-t<}^np&JG1 z?JEud;V54_J$mPu&B`OkQx<1T%a!=uEXZqx5-Q_4Dy9d$ujboGUy!LfvZ|*T;=#zN z{8d@9sqDaJ#&1B-nr~>1h~k2K6B*`aeHL-_^4>D6neO1VYCBrcLqRHC<$Dp53E|<y z>r92qP)Ur+Mrkrg-LLNgX_WYszH@&sNRJ9%fF<1*<H4E}RYskyDH9rcF=R2S0++#| zNghJz={`9Gi=!F-nSvZTb~#dfiqoE17vYjKV5Nq@Gn8f3PL}qLvv#kXiroFRG0RTL z?T0-j6RhsK3^kR6MZrUw&6l*&gy@|Br0L>0w#&ak$kKwi49hLRz$_LsyDqsO#u}qZ z6i!OU>AXGQ2!on|U#eBo)AVpbdVD&Ok|xmpD4;`$?sW@WF>cVJwW?cabi2eHkm!fF zJ6ao4H+_qj^VZka4nvRoroZl1G|`L4O=|1NHJk4J0$4&fp9mX6fNU7_@4L@raw<44 z*k0v`jaN!OlefMcFs54`i}a)|gQU?)k)*Jt=tGEw6jYRIJ*ogI4*y>kyF0H(qymj} z);TZwif6&h8#GnLh}26{r2vIe5r_X^*GN9D(1Qd?otYf2WEv1xj^&r7KuhZ{n3>0V z!ihxhIwdGkO}f(pwJu8RxDTe{@WqvNzzXDz0kzVg-6`@gc9-=z+<8$DJ(;!$BxXH> zvfO3S)lpQ7?4zSYLmeSY05)ngUx}E8@F7Cc7{`=NO322f$`JSVbFPmk>jQG80iauH zZLDY+Zm(~4ZS~NJ!Cs7C;zk?r!Gr6m_i{|ao^WnHNLXQGe_%&RT2rvv{`fJbkgb@> z8HUuUS)V(Mm6#MQ{1E-^1al!@RzOc8v~QjMS(RQ&&FiPe)INV%M#6S)P{PU~Uy46I z&xLpp-apM}ESe=1q@tbN${0Pl9?eQlKR!IR8Al1l7~sTr8S9r=*QrRBG0~}@a(`Xm z@?j!o$OdzA4s1=MW9<Aj=WwHHyKCSs0mQm5lVs>}V=-<aH-rd-`~OjmB{?Ug)~{Og zf^rq}y_}3#c82M<_^V0_gFxb>26tX*KaoVwf?`a{6O@Wc&$~8}4-33$`hGDxGZMKF z-0X%E*3ua|0)8n<6;uLtkKNQgoL{sm*@Jl5SUH1uF#2D4u{9|xbsGf1x7hdQ$2lLw zG{uIKNxxTzD^S24o&q>{M-)I2FibmZgaGXMH|IfgK1tt-R|MkEPWp%-PZjjXD?E-@ zpPsM^H6W$OKK~7S{u}WTz{?4I(BDsZ^?FVIp0Vo+m~FgrdqKMYZEF8g+=Yl&sy7G~ z#~6p(Fp{a8ML6ZvxhK^dDj=%@s3u?Ey8t}x)pCO?CrWHeP$Z8nG=LMtogR@n`m<;2 z>1$~IrcEJ5l0SBi+QJA>_Q^Orasj2k-?}K$thpef;p_8RXHDfAaU<h4@fJKybxIHL z0lp?pAEBwvbC{d)$U=B&L!OUH&TREgoj3h&I1)u3{5^llYqa<FV<r6tKAltYPeB>K z3+LzDsW((3_Rqd&bg=CdH1O@2)KQd=2{Y`uSCPXlL`);punaQ1JQ5l0gv8uA8NPwp zk^DELB8O>p5$w*%?}iHY_+>2L7WE}-+fEf`Dw@rw2nYYX*N!;0&MF~epY97`U?w9E zAKI*{A>&ZAMEa)7;g;U;Sn(^s1seULS=K_ch8WY76b}8V`^6%Qvj4<1WLVoGM$CyV z^~}@V+0f9rX*?v3SylQ8x5b$&(Kh{|EoKvru4(IBU$;Z|Han1qzJzV4c@st&^WwSL zrjsI17p8>TE+Q?wN@+A*ZaHn!7ryM_XpnUxIZXD8zbcx6=TTFCQ8Y6Oz=`WSb-@qp z6aU+?c|#<02)4m2z0V!@&?LX2ov7~%FTqt(DQ8KW`-0G<A6zlOQW5zcMOr^%if~vw z47YLEa!i{{3R#&x8;Lvc&x*?p&^fd-E}*#gQd<f)zbeM|#O}M;>JkQm*k)!1P#Sd@ zpTUU6F7tm6;<CAu&7({Luc@Sh{>JHfm!oytTV@w{mo5DI!urQr<ChtZm7T~@!L{N+ z;VQGCi-8Q*bN`RvM%XtYGRWN8Tb{ymv=pk1KNw=ZPyb-O1x8NkAe{6BpJhC5nXueB z!ShRsCs-^09D@H<!Ymgt!pCN0Jh+@UffG4mY&h$?<S<!{jPAGhc*Jvb0GY>qWV~N8 ztwWZ8%|59u<PDMq<J9PymrcHNu4a$Dcj8ci!i||3It&|qOuaE7??9UNaA$4Sg@y6> z{{KP+6iE2D6%ct$Z)ogNG!|>B&q9lLyC7Y8XsdMIu0CqZVk6F&gUMtjLeybdM3U8l z(!;v+21ySV2C3&?5_?%ECyGhvVU84ORR!#;OhKSc40hsz7A*|qrgG=lZX(nM5eHvT zI#Bx<<fYVKLNh7iLS#3_Ef0}_?QE2Bbm5Cg!81l&Yoi!Rq!&CFJ6q|%k%<>|2_-E^ z1u%!?g(yil8S6T`y(G_<NTz$|aoR-LG|3T1PU}tSznA<3US);5M)1VkyP1daX?QYa zR3c_jmG$X4*d92)vG?yF@Y3hMg23S<LDhex@xFkz=>8Q3T>rA<C86Rlw1*Px5Ba1# zV3`Yh`-P#8>e@cVN}2t6!zqeLDDJT2KKkN0p0|eP-dv)bk|oshO-eJ~<}>j!A8m@` zpX6n)(lpmUOn0UKzL)Grp$mOrA%7F8nK*`w%%ijPqzJ<R_Yk+uV4GL|GmU&3;OMuI zDRxdC-}25k8wW=PVj~&>bA)X3PLItI)6I4Pf4C&#zH05k*^q$Qq)C5J#Sk*RF2Qig zf*u(;UJ~4$lK@+_JfpBsJmsg;eO-0*_UAAgrhi$)ZeCEYj@^!v5(ENk>Kd2RdyZs6 zfg{(j*nA9(CLl}mR0<*~74PMs3_RbJpT0tKK$c>g$?lFKPmaS*F(AQK8KL@l1QkNo zSq9Y6zz-O><<5Q{`-|rLn5DiQdC%7bECVbKz4#x4j6bvBm?d$-0@dUxLc>oeYD4l* zvHf39%n1jc?TGUKQW&l=B-nV2@6eR;$(4)2-6K1+O^X<Pyt{o#{@UW<VPcCR)5II! zl&>kQ$}vFq;+QlGLcC)t$9+x4@tjE?<^S437}7-wR-)$#=KJ(&7Ou@@36tN7^pzEP z{=5B4bm}Hvn9;{WGp%a2LNp3haYJdW@+ka|hLY#0<Bmym*GklSJij4i9~RzkN({(O zMMG-%8d~cn&UE`ZlT^=jXix1|qh06B>fMAX(E-5phI`Aq<sMpbg^fe=Y;hT1*ByJi zEeW_6-{yAWrm=EWFYo|0e)Ty8JfFb_OQ2fXFR#5{g@dsHhOoLEvzogbh=YkB&utw; zF=(FW{eo*h+!94y`RpHIkeFvrxatPT_b%4Y;F<Gi-drXMTx3d~j!Fl;W5-GpTX+NH zV`=B01AwV4m4bJy63D$(V=t)(Cze&H><=|98xc6<6*f0OBh-;M;A3eK{MsoG&2HmS zOkyYUze@k`uGDEs$dzAk*|~2U7qo0)T&+t%L0H~H5;gw_BtIeLf7NI5Bt4+%VpmHV zOnNh~rP&#0?iJXLH71+FJhq<=OssmwL%+LZQB@Vm|L$-_7;{*-1rcqg&lc%aZl{tH zf<(ZlegV!3oQ?@b%*$()RmKEUbnjxDfG9Et3ig^Q1hbE&+_8Y9Rjji-jS_-(KP3!N zYS7M3TLg_v#lb4sF7K0D&~~f2x8G>JUUCIn74+M{REq&;kz2vo@ktyLntZ_Ld?*}? zlb*Aqk!6^@Q7RR```OYY0P{~{Dm&0O%QRaj@f{-1N#l>|Z>|yEd89CDf<Ao_DGW@f zKjY6iz=)#(*(XVuSe~SKbI5baRTBRV;+12K>OR>P`V>zIrO0h!RLJ|JPwjQWO<E$w z@<0LdvL?W8hy0mbt{N;Nd78gUp)4sUL!m0Gdf}vn3u&Uc^>BDMI63}qP^|7$_eo8? zC@aa)9&>=9!@*57S3~0t0~6VxXn53oHcviC5iL^^N6|tyYmFH<X7r{Uq^%NaZxVLz zkHJtx`A$j`_g%yZX2+mSo!YELgZ;??eSA!`>Dku&fRaNAb;ixt`g%-iijdCU6S<-Y zP6x5&ExT&&Thym!39a^mxwKZX9uu=zBRAhVSj`2Q%$iljxE96Yr%6tX*tqa0rR7_J z${-LlE@O)Nx}t%Vnno>U2=EX^vi=pGoBj8AF7}oONMFy;v4{^t`A-#1UL-GqPFZrz zPcDfuMOP=U9yJyQdgO<mj$$y2hKZN%keMIx#X-;^$&A$0*_{SEl+apYa$_i5Hn#-K zJvUJ~;M<n*Q|(34!4@TN5QDAXdI*ua3lHALyxx4XpV7b?Y0!S1Y^E*;!=ro@3y{4J zBAhvJ^?&2hKsqA7X26UKyUtuPWV9s<;=>(pL3Q}=%&D@o6uJlw87f1Ncz`A*+7dIi zZ2$zBe<^XAtU+5kGLt`)aEUHQ>A<o<Gglr|&3<U<4YpP~9m4^8xSPxil=8(ZfA!#9 zBWOp6u@;{Vf4XSPMT~|h<ACQw@s*T1Jp4=B+>CgA2xo6k23{{=KmWHADcu+0{|EK0 zA$k<I{s%4Xv&b?6S;$fUg=)M^$@Lif1Ts>5z#k!fPch>=dij1u^}201=rECS{}QKV z3re^Y;O$_M<~YAy{k3kYQl-h`5ieJa&tq{u&OXJ8)avOlDxAa#6f7Wm@2j6H6Ic$^ zX5(vg#e6fd{LkZ_`OS!@+0s+R)E^~vfBRGl|DBUK*Z~I6dU;cAuSW@*d;os62ZzH7 z`>8l~DFc5B0KO;G_HO{+e;Awpvj_PX;ggH#7`Or0KT*Y|L&|0jqYeaI;=@t?sS@v8 zDUkfHX`0`sgHhW3<2Ku48(cD06awev*cY~q4qSNrIctC<4Y&w!>@+(Urm1|~xBsPa zk+eD&34Yo{l7I~HgHK*n(A*-w6y<&cT*4R(*OvB&&j<b{!Q(LjX){M-anU~d&GGG8 zT0$1_5d~OVvBxf3@}9lOa}{?rhGNBOnfo$k#gI*IUVKj8R7|>v-OrL!W3%J%`=sKt z8gIStFBYY>d@4#9Q}6bk23mu^VI3_s{vUgR7QU6zSz8(Ec9j08x;P9n-j4p}TQqSq z8#XgDXK!}6-ri5a^7Gkz!q^b1o}LMsf`|<pkWz|Gt-p!j0OnwkuFsK6!NDb_>FLLr zf~vVie5+=vYO7ma0h<Xh)c+O&+Ua+M0}p%EE!TZ~Z`veoSzOr25$g?Rvk8ZK$(z`8 z(aQEr<Z2LkkfnL%0i(pZb-37^#Os(`gM{t@fsmJxN8Y`k9<2Vmbu*HbTOMh*Lg)Em zr6MmH)Xtb*UAyG`oGK#0+`9x?-=#uil%&HC#VC!)av*=!tmUrK^33TWd;lu(8$-Hp z9hje$VF+Z@)RnxE%2ZUbF!iL89*QrxoZOm)vrtiTC3n<FD5p>j3y+7umD9x<JJ&YD z=;XO5F7GLjl7(2J7AX@Hd>phYgiB?OTNIZifU>)Hm4B8vN-^=AZ6B2^5#otYO-a~J zY_dFcq1OIDQGgJqJhv#ddAfMOF6`Rg%(oyl<xEzD(HJo*DDf|ce|u#-Xx>7z-p{Ir zteAePsY^U~Mu>aKeL}~6Wn%kzSoq;Nw}(&;BmZ9)?%8gloKqmE8m8~{p+!O(xHcrV z^_jXuc>~MNs=22@+oE^MUfLGH(Z*e^^Y@RNP$l+sdCk%kAdcJ9)zEoT3eyF7<CL)Q zgUFK(rCU_%MbTo?!n}g&)O)Foxwr-CE%}01bzS?c_4S=8V;(aahcTROn(vOO21?WR zE%_Zvp<29i_ytisF+c5}ovKY1(B0-s5$J<Wn|YP-veS}XJYfLo!sbirAWL{wd2#a( z?|6x=C=!~ZDp1nLxn$%a5>f9yMyPQPIL35MelpRSf+i|x*(XpDN$^Opl+CNk@3>Y- zKZ{z_Pc@#Ilr3y|r&hyPejs}}qkPIv;<`QINjd(3LtQ(?=ONTrv+IPo%`+Lre(_hD zm^_1VcL`gQ{=Rex;Ys(gg)V%?mw%MK{H>oTBLQ?Tf<lqH3Ojnq&>u)5WGwU>Rw>7b z##PBGYoRS7EZSis2N3rz`%?o)wHtTa4JP`~%X?{*C!PgQcE*fG(If(tLAFf^LAG&t z6DgK}`61M6UVdq$NZedxqS(MPp}!!xenzpDAeIcZImd~7E_!Z1ZHg;Twi${v(ZC@+ zTWawWI0|MbpWy?-t}l3|l0M(~^u3(sB{l7R2DJXssKHFuiP!^oPB)fS2o@)eTyjYq zctuZ%HKQ?N$TLs|jx3PPsfXMwq>H@@C4EehC%Ppfl`0<YW2}PBg~?muoo6P|KAh%v zA7)RLddA&f#PbxOL!U`;$Xfe1Be|G4m45nUG@0CT)an8SBa$ia<wF?|UDA4t*fgKh z&R`}Oq|X_2=m!q&B7RXyM369S?KuW(R{*C@S%dgIk&VeV=31NT!SSt?QvXh1(}x^l z4vi<hY93f4_axl?Ec(d^k21#NfFh5&0&U(b!IIozA#Z>_I(&@U2Q$csbiTH*aD^o1 z!?z%$=o<O*TCP*cmsAyjpBEFc`;QT%9AxGck~DI|#h@t^kNxk4eAyBwOu9Ztl@V8E z(OLWM?Gw*f3c2G*vSlHuy(me_B&ol?Zp(BFmLG1js)gL?C5}e@+|C*ZayfQbqLgZ_ zHrgDbb)MKL+1~av`S%S`mw@SRGJx@Q)dy(9jO62>-zXe*>n`D+;D($TBx|cp?T|d* z_T<_LWdLUg4O3axqdcyWwpP1NOM*kqS@>3Hf@m(rHd%U~V)`AVs9yb0_wcg{@%T=H zOo#h`7B9cZUi&zU`+EUc2Qu|skJRDYcpV?!IAKzwcXK;5lpXJV*0co*_b_9k;H5+; zqzh5ms8uZr&&2LOM%p0D#<LTW%hPNOn-=6SV`b=&_9?x(%`;IV;up`vbqQ^D<Bvg# zMRVM|eYyi3KmUp`SM2;do#2A?U+DzDBib@yyTpp(v%pRA{AfWk`_>)~^SBYL*dHfu z(qH%0O%6T)oQIv4*-Z<^Mukp0xx8Hi$CvUorCsTGR+HW#3y1H2SjIv9zad>?iX1wa z$6Du{%6c@V?$qLCvw0V&R(^iV{YT8(sN#$a=PDDShI*dW(aYp5a?3-1-X?DL^Z;k~ z!KKE5^p6Y>yw)=T<D`{gva!6;<h^f2O{%P^Xx4MeGw2+U!sJ>w9Vj~llmA*}&^^{F zM^&OyScM2o3~{L`Xl@bPE5k6)H1g~w@x`j5T>cnQil)3Ur<ueky;Jp9LZhm?(FmcR zxJkhvOeKT*<}I=9D0VLY^rg1R9UM!hg#fWM8{~p9Ei9Wqx`vg2aU53wK4LZ~aH6A> zWQR_$uIq?(F5^ja1_W&Gi2m9Yl~5uad7nl3^*tbM`3r54_q#b?WEi;ae>vVBZ6Ui6 z{oHgT`Yc=T$A9VOewtRi{~z>n-G7FQD$oHh^;18F1fUP#ANt=;RQ~@-Cl`iZy#SXQ z#*B0I#i~)<xbn-oNEETRYW~+~=BQTCwlIH2>Er;nVt|cUA_|na&7`@fMA13?dz@ZE z#%q<B9n4~n`mOv)npvdN#gGjv{`Ltbje~!|O)xfX>#CiGfgZYtTXcC0b!XBupEQR7 zgtpFhpQ^V==z=WwD`4?HmX?lh6FXkRfiUon(3HNCa@1116?!ou)l8wWZ`r+f8-$L^ z=3t<*6lPYdxGdYLqmaN~7JBq%Z0}|K)g4~?4)trUcnq>d(9Ja*Rqwx*I^oY&=>g9c z`;O(UaXlZD9m!weaE6SKnT`iP#qmPW#4!PvSTb{CZ$Hj6)tNI2&jB?SZ{9G!SYxvq zTu#RoscjL|Y5L!7<Ze=GQMEXPAJ*TPQ$`kA#wmqOvNYYYyhonE>mGkwpgRgKWWR*x z%kBPd4p-RBFoe*rqbQ{qj{!|fHP%P~kr}?FW~{QYDrYdAa@Ezj%$PXPVjJL2mvfE} zqKBj;mZcFts#kETiaW?=GSLz%r9rn;Xcd8OY$_Ea)iJNEx|AIPp?122p|5?x1wNaa z!xhN0%9*@GuMM&5igT&;9zbA)nk%i6p9suUE=i3QS@WLjs-6d$Uct9=0Iq#)9pY=@ z|EIh2jB2XS);JbG0YyYWihxo=2Pr|i(rf6wOYewuq==$YB|wM-=`{(WB!m`<%Bw;s z(j{~?bP%N@Lhix2_s%;rIy398HDB)ec(P8``k%7SbN2o{&t~{*NByWdaHrfY_D3xa z6Av2PrFke`oGa;4{NaX2=6q5aQ_iZgaSQj>rJwaD0Le-u3EJ>qV;^7xv?1OU;IV{u ze8IHCGC};@aAynkeN&jEjawFT(;#CBf9Rs@1XL!Ovy2Up`V+iHs0F?PA4s)+r$li@ zvyBl=v|U^?PjKS>61HBDIMj1a2&ePtXRF?m`c~g75Bp0{zxi-%pTHU$@#?GYLE{XO z**SviXZwuE3xHmODe>8w3GQGSM=FDk>NcPpUr;n$ukQXp5?Wm@V(><W^>B5hYMYP! zrsd$OV8c=sbrtwJZ6~3_xMY?zT+)*Wv@jxyMyMcO!M%qj$NKnwr?=)Jfq=F@QO5r( zx0bIiVfvy>5X&&U+5%VlKNno@K2>dQOm#ThTyTpOiavFuxOldx6j(b=gPetacwrr* zrIL-kXR<o@u-TfY`H~5ONtND#8GG92jLR!~Y&vzfHcCVJV{wIfi9k;%=KR4#kZE~c zdUofDMvamn_R=bh#cjMxQx&=-E3b>&YI(7DFku0V#S3+!w3}VAyvSjU8_A-Fic9Y< zsYA%)x@{$Az}9GbDX3vGzIoAA8DZ`9pl1xCjojBeE*Xs#dEuRRqCAF>4y||L3k6BJ zG1*cgt<q5P;!JUhDZe6^`IDVy$ADZSDccp6sz5oVW5$F53a^y<UHecp?zIIzHQ6Je zDCNFluIvYk><r7`#UbiC98UYH4jnixOx~{<Dzy%Nc&~>T27HwjPG4rwEj*@1mrOiv zrfb7#e&R_=on09Vb|?c6X`1tH8=XyZ<6U`Cq&kFsprzZU^qf2BKAnI;<o$^mmJVpH zjOP%6Q6a8hAaRUT5F`Qv8_5k=x08Ad#vzs3`6aa*nPOVQdz=zeAN6E>J&MRC$2#Iw z$Y$W$DEP9n@uvhn;Q$9@F2A9Y%Cw4`AoILF*ip~tr88Y4LD*YWHw-7l9Av%B`%s0$ zKk)^9xcr<94$D%z4!`mDI9w3wRH-T@w7CVkl_#`%bF9L%iMt}3?QvbNi03tQRrk}x zDm0ilEkvmpWL1L2a0WH%a~9r$OqyMNN<0Grp^{1IAt7>or&zVO1G^O1i~<U~Q+sn2 z9|2d8AxEUsUzmI7v*>&Ft%q`DtY#gG*}Ud;bKSw1<LED+;-D^>PoMBivwSx>HuGy> zTJM05^e5o14!-gC#B@>I7rmx`Lmc&SLCuWqd%P6D%W{Ar^F^yE!pVkReFU1bGS+*y zJX=#HWU=_5)k_H_x!Sa#6c@w}pYdn5iuFA+?_@s}M30m7c;Xu@KgFOgma+UTy$U@D zuknyp327;z8N*am3;J3F$oKiXuZIr~Kf(nq@Ys4XWuUdE9Iu0Ah<VRSUZU{VoSNI& z%t7Ts%T;}FnwJg2{#;#DrxAkohE2hdP490zfYZ**@qL1EHC;XB@OeGGOI5eq;={zk zj~XhibSxgursQ(QJ*v-h(630^X8H9Q)lqA2iLcBa={(1>(1G7A%}?gdR#=Qi^W!st zTlDK-^3N=p(P)Cp1@ClSt`igsAqoihN$4_KAjf2*#HXC)f&lg9^N;&g0cy{PbFvx0 z{=6nO-IDdyh>y~W$~C$myVA&`!4WZ<o220$T8cjWKd{v)6S5Icul>KIs{ts1VpG`U zB}7b*D(d=8N_z&S;Fx<_uAkp@#WIdQm0YEI;b*crlU*hp{61s{J>!xOpF%Pfu3d_B zJMjB(5Yj);LarzU@PnF3a(&ohahpTf_;<^*f*NsR0Tg`<v=Kl$4f|a>UJ00`EQTQs zXhD=@E+DI5)E98D7P#QCLijI?U#6Ky^an<gXcxcmWj@Cw5F}9l^6h@o0({UlTFN@Y zM~#Wqw`v<ZBfw%pI9Uyz;5yF-j70IHkq@_^ps@diP0N!-^}S4Am+0ZT*5F@o?uXXE zyR^@_b|{>tE6b~;Wy$UFR!q6ESg;qi!f`(%bD%oU%e<d*)Yoe`;*Ve1&JzIJId_-s zCB%$CL*`<(?DG7?pH1hiYy8Bpx<TkoN>*Br%xS`@h-hNiNvE0de}NIcKSHcFnX(1T zD)|TcH1X@TquC~I;6dJu5xJ@x%=!@Ts%q!U2_l87ZX@QlIf!R<8GgqMRCA*HMGn$+ zkb=13MRdogZW(p%Drk~cSNs}g6xmx2+kt*MDFvUx=Zh`(&PA1CI_$E1ttBhn(O~kW zV;8Odm5Zw8SWNN}kwP-NUhX=H!pue5sM@ZYl<Bepb6#$L^%n5)bYsL#j_3+5OZo#J z&}8^=PQLsaz=$sYPFi#Ew!1K6iL?wx%sa%{4KbjXr=0jK(^=RcH`{~04xv7qXPzXD z;S$7AtKe9-di*c5!PM+9Af=WMO&h(;fu)kjWK0M$dYco`jI~5#c_>cg)t0Q9f}iL> zGLMTV?lgw3S|lm^jThbdvYKK?1I%K4=_AEX*F4Nr43`q){3b_f;w15;g<;G4hDvMy z<Hr9HSz2kd0s5Qr3%=`iHMLi;lOV$KqABo=nO>l%tmG4^K8QFWh`aov)f%E+W&PMe zHF4AZnb1R+d-<On?s;e3%6JfrRl44#x3bDUkY2}|ChGFWAzxWo^C3r`xk|Cx3XW@! zD1tQU`^cp0(>JUTzQc`PS3f|nbakPx=nZE1frV?TGkTvAE4o9odw9CY+9AavHp4S! z%trJN?$CvxdK!ThXK#LS2Buhk4q#Ji%sNvsK#G4RUKaTWeH)rZK=9Y(A_sGb^#Vxe z`>m81s}dHv%r{Jrv|VjFh?3Kc1c$50*GyrFu64`>M30U8pGlAVtrzE8pzXB+Eo+5_ zN8WD;sifBSf}#vFqj2Awp!9(UZ^pXK7FiREpWW)rF}c(yKQsX^+rLKt(^!AnJ$t`4 zx?w30bIXW1*zWD?7ZbsVMn7b^&TP-+Tstixp722uvwocwfd~$(2x8FE#joXHEOULd zD5xI(yIn5j%D;7DsdQ?o=J(|K2<vr%8V8W{zCJ$Cn;92<Io5*5!g)MMerKt3v1`Cu z;#yr1(wKM-E0R&Xkqvk;3u>mz^8CE|P<ZyGsCB*&t+ETJ7Agw#t8gZZc)lTj|A#Qk zaq=jyAcwY_Audt6k;59TSSiN4^97aMkt02<Q_aGE`hW+<7v7bX@5U?)bGW0V!GR<d zuiV{orEf6raPUh59;?ya4MR6Id|2ZbMm`5C%=#Rx$!mRRBZNF9rCoE)1G8sibK<N^ zhq;3>qe&Cm{I6y%^#ksl$>#FV$YZd6l^X!?SWcoQ|2N#fAi!%-E?|$<ZHMXmy)gk9 zkAZ5eExlL_ygR>GmhI<M6{g$Xx8kaAdV$ew+_8w(RA{lyHO9Xkp6zgzlSZ=htfh}> zYV9Wu2j<wtnb=$yz68OEhsv9He;pAEpjXVhlZNO)_!{(xJ?7EaCnZ8sUwiGtT0I(3 ztF^#w$f;7j5)AIZwbh0k>&$A`qWj>JtJvae*LpYO>Uw<p?5&;{(8Z!y9YvLd<TswD zQr?w<Gjn8bee=}b_y$({GcNKQ*B3Y1s>9X_LAs>8wGnKt=7S+iJ%50n5RIe>Er6n4 zDBA<#B$VB>_OXT63H@A?;l8T8WQhJ+r+L6-{plxnz>aG3+OtbJhNyrq-)&`+ubHqW z4-E6|RNcl!Djb*inu`ClUE`Zxm@}|ds#j65uQ>1adDO|_io;$J`@I<%G5SW4(m#Ad zdQyA2d;(9(;iHiKQX@`v)T!XrVS&_tqXsj5l$N+F8UXmee-AxUP)Mfcw)#T71laqp z4%K=RPZ#hr9r1}26nXzhI#Nz4$$0{p<A0iUjB^<2?|=1xLRwdM-Fsk({yEob`KPU? zuufNiGg;91>GPseQUv^E!1i-|OI*z5esS`wxXY`Ub@5nM+U?BPy)LU41wj7!+xP>L z<Ka;ouh3Cqv+M8nOERy3$m{SLCzU<8%I^w7Ksf{0G=A5h`^)+IKW7a8=I}Sy58>Lp zSpd3dZCmG?bM4j@_Qf0j1lI(j$iwJP?$IB092XO=NBkPt1oA94DKkJoiljuG_L0;5 zZ;(wI;7_!GQ$>|>$$&QdZSd>TB~RbQ_$?@puZV2FnzC7>I{0m$YMDOG=$Y;7j&BF6 z*v(Egbw+k|!PvitKTaztrgw)R;X1Mophk#k-FHu&@5ehMq{sWYpgqf6;tdW{>8~A6 z*k>3<R@~Op+yAzw{0aaw=+6D7G3S4?p$>&YfhS_c-p4CIwHqkGBbgohMrEUYx+r=; zV`V=-_MLNN^<G5t4jdR6%67upKt55ET~2H@L01>WF{1jOcT>T>Wz<_ZYN6~A?-=#b z+8+Gg_(oD)cWoJ;U$9KXSe|x2nSSi9EUlf3G~w-#q4Lv<2JZSM@q-b^D+4?$muj?6 zw*W>wr|apzEV48$#Q=Rop}vtq8^asX=9?w0O57Rbf)$nQC`%?U7P48Rmi|_wAXBMD zP6&;?nS-{&lkA0O31X!$s7)@bCyQ7)Om+-g5H?7opUlj?uZrq8S`Z~7LX&z6iLILk zBSRI$k1NZNetknxSir1cuzc=Is!S%Ix%ZU`Y3`iDJt9QeYX+JLI>?}w!K^D*%QC<) zRYUoSF$+CGp&-&5bczv@FbI|yhn8cPIB1!26H*ym-9zlKQHTghxV9K~gLURLdq?Ma zak561wX2s*89_!%0|`q#R|{DUXEW$QMl?+X9>@*UX8{g`n_W(!yFr?SUUq@!3UVrW z{`9_Uks5uBM<@H_-}tp5Wu26^j=EcqxME~?%uQ*+J@dOq+MYaq>rFrJa`29X0P5M9 z48^z`Rc7L&wRVec{8b+bHjTCCa4=_K`zPDuOH~QY(OH(XRTJ+bI`EnvB>NU%h%~wa zJ3Dq$kR#;9s$aF`)EfYYiYAJAf^+<BxUCC}?8Vx;paUdhFFy%ky)uS&q~B+hk90t+ zy+ytrfa7AMiS?Q|AmTwjvgfQxx?3!kgULQJ7xuwxpfJ(IFTHfpSb}ylgkU3D7FbwA zcq$)?gUPI;q5cuxC$@Sep<7m^u7?I4iP_uFGlfj?pf$%Ei>2)I;sqL*HmA+Q9|P@8 zcSHs;5j57$^KkDE?A2{~W1_{+>zWT6!sSfd54v-==zQkk&x3kyymO;GWKxqodL|@F z-cE$f12Ibm+&Ly7gHVGF@IZ^Y^_n}}Z5Cm`!}SKBD|Ov!n^CVS9GWS^ZnsF9#i6J` zXv+Z6;<hGZTga4N)+>(9rHqG}<7ge}1Z_V_qBI0chOCQKw5Fo-aLw(n+(*t&0F%h> z3kW?Ygz)X;^yZ_$Io&58+Bh~HPfMC|XNo~|yKiYATg`xsSvQbWK%stX??R`mmkwFP zRQ{bR>`=C7t}_K*`vWmz@tr)5kL|mbCXn_SltSael6KYVN(YC4f!WD>=d|<KSp1(} zU{<$BajViGPoFQP+tvPT#-BhFV$9fqgOu>^vVClz<1G}^Vv}8jMPRW}Qc)Y*)7nXp zJ1XbyRE&@3jYr`32fOo4&}w9v2)!yNp|fq=#ug+Uv>j^e%!lj_`BLrMHaHFKmiuki z*533UU0kV{a?(D%CD1?azMr5~KUvatIC>B&?O;Xz61Z$+kXg@Vo>zUZOB=2($I6wl zrZ<|y>+zWze_#-k9|<2P9S|&BzY@4m-s(OzGK7jgdAiD^;?9BEkK4tz<4^N$Ws11p zh7u!(`$n!6T+Nb=@V0a)t1ZC10dm@wjo-ctI<u2BQgwFH?80oR*=(=w_|nan5-eye z!6EGnZ9$m+=)_H)tzaF!6;TVD=fIkxx`JPsU5ariu1c|knmh|=usKoAWy^(<%Vq9@ zVu~NSMQjYb^~~_S1-zbL>RVYwguhc-X(6w!TJoDt#RfXE=QeKymVHte0)?&FiOm0~ zOO$l-$WZhjD%{xOfe@2IiB%Wu;eV9hq<PjJx0GeLv8VLz?E4NyM=;Yx16anHBv!SY z@<DY=VE(gEgFXvF{!s-XJ4(aHV%#4C?IoRHWM7xh*z_ToUD3nh1epf!r%IeRe0{l@ zR%G$)0ZVkUjYOoa+i2h0mq<^}B)E5UyEuwUF;v=0^OBl3eQxC%=SLa_fxE;PnC)30 z=k9V&(9XQQTY1!CvZ2L9`>Ci@y7zzdV?%g?=F-ko>(7Zuoj<|B>b)NRyfW)q2O?fj zmK9f7g0rfwRynX|m)C_0`6bT=2*I_}GZm%?3QEhlO@YSP^*Z0c@Qo{xB{uCXH@$k6 zh75?gR57F)nUG)-ND(&Dm725bJ+?BhgWsFkslKwR>!K9GH(5lktrws)_4gUQk~tDJ zH;hnR+%2=24)i;{7Xi%H&?!|Mz4)}D0;Z&>JVkVfWmISlL;}|!CH(8ka?GJQ$G5{t zm9^p>gP6YQ*u$bIj;la7LD!Nr(~7bnV2wY27RerEDF1Xv%wt#QK|0$0&}27Bb3Dl} z40=!V9zWyoSkn)muR{oaOR*@oZdvOZji{X`J51UAFO@^dkF2WJpW~VEn${7vds^^^ z&QwCm0kaN*gNU-Q%#`PXSn{?3^<e=uMkXY%kJk{@GVzp`@G1@N(1p%=51rPVz?3R% z7OXRuIib#~wDS}4Za_h0?BzD+gonRBK+Bvvyc4XrnD*e+bhR^nm)o1Zs{)pI$NFVJ zVtr8(Mh$TAN=RAcw~pau*YXAC)>d00ZLTT`szE*$*wr+F2vgr%=_pBI2BP_X?(ors z_p!H3k#8YuS^;&^`&ZnzfptQNgzv4n8H}J@^V@$gehYEiS@%#;BGMs*EyXreLr)Xj zr`KmUMG=>{U4%mAT>9#FP+R+Z$~BCgrfRXo>nYLE74_3WvwotR$&=jJa{s5oyUj}u zi35n?XSw<Y+wnHACuTBmb|ay3IqbnliH0{4yBBYeaiYL2S<$Q^coAD0x_eqDtKIqA zaMR7oVHQzf**<zFMG@oIx?&6kF4@6WAfb;nY9G$hvyi4~2-^mAb6|E=t=n^L8yg!d zr{j`CA|socnwIkIQetDtAv?J$C1i!Qz1hdD<d2=7@n06VB-x($=;d3-EwAyzS9W)? zZ?Mtu^F552a&lnk>-&+Kz&#(d^DVRegRS^Z_DFU>V?SZfw#!E^O1$2I%i)9c>29{1 ze*eJakNTL~GnqBhSnSl9gTe-r6r<zth4Y#M9!xx0PZ%U4>y@&^g{NNz$-FC?c>VoK z5S}vq`WFQW@;QOKdPns2M7aJ@&N(*|P_?0;(D^AUwU2(FxPJa;gEQku0#l^lKN7QX tyg#KbFYuxP4mtfFI^;++&yWX}52#1(j|q9YcT61Z(b0gYSF1Y3{};cUO=<uD literal 0 HcmV?d00001 diff --git a/deployment/media/wac_management_nic_ga.png b/deployment/media/wac_management_nic_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..5850d18387f4d2a2e9b9087b8c6505b88ac46402 GIT binary patch literal 22481 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_move_ga.png b/deployment/media/wac_move_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..cb025bebd869a9889672c6c58723ecfb7fb7fadf GIT binary patch literal 15860 zcmb`uWl&sC^fov^5&{GW9y|p1;O;uO!{EUQ?(P;m4DKG>-GjTkyUXA%@8q|;AGWss zTW{6whq<S_Yg+HQ-OoAa=}-kZ31mb(L;wJQ43rdA0svqQpy~FHu+S&2`t=A@z&I#L z2m{K;2o9l{ccwzJLI6NjG}7~r_s~3ott7|+06^*b_k+QrlJW%r_(FlALMpDhr>jVU z%Cp4q=QYTm%i>h@Q&44;S+LL*JxNj!!#?JqZ|Yqkf5S~ct@X@D*oBjUm607$@yw#i z>BjkmcrO@iGYZc?<@X~i|DEMiro;H+f^VlUvVwQ!+)bJT<gBl6(Pe+7#Sc0LKo$b( z8)M?I`M&`Hq<D#<$HV@ms9+4xp<?3W|F$Sp>oJo08r_d1^P`Si1blWx*l(D4FNt9B z0RT|&m<dbT8GPU+<A_t8PJ|h(Ru=JscS4jgxxpim+oX5ftLhOV8q;Y#HWieC1qhxh zQ&Q?&oe_TG@m6NgpH2A<P79~g^7shC0xdpjReb{he3x?PdUy1eb=+VJ__kOq_?9^~ zk(Ri}c)b&A-y8-~`?p8=FNhnkge&Am%=>(7&VaZ?0sLG-9PE~}4qNi3uR=<#y51&O zYu@<>OHqpfDY)l>>8tF&^roDJ!kI#hCF`>&*Ys7<7n4;|(!V^rjjM?__U2UVABo`R zVMX)g7ty+UcDAO6G^Llyp;w%YZ9C~XCAT0%tk4F?)oPPqTSffd5gUZb6U7|YO4FT* zf=@4X=a}GOP>@MjA+wS~TuoBzZtVXxVb5YcZkfudKFP8qZo?O}oWTmV8X&^V5Mzik z6axSX@qg}`fn98R{YPc{Lc|~lW)9Rw6N#xrB<2AbxdmU>>K$+nDK5itNHf?UJd=<G z9M;W_g<>eKw$At)FT;<!|9VGRluuYyS`8-(oW02IbdHuI8~j1m@uZQbfp9W24Rs^} z5c-1p`}?C$sQPi;Y_<DeOI|Cr>^F8U8uN8*#tGL}?-Ur8-=hrAN=KtUzW}qJkJr>P zA2`2W=-PdF7;+^W7Vz1@F?z#lQ0@Ils0D8%l~NR>@URzRx)=-8OeNfFYHQt2S+$U* zuuS}@Gxhcnv&QPX6}vQ0e9#DgDk^6>JSxIO3O0t^I@;MXqI3jS!P?(`92^pp9I1f| z034yX$x4Gd_p`BZ@|d-~n@5AjEtmyf^_q{geW`_&ql|}<kdWj(2SvIdhbDP#PsP%g zUD852W`5S0%pvk6)zh>W(R;Pj0rlIf-#SAqrt=!<ylOqDh%eOB@=JDb)P1M~G4A*b zRUg`ryV3A!FS1(|G+j46dPGPYj2$?no^eAfhMk{|0;8+7sRy&a?T`zH_sDAmJP&SS z6sx*vR_C}={*}i3-N$CoxJt{FtUBPWjbiE`M$e%f-)4x`g4pB~f68Q!Dgv2c29;33 z0R(k?9rD<tD2!V(=1%b^>{Hd+(BACih|oX2dl4TImG=>FKv=iA7%VIxjwW0HrZ{k2 zFgJg1p&j?_uhOC3))^R2tjZj2H?+_+n`&kR>yG<?hQ^=fZ+ea|f5`Ez89NzG=5u7a z(9tSaVYJJ(^l|nV?V%|5Ul^cfxKYIJ7Z9vbI;0#7Sm&Ty7C0F42ZqFB2~5wnw!f#1 z2X31feTYwW<a+~ASbUplXgHnym~Uz)vetq&Y1Th**JJ`!NZOyfc_kk{w26<fx1q)S zj+&CQY+7*hZzH$bZ+dp8d|F&bY--ZepjDQ=lljmhFY;tK&YM_JAj<pTSuNt=oK{_p z=RxNrSwHe-nK|Sq;zgP%#znk194yleZUW6|BbMCqjOfMG*!F_1M)8+v$GKnuzRjCX zVZb6qpLshI^D3M>GRrpRiSbb>hR>`ISs_Kddkd=Gq!>Xic<rO*S%kb3mUKA18BeLR ziha9e$)1hLTzY+YGi`k5(~BlNqLgA1bNuO>{O4AA0W2nixO@cJmHhMy=!3LsQ`DjN zi{8Vi1C#xiZ1s?!Z@uG6U<V!dy1=-1fEl(5Wf{bGu&F<`Q~REt-f25MS}GthWLgqD zm+i*rTI*S3<%jhm*v0ty!4prNvZ2=>8U`CNwUA<b!?51JdW=B1U|l>pX5Cj;+zKVt z@?0tC)qFc2HFbQ;|9%uO&Fy*7$_L`l+=?rWi~BwcnuD(S158`vgUk=FL>b^aJ_~X1 z8DaW(ykkTlQ>v60x?=NEo&|z%Ngov#-}lu4I2`C!9_5y9fX;GoSCo0ECtm}PLx}c# zU$TwE(foz*0)K9M`z%A+h3{x;Fs^LMm$8zl!EKKcJiEPuqxaYkh~DMb@j3IAKZbiH z{qX7X`J#L`AzWf_sX8Dxe*^#KB5i(iD895}_34Z1B}}bZ0KZlje{|>7E1Vlo<+v;& zeYZ~JUWmi#52_U{0n-G{MG7r&to}urYwnz}Y_maE0uhx@$58<<3?OUlYybJdAg`c@ z8-h1B+_x7n`D=aYZsaYU{l!B>OxRa=fG>AI|8|>6?qCW9nwThsD15VfsaWO*kD1Vj zyqfCB6B1GwfD?L;QSVMDKmK=S0=E;%U*{7?S6?dF&Qje|#OCEu8p`l(5THxKndJEI zWRrrAEr$w0&{ql=sEqu76F>PWc$`lLUJy#>vD)8GD4`Y3`-&ctp3hn!+>Qr-X)5qN z$1h$?v7imvq+NFCer02ekB4S_oAW&G&d%w1|Mhg}`hO;H|L=WmERX@>W7NNTWT;cc z3$0UU`i@(eS?XJUv>EC=hL4hkRRI2uS?Wf`^lsF6?>mp&1N}P;E{NpZ)^8pMnt{#< z?f*{^Lu9~A=?;tP5HX;SoG*pYv;6K)Wl9RO+AJ?nxUr$6?EM3RTUXRA#<$^T>f`!; zo)CmactjSnHIJzyWprvS)dHil6f=XBm7WEMC$G7j-}pRO4ICVx<RLr&AfNjF*s~{R zmeK*Fx;mVfX)?0#l|f%MecDTAk4)4?Xm4-N4h_LZ)8FV<t5qs;5|LMT7u&CMm)b^> zn96uI3QF>o<tjrfFD<_hBjI7u(Ks*s(`0t_IvkMgaSac`xJteY5?Uqj{i&Ah=m-cI zprCZtooD6e@Z7$bq`mM*gmkX3TnLgZ@Wwkk^gGVxOuN<+qEiksbtH;KSM0&w!TNF# zCig)i9F#j2e^;L^hzg-){?-~&K7Q|bbrXRf)9IbI@e5NxtG>B!$N1M=|EdvIB;t_U z$o0i9J3N<DLmL~&#-@+icnWF_dvGZ8Vpz)8?mT8S>d0CJy=@(MO4I4-W6?xVysNFF zdg-dK5TQn$GY!=fL=-z=83(2?jP{A0EJuD%7NXkW{S+Nos#w#qg*2|^ea&BT_^aHI zSp>6+*saMxmx}M35IrReIxHVI;-GfEL?dSio04%U&FC!ae5SS83f)ui+a;?G>fbB$ zu9xkJ{mo4bZoC=_HgMnuf+NFRm$Pt|B-ighECV_CG2T(G^mkXglWbr~b)s=Lr8M-B zmjmo5Z?Sn{t`o$2yeRJ&js?~8)kZYJ!d5~bMU*wKn(^ChtSgV0<w?%Gk#?rdkXn33 zP+4Q5kNER%%=FQpk5hHgv2hI$evS*OVX05At){f3mk!rA+Frk&23gqe*f%2A#_X@{ zZPhb`3Nm}hW{sw1AgLG4?+ffK?5%Aw*$%wgeb;NJD;b>~1hCfh-$yehHC&ya2#tPn zEde(oOK+I2r(wEY+;-rBFNp^eh~>;5IL~)9_453Mdqk`aDUcY&(pyU{JMb{T-_1P7 zZwt;}wuT$~OmP}U?1?WXwMJzlJR%=y_B2VX<D_fuBFol2pUbZuve)YAQ#s7H+ZC=U z!CR`Z=C8Sp8=x^Ao{r@#;}(XsAN%&0Jc+y7q35T|WubNsv<2k--xAv_BJR!`WaM0u zYOTRK%MIt{!4KsaZ=<>D)Tdwv*O!NZh-dWE9e<k_@slPH@U2qf9f0qEca!I>iv98l zmyySj=7rE$$o{;Ryq`Gtq<h`X?ZtNMp=5_mcY5!vHQd8bCLz7rX>fi`S65eW1i=8_ zYv=CUz8sQtqZ5_Uts~@6_i8TuZPdrr;H5QLce>4M&k_wM!L_1vJ84AnSA+<|tr`V| z+AYIRuH?im2)Dksl*F6YMNDUuK?g#orC4$a>wTd_p3YdHQY^aZjyzZSmHPxt<JrpR z?H|7rL)s8ZN@7GkG>|`zRO;As^1q&=m*8K8EV+lPoN4cX|9<j#`_-MQBkL^Zq7BZH z;fq5%ApXHj!fUT5C~>iry>{(toxwSAA<}_=yE&h^5`Nnt`7p8;eMV1e@BcEe@##{s zw;$dkX=m5TF>;-wLO}P%?TfYjsboEkY%Bws^1Yvhl(bY@jD<D6{NeFZAlrd-Ut5W1 zlQh0^TFleio#LCS&jLM{?WOC=RC&Wb3gpa#3J2tQa?2FP?IKGNE1kcnF85}>bnm=X zS8!ka41Xv=Zj!;rpCFa5uEtrP>D5beJ+$2dzYj`tBEHYJ|E6B=et6;6AwV5Bem1HZ z#`0o2ZM41HnNPke0M?sdGvmze$RL8xs2!)&)6mt#al6e2s3T48=A|Es@DgwX-5lX$ zUL~dmu?^cpn`!0NICwc`Ec(VdFfEX6Do|D)ZWoB_t&-PoG=D9hSjpQOlDOM(T~zO0 zmr1acpQPG&x%<7iFumEIqTY>HKHUDQ8eW2HnRnyR6`+*4kchcB?&~~MGt5~}d3Y+D z$%~9i7C^zTk#nOZPx_QPS*7cE6!r8_D&)sF+(FZPF8zYi>1<O&p+i0JF%8SKg(<f% z(QF!aO*`lyvqYV^V?7(A1jpg&@wD%BnN>tKm_hU9@aeKXqhvnh^>VwQEH4O$)a1>v zsXKAFySuAv?|SUPYI?F`S2E>kKi$W;!P;a|_JM>>U$daAwoJNXS?d7vGXc@}rW#gq zil!M3Z~OG72HXyVmJ?UuA$jM<uSU3WePvW?vBMQ1G4r>+M%r|Ss>!<f<SnIbuN)<I zug&~6iuRWsrGG@Gx{%gMiF|rNYU(c3g-BZ-ME6=lM=l&*{;qKB>%C%&hw=9zc1v+W z^SrBj{_lv(Wl6QRm^0^%ym?z%_F-kvQtaup7<{mAaEWDC?jq`?Z6HKL5-bJ|c|L^c z{;s1PlE0;l9kIl2Lnnq<N;QMKC=&(rykDbzFz+xtE{vux?^mN|oC{f2Scbg`byt`7 zjYEHT?|Im}X?|w#YL|bQSzSKyRq&~%;QC9D4F6j%r~}o5<QaQ{zzg>+Y)->`eZP3V zO~ShC_<K18{Dy?zs)k#}F9AL0i{>N9U`I4Nqx6CwoSH?n!)0yT$}{qtCrT<ak=~Mi z^oS|JNN1!A>KMD&ws%`5PR*Bfh%r-dIXKqEIhI9uEStlQi*yEoq-N2B%yD+`y~#&e zURxb6j}?A6i1`IjiNEgC8*`IQY^5p~ZhOFH)5f6s=dMKI@sx6y1z~z*$b;DI6l1hV zBH25gZ!TJPgTQC{POo*t_=HQw6F*w@*EWEF;yCi%dCllQMKLlz{^N~tlcXBfg#U1p zR~cUG$z*w{9<vjK<KgC>?lMs14=Yx{Pt5I<O{GOc%Zb6;3z^r__V}@>7lI>qvuYn; z{mskKaj>=yXGTxoZhrF6Oo@Qd6aB`eZkOVBP<{D}qI=e_F*p;W6N!Pzxv&y_!ZHF- zQK_mibA7cczH+r)UYQk~<~$#0ufsK~n+DN!C18D$6sLe6c~Q$AL_6&FG2K%*SSZe` zf39{S&q<H0E#nQ$cfzbIe|&p#R&PFwe{m6x0M=`15ea6Gwv;hZbK@0i`Df3AWBXf3 z)_(0^@I78Vq^vz9ihMmOWlvCw$Q18TA0+%~_+~mf5UtoTI&jmc8`4dw@pUjV&~azW ztb`y*%dxgU8ixyaXlM@3IIIWPRghj2VgP|``h8Qj-l+2Ia^KlCGmenvsQ+4PywkE` z*u7mx!ZLQ>`NN~Sj_PgWJw>ewz7}oYG?6g#*mSO%Gef4)YwL?7!%)kYmZQUKyW8Gz z$=`Y6RvJ4jMl<K--IV>6>_dMnc-WWMn}d*rL0oTk@hk8W&I}jnoSp;c<u5*anw6zm z`x)O%pBTa<78)%W32M_ywL;Y=^Lt+gk{foIU9p4{UujJh<`!lvyxQ8f(oqkb-5OAT ziL99u^JX!r&$5Xiy?qUdqsA74=cqM@v8g=9vEi^ZHrIWw!|8?_eY(qZIb3?5xLe&~ z-f*l10^?{sS9>y_flsF9a9KRhm#qu}l5FMxE}=XP5Z2ndx4*uQ&VC!4ryXmD>jiv^ zINn0-J~#4LC{|`-K@5gUX`f@F^v)>ie^lsW$bXB&CD38*EoA>u#Q#IHub7!CRw-vc zVh3qSQ+_u$J!EVr(Fyh!iWkOHL-EIkKealie#M-|N^66j+Q_(}H<=P9zqYrhGg_q( zTx#{p@V;nqxo5{xbJ$zwiEiC#VG~;ENd62{7F|){Uq&3|86m=^=~6ARRmqhZIyoAW z%&FVXvorIMxhx}X=^8QRyixFp9}mr(opyVLVJWal45knd+L|<SW2nGicIug1$=JrJ zc)FQ^VNOv|jeZHA@OdjrmxK^F%GtkoPZ}eRt=dz?GD~#eA_yYLL-<`6=ZdY&yWs-- zhqsnTTQt6GR6h@{!jCW4Sq%p*g&*T&BCg_8sAHWiM~@Fnwt(mB>BEH=)0gj#onAH2 zA~=QC9}2y;(K+(ElXjG*E{6$M!oP(Ounk9i&fiGGM0_G8L*Mp;5!1a-VpcQvqsTwD ze~BWs<MrCwT;_BbU4h8G2F#$GBfgX6Kll-L+n?b!wsvw(oR=wRR_I19f1RkM@o6_# zq~R>N&~;fuaG4ZiEP-HB?W63_18upAh`0fTTK#Qcyh03uFp`!-tzKM?Cr6weDGUib z$sqSx((Pm50A|d@?2vydm^1mC6cDH`qokqHxUrsqk9%U5O~dhL18hIIr8OHLBbwW8 z*q2?_F}hw^GHjXHessrkmuBWbk@8wr5v#MWM&Z`fD_{hgil5eE{I*a1y8U6n@w<rI z&|!G+-aWFD%%yQJ{>;kt&UC5S9O7GbAK9B99vicwZmq|&hEjQO#JgF^VYt|Z;nbq& zWsnmaS;cs(&(-U0y!~7=>)p5qBR2?C{qr`GmT{@xkea%qASJ8V5hs>9M=%YHLE&o4 z7)GEDK|rCp3NcHI#g1BIIM}&HSVPMR3_Q?Rj~3kBM;_M5Cp4r@jr-bWLe_cQ@pz7S z9Oo;K*A6+T(O0##JzvuAK=AUGi61QM4~$}7-`u_3h2(5gilMD#x)Va`Jc}e~oktP3 zIylVcRHkbe<#PS+bX$|0&wBhaDc?MCfxBHX((Mhvr@2A5&L|AZEqQTxcp@_5Zi}gA z8$%)=h~H`d9YIH~j{jEP3NCLW9&@#0JyB<7ip_=d4e2<icPlSN-_0kDt<Ff+rY3hq z*L!4CYrM6tp-Eo%L2!Bk8Eex`)SB+zVU4y<K(2DnR$So0Il^ZA+e*v?GjmV*5;NG$ zXn)Hz!}j?=BEvZy6f2x7PCxoNEHaeehn?+cxmRe{$G&gmQ~zdD<3i8Om4tVy0A&Un z>Gqi+wxf`iS6^Tc1qI=9vzgK)jS)*v1J4rMu-D`*sX9XeCE+p_y5raIGFlutsg~~p zk_wTZCQfM^Mwfgv9+M637<4?0FE*c6XhDC-l)rxd;*hDo#bLgr^2*A8!A&$fU{o#8 z>ye{0_+<Z3H{<b#*ctQpJaEPPC8H;2y8rsSTGcz%{F0=RZkWW-$EPM5R3>!nTOyQ? zWsx!iLc-C%YAfX(awt)5&Z9(MV>-n$Iq0BAUh%duiU17X^Ehxzq-{xH0hiNet`v0q zO?gt1S$DsIux)#RU!aCm4+Wpu%=2%+*=8cjXpObP;b&%C0`If)Frnx<R}C!}hntrR z|9q@=tTPk>APV8ldik5z<>23O^>mMtLoHVe-OR}jAGVFP;;J_-D(}I0XSt;QlI#dF zI^J*Sw+{$nuOjfDl0GN>sN<5|u^A3##a1g%I6ORLB}Y3lJB~?CHZL#Sg70VI-L>^? zBXc#Xh!$|ZL6NI6fYAiaCdCBW*-+{!8*%g&8M&Nrk^fAWK2yu=+*a4C)cQOTz-D2> z{&TkeP)E4~k9p9PHl^K~#-fj7YT9MFoLa}a><dp1BVC&oprJUvk_2SR#dc)*Te<C? zoHY3Q_z<U&r=*R1zMNc#=nqVm=MrI3kL?ET>LRz{9`j`<sv#|L1<ZS3r=G{dND|l6 z{Emy&a*UqCthp-x+f=@VO`XN)2MtakNQ(0T71b_zoTaS%9t^+?0%YI|*>gJApYJK( z&J0<LxHKvN&;Bxr3`0qPJ#YR>xwPQ}b&(VnE)m9>azw1IPB@4Ti|_p134U<cy8L6w zL(H6YUGZ2<@i}(GDNq^xj{?B;>Z4Z5>N>a2z`>@7`1sQKI_2?gTJdJYyN#Roxj+Do z$g~-{do0EGly~uJ0sBgS&Cmgae<urjQUHMFZg-pzHdWFuP)`f4D=Wyl-!CH{Q9L$F zc!*F)ZTvIFIwI7)f)(5%GYFhldO~w#ApZr-YEvRrcoHY{PkNVS5SK278(W)iMCos> z`l*Mkun>$Usl{4%47bJtt+}LhO1-0Xq^c=}{oTqvp`F|1lr%8u9aeUV=a7AsaMAJs z_8R?S1$#QKFL$}dD|NK&7CC(!-88IfX>nd=xeh)8zOanHJ!Uw!alDagX!Q|TiT)U| zg-Mq13qY{w7EQa)OvYdcdlr^ql7>1__U@%Q0XizIoD_euk|A1!V&imukNIL2I0f}0 z=g;T?+I2hYxPOjS8WeSY<{ZoEcqEI+z@AR%D>0}dkr!Eu6eW~Ioi?9Xe-b1tIQiNr zILw?(cP!>DlpR-RE4?!CGJNFdv8#lkyZS{A@xJws4SqEuz&NKfPn+iA!BcH(gJ#W_ z!5oQUf|>r{-LlQ%>KET;nMEF3zXWrF_MybRb{eW3Ft~o;+($dvy4W47nJ!(f#qpGE z<6?~odxpiAkp*Tqw@9=Lm@f!dy#t=IP^wN(m<@p`Tvl;FVWb9!dv@=;1x*#dgjxdD z$awj#KajScq(268artc1<=I+RDTTK7ESE4i`Jdvrcxb`{3YDCZ83=H>ojrB`hD5v* zjORB%?*=}scW|-dQ2Pn~l_CeD=guo(7k`An{}BRE5s!&A=h-R=i^D4LT^c_Nzb{ge zawl%c)5ugwzM16u1q2LbFTnv_c5E#GfZ6P<EJ57ZV&I^At~=^(dA9WDSU_C4h7YNi zBFvrq93o&s056skPc;^NE4oBZUC&maQAYz+ZmN)K_$gR1br?V~j9k9~FchxZNSp?# z`8^YYASmpHTRZ<Hb`}QksLuRVHU1>8G>;V8u-W@NKGjkzK$cHF3OUmpKGwoqvziwZ zH5&cpB_dW09tnyL8Mw0gRZ`T?@3A$xph~)xa~ivsuSCmKV5>mo6t~Bzj`H3~t#o)& z?$;#qS!OLEKml0=4xQ25Pw7@F%vv6+L@h<mp!zGv9XV~n;EFc7T3bafC#eWVrhxpX zS#>4dk57A+6~2|{H^=jD%$g|_o51|VkOVs3*Q7GWKPPogG8b`P^b_U3s<;7yZ)W03 ztayh?p;iUNs?me~As%o(Qr=@fjgL>+m8u(-ba8>=Qo&Cx4Q88X0@^u=d7dfBi>0Ow zeV%6yr8*&AQ)w3OZK&o*xk?eBQ>G(flW#DvROTx*kO4<T2x2@F29;(L2upBmwoh!i z^^W!{Syob`^pdyg%Z4F`eIT|>{~61j5QD+Z@wM(lI^_X5b*jeAXfz1Z-B0yG|Keck z;VIMTRP%_9ix+u)RG-*c0H>dyzAE99_~8<VO_$okJ9F2mbLD1NJ(Iom-d>ZfaBm#U z(OxZEuNX;DXDqyEb?S=Iy5swYd^1!PNC@a;eaIvEDGciOH4bm;oMJjQy5Ay9wDpq~ zubY?Aq@OFqP<^Q8787r-o7qc!yC~71x_lT@{G~^C*WM9FO9yV;^jZ9nbj1GSFkyQB zNn`U*@6&{2H6QhwQ@53?m6FYK#Sz;9%9pwb%#bbm#z;Ng(2u-S*OS~cb%8bCPyUn+ z9*EJNo1vTjSgGD{pH3)>rt3ZalUa>=bx1Z!t?5BxdHH@>c8z#@R^Bi%Fbh{YUFLAE z0^zJ_&<HEcV@#4Ln50~kV=JQ$U0&6EJbg%cSaCJD3<Io%Ro#YTrMI+JELb-@`5HQT zR}&Pdp;>|2@Pm9;xAFVocc0D^>$w{c5}<;I&kIDz?sT}<WKE2V_nL}{c5_>xx71;3 zWM*b&B%1Jn04BuSi!iuCxTCcENDrhQ&sb8TAzoa4nar@#pzidpvuz2@$kQ$n`6FF{ zLq&ja_GeJD9iw-iq$C-7+*t6B;(2|<9(;DpNK(~FrrluVE!ep%d^PXvV;^14^PWo^ zDI!Oev<(br*;lgTD&IQ$3=<Q)ydVdQwsyYroyl$q%iiN2&z-3oDQSrmhsb*bgK;7X zN5>i&`7U`5@5l2EMXLi1@VVF3_4jz8>>UO|JM<riE6UNy(T;{54M(yrQDj?WBrj}} zRZ8okL%XV8BGZK)4I7<7v}!ssK}_U;-Ks{Xn|hVt4Bd`k{*#4wE>gD)3D{xObyYOA zp@WHAR?B1i)rbX`xPw*p_(kpvsAH16tvkAA1zOeh_JwWSIFWpu!D`Al3E&t^xuGEC zGRHR;$UOx4(t%k<#$)J+AT8z<Rp*@V6SB@GoyxGJ6sG~#3)*+?QqNe>!v=AU3pxt# zXl$-<Kja)EtdUyv7RevJP>LKroQ|^B;|{^2<c;VcB*!$R%6<1jYstAnL&@ZS^wqoO zURRB_IZJ1FU4?-%Unxp)s_9hdk3-p+7XSWqeYz?U!2*JMBgg`y_({n<?xyCYn1%J> z#O#!~=T+FPHIytlHAP-|o8`Ft>9`1b=;<}<|Gv*4JC#wpi2j_Ek}43o>Wm8ny^Q*0 zW;yOIe+@OWX*O2$-z?SUMkfzt+a(jKw&%w8-<mXDr1Xlp(*|Y((R%?H9fvv8rJ7Wx zpR|5(A0=SPOUZTJ_Jov50=F7$*w}JK+yHBW6sP=g+Vbu8xj*J_Pi(T44+cYhn>Oc> z+#1hcA{3tOX?#3AH>bLr`DR60fb-(){Cdl_z@mVNo!<^_%!fbdt<|E&vMET)#ADU? zr7vvbT0Z<aPW&6@YGd0mJiPdl1&{OIpMsqo)*T#`UnAlDiR;a%@9}tabU>u68QUrI zwM|*>7Y@&$gd5QWzTgdlX4;GgHOE>am0WKpJ-?9(Rqat^SY}tZ$$HyBm8?B|TGDh- z7-)V<BHNV%><F}><&$YFCh=0bqe+WHksJF{FdxcLLvyilP_EGe6Tn?b1F*?(S@yhl znTov4tj#B;rHb@+r&5ejcC{Z5VTc|$+tu5RDAg4!I0t0WFHxU^bM_${<Swr$5AHy> z7nj3?=C2-Ke8#S76>S$yuc5)3g&(|2*Qqzp7f+_?e8rr?cI2h~zYX=?-K29{99Ac# zam{HPo|Wm8>@%+WJkKfD+}_GLVAJ8wH=zyj?LBQCL@J}~dCt!#S;i&ad(D%y@J6TU z7??(o0e?8`y+3V_oo!AnfItI`rTBI{u!0tkJVBK7Zjj!Ag%6|!x8}MXx^3>_h`|Kz z*r<9JE>v!a_hF78ELT)4t|0hmYV~&=CQw5<a;VMCxZByzEm1m$Qhe^<fvl`Aj_=ge zsSU4|hdNqqI<`U2{+wVXYL3$_Q9bIEN!N(?CL}=O_Fbe%m2yagrc2QE2HN)LB_CZo zv+c`89njucfcr)SrtA?HcX14)K6T6Cn1Dr{%V8N#LHgX9k}?~0nT^EMb)%uIwrWX* zjDm?^rSu(OBB0B@<3ok6X#wL&O?{u<SFU6icb9=(yG#_Nbo(*jM=jT?;UT>Sug!(| z@`mX&J)ax4w(q9%hrBZbW5(R>cnOl@*FZkP%i3W}9Ny~IR*xIqt9&7n%%xg(3xS?_ zAA;seHjtApjxXNL^pC}Xi?+40qk&2=4f7$QV7d^``(&HlnLoh!h|%2FWv=3Gx+|S| zkr3^48)iJhCVYJtwt<CY+2#ynro#?{i^2XH_k_lr?~v=0yAVnSJ}2v+iPy+4?q`=| zu?-+a!%~X=%1A71g3+tGAI5;%><*y1ofL1X$u8Btj>UQ&EkN+Dc36_FjF2)?WZ4jG zL%4`#!rxs4?~<oT+qWt)^1Y?@*pa(At?}4i{jPl|b}ubp3|PL-*ev50@y-_xie-?C zMa9u0AER(X>R;J?x*51FivKtvQ3l>-C=+RqJZ-Ot8Lf@21gb=Md^%_C!1JJfyq+uZ z>aaZ#UK-K7`7XvZ=#wQLDHDftnv3Jhfe(e#Z24eZAZxY51&chV_cf_}%UCH8cyQ2A zy1dI3+gFZ}E+-SF!)31Y(O!!yBfrS5L1<e>-lv800NhrfBVCTL`03&_%6ZgYul8ji ze)tgB?;P}wu<)^A4))x{7mDV^RY*t?w%6p^{|s1%DN_@(vDYWpoE|j8xRJyLqvG-j z^jSXo1#~pmi1t`Kam%v}d#3E3yaFxe0_h6G(~<3qaXO58etYx1z`B^$HCPU)!6?jk zQu6}h{GAcct_g+r3(j}`q~UwdWK~1e+UojGMwha;48PlDU_79Z#jIfC8#s$86p59B zi6uPBad^l*`KeflbU^a_!=#=}1}A3FwnB0^CxtmoE^g>1=d^?jyUkkbGj!l6IqCjn zWD?`VA7M6R6+$Fpo8GF>0Zt!IF||d}Em?tvN>cVyBiieF-;n-Vi2E=l+scTF#QY%@ zV*#6L5Etai87S#4)k6bgo0vrZ;?<;3sQbS!Xhi;29Q7x_0G7UQB|bF_-5?pD`wp3z zSpt9vzU`Y4o(1hBB{QF=#&`ck!3%TK{hvM%<?J+^Yt*a1x*-F6y~WNJ<vW~1yx&l6 z@Vt@at>qYK%^4}(Rh4R&*6TbzGeZn$gh3a;(I)?t5}a_nnsV8+#0dgDH67)%uTDtw z%#0*EG!~m1Uf33sEv1D__npRxSv93~G|VottRT=cOi|rfg=M+3&3G^sF|u>E1^J{Q zXt;+e)Ihq9n1#(u#*u=y#Ja*&C4SkVWQORdhQ!c?+J{3W6Rp<@1|az0h#A{tD&on$ zGG@qDmV8|={#3D7iRXM%ft8-3=^zF_-D*^4IULHLwy!TWj4G_Q-{@)eb`SsbWxCYu z!U&ZUls@^?xO*{gQq)n!y6b<%I1^f;!Wbfp3k?Af?HdK^9uV7Su&HG<J?*7&UB?u? zD9LAPRo-h$D&pN-lcT<G>7f%xiUMbnvke$@;CsbgdMX-l`M@W&DptDg6fDTEKhazO zxp>T63+==;PYFr?sP{D7{1xVa=l}ptz6=InBO`-~39h;8id^-;MF|S38@ox{^RBD+ zt6EiIMRrG<IWgac+*{XYdV&&wDfPB&q+-X}CM!htU?s%^g|lXpbWa|>0yK*kuBa*N zHp!|#A3a*Q3iu0^yAx{$arzoPqJ%u8rQ5G)(<gy?_}XCJ){T>?L@&R_8!DHxhZ!oT zC)eX#w-qcd_OtT6(!w36TlS~z<VWz}3Y(36bdr_WQ$t43dP^xyOf{4q7)H~d$4rV} z6&%K7apsQ^)mF(T**;e}FHswzQ1XYSMB!+Y?)c0`z+Gwx1ad<u!}QT!J+V42a6_HE zl8}$oqS5`RRnIIns)U<2M+ThI?FsTDb1$`jtt?E#Ga|6pWuh$Nj*;A>2a@6wZB}8X z3-2HnSt2Srg*b}a$vDmo;StfK%gZ>`u&^{Z2(`q9NlY&O?xZqNlP`~07yO!uqB%yE zDXZIDn#fGbX1;s2?DgDg;82Wu)=yurO#BN;%Q@QZ+E*1y2Vv)uFA1km4IiX2A<Jfl z6f<uRnICY^EbM>xV)FR?JTsz`oK+FfIEbxn?d3Oj!oYQ=SZ82sz{rg2YTv1}``I-6 z%AAK;#MN;z4BVZ&a6w{5s7t#R=vf~tDuY~oe&`KORn!i-WysT-{S0(G=Q^{30d~F= z%%an>6$)(q(W0(VY#}BV8@pFj;`$}&?R@qE)5giTyTlAB;I6YC#2Pl?JI=e=VN{U_ z1EG#_)zWx3%MPnKS^Yu<6q1!0UUruME_^DLIs8hBu-jU)6hV8VIQ@S9wJSHW^j@N9 zZge;!uEgq~YA~snsW&Hw%smSwJEIMoHiUC{;rDQ#wb02+h_*6X!MgVsu|1m6$0)l- zTY>P@wof-kBCP5i#@gAzMigffhVBkFNaw4{sV;mSQx9D>XT9Qq><*G^EvNM~QbWc} zD`=wbp`ekv<c4~N2hO<i0>~uM^(vh4T(QIo+>M@2loRcJKn!4pmy0Vut;N<DQQi0* z*EoUtgKMNVL+sT-!Zl(NW}>kYFUk&kE>19QOouNJ@uvli%yE+C?wNnW6LqYT1TL`B zZC<HAyljQ=N_dNyEFbR)<@*n-dpwgqJJgICsX2k7KYjFy-PnKJP_Y<mQHgi7Qn9S` z0vbC<)lT=YXir~r7l`PG2`bf6OQ&154f?evtMo%I?5c*`)R~7q=_o(KNY*GG3ri<w ztIjqDO?Mg5j|W!c7C0}dl+2+>W6Wm4GGnX>ztH0XHrUkt#=TV}-&5#lMJ=7PCC0gN zk4XBby1bNKUwp&02s?XBDwgY;Qrshb1cGO}LBF(PP69_KOmvVG`T9WJ?#(vb`!Xol z;O!rlMxi0vRVz}ff4e7w!ltF{@MbsiXhSn6QpF5~c57|bW^kTX=ZfU{rE>z}NF~#* zOY>lG$t%8SUvK^{EsQT_DLD!(xA2xm*6q!iTv>Iw5Z=$3EQWqeLGpKtJ7ZJ=Cb^ml zsW2Y^t?k9%1635O3}acTPy3F(lOlkF<YSO@6GY{-*bE9PvCVgR))q|J9)9Jqxcjhh zOt9ilP+uSFTs8qOK{3`pt2A>*#7A{2<33rJ^7)8d`|hgWm8CCerf>9>hKXcbvvC|k zzaFU=^B=rm(*2Y^DwMe?q%pE=i}feV74s=#Li+uW49OX7TqZv7^&xI%+MwlavlAkW zewzD>%{`|@E4xhL9|dSI0A2WeR7{XX(T@ScQEo{odltt_^;qzFS8QTP1nui0ssdki zPTz>gF}njiqfq{&oKTdv?S_^sU;?AOz>b{Z#_ZY-p4hliyhF}ZU8UB~FUC)ikMu0u z^<2Q!T;GiBdyljTw9uDCuUDi(q$4ooRL*H0D{x&a_IOhrMw2oAwY~IgDi<f}_}X(p zZq;S%^v|_bCymXY8WM^U%@sNuqYpzOJnwO0L{$xxzJ=Lfr;pPh^6}JRkDh4IMrFb& z<km(4yWKf)Xz^o{em24W<fQN`|80|;Odv9hq#_W2N)zsk$nY(+xMwG}5rdz(#7hLf zhFjQ`*pwqJE%i-zC6Tx_@?9yGFLzNy64_wi`?a$|Ge1okgJ3!e<WCpi{5*G=t+$=x z$pLaxvCX8?rF{yaQ$c>;LQabh%+<Fn-@hMl)xAZF`*4@OY!j0imjQgkVq?#zlYDra z_M9{Wpity-BPL&8lc0U(ipx4tEy@1IJJ-Dbv9vAQOJk@Sa)SE2(jLp@)?zua;(T4L z%%zmf>I7x@eB|tBhux4Bge`X+unQ1X#ryeFIj`46NeJrtQYk?rwaV+@q+*N~$6afF zRT%zZyxChP((JkMcski|(g*+kec6kh|L*WImz%058X#+~lUgFmdE&h~#Z_e^Xw0iu zP!Vy8xopa+5f((H9`jR`8{r?CEM3nU)0F+&&b_(6<+8GM+|xnS7hG|Db(Q)s8+H>? z&xw?c6TpEQ%E3SY9GIj*fpS%Nsmf)rjp(Tz^v0x+R+NBELdJsda9P2p0`{SDf8BfA z^=0$jYPb6{Gd&yGuS2{kcGGT1<4q_(_^j2$qeb`E92_@2Dtxd?%mf8#sfCrFCh-*} z!^kfzS_Ryb>jbqm);lB^TD1CAUj1EMwiz&r_W{9V*{k$>?%YKqNtFvblrIF8{>3@d z6r-mB4(e!3s1f~}Nl|jQ;O@z>bbCZy!nggOLrm8fJ1}ay*KTPs@cm9F9Y?4w<nVGt z(OOG4w=0{gUZ_|vlh^-G7I^fhA6LCFnT{82=ETnX<1O$eKEFB3*JWb1p1#6NP>Qiu z3mTdIjY%^q3u{ty&o=X`#XJqn<v-{dHNsab=d5<veW98S$1!f}e!meZ%Jcp(m*COw zb1NMkT~Cm|zrXY8(j@(G{-fV-FfocEjUiTWx6OXiAH&J|6TVEgy^{8Q3Mdy$5H2-{ zRw?hwBdeAz-Lk!Y_3A`@-lZuX7e9SjW_0=f{2=gd?A^uF7?c5GXN&&8It(TL%l5Bp zdTb8Kl<YrIusVw<GJX@cB~}<*IGZ!kR#rS?4A{7$$->)U=zAGf_BIlsAWe@N-yd7p zyt;)5=o_hw|Mo_IS0eGs@|~6S`&VKl65@2skM}G4Lg%oMpp)R|+y%lr#)=Ir^`fL; zWPGp%?b$bgZ}xwfn+<9l#tLWGuRG)oCwU4@m5YTQC`AI%y|)o>c_RpC)5`epzaG@- zKe!e7H0;cBQmALdjGxIa?V74h9;x#U&UR4WI(rx$#(eS}+k}o!E6!p^KHzs!57%Hf z-`T*V;my%z#LgDlTR%CuoMcMOmxmEDX`nq;Gx6@4nGBw7Z&=rpKTsW@3kNF{%iyfz z+W&2v<vL#LnJcG5l{fke3@*Y?#FtS+JBgpypGh0Y*2lW#_BTmzJFdeCOtmJ(bn`)I zP_(a$s-yk<A!pkGM|8yvG<Pi@JLiQzELOGuYT^`U#|5Mywl*n$_**~#(ujx~-m2hb zb?X=1Ob@oHnFXkX=X4TF#Kh#K)5iGjR7J$u;fB^IxNT0wNWdx8(d}Oi<lj#Yg+VPW zK?uqTk9>z}mY52RMR6c|?6>-+eF?c!v&qS;64lPmPJuGe2HVNimr%{ui~o@&O<wRb z{#?PS2eYED$RQ+J*Wo+4Y8tpw;Q1;NXHgUI6D=kE$WIDg<?79-^F_-Xx`iAhUTUkk zbJJRs#bIZ}xKx~i_(#ZI3%F`bMiEz%k{-PEkYWugV6ZdG1zi3X+`zn{!F_Ohb)B~# z?j?1w!mo_SYvrTU_OuoA8Pwd@U9}Q-Eo+)6N)?;c)dWniaks1Nk-fa{HIz|Pd+sVu znAM^UZDHaJf(JO&DsPah#w)w307Wm>2AG$s;;tNrG~WMBMRs9oRT--`sGUZ5XN369 zrHxb~%C_L#cK__R&*0li6VDf}&=8(+EXGC_oxzL&QLD*X`r)~p7mMiSf5cz%2|2&S zI26O`9pYIfd%HTnq<2oA&kS6PWY{8{o54(jFXM>U1nQUBpLgMf8?$zp!CIA$WJtzq zs+cW!ZQ%d_`9J5-lq&RojZ~M;Cq`An|D)Q!0|5O)*l#i<G0CYHYGLrRUaimRX4~JY ze+FS4VWblIO%)-6m>Qj$+Dk$8e{AL%-Co#gS5cbDNz!~Jiuc;eAdn(-%>e*iQr7#K z39MSxx(HSBuhjq9lojN>6L}gsUI#^*<%s{4)ZyTw%~AcAw4q4<L`CwCls)6j#`y;t zDTA`D-Klu!r1`#sZeYlv6aT*$&%PWWEcm$py7@^s`=F{>Ueq1?U)ERr|GQ9$?ds}U z-e<h07g(B8CriTazv5=n2PyR=7rcF?UWNrIJVCD}DG=(ebg)`%GOa7Sami0?ps~N- z3?P<ea?eQjVY)H6Yob<cxLj}s_-cNDUYu(4aN8ZJoaN%9ShhN)=2<OwI>_qt<X?X_ zT+ZZ{)bm_`<V4$zEGY}*y$siX0L(x`oKU@$v3KeU_UTBQhxk~%@z{|;S~gD~JTF5~ zK7IQ1$jRF7@F=HSVx5Z3E*;5<K^ikz5+`-LpYa2hh<t<N)L@^P^m!sT?I@}8#RBp! z+&RN|y$uZAW3hPKzitqeSbU8)fuvsQ9#eZ{3>H7`JHSl9Ltn(TBt>lc!cAVN#rh=V z!f0_(;>~JdHy}r!)^gT<tHjitix+x8ji2@Doecbr$H9Wz6YK5ohrHY@Z>GO4A0N*Y z$4boT)Jyr;li|9#J*Hsq*|m)OAXJEDC47VYEV-wog>k+5r@)wUJVh#Di9u=p{;=5! zk_~jJ*A>gU;cpAtS*jn-jgdtKZlCg)O0WYYV!O2>%_~)_`=`_DRu;F{#`%g*holRh zo4>+XmGYgNF;Dz8*$l%xd?qSI@SWOV2u|dU7oY?_5oXGBqnx=*L=&+wGZ(8@5a}v4 zT0#R7`ue_!NxlIM{nFgq{uPDIBD3~E8?;?KoPg`YY$N4))cg+4jqshTN8+1@UkUMv z0w3^Yo=S-sFw2S2*H1fg8)(0W4%zT<d(M80Yo*p5(S_C3UOwa~^}=ZXJ5k#GJySNZ zi5gVI>d}H9y<gAAM?TQzpxk=olfC7+7|>k<&&INGu}<82B#P3;Jv99Jg>wyxioDG~ zJ3DJ7UPiFL)vd-;+J?DntE`do*UZJPC}{O3_tz1Q?X9fwTS%HJTkpep`Cv^ed&av! zl4Z)13L?9;P~0=+AwQc)EdkevP<`VY8X9u3n*E)C^hRxIG3T2Qf5fo^gx(<`AhKG% zv@zMAa;9fHWy`^7&H%@R4nJ)9!ld)vu_ZO{_QYUp#$M$XI6I-Vm)_TgZXSa4USDtH zGQD5QC2mpHg+x9?y){+YK<|%Dr%;UGKD`w2TGw<i5;d)DAD;rpA!#q=SBJ@7?Y{=8 zPhH6%YhmwGQzKBr*Dxmblm@aGIrwNGEcC8|w#Gr*@Y^o!EXH1*p3mar?mT}qc*>i) z)JnD?8kpx<>p77*k-7MrEss`PwDqvQDFCQfQTFHFciVLZ<mpn)-?(h7F{EdIb>%G2 zIf~{4h*qv<ZJ*>Hn?|u-_-ihbo3!LGr|6O1Z6}tcuo`XrdN}qz864*~zcAi`-G7b3 z!1iQ|%WQf$VY42qPhL(LZ68y!T6gQ{uVtk8ws@O5FXa}xF<ecs|9UMTVNVOglA04h z&5;?;vP<jQ?$g^<LtGISdFfEo&_K)$*?`fTW^wTTaZy@cc~hJJ%HRwa67ghG4#%iP z);_2PP{4rhl@p{aEV&2p<K~MSRslR9Msv_1a3wS*WN_t=HbaMl#9TIzbg7)&doJJ; zQT6APfjpOT8zIjI@1cOWXB01wOCwzL-oT$w4hZwNmvo9_fJaF~6TMb_ZR}tT8jld= z{#jMzx{L$9*?bG=jo4fn_#YF}Qe)+hs!fkin)2EM-=&3%%fN5b=xB4*ub&+&>%^!? zOKLrL@6M+DUopGby^LG0)!%Eg0NCK58sznpI?eO2`5&79*wEVSzDGkpjf5=uDJ0)- zJ_ZKo7};8Vtg<v|c@VyQIOOI?BYL)OZlUo0n$g)f(y)bOldG-Z`F{9J0Oh`Bj^;k~ z1?qeJ^iMIj*u2+s14#IQls;n1p~(25KDc?jJ`!B3OCvwNmSbDaxTaVXWrPQ`nv&gu z>J9P~7$mT<Nq4K;3gX~NjXC5q_t~u0p9wW*{WWU0OIL16jJHFaA@><{Z}M~6pl4}H z!}pglWm?<SD_sUu#8v`{;_ATssZ?s}fznvewmr&EScUEX-UffBz~5=%ddPK#!0t1J z?1zpU-c5=_N7s8v_&E9;L?~9#v$O>Tn<kEtk&*R?1^cjg>!(`Ryd|~L+6$TTXHtG< z#pQDeaynYs%$+BY;q?9qiH>@E3WcEU7*?DLD$`gkwvun<pM*=vaML1YKE(ejEBso- z`lK*$QrGF--RJ4mwiv;<nzAL{WV-`~SWTJmL?W(*L*6!tgIj{7`pa)mO|`2gSpc)B z&~<x3XSKp%JuRyfNPB#dYx5I{m?wG^p@^N{ByH!#Gv+kNldbAB#@+Jy!lwTh(EsL@ zc;0H|doVW}NxJxhH!#9-zdsX&@RfJQ?QfQ!w_@3|fs)UgOjEr!rx~9b(M$C)7sQWY z+lTR<d&i<aXX}-xZLg%ld)y4-u`wgh`td!i5b7JLsYsfG4_+js1Cs6Xf|~ZW8vBVA zrf_$lzij9H2KGPau4h-W@?iyzg1g<@l>d3ZPf|O5>($UgzScpO3#2zgqX*JHw2>1% zQcOeH0_FU4|AQYLFuu1u_wF!&qu(x?F36hfRC$?IKo-aAziuLsTw(&|?>;34>tIAc zp*NJrlZ9EUYzr|9Eslm_g_M80eK8#W5=5UBddUk49scL@|0g=vuJ{WkzWvrGXiSXa zbLIH!)Rp^p%|7W}EY-xg>Y$v+cxdPX+KSn`{{%Dz$jbTrC@?L~#LmtWu>Y?BC?+Rb JF0AkWzX0_D?7jd1 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_restart_ga.png b/deployment/media/wac_restart_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..e2060a19306fa8c8dafff489e544ef47f2f00f22 GIT binary patch literal 32047 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_s2d_enabled_ga.png b/deployment/media/wac_s2d_enabled_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..76b883a58eb861fc357df874753bda7d955d7b07 GIT binary patch literal 35000 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_singlemgmt_ga.png b/deployment/media/wac_singlemgmt_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..22b7e96664c7399cc40821842bf5205c484a3e07 GIT binary patch literal 18855 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 a*!0hS-!j(crRE-)ATdu@KbLh*2~7ZnqEW&C literal 0 HcmV?d00001 diff --git a/deployment/media/wac_storage_validated_ga.png b/deployment/media/wac_storage_validated_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..8b36d1175d08ce94b27a266ced5f3de1b500ae3a GIT binary patch literal 47426 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_system_checks.png b/deployment/media/wac_system_checks.png new file mode 100644 index 0000000000000000000000000000000000000000..8a30beffebd70b735fc963a0d778d55d781f03c2 GIT binary patch literal 28457 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 Y@n(7>`N!ZC82<|uu%;sF-ot1A3*TIRz5oCK literal 0 HcmV?d00001 diff --git a/deployment/media/wac_system_checks_single.png b/deployment/media/wac_system_checks_single.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2a7fe63f8299011e21cd9b30324d1aca3e4339 GIT binary patch literal 21866 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_teamedmgmt_ga.png b/deployment/media/wac_teamedmgmt_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..9b87b18fc6d9bde622d7c0a7b5ebfd9bafe1ec73 GIT binary patch literal 31592 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 T-dpN|UoXf?DoT{SH46AYo48|$ literal 0 HcmV?d00001 diff --git a/deployment/media/wac_validate_storage_ga.png b/deployment/media/wac_validate_storage_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..76161e5e1568dec45127bee620b6dfe66886da70 GIT binary patch literal 29646 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 Im|?*G0a12o&Hw-a literal 0 HcmV?d00001 diff --git a/deployment/media/wac_validated_ga.png b/deployment/media/wac_validated_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..779ae7b5ebf049a8f11c815be03c7fae53d6f0fd GIT binary patch literal 28008 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%0AfU#uQX;0f-B25YM|Jx;z`<!dw2 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_verify_network_ga.png b/deployment/media/wac_verify_network_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..883dade05e14995d3c83447415f8fa14041bb847 GIT binary patch literal 51577 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 AdH?_b literal 0 HcmV?d00001 diff --git a/deployment/media/wac_vm001_ga.png b/deployment/media/wac_vm001_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..03a93f2c7d915d8504a24ff0cbaf6bba9bb4afff GIT binary patch literal 14897 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_vm_storage_deployed_ga.png b/deployment/media/wac_vm_storage_deployed_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ef29e78792006d2ee334c4f025d309ad8681f8 GIT binary patch literal 17109 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 K@hZ_Tf&T;V{I#V3 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_vm_storage_ga.png b/deployment/media/wac_vm_storage_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa7361cf3dc728bae8bef41fb11443352d9bbc2 GIT binary patch literal 10039 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 literal 0 HcmV?d00001 diff --git a/deployment/media/wac_vswitches_ga.png b/deployment/media/wac_vswitches_ga.png new file mode 100644 index 0000000000000000000000000000000000000000..6f10eebc638903011fbce2d3879718ac1399b7d3 GIT binary patch literal 42532 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 literal 0 HcmV?d00001 diff --git a/deployment/scripts/installWac.ps1 b/deployment/scripts/installWac.ps1 new file mode 100644 index 0000000..c8f5f84 --- /dev/null +++ b/deployment/scripts/installWac.ps1 @@ -0,0 +1,11 @@ +$ProgressPreference = "SilentlyContinue" + +mkdir -Path "C:\WAC" + +## Download the MSI file +Invoke-WebRequest -UseBasicParsing -Uri 'https://aka.ms/WACDownload' -OutFile "C:\WAC\WindowsAdminCenter.msi" +#Invoke-WebRequest -UseBasicParsing -Uri 'https://download.microsoft.com/download/1/0/5/1059800B-F375-451C-B37E-758FFC7C8C8B/WindowsAdminCenter2009.msi' -OutFile "C:\WAC\WindowsAdminCenter.msi" + +## install Windows Admin Center +$msiArgs = @("/i", "C:\WAC\WindowsAdminCenter.msi", "/qn", "/L*v", "log.txt", "SME_PORT=443", "SSL_CERTIFICATE_OPTION=generate") +Start-Process msiexec.exe -Wait -ArgumentList $msiArgs \ No newline at end of file diff --git a/deployment/steps/1_DeployAzureVM.md b/deployment/steps/1_DeployAzureVM.md new file mode 100644 index 0000000..249725e --- /dev/null +++ b/deployment/steps/1_DeployAzureVM.md @@ -0,0 +1,233 @@ +Deploy your Azure VM (Prerequisite) +============== +Overview +----------- +With the introduction of [nested virtualization support in Azure](https://azure.microsoft.com/en-us/blog/nested-virtualization-in-azure/ "Nested virtualization announcement blog post") back in 2017, Microsoft opened the door to a number of new and interesting scenarios. Nested virtualization in Azure is particularly useful for validating configurations that would require additional hardware in your environment, such as running Hyper-V hosts and clusters. + +In this guide, you'll walk through the steps to stand up an Azure Stack HCI 20H2 infrastructure. At a high level, this will consist of deploying an Azure VM, running Windows Server 2019, to act as your main Hyper-V host - this will be automatically configured with the relevant roles and features needed for this guide. It will also download all required binaries, and deploy 2 Azure Stack HCI 20H2 nodes, ready for clustering. + +Contents +----------- +- [Overview](#overview) +- [Contents](#contents) +- [Architecture](#architecture) +- [Important Note](#important-note) +- [Get an Azure subscription](#get-an-azure-subscription) +- [Azure VM Size Considerations](#azure-vm-size-considerations) +- [Deploying the Azure VM](#deploying-the-azure-vm) +- [Access your Azure VM](#access-your-azure-vm) +- [Please Read - Finish Setup](#please-read---finish-setup) +- [Next Steps](#next-steps) +- [Troubleshooting](#troubleshooting) +- [Product improvements](#product-improvements) +- [Raising issues](#raising-issues) + +Architecture +----------- + +From an architecture perspective, the following graphic showcases the different layers and interconnections between the different components: + +![Architecture diagram for Azure Stack HCI in Azure](/deployment/media/nested_virt_arch_ga_oct21.png "Architecture diagram for Azure Stack HCI in Azure") + +The outer box represents the Azure Resource Group, which will contain all of the artifacts deployed in Azure, including the virtual machine itself, and accompaying network adapter, storage and so on. You'll deploy an Azure VM running Windows Server 2019 Datacenter. On top of this, you'll run a **2-node Azure Stack HCI 20H2 cluster**. + +Important Note +----------- +The steps outlined in this guide are **specific to running inside an Azure VM**, running on a single Windows Server 2019 OS. If you plan to use these steps in an alternative environment, such as one nested/physical on-premises, the steps may differ and certain procedures may not work. If that is the case, please refer to the official documentation. + +Get an Azure subscription +----------- +To evaluate Azure Stack HCI 20H2 in Azure, you'll need an Azure subscription. If you already have one provided by your company, you can skip this step, but if not, you have a couple of options. + +The first option would apply to Visual Studio subscribers, where you can use Azure at no extra charge. With your monthly Azure DevTest individual credit, Azure is your personal sandbox for dev/test. You can provision virtual machines, cloud services, and other Azure resources. Credit amounts vary by subscription level, but if you manage your AzSHCIHost VM run-time efficiently, you can test the scenario well within your subscription limits. + +The second option would be to sign up for a [free trial](https://azure.microsoft.com/en-us/free/ "Azure free trial link"), which gives you $200 credit for the first 30 days, and 12 months of popular services for free. The credit for the first 30 days will give you plenty of headroom to validate Azure Stack HCI. + +You can also use this same Azure subscription to integrate with Azure Arc, once the deployment is completed. + +Azure VM Size Considerations +----------- + +Now, before you deploy the VM in Azure, it's important to choose a **size** that's appropriate for your needs for this workshop, along with a preferred region. It's highly recommended to choose a VM size that has **at least 64GB memory**. This deployment, by default, recommends using a **Standard_E16s_v4**, which is a memory-optimized VM size, with 16 vCPUs, 128 GiB memory, and no temporary SSD storage. The OS drive will be the default 127 GiB in size and the Azure VM deployment will add an additional 8 data disks (32 GiB each by default), so you'll have around 256GiB to deploy Azure Stack HCI 20H2. You can also make this larger after deployment, if you wish. + +This is just one VM size that we recommend - you can adjust accordingly to suit your needs, even after deployment. The point here is, think about how large an Azure Stack HCI 20H2 infrastructure you'd like to deploy inside this Azure VM, and select an Azure VM size from there. Some potential examples would be: + +**D-series VMs (General purpose) with at least 64GB memory** + +| Size | vCPU | Memory: GiB | Temp storage (SSD): GiB | Premium Storage | +|:--|---|---|---|---| +| Standard_D16s_v3 | 16 | 64 | 128 | Yes | +| Standard_D16_v4 | 16 | 64 | 0 | No | +| **Standard_D16s_v4** | **16** | **64** | **0** | **Yes** | +| Standard_D16d_v4 | 16 | 64 | 600 | No | +| Standard_D16ds_v4 | 16 | 64 | 600 | Yes | + +For reference, the Standard_D16s_v4 VM size costs approximately US $0.77 per hour based on East US region, under a Visual Studio subscription. + +**E-series VMs (Memory optimized - Recommended for this Hybrid Workshop) with at least 64GB memory** + +| Size | vCPU | Memory: GiB | Temp storage (SSD): GiB | Premium Storage | +|:--|---|---|---|---| +| Standard_E8s_v3 | 8 | 64 | 128 | Yes | +| Standard_E8_v4 | 8 | 64 | 0 | No | +| **Standard_E8s_v4** | **8** | **64** | **0** | **Yes** | +| Standard_E8d_v4 | 8 | 64 | 300 | No | +| Standard_E8ds_v4 | 8 | 64 | 300 | Yes | +| Standard_E16s_v3 | 16 | 128 | 256 | Yes | +| **Standard_E16s_v4** | **16** | **128** | **0** | **Yes** | +| Standard_E16d_v4 | 16 | 128 | 600 | No | +| Standard_E16ds_v4 | 16 | 128 | 600 | Yes | + +For reference, the Standard_E8s_v4 VM size costs approximately US $0.50 per hour based on East US region, under a Visual Studio subscription. + +**NOTE 1** - A number of these VM sizes include temp storage, which offers high performance, but is not persistent through reboots, Azure host migrations and more. It's therefore advisable, that if you are going to be running the Azure VM for a period of time, but shutting down frequently, that you choose a VM size with no temp storage, and ensure your nested VMs are placed on the persistent data drive within the OS. + +**NOTE 2** - It's strongly recommended that you choose a VM size that supports **premium storage** - when running nested virtual machines, increasing the number of available IOPS can have a significant impact on performance, hence choosing **premium storage** over Standard HDD or Standard SSD, is strongly advised. Refer to the table above to make the most appropriate selection. + +**NOTE 3** - Please ensure that whichever VM size you choose, it [supports nested virtualization](https://docs.microsoft.com/en-us/azure/virtual-machines/acu "Nested virtualization support") and is [available in your chosen region](https://azure.microsoft.com/en-us/global-infrastructure/services/?products=virtual-machines "Virtual machines available by region"). + +Deploying the Azure VM +----------- +The guidance below provides a simple template-based option for deploying the Azure VM. The template deployment will be automated to the point of which you can proceed immediately to start creating your Azure Stack HCI 20H2 cluster, and progress through your workshop. + +### Deployment detail ### +As part of the deployment, the following steps will be **automated for you**: + +1. A Windows Server 2019 Datacenter VM will be deployed in Azure +2. 8 x 32GiB (by default) Azure Managed Disks will be attached and provisioned with a Simple Storage Space for optimal nested VM performance +3. The Hyper-V role and management tools will be installed and configured +4. An Internal vSwitch will be created and NAT configured to enable outbound networking +5. The DNS role and accompanying management tools will be installed and DNS fully configured +6. The DHCP role and accompanying management tools will be installed and DHCP fully configured. DHCP Scope will be **enabled** +7. Windows Admin Center will be installed and pre-installed extensions updated +8. The Microsoft Edge browser will be installed +9. The Azure Stack HCI 20H2 binaries will be downloaded +10. 2 x Azure Stack HCI 20H2 nodes will be created and deployed, ready to start cluster creation + +This automated deployment **should take around 50 minutes**, due to the image creation of the Azure Stack HCI 20H2 nodes - these are created, **offline patched** and deployed, which takes time. + +### Creating the VM with an Azure Resource Manager JSON Template ### +To keep things simple, and graphical, we'll show you how to deploy your VM via an Azure Resource Manager template. To simplify things further, we'll use the following buttons. + +Firstly, the **Visualize** button will launch the ARMVIZ designer view, where you will see a graphic representing the core components of the deployment, including the VM, NIC, disk and more. If you want to open this in a new tab, **hold CTRL** when you click the button. + +[![Visualize your template deployment](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FAzureStackHCI-EvalGuide%2Fmain%2Fdeployment%2Fjson%2Fazshcihost.json "Visualize your template deployment") + +Secondly, the **Deploy to Azure** button, when clicked, will take you directly to the Azure portal, and upon login, provide you with a form to complete. If you want to open this in a new tab, **hold CTRL** when you click the button. + +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FAzureStackHCI-EvalGuide%2Fmain%2Fdeployment%2Fjson%2Fazshcihost.json "Deploy to Azure") + +Upon clicking the **Deploy to Azure** button, enter the details, which should look something similar to those shown below, and click **Purchase**. + +![Custom template deployment in Azure](/deployment/media/azure_vm_custom_template_new.png "Custom template deployment in Azure") + +**NOTE** - For customers with Software Assurance, Azure Hybrid Benefit for Windows Server allows you to use your on-premises Windows Server licenses and run Windows virtual machines on Azure at a reduced cost. By selecting **Yes** for the "Already have a Windows Server License", **you confirm I have an eligible Windows Server license with Software Assurance or Windows Server subscription to apply this Azure Hybrid Benefit** and have reviewed the [Azure hybrid benefit compliance](http://go.microsoft.com/fwlink/?LinkId=859786 "Azure hybrid benefit compliance document") + +The custom template will be validated, and if all of your entries are correct, you can click **Create**. Within a few minutes, your VM will be created. + +![Custom template deployment in Azure completed](/deployment/media/azure_vm_custom_template_completed.png "Custom template deployment in Azure completed") + +If you chose to **enable** the auto-shutdown for the VM, and supplied a time, and time zone, but want to also add a notification alert, simply click on the **Go to resource group** button and then perform the following steps: + +1. In the **Resource group** overview blade, click the **AzSHCIHost001** virtual machine +2. Once on the overview blade for your VM, **scroll down on the left-hand navigation**, and click on **Auto-shutdown** +3. Ensure the Enabled slider is still set to **On** and that your **time** and **time zone** information is correct +4. Click **Yes** to enable notifications, and enter a Webhook URL, or Email address +5. Click **Save** + +You'll now be notified when the VM has been successfully shut down as the requested time. + +With that completed, skip on to [connecting to your Azure VM](#connect-to-your-azure-vm) + +#### Deployment errors #### +If your Azure VM fails to deploy successfully, and the error relates to the **AzSHCIHost001/ConfigureAzSHCIHost** PowerShell DSC extension, please refer to the [troubleshooting steps below](#troubleshooting). + +Access your Azure VM +----------- + +With your Azure VM (HybridHost001) successfully deployed and configured, you're ready to connect to the VM to start the deployment of the Azure Stack HCI 20H2. + +### Connect to your Azure VM ### +Firstly, you'll need to connect into the VM, with the easiest approach being via Remote Desktop. If you're not already logged into the Azure portal, visit https://portal.azure.com/, and login with the same credentials used earlier. Once logged in, using the search box on the dashboard, enter "**azshcihost**" and once the results are returned, **click on your AzSHCIHost001 virtual machine**. + +![Virtual machine located in Azure](/deployment/media/azure_vm_search.png "Virtual machine located in Azure") + +Once you're on the Overview blade for your VM, along the top of the blade, click on **Connect** and from the drop-down options. + +![Connect to a virtual machine in Azure](/deployment/media/connect_to_vm.png "Connect to a virtual machine in Azure") + +Select **RDP**. On the newly opened Connect blade, ensure the **Public IP** is selected. Ensure the RDP port matches what you provided at deployment time. By default, this should be **3389**. Then click **Download RDP File** and select a suitable folder to store the .rdp file. + +![Configure RDP settings for Azure VM](/deployment/media/connect_to_vm_properties.png "Configure RDP settings for Azure VM") + +Once downloaded, locate the .rdp file on your local machine, and double-click to open it. Click **connect** and when prompted, enter the credentials you supplied when creating the VM earlier. **NOTE**, this should be a **domain account**, which by default, is **azshci\azureuser**. + +**Username:** azshci\azureuser +**Password:** password-you-used-at-VM-deployment-time + +Accept any certificate prompts, and within a few moments, you should be successfully logged into the Windows Server 2019 VM. + +Please Read - Finish Setup +----------- +Once the Azure VM deployment process has completed, your Azure Stack HCI 20H2 nodes are still processing changes, including adding roles and features inside the nested hosts. Please allow ~5 minutes for this process to complete and stabilize. + +You can then optionally shut down your Azure VM, should you wish to continue your evaluation on another day. + +Next Steps +----------- +In this step, you've successfully created and automatically configured your Azure VM, which will serve as the host for your Azure Stack HCI 20H2. You're now ready to move on to the next step. + +* [**Part 2** - Configure your Azure Stack HCI 20H2 Cluster](/deployment/steps/2_DeployAzSHCI.md "Configure your Azure Stack HCI 20H2 Cluster") + +Troubleshooting +----------- +From time to time, a transient, random deployment error may cause the Azure VM to show a failed deployment. This is typically caused by reboots and timeouts within the VM as part of the PowerShell DSC configuration process, in particular, when the Hyper-V role is enabled and the system reboots multiple times in quick succession. We've also seen instances where changes with Chocolatey Package Manager cause deployment issues. + +![Azure VM deployment error](/deployment/media/vm_deployment_error.png "Azure VM deployment error") + +If the error is related to the **AzSHCIHost001/ConfigureAzSHCIHost**, most likely the installation did complete successfully in the end, but to double-check, you can perform these steps: + +1. Follow the steps above to [connect to your Azure VM](#connect-to-your-azure-vm) +2. Once successfully connected, open a **PowerShell console as administrator** and run the following command to confirm the status of the last run: + +```powershell +# Check for last run +Get-DscConfigurationStatus +``` + +**NOTE** - if you receive an error message similar to *"Get-DscConfigurationStatus : Cannot invoke the Get-DscConfigurationStatus cmdlet. The `<Some DSC Process`> cmdlet is in progress and must return before Get-DscConfigurationStatus can be invoked"* you will need to **wait** until the current DSC process has completed. Once completed, you should be able to successfully run the command. + +3. When you run **Get-DscConfigurationStatus**, if you get a status of **Failure** you can re-run the DSC configuration by **running the following commands**: + +```powershell +cd "C:\Packages\Plugins\Microsoft.Powershell.DSC\*\DSCWork\azshcihost.0\AzSHCIHost" +Set-DscLocalConfigurationManager -Path . -Force +Start-DscConfiguration -Path . -Wait -Force -Verbose +``` + +4. Depending on where the initial failure happened, your VM may reboot and you will be disconnected. If that's the case, log back into the VM and wait for deployment to complete. See #2 above to check progress. Generally speaking, once you see the **Edge** and **Windows Admin Center** icons on your desktop, the process has completed. + +![Edge and Windows Admin Center icons](/deployment/media/deployment_complete.png "Edge and Windows Admin Center icons") + +5. If all goes well, you should see the DSC configuration reapplied without issues. If you then re-run the following PowerShell command, you should see success, with over **100 resources** deployed/configured. + +```powershell +# Check for last run +Get-DscConfigurationStatus +``` + +![Result of Get-DscConfigurationStatus](/deployment/media/get-dscconfigurationstatus.png "Result of Get-DscConfigurationStatus") + +**NOTE** - If this doesn't fix your issue, consider redeploying your Azure VM. If the issue persists, please **raise an issue!** + +Product improvements +----------- +If, while you work through this guide, you have an idea to make the product better, whether it's something in Azure Stack HCI, Windows Admin Center, or the Azure Arc integration and experience, let us know! We want to hear from you! + +For **Azure Stack HCI**, [Head on over to the Azure Stack HCI 20H2 Q&A forum](https://docs.microsoft.com/en-us/answers/topics/azure-stack-hci.html "Azure Stack HCI 20H2 Q&A"), where you can share your thoughts and ideas about making the technologies better and raise an issue if you're having trouble with the technology. + +Raising issues +----------- +If you notice something is wrong with this guide, such as a step isn't working, or something just doesn't make sense - help us to make this guide better! Raise an issue in GitHub, and we'll be sure to fix this as quickly as possible! + +If you're having an issue with Azure Stack HCI 20H2 **outside** of this guide, [head on over to the Azure Stack HCI 20H2 Q&A forum](https://docs.microsoft.com/en-us/answers/topics/azure-stack-hci.html "Azure Stack HCI 20H2 Q&A"), where Microsoft experts and valuable members of the community will do their best to help you. \ No newline at end of file diff --git a/deployment/steps/2_DeployAzSHCI.md b/deployment/steps/2_DeployAzSHCI.md new file mode 100644 index 0000000..fbf8f83 --- /dev/null +++ b/deployment/steps/2_DeployAzSHCI.md @@ -0,0 +1,314 @@ +Configure your Azure Stack HCI 20H2 Cluster +============== +Overview +----------- + +So far, you've deployed your Azure VM, that has all the relevant roles and features enabled, including Hyper-V, AD Domain Services, DNS and DHCP. The VM deployment also orchestrated the download of all required binaries, as well as creating and deploying 2 Azure Stack HCI 20H2 nodes, which you'll be configuring in this step. + +Contents +----------- +- [Overview](#overview) +- [Contents](#contents) +- [Architecture](#architecture) +- [Before you begin](#before-you-begin) +- [Allow popups in Edge browser](#allow-popups-in-edge-browser) +- [Creating a (local) cluster](#creating-a-local-cluster) +- [Configuring the cluster witness](#configuring-the-cluster-witness) +- [Next Steps](#next-steps) +- [Product improvements](#product-improvements) +- [Raising issues](#raising-issues) + +Architecture +----------- + +As shown on the architecture graphic below, in this step, you'll take the nodes that were previously deployed, and be **clustering them into an Azure Stack HCI 20H2 cluster**. You'll be focused on **creating a cluster in a single site**. + +![Architecture diagram for Azure Stack HCI 20H2 nested](/deployment/media/nested_virt_arch_ga_oct21.png "Architecture diagram for Azure Stack HCI 20H2 nested") + +Before you begin +----------- +With Windows Admin Center, you now have the ability to construct Azure Stack HCI 20H2 clusters from the vanilla nodes. There are no additional extensions to install, the workflow is built in and ready to go, however, it's worth checking to ensure that your Cluster Creation extension is fully up to date and making a few changes to the Edge browser. + +### Set Microsoft Edge as default browser ### + +To streamline things later, we'll set Microsoft Edge as the default browser over Internet Explorer. + +1. Inside your **AzSHCIHost001 VM**, click on Start, then type "**default browser**" (without quotes) and then under **Best match**, select **Choose a default web browser** + +![Set the default browser](/deployment/media/default_browser.png "Set the default browser") + +2. In the **Default apps** settings view, under **Web browser**, click on **Internet Explorer** +3. In the **Choose an app** popup, select **Microsoft Edge** then **close the Settings window** + +Allow popups in Edge browser +----------- +To give the optimal experience with Windows Admin Center, you should enable **Microsoft Edge** to allow popups for Windows Admin Center. + +1. Still inside your **AzSHCIHost001 VM**, double-click the **Microsoft Edge icon** on your desktop +2. Navigate to **edge://settings/content/popups** +3. Click the slider button to **disable** pop-up blocking +4. Close the **settings tab**. + +### Configure Windows Admin Center ### + +Your Azure VM deployment automatically installed the latest version of Windows Admin Center, however there are some additional configuration steps that must be performed before you can use it to deploy Azure Stack HCI. + +1. **Double-click the Windows Admin Center** shortcut on the desktop. +2. Once Windows Admin Center is open, you may receive notifications in the top-right corner, indicating that some extensions are updating automatically. **Let these finish updating before proceeding**. Windows Admin Center may refresh automatically during this process. +3. Once complete, navigate to **Settings**, then **Extensions** +4. Click on **Installed extensions** and you should see **Cluster Creation** listed as installed + +![Installed extensions in Windows Admin Center](/deployment/media/installed_extensions_cluster.png "Installed extensions in Windows Admin Center") + +____________ + +**NOTE** - Ensure that your Cluster Creation extension is the **latest available version**. If the **Status** is **Installed**, you have the latest version. If the **Status** shows **Update available (1.#.#)**, ensure you apply this update and refresh before proceeding. + +_____________ + +You're now ready to begin deployment of your Azure Stack HCI cluster with Windows Admin Center. Here are the major steps in the Create Cluster wizard in Windows Admin Center: + +* **Get Started** - ensures that each server meets the prerequisites for and features needed for cluster join +* **Networking** - assigns and configures network adapters and creates the virtual switches for each server +* **Clustering** - validates the cluster is set up correctly. For stretched clusters, also sets up up the two sites +* **Storage** - Configures Storage Spaces Direct + +### Decide on cluster type ### +Not only does Azure Stack HCI 20H2 support a cluster in a single site (or a **local cluster** as we'll refer to it going forward) consisting of between 2 and 16 nodes, but, also supports a **Stretch Cluster**, where a single cluster can have nodes distrubuted across two sites. + +* If you have 2 Azure Stack HCI 20H2 nodes, you will be able to create a **local cluster** +* If you have 4 Azure Stack HCI 20H2 nodes, you will have a choice of creating either a **local cluster** or a **stretch cluster** + +In this workshop, we'll be focusing on deploying a **local cluster** but if you're interested in deploying a stretch cluster, you can [check out the official docs](https://docs.microsoft.com/en-us/azure-stack/hci/concepts/stretched-clusters "Stretched clusters overview on Microsoft Docs") + +Creating a (local) cluster +----------- +This section will walk through the key steps for you to set up the Azure Stack HCI 20H2 cluster with the Windows Admin Center + +1. Connect to your **AzSHCIHost001**, and open **Windows Admin Center** using the shortcut on your desktop. +2. Once logged into Windows Admin Center, under **All connections**, click **Add** +3. On the **Add or create resources popup**, under **Server clusters**, click **Create new** to open the **Cluster Creation wizard** + +### Get started ### + +![Choose cluster type in the Create Cluster wizard](/deployment/media/wac_cluster_type_ga.png "Choose cluster type in the Create Cluster wizard") + +1. Ensure you select **Azure Stack HCI**, select **All servers in one site** and cick **Create** +2. On the **Check the prerequisites** page, review the requirements and click **Next** +3. On the **Add Servers** page, supply a **username**, which should be **azshci\azureuser** and **password-you-used-at-VM-deployment-time** and then one by one, enter the node names of your Azure Stack HCI 20H2 nodes (AZSHCINODE01 and AZSHCINODE02), clicking **Add** after each one has been located. Each node will be validated, and given a **Ready** status when fully validated. This may take a few moments - once you've added all nodes, click **Next** + +![Add servers in the Create Cluster wizard](/deployment/media/add_nodes_ga.png "Add servers in the Create Cluster wizard") + +4. On the **Join a domain** page, details should already be in place, as these nodes have already been joined to the domain to save time. If this wasn't the case, WAC would be able to configure this for you. Click **Next** + +![Joined the domain in the Create Cluster wizard](/deployment/media/wac_domain_joined_ga.png "Joined the domain in the Create Cluster wizard") + +1. On the **Install features** page, Windows Admin Center will query the nodes for currently installed features, and will typically request you install required features. In this case, all features have been previously installed to save time, as this would take a few moments. Once reviewed, click **Next** + +![Installing required features in the Create Cluster wizard](/deployment/media/wac_installed_features_ga.png "Installing required features in the Create Cluster wizard") + +6. On the **Install updates** page, Windows Admin Center will query the nodes for available updates, and will request you install any that are required. For the purpose of this guide and to save time, we'll ignore this and click **Next** +7. On the **Install hardware updates** page, in a nested environment this doesn't apply, so click **Next** +8. On the **Restart servers** page, if required, click **Restart servers**, otherwise, click **Next: Networking** + +![Restart nodes in the Create Cluster wizard](/deployment/media/wac_restart_ga.png "Restart nodes in the Create Cluster wizard") + +### Networking ### +With the servers configured with the appropriate features, updated and rebooted, you're ready to configure your network. You have a number of different choices here, so we'll try to explain why we're making each selection, so you can better apply it to your environment further down the road. + +Firstly, Windows Admin Center will verify your networking setup - it'll tell you how many NICs are in each node, along with relevant hardware information, MAC address and status information. Review for accuracy, and then click **Next** + +![Verify network in the Create Cluster wizard](/deployment/media/wac_verify_network_ga.png "Verify network in the Create Cluster wizard") + +The first key step with setting up the networking with Windows Admin Center, is to choose a management NIC that will be dedicated for management use. You can choose either a single NIC, or two NICs for redundancy. This step specifically designates 1 or 2 adapters that will be used by the Windows Admin Center to orchestrate the cluster creation flow. It's mandatory to select at least one of the adapters for management, and in a physical deployment, the 1GbE NICs are usually good candidates for this. + +As it stands, this is the way that the Windows Admin Center approaches the network configuration, however, if you were not using the Windows Admin Center, through PowerShell, there are a number of different ways to configure the network to meet your needs. We will work through the Windows Admin Center approach in this guide. + +#### Network Setup Overview #### +Each of your Azure Stack HCI 20H2 nodes should have 4 NICs. For this simple evaluation, you'll dedicate the NICs in the following way: + +* 1 NIC will be dedicated to management. This NIC will reside on the 192.168.0.0/16 subnet. No virtual switch will be attached to this NIC. +* 1 NIC will be dedicated to VM traffic. A virtual switch will be attached to this NIC and the Azure Stack HCI 20H2 host will no longer use this NIC for it's own traffic. +* 2 NICs will be dedicated to storage traffic. They will reside on 2 separate subnets, 10.10.11.0/24 and 10.10.12.0/24. No virtual switches will be attached to these NICs. + +Again, this is just one **example** network configuration for the simple purpose of evaluation. + +1. Back in the Windows Admin Center, on the **Select the adapters to use for management** page, ensure you select the **One physical network adapters for management** box + +![Select management adapter in the Create Cluster wizard](/deployment/media/wac_management_nic_ga.png "Select management adapter in the Create Cluster wizard") + +2. Then, for each node, **select the highlighted NIC** that will be dedicated for management. The reason only one NIC is highlighted, is because this is the only NICs that has an IP address on the same network as the WAC instance. Once you've finished your selections, scroll to the bottom, then click **Apply and test**. This will take a few moments. + +![Select management adapters in the Create Cluster wizard](/deployment/media/wac_singlemgmt_ga.png "Select management adapters in the Create Cluster wizard") + +3. Windows Admin Center will then apply the configuration to your NICs. When complete and successful, click **Next** +4. On the **Virtual Switch** page, you have a number of options + +![Select vSwitch in the Create Cluster wizard](/deployment/media/wac_vswitches_ga.png "Select vSwitch in the Create Cluster wizard") + +* **Create one virtual switch for compute and storage together** - in this configuration, your Azure Stack HCI 20H2 nodes will create a vSwitch, comprised of multiple NICs, and the bandwidth available across these NICs will be shared by the Azure Stack HCI 20H2 nodes themselves, for storage traffic, and in addition, any VMs you deploy on top of the nodes, will also share this bandwidth. +* **Create one virtual switch for compute only** - in this configuration, you would leave some NICs dedicated to storage traffic, and have a set of NICs attached to a vSwitch, to which your VMs traffic would be dedicated. +* **Create two virtual switches** - in this configuration, you can create separate vSwitches, each attached to different sets of underlying NICs. This may be useful if you wish to dedicate a set of underlying NICs to VM traffic, and another set to storage traffic, but wish to have vNICs used for storage communication instead of the underlying NICs. +* You also have a check-box for **Skip virtual switch creation** - if you want to define things later, that's fine too + +1. Select the **Create one virtual switch for compute only**, and select the NIC on each node with the **10.10.13.x IP address**, then click **Next** + +![Create single vSwitch for Compute in the Create Cluster wizard](/deployment/media/wac_compute_vswitch_ga.png "Create single vSwitch for Compute in the Create Cluster wizard") + +6. On the **RDMA** page, you're now able to configure the appropriate RDMA settings for your host networks. If you do choose to tick the box, in a nested environment, you'll be presented with an error, so click **Next** + +![Error message when configuring RDMA in a nested environment](/deployment/media/wac_enable_rdma.png "Error message when configuring RDMA in a nested environment") + +7. On the **Define networks** page, this is where you can define the specific networks, separate subnets, and optionally apply VLANs. In this **nested environment**, we now have 3 NICs remaining. Configure your remaining NICs as follows, by clicking on a field in the table and entering the appropriate information. + +**NOTE** - we have a simple flat network in this configuration. One of the NICs have been claimed by the Management NIC, The remaining NICs will be show in the table in WAC, so ensure they align with the information below. WAC won't allow you to proceed unless everything aligns correctly. + +| Node | Name | IP Address | Subnet Mask +| :-- | :-- | :-- | :-- | +| AZSHCINODE01 | Storage 1 | 10.10.11.1 | 24 +| AZSHCINODE01 | Storage 2 | 10.10.12.1 | 24 +| AZSHCINODE01 | VM | 10.10.13.1 | 24 +| AZSHCINODE02 | Storage 1 | 10.10.11.2 | 24 +| AZSHCINODE02 | Storage 2 | 10.10.12.2 | 24 +| AZSHCINODE02 | VM | 10.10.13.2 | 24 + +When you click **Apply and test**, Windows Admin Center validates network connectivity between the adapters in the same VLAN and subnet, which may take a few moments. Once complete, your configuration should look similar to this: + +![Define networks in the Create Cluster wizard](/deployment/media/wac_define_network_ga.png "Define networks in the Create Cluster wizard") + +**NOTE**, You *may* be prompted with a **Credential Security Service Provider (CredSSP)** box - read the information, then click **Yes** + +![Validate cluster in the Create Cluster wizard](/deployment/media/wac_credssp_ga.png "Validate cluster in the Create Cluster wizard") + +8. Once the networks have been verified, you can optionally review the networking test report, and once complete, click **Next** + +9. Once changes have been successfully applied, click **Next: Clustering** + +### Clustering ### +With the network configured for the workshop environment, it's time to construct the local cluster. + +1. At the start of the **Cluster** wizard, on the **Validate the cluster** page, click **Validate**. + +2. Cluster validation will then start, and will take a few moments to complete - once completed, you should see a successful message. + +**NOTE** - Cluster validation is intended to catch hardware or configuration problems before a cluster goes into production. Cluster validation helps to ensure that the Azure Stack HCI 20H2 solution that you're about to deploy is truly dependable. You can also use cluster validation on configured failover clusters as a diagnostic tool. If you're interested in learning more about Cluster Validation, [check out the official docs](https://docs.microsoft.com/en-us/azure-stack/hci/deploy/validate "Cluster validation official documentation"). + +![Validation complete in the Create Cluster wizard](/deployment/media/wac_validated_ga.png "Validation complete in the Create Cluster wizard") + +1. Optionally, if you want to review the validation report, click on **Download report** and open the file in your browser. +2. Back in the **Validate the cluster** screen, click **Next** +3. On the **Create the cluster** page, enter your **cluster name** as **AZSHCICLUS** (IMPORTANT - make sure you use AZSHCICLUS as the name of the cluster as we pre-created the AD object in Active Directory to reflect this name) +4. Under **IP address**, click **Specify one or more static addresses**, and enter **192.168.0.4** +5. Expand **Advanced** and review the settings, then click **Create cluster** + +![Finalize cluster creation in the Create Cluster wizard](/deployment/media/wac_create_clus_static_ga.png "Finalize cluster creation in the Create Cluster wizard") + +6. With all settings confirmed, click **Create cluster**. This will take a few moments. Once complete, click **Next: Storage** + +![Cluster creation successful in the Create Cluster wizard](/deployment/media/wac_cluster_success_ga.png "Cluster creation successful in the Create Cluster wizard") + + +With the cluster successfully created, you're now good to proceed on to configuring your storage. Whilst less important in a fresh nested environment, it's always good to start from a clean slate, so first, you'll clean the drives before configuring storage. + +1. On the storage landing page within the Create Cluster wizard, click **Erase Drives**, and when prompted, with **You're about to erase all existing data**, click **Erase drives**. Once complete, you should have a successful confirmation message, then click **Next** + +![Cleaning drives in the Create Cluster wizard](/deployment/media/wac_clean_drives_ga.png "Cleaning drives in the Create Cluster wizard") + +2. On the **Check drives** page, validate that all your drives have been detected, and show correctly. As these are virtual disks in a nested environment, they won't display as SSD or HDD etc. You should have **4 data drives** per node. Once verified, click **Next** + +![Verified drives in the Create Cluster wizard](/deployment/media/wac_check_drives_ga.png "Verified drives in the Create Cluster wizard") + +3. Storage Spaces Direct validation tests will then automatically run, which will take a few moments. + +![Verifying Storage Spaces Direct in the Create Cluster wizard](/deployment/media/wac_validate_storage_ga.png "Verifying Storage Spaces Direct in the Create Cluster wizard") + +4. Once completed, you should see a successful confirmation. You can scroll through the brief list of tests, or alternatively, click to **Download report** to view more detailed information, then click **Next** + +![Storage verified in the Create Cluster wizard](/deployment/media/wac_storage_validated_ga.png "Storage verified in the Create Cluster wizard") + +5. The final step with storage, is to **Enable Storage Spaces Direct**, so click **Enable**. This will take a few moments. + +![Storage Spaces Direct enabled in the Create Cluster wizard](/deployment/media/wac_s2d_enabled_ga.png "Storage Spaces Direct enabled in the Create Cluster wizard") + +6. With Storage Spaces Direct enabled, click **Next:SDN** + +### SDN ### + +With Storage configured, for the purpose of this lab, we will skip the SDN configuration. + +1. On the **Define the Network Controller cluster** page, click **Skip** +2. On the **confirmation page**, click on **Go to connections list** + +Configuring the cluster witness +----------- +By deploying an Azure Stack HCI 20H2 cluster, you're providing high availability for workloads. These resources are considered highly available if the nodes that host resources are up; however, the cluster generally requires more than half the nodes to be running, which is known as having quorum. + +Quorum is designed to prevent split-brain scenarios which can happen when there is a partition in the network and subsets of nodes cannot communicate with each other. This can cause both subsets of nodes to try to own the workload and write to the same disk which can lead to numerous problems. However, this is prevented with Failover Clustering's concept of quorum which forces only one of these groups of nodes to continue running, so only one of these groups will stay online. + +In this step, we're going to utilize a **Cloud witness** to help provide quorum. If you want to learn more about quorum, [check out the official documentation.](https://docs.microsoft.com/en-us/azure-stack/hci/concepts/quorum "Official documentation about Cluster quorum") + +As part of this guide, we're going to set up cluster quorum, using **Windows Admin Center**. + +1. If you're not already, ensure you're logged into your **Windows Admin Center** instance, and click on your **azshciclus** cluster that you created earlier + +![Connect to your cluster with Windows Admin Center](/deployment/media/wac_azshciclus_ga.png "Connect to your cluster with Windows Admin Center") + +2. You may be prompted for credentials, so log in with your **azshci\azureuser** credentials and tick the **Use these credentials for all connections** box. You should then be connected to your **azshciclus cluster** +3. After a few moments of verification, the **cluster dashboard** will open. +4. On the **cluster dashboard**, at the very bottom-left of the window, click on **Settings** +5. In the **Settings** window, click on **Witness** and under **Witness type**, use the drop-down to select **Cloud witness** + +![Set up cloud witness in Windows Admin Center](/deployment/media/wac_cloud_witness_new_ga.png "Set up cloud witness in Windows Admin Center") + +6. Open a new tab in your browser, and navigate to **https://portal.azure.com** and login with your Azure credentials +7. You should already have a subscription from an earlier step, but if not, you should [review those steps and create one, then come back here](/deployment/steps/1_DeployAzureVM.md#get-an-azure-subscription) +8. Once logged into the Azure portal, click on **Create a Resource**, click **Storage**, then **Storage account** +9. For the **Create storage account** blade, ensure the **correct subscription** is selected, then enter the following: + + * Resource Group: **Create new**, then enter **azshcicloudwitness**, and click **OK** + * Storage account name: **azshcicloudwitness** + * Region: **Select your preferred region** + * Performance: **Only standard is supported** + * Redundancy: **Locally-redundant storage (LRS)** - Failover Clustering uses the blob file as the arbitration point, which requires some consistency guarantees when reading the data. Therefore you must select Locally-redundant storage for Replication type. + +![Set up storage account in Azure](/deployment/media/azure_cloud_witness_ga.png "Set up storage account in Azure") + +1. On the **Advanced** page, ensure that **Enable blob public access** is **unchecked**, and **Minimum TLS version** is set to **Version 1.2** +2. On the **Networking**, **Data protection** and **Tags** pages, accept the defaults and press **Next** +3. When complete, click **Create** and your deployment will begin. This should take a few moments. +4. Once complete, in the **notification**, click on **Go to resource** +5. On the left-hand navigation, under Settings, click **Access Keys**. When you create a Microsoft Azure Storage Account, it is associated with two Access Keys that are automatically generated - Primary Access key and Secondary Access key. For a first-time creation of Cloud Witness, use the **Primary Access Key**. There is no restriction regarding which key to use for Cloud Witness. +6. Click on **Show keys** and take a copy of the **Storage account name** and **key1** + +![Configure Primary Access key in Azure](/deployment/media/azure_keys_ga.png "Configure Primary Access key in Azure") + +16. On the left-hand navigation, under Settings, click **Properties** and make a note of your **blob service endpoint**. + +![Blob Service endpoint in Azure](/deployment/media/azure_blob_ga.png "Blob Service endpoint in Azure") + +**NOTE** - The required service endpoint is the section of the Blob service URL **after blob.**, i.e. for our configuration, **core.windows.net** + +17. With all the information gathered, return to the **Windows Admin Center** and complete the form with your values, then click **Save** + +![Providing storage account info in Windows Admin Center](/deployment/media/wac_azure_key_ga.png "Providing storage account info in Windows Admin Center") + +18. Within a few moments, your witness settings should be successfully applied and you have now completed configuring the quorum settings for the **azshciclus** cluster. + +### Congratulations! ### +You've now successfully deployed and configured your Azure Stack HCI 20H2 cluster! + +Next Steps +----------- +In this step, you've successfully created a nested Azure Stack HCI 20H2 cluster using Windows Admin Center. With this complete, you can now [Integrate Azure Stack HCI 20H2 with Azure](/deployment/steps/3_AzSHCIIntegration.md "Integrate Azure Stack HCI 20H2 with Azure") + +Product improvements +----------- +If, while you work through this guide, you have an idea to make the product better, whether it's something in Azure Stack HCI, Windows Admin Center, or the Azure Arc integration and experience, let us know! We want to hear from you! + +For **Azure Stack HCI**, [Head on over to the Azure Stack HCI 20H2 Q&A forum](https://docs.microsoft.com/en-us/answers/topics/azure-stack-hci.html "Azure Stack HCI 20H2 Q&A"), where you can share your thoughts and ideas about making the technologies better and raise an issue if you're having trouble with the technology. + +Raising issues +----------- +If you notice something is wrong with this guide, such as a step isn't working, or something just doesn't make sense - help us to make this guide better! Raise an issue in GitHub, and we'll be sure to fix this as quickly as possible! + +If you're having an issue with Azure Stack HCI 20H2 **outside** of this guide, [head on over to the Azure Stack HCI 20H2 Q&A forum](https://docs.microsoft.com/en-us/answers/topics/azure-stack-hci.html "Azure Stack HCI 20H2 Q&A"), where Microsoft experts and valuable members of the community will do their best to help you. \ No newline at end of file diff --git a/deployment/steps/3_AzSHCIIntegration.md b/deployment/steps/3_AzSHCIIntegration.md new file mode 100644 index 0000000..d20f683 --- /dev/null +++ b/deployment/steps/3_AzSHCIIntegration.md @@ -0,0 +1,348 @@ +Integrate Azure Stack HCI 20H2 with Azure +============== +Overview +----------- + +With your Azure Stack HCI 20H2 cluster deployed successfully, you need to register this cluster to unlock full functionality. + +Contents +----------- +- [Overview](#overview) +- [Contents](#contents) +- [Prerequisites for cluster registration](#prerequisites-for-cluster-registration) +- [Complete Registration](#complete-registration) +- [Next Steps](#next-steps) +- [Product improvements](#product-improvements) +- [Raising issues](#raising-issues) + +Azure Stack HCI 20H2 is delivered as an Azure service and needs to register within 30 days of installation per the Azure Online Services Terms. With our cluster configured, we'll now register your Azure Stack HCI 20H2 cluster with **Azure Arc** for monitoring, support, billing, and hybrid services. Upon registration, an Azure Resource Manager resource is created to represent each on-premises Azure Stack HCI 20H2 cluster, effectively extending the Azure management plane to Azure Stack HCI 20H2. Information is periodically synced between the Azure resource and the on-premises cluster. One great aspect of Azure Stack HCI 20H2, is that the Azure Arc registration is a native capability of Azure Stack HCI 20H2, so there is no agent required. + +**NOTE** - After registering your Azure Stack HCI 20H2 cluster, the **first 60 days usage will be free**. + +Prerequisites for cluster registration +----------- + +Firstly, **you need an Azure Stack HCI 20H2 cluster**, which we've just created, so you're good there. + +Your nodes need to have **internet connectivity** in order to register and communicate with Azure. If you've been running nested in Azure, you should have this already set up correctly, but if you're running nested on a local physical machine, make any necessary adjustments to your InternalNAT switch to allow internet connections through to your nested Azure Stack HCI 20H2 nodes. + +You'll need an **Azure subscription**, along with appropriate **Azure Active Directory permissions** to complete the registration process. If you don't already have them, you'll need to ask your Azure AD administrator to grant permissions or delegate them to you. You can learn more about this below. + +For the simplest registration experience, have an **Azure AD admin** (Owner or User Access Administrator with Contributor role) complete the registration process using either Windows Admin Center or PowerShell. + +### Understanding Azure subscription permissions + +If you don’t already have an Azure account, [create one](https://azure.microsoft.com/). + +You can use an existing subscription of any type: +- Free account with Azure credits [for students](https://azure.microsoft.com/free/students/) or [Visual Studio subscribers](https://azure.microsoft.com/pricing/member-offers/credit-for-visual-studio-subscribers/) +- [Pay-as-you-go](https://azure.microsoft.com/pricing/purchase-options/pay-as-you-go/) subscription with credit card +- Subscription obtained through an Enterprise Agreement (EA) +- Subscription obtained through the Cloud Solution Provider (CSP) program + +The user registering the cluster must have Azure subscription permissions to: + +- Register a resource provider +- Create/Get/Delete Azure resources and resource groups + +If your Azure subscription is through an EA or CSP, the easiest way is to ask your Azure subscription admin to assign a built-in "Owner" role to your subscription, or a "User Access Administrator" role along with a "Contributor" role. + +#### Optional - Create a Custom Azure Role #### + +**Your admins may prefer a more restrictive option than using Owner, or Contributor**. In this case, it's possible to create a custom Azure role specific for Azure Stack HCI registration by following these steps: + +1. Create a json file called **CustomHCIRole.json** with following content. Make sure to change <subscriptionID> to your Azure subscription ID. To get your subscription ID, visit [portal.azure.com](https://portal.azure.com), navigate to Subscriptions, and copy/paste your ID from the list. + + ```json + { + "Name": "Azure Stack HCI registration role", + "Id": null, + "IsCustom": true, + "Description": "Custom Azure role to allow subscription-level access to register Azure Stack HCI", + "Actions": [ + "Microsoft.Resources/subscriptions/resourceGroups/write", + "Microsoft.Resources/subscriptions/resourceGroups/read", + "Microsoft.Resources/subscriptions/resourceGroups/delete", + "Microsoft.AzureStackHCI/register/action", + "Microsoft.AzureStackHCI/Unregister/Action", + "Microsoft.AzureStackHCI/clusters/*", + "Microsoft.Authorization/roleAssignments/write", + "Microsoft.HybridCompute/register/action", + "Microsoft.GuestConfiguration/register/action" + ], + "NotActions": [ + ], + "AssignableScopes": [ + "/subscriptions/<subscriptionId>" + ] + } + ``` + +2. Create the custom role: + + ```powershell + New-AzRoleDefinition -InputFile <path to CustomHCIRole.json> + ``` + +3. Assign the custom role to the user: + + ```powershell + $user = Get-AzAdUser -DisplayName <userdisplayname> + $role = Get-AzRoleDefinition -Name "Azure Stack HCI registration role" + New-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionId $role.Id -Scope /subscriptions/<subscriptionid> + ``` + +### Understanding required Azure Active Directory permissions ### +In addition to creating an Azure resource in your subscription, registering Azure Stack HCI creates an app identity in your Azure AD tenant. This identity is conceptually similar to a user. The app identity inherits the cluster name. This identity acts on behalf on the Azure Stack HCI cloud service, as appropriate, within your subscription. + +If the user who registers the cluster is an Azure AD administrator or has sufficient permissions, this all happens automatically. No additional action is required. Otherwise, you might need approval from your Azure AD administrator to complete registration. Your administrator can either explicitly grant consent to the app, or they can delegate permissions so that you can grant consent to the app: + +![Azure Active Directory Permissions](/deployment/media/aad_permissions.png "Azure Active Directory Permissions") + +The user who runs Register-AzStackHCI needs Azure AD permissions to: + +The user who runs `Register-AzStackHCI` needs Azure AD permissions to: + +- Create (`New-Remove-AzureADApplication`), get (`Get-Remove-AzureADApplication`), set (`Set-Remove-AzureADApplication`), or remove (`Remove-AzureADApplication`) Azure AD applications. +- Create (`New-Get-AzureADServicePrincipal`) or get (`Get-AzureADServicePrincipal`) the Azure AD service principal. +- Manage Active Directory application secrets (`New-Remove-AzureADApplicationKeyCredential`, `Get-Remove-AzureADApplicationKeyCredential`, or `Remove-AzureADApplicationKeyCredential`). +- Grant consent to use specific application permissions (`New-AzureADApplicationKeyCredential`, `Get-AzureADApplicationKeyCredential`, or `Remove-AzureADServiceAppRoleAssignments`). + +There are three ways in which this can be accomplished. + +#### Option 1: Allow any user to register applications #### + +In Azure Active Directory, navigate to User settings > **App registrations**. Under **Users can register applications**, select **Yes**. + +This will allow any user to register applications. However, the user will still require the Azure AD admin to grant consent during cluster registration. Note that this is a tenant level setting, so it may not be suitable for large enterprise customers. + +#### Option 2: Assign Cloud Application Administration role #### + +Assign the built-in "Cloud Application Administration" Azure AD role to the user. This will allow the user to register clusters without the need for additional AD admin consent. + +#### Option 3: Create a custom AD role and consent policy #### + +The most restrictive option is to create a custom AD role with a custom consent policy that delegates tenant-wide admin consent for required permissions to the Azure Stack HCI Service. When assigned this custom role, users are able to both register and grant consent without the need for additional AD admin consent. + +**NOTE** - This option requires an Azure AD Premium license and uses custom AD roles and custom consent policy features which are currently in public preview. + +If you choose to perform Option 3, you'll need to follow these steps on **AzSHCIHost001**, which we'll demonstrate mainly through PowerShell. + +1. Firstly, configure the appropriate AzureAD modules, then **Connect to Azure AD**, and when prompted, **log in with your appropriate credentials**. + +```powershell +Remove-Module AzureAD -ErrorAction SilentlyContinue -Force +Install-Module AzureAD -AllowClobber -Force +Connect-AzureAD +``` + +2. Create a **custom consent policy**: + +```powershell +New-AzureADMSPermissionGrantPolicy -Id "AzSHCI-registration-consent-policy" ` + -DisplayName "Azure Stack HCI registration admin app consent policy" ` + -Description "Azure Stack HCI registration admin app consent policy" +``` + +3. Add a condition that includes required app permissions for Azure Stack HCI service, which carries the app ID 1322e676-dee7-41ee-a874-ac923822781c. Note that the following permissions are for the GA release of Azure Stack HCI, and will not work with Public Preview unless you have applied the [November 23, 2020 Preview Update (KB4586852)](https://docs.microsoft.com/en-us/azure-stack/hci/release-notes "November 23, 2020 Preview Update (KB4586852)") to every server in your cluster and have downloaded the Az.StackHCI module version 0.4.1 or later. + +```powershell +New-AzureADMSPermissionGrantConditionSet -PolicyId "AzSHCI-registration-consent-policy" ` + -ConditionSetType "includes" -PermissionType "application" -ResourceApplication "1322e676-dee7-41ee-a874-ac923822781c" ` + -Permissions "bbe8afc9-f3ba-4955-bb5f-1cfb6960b242", "8fa5445e-80fb-4c71-a3b1-9a16a81a1966", ` + "493bd689-9082-40db-a506-11f40b68128f", "2344a320-6a09-4530-bed7-c90485b5e5e2" +``` + +4. Grant permissions to allow registering Azure Stack HCI, noting the custom consent policy created in Step 2: + +```powershell +$displayName = "Azure Stack HCI Registration Administrator " +$description = "Custom AD role to allow registering Azure Stack HCI " +$templateId = (New-Guid).Guid +$allowedResourceAction = +@( + "microsoft.directory/applications/createAsOwner", + "microsoft.directory/applications/delete", + "microsoft.directory/applications/standard/read", + "microsoft.directory/applications/credentials/update", + "microsoft.directory/applications/permissions/update", + "microsoft.directory/servicePrincipals/appRoleAssignedTo/update", + "microsoft.directory/servicePrincipals/appRoleAssignedTo/read", + "microsoft.directory/servicePrincipals/appRoleAssignments/read", + "microsoft.directory/servicePrincipals/createAsOwner", + "microsoft.directory/servicePrincipals/credentials/update", + "microsoft.directory/servicePrincipals/permissions/update", + "microsoft.directory/servicePrincipals/standard/read", + "microsoft.directory/servicePrincipals/managePermissionGrantsForAll.AzSHCI-registration-consent-policy" +) +$rolePermissions = @{'allowedResourceActions' = $allowedResourceAction } +``` + +5. Create the new custom AD role: + +```powershell +$customADRole = New-AzureADMSRoleDefinition -RolePermissions $rolePermissions ` + -DisplayName $displayName -Description $description -TemplateId $templateId -IsEnabled $true +``` + +6. Assign the new custom AD role to the user who will register the Azure Stack HCI cluster with Azure by following [these instructions](https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-users-assign-role-azure-portal "Guidance on creating a custom Azure AD role"). + +Complete Registration +----------- + +To complete registration, you have 2 options - you can use **Windows Admin Center**, or you can use **PowerShell**. For this lab, it's recommended to use the PowerShell approach, due to a few unpredictible erros in the lab environment, likely due to WAC installed on the domain controller. + +### Option 1 - Register using PowerShell ### +We're going to perform the registration from the **AzSHCIHost001** machine, which we've been using with the Windows Admin Center. + +1. On **AzSHCIHost001**, open **PowerShell ISE as administrator** +2. In the file menu, click **Open** and navigate to **V:\Source** and open **Register-AzSHCI** +3. When the script file opens, select and run the following code to install the PowerShell Module for Azure Stack HCI 20H2 on that machine. + +```powershell +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force +Install-Module Az.StackHCI +``` + +**NOTE** - You may recieve a message that **PowerShellGet requires NuGet Provider...** - read the full message, and then click **Yes** to allow the appropriate dependencies to be installed. You may receive a second prompt to **install the modules from the PSGallery** - click **Yes to All** to proceed. + +In addition, in future releases, installing the Azure PowerShell **Az** modules will include **StackHCI**, however today, you have to install this module specifically, using the command **Install-Module Az.StackHCI** + +4. With the Az.StackHCI modules installed, it's now time to register your Azure Stack HCI 20H2 cluster to Azure, however first, it's worth exploring how to check existing registration status. The following code assumes you are still in the remote PowerShell session open from the previous commands. + +```powershell +Invoke-Command -ComputerName AZSHCINODE01 -ScriptBlock { + Get-AzureStackHCI +} +``` + +![Check the registration status of the Azure Stack HCI 20H2 cluster](/deployment/media/reg_check.png "Check the registration status of the Azure Stack HCI 20H2 cluster") + +As you can see from the result, the cluster is yet to be registered, and the cluster status identifies as **Clustered**. Azure Stack HCI 20H2 needs to register within 30 days of installation per the Azure Online Services Terms. If not clustered after 30 days, the **ClusterStatus** will show **OutOfPolicy**, and if not registered after 30 days, the **RegistrationStatus** will show **OutOfPolicy**. + +5. To register the cluster, you'll first need to get your **Azure subscription ID**. An easy way to do this is to quickly **log into https://portal.azure.com**, and in the **search box** at the top of the screen, search for **subscriptions** and then click on **Subscriptions** + +![Azure Subscriptions](/deployment/media/azure_subscriptions_ga.png "Azure Subscriptions") + +6. Your **subscription** should be shown in the main window. If you have more than one subscription listed here, click the correct one, and in the new blade, copy the **Subscription ID**. + +**NOTE** - If you don't see your desired subscription, in the top right-corner of the Azure portal, click on your user account, and click **Switch directory**, then select an alternative directory. Once in the chosen directory, repeat the search for your **Subscription ID** and copy it down. + +7. With your **Subscription ID** in hand, you can **register using the following Powershell commands**, from your open PowerShell window. + +```powershell +$azshciNodeCreds = Get-Credential -UserName "azshci\azureuser" -Message "Enter the azshci\azureuser password" +Register-AzStackHCI ` + -SubscriptionId "your-subscription-ID-here" ` + -ResourceName "azshciclus" ` + -ResourceGroupName "AZSHCICLUS_RG" ` + -Region "EastUS" ` + -EnvironmentName "AzureCloud" ` + -ComputerName "AZSHCINODE01.azshci.local" ` + –Credential $azshciNodeCreds ` +``` + +Of these commands, many are optional: + +* **-ResourceName** - If not declared, the Azure Stack HCI 20H2 cluster name is used +* **-ResourceGroupName** - If not declared, the Azure Stack HCI 20H2 cluster plus the suffix "-rg" is used +* **-Region** - If not declared, "EastUS" will be used. Additional regions are supported, with the longer term goal to integrate with Azure Arc in all Azure regions. +* **-EnvironmentName** - If not declared, "AzureCloud" will be used, but allowed values will include additional environments in the future +* **-ComputerName** - This is used when running the commands remotely against a cluster. Just make sure you're using a domain account that has admin privilege on the nodes and cluster +* **-Credential** - This is also used for running the commands remotely against a cluster. + +**Register-AzureStackHCI** runs syncronously, with progress reporting, and typically takes 1-2 minutes. The first time you run it, it may take slightly longer, because it needs to install some dependencies, including additional Azure PowerShell modules. + +8. Once dependencies have been installed, you'll receive a popup on **AzSHCIHost001** to authenticate to Azure. Provide your **Azure credentials**. + +![Login to Azure](/deployment/media/azure_login_reg.png "Login to Azure") + +9. Once successfully authenticated, the registration process will begin, and will take a few moments. Once complete, you should see a message indicating success, as per below: + +![Register Azure Stack HCI 20H2 with PowerShell](/deployment/media/register_azshci_ga.png "Register Azure Stack HCI 20H2 with PowerShell") + +**NOTE** - if upon registering, you receive an error similar to that below, please **try a different region**. You can still proceed to [Step 5](#next-steps) and continue with your evaluation, and it won't affect any functionality. Just make sure you come back and register later! + +``` +Register-AzStackHCI : Azure Stack HCI 20H2 is not yet available in region <regionName> +``` + +**NOTE** - if upon registering, you receive an error stating "Azure Arc integration isn't available for the version of Azure Stack HCI installed on node(s)", this can be safely ignored + +10. Once the cluster is registered, run the following command on **AzSHCIHost001** to check the updated status: + +```powershell +Invoke-Command -ComputerName AZSHCINODE01 -ScriptBlock { + Get-AzureStackHCI +} +``` +![Check updated registration status with PowerShell](/deployment/media/registration_status.png "Check updated registration status with PowerShell") + +You can see the **ConnectionStatus** and **LastConnected** time, which is usually within the last day unless the cluster is temporarily disconnected from the Internet. An Azure Stack HCI 20H2 cluster can operate fully offline for up to 30 consecutive days. + +### Option 2 - Register using Windows Admin Center ### + +1. On **AzSHCIHost001**, logged in as **azshci\azureuser**, open the Windows Admin Center, and on the **All connections** page, select your azshciclus +2. When the cluster dashboard has loaded, in the top-right corner, you'll see the **status of the Azure registration/connection** + +![Azure registration status in Windows Admin Center](/deployment/media/wac_azure_reg_dashboard_2.png "Azure registration status in Windows Admin Center") + +3. You can begin the registration process by clicking **Register this cluster** +4. If you haven't already, you'll be prompted to register Windows Admin Center with an Azure tenant. Follow the instructions to **Copy the code** and then click on the link to configure device login. +5. When prompted for credentials, **enter your Azure credentials** for a tenant you'd like to register the Windows Admin Center +6. Back in Windows Admin Center, you'll notice your tenant information has been added. You can now click **Connect** to connect Windows Admin Center to Azure + +![Connecting Windows Admin Center to Azure](/deployment/media/wac_azure_connect.png "Connecting Windows Admin Center to Azure") + +7. Click on **Sign in** and when prompted for credentials, **enter your Azure credentials** and you should see a popup that asks for you to accept the permissions, so click **Accept** + +![Permissions for Windows Admin Center](/deployment/media/wac_azure_permissions.png "Permissions for Windows Admin Center") + +8. Back in Windows Admin Center, you may need to refresh the page if your 'Register this cluster' link is not active. Once active, click **Register this cluster** and you should be presented with a window requesting more information. +9. Choose your **Azure subscription** that you'd like to use to register, along with an **Azure resource group** and **region**, then click **Register**. This will take a few moments. + +![Final step for registering Azure Stack HCI with Windows Admin Center](/deployment/media/wac_azure_register.png "Final step for registering Azure Stack HCI with Windows Admin Center") + +10. Once completed, you should see updated status on the Windows Admin Center dashboard, showing that the cluster has been correctly registered. + +![Azure registration status in Windows Admin Center](/deployment/media/wac_azure_reg_dashboard_3.png "Azure registration status in Windows Admin Center") + +**NOTE** - If you receive an error message like the one below, this can be ignored, your cluster will still be registered successfully. + +![Azure Arc Registration issue in Windows Admin Center](/deployment/media/wac_azure_arc_register_error.png "Azure Arc Registration issue in Windows Admin Center") + +You can now proceed on to [Viewing registration details in the Azure portal](#View-registration-details-in-the-Azure-portal) + +### View registration details in the Azure portal ### +With registration complete, either through Windows Admin Center, or through PowerShell, you should take some time to explore the artifacts that are created in Azure, once registration successfully completes. + +1. On **AzSHCIHost001**, open the Edge browser and **log into https://portal.azure.com** to check the resources created there. In the **search box** at the top of the screen, search for **Resource groups** and then click on **Resource groups** +2. You should see a new **Resource group** listed, with the name you specified earlier, which in our case, is **AZSHCICLUS_RG** + +![Registration resource group in Azure](/deployment/media/registration_rg_ga.png "Registration resource group in Azure") + +12. Click on the **AZSHCICLUS_RG** resource group, and in the central pane, you'll see that a record with the name **azshciclus** has been created inside the resource group +13. Click on the **azihciclus** record, and you'll be taken to the new Azure Stack HCI Resource Provider, which shows information about all of your clusters, including details on the currently selected cluster + +![Overview of the recently registered cluster in the Azure portal](/deployment/media/azure_portal_hcicluster.png "Overview of the recently registered cluster in the Azure portal") + +**NOTE** - If when you ran **Register-AzureStackHCI**, you don't have appropriate permissions in Azure Active Directory, to grant admin consent, you will need to work with your Azure Active Directory administrator to complete registration later. You can exit and leave the registration in status "**pending admin consent**," i.e. partially completed. Once consent has been granted, **simply re-run Register-AzureStackHCI** to complete registration. + +### Congratulations! ### +You've now successfully registered your Azure Stack HCI 20H2 cluster! + +Next Steps +----------- +In this step, you've successfully registered your Azure Stack HCI 20H2 cluster. With this complete, you can now move on to [Explore the management of your Azure Stack HCI 20H2 environment](/deployment/steps/4_ExploreAzSHCI.md "Explore the management of your Azure Stack HCI 20H2 environment") + +Product improvements +----------- +If, while you work through this guide, you have an idea to make the product better, whether it's something in Azure Stack HCI, Windows Admin Center, or the Azure Arc integration and experience, let us know! We want to hear from you! + +For **Azure Stack HCI**, [Head on over to the Azure Stack HCI 20H2 Q&A forum](https://docs.microsoft.com/en-us/answers/topics/azure-stack-hci.html "Azure Stack HCI 20H2 Q&A"), where you can share your thoughts and ideas about making the technologies better and raise an issue if you're having trouble with the technology. + +Raising issues +----------- +If you notice something is wrong with this guide, such as a step isn't working, or something just doesn't make sense - help us to make this guide better! Raise an issue in GitHub, and we'll be sure to fix this as quickly as possible! + +If you're having an issue with Azure Stack HCI 20H2 **outside** of this guide, [head on over to the Azure Stack HCI 20H2 Q&A forum](https://docs.microsoft.com/en-us/answers/topics/azure-stack-hci.html "Azure Stack HCI 20H2 Q&A"), where Microsoft experts and valuable members of the community will do their best to help you. \ No newline at end of file diff --git a/deployment/steps/4_ExploreAzSHCI.md b/deployment/steps/4_ExploreAzSHCI.md new file mode 100644 index 0000000..147fbc8 --- /dev/null +++ b/deployment/steps/4_ExploreAzSHCI.md @@ -0,0 +1,178 @@ + +Explore the management of your Azure Stack HCI 20H2 environment +============== +Overview +----------- +With all key components deployed, including a management infrastructure, along with clustered Azure Stack HCI 20H2 nodes, you can now begin to explore some of the additional capabilities within Azure Stack HCI 20H2 and the Windows Admin Center. We'll cover a few recommended activities below, to expose you to some of the key elements of the Windows Admin Center, but for the rest, we'll [direct you over to the official documentation](https://docs.microsoft.com/en-us/azure-stack/hci/ "Azure Stack HCI 20H2 documentation"). + +Contents +----------- +- [Overview](#overview) +- [Contents](#contents) +- [Create volumes for VMs](#create-volumes-for-vms) +- [Deploy a virtual machine](#deploy-a-virtual-machine) +- [Shutting down the environment](#shutting-down-the-environment) +- [Congratulations!](#congratulations) +- [Next steps](#next-steps) +- [Product improvements](#product-improvements) +- [Raising issues](#raising-issues) + +Create volumes for VMs +----------- +In this step, you'll create some volumes on an Azure Stack HCI 20H2 cluster by using Windows Admin Center, and enable data deduplication and compression on volumes. + +### Create a two-way mirror volume ### +If you're not already there, open the **Windows Admin Center**. You'll spend your time here for the remainder of the steps documented below. + +1. Once logged into **Windows Admin Center**, click on your previously deployed cluster, **azshciclus.azshci.local** +2. On the left hand navigation, under **Storage** select **Volumes**. The central **Volumes** page shows you should have a single volume currently +3. On the Volumes page, select the **Inventory** tab, and then select **Create** +4. In the **Create volume** pane, enter **Volume01** for the volume name, and leave **Resiliency** as **Two-way mirror** +5. In Size on HDD, specify **20GB** for the size of the volume, then click **Create**. + +![Create a volume on Azure Stack HCI 20H2](/deployment/media/wac_vm_storage_ga.png "Create a volume on Azure Stack HCI 20H2") + +6. Creating the volume can take a few minutes. Notifications in the upper-right will let you know when the volume is created. The new volume appears in the Inventory list + +![Volume created on Azure Stack HCI 20H2](/deployment/media/wac_vm_storage_deployed_ga.png "Volume created on Azure Stack HCI 20H2") + +### Optional - Create a mirror-accelerated parity volume ### + +**NOTE** - This can only be perfomed on clusters with **4 or more nodes**. If you just deployed a 2 node cluster, skip this optional step. + +Mirror-accelerated parity reduces the footprint of the volume on the HDD. For example, a three-way mirror volume would mean that for every 10 terabytes of size, you will need 30 terabytes as footprint. To reduce the overhead in footprint, create a volume with mirror-accelerated parity. This reduces the footprint from 30 terabytes to just 22 terabytes, even with only 4 servers, by mirroring the most active 20 percent of data, and using parity, which is more space efficient, to store the rest. You can adjust this ratio of parity and mirror to make the performance versus capacity tradeoff that's right for your workload. For example, 90 percent parity and 10 percent mirror yields less performance but streamlines the footprint even further. + +1. Still in **Windows Admin Center**, on the Volumes page, select the **Inventory** tab, and then select **Create** +2. In the **Create volume** pane, enter **Volume02_PAR** for the volume name, and set **Resiliency** as **Mirror-accelerated parity** +3. In **Parity percentage**, set the percentage of parity to **80% parity, 20% mirror** +4. In Size on HDD, specify **20GB** for the size of the volume, then click **Create**. + +For more information on planning volumes with Azure Stack HCI 20H2, you should [refer to the official docs](https://docs.microsoft.com/en-us/azure-stack/hci/concepts/plan-volumes "Planning volumes for Azure Stack HCI 20H2"). + +### Turn on deduplication and compression ### +You may have seen, during the **Create volume** wizard, you could have enabled deduplication and compression at creation time, however we wanted to make sure you were fully aware of how to enable it for existing volumes. + +1. Still in **Windows Admin Center**, on the Volumes page, select the **Inventory** tab, and then select your **Volume01** volume +2. On the Volume Volume01 pane, you'll see a simple rocker switch to enable **Deduplication and compression**. Click to enable it, and click **Start** + +![Enable deduplication on volume](/deployment/media/wac_enable_dedup_ga.png "Enable deduplication on volume") + +3. In the **Enable deduplication** pane, use the drop-down to select **Hyper-V** then click **Enable Deduplication**. This should be enabled quickly, as there's no files on the volume. + +**NOTE** - You'll notice there there are 3 options; default, Hyper-V and Backup. If you're interested in learning more about Deduplication in Azure Stack HCI 20H2, you should [refer to our documentation](https://docs.microsoft.com/en-us/windows-server/storage/data-deduplication/overview "Deduplication overview") + +You now have a couple of volumes created and ready to accept workloads. Whilst we deployed the volumes using the Windows Admin Center, you can also do the same through PowerShell. If you're interested in taking that approach, [check out the official docs that walk you through that process](https://docs.microsoft.com/en-us/azure-stack/hci/manage/create-volumes "Official documentation for creating volumes") + +Deploy a virtual machine +----------- +In this step, you'll deploy a VM onto your new volume, using Windows Admin Center. + +### Create the virtual machine ### +You should still be in **Windows Admin Center** for the next steps. + +1. Once logged into the **Windows Admin Center**, click on your previously deployed cluster, **azshciclus.azshci.local** +2. On the left hand navigation, under **Compute** select **Virtual machines**. The central **Virtual machines** page shows you no virtual machines deployed currently +3. On the **Virtual machines** page, select the **Inventory** tab, and then select **New** +4. In the **New virtual machine** pane, enter **VM001** for the name, and enter the following pieces of information, then click **Create** + + * Generation: **Generation 2 (Recommended)** + * Host: **Leave as recommended** + * Path: **C:\ClusterStorage\Volume01** + * Virtual processors: **1** + * Startup memory (GB): **0.5** + * Network: **ComputeSwitch** + * Storage: **Add, then Create an empty virtual hard disk** and set size to **5GB** + * Operating System: **Install an operating system later** + +5. The creation process will take a few moments, and once complete, **VM001** should show within the **Virtual machines view** +6. Click on the **VM** and then click **Start** - within moments, the VM should be running + +![VM001 up and running](/deployment/media/wac_vm001_ga.png "VM001 up and running") + +7. Click on **VM001** to view the properties and status for this running VM +8. Click on **Connect** - you may get a **VM Connect** prompt: + +![Connect to VM001](/deployment/media/vm_connect_ga.png "Connect to VM001") + +9. Click on **Go to Settings** and in the **Remote Desktop** pane, click on **Allow remote connections to this computer**, then **Save** +10. Click the **Back** button in your browser to return to the VM001 view, then click **Connect**, and when prompted with the certificate prompt, click **Connect** and enter appropriate credentials +11. There's no operating system installed here, so it should show a UEFI boot summary, but the VM is running successfully +12. Click **Disconnect** + +You've successfully create a VM using the Windows Admin Center! + +### Live migrate the virtual machine ### +The final step we'll cover is using Windows Admin Center to live migrate VM001 from it's current node, to an alternate node in the cluster. + +1. Still within the **Windows Admin Center** , under **Compute**, click on **Virtual machines** +2. On the **Virtual machines** page, select the **Inventory** tab +3. Under **Host server**, make a note of the node that VM001 is currently running on. You may need to expand the column width to see the name +4. Next to **VM001**, click the tick box next to VM001, then click **More**. You'll notice you can Clone, Domain Join and also Move the VM. Click **Move** + +![Start Live Migration using Windows Admin Center](/deployment/media/wac_move_ga.png "Start Live Migration using Windows Admin Center") + +5. In the **Move Virtual Machine** pane, ensure **Failover Cluster** is selected, and leave the default **Best available cluster node** to allow Windows Admin Center to pick where to migrate the VM to, then click **Move** +6. The live migration will then begin, and within a few seconds, the VM should be running on a different node. +7. On the left hand navigation, under **Compute** select **Virtual machines** to return to the VM dashboard view, which aggregates information across your cluster, for all of your VMs. + +Shutting down the environment +----------- +When running the environment in Azure, to save costs, you may wish to shut down your nested VMs, and Hyper-V host. In order to do so, it's advisable to run the following commands, from the Hyper-V host, to cleanly power down the different components, before powering down the Azure VM itself. + +1. On your Hyper-V host, open **PowerShell as administrator** +2. First, using PowerShell Direct, you'll log into one of the Azure Stack HCI 20H2 nodes to shutdown the cluster, then you'll power down the VMs running on your Hyper-V host + +```powershell +$domainName = "azshci.local" +$domainAdmin = "$domainName\azureuser" +$domainCreds = Get-Credential -UserName "$domainAdmin" -Message "Enter the password for the Admin account" +# Define node name +$nodeName = "AZSHCINODE01" +Invoke-Command -VMName $nodeName -Credential $domainCreds -ScriptBlock { + # Get any running VMs and turn them off + Get-ClusterResource | Where-Object {$_.ResourceType -eq "Virtual Machine"} | Stop-ClusterResource + # Stop the cluster + Stop-Cluster -Force +} +# Power down VMs on your Hyper-V host +Get-VM | Stop-VM -Force +``` + +3. Once all the VMs are switched off, you can then shut down your Hyper-V host. If you're running this environment on physical gear on-prem, you're all done, but if you deployed in Azure, visit https://portal.azure.com/, and login with your Azure credentials. Once logged in, using the search box on the dashboard, enter "azshci" and once the results are returned, click on your AzSHCIHost virtual machine. + +![Virtual machine located in Azure](/deployment/media/azure_vm_search_ga.png "Virtual machine located in Azure") + +4. Once on the overview blade for your VM, along the **top navigation**, click **Stop**, and then click **OK**. Your VM will then be deallocated and **compute charges** will cease. + +Congratulations! +----------- +You've reached the end of the evaluation guide. In this guide you have: + +* Deployed/Configured a Hyper-V host in Azure fully configured with all necessary roles, features and Windows Admin Center. +* Created an Azure Stack HCI 20H2 cluster, integrated with a cloud witness in Azure, and registered with Azure for billing +* Used the Windows Admin Center to create and modify volumes, then deploy and migrate a virtual machine. + +Great work! + +Next steps +----------- +This part of the guide covers only a handful of key topics and capabilities that Azure Stack HCI 20H2 can provide. We'll be adding more shortly, but in the meantime, we'd strongly advise you to check out some of the key areas below: + +* [Explore Windows Admin Center](https://docs.microsoft.com/en-us/azure-stack/hci/get-started "Explore Windows Admin Center") +* [Manage virtual machines](https://docs.microsoft.com/en-us/azure-stack/hci/manage/vm "Manage virtual machines") +* [Add additional servers for management](https://docs.microsoft.com/en-us/azure-stack/hci/manage/add-cluster "Add additional servers for management") +* [Manage clusters](https://docs.microsoft.com/en-us/azure-stack/hci/manage/cluster "Manage clusters") +* [Create and manage storage volumes](https://docs.microsoft.com/en-us/azure-stack/hci/manage/create-volumes "Create and manage storage volumes") +* [Integrate Windows Admin Center with Azure](https://docs.microsoft.com/en-us/azure-stack/hci/manage/register-windows-admin-center "Integrate Windows Admin Center with Azure") +* [Monitor with with Azure Monitor](https://docs.microsoft.com/en-us/azure-stack/hci/manage/azure-monitor "Monitor with with Azure Monitor") +* [Integrate with Azure Site Recovery](https://docs.microsoft.com/en-us/azure-stack/hci/manage/azure-site-recovery "Integrate with Azure Site Recovery") + +Product improvements +----------- +If, while you've worked through this guide, you have an idea to make the product better, whether it's something in Azure Stack HCI 20H2, Windows Admin Center, or the Azure Arc integration and experience, let us know! We want to hear from you! [Head on over to our Azure Stack HCI 20H2 UserVoice page](https://feedback.azure.com/forums/929833-azure-stack-hci "Azure Stack HCI 20H2 UserVoice"), where you can share your thoughts and ideas about making the technologies better. If however, you have an issue that you'd like some help with, read on... + +Raising issues +----------- +If you notice something is wrong with the evaluation guide, such as a step isn't working, or something just doesn't make sense - help us to make this guide better! Raise an issue in GitHub, and we'll be sure to fix this as quickly as possible! + +If however, you're having a problem with Azure Stack HCI 20H2 **outside** of this evaluation guide, make sure you post to [our Microsoft Q&A forum](https://docs.microsoft.com/en-us/answers/topics/azure-stack-hci.html "Microsoft Q&A Forum"), where Microsoft experts and valuable members of the community will do their best to help you. \ No newline at end of file diff --git a/nested/steps/1b_NestedInAzure.md b/nested/steps/1b_NestedInAzure.md deleted file mode 100644 index a2f8f8d..0000000 --- a/nested/steps/1b_NestedInAzure.md +++ /dev/null @@ -1,412 +0,0 @@ -Evaluate Azure Stack HCI 20H2 using Nested Virtualization in Azure -============== -Overview ------------ -With the introduction of [nested virtualization support in Azure](https://azure.microsoft.com/en-us/blog/nested-virtualization-in-azure/ "Nested virtualization announcement blog post") back in 2017, Microsoft opened the door to a number of new and interesting scenarios. Nested virtualization in Azure is particularly useful for validating configurations that would require additional hardware in your environment, such as running Hyper-V hosts and clusters. - -In this guide, you'll walk through the steps to stand up an Azure Stack HCI 20H2 configuration, and key dependencies. At a high level, this will consist of the following: - -* Deploy an Azure VM, running Windows Server 2019, to act as your main Hyper-V host -* Inside the Windows Server 2019 VM, enable the Hyper-V role and accompanying management tools -* On the Windows Server 2019 VM, deploy a Windows Server 2019 domain controller, and a Windows 10 management VM, running the Windows Admin Center -* On the Windows Server 2019 VM, deploy 2 nested Azure Stack HCI 20H2 nodes -* On the Windows 10 management VM, configure your Azure Stack HCI 20H2 cluster - -Contents ------------ -- [Overview](#overview) -- [Contents](#contents) -- [Architecture](#architecture) -- [Get an Azure subscription](#get-an-azure-subscription) -- [Azure VM Size Considerations](#azure-vm-size-considerations) -- [Deploying the Azure VM](#deploying-the-azure-vm) -- [Prepare your Azure VM](#prepare-your-azure-vm) -- [Next Steps](#next-steps) -- [Product improvements](#product-improvements) -- [Raising issues](#raising-issues) -- [Full Script - Prepare your VM](#full-script---prepare-your-vm) - -Architecture ------------ - -From an architecture perspective, the following graphic showcases the different layers and interconnections between the different components: - -![Architecture diagram for Azure Stack HCI 20H2 nested in Azure](/media/nested_virt_arch_ga.png "Architecture diagram for Azure Stack HCI 20H2 nested in Azure") - -Get an Azure subscription ------------ -To evaluate Azure Stack HCI 20H2, you'll need an Azure subscription. If you already have one provided by your company, you can skip this step, but if not, you have a couple of options. - -The first option would apply to Visual Studio subscribers, where you can use Azure at no extra charge. With your monthly Azure DevTest individual credit, Azure is your personal sandbox for dev/test. You can provision virtual machines, cloud services, and other Azure resources. Credit amounts vary by subscription level, but if you manage your Azure Stack HCI 20H2 Host VM run-time efficiently, you can test the scenario well within your subscription limits. - -The second option would be to sign up for a [free trial](https://azure.microsoft.com/en-us/free/ "Azure free trial link"), which gives you $200 credit for the first 30 days, and 12 months of popular services for free. The credit for the first 30 days will give you plenty of headroom to validate Azure Stack HCI 20H2. - -You can also use this same Azure subscription to register your Azure Stack HCI 20H2 cluster, once the deployment is completed. - -Azure VM Size Considerations ------------ - -Now, before you deploy the VM in Azure, it's important to choose a **size** that's appropriate for your needs for this evaluation, along with a preferred region. This deployment, by default, recommends using a **Standard_D16s_v4**, which is a general purpose VM size, with 16 vCPUs, 64 GiB memory, and no temporary SSD storage. The OS drive is 127 GiB in size. Realistically, with this size of host VM, you could nest the following: - -* Windows Server 2019 Domain Controller - 2 vCPU, 2 GB memory -* Windows 10 management VM - 2 vCPU, 4 GB memory -* Azure Stack HCI 20H2 nodes, each with 16 vCPUs and 24 GB memory depending on the number of nodes you choose - -These are just example numbers, and you can adjust accordingly to suit your needs, even after deployment. The point here is, think about how many Azure Stack HCI 20H2 nodes you'd like to nest inside this Azure VM, and select an Azure VM size from there. Some good examples would be: - -**D-series VMs (General purpose)** - -| Size | vCPU | Memory: GiB | Temp storage (SSD): GiB | Premium Storage | -|:--|---|---|---|---| -| Standard_D8_v3 | 8 | 32 | 200 | No | -| Standard_D8s_v3 | 8 | 32 | 64 | Yes | -| Standard_D8_v4 | 8 | 32 | 0 | No | -| **Standard_D8s_v4** | **8** | **32** | **0** | **Yes** | -| Standard_D8d_v4 | 8 | 32 | 300 | No | -| Standard_D8ds_v4 | 8 | 32 | 300 | Yes | -| Standard_D16_v3 | 16 | 64 | 400 | No | -| Standard_D16s_v3 | 16 | 64 | 128 | Yes | -| Standard_D16_v4 | 16 | 64 | 0 | No | -| **Standard_D16s_v4** | **16** | **64** | **0** | **Yes** | -| Standard_D16d_v4 | 16 | 64 | 600 | No | -| Standard_D16ds_v4 | 16 | 64 | 600 | Yes | - -For reference, the Standard_D8s_v3 VM size costs approximately US $0.38 per hour, and the Standard_D8ds_v4 VM size costs approximately US $0.45 per hour, based on East US region, under a Visual Studio subscription. - -**E-series VMs (Memory optimized)** - -| Size | vCPU | Memory: GiB | Temp storage (SSD): GiB | Premium Storage | -|:--|---|---|---|---| -| Standard_E8_v3 | 8 | 64 | 200 | No | -| Standard_E8s_v3 | 8 | 64 | 128 | Yes | -| Standard_E8_v4 | 8 | 64 | 0 | No | -| **Standard_E8s_v4** | **8** | **64** | **0** | **Yes** | -| Standard_E8d_v4 | 8 | 64 | 300 | No | -| Standard_E8ds_v4 | 8 | 64 | 300 | Yes | -| Standard_E16_v3 | 16 | 128 | 400 | No | -| Standard_E16s_v3 | 16 | 128 | 256 | Yes | -| Standard_E16_v4 | 16 | 128 | 0 | No | -| **Standard_E16s_v4** | **16** | **128** | **0** | **Yes** | -| Standard_E16d_v4 | 16 | 128 | 600 | No | -| Standard_E16ds_v4 | 16 | 128 | 600 | Yes | - -For reference, the Standard_E8s_v3 VM size costs approximately US $0.50 per hour, and the Standard_E8ds_v4 VM size costs approximately US $0.58 per hour, based on East US region, under a Visual Studio subscription. - -**NOTE 1** - Many of these VM sizes include temp storage, which offers high performance, but is not persistent through reboots, Azure host migrations and more. It's therefore advisable, that if you are going to be running the Azure VM for a period of time, but shutting down frequently, that you choose a VM size with no temp storage, and store your nested VMs on the local storage of the OS disk (128 GiB) or, ensure you don't store important files on the temp drive inside the VM. - -**NOTE 2** - It's strongly recommended that you choose a VM size that supports **premium storage** - when running nested virtual machines, increasing the number of available IOPS can have a significant impact on performance, hence choosing **premium storage** over Standard HDD or Standard SSD, is strongly advised. Refer to the table above to make the most appropriate selection. - -Ensure that whichever VM size you choose, it [supports nested virtualization](https://docs.microsoft.com/en-us/azure/virtual-machines/acu "Nested virtualization support") and is [available in your chosen region](https://azure.microsoft.com/en-us/global-infrastructure/services/?products=virtual-machines "Virtual machines available by region"). - -Deploying the Azure VM ------------ -The guidance below provides 2 main options for deploying the Azure VM. - -1. The first option, is to perform a deployment via a [custom Azure Resource Manager template](#option-1---creating-the-vm-with-an-azure-resource-manager-json-template). This option can be launched quickly, directly from the button within the documentation, and after completing a simple form, your VM will be deployed. -2. The second option, is a [deployment directly from PowerShell](#option-2---creating-the-azure-vm-with-powershell), which is fast, but still requires some additional steps if you wish to enable auto-shutdown of the VM. - -### Option 1 - Creating the VM with an Azure Resource Manager JSON Template ### -To keep things simple, and graphical to begin with, we'll show you how to deploy your VM via an Azure Resource Manager template. To simplify things further, we'll use the following buttons. - -Firstly, the **Visualize** button will launch the ARMVIZ designer view, where you will see a graphic representing the core components of the deployment, including the VM, NIC, disk and more. If you want to open this in a new tab, **hold CTRL** when you click the button. - -[![Visualize your template deployment](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/visualizebutton.png)](http://armviz.io/#/?load=https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FAzureStackHCI-EvalGuide%2Fmain%2Fnested%2Fjson%2Fazshcilabvm.json "Visualize your template deployment") - -Secondly, the **Deploy to Azure** button, when clicked, will take you directly to the Azure portal, and upon login, provide you with a form to complete. If you want to open this in a new tab, **hold CTRL** when you click the button. - -[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2FAzureStackHCI-EvalGuide%2Fmain%2Fnested%2Fjson%2Fazshcilabvm.json "Deploy to Azure") - -Upon clicking the **Deploy to Azure** button, enter the details, which should look something similar to those shown below, and click **Purchase**. - -![Custom template deployment in Azure](/media/azure_vm_custom_template.png "Custom template deployment in Azure") - -**NOTE** - For customers with Software Assurance, Azure Hybrid Benefit for Windows Server allows you to use your on-premises Windows Server licenses and run Windows virtual machines on Azure at a reduced cost. By selecting **Yes** for the "Already have a Windows Server License", **you confirm I have an eligible Windows Server license with Software Assurance or Windows Server subscription to apply this Azure Hybrid Benefit** and have reviewed the [Azure hybrid benefit compliance](http://go.microsoft.com/fwlink/?LinkId=859786 "Azure hybrid benefit compliance document") - -The custom template will be validated, and if all of your entries are correct, you can click **Create**. Within a few minutes, your VM will be created. - -![Custom template deployment in Azure completed](/media/azure_vm_custom_template_complete.png "Custom template deployment in Azure completed") - -If you chose to **enable** the auto-shutdown for the VM, and supplied a time, and time zone, but want to also add a notification alert, simply click on the **Go to resource group** button and then perform the following steps: - -1. In the **Resource group** overview blade, click the **AzSHCIHost001** virtual machine -2. Once on the overview blade for your VM, **scroll down on the left-hand navigation**, and click on **Auto-shutdown** -3. Ensure the Enabled slider is still set to **On** and that your **time** and **time zone** information is correct -4. Click **Yes** to enable notifications, and enter a Webhook URL, or Email address -5. Click **Save** - -You'll now be notified when the VM has been successfully shut down as the requested time. - -### Option 2 - Creating the Azure VM with PowerShell ### -For simplicity and speed, can also use PowerShell on our local workstation to deploy the Windows Server 2019 VM to Azure. As an alternative, you can take the following commands, edit them, and run them directly in [PowerShell in Azure Cloud Shell](https://docs.microsoft.com/en-us/azure/cloud-shell/quickstart-powershell "PowerShell in Azure Cloud Shell"). For the purpose of this guide, we'll assume you're using the PowerShell console/ISE or Windows Terminal locally on your workstation. - -#### Update the Execution Policy #### -In this step, you'll update your PowerShell execution policy to RemoteSigned - -```powershell -# Get the Execution Policy on the system, and make note of it before making changes -Get-ExecutionPolicy -# Set the Execution Policy for this process only -if ((Get-ExecutionPolicy) -ne "RemoteSigned") { Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process -Force } -``` - -#### Download the Azure PowerShell modules #### -In order for us to create a new VM in Azure, we'll need to ensure we have the latest Azure PowerShell modules - -> [!WARNING] -> We do not support having both the AzureRM and Az modules installed for PowerShell 5.1 on Windows at the same time. If you need to keep AzureRM available on your system, install the Az module for > PowerShell 6.2.4 or later. - -```powershell -# Install latest NuGet provider -Install-PackageProvider -Name NuGet -Force - -# Check if the AzureRM PowerShell modules are installed - if so, present a warning -if ($PSVersionTable.PSEdition -eq 'Desktop' -and (Get-Module -Name AzureRM -ListAvailable)) { - Write-Warning -Message ('Az module not installed. Having both the AzureRM and ' + - 'Az modules installed at the same time is not supported.') -} else { - # If no AzureRM PowerShell modules are detected, install the Azure PowerShell modules - Install-Module -Name Az -AllowClobber -Scope CurrentUser -} -``` -By default, the PowerShell gallery isn't configured as a trusted repository for PowerShellGet so you may be prompted to allow installation from this source, and trust the repository. Answer **(Y) Yes** or **(A) Yes to All** to continue with the installation. The installation will take a few moments to complete, depending on your download speeds. - -#### Sign into Azure #### -With the modules installed, you can sign into Azure. By using the Login-AzAccount, you'll be presented with a login screen for you to authenticate with Azure. Use the credentials that have access to the subscription where you'd like to deploy this VM. - -```powershell -# Login to Azure -Login-AzAccount -``` - -When you've successfully logged in, you will be presented with the default subscription and tenant associated with those credentials. - -![Result of Login-AzAccount](/media/Login-AzAccount.png "Result of Login-AzAccount") - -If this is the subscription and tenant you wish to use for this evaluation, you can move on to the next step, however if you wish to deploy the VM to an alternative subscription, you will need to run the following commands: - -```powershell -# Optional - if you wish to switch to a different subscription -# First, get all available subscriptions as the currently logged in user -$context = Get-AzContext -ListAvailable -# Display those in a grid, select the chosen subscription, then press OK. -if (($context).count -gt 1) { - $context | Out-GridView -OutputMode Single | Set-AzContext -} -``` - -With login successful, and the target subscription confirmed, you can move on to deploy the VM. - -#### Deploy the VM with PowerShell #### -In order to keep things as streamlined and quick as possible, we're going to be deploying the VM that will host Azure Stack HCI 20H2, using PowerShell. As an alternative option, we will provide an alternative method using the Azure Portal and an Azure Resource Manager Template, in JSON format. - -In the below script, feel free to change the VM Name, along with other parameters. The public DNS name for this VM will be generated by combining your VM name, with a random guid, to ensure it is unique, and the deployment completes without conflicts. - -```powershell -# Define basic information & specify credentials for VM -$vmName = "AzSHCIHost001" -$resourceGroupName = "AzSHCILabRG" -$credential = Get-Credential -Message "Enter VM credentials" -UserName "AzureUser" - -# To display a list of all Azure locations, run (Get-AzLocation).Location -$locationName = "eastus" - -# See table above for recommended sizes for your VM -$vmSize = "Standard_D16s_v4" - -# Enter either StandardSSD_LRS or Premium_LRS and for diskSize, enter 128, 256, 512 or 1024. -$managedDiskType = "StandardSSD_LRS" -$diskSize = "128" - -# Define network parameters -$networkName = "AzSHCILabvNet" -$nicName = "AzSHCILabvNIC" -$subnetName = "AzSHCILabSubnet" -$subnetPrefix = "10.0.0.0/24" -$vNetPrefix = "10.0.0.0/24" -$randomGuid = ((New-Guid).ToString()).Substring(0, 6) -$dnsName = ("$vmName" + "$randomGuid").ToLower() - -# Create resource group & network resources -New-AzResourceGroup -Name "$resourceGroupName" -Location $locationName -Force -$publicIp = New-AzPublicIpAddress -Name "AzSHCILabPubIP" -ResourceGroupName $resourceGroupName ` - -AllocationMethod Dynamic -DomainNameLabel "$dnsName" -Location $locationName -$rdpRule = New-AzNetworkSecurityRuleConfig -Name "RDP" -Description "Allow RDP" -Access Allow ` - -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix Internet -SourcePortRange * ` - -DestinationAddressPrefix * -DestinationPortRange 3389 -$NSG = New-AzNetworkSecurityGroup -ResourceGroupName $resourceGroupName ` - -Location $locationName -Name "AzSHCILabNSG" -SecurityRules $rdpRule -$subnet = New-AzVirtualNetworkSubnetConfig -Name $subnetName -AddressPrefix $subnetPrefix ` - -NetworkSecurityGroup $NSG -$vNet = New-AzVirtualNetwork -Name $networkName -ResourceGroupName $resourceGroupName ` - -Location $locationName -AddressPrefix $vNetPrefix -Subnet $subnet -$vNic = New-AzNetworkInterface -Name $nicName -ResourceGroupName $resourceGroupName ` - -Location $locationName -SubnetId $vNet.Subnets[0].Id -PublicIpAddressId $publicIp.Id - -# Finalize the VM configuration, including size, image and storage -$vm = New-AzVMConfig -VMName $vmName -VMSize $vmSize -$vm = Set-AzVMOperatingSystem -VM $vm -Windows -ComputerName $vmName -Credential $credential -ProvisionVMAgent -$vm = Add-AzVMNetworkInterface -VM $vm -Id $vNic.Id -$vm = Set-AzVMSourceImage -VM $vm -PublisherName 'MicrosoftWindowsServer' -Offer 'WindowsServer' ` - -Skus '2019-Datacenter' -Version latest -$vm = Set-AzVMOSDisk -VM $vm -StorageAccountType $managedDiskType -Windows -DiskSizeInGB $diskSize ` - -CreateOption FromImage -$vm = Set-AzVMBootDiagnostic -VM $vm -Disable - -# Create the Virtual Machine -New-AzVM -ResourceGroupName $resourceGroupName -Location $locationName -VM $vm -Verbose - -# Optional Parameter -> -LicenseType "Windows_Server" -# Copy and paste the parameter on the end of the New-AzVM command. -# Only use this if you have existing Windows Server licenses with Software Assurance (See NOTE 3 below) - -# Get connection details of the newly created VM -Get-AzVM -ResourceGroupName $resourceGroupName -Name $vm.Name -$getIp = Get-AzPublicIpAddress -Name "AzSHCILabPubIP" -ResourceGroupName $resourceGroupName -$getIp | Select-Object Name,IpAddress,@{label='FQDN';expression={$_.DnsSettings.Fqdn}} -``` - -**NOTE 1** - You'll be prompted to supply a credential for the VM - simply enter a username of your choice, and strong password. - -**NOTE 2** - When running the above script, if your VM size contains an 's', such as 'Standard_E16**s**_v4' it will use **Premium LRS storage**. If it does not contain an 's', it will deploy with a Standard HDD, which will impact performance. Refer to the [table earlier](#azure-vm-size-considerations) to determine the appropriate size for your deployment. - -**NOTE 3** - For customers with Software Assurance, Azure Hybrid Benefit for Windows Server allows you to use your on-premises Windows Server licenses and run Windows virtual machines on Azure at a reduced cost. By removing the comment in the script above, for the -LicenseType parameter, **you confirm you have an eligible Windows Server license with Software Assurance or Windows Server subscription to apply this Azure Hybrid Benefit** and have reviewed the [Azure hybrid benefit compliance document](http://go.microsoft.com/fwlink/?LinkId=859786 "Azure hybrid benefit compliance document") - -Once you've made your size and region selection, based on the information provided earlier, run the PowerShell script and wait a few moments for your VM deployment to complete. - -![Virtual machine successfully deployed with PowerShell](/media/powershell_vm_deployed.png "Virtual machine successfully deployed with PowerShell") - -With the VM successfully deployed, make a note of the fully qualified domain name, as you'll use that to connect to the VM shortly. - -#### OPTIONAL - Enable Auto-Shutdown for your VM #### -One way to control costs, is to ensure your VM automatically shuts down at the end of each day. Enabling this feature requires you to log into the Azure portal, and perform a few steps: - -Firstly, visit https://portal.azure.com/, and login with the same credentials used earlier. Once logged in, using the search box on the dashboard, enter "azshci" and once the results are returned, click on your AzSHCIHost virtual machine. - -![Virtual machine located in Azure](/media/azure_vm_search.png "Virtual machine located in Azure") - -1. Once on the overview blade for your VM, **scroll down on the left-hand navigation**, and click on **Auto-shutdown** -2. Click the Enabled slider to **On** -3. Enter your **scheduled shutdown time**, **time zone** and **notification information** -4. Click **Save** - -![Enable VM auto-shutdown in Azure](/media/auto_shutdown.png "Enable VM auto-shutdown in Azure") - -Prepare your Azure VM ------------ - -With your Azure VM (AzSHCIHost001) successfully deployed, you're ready to configure the VM to allow creation of the the Windows Server 2019 domain controller, the Windows 10 management VM, and the Azure Stack HCI 20H2 nodes. - -### Update your Azure VM ### -Firstly, you'll need to connect into the VM, with the easiest approach being via Remote Desktop. If you're not already logged into the Azure portal, visit https://portal.azure.com/, and login with the same credentials used earlier. Once logged in, using the search box on the dashboard, enter "**azshci**" and once the results are returned, **click on your AzSHCIHost001 virtual machine**. - -![Virtual machine located in Azure](/media/azure_vm_search.png "Virtual machine located in Azure") - -Once you're on the Overview blade for your VM, along the top of the blade, click on **Connect** and from the drop-down options. - -![Connect to a virtual machine in Azure](/media/connect_to_vm.png "Connect to a virtual machine in Azure") - -Select **RDP**. On the newly opened Connect blade, ensure the **Public IP** is selected, and the port is **3389**, click **Download RDP File** and select a suitable folder to store the .rdp file. - -![Configure RDP settings for Azure VM](/media/connect_to_vm_properties.png "Configure RDP settings for Azure VM") - -Once downloaded, locate the .rdp file on your local machine, and double-click to open it. Click **connect** and when prompted, enter the credentials you supplied when creating the VM earlier. Accept any certificate prompts, and within a few moments, you should be successfully logged into the Windows Server 2019 VM. - -Now that you're successfully connected to the VM, it's a good idea to ensure your OS is running the latest security updates and patches. VMs deployed from marketplace images in Azure, should already contain most of the latest updates, however it's worthwhile checking for any additional updates, and applying them as necessary. - -1. Open the **Start Menu** and search for **Update** -2. In the results, select **Check for Updates** -3. In the Updates window, click **Check for updates**. If any are required, ensure they are downloaded and installed. -4. Restart if required, and once completed, re-connect your RDP session using the steps earlier. - -With the OS updated, and back online after any required reboot, it's now time to enable the Hyper-V role and accompanying PowerShell management modules. - -### OPTIONAL - Resize your primary partition ### -If you deployed your VM with a disk size larger than the standard 127GB, run the following PowerShell command to extend your existing C: to fill the remaining space on the drive. - -```powershell -$size = (Get-PartitionSupportedSize -DriveLetter "C") -Resize-Partition -DriveLetter "C" -Size $size.SizeMax -``` - -### Configure the Hyper-V host ### -In order to run our nested workloads, you first need to enable the Hyper-V role within Windows Server 2019, and the accompanying PowerShell modules. In addition, you'll create a special NAT switch, to ensure that your nested workloads can access the internet, using the Windows Server 2019 host as the NAT gateway. - -The quickest, and easiest way to enable the required Hyper-V role and accompanying management tools, is using PowerShell. Firstly, open PowerShell **as an administrator** and run the following command: - -```powershell -# Install the Hyper-V role and management tools, including PowerShell -Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart -``` - ->[!WARNING] -> ->This command restarts the Azure VM. You will lose your RDP connection during the restart process. - -Once the Azure VM has fully restarted, which may take a few minutes, reconnect to your VM using the previously downloaded .rdp file. Once connected, the next step is to configure the NAT virtual switch on the VM, to enable your VMs to access the internet. - -#### Configure Internal NAT vSwitch #### -Both Windows 10 Hyper-V, and Windows Server 2019 Hyper-V allow native network address translation (NAT) for a virtual network. NAT gives a virtual machine access to network resources using the host computer's IP address and a port through an internal Hyper-V Virtual Switch. It doesn't require you to expose the sandbox VMs directly onto your physical network, or in this case, your Azure vNET. - -If you're not familiar, Network Address Translation (NAT) is a networking mode designed to conserve IP addresses by mapping an external IP address and port to a much larger set of internal IP addresses. Basically, a NAT uses a flow table to route traffic from an external (host) IP Address and port number to the correct internal IP address associated with an endpoint on the network (virtual machine, computer, container, etc.) - -To configure the network switch, open PowerShell **as an administrator** and run the following command: - -```powershell -# Create a new internal virtual switch on the host -New-VMSwitch -Name "InternalNAT" -SwitchType Internal -# Create an IP address for the NAT Gateway -New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceAlias "vEthernet (InternalNAT)" -# Create the new NAT network -New-NetNat -Name "AzSHCINAT" -InternalIPInterfaceAddressPrefix 192.168.0.0/24 -# Check the NAT configuration -Get-NetNat -``` -The **Get-NetNat** cmdlet gets Network Address Translation (NAT) objects configured on a computer. NAT modifies IP address and port information in packet headers. Your configuration should look similar to the configuration below: - -![Result of Get-NetNat PowerShell command](/media/get_net_nat.png "Result of Get-NetNat PowerShell command") - -The final part of the process is to enable Enhanced Session mode. Enhanced Session mode can be useful to enhance the user experience, particularly when using the Windows 10 VM later, when connecting to a VM over VMConnect. To enable Enhanced Session Mode with PowerShell, run the following on AzSHCIHost001: - -```powershell -Set-VMhost -EnableEnhancedSessionMode $True -``` - -Next Steps ------------ -In this step, you've successfully created your Azure VM, and configured Windows Server 2019 with the Hyper-V role, and core networking to support the nested scenario. You're now ready to start creating your virtual machines as part of deploying your management infrastructure. You have 2 choices on how to proceed, either a more graphical way, using a GUI (Graphical User Interface, such as Hyper-V Manager, Server Manager etc), or via PowerShell. Make your choice below: - -* [**Part 2a** - Deploy your management infrastructure with the GUI](/nested/steps/2a_ManagementInfraGUI.md "Deploy your management infrastructure with the GUI") -* [**Part 2b** - Deploy your management infrastructure with PowerShell](/nested/steps/2b_ManagementInfraPS.md "Deploy your management infrastructure with PowerShell") - -Product improvements ------------ -If, while you work through this guide, you have an idea to make the product better, whether it's something in Azure Stack HCI 20H2, Windows Admin Center, or the Azure Arc integration and experience, let us know! We want to hear from you! [Head on over to our Azure Stack HCI 20H2 UserVoice page](https://feedback.azure.com/forums/929833-azure-stack-hci "Azure Stack HCI 20H2 UserVoice"), where you can share your thoughts and ideas about making the technologies better. If however, you have an issue that you'd like some help with, read on... - -Raising issues ------------ -If you notice something is wrong with the evaluation guide, such as a step isn't working, or something just doesn't make sense - help us to make this guide better! Raise an issue in GitHub, and we'll be sure to fix this as quickly as possible! - -If however, you're having a problem with Azure Stack HCI 20H2 **outside** of this evaluation guide, make sure you post to [our Microsoft Q&A forum](https://docs.microsoft.com/en-us/answers/topics/azure-stack-hci.html "Microsoft Q&A Forum"), where Microsoft experts and valuable members of the community will do their best to help you. - -Full Script - Prepare your VM ------------ - -```powershell -# Resize primary partition -$size = (Get-PartitionSupportedSize -DriveLetter "C") -Resize-Partition -DriveLetter "C" -Size $size.SizeMax - -# Install the Hyper-V role and management tools, including PowerShell -Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart - -# Create a new internal virtual switch on the host -New-VMSwitch -Name "InternalNAT" -SwitchType Internal -# Create an IP address for the NAT Gateway -New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceAlias "vEthernet (InternalNAT)" -# Create the new NAT network -New-NetNat -Name "AzSHCINAT" -InternalIPInterfaceAddressPrefix 192.168.0.0/24 -# Check the NAT configuration -Get-NetNat - -Set-VMhost -EnableEnhancedSessionMode $True -``` \ No newline at end of file

QdeOPq7Y;A@E`-P*axL5ZI~Eq|19YMBIT4sda<)}ruBrwV z3d)Es48L3DGuC@`3xg$*!Ws+ANtom(nmJ%|UOV)8tGlTfh2ZL^{sMAtl!-eB8X13z32b3=ERIIH&=)wZCS z3y#WiAzftcT^DfI2<-JQwXaoz!qHFJl@E=d;KxY-dMI;WIZ3E#37lH_6W^I_cfS zs$W2)uV*?J`{4kO9Xj9R?GsyU4JBwT?*~4j6>!_ff&Mt)61x@~?(wmu9PEV4%tYSj z|Bk%>Dt*{nHozQ>sRDG0$H52AK!^_=mCWvD)%bA##RDM>{A!A8}@Aq$J;9WqL#Zlqj+0o9g^9A+(x87ga*zuPpDVR-G$ike5Og`3cKyjk zE;|7#aULQ)^k(-axN4DE&BAWu&==O@X@^j=97UB_NWp78g7PxDM7%__}*M zpO*2TqKkYrWRict@18veIc;;O39=vzWD%gA*&Isee)byPzRT>^=WCh+NCVa+Ei>LN zzHjJzeP$%Y!kS?Vu+m^MSkj9^?qKOMa`K}c)=j_EYbhM>mH_-&8%P@Wmc9*%50#a^ zQfgaCP{&mN0feI!E2~YBxbKOrq|s0(|0!Vqi+6&rnjxbO((f~#Gb_0#c8fzaoJydi zz@S<~22m2Q4l=CYRDKNzzKFjXY`h5=sA-FB&POZQbW2;yv^=>kmAO?7#}u}siM;=` zXFqK_44Asck?S{T?sdSTPT^=^t#U_?@xDbx%5h$u={a2Q?ZfS4(K;swQ%c$B!%X zJBk&a77^iJjFK6MRHv;uX}aXF0-w~boqpr|T1;}^()rmv=UD7+uw`o4PDULrE`%5H zD<)CDdz!C_tgD8}c^_)QP1x zi~3aUPYCBs$39g3)jigLqK&MnJO|iN-jh&G@ zc8w>g!ufCfI2$r-t${M+u@wexfObOQ_CW*@23jh74W%?Xc))m$c zyo>z-c>%&3izyVC2nDfRc21VIi*N4p#}Y=fZu~Rk_|#nAvFhJ`u^?z<)UcC^Oh%#h=|Vh}}xaAPgVl7$lR#>V?FUwe}FW z2DL?t$t+>dRSTjNit?}D#U^L9-(DVgWq$ew^Ur}Z^ycKSCKwt>e8k0)f9yS!A-&CtP4^Atng7 z3UtOPdK$Pzq!DV26FQn(H~8f`Y$#ucGx0#sndw`3P=f~X*|)H3Q|u@LfHq4Q5iOfz z%~ycJca=bp$uVy{KZ^C~WRdN|q0$V8)x`>|cc4*84wbsjinpbaa>t_p*X+9$&9Msn zf%;+Btioy0yON6TU9MJQ|2w7t`l88M3lVJ$RdR^b36v`8aAI)Xw4ce!)m|#zP(s^d z!`LE7{BY_9`i?2qyBFR{3>u01K#?{G8iqi%Q#%KeB%}y@qGh&JJ-Whr)!Rpji`J!u zTC9%?#8S`!4hs(M&v4eOiBoQGr>vBS;~3jC@*Qb}<&qeTtO4L92}#}x6T%;$_gFm@ ztrUgNmypi>IA$FI1e6xchlIdl0%amBv^9oYbREQYF0A+8C!bmU%kxPPD9+3DXu-2B74io;upKLsBPsDrsxY{2)~jyg5BP=>V$qRcBZ zpkZpUHXFu^M|sUe%|v-7f!du%w4pnWCW1GZ=_@!;e43pHe6ZwyX&umQnjeYCyZRVNfT~y%atMxh~`df z=nXV%UI4qlkvyrz+cfkU?SQq{)n8L*Agxjc$^n#H!|}@(xo0a)ESkCP zBE`@jV^+RJA>#c|GL`v(u;}x4x#kRJx^(8E#%DtXb~|@4CLrYsWPEC8D0R(i z?-1v)e`$b2AkLHpBF~f<0WtXs!@O#^6cTezE#nOo|7%zo!SKZq!X8iDOFcUnm`4VS z0j7(Z%^h@2w+NK^y>O7F`cb)B8Vg)2`EfO2=!CF1?uulSp|#}KY_@t`$Sraj1|G#+ z*E*slAn=(>_Yt0iLHms6`?%lxnyqW4NC>JZMRc zTa-;&9*U$zXg@_TvOEEO||k5&7!d3gSIZU%j?$-f*; zpK}+tJm3}z-YEEpgh}DK6@q+7{&k6=WmBA3MF9Vc4B+=>)U>l8ls~W&wP|XcGtUGWi<7`iv!s~|7~xF}s@>3fra1i> z^O!7oH7@@|V+iF4gV5R1(=zF~1*h~6{?)_{M|WrnUvv!Q&b2k(fUo5Y5efPlGdSR8 zX7jIfWw2GE!7g75>d{|H339h^rAsnW8N(`YW@5QsZordr9&k#Xq7hN4?RZb`2CTXG z8axXXSFhMb?WtzO6NWNqhSO4e{KLr7e{2z)45M?OpDYUX z8ztRt?42+R^%*R6kbx*6X+l(B?#Ol{xI<{&uyT5yg;6E6{wnx~d4`9b7^ zVaA+$Jb{oj`oS!zVp_%Ar;!_K#@MOSd;8j<2aa6-8vq2e|A&+(&1R}>dU;4B3x%m1 zUeWV1vQDE7hCQCu<)M^D*UpE9#1Ius?e|FteB#^Yyts!p078}_nU7N5+vu5WbF1~s ztNWunuFi)sQJSi0thnXENMs#^ED9*2H^kfGM-~2Pf5O2^bM`<|0XLd>mVV#-ZkZ6% zy)JvEt>$guMyt4r7~u}SG*$AC8y@!I$`voEsA9QTaxLp+tu)bOk;h%z3BQbfgu7&f z8bemSmU^ES{N-z}fq+*>G3`XvvciK3K&i~KdAUbB`)5j6?$+0tmwE8DeV4CuJ=(QEXKdq3vxa`Ye^{3f9_M)mjyf z35c9ZVjs3#{a?|)prqpaYv{93DO>i|E9*nRdWRVkbAKaE0!)#oxB8(~z4{~r1Q8@u zqVw5|;kyp*mkV|WwwF_=le1(2Nvmi*_^9gj zKNXSJC08%AGBvP?&I-A7$S^$Rel+>@qZadEk_^2)@l)EnAquT1KWT9Z0oNBJt;s;}i6hi@Cpj0%X0cM9^0U9V`1s zi$4XXtX)!%B!L5{cxZnTT4vGUGF=E@um}3qHoku!rM0aBcTS5;jPmqmH(17@P;7IqM!*blk6Pe(Kz_94UUM zMy>FqUzom%|9IBT-s_$BzTKHvj>lfwyNJaFrmJ@)sQmZ+L)VUh(OCTN!ZqAsD{!F3 z8eCy#OpwcO6Ow~j9xD~kx(Jp|sRqy&X)J~*2nYpC;rc;TzsGBkN)e2vXq9I z=X>s>cghGwZ)IX4LS`cyZ^dZrgG2ADD3%*PF8>|J(pBKRZlrPk`cD+AqVQDt$G~D z9}!ub*`C8rOn!m;lbZ=*G+r;t$(zp{@ppyN7G-0%)MnBrzELk*{Ev=+gg8w5a<%pO z&2Rl5wI)4A8Ovb3SsAgNdkz;4ByKq=I--I;NZmQHMyzx#9uAQ6cCo~L)MrU1SiHrT z=Ph!pS7qNjI*n%S6GPDxY8!<)?;2HkO&6!h32qq_grygHWPpcMvzu1EPj9L04^9!^Ww!u!W-7szm! z5a?F))**KY%U4^^Qx_(|v&KDReueP(C_u~id(rH1)lEzMt~FYPTr0O7o)``+k~K=Z!7N)InF@``V!W z`=(^7q3_k}pLOS8*O&N-)J+y~pA75S`BUQO$(pWh|9I>S{3E*GVunvEJ$j%U*z>@u z5I0*|_yvnuliN_~ zEyfBxKA65fKT=xNHyNU)B^OJRxi)MR!ty*I#s~Ruu+G=>evkgyHN$VkAW%0%J=l(f z%ERDjG0w0e6WYPKwM+eR8Akq0bQS!E61N3NI{o;PB;^`WLw!PhEreg+I2o~02@t&U zyMy!$$Zrf;&yE)h<4Zlo6@{_(WirD2VGDXm-#3czb9i~=KfY&qY$%8Japa&|N4+9ru^TEex+M}aJ0 zMA#jIM}KIg2b&_aiBASo---7pcL%^Lz>;c}rUg0@gzVj7riBickMFpu!8=U9uox=! z`fuZ}6X&zY=Ox8_1o5^wnK9z`F->p59FgC1-K3=UdU5A%MA@zRv|)3t^8Z){*?OL@ z1wQq2wV2!ukw>E}?X`Uv;5f^9c1(LiUXDO0gBSwW0$G*0N7vv~F5wWEh2EK-rM<+u zwi#5p5+`Idt1T!wvEk$@FysoK&RsOyz5v~2vai*-;ey?8PsH@2E*h{2s6)_Hs_#@X z6M++)M@hoe5VW%OEqkgkw>`a2T_nB}?#J>DZ>fJu}uuU%cT2}LC zx-qRs9+QG$9;wH6US>z`hZABCm(+;yOVBeSDOEGl{I)EzX>fx5J>el;5z46zIUolo zKlgcWKa1?aAv%17IT%16_!gL9ubleXJq4eV@*E!bcmKc;OJGb><$Pc{d?;sdu$a$S z4OtGl`%9I&D+2&5vmd{Fe+hV)@Wbzb@Bp|YTHgxJgb@C*kFp$od+d+f85&>~wJqYZ zxOA@UYkxk1zR!r!ZBb8~Zbi2@xvr44xd6SfvVV_P>#!RjRtod7w@&Q z>PB&OX3N?Q_09RZLF!xDfIWSam)Ge_tP?yFc+0Ta$&FUQ1J^v9+Vy ziq*p~ax^eb7=u2FFXt}=d^!QI2Ua6TxN>zHrojM$iY|pZ6n;(RYLYa~sIYuWI&NE! zI%~b;gmyB!6I-YEu?sl5AC460C*}933-d3d;?Lx(zN$2Jf!(}?Hc%sn7qDi@#haHt zr#8R03)0tP{5D=*AJP~}Re5J?CVM^CL2q|_eleVjZhg%dI1aG!`5e@BZn{_(Z#0A) zg2yZg1oe+p%9K)UDLdX*Ufer~`fg9KF6b?t6yWX)%qfu2f*N9dCCQv9!|I7VtHk*q zHi!5a&H+r>;Nk>u8D5ff`Hgqou_75~`3vK+l|?Qa>gqmjE~-o$qJ4<)z6{}6KwIN8 zLXuWZ2}))vn7|?Ftd3?TMYyA!5F)w@b7cOS{*e)cB=jKp%V9<{UGyr)D#B1EBG6D_ zF{9Kh^}#}1^0lxnXGSoF#$_cP^vZ>`Ecui3vcf^Ib(K@XriN)$Q3hMxnkDD--CgQI zr6eOW6s(Ns|6}bPgJg-;b=|gY+qP%hwr$(?oNe2-ZQHhOyL5=VgOJS$Vd~%0L&A;W=e>CpgXCFgINhZP@+%O2*zvM%~d0(k=u;2J)#sxiICa zFn1r@9SP$vJH%?xXg_cuBdY+&On{OC6$$sj<8To9&|p$sgYi{#Z3H#%G*Xz{MYAHN z_`VT|;r>1vJZ@Y+x8$_Q^2AH9lFs`+*Mmh^L7!&8~E|`L47M7<4)L_cEEk%}|un>#7BPaa1SdOg@T-V7DD3nnnsNkMQ zwO7e_ws85$0+?GMdSZnl-J86C5UY`o$~bgp-Tm!PvrV?jPXp-QkH698gdWxw!ekv1 z#lHa%cdjHXj^#{vA-oBj6J;*VhvK7|J*iayG;Dv*Bp1EOh~5U$q#ISNo_r{ zoxY)S?C*nODzcFQw@?;ZR*-_?L=xtV^BGsj;&r#A@Z|vuPib?TwJ@eM(_CzgY|u|m zMUo60BG2Ey0@sR(SvppX?Q*H}NqQU1-4{4OOy zwY7Mn8JiLAKrCijP%|l+p1`ZdM0yh==saHer0+p8o`t{g*OBoon<>GCJcVv&IxWKX zR38_;6+Tzro>uf=#Q;7Jemyl{ThC_)j`5A^^n@;WQ^kL2w}NgtSSgWl^6>1W)523% zLc%Kgsuf2bm~@*@zb@__STh-Xo)>Lbw6>CVTUO(;rz3o)Ck?$eO(VRxBZBbViBtk(^Al7wlUXod$s0fF!meP;a9klxY_KV z_7&r(mJNIGOnmjvK`Af7Zw{>|T zy~z|vKZU$dNs-y_cX=Fnqeog7!R+q}_Q)L+TRQh6>#H%b!!l!MpT4dfF#Q1wk?(E> zDFy#gVRp^dCETK6lbNl;IhnXV7k{)(6zPwV#`9kgGJrL)%Es++4pu4 z&)^VkhO}!q=VVNva(C8^YtFB4U%T&*>!;6RFW_HlXwt%!)SjCnZ0A6|bWhD0Q5}XI zrXI>Dmbj|G8V`XTf5<9NpYn#LWI>(HD#W~K);qj6 z`1d^)Sk*1?vBsN*w37H0pgh0WiUqFD(Zoi=K&+?<4;Nv^@pPQ(o)99|O+mxsUMH)~ zUn4=O?yG-t2hKK)1MmR6{YbZ#mt~45*B9oR1bX zY=5MaO*cJj)8~wBR*^E?A2(Ut{{4e?wVrK z*zUJbrJ|B03j$~nd5PDb)7bqS5}tJ$gFvIc%RnD2XbAcKi%8?z%z@7Y7^^D6x93vNfnF@+ z4sE}i4NsG8?EtqslB>Oii>F?`0gWDU4mTK@JKqf&F7bH&gsEQXYzIw{dgGY~qBb;= zSF#|gbvhk$Vr` z^P;9q-O@xDou7MO<#%vV41}JUs`2#Bd7)ZXP|+6XDGX}YJk~9CuOJiDLs#Q3V0CJl z#;+IXde%a#o5t=TYIM`*sG(Eg0f{1Lp%-uCR)_}iE-hW|s~^}dO^8U{ST?&MaF_;@ zCCNyNA)f>WLRU(Nt~G)HNhLNT<54zsw;uwc$vGp$;EzELb6H8&M8^$e$vy)~I|n>N zH+kco(mu(qUdi-ILcEF=^nBrIDZ~UKh0!^wjIbe0+~&oAIi@q4u>ux)aI0O<}`xlnGBU6T6eT8 zvDB*%ea_=X!qKKSuc+oIhmDo%Gk-^$XTnPS?aOEv$IHN66~-oEgR>D=ND-7QnEnlq zdr^v;QMk32k6dc0B-nE3C4~gtku^Wdcr6=kzFReNzCf3W-`YVH=i{28{Y<@?{-*c9Uec~T$&06Yo) z4>Se;QttfU6hQx1yG4_RjU6^S(%&E1ZU6$@A6O2@_~&(^m%ZFoNutGO$7JLk9r?mV zI#NX4I4;MPaLvb_mo&mQ%`V~i1#Mkx3yJ9u9_E2BcUAElK8lkjRXpWf7o0tt#hq-sg!y zitY93A@u03o9vHucI_|n%}-*52j5spnp25@>=A3S_+3p-j7g@1R0Vs51!ZjVlQ|F+ zSGUwD(0(vU6K#Q%iIZggDrASEFfo4dF5m%IP3e>x&(dX^T{O=gwTpyPy~YxBYa0p0 zg2`4M51&I5W;4Pk^|aNoJo@=g&m39^7|XO_&;>IpOC9T#Fq=xcYI{d3 zkSaD_`>GG>9BoEhSo+1$@E{rH?8R)8(1(-b+Sf%hXc-!t<>&wODPF@x$PB;Iv)wR_ za+mNBNuQEZkcpMetf!FYGfQJTrzOWy$;w=Pi53exRwbx%EJuD%HF1@946E6)AGb={ zAjikEaqN?5+Ud+{d+F-csr(7jfvKTxFedAQ5IqqakVL=yS>v6>6p=8cCeYFX(GOSv zjxUeqbE5iPuZd<@9T7+}Z)9|rD3l(Q5#Od;v;Yx89>m{?Y|f{_{J6^(lyOaJFevg} z=|l*&bphYiK=-Tle0%e`#;+QmRr@wpsmVz=vvChn&M8>V$3a+Q?rQOU>|O; z&H$DS0{{x9A+3-Gr8StN@17K^%&@7KbBR#W3Dpf|F4XQ*sSBsO&x3`4Fdy@CCpU8g9d8RH`4H>GZJ*m>?3ld{=kpi--~Z`FNLO zLAM%e@2Nw*gufZnSR)Py27C63|<5lXQ!wyYG8If!gER5d46a+-1&M*{MG zyw!oI<}z&fXRbvqKgS+F$sVT*_C%>EwANA<6gG-++&C%EvMrk8v6Jj3ypn66pzf-= zCeFBh8K>(kZl7r=zJzfU&Yl%8o`es`E@`87;CRiiAeIGlNaecMrZsH|MeKJ|w7 zy`#f*P+WbdOIm9_RPPB;^^Yh4Ydvdu?20Dr=FfbZg5H2H<4W}PP8|uMK!obXuYfga z+EmxM+0Em4c}nmb!*^QNKQVm27Audv*p}gbSxMd{C2L!38{xAJE#|@kQ+V?j^XISf z%vR#oQ+lHsUUPO-2}P_0NiBJHA?nTysg zO@C@8k?Q1$8~7Jsv``L+wy)BmF%181$CN-Qk z-jGdJFHmmKBu+!Z!5YEjP<7>p%I11KH+3t_kpO2#V7wsiu+puSM=xUXtFOvf25J>z zRw{E5WPAmqLf)UdK|_E=UjkKlH=j*231#%Xjw0TT-WN=TGM3L4qz{#htRw7!IFa?EkjIwU-TO-9reOHXRU5a28+B`X%90;#d7Lr;}(Jd8M>L8*F>l zl7c}jE@*35-C+AZ4e)wy6YAh9ThuH}?7^$)(&LA`YYl0Kg^GFOO|x=<=!ci-pEVv{ zGM?#X5CA~+B#_PRERpg0LMFR{a!rI!uZ}vvX7}^UX@- zZljBfQ%iold&;sR*f;~FycVxxDqBuiK^Puz&UpGX<4%ZS0M4p+_OPmL*{N^i{_w>J z7&aPUj62sCq>@^vOKv%5;@Z|Kq3gZ7Tf4*M2lCwuGVlAqxdNW8vFf?kQmb23fmFU@ z>yR`n?r<2WK+7*cNWYQ>cl1Kl2-yU$$(IHnbS3!dye^&csVwB3rlCmIwCu4aiA%_VobeTU%>$#{(T&)0na;KPR+y-9?O3ee zR#$+-gv4)A;My#8Z!KzGDtz5r!9ZOm$u+(g9d5bcV)5x}%M`=Q?_;|kFON<~_3ak< z-|%1S<4<32d#1-~mO+;4cDbeBFGnKYO+q$wT`IBJbX+6jrL&%Dyj{C}?pYgc@WH#( z(s$vWl6PF)d7pYBQDjYhN|f?yg<>@f3TsDvpd3TvWCyeh{Q zM{*|tuNKvxxaCV{Hg5Lgk3elDd+0kf;Hj%FEt}q26#El{N$)+j;RBTv3r`mA4LG}Z z6D^hAeUh{#)B6duS&CohPaEdRw(8%#-+cep35XrhUNZNiG)RN{KM=V7>$Bj0i7)=; z_`h^r7O8F6VzVRoz{mPw91g+lVx575{2^Kk4H#vlX`_5sl&kjXy;$nYvn03ry=4zF-mFJK zsvt$L%YiHHfNDFcHsu9uP$xDm4b=;s5tr-(P)J-Wq(S4}Dzv(!5$>OUiK=;erV1*S zLkUPQZ0C5j4w9IqCzX{+T8xsUy(bq`EU`LWwn|4`)WY4k7O8tf}sj~{B|DMPQ=f*kk5>o;C2VR>VGW+{pSi@-+t1v2|aYWm1Xh_cxiR;UQ=8UQlwe1H-G0G~UErftQnKZxJ= zSL1mRl;nnHFI|&4ed|iBXb?$+Ox3*HufS2E5AZiaePn{m9druMj;%Xv>Z3)4Ac}to zmq$Ng@6P-^Z*NgIt@%jsi877J`AX(BZU2b#IrhG}*VFb z=#O9?htd#PIOnBLi?VDQtqa1N``W>92ZNn@CT$Qbr+R zz5d10|A%#|x~>)pyD&JGTgQ{$U=dEd@9F|oo`&cZ=!9ML1FTqZZZMgp)|41J7{pt^ z75X^7Qt&F>d}TGtUr8SH5i5MU&lYaEJ#hl}vXNchyeUxyi`vq&EPOo$V#lYlR5ui) zJxSmlu|6Bcu32el+RgCho2x4lwrS7G z1p@7}|4Toj{I{*>WM$D-d0;vR0L6bmDraY|EVQ zvO1R?Q){3G2s68n-6h>r#>D67`Ri6&WNBc8a+(XS^4ttf)#?J8>tEe%16Oe!;$pA; zot^Furz4@#fqzO4AEAWi$6AK%wQ0<6KUDS6G1Fs-w{40V`@ql9yR!9ZU3X4H)3%QG zCHh1N_D)f7>v8i;h^c0xU}6P!WNL}JAWf@8HFo3&T0h;-xyaA8GiUcGMdqHeoM&Sw zpRMDOEZa+6=kVL&LM|BaD3x8crr{R_%90=P>VCH^lOtH%o%-AXT+~s%V7HDyMbvb8 zP0!(VU_H!R8SHbh_7w6FSKsQF(l)mmDI{E2}(TDnY>h#A(00Son^8zcS@ zj-V-oDN9h5zpUKAP`1fr=67A zAkehi1MIn&HT*-G^t_)}WEx~U5JILsBZ(gAT<70191X^{4S)J(E(LK#$L51ViyJ7Q zoY+)Q?ycE_zn=Sn#y$)#0OJkYWuIR#9ew7y?sZ)6)O--hQ?X-pR@u@azqyX6v!=g+ zrj|w2_>SM#j=Ew#8|Gim^>`ZLD5{0Hx?gy-4x^K0Ca#xhB7vm1MF{bJDeeJQvm{MO z`Hc)W{e0SQU?|6?Xhy*ZLUgeAB<7oqFNfH7mH5+MO%}ZUU8hM&?K6j4mf%Irf*zz7 zwNAl3e6!=HCBki7FdtLaC&JD;I|5eYi`ZN7@IVB+M>$oB?VSLNwHH=3uy#cn8I>%P zNrzP_`{;vJg(3WqDtaKiPb#Cit40^yS$CExx;#hqxJ-cuS+1m(a#KJmIT z-$2qdrSJKoX1&4wDfl9#*dxtMB5Dq+jf|VY z2Idcs*RYALb4%E{TC!^}=;U|X6A+yOBzhK7d$f!jB;$-?WLj-%6YUkx; zMjgaAj=Xjhm~F99F+Lw1C%tvr<6?nA+U@Xh)bq0RYVZ$M>j>p^}NCtBIqKovo>b znTw;rKXi`&oCf=Ehv@!O{qLhJ93r&5_lB|a5hY=?+Nfc=VKWU7boMOgzM>_nHJG%qv5Y>{? zk4mOZz~NW-kcBBT4|wNTiV=9rSKH&GVj|~U^y!41g_A?9o}(Y=+u7UwH}kH|1?F18 z&y=g21OUK4lxY7W%c;_Tdu9E9U3B(NHjG!=TmQ&9^MjB5QHKI^@D75-dueIIXK;G&JVj;EUGo5}KD7Xe4zJ%xY~p%SGV41LC{<2*`LvUYr<0N$MYk4MoY$QpyF0^TVB9-+I?cS{ zl4xAd{4AZsBxqVT2dZ)zPd>TA%Jad~Oxs*z?va&7kf`!Fk%@%IEbwdbYJ$D_x!OxIKQHp8qM#X*E`dhQ8Q zQJJYQ-K3D6s{qYDMjp)M=jXAvtBaS5Q1Li0Az=oTK2qxnXDvE&4n0T1>>C!OS}>A{ zJH$+?EX)`(tdeNHvV|jj^BdS45Yo=q)2)6S)Q&an^(L(hUh4GM-tF#h)Hfd_P{IXt zZ4dxoo=;YO^c7b#y!V4j56lNe0ViYZ@eQT zFgSlPc<|W3ThOh4y6}%OL$9GZK)t7WKY!d0^DS#ol@Vy&9F7|fsal^_{jAtN24h{y z2)xY2D8jg$uI;ZFlgiDCvV5Ac#E+e**NCkVPXO}AC-`<3C9V?<<_;eem^!3k($iPl zFg*5Fc>`*>fFn|Cxm1SUcpxJ|<;6h>?aviYw8s6VJ;EZ?zOd6mSOtdWZGI>)+PWgJ z*M+%{t6K-#1v zN}G1_A_ldY@f>lQ?@WVH-%t|Ji3DnL<}FrdY?|dqq-xzLK=CWIF{#oS?7)8{YV*mk zM#cDdKrU(XOv`M=5aZ7$e@$_w-GmFW%_6}`KQI#5Fm;a~BKlxQ?jk*Q8WWIFj(O@f zSkv1BX#|1h7?D+b3}RoQ%%S5IAtG8h!y6i;cn^q^*vEq!vz&D634#TGeL;{5jCN<5 zWH6%Q0SAFc*`lhm)w6gXo>@21lbAxL^g((C)f3RQEm!rXO4*|zQ@Pb5o2%c}$vhW= zqW#IRzL3UJ3C3K^)z~faMkDkxB&2$mPH<14xHV>ES`_6bA*YIx$pY)|rPL}+OK0?_ zh>aK`6Mz;H6BKGq!drY<;}tbPI#yvK-!Z-h$wEV-K!9m(?GL@ zaPNDMWmS2xUPR5K&CeV{N~=Z|7k1BSnK{7Uu98DmS5o$UD!{syI#NH$)0JkFx6c=7 z;OC}F-NS&E^ZPT*;MhFS3xr58Zrm6KeLAw+*nw>%fAVxKd7;5wsTID>2CLTWZUQ9y z_p*^8+c&v28iL_Hqr)6PDy@Spm8n5S6x;36^PcAys#Z|&2I-Gt5eV{ITw~pQ14moS zG3X1MiKTb{jVA=H=niHAP)4!0027Ldz^%_ma)5yyBu0a{5TIS#3yIhSI=zgfIj8|N z2zthJ6`EnMpRPb4DjW@ra>ZVkuq@_nxV|OI}z;}YOz$X;@RL^1a^?)Ro59?1x|aZzx)FC*u&HuNuyiBS4$!Wu*3EVnc&wg%p<4)D z=oC;y9p{sWO2^mEzwA=IX?qE_?3gwOx|#PmOdZjszhX=N9H`kDvI?#5`c{ixxj!_Z z3(#;8+NFrR1dS^_UH}F zq2;a{Sk>bt_d!+q6P@_ee8GCj4eZqOna=LHrRw_QRxcadj!rJ_-1@A^P2{<4uv;*# zYnM*$ITc9*cH%at&Wmj2eGx%OFQ|hi(9K(uS-W8`KhH`8=e}2o7as) z^)b-AcWr#`Fgs1W+$5tegS82(5u|B7VVFIZfq>A^-;ue94h$53Q2s8Y24NxiPN4gA za7y25+H!n~Q*fyFfI#2e-2d1-&;8=>GkyGDyZ;;!DDutKFOlAXM^T>pk0ZSpPw*V_ z_RvRCBVj-*e%Rymm5%8c^j4Q6zUR5Y%U>=`z`qvz@Zj42IRx6A!)5+6zy|2QRs3)TeL)%e`LiGbhbk{{+9{x|U~IQC2)0fTrJ`@dyPDO=X0- zYson6kW0Cax@NwiVN$9MWe`eFJ3Eqfst(TS$c8iO2FK#Nam~c&HVA2 zToK#TpAVKKldau_qPxm$blkF50RNUWo@4n!`TcL{0U#(15*$B&N)(a*4^(*n^Jm2W zTBxs5w~@o<{14Y`?d!a1;Q6Re#|Mfab$)!Zkw=@7ipumg$z7e5osFG;#rw_;<_4rh zu0aYn0?{h-!{kTg+SVHnMUj)5aTe42)Artm-mBNmRJXew>REp0HwCq4SBlC(%o2n(asPSMrREKE@>t|xo{n=BZ~@4MXLpWp~K>Gaj(6=!4~^*L3h45 z7$OnwwHD?;cW9W^%Rs&qbyqOP2}&?FG22IGOygUBc#F;V2PD&X@9JpNsbv`2J=d*?#S3l z_o=Is==4+F+0ACM)6d!^Xn@yTS7-JTs%o*>ShxQOwr!frw4v*&IO}8en4+6Ur;woM z0tje9oB_)UAg?9*BJ#2)B+Im*@Szz7yy?fWW9qqt%?lOt5Nu<41xdq&tN=d02UOv* z8L8gOs>qN!D@Emj0i{oP4>Pb@Fe*U2lpBHX-6LPisuXEmq2Un^K@kB?G2i%mW7;-LZkl2*;^-qjuVa6*Q%_E1?ha@p$x=0dsM6jL= zN8Z%b>I70pNN?3DK)>e}awhdXYFSwArMI&!GjlP$o86A=!bGBn)nMNa=DwljvnVmA zS+hU-5d4Bo+~Ow~B;~WMJ7iIGLDtD5TNH?%oV(p}^+#NQBeGyekyS*_pEEx~u;QTU z2}^o$`t4H=tl~z|IJIQkMoS^>nM|PvvSsMiDb7Z)f=9nxdeA5Ah1@0-T9>aT9E~ zv>W@@$8Bzcq5+Vy0B<9fg%A3}ndmI~$Sm0yF|V6-aTaV`q!WA`-+Kd>z?oQ=yEa4d zh;8t}kn!;0InYHZ85%uIbIBq?ocl>^la6P=jXn|Etsn;ij#@!#jM*u|7T!0sH+^zL zfNlcmx;tq#Oz1h64Sxpw@|wg>^$V4}9}!<~f({$WwVcSgMDebB)A1KqgmzHx<4$sc zzBkYbX)8nP;xK(n;$rRU6HkZ)H47W&vRhuQhCAV}`NGhF+I;#Kr-5oMwhoM@rerr+ zzo1)1dW&`*$ZULpSzRT%cJ9BP<||-T z)&;8PtB%Uy-tU!SX;s|if1gE&J0%m84ZODpAZGP9JR1wRjT>J9s0lGJ(_PN;Cek@F zog)v^e>17dt|(mxQp)u%yQReh@gca33_B-A&v(R)aH&aGTW=>aO}}x9L$z_9)XZDt zyzyc2iPLPc=5jw0?|&QaKB1LM?H*}4k+ru1^pU#zIpFNOm^(xmG?mGF_t*PhmsjRS zFf!^p%k`C8zYGA=WX{ECZ=v4K%TiwX&Isy)7|QYkeD%tG{{6Rkr8T|K4f-E^%l+W{ zf1CvH|AO!TZAtCFodfvaVt1<4wd9D|QGE5nzV+|wbs(v1-j{hpYEkEqa$!_Gw00_PYHid`(emzbUWTA7u?_4{g)DaAx6-!c>3 z2+8i7=*9JWE1-4nAg;3K>cIHhi_89OXNKqjZGCXoMBt3!?2{JrS=*jXCP6a;3<*L; zCGNQ&GzurN=-$^5Q#jhS9i2JQ6B_3AQjkaOfAJfbX#l~<3e7eu$U(byZ!|T&P!|(X zX<<5aH^*!CZ4yhIJ5GyAS<(B~;@_0))0#Q(xK61z@E?3DPk?1wx264LeaJ*t9CrPa z-uKkDNp!oZuM8)nKlCn^ssvto?#>}5<2GpVwv-*o-V6bkWNbzK$Q`TS&H2EgOxwJ~(+LwoC28aLIv=Dg$FF4F<{;f1oPi1G zR{95Sl0AG)y8dB$_jEm;>mi!K3sLqBlpZw^?&5`ur1A@ zkErGY?!lEhfP-xZt-xKC$~Tieb!kGqw{`1m#~m?=6e_rE5G_i0fn6{$i@Ox?YwCbf;P4{zGqH zo-S0WAt(7?U%lZY5JI@Yd|WGzWv<&wJw}9Hk z_=x_Z0oSzHcYx@2v#RAsKqCkSzM!8F#tTJg!ByAO_VC8o5KUnYiKL z86ZabCZ5~+r?^U5ynGNIs^}jBfy}yn{)PTm6?yw?McL)gwCq0u=^XwqP0#-Sv)kFx z!q&{`M;UC)=o0%AY%2g0`j7ZkAiQT|g_{sVt1k6K+aae_nU!AGdQ&FUq`z)v&%lG{ zI5`sAG1|RB%B%O}OSy-n<|25{`M3Sm$!_1Pm=Oc6GUfu5Gxye%*W#8|NdqPprSZ(Sp`rvIc*z-B6cPoW)(9JM-)c4@ zqMrIGC~q&kwcxJ5D#sdzeY+M)z1#-b^r0RK=ZDyEtY-XneH&iexlm_ek@5Y4gO65; zu8Q6+lo*3(yFyaAHDzDP_WNGjDrRiRIW$PAu0M%}h-SL~tpH^X1Z36h=ahT?yk-6` zo%;Vw2w{z2gbS2M0QEw;zK!3(K7trt7L~4q?A%4WJiqpB?Uq-UVM?QHWfV=33%A&4 zoO+Pq7$}bk2C=jk#7Y+UopySo_V}38O|0Y`y-=4F2;QTT3C(&SPd_)-{CcwWHs6Oc z9@Wjq_pcXIxZTSC5*Z(p)w=80aISXPR?) z6_p{_V2V8v5oz^Xr zoEWK{2|gU|>-ipBYMQ$TiwRb;ldu3ULjhM<1^lAw{WfI}gW^6^p17axMcnW$~=9>i7GEiJeQ6?R*;c^x=B* zJ|&RGOu|LvB6O91-|v?XlU_<$ZspFwSwalb>PL`?>g>CTt||ZL+^gU(-FIV+jKeu@Q6StfA5=*VEXgJ`doC+L8`L&qE8OXJ8!?h7|PoX2n;$YOH~_va&VWX zV$Z_UlH;Em>rV!LL%GSK9eiV{_d2joqoft*ci<{IOmH?oAx`i!f&v2SYrtPNj^}?D z+JsvJxJyAwzG6|Vpv1dhSMwc|9gWpXevuD+Nx^+`u&`l!j9bkdDci6UItAFm5sv0+ zql<7~#*VWR6+B|N_DYg+o@A=lJecT480ckCOIJ*lqs3ba;!P$5V*lwe6cMc`aO^5f zk_XMTF$af9q_MWJi|FgLh|yIU2@UvQQtk zgj3)KZ9XXwG-oV6cfVw$@qxMEz{eDem2Lq)9Pq!}$2SAJ~Zz zl|=|1QP`PpDc?d^!ZPMLeV@z<+zg`-^m?yo9bQks{H21$Oek#ZsjO1Do^tNUF#)}M zVOXFZ0>@hE9Ze+wC@+plWFz_Uk%w}-2Ri;JA%dIN{6U12ZwBl$gJ#>o9p1jM)lBZ{ zCN!9(Fic<92Poj?58^p!F<%M-{^w50+Fo9cLqE{xc{=sbZAv^qrFnc%N9RKdorCad ze_`SV8F;mv5M1&@2)q%i3I!-|rlU`uY8*V@_YYi><^(QzjwrYV>M`8Hj7*JwE{D8S z%OX5^qvmmD!Nk6J&pdu897EoehKRw2z$)?@{AOhqGe$78GZ33^!U|a9FV07n9?eCg zjuK{s4f*oLyl<&oX12V-%Cy)$DpiOImZF}(2nCc&Qx3S882=$O)d#%*Bctg*zY@_= zfE+LQx>>_&HV|M3@U7ND%igskL^D1{G#mFoAN3xy=6DN_j(OGD=>+{U-FTR~%VW;r zZFm@f`+VaonH|qOSZ_?4Q^PTr(`UM1le7zhQLepPY z7?)vJAf9YKvQG0sU#USx7Fjw7(tLz!HSe}S%dRj33p}jQQMTl6GC&Lgz1|O9#j5uK zq!na1uZ=`fE;WxJ{*Gco0gKP}H5!Fb-n zDgwC$DOUm_!AS@^)_|(bXP{vMkOu=WYhb?X9AeCYzG$1e8agrwOskSR z>;!oNRwQ*jWgCR7vcfy?S9T?onna?wHhl1iOHnp}?am%?!deyss@I(-Bw+SVNVKvy zxI2&-s@5N9dvzS0XDwDZYDrO1EQS__5e0SFzW&TeEE3Gwz#c)j)-gVeCwgG>7tbdI zWnWOJz2<2RiaH;W(03r6_l5%=E5Eakt4M;a4L0s*^yKomcx304_E^gY_(+~%e-Y_d zInh!8SetDKI-kmSx{>dzdsr|Nt0!@TF=mGdJ-Y@z{cNrLzH>vC@6~?+e2uRQBrAfPV{p$R z2&hOZ7z)M3hlM3(&Wz2oFbUnFKyHlwLPRV!nO9E^Gf*ch)=676Ey9itwYdz|$XpeO zSOPaaz|0`Awx0JPOanXauGQpr&=c4Eatkza2$4mVOP7>yfmM4VAzs_GxTffA4g?_h zUWQip4}+=NF+P6bEDiFcf?Oh-$6C$obN4NtGu@6Q&^}3_l!WEA3USq@rDuwNT%t5p2YG(6+_@d0o479}%;8IZ$_015Ez>O-a zTewe}Y=Yix%BmGY*j2=i$Uy7o8sKul7l^^C1@*A|j zfU9H^l-=Bs=rdA6l%;~BDu43>e#`!zl3(JF@7d$l(F_Y{(E}BIZVOKfs!?z}0lPgjaA8y zm!=|4Z2o<-?oD?rGbR(rNpkCC!D)7Xn*+Ia2dF)%wHIA8CgRFBaSbUa!~|1mqm8@& z@>Fa;#_dfx!%o%mA*$JSb_eD1M6Ukc5hT|+gk%oPdd-{9Xz-GEEPy_<2s7fWl*};P z3n7O>MTj>sq3mjU5QntKMOPKDq?-vW^X*jD8H zC2YP6DB?I#E}WzgJ!a(b_oFWLU0vFTrg)fR_dhm&k;V)yju@8fN&f=Anr}$QYBw&F z0*^smx%S7SuGT^HsBGOA-9(SK2)Ty7sM}xf|M)~zbJ&1xO3y)wIE1-YD!589;|HGq zQZ2f4po&68KZ1Bb$~k{Av8o9d_#D5$MG|7vT<@xd<@5EC;`Mdn7HN0TRuo|eb5()pQX9kntCD}{Fxo_N)@yJ2; zCM45_XW&P^q6#yn^5kO(1v~G(4(4VOcfgAxKwT|A3piwPP|Up1Kbd_MO52z{_&Pw$ z69~WFdB>i0?Y80L)!%B!sm)>w(q!}8$ytV5i7FP>-*dxrcz4ZNE zG01+eZ~=YOp1k?C-*6V*HBL=8Zk-OAV)be(S!Q;ZNE0C3s6U7}k?b{OGRRibL`UEE z_d8Id#53S;fPWASO-Nlx0!4x7^GOp=kKzI3Gz%poBstOnER)sVuk=mZ(ootYtD_kU zzUr!TvhAWb4N@nsTQRf#wD-oh;lUl#Qi7GeLyg#zC&!=N$ zB9XG$0%4o~AKKnAO4fDB8eL@@t8Cl0Yn5%=wr$(4Rkm&0w(VNwTer`5y3gKy|D5jc z{>U8pK4at6LvI{;{mo{EFjlkQv@s4AHzJyY`8WqqK&$6gb0=A&+4E) z`4n^1xziZq(uKX#skY6m4awd?nMXW+G|G7OR4uO|a5hmRr6#uR#67XZVy$Y_h0_=d z>E|byb37Nnu6~YvfBZSZb3t*1)YH`Uu-Uf^OG&TGu2+u2Z+%~Z+ds_N|B4h8Q>=2D zePWa1*Y#EUp-q~g{pa5At&4IWL}%x80#7_Uyvhd(lpVv*tuLzv8B$gxi z=>jE1yTtYBRGkuyO=ObTOp9)(Lg0ed>}rC{`#MrEMRA*j>-R`6IFa1l8f*k4>(@bS z@U1`Hp9IeGmfKSHuBa2gCNz+SQP<9c<$0&yIJs_%mU*I|U7CES{WMhJx_kCn8N(%Gla-vPU~ zLKu!>qDVwdFMte!_yWuId>2{~=?JM4WlM)T+Vq1ehZbj)2eh0!pkP?{kzVz(77=Kv zs_m9s%YSvK;MY(qGq*arlREQHjGKY7{$z^$VH>dyx{Hv?2!m-kthowqPgr8=M_80<$<{&&dqG<0lWxB`oCmeC{74$sO^3 zif*$0X;T=)*Z!ryJUe*h7FNaoq(dAAA3&ISsnYWq<#?&0awq9z8XmAzC144=m;BqK z+Cls4A?gbM1Korfq1Wmiu{$=4#`G2Ht}`z52ai@ALp8egCnf+C(_L2j@tGtlPj*7b zkl%?BQvf};6bP?L1=do0xu2kos*;thJarFUT@bNivVy}EqCQ%RRONZjr33E++5~17 z*O6!+J!CdObQeu;CfR{1w0wY8yNn(~E4TQ{73-AqGx-K!67Y3b>dy=h#K)CA)cGGN zkyPYc><5=i5mL)zkWPs(l24*Y!JfI*QxKiU<$C>_OsUgcx)f-G+lp%bP?tgPgZMgJ z4naqIEgeIGcj~?|-V&u9%5D3Lbncmo?UPMdHHSvpV+CajFp9vy{obe~s08nSqxi=x zpt*8#TpX7M($7i7p7)WO?iJo+ySRyxPU+pw9HQKCWHY`{VKq!ve$t zN}D+*cuF$GUn1mZf)8Rm15_{G8f`*&1YsANt%{Y&AR&U>W!+n~>yn2xA~KK}(tuzW z4azy7BMo92m=K~8Rl*$VymPJ?mS~4>sRzhIQMn4ZGG~XxS2yu1$x;=TMj;zmzc-%Q z^@}Bp?9dqEXVK!O7bgyI@+~g~C4+IeB|!8Z@=|CYI~~8xNv|)Sa?r4OFCmxWS??~eUxgx@_0 z`f18H>ESxG(kWY!itHw%48s=dpyxW`#b2uuRiI!J%Nei*%_lS_FG4SHtWi&XqEgP%T#l;U1=i#D}uG5lcXejb&TErkgmA0Gfq!25iE%&7=Jml&h zRjVoh3R(AycQAfBnAE~B#EjRXh(TcjFB4kA#EG21p3#3!p9&5u9;}OYNCODEp~8Kx z2}qpjTqNa6>OsXs^{Z%_MN{A`N-Hw9uBbIUdOMoMo^J-lA-nozI%`SZjF_biQhpMn z1zovxS@tVgZy!Q?*!?UAqLGPw#E8i}(k8YEpC}SSRb7N-Xs4(ScITe1ovb;lIiW#4 z%vY|Y-M%E(#?Wa=4!ZHjG7hn@S{{L__rofxca!cz8%ya)lskI0<`gWAoz&9}x3~XO zUm%dBnt6En2R`;E3s~C>#qL<;@uu8t2^7+N=|1^%25ARe=qy|0_?Lt}g9Qu*iyPEL zj_D$#yp`y7Egvw!B}d)M5!r0W<+HB`!;ZT|mKJP^pdxMrv!K-2WUse>a*Q`0Ggp=< zuKDg2yOOEc2}Jke@!#myi7K}UIo};6Q^9}yQ1~B1uzyAH{{x8q=TUcgH z&j>-_ur|6ZnkDU2Bga;CBvFm#d)txqW$lTgIUrCC^mGTPGBjj5$?9`KQ!W7s|Fq@k z!kJBf+&v?~)Q*yIpMO6+Uv1tx-M>XpnP5jdTvgDXyg!kyVx1qI2XSz1CgI|F_3{LM zaQovYh3lMn$ZW4B=C~sPJV^np(C}87i_IMq>p}SlST*|K3G)W4Kk1nk>MBtT5xVyx zM{omG19ziRbU;iuB{h>BEl-|GNJTZD4XKQd9|3CKkmN`MnTr_D%#o5$NSUU+Q`6|< zDhb}G&ufH2F_V{G5H%~`eWOclUY+hbGg3fjPKv3OdOa3eZbBV6*MP4?l;eigLu4G4 zUSpgbegcsO3+okm^iv&()a3UEcp+y4wTCFux(cP5xIRu#1+{pu|6PqCMZ;w$zgtp> zN9jk(bgWfC3u#YzXag%c5;YO&AT5DMbhxUl!}@~UAkAbDJ!D$2-LvNamqeKdKFVbp zsw^7un(Sk?=TKv!^c2caWTW`1&doTgu_T1hIKlBkXky-OWXfy~WD~Zi0`f0&%?PSU zsk0VXGCyY}g56HQA{(T{P(r@Wqas)mHgm2fLwWk}uc!eN+Q<;hbvTfVNNvOING$|Y zXgKUP343X*R&GRKb8$!(N0Ol1HLM{~?9Q+i0wgd|PtmC`NW)v>-ZVVPT$Xy(v_oFT zrXvgsQQGRjWan&9_S-J&Z38z)u^&%TA380Jbuy!nN(RT@t$MUlm5k4hr2ahK_uptS z>6&8$M1n;CXo)C>hF9f14SzlrUw)E577!)&1}e-I_150X!NQ zWI7gH)?}B|DtSE?9^r=b8g=Zo-yihNcvty5kppfT2>0FaL-w0+Jn~G!{vGtR9-6&f z#|NZ$NNoP&?dN7`7g0}=FB*G3Ng4$bT_r-`L@=X0sbAXcVN7dOyYn}9qjxi?Bq%!* zJDNx}K|zK;Zor%6I>NC6)HeG?d6O@KY~61(9rF0WPGau9a85dnrX8NL8~Lctvyz$}p)dsI?4%dAkxwFxU8L*RfnXMO zTBH!QTo-;(Jd%Mtj+Zg!6&CZvs@|1Y3oMg*tRWotnDT9Kk^;>I;8RfR{VGp{Hy3d< zFe5j&n)!;IKObu)^*GaZ-56O-;zq?2ZABPU;$F>LE?>`RrjZQOGd0o=d`r?oz{G59 z!W1Kh8b&V(zG)#RX=ti;Oc_zWskJ5uR;0$pKrMGe!sT9?@zt6E78!L}VFw`+79 zDsfP#(T69x%~MFsGT!)pc8L<`s<2uFoh~c81aFu)2|@}QpxCq}Diqf3ux|YU_SZby zmDh;)^!K8k`X=4*{*M>+f948<6s;^4_~1WrMtsoNcGv91%_9gvdfnAabmN}7lx|r@ zHS3(~F&Y~yB)1&^zuLk4C%SNr|yMPY>J0E;sc17=?Pg-8!-XNR_tGKk~I;Aio^CKiEWE~;e; z=&%?o2*ql3IMdk_yt{##>`;)k5M?H2HN7lA5l5jZK*EGp*%V6v&oOQNGO!w~kb&q1 zsS+LfiVtk)RnAk$-k{G{f25idv8x$(%kIOYR16-V0asrmpzy8D8xXNObDh(zn!s5K zr79lu(GVL&7J$a)!$Fo+eo7_IMKuUpFJBNrnWiRae7HBE7&bgAl%9#j>y?d_Lqa-@ zST;AZ*&G8pCAZ9RCz@a7#AJs%!ycr%qtEsJ#KAsyssl+c9Cpz|=e zA{aXbb-X+%@rX(mbpF()61{PAv&NQNTovWS+3O(g0*q-5K)a_flix?D3u+o93c8SO zgaen&=A%oN(`vcu>Y10g>X>X;P+=79t2Ajn8ma%HY0>K)QZe!iRchPJ$kHT=JNwWs z745zV4HZthc!b*xv}nb{6MyAJ&v%=_(kAM6pR{8UGv?-0ttO2HiCL*ok!k~l6*la= z#AVG1A1`g}1`~8w2*8cY;HBOl?Y;$*b-{U>Fa8?eg7^1}egEUD`kztqowhu0XFD|! z(-L`57mNjen8Q7FK9W|2U2btNx%v-1b2r5}N?Z?pJIuE@Df`Ozei!QdL~6&1D(}?8 z;I2&dsKT>%Q^6ubf*QWn!j&iTqYr+iEgF#Rb8A)-iX)UtfN3AFev^T3GmO;G!{_llc?qmh-Qje(x!|H(`L%fLT!)2dcB z>n!k});(W-rogH=1OOixRDzpCms|^B2<+tHczkB3mh}l@euZ=H!k=%^$VswImJNfb zRDzGaa$;MX4mQ)`kdSdo?2@J0aRzrGx?FY7k2a}^?DKCb{$}xo@ky`p;8sgSw%iZa z(#llR7qh(s7zzR2)!UqS`}xT7NS%Q81mSgac%+H*#K>f>W%Bjv;L@3j-6~K*k6%O_ zzd>ScksNm19%{D9>2giHi32#J3kRzwJFMVyGn05RS zQO?YBVKn?aN#)b)yGxAG8iXWJcgE()02VX@`Qs(1_ED?Q z4Hda@4aZgV^(`TcbHU!(dz%<)2|BL&ihqt~Zwv*3XhVBmJ4%zpMXz zMo34kdD!v9m6Agje+Wr|E2p2*ha@Vmko7YBbV$d|A|XXeuR;qEQqUsbN4YW)g7UX& z`PPP`C7zf}{pjFMBFFV~+5J}M_o0JbqOzI7t_pD3}$JDKI z5W%>du)_)tFk@&#qVllF(^4n}4OtO}(_E2?U1>zQ;Xp@JXyGvLiZ~dUYsI}HA&3h*Yn~g(&MnA%YJ1e`P z%aaUF%E4N!7zcVwb7drGv2A?1UrVsCTyb)-16%dXp|s+QiL=<{Ty1{Tz$0XG6mpK& zf`+E3#Q?p|_*=s&9^g~+^Y4DAV)lWZ~_SbiBOr37a#og_{dKj^u-oH#T z14P5Q(Y`nE-NQ&UD6>o$Y|=c(xIsfv#1M*hqouShXB(!-7=+s+m{a+qyp&$4Eyee> zsJ7TY{qlYS)}dh`qTeb4=fq0uyX~SbkQs+foXIg)L5nlx0|+(#k^|<@u_M%Y4s@O^ z;0qH!m7&;*moOeD#E=^DeiE*NQ*K)VA8zg_ry+yuChXl>g9!?XlemB3ezxOHoJi3L zf;!2O0Yg)-%P`Kc&!(2a9P=^PXD{v}iw}|Z-sj(HT@Y}u=#IawN&fA>Y5lM6qkjp~ z|6tOrcPfCSxb7f0$!6^i&vVTv`z!)NBNm3AWwa-gMM5wN3 z2B&=u)0)(bX*0|>tdJGD9E0PbL8xhFI{);};c1zwu6g za)>%#363tKVM7=0X?J$;HqLD5*T6_@h+D!qDUdg`MuNwNnhC(ts8tQs_$!(w-qdEa zg?Fe|8p|0@&WbMM=ni4)Q$9JfSq_zrbmsKMMb^Kr*Vo$^X^ii+y7B!I{9jr4KRslx zI4SdfKIoul&~5%1DX3nso2o*1z|%56nqT;Ls!bqwBUw4Y-+Z~t!lH~T&`FP+>_Sf0 z{1ZT#u*DQ%HLMVDzx<;ea5jPH1%X0fGrZ80R8wHN5P@7AcHd->&A_jEIl>YiX7qh$$-lq?if4$*abq zIx+J>5oRUZL7b*(#tDnMThHN6C!1bJvixK8bULD^kE1q!rGRthWS077{GK8EG&^tU zgc`j%8LB3ub#;-}UcRhx{5AZ)QyNpf0kQVJ7q$oV|9}9fXl7-kZe#rqN9&&t|8TOD zwZ7wPWUrXSFWoRPA_XL~>UoaJB1;1dWWBZ0a*9c!6vWXm!u2!}%Fj0}&S2mZu=VUF z5kRcBt$hct>9|{lB|C+y|ZTz+LbnmElLXSEe%#5ee(qtu2Jw~_;kmP7W6Cauxp;FFw?qC`Lk zHV#i1C|)kuio7rwoaCFG>!QYQ)<{NBr?Uek@T=$6@QQ;t6CJH#{+YhI#4)}0km{s= zf(8SNU4)9y8fp&AyeSEmZv(H!G0l_l*$LxIXncUtz0D?rOz237lYRzdztXVh(j4r9 zEJeAm(?5#-F?Zw{0_tFohA7$5JV6~IuEvNqEHiI6V8>%whGLh%EAwR<`D19$a3S-C z^xbU~p@?oIh{z2ZQ&p2Mb4r1(r=tqH2oQnD5%$-4AtCl%zzm|SGGv%>_*+u^N*DI; z@HN)Ki@dC*1tt6Atn-O+t|b%otd+zYjo2oHDhC_cDi1XQ{_JA6{M46TDQ++AUqz9p zbw9pdkr1H7jghS{?D^S7CuX*5zN;$da~}>U`H6)Xx)eX|h-iC_&sroFIUAwT3aiVl zD))+FV}(V)qd;ul24XJIKbDRNNkoZ@jyrNt>`!@P1lmFTh;Nd9Blbz`Fp?zl2IB?Z zA>BRyVw1m&gXQKKvEO z+b}aincKXgU07Ip%VFFKun5H}TN{DQ&w^zmQqL>0Ys%usx~~;HYh-jHS6KGyt>UJV zIGY0mAJquKNNRRd`Zc3*?OTKTsr5~{w`i=5ynP}62>wES4z$M`l}D(7*!BEHh~#Q%%V&ms(@lq;gkbh%EN~5cY%8#dI-I^lIicn!a*9 zx(`knxY`-{=5M6z#2$Xv`R|iUqcubK3^lehb#BloPN}UCP~me|K8~u`xOWPT(J3f0Pjk?x8)srebj`c4o1js!~;dbP{-?zCYIT(iexh>Iuk4ZPWS%GzD zk186xw;|U}F+A)VFB-a&pdni+OT|e_iZ9qwZ&d%)wdG9F+gi)J#r z43JqDvnHyreiLrcS#DWcL&gE$ULAQdw?NF1N->#6Ek=)lTY(cSC2=edwxz^Di!u} zvO+s4BKq~!_2o4;VZG80BmY2rd{{T60RL*(X&S2|2-NS5zIMuO!r8J9?nd2`Pttw` z2Vrqq83)qA+3PnCA`Ef{NQpM}2g0DPjNteH#a3J7n?=3mZBb(lg=`T(JX*46LF3uf zVs8=u;Vz@LDIcj_-v;PjtZUH1#a(%7TCK;#H3fy#+yfUy=orT5V1+h1K^4s@k{eFL zM8{Ir4yM9veY(gkHqDwxur^S<&1c+b8Ex&(FWZNg^V?NJ&-X_|E;n9I?ly+^pcbG_ zoh&xgd-ivi$I)BMuV@`9fnb)~I0o26?X0&d1NKB6bPJjjih#@DH0_i0i+BZ=CMw>C zfq`e>d#xJESey~8??5ndnY$?GN@F-^-N56}RjicUljXTvt{RgY><89N4x?gsmwT@bsgmOFh zT+4vGj~g1bD|P^6fbl=Pb_+L83jpNlcfp!oM=-eB8q*O##Kvr8c#_L5cMnnmGC4Y} zN}PC$97*Itc~|+FBGMuK@IARsULbUtK=5@e2-K_i)}0~2WR5~K)nVCM2!J;(7|(Ta z0fsV@49Wb7*~Bj_V@`X|v?m&ry$~S1D?J^!-+}N%9>}S@ccz zD`hs+O!`3sHJfBRj!LXcN#H?z5borbj!(*jhiFU;)!15q80svX9dFrX#;54aPht5J zTN!ij+F)4DJK;9xqw_7@(&RmNwW=?#p3G_t8+3J4f*P+18U`vS$v(|@pJF6R@eX{i zMS^NxFjtJ&bcLjtVwipDcb}gQ$<0Y6p&ZH0-W?UdpcC|xXew0>rQ{gB=rVpqFto_T zgS);6*AtDg!rk6ZZnfYB5ulMAm^}r!z~rVZ0zUyd2}Z$0a53=yTzA6Ehc82^6cJ$H z^a*ZW0Dh3ab5c6Lj%)y*xSmA%3_@dF6`Y>hgP)mKf5k}&3Id93%kYV#7=~~?6;4DY z&~894u*5K+%c_vn!6eXq58x3h6}4|xQBrJNPkF8=5@LkFl`#xB)vuzOZ#_a>O%&GD z21;TH;02SY+U0>c$;q)ptOrB%{G`@V^(gXfN|S1)7Gt)cKR=QS z32%;84+z%AM&0QvTQM%b$QD~?+c=h&*JSEArgkveU5?Vnx$3T9#g4veO=4b}n|U&P z&G-!MbH6L;&Q68Gt6cXJ2>BHB&nkL^tq%-F7^(Qs3IBy1X{j}G%D24+) zkPSJvKML#jDYi>0$^py6iaiFp8~1%T;L~Oj)X5IS5$mCi>4``?;Wy3Lr5fkiMlcel zd5uk9l4wXqU#>n${knS`Pz|q}T~7X7N-h!srovw&6L?ss*B(j#xgyz#X^ zEn@N^rbM0*=ljbP7lo5rFvi?oaSTvCm(nnYkru1yYzDq|W+pahMW&q;R&YHg{SD(} zP=mu#?Z$1r2aznzE=O}NDq-K0gu2rdl4-J|bPY^mpISHOlL)vlwtp%teF;$#U#uPf z3S`awTabXMW|iud2VI|C+dP|HzsL%8_gL51Y%DIcpmlVQj9EiWzQzsZytTS5v-^B` zpU-0op1tI_0K8K7j!pNcLPx0{hG@ul<(wyqf_A#e9icmCnH!RFmx%cVN~r+_j@|D+ z0QO+zfP%R9hb4$g$Jwi&zmCj`_RVREPt+-szrOBcvjym47iT+?QEdYh3K-2U<4%R9k zt2Wx-LkGb2{`+!zeP9A6@qHJD>~cGoyH?XAKP54OquUI)JqB= zYvxJe>nGn`6B_|BSqx=9EQk466fhXsOO9@MS}V4umg}n4sH50yMqIrLfWJ&RXD>%L zAFC4NXt^u1_DxOBUwHDC78nQM(#P`o?>R|B6Dc=-t0jErSH-lZEAxQ3I+W0Ijw=f5 zx`v-DPjSLQtV5)Sk8>;<-^4=<@_nJNj&Q+?Um~aa>Y8cZ*dwa zFgREriqcgmp@dE61$3DFDZ)mW5q#g@m4GFe| z>sNb_KrQ6_!*F&T`o6&CF{$X4RNJbd|#HJ+8+mhdc*CXM* z-DwIUik-dK7v40ZPWjkc*{1}2>s`&@ug(y0GDs1-b9vGZ>*C&K`UmRJLKp)X6{0nq zW0t{(e2{t>3CUHK>uI8dfXfl0<b#~Us0 zJbcIX-4J7i;!hLCh?aq;S_rX`%wtB|utB!eyCO zv3vSfG}bX2qVBG<=*Nj6%vr}I_*GZ3xp^Fp_Bt<3A3oDFRhBLmVd2v6Dlb`g2FMvo zX{PK%JQ^uws*;FUSn~{|Y?YUvLfSdQxL`K~VtA9&6HYA1tYxG7uc%QnkS-ldAJmw8ywLya6_QJeM@`7uw3B47K_BOhF zaJD*=at_E2g=Q=cDpG-HQB!)4YI(7oLQR2Z?P_$kyF?;M#UxvgVbE@Muz?1fPgJ7V zW;)VFz{b zEIDYn-L)+UjB<$bZ)!DJA8k`jHv~j=^xvF1u(m@xk7(}T!XnoNow2V>!{$Vbq3d3K z(xX=NFf5c7vK-Mju_9m2h!GF%bOGR-T6ijiL}hjshYVrp1Sw&~^dy7ErbUZ2(j-AV zQNpW$NB*xyW z_|A)){a@Ii|Am$Oe?++s|B{a=O3;w#=YtR04*Cpni}3%ow+YreCy$^w(9~5uxVhds)XVi4u33Ef|h8^9#^Ydic-injQmj8LeC;L6J?OKZoyrd>gW#rwr@=f-G7pc zjKKo=VonGc*{%^F&1D)`3~*51?kim$c1J}BD{#U5IC?Uiyj(QDrM!*vM)_{&{%md2WJoox zbUZjY`J-B81XrdN#LAT#iUyfN6WM)(Zv;6Z&bl{wxM~xxxtDcxR_5+WkjbC5pv3NK z8P1y1<8P@xLB|+39k3ri)=+=^_}1(FUjrZinLz1O)%vDMAbYXyeDN8=Z33=~13^>P zk+QCe`sGnCq43i~gHy|W|%hF-K!b6~1Cz5j_a%CDykmmzy;tDBq zN#Ebm{+gvEO;$6uKpF^Q?p>8fUJ;;W)UZ0w-5_YKNs?BElo@zj@8$QIVP6(V$NFOK zL+x1K%lSOe%-KvpD0IN;T`V;JKhj8{TxBai+qEAyIr-2bCIkFH$Nm3pK5e}=}{xVo(6+#Ao<5TL1hYWimV4JIe1IM{yRscKv zMQGG7Op|0^a&g3Du-CxUY;4G!zgXu{O98}7MiH02YNdk1h4uND|T46vWe zy@pKb)LN&IF(#NK=Eop>QTa7%8bxIwTf+@Yudqj2?HRyRjmdtPjG ztmhwgBh;{O6hYWm?yUfDRi}3ayaEL3Dq-Tncaq^{bXft?!+A9Fo$)U%Vs*?sj-BWipCaHy&kvQgI2&D1q0Sx9K7hk8X-6g zK9{6z(?Vk>(0sWN1<-8cddn3$RY|g#mt05}gpsa5?vAPg{o1D@G~g(QApMr1Xsk9j zGb4V(i#yBro;`-`(&T0{BqIT#`0DKGPgNHQCO(lZPjTCBed6oQrm8n6Cb z)yvlix3_-QmrcN6opuNsyX-Y8Oi%-v5gUgsNr{awwP^h1iWzh8PIb%WKDr{Hl1|BJ zqf8lCsvo=fae%Uo=1Q;Ow5~#by{Cw5rz$ISaXjvDo0vv$mePdra9^p>89`E*KT<8! zX?n-VH#d$5S7d4e5j`~n_Yn+}3E+_Limm0gG=0W_lu$2t1|s5Oe5e z*R!$+Wvf&QdO{L&V0bk_qdvJoEMG4xPf7R=r5C4e0pb=0kuOOUI#Orp7!dfp_>I4on>(;ziJn>b*rj3}Ee_ zvPqvOcB{7g4DVrqB^(y_Gq5a%S1_a1a=T{fF0WMSAr=coPlkGG$=kL*7^xiLI$}&d zsaToC`O#O{m+LJ2M*;B$qv5Gd)Sm$2SYesy zQ(TOh=wmK|(k8XB;b3!|NJ!2Y^S0!z5ATk(VyTHgZv;&)6iWkR6b9Wzmp@NCcM{<8 z(B^Llr4DB4+5K^O;h{vNM`qucV3B{`%6;AM_WF}B5p;g;_U`hNA|@~yE-OyzZRmi+ zfW6kgY~KIGS2@3Stn%U&`y;Rko_C|&r@z?DlR4?eHY?cvGd=Bs;8?{FnOZ16G@a3& zBp;-Ls5O_qg33Qk5PfG;Y=9`^TeP19dg9B_R-918-6`!7<>UOu*D!@x#NgNR=oaHe zJ4+HqQ6o}kP-NHTQ)7B_@`f=WkxeSH8DfoQvA1vlZjEQFNYQq8+FYV>_3wNfB?Ym#ccYB!}$SNl_ z(kD{KtQ=i$%JV#3P^AQly?1VbspbTi=bNkLL2~&a++9B9DNy~?`eV)f=icJRTJ!f~ zy{1e|Lzr=#R`eV5JRWHexK5n16Jb010*_S*XjXEAkTf7MSBrgXUmY6y+FI@VNih1z4oRCnNc6-$%*AO1NMA-;!-au z3L+m+c&m|{K>3Y-1{B;$gR411%k`_^EMQo(OOu-y9DxDDhXk935;B;bd*BE?MueWt z2+LQ0N`RsWmS+@=o_x_JjvGW^FIs;%P7&>|lY=*y;eU~SsdS&fdhG=rQ<)xcC z0_i|hynS?ql2*GC%a&HbpY#S;-#k;N2}86tTt3%#v#FY<(QF?iX?O z=nqZzqQGnzHtsGRhC0`(#Lm<0!@}V^gVtCn2o1eL0lOfYs8eZW+6FzbJ1rlO$}$)0 z{4~L`OHB!lxH^;RrV<%|4kKIFnPH?{8H&mN_%xUH~ae^ZvA(@ zG;yZ9IQ?bDjva~<{FQornd*i(6?sR!2gJQ}{^?<42fz?y2}4Q438t~g!O(Yd1)$va zn6%?GiUVmBx0gVo6IVAF`RUA|Q*L)G#Q9uXkm*p9wXG<)I4L2vD4_4Kk9?@`2v)yARSNvLy?zb!p{CFu3{uYm(PkLBVfoYuCQ zfhP#yTr5B5+xT+Jj*62u|4?^xH8-G|Y@?;ZvW`<$Uog{=f{R^KSNYTJIG418%>w6@ z7jRBU;>&=>Y_!f<0BX_EbU%u6mdU-m5k+K35iaCrKjkUl0T2g_{tuEp3{4FSc`Z&r z@li#fRT}?FBQvPpA@b+t10+rq?M9U@=lnxYi3y7K)H&cg2iE>q4RFv$2W1L zf$}HqC?vSZ(i3+RnW7`^xH^A}TATql%4s2}5(! zU0J2)_9Q0VK-Eq>brdc^dEE7YS^3AmYU-M^xbv+Q)-jomI|;nYFBz8w9y6g?aWdns z^H9{C7S@Jsrz4k=z%6O^!_d*FNPaI`6KlSdJ(LEv!rWmqQ~<6!>6(Dm!eZ|{uE3@e zOtK2Y4+Bc3I{Zwy9;ez-lba}fH7pzf0@EsSBftTV!bgHx5$N~VI8|YXBOr*mraw91 zBf|^TAFV`M!Jgw3i!@f#XCgv3~Ti7mGUHw_rQMN_?pEx2(I#f+X4G8*t=3rPU4$0?M?f@ zi{+J07w-QjSEh{~ZH`>}C?Is;X$_}vRIDmP>HV5SZBa@XK@wupE9H9J%f-%-Grn&P z1Vcg{CO*J%+h=qOo+MZnr7j~36l~NVx>>+@#dMz7!^JMqgCO#_;4KRat6!Lmtxo@^xllnYp!7DlituEd5-EdQ0U5gc?QsoB!i+M>mRRDU8@au zGItu6E_bxn!?Tosb-NcsOkOpR+Ajf5lRx6eMi==%Bm4%dkDq z%}m#^!=i?zg+ry=Jr?*1SL}6V@{7s(Pr3H&!S}j5pw+WypZhFg$0(5~R)ULLN$ONkpg*K&%5@m2s|O zeEpA379i^@{5S69|CB&jB+c%WxzXpQDGCxbzkQ(sg27fq1uc}tpLLvvc|S{ho`P{6 zHsv#qLP=dz1VllcOn+M|u8=fFnMa>?FBv zGk#58r@E*?<-Ooh;zNkO%OtT0TY4nuX6dYWtv)^+`*51r5MTC(?A`+UsvRt=u-4vFhLRY4!aQ`rpm#f8wDik^GQ7c+kMt z{yyLjTPhC_AHIR6K&232bJr>{oD&xSKS4OwbuZZu9eIJJ^XB7nLr;GCu2D9h8cF1$ zOe~IoDO@ls>lfMC$f|)q%^K&c8V*)Z@_QdW{0-?R(jmoS{;m=YMEmhW?ce?FDrVM( zHZBf=dbWD{W|n4-{|E>F+vxwPgVV6t6G8sg@8FF@Rt}~RIXf>aWr47iNP-Vs6;i5` z2lIqZzCd>|#!9Zb+x9RX8e$115;1FpO9L}FvZvW@b?2aeo(CsUtQ&Myn=cSi_oE_Qz7}bJ+ z)N-a>B9x6SF^Y>1WBtGeWQV+}bN_?byf5k2eRlTtrw=;SotAL=Ym4 zW|@Ik{OWk!jap)Jh@$Q(OR*6owRqLexBUlwGUf+z4P-&cw!5)r^G&8=*|$j+c-h;Q z0A&Qi5jB9A`npl6L&+7tW#vy)5Hx<@qAlsmKeH6zKPw`BRdH+-EZ~+ZNyuk;XTn<( zDGiki6rvwLlM8{`(ME8lTQsc`lyYHQ+O=Neqtaj9RaU9^NWj)WeI zr^xuNL!*qVFl-Mk5fkWsbPFm0WtX*?Q9Z8}2o#Ogn^PPqC(e)CeKh$cKvGEN$jq#2 zx`k*lT?60-@01tGi2g-37hyP1*!@=ycXBR45_i&kBoiW`VvRb55|=AqecmLG7~lc8 zyHv5t-Ipp`uDEPmb2Im;<8YeVBSfNpxmLbzvjQN9Qr?RGjQX=&&7HFseH7T>@%hHTh*_ajhG!CjP`Y{4@ zhqJ(Yb+Wn&JVQs(AqJ6#odlwIrYKjY@0^B52sJ3nk1A*e>HQPy^9rF1_$7-^h^PVtaM?#kCwb_aLkyAY~ z8T^2HP-^_8U60rx8NZC1R@xVe(H8_nVjyRIRxS9FCaR!EY8QBgg(C@y`A=cfS{^3`NB80D2APw} z*LM}SGOP5$@%WI0r!+8vOv<_VMgG$J;j8VxWnG!jdKbnm@)Qd!>1)9`H(u{ z75 zEOhV9)Lf5+F-!F3iE-WO{nt`{LT1{b1x44BzC>zkJ8RtsCWtCg%4L~(r^ zcTk98PBW_&QHy!M4dG(|clD-BPQGF5a;TDUNz+>G$WnbL?fI&*oApdzYh5;dVefFF zgWfsiiTGEUCi?%eei+!r-)Q-%A5?#)vj4~R!~b+E|99x_e>(jicmSix`_jaW2m$-h zpZH;*l|xE%>b_mpyc%-6jYjx7iI&XUU`9wxk);ve@3L#Q_3m1A_U-)}rb+f>`zG(b z;faF3y`gGydFkZB^^bXI<)mKmSTs%7)?a1DM^&^>)OdvAnQdKk(8=RJ_ju&P?o1vZ z3E|9dAF90mhRL*#(1mh7dDnm9P2AlEuaU+?o(jHikmY$~U5FtI>mX@NLe^RCb2EL2 z!IQGf7%jK~c6L3)alvve>0Mh%20?pg3`nQP1YriY;Vfb({Q@HC{=^x|-3ED4kTQru zT881{kQW?S9F!#>!`2=^dxZ!26ny2f2JEDNu|U!-^rz*rQ53qvqu=Xd@WTbvx z3fyuch5i&mquT|dI}eq)hVffN@0g}ehc-+t{8ghFJWe1RRqGYQnWJ$m#ZN<0&+t3R z32PAv`KDYQRs%h-drM_=PHDw}iPoKAl)wvJXLAhptH~8H2s+2tM(nEZ6tnv;9A@tm zrI{9EIJRw)4M4mjqy;L=mW#KZmaT}h%lH1tVoMjEdb_wQ?etL>p0!_{HR*g|3dhDL zr0GCxjcD38*$e$YCXDGemqMV_Bu%{G?3+6VbLuy;NBm>GA^e9w zS}!XG)^_23C98^l!-|SLi4MCL7O;ZHlqPmk>zG1ykLc&P~1-(3raDB9(15tYe33?JhY(H?i`ucl_j zEN@`{7@BOk!sDBtkTm>+N8*7GMzRQM4x6R#{3{sU(q{dqvZ6X?|({>iqcB66`a6HqLQQ&t9*znDvHaH znu?qnn9)Zv?o{jYJ2RN1@#?V}q$}kHT8-oo=VhLITY{Ndp24Ctj~Vo}L`|eg=y%Ec zQ-j8KLy!}rmR&>#Gx;O|=GU<4i)Rc`RmJdb%YjS$34MXNI+sHHtYu~)*@kw5X!CSP zt!)?k#slrS{z9A)=MH69$R3<7y_sWItPRVZ7;$|b=&c`hOx>Y*S2_m%q-Xo?xE>vz z4e#VXNjW^QmCl0y=vvwT%r*XxiOBz!)1q!aPTVr~=KtgM`0r=`HrvqtmrVt~AM@aW zLNFWn#zhv}M7WCv9d&y-WD(2YLJGFgGGyA6<46^)`e}cB_)2KerLI?{65-c{2^7!k zaGsBfwhsp!WS`$n*pFDBSYCqiJk$Q%b15D*J>{;yIf^H;n;sZU7SIm@TvNk?vEyS# z7oH;x#J01sv$5qD2J*uYg)hO1gBSA0V8qGoe(4$K%kz{FpFIr&kT$ciABW_9#CqB5 z;upu!IZH2|&CkN7u!zDKOKnf}(Qme^Qel-YMSfB~wQujzQEY2Cr9zT>##v&B6X#5= z&}ukf#OWM<9x=shPa7tp>o{AtRya(7_*%%TC`D)T*@(0o|60&^x6?L?aEA+DmJ2b zLx~3L3Kg(N3INCPruu9p>%?2GJ3k{)Ly6Q>z4KN59UGpUVuvVVHen-(FK*(Ut9QL$Z;ko|S&h*Q@qNE~rHy7dKR-y- zsZ$j!>s^(p4yl*pdPz#}Emg9|XqVN+elN@K%oEfMGn*n@&SR88tqTt5@yVNI13MFC z3fmNw!=;$8?2}^MsuoM#i2!3%mLUE1Ja612OrsXWn9a6|qk&L>0aR%joMV<0d7zN# zmB;m-j6B-&#?cK;q4y`xQ0mhuigS(p^8jG1!-i-~a_4QIG@ejGX){L67AG5A_iG))Bz~(F{}Sd zAnZ+VcF@P&65Yw_3_T0K&)1qw2IkU8E?-8ghdmswy>^=N+s5xOM` zQWYelG7+I<0y0rFoE+gMO^TGzHTu1Kn_%miEJkwU(cS?|yvK)} zju7)!_1-W_5=2hku&8ohc$ir?{ z%_J)*Sr)DIrf@bf2}VuL27>as;cpYtX`AeiIoK?hn)#?C-N7g_d5bEJf;WZwgpmSQ zj7c3GW^c`^lo^-b-K?66WFmtFrAY$W#Pl0=HFn59UvOvG_gPVxnTxr4E5p5RvIC^e zD?{5;cwR($V1*WA017&A!URgb{?>C`z6-Wj(RaIdIl4eTez~7?+U0ViU6z! z``Ajf$9*(pyoC%WR`3lB-qLV<#Y}t1l)xHGh^dV`1|{FUe~6t@&B+dIoum2tdGqde zHEm1pyUY9AT=g!xygu*#u3u}nv-gufm=6oFO<`_2Jsx7Ajc|f9ns`W3?KmQ}u$nTJ z%6i0Bg3t-IR7z?wTf+>EMy4?HWpaS&`TNrfja(lY+!+CfiYdiJEmkXm3iEnOf$#`i z1B7`kJnmAD8FB%k!sEcF#lrv+9Ih1yiedxaLDzwmBgL#fW;GYb3h;}J+0@C7AwQP( zBLy#!dj4`vc#r5@d)rZsXHe+c?T97ssGDpP+DQTHLo;SZR*F}Mnj~l~mC3T3y_@01 zKx)MnMMx|uFX%L=`@1GVD9f$(Okt9p zNpUFaM-rEw8;=({Sl+N2H!+;+MO%^3){6QKLoo5#S$Op3fha$y62S5yo|A~`Tt`%S9{krY4B6Zt^HKm|Hp*T|DDR?KS2H5r2T&Z^~e9E zEsN{12_}*o1@~=w2NbS0GW5n^YI<%1-7X=i)EfVCuh%X=RM1uiqI~I{f1%@C&wNI* zo55&Blxov_Im_syyYOIG0W!@&Y3CVb%Z9+LMrZaAv$S7Ha>dgnr&2D&e>U4MasYH6 zwD|2D3~!-QN9>Z@dI3;-&WeWjxG17!;%1Fyh7lPm0PGgpfFc4YSyzBIP-rxa2FGm= zQH$oJ`IUO2t9BNNhGsnwd-BZQRj(4HGc*B1l24Ao&MNU%E%AU7;~|WI^gFclRmjqb zC6({1keTr64HJZ0NFpHdar&{06@gxXan13`U?v#{IInh7)h>0uxSYor?*bC{1ajTQ zM_@YCBwNb*OU=)>v?-|!HU#5@g!WnJPq7$1eqH#vEHuHM0tp0Wd$m@xM%9hv$4^JX zB9v4#AH7?WVhB}og5Ab<)76Tfw45BwbHBUb_fJZCm6WPJpFe@M`&pMU{(o7g|9koP zKTyX1Ddhja94}4Vml|e38M^`Z4lh9OR(b>k`JR~+5Un|MwUM`OkQH-c%Kc&Am+7Xr zN?w^6D74-9^d~#ZE#W3jE9m~1jM^2kfj;wg z0wvhlqh;fX$xK*kUs+4@-r<+?_9jR2{d3n z%35B}NdnA{NjQ3-9n&`6-(OT4*f@n7RyzHM(meVE#TjC8jVq#+`BWRXMimYaOmjCF z-RR2sORMKg)6o;#l*VI0;or@@?%C;QitlWZi=pkTYKd`13ezMHJ(3kO!%HRQ zt3csWs$iAVw<`OgzeyR2X4_5fNU-d!a@hC86osZR&a9_pMKVH4x`4S~;We2=G07!S zq*Gw!xn&)y@VE!)lpYsAn=d5m+cwvkLewPn0(2}<(pdc$qg@~_kXP$AyLWbwFc z(5k9QQVy^TKWGpYadtc9vfn^zFOE=goS5Kb>RgAeg@#6o4 z_*m9yua*5|-RI9o?Eg0V{-Z~X8~l+b_~GgY_X-bOETm_E4<94P=wu5cm@fTY-*ihMob5U;SxKIfnLr`E1Mlb_t@M>uBqXIAlF{SyC*Qy3cA zySnKAr_6jh3sV~hIu{R@T$Mq)Z3dWL@Cp7~;GN^W;Q%_uB^ycGk-aWhV6aUyBib|z z38$vZ3vo@ytfGs;r_lroK3+aPD*2@o8y=u95y9MdR^nARxLGZWM&Zz{SzAuLSn*BY zrb$CQ^X6Hm+4M=_i7azw28&8&Qmu`oz@$gDYcAp(64(|{z<4EfmlhnTU&s^IEw4Op zGewqX5afRb5L+xT6m{&}&VQouQlmS4XWg5agXr{LB>dV*Q%kYOoQOym%M4I*1vjQixMK=?~GV|=Bh z#mQ_JImeii>rJTMH+WPU>q$dLWh9o@<1V+{ptuA06yAD|!UlY+zs??lHK?QdHFp5s zWDec6ce{2)H6utdXY77`06@F2U!Kfr!ggqax9Yoo2q%rV2WJS~fFJmL>Z!}A)z=s2sjYx?xOCrq}7<{mGAL^iK2qxmbBtN^U|fb?C`~oH(*{r zi`V0Y@!2#88ZOEexYf0`FQ3=-n+>^TsI}36iYVFAeK~6qj?8|CLWcxD{evf`qBM$RcqEg;@5EVTT-$z znKavJpv0Y9yvA*HPrbL$yya5kcd#RuQ%|GvUX>K6eJv}DVQj`EI&4Ty&Pjfi(si+hLgr7J4N6y9Qzj)JS?M+;5 zOr7cf^W6S9wY9hVUq1X-97E^AdAkGg`x^5bKBKuT={L=9$K`BGE%(C-H#ytOiZowK z`ll8aP)!>OCGiBe6z=bv-O*qVgcQ;3$&=v&VWQw)MvWVvSHKBe(KcFSE;wk;P2yi^ zqvrwsXy4Cd(o;fma3)hVKF|O_HV$r5)=)jAD zVB`luNqOA9;|6mi&I3itQ%y|q77R0J(KJ`j?d@&tZV?31dnSq*Bl$x_b4pB<_Z+=O z+uFEeZ$60;5jtOw`B_^EnD?4odJ46GoyfhoFV{#S~HtP~{AHe7k(V-d^6O6adI@ zrIb)4*@!{C(&*DOAJ)plM#zZ6w%NQaexX!1QE0{4MSCd}#=GSNlq7PQnNLys+RWMF7z@r}; z%Qrvy#q9nlyWC)qK}FN(53;#L^_2XP<&#rF#kSx%D`;^`1;7h0q3rG>%2nR@NO|P4 z%p@^M2#PCel7LK1Kbowrkttt2j)8%D;F*32Lfy5pwxMPq%pyl$U%Fg zf^P-t<_ZGh2-fruk`#BhlGFvJItVg+lmV1LIm<$Ji42OkcEmZsoHi3>n6tCs%UmXb zG-w{C?gEe`03uk`e{9-6aTEmSU;1D&4qzNlVZ?yxJ|7MQC<~SCQev)N48}ZC(sLO;L}a}wbAEi8Xx5Hczh5N4>^WzA}B ziwgsE85Xq9Fq^$I^6TT8&F>0+1`^fw5mG>UD55N&PgHK3XFgpJ0}cv45QFb^5N|M5 zuhf=1M|gxD1?jT`BsDNpFI-a6@oHmQL0`x$G7%o4WK68hYdG!FGX*4^3Y0kv?ra_p zitn_kaZVQC7gkEO2?kq8e63v!n!Z>*8T_M$&+VylIT=5PCk?*^5)tr5EEfI6jxw_M z`|>$JaKG6ahWS-b1fj78WgpI;4Yvtyg>Ht?Pf*)@QkAiJOtJbq8`BFpgZ|yQY8kBE za>5kdC0IGQc^mVn*_2~Wtx-X>903Ef3U%F%4ZA0CS`!;qMI2L3$YoVV@$BJ79V&DF z-2B)*knnGw52EVzcf5u8l%7l1{D$i~PSJh8leI5qsAvnn zQyf_8n-6l14~#`pD+L1X+)aV0HKGRMJW1(<{89a@5^c*dq}xEb&m~u70Q8(6X)YPT zwlLKeESbMU5Rc-7?0=dJ)x*GIRivZhk z?Eh}!eZzwF_fRvyyjDLza)bOzjlS%~dH|LsAgN8c3_=0ui-GFl36oi%d?MxL2tSF;Op%Axat)MG&-8C-%VF%b20?SI2%Klc|@|d30cce=xn` z>~jg=Ms`MRK|c}BebGbLXVkU?XkXq7+c2{9hEC`dN`Qn6CScDSMbsn`H^~H`DJYjh zLedL&MA8!iD9CRdC=qAnM4Vw78l(c(2=p<=Yw`>P@v5;$sbT?b3D(40cFC#{(SFep==qWM>+>bYSKZBMRxS1mH z%*Lln8?9=`QL@badnW!j$gXC1YVtqF@seD@vdRDL?b5g43lbtCxDwPkyGx9E1 z^Mwf;^4QovuUfCg`15?x0ZWl`+oF20qIU%3?^;DHo+BMtZD+9-3?QSKMv-Mur-gWt zESR>w@1Z-U>|TQBYJJ!s6>bfkpg{HYP{#B}^_!{s#eN&u1h-HJXVDvG3}=|SLftwM z%G5|ssu!U3M-wcD0Z0W}p%xTzO493y{7@OcsMi9oj8Xem2ti90YH^U29z?DgTkLt9 zxGYkCiDIM&WSv$jR4aZDH(nwnRHTJg!Cp;i#2bQ9kVbkENO(ZhL%P*9Y)1#SqI3}T zwc!IR?eE8V^Xc&;XGeIB@snhR*}djMiy1gCEpe?_t*C->;!SWF(h3{c{F9*xG>ho& zol&J))w9P`Fb0IP8$@)y0Pn31OiSW2U+KXLlQ*dX=Q!g$Sqy_ke9tA84?amGNB4y< za91wCGmu%Kt{ns0^DmSb4k2y z3fd77IR?@F0YHBDGen$xhBXa^-_BDXKPA2Xsb;4SH?m>2L|gW_J=-5u&R|-{yg|0e zlgM)9h=!+tul)A*F8ZfFSZ63L;>(qO%}jvjs$1$43T1&C?y9)SM2L21wh441VX20W zl1@y3b(cXLx+v+{9yjaaQOppJ6A3Ha=I~g+*ty@Hn#(5_4Dp=L1>?QPO&}*U1){YAKJk!idRk`8I5U9=oSG#zxzX!gt)$a-;1 z!`CCpG1e5G#qe5zX7JZ{+jie{2g8gd#)3T$dJ$9<5 zokp0Kofq66HFp7eoMlDTZ4IO7waPxqwzh&5XkiE0j!}tP5w*^dsdP`XsXS}|v`smO znha8_D|@Dkzft2&AC{$2!VH{3cMY7KBR#$e2lu&{m6^3NA}4HWl5qqel$4VkYa+0v z+RR|xVQ$;@PV*5c)C!7?@_^TP#FLL{N-ZB^9Or=SpsSfW81R;|*BM^;-q8#gPQM}R zkY`+w3Ao`1WeqMEQ;}3ZLl8gVAjGCji@opp*vAE=2sMPoGNLt}JI)YGtIJV;Gskhp zSjwNx0wgiPJnhp}R+y?guUbXBuV~LJ!`RI+2^b^V+(WF%&70HBZHQBl^S~Zc0@azV zdk-wtqq)uRY}TAi0$Vts{o-K&{p8)W&A+sQTTg|0=?tiDe35kYEbAP!trwqU3N#;V zQZQkk)bSeoP@^m#7Lzw~K7|niWu8B-%<-vc13s%$sBs*VcP;>jaboT#L_s7j=>e*9o|B#Ud5Yhoe4>BY z13<4Wwn)^fL2v6zB%<$B107e*7{8RxMx^49HPmxY^IgxrdH1^~UfteEO#)$*AyZre z>P|NyMS66QHPP^l`F^r`b6HlqNvDQrx*@B0rf&$B>i@+ zTC1;8!6{aR?&8EcSw)$oG1?GiWL*VML!wc!RT`K2xg_;9HN5y zpqeK^R{8TgB#uu5_x-guZ;d}L==E}6A+y>fz9BqN+vfA74XtzK4ZEmL6-=erUJ&ln zc$Bq6zn24Nm#Y_M>v5WOrjV?tH5`?xr$^RERiBTqf_kR1aSvdb=nO`C#$)a{lyDK( zbVy@l{F+_EhA3w5 zeWRs^TX~n6>?F<^%KEb6%=CY%y49%R`#EHhcs-tZGvkI|hYmvQAjq?3G z%$F{uEP_`yJxLdadgQ@&X}(-NTOQVmO_slu(<1wTj`M0PC|UEwYUUkxZ0#p>ZMfgK z=47{aC;?c%wd#;6oa3eL#X`PH=@E0VKv5i96;0PX-Efa^J2iaZlc@b&7p>Dn{$w4g z&eT8w(W4ir=s6BtRB$(Tmb=F*@HX=;AVT2 zH_@$E4pAH(^;M%~C>A=Zw#%0yTixM5ly>jzn)e6ZBeMzswHqS-CP+YQf38XRQCDe6 ziu(Eu>%}vCe>`vLYO|{V*k7gt+HUrCt@F7f)aNw>tDSc;O6h=gPo=c}X${unRSeX$C||i15o?L|BnL=6sDZb{vX_1;0JGW`2PZr_*YQwe+60m z0|=g*A}{?TOg?%Ov~OtV-DK4Z30nGnYk;^#2AnQDcM#UwZALLrkUIpm8IQm zzxQs+bgmFZOU10%)R%#+8ub)`3Ff}}hPi;nCRNA~-86MQ8>#7~I=*H-OLh?h>UDD_nt-3lwq-XS_Ozezv1o$Az%_0?*SJB;j)QqZo|}%V zJjl{R6lJ01?=bSdvmB%df{*yp%-Oo%@*rFfgje(3(2!Vx+G%cDP_J4?g7M-?MF#I; z@=jsaDd<{-c0;3*Qs9j44aa3vlh8mt)W!zVf~_okp0wjKxQlA%u?O@B9J&Ckr1H5^ zQA;G1;;j|GF{@vC*UvHxf|?%u5ZXlQc8sEdde+dDTsk~4v}4lMR^t=zc8DUJyUj}{ zWjh9;FoBfeaK-PEF_}w#OsA; zSirQ;2=E{cB09u{@0?{u5==T^FBzK7m+w%a-luOF;S+`!ivh&u=Lq@}l;oQ7BMrlX zF5rp@q&ggQV!($@1Tbbh8vxjB0RB?04!~2mLZL)LH6mWe3h<#hqIB^XA11HXA{i?J zPA4q@l1A1V)d@%4$yfPeKK#y8yAJ^;q2|W0;mk4~#QAK)YIf>U1$75e#xP^EV zuB<}@VaDzKB0bR-Tjh5~QX(sWIQ+5!q;CU9?Iul3ILE^rn(aGFqx^Ba~hPTol*TSFV!E!T@$yFw1?vC2vi z3t;U$y%jV;|w|yejUEk5|De>ti%& zL3v1zkmB~Kb+>k;E_N2<2)?8oE88^!Eh5qAXL-@(!7N(H$t7F)&AloCGOOyu*4rv*Jp7tAnDR1Gm8ppaV`J;=qrkDeXXavnNrU2umND%xCBCU0z zoF2(VI4xC%CZl?x#p~wK=DMxw23PzzDcS6z)nk=~xfQ>t1GHF2BCB7mBKK5;M_YYZ zRbb&2sQ+3Cl&_FqbfExrt_ry3{86xfq0RX#r`iyu*?4 z+g4!JxvB_D%sW}Br7f3gvVAPy)IWhuU;^Hrp~uuj!q+!wxb5nQG3GLbcH4RJ-rEhD zqlV2L*Y1LL++ga_*I&$y(n5@9aUrtNtrLPTU_fP^yeK4t8-ZDh0n3;Hqa(oa=JC_P zI8a=d7;U<-55UYHd(&l{CJC-;q5ehtJ@O?D;Tz{kZUocTC9)*8m_u(~;fJsz7X3se z=!kb9rsVz}t*~Zxm}HG!3w|OmT30m0SeKuzU&8pFtcULLj(Df1U)lCzj&dLK&B}Cv z$sK^c{sm2-yxyN?Bt-B1IEN!gKi>P&+vjOlMA(OZPja@tXcLx6KV1mpb(xSs6HL*< zhGRTKEM^S1s$gj{`H(~qLvE+7cB3=LZxPQ=r08%pJ}=1X?C!LA;BE#csct=1IoXe@B7VzrBlT-{?CKk zZ1Z!8J@w3Z=uC1R#gF-#9Z6o+@U!LqrJOv!RY4SbCrH(r(Z%cdZ-Ym_?0$zy*AHaq z$ABW=t!oz<>b6ryppEe5QM zz9}UOH9;hoeCC-F>d3^Css|$@Jk4aDlRvZ8+FgH~aeO`}ZUu5~$y09o==+1T(pA zXsbv1^HUmL#EhkFW@ar5!pAWVKUA8=iw{2-dJ{l>_P4^t?X|$c!^3|m2;{lngVm10 zzCTAQ+L;Q}b;Ew|6yLq6t{dEVeK zToLs$`y|g1R5i3589V~7-+|wiD}-$@)t>#u)nj$5SV4!jBb@MZCFK@F;$H_s0181uFH<9BG?0%YM~M~LNQi}Zo++>swEqr0R0~^} z;UK0t?%X9;+*9r<56Isr>12&B(xj14mcg}O;MUDQ6_INYE{*>X-avbC+K`kE=SKp> z{PqGW`K&B&Z4gLEFnXc0ri>KR3Dfsxw=kLaBl0j!qE0A(1VT9csdBip_^cnHwCXIRNGd=% zA~Oy=<0D01B4U3r)bI0-bh3nn)S?xw7D9`lhI}I0kOg~dpYWqsyQ<7569tD!B?~o%d z{LtbiVMpSSz6_ivL(20BhUX8Qm6!Os-ZgmG5w z=3ngbKJ^N|fdhRUpheo!N359&1bRO#U`r|uyFZmsU`g|A;gBkmQjqJB7&-H)?x=JOeOz-_WHHM!I*6i-H43@cT3YOsfO4&mF?%#*m0F6FvN zouw@`2UByBU3Vi`7PoriZ&v25*E$#W%*9!>--uyT)k?7D20NAh>3!Nc&Y&>N8PFa&qdoGZw$E#9wcC0(hq9 zKu&{MFik%FobLZfkoY)wWto`wFHz>^uA)#8SyYX9+_a%|Mw3hmFxW6lRzaK1o; zvmsTt&VNUxyn`^gavhE)8J>@^k;bo3e7{0tuP=g) zi4{$!TCiy`)5h78CXKEVuqyVk!ZY?2H|rt+5wIdeB@D1nWr=s#>|$pENl&)ZhEvCu zN+8%x-y%2_L$_@hRtQDW9hPExjU$^fK+U4O@}aS4&@tJ8nC?KD4JydN0X?KB)x-x= zufsqkU7CnJQ1FhJ8Hm#_)#ltnsKT}qb}gePUR=MNjh=@QWxHHCx}~f$kph~? zcJwY1`yBK^g=EqFsI&M5ZG|CyhY#{Gzbxctxl&na*@uVJm{?r_02!g%zk6izivRQZ zDbP-O>R4y2u#>mN`_8y*u@j>pVl8p>5dS@D*61Me2KF|1VEDv81c(YlPcu@)+?PhFsybN^oTijP159BL%sR+s=X}hmi52TgbUnx zx%zuD_1wO~v=1&k#Vb?mL=nWB@^!pn#uxw6WAKfFT@es6;0%`bi~X7_Lz6GD2HBr5 zNtekMRL>TbNAnSE3m@|BU4#C7>e#36F4f{0Fb(1pwKp^6oI(58%X#*Qiv)?-a_W zl`Jf@wwI@3+uNgPEIc>%-amu_wTzbMsh`;Ui~ak`6BKKTwG4#)!@CLZy1Au|$c=&H z>;5o*y&Zk8t#|Nlx(@!e948)@OlLy3M$5eW0~oYpWJYA~rCd6A$;~o0HfamLIoKa=`ze?o?aGD_?7OZ1$wHmz?D91@<*fC3X_q%{cQh=BY-S$b;~@_ z+`(bdM49FIVA0O?NIc)SQ8`Y!CDA9JJo&Wd5}(w0GD$}?_4P$R7Ok13s(Am~@9Ugc zF^x~2dFt0XiKai(^msVt$o}Bom*St(nu&WOs`s};!Jg4@;Z5_Z$I!` z>d+s1_`VM!BU6UI_3Y*5#Rn1Jkf2!Uid?aWG*gHIF1YE6IJ6`Q^!*62@p0ner^C(B z2j|%G?|--=r$m|L$}O1+3uf?1G}iV>sFJKSetAqE3;!jO!nf>+NO%54p3z=Dg0mf7Lsi24?U6o2o&ZwO10p_-oAe0=H&G9u}L21 z=2y)3M{$8~TB)E~x~&@82rNW!)hAz8bzL_^em_ssmrdK~3|@i@`n`?L_Z+#0KTOh8 z>XmJV1YTYDq3h?i`FM$o%=zuBzpAU1tT-O;YvD2EVK^k20lDS>-A=7%a*l|9Py&OFp z<2*-#`janO!{a?BPTZjG^|uVUZ-1z{8^-t7MuoD-`E-nQj8M=WjE95 zO`1RC-zlzOVtin&wHqZ3nFxVR8gktcgqFg@1pR&tre$IRjaSTJ-mgh;(LFQes{xM!Ua2yf zcff{iv_?pY=QEyCVBnVD7^tf`u*q-s`s4kU91@WPH-fC;qKNc*(VZ_VKdu+wV;wx} zUuTL~V|w!$nN?=<7NY&-)pp_D0$!8QO1H68Y66_dI&I^d#V9UMQdVOQLvej^$f0$dy*EJ@3&+0-mY{`IY{%=l zxS!uBiB2)q2+)nn=uehHL!CQ#Ae9Ein8J^!j%~zNCNcF&npH=@I+zXJNoz4kC42bT z0+`@;0I2A~O>n)c`J2@?I=YKjkT7)ul$e{Fb?y5J)fJ8zkB8X^su+9J|mqcb@+tA{lS5N^@z_|Y*N0y z*}MI;cot4noAjmV)Y-E%v;Gv%Jn$k@!W^_%IsAh~N5?3oY?&H27@ihc)9? z5GAI-#qdA@$o9*RF4P*cQU9j?d_uS}$1~o-XF=3mjbOQrF1geTIom%@3d^0R9q6!l zp^!@rL!?}Q^+U|nWfm_9Rk=3!q`&4n$Zn(Uz}KwH(OnU=#tGo%Y&eu&r}c@Gye!tCg=5d9BP+!IQj*ym%zZDGut6uoph5bt<7jd&V!L zrcitkMxJFlxI5i;pr>vG3A7a%kp!88W8`$>P0+d#bciYq=p;C^-{zAknI$%7pwCfZ zVi&~3&sS_t((?i(HzNUU5x>o3O-XbHybuNU5_5T$rplH9Fw(O0is$Tm2@T`#OMH^m z$sIwh#zRcw28}PEjZ>&X884Vjj*kNTaAKAunP$k&F@&x$M6WOXv6*(PK0;kD)itds z0-HH$;OPeM(aD||v}vfl%eUwNXKp_9yZ16_@_j4Jcc$N1j9o9!vlek{c2`oM{=M_n z7A)Hy{YUSQgK=P#4XdQT?PJxg@(q!BXK9&|K!}uPm#=6v+1Yxt;qer6{83 zqge>=7O6HT1Z2WLg1YNRF#yy#-LYFYFq8f_Df5F`&5}nu=pKKjz|A;s*nCvTTsDKm zd!|aU1!>!M;*+-i@z@54tl&wDOwk8)GuQ`y>{@$Bn4}0<@lZo8K<<^{>G=EnKENEx z0;q%}A^ms+=M&iyFJNePeH;f3WH|~&tvepXFT@2MTr6rnN-kzw9uNsNO%03n{ z`JWf(8>P~P9f1H#&y?;XpC#9CkhQAM<10Bg;1E|v8EDq1>nIC&@9^-wNbCG7>qhLH zoo;DcIP9S7wFR0#+Aq&8BtfBU6^>c?q~2hNeEc^*g>s#Sy8tgg4%D10O zfU_6)UbTGn-Kq_}>Se7$>^;n;0Ut$O8bT%c+w~n)o^-{iK)LJL@058Fi?+_(zmjnw z%p5!!(iwY-Z3WYw7$rTkmzO8n2o55K1jj8n(bXe2hW`#meX)I-^QlG2!6S%4h#&S zfR`ox?XLz98#2Qv3O<*2{4a~g@DKcQqg}uTtmPHIp%df zTXWMaK-ok-K5sldKCkc3(L%L-9>3Sq+r#^#H`YwE{*;9Z>}+0;eb$&oy=vn14EhcZ zk9M9<-985jq4kV3V_&Za57r#gu;l(U<<>M85gqSE|qA+e;DJqNY1vvT2O(U+S5X4Se1 zvhE;mE+=QSZNU_o*FCnf`aD&1D07lWZh4CgZG|K+U|^0>wsW1Bhx_o7CaXqIOtY9F zjnK{RH-`3c&Ttn?EeBXIg_TS~Ev;F!n$qMJ5zW16%{eWBSsW}}uhV4qtM-|ifL7$` zw4h|aS5C6?&wq^!ORo>=OtMSkW=I>&7XP2J(GT8%p@M5!{Y#Exj)QW^1+MnUB}_cC z1H>Gc*`Xs?wL9K^(g6w^Rd*?*<_(XZ>?`0|BSIv;2;r;PAyz{<n5*(DaKUXE|JP@Lm5un{apAY!os zF}x;h9|sAv<$L)sJ0LFEIx?2scIiuN`1X&G@7?+!ui= z!te}r3}}J(17m#z7aw?KHQV%3J1ZA1D|EvjYlmT5Ptw1d(j_Q3_GcoJoU1V9imCN`lc6U)Kw{1#nH3WoEcf%Ls>y_#6kN@V|+=iqFV{kIDe0E#BRbi}*1^ z4kR_k_My3?BREY*>rElN<#3aBSyv@2@#crJ2@5*u5Q6o@b1&J1hikXG>IWWZCC9QE z$l86r=I!Egqb{{r%9##-f?Z&^8jaPQ3e|RlowWhVc&q|mWu(ithl4K*&e9r zsg+Gy8w*z9S~9)8v}S$dc5GmqCG)ed2g6FZqbT=NvbzH6Obv20RtdQ9PWJ_$CV4_? z(iAXV1?8`e7&Ps98dFb{Ihj7An1@CE@}?iLpTwq9A-Zzi$gaG~w+*6Ijz-@R0*#`S z`OVPatW6HIh!5^Mx%qFnBoh3)GmT#sAOo>H5M?UnGE0b>1Bo2-^mL7ZxIPPk2(9Xc zq2k6sdDaC8G)k)j50a&Bu_>8IF%CUo#-xWnmYH+SV0&NJBcjh==koEj+Ch^+39bEP z*UHa;#+bX}xkjNEFPIdpr+9t4i`Khsi?ZLDZUzLx;M(2zCZDrb8C_6(GMPQMbOx;* zQz>#1gdOn(KM1l>7F43nQi=k>Vc?cSd+PA2q=(`Ci-tXbmNDRXAs1V5SW^zS+ed}Y zSiMg9(Cx*M?oP(@6(}q1r_ER5^p$YK;&R3dfXAHrj6&Eq=+TehQZ2D5KngN7C5^${ z8-2c@uO&pr2ufhj?^wOlq5m##%I3ZV@dbC5&*Xg0Qk*Tk0Rn%SUx4<0V%f6+Sk@s> zrYU}o;iO@K`=_&Ql`SrgpwJhVq9VkK;lYm9BEdy|1cTUyM~oED^C{xR%`1q;QE?>p zz%(^G)^HLsyZtNgP!)vDI%kJT%?Mw{DMl3-658Rle0f~EiUrRv^~%;mD|YML7T z*RmD4IamE+k;wVA=Cjh`o85lTCM!{i!VPBgsw1;ev1b%}$P)f-#1pfP-JDZAjL*3V zr%yNs01ihiM z$TO%#utGu&5Z*oII_Vi%#e4YQ1e0Whohq|tqCZau&HSIs6j!OeY~2TFQYoxd#hN*~ zwCgs{s#-fBNXiP1j_%p^JeMiZ#`1U93|P(gH0O};c}DP+c+7bIN$`XLFLO2`J)Y!EL++<!ccbY?PSMB|+C85Oiz$nbpBSl!*r0$qbrFRy!etO645;BqwF~eXKKTUqrS_HRx{=<`P1X?0W$z# z7X8enZ#0kh(cyyQCQfwbzzmo;xFY|=db!Ps2OSh>+33c;2iR=7O%|#2fmsk^gSs*? z7;dT7^G-y@##HyC=I`Pt^k|Yg73ZN*xkZUES;?kih^o#H`t z41FMO(M%9!=c#gT-Dr-k+e<0Ipz}i}n-e5T=@#Rb6rxUQar}ZWOhrTW_zA+yj{(a9 zoaqX5$>x*yX%&H%)FiVNM@P;%Qc_oi_G9wc-K^D`3#i=Gq6xzq?oq$LjrIB5&EdedZW=Olrmobmht z90n_rNa;M`TB<(eow~RH0ItPur%H zgpTq(P?04wsZszCkMCQr4XG7qx2uiR+KCbpl-cJ}&zx)T1Lh8SsvIPw(OtXGO2HfC z+odfE2!l`l$WBh!fBI9;_x`9!aFQ*i$&3yUTS+$kY%0d@FY$BT7|N8L#lzvynh;dL zg7qx!ce^o~SBJt^tk@70^+F>_I{<4?Z`f@dpJ1d%>HTy{g?uatX#=atr|n}ojTXyP zv$On`vFO_t+5D@9dIzzf1ZGO?aN^f8KwVpg-j5QDEN%afNTlBnc~ zUCNv#IuGCEcn5{M*8<^P0urLy&JkL}VA&_Z9>`V&7#saRg) ze4r}TCZPG*sTNXJrv+`vmPd=pJxF^Wf~S#e8B7u^<5;wXk*kL0AfV2E05E{nAYl{a zauiPzx4TlMSVf5s0rqCNgM$_)he)@mL!`=XVW|(qyHYB=`+7Cny9OlK@0);%-ISX=07l zAu#d2>Sz-PA{EoBOiD_}jE~$3T6{dt>Rn=hwRWl&!SU zC}}Kvr&C8R1AZaYnA=s{x3HPlc3W+42b7t% z2#-y?9bY+AyJ)va_cWH$1&f3_xkPi~Lu;(uNkCc%bGp|$)pAiivOhcnxI}Dm=_IOx|YkU}7U@PC+(eV{K!$blC;>Z21ZwaunF?CEPtV44{?Sy3b zn&7_*YC4aBK5-B4BV>5K3cfO-d)y7^*#9sSeQljpMT||jaAq@NQnB;hrKJPojWy4G zL`=PKm?OPph!Km`)@0T0O$%qyCaZNrG9#=R2hpGN^s^Ef@z+9C_=kn!Zl8)DXounB zj^*0LG?MyLyH`J*B$HHd_1jkQ?zFK3RFd}CPvUO({Mo)bp?hB(F7}<{Guv%#DaAc6 z$tyVkV)s0@jj@K!Q2t1H0)x1m#lW{+76aAsHn5vU*pyh!KVfD-5@4}(XyCh3vXkzm z?Bf2r$^laogBp%i=z}Uqtlt{Z{Jq1ad`v^HEMm;>WpbQZ;<$b-fyb7t&>O$XV<4q0 zbJf6^Ys_!v{ey#tD$@!~%6j{uFnxu)>AsuODj4UaSOCFs z>7ie5QZb((YmyJ?n;B!QfMqWFim$4miACWC5I%&W}IH}@3xWr6{ zylivM@kftTP!L)i+T=?5rkYYbO*qXx|-n^g( znmT;lodwA@+n1GjXbI4T%jDq87X`>VsDt^}<`vH3(@tK^=wsMaCb&6chX-zC98L6Y zl4$!>7uI0Lak)0@21Xz&qs&Jhpkdt7W&LEjyz$IBUm*O8bW}HI>(n!@Z4G?zKIG+j zZq*|&Pk}2x_9@=B(gd#R^xOfcBM<ML5783sjy+u5i)y_7yo)TZ zu9zO{zL-kXAVSK+DMl8@`W$A}s#IzaAaGQOMeW4{9BN>S9huVK><-KE+QHTEA>xL^ z7rbA{pOY@|MNsBJ3!4?ArQS5t6q2}HST<{|v}x}OS@1&Ajh@!iEp zdGGEsF0tU#@i=O#9mM;9a^Y=*9&niq?6MtlWLmSNycg=aml*FDSJH`TrS~_zlff*h z9$#G7dF1D#*X&f2qKNV)=dza4uz}>rQdb-T>71zIL%BJBrcl~GtYn&m;plGmoZew}x{-|VlM};6@ z03+U(1L|L5QlKx@2uun%KgqQhSiA;G;zv+I0H9^U!!#b#42qfAgb=+WD!b*ubFbZ2vc+zscIwGYazgrHxyOsGMDGd zFih`zl3+&4Ddyf1dJd9)$y_Lt8|&y&OT$)mwl8kWSd#_UBQ71^{75k|&{D7h6te!< z`F?WUq#Y}aR4Nv=-}9olF}=b6*3Wvf0H1;j#?VMKR++r@8-u$sG8bUBTWBS1J7<77 z-LGlvgm!8-2Ni^5Xr<||gfTO$59dJxLel_H?27`F2HJ1lZ4bm$7EeU!{2kAkG77yx zJY(PDKNob!FbA1V`WJ^Zy)QQ#LMBD@?J<$It57Ua08)9bX1SDqgvQ5x4^=Kzq0E8I z3BmprQiiBT09G?L}lyc=cUCbfirq4=EJH7^<~U8H3w7nz}efS{xRt z6DG)VQmn~{k1ogQ%2kFeDb^GGH#z&+=VO;+zHgb(aQ8ATR)_4O-EUbivF`(P$nldA z!`J{+n0-W?!_qUsPr|e|hJcRWg=>!>JWThq$?nK7yup0|V&Q{}fdjZj-xxvQR>;xG zFaB!?vlr^kU%+h;)^7x;jrw#}7X&4Yv(8$hP}l#6Vmt}w=XN+C4G{-S&H+p$ZEM5l zXfnep1znztrF~{%NBi3u5jAx&?R|IyExy~Rt3&wmLWO0vjk^`pGrq5mh`PwCP~QRT zD7*g`)VGtI*6yVmnwu{|FG!d0xsMMzQ<=I0hnafFhJ)!2OEA=eK4PyLr%szKvH5j? z+Xx4-G(d1A_VhJ_cGEj|y{n(`vcKb;eAh$YXB4{<83Dtw(JK_Y$#zyVKiXNtCn)3d zgfn8*kY9S-s9ycn!8@MG9`^5KLdxbA)i}&KX@?2RibvWmmYTJGp0)QZ&GpsE`^fzS z=C>PEBb#Gy3c2;D#eNQD+jyuN z$8!DO7msaMIHTglHPrYg*AybAZ@KUkjlOwW_^Z|C+H^#G@AuXl!csOEABx-U{)|YU zYxZM=VvPV6m|?EjZ5$j=Pzu7^0)dY96-fb->a!QDSv-c;lk%AL@TrhTmpe+ChqPqK zJTf!RwaKA>-P&nxh1>_&{n2nl_arv?Ne4@x2v0rw&;4C2kuQVHZ0k|pn=Q5)&@9o<Z~#}=gs<1$Ey_T0&Zoak(P#2Vp0FuSh9_JDx&gu9`pJqyWck4A+*CnLTJ1yD(L zWRsVLSVz08rZa@aL#W`|_`Muuf9`ALSap%|^tY4)>xS#M(2oV=I!trTcgneBS@$rN zG^|#hw<#X29TbGG&m)^5HkgOZuqQ3zYkW6M>bjP<^dwG^PIx6Rv^?^MjQGot1q+=a zKu-aD9m^@(ztg-!SD75p5eJsXUpx1}kmW>6@zgyO2lEf;C&EbbyIc#3Ypo2vXUsS_ z>knMgWK5tHQ1(n-?)Its!>E)f{>Wf7e1r}nNZXx?8ygUk?hE}65%(`1AuhYNjB;0* zOybxIqo*pdVL%^G@J{f@Mh&JAc6TO&X;K`CgRB=BbN?aC7t%hsi+@Ed&e834E==P3YfMVYK!2&v>j6LtZIvmyoc=eySezJb+emnc5407R=m=)@h%@P#D$BO z6=d8muw>!{FNJGAx`5EOd_i0A&0XP&B09q4Jz`-(24+`+2AYBFftLM@rxpo#vnE2W z)X6$q$0J&&Bs9K9nkiW!xaGodXR*@{@uSeA;fMauzwpZ5k5a2@gdO|!-uPilc_DwA zlUm77bLZ_ARR}%7 zI-}h15>*kR!heDOz3p6`*5V0y0R z>77#|R06wPBX6Ry-bC4+&i18%xVM_N5&*!_=WI0!nU}OW%2TyYBBETK3{r;Gshl9sm{1RIX(2!+wOXE+k`>yeBh7% z!zW8tbE~y3{o63TGs7AKoH-}IRZ0H+NWII>$Lv~;R>I6PlrkRWK^qx{tuR5K9`H%! zo-BH6KwbF5tBI=EZxFa;lt^W(IwcS1;H^D_%YM8f|BTL2NQjvO#v?8>Y5{>H9@Dm# zq^f6we6F^VkY4X^-DMc4OKyqpg{$x0-JBvP+T;aK$MoZcPOrkUkkC{%&Kp(0%E#h& zQf-fEWxjeP`U3I$$2cn9189UuC=$m*CZ1ytDX%=fPn-G<6p4X0{77Rd*y?u@M#lKQ zkFUpI^{|rz(FFe#Ii#;affz=9Y|+r^@3*arxFwYjDy|zx)0{PAW4ZTB?nYrtL8G8+ zR4VK@SuV|CW|H9oj(slCaK;hE^AW0>!xX}+%(~D(*V5l&+uh8gQieOG`gN#Vi8%98 zpNa;P?bv%pX1{a3N1uJEm5}>cQoJD(lvRZcWlg4`X;qr%;qT)`X?zi+GACDPF`crJ zch;Z*PO|Q)g!azCHZBf$xEn(jaCT3w{pM$1oeYkpp@nSY_;}g|Q}GmQFz|)(k~krR8zWT$M&#?VT1Olvw6YWwo{9B5sOmuQM-IjRF!x<- zdEUX|keeC1lo%;rCC-GVPSheGNLV@1v7sTYO*7oM@WaR02U6xIF2(Tu7ya2S42=Xh z^ns42mi{?&{R$7Dt2S6LFB5h{Ha`I#p-Uj1jUqohL ziUo^QovGVA>>Pgi?j>0(6ZYzG{*PCWLKz?iO!oE8|X)-a7MTc;3k0Zg_4$l zY3m|q$}Nc_pP1{D2K#J4+O;MOV^`6NA&&4H*#WFUWa?9c5sf1t)41ic@ZFHwTH!xgGY-3nkx zl`|>LsjJi!xe!bUb(X)5TNFWggNpgq^C@Q%@g$?3xU%zM7+@C~n;$Hj{tU~GEv)5Lp*)iizHVCSsi zgM&^s)#EWVitegt#+*jnQJr8{2`r{}4E7K#kjjuT)q#{&ZSFC&D-s&)6@78ndMG7Q znGq2Y*O3gB6|9@=s`qDl5D)m4S#V)pGUA5U-RAY;ct8!P3a>@h4|yUMs-c$zTdM{6HxtXT$M^$4RAGrr~O3H%C};P=-759u+ z@h%C|a`(Qma$u|vP78y=Qj5iKLj=0GCmn5*zTx%h8KKtqCer4Q%2JPG(qE(@xbXA8 z+=VP0Ii!p>S}o%bO(H>MR?M_+d?eI~KWFE7$)+f2ck%pXaseJ<(?(G+3AJMi?$Wcw$cnf}xAV0{9lPS}~B>!qCp^caxo5i^FFo!mZ_5lOsOJ z1zMVdjm#&sgDjUc8v;X}%@T$R_Q*B9C2Lp~yp%PV_GF;81_^^iVr6*pMZ?y4C1JM2ii>L6v5O(zbHyb6Bh2bH z!%ztxyP@-%DpEg?n|t9`(kmRX=D7^IcnPqnjaCG+NU(c=%1<2&fZ$`;w-U2P+&akp zD}uv5Nny&rwv>b79{mFb{O?P3>)GMsU-!kg$p=VHf3j`TkU7?z)vSgKh%r!k3lBw` zR^fyxj2$;U9eN8}yjom(2L63Gr|xXToi+|QJHZzOAtAkd=EBQ27*?jzGhRX|9>VSR zUpZrdtRP}Uq{tgCG`d42JzH6YAN+i4-mFjhS1lqkY>fR^F-zGU$vi{BM+1Y4mBFyo;rb;2G74< zM``noNc*qmw^0o_Iv+>~ICLhc$%ZseW{X}FjjTJ`e|TIy1`*2YTx$5+6zBc8wq89# z@ieT5tsTfxJ{N%%NDO75UlJx-CZE0EU-OfU#3^}1M(_Ib*oyGQ7h6MpGK4$qwb&NL zibVf$jn;21Nx&>vnTj#&m~%9&!KZ|Q;nNhpGJ4NGdVkT$N+GxR&w=(m!S9PMKYJnb z4q*fXw>oa*CIk3BtcQQD=cslGIOqjp>-+5FVW}P=8{E0iKl?p^0}2%E$eQg3o(1l z-Efm!hrJ0|ORNb(PV=PH>Z!mPmfX6oLzJU+4D{);h^+eK*LqFiBxEU1U7z5@#?^?7A=5n1!t!8ujV1cKF5NE51UgADHS2Y z#hxp`j|L)#g@BM{SwoB2rZ#^CkraGPmK$woxnxv3ch-E^$8?onDFtix;MtFC#bpqN zEw7Nhv5}#?Ts9Xj24tFmgV0=g6Vlc0ceBb?kDlN8_9T)w;u-2T{V*NrWb?s+Cv&Mm ze4!((xz+U48rUI>zJ<1lN?b*unPr0kUPjB=(nzpJhT4*0)aG?Jdc8NgnI9!{&%M$xv% zf&us(=%{7h5(ZNcws}dOi&&V$Vm^qlg)g;6nl129(2_s>=4v(4@h!CoW+@cc6oEH6 z3Pk(_=Ls^0UH^K6ufIh(vaZd*YEdmnt?q=GS>D=FGyxM>#7jng4R#n-^~2>dTO(UW zuxcr&?cKEG=O>$G5w6_LL>Jy{!XJ^ltc`=VPJYLk%U^OmSd`I=m+*t!T|U51^KpE( zyc1Hln*-Eil#e3^e^ETz03xFm#W|o&v&Ec6#uW7H^IFn7?JRL`;mT|!Qb(YR z@@~Re7f?J3se@PeX`IvZ`V^@d-zdNq86By5Ss7FgF>sId{Y_gPFcxX~cr`Q%3)`K;9eZyA6>rTka zhF?UVzGV5KSj$KcO62D{W_{T8qsSDS+2X;?WAdxZl-!bzz#A>q0_oq}UNMQP zcBRrWN0>$c{)2)@U#}YsmCG6nH}~r44*PP+_~AalmN<6H3GG775mv2{57MDuyb}io zToos!wZtM7-DA=01Qib?kcRd|j6mgp)lN`Cf(l~>vzR=Op`hBjyudajthdc|9I&uu zg#*G%t`(P60F_^`I{Vv`XDbbwC2E5x=>5|(9FyHBA8{&eO!~mdE0B7LTzR^Tirsz) z8Vr~9PM2qC>R`@Ch7`+6!J@;}-Q}R^rM^$rCo?IJHBeX$^Pd8IKu;uZ@izz+X%!ySLX!2(CkD;1W}Px?tI%4wgPFo-}9h z;9ynz&H5LdhZ#01TM5#{BV*`Q#$}_A7Gmfz1zMtGACgvx4Gfb+fICqJ7%@P2Ex2|^ z*4^L#*JG1WZ?a|jJ(UH$35D_j#%Y!XoX(|^BZHFpEqX|R&zUvnfhT;>E)dPARl=97 z#n5whsp4yx8lPbVszkXhOZLs36!8+Ju4Ip3OzoOR!sgtzzR|$hV^6_~r=7h{5lkkm zZ=PCadi9F$Z2<}b{1b1VMizDTL#Qe!)48-n2&hj3S5P8&tbq%;5~UM))NM@fPF#a5 zv4JUQ{m_wJhXt(bif|NHk27k(FAUSrcT{!-@tNj)uH z2mB+j2#Cqqf|ajr94__IPM(~xIy?*$PP7u1vZXmX4V`g3@n19YQQ0g~!d1z%W*R6eMX}dnG)~Qi$T~qShX%AH9^q8BZGrpHkWB>ByQgcHy zA2ytIe#mQqg+YCF)_(%6lTVlZdGjRflBwSGe9<)onO1UG4~;cUE$%h7X#Y9vkfp%W zeKJ{G1to1C)1E=b@R(0nXty}&pZKD)sb8}8griO1<0{lhJjHB7G`BE0j)W{GW3`S} z7BRt21Wkb0w$1DA>+ur>V)nzldthuWghOfg<7zY*;HDYRuIt8Y| zWOtG2iAYhF!lC|qcNXc_c~71t&VrfDlJJlOMmkaBlCg|-KGKi^=+FEDV{I7d)0>5q zlHbPSR)W^29OQ&3d$(JBRS@q%evaX0^z7@94KYFFaCs^)wdjjC>#qyk<;{hm=^^!O zE3}s?6t^#0N`Y#UaS<0hoy@LDi{hjA{2_<)F;{mBlFS3-%>dV6^YH_xQivHsx9Oo9 zZ`o*XzsQ^xdZ%l8*(a7*G_D7Q?NVCjyUYxYASEJbNAjt z?;WzsJZBZZZ#CEWun|JfU@~YZMsnN56Z~PS7kp)N3!lB+7wmtn*7^&uBE8T60Q=+s z03`ozXAwJRWm6|NQ>T9=nVy-BfsTRxKX3g98$!#|{*Vprw@;uCI1pyf1d&^giL-2t z?qVY|vmo*xbWzs;JUAnbA{$pzMRIZs?fd2v4?glC(W3|W$}E7aXnf55XQ%MzY3y|u z@r{$9kEybKTtZDoTm~r-fp_QX{Wriw^ikCe-MJ+*CvGn5Zk$Dzr>~pqdbgjuCu$#W zxjGFOwA~eo7m=D~EB$sg*ZWR^bf*y)=*tsR0kAdaOd1H>v<8|z;kn!MdCIjAlfD#R zo<$MMUmGYZ0!V}%fxq@J7`156A&DEfBuJTQJ}MT3s?jcsDH*v@5@i`VjqRun3&vDQ zJgXLL#K^>wiK1^Z$|Y&ijKIVrCM^SE`{zk*lW^ATiyUA!bJ%|J)Ur zzO7aADo72PJ9{8R=8Wt=d=vRxRNq+=n7=G!wMrL5LZf@#XHQTu=?g*uKn zI3g@$-k;u6OP&Q@ZY^Mk#z(*;Ly4dQPFt!;y=#6ux zGA6UWbK;r{S>pXA*=c_je4q?jzxazGitnk`mj~RXe-{jh7N8 z30^5cy*iEDQZS7UQa1IDL7Ku7p|)K24C zqFU~yu*h^#7Bcy7kGx9_#LQ#LrWJ9Gx`1;67$iiN_BKc8u#PB@O@|0@1kH#DW0~b7 ziMdrMsPOKuMt~s{^CW<>C;PNftg$jsyFOl?-@cb=sZ+L84BY#Z$LTl8G2&FfeJYk= zXft=$W%5y2^Qg$B&bNaT6PRSQA~n)dvW944J*pfKL6n?WB}T5yK)l?IT^IZJzzo>m z6_3FllUcE-%K*j-3_s&UJ?3o9?daz8w*t)ly`Mc{&J}jd(FbU#&d{E5;eJ66Tj}w8 z$o}b!O5}#w$6So)(?>UM`{MxMOB)_7`73DHb8BVUGk+`W{fA)ShxO$#eTn3pKXY=~ z*U=~Iq&p4{0WRfxF^qg{6GbA%CF>;o{5vjw9oPN@+wuRzKiT;6rBeq`!uUiHn6V`+ zO$*;ThOdu~cOd7t?--Rv@2a%!jbXlI;rSg(2xZ{r=H>cuzsS+K8NnAIaCo?Xx)ENU zzYnk@9Q!I7-FxW0SL1sAy4(Rp@9lCXV;Ka(Oo^0+iG}(BQt;eUB8TD?k*uKSaEvyg zK9=9kz8K@dVVxvCkqdy~R@E=6OdK><)-y#cjoYXdQq|ritGWR>BAUsg%@ER@sbUBcQ!QfZ4VHS+jk5+^QjReX`RV#tYQzKOcyc^5hY^EwxK&Qf0uGD@JEVlHMfR(LGx1h>>k>_enSpTB}mx8*V zco=}u{?tX?G=`v6vZ1C=6nm(v9`Bf8d6YZUFSTy&qQ}z&evkL zzL7yir=}Ybb`4MC-Cb=uoo(W#fFX5{1+1#_@i5V%vyRj3g(`NAR?qvh`FRfq{>xoY z)3G(cTH8->TJ={N(%o?YPI8T>q>fw#nF@0vgsf`3F}NiYyqv%1r~kqD9hMwA@jPuJ z$LJ;hy$bp4pFsr<^#y0H3#+@FfoMp>ArEf*#-)VCh42`A>I~Yfca8b7e?a%H&BjI_ z*ifdo7vcx=AGJFA)lXpfNhBZwKZB14D~pt7QCZN~nuc~*{R}NE|JIWv6e-efJ6*VR z#Wqa>3RfJ_65w7fUEZF#)Do?cUQXD8u^#6w*&2v3c4e%(;3#QNc)s3J!CGt-Xq%}K z^3SpLA32;)DO!~b)Zy-$j=-KaOf~HcnmohGW#fV-2z?~eRL!A`sc#qvaA{yR_V8UZ zxsu(6#B5$_1`Z7(z0&F})@eT!OPqpr*+To#Nf!%SdQ1&eb0Z5XA8`i(W6~i+TRZI? zlw$NEEupq6Gsk^DWZ?$rk6uU?Z?c`n4i;`2#x1nl@uS=bi^<;+qpPS~IrBW@@nnba z;wbkrw>DgljTMdcef0?@7gW^dDpT%X2tDEKn3*n8u-J@s({hV7LE}ewf38Zsc1Q!@ zzpSW>=XFSZqISp;b+G0W>a8R;1F2+YHwnO2W*d1{EIA?Bvzg}ds1<@ohk7OHk2#ray+A!}-lH%$F1~|YDyne%169Cg32^lk z8C0^V`ZgP$alm$6FA9T%IQKIV`Qx_2h%B|adC5Nj!pLsbsm*Q=Uu?1v)UF6BvZKTP-xV!ZuzJ!qw*S(Lsg6lXsA)Oq^dKs9tVGamONI%Z287IWr&`8qnS+Zp;X zWx*`1Y5F&^8HRQtkH&cK^vbFW&~+&tR()K$zWXek15FG*K(&CQ_@7=Y&osb~24qWw zkuWmGS*i_4k109`_ENZOSmYJb$c=p?KrwQGR;i=h-o zB0P^r_P`@bRR7Ik8i+l{aZ+tB+@Fq6Vm3(DE|TVH&4iUI5j)5z*A;)7U2u9aV}g_EVY4jNp;Wtg%7}%sjbz7iHh|y= zT`PtDhKDkUn6n_t}drU_|(qaX<{KU$-w0R9xZAY=55M*Cl@Vc=awG4T%b)mgjeZsYy zVx>Xbu{c;h=oRF|9bOt=*QYhJzRC??%W6f>{PH~VqIFP-#Y{8NFop_bQ9gf=2nacH zcUe|7HzPCau1L|Ei+SU=j~hTg)h`Zcv`me@-opXt=>YE5U6Nd8WcRo?|MaD3iZ0+w zNTAf2dudVMsl5b^UWwH9msdS5iA#B3aPb>~0OVT&zuYndI!t&ANL z#aLt=`7a*dx`!e1dOdXIWFQqc#NPT8aB;qOb#O3VWoS^16I=-vP>D~)N(21%NX|*X zo&l8fXYR{Qxt;LM3jgW@S#rbw_rLkhSt*?jzPSMa3=#nUAK(A~!7IUu8}_dM@zEmNM(n19{BO&ALN$}P1( zdU~oU@D|{4cW8gh&8O@84kDgCvJ2dCN4HAjQsq`mrJ48HyZn;eyIGQTPQIwee#?b^MG;6?d|%0 z|IOF;N9}h`YRn-8{WX3K^8Y!DI|?-a9{{gFP`?kj7l(Py@^81cw)>I_KZm&<`+u$R zA^L;=I(~IBI2`alY1Ckdy@Trr=s#h_RXWOp;wmhH5a!N)pM`NSPO~74W8SiN0gy*Q zCdSG8NM8cJe=yiPJv=!(e06*)@Q+`e9T=FOT}8P7o?oT2coZbSO~W)P!YB#CWFG7f z_JV1aPFYq&1ZeGlBQV~_B$Qf^wcsDoXv7lPZBDpdrST|AE(5_mVS#kdiwwTYdA}>( z>-As`n`Qzm8^>&j&GP;~!u+ZTFJks4Sa;d)r$0Z+*{ubF@o)wJdp0c6jQ?a}+TGya z{i*4&UH~EbjhubThO;b>-owrzexdEtrOv^>sJZ^S#~U*-m_qWkiOL)7REf_naAZb5 z>tBA$qJs5)W!XiV!yrd2&%;ZJggt{kz}}l>8SIEb5f;#TECBB(`G95bS+*&@fR<`*qw71BT1r zdv)u-rhquuOsHUZM+ecp{PI{Q87{0D>CeB5xG;W(pT!+6H}^e;7D z2QFncavx3VuV1p_B+LL3OeVM49iKIzQxULmcx5inJSfs2D)Qhx4b)X%tA!6>g|2|0 zF^Gu^7N^%6RqMGLk>3Wr1Xfv%+i~XVf`5@_2QV2m0H6W#EBC^-Nb`FA?HkE^{q?ss zB;_On4L5~_<;yl=QHd6xL4dd7b%gXc}OLVKS^qc^yzZcUK^?0uF;85^yn$o5c+AxUxLq3OhJDHN8M zC`A+C-604>O%82kpX>I^<)NJqOlFG3Jl7?8eTE^ z&kGTMOFH!@$dKr`6x49zAX5>)^rn*f|SF+TK4VO|-97DPYEs%_#8uiv~03{J&v zrg1Ygy=z1Df}H*r^h;pq;w*qb>|6dCCD5=mDbtn54n*3jF~zpoYSvf~Cl-1Ou4t=48o^*l2G^ z0Hd7(g335}UgFl9^WkB)zyge;%UOn$U(}zs5f`$?LcXUYFm*HOg05@}6T~7VUv!+d z-LlI0SQlKqpAVI9C^_&aXEfn_&?IyE=DE%Kc5@*L?B=7Ae2|aU=<*wwRjsfakX#FHQYyERsucCC zbWa)u^15Dkk4$#NsS__V`Ys@NoZTrS3v)8^-}VnaOrg7A`3ja&-gLF1Tw6+=NrH1P zT$`2nn=udmgG&7H|B}43f^!C?3^P>|ty|_E6X{`?*hr%6lWB+`2Qo$DXc&Y9l{0+8 z*r>!k=48r)|5=N}1jN3B#KjzVTcY6|N_aF)$%knT=M`63dhK;vIPfDv56!U2G-jwn zq;GaJ6FG{8S(>NgqJI=7U@ohG{lx&rGxi2W?87w0#Rb|iFv@}SSq>{bV1Fkz5cU>eGhlJ@L(7GRV!A=a6sk7mMdKOLCS^6@1UkO*Y z&}kt2esKD$K(`-oD^d#Qh!RH8h`J7@p-gHcB_}|+Zq#S}onSwlgD{18=Q~GHg5Jo^ z0N^Ds{i7(3a{d`N+|#Z8lczi1{|Nu@|M=sN8$R;L5(qg7aBR>kBUEXZb6gE8O)L=( zz!{{VwD%xq6!oajJFne3F8?c;W=e%J@-txW0;F44j$$Fe@O5&OHRvEiVNpTs;5! z+(M&Y&J4O(nyt$y+I~#g(keSUIu$!qWht14by2OJ6)*nKd@{mul;+3Y&Wubhet{%? z9(=QIjK9$rtOm++wEc}6DJinK{e`!1V=~=exb%!_6}ZDwMzVL1Wofocn<^L->D0vw zpS56jie&;pn#5RX!QMydEQgP?L^w7;pm&%W6Ny`EM~`Szx-j($Vf6;($ob@WY^>bD zLl1l~!qh_z?X$r5xGSFnNE*jYgv+M_Ha;G(uMrf_a&eUT7k(HY%U?TRIe!krVtCca z3KUp-+usAJa+zjxaCTDlNB=D4nxwnILwbA*gXi%goh2hTL{u>XK0M0)TbNNag#7&> zo8qeWMZ~>vcKFzleEC$2Dg3FojgYGXd>rY0b}_s3<^!w<^S=*X9hV(@Pca?VDsW3l zX*V!`vWVCILgc1Z|O73)bJ{beWiy<;p(6GMAXnyvR9RS1U(VP%7YHtAk@u@ za;Q?>dX)9pRf1pSm2SuP}&$nN}-dW*Q1scH(pKWcPH)n|EF~<>s3!A5Cs;S9p69 z>%tUCf|O5BSR()@!#@iwP87B~exJ`SxLKrKZ))R_BDf8(q({}?kuywrkw7a7p(FU{ zo597bpiaVYg$}Zm*#uq6#@|By7Ctvn!-bDGYtdX`MMKmVR5g*IuN;65r=tQm7OK(}kPbk_S@aRs;nL})^F^6kH_3ux@?3i7b_B&Z&GOfwY9Ssz7mvyO$b@l=LF<6Mx#l<-_6q}8P6>fG-6|A8KK*2kMw~!z= zk#twUR!zRkXKlf>dl|xt$#MBOO12@dET1~lzg3=DK7K>rPp=hostcu2Jxi~9_^Onu z6RSNtA8zww&(40^{M9qIa(S_Xo|&fh5zW~-H4|9WxoM^4cp3|~>VdUoeVF3ILGVtF z9C0@N=Av_{_Z`cQmS^sZn9{o=jL?B%6#}x21uY*?B-Fd4;^f02L8G#)HJjOfp8SYY z^~+&l_S~8nUVv{-g`RI_8zDuJToRvZx;a|wUqS-+lxnvL8vJD26ulQHIGTv84W5?u zq^)W=Z$yW!th-iH;N}dP`g>sD^QbfV^Qbdd(3#~@u%Ege&W|0hKwhB6SUwdi-KOSP zK6k9KWPa?>vreGBB!M;^W|!Z;*|e8P|KKHQTS8RDDp%29el!;qMV~osSFUsS(SZwB zU+K3%LVmodD2oc<*NmzEXjz@U#*z__*t!ASBYDt1l@(Y@hpz>{PAA5x$1KV*=|1yRgDxOlRf0!UR2?B?VSR*x~11Aj?o&HI`Bg8d9Re3yGJy zbdAZ+JGmS8mN>R->`1e&ZC8t??imfUNYi1E#WzUF`)sZ_ZnhU%F{p0>4g2fw(R(03 znJs1FV5kxqk(i)jPNTpO7bTqHEV2ljk5o2VQrO8qEfhs=HFt8K{ov|JU(_O6Z$#2O&#Aq(!9XYcH=0_Jwt}@zhRi9NdyeY2QR`5 zk9c$K%W1)f?TeD@887DxgYgWj?XmEdC+bF=5(K6D;{Wa+Z+KATm2|I-Ekl)QPH7!q zo*g>@zGO*VWjS4APltLEgoR{P0$LtBam58~_>I2NNe52qGDTH@20lP7BQOm(n!Ob4 zTQ#;8aV})mUZO4=qhmpA+mUB9WwOisoAN#K3l#^m{EGX?tl@KdN@htQz>3M(ZPc*5 z4TonBTj4jZnsakVSTUZicfi84wsA(Qwk(Q)qvAQ1WJL*>OZ6E&X9{mcqM10w+Q#JX zVxb+)1Aj{7PaFMjDyAbnBtEN(9pTD_2E$%U@u8OMy(Y0<K+~+{!xNt0Z!gH`GTnSKG1CVeWQxKc!o|pezIy(P>nCbgN1Y=Fw6d*E0Gi;$JSd z*B01nH9PHIxqS`LobpJTlNO}F*@RzxBm!};a}7_|pjx8xx6cTSd>rEC;JkZ5svxwZJ-k^qbXKOCUnmNdFjO(<@QlY4>ej58wN2)^-mi4<_7^!^> z>B|ftp-rTp1p-J_`xzg5=lIw6GmYq=G+a@zKgM&aS$_e}ZyV2fjITV#SH76|3jeSc zoQ3Z&-H-Q{qHYFX6diDRdyhE!J05Lq?d)uC&=N6v1qoi!pUw(?rk7E<0J^~Z(74%c zYpda(?G0OKIbI_l4v`WnemyrUwJg76FpVRAhF#zWOVBp^A?Rt$`$PQJ#^E1nJQCsyX@+qH(b|?z1BqD6={r*eX$3nW zm_#|%1eV9pGD`eLqDi)^mP4rgo#o%zIn0lNw_arjlW8$m5L>*(0*hR_>k-Ux>)!(S zZ!cyZy5diN{p&`#dyUAD^y6j*^0Dt4jgR(MAKR6;m*A@zw-YC8!AUrxorz~06bn-M z8+i3}2I~(7O37e}DRHIZisv?yl+KZqeI*$3B^wvr?>2*uMGFH<>A}0B_5LRX?!X;Y zmQ7ihWhyr!budHn%G%~&S8QU4=b+I?46?neT?SdOJ&2T z*}Bf~hbQ6>>0~J>_|JaFcZtpg?EZHpZmmJ~*JsV>@++7qpvyjJ>i{p)O9DmI#imJC zVOhV_&weB5Wo#OULxxNX4Bt`oSb!SF$7&Yp3(j-}@R`B;A`Gpz0BC=#{Oj~Ppl*t5 z#$@@mq?%_(x|}PvB&=@#EQ=;x{8ZYUTHzTHes#BI^PaOpe@kvTL4=n?1JM#qfA9%N zV}A3^eeEviCMxNr^ufeTuUXdJ=pQ7b{5O!wK;0P=zkyRmN4XIoM4w zrGg{tle!X*W_5*6BYmC8o$`I*&ItEN>y5FZm{^SN(`UCq^Jn)&b2*!Z=xux~Z!D=2 z)vz9I>F!ZeQ0-l@;XBmU6ZA6pl|JI#2|+Yf>O7=_6W|l#EBNsKMe_QhoRVuA9>s=S z%y6+McuN|^WNV4HalZad^#-pl+5asAq|}<$YX>*tQ$b*GRiHV)Sdvn*C^PxBlZIh~ zzL+?8gC`#@XK|RJZI1&+^4?8+)~7{gOH>{vbx0-k);Is`uPc#z#y%9lMFjjn!Orn3 z_5qBPgM1iHSrciIwwsQ;l~K|Xa=gjMwn=`Kw14un>SeW0b?e=Q6a2gWZ2ImkI=)6<%=1fbA+JY&!< zGdUc?zYLuHsxce(cRQIu4giKep`9pa`b`&C7v+0s(6nPBJGn| z{)8aMzJlY;J^x_Ryu0;h2kJS~j|v3i~mI{l%oPYoZ6`ctG{>0JCiv zhKq*}pi_m@4$m$4?Ja@`ca740g%X}Mh7z9LWGDg2`T(K{de#zviQ!{Fp`D_-+kgTr z%&NBAeONR2lwu0-Jcbn(DJLfs+(3ie#de^fB+*t1G>|xWII#vo=MKURinPz`2#e2S zxWRaCNq&&cA)of)hNO07>zDRkh0SLaZa_)DqSkthINbIgyH{p^j5s_-93CSM6;Xs% zK?l0SfN#}>V-H5(Rqs1QMxqaNczr?tzd0oFP%yP$uIxy*s&IuKZRyy7IsYB!>m_3d z#sp+{&uEX~fOcA>RXCuGkhp(MQ_T;f+DEgN>cO~b7FM-3OoI`ln6%W^*?ag{en5?j zx6ln`_=Z@UEQijlFrPwf-+D^k*%sfTIr!EB~VpeocDxpRLsBVtTV# z!`~@7T8$q-kC^w?AV-ESDGe$kRi36EZenABJSN zX8qu>FfK>VXBXl=WL3Z`UItE|qatVVxF4LQVvciu7)$obH}Rwr$LTMf0LI9|Az~@c zP5z~ix8uY1g8xo@_biu)a0J*M2xK)C%xjQDwgp;@Vk8TvfP9C!ejzLWp5xia5NCpS zx{zCk4avjUY2B4RoYJ_si%9t17$jw$u6c*7E}HTWicOf(p`t&c$`+vt_^4Cw^xbMcrhiGWRp!Z3&c#)Jd zaHsEtm+ZKX{3xwqqqD<_x9Z$25;m{P^&Wj#HD-PvQDl7FOz+WuRyi(r9cI4g1nznv zkD`z49aS%E@!^#6b*IhLZ?l^!MhAnoa$8Zqx5_6LNoFq^Vd=H%R;t>x2<*$x%wMW6 zK{H=4g%4QLV4xLjcttNJiRZyI&GQJnzD>NhAdg1+-95^g027T~hdD|48Nwt$Lt8L~ zdbbZ*aQq!7o597*iFkt_NG50@tu`F-X-3=?+~Cc`n}t zg^yhYpf#pu_4tu3CGt^H0EKGK+_KXmlS*d!;) zy|H^*fv4r;PK$({?lbCiUy2JHJN;nWb|nV2f_q^eQ4X#ipzOHbs}}uyDigpmS<%LN ztV_7j_*I)}PmhQgz5wS5}{)i!V{bmP*B+OKNyTc4T8rZd< zx52V~;5ieGdKD>Xz9Ml#bs#b=a)$1key2n2+cG!l%@B54WXT#5;F+7r5|~`DOn;Mf zvcE?1ORG4!nee#&9bc=C!GcTnA)rum#B)?5WEQ${E#f&nb6bMacpu@FpSTT;%_h=+ z%Dn5cWJH=+g{X}fgD*61+~2)oWL}SRcd>bm{bOjJKVNic{y1ONZM+Xh3LiH#e>`{$ z&GX^E;LyBbeU;uyB6#(OU?N z%2?<2v!~60(Lwfp;m9cT@y8+ur@!7pFtRx|ddCRqklk@J4^pECBVrchbSAY3G;y zlg>t)A=0d{i3}hR0ssi;RkdkiM00a7ew4#JXCMrkM>wNu8)FJq1eO0v=XHpB^nTw! z9M^A0qx#BkRhhxVFCyAyE>1;Vc4?&FSaf++IgxAnbpiP8BD%=wHxtseS+@ZK$jb{*OuVdMNcQ1>wtn$N zWdz!BU!0fZnyW1>X1P3Wc)B$%>!AZSbU>D|{O0Yt(`}h(EM=<+5eiF5>6a1X-QYC40)U%nk_8Ro%cw$HPsdZMZ@F3sY9HuN!~epaNEE03Fsl9C{MFkw={W`&S}Db`g}zln^G z6!{ip`K7A`R3}_K`8+pP)NUs1NZG9Gsle4M%->oCj#alD!f#W_>sp-naP_Vb@bq)- zM|{4t>fhz`PNOtmfM*wx(2FPuG}O(u=rJ_@35CYp@o%u2Sty0)HxLcSr^D66s(1+v zbYoaOCK7HTk)Uz|+duwTmr3B*@4-f93*-`vUjE?ykbV-EiR3&+uS8Jbp3);>ymTJn z&XF-Htjmf6ky3BQl`-Uo^u#8{%CX}4yhGLr_V1iqqL#o6XIX|vT9b6deCQlrCLokg z&}9R;YjCOxZ(m=r0eBfWE!*@Wz69&XJC7%W#22=hcT2Nx{ zAj2*r6r{K(abVi2-Ltco8zPWT*R$ZLk$IYS7$#VBna?JyAMn+UIRconfM3SZC1|Y? zDL^?chuFurn1kvJCsRCV9E~+pBBKRN)N~107n6gpYdyHuEKaM=RcZd{FR*IZ1<{^REXn9aUr$9|LWLo}I9f*jgxqPBb&#p%VoVELv5 zJz*2nu6)wYt09bvS)h%aHO-l2j33Jm;%E{T71$lKOFD^gR>VFOuhQ#)?*9R<;_F1j zx)m=M1qX-uu52bUZ-7#WUnt3^;MOq)yi1NMj07=K7QeWl`F0?Y36Q@Yjom~_e(~=w?y5nn}&iG=Xv{#0*6vnA%T6|%q zlI|MbRILDVz$nUbeSlQE=K6|R-~`aY3%a`-raOaV;ZxyUA#2Fhq3 z%IaubxP9Q9?6#>bnW(8G&I3;{b2%`-91}nC}9k zpyC{o&O8;HyH5I8?>{2N0W5`}>;rU$px|8Lh@YT)`eLv5QnD6Yie5`nT5_=^r385W^Rx|^K*h6mI9bpdO^ z&&CkcA{g?~)nz<5@}&@}(zBwt4)-XGXqZ4{;UF3gyvHF^;Hz63Pqm_{)s+WU8kcYJ zpGy4{A!-XGs#k<1APVhXdE;j(w8C(rcpvmnBWhI~~ z2|{$lLymk+1?uu*B`a>e(z29pyc(Ox&x20o=IjL5z-UvRz@r)X5Z|=H<36+pAd^HM zy%smvsDQy_6a$A3N-QHxCMWzQntM2`JR&Su&D1b|t2t(~januG5tZ?-3uB}MEy zHkeM(qtLN;jG!mo?2dAnx1q<8@Te_6x?*K3X0qZ8yqH&DywwV0@t>xEbScEV{r$7% zkn}$Mmjbp6hox0de>51)aja|tn|mL`?2s}(GB~V3dZWZGg2T;`>ifm-!3M9@WKTla z;wbvS>P!!kILeDdJXsHpuOa=c;A13y-^6exQkI8LEZ>X5pxm}Wkm3>&W7j33y|_$a zD$yX-OhF`c-U|H#MwS5#4^EU9jKWSqkDkJr-1bqi7o1H- zIvl-Rkg4d`YmnPNYz3omo^SH3We!|Is+Qnk%mWu9Oy)8U?jJZe%T#d05gUiIxX@_e z;4n@<_%CQq#)Tbz*b2ITuq@r+rt&xrjljJbpm0FW3u}?)f9`6_}akJ9JX~d zlmQu}RE66P(s1$e3o zy;nD>WN?DzqJt2GwG;2ywpkye>QtQ~A_W056~%b*#T>@c6+DNB`MH88DMWGzW!VKA z6S-s~;67}G8#c<{sc5eTcOA}otWzvL$`ygIME3VtG<+BH(hf|FfOIQD2~zG?gHgj_ zhO-c9ITaj~QBOIN;8PN=JS#~gXyl(;KA}x{on(O!q_Y=Ve78B|W{vV~Q50A=?0P5#0dWvnZ21H_QvYu0%V9 z0X8&PIu9;Ucky*?K#9=F9cu-JjLk7Vc_z5g%P2P1CHj>TZ=8G8YFG?RZ4>sP5F>cg zuH13>IUK&jYm$=D%QPIFU7;D|tv*1I6X9$mv&jXctJW@5cW6L;eG*;6n~7{%41@7x z0PW>*mQFnTEW%x@REkz*F8{aCX;BH89Sg-y=`xj1e(jP+}v@L+=4chXJIgo z0E|^<6V+NgloHCzZirheGvEZygYND=crzP>A&)_kP;vqE&``h3C?|$1mlG8=JZp`Z zZ)KjUJTiX&bo1Gk`odfs4^1%AQm|7tjfHaBXK^_9k;Y_G?O9m1qsQX74#6_i;4WBk z%|xuuG9Q%DDf5~rj4op^_<8LYiYrb+5OM~sF}05~DCv<+Ng-<(b5t??gCQhP+{_IDgh?b5Ydy^;*A^cY=uhVN*(jA|u{;K>dMi{1WFKcGMbUsZ%X zM`SCsBMUQ(B$zKXD%-py%V-W5-4Gj_zc&J4x=dg|O7b(!MqmeK5iA}HL@5oX^SQ!6 z&>mx3Lpn&1AK8eC?7GrneA4Itd)j~U6!{oDN|@k@Rd}Zj7n3VOECyijqjZ*g=DR;A zZ6YZgeQqDvEMPu!MKfY(@{9XkfwG)n70R0eSM8GBI;wV;32%SjR*|eauuZvdPt;=t zaP?-~!qYDqA1k0%rL-4D$|Lk8j1mVuCa~`=fvvagV-oxRlGuaBC2?2e^Uo*#)YYHy z>9i5+9VcDiDajopg|-p=3xk6P;qXeGr9a_ul~OXA6!uxVmnN`6g*r*L{?<({uLZ9# z_{6XSiUOCeWR--4E{TN}h9f7>ztmYg>g zV9+oXq$@U;@4qG#tI;}TLpJ5rD>azea}S5uCs*~&L?3Z+ItDC>D58G2tzAz%d+#Q_ z%^!8$n~Ey!MPD6~u}%`0NxDZ{_U>$1V%0}8_JNqO?rOM;@daA2rWAX$L+{oO)i&ji zPns=Ikm|Dx&9Q~eP}S3K=w<3>SyJX0a~f=GtFGDbygQ@csTfi=jcTF^tmPK)SL~=S7zbJWJGH5kS}P{^U7M|b6KRVR_Lu7gJg%{ z0$@VAPcJVjta;oBa6{|)4ySzr4h1KJ?&r6i1w+c?cxoT`AnvN8Z4G`3r8R2umeyXN ztR-?qR8V4F1J#>Sm}Y9-WV(xj_9`u@ftF9oYN(P2c!}dUINv@O=;1Ku+uzGSfw>0E z$UgCUBGG-64rgfZg|>qN@Lu~j#+&X{QB3olZ@-1Ed4Hm8M}YnBM3cCuCltOIhOLb(d> z@s@z}-E3;8N|(qB(e}*DwYfwVDjMKjvIH|}fsvUMW(^v4>cEN4(rKWxWP~nZFlN`m zFv?)TxFJrgCIlNGgU342G9*B+VQNXB?B$*C;*%p64*RNZus8Y3{%zQ*xEUh|514;#}=MY=rVV#!M|(LwI0Y76{>( z=>?%VQiIUuHP*Q07I+Yxzg+mlBaQSDJlK z`3<+Aq~JDfVajbT^&3_>2y@W}DTmBZAc?A0WuM?G7CG%VMrnCUNn0iAIL(U62C4lG ztYOx_Mac-K&8ZPQ+1h@F4D+30bnGTE&>%hYeQI^_%>IW4m;w?ND#HH31BSFFytot> z#jM=d3lxb96r_$X89ce;!HLQy9-_JC8bMsK2F%BNK7YG-pJt}J4EnW;wJiq2No9NN zw-ul{X2uGTO4yXe%wr7k&SHp~{T~B~4!YU8#JK zqH1D208IlwTpqHy1V*a|Doe7`iNkd)@#p@yT7*+7RURa~ivXuRBHnIa`VP1sn7_N- z?{9x^o>|Ao69Qdlcz?gV%2>|9zWG=xibH-uD|wUj5*K=}!`n><2Y34T9JA}*VM0s) z3R;rgdhkKyqx8kg7B)7N6#}YGh;;ku)8?@1UDj2&mpA zHn$gJGeT?{V%rFtCIP8p4Zxc~=LQ_!xs+l;erQo>jOrvdZ=RE|&Ye-t&GP+H7F>fI zvk;93bOU&B&j>nPXpaNdCSlhgMTS&?D-T7~&bI!bYYdG*)ykUnP#t~^%z*Ncr#!@w zv*7%-x-Zvojrrk#zDWZ)b|o1+Bp91P97QVbDrxfYgL$lQV+Fh;;5EqMd>FG_ zdHyg{yf#u?MQ7~<$ysKka##A08lZKI3t`FdtOt~shaY(jk{{WoxoqOmk{Ml#$$N2k zuFES$a7kdzMx*}K)y`zHljj?9@*0|fhdFt9WJLu&w#4`DWsXmueXkN+8ftetn6oge z2x^W TEUn821pEbq} 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�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