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.
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
.
Documentation msDS-UserPasswordExpiryTimeComputed
Répertorie tous les attributs construits sur ADObject à l'aide d'un filtre LDAP
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).