Norrin Rad
Norrin Rad

Reputation: 991

Using Variable in Filter

I'm trying to query AD for a list of users from their Surname, which are help in a list.

I've tried most of the afternoon, but I just get a blank Excel sheet.

Also I want to know if there is more than one person with that username in AD, no idea how to even start with that one.

What I have so far:

Import-module ActiveDirectory 
$names = get-content c:\tempfiles\Final.txt
$names | ForEach-Object {
$ADUserParams=@{ 
'Searchbase' = 'OU=Administrators,OU=Locations,DC=The,DC=group,DC=com' 
'Searchscope'= 'Subtree' 
}
get-aduser @ADUserParams  -filter 'surname -like "$Names*"' | Select-Object Samaccountname, UserPrincipalName | export-csv C:\TempFiles\Usernames.csv
}

Do I even need a filter if it's a foreach-object? And is there a way to then check AD within that OU if there are more than one surname that are the same, and how would I count them? I can pull out a list of users surnames and then run the following, but it's then a manual task to locate the missing names. (If that makes sense)

What I have for that so far is:

get-content C:\TempFiles\Users.txt | sort -u > C:\TempFiles\users_cleaned.txt

Upvotes: 1

Views: 756

Answers (1)

Mark Wragg
Mark Wragg

Reputation: 23355

This should do it (however is untested as I don't have access to an AD right now):

Import-module ActiveDirectory 
$names = get-content c:\tempfiles\Final.txt

$ADUserParams=@{ 
    'Searchbase' = 'OU=Administrators,OU=Locations,DC=The,DC=group,DC=com' 
    'Searchscope'= 'Subtree' 
}

$names | ForEach-Object {
    $CurrentUser = get-aduser @ADUserParams -filter "surname -like '$_*'" | Select-Object Samaccountname, UserPrincipalName

    If ($CurrentUser) {

        If ($CurrentUser.Count -gt 1){ $DuplicateSurname = $true }Else{ $DuplicateSurname=$false }

        $CurrentUser | ForEach-Object {
            $_ | Add-Member -MemberType NoteProperty -Name DuplicateSurname -Value $DuplicateSurname
            Write-Output $_
        }
    } Else {
        Write-Warning "$_* did not matched any users."
    }

} | export-csv C:\TempFiles\Usernames.csv

Explanation:

Within a ForEach-Object loop the current item in the pipeline is represented by $_. You also need to use double quotes for the filter string, as variables (like $_) are expanded in double quoted strings, not single quoted strings.

You don't need to declare your $ADUserParams hashtable within the loop (that's wasteful) so I moved it outside.

The result of Get-ADUser will be returned to the pipeline, so finally I moved the | export-csv outside of the ForEach-Object so that the result of the processing is piped in to it. I think without this you'd only get the final result.

"Also I want to know if there is more than one person with that username in AD"

To handle this I have put a second ForEach-Object that loops through every user returned in to $CurrentUser and adds a "DuplicateSurname" property to the object (which should then be an additional column in your CSV) based on whether the count of $CurrentUser is more than 1 or not.

Finally we have to make sure that the contents of $_ are put back in to the pipeline which we do with Write-Object $_.

Upvotes: 1

Related Questions