根据包含计算机名称的txt文件检查PowerShell脚本行

时间:2016-08-06 00:58:06

标签: powershell

我需要针对带有计算机名称的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}

2 个答案:

答案 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 + '$')