Set-ADGroup找不到刚刚在同一脚本中创建的组(PowerShell)

时间:2012-03-29 00:16:31

标签: powershell active-directory powershell-v2.0

我正在编写一个脚本来创建安全和通讯组,以便他们遵循我们的命名标准。在脚本中,我使用New-DistributionGroup创建组,Set-DistributionGroup添加一些Custom属性,然后使用Set-ADGroup添加Description。 (除此之外:New-DistributionGroup不能做这些事情的痛苦!)尽管设置睡眠时间长达30秒,Set-ADGroup总是失败:

  

Set-ADGroup:找不到具有身份的对象: [我们的域名] 下的“ AcctTesting1 ”。

然而,如果我从Set-ADGroup中删除代码行,运行脚本,然后立即运行Set-ADGroup代码,它可以很好地工作。

以下是该脚本的相关部分:(我们删除了域名)

    $GroupTypeName = "Assignment"
    $OU = $BaseOU + "AssignmentGroups"
    New-DistributionGroup -Name $SAMname -Alias $Alias -DisplayName $DisplayName -ManagedBy `
        "CN=Administrator,CN=Users,[our domain]" -OrganizationalUnit $OU `
        -SamAccountName $SAMname -Type Security
    Set-DistributionGroup -Identity $SAMname -CustomAttribute10 "ASSIGNMENT GROUP" `
        -CustomAttribute11 $PRMCode
    echo "Waiting for new group to replicate"
    Start-Sleep -s 20
    Set-ADGroup -Identity $SAMname -Description "$Alias AssignmentGroup"

我对PowerShell脚本编程比较陌生,所以如果你有关于如何解决这个问题的想法,我会很感激一点!

4 个答案:

答案 0 :(得分:1)

我无法测试它,但这是一个可能的解释。

New-DistributionGroup是一个Exchange Cmdlet,用于创建通用组。通用组是在拥有全局编录的域控制器上创建的。 Set-ADGroup是一个活动的目录Cmdlet,它尝试在任何域控制器上查找组。

因此,您遇到问题的一个原因是您必须等待从GC复制到指定的域控制器。您可能尝试在具有全局编录的控制器上运行脚本来测试它。

答案 1 :(得分:1)

这是你可以尝试的,

您可以指示New-DistributionGroup在特定DC上创建组(使用DomainController参数)。 New-DistributionGroup会发出该组,因此您可以将该组管道传输到Set-DistributionGroup并设置所需的属性。最后,您可以使用Set-ADGroup -Server参数从DC获取组。

New-DistributionGroup -DomainController DC1 -Name $SAMname ... | Set-DistributionGroup -CustomAttribute10 "ASSIGNMENT GROUP" -CustomAttribute11 $PRMCode 

Set-ADGroup -Server DC1 -Description "$Alias AssignmentGroup"

答案 2 :(得分:0)

本网站收到的信息向我展示了错误发生的原因,但我仍然需要修复它。另一位网站专家建议使用循环结构来执行,直到该组可用。他的解决方案有效,但在循环的每次迭代中都会在屏幕上显示错误消息。下面的帖子给了我建立工作循环所需的信息。

https://stackoverflow.com/a/9421291/1299495

执行New-DistributionGroup命令后,此循环会延迟后续命令,直到刚刚创建的组可用于修改。

    Write-Host -NoNewline "Waiting for replication"
    Do
    {
        If($Idx -gt 0) {Start-sleep -s 5}
        $r = Get-ADGroup -Filter {SamAccountName -eq $SAMname}
        Write-Host -NoNewline "."
        $Idx = $Idx + 1
    }
    Until($r)

达恩

答案 3 :(得分:0)

我也有这个问题,因为我使用该组进行远程文件系统ACL,我想确保该组在所有DC上同步。

在上面的基础上,我的实现实际上是

    function createADSecurityGroup{


Param(  [Parameter(mandatory = $true)] [String] $GroupScope,
        [Parameter(mandatory = $true)] [String] $Name, 
        [Parameter(mandatory = $true)] [String] $Description,  
        [Parameter(mandatory = $true)] [String] $Path)


try{

    New-ADGroup -GroupScope $GroupScope -Name $Name -Description $Description -GroupCategory Security -Path $Path

    foreach( $dc in Get-ADDomainController -Filter * | Select-Object name){

        $Idx=0
        $MaxTries=99
        $timeout=$false
        Write-Host -NoNewline "`nWaiting for group " $name " to appear on server " $dc.name
        Do {
            If($Idx -gt 0) {Start-sleep -s 5}

            try{
                $r=$null
                $r = Get-ADGroup -Server $dc.name -Filter {SamAccountName -eq $name }
                #Timeout-Error-Similation #$r = Get-ADGroup -Server $dc.name -Filter {SamAccountName -eq 'NoNe'} 
                Write-Host -NoNewline "."
                $Idx = $Idx + 1

                if( $Idx -gt $MaxTries ){

                    $timeout=$true
                    throw "Timeout waiting for appearance of group "
                }

            }catch{

                $ErrorMessage = $_.Exception.Message
                Write-Host $ErrorMessage

                if( $timeout ){

                    throw $ErrorMessage
                }
            }



        }
        Until($r)
    }

    Write-Host ""

}catch{

         $ErrorMessage = $_.Exception.Message
         $txt="createADSecurityGroup-Function FAILURE: "+$ErrorMessage+" "+$Name
         Write-Host "`n" $txt
         throw $txt
 }
}