2012-07-17 12 views
5

Sto provando a creare uno script che genera un elenco di computer basati su proprietà specifiche che un computer può avere. Ad esempio, sto cercando di creare un elenco di computer Windows XP e computer Windows 7, di inserire i loro nomi in un file .csv e di emettere il conteggio finale di ciascuno.PowerShell - OU filtro durante l'utilizzo di get-adcomputer

Ecco il mio codice finora

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" 

Output di esempio:

104 Win 7 
86 Win xp 
190 Total 

Questo script funziona però vorrei fare un po 'meglio per essere in grado di dire quale unità organizzativa non è guardare dentro, ma non riesco a capirlo.

Se qualcuno ha qualche idea su come farlo, o anche solo per migliorare il codice sopra, mi piacerebbe sentirlo.

Grazie!

risposta

7

L'operatore -like non sembra funzionare con i caratteri jolly per DistinguishedName. Quindi l'ovvia operazione Get-ADComputer -Filter {(DistinguishedName -notlike "*OU=evil,*")} non funziona.

La soluzione più semplice è quella di ottenere tutti i computer in una raccolta e filtrarli in seguito in base alle proprie esigenze. Come così,

# 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,*"} 

Addendum

Per combinare regole di corrispondenza, utilizzare -and-or e -like. Ricordate di usare * jolly con ? (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

Posso aggiungere più di una stringa usando l'operatore -or? $ goodOU = $ computer |? {$ _. DistinguishedName -notlike ("* ou = evil, *" -or "* CN = BadCN, *")}. Questa non è la sintassi corretta anche se – smierdziel

+0

esamina gli esempi, e provare questo non funziona. $ filteredComputers = $ computers | where-object {($ _. DistinguishedName -notlike "* OU = Laptops, *") -o ($ _. DistinguishedName -notlike "* CN = Resources, *") -o ($ _. DistinguishedName -notlike "* CN = Computers, * ")} – smierdziel

1

mentre non c'è niente di sbagliato con il filtro dopo aver raccolto tutti i computer, un modo più efficiente di limitare i dati ad un'unità organizzativa potrebbe essere quella di utilizzare il -searchbase switch nel tuo cmdlt GET-ADCOMPUTER. Ho anche notato che stai filtrando il tuo tipo di oggetto per specificare il computer, che è un po 'ridondante poiché il cmdlt get-adcomputer già filtra altri tipi di oggetto.

ho preso il tuo codice e l'ho risolto un po '.

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" 

È possibile che questo esempio di cui sopra dovrebbe funzionare lo stesso del vostro bisaccia precedente salvo che sarà enumerare tutti i computer con Windows 7 o XP che si trovano entro il male OU. che si trova all'interno delle UO delle workstation sul dominio ds.Domain.Net.

Probabilmente hai anche notato che il tuo nome distinto sta ottenendo ".DistinguishedName" aggiunto alla fine di ogni colonna, questo perché l'espressione $ computer.DistinguishedName non viene valutata completamente mentre è in virgolette, facilmente risolta con la seguente modifica:

"$computer.DistinguishedName" 

a

"$($computer.DistinguishedName)" 

il "$ (< ...> "La sintassi dice a PowerShell di valutare l'intera espressione tra parentesi prima di convertire l'output in stringa

+0

Alcuni buoni punti qui.Tuttavia, sfortunatamente, la domanda originale vuole _omitare_ una o alcune OU e includere la maggioranza.Penso che searchbase generalmente non aiuti a meno che, come dici tu, il tuo scenario ti permetta concentrarsi su una sola sottostruttura UO. – Justin

Problemi correlati