AdjustTokenPrivileges這個函式啟用或禁止 指定訪問令牌的特權。
啟用或禁用特權一個有TOKEN_ADJUST_PRIVILEGES訪問的訪問令牌.
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, //包含特權的句柄
BOOL DisableAllPrivileges,//禁用所有許可權標誌
PTOKEN_PRIVILEGESNewState,//新特權信息的指針(結構體)
DWORD BufferLength, //緩衝數據大小,以位元組為單位的PreviousState的快取區(sizeof)
PTOKEN_PRIVILEGES PreviousState,//接收被改變特權當前狀態的Buffer
PDWORD ReturnLength //接收PreviousState快取區要求的大小
);
參數
TokenHandle
包含要修改特權的訪問令牌的標識(句柄).這個句柄必須有TOKEN_ADJUST_PRIVILEGES訪問令牌.如果PreviousState不是NULL,這個句柄還必須有TOKEN_QUERY訪問特權.
DisableAllPrivileges
標誌這個函式是否禁用該令牌的所有特權.如果為TRUE,這個函式禁用所有特權,NewState參數無效.如果為假,以NewState參數指針的信息為基礎來修改特權.
NewState
一個TOKEN_PRIVILEGES結構體的指針指定了一組特權和他們的屬性.
如果參數DisableAllPrivileges為FALSE,AdjustTokenPrivileges 啟用或禁用這些令牌的特權.
如果你給一個特權設定了SE_PRIVILEGE_ENABLED的屬性,這個函式將啟動特權,否則禁用特權.
如果DisableAllPrivileges為TRUE,這個參數無效.
BufferLength
標誌參數PreviousState指針以位元組大小快取區(sizeof).
如果參數PreviousState是NULL,這個參數可以為NULL.
PreviousState
這個函式填充一個TOKEN_PRIVILEGES結構體【指針】,它包括該函式修改之前任何特權狀態.這個參數可以為NULL.
如果指定的緩衝區太小,無法收到完整的修改權限列表,這個函式失敗並不會修改任何特權.
這個函式設定了一個 擁有修改許可權完成列表【 參數ReturnLength 】的位元組數 的指針變數.[結果的Buffer]
ReturnLength
接收 參數PreviousState的快取區指針的 位元組大小 的 變數指針(長度指針).
如果PreviousState為NULL,這個參數可以為NULL.
返回值
如果這個函式成功,返回非0.為了確定這個函式是否修改了所有指定的特權,可以調用GetLastError函式,當這個函式返回下面的值之一時就代表函式成功:
值 | 描述 |
ERROR_SUCCESS | 這個函式修改了所有指定的特權。 |
ERROR_NOT_ALL_ASSIGNED | 這個令牌沒有參數NewState里指定一個或多個的許可權。(一個或多個沒有修改成功). 即使許可權沒有被修改。這個函式也可能成功(返回這個error值) 表明 參數PreviousState 被修改。 |
如果這個函式失敗,返回0.要得到更多的錯誤信息,調用GetLastError.
備註
AdjustTokenPrivileges函式不能添加新的特權到訪問令牌.它只能啟用或禁用令牌現行的令牌.要想確定這個令牌的特權,調用GetTokenInformation函式.
請注意,參數NewState可以不給令牌指定許可權,這不會導致函式失敗.
在這種情況下,這個函式修改令牌現有的特權,其他特權無效,並成功返回.
調用GetLastError函式,以確定這個函式修改了所有指定的特權.
PreviousState參數表明特權被修改.
參數PreviousState 返回一個 包含 修改許可權 原始狀態的結構體 TOKEN_PRIVILEGES,
這樣就可以在隨後調用AdjustTokenPrivileges函式時,傳遞PreviousState指針到 參數NewState ,來恢復原來的狀態.