【问题标题】:How can I loop through OU in AD to add users to various security groups?如何通过 AD 中的 OU 循环将用户添加到各个安全组?
【发布时间】:2015-03-18 13:45:59
【问题描述】:

我对编写 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++  
    }  

【问题讨论】:

  • 您有许多语法错误。 & 是调用运算符而不是连接字符串的方法。对于该语句中的strCC 缺少它是$,因为PowerShell 正在寻找该名称的关键字。然后您的过滤器使用* 指定“全部”,然后有一个脚本块引发错误,因为 PowerShell 试图根据其位置将该脚本块放入另一个参数中。此外,过滤器正在使用 $strCC,但尚未为其分配任何内容,因此它是 $null
  • 此外,您在 foreach 中使用了管道变量$_,但您使用的是ForEach($user in $users)。使用这种形式的 foreach 的全部意义在于使用 $user 而不是模棱两可的下划线。
  • 计数器变量$i 也是不必要的,因为您所做的只是递增计数器,然后从不读取它。
  • @NewGuy 更糟糕的是,$null++ 仍然只是 $null
  • @MathiasR.Jessen 这不是发生的事情。如果 $i 不存在,则 $i++ 将其转换为 int。 Remove-Variable i -ErrorAction SilentlyContinue; $i -eq $null; $i++; $i -eq $null; $i; 返回TrueFalse1

标签: powershell active-directory


【解决方案1】:

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

Import-Module ActiveDirectory  

$users = $null  
$strDept = "Finance"
$strGRP = ('grp' + $strDept)

$users = Get-ADUser -SearchBase "ou=Test,ou=OurUsers,ou=Logins,dc=domain,dc=com" -Filter { Department -eq $strDept }  
ForEach($user in $users)  
{    
    Add-ADGroupMember 'strGRP' -Members $user.DistinguishedName
        -ErrorAction SilentlyContinue
}

编辑:

根据下面的 cmets,听起来您根本不想使用过滤器,但您想检查 OU 中的每个用户,找出他们当前的部门是什么,然后按该名称将他们添加到组中,但是以“grp”为前缀。

这是一个可能的解决方案:

Import-Module ActiveDirectory  

$users = $null  

$users = Get-ADUser -SearchBase "ou=Test,ou=OurUsers,ou=Logins,dc=domain,dc=com" -Filter * -Properties Department
ForEach($user in $users)  
{    
    Add-ADGroupMember ("grp" + $user.Department) -Members $user.DistinguishedName -ErrorAction SilentlyContinue
}

【讨论】:

  • 谢谢,这正是我需要的,但我刚刚删除了 -Properties,过滤器上的 {} 是否排除了这些项目?还是只包括它们?
  • @RiCHiE Active Directory cmdlet 过滤器参数用于指定一组条件,AD 对象必须匹配这些条件才能被命令返回。有关此过滤器语法的详细信息,请参阅以下内容:social.technet.microsoft.com/wiki/contents/articles/…
【解决方案2】:

您可以使用以下代码:

 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 $_
}  

和:

foreach ($item in $array) {
Write-Host $item
}

【讨论】:

  • 此代码将引发错误,因为您的过滤器语句都指定了“*”,然后脚本块部分被分配给不同的参数,PowerShell 将无法为其找到匹配项并因此抛出错误。我的猜测是 OP 需要完全删除 *,因为他们正在尝试搜索部门。
  • 你完全正确,我刚刚编辑了上面的内容。
猜你喜欢
  • 2019-08-19
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多