如何克隆GroupOfNames Active Directory对象?

时间:2014-09-10 22:57:46

标签: powershell active-directory active-directory-group

我正在编写一个脚本来获取一个GroupOfNames对象,并使用第一组成员创建第二个组。看起来这将是一段非常简单的代码:

$obj = Get-ADObject -Server "$server" -SearchBase $SearchBase -Filter "name -eq '$GroupName'" -Properties Member
New-ADObject -Server "$server" -Path $SearchBase -Type 'GroupOfNames' -name "$NewGroupName" -OtherAttributes @{'Member'= ($($obj.Member))}

当我运行它时,$ obj被创建,我可以显示GroupOfNames信息以及成员列表。但是当它调用New-ADObject cmdlet时,我收到以下错误:

New-ADObject : Unable to contact the server. This may be because this server does not exist, it is currently down, or it does not have the Active Directory Web Services running.

我尝试了多种代码变体,但都失败并出现类似错误。

有趣的是,如果我遍历成员列表并一次将它们添加到组中,它就会起作用,但它只需要太长时间(一小时+秒)。

2 个答案:

答案 0 :(得分:0)

试试这个,它会将您的第一个查询ADPropertyValueCollection的结果转换为字符串数组(未经测试!):

$obj = Get-ADObject -Server "$server" -SearchBase $SearchBase 
    -Filter "name -eq '$GroupName'" -Properties Member
$m = [string[]]$obj.Member
New-ADObject -Server "$server" -Path $SearchBase -Type 'GroupOfNames' 
    -name "$NewGroupName" -OtherAttributes @{'Member'= $m}

答案 1 :(得分:0)

经过一些反复试验,我发现我一次可以可靠地添加大约6000名成员。这是基本流程:

(Get-ADObject -Server "$server" -SearchBase $SearchBase -Filter { name -eq "$GroupName" } -Properties Member).Member | %{
    $SubList += [string] $_
    if($SubList.count -ge 6000) {
        Set-ADObject -Server "$server" -Identity $NewGroup -Add @{'Member'= ($SubList)}
        $SubList = @()
    }
}
if($SubList.count -gt 0) {
    Set-ADObject -Server "$server" -Identity $NewGroup -Add @{'Member'= ($SubList)}
}

感谢@Raf推进正确方向。