Windows API函數:AdjustTokenPrivileges是一個重要的安全函數,用於調整用戶或進程的訪問許可權。
一、獲取訪問令牌句柄
在使用AdjustTokenPrivileges
函數前,需要獲取訪問令牌句柄。調用函數OpenProcessToken
獲取當前進程令牌句柄或者用LogonUser
函數獲取對某個用戶的令牌句柄。
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
OpenProcessToken
函數的第一個參數指定要獲取訪問令牌的進程句柄,第二個參數指定訪問令牌的訪問許可權。
對於需要獲取指定用戶的訪問令牌,可以使用LogonUser
函數:
HANDLE hToken;
LPCTSTR lpUsername = _T("username"); //用戶名
LPCTSTR lpDomain = _T("domain"); //域名
LPCTSTR lpPassword = _T("password"); //用戶密碼
if (LogonUser(lpUsername, lpDomain, lpPassword, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, &hToken))
{
// Do something with token
CloseHandle(hToken);
}
LogonUser
函數的第一個參數指定要登錄的用戶名,第二個參數指定用戶所在的域名,如果當前為本地用戶,可傳入點號(「.」)。
二、獲取許可權名稱和ID
在使用AdjustTokenPrivileges
函數調整許可權之前,需要獲取許可權的名稱和ID。調用LookupPrivilegeValue
函數獲取許可權ID,調用LookupPrivilegeName
函數獲取許可權名稱。
LUID luid;
LPCTSTR lpPrivilegeName = _T("SeDebugPrivilege"); // 要獲取的許可權名稱
if (LookupPrivilegeValue(NULL, lpPrivilegeName, &luid))
{
TCHAR szPrivilegeName[1024];
DWORD cbName = ARRAYSIZE(szPrivilegeName);
if (LookupPrivilegeName(NULL, &luid, szPrivilegeName, &cbName))
{
// Do something with privilege information
}
}
LookupPrivilegeValue
函數的第一個參數指定許可權所在的系統,當為NULL時指本地系統;第二個參數指許可權名稱;第三個參數指許可權ID。
對於獲取許可權名稱,LookupPrivilegeName
函數的第一個參數指定許可權所在的系統,當為NULL時指本地系統;第二個參數指許可權ID;第三個參數指接收許可權名稱的緩存,第四個參數指緩存大小。
三、調整許可權
當獲取到令牌句柄和許可權信息後,就可以使用AdjustTokenPrivileges
函數調整進程或用戶的許可權。
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; //啟用許可權
if (AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL))
{
// Do something on success
}
AdjustTokenPrivileges
函數的第一個參數為本次操作的令牌句柄,第二個參數指示是否關閉該句柄,第三個參數指定一組調整後的特權標記,第四個參數指定前三個參數的大小,第五個參數(可選)指向一個緩衝區,該緩衝區以前一直指向許可權信息。
四、撤銷許可權
當需要撤銷許可權時,可以調用AdjustTokenPrivileges
函數。調用方式及參數與調整許可權時一致,但第三個參數的Attributes值應設置為SE_PRIVILEGE_REMOVED
。
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_REMOVED; //移除許可權
if (AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL))
{
// Do something on success
}
五、小結
AdjustTokenPrivileges
函數作為Windows系統安全相關的核心函數,為保證系統和數據安全而提供了重要功能。在調用該函數之前,還需要使用其他輔助函數獲取令牌句柄和許可權信息。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/231550.html