So-net無料ブログ作成
検索選択

ファイルのアクセス権を変更する [プログラミング]

Windowsでは、ファイル毎にアクセス権を細かく設定できますが、それをプログラム上から変更したいと思います。
変更というか、権限の追加ですが、権限の解除も大体同じ感じで出来るんじゃないかな。

#include        <Aclapi.h>

/**
   既存のアクセス権情報にアクセス権(1つ)を追加する。

   失敗した時は、NULLを返す。

   戻り値として返されるアクセス権情報は、
   使い終わったら、::LocalFree() を呼び出して開放する。

   @param acl_old 既存のアクセス権情報
   @param access 追加するアクセス権
   @return 追加後のアクセス権情報
*/
PACL addACLExplicitAccess(PACL acl_old, EXPLICIT_ACCESS& access)
{
    PACL acl_new = NULL;

    const DWORD result = ::SetEntriesInAcl(1,
                                           &access,
                                           acl_old,
                                           &acl_new);
    if (result != ERROR_SUCCESS)
        return NULL;

    return acl_new;
}

/**
   指定ファイルにアクセス権を設定する。

   @param path アクセス権を設定したいファイルのパス
   @param acl 設定するアクセス権情報
   @return 成否(true:成功)
*/   
bool setDACL(LPTSTR path, PACL acl)
{
    const DWORD result = ::SetNamedSecurityInfo(path,
                                                SE_FILE_OBJECT,
                                                DACL_SECURITY_INFORMATION,
                                                0,
                                                0,
                                                acl,
                                                0);
    return result == ERROR_SUCCESS;
}

/**
   指定のファイルに、指定ユーザのアクセス権限を追加する。

   permission に指定する値の詳細は、
   MSDN の「File Security and Access Rights」の項を参照

   @param path アクセス権を追加したいファイルのパス
   @param user アクセス権を追加するユーザ または グループの名前
   @param permission 追加するアクセス権
   @retval 0 成功
   @retval -1 エラー:既存のアクセス権が取得できない。
   @retval -2 エラー:既存のアクセス権に新しい権限を追加できない。
   @retval -3 エラー:ファイルにアクセス権を設定できない。
*/
int appendAccessRight(LPCTSTR path, LPCTSTR user, DWORD permission)
{
    const int TRUSTEE_NAME_LEN = 256;

    // アクセス権関係のAPIに指定する文字列の型が LPCTSTR ではなくLPTSTRなので、
    // それぞれにバッファを用意する。
    // 多分 const 外しのキャストで問題ないと思われるが念のため。
    TCHAR path_buff[MAX_PATH + 1] = {0};
    _tcsncpy(path_buff, path, MAX_PATH);

    TCHAR name_buff[TRUSTEE_NAME_LEN + 1] = {0};
    _tcsncpy(name_buff, user, TRUSTEE_NAME_LEN);

    DWORD result;
    
    // ===== ファイルに設定されているアクセス権についての情報を取得 =====
    PACL acl = NULL;
    PSECURITY_DESCRIPTOR descriptor = NULL;

    result = ::GetNamedSecurityInfo(path_buff,
                                    SE_FILE_OBJECT,
                                    DACL_SECURITY_INFORMATION,
                                    0,
                                    0,
                                    &acl,
                                    0,
                                    &descriptor);
    if (result != ERROR_SUCCESS)
        return -1;

    // ===== 追加するアクセス権を作成 =====
    EXPLICIT_ACCESS access;
    ::BuildExplicitAccessWithName(&access,
                                  name_buff,
                                  permission,
                                  GRANT_ACCESS,
                                  CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE);

    // ===== アクセス権を追加 =====
    acl = addACLExplicitAccess(acl, access);
    if (acl == NULL) {
        ::LocalFree(descriptor);
        return -2;
    }

    // ===== アクセス権をファイルに設定 =====
    if (!setDACL(path_buff, acl)) {
        ::LocalFree(acl);
        ::LocalFree(descriptor);
        return -3;
    }

    ::LocalFree(acl);
    ::LocalFree(descriptor);
    return 0;
}

使い方は、こんな感じ。

appendAccessRight(_T("c:\\test.dat"), _T("Users"), FILE_ALL_ACCESS);

この例では、ファイル「C:\test.dat」に対して、Usersグループにフルコントロールを追加しています。

[車(セダン)] 今日の一冊
カタコンベの復讐者 (ハヤカワ・ポケット・ミステリ1821)

カタコンベの復讐者

  • 作者: P・J・ランベール
  • 出版社/メーカー: 早川書房
  • 発売日: 2009/02/06
  • メディア: 単行本(ソフトカバー)

タグ:Windows VisualC++
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0