|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Python: Использование протокола LDAP в скриптах
Время создания: 29.07.2019 23:51
Текстовые метки: Python
Раздел: Разные закладки - Python - script-coding.com
Запись: xintrea/mytetra_db_adgaver_new/master/base/1514389244ssqesjmmav/text.html на raw.githubusercontent.com
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Использование протокола LDAP в скриптах Содержание:
Протокол LDAP (Lightweight Directory Access Protocol, упрощённый протокол для доступа к каталогу) служит для доступа к службам каталогов, в том числе Active Directory в Windows 2000/2003. Провайдер LDAP является одним из провайдеров ADSI (Active Directory Service Interface) . Все примеры сценариев в настоящей статье будут приводиться на языке Python . Служба каталогов Active Directory является LDAP-совместимой реализацией службы каталогов Microsoft для операционных систем семейства Windows и хранит информацию о сетевых ресурсах - пользователях, компьютерах, файлах, папках и принтерах, а также информацию безопасности, касающуюся этих ресурсов. Active Directory упрощает администрирование путём централизации управления. Домен - это логическая группа компьютеров и метод организации административной безопасности. Логическая структура Active Directory состоит из доменов, лесов и деревьев, а физическая структура состоит из серверов - контроллеров домена и сайтов (IP-подсетей). Active Directory использует модель репликации, когда копия каталога существует на каждом контроллере домена, что повышает отказоустойчивость (домен может содержать один или более контроллеров домена). Сайт (Site) Active Directory - это совокупность одной или нескольких IP-подсетей, объединенных высокоскоростными каналами связи. Сайт может содержать один или более доменов, а домен может быть размещен в нескольких сайтах. Сайты предназначены для управления репликацией Active Directory между сетями, соединёнными каналами связи с низкой пропускной способностью. Домены в Active Directory организованы в иерархические структуры - деревья. Ветви такого дерева называются поддоменами. Имя дочернего домена включает имя родительского, например: microsoft.com, msdn.microsoft.com, vb.msdn.microsoft.com и т.д. Лес представляет собой группу деревьев, связанных доверительными отношениями - контроллеры домена в одном домене доверяют пользователям из другого домена (дают возможность использовать свои ресурсы). Отношения доверия транзитивны, то есть если домен А доверяет домену Б, а домен Б доверяет домену В, то домен А также доверяет домену В. Все деревья в лесу используют общую схему и общий глобальный каталог (Global Catalog, GC). Доверительными отношениями связываются корневые домены деревьев леса. Схема (Schema) содержит формальное описание содержания и структуры хранилища Active Directory, включая все атрибуты, классы и свойства классов. Для каждого класса объектов схема определяет, какими атрибутами должен обладать экземпляр класса, какие дополнительные атрибуты он может иметь и какой класс объектов является предком текущего класса. При установке Active Directory создаётся стандартная схема, содержащая определения наиболее часто используемых объектов и их свойств, таких как пользователи, группы, компьютеры, принтеры и т.п. Схема Active Directory расширяема, т.е. вы можете определить новые типы объектов каталога и их атрибуты, в том числе и новые атрибуты для существующих объектов. Схема хранится вместе с данными Active Directory в глобальном каталоге и обновляется динамически (т.е. добавленные и изменённые атрибуты можно использовать практически сразу). Схема определяет структуру леса Active Directory, который может содержать несколько деревьев, которые, в свою очередь, могут содержать несколько иерархически структурированных доменов. В лесе Active Directory один из контроллеров объявляется мастером схемы (Schema Master) и отвечает за репликацию данных схемы на все контроллеры доменов. Cтруктурой леса и деревьев Active Directory является конфигурация (Configuration). Глобальный каталог (Global Catalog, GC) - это центральное хранилище информации об объектах в дереве доменов и лесе Active Directory. Глобальный каталог является физическим хранилищем части атрибутов всех объектов леса Active Directory. Процесс частичной репликации позволяет находить большинство сведений непосредственно в глобальном каталоге, без обращения к исходному домену. По умолчанию в глобальном каталоге хранятся атрибуты, наиболее часто используемые при поиске (например имя пользователя, его учетной записи и т.п.), а также сведения, необходимые для обнаружения объекта (полный LDAP-путь к соответствующему объекту каталога). Хранение только основных атрибутов объектов в глобальном каталоге позволяет уменьшить его размер, поэтому один сервер глобального каталога может обслуживать много контроллеров домена Windows. При установке первого контроллера домена в лесу Active Directory он становится сервером глобального каталога. При наличии нескольких контроллеров домена можно перенести глобальный каталог на другой сервер или настроить несколько серверов на его поддержку. В ADSI предусмотрен специальный провайдер "ADs", который возвращает ссылку на объект IADsNamespaces, который можно использовать для получения информации об установленных на компьютере провайдерах ADSI: import win32com.client adsi = win32com.client.GetObject("ADs:") print adsi.Class, "\n" for i in adsi: print i.Name Корневой объект пространства имён провайдера LDAP (объект IADsNamespace) может быть получен следующим образом: # -*- coding: cp1251 -*- import win32com.client # получение объекта текущего домена в локальной сети: adsi = win32com.client.GetObject("LDAP:") print adsi.Class, adsi.ADsPath, '\n' for i in adsi: print i.Class, i.ADsPath print i.Name, "\n" # получение объекта корневого домена в локальной сети: adsi = win32com.client.GetObject("GC:") print adsi.Class, adsi.ADsPath, '\n' for i in adsi: print i.Class, i.ADsPath print i.Name, "\n" # Примечание: в данном случае идёт обращение # к глобальному каталогу контроллера домена (Global Catalog, GC). LDAP имеет иерархическую модель данных. Вы можете исследовать структуру ADSI с помощью оснастки ADSI Edit для MMC из пакета Windows Support Tools (пакет доступен для скачивания на сайте Microsoft). Для идентификации объектов существует два вида имен:
Отличительное имя объекта содержит полный путь к этому объекту в иерархии. Относительное отличительное имя объекта — часть отличительного имени, являющаяся именем объекта. Кроме того, в каталоге существуют организационные блоки (организационные единицы или подразделения) Organization Units - OU, с помощью которых администратор каталога может создавать иерархию логических групп записей. Организационное подразделение - это контейнерный объект, предназначенный для группировки других объектов в логические административные группы в рамках домена. Организационные подразделения могут содержать такие объекты, как учетные записи пользователей, группы, компьютеры, принтеры и т.п. Иерархия организационных единиц домена не зависит от других доменов - каждый домен может поддерживать свою собственную иерархию. Часто групповые политики применяются именно к подразделениям (групповые политики сами являются объектами Active Directory). Пользователь или группа имеет "дружественное" имя – основное имя пользователя (UPN – User Principal Name). Основное имя пользователя составляется из "сокращённого" имени пользователя и имени домена DNS, где находится объект, определяющий пользователя. UPN известны как адреса электронной почты. Например, пользователь James Smith в дереве microsoft.com может иметь UPN вида "JamesS@Microsoft.com". Каждый объект каталога обладает глобальным уникальным идентификатором (Globally Unique Identifier, GUID) - 128-битным числом, генерируемым при создании объекта. GUID не изменяется в течение всего срока жизни объекта, даже при его переименовании или перемещении в другой домен. Поэтому приложения могут хранить GUID объекта и всегда однозначно находить его в каталоге. Аббревиатуры, используемые в строках подключения (в так называемых URL LDAP):
Для связывания (определения) объекта с помощью технологии ADSI можно использовать два способа:
moniker = "LDAP://ServerName/DC=ru/DC=имяДомена/OU=название подразделения/CN=имя пользователя" adsi = win32com.client.GetObject(moniker) moniker = "LDAP://ServerName:TCP_Port/CN=имя пользователя, OU=название подразделения, DC=имяДомена, DC=ru" adsi = win32com.client.GetObject(moniker) Как видно из примеров, строки связывания в разных формах отличаются в основном направлением переходов по иерархии (вверх или вниз по иерархии). Примечание: порт можно указать только во второй форме, порт по умолчанию - 389. Имя сервера (контроллера домена) и номер порта можно не указывать. В этом случае программные модули ADSI автоматически найдут контроллер домена для указанного вами домена и произведут к нему подключение с параметрами по умолчанию. При этом используются те же механизмы, что и при входе клиентского компьютера в сеть (такой вариант называется привязкой без сервера - serverless binding). Например: adsi = win32com.client.GetObject("LDAP://DC=ru/DC=имяДомена/OU=название подразделения/CN=имя пользователя") adsi = win32com.client.GetObject("LDAP://CN=имя пользователя, OU=название подразделения, DC=имяДомена, DC=ru") Для просмотра атрибутов записи каталога можно связать запись, а затем использовать метод Get. Если сервер LDAP разрешает анонимный доступ к каталогу, можно использовать следующий подход: adsi = win32com.client.GetObject("LDAP://DC=ru/DC=имяДомена/OU=название подразделения") for entry in adsi: print entry.Class, entry.Get('objectClass') Если сервер LDAP не разрешает анонимный доступ к каталогу, можно использовать следующий подход: dso = win32com.client.GetObject("LDAP:") adsi = dso.OpenDSObject("LDAP://DC=ru/DC=имяДомена/OU=название подразделения", "имя_пользователя", "пароль", 0) for entry in adsi: print entry.Class, entry.Get('objectClass') Для просмотра архитектуры существующего каталога LDAP используйте скрипт, приведённый чуть ниже. Изменяя отправную точку (startingPoint), можно просмотреть различные части каталога: startingPoint = "/OU=название подразделения" adsi = win32com.client.GetObject("LDAP://DC=ru/DC=имяДомена" + startingPoint) for entry in adsi: print entry.Name, entry.Class Рекурсивный просмотр архитектуры существующего каталога LDAP, вглубь от указанной отправной точки (startingPoint): # -*- coding: cp1251 -*- import win32com.client def structLDAP(startingPoint, level): adsi = win32com.client.GetObject("LDAP://" + startingPoint) for entry in adsi: print ' ' * level + entry.Name + ' (' + entry.Class + ')' # для перенаправления в файл: # print (' ' * level + entry.Name + ' (' + entry.Class + ')').encode('cp1251') structLDAP(startingPoint + '/' + entry.Name.replace('/', '\\/'), level + 1) startingPoint = "DC=ru/DC=имяДомена" structLDAP(startingPoint, 0) Специальный объект RootDSE (Root Directory Service Entry) автоматически вернёт имя того домена, к которому принадлежит данный компьютер: # получение имени домена, к которому принадлежит данный компьютер: adsi = win32com.client.GetObject("LDAP://RootDSE") domain = adsi.Get("defaultNamingContext") adsi = win32com.client.GetObject("LDAP://" + domain) print adsi.Name, adsi.Class Объект RootDSE предоставляет различную информацию о возможностях LDAP-сервера: # -*- coding: cp1251 -*- import win32com.client adsi = win32com.client.GetObject("LDAP://RootDSE") print adsi.Get("configurationNamingContext") # отличительное имя контейнера конфигурации print adsi.Get("currentTime") # текущее время на этом сервере каталога print adsi.Get("defaultNamingContext") # отличительное имя домена, членом которого является этот сервер каталога print adsi.Get("dnsHostName") # DNS адрес этого сервера каталога print adsi.Get("dsServiceName") # отличительное имя объекта NTDS параметров настройки этого сервера каталога # наивысший USN, используемый на этом сервере каталога (это свойство используется репликацией каталога) print adsi.Get("highestCommittedUSN") print adsi.Get("LDAPServiceName") # Service Principal Name (SPN) этого сервера каталога for namingContext in adsi.Get("namingContexts"): # отличительные имена всех контекстов, имеющихся на этом сервере каталога print namingContext # отличительное имя корневого домена в лесу, который содержит домен, членом которого является этот сервер каталога print adsi.Get("rootDomainNamingContext") print adsi.Get("schemaNamingContext") # отличительное имя контейнера схемы print adsi.Get("serverName") # отличительное имя объекта сервера этого сервера каталога в контейнере конфигурации print adsi.Get("subschemaSubentry") # отличительное имя объекта subschema (LDAP 3.0.) # объектные идентификаторы (OID), которые идентифицирует поддерживаемые возможности сервера print adsi.Get("supportedCapabilities") for supportedControl in adsi.Get("supportedControl"): # расширенные OID print supportedControl for supportedLDAPPolice in adsi.Get("supportedLDAPPolicies"): # поддерживаемые LDAP политики управления print supportedLDAPPolice for supportedLDAPVersion in adsi.Get("supportedLDAPVersion"): # версии LDAP, поддерживаемые этим сервером каталога print supportedLDAPVersion for supportedSASLMechanism in adsi.Get("supportedSASLMechanisms"): # поддерживаемые механизмы безопасности print supportedSASLMechanism В ADSI реализовано несколько технологий поиска. Основная технология связана с применением для этой цели возможностей объектной модели ADO. При этом подключение к службе каталогов производится при помощи объекта ADODB.Connection, формулировка текста запроса и его выполнение — при помощи объекта ADODB.Command, а результаты запроса возвращаются в виде обычного объекта ADODB.Recordset. Объектная модель ADO полностью поддерживает OLE Automation, поэтому эту технологию можно использовать из любых языков программирования, которые поддерживают OLE Automation, в том числе VBA, VBScript, JScript и т.п. Остальные технологии поиска ADSI могут использоваться в основном только из программ на языке C++, и здесь рассматриваться не будут. Запросы к службам каталогов в ADSI могут выполняться на двух диалектах - диалекте LDAP (фильтры запроса определяются в соответствии с правилами синтаксиса запросов LDAP по RFC 2254) и диалекте SQL (фильтры запроса определяются в соответствии со стандартом ANSI SQL с учетом особенностей работы со службами каталогов). Пример запроса на диалекте LDAP: <LDAP://DC=domainName,DC=ru>;(objectClass=*);AdsPath, cn;subTree Первая часть запроса - базовое отличительное имя (base distinguished name) - использует синтаксис вида <LDAP://отличительное_имя>. Отличительное имя должно принадлежать контейнерному объекту, в котором производится поиск (обычно домену, сайту или организационному подразделению). Вторая часть запроса (в примере - (objectClass=*)) является поисковым фильтром LDAP. В примере фильтр означает "искать любые объекты". Третья часть запроса (в примере - AdsPath, cn) является набором атрибутов (столбцов), которые будут возвращаться в ходе выполнения запроса. Если необходимо вернуть несколько атрибутов для объекта, наименования атрибутов должны быть разделены запятыми. Четвертая часть запроса (в примере - subTree) задаёт диапазон поиска. Возможные значения:
Для поисковых фильтров LDAP предусмотрено два варианта синтаксиса. Первый вариант использует только один фильтр: (<имя_атрибута><оператор><значение>) Второй вариант использует несколько фильтров, объединённых логическим оператором: (<оператор><фильтр1><фильтр2>...<фильтрN>) Операторы, используемые в фильтрах поиска LDAP:
Примеры:
Для проверки наличия определенных флагов в атрибутах объектов применяется синтаксис с использованием так называемых объектных идентификаторов (object identifiers, OIDs). LDAP поддерживает два OID:
Чаще всего OID используются при проверке флагов типов групп. Например, если необходимо найти все группы безопасности, но не группы распределения, синтаксис может быть таким: (&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)) Здесь число 2147483648 - это десятичное представление числа 0x80000000, которое соответствует флагу ADS_GROUP_TYPE_SECURITY_ENABLED в атрибуте groupType. Некоторые символы в поисковых фильтрах являются зарезервированными и в значениях атрибутов должны заменяться на специальные последовательности:
Пример скрипта, разыскивающего все объекты в домене, в имени которых используется прямой слеш: # -*- coding: cp1251 -*- import win32com.client conn = win32com.client.Dispatch("ADODB.Connection") conn.Provider = "ADSDSOObject" conn.Open("ADs Provider") query = "<LDAP://DC=имяДомена,DC=ru>;(Name=*\\2f*);ADsPath;subTree" rs = conn.Execute(query)[0] while not rs.EOF: obj = win32com.client.GetObject(rs.Fields(0).Value) print obj.Class, obj.Name rs.MoveNext() conn.Close() Пример запроса на диалекте языка SQL к службе каталогов: SELECT ADsPath, cn FROM 'LDAP://OU=имяПодразделения,DC=имяДомена,DC=ru' WHERE objectCategory='person' AND objectClass='user' AND sn = 'H*' ORDER BY sn В разделе SELECT перечисляются атрибуты объектов Active Directory, которые будут возвращаться запросом. В результатах запроса они будут представлены полями объекта ADODB.Recordset. Несколько имен атрибутов должны разделяться запятыми. Вместо списка атрибутов можно использовать ключевое слово ALL или звездочку (*). Эти значения определяют, что должны вернуться все атрибуты. В разделе FROM указывается отличительное имя базового объекта поиска (то есть того контейнерного объекта, начиная с которого будет производиться поиск). Этот путь обязательно должен быть заключен в одинарные кавычки. В разделе WHERE указываются условия, поисковые фильтры, которые используются для выбора объектов при поиске. Синтаксис соответствует стандартам языка SQL. В разделе ORDER BY указывается атрибут объекта службы каталогов, по значению которого будет производиться сортировка возвращаемых результатов. Active Directory поддерживает сортировку только по одному атрибуту. Однако можно указать порядок сортировки при помощи ключевых слов ASC и DESC (по умолчанию используется ASC). Оператор JOIN в запросах к Active Directory не поддерживается (если запрос производится из SQL Server, а Active Directory используется в качестве внешнего источника данных, то можно производить JOIN между таблицами SQL Server и информацией, возвращаемой Active Directory). Пример скрипта, разыскивающего все объекты в домене, в имени которых используется прямой слеш: # -*- coding: cp1251 -*- import win32com.client conn = win32com.client.Dispatch("ADODB.Connection") conn.Provider = "ADSDSOObject" conn.Open("Active Directory Provider") query = "SELECT ADsPath FROM 'LDAP://DC=имяДомена,DC=ru' WHERE Name='*/*'" rs = conn.Execute(query)[0] while not rs.EOF: obj = win32com.client.GetObject(rs.Fields(0).Value) print obj.Class, obj.Name rs.MoveNext() conn.Close() В случае необходимости подключения под конкретной учётной записью следует использовать строку подключения, аналогично следующему примеру: conn = win32com.client.Dispatch("ADODB.Connection") conn.Open("Provider=ADSDSOObject;User Id=myDomain\\myUsername;Password=myPassword;") Интерфейс IADs определяет набор базовых свойств и методов для любого объекта ADSI:
Интерфейс IADsContainer обеспечивает набор свойств и методов для контейнерных объектов Active Directory (в основном - объектов организационных подразделений и доменов):
Интерфейс IADsPropertyList предназначен для работы со свойствами объектов Active Directory. В принципе, работать со свойствами можно и без него (например, при помощи метода Put), однако средствами IADsPropertyList можно получить информацию о всех свойствах конкретного объекта, их типе и т.п. Использовать свойства и методы этого интерфейса можно только после того, как для соответствующего объекта Active Directory будет вызван метод IADs.GetInfo() или GetInfoEx(), или Get(), или GetEx(). Пример получения информации об имени, типе и значениях всех свойств объекта: # -*- coding: cp1251 -*- import win32com.client GetObject = win32com.client.GetObject propList = GetObject("LDAP://CN=Фамилия Имя,OU=Подразделение,DC=домен,DC=ru") propList.GetInfo() v = propList.Next() ADSTYPE_UNKNOWN = 26 while 1: print v.Name, v.ADsType, v.Values[0].GetObjectProperty(ADSTYPE_UNKNOWN) try: v = propList.Next() except: break Свойства и методы интерфейса IADsPropertyList:
Интерфейс IADsPropertyEntry предназначен для работы со значением (или значениями) свойства объекта Active Directory. Он может использоваться как для получения информации о значении свойства, так и для назначения свойству нового значения или значений. Свойства и методы:
Интерфейсы IADsPropertyValue и IADsPropertyValue2 используются непосредственно для работы со значениями свойств. Каждому объекту IADsPropertyValue соответствует конкретное значение свойства. Массив значений (то есть массив объектов IADsPropertyValue) передаётся при помощи свойства Values объекта IADsPropertyEntry. Свойства и методы интерфейса IADsPropertyValue:
Методы интерфейса IADsPropertyValue2:
Значения перечисления ADSTYPEENUM:
В интерфейсе IADsDomain реализованы свойства, обращаться к которым можно только через провайдер WinNT. Пример работы со свойствами объекта домена приведён в статье Введение в Active Directory Service Interface (ADSI): провайдер WinNT . Впрочем, можно работать через значения атрибутов и интерфейсы IADsPropertyList, IADsPropertyEntry, IADsPropertyValue. Объект организационного подразделения реализует стандартные интерфейсы IADs, IADsContainer, IADsPropertyList, а также специализированный интерфейс IADsOU. Свойства IADsOU (например, BusinessCategory, Description, FaxNumber, LocalityName, TelephoneNumber) достаточно очевидны. Объект группы поддерживает стандартные интерфейсы IADs и IADsPropertyList, а также специализированный интерфейс IADsGroup. Многие важные свойства групп (например, тип группы) через данный интерфейс недоступны и работать с ними нужно средствами интерфейсов IADsPropertyList, IADsPropertyEntry, IADsPropertyValue. Для атрибута groupType (тип группы) используются значения:
Свойства и методы интерфейса IADsGroup:
Объект пользователя в ADSI поддерживает свойства и методы стандартных интерфейсов IADs и IADsPropertyList. Также для него реализован специализированный интерфейс IADsUser, в который сведены свойства для доступа к наиболее часто используемым атрибутам. Для объекта пользователя в Active Directory предусмотрено огромное количество атрибутов (несколько сотен), и для многих из них доступ возможен только через интерфейсы IADsPropertyList, IADsPropertyEntry, IADsPropertyValue (но не через IADsUser). Большая часть свойств (Department, Division, EmailAddress, FaxNumber, FirstName, FullName и т.п.) очевидна и комментариев не требует. Некоторые не самые очевидные свойства и методы:
Просмотр атрибутов объекта: # -*- coding: cp1251 -*- import win32com.client GetObject = win32com.client.GetObject obj = GetObject("LDAP://DC=ru/DC=домен/OU=подразделение/CN=Фамилия Имя") print obj.Get("sAMAccountName"), obj.Get("cn"), obj.Get("sn") Модификация атрибутов объекта: # -*- coding: cp1251 -*- import win32com.client dso = win32com.client.GetObject("LDAP:") obj = dso.OpenDSObject("LDAP://DC=ru/DC=домен/OU=подразделение/CN=Фамилия Имя", "домен\\пользователь", "пароль", 0) obj.Put("sn", "НовоеИмя") obj.SetInfo() Отображение всех объектов пользователей, групп или компьютеров указанного контейнера: # -*- coding: cp1251 -*- import win32com.client GetObject = win32com.client.GetObject obj = GetObject("LDAP://DC=ru/DC=домен/OU=подразделение") obj.Filter = ["User"] # obj.Filter = ["Group"] # obj.Filter = ["Computer"] for o in obj: print o.ADsPath Просмотр всех обязательных свойств класса объекта (важно для создания объектов): # -*- coding: cp1251 -*- import win32com.client GetObject = win32com.client.GetObject obj = GetObject("LDAP://DC=ru/DC=домен/OU=подразделение/CN=Фамилия Имя") objClass = GetObject(obj.Schema) for prop in objClass.MandatoryProperties: print prop Создание объекта: # -*- coding: cp1251 -*- import win32com.client dso = win32com.client.GetObject("LDAP:") obj = dso.OpenDSObject("LDAP://DC=ru/DC=домен/OU=подразделение", "домен\\пользователь", "пароль", 0) objClass = "user" objRelativeName = "CN=_TestAdmin" Prop1Name = "sAMAccountName" Prop1Value = "TestAdmin" # здесь могут быть заданы значения других обязательных свойств newObject = obj.Create(objClass, objRelativeName) newObject.Put(Prop1Name, Prop1Value) # здесь могут быть присвоены другие обязательные свойства newObject.SetInfo() Переименование объекта: # -*- coding: cp1251 -*- import win32com.client dso = win32com.client.GetObject("LDAP:") obj = dso.OpenDSObject("LDAP://DC=ru/DC=домен/OU=подразделение", "домен\\пользователь", "пароль", 0) obj.MoveHere("LDAP://DC=ru/DC=домен/OU=подразделение/CN=_TestAdmin", "CN=_CoolAdmin") Перемещение объекта в другой контейнер: # -*- coding: cp1251 -*- import win32com.client dso = win32com.client.GetObject("LDAP:") obj = dso.OpenDSObject("LDAP://DC=ru/DC=домен/OU=подразделениеКуда", "домен\\пользователь", "пароль", 0) obj.MoveHere("LDAP://DC=ru/DC=домен/OU=подразделениеОткуда/CN=_CoolAdmin", "CN=_CoolAdmin") Удаление объекта: # -*- coding: cp1251 -*- import win32com.client dso = win32com.client.GetObject("LDAP:") obj = dso.OpenDSObject("LDAP://DC=ru/DC=домен/OU=подразделение", "домен\\пользователь", "пароль", 0) objClass = "user" objRelativeName = "CN=_CoolAdmin" obj.Delete(objClass, objRelativeName) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Так же в этом разделе:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|