Como faço para descobrir se um arbitrário DOMÍNIO ome de usuário está em uma função específica com C#?
-
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 ?
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
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.