Win32API ファイルにセキュリティ情報を設定する SetNamedSecurityInfo
ファイルにセキュリティ情報を設定するためには、SetFileSecurity関数を用いるが、SetNamedSecurityInfo関数を用いることもできる。
手順は、以下のとおり
No | 項目 |
1 | InitializeAcl関数で、DACLを初期化する |
2 | LookupAccountName関数で、アカウントに対するSIDを取得する |
3 | AddAccessAllowedAce関数で、アクセス許可属性をDACLに追加する |
4 | SetNamedSecurityInfo関数で、ファイルに対してDACLを設定する |
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; }