标签:return name 检查 Privileges tp win32 hToken 权限 size
检查当前句柄是否有指定的权限。
#include <iostream> #include <windows.h> #include <tchar.h> //#pragma comment(lib, "cmcfg32.lib") HANDLE hProcess; BOOL CheckWindowsPrivilege(const TCHAR* Privilege) { /* Checks for Privilege and returns True or False. */ LUID luid; PRIVILEGE_SET privs; HANDLE hToken; hProcess = GetCurrentProcess(); if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) return FALSE; if (!LookupPrivilegeValue(NULL, Privilege, &luid)) return FALSE; privs.PrivilegeCount = 1; privs.Control = PRIVILEGE_SET_ALL_NECESSARY; privs.Privilege[0].Luid = luid; privs.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED; BOOL bResult; PrivilegeCheck(hToken, &privs, &bResult); return bResult; } int main(void) { if (!CheckWindowsPrivilege(SE_ASSIGNPRIMARYTOKEN_NAME)) { wprintf(L"I do not have SeAssignPrimaryTokenPrivilege!\n"); return 1; } wprintf(L"I do have SeAssignPrimaryTokenPrivilege!\n"); return 0; }
打印当前句柄所有的权限。
void print_privileges(HANDLE hToken) { DWORD size = 0; if (!GetTokenInformation(hToken, TokenPrivileges, NULL, 0, &size) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { PTOKEN_PRIVILEGES tp = (PTOKEN_PRIVILEGES)malloc(size); if (tp != NULL && GetTokenInformation(hToken, TokenPrivileges, tp, size, &size)) { size_t i; for (i = 0; i < tp->PrivilegeCount; ++i) { char name[64] = "?"; DWORD name_size = sizeof name; LookupPrivilegeNameA(0, &tp->Privileges[i].Luid, name, &name_size); PRIVILEGE_SET ps = { 1, PRIVILEGE_SET_ALL_NECESSARY, { { { tp->Privileges[i].Luid.LowPart, tp->Privileges[i].Luid.HighPart } } } }; BOOL fResult; PrivilegeCheck(hToken, &ps, &fResult); printf("%-*s %s\n", 32, name, fResult ? "Enabled" : "Disabled"); } } free(tp); } }
启用或禁用特定的权限。
BOOL SetPrivilege( HANDLE hToken, // access token handle LPCTSTR lpszPrivilege, // name of privilege to enable/disable BOOL bEnablePrivilege // to enable or disable privilege ) { TOKEN_PRIVILEGES tp; LUID luid; if (!LookupPrivilegeValue( NULL, // lookup privilege on local system lpszPrivilege, // privilege to lookup &luid)) // receives LUID of privilege { printf("LookupPrivilegeValue error: %u\n", GetLastError()); return FALSE; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; if (bEnablePrivilege) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; // Enable the privilege or disable all privileges. if (!AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) { printf("AdjustTokenPrivileges error: %u\n", GetLastError()); return FALSE; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { printf("The token does not have the specified privilege. \n"); return FALSE; } return TRUE; }
相关文档:Enabling and Disabling Privileges in C++
标签:return,name,检查,Privileges,tp,win32,hToken,权限,size 来源: https://www.cnblogs.com/strive-sun/p/14168083.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。