Question

Comment dois-je procéder itérer sur les paramètres disponibles et / ou ensemble dans un GPO donné (en utilisant le nom ou GUID) dans un domaine AD? Sans avoir à exporter vers XML / HTML en utilisant Powershell, etc.

J'utilise C # (.NET 4.0).

Était-ce utile?

Autres conseils

J'ai eu un problème similaire, et ne voulait pas télécharger et installer la bibliothèque GPO Microsoft (Microsoft.GroupPolicy.Management). Je voulais tout faire avec System.DirectoryServices. Il a fallu creuser un peu, mais il peut être fait.

Tout d'abord récupérer votre conteneur à l'aide DirectorySearcher. Vous aurez besoin d'avoir déjà ouvert une entrée de répertoire pour passer dans le chercheur. Le filtre que vous voulez est:

string filter = "(&" + "(objectClass=organizationalUnit)" + "(OU=" + container + "))";

et la propriété que vous intéresse est nommé « gPLink », donc créer un tableau avec cette propriété en elle:

string[] requestProperties = { "gPLink" };

récupérer les résultats et tirer le gPLink, le cas échéant.

using (var searcher = new DirectorySearcher(directory, filter, properties, SearchScope.Subtree))
{
    SearchResultCollection results = searcher.FindAll();
    DirectoryEntry entry = results[0].GetDirectoryEntry();
    string gpLink = entry.Properties["gPLink"].Value;

Si gpLink est nul, il n'y a pas GPO associé au récipient (OU). Dans le cas contraire, gpLink contiendra une chaîne telle que celle-ci:

"[LDAP://cn={31B2F340-016D-11D2-945F-00C04FB984F9},cn=policies,cn=system,DC=Test,DC=Domain;0]"

Dans le texte ci-dessus, vous pouvez voir un CN pour le GPO. Tout ce que nous devons faire maintenant est de récupérer l'objet de stratégie de la DC.

Pour cela, nous utilisons un filtre qui ressemble à ceci:

string filter = "(&" +
    "(objectClass=groupPolicyContainer)" +
    "(cn={31B2F340-016D-11D2-945F-00C04FB984F9}))";

Vous aurez envie de créer un tableau des propriétés qui incluent les éléments suivants:

Properties = { "objectClass", "cn", "distinguishedName", "instanceType", "whenCreated",
    "whenChanged", "displayName", "uSNCreated", "uSNChanged", "showInAdvancedViewOnly",
    "name", "objectGUID", "flags", "versionNumber", "systemFlags", "objectCategory", 
    "isCriticalSystemObject", "gPCFunctionalityVersion", "gPCFileSysPath",
    "gPCMachineExtensionNames", "dSCorePropagationData", "nTSecurityDescriptor" };

Utilisez DirectorySearcher pour récupérer le GPO. Vous récupérerez un DirectoryEntry dans les résultats qui contient tous les champs ci-dessus dans la collection Properties. Certains sont des objets COM, de sorte que vous devrez gérer les correctement.

Voici un exemple de meilleure qualité et plus complète puis au-dessus.

class Program
{
    static void Main(string[] args)
    {
        DirectoryEntry rootDse = new DirectoryEntry("LDAP://rootDSE");
        DirectoryEntry root = new DirectoryEntry("GC://" + rootDse.Properties["defaultNamingContext"].Value.ToString());
        DirectorySearcher searcher = new DirectorySearcher(root);
        searcher.Filter = "(objectClass=groupPolicyContainer)";

        foreach (SearchResult gpo in searcher.FindAll())
        {
            var gpoDesc = gpo.GetDirectoryEntry().Properties["distinguishedName"].Value.ToString();
            Console.WriteLine($"GPO: {gpoDesc}");

            DirectoryEntry gpoObject = new DirectoryEntry($"LDAP://{gpoDesc}");

            try
            {
                Console.WriteLine($"DisplayName: {gpoObject.Properties["displayName"].Value.ToString()}");
            }
            catch
            {
            }

            try
            {
                Console.WriteLine($"PCFileSysPath: {gpoObject.Properties["gPCFileSysPath"].Value.ToString()}");
            }
            catch
            {
            }

            try
            {
                Console.WriteLine($"VersionNumber: {gpoObject.Properties["versionNumber"].Value.ToString()}");
            }
            catch
            {
            }

            try
            {
                Console.WriteLine($"UserExtensionNames: {gpoObject.Properties["gPCUserExtensionNames"].Value.ToString()}");
            }
            catch
            {
            }

            try
            {
                Console.WriteLine($"MachineExtensionNames: {gpoObject.Properties["gPCMachineExtensionNames"].Value.ToString()}");
            }
            catch
            {
            }


            try
            {
                Console.WriteLine($"PCFunctionality: {gpoObject.Properties["gPCFunctionalityVersion"].Value.ToString()}");
            }
            catch
            {
            }

        }

        Console.ReadKey();
    }
}

MISE À JOUR: copie de travail. Vous pouvez maintenant utiliser c # pour obtenir lire et analyser un GPO donné sans avoir à utiliser Powershell ou quoi que ce soit d'écriture sur le disque.

using Microsoft.GroupPolicy;

var guid = new Guid("A7DE85DE-1234-F34D-99AD-5AFEDF7D7B4A");
var gpo = new GPDomain("Centoso.local");
var gpoData = gpo.GetGpo(guid);
var gpoXmlReport = gpoData.GenerateReport(ReportType.Xml).ToString();

using (XmlReader reader = XmlReader.Create(new StringReader(gpoXmlReport)))
{
    string field;
    while (reader.MoveToNextAttribute())
    {
        foreach (string attr in attributes)
        {
            // do something
        }
    }            
}

Il utilise les outils Group Policy Management Console (GPMC): https://msdn.microsoft .com / fr-fr / bibliothèque / windows / bureau / aa814316 (v = vs.85) .aspx

Microsoft.GroupPolicy Namespace https: // msdn .microsoft.com / fr-fr / bibliothèque / windows / bureau / microsoft.grouppolicy (v = vs.85) .aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top