Richard
Richard

Reputation: 365

Powershell - verify object exists in AD

i have a text file containing arround 100 servers, how can i push these into a script and test if they exist within AD? I have a simple script below:

$serverlist = get-content ServerList.txt
foreach ($server in $serverlist) {
    if (Get-ADComputer $serverlist ) {
        Write-Host "#########################"  
        Write-Host "Computer object exists"
        Write-Host "#########################"  
    }
    else {
        Write-Host "#########################"  
        Write-Host "Computer object NOT FOUND"
        Write-Host "#########################"
    }
}

the above does not work returning a error:

Get-ADComputer : Cannot convert 'System.Object[]' to the type 'Microsoft.ActiveDirectory.Management.ADComputer' required by parameter 'Identity'. Specified method is not supported.

Can someone please explain does the get-adcomputer only allow a single object? Also if i remove the txt file and add a server shown below:

if (Get-ADComputer "server name" )

The above provides only results if the server exists within AD, if the server does not the error is shown below:

Get-ADComputer : Cannot find an object with identity: 'iuiub' under: 'DC=####,DC=#####,DC=#####'

Thank you for any insight / help!

Phil

Upvotes: 3

Views: 51630

Answers (3)

Michel Balencourt
Michel Balencourt

Reputation: 156

In order to get a more helpful output, I'd go with the following... You'll just have a list of green and red lines indicating which server was found and which one wasn't.

$serverlist = get-content ServerList.txt

    foreach ($server in $serverlist) {

        try {

            Get-ADComputer $server -ErrorAction Stop | Out-Null
            Write-Host "$($server) exists" -ForegroundColor DarkGreen

        }

        catch {

            Write-Host "$($server) NOT FOUND" -ForegroundColor DarkRed

        }

    }

Upvotes: 0

E.V.I.L.
E.V.I.L.

Reputation: 2166

Create an array - @(). If the array has 1 or more objects in it - which is $true - then you know the computer exists. If the array has 0 objects in it - which is $false- then you know the computer doesn't exist. I know some people don't like the ErrorAction to be set to SilentlyContinue but you're "Outputting an Error" if an error does occur.

$serverlist = get-content ServerList.txt
foreach ($server in $serverlist) {
    if (@(Get-ADComputer $server -ErrorAction SilentlyContinue).Count) {
        Write-Host "#########################"  
        Write-Host "Computer object exists"
        Write-Host "#########################"
    }
    else {
        Write-Host "#########################"  
        Write-Host "Computer object NOT FOUND"
        Write-Host "#########################"
    }
}

Another thing you could try are try catch blocks. Sorta like this:

$serverlist = get-content ServerList.txt
foreach ($server in $serverlist) {
    try{
        Get-ADComputer $server -ErrorAction Stop
        Write-Host "#########################"  
        Write-Host "Computer object exists"
        Write-Host "#########################"
    }
    catch{
        Write-Host "#########################"  
        Write-Host "Computer object NOT FOUND"
        Write-Host "#########################"
    }
}

Upvotes: 3

Arcass
Arcass

Reputation: 932

Line 3, change $serverlist to $server

With regards to handling a not found result. I'd try flipping the logic :

 $serverlist = get-content ServerList.txt
 foreach ($server in $serverlist) {
    $tempVar = Get-ADComputer $server
    if ($tempVar -like "Get-ADComputer : Cannot find an object with identity" ) {
      Write-Host "#########################"  
      Write-Host "Computer object NOT FOUND"
      Write-Host "#########################"  
    }
    else{
       Write-Host "#########################"  
       Write-Host "Computer object exists"
       Write-Host "#########################"
    }
}  

Upvotes: 3

Related Questions