Чтение настроек групповой политики с помощью C#

StackOverflow https://stackoverflow.com/questions/5319319

Вопрос

Как мне перебрать доступные и/или установить настройки в данном объекте групповой политики (используя имя или GUID) в домене AD?Без необходимости экспорта в XML/HTML с помощью PowerShell и т. д.

Я использую С# (.NET 4.0).

Это было полезно?

Решение

Этот вопрос заставил меня раскрутить, поэтому я пошел, чтобы исследовать его. Итак, +1

Некоторые решения, которые я нашел с вершины, лучшим внизу, являются худшим

Другие советы

У меня была аналогичная проблема, и я не хотел загружать и устанавливать библиотеку Microsoft GPO (Microsoft.GroupPolicy.Management).Я хотел сделать все это с помощью System.DirectoryServices.Пришлось немного покопаться, но это можно сделать.

Сначала извлеките свой контейнер с помощью DirectorySearcher.Вам нужно будет уже открыть запись в каталоге, чтобы перейти в поисковик.Вам нужен фильтр:

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

и интересующее вас свойство называется «gPLink», поэтому создайте массив с этим свойством:

string[] requestProperties = { "gPLink" };

Теперь получите результаты и извлеките gPLink, если он доступен.

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;

Если gpLink имеет значение null, с контейнером (OU) не связан объект групповой политики.В противном случае gpLink будет содержать такую ​​строку:

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

В тексте выше вы можете увидеть CN для объекта групповой политики.Все, что нам нужно сделать сейчас, это получить объект групповой политики из контроллера домена.

Для этого мы используем фильтр, который выглядит следующим образом:

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

Вам понадобится создать массив свойств, который будет включать следующее:

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

Теперь используйте DirectorySearcher для получения объекта групповой политики.В результатах вы получите DirectoryEntry, содержащий все вышеперечисленные поля в коллекции свойств.Некоторые из них являются COM-объектами, поэтому вам придется обращаться с ними соответствующим образом.

Вот лучший и более полный пример, тогда выше.

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

Обновлено: рабочая копия. Теперь вы можете использовать C#, чтобы получить чтение и проанализировать заданный GPO, не используя PowerShell или написать что -либо на диск.

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

Это использует инструменты управления групповой политикой (GPMC):https://msdn.microsoft.com/en-us/library/windows/desktop/aa814316(v=vs.85).aspx

Microsoft.grouppolicy пространство именhttps://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.grouppolicy(v=vs.85).aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top