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