Как мне создать отчет Crystal, в котором перечислены члены групп Active Directory

#crystal-reports-2008

#crystal-reports-2008

Вопрос:

У меня есть задача автоматически отправлять по электронной почте отчет о том, кто входит в ряд групп в AD. Я хотел бы запланировать запуск отчета из Crystal Reports раз в месяц.

Я следовал инструкциям по созданию подключений OLE DB (ADO), и все подключается нормально.

В моем SQL-запросе я пытаюсь:

 SELECT member, descripton from 'LDAP://ou=blah,dc=blach,dc=blah' where  cn ='TheGroupName'
  

Crystal Reports позволяет этой команде работать. (конечно, с реальными параметрами сервера) 😉

Однако список участников пуст, а список описаний пуст. Если я добавлю DistinguishedName в SELECT, он вернется, поэтому я знаю, что он может получить атрибуты объекта.

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

Например:


Группа1

  • Джо
  • Джейн
  • Группа2
  • Группа3

Группа2

  • Ларри
  • Майкл

Группа3

  • Туан
  • Huyen

Я видел сообщение, в котором предлагается выполнить ldif для файла, а затем использовать CR для его анализа. Я бы хотел, чтобы этот отчет был максимально простым.

Возможно ли это вообще?

Спасибо, TT

Ответ №1:

ОК. Мне никто не ответил… НО я выяснил, как это сделать.

Что я сделал, так это написал сценарий Powershell (с модулями AD 2008) для создания XML-файла.

Затем я использую CR 2008 для загрузки из XML и форматирования его в красивый отчет.

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

 $theFile = new-object system.IO.StreamWriter("c:tempmyfile.xml")

$theFile.WriteLine('<?xml version="1.0" encoding="UTF-8"?>')
$theSuperGroupArray = @("SuperGroup1","SuperGroup2)
$theFile.WriteLine('<ADContentGroups>')
foreach ($aSuperGroup in $theSuperGroupArray) {
$strMembers = get-adgroupmember $aSuperGroup

# main element
$theFile.WriteLine('<ADGroup>')
$theFile.WriteLine('<ADSuperGroup>'   $aSuperGroup   '</ADSuperGroup>')
if($strMembers){

foreach($objitem in $strMembers){
    if($objitem.objectClass -ne "user") {
        $theFile.WriteLine("<ADGroupElement>")

    $theFile.WriteLine("<GroupName>"   $objitem.name   "</GroupName>" )
    $strNestedMembers = get-adgroupmember $objitem.name 
    foreach ($objNestedMembers in $strNestedMembers) {
        $theFile.WriteLine("<Member>"   $objNestedMembers.name   "</Member>")
    }
    $theFile.WriteLine("</ADGroupElement>")


}}}
$theFile.WriteLine('</ADGroup>')

}
$theFile.WriteLine('</ADContentGroups>')
$theFile.Close()