指定したファイル/フォルダにEveryoneユーザーのアクセス属性「すべて」を割り当てます。 ConvertStringSidToSid()関数で、"S-1-1-0"(Everyone)ユーザーのSIDを取得して、既存のファイルのDACLと、 SetEntriesInAcl()関数で結合します。
#include <stdio.h> #include <tchar.h> #include <iostream> #include <string> #include <windows.h> #include <aclapi.h> #include <sddl.h> /* 指定したファイル/フォルダにEveryoneすべての権限を設定する */ HRESULT SetAllowEveryoneAll ( std::wstring strPath // ファイル/フォルダパス ) { HRESULT hResult = S_OK; DWORD dwResult = 0; // SECURITY_DESCRIPTOR PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL; // DACL ACL* pDacl = NULL; ACL* pNewDacl = NULL; // SID PSID pSid = NULL; // EXPLICIT_ACCESS EXPLICIT_ACCESS oExpAcs = { 0 }; /* DACLの取得 */ dwResult = ::GetNamedSecurityInfo( strPath.c_str() // パス , SE_FILE_OBJECT , DACL_SECURITY_INFORMATION , NULL // 所有者SID , NULL // プライマリグループSID , &pDacl // DACL , NULL // SACL , &pSecurityDescriptor // SECURITY_DESCRIPTOR ); if ( ERROR_SUCCESS != dwResult ) { // エラー hResult = ::HRESULT_FROM_WIN32( dwResult ); goto err; } /* EveryoneのSIDを取得する */ if ( 0 == ::ConvertStringSidToSid( L"S-1-1-0", &pSid ) ) { // エラー hResult = ::HRESULT_FROM_WIN32( ::GetLastError() ); goto err; } /* EXPLICIT_ACCESSの設定 */ oExpAcs.grfAccessMode = SET_ACCESS; oExpAcs.grfAccessPermissions = GENERIC_ALL; // 全て oExpAcs.grfInheritance = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE; oExpAcs.Trustee.pMultipleTrustee = NULL; oExpAcs.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; oExpAcs.Trustee.TrusteeForm = TRUSTEE_IS_SID; oExpAcs.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; oExpAcs.Trustee.ptstrName = (LPTSTR)pSid; /* ACLの結合 */ dwResult = ::SetEntriesInAcl( 1, &oExpAcs, pDacl, &pNewDacl ); if ( ERROR_SUCCESS != dwResult ) { // エラー hResult = ::HRESULT_FROM_WIN32( dwResult ); goto err; } /* DACLの設定 */ dwResult = ::SetNamedSecurityInfo( (LPWSTR)strPath.c_str() , SE_FILE_OBJECT // パス , DACL_SECURITY_INFORMATION , NULL // 所有者SID , NULL // プライマリグループSID , pNewDacl // DACL(new) , NULL // SACL ); if ( ERROR_SUCCESS != dwResult ) { // エラー hResult = ::HRESULT_FROM_WIN32( dwResult ); goto err; } err: // SIDの解放 if ( NULL != pSid ) { LocalFree( pSid ); } // DACL(new)の解放 if ( NULL != pNewDacl ) { LocalFree( pNewDacl ); } // SECURITY_DESCRIPTORの解放 if ( NULL != pSecurityDescriptor ) { LocalFree( pSecurityDescriptor ); } // 処理結果を返す return( hResult ); } /* 指定したファイル/フォルダにEveryoneすべての権限を設定する */ int _tmain ( int argc , _TCHAR* argv[] ) { // std::wcoutのロケールを設定 std::wcout.imbue( std::locale( "", std::locale::ctype ) ); // エラーコード HRESULT hResult = S_OK; // 指定したファイル/フォルダにEveryoneすべての権限を設定する hResult = SetAllowEveryoneAll( L".¥¥TestData¥¥test.txt" ); if ( S_OK == hResult ) { // 成功 std::wcout << L"設定できました。" << std::endl; } else { // 失敗 std::wcout << L"設定できませんでした。" << std::endl; } // 処理結果を返す return( 0 ); }
設定できました。