Powershell: как получить расширения файлов вложений общих папок

Интересно, есть ли способ получить расширение файла из вложения общей папки?

Backgroud: мы используем программное обеспечение (AttachmentsProcessor), которое извлекает все вложения из электронных писем в структуре общих папок и сохраняет их в файловой системе. Программное обеспечение помещает.lnk в электронное письмо, которое указывает на местоположение в файловой системе. Таким образом, мы можем открыть вложение двойным щелчком мыши.

В последнее время мы переместили нашу структуру общих папок из внутреннего Exchange в Office365 / Exchange Online. В ходе этого процесса мы попытались поместить все извлеченные вложения обратно в электронные письма. После того, как мы сделали некоторые тесты, мы заметили, что это не работает для некоторых электронных писем. У нас все еще есть.lnk в качестве вложения.

Так что я ищу? Я хотел бы написать скрипт на powershell, который показывает мне список всех электронных писем и соответствующих папок (Identites), к которым прикреплен файл.lnk.

В моем поиске я только что нашел что-то, что работает для почтовых ящиков, но ничего для общих папок.

-> Get-Mailbox | Export-Mailbox -AttachmentFilenames "*.PDF"

-> Get-Mailbox | New-MailboxExportRequest -ContentFilter {Attachment-like "*.PDF"}

Любая помощь будет очень хорошей.;-)

Спасибо за внимание Питер

1 ответ

Я не могу открыто написать весь код для вас. Но у меня есть кое-что, с чего можно начать. Этот скрипт рекурсивно просматривает ваши общие папки и находит элементы с вложениями. Последний фрагмент кода внутри цикла в настоящее время сохраняет файлы на диск, но здесь вы можете заменить это некоторой логикой, чтобы сделать то, что вам нужно (например, фильтрация по вложению, извлечение информации о ссылке и т. Д.).

$TargetDirectory = "C:\temp\PublicFolders"

function process-folders-recursive($folder, $path) {
    if($folder.DefaultMessageClass -ne "IPM.Appointment" -and $folder.DefaultMessageClass -ne "IPM.Contact")
    {
        $path = (Join-Path $path $folder.name)
        write-host $folder.class $path
        if($folder.Items.Count -gt 0 ){
            foreach($item in $folder.Items){
              if($item.MessageClass -ne "IPM.Appointment")
              {
                #Write-Host $item.name
                if($item.Attachments.Count -gt 0 ) {
                    if(!(Test-Path -path $path)){
                        New-Item -ItemType directory -Path $path
                    }
                    foreach($attch in $item.Attachments){
                        try
                            {
                            Write-Host $attch.FileName
                            $fileName = $attch.FileName
                            $fileNameAndPath = (Join-Path $path $fileName)
                            $attch.saveasfile($fileNameAndPath)
                        }
                        catch [System.Exception]
                        {
                            Write-Host $path $fileName # $_.Exception.ToString()
                        }
                    }
                  }
                }
            }
        }
        $folder.Folders | ForEach { process-folders-recursive $_ $path}  
   }
}

$objOutlook = New-Object -comobject outlook.application
$objNamespace = $objOutlook.GetNamespace(“MAPI”)

#Get Outlook folder with name Public Folders
$publicFolders  = $objNamespace.Folders | Where { $_.name.StartsWith("Public Folders") } | Select -f 1

#Go into the "All Public Folders" folder
$AllPublicFolders = $publicFolders.Folders | Where { $_.name -eq "All Public Folders" } | Select -f 1

#Recurse through the Public Folders
process-folders-recursive $AllPublicFolders $TargetDirectory
Другие вопросы по тегам