0

我正在寻找一种通过代码列出应用(链接和继承)到特定 OU 的所有 GPO 的方法。

我知道有一个属性表示链接的 GPO,称为 GPLink,但它只提供直接链接的 GPO。

我搜索了谷歌,发现有一个 gpmgmt COM 对象,但我不明白如何将它用于我的目的,甚至可能的话。

谢谢你的帮助。

4

2 回答 2

1

我有以下子要分享。它不会列出 GPO 的名称,但会返回计数。一个次要的 mod 将允许您获取名称(在 foreach 循环中查看GPOLink的属性)。您需要安装 GPMC 并添加 gpmgmt.dll 作为项目参考。

 private string getGPOLinkCount(string OUPathDN, bool onlyEnabledLinks, bool includeInheritedLinks)
    {
        int linkCount = 0;

        try
        {
            GPMGMTLib.GPM gpm = new GPMGMTLib.GPM();
            GPMGMTLib.IGPMConstants gpc = gpm.GetConstants();
            GPMGMTLib.IGPMDomain gpd = gpm.GetDomain(Environment.GetEnvironmentVariable("USERDNSDOMAIN"), "", gpc.UseAnyDC);

            GPMGMTLib.GPMSOM gpSom = gpd.GetSOM(OUPathDN);

            GPMGPOLinksCollection GPOLinks = gpSom.GetGPOLinks();
            GPMGPOLinksCollection GPOLinksIncludingInherited = gpSom.GetInheritedGPOLinks();


            if (!includeInheritedLinks)
            {
                foreach (GPMGPOLink GPOLink in GPOLinks)
                {
                    if (onlyEnabledLinks)
                    {
                        if (GPOLink.Enabled)
                        {
                            linkCount++;
                        }
                    }
                    if (!onlyEnabledLinks) //Get all links, disabled or enabled
                    {
                        linkCount++;
                    }
                }                   
            }

            if (includeInheritedLinks)
            {
                foreach (GPMGPOLink GPOLink in GPOLinksIncludingInherited)
                {
                    if (onlyEnabledLinks)
                    {
                        if (GPOLink.Enabled)
                        {
                            linkCount++;
                        }
                    }
                    if (!onlyEnabledLinks) //Get all links, disabled or enabled
                    {
                        linkCount++;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            return "GPO links: " + ex.Message.Replace("\r\n", "");
        }

        return linkCount.ToString();            
    }
于 2014-12-19T13:14:20.677 回答
0

您需要向上遍历给定 OU 的每个父级,直到到达域头。

于 2012-05-10T16:21:26.143 回答