Powershell set-aduser没有更新AD?

时间:2015-07-29 07:07:45

标签: powershell active-directory

我正在使用Powershell来使用Active Directory,虽然我可以解决问题,但我在修改时遇到了麻烦。

我不认为这是一个权限问题,因为我实际上没有看到为我设置的测试条目出错,我看我是否尝试更改不同的条目。

我正在使用psexec(因为runas没有命令行密码参数)将Powershell作为不同的域用户运行,因为我自己的帐户无权更改AD。在Powershell中执行whoami确认我正在以正确的用户身份运行。

我正在做的事情基本归结为:

PS C:\Temp> get-aduser -identity Xyzzy.Test -properties surname
    DistinguishedName : CN=Xyzzy Test,OU=Users,DC=company,DC=com
    Enabled           : True
    GivenName         : Xyzzy
    Name              : Xyzzy Test
    ObjectClass       : user
    ObjectGUID        : b1d2a3ff-3ee4-56b7-bc89-12ad345678a9
    SamAccountName    : Xyzzy.Test
    SID               : S-1-5-21-9999999999-888888888-77777777-66666
    Surname           : Test
    UserPrincipalName : Xyzzy.Test@company.com

PS C:\Temp> set-aduser -identity Xyzzy.Test -surname "xyzzy"

然后,当我再次运行相同的get-aduser时,我发现姓氏根本没有改变。

由于set-aduser产生了 no 错误,因此似乎无声地失败。

什么可能导致此操作无法报告错误?

1 个答案:

答案 0 :(得分:1)

这可能不是您特定问题的原因,但过去这对我来说一直是一个问题,所以它至少可以帮助其他人。

AD cmdlet会自动确定要使用的域控制器。它们不一定使用从一个命令到另一个命令的相同DC。这意味着您可以更新DC,然后进行查询,以查看尚未将更改复制到其中的另一个DC。

出于这个原因,我建议在处理某个操作时,你想要在某种程度上是原子的,通常是你在一个函数或脚本中用AD做的所有交互,你确保明确地使用相同的DC。 / p>

执行此操作的方法是使用-Server参数。

由于在每次通话中继续指定-Server很烦人,因此可以使用$PSDefaultParameterValues来实现此目的。

$PSDefaultParameterValues = @{
    "*-AD*:Server" = "MyDC"
}

可能更好,在运行时找到DC:

$PSDefaultParameterValues = @{
    "*-AD*:Server" = Get-ADDomainController -Writable -Discover -Service ADWS -ForceDiscover | Select-Object -ExpandProperty Name
}

不要使用脚本块(就像我在编辑之前那样),因为它会在每次调用时重新运行该块,这样每次都会给你一个不同的DC(正是你想要避免的)。