seppmail365/Public/Common.ps1
function New-SM365ExOReport { [CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='Medium')] Param ( # Define output Filapath [Parameter( Mandatory = $true, HelpMessage = 'Relative path of the HTML report on disk', ParameterSetName = 'Filepath' )] $FilePath ) begin { if (!(Test-SM365ConnectionStatus)) { throw [System.Exception] "You're not connected to Exchange Online - please connect prior to using this CmdLet" } else { Write-Information "Connected to Exchange Organization `"$Script:ExODefaultDomain`"" -InformationAction Continue Write-verbose 'Defining Function fo read Exo Data and return an info Message in HTML even if nothing is retrieved' } #region Filetest If (!($FilePath.Contains('.'))) { Write-Verbose "Test if $Filepath exists" If (!(Test-Path $FilePath)) { throw [System.Exception] "$Filepath does not exist. Enter a valid filepath including filename like ~\exoreport.html" } else { $reporttimestamp = "{0:dd-MMMM-yyy_HH-mm-ss}" -f (Get-Date) $reportdomainname = Get-AcceptedDomain|where-object InitialDomain -eq $true|select-object -expandproperty Domainname $ReportFileName = $reportTimeStamp + $reportdomainname + '.html' Write-Verbose "$Filepath is a path (only), adding $ReportFilename" $FilePath = Join-path -Path $FilePath -ChildPath $ReportFileName } } else { $ParentFilePath = Split-Path $FilePath -Parent If (!(Test-Path $ParentFilePath)) { throw [System.Exception] "The Path $ParentFilePath does not exist. Enter a valid filepath including filename like ~\exoreport.html" } else { Write-Verbose "Test if $Filepath is a valid Filename" If (!(($Filepath.Contains('.html')) -or ($Filepath.Contains('.html')))) { Write-Warning "$Filepath does not contain a usual html-report filename. We recommend using 'html' or 'htm' as file-extension." } } } #endregion function Get-ExoHTMLData { param ( [Parameter( Mandatory = $true, HelpMessage = 'Enter Cmdlte to ')] [string]$ExoCmd ) $rawData = Invoke-Expression -Command $exoCmd if ($null -eq $rawData) { $ExoHTMLData = New-object -type PSobject -property @{Result = '--- no information available ---'}|Convertto-HTML -Fragment } else { $ExoHTMLData = $rawData|Convertto-HTML -Fragment } return $ExoHTMLData } } process { try { if ($pscmdlet.ShouldProcess("Target", "Operation")) { #"Whatis is $Whatif and `$pscmdlet.ShouldProcess is $($pscmdlet.ShouldProcess) " #For later Use } $mv = '1.2.0' #$mv = (Get-Module SEPPmail365).Version.ToString() $Top = "<p><h1>Exchange Online Report</h1><p>" $now = Get-Date $RepCreationDateTime = "<p><body>Report created: $now</body><p>" $moduleVersion = "<p><body>SEPPmail365 Module Version: $mv</body><p>" Write-Verbose "Collecting Accepted Domains" $hSplitLine = '<p><h2>---------------------------------------------------------------------------------------------------------------------------</h2><p>' #region General infos $hGeneral = '<p><h2>General Exchange Online and Subscription Information</h2><p>' $hA = '<p><h3>Accepted Domains</h3><p>' $A = Get-ExoHTMLData -ExoCmd 'Get-AcceptedDomain |select-object Domainname,DomainType,Default,EmailOnly,ExternallyManaged,OutboundOnly|Sort-Object -Descending Default ' # Find out Office Configuration Write-Verbose "Collecting M365 Configuration" $hB = '<p><h3>ExO Configuration Details</h3><p>' $B = Get-ExoHTMLData -ExoCmd 'Get-OrganizationConfig |Select-Object DisplayName,ExchangeVersion,AllowedMailboxRegions,DefaultMailboxRegion' # Find out possible Sending Limits for LFT Write-Verbose "Collecting Send and Receive limits for SEPPmail LFT configuration" $hP = '<p><h3>Send and Receive limits (for SEPPmail LFT configuration)</h3><p>' $P = Get-ExoHTMLData -ExoCmd 'Get-TransportConfig |Select-Object MaxSendSize,MaxReceiveSize' # Find out possible Office Message Encryption Settings Write-Verbose "Collecting Office Message Encryption Settings" $hP = '<p><h3>Office Message Encryption Settings</h3><p>' $P = Get-ExoHTMLData -ExoCmd 'Get-OMEConfiguration|Select-Object PSComputerName,TemplateName,OTPEnabled,SocialIdSignIn,ExternalMailExpiryInterval,Identity,IsValid' # Get MX Record Report for each domain $hO = '<p><h3>MX Record for each Domain</h3><p>' $O = $Null $oTemp = Get-AcceptedDomain Foreach ($AcceptedDomain in $oTemp.DomainName) { $O += (Get-MxRecordReport -Domain $AcceptedDomain|Select-Object -Unique|Select-Object HighestPriorityMailhost,HighestPriorityMailhostIpAddress,Domain|Convertto-HTML -Fragment) } #endregion #region Security $hSecurity = '<p><h2>Security related Information</h2><p>' $hC = '<p><h3>DKIM Settings</h3><p>' $C = Get-ExoHTMLData -ExoCmd 'Get-DkimSigningConfig|Select-Object Domain,Enabled,Status,Selector1CNAME,Selector2CNAME|sort-object Enabled -Descending' Write-Verbose "Collecting Phishing and Malware Policies" $hD = '<p><h3>Anti Phishing Policies</h3><p>' $D = Get-ExoHTMLData -ExoCmd 'Get-AntiPhishPolicy|Select-Object Identity,isDefault,IsValid,AuthenticationFailAction' $hE = '<p><h3>Anti Malware Policies</h3><p>' $E = Get-ExoHTMLData -ExoCmd 'Get-MalwareFilterPolicy|Select-Object Identity,Action,IsDefault,Filetypes' $hk = '<p><h3>Content Filter Policy</h3><p>' $k= Get-ExoHTMLData -ExoCmd 'Get-HostedContentFilterPolicy|Select-Object QuarantineRetentionPeriod,EndUserSpamNotificationFrequency,TestModeAction,IsValid,BulkSpamAction,PhishSpamAction,OriginatingServer' Write-Verbose "Blocked Sender Addresses" $hH = '<p><h3>Show Senders which are locked due to outbound SPAM</h3><p>' $h = Get-ExoHTMLData -ExoCmd 'Get-BlockedSenderAddress' Write-Verbose "Get Outbound SPAM Filter Policy" $hJ = '<p><h3>Outbound SPAM Filter Policy</h3><p>' $J = Get-ExoHTMLData -ExoCmd 'Get-HostedOutboundSpamFilterPolicy|Select-Object Name,IsDefault,Enabled,ActionWhenThresholdReached' Write-Verbose "Get Filter Policy" $hJ1 = '<p><h3>SPAM Filter Policy</h3><p>' $J1 = Get-ExoHTMLData -ExoCmd 'Get-HostedConnectionFilterPolicy|select-Object Name,IsDefault,Enabled,IPAllowList,IPBlockList' #endregion Security #region other connectors $hOtherConn = '<p><h2>Hybrid and other Connectors</h2><p>' Write-Verbose "Get-HybridMailflow" $hG = '<p><h3>Hybrid Mailflow Information</h3><p>' $g = Get-ExoHTMLData -ExoCmd 'Get-HybridMailflow' Write-Verbose "Get-IntraorgConnector" $hI = '<p><h3>Intra Org Connector Settings</h3><p>' $I = Get-ExoHTMLData -ExoCmd 'Get-IntraOrganizationConnector|Select-Object Identity,TargetAddressDomains,DiscoveryEndpoint,IsValid' #endregion #region connectors $hConnectors = '<p><h2>Existing Exchange Connectors</h2><p>' Write-Verbose "InboundConnectors" $hL = '<p><h3>Inbound Connectors</h3><p>' $L = Get-ExoHTMLData -ExoCmd 'Get-InboundConnector |Select-Object Identity,Enabled,SenderDomains,OrganizationalUnitRootInternal,TlsSenderCertificateName,IsValid' Write-Verbose "OutboundConnectors" $hM = '<p><h3>Outbound Connectors</h3><p>' $M = Get-ExoHTMLData -ExoCmd 'Get-OutboundConnector|Select-Object Identity,Enabled,SmartHosts,TlsDomain,TlsSettings,RecipientDomains,OriginatingServer,IsValid' #endregion connectors #region mailflow rules $hTransPortRules = '<p><h2>Existing Mailflow Rules</h2><p>' Write-Verbose "TransportRules" $hN = '<p><h3>Existing Transport Rules</h3><p>' $N = Get-ExoHTMLData -ExoCmd 'Get-TransportRule | select-object Name,State,Mode,Priority,FromScope,SentToScope' #endregion transport rules if ($psversiontable.PSedition -eq 'Desktop') { $HeaderLogo = [Convert]::ToBase64String((Get-Content -path $PSScriptRoot\..\HTML\SEPPmailLogo.jpg -encoding byte )) } else { $HeaderLogo = [Convert]::ToBase64String((Get-Content -path $PSScriptRoot\..\HTML\SEPPmailLogo.jpg -AsByteStream)) } $LogoHTML = @" <img src="data:image/jpg;base64,$($HeaderLogo)" style="left:150px alt="Exchange Online System Report"> "@ $hEndOfReport = '<p><h2>--- End of Report ---</h2><p>' $style = Get-Content $modulepath\HTML\SEPPmailReport.css Convertto-HTML -Body "$LogoHTML $Top $RepCreationDatetime $moduleVersion` $hSplitLine $hGeneral $hSplitLine $hA $a $hB $b $hP $P $hO $o` $hSplitLine $hSecurity $hSplitLine $hC $c $hd $d $hE $e $hK $k $hH $h $hJ $j $hJ1 $J1 ` $hSplitLine $hOtherConn $hSplitLine $hG $g $hI $i ` $hSplitLine $hConnectors $hSplitLine $hL $l $hM $m ` $hSplitLine $hTransPortRules $hSplitLine $hN $n $hEndofReport " -Title "SEPPmail365 Exo Report" -Head $style|Out-File -FilePath $filePath -Force } catch { throw [System.Exception] "Error: $($_.Exception.Message)" } } end { } } function Remove-SM365Setup { [CmdletBinding()] param() Begin {} Process { Remove-SM365Rules Remove-SM365Connectors } End{} } function Get-SM365Setup { [CmdletBinding()] param() Begin {} Process { Get-SM365Connectors Get-SM365Rules } End{} } # SIG # Begin signature block # MIIL1wYJKoZIhvcNAQcCoIILyDCCC8QCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUvgzW2t2yeUh7rl6+TMOdFNUF # MsuggglAMIIEmTCCA4GgAwIBAgIQcaC3NpXdsa/COyuaGO5UyzANBgkqhkiG9w0B # AQsFADCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYG # A1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv # KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkx # HzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMTMxMjEwMDAwMDAw # WhcNMjMxMjA5MjM1OTU5WjBMMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl # LCBJbmMuMSYwJAYDVQQDEx10aGF3dGUgU0hBMjU2IENvZGUgU2lnbmluZyBDQTCC # ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJtVAkwXBenQZsP8KK3TwP7v # 4Ol+1B72qhuRRv31Fu2YB1P6uocbfZ4fASerudJnyrcQJVP0476bkLjtI1xC72Ql # WOWIIhq+9ceu9b6KsRERkxoiqXRpwXS2aIengzD5ZPGx4zg+9NbB/BL+c1cXNVeK # 3VCNA/hmzcp2gxPI1w5xHeRjyboX+NG55IjSLCjIISANQbcL4i/CgOaIe1Nsw0Rj # gX9oR4wrKs9b9IxJYbpphf1rAHgFJmkTMIA4TvFaVcnFUNaqOIlHQ1z+TXOlScWT # af53lpqv84wOV7oz2Q7GQtMDd8S7Oa2R+fP3llw6ZKbtJ1fB6EDzU/K+KTT+X/kC # AwEAAaOCARcwggETMC8GCCsGAQUFBwEBBCMwITAfBggrBgEFBQcwAYYTaHR0cDov # L3QyLnN5bWNiLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEAMDIGA1UdHwQrMCkwJ6Al # oCOGIWh0dHA6Ly90MS5zeW1jYi5jb20vVGhhd3RlUENBLmNybDAdBgNVHSUEFjAU # BggrBgEFBQcDAgYIKwYBBQUHAwMwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCk # HjAcMRowGAYDVQQDExFTeW1hbnRlY1BLSS0xLTU2ODAdBgNVHQ4EFgQUV4abVLi+ # pimK5PbC4hMYiYXN3LcwHwYDVR0jBBgwFoAUe1tFz6/Oy3r9MZIaarbzRutXSFAw # DQYJKoZIhvcNAQELBQADggEBACQ79degNhPHQ/7wCYdo0ZgxbhLkPx4flntrTB6H # novFbKOxDHtQktWBnLGPLCm37vmRBbmOQfEs9tBZLZjgueqAAUdAlbg9nQO9ebs1 # tq2cTCf2Z0UQycW8h05Ve9KHu93cMO/G1GzMmTVtHOBg081ojylZS4mWCEbJjvx1 # T8XcCcxOJ4tEzQe8rATgtTOlh5/03XMMkeoSgW/jdfAetZNsRBfVPpfJvQcsVncf # hd1G6L/eLIGUo/flt6fBN591ylV3TV42KcqF2EVBcld1wHlb+jQQBm1kIEK3Osgf # HUZkAl/GR77wxDooVNr2Hk+aohlDpG9J+PxeQiAohItHIG4wggSfMIIDh6ADAgEC # AhBdMTrn+ZR0fTH9F/xerQI2MA0GCSqGSIb3DQEBCwUAMEwxCzAJBgNVBAYTAlVT # MRUwEwYDVQQKEwx0aGF3dGUsIEluYy4xJjAkBgNVBAMTHXRoYXd0ZSBTSEEyNTYg # Q29kZSBTaWduaW5nIENBMB4XDTIwMDMxNjAwMDAwMFoXDTIzMDMxNjIzNTk1OVow # XTELMAkGA1UEBhMCQ0gxDzANBgNVBAgMBkFhcmdhdTERMA8GA1UEBwwITmV1ZW5o # b2YxFDASBgNVBAoMC1NFUFBtYWlsIEFHMRQwEgYDVQQDDAtTRVBQbWFpbCBBRzCC # ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKE54Nn5Vr8YcEcTv5k0vFyW # 26kzBt9Pe2UcawfjnyqvYpWeCuOXxy9XXif24RNuBROEc3eqV4EHbA9v+cOrE1me # 4HTct7byRM0AQCzobeFAyei3eyeDbvb963pUD+XrluCQS+L80n8yCmcOwB+weX+Y # j2CY7s3HZfbArzTxBHo5AKEDp9XxyoCc/tUQOq6vy+wdbOOfLhrNMkDDCsBWSLqi # jx3t1E+frAYF7tXaO5/FEGTeb/OjXqOpoooNL38FmCJh0CKby090sBJP5wSienn1 # NdhmBOKRL+0K3bomozoYmQscpT5AfWo4pFQm+8bG4QdNaT8AV4AHPb4zf23bxWUC # AwEAAaOCAWowggFmMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUV4abVLi+pimK5PbC # 4hMYiYXN3LcwHQYDVR0OBBYEFPKf1Ta/8vAMTng2ZeBzXX5uhp8jMCsGA1UdHwQk # MCIwIKAeoByGGmh0dHA6Ly90bC5zeW1jYi5jb20vdGwuY3JsMA4GA1UdDwEB/wQE # AwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzBuBgNVHSAEZzBlMGMGBmeBDAEEATBZ # MCYGCCsGAQUFBwIBFhpodHRwczovL3d3dy50aGF3dGUuY29tL2NwczAvBggrBgEF # BQcCAjAjDCFodHRwczovL3d3dy50aGF3dGUuY29tL3JlcG9zaXRvcnkwVwYIKwYB # BQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8vdGwuc3ltY2QuY29tMCYGCCsG # AQUFBzAChhpodHRwOi8vdGwuc3ltY2IuY29tL3RsLmNydDANBgkqhkiG9w0BAQsF # AAOCAQEAdszNU8RMB6w9ylqyXG3EjWnvii7aigN0/8BNwZIeqLP9aVrHhDEIqz0R # u+KJG729SgrtLgc7OenqubaDLiLp7YICAsZBUae3a+MS7ifgVLuDKBSdsMEH+oRu # N1iGMfnAhykg0P5ltdRlNfDvQlIFiqGCcRaaGVC3fqo/pbPttbW37osyIxTgmB4h # EWs1jo8uDEHxw5qyBw/3CGkBhf5GNc9mUOHeEBMnzOesmlq7h9R2Q5FaPH74G9FX # xAG2z/rCA7Cwcww1Qgb1k+3d+FGvUmVGxJE45d2rVj1+alNc+ZcB9Ya9+8jhMssM # LjhJ1BfzUWeWdZqRGNsfFj+aZskwxjGCAgEwggH9AgEBMGAwTDELMAkGA1UEBhMC # VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEmMCQGA1UEAxMddGhhd3RlIFNIQTI1 # NiBDb2RlIFNpZ25pbmcgQ0ECEF0xOuf5lHR9Mf0X/F6tAjYwCQYFKw4DAhoFAKB4 # MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQB # gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkE # MRYEFHNxw6rbPmXUdEA3y2OiU1UWY0csMA0GCSqGSIb3DQEBAQUABIIBAG6aZxi6 # TYNeEy+hOjaQuMwY52A9Gm1f7D2ZP+q55Y7aQV2NgHYFsY+lTcZd5BBRZvCRsY6O # 3wzCAr8gClKlsPZ/l4gVIGQVuSTfoge8Xgo/AQE0d5ia7H8IraLqMn886ObzJLWS # /zeZ/ecU+0ZTv0rhgCWwPylh6aCGE8dkCrrYgDYRDNrb1Ly9nUny0/c+g++tCY5u # bYVfoOv2qjVRMPUM3p2tfbo/SAq5S8VTaP4LF7xRiv+DSVAJhyiGMOqChMtD0GtK # xB8Ku9UAQGdfNWmy5NI0V+B7uMWBzMXaNdD+SHnaSg5pwdhCytFKzOE4hgQjnxbr # S2Qhu20wpVO4iTk= # SIG # End signature block |