Powershell 如何以正确的方式从get ADUser获取所有字段?

Powershell 如何以正确的方式从get ADUser获取所有字段?,powershell,active-directory,Powershell,Active Directory,我有以下代码(或多或少) 现在,当您检查每个对象的属性计数时,它将是不同的。在我的测试域中,每个对象的属性范围从103到147 现在,虽然我可以将该计数添加到数组中,但排序如下(或多或少) 并从属性计数最高的属性中获取最大值和所有名称属性,然后在此基础上构建我的Excel/Word/SQL对象。。但有: 属性数最高的对象可能与属性数最低的对象不具有相同的属性 巨大的性能损失(我知道要求所有字段无论如何都是性能损失) 还有其他方法可以得到正确的结果吗?如果您想知道为什么我可能需要这样做,请考虑创建

我有以下代码(或多或少)

现在,当您检查每个对象的属性计数时,它将是不同的。在我的测试域中,每个对象的属性范围从103到147

现在,虽然我可以将该计数添加到数组中,但排序如下(或多或少)

并从属性计数最高的属性中获取最大值和所有名称属性,然后在此基础上构建我的Excel/Word/SQL对象。。但有:

  • 属性数最高的对象可能与属性数最低的对象不具有相同的属性

  • 巨大的性能损失(我知道要求所有字段无论如何都是性能损失)


  • 还有其他方法可以得到正确的结果吗?如果您想知道为什么我可能需要这样做,请考虑创建SQL表,该表需要在插入行之前定义所有字段。或者Excel工作簿,它将以页眉(必须知道页眉)开始逐行显示。

    我选择了这种方法:

    function Get-ObjectProperties {
    param (
        [object] $Object
    )
        $Properties = New-ArrayList
        foreach ($O in $Object) {
            $ObjectProperties = $O.PSObject.Properties.Name
            foreach ($Property in $ObjectProperties) {
                Add-ToArrayAdvanced -List $Properties -Element $Property -SkipNull -RequireUnique
            }
       }
       return $Properties | Sort-Object
    }
    
    我已经将它添加到
    PSSharedGoods
    模块(
    Install module PSSharedGoods
    ),因为我还使用了
    New ArrayList
    添加到我添加到该模块中的arrayaadvanced
    函数。它可能不需要那些额外的功能就可以完成,但是因为我已经经常使用它们了,所以我不介意

    我尝试过其他东西,比如:

    $properties = Get-ADObject -SearchBase (Get-ADRootDSE).SchemanamingContext -Filter {name -eq "User"} -Properties MayContain, SystemMayContain | `
        Select-Object @{name = "Properties"; expression = {$_.maycontain + $_.systemmaycontain}} | Select-Object -ExpandProperty Properties
    
    $Test1 = Get-ADUser -Server $Domain -ResultPageSize 5000000 -Filter * -Properties $properties 
    
    或:

    但它并不能返回所有内容。我在简单域上使用的方法返回了181个属性(来自我的函数)。其他方法返回43或类似结果。它仍然没有返回所有的东西,但它比我以前拥有的要好。例如,它返回
    ExtensionAttribute10
    ,但不返回其他对象,这是因为我的广告中只有一个对象具有该集合


    我不确定如何确保所有可能的字段都可用

    这听起来像是应该由创建广告用户模式的人来解决的问题,而不是用一个“一网打尽”的powershell脚本。不确定你的意思是什么?它是干净的AD 2016+已安装Exchange 2013。事情就是这样。模式与此无关。每个对象只返回“设置”的数据。如果它没有设置,它就不会返回。所以我在寻找一种方法来获取所有数据。无论它是否有这些数据。AD总是这样。如果没有设置属性,则不会返回。如果你描述一下结局可能会有所帮助goal@RichardSiddaway解决这个问题的办法是最终目标。。这是完美的吗state@RichardSiddaway还有这个和。两者都获取对象并将其放入表中。为了在表中获得正确的标题,我需要知道对象中可能存在的所有字段。
    function Get-ObjectProperties {
    param (
        [object] $Object
    )
        $Properties = New-ArrayList
        foreach ($O in $Object) {
            $ObjectProperties = $O.PSObject.Properties.Name
            foreach ($Property in $ObjectProperties) {
                Add-ToArrayAdvanced -List $Properties -Element $Property -SkipNull -RequireUnique
            }
       }
       return $Properties | Sort-Object
    }
    
    $properties = Get-ADObject -SearchBase (Get-ADRootDSE).SchemanamingContext -Filter {name -eq "User"} -Properties MayContain, SystemMayContain | `
        Select-Object @{name = "Properties"; expression = {$_.maycontain + $_.systemmaycontain}} | Select-Object -ExpandProperty Properties
    
    $Test1 = Get-ADUser -Server $Domain -ResultPageSize 5000000 -Filter * -Properties $properties 
    
    $Test1 = Get-ADObject -SearchBase (Get-ADRootDSE).SchemaNamingContext -Filter {name -like "User"} -Properties MayContain, SystemMayContain |
        Select-Object @{n = "Attributes"; e = {$_.maycontain + $_.systemmaycontain}} | Select-Object -ExpandProperty Attributes | Sort-Object
    
    $Test2 = Get-ADObject -SearchBase (Get-ADRootDSE).SchemaNamingContext -ldapfilter '(systemFlags:1.2.840.113556.1.4.803:=4)' -Properties systemFlags |
        Select-Object Name | Sort-Object Name