会議室の予約-SharePoint 2010とExchange 2010の統合

数週間前に、お客様から会議室の予約サービスを作成するタスクを受け取りました。 顧客の会社は、ITの面で大きく高度なものに満足しています。 顧客はロシア全土に多くの支店を持ち、各支店には5〜6の会議室があり、従業員はしばしば支店間で会議を開催するために飛びます。 そのため、従業員がモスクワの職場(トゥーラなど)から直接会話を「杭打ち」し、出張で明確な良心を持って会話をするのはよいことです。 このようなサービスを作成した経験をhabrosocietyと共有したいと考えています。



分析


お客様の会社には、Microsoft SharePoint 2010で作成された内部ポータルがあり、毎日約1,500人の従業員が使用していることがわかっています。 さらに、会社はExchangeを構成しています。



ご存知のように、Exchangeには既に会社のリソースを予約する機能があります。 この全体は、ルームメールボックスを使用して実装されます。 実際、各会議室には独自の住所があり、従業員はこの会議室で会議を計画する必要があります。 電子メールクライアントを使用している他のユーザーは、カレンダーに接続して、予定の日時を確認できます。 さらに、Outlook 2010にはRoom Finderの機能があります。



Exchangeのメールボックスについて詳しくは、 http://technet.microsoft.com/en-us/library/bb124952(v = exchg.141).aspxをご覧ください。



そしてここ-Room Finder'e http://support.microsoft.com/kb/2673231について



すべてがクールで快適なようです。 ただし、いくつかの欠点があります。まず、従業員にはOutlookが必要です。 第二に、部屋の説明は非常に貧弱です;リソース(ボード、会議システムなど)の説明を視覚的な形式で追加することはできません。



したがって、Exchangeの機能を失うことなく、SharePointのすべての視覚的表現をどのように取り出すことができるのかという考えが生まれました。 同時に、より少ないコードを書きたいと思いました。 しかし、実践が示しているように、それなしではできませんでした:)



一般的に、行こう!



SharePoint


サービスを作成するために、部門、会議室、会議室の予約という3つのリストを作成しました。



ユニットは都市のブランチです。



会議室は、次のような部屋とその特性を保存するためのリストです。



そして最後に、鎧のリスト:



リストがありますが、誰かがこれらのリストに記入する必要があるため、ユーザーをロールに分割しました。



UI


なぜなら 顧客のデザインがすでにポータルに取り込まれているため、デザイナーは少し作業をしなければなりませんでした。 彼らが非常にうまくやったこと:



1.ユーザーのホームページ:







2.別のリンクを使用して、部屋のリストに移動できます。 このリストには基本情報が表示されます。 部屋の名前をクリックすると、部屋に関する詳細情報が表示されます。







3.「オーディエンス検索」リンクには2週間のカレンダーが表示されます。 各セルには、部屋の予約者と時間を表示します。







4.「プラス記号」を個別にクリックすることにより、会議室を予約することができます。







実装


この美しさを実現するには、jsonを返すと同時にSharePointのコンテキストで機能するWCFサービスを作成する必要がありました。 この問題は、正しいweb.configおよびISAPIフォルダー内のSVCの存在によって解決されます。 jsonを送信するようにweb.configを適切に構成する方法について多くのことが書かれています。 たとえば、ここに:



http://www.codeproject.com/Articles/105273/Create-RESTful-WCF-Service-API-Step-By-Step-Guide



次に、いくつかのASPXページを作成し、モジュールに追加し、knockoutフレームワークを使用してjavascriptでWCFサービスを操作するロジック全体を実装しました。



Exchangeで発生した主な問題。 ほぼすべての必要な機能は、 EWSマネージAPIメソッドの呼び出しを通じて実装されます。 ただし、ルームのリストにアイテムを作成するときに、メールボックスを自動的に作成する必要がありました。



インターネットでは、メールボックスはpowershellを介してのみ作成でき、C#コードからコマンドを呼び出すことは原則的に問題ではないことがわかりました。



ルームのリストにイベントレシーバーを作成し、RunspaceおよびWSManConnectionInfoを使用してリモートサーバーでpowershellコマンドを呼び出そうとしました。 ただし、第一に、それは安全ではありません。第二に、接続中に拒否されたアクセスの問題のため、これを行うことに成功しませんでした。



その結果、別のWCFサービスを作成し、Exchangeを備えたサーバーに展開することにしました。 本質的に、このサービスにはメソッドが1つしかありません。



public void CreateRoom(ExchangeRoom Room) { RunspaceConfiguration runspaceConfig = RunspaceConfiguration.Create(); PSSnapInException snapEx = null; PSSnapInInfo psinfo = runspaceConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapEx); using (Runspace runSpace = RunspaceFactory.CreateRunspace(runspaceConfig)) { runSpace.Open(); if (!(MailBoxAlreadyExist(Room.Email, runSpace))) { Command createMailbox = new Command("New-Mailbox"); createMailbox.Parameters.Add("UserPrincipalName", Room.Email); createMailbox.Parameters.Add("Name", Room.Name); createMailbox.Parameters.Add("Room"); using (Pipeline pipeLine = runSpace.CreatePipeline()) { pipeLine.Commands.Add(createMailbox); pipeLine.Invoke(); } } else { throw new Exception("     "); } } }
      
      







上で書いたように、すべての作業ロジックはWCFサービスを介して実装されているため、Exchangeで部屋を予約する方法でサービスを補完することは論理的でした。 これを行うために、Exchangeで予約を作成するサービスメソッドを呼び出しました。 必要な情報はすべてMicrosoft.Exchange.Data.Appointmentに配置され、APIを使用してExchangeカレンダーに会議が作成されました。



 public static void CreateReservation(Reservation reservation) { InitService(); var appointment = new Appointment(service); appointment.Subject = "Meeting"; appointment.Start = new DateTime(reservation.Date.Year, reservation.Date.Month, reservation.Date.Day, reservation.FromTime, 0, 0); appointment.End = new DateTime(reservation.Date.Year, reservation.Date.Month, reservation.Date.Day, reservation.ToTime, 0, 0); string roomMailboxAddress = string.Format("room_{0}@{1}",reservation.RoomId, SharePointConstantString.MailDomain); appointment.Location = reservation.RoomName; appointment.Resources.Add(roomMailboxAddress); appointment.RequiredAttendees.Add(reservation.User.Email); appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy); }
      
      







「逆」同期の問題(つまり、カレンダーの従業員がOutlookで部屋を予約したとき)は、タイマージョブによって解決することが決定されました。 このジョブは、Exchangeからすべての情報を収集し、不足しているアーマーを作成し、キャンセルされたアーマーを削除しました。



合計


マイクロソフトテクノロジースタック上に構築され、包括的なソリューションのすべての利点を使用して、スケーラブルで柔軟なソリューションを取得できるようなアーキテクチャを作成しました。 システムはカスタマイズ可能で、標準のプラットフォームツールが付属しています。



今日は




All Articles