Как правильно получить все поля из Get-ADUser? - PullRequest
0 голосов
/ 10 сентября 2018

У меня следующий код (более или менее).

$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 голосов
/ 11 сентября 2018

Я выбрал этот подход:

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, Add-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 объект в моей AD имеет этот набор.

Я не уверен, как я могу быть уверен, чтобы получить все возможные поля доступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...