わびさびサンプルソース

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

指定したファイルの所有者を取得する

指定したファイルの所有者を取得します。

GetFileSecurity()関数にOWNER_SECURITY_INFORMATIONを渡して、 SECURITY_DESCRIPTORを取得し、 GetSecurityDescriptorOwner()関数により所有者のSIDを取得します。 所有者のSIDを文字列へ変換するには、LookupAccountSid()関数を 使用します。

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <windows.h>
#include <aclapi.h>



/*
	指定したファイルのACLを取得する
		*ppAclはNULL以外の場合はfree()で解放してください。
*/
HRESULT GetFileOwner
(
	  std::wstring oFilePath
)
{
	HRESULT hResult;
	ACL* pResultAcl = NULL;
	BOOL bRet;


	DWORD dwSecurityDescriptorSize = 0;

	// SECURITY_DESCRIPTORサイズの取得
	bRet = GetFileSecurity(
		  oFilePath.c_str()
		, OWNER_SECURITY_INFORMATION	// オーナー情報を取得
		, NULL
		, 0
		, &dwSecurityDescriptorSize
	);
	if ( 0 == bRet ) {
		DWORD dwResult = ::GetLastError();

		// バッファサイズ不足以外はエラー
		if ( dwResult != ERROR_INSUFFICIENT_BUFFER ) {

			// エラー
			return( HRESULT_FROM_WIN32( dwResult ) );
		}
	}

	// SECURITY_DESCRIPTOR用メモリの確保
	SECURITY_DESCRIPTOR* pSecurityDescriptor = 
			(SECURITY_DESCRIPTOR*)calloc( 1, dwSecurityDescriptorSize + 1000 );
	if ( NULL == pSecurityDescriptor ) {

		// メモリ不足
		return( E_OUTOFMEMORY );
	}

	// SECURITY_DESCRIPTORの取得
	bRet = GetFileSecurity(
		  oFilePath.c_str()
		, OWNER_SECURITY_INFORMATION	// オーナー情報を取得
		, pSecurityDescriptor
		, dwSecurityDescriptorSize
		, &dwSecurityDescriptorSize
	);
	if ( 0 == bRet ) {

		// エラー
		hResult = HRESULT_FROM_WIN32( ::GetLastError() );
		goto err;
	}

	PSID pOwnerSid;
	BOOL bOwnerDefaulted;

	// セキュリティ記述子から所有者情報を取得する
	bRet = ::GetSecurityDescriptorOwner(
			  pSecurityDescriptor
			, &pOwnerSid
			, &bOwnerDefaulted
		);
	if ( 0 == bRet ) {

		// エラー
		hResult = HRESULT_FROM_WIN32( ::GetLastError() );
		goto err;
	}

	/*
		SIDを名前に変換して表示
	*/
	{
		TCHAR wpAccountName[ 1024 ];	// 所有者
		TCHAR wpDomainName[ 1024 ];		// ドメイン
		DWORD dwAccountNameSize = 1024; // 所有者文字列のサイズ
		DWORD dwDomainNameSize  = 1024;	// ドメイン文字列のサイズ
		SID_NAME_USE nSidNameUse;

		// SIDを名前に変換
		LookupAccountSid(
				  NULL
				, pOwnerSid
				, wpAccountName
				, &dwAccountNameSize
				, wpDomainName
				, &dwDomainNameSize
				, &nSidNameUse
			);

		// SIDタイプ
		const TCHAR* wpaSidType[] = {
			  L"SidTypeUser"
			, L"SidTypeGroup"
			, L"SidTypeDomain"
			, L"SidTypeAlias"
			, L"SidTypeWellKnownGroup"
			, L"SidTypeDeletedAccount"
			, L"SidTypeInvalid"
			, L"SidTypeUnknown"
			, L"SidTypeComputer"
			, L"SidTypeLabel"
		};

		wprintf( L"所有者   : %s¥n", wpAccountName );
		wprintf( L"ドメイン : %s¥n", wpDomainName  );
		wprintf( L"SIDタイプ: %s¥n", wpaSidType[ nSidNameUse - 1 ] );
	}

	// 正常終了
	hResult = S_OK;


err:
	// SECURITY_DESCRIPTORの解放
	if ( pSecurityDescriptor ) {
		free( pSecurityDescriptor );
	}

	// 正常終了
	return( hResult );
}



/*
	ファイルの所有者を取得する
*/
int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	// 標準出力にユニコード出力する
	setlocale( LC_ALL, "Japanese" );

	HRESULT hResult;

	// ファイルの所有者を取得する
	hResult = GetFileOwner( L"c:¥¥org¥¥test1.txt" );

	// 正常終了
	return( 0 );
}



実行結果

所有者   : MyOwner
ドメイン : MyDomain
SIDタイプ: SidTypeUser






わびさびサンプルソース

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