Distinguished Name:
Поиск объектов доменов Active Directory выполняется но иерархическому пути,
включающему метки имен доменов и каждого из контейнерных объектов. Полный
путь к объекту задается различающимся именем (distinguished name, DN), а имя самого
объекта — относительным различающимся именем (relative distinguished name, RDN).
Охватывая полный путь к объекту, включающий имя объекта и всех его родителей,
начиная с корня домена, различающимся имя уникально (указывает только на данный
объект) и однозначно (в каталоге нет другого объекта с данным именем)
идентифицирует объект в иерархии доменов и позволяет LDАР-клиенту
получить в каталоге сведения об этом объекте.
Relative Distinguished Name:
Относительное различающееся имя (relative distinguished name, RDN) — это
часть имени объекта, являющаяся атрибутом его самого и отличающая его от
других объектов па одном уровне иерархии имен. По умолчанию максимальная длина
относительного составного имени — 255 символов, но в схеме каталога могут
быть заданы дополнительные ограничения на атрибуты.
Например, длина атрибута cn, который часто используется в качестве
относительного составного имени, не может превышать 64 символа.
Относительные различающееся имена в Active Directory уникальны
среди потомков одного родителя, то есть в одном родительском
контейнере не могут существовать два объекта с одним RDN. Однако, два
объекта одного каталога могут иметь одинаковые относительные составные
имена и оставаться уникальным, находясь в разных родительских контейнерах.
Почти все символы могут быть использованы в Distinguished Names.
Некоторые зарезервированные символы должны быть экранированы с помощью
символа «\». В Active Directory требуется, чтобы следующие
символы были экранированы.Более подробно:
1) http://msdn.microsoft.com/en-us/library/aa366101(VS.85).aspx
2) http://www.rlmueller.net/CharactersEscaped.htm
По умолчанию в .Net по работе с Active Directory нет методов,которые
делают корректную проверку DN,RND и т.д. Поэтому воспользуемся проектом DNParser.
Сам проект написан на C# и предоставлен в виде исходных кодов.Проект совместим
с RFC 2253.
1) Скачиваем проект DNParser
http://www.codeproject.com/Articles/9788/An-RFC-2253-Compliant-Distinguished-Name-Parser
2) Разархивируем проект
3) Скомпилируем проект в виде dll библиотеки
cd $env:windir\Microsoft.NET\Framework\v2.0.50727 .\csc.exe /t:library "/out:C:\cpi.dll" "ПУТЬ:\DNParser_src\CPI.DirectoryServices\*.cs"
4) Загрузим dll в текущую сессию
$cpi = Add-Type -Path E:\cpi.dll -PassThru
5) Посмотрим какие классы содержит данная dll
PS > $cpi | ft fullname FullName -------- CPI.DirectoryServices.DN CPI.DirectoryServices.DN+ParserState CPI.DirectoryServices.EscapeChars CPI.DirectoryServices.RDN CPI.DirectoryServices.RDN+ParserState CPI.DirectoryServices.RDNList CPI.DirectoryServices.RDNComponent CPI.DirectoryServices.RDNComponent+RDNValueType CPI.DirectoryServices.RDNComponentList
Пример работы:
#Создать объект $dn = [CPI.DirectoryServices.DN]"CN=Kazun,OU=People,DC=example,DC=com" #Отобразить DN PS > "$dn" CN=Kazun,OU=People,DC=example,DC=com PS > $dn.ToString() CN=Kazun,OU=People,DC=example,DC=com PS > [string]$dn CN=Kazun,OU=People,DC=example,DC=com #Получить родительский объект PS > $dn.Parent.ToString() OU=People,DC=example,DC=com PS > $dn.Parent.Parent.ToString() DC=example,DC=com #Отобразить все индивидуальные RDN PS > $dn.Rdns Components ---------- {CN=Kazun} {OU=People} {DC=example} {DC=com} PS > $dn.Rdns | Foreach {$_.ToString()} CN=Kazun OU=People DC=example DC=com #Отобразить конкретный RDN PS > $dn.Rdns[1].ToString() OU=People #Создать объект,который содержит escape символы $dn = [CPI.DirectoryServices.DN]"CN=Pete Everett\2a\, esq.,OU=People,DC=example,DC=com" PS > $dn.ToString() CN=Pete Everett*\, esq.,OU=People,DC=example,DC=com #Отобразить DN без escape символов PS > $dn.ToString("None") CN=Pete Everett*, esq.,OU=People,DC=example,DC=com #Отобразим все перечисления PS > [enum]::GetNames([CPI.DirectoryServices.EscapeChars]) None ControlChars SpecialChars MultibyteChars #Создать объект с Multibyte Chars $dn = [CPI.DirectoryServices.DN]"CN=Антон Петрович,OU=People,DC=example,DC=com" #Отобразить как MultibyteChars PS > $dn.ToString("MultibyteChars") CN=\D0\90\D0\BD\D1\82\D0\BE\D0\BD \D0\9F\D0\B5\D1\82\D1\80\D0\BE\D0\B2\D0\B8\D1\87,OU=People,DC=example,DC=com #Ошибка при некорректном DN PS > [CPI.DirectoryServices.DN]"CN=Kazun<,OU=People,DC=example,DC=com" Cannot convert value "CN=Kazun<,OU=People,DC=example,DC=com" to type "CPI.DirectoryServices.DN". Error: "Invalid RDN: U nquoted special character '<' Parameter name: CN=Kazun<" At line:1 char:27 + [CPI.DirectoryServices.DN] <<<< "CN=Kazun<,OU=People,DC=example,DC=com" + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException PS > [CPI.DirectoryServices.DN]"CN=Kazun\<,OU=People,DC=example,DC=com" CharsToEscape RDNs ------------- ---- ControlChars, SpecialChars {CN=Kazun\<, OU=People, DC=example, PS > [CPI.DirectoryServices.DN]"CN=Kazun\3C,OU=People,DC=example,DC=com" CharsToEscape RDNs ------------- ---- ControlChars, SpecialChars {CN=Kazun\<, OU=People, DC=example,
Добавить комментарий