我有一个PowerShell脚本,该脚本调用Get-Aduser从Active Directory创建用户对象列表。该脚本处理具有逻辑的用户列表,该逻辑评估了用户启用属性(布尔值(的价值。
我发现的是,当脚本作为域用户管理员运行时,对启用属性的评估起作用。但是,当我将其作为替代域管理员运行(即,我通过复制管理员用户创建的帐户(将脚本无法评估启用属性。确实,这就像该属性不存在。
这是说明问题的代码。
$users = Get-ADUser -Filter "*" -SearchBase "OU=Customers,OU=STORE1,DC=SOME,DC=COMPANY"
foreach($u in $users){
if($u.Enabled -eq $true)
{
write-host "Enabled"
}
}
如果我将其作为用户管理员运行,则代码为列表中启用的广告用户输出"启用"。但是,如果我将其作为备用管理用户(通过复制管理员创建的一个(运行,则根本没有输出。
为了进一步说明问题,如果我以管理员的身份运行此代码
$users | ForEach-Object{$_.Enabled}
脚本输出
True
True
False
True
... etc
,但是如果我将其作为备用管理用户运行,它将没有输出。
您是否知道为什么是这种情况?
问题将在您创建的alt da帐户的权限中存在。
- 确认它已在ADUC安全选项卡中的
userAccountControl
设置读取/写入。 - 确保没有任何OU GPO会阻碍它看到这些设置。通过检查适用于原始DA帐户的OU GPO 来确认这一点
此命令的PowerShell部分没有问题。您可以通过启动ADUC来确认这一点。
为什么不使用…
Get-Member
... cmdlet找出那里有哪些属性。这毫无意义,因为如果您要克隆默认的管理员帐户,那么所有私有都应该在那里。如果不是您需要的话。
没有真正的理由使用明确的if或forloop来获得这些结果。您可以做到这一点。
(Get-ADUser -Filter "*" -SearchBase $SearchDN.DistinguishedName) |
Select-Object -Property SamAccountName, Enabled |
Sort-Object -Property Enabled |
Format-Table -AutoSize
也看一下…
search-adaccount
... cmdlet,并在两个帐户上对其进行测试。
@drew是正确的,问题是userAccountControl
,但是我在ADUC中要查询的"安全"选项卡上没有找到属性。我找到了一篇文章,描述了如何使用ADSI(https://briandesmond.com/blog/delegating-enable-disable-account-account-rights-in-active-directory/(设置此文章。按照这些说明(为不同版本的AD提供津贴(,我添加了Alt Admin用户,并授予了对UserAccessControl的阅读访问。现在该脚本按预期工作。
但是,我仍然感到困惑为什么这是必要的。我的替代管理帐户属于OU上已经分配的所有权限的所有组。(正如我所说,该帐户是管理员的副本(。无论出于何种原因,此权限都不会应用于此用户。