2012-07-17 14 views
5

Próbuję utworzyć skrypt, który generuje listę komputerów na podstawie określonych właściwości, jakie może posiadać komputer. Na przykład próbuję utworzyć listę komputerów z systemem Windows XP i Windows 7, wyrzucać ich nazwy w pliku .csv i wyprowadzać ostateczną liczbę każdego z nich.Powershell - Filtrowanie jednostek organizacyjnych podczas korzystania z get-adcomputer

Oto mój kod tak daleko

import-module ActiveDirectory 
$computers = get-adcomputer -Filter 'ObjectClass -eq "Computer"' -properties "OperatingSystem" 
$i = 0 
$j = 0 
Foreach ($computer in $computers) { 
    if ($computer.operatingSystem -like "Windows 7*") { 
     $i++ 
     '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$computer.DistinguishedName" | Out-file -append C:\users\admin\desktop\test.txt 
     } 
    elseif ($computer.OperatingSystem -like "Windows XP*") { 
     $j++ 
     '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$computer.DistinguishedName" | Out-file -append C:\users\admin\desktop\test.txt 
     } 
    else { 
     $_ 
     } 

} 
write-host "$i Win 7" 
write-host "$j Win xp" 
$k = $i+$j 
write-host "$k Total" 

Wyjście próbki:

104 Win 7 
86 Win xp 
190 Total 

Skrypt ten działa jednak chciałbym uczynić go nieco lepiej jest w stanie powiedzieć, który OU nie patrzeć do, ale nie mogę tego dokładnie rozgryźć.

Jeśli ktoś ma jakikolwiek wgląd w to, jak to zrobić, lub nawet po to, aby powyższy kod był jeszcze lepszy, chciałbym to usłyszeć.

Dziękujemy!

Odpowiedz

7

Operator -like wydaje się nie działać z symbolami wieloznacznymi dla DistinguishedName. A więc oczywiste działanie nie działa.

Najłatwiejszym rozwiązaniem jest pobranie wszystkich komputerów w kolekcjach i później ich filtrowanie zgodnie z własnymi potrzebami. Jak tak,

# All the computers from the evil OU: 
$evilOU = $computers| ? {$_.DistinguishedName -like "*ou=evil,*"} 
# All the computers but the ones from the evil OU: 
$goodOU = $computers| ? {$_.DistinguishedName -notlike "*ou=evil,*"} 

Uzupełnienie

Aby połączyć dopasowania reguł, użyj -and-or i -like. Pamiętaj, aby używać * wieloznaczny z ? (where-object)

# All the computers save the ones from evil and wicked OU: 
$goodOU = $computers| ? { 
    $_.DistinguishedName -notlike "*ou=evil,*" -and $_.DistinguishedName -notlike "*ou=wicked,*" 

}

+0

Czy mogę dodać więcej niż jeden ciąg znaków za pomocą operatora -or? $ goodOU = $ komputery |? {$ _. DistinguishedName -nie podobne ("* ou = evil, *" -or "* CN = BadCN, *")} .Nie jest to poprawna składnia chociażby – smierdziel

+0

patrząc na przykłady, a próba tego też nie działa. $ filtersComputers = $ komputery | where-object {($ _. DistinguishedName - nie tak jak "* OU = Laptopy, *") -lub ($ _. DistinguishedName -nieponiż "* CN = Resources, *") -or ($ _. DistinguishedName - nie jak "* CN = Komputery, * ")} – smierdziel

1

natomiast nie ma nic złego z filtrowaniem Po zebraniu wszystkich komputerów, bardziej efektywny sposób ograniczyć swoje dane do jednej jednostki organizacyjnej byłoby użyć przełącznik wyszukiwania w pliku cmdlt GET-ADCOMPUTER. Zauważyłem także, że filtrujesz typ obiektu, aby określić komputer, który jest trochę zbędny, ponieważ cmdlt get-adcomputer odfiltrowuje już inne typy obiektów.

Podjęłam twój kod i trochę go poprawiłem.

import-module ActiveDirectory 
$computers = get-adcomputer -Filter * -properties "OperatingSystem" -SearchBase "OU=evil,OU=workstations,DC=cs,DC=domain,DC=net" 
$i = 0 
$j = 0 
Foreach ($computer in $computers) { 
    if ($computer.operatingSystem -like "Windows 7*") { 
     $i++ 
     '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$($computer.DistinguishedName)" | Out-file -append C:\users\admin\desktop\test.txt 
     } 
    elseif ($computer.OperatingSystem -like "Windows XP*") { 
     $j++ 
     '"{0}","{1}","{2}"' -f $computer.Name, $computer.OperatingSystem, "$($computer.DistinguishedName)" | Out-file -append C:\users\admin\desktop\test.txt 
     } 
    else { 
     $_ 
     } 

} 
write-host "$i Win 7" 
write-host "$j Win xp" 
$k = $i+$j 
write-host "$k Total" 

Powyższy powyżej przykład powinien działać tak samo jak poprzedniego scrip zapisać, że będzie wyliczyć wszystkie komputery albo z Windows 7 lub XP, które są w złym OU. który znajduje się w jednostce organizacyjnej stacji roboczej w domenie ds.Domain.Net.

Zapewne zauważyłeś również, że twoja nazwa wyróżniająca otrzymuje nazwę ".DistinguishedName" dołączoną na końcu każdej kolumny, ponieważ twoje wyrażenie $ computer.DistinguishedName nie jest w pełni wycenione, gdy jest w cytatach, łatwo rozwiązane z następującymi zmianami:

"$computer.DistinguishedName" 

do

"$($computer.DistinguishedName)" 

z „$ (< ...>) "składnia mówi powershell, aby ocenić pełne wyrażenie w nawiasach przed przekształceniem wyniku na ciąg znaków.

+0

Kilka dobrych punktów tutaj, niestety, oryginalne pytanie chce _omit_ jeden lub kilka jednostek organizacyjnych i zawierać większość.Myślę, że Searchbase generalnie nie pomogłby, chyba że, jak mówisz, twój scenariusz pozwala ci skupić się tylko na jednym poddrzewie OU. – Justin