TSQL: Как получить список групп, что пользователь принадлежит в Active Directory

Я вижу много неправильных ответов здесь. Любое правильное решение должно проигнорировать пробел и пунктуацию (и любые небуквенные символы на самом деле) и должно быть нечувствительным к регистру.

Несколько хороших тестовых сценариев в качестве примера:

"Человек, план, канал, Панама. "

"Тойота Тойота".

""

, А также некоторые непалиндромы.

решение В качестве примера в C# (примечание: пустые и пустые строки считают палиндромами в этом дизайне, если это не желаемо, чтобы было легко измениться):

public static bool IsPalindrome(string palindromeCandidate)
{
    if (string.IsNullOrEmpty(palindromeCandidate))
    {
        return true;
    }
    Regex nonAlphaChars = new Regex("[^a-z0-9]");
    string alphaOnlyCandidate = nonAlphaChars.Replace(palindromeCandidate.ToLower(), "");
    if (string.IsNullOrEmpty(alphaOnlyCandidate))
    {
        return true;
    }
    int leftIndex = 0;
    int rightIndex = alphaOnlyCandidate.Length - 1;
    while (rightIndex > leftIndex)
    {
        if (alphaOnlyCandidate[leftIndex] != alphaOnlyCandidate[rightIndex])
        {
            return false;
        }
        leftIndex++;
        rightIndex--;
    }
    return true;
}
11
задан Cœur 26 February 2017 в 12:30
поделиться

3 ответа

Я думаю, что это одно из ограничений интерфейса AD на основе T-SQL - вы не можете получать многозначные атрибуты, например атрибуты (например, memberOf для пользователя) которые содержат более одного значения.

Вы можете получить однозначные атрибуты, такие как «sn» (surname = last name) или «givenName» и «mail» и т. д., но интерфейс на основе SQL не способен обрабатывать такие атрибуты, как "memberOf" с несколькими присвоенными им значениями.

Поэтому я боюсь, что вам придется пойти другим путем для этой проблемы - например, найти и заполнить членство в группе в управляемом коде (отдельно вне SQL Server или, возможно, как сборка CLR внутри SQL Server).

ОБНОВЛЕНИЕ: см. здесь (поддержка MSDN) для объяснения ограничений провайдера OPENQUERY AD:

Ограничения
Процесс использования Оператор OPENQUERY для вытягивания информация с сервера LDAP делает страдают некоторыми ограничениями. В ограничения можно обойти в в одних случаях, но в других дизайн приложения необходимо изменить. An внешнее приложение или COM-объект который использует ADSI для получения информация с сервера LDAP и затем создайте таблицу в SQL с помощью ADO или другие методы доступа к данным еще один жизнеспособный метод.

Первое ограничение - , что многозначные свойства не могут возвращаться в результирующем наборе для SQL Сервер. ADSI будет читать схему информация с сервера LDAP, которая определяет структуру и синтаксис классы и атрибуты, используемые сервер. Если атрибут запрашивается с сервера LDAP определен в схеме как многозначный не может быть возвращен в оператор OPENQUERY.

13
ответ дан 3 December 2019 в 00:59
поделиться

Microsoft Technet Script Center - отличный ресурс для скриптов

http://technet.microsoft.com/en-us/scriptcenter/default.aspx

Вот сценарий, который утверждает, что выдаёт именно то, что вы хотите:

http://gallery.technet.microsoft.com/ScriptCenter/en-us/ab5400e2-489a-4738-9b85-508bcb5b75f8

-1
ответ дан 3 December 2019 в 00:59
поделиться

Этого можно добиться, выбрав все группы, которые содержат пользователя в своем атрибуте члена или, что лучше, путь LDAP пользователя (различающееся имя). Вот простая процедура, выполняющая эту работу.


CREATE PROCEDURE dbo.GetLdapUserGroups
(
    @LdapUsername NVARCHAR(256)
)
AS
BEGIN
    DECLARE @Query NVARCHAR(1024), @Path NVARCHAR(1024)

    SET @Query = '
        SELECT @Path = distinguishedName
        FROM OPENQUERY(ADSI, ''
            SELECT distinguishedName 
            FROM ''''LDAP://DC=domain,DC=com''''
            WHERE 
                objectClass = ''''user'''' AND
                sAMAccountName = ''''' + @LdapUsername + '''''
        '')
    '
    EXEC SP_EXECUTESQL @Query, N'@Path NVARCHAR(1024) OUTPUT', @Path = @Path OUTPUT 

    SET @Query = '
        SELECT name AS LdapGroup 
        FROM OPENQUERY(ADSI,''
            SELECT name 
            FROM ''''LDAP://DC=domain,DC=com''''
            WHERE 
                objectClass=''''group'''' AND
                member=''''' + @Path + '''''
        '')
        ORDER BY name
    '
    EXEC SP_EXECUTESQL @Query

END

- Гильберт

15
ответ дан 3 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: