Affichage des articles dont le libellé est Group. Afficher tous les articles
Affichage des articles dont le libellé est Group. Afficher tous les articles

jeudi 30 octobre 2014

Liste des groupes d'un utilisateur (AD).

(NDA : Malheureusement cet article est un peu obsolète aujourd'hui. Je vais préparer un nouvel article avec le résumé des commandes AD actuelles.)

Il existe différentes façons d'interroger l'Active Directory en PowerShell. Dans cet article, j'utilise l'extension de commande de Quest pour manipuler l'AD.

Edit : A l’époque ou j'ai rédigé cet article, Quest était une très bonne alternative aux commandes natives disponibles sous PowerShell. Evidement, aujourd'hui en 2018 les systèmes Windows Serveurs AD intègre cela très bien sans avoir à passer par cet extension.

Installation


1) Allez sur le site de Quest "www.quest.com/powershell/activeroles-server.aspx"
2) Cliquez sur la case à cocher "I have read and accept the agreement".
3) Téléchargez la dernière version de "ActiveRoles Management Shell for AD".
4) Et installez l'extension.
(La documentation pdf est plutôt bien fait. N'hésitez pas à la consulter.)

Liste des groupes d'un utilisateur (méthode alternatif)


Normalement Quest propose la fonction "Get-QADMemberOf" pour réaliser cette action. Malheureusement lorsque cette commande rencontre un groupe d'un domaine qui ne vous est pas accessible, elle s'arrête avec une erreur et ne retourne rien. Si vous rencontrez ce problème, je vous propose de passer par le script suivant :

#Chargement des commandes Quest.
Add-psSnapin quest.activeroles.admanagement

#Compte de connexion à l'AD.
$username = "DOMAINE\login.admin"

#Invite de saisi du mot de passe.
$password = read-host ("Password pour "+$username) -assecurestring

#Credential.
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password

#Connexion à l'AD
$AD1 = Connect-QADService -service "domain.sekki.fr" -Credential $cred

#Affiche les groupes de l'utilisateur au format "Domain\Groupe".
$user = "DOMAINE\login.user"
Get-QADUser $user | foreach {
            foreach ($mof in $_.MemberOf)
             {
               #Initialise.
               $grp = "";$dom = "";
               #Converti les données séparées par une virgule en tableau.
               $tmof = $mof.split(",")
               #Recupère le nom du groupe.
               foreach($e in $tmof) { if ($e -like "CN=*") {$grp = $e;break} }
               #Récupère le nom du domaine du groupe.
               foreach($e in $tmof) { if ($e -like "DC=*") {$dom = $e;break} }
               #Supprime les infos initules.
               $grp = $grp.Replace("CN=","")
               $dom = $dom.Replace("DC=","")
               #Recompose le nom du groupe au format "Domain\Groupe".
               $groupe = $dom+"\"+$grp
               #Affiche le nom du groupe.
               write-host $groupe
             }
                           }

#Déconnexion de l'AD.
Disconnect-QADService -connection $AD1

#Fin.

samedi 7 décembre 2013

Les groupes locaux.

Je vais traiter ici le cas des groupes locaux. Nous allons voir comment lister/créer et supprimer des groupes. Nous verrons également comment lister/ajouter et supprimer des membres dans un groupe.

Commençons par créer un groupe local "test1".


 
#Créer un groupe.
$gname = "test1"
$gcomputer = (Get-Item "Env:computername").Value
$gdesc = "Description"

#Je vérifie si le groupe existe déjà.
if ([ADSI]::Exists("WinNT://$gcomputer/$gname,group") -eq $false)
  {
    #Si le groupe n'existe pas je le crée.
    $adsi = [ADSI]("WinNT://$gcomputer")
    $group = $adsi.Create("Group", $gname)
    $group.SetInfo()
    #Puis je modifie la description.
    $group.Description = $gdesc
    $group.SetInfo()
  }
else
  {
    #Si le groupe n'existe pas.
    Write-Host "Le groupe" $gname "n'existe pas."
  }

#Fin.



Pour vérifier si le groupe est bien créé, nous allons sortir la liste des groupes.


 
#Lister les groupes.
$gcomputer = (Get-Item "Env:computername").Value

#Je liste les groupes locaux.
$adsi = [ADSI]("WinNT://$gcomputer,computer")
$adsigroups = $adsi.psbase.children | where { $_.psbase.schemaClassName -eq 'group' }
foreach($group in $adsigroups)
 {
   $gname = $group.GetType().InvokeMember('Name', 'GetProperty', $null, $group, $null)
   Write-Host $gname
 }

#Fin.



Puis nous allons ajouter un membre dans notre groupe.


 
#Ajouter un membre dans un groupe.
#Groupe.
$gname = "test1"    #Nom du groupe.
$gcomputer = (Get-Item "Env:computername").Value

#Membre à ajouter.
$mname = "User1"   #Nom de l'utilisateur ou groupe global.
$mdomain = (Get-Item "Env:computername").Value 

#Je verifie si le groupe existe.
if ([ADSI]::Exists("WinNT://$gcomputer/$gname,group"))
  {
    $echec = 0
    #Si le groupe existe, j'ajoute le membre au groupe.
    $adsigroup = [ADSI]("WinNT://$gcomputer/$gname,group")
    Try { $adsigroup.psbase.Invoke("Add",([ADSI]("WinNT://$mdomain/$mname")).path) }
    Catch { $echec = 1 }
    #Je vérifie si l'ajoute s'est bien passé.
    if ($echec) { write-host $mname "n'a pas pu être ajouté au group" $gname }
    else { write-host $mname "a été ajouté au group" $gname }
  }
else
  {
    #Si le groupe n'existe pas.
    Write-Host "Le groupe" $gname "n'existe pas."
  }

#Fin.



L'exemple suivant permet de lister les membre d'un groupe. Si l'ajout du membre c'est bien passé, nous allons le voir apparaitre dans cette liste.


 
#Lister les membres d'un groupe.
#Groupe.
$gname = "test1"
$gcomputer = (Get-Item "Env:computername").Value

#Je verifie si le groupe existe.
if ([ADSI]::Exists("WinNT://$gcomputer/$gname,group"))
  {
    #Si le groupe existe, je liste les membres de groupe.
    $adsigroup = [ADSI]("WinNT://$gcomputer/$gname,group")
    $adsimembers = $adsigroup.PSBase.Invoke('Members')
    foreach($member in $adsimembers)
     {
       $mname = $member.GetType().InvokeMember('Name', 'GetProperty', $null, $member, $null)
       Write-Host $mname "est membre du groupe" $gname
     }
  }
else
  {
    #Si le groupe n'existe pas.
    Write-Host "Le groupe" $gname "n'existe pas."
  }

#Fin.



Il est temps de faire le ménage. L'exemple suivant montre comment supprimer un membre du groupe.


 
#Supprimer un membre dans un groupe.
#Groupe.
$gname = "test1"    #Nom du groupe.
$gcomputer = (Get-Item "Env:computername").Value

#Membre.
$mname = "User1"   #Nom de l'utilisateur ou groupe global.
$mdomain = (Get-Item "Env:computername").Value

#Je vérifie si le groupe existe.
if ([ADSI]::Exists("WinNT://$gcomputer/$gname,group"))
  {
     $echec = 0
     #Si le groupe existe, je tente de supprimer un membre du groupe.
     $adsigroup = [ADSI]("WinNT://$gcomputer/$gname,group")
     Try { $adsigroup.psbase.Invoke("Remove",([ADSI]("WinNT://$mdomain/$mname")).path) }
     Catch { $echec = 1 }
     #Je vérifie si la suppression s'est bien exécuté.
     if ($echec) { write-host $mname "n'a pas pu être supprimé du group" $gname }
     else { write-host $mname "a été supprimé du group" $gname }
  }
else
  {
     #Si le groupe n'existe pas.
     write-host "Le groupe" $gname "n'existe pas."
  }

#Fin.



Reste plus qu'a supprimer le groupe "test1" lui même.


 
#Supprimer un groupe.
#Groupe.
$gname = "test1"
$gcomputer = (Get-Item "Env:computername").Value

#Je vérifie si le groupe existe.
if ([ADSI]::Exists("WinNT://$gcomputer/$gname,group"))
  {
    #Si le groupe existe, je supprime le groupe.
    $adsi = [ADSI]("WinNT://$gcomputer")
    $adsi.Delete('group', $gname)
  }
else
  {
    #Si le groupe n'existe pas.
    Write-Host "Le groupe" $gname "n'existe pas."
  }

#Fin.