L’IAM conçue pour l’ère de l’IA

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 de Specops Authentication Gatekeeper, ils doivent obtenir l'autorisation de lire/écrire les informations pertinentes sur les objets utilisateur.

Complétez les étapes ci-dessous pour permettre aux administrateurs/utilisateurs du service d'assistance en dehors de Specops Specops Authentication.

Pré-requis: Le module Active Directory PowerShell

  1. Enregistrez le script ci-dessous dans un fichier (par exemple, C:\Scripts\uResetUserPermissions.ps1)
  2. Sourcez le script dans une session PowerShell.
  3. Exécutez le cmdlet Grant-SpecopsPermissionForUserOutsideScope pour chaque utilisateur en dehors du périmètre qui doit s'inscrire avec Specops Authentication.

Commande:

# "Sourcez le script pour charger le
# cmdlet 'Grant-SpecopsPermissionForUserOutsideScope'.
. C:\Scripts\uResetUserPermissions.ps1

# Exécutez ce script pour chaque utilisateur en dehors du périmètre qui doit s'inscrire avec Specops uReset
# GatekeepersGroup: sAMAccountName ou DN du groupe Gatekeepers (par défaut est 'Specops Gatekeepers')
# TargetUser: sAMAccountName ou DN de l'utilisateur cible
Grant-SpecopsPermissionForUserOutsideScope -GatekeepersGroup 'Specops 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 de Gatekeeper: $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 Gatekeepers ('{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
}