web-dev-qa-db-fra.com

Get-ADUser ne renvoie pas tous les attributs AD possibles lors de la spécification de toutes les propriétés

J'ai rencontré un cas où des propriétés spécifiques ne sont pas énumérées lors de l'utilisation de Get-ADUser -Properties *. Par exemple, le code suivant ne répertorie pas la propriété msDS-UserPasswordExpiryTimeComputed même si elle existe et que je peux le spécifier en tant qu'argument -Properties, le renvoyer et pouvoir traiter sa valeur.

# Does not return msDS-UserPasswordExpiryTimeComputed
Get-ADUser username -Properties *

# This works to get the msDS-UserPasswordExpiryTimeComputed attribute returned
Get-ADUser username -Properties msDS-UserPasswordExpiryTimeComputed

# If I really want all properties and this one
# I have to specify it alongside *
Get-ADUser username -Properties *, msDS-UserPasswordExpiryTimeComputed

Ce n'est pas simplement un cas où la propriété est omise de l'affichage, je dois explicitement énoncer la propriété msDS-UserPasswordExpiryTimeComputed sinon elle n'est tout simplement pas disponible sur l'objet résultant.

Je sais déjà que filtrer sur Properties * n'est pas une bonne idée dans la plupart des cas, mais je suis curieux de savoir pourquoi tous AD DS les attributs ne sont pas énumérés alors que c'est précisément ce que je demande à la cmdlet. faire.

Cette question concerne Get-ADUser, mais comme la plupart des autres comportements avec les cmdlets Get-ADObject, je suppose que ce comportement s’étend à la plupart sinon à tous.

7
Bender the Greatest

La réponse semble être qu'il existe plusieurs types d'attributs sur une variable ADObject - Default, Extended et Constructed.

Les propriétés Default sont renvoyées sur toutes les requêtes ADObject correspondant à un type spécifique de ADObject (ADUser a son propre ensemble de propriétés par défaut, ADGroup a son propre ensemble, etc.)

Les propriétés Extended ne sont pas renvoyées par défaut, mais sont des attributs statiques énumérables de manière implicite sur une variable ADObject.

Les attributs Constructed ne sont pas des propriétés statiques mais sont calculés en fonction des valeurs d'autres attributs appartenant à ADObject. Je ne trouvais aucune information à ce sujet, mais j'imagine qu'énumérer tous les attributs Constructed peut être une opération coûteuse, car les valeurs sont calculées et doivent donc être explicitement demandées via le paramètre -Properties de la cmdlet Get-ADObject. .

Tout cela semble être lié à l'attribut systemFlags sur une ADObject, qui est l'endroit où les types d'attribut sont définis. Ma suspicion (je n'ai pas testé cette théorie de manière approfondie) est que les attributs avec l'indicateur Constructed (4) ou Non-Replicated (2) doivent être explicitement spécifiés pour être retournés à partir de la variable cmdlet.

Sources

Documentation msDS-UserPasswordExpiryTimeComputed

Répertorie tous les attributs construits sur ADObject à l'aide d'un filtre LDAP

Détermination d'un type d'attribut

Attribut SystemFlags

1
Bender the Greatest

Le code suivant doit renvoyer TOUS les attributs d'un utilisateur AD (toutes les propriétés de ObjectClass = user):

$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

Get-ADUser -Identity username -Properties $properties | fl $properties

Tout d'abord, il récupère et enregistre toutes les propriétés de l'utilisateur dans un tableau, puis le tableau de propriétés est utilisé avec Get-ADUser pour extraire toutes les propriétés d'un utilisateur unique (dans cet exemple).

3
TobyU