指定したファイル/フォルダに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 );
}
設定できました。