1

使用: EWS 1.1、Exchange サーバー 2010 SP1、VB.Net

EWS を使用して、Windows サービスを介して社内の 2000 人を超えるユーザーの予定を作成しています。ユーザーが自社のエンタープライズ アプリケーションで予定を作成または更新するときに、ユーザーの予定を作成または更新する Windows サービスを開発しました。Windows サービスがインストールされており、このサービスは、Exchange サーバー 2010 での偽装権限を持つサービス アカウントによって開始されます。このサービスは、DLL を呼び出して、Exchange でユーザーの予定を作成または更新します。

  1. バージョン Exchange2010_SP1 で ExchangeService を初期化する
  2. UseDefaultCredentials=True (ログインしたユーザーは偽装権限を持っています)
  3. ImpersonatedUserId を使用して、カレンダーの予定を作成するユーザーを偽装する
  4. Appointment オブジェクトを初期化します (予定 = new Microsoft.Exchange.WebServices.Data.Appointment)
  5. Appointment オブジェクトに値を入力します (たとえば、プロパティ Start、End、IsAllDayEvent、Body、Sensitivity、Subject、Location など)。
  6. Appointment.Save(WellKnownFolderName.Calendar, SendInvitationsMode.SendToNone) で予定を作成します。
  7. ユーザーがエンタープライズ アプリケーションで予定を更新するときは、Appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone) を使用します。

いくつかのコード スニペットを次に示します。

Try
    'Initialize the Exchange service
    exchangeService = New ExchangeService(ExchangeVersion.Exchange2010_SP1)
    impersonationContext = CType(System.Web.HttpContext.Current.User.Identity, System.Security.Principal.WindowsIdentity).Impersonate

    exchangeService.UseDefaultCredentials = True
    exchangeService.ImpersonatedUserId = New ImpersonatedUserId(ConnectingIdType.SmtpAddress, "user1@domain.com")

    System.Net.ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf ValidateCertificate)

    exchangeService.Url = New Uri("https://server/ews/Exchange.asmx")

    'Create or Update appointment
    If newAppointment Then
        appointment = New Appointment(exchangeService)
    Else
        appointment = Appointment.Bind(exchangeService, New ItemId(appointmentId))
    End If

    With appointment
        .Subject = *subject*
        .Start = *start date*
        .End = *end date*
        .Body = *msgbody*
        .Location = *location*

        If newAppointment Then
            .Save(WellKnownFolderName.Calendar, SendInvitationsMode.SendToNone)
        Else
            .Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone)
        End If
    End With
Catch ex As Exception
    'Throw exception here
Finally
    If Not impersonationContext Is Nothing Then
        impersonationContext.Undo()
    End If
End Try

これがWindowsサービスから呼び出されると、現在のWindowsIdentityがIIS AppPoolであるため、なりすましが発生するため、交換サービスを初期化して予定を作成/更新する前に、サービスアカウントを偽装する必要があります。

予定を作成または更新する必要があるたびに、新しい交換サービスが作成されます。

ほとんどの場合、プロセスはうまくいきましたが、理由と原因がわからない ServiceRequestException が発生することがあります。

Microsoft.Exchange.WebServices.Data.ServiceRequestException: 要求が失敗しました。基になる接続が閉じられました: 送信時に予期しないエラーが発生しました。---> System.Net.WebException: 基になる接続が閉じられました: 送信時に予期しないエラーが発生しました。---> System.ObjectDisposedException: Safe handle has been closed at System.Security.Principal.Win32.ImpersonateLoggedOnUser(SafeTokenHandle hToken) at System.Security.Principal.WindowsIdentity.SafeImpersonate(SafeTokenHandle userToken, WindowsIdentity wi, StackCrawlMark& stackMark) at System. Security.Principal.WindowsIdentity.Impersonate(StackCrawlMark& stackMark) で System.Security.SecurityContext.SetSecurityContext(SecurityContext sc, SecurityContext prevSecurityContext, StackCrawlMark& stackMark) で System.Threading.ExecutionContext.

4

0 に答える 0