使用C#读取组策略设置

Nas*_*sir 15 c# active-directory gpo c#-4.0

如何在AD域中迭代给定GPO(使用名称或GUID)中的可用和/或设置设置?无需使用PowerShell等导出到XML/HTML.

我正在使用C#(.NET 4.0).

Rez*_* M. 9

这个问题让我大肆宣传,所以我去研究它.所以+1

我从顶部发现的一些解决方案是最好的,最底层是最差的


Cho*_*les 5

我遇到了类似的问题,并且不想下载并安装 Microsoft GPO 库 (Microsoft.GroupPolicy.Management)。我想用 System.DirectoryServices 来完成这一切。这需要一点挖掘,但这是可以做到的。

首先使用 DirectorySearcher 检索您的容器。您需要已经打开一个目录条目才能传递到搜索器。您想要的过滤器是:

string filter = "(&" + "(objectClass=organizationalUnit)" + "(OU=" + container + "))";
Run Code Online (Sandbox Code Playgroud)

并且您感兴趣的属性名为“gPLink”,因此创建一个包含该属性的数组:

string[] requestProperties = { "gPLink" };
Run Code Online (Sandbox Code Playgroud)

现在检索结果,并提取 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;
Run Code Online (Sandbox Code Playgroud)

如果 gpLink 为 null,则没有与容器 (OU) 关联的 GPO。否则,gpLink 将包含如下字符串:

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

在上面的文本中,您可以看到 GPO 的 CN。我们现在需要做的就是从 DC 检索 GPO。

为此,我们使用如下所示的过滤器:

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

您需要创建一个包含以下内容的 Properties 数组:

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

现在使用 DirectorySearcher 检索 GPO。您将在结果中返回一个 DirectoryEntry,其中包含 Properties 集合中的所有上述字段。有些是 COM 对象,因此您必须适当地处理它们。