##EasyReadMore##

2013年6月7日 星期五

How to migrate ADFS Configuration database from Windows Internal Database (WID) to SQL Server


真不知道寫這個在台灣會有誰用到不過過程真的太艱辛了要寫一篇來紀念一下

ADFS AD Federation Service主要就是讓外部的服務可以透過 FS 主機利用 AD 去進行驗證達到 Single Sign On 的目標 Windows Server 裡面的一個角色:





      預設裝起來的話很快就裝好了你甚至可以把 ADFS 第二台第三台加進去讓他變成一個同盟可以同時提供高可用性的服務這在 2008R2 比較難因為 2008R2 預設是 ADFS 1.0必須另外獨立裝 ADFS2.0Server 2012 就好多了直接內建 2.0
那為什麼要把 Configuration 資料搬到 SQL Server 呢?

         因為預設的 Configuration 資料是放在 WID 的,就是 Windows Internal Database,內建的小資料庫,微軟很不夠意思的在官網上講,如果你把 ADFS 的資料放在 WID 的話....... 我們來看一下官方的解釋:


  • No more than five federation servers should be added to a federation server farm deployment. If you need more federation servers to support higher performance in farm deployment, use SQL Server instead.
  • No more than 100 trust relationships of the same type (either claims provider trusts or relying party trusts) can be supported. For example, you can have up to 100 claims provider trusts and 100 relying party trusts with a Windows Internal Database deployment, but to exceed this number for either category of trusts, use SQL Server instead.


         第一點還好就是不能放超過五台同盟我也不知道什麼巨大規模需要超過五台我們學校四五萬人我估個四台都覺得太高估了但是第二點頭就比較大了他竟然不能超過一百筆的信任關係一個網址進來進行認證就算一個我們學校的校務系統加上其他三姑六婆一定都超過一百組那就會造成很大的困擾只好咬牙開始轉移了!



首先你要先準備以下的材料:

  • ADFS Server 2~4: 就是乾淨的 Server 2012 加上 ADFS 的角色還不要加同盟喔推薦千萬要先快照 (Snapshot) 一次這樣就算做錯大不了重來就好Hyper-V 3.0 快照超快不用省這幾秒。
  • 在第一台 ADFS SQL Server Management Studio : 我們需要用到 sqlcmd 這個小工具所以要先花時間裝一下Express 或是正式版都可以可以到微軟下載 Express 版
  • SQL Server 一台: 建議開啟 SQL 驗證,不然跨網域就有點麻煩了!





Step.1 ADFS 的服務停止,並將資料庫檔案卸載並搬出
--------------------------------------------------------------------------------
開啟工程師的好朋友 Command Prompt,記得要按右鍵"以系統管理員身分執行",然後輸入:

net stop adfssrv

ADFS 的服務停掉,沒有用系統管理員身分就會存取被拒,其實直接去服務關掉也是可以,沒辦法,打指令比較帥嘛~~

接下來要把 WID 上面的資料庫先卸載,打開 PowerShell,輸入以下指令:

    sqlcmd -S \\.\pipe\MICROSOFT##WID\tsql\query
    use master
    go         
    sp_detach_db 'adfsconfiguration'
    go
    sp_detach_db 'adfsartifactstore'
    go

微軟非常認 (ㄐㄧㄢ) (ㄓㄚˋ) 的把 WID 目錄在 Server 2012 改了,如果各位有去 Google 就會發現,以下是差別:

Server 2008R2:
sqlcmd -S \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query

Server 2012:
sqlcmd -S \\.\pipe\MICROSOFT##WID\tsql\query


如果你在 2012 執行,會發現下了根本沒反應,因為路徑根本就換了啊~~~~,以前是在 C:\Windows\SYSMSI\SSEE\MSSQL.2005\MSSQL\Data
現在的路徑已經改到了 C:\Windows\WID\Data 下面,由此可見,很多指令都要重找,不然一定會常常碰壁。






Step.2 把資料庫檔案移動到 SQL SERVER 資料庫主機下
------------------------------------------------------------------------------
卸載了之後,到 C:\Windows\WID\Data 下,把兩個資料庫檔案跟兩個 LOG

adfsconfiguration.mdf
adfsconfiguration_log.ldf
adfsartifactstore.mdf
adfsartifactstore_log.ldf

這四個檔複製到 SQL Server 的目錄下,看要哪裡都可以,跟其他 MDF 放在一起也可以。




Step.3 ADFS 的資料庫在 SQL Server 掛載起來
------------------------------------------------------------------------------

麻煩打開 Windows 工程師另外一個好朋友 Powershell,輸入以下指令:

sqlcmd -S \\.\pipe\MICROSOFT##WID\tsql\query  --Server2012
use master
go
sp_attach_db 'adfsconfiguration', 'F:\MSSQL11.MSSQLSERVER\MSSQL\DATA\adfsconfiguration.mdf', 'F:\MSSQL11.MSSQLSERVER\MSSQL\DATA\adfsconfiguration_log.ldf'
go
sp_attach_db 'adfsartifactstore', 'F:\MSSQL11.MSSQLSERVER\MSSQL\DATA\adfsartifactstore.mdf', 'F:\MSSQL11.MSSQLSERVER\MSSQL\DATA\adfsartifactstore_log.ldf'
go
alter database AdfsConfiguration set enable_broker with rollback immediate
go

* 裡面的路徑就是你放 mdf 檔跟 ldf 檔的地方喔

成功的話,就可以在你的 SQL Server 下面看到 configuration 跟 artifactstore 資料庫了!






Step.4 ADFS 的 Configuration 資料庫設定切到 SQL Server
------------------------------------------------------------------------------
做了這個步驟 ADFS 才會去存取 SQL Server 的資料庫 請用系統管理員身分執行 Powershell 輸入:

$temp=GEt-WmiObject -namespace root/ADFS -class SecurityTokenService
$temp.ConfigurationdatabaseConnectionstring="data source=yourdatasource;initial catalog=adfsconfiguration;User ID=username;Password=password;"
$temp.put()


這邊記住一定要以系統管理員身分執行,不然最後 $temp.put() 會說傳了一個無效值 0,其實就是權限不足,這邊困擾我好久,還想說用別的方法改設定,最後沒想到是這麼簡單的解決方法!



Step.5 啟動 ADFS 服務
------------------------------------------------------------------------------
以系統管理員身分執行 Command Prompt輸入

net start adfssrv

可以啟動代表你剛剛切換有成功!



Step.6  ADFS artifactdbconnection 設定切到 SQL Server
------------------------------------------------------------------------------
記得我們剛剛移轉了兩個資料庫嗎? 現在要把另外一個設定也切過去請用系統管理員身分執行 Powershell 輸入:

Add-pssnapin microsoft.adfs.powershell
Set-adfsproperties –artifactdbconnection “data source=DATASOURCE; initial catalog=adfsartifactstore;integrated security=true”



Step.7  重新啟動 ADFS 服務
------------------------------------------------------------------------------
以系統管理員身分執行 Command Prompt,輸入

net stop adfssrv
net start adfssrv

成功的話代表兩個資料庫都切換到 SQL Server! 恭喜!



Step.8  ADFS Server 加入同盟伺服器
------------------------------------------------------------------------------
剛剛只做了第一台,現在要把其他幾台也加進去同盟伺服器
請確定以下事情都準備好了:

  • 有加入網域
  • ADFS 角色安裝完畢
  • ADFS 憑證有 import 進去且是正常的
  • IIS 把憑證繫結 Default Web Site 443 PORT


第三點的意思是,你要在憑證管理裡面看到憑證是沒有問題的才 OK



第四點沒有做好等一下加入同盟伺服器會有警告出現。


因為如果把 Cofig 資料搬到 SQL Server 的話,就不能用精靈加入同盟,一定要利用指令方式使用 ADFS 目錄下的 FsConfig.exe 裡面的 JoinSqlFarm 指令才可以加入,請用管理員身分打開 Command Prompt,到 ADFS 所在的目錄下 C:\Windows\ADFS  輸入:

FsConfig.exe JoinSQLFarm /ServiceAccount Domain\AccountName /ServiceAccountPassword Password /SQLConnectionString "data source=YourDataSource;initial catalog=adfsconfiguration;User ID=username;Password=password;"


如果之前沒有在 IIS 把憑證繫結成功 會有以下錯誤畫面:



成功的話就像以下這樣:


接下來就把剩下的 ADFS 主機一一加入,就大功告成!!

沒有留言: