【问题标题】:Returning all Users from AD instead of users from groups in powershell从 AD 返回所有用户,而不是从 powershell 中的组返回用户
【发布时间】:2021-06-22 19:19:08
【问题描述】:

我正在尝试修改以下代码以从 AD 而不是域管理员返回所有用户:

原代码:

 $objDomain = New-Object System.DirectoryServices.DirectoryEntry
   $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.SearchScope = "Subtree"
$strFilter = "(&(sAMAccountName=Domain Admins))"

$objSearcher.Filter = $strFilter
$DomainAdminDN = ($objSearcher.FindOne()).Properties.distinguishedname

$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 10000000
$objSearcher.SearchScope = "Subtree"
$strFilter = "(&(objectCategory=user)(memberOf=$DomainAdminDN))"
$objSearcher.Filter = $strFilter

return ($objSearcher.FindAll())

}

我进行了以下更改,但它似乎返回 AD 中的每个对象,而不仅仅是 AD 中的用户

$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.SearchScope = "Subtree"
$strFilter = "(&objectCategory=user(sAMAccountName=Users))"

$objSearcher.Filter = $strFilter
$DomainAdminDN = ($objSearcher.FindOne()).Properties.distinguishedname

$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 10000000
$objSearcher.SearchScope = "Subtree"
$strFilter = "(&(objectCategory=user)(memberOf=$DomainAdminDN))"
$objSearcher.Filter = $strFilter

return ($objSearcher.FindAll())

}

欢迎大家帮忙!

【问题讨论】:

  • 好奇您是否查看过用于 powershell 的 ActiveDirectory 模块?可能会使这变得容易得多。
  • 你的 LDAP 过滤器应该是 (&(objectClass=User)(objectCategory=Person)(memberOf=$DomainAdminDN)) 查看这篇文章 stackoverflow.com/questions/7226317/…
  • 感谢@Santiago,当我将其更改为最终出现此错误时
  • 枚举集合时出错:(&(objectClass=User)(objectCategory=Person)(memberOf=)) 搜索过滤器无效.. + return ($objSearcher.FindAll() ) + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Director...sultsEnumerator:ResultsEnumerator) [], RuntimeException + FullyQualifiedErrorId : BadEnumeration
  • 任何想法为什么或如何解决它?

标签: powershell active-directory


【解决方案1】:

ActiveDirectory 模块就是为此而生的。

    $AllUsers = Get-ADUser -Filter * -Server MyDomain -properties *
    $AllUsers | Export-CSV -NoTypeInformation 'c:\temp\allusers.csv'

根据您的域的大小,这可能会使您的 DC 陷入一两分钟的困境。因此,如果您有数千名用户,请在空闲时间执行此操作。

如何加载模块的说明在Microsoft Docs site

【讨论】:

    【解决方案2】:

    AD 模块的另一种替代方案。

    ([adsisearcher]"(&(objectClass=User)(objectCategory=Person))").findall().properties
    

    这将列出所有用户对象。返回的对象类型为System.DirectoryServices.ResultPropertyCollection

    这里有一个小函数可以创建一个PSCustomObject 并去掉值周围的{}

    ([adsisearcher]"(&(objectClass=User)(objectCategory=Person))").findall().properties | ForEach-Object {
        $ht = [ordered]@{}
        foreach($entry in $_.getenumerator()){
            $ht.add($entry.name,$($entry.value))
        }
        [PSCustomObject]$ht
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多