ファイルのアクセス権を変更する [プログラミング]
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グループにフルコントロールを追加しています。
今日の一冊 | |
|
2009-10-04 08:56
nice!(0)
コメント(0)
トラックバック(0)
コメント 0