我試圖啓用和禁用文件上的某些訪問權限。我想到要做到這一點,你必須惹惱DACL。我使用下面的代碼來修改文件的DACL:我是否錯誤地使用了SetNamedSecurityInfo?我的文件的ACL似乎沒有被正確修改
void set_DACL_for_object(const char *object, SE_OBJECT_TYPE object_type,
int access_perms, int access_mode) {
PACL pDACL = NULL, pOldDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;
GetNamedSecurityInfo((LPTSTR)object, object_type,
DACL_SECURITY_INFORMATION, NULL, NULL,
&pOldDACL, NULL, &pSD);
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = access_perms;
ea.grfAccessMode = access_mode;
ea.grfInheritance = NO_INHERITANCE;
ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea.Trustee.ptstrName = _T("ADMINISTRATORS");
SetEntriesInAcl(1, &ea, pOldDACL, &pDACL);
SetNamedSecurityInfo((LPTSTR)object, object_type,
DACL_SECURITY_INFORMATION, NULL, NULL, pDACL, NULL);
}
所以首先我創建與fopen()函數文件,創建一個ACL讓所有接入到Administrators組,然後拒絕寫入訪問到Administrators組:
set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_ALL, SET_ACCESS);
set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_WRITE, DENY_ACCESS);
然而,這些電話後,我要在文件中沒有讀訪問。如果我不打電話,我有讀/寫權限(如預期的那樣)。
我應該注意我正在管理員帳戶下運行,並且功能正在返回成功。我也嘗試修改特定的受限用戶的ACL,但同樣的事情發生......用戶被拒絕讀取訪問,而不是像我想要的寫訪問。我嘗試了一堆不同的組合調用set_DACL_for_object(),比如用REVOKE_ACCESS替換DENY_ACCESS,用GRANT_ACCESS替換SET_ACCESS,不做任何SET_ACCESS調用等,但似乎沒有任何工作。
我應該注意到,大部分代碼都是從this MSDN example得到的,所以我認爲它應該可以工作。我究竟做錯了什麼?
謝謝!那樣做了。在我回復你的第一個答案後,我啓動到安全模式並檢查了我正在創建的文件的安全信息並修改了ACL。我注意到寫入訪問確實被拒絕,允許讀取訪問......但也有一些特殊的權限被拒絕。謝謝你指出我正確的方向,現在它工作。 – ZZZzzz 2009-07-08 17:00:10