Politique d'authentification pour les utilisateurs hors périmètre
Si une politique d'authentification est créée pour les administrateurs et/ou le groupe d'assistance, mais qu'ils sont en dehors du groupe MFA pour Windows, le groupe doit avoir l'autorisation de lire/écrire les informations pertinentes sur les objets utilisateur.
Complétez les étapes ci-dessous pour permettre aux administrateurs/utilisateurs du support technique en dehors du MFA pour Windows.
Prérequis: Le module Active Directory PowerShell
- Enregistrez le script ci-dessous dans un fichier (par exemple
C:\Scripts\uResetUserPermissions.ps1
) - Sourcez le script dans une session PowerShell.
- Exécutez le cmdlet Grant-uResetPermissionForUserOutsideScope pour chaque utilisateur en dehors du périmètre qui doit s'inscrire avec le MFA pour Windows.
Commande:
# "Sourcez le script pour charger le cmdlet 'Grant-uResetPermissionForUserOutsideScope'.
. C:\Scripts\uResetUserPermissions.ps1
# Exécutez ce script pour chaque utilisateur en dehors du périmètre qui doit s'inscrire avec uReset
# GatekeepersGroup: sAMAccountName ou DN du groupe Gatekeepers (par défaut est 'Specops Authentication Gatekeepers')
# TargetUser: sAMAccountName ou DN de l'utilisateur cible
Grant-uResetPermissionForUserOutsideScope
-GatekeepersGroup 'Specops Authentication Gatekeepers'
-TargetUser JohnDoe
Script:
function Grant-SpecopsPermissionForUserOutsideScope {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]$GatekeepersGroup,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]$TargetUser,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$MobileNumberAttribute = 'mobile'
)
$VerbosePreference = 'Continue'
$ErrorActionPreference = 'Stop'
Write-Verbose "Groupe des gardiens: $GatekeepersGroup"
Write-Verbose "Utilisateur cible: $TargetUser"
$domain = Get-ADDomain
try {
$gkGroup = Get-ADGroup $GatekeepersGroup
$gatekeepersGroup = $domain.NetBIOSName + '\' + $gkGroup.sAMAccountName
} catch {
throw ("Impossible de trouver le groupe des gardiens ('{0}') échoué." -f $GatekeepersGroup)
}
try {
$user = Get-ADUser $TargetUser
$targetUserDn = $user.DistinguishedName
} catch {
throw ("Impossible de trouver l'utilisateur cible ('{0}') échoué." -f $TargetUser)
}
[array]$permissionsArray = @(
'CCDC;classStore;', # CreateChild pour classStore
'SD;;' # Permission DeleteChild
'LC;;', # Permission List children
'RP;userAccountControl;', # Lire la propriété userAccountControl
'RP;msDS-User-Account-Control-Computed;', # Lire la propriété msDS-User-Account-Control-Computed
'RP;pwdLastSet;', # Lire la propriété pwdLastSet
'RP;lockoutTime;', # Lire la propriété lockoutTime
'RP;tokenGroups;', # Lire la propriété tokenGroups
"RPWP;$MobileNumberAttribute;" # Lire/Écrire la propriété pour le numéro de mobile (ou attribut personnalisé)
)
$sb = New-Object System.Text.StringBuilder
[void]$sb.Append('"')
[void]$sb.Append($targetUserDn)
[void]$sb.Append('" /G')
$permissionsArray | ForEach-Object {
[void]$sb.Append(' "')
[void]$sb.Append($gatekeepersGroup + ':' + $_)
[void]$sb.Append('"')
}
$commandLine = $sb.ToString()
function RunDsAcls($commandLine) {
$startInfo = New-Object System.Diagnostics.ProcessStartInfo
$startInfo.FileName = 'dsacls.exe'
$startInfo.Arguments = $commandLine
$startInfo.UseShellExecute = $false
$startInfo.CreateNoWindow = $true
$startInfo.RedirectStandardOutput = $true
$startInfo.RedirectStandardError = $true
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $startInfo
Write-Verbose ''
Write-Verbose "dsacls $commandLine"
Write-Verbose ''
$process.Start() | Out-Null
$stdout = $process.StandardOutput.ReadToEnd()
$stderr = $process.StandardError.ReadToEnd()
$process.WaitForExit()
if ($process.ExitCode -ne 0) {
$msg = ("dsacls a échoué avec le code de sortie {0}." -f $process.ExitCode)
Write-Verbose $stdout
Write-Verbose $stderr
Write-Verbose $msg
throw $msg
}
Write-Verbose $stdout
Write-Verbose "dsacls terminé avec succès."
}
Write-Verbose ''
Write-Verbose "Va accorder la permission pour `"$gatekeepersGroup`" d'opérer sur `"$targetUserDn`"."
Write-Verbose ''
RunDsAcls $commandLine
}