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