在我的Powershell脚本中,为什么管理员用户看到AD用户对象的“已启用”属性值,而另一个“管理员”用户却看不到?

时间:2019-06-28 00:25:37

标签: windows powershell active-directory

我有一个Powershell脚本,该脚本调用Get-ADUser从Active Directory创建用户对象列表。该脚本使用逻辑来处理用户列表,该逻辑会评估用户的Enabled属性(布尔值)的值。

我发现的是,当脚本以域用户Administrator身份运行时,对Enabled属性的评估有效。但是当我以备用域管理员(即通过复制管理员用户创建的帐户)运行它时,脚本无法评估Enabled属性。确实,这就像该属性不存在。

这是说明问题的代码。

$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"
   }
 }

如果我以用户Administrator身份运行,则代码为列表中已启用的AD用户输出“已启用”。但是,如果我以备用admin用户(通过复制Administrator创建的用户)运行它,则根本没有任何输出。

为进一步说明问题,如果我以管理员身份运行此代码

 $users | ForEach-Object{$_.Enabled}

脚本输出

 True
 True
 False
 True
 ... etc

但是如果我以备用管理员用户身份运行,它将不会输出任何内容。

你知道为什么会这样吗?

3 个答案:

答案 0 :(得分:1)

存在您创建的Alt DA帐户权限的问题。

  1. 确认ADUC安全标签中的userAccountControl设置具有读/写功能。
  2. 确保没有OU GPO阻止其查看这些设置。通过检查应用于原始DA帐户的OU GPO来确认这一点

此命令的PowerShell部分没有问题。 您可以通过以每个用户身份启动ADUC并检查随机用户设置来确认这一点,更多内容将显示为灰色。

答案 1 :(得分:0)

为什么不只使用…

Get-Member

... cmdlet找出那里的属性。这没有什么意义,因为如果您要克隆默认的管理员帐户,则所有privs都应该存在。如果不是您所需要的。

没有真正的理由使用显式的if或ForLoop获得这些结果。您可以这样做。

(Get-ADUser -Filter "*" -SearchBase $SearchDN.DistinguishedName) | 
Select-Object -Property SamAccountName, Enabled | 
Sort-Object -Property Enabled | 
Format-Table -AutoSize

还可以看看...

  

Search-ADAccount

... cmdlet,然后在两个帐户上对其进行测试。

答案 2 :(得分:0)

@Drew是正确的,表明问题是userAccountControl,但是我在ADUC中查询的OU的安全性选项卡上找不到该属性。我找到了一篇文章,描述了如何使用ADSI(https://briandesmond.com/blog/delegating-enable-disable-account-rights-in-active-directory/)进行设置。按照这些说明(允许使用不同版本的AD),我添加了alt admin用户,并为userAccessControl授予了READ访问权限。现在脚本可以按预期工作。

但是,我仍然困惑为什么这是必要的。我的备用管理员帐户属于已在OU上分配了权限的所有组。 (正如我所说,该帐户是管理员的副本)。无论出于何种原因,此权限都不会应用到该用户。