Определение членов локальных групп через C # - PullRequest
3 голосов
/ 05 сентября 2008

Я задавался вопросом, знает ли кто-нибудь, как получить членство в локальных группах на удаленном сервере программно через C #. Требуется ли для этого разрешение администратора? И если да, есть ли способ подтвердить членство в этих группах в данный момент вошедшего в систему пользователя (или нет)?

Ответы [ 6 ]

4 голосов
/ 05 сентября 2008

Howto: (почти) все в Active Directory через C # очень полезно и также содержит инструкции по итерации членов AD в группе.

public ArrayList Groups(string userDn, bool recursive)
{
    ArrayList groupMemberships = new ArrayList();
    return AttributeValuesMultiString("memberOf", userDn,
        groupMemberships, recursive);
}

Вам также понадобится эта функция:

public ArrayList AttributeValuesMultiString(string attributeName,
     string objectDn, ArrayList valuesCollection, bool recursive)
{
    DirectoryEntry ent = new DirectoryEntry(objectDn);
    PropertyValueCollection ValueCollection = ent.Properties[attributeName];
    IEnumerator en = ValueCollection.GetEnumerator();

    while (en.MoveNext())
    {
        if (en.Current != null)
        {
            if (!valuesCollection.Contains(en.Current.ToString()))
            {
                valuesCollection.Add(en.Current.ToString());
                if (recursive)
                {
                    AttributeValuesMultiString(attributeName, "LDAP://" +
                    en.Current.ToString(), valuesCollection, true);
                }
            }
        }
    }
    ent.Close();
    ent.Dispose();
    return valuesCollection;
}

Если вы сейчас хотите использовать этот AD-метод, вы можете использовать информацию из этой статьи, но он использует неуправляемый код:

http://www.codeproject.com/KB/cs/groupandmembers.aspx

Пример приложения, которое они сделали:

alt text

2 голосов
/ 05 сентября 2008

Похоже, в .net 3.5 появилась новая сборка System.DirectoryServices.AccountManagement, которая обеспечивает более чистую реализацию, чем System.DirectoryServices. Доминик Байер пишет о паре простых операций, включая проверку членства в группе: -

public static bool IsUserInGroup(string username, string groupname, ContextType type)
{
    PrincipalContext context = new PrincipalContext(type);

    UserPrincipal user = UserPrincipal.FindByIdentity(
        context,
        IdentityType.SamAccountName,
        username);
    GroupPrincipal group = GroupPrincipal.FindByIdentity(
        context, groupname);

    return user.IsMemberOf(group);
}

Я думаю, что я буду использовать этот подход, однако спасибо за предложения, однако! : -)

0 голосов
/ 27 ноября 2008

Это может помочь. Мне нужно было разработать приложение, в котором мы хотим проходить аутентификацию в активном каталоге, а также изучить строки групп, в которых находится пользователь.

По нескольким причинам мы не хотим использовать проверку подлинности Windows, а имеем собственную проверку подлинности на основе форм. Я разработал подпрограмму ниже, чтобы, во-первых, аутентифицировать пользователя, а во-вторых, изучить все группы, к которым принадлежит пользователь. Возможно, это может помочь. Процедура использует LogonUser для аутентификации, а затем получает список числовых идентификаторов групп (SID), похожих на guid для этого пользователя, и переводит каждый из них в удобочитаемую форму.

Надеюсь, это поможет, мне пришлось синтезировать этот подход из множества различных поисковых запросов Google.

private int validateUserActiveDirectory()
{
    IntPtr token = IntPtr.Zero;
    int DBgroupLevel = 0;

    // make sure you're yourself -- recommended at msdn http://support.microsoft.com/kb/248187
    RevertToSelf();

    if (LogonUser(txtUserName.Value, propDomain, txtUserPass.Text, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, token) != 0) {
        // ImpersonateLoggedOnUser not required for us -- we are not doing impersonated stuff, but leave it here for completeness.
        //ImpersonateLoggedOnUser(token);
        // do impersonated stuff
        // end impersonated stuff

        // ensure that we are the original user
        CloseHandle(token);
        RevertToSelf();

        System.Security.Principal.IdentityReferenceCollection groups = Context.Request.LogonUserIdentity.Groups;
        IdentityReference translatedGroup = default(IdentityReference);

        foreach (IdentityReference g in groups) {
            translatedGroup = g.Translate(typeof(NTAccount));
            if (translatedGroup.Value.ToLower().Contains("desired group")) {
                inDBGroup = true;
                return 1;
            }
        }
    }
    else {
        return 0;
    }
}
0 голосов
/ 07 сентября 2008

Было бы интересно, если бы System.DirectoryServices.AccountManagement полностью управлялся. Я использовал System.DirectoryServices.ActiveDirectory, который является оберткой для COM Interop, что привело к многочисленным головным болям ...

0 голосов
/ 07 сентября 2008

Я задал похожий вопрос и в итоге написал ответ , который использовал WMI для перечисления членов группы. У меня были реальные проблемы с аутентификацией в system.directoryservices.accountmanagement. YMMV, конечно.

0 голосов
/ 05 сентября 2008

Возможно, это можно сделать с помощью WMI?

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