Question
connaitre les groupes locaux d'un ordinateur dista
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
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.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
- Messages : 968
- Remerciements reçus 0
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.
- SiSMik
- Hors Ligne
- Membre platinium
-
- Messages : 492
- Remerciements reçus 0
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- connaitre les groupes locaux d'un ordinateur dista