Need help with search multiple AD Forests/Domains

by bpearson32 at 2013-01-30 13:24:10

I’ve already built the query I need to use:

Get-ADComputer -Filter {OperatingSystem -eq “Windows 2000 Server”} -Property * | Sort-Object -Property Name | Select-Object -Property Name, OperatingSystem, OperatingSystemServicePack, OperatingSystemVersion

Now instead of running it only on my current domain I have several forests (4 to be exact) with multiple domains inside that I need to search with the above query. I’m pretty sure I need a Do…While or a ForEach-Object type of looping structure but I haven’t been able to figure that part out yet. The list of domains that I need to search will be in a text file (I named it domains.txt) one domain name per line.

Here is an example of the type of data in my domains.txt file:


So far I’ve been unable to figure out the looping structure that keeps the data in the pipeline so that it can be written out to a file.

I’m definitely new to PowerShell as I just finished Learn PowerShell 3 in a month of lunches and I’ve started Learn PowerShell ToolMaking in a month of lunches. So it may be a simple solution but I haven’t been able to figure it out.
by ArtB0514 at 2013-01-30 14:20:48
Here are a couple of ideas that should get you started.

First, never, ever, try to store data in a pipeline. You’ll almost certainly not get out what you expect. Think of separating your task into several pipelines such as Data Collection, Data Processing, and Data Presentation. When looping over a set of objects where each is going to provide a set of data with identical properties, Create an array object outside of the loop that you add each objects data to inside the loop.$colComputers = @()
foreach ($domain in $domainlist) {
$RawData = Get-ADComputer -Server $domain -Credentials $DomainAdmin -filter “whatever” -properties “whatever”,“list”,“you”,“want”
$colComputers += $RawData | Select Property,@{Name=‘CreatedProperty’;Expression={arbitrary-script-block}}

In this particular case, though, rather than running Get-ADComputer locally, I’d set up a PSSession to a domain controller in each of the domains and use Invoke-Command -AsJob to execute the data collection in parallel on each domain.foreach ($domain in $domainlist) {
$DC = <get the name of a domain controller in the domain>
$dcSession = New-PSSession -ComputerName $DC -Credential $DomainAdmin
Invoke-Command {
Add-Module ActiveDirectory
Get-ADComputer -filter “whatever” -properties “whatever”,“list”,“you”,“want”
} -Session $dcSession -AsJob
$colComputers = Get-Job | Receive-Job