AzureADとオンプレADをハードマッチさせてユーザを整合性を保つ方法

皆様年末をどうお過ごしでしょうか？
さて、この記事を書きつつとあるトラブルの解決を行っています...

タイトルにも書いていますが、なんとオンプレミス環境のActiveDirectoryがお亡くなりになってしまいました・・・
バックアップから復旧しようとしましたが、起動しないというトラブルを抱えてしまいました・・・
バックアップには気をつけないといけないと思い知らされた年末です・・・

さて、ここからは復旧の仕方・・・というよりかは、ハードマッチのやり方を書いておこうかと思います。
また同じことが起きないとも限らないのと、こういったトラブルへの対処法がなかなか無いので・・・

#1. ひとまず、ActiveDirectoryを構築しましょう
やり方は今回記載しません。この記事では、あくまでもハードマッチングのやり方の記載だけなので・・・

#2. AzureADのユーザの[ImmutableID]属性をBase64エンコードします
####注意事項
Windows Server 2012 R2を利用して再構成を行う場合は、.netのバージョンが5.0以上になっているかを確認してください。
以下の操作手順を行う際にエラーとなってしまいます。
（以下のURLは、.net 5.0のダウンロードリンクとなっています)
https://www.microsoft.com/en-us/download/details.aspx?id=54616

現在の.netのバージョンを取得するには、PowerShellを管理者権限で起動して以下のコマンドを入力すれば確認できます

```PS:.netバージョンを確認するコマンド
PS C:\WINDOWS\system32> HOST
```

また、場合によっては、IT プロフェッショナル 用 Microsoft Online Services サインイン アシスタント RTWのインストールが必要かもしれません。その場合は、以下のURLからダウンロードしてください。
https://www.microsoft.com/ja-jp/download/details.aspx?id=41950

####操作手順(MSOnlineモジュールのインストール)
まず、AzureADと接続するためにMSOnlineモジュールをインストールします。
PowerShellを管理者権限で実行し、以下のコマンドを入力します

```PS:Module_Install
PS C:\WINDOWS\system32> Install-Module MSOnline
```

すると、以下のような内容が表示されるので、Yを入力してEnterを押してください

```PS:Attention_NuGet
続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\Administrator\AppData\Local\PackageManagement\ProviderAssemblies'
に配置する必要があります。'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet
プロバイダーをインストールすることもできます。今すぐ PowerShellGet で NuGet
プロバイダーをインストールしてインポートしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):Y

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
```

Server OSのバージョンによっては、以下のようなエラーがでて進まなくなります

```PS:ERROR_NuGet_Download
警告: URI 'https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409' から '' へダウンロードできません。
警告: 利用可能なプロバイダーの一覧をダウンロードできません。インターネット接続を確認してください。
PackageManagement\Get-PackageProvider : パッケージ プロバイダー 'NuGet' が見つかりません。まだインポートされていない可
能性があります。'Get-PackageProvider -ListAvailable' を実行してみてください。
発生場所 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:7415 文字:30
+ ... tProvider = PackageManagement\Get-PackageProvider -Name $script:NuGet ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Microsoft.Power...PackageProvider:GetPackageProvider) [Get-PackageProvi
   der], Exception
    + FullyQualifiedErrorId : UnknownProviderFromActivatedList,Microsoft.PowerShell.PackageManagement.Cmdlets.GetPacka
   geProvider

Install-Module : NuGet ベースのリポジトリを操作するためには、NuGet プロバイダーが必要です。'2.8.5.201' 以降のバージョン
の NuGet プロバイダーがインストールされていることを確認してください。
発生場所 行:1 文字:1
+ Install-Module MSOnline
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Install-Module]、InvalidOperationException
    + FullyQualifiedErrorId : CouldNotInstallNuGetProvider,Install-Module
```

この場合は、次のコマンドでTLS1.2を有効化すると解決します。

```PS:Enable_TLS1.2
PS C:\WINDOWS\system32> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
```

####操作手順(AzureADとの接続・認証)
MSOnlineモジュールのインストールが完了したら、AzureADと接続していきます

```PS:Connect_AzureAD
PS C:\WINDOWS\system32> Connect-MsolService
```

別ウィンドウにて認証画面が表示されるので、管理権限のあるアカウントでログインします。
正常に完了すると、ウィンドウが閉じコマンド入力が可能となります。

###操作手順(ImmutableIDの取得方法～Base64エンコードの方法)
さて、大詰めです。
ここからは、ImmutableIDの取得に入っていきます。ここを間違えて紐づけてしまうと、意図しないログインの原因となるので、気を付けて行いましょう。

ひとまず、例として以下の方のデータのImmutableIDを取得していきます。

```
UPN : HiromiKobayashi@consto.com
名前 : 小林 博美
distinguishedName : CN=小林 博美,OU=USER,DC=consto,DC=com
```

検索を行うので、次のコマンドを実行します

```PS:Search_ImmutableID
PS C:\Users\Administrator> Get-MsolUser -UserPrincipalName "HiromiKobayashi@consto.com" | fl DisplayName,UserPrincipalName,ImmutableID
```

すると、以下のように表示されます(ImmutableIDは適当にしてます)

```PS:Answer_ImmutableID
DisplayName       : 小林 博美
UserPrincipalName : HiromiKobayashi@consto.com
ImmutableId       : QWERTY123456qwerty12345==
```

では、この表示されたImmutableIDをBase64エンコードをしていきます
Base64エンコードを行うため、次のように入力し、コマンドを実行します。

```PS:Base64_Encode
PS C:\Users\Administrator> $guid = [GUID][system.convert]::frombase64string("QWERTY123456qwerty12345==")
```


#3. オンプレミス環境のActiveDirectoryにGUIDを設定する
上の苦行が終わればあとは、簡単です。

###GUIDの登録方法

####編集前の記事を読まれていた方へ
編集前記事では、GUIを利用してGUIDを登録する方法を記載していましたが、それを行うとImmutableIDとの整合性が取れないため、該当項目を消去しています。
そのため、編集後の記事では、PowerShellを利用してGUIDを登録する方法に切り替えました。

それでは、前項の$guidを利用してユーザのmS-DS-ConsistencyGuidに登録をしていきます！

```PS:Update_User_mS-DS-ConsistencyGuid
PS C:\Users\Administrator> set-aduser -Identity 'HiromiKobayashi' -replace @{'mS-DS-ConsistencyGuid' = $guid}
PS C:\Users\Administrator> ldifde -f C:\ldifde_user.txt -d "CN=小林 博美,OU=USER,DC=consto,DC=com" -p subtree　-l mS-DS-ConsistencyGuid
```

最後のldifdeは、正常にBase64エンコードできているかを確認するためのものです。
（おそらくもっと短くできそうなので、PowerShellスクリプト完成したらどこかにあげておきます・・・)

これが終われば、やっとAzureAD Connectのインストール作業に移れます。

ただ、インストール時にソースアンカーの設定を既存のままにしてしまうと、同期エラーが発生してしまいます。
なので、ソースアンカーの設定の項目まで進めたら、mS-DS-ConsistencyGuidを選択してください！！

後は、普通に設定して完了です！
お疲れ様でした！！！

#PowerShellスクリプトについて
完成しました！
ただ、初めて書いたスクリプトのため、きちんと動作しないかもしれません・・・

一応自分の環境では動作確認できたので、まぁ大丈夫でしょう・・・ｗ

https://github.com/ItsukiNakamura/AzureAD_ImmutableID_Converter