Question Faire un Move Computer dans l'AD (Résolu)

Plus d'informations
il y a 17 ans 7 mois #2635 par rodriguez
Bonjour,

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.

Plus d'informations
il y a 17 ans 7 mois #2637 par rodriguez
Re-bonjour,

Pour faire plus simple:

l'erreur se produit lors de l'exécution de:

\&quot;
$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')
\&quot;

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 &lt;&lt;&lt;&lt; ('LDAP://CN=Computers,DC=fr,DC=Compass,DC=local','CN=LMARS-406127')

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

Plus d'informations
il y a 17 ans 7 mois #2638 par Arnaud Petitjean
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&gt; $OUPortables = [ADSI]'LDAP://OU=Portables,OU=Stations,DC=fr,DC=compass,DC=local'

PS &gt; $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.

Plus d'informations
il y a 17 ans 7 mois #2639 par rodriguez
Arnaud écrit:

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&gt; $OUPortables = [ADSI]'LDAP://OU=Portables,OU=Stations,DC=fr,DC=compass,DC=local'

PS &gt; $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.

Plus d'informations
il y a 17 ans 7 mois #2642 par Arnaud Petitjean
Salut Noxydius,

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 &gt; $OuPortable.MoveHere(\&quot;LDAP://CN=$namesordi,CN=Computers,DC=fr,DC=Compass,DC=local\&quot;,\&quot;CN=$namesordi\&quot;«»)[/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.

Plus d'informations
il y a 17 ans 7 mois #2643 par rodriguez
Et bien c'est super top !!!

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 \&quot;L\&quot; 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='(&amp;(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[\&quot;name\&quot;]



#creation de la condition des noms commencant par L ou D
if (($namesordi -like \&quot;L*\&quot; ) -or ($namesordi -like \&quot;l*\&quot;))
{

#il est possible de router le résultat dans un fichier TXT.
write-host \&quot;Portable déplacé\&quot;
$membre

# requette de déplacement mais attention comme il sagit de variable on doit mettre \&quot; \&quot; pour le LDAP contrairement à la déclaration [ADSI] qui s'écrit avec des ' '
$Ouportables.movehere(\&quot;LDAP://CN=$namesordi,CN=Computers,DC=fr,DC=Compass,DC=local\&quot;,\&quot;CN=$namesordi\&quot;)


}
elseif (($namesordi -like \&quot;D*\&quot; ) -or ($namesordi -like \&quot;d*\&quot; ))

{
write-host \&quot;Desktop déplacé\&quot;
$membre
$OUStations.movehere(\&quot;LDAP://CN=$namesordi, CN=Computers,DC=fr,DC=Compass,DC=local\&quot;,\&quot;CN=$namesordi\&quot;)
}
}

[/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.

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