servidor - obtener nombre de usuario de windows c#
Obtener grupos de usuarios en Active Directory (2)
Tengo un problema con la integración de mi servicio web ASP.NET con una configuración de Active Directory y su uso para autenticar usuarios y verificar con los grupos de AD de los que son miembros y si tienen permisos para usar mi aplicación personalizada.
Mi aplicación personalizada tiene sus propios permisos y los administradores configuran grupos de Active Directory que permiten usar la aplicación personalizada.
El problema que tengo es cuando un usuario de un bosque diferente de Trusted Trusted, con plena confianza bidireccional, intenta iniciar sesión. No puedo obtener una lista de sus grupos del servidor AD con el que se comunican mis servicios web ASP.NET. El servicio web ASP.NET solo tiene acceso al servidor AD (AD Main), no al controlador AD de confianza (Secundario AD).
El usuario es un miembro del dominio (AD Secundario) y puedo autenticar a ese usuario contra el dominio (AD Principal), pero no puedo obtener una lista de grupos del dominio (Principal de AD) cuando el usuario está en el (AD Secundario) dominio.
He intentado este código.
StringCollection groupids = new StringCollection();
try
{
DirectoryLibrary dirLib = new DirectoryLibrary();
DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://" + domain,username, password);
if (directoryEntry != null)
{
//Enum the properties so we can see what is in them
foreach (string propname in directoryEntry.Properties.PropertyNames)
{
Debug.WriteLine(propname);
}
object obGroups = directoryEntry.Invoke("Groups");
foreach (object ob in (IEnumerable)obGroups)
{
// Create object for each group.
DirectoryEntry obGpEntry = new DirectoryEntry(ob);
groupids.Add(obGpEntry.NativeGuid);
}
}
}
catch (DirectoryServicesCOMException ex) { throw ex; }
Intenté alejarme del objeto DirectoryEntry para, algo como esto.
List<GroupPrincipal> result = new List<GroupPrincipal>();
StringCollection groupids = new StringCollection();
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain, domain, userName, password);
// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);
// if found - grab its groups
if (user != null)
{
PrincipalSearchResult<Principal> groups = user.GetGroups();
// iterate over all groups
foreach (Principal p in groups)
{
// make sure to add only group principals
if (p is GroupPrincipal)
{
groupids.Add(p.DisplayName);
}
}
}
Pero no obtengo el usuario y no puedo obtener una lista de los grupos para ese usuario en el otro dominio. Cualquier ayuda sería apreciada.
Creo que debes conectarte al AD remoto y obtener la información que deseas.
Escribí una réplica una vez, donde replico desde muchos AD
Algunos codifican fuera de esto:
Public Function GetDirectoryEntry() As Object
If InStr(1, m_sLdapPath, "DC=") > 0 Then
Dim directory_service As New PrincipalContext(ContextType.Domain, m_sDomain, m_sLdapPath)
Return directory_service
Else
Dim directory_service As New PrincipalContext(ContextType.Machine, m_sDomain, m_sLdapPath)
Return directory_service
End If
End Function
Public Function GetUserList() As PrincipalSearchResult(Of Principal)
Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext)
Dim directory_user As New UserPrincipal(directory_service)
Dim directory_userlist As New PrincipalSearcher(directory_user)
directory_userlist.QueryFilter = directory_user
Return directory_userlist.FindAll
End Function
Public Function GetGroupList() As PrincipalSearchResult(Of Principal)
Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext)
Dim directory_group As New GroupPrincipal(directory_service)
Dim directory_grouplist As New PrincipalSearcher(directory_group)
directory_grouplist.QueryFilter = directory_group
Return directory_grouplist.FindAll
End Function
Sé que esto no es exactamente lo que necesita, pero muestra cómo conectarse y obtener datos de cualquier AD. En mi caso, obtengo una lista de usuarios, una lista de grupos o lo que sea y luego trabajo con esas colecciones.
Dim l_oGroupList As Object = oDirectory.GetGroupList()
For Each l_oGroup In l_oGroupList
If l_oGroup.Members.Count > 0 Then
If l_oGroup.Members.Contains(directory_service, IdentityType.UserPrincipalName, Username) Then
'' he is part of the group
End If
End If
Next
Espero que esto ayude un poco a resolver el problema ...
Este parece ser un gran caso de uso para el atributo AD derivado memberOf. Con el objeto DirectoryEntry directoryEntry
, puede enumerar a qué grupo pertenece un usuario.
foreach (object group in directoryEntry.Properties["memberOf"])
{
DirectoryEntry obGpEntry = New DirectoryEntry("LDAP://" + (String)group);
groupids.Add(obGpEntry.NativeGuid);
}
También es probable que pueda usar el primer segmento de código si prefirió ob con "LDAP: //"