2009-07-08 28 views
2

我試圖啓用和禁用文件上的某些訪問權限。我想到要做到這一點,你必須惹惱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得到的,所以我認爲它應該可以工作。我究竟做錯了什麼?

回答

4

打開並閱讀它在哪個程序? ACL被設置爲我的預期,但FILE_GENERIC_WRITE可能對您而言過於通用;它看起來也會設置影響閱讀屬性的「特殊」權限。

從WINNT.H

#define FILE_GENERIC_WRITE  (STANDARD_RIGHTS_WRITE |\ 
            FILE_WRITE_DATA   |\ 
            FILE_WRITE_ATTRIBUTES |\ 
            FILE_WRITE_EA   |\ 
            FILE_APPEND_DATA   |\ 
            SYNCHRONIZE) 

如果我叫了一組更有限的標誌測試文件現在可以打開和閱讀,至少在記事本中,但管理員用戶不能保存文檔:

DWORD dwCustomWrite = FILE_WRITE_DATA  | 
         FILE_WRITE_ATTRIBUTES | 
         FILE_WRITE_EA   | 
         FILE_APPEND_DATA; 
set_DACL_for_object(..., SE_FILE_OBJECT, dwCustomWrite, DENY_ACCESS); 

從文件上的安全選項卡中的高級權限列表上,與上面的調用只有以下被標記爲「拒絕」的「管理員」組:

「創建文件/寫入數據」,「創建文件夾/追加數據」,「寫屬性」,「寫入擴展屬性」

有了這些知識,你應該能夠挑選確切的標誌集合你需要。

+0

謝謝!那樣做了。在我回復你的第一個答案後,我啓動到安全模式並檢查了我正在創建的文件的安全信息並修改了ACL。我注意到寫入訪問確實被拒絕,允許讀取訪問......但也有一些特殊的權限被拒絕。謝謝你指出我正確的方向,現在它工作。 – ZZZzzz 2009-07-08 17:00:10

1

我認爲set_DACL_for_object調用應該指定FILE_ALL_ACCESSFILE_GENERIC_WRITE,而不是GENERIC_ALLGENERIC_WRITE。我編譯了你的代碼片段,並且這些更改能夠按照你的預期工作。

作爲一個附註,LPTSTR轉換可以防止編譯器檢測到這個代碼是Ansi,如果您應該將其編譯爲Unicode,那麼在這種情況下代碼將在運行時失敗。

您應該改用_T("ADMINISTRATORS")

+0

謝謝;我試過了,它仍然對我產生相同的結果(無法讀取文件)。在你的系統上,調用這兩個函數(SET_ACCESS用於FILE_ALL_ACCESS)和DENY_ACCESS用於FILE_GENERIC_WRITE - 允許你打開文件並讀取它,但不能寫入它? – ZZZzzz 2009-07-08 15:29:28

相關問題