我需要针对带有计算机名称的txt文件检查以下代码,因此如果文件中存在计算机名称,则将其复制到影子组。
$OU="OU=Computers,DC=mylab,DC=local"
$ShadowGroup="CN=SelectPCs,OU=Groups,DC=mylab,DC=local"
Get-ADComputer –SearchBase $OU –SearchScope OneLevel –LDAPFilter "(!memberOf=$ShadowGroup)" | ForEach-Object {Add-ADPrincipalGroupMembership –Identity $_ –MemberOf $ShadowGroup}
我尝试了一个管道,然后在哪里,但是无法使它工作:
$OU="OU=Computers,DC=mylab,DC=local"
$ShadowGroup="CN=SelectPCs,OU=Groups,DC=mylab,DC=local"
$PCList = c:\scripts\computernames.txt
Get-ADComputer –SearchBase $OU –SearchScope OneLevel –LDAPFilter "(!memberOf=$ShadowGroup)" **| Where-Object {$_.Name –Match $PCList}** |ForEach-Object {Add-ADPrincipalGroupMembership –Identity $_ –MemberOf $ShadowGroup}
答案 0 :(得分:1)
看起来您正在尝试将名称与计算机名称数组匹配。那就像问'computer1'是否包含'computer1,computer2,computer3'那样是假的。但是询问'computer1,computer2,computer3'是否包含字符串'computer1'是真的。
换句话说,您可以Where-Object {$_.Name -match $PCList}
代替Where-Object {$PCList -match $_.Name}
。
请记住,这也会做部分匹配。例如,computer1将匹配computer1以及computer11,computer12等
更好的方法是遍历文本文件中的计算机名列表以执行检查和操作(如mklement0的答案所示)。
答案 1 :(得分:1)
我建议您按如下方式重写命令:
Get-Content c:\scripts\computernames.txt | Get-ADComputer -Property MemberOf |
Where-Object { $_.DistinguishedName -match ('^[^,]+,' + $OU + '$') -and
$_.MemberOf -notcontains $ShadowGroup } |
ForEach-Object {Add-ADPrincipalGroupMembership –Identity $_ –MemberOf $ShadowGroup}
从您的计算机名称列表开始,Get-ADComputer
应该能够通过管道直接识别,隐式绑定到-Identity
参数。
-Property MemberOf
确保每个返回对象中都包含非默认属性MemberOf
。
Where-Object
调用然后会检查计算机是否在正确的OU中($_.DistinguishedName -match ('^[^,]+,' + $OU + '$')
- 可能您甚至不需要这个,因为您已经识别出计算机按名称 [1]
)以及它是否还不是$ShadowGroup
($_.MemberOf -notcontains $ShadowGroup
)的成员。
最后,Foreach-Object
次调用会将匹配的计算机添加到组$ShadowGroup
。
[1]假设计算机具有唯一的名称,因此将Get-ADComputer
与计算机名称(意味着参数-Identity
)匹配在< em>任何 OU,因此通常无需通过OU约束匹配。
也就是说,上面使用的正则表达式明确设计为仅匹配$OU
中直接的计算机。
如果要匹配指定OU 中的计算机和任何后代OU ,请使用$_.DistinguishedName -match (',' + $OU + '$')