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

ファイルにセキュリティ情報を設定するためには、SetFileSecurity関数を用いるが、SetNamedSecurityInfo関数を用いることもできる。



手順は、以下のとおり

No項目
1InitializeAcl関数で、DACLを初期化する
2LookupAccountName関数で、アカウントに対するSIDを取得する
3AddAccessAllowedAce関数で、アクセス許可属性をDACLに追加する
4SetNamedSecurityInfo関数で、ファイルに対してDACLを設定する


  • SetNamedSecurityInfo関数でファイルにセキュリティ情報を設定する例

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

    #include <windows.h>
    #include <aclapi.h>
    #include <stdio.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()
    {
        DWORD dwAclSize = 1024;
        PACL pDacl;
        PSID pSid;
        char szDomainName[256];
    
        pDacl = (PACL)LocalAlloc(LPTR, dwAclSize);
        if (pDacl == NULL) {
            return 1;
        }
    
        //1.InitializeAcl関数で、DACLを初期化する
        InitializeAcl(pDacl, dwAclSize, ACL_REVISION);
    
        //2.LookupAccountName関数で、アカウントに対するSIDを取得する
        GetSidByAccountName("SYSTEM",
            &pSid,
            szDomainName,
            sizeof(szDomainName)/sizeof(szDomainName[0]));
    
        //3.AddAccessAllowedAce関数で、アクセス許可属性をDACLに追加する
        AddAccessAllowedAce(pDacl, ACL_REVISION, GENERIC_READ, pSid);
        AddAccessAllowedAce(pDacl, ACL_REVISION, GENERIC_WRITE, pSid);
    
        //4.SetNamedSecurityInfo関数で、ファイルに対してDACLを設定する
        SetNamedSecurityInfoA("test.txt",
            SE_FILE_OBJECT,
            DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION,
            NULL,
            NULL,
            pDacl,
            NULL);
    
        LocalFree(pSid);
        LocalFree(pDacl);
    
        return 0;
    }



    参考
    http://d.hatena.ne.jp/s-kita/20110330/1301513379