Gruppi kuulumise kontroll

Domeeni keskkonnas on sageli vaja tuvastada, kas kasutaja kuulub mingisse gruppi või kes on mingi grupi liikmed.  PowerShelli abil on seda lihtne kontrollida:

#Requires –Modules ActiveDirectory

Get-ADGroup "minu grupp" | Get-ADGroupMember
#või siis
Get-ADGroupMember "minu grupp"

Get-ADUser mina | Get-ADPrincipalMembership

Asi läheb natuke keerulisemaks, kui grupid kuuluvad gruppide sisse.  Ülaltoodud näited annavad vaid grupi vahetud liikmed (või grupid, kuhu kasutaja vahetult kuulub) ning välja jäävad grupid, mis kuuluvad teiste gruppide sisse.

Teoreetiliselt on ka see situatsioon lihtne.  Vaja vaid võtta saadud nimekiri ning ka nende liikmelisus tuvastada:

Get-ADUser mina |
  Get-ADPrincipalGroupMembership |
  Get-ADPrincipalGroupMembership

aga nii läheb kaotsi esimene kiht liikmelisust.  Ka seda annab parandada:

Get-ADUser mina |
  Get-ADPrincipalGroupMembership |
  Foreach-Object {
    $_
    Get-ADPrincipalGroupMembership $_
  } | Sort-Object –Unique

Jääb vaid probleem, et kui liikmelisuse kihte on rohkem, siis tuleks sama tegevust korrata mitu korda.  Kordade arv võib sõltuda vajadusest ning sellist ühte rida on tüütu kirjutada.  Seega võiks luua rekursiivse funktsiooni, mis vajadusel iseennast välja kutsub:

#Requires -Modules ActiveDirectory

Function Get-GroupMembership {
  Param(
    $level = 1
  )
  PROCESS {
    $_
    if ($level –ne 0) {
      Get-ADPrincipalGroupMembership $_ |
        Get-GroupMembership –level ($level-1) |
        Sort-Object -Unique
    }
  }
}

Ja nüüd jääb üle vaid seda funktsiooni kasutada:

Get-ADUser mina | Get-GroupMembership –level 2

Get-ADGroup miskigrupp | Get-GroupMembership –level 4

# kui vaja saada liikmelisus ilma algse objektita:
Get-ADUser mina | Get-GroupMembership –level 3 | Select-Object -skip 1

if (
    Get-ADUser mina |
      Get-GroupMembership –level 3 |
      Where {$_.name –like "grupp1"}
  ) {
    Write-Host "Kasutaja mina kuulub gruppi grupp1"
}

Grupi liikmete lahtiharutamise korral on asi palju lihtsam. Nimelt on käsul Get-ADGroupMemeber olemas käsurea võti -Recursive.  Ainsaks puuduseks on see et nii saame teada vaid kasutajad, kes gruppide hierarhiasse kuuluvad. Küll aga on see piisav, et kontrollida, kas kasutaja kuulub (kaudselt) gruppi:

if (
  Get-ADGroupMember grupp1 -Recursive |
    Where-Object {$_.name –like "*mina*"}
) {
  write-host "Kasutaja 'mina' kuulub gruppi 'grupp1'"
}

Veelgi mugavam on ülaltoodud kood vormistada funktsiooniks ja siis seda kasutada:

Function Test-IsGroupMember {
  Param(
      [parameter(Mandatory=$true)]
      [Microsoft.ActiveDirectory.Management.ADGroup]
    $group,
      [parameter(ValueFromPipeline=$true)]
      [Microsoft.ActiveDirectory.Management.ADUser]
    $user
  )
  PROCESS {
    [bool](
      Get-ADGroupMember $group -Recursive |
        Where-Object {$_.SID –eq $user.SID}
      )
  }
}

$mina = Get-ADUser (whoami).split("\")[1]
$mina | Test-IsGroupMember (Get-ADGroup grupp1)
Advertisements