GENERIC_READ 等)為對象特定權限(FILE_GENERIC_READ 等),需手動填寫 GenericRead/Write/Execute/All 後呼叫 MapGenericMask。AccessStatus (BOOL) 與 GrantedAccess。// 1. 獲取 SD
SECURITY_INFORMATION si = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;
GetFileSecurity(lpFileName, si, NULL, 0, &dwSizeNeeded); // 獲取大小
psd = (PSECURITY_DESCRIPTOR)AllocMem(dwSizeNeeded);
GetFileSecurity(lpFileName, si, psd, dwSizeNeeded, &dwSizeNeeded);
// 2. 獲取並模擬 Token
OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
DuplicateToken(hToken, SecurityImpersonation, &hImpersonatedToken);
// 3. 映射權限
GENERIC_MAPPING genMap = { FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS };
DWORD dwGenericAccessMask = GENERIC_READ | GENERIC_WRITE;
MapGenericMask(&dwGenericAccessMask, &genMap);
// 4. 檢查
PRIVILEGE_SET privileges = {0};
DWORD grantAccess = 0, privLength = sizeof(privileges);
BOOL bGrantAccess = FALSE;
AccessCheck(psd, hImpersonatedToken, dwGenericAccessMask, &genMap,
&privileges, &privLength, &grantAccess, &bGrantAccess);
// bGrantAccess 即結果
GENERIC_MAPPING 結構體用法極易誤解(需手動對應對象特定權限常數)。完整測試截圖見原文。希望能為 Windows 安全編程開發者提供參考。