Question
Mise en attente d'un script powershell
- gaudefroy
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 32
- Remerciements reçus 0
il y a 2 ans 8 mois #31051
par gaudefroy
Mise en attente d'un script powershell a été créé par gaudefroy
Bonjour à tous,
Je sollicite votre aide concernant un problématique que j'ai dans un de mes script powershell. En effet j'ai créé un script powershell qui me permet de créer un utilisateur AD et ensuite lancer une synchronisation avec AADsync (synchronisation des utilisateurs avec Azure AD) pour ensuite pouvoir lui affecter des licences et d'autres réglages. Hors le temps de la synchronisation peu varier d'une trentaine de seconde à 1 minutes voire plus. Actuellement j'ai mis une temporisation fixe de 40 secondes grâce à la commande start-sleep -seconds 40 mais j'aimerai faire mieux.
En fait dans l'idée j'aimerai tester si le compte existe dans Azure Ad grâce à une commande du type Get-AzureADUser -Filter "userPrincipalName eq '$UserPrincipalName'"
L'idéal serait que tant que cette commande ne renvoie pas un résultat positif (le compte existe) il faudrait que le script se mette en pause et qu'il rééssaie quelques secondes plus tard ou bien faire une boucle et tant que le compte n'existe pas il ne passe pas à la suite du script.
Avez vous une idée de comment je pourrais procéder pour réaliser cela.
Actuellement tout le script fonctionne mise à part ce petit détail qui lorsque la synchro est un peu trop longue fait dérailler le reste du script.
Merci d'avance pour votre aide, indication et bienveillance.
Je sollicite votre aide concernant un problématique que j'ai dans un de mes script powershell. En effet j'ai créé un script powershell qui me permet de créer un utilisateur AD et ensuite lancer une synchronisation avec AADsync (synchronisation des utilisateurs avec Azure AD) pour ensuite pouvoir lui affecter des licences et d'autres réglages. Hors le temps de la synchronisation peu varier d'une trentaine de seconde à 1 minutes voire plus. Actuellement j'ai mis une temporisation fixe de 40 secondes grâce à la commande start-sleep -seconds 40 mais j'aimerai faire mieux.
En fait dans l'idée j'aimerai tester si le compte existe dans Azure Ad grâce à une commande du type Get-AzureADUser -Filter "userPrincipalName eq '$UserPrincipalName'"
L'idéal serait que tant que cette commande ne renvoie pas un résultat positif (le compte existe) il faudrait que le script se mette en pause et qu'il rééssaie quelques secondes plus tard ou bien faire une boucle et tant que le compte n'existe pas il ne passe pas à la suite du script.
Avez vous une idée de comment je pourrais procéder pour réaliser cela.
Actuellement tout le script fonctionne mise à part ce petit détail qui lorsque la synchro est un peu trop longue fait dérailler le reste du script.
Merci d'avance pour votre aide, indication et bienveillance.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 2 ans 8 mois - il y a 2 ans 8 mois #31052
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Mise en attente d'un script powershell
Salut,
consulte ce post : mjolinor.wordpress.com/2012/01/14/making...-loop-in-powershell/
Il est préférable de placer une durée max d'attente avec un mécanisme de reprise.
consulte ce post : mjolinor.wordpress.com/2012/01/14/making...-loop-in-powershell/
Il est préférable de placer une durée max d'attente avec un mécanisme de reprise.
Tutoriels PowerShell
Dernière édition: il y a 2 ans 8 mois par Laurent Dardenne.
Connexion ou Créer un compte pour participer à la conversation.
- gaudefroy
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 32
- Remerciements reçus 0
il y a 2 ans 8 mois #31061
par gaudefroy
Réponse de gaudefroy sur le sujet Mise en attente d'un script powershell
Merci pour votre réponse, donc si je comprend le code il fait une loupe jusqu'à ce que la condition soit remplie. J'ai tenté de l'adapter pour mon usage, par contre je bloque sur la condition qui me permet de savoir que le compte existe ou pas. Comment je peux exprimer cela ? En gros tant que le compte n'existe pas dans Azure AD (temps de synchronisation) la boucle d'attente doit continuer.
J'ai mis un exemple mais qui ne doit pas être bon. Pouvez vous m'éclairer sur ce sujet ?
J'ai mis un exemple mais qui ne doit pas être bon. Pouvez vous m'éclairer sur ce sujet ?
$timeout = new-timespan -Minutes 3
$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timeout){
if ((Get-AzureADUser -Filter "userPrincipalName eq 'tintin@lpo.fr'") ne $null){
write-host "Le compte Ad a été synchronisé"
return
}
start-sleep -seconds 10
}
write-host "Timed out"
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 2 ans 8 mois #31062
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Mise en attente d'un script powershell
Il faut connaitre la cause de sortie de la boucle While et tester 2 conditions :Le code peut être simplifié , essaie le tel quel puis en décommentant la ligne #Start-Process 'Notepad.exe'
$DebugPreference='Continue'
$timeout = new-timespan -Seconds 30
$sw = [diagnostics.stopwatch]::StartNew()
$condition=$false
$isNotTimeOut=$true
while (( $isNotTimeOut -eq $true ) -and ($condition -eq $false)){
$isNotTimeOut=$sw.elapsed -lt $timeout
$Condition=(Get-Process -name 'Notepad' -ea SilentlyContinue ) -ne $null
Write-Debug "Condition= '$Condition' Timeout ='$isTimeOut'"
if ($Condition -eq $true)
{
write-host "Le compte Ad a été synchronisé"
$sw.Stop()
return #continue
}
else
{
Write-host 'Wait...'
start-sleep -seconds 10
#Start-Process 'Notepad.exe'
}
}
if ($Condition)
{ write-host "Le compte Ad TRUE" }
else
{ write-host "Timed out" }
$DebugPreference='SilentlyContinue'
#todo gestion d'erreur
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 2 ans 8 mois #31063
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Mise en attente d'un script powershell
Une réécriture :
function Test {
$DebugPreference='Continue'
$timeout = New-Timespan -Seconds 30
$sw = [diagnostics.stopwatch]::StartNew()
$isWaitingSynchronization=$true
$isWaitingTimeElapsed=$true
while ($isWaitingTimeElapsed -and $isWaitingSynchronization)
{
$isWaitingTimeElapsed=$sw.elapsed -lt $timeout
$isWaitingSynchronization= $null -eq (Get-Process -name 'Notepad' -ea SilentlyContinue )
Write-Debug "isWaitingSynchronization= '$isWaitingSynchronization' isWaitingTimeElapsed ='$isWaitingTimeElapsed'"
if ($isWaitingSynchronization -eq $false)
{
write-Debug "Le compte Ad a été synchronisé"
$sw.Stop()
Continue
}
ElseIf ($isWaitingTimeElapsed -eq $true)
{
Write-host 'Wait...'
Start-Sleep -seconds 10
#Start-Process 'Notepad.exe'
}
Else
{ write-Warning "Le compte AD n'a pas été synchronisé dans le délai imparti ('$($sw.Elapsed)')."}
}
Write-Debug "isWaitingSynchronization= '$isWaitingSynchronization' isWaitingTimeElapsed='$isWaitingTimeElapsed'"
if ($isWaitingSynchronization -eq $false)
{ write-host "Le compte Ad synchronisé " }
else
{ write-host "Timed out" }
$DebugPreference='SilentlyContinue'
}
Test
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- gaudefroy
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 32
- Remerciements reçus 0
il y a 2 ans 8 mois #31064
par gaudefroy
Réponse de gaudefroy sur le sujet Mise en attente d'un script powershell
Un grand merci pour la fonction qui semble un peu plus complète que ta première réponse Elle contient la gestion des erreurs c'est bien cela ?
A vrai dire j'avais testé avec ta première réponse et ça semblait fonctionner parfaitement en ajustant la condition. Je te soumets les petits ajustements que j'ai créé ci dessous:
je vais regarder par rapport à la fonction que tu viens de créer ce que je dois modifier pour m'adapter à ma situation. Si je veux utiliser cette fonction dans divers cas en modifiant ma variable de condition est ce possible ? En effet j'utilise une fois une temporisation pour la synchronisation des utilisateurs AD avec AADsync et ensuite quand on affecte la licence office 365 car la boite aux lettre met une ou deux minutes à sec créer. Peut on créer un paramètre qui sera une variable qui correspondra à la condition. L'interet de la fonction c'est qu'on peut l'appeler sans devoir réecrire le code et ainsi le surcharger ?
En tout cas merci beaucoup et je vais essayer de disséquer ta fonction afin de tout comprendre
A vrai dire j'avais testé avec ta première réponse et ça semblait fonctionner parfaitement en ajustant la condition. Je te soumets les petits ajustements que j'ai créé ci dessous:
$DebugPreference='Continue'
$timeout = new-timespan -Minutes 3
$sw = [diagnostics.stopwatch]::StartNew()
$condition=$false
$isNotTimeOut=$true
while (( $isNotTimeOut -eq $true ) -and ($condition -eq $false)){
$isNotTimeOut=$sw.elapsed -lt $timeout
$Condition=(Get-AzureADUser -Filter "userPrincipalName eq '$UserPrincipalNameMin'" -ea SilentlyContinue ) -ne $null
Write-host "En attente de la synchronisation du compte utilisateur"
if ($Condition -eq $true)
{
write-host "Le compte Ad $UserPrincipalNameMin a été synchronisé"
$sw.Stop()
return #continue
}
else
{
Write-host 'Wait...'
start-sleep -seconds 20
#Start-Process 'Notepad.exe'
}
}
if ($Condition)
{ write-host "Le compte Ad TRUE" }
else
{ write-host "Timed out" }
$DebugPreference='SilentlyContinue'
#todo gestion d'erreur
je vais regarder par rapport à la fonction que tu viens de créer ce que je dois modifier pour m'adapter à ma situation. Si je veux utiliser cette fonction dans divers cas en modifiant ma variable de condition est ce possible ? En effet j'utilise une fois une temporisation pour la synchronisation des utilisateurs AD avec AADsync et ensuite quand on affecte la licence office 365 car la boite aux lettre met une ou deux minutes à sec créer. Peut on créer un paramètre qui sera une variable qui correspondra à la condition. L'interet de la fonction c'est qu'on peut l'appeler sans devoir réecrire le code et ainsi le surcharger ?
En tout cas merci beaucoup et je vais essayer de disséquer ta fonction afin de tout comprendre
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.077 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Mise en attente d'un script powershell