Question Condition If "Si"

Plus d'informations
il y a 2 ans 8 mois #31197 par Ludovic
Condition If "Si" a été créé par Ludovic
Bonjour étant novice dans ce language  je cherche a comprendre comment cela fonctionne et espère trouver de l'aide auprès de vous.

Prenons l'exemple de ce code avec try et catch
try
{New-ADUser -Name $Username -Givenname $prénom -Surname $nom etc.....}
catch
{Write-warning "ERREUR lle user n'a pas été créé"}
Write-Output "Exécution terminée"

Ma question est comment faire pour avoir :
1: Si "If" le user est créé = message "l'utilisateur a bien été créée"
2: Sinon "Else" = message" Attention l'utilisateur n'a pas été créé)
Merci d'avance pour vos retours
Cordialement.

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

Plus d'informations
il y a 2 ans 8 mois #31199 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Condition If "Si"
Salut,
cette construction est similaire à un if/else mais uniquement lors d'une erreur.
try
{
  New-ADUser -Name $Username -Givenname $prénom -Surname $nom etc.....
  Write-Host "l'utilisateur '$Username' a bien été créé."
}
catch
{ 
  Write-warning "L'utilisateur '$Username' n'a pas été créé."
}
Write-Host "Exécution terminée"
Ceci dit en cas de doublon, ce code ne renvoit pas un message adapté,"Erreur lors d'une demande de création pour '$Username'.".
Et le comportement dépend de la variable $ErrorActionPreference.

La construction if/else ne fonctionne que si l'appel réussie tjr et renvoi tjr un résultat que l'on peut interpréter. Ici (New-ADUser) on peut avoir un résultat ou une exception.

Tutoriels PowerShell

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

Plus d'informations
il y a 2 ans 8 mois #31200 par Ludovic
Réponse de Ludovic sur le sujet Condition If "Si"
Merci de votre réponse.
Je voudrais aller plus loin dans ma démarche
try
{
#Ajout d'un nouvel utilisateur dans l'AD 
New-ADUser -Name $nomcomplet -GivenName $prénom -Surname $nom -SamAccountName $login  -UserPrincipalName $login"@acme.fr" -Path "OU=$OU,DC=acme,DC=fr" [u]-AccountPassword(Read-Host -AsSecureString "Input Password")[/u] -ChangePasswordAtLogon $true  -Enabled $true}
catch
{Write-Warning "ERREUR Le mot de passe ne correspond pas aux valeurs de sécurité"
}
Je voudrais que si le mot de passe rentré ne respecte pas les spécifications de microsoft (longueur;caractères,etc) ça me mette un message d'erreur et surtout que ça arrête le script car il y a d'autres commande à suivre
Merci d'avance%.

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

Plus d'informations
il y a 2 ans 8 mois #31201 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Condition If "Si"
>>Je voudrais que si le mot de passe rentré ne respecte pas les spécifications de microsoft (longueur;caractères,etc) ça me mette un message d'erreur
Dans ce cas il faut analyser le détail de l'exception que le cmdlet renvoie pour ce cas, ensuite tu gères l'exception spécifique différemment ou un champ de l'objet exception ou encore le champ FullyQualifiedErrorId.
Là c'est de la gestion d'erreur.

Voir stackoverflow.com/questions/18136962/how...rrorid-in-powershell

Un exemple ( en cours de dev) autour d'une fonction utilisant une API :
function Test-Credential{
    #L'appel répété de cette fonction sur un même compte avec un mot de passe faux, peut le verrouiller.
    #La syntaxe Domain\sAMAccountName décompte une tentative d'authentification,  Domain@sAMAccountName en décompte 2.
    #
    #note :
    # Symptoms : When attempting to create or modify an Active Directory object,
    #            you receive the error: "Exception from HRESULT: 0x80005008".
    #
    #Cause     : The error 0x80005008 (ADS_BAD_PARAMETER) can occur when one of the properties has an invalid value.
    #            Typically, this is returned from a COM object when setting properties in an external system such as
    #            Remote Desktop (Terminal) Services.
    # exemple avec $s='t'
    # $result=Test-Credential -credentials $credential -MachineName $s #inconnue
    # $result=Test-Credential -credentials $credential -MachineName $s$result -> longueur incorrecte pour un nom de machine
    #
    #MACHINE
    #  upn : Comptetest@UC1234
    # samaccountname: UC1234\Comptetest
    #DOMAIN
    #  upn : Comptetest2@truc.bidule
    # samaccountname: Comptetest2\Dom-test
    
    #todo password expired
    
   [CmdletBinding(DefaultParameterSetName = 'Domain')]
     Param (
       [ValidateNotNull()]
         [System.Management.Automation.PSCredential]$Credentials,
 
          [Parameter(Mandatory=$true,parametersetname='Domain')]
          [ValidateNotNull()]
         [string] $DomainName,
 
          [Parameter(Mandatory=$true,parametersetname='Machine')]
          [ValidateNotNull()]
         [String] $MachineName,
 
         #Indicates that the cmdlet returns a Boolean value (True or False), instead of a 'CredentialValidation' object.
         #The value is True if the credential are valid; otherwise the value is False.
         [switch] $Quiet
    )
 
    try {
     $ContextType=$PsCmdlet.ParameterSetName -as [System.DirectoryServices.AccountManagement.ContextType]
     if ($ContextType -eq 'Domain')
     { $Name=$DomainName }
     else
     { $Name=$MachineName }
 
     $nc = $Credentials.GetNetworkCredential()
 
     #TODO : cette version ne tient pas compte de la cohérence des états
     #par exemple on peut avoir IsAccountActivated=$true et isUserExist=$false
     $Param=@{
       ContextName=$Name;
       Type="$ContextType";
       UserName=$nc.UserName;
       isValid=$false;
       isUserExist=$false;
       isAccountLockedOut=$false;
       IsAccountActivated=$true;
       Exception=$null
       ConnectedServer=$null
       reason=$null
     }
 
     $CredentialValidation=New-CredentialValidation @Param
     try {
        #Note :
        #       Si un nom de machine n'existe pas l'appel réussit et renvoi un objet
        #       Si un nom de domaine n'existe pas ou n'est pas joinable l'appel échoue
       $pctx = New-Object System.DirectoryServices.AccountManagement.PrincipalContext($ContextType, $Name)
       $CredentialValidation.ContextName=$pctx.Name
       $CredentialValidation.ConnectedServer=$pctx.ConnectedServer
 
     } catch [System.DirectoryServices.AccountManagement.PrincipalServerDownException]
     {
        #Mauvais domaine ou injoignable :  Impossible de contacter le serveur.
        #InnerException.hresult=0x80070035
        $CredentialValidation.Exception=$_.Exception
        $CredentialValidation.Reason=$_.Exception.InnerException.Message
        if ($Quiet)
        { return $false }
        else
        { return $CredentialValidation }
     }
 
     try {
      $UserInfos=[System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($pctx, $nc.UserName)
     } catch [System.Runtime.InteropServices.COMException] {
       if ($_.Exception.ErrorCode -ne 0x80070035)
       {throw $_}
        #Le chemin réseau n'a pas été trouvé.
       $CredentialValidation.Exception=$_.Exception
       $Message=$_.Exception.Message -replace "\.`r`n$"," : '$Name'"
       $CredentialValidation.Reason=$Message
       if ($Quiet)
       { return $false }
       else
       { return $CredentialValidation }
     }
 
      #On teste les cas pour informer l'utilisateur sinon on doit interpréter les exceptions déclenchées
      #On laisse les exceptions pour les cas inconnus.
      $isUserExistInContext=$null -ne $UserInfos
      $CredentialValidation.isUserExist=$isUserExistInContext
      if ($isUserExistInContext -eq $false)
      {
        $ErrorMessage="The specified account '{0}' does not exist into the $($PsCmdlet.ParameterSetName.toLower()) '{1}'." -F $nc.UserName, $pctx.Name
        $CredentialValidation.Reason=$ErrorMessage
        if ($Quiet)
        { return $false }
        else
        { return $CredentialValidation }
      }
 
      $CredentialValidation.IsAccountActivated=$UserInfos.Enabled
      if ($UserInfos.Enabled -eq $false)
      {
        $ErrorMessage= "The account '{0}\{1}' is disabled." -F $pctx.Name,$nc.UserName
        $CredentialValidation.Reason=$ErrorMessage
        if ($Quiet)
        { return $false }
        else
        { return $CredentialValidation }
      }
 
      if ($UserInfos.IsAccountLockedOut())
      {
         $ErrorMessage= "The account '{0}\{1}' is locked out." -F $pctx.Name,$nc.UserName
         $CredentialValidation.Reason=$ErrorMessage
         $CredentialValidation.isAccountLockedOut=$true
         if ($Quiet)
         { return $false }
         else
         { return $CredentialValidation }
       }
 
     #Saisie des Credentials correct, mais sont-ils valides ?
     #Faux : Nom de domain et nom de compte correct mais mot de passe incorrect
     try {
        # Les cas d'erreur :  compte locké et compte désactivé sont gérés auparavant
       $CredentialValidation.isValid =$pctx.ValidateCredentials($nc.UserName, $nc.Password)
       if ( $CredentialValidation.isValid -eq $false)
       {
         $ErrorMessage= "The user '{0}' exists but the password entered seems incorrect." -f $nc.UserName
         $CredentialValidation.Reason=$ErrorMessage
       }
     } catch [System.Management.Automation.MethodInvocationException]
     {
       $CredentialValidation.isValid =$false
       if ($_.Exception.InnerException -is [System.DirectoryServices.AccountManagement.PrincipalOperationException])
        {
           #Nom de machine inconnue ou injoignable : Le chemin réseau n'a pas été trouvé.
           #InnerException.hresult=0x80131501
           $CredentialValidation.Reason=$_.Exception
           $CredentialValidation.Reason=$_.Exception.InnerException.Message
           if ($Quiet)
           { return $false }
           else
           { return $CredentialValidation }
        }
        Throw $_
     }
 
     if ($Quiet)
     { return $CredentialValidation.isValid }
     else
     { return $CredentialValidation }
    }
    finally
    {
      if ($null -ne $UserInfos)
       { $UserInfos.Dispose() }
 
       if ($null -ne $pctx)
       { $pctx.Dispose() }
    }
 }

Tutoriels PowerShell

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

Plus d'informations
il y a 2 ans 8 mois #31203 par Ludovic
Réponse de Ludovic sur le sujet Condition If "Si"
heu comment dire a part que ça pique les yeux.
Je n'ai rien compris

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

Plus d'informations
il y a 2 ans 7 mois #31222 par ericlm128
Réponse de ericlm128 sur le sujet Condition If "Si"
Tu peut commencer par lire la doc du try/catch, ca pourrait t'aider dans la compréhension de son fonctionnement.
docs.microsoft.com/fr-fr/powershell/modu...?view=powershell-7.1

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

Temps de génération de la page : 0.078 secondes
Propulsé par Kunena