Question
Faire un Move Computer dans l'AD (Résolu)
- rodriguez
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 61
- Remerciements reçus 0
Débutant en script en tout genre;
Je suis entrain de créer un petit script en powershell pour déplacer les noms de machines qui se mettent automatiquement dans le CN=computer pour les mettre dans une OU personnalisée.:
Mais lorsque le script arrive au Move j'ai droit à l'erreur suivante:
Exception lors de l'appel de «*movehere*» avec «*2*» argument(s)*: «*Le serveur ne souhaite pas traiter la requête. (Exception de HRESULT : 0x80072035)*»
Apres avoir cherché sur le Net je tombe sur cette page de Microsoft:
support.microsoft.com/kb/326978
Toutefois cette page stipule une déplacement d'utilisateur et non d'ordinateur comme dans mon cas et sur des domaines differents qui n'est pas mon cas non plus étant en mono-domaine.
Voici le script:
#Trier dans le CN computer les ordinateurs intégrés au domaine
#avec une nomenclature commencant par L (laptop) ou D (desktop)
#Puis de déplacer les \"L\" dans l'OU portable et D dans l'OU bureau
Set-PSdebug -strict
#LDAP où se trouve les machines a récupérer, filtré sur le type computer
$ldapQuery = [ADSI] 'LDAP://CN=Computers,DC=fr,DC=compass,DC=local'
$objrechercher = New-object system.directoryservices.directorysearcher($ldapQuery)
$objrechercher.filter='(&(objectCategory=computer))'
# les OU de destinations pour le déplacement
$OUPortables = [ADSI] 'LDAP://OU=Portables,OU=Stations,DC=fr,DC=compass,DC=local'
$OUStations = [ADSI] 'LDAP://OU=Bureau,OU=Stations,DC=fr,DC=compass,DC=local'
# creation de la boucle avec recherche des elements se trouvant dans le CN=computer$boucle = $objrechercher.findall()
foreach ($membre in $boucle)
{
$namesordi = $membre.properties[\"name\"]
#creation de la condition des noms commencant par L ou D
if (($namesordi -like \"L*\" ) -or ($namesordi -like \"l*\"))
{
write-host \"Portable déplacé\"
$Ouportables.movehere('LDAP://CN=Computers,DC=fr,DC=Compass,DC=local','CN=$namesordi')
}
elseif (($namesordi -like \"D*\" ) -or ($namesordi -like \"d*\" ))
{
write-host \"Desktop déplacé\"
$OUStations.movehere('LDAP://CN=Computers,DC=fr,DC=Compass,DC=local','CN=$namesordi')
}
}
Donc si vous avez une idée pour contourner, résoudre ce problème j'en serais ravis.
Merci d'avance.<br><br>Message édité par: Arnaud, à: 5/08/08 08:51
Connexion ou Créer un compte pour participer à la conversation.
- rodriguez
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 61
- Remerciements reçus 0
Pour faire plus simple:
l'erreur se produit lors de l'exécution de:
\"
$OUPortables = [ADSI] 'LDAP://OU=Portables,OU=Stations,DC=fr,DC=compass,DC=local'
$Ouportables.movehere('LDAP://CN=Computers,DC=fr,DC=Compass,DC=local','CN=LMARS-406127')
\"
Exception lors de l'appel de « movehere » avec « 2 » argument(s) : « Le serveur ne souhaite pas traiter la requête. (Exception de HRESULT : 0x80072035) »
Au niveau de ligne : 3 Caractère : 22
+ $Ouportables.movehere <<<< ('LDAP://CN=Computers,DC=fr,DC=Compass,DC=local','CN=LMARS-406127')
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
La méthode MoveHere est un peu particulière dans son emploi. En fait, il faut raisonner à l'inverse de la logique. C'est à dire que tu vas appliquer la méthode MoveHere à l'OU de destination et lui passer en paramètre l'objet à déplacer.
Et il faut donner à la méthode MoveHere 2 paramètres, le premier le chemin LDAP complet de l'objet et le second son nouveau nom (mettre le même si on ne veut pas le changer).
Exemple :
[code:1]PS> $OUPortables = [ADSI]'LDAP://OU=Portables,OU=Stations,DC=fr,DC=compass,DC=local'
PS > $OuPortables.movehere('LDAP://'CN=LMARS-406127,CN=Computers,DC=fr,DC=Compass,DC=local','CN=LMARS-406127')[/code:1]
En écrivant ces lignes, je me rends compte que tu avais compris comment fonctionnait la méthode MoveHere. Le seul problème dans ton code vient, il me semble, que tu ne donnes pas dans le premier argument le chemin complet de ton objet.
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- rodriguez
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 61
- Remerciements reçus 0
Bonjour Noxudius et bienvenue dans le forum
La méthode MoveHere est un peu particulière dans son emploi. En fait, il faut raisonner à l'inverse de la logique. C'est à dire que tu vas appliquer la méthode MoveHere à l'OU de destination et lui passer en paramètre l'objet à déplacer.
Et il faut donner à la méthode MoveHere 2 paramètres, le premier le chemin LDAP complet de l'objet et le second son nouveau nom (mettre le même si on ne veut pas le changer).
Exemple :
[code:1]PS> $OUPortables = [ADSI]'LDAP://OU=Portables,OU=Stations,DC=fr,DC=compass,DC=local'
PS > $OuPortables.movehere('LDAP://'CN=LMARS-406127,CN=Computers,DC=fr,DC=Compass,DC=local','CN=LMARS-406127')[/code:1]
En écrivant ces lignes, je me rends compte que tu avais compris comment fonctionnait la méthode MoveHere. Le seul problème dans ton code vient, il me semble, que tu ne donnes pas dans le premier argument le chemin complet de ton objet.
Arnaud
Bonjour Arnaud et merci pour l'acceuil,
Dans l'exemple donné, la variable $OUportables est bien l'OU de destination.
Ton exemple en tant que telle fonctionne et je t'en remercies. j'avais bien omis 1 argument.
Mais le problème vient que CN=LMARS-406127 est une donnée fixe et je dois donc la remplacer par une variable du style:
[code:1]
$Ouportable.movehere('LDAP://CN=$namesordi,CN=Computers,DC=fr,DC=Compass,DC=local','CN=$namesordi')
[/code:1]
Et si je rentre cette variable j'ai le code erreur:
Cet objet ne se trouve pas sur le serveur. (Exception de HRESULT : 0x80072030) »
Donc ma question est est-ce qu'il est possible de rentrer une variable dans la syntaxe LDAP... et comment l'écrire... ??
Au fait bravo pour le bouquin c'est grâce à lui que
j'ai pu écrire mais IF et foreach.
A bientôt.
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
Je ne sais pas si tu as remarqué mais lorsque tu mets une chaine entre simples guillemets, alors PowerShell la conserve fidèlement intacte. Je veux dire par là que l'interpréteur de commandes n'analyse pas le contenu de la chaine pour savoir s'il y a une variable (ou autre chose) à substituer ou non. Pour ce faire, et dans ton cas, il faut utiliser les doubles guillemets; ainsi ta variable sera remplacée par sa valeur.
Ceci devrait donc marcher :
[code:1]PS > $OuPortable.MoveHere(\"LDAP://CN=$namesordi,CN=Computers,DC=fr,DC=Compass,DC=local\",\"CN=$namesordi\"«»)[/code:1]
Tiens moi au courant du résultat.
A bientôt,
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- rodriguez
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 61
- Remerciements reçus 0
Cela fonctionne parfaitement:
je me permets donc de réécrire le script
ceci pouvant servir je penses:
[code:1]
#Trier dans le CN computer les ordinateurs intégrés au domaine
#avec une nomenclature commencant par L (laptop) ou D (desktop)
#Puis de déplacer les \"L\" dans l'OU portable et D dans l'OU bureau
Set-PSdebug -strict
#LDAP ou se trouve les machines a recuperer, filtré sur le type computer
$ldapQuery = [ADSI] 'LDAP://CN=Computers,DC=fr,DC=compass,DC=local'
$objrechercher = New-object system.directoryservices.directorysearcher($ldapQuery)
$objrechercher.filter='(&(objectCategory=computer))'
# les OU de destinations pour le déplacement
$OUPortables = [ADSI] 'LDAP://OU=Portables,OU=Stations,DC=fr,DC=compass,DC=local'
$OUStations = [ADSI] 'LDAP://OU=Bureau,OU=Stations,DC=fr,DC=compass,DC=local'
# creation de la boucle avec recherche des elements se trouvant dans le CN=computer
$boucle = $objrechercher.findall()
foreach ($membre in $boucle)
{
$namesordi = $membre.properties[\"name\"]
#creation de la condition des noms commencant par L ou D
if (($namesordi -like \"L*\" ) -or ($namesordi -like \"l*\"))
{
#il est possible de router le résultat dans un fichier TXT.
write-host \"Portable déplacé\"
$membre
# requette de déplacement mais attention comme il sagit de variable on doit mettre \" \" pour le LDAP contrairement à la déclaration [ADSI] qui s'écrit avec des ' '
$Ouportables.movehere(\"LDAP://CN=$namesordi,CN=Computers,DC=fr,DC=Compass,DC=local\",\"CN=$namesordi\")
}
elseif (($namesordi -like \"D*\" ) -or ($namesordi -like \"d*\" ))
{
write-host \"Desktop déplacé\"
$membre
$OUStations.movehere(\"LDAP://CN=$namesordi, CN=Computers,DC=fr,DC=Compass,DC=local\",\"CN=$namesordi\")
}
}
[/code:1]
Je reviendrais surement avec d'autres questions car j'ai l'intention de créer un script pour recevoir par mail les personnes dont le mot de passe va bientôt expirer.
Merci encore !!!!<br><br>Message édité par: noxydius, à: 1/08/08 07:42
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Faire un Move Computer dans l'AD (Résolu)