Win32API ファイルにセキュリティ情報を設定する SetFileSecurity

ファイルにセキュリティ情報(ACL)を設定するためには、SetFileSecurity関数を用いる。

No処理内容
1InitializeSecurityDescriptor関数で、セキュリティ記述子を初期化
2InitializeAcl関数で、DACLを初期化
3LookupAccountName関数で、アカウントに対するSIDを取得する
4AddAccessAllowedAce関数で、DACLにアクセス許可属性のACEを追加する
5SetFileSecurity関数で、ファイルに対してセキュリティを設定する


  • ファイルにセキュリティ情報(ACL)を設定する例

  • 既存の"test.txt"というファイルに、SYSTEMアカウントに対する、読み取り許可属性と書き込み許可属性を設定する。

    #include <windows.h>
    
    BOOL GetSidByAccountName(const char *lpAccountName,
                             PSID *ppSid,
                             char *lpszDomainName,
                             DWORD dwDomainName)
    {
        DWORD dwSidSize = 0;
        SID_NAME_USE snu;
        BOOL bRet;
    
        //SIDを格納するために、dwSidSizeに必要なバッファサイズを取得する
        bRet = LookupAccountNameA(0,
            lpAccountName,
            NULL,
            &dwSidSize,
            lpszDomainName,
            &dwDomainName,
            &snu);
    
        if (!bRet && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
            return FALSE;
        }
    
        *ppSid = (PSID)LocalAlloc(LPTR, dwSidSize);
        if (*ppSid == NULL) {
            return FALSE;
        }
    
        bRet = LookupAccountNameA(0,
            lpAccountName,
            *ppSid,
            &dwSidSize,
            lpszDomainName,
            &dwDomainName,
            &snu);
    
        return bRet;
    }
    
    
    int main()
    {
        SECURITY_DESCRIPTOR sd;
        PACL pDacl;
        DWORD dwAclSize = 1024;
        PSID pSid;
        char szDomainName[512];
        
        //1.セキュリティ記述子を初期化
        InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
    
        pDacl = (PACL)LocalAlloc(LPTR, dwAclSize);
        if (pDacl == NULL) {
            return 1;
        }
    
        //2.DACLを初期化
        InitializeAcl(pDacl, dwAclSize, ACL_REVISION);
    
        //3.アカウントに対するSIDを取得
        GetSidByAccountName("SYSTEM", &pSid, szDomainName, sizeof(szDomainName)/sizeof(szDomainName[0]));
    
        //4.ACEをDACLに追加する
        AddAccessAllowedAce(pDacl, ACL_REVISION, FILE_GENERIC_READ, pSid);//読み取り属性を追加
        AddAccessAllowedAce(pDacl, ACL_REVISION, FILE_GENERIC_WRITE, pSid);//書き込み属性を追加
        
        //5.セキュリティ記述子にDACLの情報を設定する
        SetSecurityDescriptorDacl(&sd, TRUE, pDacl, FALSE);
    
        //6.ファイルにセキュリティ(セキュリティ記述子の情報)を設定する
        SetFileSecurityA("test.txt", DACL_SECURITY_INFORMATION, &sd);
        
        LocalFree(pDacl);
        LocalFree(pSid);
        
        return 0;
    }


  • 実行結果

  • SYSTEMアカウントに対して、読み取りと書き込みの許可が設定されていることがわかる。