0
votes

Comment corriger ne peut pas convertir l'erreur System.Object []

Je reçois l'erreur suivante lors de l'exécution de ce script:

get-adgroupmember: impossible de convertir 'system.Object []' au type 'Microsoft.actidirectory.management.adgroup' requis par le paramètre 'Identité'. La méthode spécifiée n'est pas prise en charge.

En outre, les utilisateurs se déplacent du groupe Win7 au groupe Win10, mais en fonction de s'ils sont membres des autres groupes dans les déclarations de si, aucun des groupes dans les déclarations de si elles sont en mouvement pour l'un des les utilisateurs. S'il vous plaît aider.

juste pour référence Le fichier userlist contient des noms d'utilisateur Active Directory dans un fichier texte tel que celui-ci: xxx

Le fichier texte grouplist contient des groupes Active Directory Comme ceci: xxx

code: xxx


11 commentaires

À quoi ressemble les membres $? Il semble que des membres $ devraient être quelque chose comme ... Membres $ = foreach ($ g en groupes de dollars) {get-adgroupmember -sidité $ Groupe.someProperty}


Je ne suis pas sûr de ce que tu veux dire? $ Membres n'est qu'une variable telle que définie dans le même sommet du script.


Je pense que m0lochwalker demande quelle est la structure du contenu de ce $ var. Vous appelez le code pour celui-ci avec une collection de groupes ... DOCS Dites [- identité] ... et cette valeur de paramètre est un groupe, pas une collection de groupes .


Lee, je n'utilise pas correctement grouplist.txt pour la collection de groupes?


@Jeff - Pour obtenir votre MSG à une personne en particulier, utilisez @ et leur nom tel qu'il apparaît lorsque vous le faites. [ grin ] ///// oui, vous utilisez la cmdlet incorrectement comme M0Lochwalker points de sortie ... Vous utilisez une collection où le Docs indiquent clairement que vous devez avoir un élément. L'exemple de code posté par m0lochwalker semble fonctionner de fonctionner lorsqu'il est ajusté pour adapter votre fichier source de données.


@Jeff donc, $ Membres n'est pas simplement une variable ... c'est la sortie de votre cmdlet à laquelle vous vous assignez à $ membres. Plus tard dans votre message, vous utilisez $ MEMBRES.SAMAccountName. Membres $ $ [0] vous donne-t-il une collection de propriétés pour cet objet, l'un d'entre eux étant SamAccountName?


Quelque chose comme $ membres = $ groupe | foreach-objet {get-adgroupmembermembermembermemberd $ _} pourrait aussi vous convenir.


Vous utilisez également la même chose si l'état encore et plus. Peut aussi bien faire tout enlever / ajouter quoi que ce soit, puisque votre condition ne change jamais. On dirait que vous devriez repenser beaucoup de script. Je peux aider quand je ne suis pas en mobile.


@ M0Lochwalker, si vous pouviez m'aider à proposer une logique qui fonctionnerait pour mon objectif, je l'apprécierais vraiment!


@ M0LOCHWALKER Je veux dire que je sais que je sais qu'un moyen serait d'avoir une instruction si une instruction et d'exécuter le script à plusieurs reprises, en modifiant le nom du groupe avec le nom du groupe durement codé, mais c'est ce que j'essaie d'empêcher de devoir faire.


@Jeff j'ai fourni une réponse ci-dessous. Soyez très sûr que vous testez d'abord sur un petit groupe de contrôle. Merci!


3 Réponses :


1
votes

Le Propriété de get-adgroupmember est Un singleton, pas un tableau .

Toutefois, la propriété accepte le pipeline d'entrée. Donc, vous pourrez peut-être faire quelque chose comme ceci: xxx

Bien que, IMX, certaines des commandes de l'annonce sont un peu bonsky en raison de leur âge. J'attends que vous ayez peut-être besoin de faire quelque chose comme ceci: xxx

Le reste de votre script a une sorte de logique confuse, cependant, je ne peux donc pas vraiment dire ce que vous voulez vraiment dire ce que vous " retenir de faire.

{snip}


basé sur vos commentaires, voici ce que je ferais.

Tout d'abord, je changerais de fichier de groupe. Au lieu d'une liste de texte brut des groupes, j'aurais un fichier CSV avec deux colonnes: l'ancien groupe et le nouveau groupe.

donc, grouplist.csv looks comme ceci: xxx

Vous avez maintenant une carte pour chaque groupe ancien et le groupe que vous souhaitez migrer vos utilisateurs.

maintenant, nous le faisons Comme ceci: xxx

[Remarque: retirez le -Qu- ut pour effectuer réellement les actions.]

Pour chaque groupe, nous obtenons une liste des membres des groupes, filtrez-le aux noms d'utilisateur dans $ utilisateur et enregistrez-le sur $ USERTOMOFY . Ensuite, nous transmettons cette liste des utilisateurs vers les commandes Supprimer et ajouter. Nous n'avons besoin que de l'appeler une fois par groupe.

Je sais que vous avez eu une exception spéciale pour Win7 à Win10, mais je ne vois pas où la logique du script doit vraiment changer pour accueillir cela. Si vous souhaitez toujours ajouter tous les utilisateurs dans $ utilisateurs à Win10, vous pouvez l'ajouter manuellement: xxx


3 commentaires

Je veux seulement supprimer l'utilisateur des groupes "7" et les ajouter aux nouveaux groupes "10" si et seulement s'ils sont membres du groupe "7". Par exemple, si l'utilisateur n'est qu'un membre de NITRO7, je veux seulement que l'utilisateur soit retiré de NITRO7 et ajouté à Nitro 10, mais non ajouté à aucun autre groupe "10". Si l'utilisateur est membre de 3 des groupes de 6 "7", je veux seulement qu'ils soient supprimés de ces groupes de 3 "7" et ajoutés aux groupes "10" correspondants. Suis-je près?


Je souhaite également que l'utilisateur passe de Win7 à Win10, c'est pourquoi je n'ai pas mis cette partie dans une déclaration IF.


Comment puis-je supprimer le groupe "7" et ajouter uniquement le groupe "10" correspondant si l'utilisateur est uniquement membre d'un couple de ces groupes?



0
votes

Voyons si cela fonctionnera pour vous, en tenant compte de vos utilisateurs $ et de vos listes de groupe $ sont exactement comme vous l'indiquez ...

#get your users...

$users = Get-Content -Path .\userlist.txt

#get your groups...

$groups = Get-Content -Path .\grouplist.txt

#for each user...

foreach ($user in $users) {

    #get their group memberships, expand the property...

    $memberOf = Get-ADUser -Identity $user -Properties MemberOf | Select -ExpandProperty memberof

    #for each membership found in $groups that also ends in '7'...

    foreach ($membership in ($memberOf | Where-Object {($_ -match ($groups -join "|")) -and ($_ -like '*7')})) {

        #remove the user from the matched group...

        Remove-ADGroupMember -Identity $membership -Members $user -Confirm:$false

        #add the user to a group with the same name, replacing 7 with 10...

        Add-ADGroupMember -Identity $membership.Replace("7","10") -Members $user -Confirm:$false

    }

}


0 commentaires

0
votes
Import-Module ActiveDirectory

$users = Get-Content -Path .\userlist.txt

foreach ($user in $users){

Remove-ADGroupMember -Identity "View_Win7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "View_Win10" -Members $user -Confirm:$false -Verbose

[array]$grps=Get-ADUser $user -Property memberOf | Select -ExpandProperty memberOf | Get-ADGroup | Select Name

foreach($grp in $grps){

if($grp.Name -match "Nitro7") {
Remove-ADGroupMember -Identity "Nitro7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Nitro10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "Project7") {
Remove-ADGroupMember -Identity "Project7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Project10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "OneNote7") {
Remove-ADGroupMember -Identity "OneNote7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "OneNote10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "Zoom7") {
Remove-ADGroupMember -Identity "Zoom7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Zoom10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "SnagIt7") {
Remove-ADGroupMember -Identity "SnagIt7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "SnagIt10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "Visio7") {
Remove-ADGroupMember -Identity "Visio7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Visio10" -Members $user -Confirm:$false -Verbose
}
}
}

4 commentaires

Je l'ai résolu avec ce code. Tout moyen plus facile d'accomplir la même chose?


Oui, revoyez ma réponse. Vous avez sur la bonne voie en obtenant le membre de la propriété pour chaque utilisateur, ce que j'ai fait dans ma réponse. Si votre liste de groupe $ contient uniquement les groupes que vous supprimez, alors mon code n'a aucun risque et travaillerait bien. Heureux que ça marche.


Merci @ m0lochwalker


Si vous avez des questions sur ce script, faites le moi savoir.