我正在寻找一种通过代码列出应用(链接和继承)到特定 OU 的所有 GPO 的方法。
我知道有一个属性表示链接的 GPO,称为 GPLink,但它只提供直接链接的 GPO。
我搜索了谷歌,发现有一个 gpmgmt COM 对象,但我不明白如何将它用于我的目的,甚至可能的话。
谢谢你的帮助。
我正在寻找一种通过代码列出应用(链接和继承)到特定 OU 的所有 GPO 的方法。
我知道有一个属性表示链接的 GPO,称为 GPLink,但它只提供直接链接的 GPO。
我搜索了谷歌,发现有一个 gpmgmt COM 对象,但我不明白如何将它用于我的目的,甚至可能的话。
谢谢你的帮助。
我有以下子要分享。它不会列出 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 的每个父级,直到到达域头。