Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 3
  • 672

Witam,

dotyczy skryptu w PowerShellu. Poszukuję rozwiązania następującego problemu: Jest grupa w AD mająca dostęp do jakiegoś zasobu ( nazwa grupy: Są też inne grupy (nazwa grupy: KOTŁOWNIA, STOLARNIA, KUCHNIA). Pobieram wszystkich użytkowników z grupy SPAWACZE:

$U = Get-ADGroupMember -Recursive "CN=SPAWACZE........."| Where-Object { $_.objectClass -match "user"} |Select-Object SamAccountName


oraz wszystkich użytkowników  z grup KOTŁOWNIA, STOLARNIA, KUCHNIA - część użytkowników tych grup należy też do SPAWACZE:

$W1 = Get-ADGroup -Filter 'name -like "KOTLOWNIA*"' | Get-ADGroupMember -Recursive | Select-Object SamAccountName
$W2 = Get-ADGroup -Filter 'name -like "STOLARNIA*"' | Get-ADGroupMember -Recursive | Select-Object SamAccountName
$W3 = Get-ADGroup -Filter 'name -like "KUCHNIA*"' | Get-ADGroupMember -Recursive | Select-Object SamAccountName

$WYKLUCZENIA = $W1 + $W2 + $W3


Jak wybrać użytkowników należących do $U ale nie będących członkami $WYKLUCZENIA?

To mi nie działa:

foreach ($i in $U)
    {
      Write-Host "Sprawdzam uzytkownika " $i.SamAccountName
           
      if ( $WYKLUCZENIA -contains $i.SamAccountName )
          {
          Write-Host -ForegroundColor RED "TU i TU" $i.SamAccountName
          } else {
          Write-Host -ForegroundColor GREEN "Tylko SPAWACZ" $i.SamAccountName               
          } 
      }

Grzegorz_Kratiuk
  • Zapytał
  • @ Grzegorz_Kratiuk | 12.02.2014
    • 16
    • 2
    • 9

Odpowiedzi (2)

  • 15

W powyższym przykładzie tablica $WYKLUCZENIA w ramach bloku if zawiera tablicę obiektów z jedną składową SamAccountName, porównanie natomiast dotyczy wartości typu String. Najprostszym rozwiązaniem jest zmiana danych w tablicy $WYKLUCZENIA z obiektów na proste typu String.

W praktyce powinno wyglądać to następująco:

Linijkę:

 

$WYKLUCZENIA = $W1 + $W2 + $W3

 

Zastępujemy:

 

$WYKLUCZENIA = $W1 + $W2 + $W3 | Select -ExpandProperty SamAccountName

 

Jako alternatywę warto rozważyć użycie cmdletu Compare-Object. Aby wybrać użytkowników należących do $U, ale nie będących członkami $WYKLUCZENIA, wystarczy do poprzedniego rozwiązania dodać identyczną instrukcję  (| Select -ExpandProperty SamAccountName) do instrukcji tworzącej zmienną $U, a następnie blok foreach zastąpić instrukcją:

 

Compare-Object -ReferenceObject $U -DifferenceObject $WYKLUCZENIA

 

W celu dodania obiektów, które występują zarówno w $U, jak i $WYKLUCZENIA, należy użyć tej samej  instrukcji z parametrem IncludeEqual:

 

Compare-Object -ReferenceObject $U -DifferenceObject $WYKLUCZENIA -IncludeEqual



  • Odpowiedział
  • @ | 13.02.2014
  • TRENER ALTKOM AKADEMII
Komentarze
Dziękuję jak zwykle na Pana Jacka można liczyć
Skomentował : @ Grzegorz_Kratiuk ,20.02.2014
  • 16
  • 2
  • 9
  • 1

Można też znacznie prościej niż porównywać obiekty. Wystarczy wykorzystać przystawki "Quest" (Po wcześniejszym pobraniu paczki - wcześniejsze wersje były za darmo):

1. Import: Add-PSSnapin Quest.ActiveRoles.ADManagement

2. Zapytanie o członków grupy: Get-QADGroupMember "$U" -indirect -sizelimit 0 -notMemberOf $W,1,$w2,$w3

 

Zapytanie zwróci członków grupy "$U", którzy nie są członkami $W,1,$w2 ani $W3 (Podaje się po prostu nazwy grupy)

Powinno być szybciej i bardziej "user-friendly". :)

 
Marcin_Krzanowicz
  • Odpowiedział
  • @ Marcin_Krzanowicz | 02.06.2015
    • laureat
    • 9
    • 4
    • 23