2012-05-10 5 views
0

Я ищу способ перечислить все примененные GPO (связанные и унаследованные) к определенному OU через код.Как перечислить все объекты групповой политики, применяемые к включенным унаследованным OU (C#)

Я знаю, что есть атрибут, связанный с объектами GPO, называемыми GPLink, но он дает только прямые ссылки.

Я искал google и обнаружил, что есть COM-объект gpmgmt, но я не мог понять, как использовать его для моих целей, и если это возможно.

Спасибо за любую помощь.

ответ

0

Вам нужно будет итератировать вверх через каждого родителя данного подразделения, пока не дойдете до главы домена.

1

У меня есть следующее подразделение для обмена. Он не перечисляет имена объектов групповой политики, но возвращает счетчик. Небольшой мод позволит вам получить имена (проверьте свойства GPOLink в цикле foreach). Вам нужно будет установить 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();    
    }