web-dev-qa-db-fra.com

Liste de tous les groupes Active Directory

Le code suivant répertorie certains groupes Active Directory, mais pas tous. Pourquoi?

J'essaie de répertorier tous les groupes de sécurité, groupes de distribution, groupes d'ordinateurs, etc. Ai-je spécifié la mauvaise variable objectClass?

private static void ListGroups()
{
    DirectoryEntry objADAM = default(DirectoryEntry);
    DirectoryEntry objGroupEntry = default(DirectoryEntry);
    DirectorySearcher objSearchADAM = default(DirectorySearcher);
    SearchResultCollection objSearchResults = default(SearchResultCollection);
    SearchResult myResult=null;

    objADAM = new DirectoryEntry(LDAP);
    objADAM.RefreshCache();
    objSearchADAM = new DirectorySearcher(objADAM);
    objSearchADAM.Filter = "(&(objectClass=group))";
    objSearchADAM.SearchScope = SearchScope.Subtree;
    objSearchResults = objSearchADAM.FindAll();

    // Enumerate groups 
    try
    {
        fileGroups.AutoFlush = true;
        if (objSearchResults.Count != 0)
        {
            foreach (SearchResult objResult in objSearchResults)
            {
                myResult = objResult;
                objGroupEntry = objResult.GetDirectoryEntry();
                Console.WriteLine(objGroupEntry.Name);
                fileGroups.WriteLine(objGroupEntry.Name.Substring(3));
            }
        }
        else
        {
            throw new Exception("No groups found");
        }  
    } 
    catch (PrincipalException e)
    {
        fileErrorLog.AutoFlush = true;
        fileErrorLog.WriteLine(e.Message + " " + myResult.Path);
    }
    catch (Exception e)
    {
        throw new Exception(e.Message);
    }
}
22
cymorg

Si vous utilisez .NET 3.5 ou une version plus récente, vous pouvez utiliser une entité PrincipalSearcher et un principe de "requête par exemple" pour effectuer votre recherche:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// define a "query-by-example" principal - here, we search for a GroupPrincipal 
GroupPrincipal qbeGroup = new GroupPrincipal(ctx);

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeGroup);

// find all matches
foreach(var found in srch.FindAll())
{
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
}

Si vous n'avez pas déjà lu absolument l'article MSDN Gestion des principes de sécurité de l'annuaire dans le .NET Framework 3.5 qui montre bien comment utiliser au mieux les nouvelles fonctionnalités de System.DirectoryServices.AccountManagement

49
marc_s

Essayez le filtre "(objectcategory = group)" Solution trouvée ici

2
Sergey Vedernikov
DirectoryEntry entry = new DirectoryEntry("ldap://ldap.gaurangjadia.com", "scott", "tiger");

DirectorySearcher dSearch = new DirectorySearcher(entry);
dSearch.Filter = "(&(objectClass=group))";
dSearch.SearchScope = SearchScope.Subtree;

SearchResultCollection results = dSearch.FindAll();

for (int i = 0; i < results.Count; i++) {
    DirectoryEntry de = results[i].GetDirectoryEntry();

    //TODO with "de"
}
2
Gaurang Jadia

Je l'ai essayé et ça marche

    public ArrayList GetAllGroupNames(string ipAddress, string ouPath)
    {
        DirectorySearcher deSearch = new DirectorySearcher();
        deSearch.SearchRoot = GetRootDirectoryEntry(ipAddress, ouPath);
        deSearch.Filter = "(&(objectClass=group))";
        SearchResultCollection results = deSearch.FindAll();
        if (results.Count > 0)
        {
            ArrayList groupNames = new ArrayList();

            foreach (SearchResult group in results)
            {
                var entry = new DirectoryEntry(group.Path, UserName, Password);
                string shortName = entry.Name.Substring(3, entry.Name.Length - 3);
                groupNames.Add(shortName);
            }

            return groupNames;
        }
        else
        {
            return new ArrayList();
        }
    }

    private DirectoryEntry GetRootDirectoryEntry(string ipAddress, string domainPath, string username, string password)
    {
        var ldapPath = "LDAP://" + ipAddress + "/" + domainPath;
        return new DirectoryEntry(ldapPath, username, password, AuthenticationTypes.Secure);
    }
0
Dinesh Kumar P

Pour récupérer un ensemble de résultats supérieur à 1 000 éléments, vous devez définir SizeLimit sur sa valeur par défaut (zéro) et définir PageSize sur une valeur inférieure ou égale à 1 000.

objSearchADAM.PageSize = 1000;

0
Khawar

vous pouvez obtenir tous les détails du groupe d'annonces à l'aide de la commande powershell ci-dessous. Si vous souhaitez un nom particulier contre le groupe AD, écrivez un filtre au lieu de *.

Get-ADGroup -Filter * -properties * | Export-csv c:\csv\new.csv

0
Ankit Yadav