[茶包射手] DFS無法複寫暫存屬性或是符號連結的檔案!

Jason在近期一個專案中,聽到夥伴對於DFS的同步一直有各種奇奇怪怪的狀況,例如,就是只有圖片同步會有問題,而且是特定的檔案無論防篡改程式如何的更正,就是不會同步出去。Jason心想! DFS…一邊挖鼻孔、一邊設定都花不到我五分鐘的東西,那有這種事情,結果悲劇就這樣發生了,從四點開始協助除錯,一路搞到九點才結束,不過還好有找到正確的問題,順利射下茶包!

Jason在近期一個專案中,聽到夥伴對於DFS的同步一直有各種奇奇怪怪的狀況,例如,就是只有圖片同步會有問題,而且是特定的檔案無論防篡改程式如何的更正,就是不會同步出去。Jason心想! DFS…一邊挖鼻孔、一邊設定都花不到我五分鐘的東西,那有這種事情,結果悲劇就這樣發生了,從四點開始協助除錯,一路搞到九點才結束,不過還好有找到正確的問題,順利射下茶包!

OK! 在開始說明這個問題之前,有幾個DFS的觀念要給各位,DFS分為具名空間及複寫功能兩種,如果你必須達成高雄、台中、台北,不管什麼人,只要進入到公司內部,開檔案都是用\\itop.local\files\的統一路徑來存取檔案,那麼你必須要設定好具名空間和分散各位的檔案伺服器,使其成為具名空間、複寫群組的成員。反之,如果你要達成的目標是自動的把指定的目錄,將目錄下所有檔案由Server A複製到Server B,那麼你只需要設定好複寫群組,就不需要設定具名空間。

一開始因為在網芳上測試時,發生一連串的怪事情,Jason登入的帳號為domain Admins下的成員,在DFS成員內的伺服器開啟網芳會出現”存取被拒! 請確認您的權限足以存取這個資料!的錯誤資訊,再次以Domain Administrator的帳戶登入到兩台DFS成員,也確認了Domain Admins已經存在兩台server的Administrators內,NTFS權限也有本機Administrators完全控制,網芳共享也設定Domain Admins擁有完全權限。 再試一次將檔案透過網芳拉到指定的位置去一樣是存取被拒,這個就沒道理了,網域管理者竟然無法存取目錄,但是竟然可以在該共享目錄下開立目錄,所以Jason第一認定! 權限表錯了! 馬上將所有DFS複寫成員退出,並將所有成員的目錄權限指定擁有者為Administrators,並且重新的由上層父目錄套用了權限,再將必要權限加入後,網芳上的拉檔案行為即正常了!

接下來依照該專案的需求,由防改系統發佈資訊到DFS複寫群組中,但是!檔案還是沒有被複寫出去,經過幾次交叉測試,發現到複寫不出去的永遠是那14個檔案!

順便解答一下網友們的問題,如何看檔案是否有複寫完成呢? 可以透過建立健康狀態報表來確認!

首先點選動作上的”建立診斷報告”

 

選擇”健康狀況報告”

image

 

沒有特別的需求的話,就直接依照預設值下一步下去吧!

image

 

這份報告中要包那些成員呢? 在本例中是將兩台都納入!

image

 

參照成員指的就是要以誰當比較,也就是說我們到底丟檔案主要是以誰為主,那你就選它就對啦!

計算成員上的複寫檔案及其大小,指的即是將每個目錄內有多少檔案、容量多少全統計出來!

image

再按下”建立”就好囉!

image

 

接下來就產生報告了!

image

 

我們想要看的,到底同步完了沒可以從報表上的”知識”看到,已接收的檔案數資訊及檔案容量,也有相關的比較資訊!

 

好! 回歸正題! 在一切都是ok的,但是一直出現這個錯誤!

DFS 複寫並未複寫列在上方複寫資料夾中的某些檔案,因為它們有暫存屬性集或者它們是符號連結。這個問題會影響 1 個複寫資料夾中至少 14 個檔案 (報告中顯示每個複寫資料夾最多可達 100 個檔案)。 事件識別碼: 11004

而且這些檔案,永遠就是這14個! 無法複製的就是這幾個,又過了半小時,我們發現了一個共通點,這些檔案的屬性是T,看來T指的確實是temporary 的意思了!

image

 

再查了一下屬性T應該就是屬於錯誤資訊中所說的暫存屬性了! 但是在檔案屬性工具中的只有唯讀、保存、系統、隱藏!

image

 

我們用原文來看的話,attrib是屬性,而屬性只有上述的這四種,但是各位還記得嗎?以前我們在98/XP確實是可以直接在檔案的內容屬性中去編輯檔案的屬性。

但是屬性指令來找的話,一輩子也查不到有暫存這種屬性!

不過,你可以透過FSUtil這個工具來查詢它,例如下面查到的檔案屬性是0x120,查下文的表中0x20是封存、0x100是暫存!所以這個檔案是封存+暫存的屬性!

image

 

各種屬性的值對照表如下所示:

READONLY

0x1

HIDDEN

0x2

SYSTEM

0x4

DIRECTORY

0x10

ARCHIVE

0x20

DEVICE

0x40

NORMAL

0x80

TEMPORARY

0x100

SPARSE_FILE

0x200

REPARSE_POINT

0x400

COMPRESSED

0x800

OFFLINE

0x1000

NOT_CONTENT_INDEXED

0x2000

ENCRYPTED

0x4000

 

好了! 重頭戲來了!既然已經知道是檔案暫存屬性惹的禍,那麼我們就針對這個檔案路徑下所有具有暫存屬性的檔案,給它好好的改一下! 請服用下面的Power Shell!

Get-childitem D:\Site -recurse | ForEach-Object -process {if (($_.attributes -band 0x100) -eq 0x100) {$_.attributes = ($_.attributes -band 0xFEFF)}}

 

※記得修改一下上面指令中的路徑喔!


Anything keeps Availability.
Anywhere keeps Integrity.
Anytime keeps Confidentiality.
keep A.I.C. = Information Security