Public/get-AllegisADUserSchema.ps1

function get-AllegisADUserSchema(){
    $ADUser = Get-ADUser -ResultSetSize 1 -filter * -Properties objectClass
    Function Get-RelatedClass {
      param( [string]$ClassName )
  
      $Classes = @($ClassName)
  
      $SubClass = Get-ADObject -SearchBase "$((Get-ADRootDSE).SchemaNamingContext)" -Filter {lDAPDisplayName -eq $ClassName} -properties subClassOf |Select-Object -ExpandProperty subClassOf
      if( $Subclass -and $SubClass -ne $ClassName ) {
        $Classes += Get-RelatedClass $SubClass
      }
  
      $auxiliaryClasses = Get-ADObject -SearchBase "$((Get-ADRootDSE).SchemaNamingContext)" -Filter {lDAPDisplayName -eq $ClassName} -properties auxiliaryClass | Select-Object -ExpandProperty auxiliaryClass
      foreach( $auxiliaryClass in $auxiliaryClasses ) {
        $Classes += Get-RelatedClass $auxiliaryClass
      }

      $sysauxiliaryClasses = Get-ADObject -SearchBase "$((Get-ADRootDSE).SchemaNamingContext)" -Filter {lDAPDisplayName -eq $ClassName} -properties systemAuxiliaryClass | Select-Object -ExpandProperty systemAuxiliaryClass
      foreach( $sysauxiliaryClass in $sysauxiliaryClasses ) {
        $Classes += Get-RelatedClass $sysauxiliaryClass
      }

      Return $Classes  
    }
    $AllClasses = ( Get-RelatedClass $ADUser.ObjectClass | sort -Unique )
    $AllAttributes = @()
    Foreach( $Class in $AllClasses ) {
      $attributeTypes = 'MayContain','MustContain','systemMayContain','systemMustContain'
      $ClassInfo = Get-ADObject -SearchBase "$((Get-ADRootDSE).SchemaNamingContext)" -Filter {lDAPDisplayName -eq $Class} -properties $attributeTypes 
      ForEach ($attribute in $attributeTypes) {
        $AllAttributes += $ClassInfo.$attribute
      }
    }
    $AllAttributes = ( $AllAttributes | sort -Unique )
    $AttributesOfInterest = @()
    Foreach( $Attribute in $AllAttributes ) {
      $AttributeInfo = Get-ADObject -SearchBase "$((Get-ADRootDSE).SchemaNamingContext)" -Filter {lDAPDisplayName -eq $Attribute} -properties *
      #if ($AttributeInfo.lDAPDisplayName -eq 'msDS-UserPasswordExpiryTimeComputed'){break}
      $AttributeInfo | Add-Member -NotePropertyName SystemFlags-NotReplicated -NotePropertyValue (($AttributeInfo.systemFlags -band '1') -ne 0) -Force
      $AttributeInfo | Add-Member -NotePropertyName SystemFlags-globalCatalog -NotePropertyValue (($AttributeInfo.systemFlags -band '2') -ne 0) -Force
      $AttributeInfo | Add-Member -NotePropertyName SystemFlags-Constructed -NotePropertyValue (($AttributeInfo.systemFlags -band '4') -ne 0) -Force
      $AttributeInfo | Add-Member -NotePropertyName SystemFlags-System -NotePropertyValue (($AttributeInfo.systemFlags -band '16') -ne 0) -Force
      $AttributeInfo | Add-Member -NotePropertyName SystemFlags-deleteimmediately -NotePropertyValue (($AttributeInfo.systemFlags -band '33554432') -ne 0) -Force
      $AttributeInfo | Add-Member -NotePropertyName SystemFlags-NotMoveable -NotePropertyValue (($AttributeInfo.systemFlags -band '67108864') -ne 0) -Force
      $AttributeInfo | Add-Member -NotePropertyName SystemFlags-NotRenameable -NotePropertyValue (($AttributeInfo.systemFlags -band '134217728') -ne 0) -Force
      $attributeType=$null
      switch ($AttributeInfo.attributeSyntax){
        2.5.5.1{$IDNAttributeType='string';$ADattributeType='Distinguished Name'}
        2.5.5.2{$IDNAttributeType='string';$ADattributeType='Object ID'}
        2.5.5.3{$IDNAttributeType=$null;$ADattributeType='Case-sensitive string'}
        2.5.5.4{$IDNAttributeType='string';$ADattributeType='Case-insensitive string'}
        2.5.5.5{$IDNAttributeType='string';$ADattributeType='Print case string'}
        2.5.5.6{$IDNAttributeType='string';$ADattributeType='Numeric string'}
        2.5.5.7{$IDNAttributeType=$null;$ADattributeType='OR name-X400'}
        2.5.5.8{$IDNAttributeType='boolean';$ADattributeType='Boolean'}
        2.5.5.9{$IDNAttributeType='int';$ADattributeType='integer'}
        2.5.5.10{$IDNAttributeType='string';$ADattributeType='Octet string'}
        2.5.5.11{$IDNAttributeType='string';$ADattributeType='Time'}
        2.5.5.12{$IDNAttributeType='string';$ADattributeType='Unicode'}
        2.5.5.13{$IDNAttributeType=$null;$ADattributeType='Address'}
        2.5.5.14{$IDNAttributeType=$null;$ADattributeType='Distname-Address'}
        2.5.5.15{$IDNAttributeType=$null;$ADattributeType='NT Security Descriptor'}
        2.5.5.16{$IDNAttributeType='long';$ADattributeType='Large integer'}
        2.5.5.17{$IDNAttributeType='string';$ADattributeType='SID'}
      }
      $AttributeInfo | Add-Member -NotePropertyName ADAttributeType -NotePropertyValue $adattributeType -Force
      $AttributeInfo | Add-Member -NotePropertyName type -NotePropertyValue $IDNAttributeType -Force
      $AttributeInfo | Add-Member -NotePropertyName multi -NotePropertyValue (-not $AttributeInfo.isSingleValued) -Force
      #$AttributeInfo | Add-Member -NotePropertyName IDN -NotePropertyValue $false -Force
      #$AttributeInfo | Add-Member -NotePropertyName SystemFlags-NotDeleteable -NotePropertyValue (($AttributeInfo.systemFlags -band '2147483648') -ne 0) -Force
      $AttributesOfInterest+=$AttributeInfo
    }
    $AttributesOfInterest = $AttributesOfInterest | sort ldapDisplayName -Unique
    return $AttributesOfInterest | sort ldapDisplayName #| select ldapDisplayName,ADAttributeType,type,multi,attributeSyntax,isSingleValued,attributeId,linkId,Name,systemFlags,SystemFlags-NotReplicated,SystemFlags-globalCatalog,SystemFlags-Constructed,SystemFlags-System,SystemFlags-NotRenameable,whenCreated,adminDisplayName,adminDescription
}