Sujet : Le service d'annuaire ne peut pas effectuer l'opération requise sur l'attribut RDN d'un objet [ Microsoft / Active Directory ] (BefaDuDesert)


Informations & options

Le service d'annuaire ne peut pas effectuer l'opération requise sur l'attribut RDN d'un objet par : BefaDuDesert le 07/05/2007 10:53:01
Répondre Rép. Ecrire un message privé MP Voir les autres messages de ce membre 3 msg Voir les autres messages de ce membre sur tout CS 17 msg CS
Bonjour à tous,
je voudrais normaliser le champ nom (qui est en fait le champ nom complet) dans mon active directory mais j'ai une erreur dans mon script wsh. Mon script s'inspire de celui que j'ai trouvé sur ce site.

Code :
'************************** VARIABLES SYSTEMES **************************
Dim user, computer
Dim u,v,w
Dim oRootDSE,strDomainNC
Dim oConnection,oRecordset
' ------------------------------------- DEBUT DE PROGRAMME -------------------------------------------

Sub recuperation_donnees()
    ' Recherche du domaine Active Directory courant, on peut aussi forcer la valeur !
    Set oRootDSE = GetObject("LDAP://RootDSE")
    strDomainNC = oRootDSE.Get("defaultNamingContext")

    ' Connexion de type base de donnée à Active Directory
    Set oConnection = CreateObject("ADODB.Connection")
    oConnection.Provider = "ADsDSOObject"
    oConnection.Open "ADs Provider"
    Dim nom_complet, prenom
    ' Définition de la recherche principale
    ' Tous les utilisateurs dans tous les niveaux de l?arborescence.
    Set oRecordset = oConnection.Execute("<GC://"+StrDomainNC+">;(&(objectCategory=user));distinguishedName,sn,givenName,name,displayname,samaccountname;subtree")

    ' Boucle sur les enregistrements.
    If Not oRecordset.EOF Then
        While Not oRecordset.EOF

        ' Attention les champs vides (Null) ne peuvent pas être concaténés en chaine de caractères
        ' Il faut donc les vérifier
        'stokage des variables réutilisables
        nom_LDAP=verifyNULL(oRecordSet.Fields("distinguishedName"))
        nom_famille=VerifyNull(oRecordset.Fields("sn"))
        'nom_complet=VerifyNull(oRecordset.Fields("name")) 
        prenom=VerifyNull(oRecordset.Fields("givenName"))
        samaccountname=VerifyNull(oRecordset.Fields("samaccountname"))   
   
        If (nom_famille=""  or prenom="") Then
            nom_LDAP = "erreur"
            Else
            nom_complet = normalisation_nom_prenom (nom_famille,prenom)
            res=UpdateAccount(nom_LDAP, nom_complet, samaccountname)
        End If
     
        oRecordset.movenext
        Wend
    End If
End Sub

Function UpdateAccount(nom_chemin, nom_complet, samaccountname)
    Dim oUser
    wscript.echo nom_chemin
    set oUser=GetObject("LDAP://"+nom_chemin)
    samaccountname=ouser.samaccountname
    nom=oUser.sn
    prenom=oUser.givenname
    DisplayName=Trim(oUser.DisplayName)
    'Récupération du login, nom, prénom et NomComplet !!!
    'Si les conditions sont remplies, on pourra définir la nouvelle valeur
    NewFullName=nom_complet
    'Puis réécrire l'information modifiée dans Active Directory :
    oUser.put "cn", NewFullName
    oUser.setinfo
    UpdateAccount=1
End Function

' Fonctions...

Function VerifyNull(field)
  IF not (isnull(Field)) Then
    VerifyNull=Field
  Else
    VerifyNull=""
  End IF
End Function

Function normalisation_nom_prenom(nom, prenom)
    nb = len(prenom)
    prenom = UCASE(LEFT(prenom,1)) & LCASE(RIGHT(prenom,nb-1)) 'prends la première lettre
    nom = UCASE(nom)
    nom_complet = nom & " " & prenom
    'wscript.echo "prenom " & prenom
    wscript.echo "Nom complet : " & nom & " " & prenom
    normalisation_nom_prenom=nom_complet
End Function

recuperation_donnees()
Re : Le service d'annuaire ne peut pas effectuer l'opération requise sur l'attribut RDN d'un objet par : BefaDuDesert le 07/05/2007 11:17:04
Répondre Rép. Ecrire un message privé MP Voir les autres messages de ce membre 3 msg Voir les autres messages de ce membre sur tout CS 17 msg CS
J'ai vu pourquoi ce n'était pas possible : l'attribut que je veux changer est un membre de l'identifiant de l'utilisateur donc je pense qu'il faudrait faire une sorte de copie mais je ne sais pas comment faire !
Re : Le service d'annuaire ne peut pas effectuer l'opération requise sur l'attribut RDN d'un objet par : TDEMAN (1/1 Membre Club 1/1) le 08/05/2007 11:13:42
Répondre Rép. Ecrire un message privé MP Voir les autres messages de ce membre 26 msg

Bonjour,

tu peux modifier sans aucun problème le nom complet (displayname) de l'utilisateur, ce qui semblait être le but initial.

Le fait de renommer devrait être tout à fait possible, puisque cela est faisable par l'interface.

En voulant modifier le champ "cn", tu scies la branches avec laquelle tu n'es connectée à l'utilisateur.

Donc, la logique est de se placer sur le conteneur situé au niveau supérieur (probablement une OU) contenant l'objet que l'on veut renommer.

Voici un exemple trouvé sur Internet: Il remplace le "CN=xxxx" et le login d'accès (SamAccountName). Ceci n'est pas obligatoire!

' ------ SCRIPT CONFIGURATION ------
strParentDN    = "<ParentDN>"    ' e.g. cn=Users,dc=rallencorp,dc=com
strUserOldName = "<OldUserName>" ' e.g. jsmith
strUserNewName = "<NewUserName>" ' e.g. jim
' ------ END CONFIGURATION ---------

set objCont = GetObject("LDAP://" & strParentDN)
objCont.MoveHere "LDAP://cn=" & strUserOldName & "," & strParentDN, _
                 "cn=" & strUserNewName
set objUser = GetObject("LDAP://cn=" & strUserNewName & "," & strParentDN)
objUser.Put "sAMAccountName", strUserNewName
objUser.SetInfo
WScript.Echo "Rename successful"

A bientôt,

Thierry DEMAN
MS MVP Exchange
http://www.faqexchange.info/

Re : Le service d'annuaire ne peut pas effectuer l'opération requise sur l'attribut RDN d'un objet par : BefaDuDesert le 10/05/2007 10:02:23
Répondre Rép. Ecrire un message privé MP Voir les autres messages de ce membre 3 msg Voir les autres messages de ce membre sur tout CS 17 msg CS
Réponse acceptée !
Bonjour,
merci pour ta réponse mais j'ai procédé d'une autre manière : j'ai déplacé l'utilisateur, voici le code :
Sub recuperation_donnees()
    ' Recherche du domaine Active Directory courant
    Set oRootDSE = GetObject("LDAP://RootDSE")
    strDomainNC = oRootDSE.Get("defaultNamingContext")
    ' Connexion de type base de donnée à Active Directory
    Set oConnection = CreateObject("ADODB.Connection")
    oConnection.Provider = "ADsDSOObject"
    oConnection.Open "ADs Provider"
    Dim nom_complet, prenom
    'On recherche tous les utilisateurs dans tous les niveaux de l?arborescence
    Set oRecordset = oConnection.Execute("<GC://"+StrDomainNC+">;(&(objectCategory=user));distinguishedName,sn,givenName,name,displayname,samaccountname;subtree")

    ' Boucle sur les enregistrements.
    If Not oRecordset.EOF Then
        While Not oRecordset.EOF
        ' Les champs vides ne peuvent pas être concaténés
        nom_LDAP=VerificationNul(oRecordSet.Fields("distinguishedName"))
        nom_complet_actuel=VerificationNul(oRecordSet.Fields("name"))
        nom_famille=VerificationNul(oRecordset.Fields("sn"))
        prenom=VerificationNul(oRecordset.Fields("givenName"))
        If NOT (nom_famille=""  or prenom="") Then
            nom_complet = normalisation_nom_prenom (nom_famille,prenom)
            if NOT (nom_complet = nom_complet_actuel) Then
                res=MiseAJourCompte(nom_LDAP, nom_complet_actuel, nom_complet)
            End If
        End If
        oRecordset.movenext
        Wend
    End If
End Sub

'fonction permettant de faire le changement
Function MiseAJourCompte(n_LDAP, n_c_actuel, n_complet)
    'modification du nom_complet pour obtenir la LDAP de l'OU
    pour_OU="CN=" & n_c_actuel & "," 'remise dans le contexte pour connaitre la longueur de la chaine
    nb=len(n_LDAP)-len(pour_OU)
    'on retire la partie CN=Nom_Utilisateur,
    pour_OU=Right(n_LDAP, nb)
    'wscript.echo "nombre " & nb & " n_LDAP " & n_LDAP & " LDAP_OU " & pour_OU
    fin = "CN=" & n_complet
    Set objNewUser = GetObject("LDAP://"& pour_OU)
    Set objMoveUser = objNewUser.MoveHere ("LDAP://" & n_LDAP, fin)
    UpdateAccount=1
End Function

'fonction permettant de vérifier si le champ est nul ou pas
Function VerificationNul(champ)
  If not (isnull(champ)) Then
    VerificationNul=champ
  Else
    VerificationNul=""
  End If
End Function

'fonction permettant de normaliser le nom complet suivant la politique d'annuaire
Function normalisation_nom_prenom(nom, prenom)
    nb = len(prenom)
    prenom = UCASE(LEFT(prenom,1)) & LCASE(RIGHT(prenom,nb-1)) 'prends la première lettre
    nom = UCASE(nom)
    nom_complet = nom & " " & prenom
    'wscript.echo "Nom complet : " & nom & " " & prenom
    normalisation_nom_prenom=nom_complet
End Function

'fonction replace ne fonctionne pas en VBS !
Function remplacer(ancienne_chaine, a_remplacer, remplacement)
    valeur = Instr(chaine, a_remplacer)
    'wscript.echo "valeur" & valeur
    long_mot = len(a_remplacer)
    long_chaine = len(chaine)
    valeur_fin= long_chaine - long_mot
    remplacer = left (chaine, valeur-1) & remplacement & right(chaine, (long_chaine - (long_mot+valeur))+1)
End Function

Function supprimer(ancienne_chaine, a_supprimer)
    valeur = Instr(chaine, mot)
    wscript.echo "valeur" & valeur
    long_mot = len(mot)
    long_chaine = len(chaine)
    valeur_fin= long_chaine - long_mot
    supprimer = left (chaine, valeur-1) & right(chaine, (long_chaine - (long_mot+valeur))+1)
End Function

recuperation_donnees()



Participer à cet échange

Pour participer aux échanges, vous devez vous authentifier.
Login et mot de passe que vous avez sur
CodeS-SourceS/TechnoS-SourceS




Mot de passe oublié ? / Activation de compte
Créer un compte