2316 membres c'est sur un autre groupe. La prochaine fois j'essaierai sur le groupe de plus de 5000 user. ..quand ma réunion sera finie...
2316 membres c'est sur un autre groupe. La prochaine fois j'essaierai sur le groupe de plus de 5000 user. ..quand ma réunion sera finie...
Je viens seulement de faire l'essai sur le groupe de plus de 5000 users... :
nombre de membres dans le groupe : 7431
nombre de groupes dans le groupe : 0
nombre d'utilisateurs dans le groupe : 3006
nombre d'utilisateurs actif dans le groupe : 2986
ok
donc 2986 utilisateurs actifs a transféré dans un autre groupe
peut tu relancer cette nouvelle version du script pour confirmé que les 4425 objets manquent ne sont ni des groupes ni des utilisateurs
je regarder pour la motif du script de transfert du post #10 !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24$ErrorActionPreference='Continue' #to display the error messages $text="Please enter the name of the group to be analyzed:" $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition #path of the folder where is located the current script . "$scriptPath\textbox.ps1" $groupsource = $objTextBox.Text #name of the source group; $samgrsource = ((Get-ADGroup -Filter {name -eq $groupsource} -Server "gad.schneider-electric.com").sAMAccountName) $members = Get-ADGroup -Identity $samgrsource -Properties Member -Server "gad.schneider-electric.com" | Select-Object -ExpandProperty Member Write-Host "nombre de membres dans le groupe : $($members.count)" -ForegroundColor Yellow $obj = [System.Object[]]($members | foreach { Get-ADObject $_ -Server "gad.schneider-electric.com" | where {$_.ObjectClass -eq "group"} }) Write-Host "nombre de groupes dans le groupe : $($obj.count)" -ForegroundColor Yellow $obj = [System.Object[]]($members | foreach { Get-ADObject $_ | where {$_.ObjectClass -eq "user"} }) Write-Host "nombre d'utilisateurs dans le groupe : $($obj.count)" -ForegroundColor Yellow $obj = [System.Object[]]($members | foreach { Get-ADObject $_ | where {$_.ObjectClass -eq "user"} | get-aduser | where {$_.Enabled -eq $True} }) Write-Host "nombre d'utilisateurs actif dans le groupe : $($obj.count)" -ForegroundColor Yellow $obj = [System.Object[]]($members | foreach { Get-ADObject $_ -Server "gad.schneider-electric.com" | where {$_.ObjectClass -ne "group" -and $_.ObjectClass -ne "user"} }) Write-Host "nombre d'objet autre que group ou user dans le groupe : $($obj.count)" -ForegroundColor Yellow
voila j'ai fais la modif avec des tests avec mon AD qui n'a pas les mêmes volume, ni organisation
il va donc copier les 2986 utilisateurs actifs du premier groupe dans un deuxième groupe
j'espère qu'il va fonctionné dans ton AD
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63$ErrorActionPreference = 'stop' $DebugPreference = 'stop' $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition #path of the folder where is located the current script # textbox to select the group to be copied (the script of the textbox is common and in the file textbox.ps1) $text = "Please enter the name of the group to be copied:" . "$scriptPath\textbox.ps1" $groupsource = $objTextBox.Text #name of the source group # textbox to select the group to be feeded $text = "Please enter the name of the group to be feeded:" . "$scriptPath\textbox.ps1" $groupdest = $objTextBox.Text #name of the destinatory GAD-SU-NextGenPDM_NonPROD #one has to use for example sAMAccountName instead of name for any AD cmdlet $samgrsource = ((Get-ADGroup -Filter {name -eq $groupsource} -Server "gad.schneider-electric.com").sAMAccountName) $samgrdest = ((Get-ADGroup -Filter {name -eq $groupdest} -Server "gad.schneider-electric.com").sAMAccountName) if (($samgrsource -eq $null) -OR ($samgrdest -eq $null)) { Write-Host "unknown name for source or destinatory file";return;} if ($samgrsource -eq $groupdest) {Write-Host "source and destinatory files are identical";return;} #To clean the group to be feeded try { Set-ADGroup -Identity $samgrdest -clear member -Server "gad.schneider-electric.com" } catch {Write-Host "unknown name for destinatory group";return} try { $members = Get-ADGroup -Identity $samgrsource -Properties Member -Server "gad.schneider-electric.com" | Select-Object -ExpandProperty Member $members | Get-ADObject -Properties sAMAccountName | where {$_.ObjectClass -eq "user"} | foreach { Write-Host $_.sAMAccountName"`t " -NoNewline -ForegroundColor Green $u = $_ #the switch instruction generates aldo a $_ variable, so memorization #to do a search in the right domain, first locate in DistinguishedName what is this domain switch ($_.DistinguishedName) { {($_).contains("DC=gad,DC=schneider-electric,DC=com")} { $user = get-aduser -filter {sAMAccountName -like "SESA1%" -and sAMAccountName -eq $u.sAMAccountName -and Enabled -eq $True} -Server "gad.schneider-electric.com" } {($_).contains("DC=apa,DC=gad,DC=schneider-electric,DC=com")} { $user = get-aduser -filter {sAMAccountName -like "SESA1%" -and sAMAccountName -eq $u.sAMAccountName -and Enabled -eq $True} -Server "apa.gad.schneider-electric.com" } {($_).contains("DC=gmea,DC=gad,DC=schneider-electric,DC=com")} { $user = get-aduser -filter {sAMAccountName -like "SESA1%" -and sAMAccountName -eq $u.sAMAccountName -and Enabled -eq $True} -Server "gmea.gad.schneider-electric.com" } {($_).contains("DC=eur,DC=gad,DC=schneider-electric,DC=com")} { $user = get-aduser -filter {sAMAccountName -like "SESA1%" -and sAMAccountName -eq $u.sAMAccountName -and Enabled -eq $True} -Server "eur.gad.schneider-electric.com" } {($_).contains("DC=nam,DC=gad,DC=schneider-electric,DC=com")} { $user = get-aduser -filter {sAMAccountName -like "SESA1%" -and sAMAccountName -eq $u.sAMAccountName -and Enabled -eq $True} -Server "nam.gad.schneider-electric.com" } } if ($user) { #if the domain has been found, some displays+add the user in the new group Write-Host $user.Enabled"`t " -NoNewline -ForegroundColor Red Write-Host "sAMAccountName" $user.sAMAccountName"`t " -NoNewline -ForegroundColor White Write-Host ".Name" $user.Name -NoNewline -ForegroundColor Yellow Add-ADGroupMember -Identity $samgrdest -members $u -Server "gad.schneider-electric.com" } Write-Host "" }} catch {Write-Host "unknown name for source group"}
Le script du post #23 affichesuivi d'une bordée d'injures, mais je ne peux pas faire de copier-coller car je n'ai plus la main sur PS...En gros, ce qui revient, c'est ResourceUnavailable : (CN=SESA12345, etc).nombre de membres dans le groupe : 7434
Le script du post #24 fait plein de copies (avec à chaque fois l'affichage en vert du SESA), mais à la fin :unknown name for source group![]()
salut Laurent
voici le script qui fait les export avec les dernières corrections :
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 # Get the Content of a Group and Export in CSV Format. # dropdown list to select the group to "populate" # $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition #path of the folder where is located the current script #. "$scriptPath\liste_der.ps1" #access to a common code #$param=$liste1.Text #one affects the choice in the dropdown list in the variable $param $param = "GAD-SU-NextGenPDM_PROD" $Group = ((Get-ADGroup -Filter {name -eq $param} -Server "gad.schneider-electric.com").sAMAccountName);Write-Output "7 group"=$Group $date = Get-Date $DateStr=$date.ToString("yyyyMMdd-HHmmss") $invocation = (Get-Variable MyInvocation).Value $directorypath = Split-Path $invocation.MyCommand.Path -Parent | Split-Path $OutputFile= $directorypath + "\output_files\" + $DateStr + $param + ".csv" function get-aduser5000 { param ($groupe) $members = Get-ADGroup -Identity $groupe -Properties Member -Server "gad.schneider-electric.com" | Select-Object -ExpandProperty Member $members | Get-ADObject -Properties sAMAccountName | foreach { if ($_.ObjectClass -eq "user") { $u = $_ #the switch instruction generates aldo a $_ variable, so memorization #to do a search in the right domain, first locate in DistinguishedName what is this domain switch ($_.DistinguishedName) { {($_).contains("DC=apa,DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "apa.gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } {($_).contains("DC=gmea,DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "gmea.gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } {($_).contains("DC=eur,DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "eur.gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } {($_).contains("DC=nam,DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "nam.gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } {($_).contains("DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } } } if ($_.ObjectClass -eq "group") { get-aduser5000 $_.DistinguishedName } } } get-aduser5000 $group | Export-csv -path $OutputFile Write-Host `r`n "The "$param"'s group membership is now stored in :" $OutputFile"." #$directorypath = Split-Path $invocation.MyCommand.Path $invocation = (Get-Variable MyInvocation).Value $directorypath = Split-Path $invocation.MyCommand.Path Write-Host "Current path is "$directorypath
j'ai fait une fonction récursive pour avoir l'équivalent de la ligne suivante :
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part Get-ADGroupMember -Identity $Group -server gad.schneider-electric.com -recursive
Salut Philippe,
comme exécuter ton script sur le groupe de plus de 7000 users mettrait des plombes, j'ai voulu le tester sur un tout petit groupe AD (32 users)(GAD-SU-NextGenPDM_PrePROD), mais message d'erreur :Ce message arrive 25 fois sachant qu'il y a 7 users appartenant au domaine eur.gad.schneider-electric.com comme moi et que 25+7=32...Get-ADObject : Impossible de trouver un objet avec l’identité «
CN=SESA283142,OU=Users,OU=SEMS,OU=Sites,OU=RU,OU=Countries,DC=gmea,DC=gad,DC=schneider-electric,DC=com» sous: «
DC=eur,DC=gad,DC=schneider-electric,DC=com».
At C:\Users\sesa27384\Documents\aalaurent\boulot\powershell\zip\scripts\export5000.ps1:18 char:16
+ $members | Get-ADObject -Properties sAMAccountName | foreach {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (CN=SESA283142,O...electric,DC=com:ADObject) [Get-ADObject], ADIdentityNotFoundExcepti
on
+ FullyQualifiedErrorId : Impossible de trouver un objet avec l’identité «CN=SESA283142,OU=Users,OU=SEMS,OU=Sites,OU=RU,OU=Coun
tries,DC=gmea,DC=gad,DC=schneider-electric,DC=com» sous: «DC=eur,DC=gad,DC=schneider-electric,DC=com».,Microsoft.ActiveDirec
tory.Management.Commands.GetADObject
oui je vois sur les trois dernières ligne le problème, il des users "gmea" sur le serveur DC "eur"
je m'explique pas l'erreur puisque le switch permet justement de faire la recherche sur le bon serveur !!!
utilise tu le bon script ou me fait tu une farce ?+ FullyQualifiedErrorId : Impossible de trouver un objet avec l’identité «CN=SESA283142,OU=Users,OU=SEMS,OU=Sites,OU=RU,OU=Coun
tries,DC=gmea,DC=gad,DC=schneider-electric,DC=com» sous: «DC=eur,DC=gad,DC=schneider-electric,DC=com».,Microsoft.ActiveDirec
tory.Management.Commands.GetADObject
Je pourrai vérifier le script vers 21 ou 22h (là je suis sur mon smartphone ) mais je suis presque sûr d'avoir pris le bon script et juste changé le groupe.
A 22h, j'ai le même message d'erreur qu'à 15h07 sur le script
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 # Get the Content of a Group and Export in CSV Format. # dropdown list to select the group to "populate" # $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition #path of the folder where is located the current script #. "$scriptPath\liste_der.ps1" #access to a common code #$param=$liste1.Text #one affects the choice in the dropdown list in the variable $param $param = "GAD-SU-NextGenPDM_PrePROD" $Group = ((Get-ADGroup -Filter {name -eq $param} -Server "gad.schneider-electric.com").sAMAccountName);Write-Output "7 group"=$Group $date = Get-Date $DateStr=$date.ToString("yyyyMMdd-HHmmss") $invocation = (Get-Variable MyInvocation).Value $directorypath = Split-Path $invocation.MyCommand.Path -Parent | Split-Path $OutputFile= $directorypath + "\output_files\" + $DateStr + $param + ".csv" function get-aduser5000 { param ($groupe) $members = Get-ADGroup -Identity $groupe -Properties Member -Server "gad.schneider-electric.com" | Select-Object -ExpandProperty Member $members | Get-ADObject -Properties sAMAccountName | foreach { if ($_.ObjectClass -eq "user") { $u = $_ #the switch instruction generates aldo a $_ variable, so memorization #to do a search in the right domain, first locate in DistinguishedName what is this domain switch ($_.DistinguishedName) { {($_).contains("DC=apa,DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "apa.gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } {($_).contains("DC=gmea,DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "gmea.gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } {($_).contains("DC=eur,DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "eur.gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } {($_).contains("DC=nam,DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "nam.gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } {($_).contains("DC=gad,DC=schneider-electric,DC=com")} { $u | get-aduser -Server "gad.schneider-electric.com" -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled break } } } if ($_.ObjectClass -eq "group") { get-aduser5000 $_.DistinguishedName } } } get-aduser5000 $group | Export-csv -path $OutputFile Write-Host `r`n "The "$param"'s group membership is now stored in :" $OutputFile"." #$directorypath = Split-Path $invocation.MyCommand.Path $invocation = (Get-Variable MyInvocation).Value $directorypath = Split-Path $invocation.MyCommand.Path Write-Host "Current path is "$directorypath
aujourd'hui j'ai appris à lire et en regardent le message d'erreur, je me suis aperçue que l'erreur était sur Get-ADObject![]()
j'ai donc modifier le script en conséquence :
bon week end laurent
Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 # Get the Content of a Group and Export in CSV Format. # dropdown list to select the group to "populate" # $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition #path of the folder where is located the current script #. "$scriptPath\liste_der.ps1" #access to a common code #$param=$liste1.Text #one affects the choice in the dropdown list in the variable $param $param = "GAD-SU-NextGenPDM_PROD" $Group = ((Get-ADGroup -Filter {name -eq $param} -Server "gad.schneider-electric.com").sAMAccountName);Write-Output "7 group"=$Group $date = Get-Date $DateStr=$date.ToString("yyyyMMdd-HHmmss") $invocation = (Get-Variable MyInvocation).Value $directorypath = Split-Path $invocation.MyCommand.Path -Parent | Split-Path $OutputFile= $directorypath + "\output_files\" + $DateStr + $param + ".csv" function get-aduser5000 { param ($groupe) $members = Get-ADGroup -Identity $groupe -Properties Member -Server "gad.schneider-electric.com" | Select-Object -ExpandProperty Member $members | foreach { switch ($_) { {($_).contains("DC=apa,DC=gad,DC=schneider-electric,DC=com")} { $ServerAD = "apa.gad.schneider-electric.com" break } {($_).contains("DC=gmea,DC=gad,DC=schneider-electric,DC=com")} { $ServerAD = "gmea.gad.schneider-electric.com" break } {($_).contains("DC=eur,DC=gad,DC=schneider-electric,DC=com")} { $ServerAD = "eur.gad.schneider-electric.com" break } {($_).contains("DC=nam,DC=gad,DC=schneider-electric,DC=com")} { $ServerAD = "nam.gad.schneider-electric.com" break } {($_).contains("DC=gad,DC=schneider-electric,DC=com")} { $ServerAD = "gad.schneider-electric.com" break } {($_).contains("DC=acces,DC=lan")} { $ServerAD = "srv-ad1.acces.lan" break } default { $ServerAD = "gad.schneider-electric.com" break } } $obj = Get-ADObject $_ -Properties sAMAccountName -Server $ServerAD if ($obj.ObjectClass -eq "user") { $obj | get-aduser -Server $ServerAD -Properties Name,GivenName,SurName,Employeeid,Mail,Enabled | Select Name,GivenName,SurName,Employeeid,Mail,Enabled } if ($obj.ObjectClass -eq "group") { get-aduser5000 $obj.DistinguishedName } } } get-aduser5000 $group | Export-csv -path $OutputFile Write-Host `r`n "The "$param"'s group membership is now stored in :" $OutputFile"." #$directorypath = Split-Path $invocation.MyCommand.Path $invocation = (Get-Variable MyInvocation).Value $directorypath = Split-Path $invocation.MyCommand.Path Write-Host "Current path is "$directorypath
Gros progrès car grâce à tes progrès en lecture, ça ne plante plus et génère un fichier. Mais surprise : pour le groupe de 32 users, j'obtiens un fichier csv de 2 lignes d'en-tête plus 35 lignes au lieu de 32, et pour le groupe de 7431 users, 2 lignes d'en-tête plus 7442 lignes au lieu de 7431. Comment expliques-tu ce petit dépassement ?
Bonjour,
je viens de faire une vérif sur le groupe des 32 users : pour chaque user trouvé dans Utilisateurs et Ordinateurs AD, je l'enlève du fichier csv, et au bout du compte, c'est bon. Donc ça semble OK et donc résolu![]()
super bonne nouvelle
on n'a une base pour les prochains scripts
Merci encore. Tu m'as bien aidé et j'aurais été totalement incapable de faire ce que tu as fait
Partager