Frage

Wie gehe ich über verfügbare und/oder feste Einstellungen in einem bestimmten GPO (unter Verwendung von Namen oder GUID) in einer Anzeigendomäne fest? Ohne mit PowerShell usw. auf XML/HTML exportieren zu müssen, usw.

Ich verwende C# (.NET 4.0).

War es hilfreich?

Andere Tipps

Ich hatte ein ähnliches Problem und wollte die Microsoft GPO -Bibliothek (Microsoft.grouppolicy.Management) nicht herunterladen und installieren. Ich wollte alles mit System.DirectoryServices machen. Es dauerte ein wenig, aber es kann getan werden.

Rufen Sie zuerst Ihren Container mit DirectorySearcher ab. Sie müssen bereits einen Verzeichniseintrag eröffnet haben, um in den Sucher übergeben zu haben. Der Filter, den Sie wollen, ist:

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

Und die Eigenschaft, an denen Sie interessiert sind, heißt "Gplink". Erstellen Sie also ein Array mit dieser Eigenschaft darin:

string[] requestProperties = { "gPLink" };

Rufen Sie nun die Ergebnisse ab und ziehen Sie den GPLINK heraus, falls verfügbar.

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;

Wenn GPLink null ist, ist mit dem Container (OU) kein GPO zugeordnet. Andernfalls enthält Gplink eine solche Zeichenfolge wie folgt:

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

Im obigen Text können Sie ein CN für den GPO sehen. Alles, was wir jetzt tun müssen, ist, den GPO vom DC abzurufen.

Dafür verwenden wir einen Filter, der so aussieht:

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

Sie möchten ein Eigenschaftenarray erstellen, das Folgendes enthält:

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

Verwenden Sie nun DirectorySearcher, um den GPO abzurufen. In den Ergebnissen, die alle oben genannten Felder in der Properties -Sammlung enthält, erhalten Sie ein Verzeichnis zurück. Einige sind COM -Objekte, sodass Sie diese angemessen behandeln müssen.

Hier ist ein besseres und vollständigeres Beispiel als oben.

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

Aktualisiert: Arbeitskopie. Sie können jetzt C# verwenden, um einen bestimmten GPO zu lesen und zu analysieren, ohne PowerShell verwenden zu müssen oder etwas auf die Festplatte schreiben zu müssen.

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

Dies verwendet die Tools für Gruppenrichtlinienverwaltungskonsole (GPMC):https://msdn.microsoft.com/en-us/library/windows/desktop/aa814316(v=vs.85).aspx

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top