technet:confdatafunctions
Configuration Data Functions (custom desired state configuration)
<# INTRO Let's try to have JSON configuration data for parameters of cmdlets like New, Set or Get and use PS functions to construct and all the cmdlets by a unified form aka cmdlet-less code. JSON data can be gatthered for example via: https://microsoft365dsc.com/ https://practical365.com/dsc-snapshot-microsoft365-tenant/ $Credential = Get-Credential Export-M365DSCConfiguration -Components @("AADApplication", "AADConditionalAccessPolicy", "AADGroup", "AADGroupLifecyclePolicy", "AADGroupsNamingPolicy", "AADGroupsSettings", "AADNamedLocationPolicy", "AADRoleDefinition", "AADTenantDetails", "AADTokenLifetimePolicy", "EXOAcceptedDomain", "EXOActiveSyncDeviceAccessRule", "EXOAddressBookPolicy", "EXOAddressList", "EXOAntiPhishPolicy", "EXOAntiPhishRule", "EXOApplicationAccessPolicy", "EXOAtpPolicyForO365", "EXOAuthenticationPolicy", "EXOAvailabilityAddressSpace", "EXOAvailabilityConfig", "EXOCASMailboxPlan", "EXOClientAccessRule", "EXODkimSigningConfig", "EXOEmailAddressPolicy", "EXOGlobalAddressList", "EXOHostedConnectionFilterPolicy", "EXOHostedContentFilterPolicy", "EXOHostedContentFilterRule", "EXOHostedOutboundSpamFilterPolicy", "EXOHostedOutboundSpamFilterRule", "EXOInboundConnector", "EXOIntraOrganizationConnector", "EXOJournalRule", "EXOMailboxPlan", "EXOMailTips", "EXOMalwareFilterPolicy", "EXOMalwareFilterRule", "EXOManagementRole", "EXOMobileDeviceMailboxPolicy", "EXOOfflineAddressBook", "EXOOnPremisesOrganization", "EXOOrganizationConfig", "EXOOrganizationRelationship", "EXOOutboundConnector", "EXOOwaMailboxPolicy", "EXOPartnerApplication", "EXOPolicyTipConfig", "EXOQuarantinePolicy", "EXORemoteDomain", "EXORoleAssignmentPolicy", "EXOSafeAttachmentPolicy", "EXOSafeAttachmentRule", "EXOSafeLinksPolicy", "EXOSafeLinksRule", "EXOSharedMailbox", "EXOSharingPolicy", "EXOTransportConfig", "EXOTransportRule", "IntuneAppConfigurationPolicy", "IntuneAppProtectionPolicyiOS", "IntuneDeviceCategory", "IntuneDeviceCompliancePolicyAndroid", "IntuneDeviceCompliancePolicyAndroidDeviceOwner", "IntuneDeviceCompliancePolicyAndroidWorkProfile", "IntuneDeviceCompliancePolicyiOs", "IntuneDeviceCompliancePolicyMacOS", "IntuneDeviceCompliancePolicyWindows10", "IntuneDeviceConfigurationPolicyAndroidDeviceOwner", "IntuneDeviceConfigurationPolicyAndroidWorkProfile", "IntuneDeviceConfigurationPolicyiOS", "IntuneDeviceConfigurationPolicyWindows10", "IntuneDeviceEnrollmentLimitRestriction", "IntuneDeviceEnrollmentPlatformRestriction", "O365AdminAuditLogConfig", "O365OrgCustomizationSetting", "ODSettings", "PPTenantIsolationSettings", "PPTenantSettings", "SCAuditConfigurationPolicy", "SCCaseHoldPolicy", "SCCaseHoldRule", "SCComplianceCase", "SCComplianceSearch", "SCComplianceSearchAction", "SCComplianceTag", "SCDeviceConditionalAccessPolicy", "SCDeviceConfigurationPolicy", "SCDLPCompliancePolicy", "SCDLPComplianceRule", "SCFilePlanPropertyAuthority", "SCFilePlanPropertyCategory", "SCFilePlanPropertyCitation", "SCFilePlanPropertyDepartment", "SCFilePlanPropertyReferenceId", "SCFilePlanPropertySubCategory", "SCLabelPolicy", "SCRetentionCompliancePolicy", "SCRetentionComplianceRule", "SCRetentionEventType", "SCSensitivityLabel", "SCSupervisoryReviewPolicy", "SCSupervisoryReviewRule", "SPOAccessControlSettings", "SPOApp", "SPOBrowserIdleSignout", "SPOHomeSite", "SPOHubSite", "SPOOrgAssetsLibrary", "SPOSearchManagedProperty", "SPOSearchResultSource", "SPOSharingSettings", "SPOSiteDesign", "SPOSiteDesignRights", "SPOSiteScript", "SPOStorageEntity", "SPOTenantCdnEnabled", "SPOTenantCdnPolicy", "SPOTenantSettings", "SPOTheme", "TeamsCallingPolicy", "TeamsChannel", "TeamsChannelsPolicy", "TeamsClientConfiguration", "TeamsEmergencyCallingPolicy", "TeamsEmergencyCallRoutingPolicy", "TeamsFederationConfiguration", "TeamsGuestCallingConfiguration", "TeamsGuestMeetingConfiguration", "TeamsGuestMessagingConfiguration", "TeamsMeetingBroadcastConfiguration", "TeamsMeetingBroadcastPolicy", "TeamsMeetingConfiguration", "TeamsMeetingPolicy", "TeamsMessagingPolicy", "TeamsPstnUsage", "TeamsTenantDialPlan", "TeamsUpgradeConfiguration", "TeamsUpgradePolicy", "TeamsVoiceRoute", "TeamsVoiceRoutingPolicy") -Credential $Credential -Path "C:\DSC" New-M365DSCReportFromConfiguration -Type html -ConfigurationPath -OutputPath New-M365DSCReportFromConfiguration -Type excel -ConfigurationPath -OutputPath New-M365DSCDeltaReport -Source -Destination -OutputPath ".html" #> # Example below for EXO settings # EXO CONFIGURATION (JSON) #region InboundConnector $InboundConnector ='{ "Id": "From GW to EXO", "Type": "EXO", "Action": "New-InboundConnector", "Test": "Get-InboundConnector", "Data": { "TreatMessagesAsInternal": false, "RestrictDomainsToIPAddresses": false, "Name": "From GW to EXO", "RequireTls": true, "CloudServicesMailEnabled": true, "ConnectorSource": "Default", "ConnectorType": "OnPremises", "SenderIPAddresses": [], "Comment": "From GW to EXO", "SenderDomains": "smtp:*;1", "AssociatedAcceptedDomains": [], "Enabled": true, "RestrictDomainsToCertificate": true, "TlsSenderCertificateName": "*.kasaj.cz" } }' #endregion #region OutboundConnetor $OutboundConnector = '{ "Id": "From EXO to GW", "Type": "EXO", "Action": "New-OutboundConnector", "Test": "Get-OutboundConnector", "Data": { "RouteAllMessagesViaOnPremises": false, "Enabled": true, "CloudServicesMailEnabled": true, "UseMxRecord": false, "SmartHosts": ["wes1-mx1.wedos.net","wes1-mx2.wedos.net"], "TlsSettings": "CertificateValidation", "RecipientDomains": [], "Name": "From EXO to GW", "Comment": "From EXO to GW, TR in use", "IsTransportRuleScoped": true, "ConnectorSource": "Default", "TestMode": false, "AllAcceptedDomains": false, "ConnectorType": "OnPremises" } }' #endregion #region TransportRule $TransportRule = '[{ "Id": "TR - Block External Delivery to onmicrosoft.com domains", "Type": "EXO", "Action": "New-TransportRule", "Test": "Get-TransportRule -Identity $Id", "Data": { "ExceptIfAttachmentProcessingLimitExceeded": false, "ExceptIfAttachmentHasExecutableContent": false, "RecipientAddressContainsWords": ["M365x11772468.onmicrosoft.com","M365x11772468.mail.onmicrosoft.com"], "RuleSubType": "None", "ApplyOME": false, "AttachmentIsUnsupported": false, "ExceptIfAttachmentIsUnsupported": false, "ExceptIfHeaderMatchesMessageHeader": "X-RoutedThroughGW", "ModerateMessageByManager": false, "RouteMessageOutboundRequireTls": false, "Mode": "Enforce", "RejectMessageEnhancedStatusCode": "5.7.1", "AttachmentHasExecutableContent": false, "ExceptIfHasSenderOverride": false, "AttachmentProcessingLimitExceeded": false, "DeleteMessage": false, "ExceptIfHeaderMatchesPatterns": "Yes", "RuleErrorAction": "Ignore", "HasSenderOverride": false, "ExceptIfHasNoClassification": false, "HasNoClassification": false, "RejectMessageReasonText": "External delivery not allowed to onmicrosoft.com addresses", "Priority": 4, "AttachmentIsPasswordProtected": false, "FromScope": "NotInOrganization", "RemoveOMEv2": false, "RemoveOME": false, "SenderAddressLocation": "Header", "Name": "TR - Block External Delivery to onmicrosoft.com domains", "ExceptIfAttachmentIsPasswordProtected": false, "StopRuleProcessing": true } }, { "Id": "TR - From EXO to GW", "Type": "EXO", "Action": "New-TransportRule", "Test": "Get-TransportRule -Identity $Id", "Data": { "ExceptIfAttachmentProcessingLimitExceeded": false, "ExceptIfAttachmentHasExecutableContent": false, "RemoveOMEv2": false, "ApplyOME": false, "AttachmentIsUnsupported": false, "ExceptIfAttachmentIsUnsupported": false, "ExceptIfHeaderMatchesMessageHeader": "X-HD1", "ModerateMessageByManager": false, "RouteMessageOutboundRequireTls": false, "Mode": "Enforce", "AttachmentHasExecutableContent": false, "ExceptIfHasSenderOverride": false, "AttachmentProcessingLimitExceeded": false, "RouteMessageOutboundConnector": "From EXO to GW", "DeleteMessage": false, "ExceptIfHeaderMatchesPatterns": "Yes", "RuleSubType": "None", "HasSenderOverride": false, "ExceptIfHasNoClassification": false, "HasNoClassification": false, "SentToScope": "NotInOrganization", "Priority": 2, "AttachmentIsPasswordProtected": false, "RuleErrorAction": "Ignore", "RemoveOME": false, "SenderAddressLocation": "Header", "Name": "TR - From EXO to GW", "ExceptIfAttachmentIsPasswordProtected": false, "StopRuleProcessing": true } }]' #endregion #region RemoteDomain $RemoteDomain ='{ "Id": "Default", "Type": "EXO", "Action": "Set-RemoteDomain", "Test": "Get-RemoteDomain", "Data": { "IsInternal": false, "TargetDeliveryDomain": false, "ByteEncoderTypeFor7BitCharsets": "Undefined", "CharacterSet": "iso-8859-1", "NonMimeCharacterSet": "iso-8859-1", "AllowedOOFType": "External", "AutoReplyEnabled": false, "AutoForwardEnabled": false, "DeliveryReportEnabled": true, "NDREnabled": true, "MeetingForwardNotificationEnabled": true, "ContentType": "MimeHtmlText", "DisplaySenderName": false, "PreferredInternetCodePageForShiftJis": "Undefined", "RequiredCharsetCoverage": null, "TNEFEnabled": null, "LineWrapSize": "Unlimited", "TrustedMailOutboundEnabled": false, "TrustedMailInboundEnabled": false, "UseSimpleDisplayName": false, "NDRDiagnosticInfoEnabled": true, "Identity": "Default" } }' #endregion #region TransportConfiguration $TransportConfig = '{ "Id": "b707e374f337438b8edd5a4feb7934e5", "Type": "EXO", "Action": "Set-TransportConfig", "Test": "Get-TransportConfig", "Data": { "AllowLegacyTLSClients": false, "HeaderPromotionModeSetting": "NoCreate", "ReplyAllStormBlockDurationHours": 6, "ReplyAllStormDetectionMinimumRecipients": 2500, "ReplyAllStormProtectionEnabled": true, "Rfc2231EncodingEnabled": false, "ExternalDsnSendHtml": true, "DSNConversionMode": "PreserveDSNBody", "ClearCategories": true, "ExternalDsnLanguageDetectionEnabled": true, "ReplyAllStormDetectionMinimumReplies": 10, "JournalMessageExpirationDays": 0, "InternalDsnSendHtml": true, "AddressBookPolicyRoutingEnabled": false, "ExternalDelayDsnEnabled": true, "InternalDsnLanguageDetectionEnabled": true, "SmtpClientAuthenticationDisabled": true, "ConvertDisclaimerWrapperToEml": false, "MaxRecipientEnvelopeLimit": "Unlimited", "InternalDelayDsnEnabled": true, "JournalingReportNdrTo": "\u003c\u003e" }, }' #endregion #region OrganizationConfig $OrganizationConfig = '{ "Id": "OrganizationConfig", "Type": "EXO", "Action": "Set-OrganizationConfig", "Test": "Get-OrganizationConfig", "Data": { "ShortenEventScopeDefault": "none", "ExchangeNotificationEnabled": true, "MailTipsLargeAudienceThreshold": 25, "ConnectorsEnabledForOutlook": false, "OutlookGifPickerDisabled": false, "AllowPlusAddressInRecipients": false, "MailTipsExternalRecipientsTipsEnabled": true, "AsyncSendEnabled": true, "ActivityBasedAuthenticationTimeoutEnabled": true, "LinkPreviewEnabled": true, "DefaultGroupAccessType": "Private", "CustomerLockboxEnabled": false, "OutlookMobileGCCRestrictionsEnabled": false, "DistributionGroupNameBlockedWordsList": [], "VisibleMeetingUpdateProperties": "Location,AllProperties:15", "ConnectorsEnabledForSharepoint": true, "SendFromAliasEnabled": false, "ElcProcessingDisabled": false, "WebPushNotificationsDisabled": false, "WebSuggestedRepliesDisabled": false, "DefaultPublicFolderProhibitPostQuota": "2 GB (2,147,483,648 bytes)", "ReadTrackingEnabled": false, "AppsForOfficeEnabled": false, "MessageRemindersEnabled": true, "RemotePublicFolderMailboxes": [], "ConnectorsActionableMessagesEnabled": true, "MobileAppEducationEnabled": true, "ConnectorsEnabledForTeams": true, "DisablePlusAddressInRecipients": true, "AuditDisabled": false, "BookingsSocialSharingRestricted": true, "OAuth2ClientProfileEnabled": true, "EndUserDLUpgradeFlowsDisabled": true, "ByteEncoderTypeFor7BitCharsets": 0, "DirectReportsGroupAutoCreationEnabled": false, "ActivityBasedAuthenticationTimeoutWithSingleSignOnEnabled": true, "DefaultPublicFolderMovedItemRetention": "7.00:00:00", "SmtpActionableMessagesEnabled": true, "DefaultPublicFolderDeletedItemRetention": "30.00:00:00", "LeanPopoutEnabled": false, "ActivityBasedAuthenticationTimeoutInterval": "06:00:00", "DefaultPublicFolderMaxItemSize": "Unlimited", "DefaultPublicFolderIssueWarningQuota": "1.7 GB (1,825,361,920 bytes)", "BookingsPaymentsEnabled": false, "IPListBlocked": [], "ConnectorsEnabled": false, "ExchangeNotificationRecipients": [], "BookingsEnabled": false, "MailTipsGroupMetricsEnabled": true, "PublicComputersDetectionEnabled": false, "OutlookPayEnabled": false, "MailTipsAllTipsEnabled": true, "PublicFoldersEnabled": "Local", "ConnectorsEnabledForYammer": false, "PublicFolderShowClientControl": false, "DistributionGroupNamingPolicy": "", "MailTipsMailboxSourcedTipsEnabled": true } }' #endregion #region HostedContentFilterPolicy $HostedContentFilterPolicy = '{ "Id": "c5b2629579c2467f8e446457a19bae7e", "Type": "EXO", "Name": "HostedContentFilterPolicy", "Action": "New", "Data": { "InlineSafetyTipsEnabled": true, "MarkAsSpamJavaScriptInHtml": "Off", "Identity": "Default", "SpamZapEnabled": true, "EndUserSpamNotificationLanguage": "Default", "SpamAction": "MoveToJmf", "MakeDefault": true, "HighConfidenceSpamAction": "MoveToJmf", "EndUserSpamNotificationFrequency": 3, "TestModeBccToRecipients": [ ], "HighConfidencePhishAction": "Quarantine", "BulkThreshold": 7, "PhishSpamAction": "MoveToJmf", "DownloadLink": false, "PhishZapEnabled": true, "MarkAsSpamObjectTagsInHtml": "Off", "MarkAsSpamFramesInHtml": "Off", "EndUserSpamNotificationCustomSubject": "", "RedirectToRecipients": [ ], "BulkSpamAction": "MoveToJmf", "LanguageBlockList": [ ], "QuarantineRetentionPeriod": 15, "EnableEndUserSpamNotifications": false, "MarkAsSpamBulkMail": "On", "IncreaseScoreWithNumericIps": "Off", "MarkAsSpamEmbedTagsInHtml": "Off", "MarkAsSpamSensitiveWordList": "Off", "RegionBlockList": [ ], "MarkAsSpamFromAddressAuthFail": "Off", "EnableLanguageBlockList": false, "MarkAsSpamEmptyMessages": "Off", "EnableRegionBlockList": false, "AddXHeaderValue": "", "IncreaseScoreWithBizOrInfoUrls": "Off", "MarkAsSpamSpfRecordHardFail": "Off", "AdminDisplayName": "", "MarkAsSpamWebBugsInHtml": "Off", "TestModeAction": "None", "MarkAsSpamNdrBackscatter": "Off", "MarkAsSpamFormTagsInHtml": "Off", "ModifySubjectValue": "", "IncreaseScoreWithImageLinks": "Off", "IncreaseScoreWithRedirectToOtherPort": "Off" }, "Permission": "Exchange Administrator" } ' #endregion #region HostedConnectionFilterPolicy $HostedConnectionFilterPolicy = '{ "Id": "92755ec5ff4e48aeb4c3e7a8cd747619", "Type": "EXO", "Name": "HostedConnectionFilterPolicy", "Action": "New", "Data": { "AdminDisplayName": "", "IPBlockList": [ ], "Identity": "Default", "EnableSafeList": false, "MakeDefault": false, "IPAllowList": [ ] }, "Permission": "Exchange Administrator" }' #endregion # FUNCTIONS Function Compare-ObjectProperties { Param( [PSObject]$ReferenceObject, [PSObject]$DifferenceObject ) $objprops = $ReferenceObject | Get-Member -MemberType Property,NoteProperty | % Name $objprops += $DifferenceObject | Get-Member -MemberType Property,NoteProperty | % Name $objprops = $objprops | Sort | Select -Unique $diffs = @() foreach ($objprop in $objprops) { $diff = Compare-Object $ReferenceObject $DifferenceObject -Property $objprop if ($diff) { $diffprops = @{ PropertyName=$objprop } $diffs += New-Object PSObject -Property $diffprops } } if ($diffs) { return ($diffs | Select PropertyName,RefValue,DiffValue) } } function Start-ConfAction ($Act,$Data,$Force,$Prop, $Ver){ [string] $Cmdlet = $act [string] $CmdletInc = $act foreach($Member in $Members){ $Cmdlet += " -"+$Member+' $Data.'+$Member if($Prop -and ($Prop -contains $Member)){ $CmdletInc += " -"+$Member+' $Data.'+$Member } } if($Prop){ if($Ver){ $CmdletInc += ' -Verbose -WhatIf' } $CmdletInc }else{ $Cmdlet } if($force -like "f*"){ if($Prop){ Invoke-Expression -Command $CmdletInc }else{ Invoke-Expression -Command $Cmdlet } } } function Test-ConfData ($Conf){ $Data = $Conf.data $Id = $conf.Id $Get = Invoke-Expression -Command $Conf.Test |select -Property $Members if($Get){ $Comp = Compare-ObjectProperties $Data $Get } if($comp -and $Get -and !$error){ $comp }elseif(!$comp -and $Get -and !$error){ "OK" }else{ "Not detected!" } } # MAIN Connect-ExchangeOnline Connect-IPPSSession #region InboundConnector $Conf = @() $Conf = $InboundConnector | ConvertFrom-Json $Conf.data <# Output example: Enabled : True ConnectorType : OnPremises Comment : Inbound from GW SenderIPAddresses : {} SenderDomains : {smtp:*;1} TrustedOrganizations : {} AssociatedAcceptedDomains : {} RequireTls : True RestrictDomainsToIPAddresses : False RestrictDomainsToCertificate : True CloudServicesMailEnabled : True TreatMessagesAsInternal : False TlsSenderCertificateName : *.kasaj.cz EFTestMode : False ScanAndDropRecipients : {} EFSkipLastIP : False EFSkipIPs : {} EFSkipMailGateway : {} EFUsers : {} Name : Inbound from GW #> Test-ConfData $Conf <# Output example: PropertyName RefValue DiffValue ------------ -------- --------- Comment Inbound from GW Connector disabled Enabled True False #> Start-ConfAction $Conf.Action $Conf.Data <# Output example: New-InboundConnector -AssociatedAcceptedDomains $Data.AssociatedAcceptedDomains -CloudServicesMailEnabled $Data.CloudServicesMailEnabled -Comment $Data.Comment -ConnectorType $Data.ConnectorType -EFSkipIPs $Data.EFSkipIPs -EFSkipLastIP $Data.EFSkipLastIP -EFSkipMailGateway $Data.EFSkipMailGateway -EFTestMode $Data.EFTestMode -EFUsers $Data.EFUsers -Enabled $Data.Enabled -Name $Data.Name -RequireTls $Data.RequireTls -RestrictDomainsToCertificate $Data.RestrictDomainsToCertificate -RestrictDomainsToIPAddresses $Data.RestrictDomainsToIPAddresses -ScanAndDropRecipients $Data.ScanAndDropRecipients -SenderDomains $Data.SenderDomains -SenderIPAddresses $Data.SenderIPAddresses -TlsSenderCertificateName $Data.TlsSenderCertificateName -TreatMessagesAsInternal $Data.TreatMessagesAsInternal -TrustedOrganizations $Data.TrustedOrganizations #> Start-ConfAction $Conf.Action $Conf.Data force # Start-ConfAction "Set-InboundConnector -identity 'Outbound to GW'" $Conf.Data force #endregion #region OutboundConnector $Conf = @() $Conf = $OutboundConnector | ConvertFrom-Json $Conf.data Test-ConfData $Conf Start-ConfAction $Conf.Action $Conf.Data nonforce $((Test-ConfData $Conf).PropertyName) Start-ConfAction $Conf.Action $Conf.Data nonforce $((Test-ConfData $Conf).PropertyName) "ver" Start-ConfAction $Conf.Action $Conf.Data force # Start-ConfAction "Set-OrganizationConfig" $Conf.Data nonforce $Conf.Data force $((Test-ConfData $Conf).PropertyName) "V" # Start-ConfAction "Set-OrganizationConfig" $Conf.Data force #endregion #region TransporRule $Conf = @() $Conf = $TransportRule| ConvertFrom-Json $Conf[0].data Test-ConfData $Conf[0] Start-ConfAction $Conf[0].Action $Conf[0].Data Start-ConfAction $Conf[0].Action $Conf[0].Data force # Start-ConfAction "Set-TransportRule -identity 'TR - Block External Delivery to onmicrosoft.com domains'" $Conf[0].Data nonforce $((Test-ConfData $Conf[0]).PropertyName) # Start-ConfAction "Set-TransportRule -identity 'TR - Block External Delivery to onmicrosoft.com domains'" $Conf[0].Data force $Conf[1].data Test-ConfData $Conf[1] Start-ConfAction $Conf[1].Action $Conf[1].Data Start-ConfAction $Conf[1].Action $Conf[1].Data force # Start-ConfAction "Set-TransportRule -identity 'TR - From EXO to GW'" $Conf.Data force #endregion #region RemoteDomain $Conf = @() $Conf = $RemoteDomain | ConvertFrom-Json $Conf.data Test-ConfData $Conf Start-ConfAction $Conf.Action $Conf.Data nonforce $((Test-ConfData $Conf).PropertyName) Start-ConfAction $Conf.Action $Conf.Data force #endregion #region OrganizationConfig $Conf = @() $Conf = $OrganizationConfig | ConvertFrom-Json $Conf.data Test-ConfData $Conf Start-ConfAction $Conf.Action $Conf.Data force $((Test-ConfData $Conf).PropertyName+"ShortenEventScopeDefault") "what" Start-ConfAction $Conf.Action $Conf.Data force #endregion
technet/confdatafunctions.txt · Last modified: 2023/06/14 09:43 by A User Not Logged in