<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>who changed a ca policy Archives - the Sysadmin Channel</title>
	<atom:link href="https://thesysadminchannel.com/tag/who-changed-a-ca-policy/feed/" rel="self" type="application/rss+xml" />
	<link>https://thesysadminchannel.com/tag/who-changed-a-ca-policy/</link>
	<description>Documenting My Life as a System Administrator</description>
	<lastBuildDate>Thu, 07 Apr 2022 16:12:43 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>
<site xmlns="com-wordpress:feed-additions:1">144174110</site>	<item>
		<title>Get Azure Conditional Access Policy Changes using PowerShell</title>
		<link>https://thesysadminchannel.com/get-azure-conditional-access-policy-changes-using-powershell/</link>
					<comments>https://thesysadminchannel.com/get-azure-conditional-access-policy-changes-using-powershell/#comments</comments>
		
		<dc:creator><![CDATA[Paul Contreras]]></dc:creator>
		<pubDate>Mon, 04 Apr 2022 04:30:54 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Powershell]]></category>
		<category><![CDATA[ca policy change audit]]></category>
		<category><![CDATA[Conditional Access Policy Changes]]></category>
		<category><![CDATA[who changed a ca policy]]></category>
		<guid isPermaLink="false">https://thesysadminchannel.com/?p=4010</guid>

					<description><![CDATA[<p>I always find it very helpful to be able to use Powershell to automate whatever task needs automating. Knowing how to automate is truly one of the most versatile skills you can have as a Systems Engineer and today I&#8217;m&#8230; <a href="https://thesysadminchannel.com/get-azure-conditional-access-policy-changes-using-powershell/" class="more-link">Continue Reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://thesysadminchannel.com/get-azure-conditional-access-policy-changes-using-powershell/">Get Azure Conditional Access Policy Changes using PowerShell</a> appeared first on <a href="https://thesysadminchannel.com">the Sysadmin Channel</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>I always find it very helpful to be able to use Powershell to automate whatever task needs automating.  Knowing how to automate is truly one of the most versatile skills you can have as a Systems Engineer and today I&#8217;m going to share a script I wrote to be able to <strong>get azure conditional access policy changes using Powershell</strong>. This script uses Azure Log Analytics in the backend to track the changes/modified properties.<br />
&nbsp;</p>
<p>What I love most about this script is that it provides a clear understanding as to who updated the policy, what high level changes were made and probably more importantly, the exact timestamp of when these changes were applied.  This will help troubleshoot any issues that may come after a policy was recently changed.<br />
&nbsp;</p>
<p>Let&#8217;s take a look at all the components that are needed to make this work as expected. Feel free to navigate to any portions of the article using the table of contents below.</p>
<div id="tableofcontents">
<h2>Table Of Contents</h2>
<ul>
<li><a href="#requirements">Requirements</a></li>
<li><a href="#powershellscript">Get Azure Conditional Access Policy Changes using PowerShell</a></li>
<ul>
<li><a href="#parameters">Script Parameters</a></li>
<li><a href="#examples">Examples and Usage</a></li>
</ul>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
</div>
<div id="requirements" style="scroll-margin-top: 15px;"></div>
<h2>Requirements</h2>
<p>I realize there are Azure alerts to notify you of any changes that are made, but the email that it sends would be a bit more helpful if there were a way to modify the contents of it.  This method can also be useful for those that like to use Powershell scripts in a workflow, but whatever the use case is, I think this would a great tool in your Powershell arsenal. With that said, let&#8217;s get into the requirements needed.<br />
&nbsp;</p>
<ul>
<li>Azure AD P1/P2 license</li>
<ul>
<li>Conditional access and Log Analytics require Azure premium licenses</li>
</ul>
<li>Az Powershell Module</li>
<li>Azure Log Analytics properly setup with AuditLogs sending to the workspace</li>
<ul>
<li>The Log Analytics Workspace ID you want to query</li>
</ul>
<li>Global Administrator or Security Administrator</li>
</ul>
<p>&nbsp;</p>
<div id="blockquote1">
<strong>Note:</strong> This script has a dependency for Azure Log Analytics. If you need help getting everything setup, or want to know how to get your Workspace ID, be sure to check out <a href="https://thesysadminchannel.com/query-log-analytics-via-powershell/" rel="noopener" target="_blank">How to query Log Analytics via Powershell</a>. It will walk through everything step by step.
</div>
<div id="powershellscript" style="scroll-margin-top: 15px;"></div>
<h2>Get Azure Conditional Access Policy Changes using PowerShell</h2>
<p>Now that we have the pre-requisites out of the way, let&#8217;s go ahead and dive in to the Powershell script itself.  Since I only use 1 tenant with a single Workspace ID, I&#8217;ve defaulted the Workspace ID in the script itself. This helps so I don&#8217;t have to get that information every time I want to check something, it&#8217;s just readily available.</p>
<pre class="brush: powershell; title: ; notranslate">

Function Get-ConditionalAccessChange {
&lt;#
.SYNOPSIS
    This will display any conditional access changes over a specified amount of time.

.NOTES
    Name: Get-ConditionalAccessChange
    Author: theSysadminChannel
    Version: 2.0
    DateCreated: 2022-Mar-3

.LINK
    https://thesysadminchannel.com/get-azure-conditional-access-policy-changes-using-powershell/ -    

#&gt;

    [CmdletBinding()]

    param(
        [Parameter(
            Mandatory = $false,
            Position = 0
        )]
        [int]    $DaysFromToday = 1,


        [Parameter(
            Mandatory = $false,
            Position = 1
        )]
        [string]    $WorkSpaceId = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',


        [Parameter(
            Mandatory = $false
        )]
        [ValidateSet('CreatePolicy', 'UpdatePolicy', 'DeletePolicy')]
        [string[]]    $Operation,


        [Parameter(
            Mandatory = $false
        )]
        [switch]    $FlatObject
    )

    BEGIN {
        $SessionInfo = Get-AzContext -ErrorAction Stop

    }

    PROCESS {
        try {
            $Query = &quot;AuditLogs
                | where TimeGenerated &gt; ago($($DaysFromToday)d)
                | where OperationName contains 'conditional access policy'
                | extend PolicyName = tostring(TargetResources[0].displayName)
                | extend InitiatedByUser = tostring(parse_json(tostring(InitiatedBy.user)).userPrincipalName)
                | extend UserId = tostring(parse_json(tostring(InitiatedBy.user)).id)
                | extend Modifiedproperties = tostring(TargetResources[0].modifiedProperties)
                | extend NewValue = tostring(parse_json(tostring(parse_json(Modifiedproperties)[0].newValue)))
                | extend OldValue = tostring(parse_json(tostring(parse_json(Modifiedproperties)[0].oldValue)))
                | project TimeGenerated, PolicyName, OperationName, InitiatedByUser, OldValue, NewValue, UserId
                | order by TimeGenerated&quot;

            $ResultList = Invoke-AzOperationalInsightsQuery -WorkspaceId $WorkspaceId -Query $Query -ErrorAction Stop | select -ExpandProperty Results


            foreach ($Result in $ResultList) {
                $OldState = $Result.OldValue | ConvertFrom-Json | select -ExpandProperty State
                $NewState = $Result.NewValue | ConvertFrom-Json | select -ExpandProperty State

                if ($OldState -eq 'enabledForReportingButNotEnforced') {
                    $OldState = 'reportOnly'
                }

                if ($NewState -eq 'enabledForReportingButNotEnforced') {
                    $NewState = 'reportOnly'
                }

                $OldConditions = $Result.OldValue | ConvertFrom-Json | select -ExpandProperty conditions
                $NewConditions = $Result.NewValue | ConvertFrom-Json | select -ExpandProperty conditions

                if ($Result.OperationName -eq 'Update conditional access policy') {
                    $ChangesMade = New-Object -TypeName 'System.Collections.ArrayList'
                    $PropertyList = New-Object -TypeName 'System.Collections.ArrayList'

                    $OldConditions | Get-Member -MemberType 'NoteProperty' | select -ExpandProperty Name | ForEach-Object {$PropertyList.Add($_) | Out-Null}
                    $NewConditions | Get-Member -MemberType 'NoteProperty' | select -ExpandProperty Name | ForEach-Object {$PropertyList.Add($_) | Out-Null}

                    $PropertyList = $PropertyList | select -Unique

                    foreach ($Property in $PropertyList) {
                        $SubPropertyList = New-Object -TypeName 'System.Collections.ArrayList'

                        $OldConditions.$($Property) | Get-Member -MemberType 'NoteProperty' -ErrorAction SilentlyContinue | select -ExpandProperty Name | ForEach-Object {$SubPropertyList.Add($_) | Out-Null}
                        $NewConditions.$($Property) | Get-Member -MemberType 'NoteProperty' -ErrorAction SilentlyContinue | select -ExpandProperty Name | ForEach-Object {$SubPropertyList.Add($_) | Out-Null}

                        $SubPropertyList = $SubPropertyList | select -Unique

                        foreach ($SubProperty in $SubPropertyList) {
                            $Compare = Compare-Object -ReferenceObject @($OldConditions.$($Property) | select -ExpandProperty $SubProperty) -DifferenceObject @($NewConditions.$($Property) | select -ExpandProperty $SubProperty) -ErrorAction SilentlyContinue
                            if ($Compare) {
                               $ChangesMade.Add($SubProperty) | Out-Null
                            }

                            switch ($SubProperty) {
                                'includeApplications' {
                                    $includeApplicationsAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $includeApplicationsRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'excludeApplications' {
                                    $excludeApplicationsAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $excludeApplicationsRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'includeUserActions' {
                                    $includeUserActionsAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $includeUserActionsRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'includeAuthenticationContextClassReferences' {
                                    $IncludeAuthContextAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $IncludeAuthContextRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'applicationFilter' {
                                    $applicationFilterAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $applicationFilterRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'excludeGroups' {
                                    $excludeGroupsAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $excludeGroupsRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'excludeRoles' {
                                    $excludeRolesAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $excludeRolesRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'excludeUsers' {
                                    $excludeUsersAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $excludeUsersRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'includeGroups' {
                                    $includeGroupsAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $includeGroupsRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                'includeRoles' {
                                    $includeRolesAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $includeRolesRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }
                                'includeUsers' {
                                    $includeUsersAdd    = $Compare | Where-Object {$_.SideIndicator -eq '=&gt;'} | select -ExpandProperty InputObject
                                    $includeUsersRemove = $Compare | Where-Object {$_.SideIndicator -eq '&lt;='} | select -ExpandProperty InputObject
                                }

                                default {$null}
                            }

                            Remove-Variable compare -ErrorAction SilentlyContinue

                        }
                    }                    

                    if ($OldState -ne $NewState) {
                        $ChangesMade.Add(&quot;ChangedState&quot;) | Out-Null
                        $ChangedState = &quot;$OldState =&gt; $NewState&quot;
                    }

                    $ChangesMade = ($ChangesMade | select -Unique) -join ', '
                    $OperationName   = 'UpdatePolicy'
                } #end Update policy block

                
                if ($Result.OperationName -eq 'Add conditional access policy') {
                    $ChangesMade = 'Policy created'
                    $OperationName   = 'CreatePolicy'
                    $ChangedState = &quot;null =&gt; $NewState&quot;
                }

                if ($Result.OperationName -eq 'Delete conditional access policy') {
                    $ChangesMade = 'Policy deleted'
                    $OperationName   = 'DeletePolicy'
                    $ChangedState = &quot;$OldState =&gt; null&quot;
                }
              

                if ($PSBoundParameters.ContainsKey('FlatObject')) {
                    #Each property has its own add and remove subproperty in the object
                    $ObjectOutput = [PSCustomObject]@{
                        TimeGenerated              = Get-Date ($Result.TimeGenerated) -Format g
                        PolicyName                 = $Result.PolicyName
                        Operation                  = $OperationName
                        InitiatedByUser            = $Result.InitiatedByUser.Split('@')[0]
                        ChangesMade                = $ChangesMade
                        State                      = $NewState
                        ChangedState               = $ChangedState
                        IncludeApplicationsAdded   = $includeApplicationsAdd
                        IncludeApplicationsRemoved = $includeApplicationsRemove
                        IncludeUserActionsAdded    = $includeUserActionsAdd
                        IncludeUserActionsRemoved  = $includeUserActionsRemove
                        IncludeGroupsAdded         = $includeGroupsAdd
                        IncludeGroupsRemoved       = $includeGroupsRemove
                        IncludeRolesAdded          = $includeRolesAdd
                        IncludeRolesRemoved        = $includeRolesRemove
                        IncludeUsersAdded          = $includeUsersAdd
                        IncludeUsersRemoved        = $includeUsersRemove
                        IncludeAuthContextAdded    = $IncludeAuthContextAdd
                        IncludeAuthContextRemoved  = $IncludeAuthContextRemove
                        ExcludeApplicationsAdded   = $excludeApplicationsAdd
                        ExcludeApplicationsRemoved = $excludeApplicationsRemove
                        ExcludeGroupsAdded         = $excludeGroupsAdd
                        ExcludeGroupsRemoved       = $excludeGroupsRemove
                        ExcludeRolesAdded          = $excludeRolesAdd
                        ExcludeRolesRemoved        = $excludeRolesRemove
                        ExcludeUsersAdded          = $excludeUsersAdd
                        ExcludeUsersRemoved        = $excludeUsersRemove
                        AppFilterAdded             = $applicationFilterAdd
                        AppFilterRemoved           = $applicationFilterRemove
                    }
                } else {
                    #Each add and remove subproperty is nested under the corresponding property. 
                    #I could not decide what would be better/more convenient so I did both :)
                    
                    $ObjectOutput = [PSCustomObject]@{
                        TimeGenerated              = Get-Date ($Result.TimeGenerated) -Format g
                        PolicyName                 = $Result.PolicyName
                        Operation                  = $OperationName
                        InitiatedByUser            = $Result.InitiatedByUser.Split('@')[0]
                        ChangesMade                = $ChangesMade
                        State                      = $NewState
                        ChangedState               = $ChangedState
                        IncludeApplications        = [PSCustomObject]@{'Added' = $includeApplicationsAdd ; 'Removed' = $includeApplicationsRemove}
                        IncludeUserActions         = [PSCustomObject]@{'Added' = $includeUserActionsAdd  ; 'Removed' = $includeUserActionsRemove}
                        IncludeGroups              = [PSCustomObject]@{'Added' = $includeGroupsAdd       ; 'Removed' = $includeGroupsRemove}
                        IncludeRoles               = [PSCustomObject]@{'Added' = $includeRolesAdd        ; 'Removed' = $includeRolesRemove}
                        IncludeUsers               = [PSCustomObject]@{'Added' = $includeUsersAdd        ; 'Removed' = $includeUsersRemove}
                        IncludeAuthContext         = [PSCustomObject]@{'Added' = $IncludeAuthContextAdd  ; 'Removed' = $IncludeAuthContextRemove}
                        ExcludeApplications        = [PSCustomObject]@{'Added' = $excludeApplicationsAdd ; 'Removed' = $excludeApplicationsRemove}
                        ExcludeGroups              = [PSCustomObject]@{'Added' = $excludeGroupsAdd       ; 'Removed' = $excludeGroupsRemove}
                        ExcludeRoles               = [PSCustomObject]@{'Added' = $excludeRolesAdd        ; 'Removed' = $excludeRolesRemove}
                        ExcludeUsers               = [PSCustomObject]@{'Added' = $excludeUsersAdd        ; 'Removed' = $excludeUsersRemove}
                        AppFilter                  = [PSCustomObject]@{'Added' = $applicationFilterAdd   ; 'Removed' = $applicationFilterRemove}
                    }
                }

                if ($PSBoundParameters.ContainsKey('Operation')) {
                    $ObjectOutput | Where-Object {$_.Operation -in $Operation}
                  } else {
                    $ObjectOutput
                }

                #Clear variables before next run
                Remove-Variable OperationName -ErrorAction SilentlyContinue
                Remove-Variable ChangesMade   -ErrorAction SilentlyContinue
                Remove-Variable NewState      -ErrorAction SilentlyContinue
                Remove-Variable ChangedState  -ErrorAction SilentlyContinue
                Remove-Variable include*      -ErrorAction SilentlyContinue
                Remove-Variable exclude*      -ErrorAction SilentlyContinue
                Remove-Variable application*  -ErrorAction SilentlyContinue

            }
        } catch {
            Write-Error $_.Exception.Message
        }
    }

    END {}
}

</pre>
<p>&nbsp;</p>
<div id="parameters" style="scroll-margin-top: 15px;"></div>
<h2>Script Parameters</h2>
<h3>    -WorkspaceId</h3>
<p>DataType: string<br />
Description: This is the Azure Log Analytics Workspace Id.</p>
<p>&nbsp;</p>
<h3>    -DaysFromToday</h3>
<p>DataType: Int<br />
Description: This will determine how far back we want to check the logs.<br />
&nbsp;</p>
<h3>    -Operation</h3>
<p>DataType: string/array<br />
Description: This will filter for the items you specify.  Valid inputs are CreatePolicy, UpdatePolicy, DeletePolicy.<br />
&nbsp;</p>
<h3>    -FlatObject</h3>
<p>DataType: switch<br />
Description: This switch will output each property&#8217;s add and remove subproperty in the object.  When not used, each add and remove subproperty will be nested under the corresponding property.<br />
&nbsp;</p>
<div id="examples" style="scroll-margin-top: 15px;"></div>
<h3>Example 1 &#8211; Displaying Default Output</h3>
<pre class="brush: powershell; gutter: false; title: ; notranslate">
PS C:\&gt; Get-ConditionalAccessChange -WorkSpaceId $WorkSpaceId -DaysFromToday 5 | select -First 1
</pre>
<p><a href="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Nested-objects.jpg" target="_blank" rel="noopener"><img fetchpriority="high" decoding="async" src="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Nested-objects-1024x473.jpg" alt="Get-ConditionalAccessChange - Nested objects" width="820" height="378" class="aligncenter size-medium wp-image-4051" srcset="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Nested-objects-1024x473.jpg?v=1649308624 1024w, https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Nested-objects-768x355.jpg?v=1649308624 768w, https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Nested-objects.jpg?v=1649308624 1099w" sizes="(max-width: 820px) 100vw, 820px" /></a><br />
&nbsp;</p>
<h3>Example 2 &#8211; Displaying FlatObject Output</h3>
<pre class="brush: powershell; gutter: false; title: ; notranslate">
PS C:\&gt; Get-ConditionalAccessChange -WorkSpaceId $WorkSpaceId -DaysFromToday 5 -FlatObject | select -First 1
</pre>
<p><a href="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-FlatObject.jpg" target="_blank" rel="noopener"><img decoding="async" src="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-FlatObject-1024x657.jpg" alt="Get-ConditionalAccessChange - FlatObject" width="820" height="526" class="aligncenter size-medium wp-image-4052" srcset="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-FlatObject-1024x657.jpg?v=1649309457 1024w, https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-FlatObject-768x493.jpg?v=1649309457 768w, https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-FlatObject.jpg?v=1649309457 1099w" sizes="(max-width: 820px) 100vw, 820px" /></a><br />
&nbsp;</p>
<h3>Example 3 &#8211; Displaying Only Created and Deleted Policies</h3>
<pre class="brush: powershell; gutter: false; title: ; notranslate">
PS C:\&gt; Get-ConditionalAccessChange -WorkSpaceId $WorkSpaceId -DaysFromToday 5 -Operation CreatePolicy, DeletePolicy | `
select TimeGenerated, PolicyName, Operation, InitiatedByUser, ChangesMade, State, ChangedState
</pre>
<p><a href="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Operation-update.jpg" target="_blank" rel="noopener"><img decoding="async" src="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Operation-update-1024x501.jpg" alt="Get-ConditionalAccessChange - Operation-update" width="820" height="401" class="aligncenter size-medium wp-image-4054" srcset="https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Operation-update-1024x501.jpg?v=1649311506 1024w, https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Operation-update-768x376.jpg?v=1649311506 768w, https://thesysadminchannel.com/wp-content/uploads/2022/04/Get-ConditionalAccessChange-Operation-update.jpg?v=1649311506 1100w" sizes="(max-width: 820px) 100vw, 820px" /></a></p>
<div id="conclusion" style="scroll-margin-top: 15px;"></div>
<h2>Conclusion</h2>
<p>Hopefully this script to get azure conditional access policy changes using Powershell was helpful for you to see what changes have been made to your environment.  It&#8217;s useful knowing we have the ability to see who did what, exactly what user, groups or apps were added or removed.  Furthermore, since this is all ran from Powershell, you can automate this report to get a weekly or monthly update.  </p>
<p>Finally, be sure to follow us on our <a href="https://www.youtube.com/c/theSysadminChannel" rel="noopener" target="_blank">Youtube Channel</a> if you&#8217;re interested in video content.</p>
<p>The post <a href="https://thesysadminchannel.com/get-azure-conditional-access-policy-changes-using-powershell/">Get Azure Conditional Access Policy Changes using PowerShell</a> appeared first on <a href="https://thesysadminchannel.com">the Sysadmin Channel</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thesysadminchannel.com/get-azure-conditional-access-policy-changes-using-powershell/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4010</post-id>	</item>
	</channel>
</rss>
