【问题标题】:Errors when using Set-ADUser and Add-ADGroupMember in child domains (across forest)在子域(跨林)中使用 Set-ADUser 和 Add-ADGroupMember 时出错
【发布时间】:2023-04-01 22:29:02
【问题描述】:

我已经构建了一个脚本,它应该查询整个森林的用户并做一些事情:

  1. 设置 ExtensionAttribute2
  2. 将用户添加到自己域中的特定域组
  3. 将用户添加到根域中的组

当我对林的根域中的 GC 运行此操作时,根域中的用户被处理得很好。子域中的用户处理步骤 #3 只是文件,但步骤 #1 和 #2 会导致错误。

编辑澄清:这些命令是针对根林中的 2012 域控制器运行的,该域控制器也是全局编录服务器。我以可以访问所有子域的企业管理员身份运行这些命令。使用这些相同的凭据和相同的服务器,我可以使用 Active Directory 用户和计算机手动进行所有这些编辑。

这是我创建的脚本:

$csvpath = ".\users.csv"
$groupcbr = Get-ADGroup "CN=test group,OU=Test OU,DC=contoso,DC=com"

Import-CSV -Path $csvpath | Foreach-Object {
    $userprincipalname = $_.userprincipalname
    $activationkey = $_.activationkey
    Get-ADUser -Filter {userprincipalname -like $userprincipalname} -SearchBase "DC=contoso,DC=com" -Server "ROOTGC.contoso.com:3268" | Foreach-Object {
        $dn = $_.DistinguishedName

        #Set default as root domain
        $domain = "contoso"
        $domainserver = "ROOTGC.contoso.com"
        $groupscript = Get-ADGroup -Identity "$domain Test Group Users"

        If ($dn -like "*DC=childdomain1*") {
            $domain = "childdomain1"
            $domainserver = "childgc1.childdomain1.contoso.com"
            $groupscript = Get-ADGroup -Identity "$domain Test Group Users" -Server "ROOTGC.contoso.com:3268"
        }
        If ($dn -like "*DC=childdomain2*") {
            $domain = "childdomain2"
            $domainserver = "childgc2.childdomain2.contoso.com"
            $groupscript = Get-ADGroup -Identity "$domain Office 365 Users" -Server "ROOTGC.contoso.com:3268"
        }

        Write-Host "$domain | $userprincipalname [$($_.SamAccountName)] will get $activationkey added, and put into groups: $groupscript | [$dn]"

        #Set ExtensionAttribute2
        SET-ADUSER -Identity $dn -replace @{ExtensionAttribute2="$activationkey"}

        #Add the user to their own domain-based group
        Add-ADGroupMember -Identity $groupscript -Members $_

        #Add the user to the root domain's universal group
        Add-ADGroupMember -Identity $groupcbr -Members $_
    }
}

再次,根域进程中的用户就好了。子域中的用户在 #1(设置 extensionattribute2)和 #2(添加他们的本地域组)上遇到错误。

以下是错误:

设置 ExtensionAttribute2:

SET-ADUSER : A referral was returned from the server
At C:\***\Untitled1.ps1:52 char:3
+         SET-ADUSER -Identity $dn -replace @{ExtensionAttribute2="$activationkey"}
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ResourceUnavailable: (CN=User1...contoso,DC=com:ADUser) [Set-ADUser], ADReferralException
+ FullyQualifiedErrorId : ActiveDirectoryServer:8235,Microsoft.ActiveDirectory.Management.Commands.SetADUser

加入本地域组:

Add-ADGroupMember : The server is unwilling to process the request
At C:\***\Untitled1.ps1:53 char:3
+         Add-ADGroupMember -Identity $groupscript -Members $_
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (CN=ChildDomain1 Tes...contoso,DC=com:ADGroup) [Add-ADGroupMember], ADInvalidOperationException
+ FullyQualifiedErrorId : ActiveDirectoryServer:8245,Microsoft.ActiveDirectory.Management.Commands.AddADGroupMember

我已经到处搜索了,但还没有找到任何方法来解决这个问题。我已经尝试了以下(以及更多):

  1. 为每个命令添加了 -Server "ROOTGC.contoso.com:3268" 以查看是否有帮助,但它所做的只是为每个人(包括已经在工作的 root 用户)破坏这些命令)。
  2. 尝试将每个域的单独域服务器添加到命令末尾(根据我填充的变量:$domainserver),但所有子域 DC 都是 Windows 2003;服务器不接受连接。
  3. 将代码片段移动到不同的地方(使其效率降低,但到底是什么 - 我正在尝试任何东西)。

我错过了什么?请帮帮我!!我不得不手动浏览我的 CSV 文件并设置需要设置的内容,因为它必须在今晚完成,但我将在接下来的 2 周内处理成千上万的用户。

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    您对其运行此操作的服务器必须具有全局编录的副本,否则它将无法解析引用。或者您必须针对目标域的 DC 运行该命令。此外,您的用户必须具有企业管理员权限才能在林的其他域中创建/修改/删除对象(或必须在目标域中进行适当的委派)。

    另一个问题是,如果没有在所有相关 DC 上运行的 Windows Server 2008 R2 之前不可用的 Active Directory Web 服务,闪亮的 AD cmdlet 将无法工作。不过,您可以通过自己处理外部安全主体和目录对象来解决这个问题:

    $fsp = New-Object Security.Principal.NTAccount('DOM1', 'username')
    $sid = $fsp.Translate([Security.Principal.SecurityIdentifier]).Value
    
    $dn = Get-ADGroup -Identity 'groupname' | select -Expand distinguishedName
    $group = New-Object DirectoryServices.DirectoryEntry("LDAP://$dn")
    
    [void]$group.member.Add("<SID=$sid>")
    $group.CommitChanges()
    $group.Close()
    

    话虽如此:您确实意识到 Windows Server 2003 将在后天报废,不是吗?为什么你们的 DC仍在运行那个老式版本?

    【讨论】:

    • 正如我在原始帖子中所指定的,我在根目录林中的全局目录服务器上运行它。我以企业管理员帐户运行它。我可以使用 ADUC 手动对所有域运行这些命令的服务器上的所有修改,因此这不是权限问题。关于 2003 年,是的,我知道。我们正在将用户迁移到 2012 根域以消除子域。
    • 您还有其他建议吗?我已经用尽了很多选项,而您发布的内容并不相关,因为我拥有所有适当的权限等。
    • 是的,我试过了。它以非常复杂的方式工作,并表明这不是权限问题。它与通过全局目录将“Set-ADUser”或“Add-ADGroupMember”等命令写入子域有关。 social.technet.microsoft.com/forums/windowsserver/en-US/… 可以使用一些复杂的方法(如您上面的方法)和其他方法来完成,例如 set-adobject $Group1.distinguishedName -Add @{"member"=$User1.distinguishedName} 这是一个已知的 Microsoft 问题
    • 底线:我发布的内容完全相关。很高兴我们把这件事弄清楚了。
    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多