Lesen der Gruppenrichtlinieneinstellungen mit C#
-
24-10-2019 - |
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).
Lösung
Diese Frage brachte mich auf, also ging ich, um sie zu recherchieren. Also a +1
Einige Lösungen, die ich von oben fand, war der beste bis unten am schlimmste.
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