IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

valeur null dans condition


Sujet :

VBScript

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Par défaut valeur null dans condition
    Bonjour,

    Je cherche a faire l'export d'une OU de l'AD, a certaines conditions.

    Il y-a trois conditions, mais je n'arrive pas a lui faire prendre en compte la 1er je pense, qui null ou pas est valable pour lui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    on error resume next
    
    'déclaration des variables (pas obligatoire en VBS)
    
    dim objfichier, Myfile, Ouchoisi
    
    const forReading = 1, ForWriting = 2, ForAppending = 8
    
    'routine de connexion a l'AD
    
    Const ADS_SCOPE_SUBTREE = 2
    
    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
    
    'choix du domaine a éxaminer
    
    DomaineChoisi=inputbox ("veuillez Choisir le domaine que vous voulez inspecter","Choix du domaine")
    
    DomaineChoisi2=inputbox ("veuillez Choisir la fin du nom de domaine que vous voulez inspecter","Choix du domaine")
    
    OuChoisi=inputbox ("veuillez Choisir l'Unité d'organisation que vous voulez inspecter","Choix de l'OU")
    
    'sélection de l'OU dans le domaine
    
    objCommand.CommandText = _
        "SELECT AdsPath FROM 'LDAP://OU="& OuChoisi &", dc="& DomaineChoisi &", dc="& DomaineChoisi2 &"' WHERE objectCategory='user'"
    Set objRecordSet = objCommand.Execute
    
    'création du fichier texte
    
    set objfichier = createobject("scripting.filesystemobject")
    
    NomFichier="export.csv"            '   inputbox ("Veuillez entrez le nom de fichier","Nom du Fichier")
    
    set Myfile = objfichier.opentextfile(NomFichier, ForWriting, true)
    
    'boucle qui vérifie les utilisateurs 1 par 1
    
    objRecordSet.MoveFirst
    
    Do Until objRecordSet.EOF
    
        Set objUser = GetObject(objRecordSet.Fields("AdsPath").Value)
      
      'condition, extensionAttribute4 est vide, pas de date d'expiration, et un prénom ( boite nominative )
      
        If objUser.extensionAttribute4 is Empty AND objUser.dtmAccountExpiration = "01/01/1601 01:00:00" AND objUser.givenName <> "" then
    		 
    	   'si oui, afficher tel et tel informations
    	   
    	   Myfile.Writeline objUser.cn & ";" & objUser.distinguishedName & ";" & objuser.whenCreated & ";" & objuser.extensionAttribute4
    
        End If
    
        objRecordSet.MoveNext
    	
    Loop
    
    'message de fin d'éxecution du script
    
    MsgBox "votre recherche dans l'AD est terminée", vbExclamation, "Avertissement"
    J'ai mis en gras l'endroit ou je pense que ça coince, normalement tout le reste fonctionne vu que j'arrive bien a avoir mon CSV, mais il me met tout les objets qu'il trouve dans l'OU que je lui demande de fouiller au lieu de me mettre seulement ceux qui corresponde a ma condition

    merci d'avance

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Les variables en VBS sont initialisés par défaut à Empty.

    Tester si une variable est Empty signifie donc tester qu'une variable fut ou non initialisée, et non quelle est vide.

    Par conséquence, une variable Null n'est pas Empty, et une variable Empty, n'est pas Null, et pourtant les deux variables ne contiennent pas de données intéressantes

    Je n'ai jamais vu de propriétés des objets Windows à Empty, mais dès fois à Null.

    Donc bref il vaudrait mieux tester l'égalité ou non à la Nullité

    Vérifier que la variable is Nothing devrait aussi marcher.

    Il y a eu plusieurs sujets sur ce forum où l'on a débatu de la différence entre Null, Empty, et Nothing, fait une recherche avec ces mots clés et tu devrais retrouver les discussions en question.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Par défaut
    salut ced600,

    Oui j'ai vue qu'il y'avait d'autres sujets qui en parlait, dont un ou tu as presque fait la même réponse que tu viens de me faire.

    Malheureusement, même après les avoir lus je n'arrive pas a faire cette condition.

    J'ai essaye plusieurs trucs du genre = Null, isEmpty, isNull etc etc, mais a chaque fois, j'avais la même chose dans mon csv, il me mettait tout les objets de l'OU.

    C'est pour ca que j'ai crée un post, je me suis dit qu'il y'avais peut être quelques chose que j'avais pas vu étant donné que même quand je change ses valeurs, ça n'a aucun effet.

    y-a t'il d'autres pistes que je pourrais suivre selon toi?

    merci d'avance

    En fait quand je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       If objUser.extensionAttribute4 = "" then
    avec une seul condition ça fonctionne bien.

    Par contre dés que je met les deux autres condition ( pas de date de validité et prénom different de vide) je me retrouve avec aucune condition de prise.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        If objUser.extensionAttribute4 = "" AND objUser.dtmAccountExpiration = "01/01/1601 01:00:00" AND objUser.givenName <> "" then
    Est-ce ma méthode avec le AND qui est mauvaise, mais je pense pas qu'il faille mettre le OR ici.

    Je pense qu'au niveau syntaxe, les conditions doivent être bonnes, vu que je les utilise dans d'autres script qui fonctionne, donc ca peut venir que du fait que je cumule ces conditions.

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Ok pour les null, empty et autres.
    Au moins c bien, tu fouilles le fofo avant de poster
    C'est pas tout le monde qui fait pareil

    Pour les And -> toutes les conditions doivent être respecté pour rentrer dans le If. Si tu ne veux rentrer dans le If que lorsuqe toutes ces conditions sont vrais, alors c'est bon, et cela signifie que tu n'as jamais ce cas là.

    Par contre si tu veux rentrer dans le If que lorsqu'une ou plusieurs de ces conditions sont vrais, il faut utiliser le Or.

    Bref :

    Faux OU Faux = Faux
    Faux OU Vrai = Vrai (dans les deux sens)
    Vrai OU Vrai = Vrai

    Faux ET Faux = Faux
    Faux ET Vrai = Faux (dans les deux sens)
    Vrai ET Vrai = Vrai

    Faux XOR Faux = Faux
    Faux XOR Vrai = Vrai (dans les deux sens)
    Vrai XOR Vrai = Le shérif de l'espace -> Nan je déconne cela vaut Faux.

    Donc on résume le OU permet de rentrer dans le if dès qu'une condition est respecté, le ET lorsqu'elles sont toutes respectées, et le XOR (ou OU Exclusif) lorsqu'une condition est respecté, à condition qu'elles ne le soient pas toutes.

    A partir de là tu devrais pouvoir déterminer s'il te faut du OR, du AND, ou du XOR.


    Une autre chose, je n'ai pas vérifier sur MSDN, mais il se pourrait que dtmAccountExpiration ne soit pas un type string mais un type Date, dans ce cas là tu ne pourrais comparé une date précise avec la valeur de la propriété qu'à l'aide d'une fonction de manipulation des dates. un truc du genre DateComp mais je ne suis plus sur.

    Si tu veux savoir quelle condition n'est jamais respecté, fait des If imbriqués et fait des echos, msgbox, ou log dans un fichier un message, une fois à l'intérieur de chacun des If.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Par défaut
    Rebonjour,

    alors voila, j'ai testé mes conditions, a priori elles sont bonnes.

    Je pense en fait que ce que va pas c'est ou la boucle, ou le If qui est mal foutu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Do Until objRecordSet.EOF
     
        Set objUser = GetObject(objRecordSet.Fields("AdsPath").Value)
     
      'condition, extensionAttribute4 est vide, pas de date d'expiration, et un prénom ( boite nominative )
     
        If objUser.extensionAttribute4 = "" And objUser.AccountExpirationDate < #1/1/1970# And objUser.givenName <> "" then
     
    	'si oui, afficher tel et tel informations
     
    	'MsgBox objUser.extensionAttribute4 & objUser.AccountExpirationDate & objUser.givenName, vbExclamation, "Avertissement" 
    	' & AccountExpirationDate & givenName
     
    	Myfile.Writeline objUser.cn & ";" & objUser.department & ";" & objUser.whenCreated & ";" & objUser.extensionAttribute4
     
    	objRecordSet.MoveNext
     
    	loop
     
    	ELSE
     
        objRecordSet.MoveNext
     
    	loop
     
    	End if
     
    'message de fin d'éxecution du script
     
    MsgBox "votre recherche dans l'AD est terminée", vbExclamation, "Avertissement"
    Ce que je veux, c'est que si l'objet rempli les 3 conditions, alors mon then s'exécute et on retourne en haut de la boucle.

    Sinon, on retourne direct en haut de la boucle en passant a l'objet suivant.

    J'ai teste plusieurs façon de faire mon If est ma boucle, mais aucune ne fonctionne.

    Merci a ceux qui pourront m'aider

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	objRecordSet.MoveNext
     
    	loop
     
    	ELSE
     
        objRecordSet.MoveNext
     
    	loop
     
    	End if
    pb de copier coller ? parce que sinon suis memer pas sur que ca compile !!!

    rajoute dans le if une ligne dans ton fichier texte qui dit que tu es dans le if et qui donne les valeurs de objUser.extensionAttribute4, objUser.AccountExpirationDate, objUser.givenName

    pareil pour le else.

    Et vérifie toi même si à un moment ou un autre les trois conditions sont vrais.

    Si ce n'est pas le cas, alors c normal, tu n'as jamais les trois condition vrai.
    sinon alors c que au moins un test est faut. je mettrais en cause :objUser.AccountExpirationDate < #1/1/1970#
    Si AccountExpirationDate est de type date, utilise une fonction de Date pour faire la comparaison.

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 75
    Par défaut
    ok, je vais essayer comme ca

    Merci

Discussions similaires

  1. Valeur Null dans une condition
    Par jmde dans le forum VBA Access
    Réponses: 8
    Dernier message: 29/07/2007, 04h48
  2. Affcecter une valeur NULL dans une requete paramétrée
    Par thiouwz2 dans le forum Bases de données
    Réponses: 7
    Dernier message: 05/11/2004, 15h02
  3. [delphi 7 / DOA] valeur null dans setvariable
    Par delphim dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/11/2004, 10h14
  4. ASP et valeur NULL dans requêtes SQL
    Par chuck_m dans le forum ASP
    Réponses: 7
    Dernier message: 13/08/2004, 11h15
  5. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo