InetOrgOrg-Person
Benutzer im Active Directory werden normalerweise als Objekt vom Typ "user" angelegt. Im LDAP-Standard wurde aber Auch ein Object "InetOrgPerson" definiert, welches von verschiedenen Firmen auch immer wieder genutzt wird. Für eine Anmeldung auf einem Windows Client macht es auch keinen großen Unterschied aber woanders schon.
Empfehlung: Bleiben Sie beim Standard "User" und vermeiden Sie "InetOrgPerson"
InetOrg-Person vs User
Ich habe einfach mal zwei Benutzer der unterschiedlichen Typen mit minimalen Stammdaten angelegt und mit LDIFDE exportiert:
dn |
User | inetorgPerson | Kontakt | Computer |
---|---|---|---|---|
changetype |
add |
add |
add |
add |
objectClass |
Top, person, organizationalPerson, user |
Top |
Top |
Top |
cn |
User |
inetorgperson |
contact |
computer |
givenName |
User |
inetorgperson |
|
|
distinguishedName |
CN=User, OU=Test, DC=msxfaq, DC=de |
CN=inetorgperson, OU=Test, DC=msxfaq, DC=de |
CN=contact, OU=Test, DC=msxfaq, DC=de |
CN=computer, OU=Test, DC=msxfaq, DC=de |
instanceType |
4 |
4 |
4 |
4 |
whenCreated |
20200206181536.0Z |
20200206181559.0Z |
20200206181600.0Z |
20200206181601.0Z |
whenChanged |
20200206181536.0Z |
20200206181559.0Z |
20200206181600.0Z |
20200206181601.0Z |
displayName |
user |
inetorgperson |
contact |
computer |
uSNCreated |
27364358 |
27364387 |
27365198 |
27365204 |
uSNChanged |
27364364 |
27364393 |
27365198 |
27365208 |
name |
User |
inetOrgPerson |
Contact |
computer |
objectGUID |
xxx== |
xxx== |
xxx== |
xxx== |
userAccountControl |
512 |
512 |
|
4128 |
badPwdCount |
0 |
0 |
|
0 |
codePage |
0 |
0 |
|
0 |
countryCode |
0 |
0 |
|
0 |
badPasswordTime |
0 |
0 |
|
0 |
lastLogoff |
0 |
0 |
|
0 |
lastLogon |
0 |
0 |
|
0 |
pwdLastSet |
0 |
0 |
|
132254879477990424 |
primaryGroupID |
513 |
513 |
|
515 |
objectSid |
xxx/OUgETzwAAA== |
xxx/OUgEUDwAAA== |
|
xxx/OUgEUTwAAA== |
accountExpires |
9223372036854775807 |
9223372036854775807 |
|
9223372036854775807 |
logonCount |
0 |
0 |
|
0 |
sAMAccountName |
user |
inetorgperson |
|
COMPUTER$ |
sAMAccountType |
805306368 |
805306368 |
|
805306369 |
userPrincipalName |
user@msxfaq.net |
inetorgperson@msxfaq.net |
|
|
objectCategory |
CN=Person, CN=Schema, CN=Configuration, DC=msxfaq, DC=de |
CN=Person, CN=Schema, CN=Configuration, DC=msxfaq, DC=de |
CN=Person, CN=Schema, CN=Configuration, DC=msxfaq, DC=de |
CN=Computer, CN=Schema, CN=Configuration, DC=msxfaq, DC=de |
dSCorePropagationData |
16010101000000.0Z |
16010101000000.0Z |
16010101000000.0Z |
16010101000000.0Z |
ldifde -f user.txt -d "CN=user, CN=Schema, CN=Configuration, DC=msxfaq, DC=de" ldifde -f inetorg.txt -d "CN=inetOrgPerson, CN=Schema, CN=Configuration, DC=msxfaq, DC=de"
Interessant ist hier zwar die Felder "MayContain", "systemMayContain" und "systemAuxiliaryClass", welches weitere Subklassen der Properties enthält aber eine genauere Betrachtung kann ich mir ersparen, wenn Sie das Feld "SubClassOf" anschauen.
Feld | User | inetorgPerson |
---|---|---|
subClassOf |
organizationalPerson |
user |
mayContain |
msRTCSIP-UserRoutingGroupId, msRTCSIP-OwnerUrn, msRTCSIP-ApplicationOptions, msRTCSIP-GroupingID, msRTCSIP-AcpInfo, msRTCSIP-PrivateLine, msRTCSIP-DeploymentLocator, msRTCSIP-TargetUserPolicies, msRTCSIP-UserPolicies, msRTCSIP-TenantId, msSFU30NisDomain, msSFU30Name, msDS-SourceObjectDN, msRTCSIP-UserLocationProfile, msRTCSIP-UserPolicy, msRTCSIP-OptionFlags, msRTCSIP-Line, msRTCSIP-LineServer, msRTCSIP-ArchivingEnabled, msRTCSIP-PrimaryUserAddress, msRTCSIP-UserEnabled, msRTCSIP-TargetHomeServer, msRTCSIP-OriginatorSid, msRTCSIP-PrimaryHomeServer, msRTCSIP-UserExtension, msRTCSIP-FederationEnabled, msRTCSIP-InternetAccessEnabled, audio, carLicense, departmentNumber, displayName, employeeNumber, employeeType, givenName, homePostalAddress, jpegPhoto, labeledURI, photo, preferredLanguage, roomNumber, secretary, uid, userPKCS12, userSMIMECertificate, x500uniqueIdentifier, msExchOriginatingForest, msExchIMAPOWAURLPrefixOverride, kMServer, msExchConferenceMailboxBL, msExchResourceProperties, msExchResourceGUID, msExchControllingZone, msExchQueryBaseDN |
audio, businessCategory, carLicense, departmentNumber, displayName, employeeNumber, employeeType, givenName, homePhone, homePostalAddress, initials, jpegPhoto, labeledURI, mail, manager, mobile, o, pager, photo, preferredLanguage, roomNumber, secretary, uid, userCertificate, userPKCS12, userSMIMECertificate, x500uniqueIdentifier |
systemMayContain |
msDS-KeyPrincipalBL, msDS-KeyCredentialLink, msDS-PrimaryComputer, msDS-SyncServerUrl, msDS-AssignedAuthNPolicy, msDS-AssignedAuthNPolicySilo, msDS-AuthNPolicySiloMembersBL, msPKI-CredentialRoamingTokens, msTSPrimaryDesktop, msTSSecondaryDesktops, msDS-ResultantPSO, msTSLSProperty02, msTSLSProperty01, msTSManagingLS4, msTSLicenseVersion4, msTSExpireDate4, msTSManagingLS3, msTSLicenseVersion3, msTSExpireDate3, msTSManagingLS2, msTSLicenseVersion2, msTSExpireDate2, msDS-AuthenticatedAtDC, msDS-UserPasswordExpiryTimeComputed, msTSManagingLS, msTSLicenseVersion, msTSExpireDate, msTSProperty02, msTSProperty01, msTSInitialProgram, msTSWorkDirectory, msTSDefaultToMainPrinter, msTSConnectPrinterDrives, msTSConnectClientDrives, msTSBrokenConnectionAction, msTSReconnectionAction, msTSMaxIdleTime, msTSMaxConnectionTime, msTSMaxDisconnectionTime, msTSRemoteControl, msTSAllowLogon, msTSHomeDrive, msTSHomeDirectory, msTSProfilePath, msDS-FailedInteractiveLogonCountAtLastSuccessfulLogon, msDS-FailedInteractiveLogonCount, msDS-LastFailedInteractiveLogonTime, msDS-LastSuccessfulInteractiveLogonTime, msRADIUS-SavedFramedIpv6Route, msRADIUS-FramedIpv6Route, msRADIUS-SavedFramedIpv6Prefix, msRADIUS-FramedIpv6Prefix, msRADIUS-SavedFramedInterfaceId, msRADIUS-FramedInterfaceId, msPKIAccountCredentials, msPKIDPAPIMasterKeys, msPKIRoamingTimeStamp, msDS-SupportedEncryptionTypes, msDS-SecondaryKrbTgtNumber, msDRM-IdentityCertificate, msIIS-FTPDir, msIIS-FTPRoot, pager, mobile, homePhone, manager, mail, initials, businessCategory, o, lastLogonTimestamp, msDS-User-Account-Control-Computed, msCOM-UserPartitionSetLink, msDS-Site-Affinity, msDS-Cached-Membership-Time-Stamp, msDS-Cached-Membership, userCertificate, userWorkstations, userSharedFolderOther, userSharedFolder, userPrincipalName, userParameters, userAccountControl, unicodePwd, terminalServer, servicePrincipalName, scriptPath, pwdLastSet, profilePath, primaryGroupID, preferredOU, otherLoginWorkstations, operatorCount, ntPwdHistory, networkAddress, msRASSavedFramedRoute, msRASSavedFramedIPAddress, msRASSavedCallbackNumber, msRADIUSServiceType, msRADIUSFramedRoute, msRADIUSFramedIPAddress, msRADIUSCallbackNumber, msNPSavedCallingStationID, msNPCallingStationID, msNPAllowDialin, mSMQSignCertificatesMig, mSMQSignCertificates, mSMQDigestsMig, mSMQDigests, mS-DS-CreatorSID, maxStorage, logonWorkstation, logonHours, logonCount, lockoutTime, localeID, lmPwdHistory, lastLogon, lastLogoff, homeDrive, homeDirectory, groupsToIgnore, groupPriority, groupMembershipSAM, dynamicLDAPServer, desktopProfile, defaultClassStore, dBCSPwd, controlAccessRights, codePage, badPwdCount, badPasswordTime, adminCount, aCSPolicyName, accountExpires |
|
systemAuxiliaryClass |
msDS-CloudExtensions, securityPrincipal, mailRecipient |
|
Das Objekt "inetOrgPerson" ist eine Unterklasse von "user" und bekommt damit alle anderen Eigenschaften vererbt. Dass iNetOrgPerson zusätzlich noch weitere Eigenschaften über "MayContain" bekommt, ist hier nicht weiter relevant, da dies Felder auch beim "User" eingetragen sind. Insofern frage ich mich, was damals Microsoft sich gedacht hat, diese doppelte Zuweisung bei InetorgPerson zu machen.
Wechsel des Objekts
Wenn Sie bislang mit InetOrgPerson gearbeitet haben und nun doch wieder mit "User" arbeiten wollen, dann können Sie die Objekte sehr einfach umstellen
Set-ADUser username -Add @{objectClass='inetOrgPerson'}
Wenn Sie aus einem inetOrgPerson wieder ein "User" machen wollen, entfernen Sie einfach den Eintrag in der "objectClass"
Set-ADUser username -Remove @{objectClass='inetOrgPerson'}
Da stellt sich dann schon die Frage, warum es zwei fast identische Objekte gibt und wo es knirschen könnte.
Die nun folgende Auflistung sind Probleme, die ich in meinem Tätigkeitsumfeld selbst bemerkt habe. Sie ist nicht vollständig und wer etwas beitragen möchte, kann mich gerne anschreiben
LDAP-Suche
Ich kenne viele Programme, die z.B. nach "Benutzer" suchen. Das kann man mit einem passenden LDAP-Filter sehr einfach regeln, z.B.
(objectclass=user)
So findet der Filter natürlich beide objektarten, denn auch die inetOrgPerson hat ja die Objekt-Klasse "user". In der Antwort liefert LDAP aber dann ein Array für diese Feld mit und wenn eine Software nun in dem Feld einfach den letzten Eintrag ausliest, eil der das Objekt am "genauesten" spezifiziert. Es gibt ja leider kein eigenes Feld, welches den genauen Objekt-Type angibt, so dass ein Entwickler eben diese Aufzählung parsen muss. Nun haben sie aber oben schon gesehen, dass auch ein "Computer" bei einer Suche nach "User" zurückgegeben wird. Natürlich könnte ein Entwickler nun auch noch das Feld "sAMAccountType" mit auswerten, um nur Anmeldekonten zu finden.
Aber nicht alle Entwickler stecken so tief in den Details eines Active Directory und das Feld "sAMAccountType" gibt es auch nicht in einem Notes LDAP-Server oder anderen LDAP-Quellen. Warum daher nicht einfach nachschauen, ob das letzte Elemente in "objectClass" den Inhalt "user" hat.
In den meisten Fällen können Sie sehr gut dann die Computer aus einer Auflistung ausschließen. Dummerweise finden Sie dann auch keine inetOrgUser mehr.
3rd Party Schema-Erweiterungen
Die meisten Hersteller verzichten mittlerweile auf eigene Schema-Erweiterungen des Active Directory und behelfen sich mit bestehenden Feldern. Sehr gerne werden dazu die Exchange Felder genutzt. Wer aber eine Schema-Erweiterung durchführt, muss diese Felder ja auch an die Objekte anbinden.
Hier sollte das Risiko einer Fehlkonfiguration allerdings nicht vorhanden sein, denn eine Erweiterung der Schema-Klasse "user" wird auch auf "inetOrgPerson" wirken, welche ja von "user" abgeleitet ist.
AD Berechtigungen
Aber an anderer Stelle kann es noch zu Problemen kommen. Selbst Microsoft Exchange ist nicht davor gefeit, in diese Falle zu tappen. Neben einer reinen Schema-Erweiterung kann eine Software auch die "Default Berechtigungen" auf Objekte in der Domäne anpacken. Die dort gepflegten ACLs werden sehr gerne bei der Installation von Active Directory integrierten Programmen angepasst. Hier ist inetOrgPerson nicht von User abgeleitet. So hat Exchange vergessen, bei einer Erweiterung der Berechtigungen diese auch auf inetOrgPerson-Objekte zu vergeben und dies auch dokumentiert.
Microsoft rechnet anscheinend nicht damit, dass eine Firma tatsächlich mit "inetOrgPerson" arbeitet. In dem fall bedeutet dies, dass Exchange dann z.B. keine InetOrgPerson-Objekte hinsichtlich von Postfacheigenschaften verwalten konnte. Mittlerweile ist der Bug natürlich korrigiert worden und im Active Directory sehen sie nun die auf beide Objekte vergebenen Berechtigungen:
Das bedeutet aber nicht, dass nicht auch andere Anwendungen in diese Falle tappen.
Office 365 ADSync Kennworte
Wer auch Dienst aus der Office 365 Cloud nutzen, wird sehr schnell einen Verzeichnisabgleich (Siehe Office 365 Identity Management) mit ADSync installieren. In den Synchronisationsregeln ist auch gut zu sehen, dass sowohl "User" als auch "InetorgPerson" von ADSync als "person" angesehen und repliziert werden:
Aber das Bild zeigt nicht alles. Über die Funktion Password Hash Sync (PHS) kann ADSync auch die Anmeldung unterstützen, indem ihre lokalen Kennworte als Hash-Werte auch in die Cloud übertragen werden. Dies funktioniert aber nur für Objekte vom Typ "User"
Password sync is only supported for the object type user in
Active Directory. It is not supported for the iNetOrgPerson object type
Quelle:
https://docs.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-password-hash-synchronization
Sie müssten daher die Konfiguration von ADSync sehr umfangreich anpassen und wie das hinsichtlich Support und Beibehaltung bei Updates aussieht, steht auf einem anderen Blatt. Sie sollten daher mit Office 365 immer auf "User" setzen.