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