今天講SID細節
上一篇中,我們大概了解了DACL的基本概念。今天我們再來看看其中的SID部分。我們的問題是:如何將SID在二進位和字符串格式中進行轉換?
當然,你可以使用Win32API來使用代碼進行轉換,具體就是這兩個API:ConvertSidToStringSid和ConvertStringSidtoSid,但有時候你可能在調試一段內存結構,或者你需要手動地對SID的格式進行轉換,那麼我們就來看看下表:
舉個例子,如果你有一個SDI,值為:S-1-5-21-2127521184-1604012920-1887927527-72713。那麼,它對應的原始16進位值為:010500000000000515000000A065CF7E784B9B5FE77C8770091C0100。
我們按照下表來分解一下:
很好,但是那些數字代表什麼呢?
每臺設備會生成一個唯一ID識別碼,用來對SID進行標記,格式為:(-…-…-…-)。最後一個數字是一個」相對ID(RID)」,用來標誌設備的用戶帳號。實際上,在ntseapi.h頭文件中定義了很多預定義的RID。系統會保留一段(0~999)RID,所以,系統中的第一個非內置帳號會得到1000作為ID。這裡的數字72713表示這個SID是第72714個被創建的SID。(很顯熱,這臺設備是一臺域控制器,用來為成百上千的用戶分配帳號)
可能上面的說法沒那么正確,雖然我說這個是創建的第72714個SID,但是,自某些大型伺服器上,SID可能是不連續的,也即,你不能認為SID是嚴格地連續分配。
總結
系統安全這個主題不是我的專長,所以,上面的信息不一定是完全正確的,但是,我想,應該基本是正確的吧。
最後
Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關於Windows的小知識,對於廣大Windows平臺開發者來說,確實十分有幫助。本文來自:《How do I convert a SID between binary and string forms?》