Question connaitre les groupes locaux d'un ordinateur dista

Plus d'informations
il y a 13 ans 9 mois #12422 par Matthew BETTON
Bonsoir,

hum désolé de t'embeter avec ça mais
$computer = [ADSI](\"WinNT://TOTO,computer\")
pour TOTO,,computer il faut mettre le nom du domaine et de l'ordinateur
[/code]

J'ai testé sur ma plateforme personnelle (un domaine) et cela fonctionne parfaitement.

Est-ce une question ? Je ne comprends pas ce que tu veux dire.


[code:1]
et que fait cette variable $Groups = @() ?
[/code:1]

Cette commande initialise une variable par un tableau vide.

Au départ je voulais m'en servir... puis je ne l'ai finalement pas utilisée (sûrement la fatigue : vivement les vacances !).

Pour te donner un simple exemple, qui permet de lister les groupes et de les ajouter via l'opérateur '+=' au tableau :

[code:1]
$computer = [ADSI](\"WinNT://CATOSV01,computer\"«»)
$compObj = $computer.psbase.children

$Groups = @()

foreach($obj in $compObj){
if($obj.psbase.SchemaClassName -eq \"group\"«»){
$Groups += $obj.Name
}
}

$Groups

[/code:1]



[code:1]
$nomComputer = \"nom de la machine distante\"

$computer = [ADSI](\"WinNT://\" + $nomComputer + \",computer\"«»)
$computer.name

$Group = $computer.psbase.children |where{$_.psbase.schemaclassname -eq \"Group\"}

foreach ($member in $Group.psbase.syncroot)
{$member.name | Get-Member}
[/code:1]


Peut être un souci dans le nommage de la variable $member, qui implique à la lecture du code une incompréhension.

$member ne contient pas un membre du groupe mais un groupe de la liste.

J'écrirais plutôt ces lignes de cette façon :

[code:1]
$nomComputer = \"nom de la machine distante\"

$computer = [ADSI](\"WinNT://\" + $nomComputer + \",computer\"«»)
$computer.name

$Groups = $computer.psbase.children |where{$_.psbase.schemaclassname -eq \"Group\"}

foreach ($Group in $Groups.psbase.syncroot){
$Group.name
}
[/code:1]

Maintenant j'aimerai obtenir les utilisateurs membres de ces groupes


Et bien figure toi que c'est exactement ce que fait le code que je t'ai fourni dans mon premier post ;)

... et en plus il fonctionne (je viens de le tester à nouveau).

Alors je le publie à nouveau pour répondre à cette dernière question, ne le modifiant, sur la forme :

[code:1]

$computer = [ADSI](\"WinNT://CATOSV01,computer\"«»)
$Objects = $computer.psbase.children

foreach($Object in $Objects){
# Si l'objet est bien un groupe (car il peut être également un compte utilisateur local ou un service)

if($Object.psbase.SchemaClassName -eq \"group\"«»){

Write-host \"Le nom du groupe est : $($Object.Name)\"

#Récupérons maintenant les membres de ce groupe (c'est ici que cela se corse !)

$Members = @($obj.psbase.invoke(\"Members\"«»)) | Foreach-Object {$_.GetType().InvokeMember(\"Name\", 'GetProperty', $null, $_, $null)}

Write-host \"Nombre de comptes inclus dans ce groupe : $($Members.count)\"

# $Members contient la liste des groupes : on affiche présentement les membres

$Members
}
}

[/code:1]


Reprenons ton code de toute à l'heure et ajoutons la partie qui t'intéresse :

[code:1]
$Computer = [ADSI](\"WinNT://\" + $ComputerName + \",computer\"«»)
$Groups = $Computer.psbase.children | Where-Object{$_.psbase.schemaclassname -eq \"Group\"}


foreach($Group in $Groups){
Write-host \"`nGroupe : $($Group.Name)\" -Foreground Green
$Members = @($Group.psbase.invoke(\"Members\"«»)) | Foreach-Object {$_.GetType().InvokeMember(\"Name\", 'GetProperty', $null, $_, $null)}
if($Members.count -gt 0){
Write-host \"Les membres sont ($($Members.count) membres) :\"
$Members
}
else{
Write-host \"Ce groupe ne contient pas de membre.\"
}
}
[/code:1]

... et hop, le code suivant pour une fonction qui prend en entrée le nom de la machine et qui retourne la liste des membres, par groupe :

[code:1]
Function Get-GroupMembers{
param(
[String]$ComputerName
)

$Computer = [ADSI](\"WinNT://$ComputerName,computer\"«»)
$Groups = $Computer.psbase.children | Where-Object{$_.psbase.schemaclassname -eq \"Group\"}

$objGroups = @()

foreach($Group in $Groups){
$Members = @($Group.psbase.invoke(\"Members\"«»)) | Foreach-Object {$_.GetType().InvokeMember(\"Name\", 'GetProperty', $null, $_, $null)}

$objGroups += New-Object PSObject -Property @{
'Group' = \"$($Group.Name)\"
Members = $Members
}
}

return $objGroups

}

# Un exemple
Get-GroupMembers CATOSV01 | Select-Object Group, Members

[/code:1]

@ +

Matthew<br><br>Message édité par: Matthew BETTON, à: 20/07/12 20:51

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

Plus d'informations
il y a 13 ans 9 mois #12423 par Matthew BETTON
Salut,

benduru écrit:

J'ai un script pour récupérer les membres d'un groupe au boulot, mais faudra attendre le 30 Juillet que j'y retourne ;)


Dans le second post (ma première réponse) il y a justement un exemple pour lister les membres d'un groupe.

@ +

Matthew

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

Plus d'informations
il y a 13 ans 9 mois #12426 par SiSMik
Et avec la fonction que tu viens de poster, y'a pas grand chose à rajouter ;)

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

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