Lister et Désactiver les Comptes Citrix Gateway (NetScaler Unified Gateway)

Hey ! Ça fait longtemps que j’avais pas publié un article sur mon site !
Changement de vie personnelle fut radi ….. « On s’en fout !!! On veut ton script !!!!! »

Aujourd’hui je vous propose un script permettant de lister les Utilisateurs AD ayant un accès NetScaler Unified Gateway et de les désactiver en un clic !

Cas pratique :
Un utilisateur ne doit plus faire de « télé travail » (pour X raisons) et dispose d’un téléphone personnel sur lequel il avait un accès distant à Citrix (Via authentification à double facteur ‘Google Authenticator’).
Vous ne pouvez pas désactiver le compte AD car cela signifie qu’une fois au bureau il ne pourra plus se connecter. Vous devez donc lui supprimer l’ « Enrollement » de son téléphone.

L’enrollement du téléphone se situe dans un attribue AD : « UserPreference » et est délimiter par un @# au début et une « , » à la fin :

ATTENTION : Cet attribut ne contient pas que cela. Il peut arriver qu’il y ait d’autres paramètres de renseignés.

La requête Powershell :

Get-ADUser -LDAPFilter "(userParameters=*#@*,*)" | Select Name,SamAccountNam

« Oui mais Xavier, tu avais parler de lister et désactiver en un clic !!!! »

Effectivement, j’ai créé une application pour que nos personnes de l’exploitation/support puissent désactiver les accès Unified Gateway sans à avoir à modifier les attributs directement dans l’AD.
Ce que je vous propose c’est ceci :

Pour le moment :
– Un Bouton pour désactiver + confirmation avant désactivation
– Un Bouton pour Quitter

Attention, vous ne pouvez sélectionner qu’un User à la fois

Le code de l’application :

#Modules
[reflection.assembly]::LoadWithPartialName( "System.Windows.Forms")
ipmo activedirectory
$image = [system.drawing.image]::FromFile("D:\script\citrix_netscaler.jpg")

function liste {
#Paramètre de la fenêtre
$Form = New-Object System.Windows.Forms.Form
$Form.AutoSize = $True
$Form.text = "Selection de l'accès distant à désactiver"
$Form.MaximizeBox = $false

#Header avec Image (pour faire genre c'est beau)
$Header = new-object Windows.Forms.PictureBox
$Header.width=200
$Header.height=80
$Header.top=10
$Header.left=10
$Header.Image=$image
$header.SizeMode = 'StretchImage'
$form.Controls.Add($Header)

#Creation de la liste à cocher
$ListeCTX=New-Object System.Windows.Forms.CheckedListBox
$ListeCTX.Location = '10,100'
$ListeCTX.Size = '250,300'
$form.Controls.Add($ListeCTX)
$ctx = Get-ADUser -LDAPFilter "(userParameters=*#@*,*)" | Select Name,SamAccountName
$ListeCTX.DataSource = [collections.arraylist]$ctx
$ListeCTX.DisplayMember = 'SamAccountName'
$ListeCTX.CheckOnClick = $true

# Bouton désactiver l'accès distant
$BoutonDisable= new-object System.Windows.Forms.Button
$BoutonDisable.Location = '280, 100'
$BoutonDisable.Size = '150,50'
$BoutonDisable.Text = 'Désactiver'
$BoutonDisable.add_click({
$ListeCTX.CheckedItems | select SamAccountName
$Users =[array]$($ListeCTX.CheckedItems).SamAccountName
$reponse = confirmation "Voulez vous vraiment désactiver l'accès distant de $Users ?" "Confirmer"
if ($Reponse -eq [System.Windows.Forms.DialogResult]::Yes)
{
Write-Host "désactivation de l'accès distant de $Users"
$User = $Users
Write-Host $User -ForegroundColor Red
$KeyNOW = Get-ADUser -Filter "sAMAccountName -eq '$User'" -Properties * | Select-Object -ExpandProperty userParameters
$KeyNEW = $KeyNOW -replace '(?<=#@)(.*)(,)'
Write-Host $KeyNOW -ForegroundColor Yellow
Write-Host $KeyNEW -ForegroundColor Green
Set-ADUser -Identity "$User" –replace @{userParameters=$KeyNEW} -Verbose | OK "L'utilisateur $User n'a plus d'accès à distance" "Opération réussie"
}
else
{
Write-Host "annulation"
}
})
$form.Controls.Add($BoutonDisable)

#CopyRight
$CopyRight = New-Object Windows.Forms.Label
$CopyRight.Location = New-Object Drawing.Point 370,410
$CopyRight.Size = New-Object Drawing.Point 110,15
$CopyRight.text = "Copyright XBI. Version 2"
$CopyRight.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 7)
$form.Controls.Add($CopyRight)

#Bouton Quitter
$BoutonQuitter= new-object System.Windows.Forms.Button
$BoutonQuitter.Location = '50, 410'
$BoutonQuitter.AutoSize = $True
$BoutonQuitter.Text = 'Quitter'
$BoutonQuitter.add_click({
$form.Close()
})
$form.Controls.Add($BoutonQuitter)

[void]$Form.ShowDialog()
}

function confirmation { 
$message_Out = $args[0]
$titre= $args[1]
$Btn = 4  
$Icon = 48
Return [System.Windows.Forms.MessageBox]::Show($Message_Out, $Titre , $Btn, $Icon)
} #Generation fenetre de confirmation

function OK { 
$message_Out = $args[0]
$titre= $args[1]
$Btn = 0  
$Icon = 48
[System.Windows.Forms.MessageBox]::Show($Message_Out, $Titre , $Btn, $Icon)
} #Generation fenetre OK

liste

A modifier :
- La variable $image (afin d'avoir une jolie image en haut à gauche) Peu importe la taille de l'image : $header.sizemode est là pour "fit" l'image dans le "header".

La partie la plus intéressante du script est celle ci :

$KeyNOW = Get-ADUser -Filter "sAMAccountName -eq '$User'" -Properties * | Select-Object -ExpandProperty userParameters 
$KeyNEW = $KeyNOW -replace '(?<=#@)(.*)(,)'
Write-Host $KeyNOW -ForegroundColor Yellow
Write-Host $KeyNEW -ForegroundColor Green

La variable $keyNOW correspond à la chaîne de caractère située dans l’attribut "userParameters"
Cette valeur est ensuite éditée via un RegHEx (merci au site :
https://regexr.com/ ) pour y extraire la valeur située entre le #@ et la virgule (donc le paramétrage de l'accès distant). La valeur devient donc $KeyNEW

Le write-host est uniquement là pour le debug (vous pouvez tester cette partie du script sans aucune crainte car il n'y a aucune modification de faite sur le User.

Avant désactivation de mon accès :

Après désactivation de mon accès :