tests/Test-Assessment.21811.ps1
<# .SYNOPSIS #> function Test-Assessment-21811 { [CmdletBinding()] param( $Database ) Write-PSFMessage '🟦 Start' -Tag Test -Level VeryVerbose $activity = "Checking Password expiration is disabled" Write-ZtProgress -Activity $activity -Status "Getting policy" $domains = Invoke-ZtGraphRequest -RelativeUri "domains" -ApiVersion v1.0 $misconfiguredDomains = $domains | Where-Object { $_.passwordValidityPeriodInDays -ne '2147483647' } $sql = @" SELECT id, displayName, userPrincipalName, passwordPolicies FROM User "@ $users = Invoke-DatabaseQuery -Database $database -Sql $sql $misconfiguredUsers = foreach ($user in $users) { $userDomain = $user.userPrincipalName.Split('@')[-1] $domainPolicy = $misconfiguredDomains | Where-Object { $_.id -eq $userDomain } if ( ($user.passwordPolicies -notlike "*DisablePasswordExpiration*") -and ($domainPolicy) ) { $user | Add-Member -MemberType NoteProperty -Name DomainPolicy -Value $domainPolicy -PassThru } } if ($misconfiguredDomains -or $misconfiguredUsers) { $passed = $false $testResultMarkdown = "Found domains or users with password expiration still enabled.`n`n%TestResult%" } else { $passed = $true $testResultMarkdown = 'Password expiration is properly disabled across all domains and users.' } # Build the detailed sections of the markdown if ($misconfiguredDomains) { # Define variables to insert into the format string $reportTitle1 = "Domains with password expiration enabled" $tableRows1 = "" # Create a here-string with format placeholders {0}, {1}, etc. $formatTemplate1 = @' ## {0} | Domain Name | Password Validity Interval | | :---------- | :------------------------- | {1} '@ foreach ($domain in $misconfiguredDomains) { $tableRows1 += @" | $($domain.id) | $($domain.passwordValidityPeriodInDays) |`n "@ } # Format the template by replacing placeholders with values $mdInfo1 = $formatTemplate1 -f $reportTitle1, $tableRows1 } if ($misconfiguredUsers) { # Build the detailed sections of the markdown # Define variables to insert into the format string $reportTitle2 = "Users with password expiration enabled" $tableRows2 = "" # Create a here-string with format placeholders {0}, {1}, etc. $formatTemplate2 = @' ## {0} | Display Name | User Principal Name | User Password Expiration setting | Domain Password Expiration setting | | :----------- | :------------------ | :------------------------------- | :--------------------------------- | {1} '@ foreach ($misconfiguredUser in $misconfiguredUsers) { $portalLink = 'https://entra.microsoft.com/#view/Microsoft_AAD_UsersAndTenants/UserProfileMenuBlade/~/overview/userId/{0}/hidePreviewBanner~/true' -f $misconfiguredUser.id $displayName = Get-SafeMarkdown $misconfiguredUser.displayName $userPrincipalName = $misconfiguredUser.userPrincipalName $userPasswordExpiration = $misconfiguredUser.passwordPolicies $domainPasswordExpiration = $misconfiguredUser.DomainPolicy.passwordValidityPeriodInDays $tableRows2 += @" | [$displayName]($portalLink) | $userPrincipalName | $userPasswordExpiration | $domainPasswordExpiration |`n "@ } # Format the template by replacing placeholders with values $mdInfo2 = $formatTemplate2 -f $reportTitle2, $tableRows2 } # Replace the placeholder with the detailed information $testResultMarkdown = $testResultMarkdown -replace "%TestResult%", ($mdInfo1 + $mdInfo2) $params = @{ TestId = '21811' Title = 'Password expiration is disabled' UserImpact = 'Low' Risk = 'Medium' ImplementationCost = 'Low' AppliesTo = 'Identity' Tag = 'Identity' Status = $passed Result = $testResultMarkdown } Add-ZtTestResultDetail @params } |