たちまち。

即席で役に立つこと。

Dynamics365のPluginRegistrationToolで接続時にエラー

対象バージョン:Dynamics365(9.0)

以下のエラーが発生する。

Source   : mscorlib
Method  : HandleReturnMessage
Date    : 2020/08/25
Time    : 14:15:45
Error   : セキュリティで保護されていないか正しくセキュリティで保護されていないフォールトを相手側から受信しました。フォールト コードおよび詳細については、内部の FaultException を参照してください。
Stack Trace : Server stack trace: 
   場所 System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout)
   場所 System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
   場所 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   場所 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   場所 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   場所 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   場所 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   場所 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   場所 Microsoft.Xrm.Sdk.Discovery.IDiscoveryService.Execute(DiscoveryRequest request)
   場所 Microsoft.Xrm.Sdk.Client.DiscoveryServiceProxy.Execute(DiscoveryRequest request)
   場所 Microsoft.Xrm.Tooling.Connector.CrmWebSvc.DiscoverOrganizations(Uri discoveryServiceUri, Uri homeRealmUri, ClientCredentials clientCredentials, ClientCredentials deviceCredentials, CrmLogEntry logSink)
   場所 Microsoft.Xrm.Tooling.Connector.CrmWebSvc.DiscoverOrganizations(Uri discoveryServiceUri, Uri homeRealmUri, NetworkCredential networkCredential, CrmLogEntry logSink)
   場所 Microsoft.Xrm.Tooling.Connector.CrmServiceClient.DiscoverOrganizations(Uri discoveryServiceUri, Uri homeRealmUri, NetworkCredential networkCredential)
   場所 Microsoft.Xrm.Tooling.CrmConnectControl.CrmConnectionManager.ValidateServerConnection(CrmOrgByServer selectedOrg)
======================================================================================================================
Inner Exception Level 1 : 
Source  : Not Provided
Method  : Not Provided
Date    : 2020/08/25
Time    : 14:15:45
Error   : メッセージのセキュリティを検証しているときにエラーが発生しました。
Stack Trace : Not Provided
======================================================================================================================

解決方法

原因は、ツールを実行しているPCとサーバ側の時刻が合っていないこと。

もしくは、ツールをサーバ側に配置して実行するという手もあるぞ。

DynamicsCRM2015(7.0)からDynamics365(9.0)へアップグレードする方法(オンプレミス)

なかなかに手こずったのでここに経緯と解決を記しておく。

まず、前提としてCRMのアップグレード方法は以下の通りである。

CRMのアップグレード方法

  1. 旧verの組織DBをSQLServerバックアップ
  2. それを新verのSQLServerにリストア
  3. 新verの展開マネージャーにて組織のインポートを実行し、先ほどのDBを指定

この組織インポート時にて古いバージョンの組織DBを入れた場合、CRMが内部で自動的にアップグレードしてくれる。

しかし。

7.0のDBを9.0に持って行って組織インポートを行っても、サポートされないバージョンだと言われてしまう。

一段飛ばしができないため、一度8.2を経由する必要があるのだ。

つまり、7.0から9.0に上げたい場合の手順は以下のようになる。

7.0から9.0へのアップグレード手順

  1. 7.0(現行)、9.0(移行先)、8.2(一時的)の3つのDynamics環境を用意する
  2. 7.0の組織DBをSQLServerバックアップ
  3. それを8.2のSQLServerにリストア
  4. 8.2の展開マネージャーにて組織のインポートを実行
  5. アップグレードされた8.2の組織DBをSQLServerバックアップ
  6. それを9.0のSQLServerにリストア
  7. 9.0の展開マネージャーにて組織のインポートを実行

これでうまくいくのだが、ポイントが1つ。

それはMicrosoft公式ドキュメントにも書いてあるのだが、更新プログラムは最新を適用しようね、ということ。

7.0も、8.2も、9.0も、最新の更新プログラムを適用しておく必要がある。

↓7.0の更新プログラム

https://support.microsoft.com/ja-jp/help/3018363/microsoft-dynamics-crm-2015-updates-and-hotfixes

↓8.0,8.1,8.2および9.0の更新プログラム

https://support.microsoft.com/ja-jp/help/3142345/microsoft-dynamics-365-onpremise-cumulative-updates

また、もし更新プログラムが未適用の状態でアップグレード(組織のインポート)に失敗した場合、

一度展開マネージャーにて該当の組織を削除、さらにSQLServer上の組織DBも削除して、再度旧バージョンのバックアップをインポートした後に

更新プログラムを適用し、改めて組織のインポートが必要になので注意されたし。

以上。

ActiveDirectoryのユーザを移行する方法(要点のみ)

今回DynamicsCRMのアップデートに必要であったので、ADのユーザを移行する方法についてメモ。

1. 移行元のADにてコマンドプロンプトを起動
2. 次のコマンドを実行
csvde -f user.csv
3. 生成したcsvファイルをExcelで開く
4. フィルタや列削除を利用して次の通りに整形する
  1. objectclassが「user」の行だけにする(ヘッダは残す)

  2. 次の列だけにして他は削除する  DN,objectClass,userAccountControl,sAMAccountName,userPrincipalName

  3. DN列、およびDC=~のドメイン名を全て新ドメイン名に変更

5. 整形したらcsv形式のまま保存する
6. 移行先のADにcsvファイルをコピー
7. コマンドプロンプトを管理者実行で起動する
8. csvを配置したディレクトリに移動し、次のコマンドを実行
csvde -i -f user.csv

・ワンポイント

重複ユーザを除外する場合は、「-k」オプションを追加する。

参考: Csvde | Microsoft Docs

以上。

Dynamics365 8.2から9へのアップグレードでFileNotFoundExceptionエラー

とあるDynamics365の8.2のDBを9.0へアップグレードしようとした(具体的には8.2の組織DBダンプを9.0用のSQLServerに入れ、展開マネージャーで組織のインポートをした)ところ、以下のようなエラーが発生。

14:10:34|  Error| ID=fc04d08f-5b1e-e711-80c4-000c29026f03 の組織のアップグレードが次の例外で失敗しました:
System.Exception: Error.ActionFailed Microsoft.Crm.Tools.Admin.UpgradeDatabaseAction ---> Microsoft.Crm.CrmException: Error in Action: Bin\Microsoft.Crm.DataUpgrade.dll:TrackCustomDatabaseObjects on attempt 3. System.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。 ---> System.IO.FileNotFoundException: ファイルまたはアセンブリ 'Microsoft.SqlServer.ConnectionInfo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
   場所 Microsoft.Crm.DataUpgrade.DatabaseObjectChangeTracker.GenerateScriptForIndex(String tableName, String indexName, ISqlExecutionContext sqlContext)
   場所 Microsoft.Crm.DataUpgrade.DatabaseObjectChangeTracker.InsertObjectTrackerTableInput(List`1 inputData, String tableName, ISqlExecutionContext sqlContext)
   場所 Microsoft.Crm.DataUpgrade.DatabaseChangeTracker.TrackCustomDatabaseObjects()
   --- 内部例外スタック トレースの終わり ---
   場所 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   場所 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   場所 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
   場所 Microsoft.Crm.Setup.Database.DllMethodAction.Execute(Guid organizationId, Nullable`1 operationType)
   場所 Microsoft.Crm.Setup.Database.DllMethodAction.Execute(Guid organizationId)
   場所 Microsoft.Crm.Setup.Database.DatabaseInstaller.<>c__DisplayClass85_1.<ExecuteReleases>b__0()
   場所 Microsoft.Crm.Setup.Database.DatabaseInstaller.<>c__DisplayClass85_1.<ExecuteReleases>b__0()
   場所 Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute(ILogger logger, EventId eventId, ActivityType activityType, Action action)
   場所 Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute(ILogger logger, XrmTelemetryActivityType activityType, Action action)
   場所 Microsoft.Crm.Setup.Database.DatabaseInstaller.ExecuteReleases(ReleaseInfo releaseInfo, Boolean isInstall)
   場所 Microsoft.Crm.Setup.Database.DatabaseInstaller.installInternal(Boolean isInstall, Int32 languageCode)
   場所 Microsoft.Crm.Setup.Database.DatabaseInstaller.<>c__DisplayClass92_0.<Install>b__0()
   場所 Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute(ILogger logger, EventId eventId, ActivityType activityType, Action action)
   場所 Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute(ILogger logger, XrmTelemetryActivityType activityType, Action action)
   場所 Microsoft.Crm.Setup.Database.DatabaseInstaller.<>c__DisplayClass93_0.<Install>b__0()
   場所 Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute(ILogger logger, EventId eventId, ActivityType activityType, Action action)
   場所 Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute(ILogger logger, XrmTelemetryActivityType activityType, Action action)
   場所 Microsoft.Crm.Tools.Admin.InstallDatabaseAction.Do(IDictionary parameters)
   場所 Microsoft.Crm.Setup.Shared.CrmAction.ExecuteActionHelper(CrmAction action, IDictionary parameters, Boolean undo)
   --- 内部例外スタック トレースの終わり ---
   場所 Microsoft.Crm.Setup.Shared.CrmAction.ExecuteActionHelper(CrmAction action, IDictionary parameters, Boolean undo)
   場所 Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute(ILogger logger, EventId eventId, ActivityType activityType, Action action)
   場所 Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute(ILogger logger, XrmTelemetryActivityType activityType, Action action)
   場所 Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute(ILogger logger, EventId eventId, ActivityType activityType, Action action)
   場所 Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute(ILogger logger, XrmTelemetryActivityType activityType, Action action)
   場所 Microsoft.Crm.Setup.Shared.Installer.<>c__DisplayClass83_0.<DoAction>b__0()
   場所 Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute(ILogger logger, EventId eventId, ActivityType activityType, Action action)
   場所 Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute(ILogger logger, XrmTelemetryActivityType activityType, Action action)
   場所 Microsoft.Crm.Setup.Shared.Installer.<>c__DisplayClass67_0.<Install>b__0()
   場所 Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute(ILogger logger, EventId eventId, ActivityType activityType, Action action)
   場所 Microsoft.Xrm.Telemetry.XrmTelemetryExtensions.Execute(ILogger logger, XrmTelemetryActivityType activityType, Action action)
   場所 Microsoft.Crm.Tools.Admin.OrganizationOperation.Install(IDictionary stateSaver)
   場所 Microsoft.Crm.Tools.Admin.OrganizationUpgrader.Install(IDictionary stateSaver)
   場所 Microsoft.Crm.Tools.Admin.OrganizationOperation.Execute()
   場所 Microsoft.Crm.Tools.Admin.OrganizationUpgrader.Execute()
   場所 Microsoft.Crm.Tools.Admin.ImportOrganizationInstaller.ImportAndUpgrade(OrganizationInfo organizationInfo)

原因は以下の一文にある。

ファイルまたはアセンブリ 'Microsoft.SqlServer.ConnectionInfo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

これは、SQL システムの CLR 型(SQLSystemClrTypes)およびSQL Server 管理オブジェクト(SharedManagementObjects)が入っていないことが要因となっている。

解決方法

これら2つのモジュールはDynamics365の初回セットアップ時に必須となるので入れている筈なのだが、ログに記載されているのはバージョンが異なる。11.0.0.0、つまりSQLServer2012用のものが必要であることが肝。

当該バージョンのモジュールは以下からダウンロード可能である。

・SystemClrTypes

32bit http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409

64bit http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409

・SharedManagementObject

32bit http://go.microsoft.com/fwlink/?LinkID=239658&clcid=0x409

64bit http://go.microsoft.com/fwlink/?LinkID=239659&clcid=0x409

これらをインストールした後、再起動して再度実行したところ、エラーが解消された。

参考にした英語フォーラム:

https://community.dynamics.com/crm/f/microsoft-dynamics-crm-forum/300597/upgrade-on-premise-8-2-to-9-0-errors

Dynamics365(On-Premise)のセットアップにて、必須コンポーネントがダウンロード失敗となる。

Dynamicsセットアップの前提条件となる必須コンポーネントでエラーとなり、ダウンロードに失敗。ログを見ると以下の内容が出力されている。

今すぐコンポーネントをダウンロードしますか?, Question, Yes|No
09:14:42|   Info| InputResult: Yes
09:14:43|   Info| Initializing COM.
09:14:43|   Info| Initialized COM.
09:14:43|   Info| Requesting download of ODBC ドライバー installer from http://go.microsoft.com/fwlink/?LinkId=2026121&clcid=0x411.
09:14:43|   Info| Requesting download of SQL Native Client installer from http://go.microsoft.com/fwlink/?LinkId=2032060&clcid=0x411.
09:14:43|   Info| Requesting download of SQL システムの CLR 型 installer from http://go.microsoft.com/fwlink/?LinkId=2033106&clcid=0x411.
09:14:43|   Info| Requesting download of SQL Server 管理オブジェクト installer from http://go.microsoft.com/fwlink/?LinkId=2033060&clcid=0x411.
09:14:44|   Info| ODBC ドライバー を C:\Users\crmadmin\AppData\Local\Microsoft\Windows\INetCache\IE\Z3W1X8KO\msodbcsql[1].msi にダウンロードしました
09:14:44|   Info| Prereq component installer will use downloaded installer for msodbcsql.msi.
09:14:44|   Info| Installer path for ODBC ドライバー set to C:\Users\crmadmin\AppData\Local\Microsoft\Windows\INetCache\IE\Z3W1X8KO\msodbcsql[1].msi
09:14:44|  Error| SQL Native Client のダウンロードに失敗しました。インターネット接続が機能していることを確認してから、やり直してください。
09:14:44|  Error|   hr=0xc0040202
09:14:45|  Error| SQL システムの CLR 型 のダウンロードに失敗しました。インターネット接続が機能していることを確認してから、やり直してください。
09:14:45|  Error|   hr=0xc0040202
09:14:45|  Error| SQL Server 管理オブジェクト のダウンロードに失敗しました。インターネット接続が機能していることを確認してから、やり直してください。
09:14:45|  Error|   hr=0xc0040202
09:14:45|   Info| Uninitializing COM.
09:14:45|   Info| Uninitialized COM.
09:14:49|   Info| セットアップは、次のコンポーネントをインターネットからダウンロードする必要があります:
-  SQL Native Client
-  SQL システムの CLR 型
-  SQL Server 管理オブジェクト

解決方法

サーバがインターネットに接続できればよいのだが、ローカル接続のみの場合は個別にインストールをすれば解決する。

インストールすべきファイルはログ内に記載の通りで、go.microsoft.com/fwlink~のアドレスにアクセスすればインストーラが落ちてくる。

これをサーバに配置してインストールすればOKである。

【Dynamics365】組織インポート時にReporting Servicesのチェックでエラー「オブジェクト参照がオブジェクト インスタンスに設定されていません。」

Dynamics365の組織インポートを行おうとしたところ、システムのチェックにて掲題のエラーに遭遇。

f:id:aposke:20200812145200p:plain

f:id:aposke:20200812145208p:plain

指定された Reporting Services のレポート サーバー http://xxx-crm/reportserver を検証できませんでした。エラー: オブジェクト参照がオブジェクト インスタンスに設定されていません。

端的に言えばエラーメッセージ内にあるURLに正しくアクセスができないようだ。

実際、Webブラウザから対象のURLに遷移しても、404 Not Foundが返ってくる。ただ、URLに記載のホスト名は自分自身であり、pingは当然返ってくる。ただし、ipv6ループバックアドレス(::1)で。

解決方法

対応としては、そのループバックアドレスをReporting ServicesのWebサービスURLに足してやればよい。

1.Reporting Services 構成マネージャーを開き、WebサービスURLの「詳細設定」をクリック

f:id:aposke:20200812150012p:plain

2.IPアドレスが記載してあるリストの「追加」をクリック

f:id:aposke:20200812150021p:plain

3.ドロップダウンからループバックアドレスを指定して追加

f:id:aposke:20200812145815p:plain

以上で、チェックが通るようになった。

BCP のフォーマットファイル中に正しくないホスト行番号が見つかりました。

SQLServerbcpコマンドを使ってデータを投入していたら、掲題のエラー。

Error = [Microsoft][ODBC Driver 11 for SQL Server]BCP のフォーマットファイル中に正しくないホスト行番号が見つかりました。

フォーマットファイルに問題があるようなのだが… 列番号の指定は確認してもずれていないし… ということで小一時間悩んだ。

結論から言うと、フォーマットファイル内のサーバ側列名に不正な文字を含んでいたのが原因だった。

以下の画像で言う、Server column nameの部分です。

f:id:aposke:20200722112453g:plain

引用元:

フォーマット ファイルを使用したテーブル列のスキップ (SQL Server) - SQL Server | Microsoft Docs

今回のケースでは、この列名に半角スペースが含まれていたのが原因。

取り除いたところ、正常に動作するようになった。

以下、TIPS。

こういう原因不明なエラーが出た場合の切り分け方法として、幸い今回はフォーマットファイルが要因とわかっているので、フォーマットファイルを削りながら実行して確認するというのが効率的。

今回、フォーマットファイルには100列ほど定義してあったので、半分消して50列で実行したらどうなるか、その次は75列、その次は87列…という風に二分探索方式でエラー箇所を特定した。

フォーマットファイルを崩しているのでまともに取り込めないが、問題のエラーが再現していなければフォーマットファイルは正常、としてエラー行を特定することができる。

本当はググったら一発で解決が見つかってほしいところですけどね。可能なら、言語を英語にしてエラーメッセージを確認し、そのメッセージを元に検索すれば英語フォーラムには有益な情報が多く転がっているようです。