Win32API ファイルにセキュリティ情報を設定する SetFileSecurity
ファイルにセキュリティ情報(ACL)を設定するためには、SetFileSecurity関数を用いる。
No | 処理内容 |
1 | InitializeSecurityDescriptor関数で、セキュリティ記述子を初期化 |
2 | InitializeAcl関数で、DACLを初期化 |
3 | LookupAccountName関数で、アカウントに対するSIDを取得する |
4 | AddAccessAllowedAce関数で、DACLにアクセス許可属性のACEを追加する |
5 | SetFileSecurity関数で、ファイルに対してセキュリティを設定する |
既存の"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アカウントに対して、読み取りと書き込みの許可が設定されていることがわかる。