2017-01-03 7 views
2

Я запрашиваю Active Directory из C++, используя интерфейс LDAP (используя iads.h). Я замечаю, что существует разница в атрибутах для пользователей.Есть ли полный список атрибутов Active Directory и сопоставление с LDAP?

При выполнении в Powershell

Get-ADUser sih -Properties * 

есть атрибут EmailAddress. При запросе AD из C++ атрибут EmailAddress не найден. Однако Mail найден, как с Powershell, так и с C++.

Есть ли какое-либо сопоставление или почему некоторые атрибуты присутствуют в Powershell, а не в интерфейсе C++ для объекта User?

Примечание: при использовании Active Directory Explorer (https://technet.microsoft.com/en-us/sysinternals/adexplorer.aspx) атрибут EmailAddress не отображается ни для пользователей. Кажется, что все атрибуты, показанные здесь, могут быть извлечены из C++.

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

ответ

4

Это два разных вопроса.

Для отображения между внутренними именами атрибутов и отображение имен LDAP: Это называется схема :-)

Получить все объекты с objectClass=attributeSchema и сравнить adminDisplayName и lDAPDisplayName значения атрибутов:

Get-ADObject -Filter 'objectClass -eq "attributeSchema"' -SearchBase 'CN=Schema,CN=Configuration,DC=forest,DC=tld' -Properties adminDisplayName,lDAPDisplayName |Select-Object adminDisplayName,lDAPDisplayName 

Для сопоставления между удобными именами свойств в модуле PowerShell ActiveDirectory (например, EmailAddress) и отображаемыми именами LDAP (lik e mail), они жестко закодированы как внутренние константы в сборке Microsoft.ActiveDirectory.Management.dll.

Вот как вы можете получить их с помощью немного отражения магии:

# Import the Active Directory module: 
Import-Module ActiveDirectory 

# Now, obtain a reference to the assembly itself: 
$ADAssembly = [Microsoft.ActiveDirectory.Management.ADEntity].Assembly 

# Now we'll need to retrieve the internal class that defines the constants: 
$LDAPAttributes = $ADAssembly.GetType('Microsoft.ActiveDirectory.Management.Commands.LdapAttributes') 

# Then use GetFields() to retrieve the internal constants 
$LDAPNameConstants = $LDAPAttributes.GetFields('Static,NonPublic') |Where-Object {$_.IsLiteral} 

# Finally build a hashtable with the Property Names -> LDAP Name mapping 
$LDAPPropertyMap = @{} 
$LDAPNameConstants |ForEach-Object { 
    $LDAPPropertyMap[$_.Name] = $_.GetRawConstantValue() 
} 

$LDAPPropertyMap теперь содержит ваши отображения

0

командлетов PowerShell AD сделать больше, чем просто возвращение оголенных атрибутов пользователя. Для того, чтобы информация об учетной записи проще в использовании, они создают дополнительные свойства, некоторые только с более «говорящим» названием (например mailEmailAddress), другие с исходными данными, преобразованных в более удобоваримый формат (например pwdLastSetPasswordLastSet, accountExpiresAccountExpirationDate) или для отображения определенных флагов (например, Enabled, который указывает, установлен ли флаг ACCOUNTDISABLE в атрибуте userAccountControl).