【问题标题】:Set-ADGroup cannot find group just created in same script (PowerShell)Set-ADGroup 找不到刚刚在同一脚本中创建的组 (PowerShell)
【发布时间】:2012-03-29 00:16:31
【问题描述】:

我正在编写一个脚本来创建安全组和通讯组,以便它们遵循我们的命名标准。在脚本中我使用 New-DistributionGroup 创建组,Set-DistributionGroup 添加一些自定义属性,然后想使用 Set-ADGroup 添加描述。 (顺便说一句: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 脚本比较陌生,所以如果您对如何解决这个问题有想法,我将不胜感激!

【问题讨论】:

    标签: powershell active-directory powershell-2.0


    【解决方案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"
    

    【讨论】:

    • 查看 JPBlanc 的评论以回答
    【解决方案2】:

    我无法对其进行测试,但这里有一个可能的解释。

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

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

    【讨论】:

    • 我在读完这篇文章后做了一些测试。我们的站点中有三个 DC(大森林的头),但它们都是 GC。通过在命令中指定特定的 DC,我发现某些 DC 有时会响应更快——但午餐前的快速 DC 可能是午餐后的慢 DC!
    【解决方案3】:

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

    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)
    

    丹恩

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2022-10-14
        • 2020-07-29
        • 1970-01-01
        • 1970-01-01
        • 2013-05-03
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多