Como faço para descobrir se um arbitrário DOMÍNIO ome de usuário está em uma função específica com C#?

StackOverflow https://stackoverflow.com/questions/7393695

  •  29-10-2019
  •  | 
  •  

Pergunta

Eu sou muito nova para C#, então perdoe a minha ignorância.Eu preciso testar se um usuário (DOMÍNIO ome de usuário) em um determinado grupo, e sim, isso inclui grupos aninhados.

Eu descobri que WindowsPrincipal.IsInRole() obras fantásticas, ao lidar com o atual usuário conectado.Que não é o caso para mim.Eu preciso ser capaz de passar de uma forma arbitrária de DOMÍNIO ome de usuário ou UPN (eu vou fazer o que for mais fácil de implementar), e voltar true/false se eles são um membro do grupo X, até mesmo se eles são apenas indiretos os membros do grupo X (e.g:usuário é membro do grupo Y, e Y de grupo é membro do grupo X).

Eu olhei para WindowsIdentity, e talvez é ser novo para C#, mas eu apenas não vejo uma maneira de fazer algo como WindowsIdentity("MYDOMAIN\User1").Bem, eu fiz, mas nunca recebi qualquer lugar perto de chegar ao trabalho.

Usando C#, dado um DOMÍNIO ome de usuário, que não será o atual usuário registrado, como posso determinar se eles são um membro do DOMÍNIO\grupo ?

Foi útil?

Solução 4

Resposta à própria pergunta:Eu tentei as soluções apresentadas, e não era para fazê-los funcionar.Observe, estou 100% de certeza de que isso é devido a minha inexperiência com o C#, e não tem nada a ver com o que os comentadores postado.Amor e, graças a todos os comentadores que ajudou.

O que fez um trabalho para mim é este: http://ddkonline.blogspot.com/2010/05/how-to-recursively-get-group-membership.html

Eu tive que fazer alguns ajustes básicos para tornar a solução acima se encaixam no meu situação (alterar o LDAP params, por exemplo), mas, basicamente, trabalhou.Retorna true se o membro do grupo, false caso contrário.Espero que este salva futuros pesquisadores algum cabelo, como eu já perdeu uma mão cheia.Obrigado novamente a todos que postaram ajuda.

Outras dicas

Você pode usar a consulta LDAP para isso.Aqui está um bom artigo

Como:(Quase) Tudo No Active Directory através de C#

Aqui está uma função que eu tenho de usar o que funciona e você deve ser capaz de usá-lo como está quase.Você provavelmente vai ter que criar ParseUserDomain mas que é bastante direta:

/// <summary>
/// Checks if a user in is a active directory group.
/// <summary>
/// <param name="username">Can contain the domain and username or just username
///    (eg. domain\username or username).  If no domain is specified, the default
///    domain is used.</param>
/// <param name="group">Active directory group to check.  Group name only.  No
///    leading domain as the domain from the user is used.</param>
/// <returns></returns>
public bool UserIsInActiveDirectoryGroup(string username, string group)
{
    bool isInGroup = false;
    string user = "";
    string domain = "";
    // Parses off domain and user to seperate values
    ParseUserDomain(username, out domain, out user);   

    if (string.IsNullOrEmpty(user) ||
        string.IsNullOrEmpty(domain) ||
        string.IsNullOrEmpty(group))
    {
        return false;
    }

    using (PrincipalContext ADContext = new PrincipalContext(ContextType.Domain,
        domain))
    {
        using (GroupPrincipal principalGroup = 
            GroupPrincipal.FindByIdentity(ADContext, group))
        {
            if (principalGroup != null)
            {
                using (UserPrincipal ADPrincipalUser = 
                    UserPrincipal.FindByIdentity(ADContext, user))
                {
                    // True means deep search
                    var users = principalGroup.GetMembers(true);
                    isInGroup = users.Contains(ADPrincipalUser);
                }
            }
        }
    }
    return isInGroup;
}

Eu respondi com um consulta recursiva em uma à semelhança de entrada no Estouro de Pilha chamado Encontrar Recursivas de Associação de Grupo do Active Directory () utilizando C#.Mudando o código que eu dei não pode permitir que você faça o que você quiser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top