Setting variable based on AD OU

Hello folks, I’m on the cusp of ‘getting it’, and have hit a small roadblock with variables. Hoping to get some guidance please :). Here’s my AD structure:

Goal #1 = produce a variable for each environment, be it DEV, QA, Stage or Prod

#determine the servers environment
Function GetEnvironment{
    Import-Module ActiveDirectory
    Get-ADComputer -SearchBase "OU=DSCdev,DC=mtl,DC=contoso,DC=com" -Filter * |
    select -ExpandProperty DistinguishedName

$production = GetEnvironment | where {$_.DistinguishedName -ccontains ",OU=Prod"}

Problem: I don’t think i’m using “where” correctly / running the last line is above is accepted, but when I look for result I get nothing.

Goal 2:

I want to add the outcome as an additional row/string to the below hashtable:

#Pull list of WebServers and GUIDs into hash table
$WebServerConfigData = @{
    AllNodes = @(
        foreach ($node in $WebServers) {
            @{NodeName = $node.Name; NodeGUID = $node.objectGUID; NodeRole = 'WebServer'}   #### insert environment on this line based on env roles

This is all to be used in DSC, I’m deliberately keeping the searchbase higher because I’d like to keep the scalability.


The Problem with your Where-Object filterscript is twofold:

  1. When you ran Get-ADComputer you piped that to Select -expandproperty Distinguishedname. The output of this will be a string with no distinguishedname property to compare against. Just get rid of the Select portion of the command and you’ll be fine. Alternatively you can drop the property from the $_ in the filterscript to handle this:
where {$_ -ccontains ",OU=Prod"}
  1. You need to use -like instead of -ccontains. -Contains and -CContains are used for finding objects in a collection. You are just comparing strings so use like:
$production = GetEnvironment | where {$_.DistinguishedName -like "*,OU=Prod*"}

In the first part are you just trying to get a list of all the computers in each child OU? How about something like this:

$OUs = Get-ADOrganizationalUnit -SearchBase 'OU=Elementary,OU=Student,OU=Computers,DC=lakota,DC=spi' -Filter * -SearchScope OneLevel | foreach {
        Name = $_.Name
        Computers = (Get-ADComputer -SearchBase $_ -Filter *)

This will give you an array of OUs by name each with all the computer objects that you can iterate through later.

For the second goal, do you have a particular problem? It’s unclear what exactly you are going for here.

So if I take what you put and do this:

  1. execute your array on an OU of mine, which works nicely by the way
  2. $OUs | Where-Object {$_.Computers -like “007”}

Powershell takes the command, but doesn’t output any information (even if I verbose it). I know I have a computer with 007 in the name.

Confused I am

found the problem, didn’t notice your *'s in “like”. really needs those wildcards eh?

That’s right, you need a wildcard in a like comparison.