Question
[RESOLU]double foreach
- MCH
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
Je cherche a faire une double boucle 'foreach'.
Le but du script est de lire un fichier qui contient une liste de compte a ignorer dans le traitement du 'if'.
[code:1]
$ou1 = [ADSI]\"LDAP://ou=1,ou=z-prototype,dc=domaine,dc=dom\"
$ignored1 = Get-Content C:\scripts\ignored1.txt
$userlist = $ou1.Get_Children()
ForEach-Object ($ignoredlist -in $ignored1)
{
ForEach-Object ($user -in $userlist)
{
if ($user.samaccountname -eq $ignoredlist)
{
Write-Output \"Le mot de passe de l'utilisateur $user.name ne sera pas traite\"
}
elseif ($user.Class -eq \"user\" -and $user.samaccounttype -eq \"805306368\"«»)
{
$User.userAccountControl = 512
$User.SetInfo()
$User.pwdLastSet = 0
$User.SetInfo()
}
}
}
[/code:1]
Ce script se contente de s'afficher lorsque je l'execute.
Je ne vois pas ou est le probleme.
Merci d'avance pour votre aide !
Message édité par: MCH, à: 17/06/13 14:28<br><br>Message édité par: MCH, à: 26/07/13 09:16
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
sans vouloir etre desagreable, pourrait tu utilisé le mode code pour afficher tes scripts, et l'indentation serait aussi un plus pour la lecture (desolé de t'ennuyer avec ca)
n'aurait tu pas des messages erreur ?
ceci dis, peut tester ca chez toi
[code:1]$ou1 = [ADSI]\"LDAP://ou=1,ou=z-prototype,dc=domaine,dc=dom\"
$userlist = $ou1.Get_Children()
ForEach ($user in $userlist)
{
Write-Output \"Le mot de passe de $($user.name) traite\"
}[/code:1]
j'ai enlevé le - du in des forearch car il n'en faut pas.
et j'ai mis $user.name dans $() pour forcer la \"resolution de nom\"
de plus foreach-object ne fonctionne pas alors que sont alias foreach pas de probleme ?!!!
si quelqu'un sait pourquoi .....
dis nous ce que donne les quelques ligne ci-dessus<br><br>Message édité par: 6ratgus, à: 17/06/13 14:11
Connexion ou Créer un compte pour participer à la conversation.
- MCH
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
Tout d'abord merci pour ta reponse.
Je viens d'editer mon post pour plus de clarete.
A ma grande stupeur, avec l'usage de la fonction \"foreach\" et non \"ForEach-Object\" ca fonctionne o_O ?!
Je ne comprends pas pourquoi mais qu'importe, j'avance !
A present, j'obtiens ceci apres affichage des resultats a l'aide du script suivant :
[code:1]
$ou1 = [ADSI]\"LDAP://ou=1,ou=z-prototype,dc=domaine,dc=dom\"
$ignored1 = Get-Content C:\scripts\ignored1.txt
$userlist1 = $ou1.Get_Children()
foreach ($ignoredlist in $ignored1)
{
Write-Output \"compte a ignorer en traitement $ignoredlist\"
foreach ($user in $userlist)
{
Write-Output \"compte utilisateur en traitement $user\"
if ($user.samaccountname -eq $ignoredlist)
{
Write-Output \"Le mot de passe de l'utilisateur $user.name ne sera pas traite\"
}
elseif ($user.Class -eq \"user\" -and $user.samaccounttype -eq \"805306368\"«»)
{
$User.userAccountControl = 512
$User.SetInfo()
$User.pwdLastSet = 0
$User.SetInfo()
}
}
}
[/code:1]
Resultat :
<br><br>Message édité par: MCH, à: 17/06/13 14:39compte a ignorer en traitement proto3
compte utilisateur en traitement System.DirectoryServices.DirectoryEntry
compte utilisateur en traitement System.DirectoryServices.DirectoryEntry
compte utilisateur en traitement System.DirectoryServices.DirectoryEntry
compte utilisateur en traitement System.DirectoryServices.DirectoryEntry
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
donc il te reste la derniere modif indiquer !!
et j'ai mis $user.name dans $() pour forcer la \"resolution de nom\"
ca force a powershell de convertir la variable en chaine avant de traiter toute la chaine de caracteres
soit[code:1]Write-Output \"Le mot de passe de l'utilisateur $user.name ne sera pas traite\"
[/code:1]<br><br>Message édité par: 6ratgus, à: 17/06/13 16:04
Connexion ou Créer un compte pour participer à la conversation.
- MCH
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 7
- Remerciements reçus 0
Voici le script actuel :
[code:1]
$ou1 = 0
$ignored1 = 0
$ignoredlist1 = 0
$user = 0
# $ou1 = [ADSI]\"LDAP://ou=1,ou=z-prototype,dc=domaine,dc=dom\"
$ou1 = Get-ADUser -Filter * -SearchBase \"ou=1,ou=z-prototype,dc=domaine,dc=dom\"
$ignored1 = Get-Content C:\scripts\ignored1.txt
# $userlist1 = $ou1.Get_Children()
foreach ($ignoredlist1 in $ignored1)
{
foreach ($user in $ou1)
{
$user.SamAccountName
$user.ObjectClass
$ignoredlist1
if ($user.samaccountname -like $ignoredlist1)
{
Write-Output \"L'utilisateur $('\"'+$user.samaccountname+'\"') fait parti de la liste d'exclusion, le mot de passe n'expire jamais\"
exit
}
elseif ($user.ObjectClass -eq \"user\" -and $user.samaccounttype -eq \"805306368\"«»)
{
$User.userAccountControl = 512
$User.SetInfo()
$User.pwdLastSet = 0
$User.SetInfo()
Write-Output \"L'utilisateur $('\"'+$user.samaccountname+'\"') devra changer de mot de passe\"
}
else {Write-Output \"wtf is this -> $('\"'+$user.samaccountname+'\"')\"}
}
}
[/code:1]
Le resultat :
proto3
user
proto
wtf is this -> \"proto3\"
proto4
user
proto
wtf is this -> \"proto4\"
proto
user
proto
L'utilisateur \"proto\" fait parti de la liste d'exclusion, le mot de passe n'expire jamais
Je precise que ces 3 utilisateurs sont bien dans l'OU et qu'ils sont tous dans le fichier \"ignored1.txt\".
J'ai aussi ajoute des comptes qui n'existent pas pour verifier si il lit bien tout le fichier.
Je ne comprends pas le resultat car je devrais tous les voir comme \"L'utilisateur \"proto\" fait parti de la liste d'exclusion, le mot de passe n'expire jamais\".
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
rajoute
a ta ligne get-aduser-Properties sAMAccountType
et retest
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [RESOLU]double foreach