Powershell - 验证对象存在于AD中

时间:2014-02-03 10:49:38

标签: powershell powershell-v2.0

我有一个包含arround 100服务器的文本文件,我如何将它们推入脚本并测试它们是否存在于AD中?我在下面有一个简单的脚本:

$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 "#########################"
    }

} 以上不起作用返回错误:

Get-ADComputer:无法将'System.Object []'转换为参数'Identity'所需的'Microsoft.ActiveDirectory.Management.ADComputer'类型。不支持指定的方法。

有人可以解释一下get-adcomputer只允许一个对象吗?此外,如果我删除txt文件并添加如下所示的服务器:

if (Get-ADComputer "server name" )

如果服务器存在于AD中,以上仅提供结果,如果服务器没有,则错误如下所示:

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

感谢您的任何见解/帮助!

菲尔

3 个答案:

答案 0 :(得分:2)

第3行,将$ serverlist更改为$ server

关于处理未找到的结果。我试着翻转逻辑:

 $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 "#########################"
    }
}  

答案 1 :(得分:2)

创建一个数组 - @()。如果数组中有一个或多个对象 - $true - 那么您就知道计算机存在。如果数组中有0个对象 - $false - 那么您就知道计算机不存在。我知道有些人不喜欢将ErrorAction设置为SilentlyContinue,但如果发生错误,则为"Outputting an Error"

$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 "#########################"
    }
}

您可以尝试的另一件事是try catch块。像这样排序:

$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 "#########################"
    }
}

答案 2 :(得分:0)

为了获得更有用的输出,我将使用以下内容...您将只有一条绿色和红色线条的列表,指示找到了哪个服务器,而没有找到哪个服务器。

$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

        }

    }