Как импортировать собрания в office365 (EWS и Powershell?)

Мне нужна помощь в импорте бронирований / встреч в office365. Я могу экспортировать информацию о бронировании из нашей старой веб-системы в CSV, но мне нужен способ импорта в обмен в office365.

Самый многообещающий метод, который я нашел, - это использование веб-служб Exchange для подключения к облаку с помощью PowerShell, а затем использование олицетворения для повторного создания заказов в качестве соответствующих пользователей для вновь созданных почтовых ящиков комнат. Но я открыт для других предложений, если есть лучший способ.

Проблема, с которой я сейчас сталкиваюсь с EWS и powershell (например: http://mikepfeiffer.net/2011/01/creating-calendar-items-with-powershell-and-the-ews-managed-api/), когда я пытаюсь подключиться, я получаю ошибки автообнаружения. Возможно ли это в Office 365?

Обновление: Привет, Глен Весы,

Благодарим вас за ваш пример, выглядит многообещающим, но я все еще получаю сообщение об ошибке автообнаружения, когда я запускаю ваш код выше, конкретную ошибку (ошибки) и описание того, что я делаю, шаг за шагом ниже. Я надеюсь, что делаю что-то явно не так, и вы сможете меня поправить

Я запускаю powershell и подключаюсь к o365 с такими учетными данными:

$loginUserName = "[email protected]"
$PWord = ConvertTo-SecureString –String "secret" –AsPlainText -Force
$Credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $loginUserName, $PWord
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $Credential -Authentication Basic -AllowRedirection
Import-PSSession $Session
Connect-MsolService -Credential $Credential

Затем загрузите вашу функцию и попробуйте такую ​​тестовую команду:

$Start = Get-Date
$End = (Get-Date).AddHours(1)

Create-Appointment -MailboxName [email protected] -Subject "Test appointment" -Start $Start -End $End -Body "Test Body" -Credentials $Credential -Location "sdfkjhsdfjh"

Ошибка:

Exception calling "AutodiscoverUrl" with "2" argument(s): "The Autodiscover service couldn't be located."
At \\blahblah\bookings.ps1:100 char:3
+         $service.AutodiscoverUrl($MailboxName,{$true})
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : AutodiscoverLocalException

Using CAS Server : 
Exception calling "Bind" with "2" argument(s): "The Url property on the ExchangeService object must be set."
At \\blahblah\bookings.ps1:114 char:3
+         $Calendar = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folde ...
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ServiceLocalException

Exception calling "Save" with "2" argument(s): "Value cannot be null.
Parameter name: destinationFolderId"
At \\blahblah\bookings.ps1:127 char:3
+         $Appointment.Save($Calendar.Id,[Microsoft.Exchange.WebServices.Data.SendInvita ...
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException

person Feragh    schedule 08.06.2015    source источник


Ответы (1)


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

####################### 
<# 
.SYNOPSIS 
 Create an Appointment from Commandline using Powershell and the Exchange Web Services API in a Mailbox in Exchange Online 
 
.DESCRIPTION 
  Create an Appointment from Commandline using Powershell and the Exchange Web Services API in a Mailbox in Exchange Online 
 
 Requires the EWS Managed API from https://www.microsoft.com/en-us/download/details.aspx?id=42951

.EXAMPLE
 PS C:\>Create-Appointment  -MailboxName [email protected] -Subject AppointmentName -Start (Get-Date) -End (Get-Date).AddHours(1) -Body "Test Body" -Credential (Get-Credential) -Location "Coffee Shop"

 This Example creates an appointment in a Mailboxes Calendar folder
#> 
function Create-Appointment 
{ 
    [CmdletBinding()] 
    param( 
    	[Parameter(Position=0, Mandatory=$true)] [string]$MailboxName,
 		[Parameter(Position=1, Mandatory=$true)] [string]$Subject,
		[Parameter(Position=2, Mandatory=$true)] [DateTime]$Start,
		[Parameter(Position=3, Mandatory=$true)] [DateTime]$End,
		[Parameter(Position=4, Mandatory=$true)] [string]$Location,
		[Parameter(Position=5, Mandatory=$true)] [string]$Body,
		[Parameter(Position=6, Mandatory=$true)] [PSCredential]$Credentials
    )  
 	Begin
		 {
		## Load Managed API dll  
		###CHECK FOR EWS MANAGED API, IF PRESENT IMPORT THE HIGHEST VERSION EWS DLL, ELSE EXIT
		$EWSDLL = (($(Get-ItemProperty -ErrorAction SilentlyContinue -Path Registry::$(Get-ChildItem -ErrorAction SilentlyContinue -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Exchange\Web Services'|Sort-Object Name -Descending| Select-Object -First 1 -ExpandProperty Name)).'Install Directory') + "Microsoft.Exchange.WebServices.dll")
		if (Test-Path $EWSDLL)
		    {
		    Import-Module $EWSDLL
		    }
		else
		    {
		    "$(get-date -format yyyyMMddHHmmss):"
		    "This script requires the EWS Managed API 1.2 or later."
		    "Please download and install the current version of the EWS Managed API from"
		    "http://go.microsoft.com/fwlink/?LinkId=255472"
		    ""
		    "Exiting Script."
		    exit
		    } 
  
		## Set Exchange Version  
		$ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2  
		  
		## Create Exchange Service Object  
		$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)  
		  
		## Set Credentials to use two options are availible Option1 to use explict credentials or Option 2 use the Default (logged On) credentials  
		  
		#Credentials Option 1 using UPN for the windows Account  
		#$psCred = Get-Credential  
		$creds = New-Object System.Net.NetworkCredential($Credentials.UserName.ToString(),$Credentials.GetNetworkCredential().password.ToString())  
		$service.Credentials = $creds      
		#Credentials Option 2  
		#service.UseDefaultCredentials = $true  
		  
		## Choose to ignore any SSL Warning issues caused by Self Signed Certificates  
		  
		## Code From http://poshcode.org/624
		## Create a compilation environment
		$Provider=New-Object Microsoft.CSharp.CSharpCodeProvider
		$Compiler=$Provider.CreateCompiler()
		$Params=New-Object System.CodeDom.Compiler.CompilerParameters
		$Params.GenerateExecutable=$False
		$Params.GenerateInMemory=$True
		$Params.IncludeDebugInformation=$False
		$Params.ReferencedAssemblies.Add("System.DLL") | Out-Null

$TASource=@'
  namespace Local.ToolkitExtensions.Net.CertificatePolicy{
    public class TrustAll : System.Net.ICertificatePolicy {
      public TrustAll() { 
      }
      public bool CheckValidationResult(System.Net.ServicePoint sp,
        System.Security.Cryptography.X509Certificates.X509Certificate cert, 
        System.Net.WebRequest req, int problem) {
        return true;
      }
    }
  }
'@ 
		$TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)
		$TAAssembly=$TAResults.CompiledAssembly

		## We now create an instance of the TrustAll and attach it to the ServicePointManager
		$TrustAll=$TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
		[System.Net.ServicePointManager]::CertificatePolicy=$TrustAll

		## end code from http://poshcode.org/624
		  
		## Set the URL of the CAS (Client Access Server) to use two options are availbe to use Autodiscover to find the CAS URL or Hardcode the CAS to use  
		  
		#CAS URL Option 1 Autodiscover  
		$service.AutodiscoverUrl($MailboxName,{$true})  
		"Using CAS Server : " + $Service.url   
		   
		#CAS URL Option 2 Hardcoded  
		  
		#$uri=[system.URI] "https://casservername/ews/exchange.asmx"  
		#$service.Url = $uri    
		  
		## Optional section for Exchange Impersonation  
		  
		#$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName) 

		# Bind to the Calendar Folder
		$folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$MailboxName)   
		$Calendar = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)
		$Appointment = New-Object Microsoft.Exchange.WebServices.Data.Appointment -ArgumentList $service  
		#Set Start Time  
		$Appointment.Start = $Start 
		#Set End Time  
		$Appointment.End = $End
		#Set Subject  
		$Appointment.Subject = $Subject
		#Set the Location  
		$Appointment.Location = $Location
		#Set any Notes  
		$Appointment.Body = $Body
		#Create Appointment will save to the default Calendar  
		$Appointment.Save($Calendar.Id,[Microsoft.Exchange.WebServices.Data.SendInvitationsMode]::SendToNone)  

	}
}

person Glen Scales    schedule 09.06.2015
comment
Привет, @Glen Scales, Спасибо за ответ, я отредактировал свой вопрос, чтобы добавить больше деталей. - person Feragh; 09.06.2015
comment
Есть ли у пользователя $ loginUserName = [email protected] почтовый ящик? например, можете ли вы войти в OWA с этой учетной записью. В приведенном мной примере просто используется делегирование, поэтому это будет означать, что [email protected] потребуются права на почтовый ящик [email protected]. Также действительно ли [email protected] существует в облаке? - person Glen Scales; 10.06.2015
comment
Вы также можете попробовать обойти автообнаружение, заменив строку $ service.AutodiscoverUrl ($ MailboxName, {$ true}) на $ uri = [system.URI] outlook.office365.com/EWS/Exchange.asmx $ service.Url = $ uri - person Glen Scales; 10.06.2015
comment
Привет, Глен! Ваш код очень помог, спасибо. Проблема автообнаружения оказалась связана с прокси-сервером, вызывающим проблемы. Теперь переходим к решению проблем с ошибкой часового пояса в $ assign.Save ([Microsoft.Exchange.WebServices.Data.SendInvitationsMode] :: SendToAllAndSaveCopy) Вызов исключения Сохранить с 1 аргументом (ами): невозможно преобразовать 2009-01-01T00: 00: 00.000 с (UTC + 08: 00) Перта до UTC. - person Feragh; 10.06.2015
comment
Для всех, кто смотрит, исправлено с помощью этого: $ standardDisplayName = (GMT + 08: 00) PPerth $ standardName = My Perth $ baseUtcOffset = New-TimeSpan -Hours 8 $ daylightDisplayName = [string] :: Empty $ AdjustRules = $ null $ disableDaylightSavingTime = $ false $ TZ = [TimeZoneInfo] :: CreateCustomTimeZone ($ standardName, $ baseUtcOffset, $ standardDisplayName, $ standardName, $ daylightDisplayName, $ AdjustRules, $ disableDaylightSavingTime) $ assign.StartTimeZone = $ TZ $ assign.EndTimeZone = $ TZ $ assign. - person Feragh; 10.06.2015