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

Set-ADGroup找不到刚刚在同一脚本(PowerShell)中创建的组,powershell,active-directory,powershell-2.0,Powershell,Active Directory,Powershell 2.0,我正在编写一个脚本来创建安全组和分发组,以便它们遵循我们的命名标准。在脚本中,我使用New DistributionGroup创建组,将DistributionGroup设置为添加一些自定义属性,然后使用Set-ADGroup添加描述。(旁白:新DistributionGroup做不到这些事情真是太痛苦了!)尽管将睡眠时间设置为30秒,Set-ADGroup始终会失败,原因是: Set-ADGroup:在[our domain]下找不到标识为“AcctTesting1”的对象 然而,如果我从Se

我正在编写一个脚本来创建安全组和分发组,以便它们遵循我们的命名标准。在脚本中,我使用New DistributionGroup创建组,将DistributionGroup设置为添加一些自定义属性,然后使用Set-ADGroup添加描述。(旁白:新DistributionGroup做不到这些事情真是太痛苦了!)尽管将睡眠时间设置为30秒,Set-ADGroup始终会失败,原因是:

Set-ADGroup:在[our domain]下找不到标识为“AcctTesting1”的对象

然而,如果我从Set ADGroup中删除代码行,运行脚本,然后立即运行Set ADGroup代码,它就可以完美地工作

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


我对PowerShell脚本编写比较陌生,因此如果您对如何修复此问题有任何想法,我将非常感谢您提供一些详细信息

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

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


因此,问题的一个原因是您必须等待从GC到引用域控制器的复制。您可以尝试在带有全局编录的控制器上运行脚本来测试这一点。

以下是您可以尝试的内容

您可以指示
新建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"

在这个网站上收到的信息告诉了我为什么会发生错误,但我仍然需要修复它。另一位网站专家建议采用循环直到结构,以在组可用之前保持执行。他的解决方案奏效了,但在循环的每次迭代中,屏幕上都充满了错误消息。下面的帖子给了我构建工作循环所需的信息

执行新的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)

Dann

我也有这个问题,因为我将组用于远程文件系统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
 }
}

读完这篇文章后,我做了一些测试。我们的站点中有三个DC(一个大森林的头),但它们都是GC。通过在命令中指定一个特定的DC,我发现某些DC有时会响应得更快,但午餐前的快速DC可能是午餐后的慢速DC!请参阅JPBlanc的回复评论
    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
 }
}