[お詫び] 12/18 Up 分 Galsync 置換についての記事について + 例外の見分け方
いつもお世話になっております。ILM チームです。
本日は一点皆様にお詫びを申し上げなくてはなりません。
先日 2008 年 12 月 24 日にお伝えしました記事について訂正事項がございます。
元記事は既に内容を修正した版を先ほどアップロードしなおしましたが、一言皆様にお詫びをお伝えしたく、本コラムを書いております。本当に申し訳ございません。
対象記事 URL (修正済み)
https://blogs.technet.com/jpilmblg/archive/2008/12/18/ilm2007-fp1-galsync-dll.aspx
端的に言えば、以下の通りとなります。
・ILM2007 RTM ⇒ ILM2007 FP1 パッケージを適用する過程では Galsync.dll は置き換えられない (※)
・ILM2007 FP1 用ロールアップ パッケージを適用すると、Galsync.dll は置き換えられる
(※) この場合 UnexpectedDataException例外がスローされる場合があります。
ILM2007 FP1 CD に付属の Galsync.dllに置き換えることにより、例外が解消される場合があります。これは、Galsync.dll が ILM2007 FP1 用のものではなく、ILM2007 RTM 版のもののままの場合に発生することがあります。
ILM2007 FP1 では、Galsync.dll に関係する処理の機能拡張が行われておりますが、RTM 版付属の Galsync.dll はこれらの機能拡張に対応したロジックが存在しない不整合性に起因し発生するエラーです。
もし、お手元の環境で発生する場合、上記不整合性に合致した問題かは下記の手段で見分けることができます。
【不整合問題にご自分の環境が合致しているかを見分ける方法】
Galsync.dll については、製品をインストール後に修正が行えるよう、プログラムコードが公開されておりますため、お客様のお手元でも同様の確認が可能です。
1.Error Information の Call Stack を見る
以下実際の問題発生時の Callstack例です。
Microsoft.MetaDirectoryServices.UnexpectedDataException: Unhandled flow rule name in MapAttributesForExport called with entry CS <CS名 > contact CN=<CN 名 >,OU=<OU名 >,DC=<DC名 >… and flow rule name msExchMasterAccountSidMappingForwards
場所
Microsoft. MetaDirectoryServices.GALSync.Synchronizer.LogAndThrowUnexpectedDataException(String ExceptionString)
場所
Microsoft. MetaDirectoryServices.GALSync.Synchronizer.MapAttributesForExport(String FlowRuleName, MVEntry mventry, CSEntry csentry) …
( 以下略 )
2. 手元の環境のGalsync.dll のソース (Galma.vb) をみる
次にご自分の環境の Galsync.dll のソースをごらんください。
コード中の、Public Sub MapAttributesForExport() の箇所をみてみます。Case "msExchMasterAccountSidMappingForwards" のように分岐があるか見てください。以下の RTM のソースだと分岐がないことがわかります。分岐がないと、すべて Case Else に行ってしまいます。Case Else には LogAndThrowUnexpectedDataException に行くよう記述されていますので、今回のスタック トレースに表示されている処理の流れと処理の流れが合致しますので、今回の問題が Case 文に msExchMasterAccountSidMappingForwards が存在しないことに起因すると判断できます。
GALMA.vb ( ILM2007 RTM に添付されているもの )
Public Sub MapAttributesForExport( _
ByVal FlowRuleName As String, _
ByVal mventry As MVEntry, _
ByVal csentry As CSEntry) _
Implements IMASynchronization.MapAttributesForExport
(… 以下略 …)
Select Case FlowRuleName
Case "ProxyAddressesMappingForwards"
EAFProxyAddressesForwards(csentry, mventry)
Case "ProxyAddressesMappingBackwards"
EAFProxyAddressesBackwards(csentry, mventry)
Case "LcsProxyAddressesMappingForwards"
EAFLcsProxyAddressesForwards(csentry, mventry)
Case "LcsProxyAddressesMappingBackwards"
EAFLcsProxyAddressesBackwards(csentry, mventry)
Case Else ' (★)
LogAndThrowUnexpectedDataException( _
"Unhandled flow rule name in MapAttributesForExport " _
& "called with entry " & csentry.ToString _
& " and flow rule name " & FlowRuleName)
End Select
上記の通り、今回のエラーは、msExchMasterAccountSidMappingForwads 時のエラーとなります。つまりGalsync.dll のコード中の Select Case 文において、 [Case "msExchMasterAccountHistoryMappingForwards"] というように、msExchMasterAccountSidMappingForwads がトラップされないため全て Case Else (' (★) の箇所) に流れ、LogAndThrowUnexpectedDataExceptionになるということがわかります。
3.ILM2007FP1 付属の Galma.vb を見てみる
一方、ILM2007 FP1 付属コードの該当処理を見てみますと、MapAttributesForExport メソッドに違いがあることがわかります。端的に言えば、Case **文に条件が追加されている**ということです。
GALMA.vb ( ILM2007 FP1 に添付されているもの )
Public Sub MapAttributesForExport( _
ByVal FlowRuleName As String, _
ByVal mventry As MVEntry, _
ByVal csentry As CSEntry) _
Implements IMASynchronization.MapAttributesForExport
(… 以下略 …)
Select Case FlowRuleName
Case "ProxyAddressesMappingForwards"
EAFProxyAddressesForwards(csentry, mventry)
Case "ProxyAddressesMappingBackwards"
EAFProxyAddressesBackwards(csentry, mventry)
Case "LcsProxyAddressesMappingForwards"
EAFLcsProxyAddressesForwards(csentry, mventry)
Case "LcsProxyAddressesMappingBackwards"
EAFLcsProxyAddressesBackwards(csentry, mventry)
Case "msExchMasterAccountSidMappingForwards" '(★)
EAFmsExchMasterAccountSidForwards(csentry, mventry)
Case "msExchRecipientDisplayTypeMappingForwards"
EAFmsExchRecipientDisplayTypeForwards(csentry, mventry)
Case "msExchMasterAccountHistoryMappingForwards"
EAFmsExchMasterAccountHistoryForwards(csentry, mventry)
Case Else
LogAndThrowUnexpectedDataException( _
"Unhandled flow rule name in MapAttributesForExport " _
& "called with entry " & csentry.ToString _
& " and flow rule name " & FlowRuleName)
End Select
FlowRuleName のデータの内容により分岐を同様に行いますが、'(★) にあるように、[Case "msExchMasterAccountHistoryMappingForwards"] が増えていますため、正常に処理が EAFmsExchMasterAccountSidForwards(csentry, mventry) にながれ、例外は発生しません。
この場合は、Galsync.dll を ILM2007 FP1 のものに置き換えることにより、正常な
動作となります。自身で Galsync.dll を拡張されているお客様も、MapAttributesForExport () の Case 文を確認してみてください。