ファイルにACEを追加する。
環境:QT5.5
リンク
http://doc.qt.io/qt-5/qdir.html
インクルードファイル
1 | #inclued <windows.h"> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | // ACEを1つ追加する // 新規追加するACE情報は以下のように設定されているものとします。 // PSID pSId; // ACEのSID // ACCESS_MASK mask; // ACEのマスク // BYTE aceFlag; // ACEの継承フラグ // BYTE aceType; // ACEのタイプ(許可/拒否) // ※MSのサンプルプログラムを元に作成しています。 int result; PACL pAcl; PSECURITY_DESCRIPTOR descriptor; PACCESS_ALLOWED_ACE pTempAce; // ACEを追加するファイル名セット QString filepath = "C:\ProgramData\test\test.exe"; path_buff = reinterpret_cast<LPCWSTR>(filepath.utf16()); // ファイルに設定されているACLを取得 result = GetNamedSecurityInfo( path_buff, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, 0, 0, &pAcl, 0, &descriptor ); if ( result ) { if ( descriptor ) LocalFree(descriptor); return false; } // ACLサイズを計算 既存ACEに1つのACEを追加) DWORD aclSize = sizeof(ACL) + (sizeof(ACCESS_ALLOWED_ACE) * (pAcl->AceCount + 1)); for ( DWORD i=0; i<aclCnt; i++ ) { GetAce(&pAcl, i, (LPVOID*)&pTempAce); aclSize += GetLengthSid((PSID)&pTempAce->SidStart) - sizeof(DWORD); } aclSize += GetLengthSid(pSid); aclSize = (aclSize + (sizeof(DWORD) - 1)) & 0xFFFFFFFC; // 領域確保 pNewAcl = (PACL)LocalAlloc(LPTR, aclSize); if ( NULL == pNewAcl ) { if ( descriptor ) LocalFree(descriptor); return false; } InitializeAcl(pNewAcl, aclSize, ACL_REVISION); // 既存ACEをコピー for( DWORD i=0; i<aclCnt; i++ ) { // ACLからACEを取得 GetAce(pAcl, i, (LPVOID*)&pTempAce); // ACLにACEを追加 if ( ACCESS_ALLOWED_ACE_TYPE == pTempAce->Header.AceType ) { // 許可 ret = AddAccessAllowedAceEx(pNewAcl, ACL_REVISION, pTempAce->Header.AceFlags, pTempAce->Mask, (PSID)&pTempAce->SidStart); } else if ( ACCESS_DENIED_ACE_TYPE == pTempAce->Header.AceType ) { // 拒否 ret = AddAccessDeniedAceEx(pNewAcl, ACL_REVISION, pTempAce->Header.AceFlags, pTempAce->Mask, (PSID)&pTempAce->SidStart); } if ( !ret ) { if ( pNewAcl ) free(pNewAcl); if ( descriptor ) LocalFree(descriptor); return false; } } if ( descriptor ) LocalFree(descriptor); // 新規ACEを追加 if ( ACCESS_ALLOWED_ACE_TYPE == aceType ) { ret = AddAccessAllowedAceEx(pNewAcl, ACL_REVISION, aceFlag, mask, pSid ); } else if ( ACCESS_DENIED_ACE_TYPE == aceType ) { ret = AddAccessDeniedAceEx(pNewAcl, ACL_REVISION, aceFlag, mask, pSid ) } if ( !ret ){ if ( pNewAcl ) free(pNewAcl); return false; } return true; |
コメント