none
Выгрузка содержимого определенной папки в csv RRS feed

  • Вопрос

  • Доброго времени суток.

    Задача простая, нужно выгрузить содержимое папки "Сервисные сообщения" в корне почтового ящика tst@org1.ru в csv файл, в формате   dateTimeMessage, msgFrom, msgTo, msgSubject

    Как это лучше реализовать через PowerShell?, Search-Mailbox не получилось, в логе нет адреса получателя да и всего 10000 сообщений нашлось из 40000

Все ответы

  • Через PowerShell то, что касается доступа к содержимому п/я, лучше всего делать через Exchange Web Services (EWS). К сожалению, официальная документация по EWS - она написана для программистов на .NET, с описаниями классов, методов и примерами программирования на C#. Из PowerShell все нужные объекты отлично создаются а методы отлично вызываются (в частности, лично я делал скрипты с использованием EWS). Но вот разбираться, как это делается, придется самостоятельно (ну, или много гуглить).

    PS Из неочевидного. Если нужен доступ к большому количеству разных п/я, то лучше всего назначить через RBAC учетной записи, используемой  для доступа, роль ApplicationImpersonation - это IMHO проще, чем давать доступ к большому количеству п/я.


    Слава России!

  • Нашел код

    $EWS_lib = $Env:ProgramFiles + "\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
    [void][Reflection.Assembly]::LoadFile($EWS_lib)
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1)
    $service.UseDefaultCredentials = $true
    $service.Url = new-object Uri("https://exchange.contoso.com/EWS/Exchange.asmx")

    А у меня нет Microsoft\Exchange\Web Services\2.2\

    Его нужно устанавливать на сервер или на рабочую станцию?

    И подойдет ли обычная оболочка  PowerShell с выполненной командой

    $session = New-PSSession -ConfigurationName Microsoft.Exchange -SessionOption (New-PSSessionOption -Culture "en-Us") -ConnectionUri http://mbx01/Powershell -Authentication Kerberos

    Import-PSSession $Session

    ?

  • Библиотеку EWS Managed API надо устанавливать на тот компьютер, где будет выполняться скрипт: она реализует клиентскую часть протокола Exchange Web Services, а сервер Exchange поддерживает серверную часть этого протокола "из коробки", безо всяких дополнительных компонентов.

    Скрипт для работы с EWS Managed API можно запускать в обычной локальной сессии PowerShell (если он, конечно, не использует командлеты управления Exchange Server).


    Слава России!

  • Разобрался с библиотекой EWS Managed API    и скрипт работает, но почему-то он выгружает только Входящие и Отправленные, а содержимое остальных папок не видит.

            $itemview = New-object Microsoft.Exchange.WebServices.Data.ItemView(20000)
            $searchFilterCollection = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::or)
            $searchFilter1 = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.ContactSchema]::ItemClass,"IPM.Note")
            $searchFilterCollection.add($searchFilter1)
            $fiItems=$null
            Write-Host $folder.DisplayName":"
            $objz = @()
          do
            {
                $itemview.Offset += $fiItems.Items.Count
                $fiItems = $folder.FindItems($searchFilter1,$itemview)
                $items= $fiItems.Items   

                foreach($Item in $items)
                {
              $propz=@{
                        Date =  $Item.DateTimeReceived
                        From =  $Item.From.Address
                        To   =  $Item.To.Address
                        Subj =  $Item.Subject
                      }
                               $obj =  New-Object PsObject -Property $propz
            Write-Host "Date: "$obj.Date" From: "$obj.From" To: "$obj.From" Subj: "$obj.Subj


                               $objz += $obj
                }
            }
           while($fiItems.MoreAvailable -eq $true)

    #$objz | Export-Csv -NoClobber -Delimiter ";" -NoTypeInformation -Encoding Default -Path D:\List_fldrs_service_msg.csv
    $objz | Select Date,  From, To, Subj  | sort Date  -descending | Out-GridView

  • Как получить доступ ко всем папкам Мэйлбокса?

    В группу ApplicationImpersonation пользователя, от имени которого запускается скрипт включил.

  • Остальные папки - это какие? Если вложенные во Входящие или Отправленные, и содержащие сообщения, то тогда странно. Тогда надо смотреть код, которым вы делаете привязку к этим папкам (получаете значение переменной $folder, в вашем отрывке этого кода нет). Если - те, которые определены на верхнем уровне - Календарь и т.п. - то в них элементы имеют другой тип, а не IPM.Note, по которому вы фильтруете, поэтому они в результат не попадают.


    Слава России!



    • Изменено M.V.V. _ 6 мая 2020 г. 17:16
  • Нет, не календарь, в корне почтового ящика создал папку "Сервисные сообщения", в него падают сообщения о недоставке и подобные, в этой папке сейчас 10 сообщений но скрипт показывает пусто.

    И еще, не работает метод $Item.ToRecipients.Address, пустые значения у всех , не могу получить адрес куда, хотя в сообщениях он есть. Может я ошибся в синтаксисе, как правильно получить поле Кому?


  • Верхние два отображает, остальные нет.

  • И вправду, перекинул письмо из входящих в Сервисные сообщения и оно нашлось.

    IPM.Report не подошло, а как указать IPM.* любой тип сообщений?


  • И вправду, перекинул письмо из входящих в Сервисные сообщения и оно нашлось.

    IPM.Report не подошло, а как указать IPM.* любой тип сообщений?


    Попробуйте считать все сообщения из папки, без фильтра:

    $fiItems = $folder.FindItems($itemview)


    Слава России!

  • сработало с таким фильтром "REPORT.IPM.Note.NDR", вытащил его из выгрузки сообщений в pst

    Странно, почему его не было в документации.

    Ладно, с этим понятно, теперь по выгрузке, в папке 33 тысячи сообщений, выгрузка идет очень долго, уже почти 40 минут, это нормально для такого объема?

    И самое главное, какой параметр нужно использовать для выгрузки реципиентов ( To: ) ?

  • И еще вопрос, а можно ли работать с выгруженным mailbox в pst файл?

    Есть ли возможноть осуществлять поиск непосредственно из pst-файла?

    Или pst нужно обязательно импортировать в mailbox?