每个域的特定OU

时间:2019-06-03 06:45:05

标签: powershell

我正在创建一个脚本,以从每个域中的特定OU从每个域中获取工作站。每个域的“特定OU”是唯一的。

function Get-Workstations {
    param (
      [Parameter(Position = 0, Mandatory = $true)]
      [ValidateSet("domain1", "domain2", "domain3", "domain4", "domain5", 
      "domain5")]
    [String[]]$Domain
    )

$domain1OU = "OU=Computers,OU=Corporate,DC=domain1,DC=com,DC=au"
$domain2OU = "OU=Workstations,OU=Corporate2,DC=domain2,DC=com,DC=au"
$domain3OU = "OU=AccountsWS,OU=MyCorporate,DC=domain3,DC=com,DC=au"
$domain4OU = "OU=Dev,OU=WS,OU=Company,DC=domain4,DC=com,DC=au"
$domain5OU = "OU=Computers,OU=WebDevs,DC=domain5,DC=com,DC=au"

Begin {
    $DomainLookup = @{
        domain1 = "domain1.com.au"
        domain2 = "domain2.com.au"
        domain3 = "domain3.com.au"
        domain4 = "domain4.com.au"
        domain5 = "domain5.com.au"
    }

}
Process {
    ForEach ( $DName in $Domain ) {
        If ( $DomainLookup.Contains($Domain) ) {
            Write-Host -ForegroundColor Green "Domain Name $DName found"

            if ( $DName -eq $DomainLookup.Values('domain1') ) {
                $workstations = Get-ADComputer -Server adc1.$domain1 -SearchBase $domain1OU -Filter * | Sort-Object -Property Name | Select-Object Name
            }

        }
    }

    #$workstations = Get-ADComputer -SearchBase $domain1OU -Filter * | Sort-Object -Property Name | Select-Object Name

}
End {
    return $workstations
}

}

以上功能是我试图为我们公司创建的更大的Powershell模块的一部分。用户应该从外壳程序调用该函数,并使用-Domain参数指定一个或多个域,并获得这些工作站的列表。

1 个答案:

答案 0 :(得分:0)

请对您的代码进行以下更改:

Process {
    ForEach ( $DName in $Domain ) {
        If ( $DomainLookup.Contains($DName) ) {
            Write-Host -ForegroundColor Green "Domain Name $DName found"

            if ( $DomainLookup['domain1'].Contains($DName) ) {
                $workstations = Get-ADComputer -Server ("{0}.{1}" -f "adc1",$domainlookup['domain1']) -SearchBase $domain1OU -Filter * |
                                Sort-Object -Property Name | Select-Object Name
            }
        }
    }
}

由于$Domain可能包含值数组,因此您需要检查哈希表对象的.Contains()方法中该数组中的每个对象值。在您的情况下,该值由$DName表示。

在第一个If语句中,.Contains()方法检查键值而不是键值对中的值。有关引用哈希表键和值的信息,请参见About_Hash_Tables。有关Hashtable.Contains方法的工作原理,请参见Hashtable .Contains(Object) Method

在引用特定键的值时,至少可以用两种方法来实现。一种方法是使用键名作为命名索引,例如$DomainLookup['Domain1']。第二种方法是将键名用作属性名,例如$DomainLookup.Domain1。无论哪种情况,都可以将变量用作索引名称或属性名称。例如,可以使用$DomainLookup.$DName

请记住,在第二个if语句中,.Contains()方法来自String类。那里的方法是通过访问特定键的值对返回的字符串值进行子字符串比较。有关.Contains(Value)方法在String类中的工作方式,请参见String.Contains Method

Get-ADComputer命令需要更改,特别是传递给-Server参数的值。由于您要将哈希表中的值附加到字符串adc1,因此需要正确地检索该值。您的原始语句可以工作,但是您需要为哈希表中的值分配$domain1

请注意,您可能不需要嵌套的if语句。我把它们留在那儿,以防您的代码执行的工作超出了发布的范围。