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

时间:2018-09-10 16:33:12

标签: powershell active-directory

我正在关注代码(或多或少)。

$Users = Get-ADUser -Server $Domain -ResultPageSize 500000 -Filter * -Properties *, "msDS-UserPasswordExpiryTimeComputed" |
         Select-Object * -ExcludeProperty *Certificate, PropertyNames,
             *Properties, PropertyCount, Certificates, nTSecurityDescriptor
foreach ($U in $Users) {
    $($U.PSobject.Properties.Name).Count
}

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

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

$aRRAY = @()
foreach ($T in $Test) {
    #Get-ObjectType $T
    $Array += $($T.PSobject.Properties.Name).Count
}

$Array | Sort-Object

取最高值,并从具有最高属性计数的名称中获取所有名称属性,然后基于该值构建我的Excel / Word / SQL对象。.但是:

  1. 具有最高属性计数的对象实际上并不具有与具有最低属性的对象相同的属性

  2. 对性能有很大的影响(我知道要求所有字段仍然对性能有影响)

还有其他获得适当结果的方法吗?如果您想知道为什么我可能需要创建一个SQL表,该表将需要在插入行之前定义所有字段。或Excel工作簿,该工作簿将从标题开始(必须是已知的)开始逐行显示。

1 个答案:

答案 0 :(得分:0)

我选择了这种方法:

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-ArrayListAdd-ToArrayAdvanced函数。无需这些附加功能就可以完成此操作,但是由于我已经使用了很多,所以我不介意。

我尝试了其他类似的东西:

$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

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

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