Чтение параметров групповой политики с использованием C # - PullRequest
12 голосов
/ 16 марта 2011

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

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

Ответы [ 4 ]

8 голосов
/ 16 марта 2011

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

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

3 голосов
/ 15 апреля 2015

У меня была похожая проблема, и я не хотел загружать и устанавливать библиотеку 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 для объекта групповой политики. Все, что нам нужно сделать сейчас, это извлечь объект групповой политики из DC.

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

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 в результатах, который содержит все вышеперечисленные поля в коллекции Properties. Некоторые из них являются объектами COM, поэтому вам придется обращаться с ними соответствующим образом.

0 голосов
/ 11 октября 2016

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

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();
    }
}
0 голосов
/ 04 мая 2016

ОБНОВЛЕНО: Рабочая копия.Теперь вы можете использовать c # для чтения и анализа данного объекта групповой политики без необходимости использовать 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

...