Импорт календарей ICS через Exchange EWS API и powershell

Я перевожу почтовые аккаунты из zimbra на exchange 2016. Почта и контакты не являются большой проблемой и могут быть выполнены с помощью простых скриптов.

Однако календари представляют собой небольшую проблему, когда я хочу импортировать их через скрипт. Интерфейс Exchange OWA позволяет импортировать календарь из файла. Если каждый пользователь импортирует свой собственный календарь из файла.ics, импорт работает почти идеально. Однако импорт большого количества календарей через веб-интерфейс не является жизнеспособным вариантом.

Поэтому я написал сценарий powershell, который анализирует файлы ics и импортирует все события календаря через EWS API. Проблема, которая возникает, заключается в том, что для каждого события владелец почтового ящика будет назначен организатором события (этого не происходит при импорте через веб-интерфейс).

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

Есть ли способ использовать функцию импорта веб-интерфейса из CLI или через скрипт? Или, может быть, есть способ установить переменную органайзера?

Вот сценарий, который я написал.

заранее спасибо

$EWSManagedApiPath = "C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll"
if (!(Get-Item -Path $EWSManagedApiPath -ErrorAction SilentlyContinue))
{
    throw "EWS Managed API could not be found at $($EWSManagedApiPath)."
}
[void][Reflection.Assembly]::LoadFile($EWSManagedApiPath)

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$logfile = $scriptPath + '\importAllIcsCalendars.log'
if(Test-Path $logfile) {
    # logfile exists
} else {
    $null = New-Item $logfile -type file -force
}

function LogWrite {
    Param ([string]$logString)

    Add-content $logfile -value "$logString"
}

$Username = "USER"
$Password = "PASSWD"
$EwsUrl = "https://exchange.domain.com/ews/exchange.asmx"

Copy-Item \\host\zimbra\*.ics \\host\zimbra\ICS
$ICSpath="\\host\zimbra\ICS"
$ICSlist = get-childitem $ICSPath

$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016)
$service.Credentials = New-Object  Microsoft.Exchange.WebServices.Data.WebCredentials($Username,$Password)
$service.URL = New-Object Uri($EwsUrl)
$CalendarFolder = [Microsoft.Exchange.WebServices.Data.CalendarFolder]::Bind($service, [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar)

#LogWrite ('User: ' + $EmailAddress) 
#Write-Host $EmailAddress

#Read ICS Files
Foreach ($i in $ICSList) {
    $filename= $i.Name
    $EmailAddress = $filename.Split("##")[0]
    $Address = $EmailAddress + "@domain.com"
    $CalendarName = $filename.Split("##")[2]
    $CalendarName = $CalendarName.substring(0,$CalendarName.ToString().Length-4)
    #$service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $Address)

    $FullName = $i.FullName
    $j = Get-Content $FullName



    #Read VCAL Prefix
    Foreach ($line in $j ){
        if ($flag) {
            $calbegin = $calbegin + $line + "`r`n"
            #Write-Host $line
        }
        switch ($line) {
            "BEGIN:VCALENDAR" {
                $flag = $true
                $calbegin = "BEGIN:VCALENDAR`r`n"
            }
            "BEGIN:VEVENT" {
                $flag = $false
                break
            }
        }
    }
    #Write-Host "======================================="

    $flag = $false
    $organizer = ""

    Foreach ($line in $j ){

        if ($flag) {
            $calEvent = $calEvent + $line + "`r`n"
            #Write-Host $line
        }
        if ($line -eq "BEGIN:VEVENT" ) {
            $flag = $true
            #Write-Host $line + "BEGIN #############"
        }
        if ($line -match "ORGANIZER;\.*"){
            #Write-Host "Organizer: " $line
            $organizer = $line.Split(";")[1]
            #Write-Host "cut "$organizer
        }
        if ($line -eq "END:VEVENT" ) {
            $flag = $false
            $calEvent = $calEvent + "END:VCALENDAR" 

            $enc = [system.Text.Encoding]::UTF8
            $data1 = $enc.GetBytes($calEvent) 

            #Write-Host $calEvent
            #LogWrite ($calEvent)
            #Logwrite ("################################")

            $Appointment = New-Object Microsoft.Exchange.WebServices.Data.Appointment($service)
            $Appointment.MimeContent = New-Object Microsoft.Exchange.WebServices.Data.MimeContent("UTF-8", $data1)
            #$Appointment.Organizer = $organizer
            $Appointment.Save([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar)

            Write-Host $calEvent

            $calEvent = $calbegin
            Write-Host "####################"
        }
    }
    $calbegin = ""
}

0 ответов

Другие вопросы по тегам