Domanda

Come posso fare per l'iterazione più di disponibili e / o le impostazioni in un set (nome utilizzando o il GUID) dato GPO in un dominio AD? Senza dover esportare in formato XML / HTML usando PowerShell, ecc.

Sto usando C # (.NET 4.0).

È stato utile?

Soluzione

Questa domanda mi ha fatto hyped così sono andato alla ricerca di esso. Quindi un +1

Alcune soluzioni che ho trovato dalla parte superiore essere il migliore a fondo essere il peggiore

Altri suggerimenti

Ho avuto un problema simile, e non ha voglia di scaricare e installare la libreria Microsoft GPO (Microsoft.GroupPolicy.Management). Ho voluto fare tutto con System.DirectoryServices. Ci sono voluti un po 'di scavo, ma si può fare.

In primo luogo recuperare il vostro contenitore con DirectorySearcher. Avrete bisogno di aver già aperto una voce di directory per passare nel ricercatore. Il filtro che si desidera è:

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

e la proprietà si è in interessato si chiama "gPLink", in modo da creare un array con quella proprietà in esso:

string[] requestProperties = { "gPLink" };

Ora recuperare i risultati, ed estrarre il gPLink, se disponibile.

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;

Se gpLink è nullo, non c'è GPO associato al contenitore (UO). In caso contrario, gpLink conterrà una stringa come questa:

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

Nel testo di cui sopra, si può vedere un CN per il GPO. Tutto quello che dobbiamo fare ora è recuperare il GPO dalla DC.

Per questo, usiamo un filtro che assomiglia a questo:

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

Ti consigliamo di creare una matrice di proprietà che sono i seguenti:

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

Ora usate DirectorySearcher per recuperare l'oggetto Criteri di gruppo. Otterrai un DirectoryEntry nei risultati che contiene tutti i campi sopra della collezione Properties. Alcuni sono oggetti COM, quindi dovrete gestire quelle in modo appropriato.

Ecco un esempio migliore e più completa poi sopra.

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();
    }
}

AGGIORNAMENTO: copia di lavoro. È ora possibile utilizzare C # per ottenere leggere e analizzare un dato oggetto Criteri di gruppo senza dover utilizzare Powershell o scrivere nulla sul disco.

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
        }
    }            
}

Questo utilizza la console strumenti di gestione Criteri di gruppo (GPMC): https://msdn.microsoft .com / it-it / library / windows / desktop / aa814316 (v = vs.85) aspx

Microsoft.GroupPolicy Namespace https: // msdn .microsoft.com / en-us / library / windows / desktop / microsoft.grouppolicy (v = vs.85) aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top