Powershell 如何循环AD中的OU以将用户添加到各种安全组?

Powershell 如何循环AD中的OU以将用户添加到各种安全组?,powershell,active-directory,Powershell,Active Directory,我对编写PS脚本有点陌生,我通常只需要简单的一行或两行,但为此,我尝试在Active Directory中循环通过特定的OU来查找每个用户部门,在其前面添加“grp”,并将它们以该名称添加到安全组中。例如,一个部门可能类似于10005,所以我想将它们添加到名为“grp10005”的安全组中。这是我的东西,但它不起作用 Import-Module ActiveDirectory $users = $i = $null $strCC $strGRP = 'grp' & str

我对编写PS脚本有点陌生,我通常只需要简单的一行或两行,但为此,我尝试在Active Directory中循环通过特定的OU来查找每个用户部门,在其前面添加“grp”,并将它们以该名称添加到安全组中。例如,一个部门可能类似于10005,所以我想将它们添加到名为“grp10005”的安全组中。这是我的东西,但它不起作用

Import-Module ActiveDirectory  

 $users = $i = $null  
 $strCC
 $strGRP = 'grp' & strCC

 $users = Get-ADUser -SearchBase "ou=Test,ou=OurUsers,ou=Logins,dc=domain,dc=com" -filter * {department -eq $strCC}  
 ForEach($user in $users)  
    {    
      Add-ADGroupMember 'strGRP' -Members $_.DistinguishedName
        -ErrorAction SilentlyContinue
      $i++  
    }  

您可以使用以下代码:

 Import-Module ActiveDirectory  

 $users = $null 
 $i = 0 
 $strCC = "CC"
 $strGRP = ("GroupName" + $strCC)

 $users = Get-ADUser -SearchBase "ou=Test,ou=OurUsers,ou=Logins,dc=domain,dc=com" -filter {department -eq $strCC}  
 ForEach($user in $users)  
    {    
      Add-ADGroupMember $strGRP -Members $user.DistinguishedName `
        -ErrorAction SilentlyContinue
      $i++  
    }  
请注意两种类型的循环之间的差异:

$array | foreach-object {
Write-Host $_
}  
以及:


我删除了语法错误并稍微修改了方法

导入模块ActiveDirectory
$users=$null
$strDept=“财务”
$strGRP=('grp'+$strDept)
$users=Get ADUser-SearchBase“ou=Test,ou=OurUsers,ou=Logins,dc=domain,dc=com”-Filter{Department-eq$strDept}
ForEach($users中的用户)
{    
添加ADGroupMember“strGRP”-Members$user.distributedName
-错误动作持续不断
}
编辑:

根据下面的评论,听起来你根本不想使用过滤器,但你想检查OU中的每个用户,找出他们当前的部门,然后将他们添加到一个名为“grp”前缀的组中

以下是一个可能的解决方案:

导入模块ActiveDirectory
$users=$null
$users=Get ADUser-SearchBase“ou=Test,ou=OurUsers,ou=Logins,dc=domain,dc=com”-Filter*-属性部门
ForEach($users中的用户)
{    
添加ADGroupMember(“grp”+$user.Department)-Members$user.discrimitedName-ErrorAction SilentlyContinue
}

您有许多语法错误
&
是调用运算符,而不是连接字符串的方法。对于该语句中缺少的
strc
,它是
$
,因此PowerShell正在查找该名称的关键字。然后您的过滤器用
*
指定“All”,然后有一个scriptblock抛出错误,因为PowerShell正试图根据其位置将该scriptblock放入另一个参数中。此外,筛选器正在使用$strc,但尚未为其分配任何内容,因此它是
$null
。此外,您正在foreach中使用管道变量
$\uu
,但您正在使用
foreach($users中的user)
。使用这种形式的foreach的全部目的是使用
$user
而不是一个模棱两可的下划线。计数器变量
$i
也是不必要的,因为您所做的只是增加计数器,然后再也不读取它。@NewGuy更糟,
$null++
仍然只是
$null
@MathiasR.Jessen不是这样的。如果
$i
不存在,则
$i++
将其转换为整数。
删除变量i-ErrorAction SilentlyContinue$i-eq$null$i++$i-eq$null$一,
返回
True
False
1
。此代码将引发错误,因为您的筛选语句都指定了“*”,然后脚本块部分将被分配给另一个参数,PowerShell将无法找到该参数的匹配项,从而引发错误。我猜OP需要完全删除
*
,因为他们正在尝试搜索部门。你完全正确,我刚刚编辑了上面的内容。谢谢,这正是我需要的,但我刚刚删除了-Properties,{}on筛选器是否排除了这些项目?还是仅包含它们?@RiCHiE Active Directory cmdlet筛选器参数用于指定AD对象必须匹配的一组条件,以便由命令返回。有关此筛选器语法的详细信息,请参见以下内容:
foreach ($item in $array) {
Write-Host $item
}