C# 使用C读取组策略设置#

C# 使用C读取组策略设置#,c#,c#-4.0,active-directory,gpo,C#,C# 4.0,Active Directory,Gpo,如何迭代AD域中给定GPO(使用名称或GUID)中的可用和/或设置?无需使用powershell等导出为XML/HTML 我正在使用C#(.NET4.0)。那个问题让我大肆宣传,所以我去研究它。那么a+1呢 我发现一些解决方案从顶部到底部都是最好的 我遇到了类似的问题,不想下载并安装Microsoft GPO库(Microsoft.GroupPolicy.Management)。我想用System.DirectoryServices来完成这一切。这需要一点挖掘,但它是可以做到的 首先使用

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


我正在使用C#(.NET4.0)。

那个问题让我大肆宣传,所以我去研究它。那么a+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)关联的GPO。 否则,gpLink将包含如下字符串:

"[LDAP://cn={31B2F340-016D-11D2-945F-00C04FB984F9},cn=policies,cn=system,DC=Test,DC=Domain;0]"
在上面的文本中,您可以看到GPO的CN。我们现在需要做的就是从DC检索GPO

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

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检索GPO。您将在结果中返回一个DirectoryEntry,其中包含Properties集合中的所有上述字段。有些是COM对象,因此您必须适当地处理它们

更新:工作副本。您现在可以使用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)工具:

Microsoft.GroupPolicy命名空间
这里有一个比上面更好、更完整的例子

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

非常感谢你。我将浏览这些链接,希望能找到一些功能性的东西。将在今天晚些时候发布结果。好的。。。有机会玩转COM接口。GPMC库提供的COM接口不提供迭代设置的方法。有两个单片GenerateReport和GenerateReportToFile函数。我会继续四处寻找,看看是否还有其他东西出现,但现在,我想我会做XML报告并比较我需要的元素。谢谢你的指导,谢谢你的回答。然而,最初的问题是关于如何枚举ADM/ADMX文件定义并存储在GPO中的实际策略和设置。你的答案并没有解决这个问题。这是一个非常有趣的答案。。。尽管它没有直接解决以下问题:-)最后,您好,您使用什么方法来迭代GPO中的设置?正如我在对接受的答案的评论中提到的,我最终导出了XML文件,并以编程方式比较了这些文件。有关XML比较选项,您可以参考此SO线程: