【发布时间】:2012-05-10 11:55:44
【问题描述】:
我正在寻找一种方法来列出通过代码应用(链接和继承)到特定 OU 的所有 GPO。
我知道有一个属性表示链接的 GPO,称为 GPLink,但它只给出直接链接的。
我搜索了谷歌,发现有一个 gpmgmt COM 对象,但我不明白如何将它用于我的目的,甚至可能。
感谢您的帮助。
【问题讨论】:
标签: c# active-directory group-policy gpo
我正在寻找一种方法来列出通过代码应用(链接和继承)到特定 OU 的所有 GPO。
我知道有一个属性表示链接的 GPO,称为 GPLink,但它只给出直接链接的。
我搜索了谷歌,发现有一个 gpmgmt COM 对象,但我不明白如何将它用于我的目的,甚至可能。
感谢您的帮助。
【问题讨论】:
标签: c# active-directory group-policy gpo
我有以下子要分享。它不会列出 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();
}
【讨论】:
您需要向上遍历给定 OU 的每个父级,直到到达域头。
【讨论】: