我正在使用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 错误,因此似乎无声地失败。
什么可能导致此操作无法报告错误?
答案 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(正是你想要避免的)。