ファイルにACEを追加する。
環境:QT5.5
リンク
http://doc.qt.io/qt-5/qdir.html
インクルードファイル
#inclued
// 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(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; iSidStart) - 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; iHeader.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;
コメント