Question Mise en attente d'un script powershell

Plus d'informations
il y a 2 ans 8 mois #31051 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.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 8 mois - il y a 2 ans 8 mois #31052 par Laurent Dardenne
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.

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.

Plus d'informations
il y a 2 ans 8 mois #31061 par gaudefroy
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 ?
$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.

Plus d'informations
il y a 2 ans 8 mois #31062 par Laurent Dardenne
Il faut connaitre la cause de sortie de la boucle While et tester 2 conditions :
$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
Le code peut être simplifié , essaie le tel quel puis en décommentant la ligne #Start-Process 'Notepad.exe'

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 8 mois #31063 par Laurent Dardenne
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.

Plus d'informations
il y a 2 ans 8 mois #31064 par gaudefroy
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:
$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
Propulsé par Kunena