4

Прежде всего, мне нужно было получить список пользователей, являющихся членами определенной группы, в SQL Server. Мне удалось найти что-то в сети, которая работает отлично. Решение таково:Active Directory - получение пользователей и групп, входящих в определенную группу

CREATE PROCEDURE [dbo].[NES_GetADGroupMembers] 
    (@groupName VARCHAR(max)) 
AS 
BEGIN 
    CREATE TABLE #MemberOfGroups 
    (
     groupName varchar(400), 
     cn varchar(400), 
     displayName varchar(400) 
    ) 

    SET NOCOUNT ON 

    DECLARE @t varchar(100), @t2 varchar(1000), 
      @ot varchar (4000), @tt varchar (4000); 

    DECLARE gC CURSOR FOR 
     SELECT cn, distinguishedName 
     FROM openquery (ADSI, 'SELECT cn, distinguishedName 
           FROM ''''LDAP://Mydomaindomain/CN=users,DC=Mydomain,DC=com'''' 
           WHERE objectCategory = ''group''') 

    OPEN gC 

    FETCH NEXT FROM gC INTO @t, @t2 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @ot = '''SELECT cn, displayName 
        FROM ''''LDAP://Mydomaindomain/CN=users,DC=Mydomain,DC=com'''' 
        WHERE objectCategory = ''''Person'''' AND objectClass = ''''user'''' 
        AND memberOf=''''' + @t2 + ''''''; 

     SET @tt = 'select '+ ''''[email protected]+'''' +' As groupName, cn, displayName from openquery(ADSI,'+ @ot +''') order by cn' 

     INSERT INTO #MemberOfGroups (groupName, cn, displayName) 
      EXEC (@tt) 

     FETCH NEXT FROM gC INTO @t, @t2 
    END 

    CLOSE gC 
    DEALLOCATE gC 

    SELECT 
     groupName, displayName 
    FROM 
     #MemberOfGroups 

На данный момент его просто отлично работает, возвращая пользователей введенной группы.

Однако у меня есть новый запрос, в котором группа может иметь другие «группы» в качестве члена, так же как и пользователи.

Я попробовал обновить свой фильтр в состоянии WHERE, чтобы включить objectClass = ''group'', но он не работает.

Кто-нибудь знает об этих запросах и может помочь мне также получить группы (члены группы ввода)?

+0

Я думаю, что ваша проблема связана с фильтром - вытащите ObjectCategory = Person, поскольку «группа», вероятно, не является человеком, и посмотрите, получаете ли вы ответ. –

+0

Я попытался удалить его, а также добавить оператор 'OR' с группами, но напрасно. –

ответ

0

Я предполагаю, что ваши группы находятся внутри OU (папки) пользователей? Моя настройка AD имеет группы в отдельном CN под названием SecurityGroups. Технически вы могли бы сделать:

SELECT cn, member FROM ''''LDAP://Mydomaindomain/CN=<actual OU of groups?>,DC=Mydomain,DC=com''''

, как member даст вам DN всех членов этой группы. Затем у вас есть массив членов и просто нужно сопоставить их с соответствующими объектами (или группой!). Поскольку это возвращает по существу ассоциативный массив DN, вы можете фильтровать для объектов группы и вставлять запрос для повторного запуска для членов этих групп.

+0

Использование 'member' является рендерингом к следующей ошибке; 'Не удается получить данные строки от поставщика OLE DB« ADsDSOObject »для связанного сервера« ADSI ». Не удалось преобразовать значение данных из-за причин, отличных от несоответствия знака или переполнения. ' –

Смежные вопросы