SSブログ

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

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
  • メディア: 単行本(ソフトカバー)

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

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。