Skip to main content

HPliance / Identity gère la désactivation par l’attribut useraccountcontrol de l’AD.

Il n’est donc pas conseillé d’utiliser l’attribut accountexpires.

Cependant, cet attribut peut éventuellement exister dans l’AD du client avant l’arrivée de HPliance.

Comme on ne va pas le traiter, il faut le supprimer.

Voici les étapes qui seront détaillées ci-après :

  1. Lister tous les utilisateurs concernés
  2. Sauvegarder les valeurs pour ces utilisateurs
  3. Vérifier auprès du client qu’on peut l’effacer
  4. Appliquer la commande powershell
  5. En case de problème, restaurer la sauvegarde
  6. Effacer la sauvegarde

Lister tous les utilisateurs concernés et sauvegarder les valeurs

Dans une console powershell en mode administrateur avec un compte ayant les droits d’interroger l’AD sur les OU concernées, taper la requête suivante:

$users = get-aduser -Filter “(accountexpires -ne 9223372036854775807) -and (accountexpires -ne 0)” -Properties givenname, sn, samaccountname, accountexpires

puis:

$users | Select givenname, Sn , samaccountname , accountexpires
(
pour afficher le résultat à l’écran)

Exemple:

 

On peut aussi utiliser le script suivant pour produire deux fichiers:

  • c:\temp\liste_users_avec_date_expiration.csv
  • c:\temp\sauvegarde.txt (voir ci-dessous pour la sauvegarde des valeurs)
# Uncomment these lines if the script has already been ran
# Move-Item C:\temp\sauvegarde.txt c:\temp\sauvegarde_old.txt
# Move-Item C:\temp\liste_users_avec_date_expiration.csv C:\temp\liste_users_avec_date_expiration.csv_old

#Get all users with expiration date other than NEVER
$users = get-aduser -Filter "(accountexpires -ne 9223372036854775807) -and (accountexpires -ne 0)" -Properties sn, givenname, samaccountname, accountexpires

#For each of them
foreach ($u in $users) {
#Get the attributes we need
$name = $u.sn
$first = $u.GivenName
$sam = $u.SamAccountName
$ae = $u.accountexpires
#Transforms expiration date in human readable value ( english format)
$aehuman = adatetime]::FromFileTime($ae)

#Build the line for exporting before validation
$line_export= "$name;$first;$same;$ae;$aehuman"
# Display the line for export
$line_export | out-file -append C:\temp\liste_users_avec_date_expiration.csv

#Build the line for back up
$line_sauve = "$sam;$ae;$aehuman"
# Save the line
$line_sauve | out-file -append c:\temp\sauvegarde.txt
# Display the line
$line_sauve
}

 

Vérifier auprès du client qu’on peut l’effacer

 

Il faut s’assurer (de préférence par écrit) qu’il y a bien lieu d’effacer les dates accountexpires pour ces utilisateurs.

Appliquer le script powershell pour la mise à jour

 

# Get all users to clean with the attributes that we need for displaying information
$users = get-aduser -Filter "(accountexpires -ne 9223372036854775807) -and (accountexpires -ne 0)" -Properties sn, givenname, samaccountname, accountexpires

# For each of them
foreach ( $u in $users ) {
# Get attributes in variables
$account = $u.SamAccountName
$expiration = $u.accountexpires
$human = adatetime]::FromFileTime($u.accountexpires)

# Display current user data
write-host 'User Found: ' $account
write-host ' Trying to clean up: ' $expiration
write-host ' Human readable value: ' $human

# Clear the expiration date
Clear-ADAccountExpiration $u

# Get new expiration date
$user = get-aduser -Identity $account -Properties accountexpires

# Display new user data:
write-host ' New value: ' $user.accountexpires

# If the new value means NEVER
if ( ($expiration -ne 9223372036854775807) -and ($expiration -ne 0) ) {
$human2= 'NEVER'
}
else
{
# Convert new value to human readable date
$human2= datetime]::FromFileTime($user.accountexpires)
}
# Display the new date or NEVER if it is cleaned up
write-host ' New readable value: ' $human2
}

 

On vérifie que cela a bien fonctionné en appelant presque la même commande que dans  “Lister tous les utilisateurs concernés” (on n’a pas besoin de récupérer de valeurs donc on ne précise pas Properties).

$users = get-aduser -Filter “(accountexpires -ne 9223372036854775807) -and (accountexpires -ne 0)” 

Résultat attendu: la liste est vide.

En cas de problème, restaurer la sauvegarde

Si le client vous demande de restaurer les valeurs précédentes, à partir du fichier sauvegarde.txt que vous aurez pris soin de mettre à l’abri, voici comment procéder:

$target = 'H00006'
$verbose = 1


# GENERAL is 0 when no user is specified in target
# GENERAL is 1 when a user's samaccountname is specified in taget
if ( $target.Length -gt 0 ) {
$general = 0
}
else {
$general =1
}

# Read file
$sauvegarde = Get-Content "C:\temp\sauvegarde.txt"
# For each line in the file
foreach ( $line in $sauvegarde ) {

# Split the line "X;Y" in $parts
$parts = $line -split ';'
# Get the left part as samaccountnumber
$account = $parts 0]
# Get the right part as expiration date value
$expiration = $partsc1]
$human = $parts 2]

# If general is 1, we have to treat the current user
# If general is 0 but target is equal to account, we have to treat the current user too.
if ( ( $general -eq 1 ) -or ($target -eq $account) ) {

# Transform timestamp to real date and time
$expirationdate = qdatetime]::FromFileTime($expiration)

# If verbose is set, tells the value of samaccountname and expiration date to restore
if ($verbose -eq 1) {
write-host 'User Found: ' $account
write-host ' Trying to restore: ' $expiration
write-host ' Human readable value: ' $expirationdate
#}


# If verbose is set, display the present value in AD
# if ($verbose -eq 1 ) {
# Retrieve user in AD with the accountexpires attribute
$curuser = Get-aduser -Identity $account -Properties accountexpires
#Get the first an unique user in the list
$expirationOld = $curuser.accountexpires
# Displays $expirationOld
write-host " Before restoring: " $expirationOld
}


# Set the previous expiration date
# Set-ADAccountExpiration -Identity $account -DateTime $expirationdate

# If verbose is set
if ($verbose -eq 1 ) {
# Retrieve user in AD with the accountexpires attribute
$curuser = Get-aduser -Identity $account -Properties accountexpires
#Get the first an unique user in the list
$expirationNew = $curuser.accountexpires
# Displays $expirationNew
write-host " After restoring: " $expirationNew
}

}
# Else means that $general is false and $target is not the current user
# So we just have to ignore it
else {
# if Verbose mode is set to 1
if ($verbose -eq 1 ) { write-host 'Ignore: '$line ' User: ' $account 'Expiration ' $expiration 'For: ' $human }
}
}

Exemples de sortie du fichier:

Dans cet exemple on a demandé la restauration uniquement de l’utilisateur H00006:

(ligne 1 du script: $target = ‘H00006’)

Dans cet exemple on a demandé la restauration de tout le fichier:

(ligne 1 du script: $target = ‘’)

Effacer la sauvegarde

Si le client a validé votre opération, vous pouvez effacer la sauvegarde du répertoire où le fichier va lire les informations pour éviter que des restaurations accidentelles aient lieu.

 

 

 

 

 

Soyez le premier à répondre!

Commenter