わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

指定したファイル/フォルダにEveryoneすべての権限を設定する

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



実行結果

設定できました。





わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。