public/Get-AzureADMSConditionalAccessPolicyReport.ps1

function Get-AzureADMSConditionalAccessPolicyReport {

    param(
        [parameter()]
        [String]$OutputPath

    )

    if (!$OutputPath){
        $ExportPath = "$env:TEMP\AzureADConditionalAccessPolicyReport$(get-date -Format yyyyMMddhhmmss).csv"
    }
    else {
        $ExportPath = $OutputPath
    }

    function Test-Guid {
        <#
        .SYNOPSIS
        Validates a given input string and checks string is a valid GUID
        .DESCRIPTION
        Validates a given input string and checks string is a valid GUID by using the .NET method Guid.TryParse
        .EXAMPLE
        Test-Guid -InputObject "3363e9e1-00d8-45a1-9c0c-b93ee03f8c13"
        .NOTES
        Uses .NET method [guid]::TryParse()
        #>

        [Cmdletbinding()]
        [OutputType([bool])]
        param
        (
            [Parameter(Mandatory = $true, Position = 0, ValueFromPipelineByPropertyName = $true)]
            [AllowEmptyString()]
            [string]$InputObject
        )
        process {
            return [guid]::TryParse($InputObject, $([ref][guid]::Empty))
        }
    }#end test-guid function
    # Connect to Azure AD
    try {
        Get-AzureADCurrentSessionInfo
    }
    catch{
        return "Install Azure AD modules and Connect-AzureAD"
    }
    
    # Lookup table for application ID's
    $lookupTable = @{
        "00000004-0000-0ff1-ce00-000000000000" = "Microsoft.Lync"
        "00000006-0000-0ff1-ce00-000000000000" = "Microsoft.Office365Portal"
        "00000003-0000-0ff1-ce00-000000000000" = "Microsoft.SharePoint"
        "00000005-0000-0000-c000-000000000000" = "Microsoft.Azure.Workflow"
        "00000009-0000-0000-c000-000000000000" = "Microsoft.Azure.AnalysisServices"
        "00000002-0000-0ff1-ce00-000000000000" = "Microsoft.Exchange"
        "00000007-0000-0ff1-ce00-000000000000" = "Microsoft.ExchangeOnlineProtection"
        "00000002-0000-0000-c000-000000000000" = "Microsoft.Azure.ActiveDirectory"
        "8fca0a66-c008-4564-a876-ab3ae0fd5cff" = "Microsoft.SMIT"
        "0000000b-0000-0000-c000-000000000000" = "Microsoft.SellerDashboard"
        "0000000f-0000-0000-c000-000000000000" = "Microsoft.Azure.GraphExplorer"
        "0000000c-0000-0000-c000-000000000000" = "MicrosoftAppAccessPanel"
        "00000013-0000-0000-c000-000000000000" = "Microsoft.Azure.Portal"
        "00000010-0000-0000-c000-000000000000" = "Microsoft.Azure.GraphStore"
        "93ee9413-cf4c-4d4e-814b-a91ff20a01bd" = "Workflow"
        "aa9ecb1e-fd53-4aaa-a8fe-7a54de2c1334" = "Microsoft.Office365.Configure"
        "797f4846-ba00-4fd7-ba43-dac1f8f63013" = "WindowsAzureServiceManagementAPI"
        "00000005-0000-0ff1-ce00-000000000000" = "Microsoft.YammerEnterprise"
        "601d4e27-7bb3-4dee-8199-90d47d527e1c" = "Microsoft.Office365.ChangeManagement"
        "6f82282e-0070-4e78-bc23-e6320c5fa7de" = "Microsoft.DiscoveryService"
        "0f698dd4-f011-4d23-a33e-b36416dcb1e6" = "Microsoft.OfficeClientService"
        "67e3df25-268a-4324-a550-0de1c7f97287" = "Microsoft.OfficeWebAppsService"
        "ab27a73e-a3ba-4e43-8360-8bcc717114d8" = "Microsoft.OfficeModernCalendar"
        "aedca418-a84d-430d-ab84-0b1ef06f318f" = "Workflow"
        "595d87a1-277b-4c0a-aa7f-44f8a068eafc" = "Microsoft.SupportTicketSubmission"
        "e3583ad2-c781-4224-9b91-ad15a8179ba0" = "Microsoft.ExtensibleRealUserMonitoring"
        "b645896d-566e-447e-8f7f-e2e663b5d182" = "OpsDashSharePointApp"
        "48229a4a-9f1d-413a-8b96-4c02462c0360" = "OpsDashSharePointApp"
        "48717084-a59c-4306-9dc4-3f618dbecdf9" = "Office365DevelopmentTools"
        "c859ff33-eb41-4ba6-8093-a2c5153bbd7c" = "Workflow"
        "67cad61c-3411-48d7-ab73-561c64f11ed6" = "Workflow"
        "914ed757-9257-4200-b68e-a2bed2f12c5a" = "RbacBackfill"
        "499b84ac-1321-427f-aa17-267ca6975798" = "Microsoft.VisualStudio.Online"
        "b2590339-0887-4e94-93aa-13357eb510d7" = "Workflow"
        "0000001b-0000-0000-c000-000000000000" = "MicrosoftPowerBIInformationService"
        "89f80565-bfac-4c01-9535-9f0eba332ffe" = "PowerBI"
        "433895fb-4ec7-45c3-a53c-c44d10f80d5b" = "CompromisedAccountService"
        "d7c17728-4f1e-4a1e-86cf-7e0adf3fe903" = "Workflow"
        "17ef6d31-381f-4783-b186-7b440a3c85c1" = "Workflow"
        "00000012-0000-0000-c000-000000000000" = "Microsoft.Azure.RMS"
        "81ce94d4-9422-4c0d-a4b9-3250659366ce" = "Workflow"
        "8d3a7d3c-c034-4f19-a2ef-8412952a9671" = "MicrosoftOffice"
        "0469d4cd-df37-4d93-8a61-f8c75b809164" = "MicrosoftPolicyAdministrationService"
        "31d3f3f5-7267-45a8-9549-affb00110054" = "WindowsAzureRemoteAppService"
        "4e004241-32db-46c2-a86f-aaaba29bea9c" = "Workflow"
        "748d098e-7a3b-436d-8b0a-006a58b29647" = "Workflow"
        "dbf08535-1d3b-4f89-bf54-1d48dd613a61" = "Workflow"
        "ed9fe1ef-25a4-482f-9981-2b60f91e2448" = "Workflow"
        "8ad28d50-ee26-42fc-8a29-e41ea38461f2" = "Office365RESTAPIExplorer.Office365App"
        "38285dce-a13d-4107-9b04-3016b941bb3a" = "BasicDataOperationsREST"
        "92bb96c8-321c-47f9-bcc5-8849490c2b07" = "BasicSelfHostedAppREST"
        "488a57a0-00e2-4817-8c8d-cf8a15a994d2" = "WindowsFormsApplication2.Office365App"
        "11c174dc-1945-4a9a-a36b-c79a0f246b9b" = "AzureApplicationInsights"
        "e6acb561-0d94-4287-bd3a-3169f421b112" = "Tutum"
        "7b77b3a2-8490-49e1-8842-207cd0899af9" = "Nearpod"
        "0000000a-0000-0000-c000-000000000000" = "Microsoft.Intune"
        "93625bc8-bfe2-437a-97e0-3d0060024faa" = "SelfServicePasswordReset"
        "dee7ba80-6a55-4f3b-a86c-746a9231ae49" = "MicrosoftAppPlatEMA"
        "803ee9ca-3f7f-4824-bd6e-0b99d720c35c" = "AzureMediaService"
        "2d4d3d8e-2be3-4bef-9f87-7875a61c29de" = "OneNote"
        "8d40666e-5abf-45f6-a5e7-b7192d6d56ed" = "Workflow"
        "262044b1-e2ce-469f-a196-69ab7ada62d3" = "BackupManagementService"
        "087a2c70-c89e-463f-8dd3-e3959eabb1a9" = "MicrosoftProfileServicePlatformService"
        "7cd684f4-8a78-49b0-91ec-6a35d38739ba" = "AzureLogicApps"
        "c5393580-f805-4401-95e8-94b7a6ef2fc2" = "Office365ManagementAPIs"
        "96231a05-34ce-4eb4-aa6a-70759cbb5e83" = "MicrosoftAzureRedisCache"
        "b8340c3b-9267-498f-b21a-15d5547fd85e" = "Hyper-VRecoveryManager"
        "abfa0a7c-a6b6-4736-8310-5855508787cd" = "Microsoft.Azure.WebSites"
        "c44b4083-3bb0-49c1-b47d-974e53cbdf3c" = "IbizaPortal"
        "905fcf26-4eb7-48a0-9ff0-8dcc7194b5ba" = "Sway"
        "b10686fd-6ba8-49f2-a3cd-67e4d2f52ac8" = "NovoEd"
        "c606301c-f764-4e6b-aa45-7caaaea93c9a" = "OfficeStore"
        "569e8598-685b-4ba2-8bff-5bced483ac46" = "Evercontact"
        "20a23a2f-8c32-4de7-8063-8c8f909602c0" = "Workflow"
        "aaf214cc-8013-4b95-975f-13203ae36039" = "PowerBITiles"
        "d88a361a-d488-4271-a13f-a83df7dd99c2" = "IDMLGraphResolverServiceandCAD"
        "dff9b531-6290-4620-afce-26826a62a4e7" = "DocuSign"
        "01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9" = "DeviceRegistrationService"
        "3290e3f7-d3ac-4165-bcef-cf4874fc4270" = "Smartsheet"
        "a4ee6867-8640-4495-b1fd-8b26037a5bd3" = "Workflow"
        "aa0e3dd4-df02-478d-869e-fc61dd71b6e8" = "Workflow"
        "0f6edad5-48f2-4585-a609-d252b1c52770" = "AIGraphClient"
        "0c8139b5-d545-4448-8d2b-2121bb242680" = "BillingExtension"
        "475226c6-020e-4fb2-8a90-7a972cbfc1d4" = "KratosAppsService"
        "39624784-6cbe-4a60-afbe-9f46d10fdb27" = "SkypeForBusinessRemotePowershell"
        "8bdebf23-c0fe-4187-a378-717ad86f6a53" = "ResourceHealthRP"
        "c161e42e-d4df-4a3d-9b42-e7a3c31f59d4" = "MicrosoftIntuneAPI"
        "9cb77803-d937-493e-9a3b-4b49de3f5a74" = "MicrosoftIntuneServiceDiscovery"
        "ddbf3205-c6bd-46ae-8127-60eb93363864" = "MicrosoftAzureBatch"
        "80ccca67-54bd-44ab-8625-4b79c4dc7775" = "ComplianceCenter"
        "0a5f63c0-b750-4f38-a71c-4fc0d58b89e2" = "MicrosoftMobileApplicationManagement"
        "e1335bb1-2aec-4f92-8140-0e6e61ae77e5" = "CIWebService"
        "75018fbe-21fe-4a57-b63c-83252b5eaf16" = "TeamImprover-TeamOrganizationChart"
        "a393296b-5695-4463-97cb-9fa8638a494a" = "MySharePointSites"
        "fe217466-5583-431c-9531-14ff7268b7b3" = "MicrosoftEducation"
        "5bfe8a29-054e-4348-9e7a-3981b26b125f" = "BingPlacesforBusiness"
        "eaf8a961-f56e-47eb-9ffd-936e22a554ef" = "DevilFish"
        "4b4b1d56-1f03-47d9-a0a3-87d4afc913c9" = "Wunderlist"
        "00000003-0000-0000-c000-000000000000" = "MicrosoftGraph"
        "60e6cd67-9c8c-4951-9b3c-23c25a2169af" = "ComputeResourceProvider"
        "507bc9da-c4e2-40cb-96a7-ac90df92685c" = "Office365Reports"
        "09abbdfd-ed23-44ee-a2d9-a627aa1c90f3" = "ProjectWorkManagement"
        "28ec9756-deaf-48b2-84d5-a623b99af263" = "OfficePersonalAssistantatWorkService"
        "9e4a5442-a5c9-4f6f-b03f-5b9fcaaf24b1" = "OfficeServicesManager"
        "3138fe80-4087-4b04-80a6-8866c738028a" = "SharePointNotificationService"
        "d2a0a418-0aac-4541-82b2-b3142c89da77" = "MicrosoftAzureOperationalInsights"
        "2cf9eb86-36b5-49dc-86ae-9a63135dfa8c" = "AzureTrafficManagerandDNS"
        "32613fc5-e7ac-4894-ac94-fbc39c9f3e4a" = "OAuthSandbox"
        "925eb0d0-da50-4604-a19f-bd8de9147958" = "GroupiesWebService"
        "e4ab13ed-33cb-41b4-9140-6e264582cf85" = "AzureSQLDatabaseBackupToAzureBackupVault"
        "ad230543-afbe-4bb4-ac4f-d94d101704f8" = "ApiaryforPowerBI"
        "11cd3e2e-fccb-42ad-ad00-878b93575e07" = "AutomatedCallDistribution"
        "de17788e-c765-4d31-aba4-fb837cfff174" = "SkypeforBusinessManagementReportingandAnalytics"
        "65d91a3d-ab74-42e6-8a2f-0add61688c74" = "MicrosoftApprovalManagement"
        "5225545c-3ebd-400f-b668-c8d78550d776" = "OfficeAgentService"
        "1cda9b54-9852-4a5a-96d4-c2ab174f9edf" = "O365Account"
        "4747d38e-36c5-4bc3-979b-b0ef74df54d1" = "PushChannel"
        "b97b6bd4-a49f-4a0c-af18-af507d1da76c" = "OfficeShreddingService"
        "d4ebce55-015a-49b5-a083-c84d1797ae8c" = "MicrosoftIntuneEnrollment"
        "5b20c633-9a48-4a5f-95f6-dae91879051f" = "AzureInformationProtection"
        "441509e5-a165-4363-8ee7-bcf0b7d26739" = "EnterpriseAgentPlatform"
        "e691bce4-6612-4025-b94c-81372a99f77e" = "Boomerang"
        "8edd93e1-2103-40b4-bd70-6e34e586362d" = "WindowsAzureSecurityResourceProvider"
        "94c63fef-13a3-47bc-8074-75af8c65887a" = "OfficeDelve"
        "e95d8bee-4725-4f59-910d-94d415da51b9" = "SkypeforBusinessNameDictionaryService"
        "e3c5dbcd-bb5f-4bda-b943-adc7a5bbc65e" = "Workflow"
        "8602e328-9b72-4f2d-a4ae-1387d013a2b3" = "AzureAPIManagement"
        "8b3391f4-af01-4ee8-b4ea-9871b2499735" = "O365SecureScore"
        "c26550d6-bc82-4484-82ca-ac1c75308ca3" = "Office365YammerOnOls"
        "33be1cef-03fb-444b-8fd3-08ca1b4d803f" = "OneDriveWeb"
        "dcad865d-9257-4521-ad4d-bae3e137b345" = "MicrosoftSharePointOnline-SharePointHome"
        "b2cc270f-563e-4d8a-af47-f00963a71dcd" = "OneProfileService"
        "4660504c-45b3-4674-a709-71951a6b0763" = "MicrosoftInvitationAcceptancePortal"
        "ba23cd2a-306c-48f2-9d62-d3ecd372dfe4" = "OfficeGraph"
        "d52485ee-4609-4f6b-b3a3-68b6f841fa23" = "On-PremisesDataGatewayConnector"
        "996def3d-b36c-4153-8607-a6fd3c01b89f" = "Dynamics365forFinancials"
        "b6b84568-6c01-4981-a80f-09da9a20bbed" = "MicrosoftInvoicing"
        "9d3e55ba-79e0-4b7c-af50-dc460b81dca1" = "MicrosoftAzureDataCatalog"
        "4345a7b9-9a63-4910-a426-35363201d503" = "O365SuiteUX"
        "ac815d4a-573b-4174-b38e-46490d19f894" = "Workflow"
        "bb8f18b0-9c38-48c9-a847-e1ef3af0602d" = "Microsoft.Azure.ActiveDirectoryIUX"
        "cc15fd57-2c6c-4117-a88c-83b1d56b4bbe" = "MicrosoftTeamsServices"
        "5e3ce6c0-2b1f-4285-8d4b-75ee78787346" = "SkypeTeams"
        "1fec8e78-bce4-4aaf-ab1b-5451cc387264" = "MicrosoftTeams"
        "6d32b7f8-782e-43e0-ac47-aaad9f4eb839" = "PermissionServiceO365"
        "cdccd920-384b-4a25-897d-75161a4b74c1" = "SkypeTeamsFirehose"
        "1c0ae35a-e2ec-4592-8e08-c40884656fa5" = "SkypeTeamSubstrateconnector"
        "cf6c77f8-914f-4078-baef-e39a5181158b" = "SkypeTeamsSettingsStore"
        "64f79cb9-9c82-4199-b85b-77e35b7dcbcb" = "MicrosoftTeamsBots"
        "b7912db9-aa33-4820-9d4f-709830fdd78f" = "ConnectionsService"
        "82f77645-8a66-4745-bcdf-9706824f9ad0" = "PowerAppsRuntimeService"
        "6204c1d1-4712-4c46-a7d9-3ed63d992682" = "MicrosoftFlowPortal"
        "7df0a125-d3be-4c96-aa54-591f83ff541c" = "MicrosoftFlowService"
        "331cc017-5973-4173-b270-f0042fddfd75" = "PowerAppsService"
        "0a0e9e37-25e3-47d4-964c-5b8237cad19a" = "CloudSponge"
        "df09ff61-2178-45d8-888c-4210c1c7b0b2" = "O365UAPProcessor"
        "8338dec2-e1b3-48f7-8438-20c30a534458" = "ViewPoint"
        "00000001-0000-0000-c000-000000000000" = "AzureESTSService"
        "394866fc-eedb-4f01-8536-3ff84b16be2a" = "MicrosoftPeopleCardsService"
        "0a0a29f9-0a25-49c7-94bf-c53c3f8fa69d" = "CortanaExperiencewithO365"
        "bb2a2e3a-c5e7-4f0a-88e0-8e01fd3fc1f4" = "CPIMService"
        "0004c632-673b-4105-9bb6-f3bbd2a927fe" = "PowerAppsandFlow"
        "d3ce4cf8-6810-442d-b42e-375e14710095" = "GraphExplorer"
        "3aa5c166-136f-40eb-9066-33ac63099211" = "O365CustomerMonitoring"
        "d6fdaa33-e821-4211-83d0-cf74736489e1" = "MicrosoftServiceTrust"
        "ef4a2a24-4b4e-4abf-93ba-cc11c5bd442c" = "Edmodo"
        "b692184e-b47f-4706-b352-84b288d2d9ee" = "Microsoft.MileIQ.RESTService"
        "a25dbca8-4e60-48e5-80a2-0664fdb5c9b6" = "Microsoft.MileIQ"
        "f7069a8d-9edc-4300-b365-ae53c9627fc4" = "Microsoft.MileIQ.Dashboard"
        "02e3ae74-c151-4bda-b8f0-55fbf341de08" = "ApplicationRegistrationPortal"
        "1f5530b3-261a-47a9-b357-ded261e17918" = "AzureMulti-FactorAuthConnector"
        "981f26a1-7f43-403b-a875-f8b09b8cd720" = "AzureMulti-FactorAuthClient"
        "6ea8091b-151d-447a-9013-6845b83ba57b" = "ADHybridHealth"
        "fc68d9e5-1f76-45ef-99aa-214805418498" = "AzureADIdentityProtection"
        "01fc33a7-78ba-4d2f-a4b7-768e336e890e" = "MS-PIM"
        "a6aa9161-5291-40bb-8c5c-923b567bee3b" = "StorageResourceProvider"
        "4e9b8b9a-1001-4017-8dd1-6e8f25e19d13" = "AdobeAcrobat"
        "159b90bb-bb28-4568-ad7c-adad6b814a2f" = "LastPass"
        "b4bddae8-ab25-483e-8670-df09b9f1d0ea" = "Signup"
        "aa580612-c342-4ace-9055-8edee43ccb89" = "MicrosoftStaffHub"
        "51133ff5-8e0d-4078-bcca-84fb7f905b64" = "MicrosoftTeamsMailhook"
        "ab3be6b7-f5df-413d-ac2d-abf1e3fd9c0b" = "MicrosoftTeamsGraphService"
        "b1379a75-ce5e-4fa3-80c6-89bb39bf646c" = "MicrosoftTeamsChatAggregator"
        "48af08dc-f6d2-435f-b2a7-069abd99c086" = "Connectors"
        "d676e816-a17b-416b-ac1a-05ad96f43686" = "Workflow"
        "cfa8b339-82a2-471a-a3c9-0fc0be7a4093" = "AzureKeyVault"
        "c2f89f53-3971-4e09-8656-18eed74aee10" = "calendly"
        "6da466b6-1d13-4a2c-97bd-51a99e8d4d74" = "ExchangeOfficeGraphClientforAAD-Interactive"
        "0eda3b13-ddc9-4c25-b7dd-2f6ea073d6b7" = "MicrosoftFlowCDSIntegrationService"
        "eacba838-453c-4d3e-8c6a-eb815d3469a3" = "MicrosoftFlowCDSIntegrationServiceTIP1"
        "4ac7d521-0382-477b-b0f8-7e1d95f85ca2" = "SQLServerAnalysisServicesAzure"
        "b4114287-89e4-4209-bd99-b7d4919bcf64" = "OfficeDelve"
        "4580fd1d-e5a3-4f56-9ad1-aab0e3bf8f76" = "CallRecorder"
        "a855a166-fd92-4c76-b60d-a791e0762432" = "MicrosoftTeamsVSTS"
        "c37c294f-eec8-47d2-b3e2-fc3daa8f77d3" = "Workflow"
        "fc75330b-179d-49af-87dd-3b1acf6827fa" = "AzureAutomationAADPatchS2S"
        "766d89a4-d6a6-444d-8a5e-e1a18622288a" = "OneDrive"
        "f16c4a38-5aff-4549-8199-ee7d3c5bd8dc" = "Workflow"
        "4c4f550b-42b2-4a16-93f9-fdb9e01bb6ed" = "TargetedMessagingService"
        "765fe668-04e7-42ba-aec0-2c96f1d8b652" = "ExchangeOfficeGraphClientforAAD-Noninteractive"
        "0130cc9f-7ac5-4026-bd5f-80a08a54e6d9" = "AzureDataWarehousePolybase"
        "a1cf9e0a-fe14-487c-beb9-dd3360921173" = "Meetup"
        "76cd24bf-a9fc-4344-b1dc-908275de6d6d" = "AzureSQLVirtualNetworktoNetworkResourceProvider"
        "9f505dbd-a32c-4685-b1c6-72e4ef704cb0" = "AmazonAlexa"
        "1e2ca66a-c176-45ea-a877-e87f7231e0ee" = "MicrosoftB2BAdminWorker"
        "2634dd23-5e5a-431c-81ca-11710d9079f4" = "MicrosoftStreamService"
        "cf53fce8-def6-4aeb-8d30-b158e7b1cf83" = "MicrosoftStreamPortal"
        "c9a559d2-7aab-4f13-a6ed-e7e9c52aec87" = "MicrosoftForms"
        "978877ea-b2d6-458b-80c7-05df932f3723" = "MicrosoftTeamsAuditService"
        "dbc36ae1-c097-4df9-8d94-343c3d091a76" = "ServiceEncryption"
        "fa7ff576-8e31-4a58-a5e5-780c1cd57caa" = "OneNote"
        "cb4dc29f-0bf4-402a-8b30-7511498ed654" = "PowerBIPremium"
        "f5aeb603-2a64-4f37-b9a8-b544f3542865" = "MicrosoftTeamsRetentionHookService"
        "da109bdd-abda-4c06-8808-4655199420f8" = "GlipContacts"
        "76c7f279-7959-468f-8943-3954880e0d8c" = "AzureSQLManagedInstancetoMicrosoft.Network"
        "3a9ddf38-83f3-4ea1-a33a-ecf934644e2d" = "ProtectedMessageViewer"
        "5635d99c-c364-4411-90eb-764a511b5fdf" = "ResponsiveBannerSlider"
        "a43e5392-f48b-46a4-a0f1-098b5eeb4757" = "Cloudsponge"
        "d73f4b35-55c9-48c7-8b10-651f6f2acb2e" = "MCAPIAuthorizationProd"
        "166f1b03-5b19-416f-a94b-1d7aa2d247dc" = "OfficeHive"
        "b815ce1c-748f-4b1e-9270-a42c1fa4485a" = "Workflow"
        "bd7b778b-4aa8-4cde-8d90-8aeb821c0bd2" = "Workflow"
        "9d06afd9-66c9-49a6-b385-ea7509332b0b" = "O365SBRMService"
        "9ea1ad79-fdb6-4f9a-8bc3-2b70f96e34c7" = "Bing"
        "57fb890c-0dab-4253-a5e0-7188c88b2bb4" = "SharePointOnlineClient"
        "45c10911-200f-4e27-a666-9e9fca147395" = "drawio"
        "b73f62d0-210b-4396-a4c5-ea50c4fab79b" = "SkypeBusinessVoiceFraudDetectionandPrevention"
        "bc59ab01-8403-45c6-8796-ac3ef710b3e3" = "OutlookOnlineAdd-inApp"
        "035f9e1d-4f00-4419-bf50-bf2d87eb4878" = "AzureMonitorRestricted"
        "7c33bfcb-8d33-48d6-8e60-dc6404003489" = "NetworkWatcher"
        "a0be0c72-870e-46f0-9c49-c98333a996f7" = "AzureDnsFrontendApp"
        "1e3e4475-288f-4018-a376-df66fd7fac5f" = "NetworkTrafficAnalyticsService"
        "7557eb47-c689-4224-abcf-aef9bd7573df" = "SkypeforBusiness"
        "c39c9bac-9d1f-4dfb-aa29-27f6365e5cb7" = "AzureAdvisor"
        "2087bd82-7206-4c0a-b305-1321a39e5926" = "MicrosoftTo-Do"
        "f8d98a96-0999-43f5-8af3-69971c7bb423" = "iOSAccounts"
        "c27373d3-335f-4b45-8af9-fe81c240d377" = "P2PServer"
        "5c2ffddc-f1d7-4dc3-926e-3c1bd98e32bd" = "RITSDev"
        "982bda36-4632-4165-a46a-9863b1bbcf7d" = "O365Demeter"
        "98c8388a-4e86-424f-a176-d1288462816f" = "OfficeFeedProcessors"
        "bf9fc203-c1ff-4fd4-878b-323642e462ec" = "JarvisTransactionService"
        "257601fd-462f-4a21-b623-7f719f0f90f4" = "CentralizedDeployment"
        "2a486b53-dbd2-49c0-a2bc-278bdfc30833" = "CortanaatWorkService"
        "22d7579f-06c2-4baa-89d2-e844486adb9d" = "CortanaatWorkBingServices"
        "4c8f074c-e32b-4ba7-b072-0f39d71daf51" = "IPSubstrate"
        "a164aee5-7d0a-46bb-9404-37421d58bdf7" = "MicrosoftTeamsAuthSvc"
        "354b5b6d-abd6-4736-9f51-1be80049b91f" = "MicrosoftMobileApplicationManagementBackend"
        "82b293b2-d54d-4d59-9a95-39c1c97954a7" = "TasksinaBox"
        "fdc83783-b652-4258-a622-66bc85f1a871" = "FedExPackageTracking"
        "d0597157-f0ae-4e23-b06c-9e65de434c4f" = "MicrosoftTeamsTaskService"
        "f5c26e74-f226-4ae8-85f0-b4af0080ac9e" = "ApplicationInsightsAPI"
        "57c0fc58-a83a-41d0-8ae9-08952659bdfd" = "AzureCosmosDBVirtualNetworkToNetworkResourceProvider"
        "744e50be-c4ff-4e90-8061-cd7f1fabac0b" = "LinkedInMicrosoftGraphConnector"
        "823dfde0-1b9a-415a-a35a-1ad34e16dd44" = "MicrosoftTeamsWikiImagesMigration"
        "3ab9b3bc-762f-4d62-82f7-7e1d653ce29f" = "MicrosoftVolumeLicensing"
        "44eb7794-0e11-42b6-800b-dc31874f9f60" = "Alignable"
        "c58637bb-e2e1-4312-8a00-04b5ffcd3403" = "SharePointOnlineClientExtensibility"
        "62b732f7-fc71-40bc-b27d-35efcb0509de" = "MicrosoftTeamsAadSync"
        "07978fee-621a-42df-82bb-3eabc6511c26" = "SurveyMonkey"
        "47ee738b-3f1a-4fc7-ab11-37e4822b007e" = "AzureADApplicationProxy"
        "00000007-0000-0000-c000-000000000000" = "DynamicsCRMOnline"
        "913c6de4-2a4a-4a61-a9ce-945d2b2ce2e0" = "DynamicsLifecycleservices"
        "f217ad13-46b8-4c5b-b661-876ccdf37302" = "AttachOneDrivefilestoAsana"
        "00000008-0000-0000-c000-000000000000" = "Microsoft.Azure.DataMarket"
        "9b06ebd4-9068-486b-bdd2-dac26b8a5a7a" = "Microsoft.DynamicsMarketing"
        "e8ab36af-d4be-4833-a38b-4d6cf1cfd525" = "MicrosoftSocialEngagement"
        "8909aac3-be91-470c-8a0b-ff09d669af91" = "MicrosoftParatureDynamicsCRM"
        "71234da4-b92f-429d-b8ec-6e62652e50d7" = "MicrosoftCustomerEngagementPortal"
        "b861dbcc-a7ef-4219-a005-0e4de4ea7dcf" = "DataExportServiceforMicrosoftDynamics365"
        "2db8cb1d-fb6c-450b-ab09-49b6ae35186b" = "MicrosoftDynamicsCRMLearningPath"
        "2e49aa60-1bd3-43b6-8ab6-03ada3d9f08b" = "DynamicsDataIntegration"
        "d1ddf0e4-d672-4dae-b554-9d5bdfd93547" = "Microsoft Intune Powershell"
    }
   

    #Gather Raw Data
    # Get Conditional Access Policies
    $conditionalAccessPolicies = Get-AzureADMSConditionalAccessPolicy -ErrorAction Stop
    #Get Conditional Access Named / Trusted Locations
    $namedLocations = Get-AzureADMSNamedLocationPolicy -ErrorAction Stop
    # Get Azure AD Directory Role Templates
    $directoryRoleTemplates = Get-AzureADDirectoryRoleTemplate -ErrorAction Stop
    # Init report
    $conditionalAccessDocumentation = @()

    # Process all Conditional Access Policies
    foreach ($conditionalAccessPolicy in $conditionalAccessPolicies) {

        # Display some progress (based on policy count)
        $currentIndex = $conditionalAccessPolicies.indexOf($conditionalAccessPolicy)
        Write-Progress -Activity "Generating Conditional Access Documentation..." -PercentComplete (($currentIndex + 1) / $conditionalAccessPolicies.Count * 100) `
            -CurrentOperation "Processing Policy '$($conditionalAccessPolicy.DisplayName)' ($currentIndex/$($conditionalAccessPolicies.Count))"

        try {
            # Resolve object ID's of included users
            $includeUsers = @()
            $conditionalAccessPolicy.Conditions.Users.IncludeUsers | ForEach-Object {
                if (Test-Guid $PSItem) {
                    #$includeUsers += Get-MgUser -userId $PSItem | Select-Object -ExpandProperty DisplayName -ErrorAction Stop
                    $includeUsers += Get-AzureADObjectByObjectId -ObjectIds $PSItem | Select-Object -ExpandProperty DisplayName -ErrorAction Stop
                }
                else {
                    $includeUsers += $PSItem
                }
            }
            # Resolve object ID's of excluded users
            $excludeUsers = @()
            $conditionalAccessPolicy.Conditions.Users.ExcludeUsers | ForEach-Object {
                if (Test-Guid $PSItem) {
                    $excludeUsers += Get-AzureADObjectByObjectId -ObjectIds $PSItem | Select-Object -ExpandProperty DisplayName -ErrorAction Stop
                }
                else {
                    $excludeUsers += $PSItem
                }
            }
            # Resolve object ID's of included groups
            $includeGroups = @()
            $conditionalAccessPolicy.Conditions.Users.IncludeGroups | ForEach-Object {
                $includeGroups += Get-AzureADObjectByObjectId -ObjectIds $PSItem | Select-Object -ExpandProperty DisplayName -ErrorAction Stop
            }
            # Resolve object ID's of excluded groups
            $excludeGroups = @()
            $conditionalAccessPolicy.Conditions.Users.ExcludeGroups | ForEach-Object {
                $excludeGroups += Get-AzureADObjectByObjectId -ObjectIds $PSItem | Select-Object -ExpandProperty DisplayName -ErrorAction Stop
            }
            # Resolve object ID's of included roles
            $includeRoles = @()
            $conditionalAccessPolicy.Conditions.Users.IncludeRoles | ForEach-Object {
                $roleId = $PSItem
                $includeRoles += $directoryRoleTemplates | Where-Object { $PSItem.Id -eq $roleId } | Select-Object -ExpandProperty DisplayName
            }
            # Replace role display names if all selected
            $maxRoles = 56
            if ($includeRoles.Count -eq $maxRoles) {
                $includeRoles = "All ($maxRoles)"
            }
            # Resolve object ID's of excluded roles
            $excludeRoles = @()
            $conditionalAccessPolicy.Conditions.Users.ExcludeRoles | ForEach-Object {
                $roleId = $PSItem
                $excludeRoles += $directoryRoleTemplates | Where-Object { $PSItem.Id -eq $roleId } | Select-Object -ExpandProperty DisplayName
            }
            # Resolve object ID's of included apps
            $includeApps = @()
            $conditionalAccessPolicy.Conditions.Applications.IncludeApplications | ForEach-Object {
                $servicePrincipalId = $PSItem
                if (Test-Guid $PSItem) {
                    $res = $lookupTable[$servicePrincipalId]
                    
                    if ($null -ne $res) {
                        $includeApps += $res
                    }
                    else {
                        $res = Get-AzureADApplication -Filter "AppID eq '$PSItem'" | Select-Object -ExpandProperty DisplayName

                        if ($null -ne $res) {
                            $includeApps += $res
                        }
                        else {
                            $includeApps += $servicePrincipalId
                        }
                    }
                }
                else {
                    $includeApps += $servicePrincipalId
                }
            }
            # Resolve object ID's of excluded apps
            $excludeApps = @()
            $conditionalAccessPolicy.Conditions.Applications.ExcludeApplications | ForEach-Object {
                $servicePrincipalId = $PSItem
                if (Test-Guid $PSItem) {
                    $res = $lookupTable[$servicePrincipalId]
                    
                    if ($null -ne $res) {
                        $excludeApps += $res
                    }
                    else {
                        $res = Get-AzureADApplication -Filter "AppID eq '$PSItem'" | Select-Object -ExpandProperty DisplayName

                        if ($null -ne $res) {
                            $excludeApps += $res
                        }
                        else {
                            $excludeApps += $servicePrincipalId
                        }
                    }
                }
                else {
                    $excludeApps += $servicePrincipalId
                }
            }
            # Resolve object ID's of included locations
            $includeLocations = @()
            $conditionalAccessPolicy.Conditions.Locations.IncludeLocations | ForEach-Object {
                $locationId = $PSItem
                if (Test-Guid $PSItem) {
                    $includeLocations += $namedLocations | Where-Object { $PSItem.Id -eq $locationId } | Select-Object -ExpandProperty DisplayName
                }
                else {
                    $includeLocations += $locationId
                }
            }
            # Resolve object ID's of excluded locations
            $excludeLocations = @()
            $conditionalAccessPolicy.Conditions.Locations.ExcludeLocations | ForEach-Object {
                $locationId = $PSItem
                if (Test-Guid $PSItem) {
                    $excludeLocations += $namedLocations | Where-Object { $PSItem.Id -eq $locationId } | Select-Object -ExpandProperty DisplayName
                }
                else {
                    $excludeLocations += $locationId
                }
            }

            # delimiter for arrays in csv report
            $separator = "`r`n"

            # Build custom object with properties
            $entry = [PSCustomObject]@{

                Name                            = $conditionalAccessPolicy.DisplayName
                State                           = $conditionalAccessPolicy.State

                IncludeUsers                    = $includeUsers -join $separator
                IncludeGroups                   = $includeGroups -join $separator
                IncludeRoles                    = $includeRoles -join $separator

                ExcludeUsers                    = $excludeUsers -join $separator
                ExcludeGroups                   = $excludeGroups -join $separator
                ExcludeRoles                    = $excludeRoles -join $separator

                IncludeApps                     = $includeApps -join $separator
                ExcludeApps                     = $excludeApps -join $separator

                IncludeUserActions              = $conditionalAccessPolicy.Conditions.Applications.IncludeUserActions -join $separator
                ClientAppTypes                  = $conditionalAccessPolicy.Conditions.ClientAppTypes -join $separator

                IncludePlatforms                = $conditionalAccessPolicy.Conditions.Platforms.IncludePlatforms -join $separator
                ExcludePlatforms                = $conditionalAccessPolicy.Conditions.Platforms.ExcludePlatforms -join $separator

                IncludeLocations                = $includeLocations -join $separator
                ExcludeLocations                = $excludeLocations -join $separator

                IncludeDeviceStates             = $conditionalAccessPolicy.Conditions.Devices.IncludeDeviceStates -join $separator
                ExcludeDeviceStates             = $conditionalAccessPolicy.Conditions.Devices.ExcludeDeviceStates -join $separator

                GrantControls                   = $conditionalAccessPolicy.GrantControls.BuiltInControls -join $separator
                GrantControlsOperator           = $conditionalAccessPolicy.GrantControls.Operator

                SignInRiskLevels                = $conditionalAccessPolicy.Conditions.SignInRiskLevels -join $separator
                UserRiskLevels                  = $conditionalAccessPolicy.Conditions.UserRiskLevels -join $separator

                ApplicationEnforcedRestrictions = $conditionalAccessPolicy.SessionControls.ApplicationEnforcedRestrictions.IsEnabled
                CloudAppSecurity                = $conditionalAccessPolicy.SessionControls.CloudAppSecurity.IsEnabled
                PersistentBrowser               = $conditionalAccessPolicy.SessionControls.PersistentBrowser.Mode
                SignInFrequency                 = "$($conditionalAccessPolicy.SessionControls.SignInFrequency.Value) $($conditionalAccessPolicy.SessionControls.SignInFrequency.Type)"
            }
            # Add entry to report
            $conditionalAccessDocumentation += $entry
        }
        catch {
            Write-Error $PSItem
        }
    }

    # Export report as csv
    $conditionalAccessDocumentation | Export-Csv -Path $ExportPath -NoTypeInformation -Force

    Write-Output "Exported Documentation to '$($ExportPath)'"

    if(!$Outpath){
        Invoke-Item $ExportPath

    }

}