Powershell 每个域的特定OU

Powershell 每个域的特定OU,powershell,Powershell,我正在创建一个脚本,从每个域中的特定OU获取每个域中的工作站。“特定OU”对于每个域都是唯一的 function Get-Workstations { param ( [Parameter(Position = 0, Mandatory = $true)] [ValidateSet("domain1", "domain2", "domain3", "domain4", "domain5", "domain5")] [String[]]$Dom

我正在创建一个脚本,从每个域中的特定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模块的一部分。用户应该从shell调用函数,并使用-Domain参数指定一个或多个域,然后获取这些工作站的列表。

请对代码进行以下更改:

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()
方法检查键值而不是键值对中的值。有关引用哈希表键和值的信息,请参见。有关
哈希表.Contains
方法的工作原理,请参阅

在引用特定键的值时,至少可以通过两种方式进行。一种方法是使用键名作为命名索引,如
$DomainLookup['Domain1']
。第二种方法是使用键名作为属性名,如
$DomainLookup.Domain1
。在这两种情况下,变量都可以用作索引名或属性名。例如,
$DomainLookup.$DName
可以使用

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

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


作为补充说明,您可能不需要嵌套的if语句。我把它们放在那里,以防您的代码超出发布的内容。

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

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()
方法检查键值而不是键值对中的值。有关引用哈希表键和值的信息,请参见。有关
哈希表.Contains
方法的工作原理,请参阅

在引用特定键的值时,至少可以通过两种方式进行。一种方法是使用键名作为命名索引,如
$DomainLookup['Domain1']
。第二种方法是使用键名作为属性名,如
$DomainLookup.Domain1
。在这两种情况下,变量都可以用作索引名或属性名。例如,
$DomainLookup.$DName
可以使用

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

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


作为补充说明,您可能不需要嵌套的if语句。我把它们放在那里,以防您的代码所做的事情超出了发布的内容。

问题是什么?[咧嘴笑]对不起,我的错。上面的脚本不像我想的那样起作用。当我给出一个域时,它不会获取该域下的工作站。这就是为什么我要对“#$workstations=Get…”进行注释的原因部分我可以让它在循环或if之外工作。这有什么意义吗?是的,但是你需要把它添加到你原来的帖子中,这样其他人才能找到它。[咧嘴笑]试着把你实际得到的东西和你想从中得到的东西都写进去,这样人们就能对这个问题有一个好的认识。问题是什么?[咧嘴笑]对不起,我的错。上面的脚本不像我想的那样起作用。当我给出一个域时,它不会获取该域下的工作站。这就是为什么我要对“#$workstations=Get…”进行注释的原因部分我可以让它在循环或if之外工作。这有什么意义吗?是的,但是你需要把它添加到你原来的帖子中,这样其他人才能找到它。[咧嘴笑]试着把你实际得到的和你想从中得到的都包括进去,这样人们就可以对这个问题有一个好的了解。谢谢谢谢谢谢!!!我被困在这件事里,弄不清自己错过了什么。是的,我确实想到了`-Server`参数,但是后来。本脚本的这一部分只是测试水如何工作的第一步。但整个项目仍处于早期阶段。最后我会把它发布在一个在线版本控制网站上。谢谢你谢谢你!!!我被困在这件事里,弄不清自己错过了什么。是的,我确实想到了`-Server`参数,但是后来。本脚本的这一部分只是测试水如何工作的第一步。但整个项目仍处于早期阶段。最终我会把它发布在一个在线版本控制网站上。