安全對象:就是資源,比如目錄,文件,管道之類的。
訪問令牌是用來描述進程或線程安全上下文的對象,令牌所包含的信息是與該user賬戶相關的進程或線程的身份和權限信息。當user登錄時,系統通過將user輸入的密碼與儲存在安全數據庫中的密碼進行對比。若密碼正確,系統此時會爲user生成一個訪問令牌。之後,該user執行的每個進程都會擁有一個該訪問令牌的拷貝。
當線程和一個安全對象交互時或者線程試圖執行一個需要權限的系統任務時,系統使用訪問令牌來辨別user。訪問令牌包含以下信息:
1.用戶賬戶的安全標識(SID)
2.用戶所屬組的SID
3.識別當前登錄會話的登錄SID
4.用戶或者用戶組所保存的權限列表
5.所有者SID
6.主組SID
7.默認的DACL。當用戶在沒有指定安全描述符情況下創建一個安全的對象時,系統使用該默認DACL。
8.訪問令牌的來源
9.令牌是一個主令牌還是模擬令牌
10.限制的SID可選列表
11.當前模擬級別
12.其他統計
每個進程都有一個主令牌用於描述和進程相關聯的用戶賬戶的安全上下文。默認地,當進程的線程和安全對象交互時系統使用主令牌。此外,線程還能夠模擬一個客戶端賬號。該模擬賬號讓線程和使用客戶端的安全上下文的安全對象交互。一個模擬客戶端的線程它不僅有主令牌還會有一個模擬令牌。
使用OpenProcessToken函數獲取一個句柄,該句柄爲進程的主令牌句柄。使用OpenThreadToken獲取指向線程的模擬令牌句柄。
可使用下面的函數來操作訪問令牌:
函數 | 描述 |
AdjustTokenGroups | 在訪問令牌中改變組信息 |
AdjustTokenPrivileges | 在訪問令牌中使能或禁止權限。它沒有做新的授權或撤銷已經存在的授權 |
CheckTokenMembership | 在指定的訪問令牌內判斷一個指定的SID是否使能 |
CreateRestrictedToken | 創建新的令牌,它是一個已經存在令牌的限制版本。該限制令牌可能已經禁止SID,刪除權限以及一系列的限制SID |
DuplicateToken | 創建一個新的模擬令牌,該令牌是複製於一個已經存在的令牌 |
DuplicateTokenEx | 創建一個新的主令牌或者模擬令牌,該令牌複製於一個已經存在的令牌 |
GetTokenInformation | 獲取一個令牌相關的信息 |
IsTokenRestricted | 判斷一個令牌是否含有一系列限制SID |
OpenProcessToken | 獲取一個指向進程的主令牌的句柄 |
OpenThreadToken | 獲取一個指向線程的模擬令牌的句柄 |
SetThreadToken | 給一個線程分配或刪除一個模擬令牌 |
SetTokenInformation | 改變令牌的屬主,主組,或默認DACL |
訪問令牌函數使用以下結構體來描述訪問令牌:
結構體 | 描述 |
TOKEN_CONTROL | 描述訪問令牌的信息 |
TOKEN_DEFAULT_DACL | 默認的DACL,系統會在線程創建的新對象的安全描述符中使用該DACL。 |
TOKEN_GROUPS | 指定訪問令牌的SID和組SID的屬性 |
TOKEN_OWNER | 默認屬主SID,指向新對象的安全描述符。 |
TOKEN_PRIMARY_GROUP | 默認主組SID,指向新對象的安全描述符 |
TOKEN_PRIVILEGES | 與訪問令牌相關聯的權限,也決定了權限是否使能 |
TOKEN_SOURCE | 訪問令牌來源 |
TOKEN_STATISTICS | 和令牌相關的統計 |
TOKEN_USER | 和訪問令牌相關的用戶SID |
訪問令牌函數使用以下枚舉類型:
枚舉類型 | 描述 |
TOKEN_INFORMATION_CLASS | 表示來自訪問令牌設置或獲取的信息類型 |
TOKEN_TYPE | 標識訪問令牌爲主令牌還是模擬令牌 |