Question aide pour corriger script AD

Plus d'informations
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30480 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Bonjour Laurent, je pense que je suis parti trop loin dans mon idée et surtout dans les tests.

Pour là où je voulais aller c'était d'insérer les utilisateurs dans leurs groupes (sa c'est bon je sais faire), mais je pensais aussi à faire des tests:

- si l'utilisateur est déjà dans son groupe , pas besoin de le rajouter.
- si un groupe est vide (par exemple ajouté apres l'utilisation du script complet, regarder si dans le csv il est censé avoir des utilisateurs et si oui les incorperer à l'intérieur) et c'est là ou sa coince.

Donc soit je pars sur la commande qui intègre tout le monde même si les utilisateurs sont déjà dans leurs groupes sans tests (et le morceau de script que j'ai montré sert simplement de contrôle ), soit j'essaye de faire mes tests de présence dans les groupe ainsi que pour l'éventualité d'un groupe vide.

Pour le groupe vide il y a un soucis et je n'arrive pas à mettre le doigt dessus car soit le script intègre qu'un utilisateur soit il fait rien, où me les créé tous (commande pour intégrer tout le monde sans tests...).
J'ai recontrôlé mon csv, l'utilisateur qu'il me rajoute est sytématiquement le même (tech4)

$groups= Get-ADGroup -Filter "*" | where { $_.Name -match "gg-*"} |select name
foreach ($Group in $groups)
{
  $name=$UG.UserName
    Write-Host " Group : $($Group.Name)" -ForeGroundColor Green
    Write-Host

    Get-ADGroupMember $($Group.Name) -Recursive | Select -ExpandProperty Name
    Write-Host

        if($((Get-ADGroupMember -Identity $Group.name).Count) -eq 0)  
           {
           write-host  "le groupe $Group est vide   " -ForegroundColor Red
           Write-Host
           Add-ADGroupMember -Members $UG.SamAccountName  -Identity
$Group
           write-host   "l'utilisateur $name a ete ajoute au groupe : $Group" -ForegroundColor Yellow
           }

           else
           {
           write-host  "le groupe $Group contient des utilisateurs   " -ForegroundColor yellow
           Write-Host
           }

}

résultat console:

le groupe @{name=gg-techniciens} est vide      ====> normal car fait exprès

Add-ADGroupMember : Impossible de lier le paramètre «Identity». Impossible de créer un objet de
type «Microsoft.ActiveDirectory.Management.ADGroup». La carte ne peut pas définir la valeur de la
propriété «name».
Au caractère Ligne:15 : 69
+ ...       Add-ADGroupMember -Members $UG.SamAccountName  -Identity
$Group
+                                                                                                                 ~~~~~~
    + CategoryInfo          : InvalidArgument : (:) [Add-ADGroupMember], ParameterBindingExceptio
   n
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.ActiveDirectory.Management
   .Commands.AddADGroupMember
 

l'utilisateur Tech4 a ete ajoute au groupe : @{name=gg-techniciens} ===> faux, utilisateur non ajouté dans son groupe

variante juste le changement "identity":

$groups= Get-ADGroup -Filter "*" | where { $_.Name -match "gg-*"} |select name
foreach ($Group in $groups)
{
  $name=$UG.UserName
    Write-Host " Group : $($Group.Name)" -ForeGroundColor Green
    Write-Host

    Get-ADGroupMember $($Group.Name) -Recursive | Select -ExpandProperty Name
    Write-Host

        if($((Get-ADGroupMember -Identity $Group.name).Count) -eq 0)  
           {
           write-host  "le groupe $Group est vide   " -ForegroundColor Red
           Write-Host
           Add-ADGroupMember -Members $UG.SamAccountName  -Identity
$($Group.name)
           write-host   "l'utilisateur $name a ete ajoute au groupe : $Group" -ForegroundColor Yellow
           }

           else
           {
           write-host  "le groupe $Group contient des utilisateurs   " -ForegroundColor yellow
           Write-Host
           }

}


résultat console:

 Group : gg-techniciens

le groupe @{name=gg-techniciens} est vide   ====> normal car fait exprès


l'utilisateur Tech4 a ete ajoute au groupe : @{name=gg-techniciens} ===> vrai mais où sont les 5 autres techniciens...

Mon problème est celui-ci, je n'arrive pas à déterminer pourquoi il n'y à que le tech4 qui s'ajoute et pas les 5 autres membres, j'ai copier la ligne du tech3 pour créer le tech4 et j'ai simplement changé le chiffre dans chaque colones de mon csv donc les infos sont les même...

Pour pousser +  loin j'ai vidé un autre groupe et la j'y comprends encore moins quelques chose

 Group : gg-atelier


le groupe @{name=gg-atelier} est vide   

l'utilisateur Tech4 a ete ajoute au groupe : @{name=gg-atelier}

sauf que dans mon csv ce foutu tech4 n'est pas dans atelier...


Bon j'ai décidé de changer la place du tech4 dans le fichier et donc le script ne prend en compte que la dernière ligne du csv et là je n'ai aucune idée du pourquoi car pour tout le reste sa marche bien et pour cette partie il ne sait plus lire le csv...

 
Dernière édition: il y a 3 ans 2 mois par garrigues.

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

Plus d'informations
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30481 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
bon j'édite pas ma réponse précédente pour éviter d'embrouiller mais la j'ai trouvé une solution qui intègre bien les utilisateurs dans leur groupe qui est vide, et ils y sont tous

$groups= Get-ADGroup -Filter "*" | where { $_.Name -match "gg-*"} |select name
foreach ($Group in $groups)
{
  $name=$UG.UserName
  $UG.group=$($Group.Name)
    Write-Host " Group : $($Group.Name)" -ForeGroundColor Green
    Write-Host

    Get-ADGroupMember $($Group.Name)| Select -ExpandProperty Name
    Write-Host

        if($((Get-ADGroupMember -Identity $Group.name).Count) -eq 0)  
           {
           write-host  "le groupe $Group est vide   " -ForegroundColor Red
           $UGp=Import-Csv -path "C:\users-domjacom.csv" -delimiter ";"
             foreach($UG in $UGp)
           {
           Write-Host
           Add-ADGroupMember -Members $UG.SamAccountName  -Identity $UG.group
           write-host   "l'utilisateur $name a ete ajoute au groupe : $Group" -ForegroundColor Yellow
           }
           }
           
           else
           {
           write-host  "le groupe $Group contient des utilisateurs   " -ForegroundColor yellow
           Write-Host
           }
}


il y a juste un hic c'est que sur la console il m'affiche

 Group : gg-techniciens


le groupe @{name=gg-techniciens} est vide   

l'utilisateur RolandDELORS a ete ajoute au groupe : @{name=gg-techniciens}

l'utilisateur RolandDELORS a ete ajoute au groupe : @{name=gg-techniciens}

l'utilisateur RolandDELORS a ete ajoute au groupe : @{name=gg-techniciens}

l'utilisateur RolandDELORS a ete ajoute au groupe : @{name=gg-techniciens}....


et cela 34 fois (soit le nombre d'utilisateurs présents dans le csv) en ne me marquant que le dernier nom présent dans le csv à chaques fois.

Donc je ne m'explique toujours pas d'où peut venir le soucis mais le résultat interne fonctionne car mes 6 techniciens sont bien dans leur, groupe, pour le test isinsert et isinside je pense que sa va être mort vu qu'il ne me précise pas le bon nom d'utilisateur ajouté dans son groupe donc je vais zappé cette partie ainsi que le fichier de log qui me donne lui aussi n'importe quoi me disant qu'1 seul utilisateur a été intégré (toujours le dernier du csv) et  il me dit dans tous les groupes alors que la réalité n'est pas du tout celle la...
Dernière édition: il y a 3 ans 2 mois par garrigues.

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

Plus d'informations
il y a 3 ans 2 mois #30483 par Laurent Dardenne
>>je pense que je suis parti trop loin dans mon idée
Disons qu'il faut être équipé.

>>Donc soit je pars sur la commande qui intègre tout le monde même si les utilisateurs sont déjà dans leurs groupes sans tests
C'est une autre approche, on fait qq chose qui peut échouer, dans ce il faut une gestion d'erreur précise ( sur le type de l'exception) car le traitement peut échouer pour une toute autre raison.

>>Pour le groupe vide il y a un soucis
Probable , mais le code que tu fournis utilise =$UG.UserName et je ne sais pas d'où ça sort :-/

Tu utilises + fois 'Get-ADGroupMember' je ne comprend pas pourquoi.

>>Donc je ne m'explique toujours pas d'où peut venir le soucis
La variable $Name n'est pas mis à jour car elle pointe tjr sur le même objet ($UG.UserName). C'est donc une variable qui reste constante ;-)

Tutoriels PowerShell

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

Plus d'informations
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30484 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Bonjour Laurent, en lisant ta réponse je pense clairement que mon idée de script était très largement audessus de mes compétences, mais je suis quelqu'un qui s'acharne pour réussir même si là j'avoue que je sèche complètement .

Pour le moment powershell me bat par KO incontestable .

Pour ce qui est du :'Get-ADGroupMember'
Le 1er est pour m'indiquer les gens présents dans les groupes (ce qui m'a été utile car je me suis aperçu qu'a force de faire des manipulation mon "roland delors" avait été ajouter à tous mes groupe alors qu'il n'est que dans l'un d'eux)

Le 2ème lui c'est pour vérifier si un groupe contient personne (ce qui n'est pas censé être normal pour un groupe que l'on a créé...)

Pour le UserName il s'agit d'une colone du csv (j'ai oublier de renommer comme tu me l'avais conseillé dans une de tes réponses précédentes.

Voici les colones que contient le csv avec les infos du 1er user mais qui montre ce que j'ai pour les 33 autres

CN Martine LEROY
DistinguishedName CN=martineleroy,OU=direction,OU=entreprise-jacom,DC=domjacom,DC=local
Enable True
GivenName Martine
EmailAddress Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
MailNickname m.leroy
UserName MartineLEROY
SamAccountName martineleroy
SurName LEROY
UserPrincipalName Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. 
group gg-direction
groups gg-atelier
member CN=gg-direction,CN=gg-atelier,OU=groupes-securite,OU=entreprise-jacom,DC=domjacom,DC=local
path OU=direction,OU=entreprise-jacom,DC=domjacom,DC=local
groupes CN=martineleroy,CN=gg-direction,CN=gg-atelier,OU=direction,OU=entreprise-jacom,DC=domjacom,DC=local


Chaque mots en bleu correspond à une colone du csv.

Je voulais tenter d'intégrer uniquement les utilisateurs qui nétaient pas dans leurs groupe pour simplement éviter une surcharge de travail inutile s'il n'en manque qu'un ou 2 mais pour le moment je n'y arrive pas.




 
Dernière édition: il y a 3 ans 2 mois par garrigues.

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

Plus d'informations
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30490 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Bon voilà ou j'en suis.

Les commandes AD ont viviblement un fonctionement particulier qui m'échape encore, car je n'arrive absolument pas au résultat que je voulais.
J'ai mis la partie rouge que j'ai supprimé dans mes tests car elle ne fonctionnait pas.

#Chargement des modules active directory
Import-Module ActiveDirectory

#Ajout des utilisateurs aux groupes primaires

$UGp=import-csv -path "C:\users-domjacom.csv" -delimiter ";"

Function New-UserPrincipalgroupInfos{
 param(
        [Parameter(Mandatory=$True,position=0)]
    $SamAccountName,
        [Parameter(Mandatory=$True,position=1)]
    $Name,
        [Parameter(Mandatory=$True,position=2)]
    $Path
    )

[pscustomobject]@{
    PSTypeName='UserPrincipalgroupInfos';
    SamAccountName=$UG.SamAccountName
    Name=$UG.group;
    Path=$UG.path;
    }

    $PGROUP=@(
    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName1' -Name 'groupp1' -Path 'path' `

    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName2' -Name 'groupp2' -Path 'path' `

    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName3' -Name 'groupp3' -Path 'path' `
    )
}

$UGp=Import-Csv -path "C:\users-domjacom.csv" -delimiter ";"|
 Foreach-object {
    $_ |
     Add-member -MemberType NoteProperty -Name isInsert -Value $false -PassThru|
     Add-member -MemberType NoteProperty -Name isInside -Value $false -PassThru
 }


Write-Output "voici la liste des groupes presents dans l'AD et des membres qu'ils contiennent"

$groups= Get-ADGroup -Filter "*" | Where-Object { $_.Name -match "gg-*"} |Select-Object name
foreach ($Group in $groups)
{
    Write-Output "Group : $($Group.Name)"

    Get-ADGroupMember $($Group.Name)  | Select-Object -ExpandProperty Name

$gp=($((Get-ADGroupMember -Identity $Group.name).Count) -eq 0)

    if($gp -eq $true)
    {
    Write-Output "le groupe $Group est vide"
$UGp=Import-Csv -path "C:\users-domjacom.csv" -delimiter ";"

    foreach($UG in $UGp)
    {
    $name=$UG.FullName
   $sam=$UG.SamAccountName
  $group=$UG.GroupePrincipal
    Add-ADGroupMember -Members $UG.SamAccountName -Identity $UG.GroupePrincipal
    Write-Output "l'utilisateur $name a ete ajoute a son groupe principal : $Group"
    }
}

    else
    {

    Write-Output "le groupe $Group contient des utilisateurs"
}
add-Content -path "C:\resultatscript.txt" -value  $UG.SamAccountName, $UG.GroupePrincipal
}


Cette partie trouve bien le groupe vide , teste tout les utilisateurs et insère les bons mais à l'écran me dit que tout mes utilisateurs ont étaient intégrés au groupe technicien hors ce n'est pas vrai.
J'avais dans l'idée de faire un test : si un groupe est vide , prend dans le csv les lignes qui correspondent à celui-ci et ajoute les utilisateurs qu'il faut.
Sauf que toutes mes tentatives sont un échec...

L'autre partie consistait si un groupe n'était pas vide de comparer les utilisateurs présents avec ceux correspondants au groupe testé et d'incorporer celui ou ceux qui manquent (on pourraient imaginer que de nouveaux employés arrivent dans les groupes et au lieu que le script réintègre tout le monde il ne sélectionne que les nouveaux comptes).

Mais n'arrivant pas à trouver la solution pour le 1er soucis je doute de réussir sur le 2ème.

Concernant le fichier de logs, j'ai incorporé l'écriture de la date et heure de sa création mais je n'arrive pas a exporter toutes les données pour les classer par colonnes (sa me met toutes les infos sur 1 ligne et c'est du coup assez horrible à déchiffrer; il est fonctionnel pour la partie création OU racine, OU enfants, groupes et utilisateurs.

Pour l'incorporations des utilisateurs dans leur groupe c'est impossible , il reste buggué sur le "rolanddelors" et ne m'indique que lui donc j'ai sorti tout ce qui concernait cette partie.

J'ai renommé les colonnes du csv comme tu me l'avais suggéré mais sa ne change rien aux problèmes.

Je suis preuneur de toutes idées ou suggestions qui pourraient me permettre de réussir à faire ce que je voulais au départ, même si je commence à douter de la faisabilité réelle concernant la dernière partie (sauf si il y a une énorme boulette qui m'échape totalement ce qui ne m'étonnerait pas trop .

 
Dernière édition: il y a 3 ans 2 mois par garrigues.

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

Plus d'informations
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30492 par Laurent Dardenne
Salut,
tu peux simplifier l'écriture :
$gp=(Get-ADGroupMember -Identity $Group.name).Count -eq 0


>>hors ce n'est pas vrai.
Pour chaque groupe existant tu parcours la liste des utilisateurs et pour chacun tu affiches un message.
Pb de logique...
>>si un groupe est vide , prend dans le csv les lignes qui correspondent à celui-ci et ajoute les utilisateurs qu'il faut.
Regarde le cmdlet Group-object.

>>L'autre partie consistait si un groupe n'était pas vide de comparer les utilisateurs
Regarde le cmdlet Compare-object.

>>les classer par colonnes
Il n'existe pas de notion de colonne dans ton code, tu écris du texte :
Add-Content -path "C:\resultatscript.txt" -value $UG.SamAccountName, $UG.GroupePrincipal
En Powershell on manipule des objets (ayant des propriétés), si tu veux retravailler le résultat de ton traitement il faut l'exporter dans un format qui 'mémorise' la structure de ton/tes objets.
Export-csv/Import-csv par exemple, qui permet un usage avec un autre outil, exemple Excel.
Tu as aussi la sérialisation, Export-Clixml/Import-Clixml, mais reste spécifique à Powershell.

>>je commence à douter de la faisabilité réelle concernant la dernière partie
Simplifie ton traitement avec un ou deux groupes et UN utilisateur (une variable).
Tu peux aussi utiliser le debugger (ou Write-Debug) de Visual Studio ou ISE ( sa prise en main est plus rapide).[/code][/code]

Tutoriels PowerShell
Dernière édition: il y a 3 ans 2 mois par Laurent Dardenne.

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

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