2012-07-12 124 views
1

使用下面的代码我拒绝了用户的写入权限,即使当我检查安全选项卡时,只有写入权限被拒绝,但我无法访问文件夹进行读取。当我拒绝写入权限时使用NTFS拒绝读取权限

ADsSecurity objADsSec; 
SecurityDescriptor objSecDes; 
AccessControlList objDAcl; 
AccessControlEntry objAce1; 
AccessControlEntry objAce2; 
Object objSIdHex; 
ADsSID objSId; 

objADsSec = new ADsSecurityClass(); 
objSecDes = (SecurityDescriptor)(objADsSec.GetSecurityDescriptor("FILE://" + vPath)); 
objDAcl = (AccessControlList)objSecDes.DiscretionaryAcl; 

objSId = new ADsSIDClass(); 
objSId.SetAs((int)ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SAM, UserName.ToString()); 
objSIdHex = objSId.GetAs((int)ADSSECURITYLib.ADS_SID_FORMAT.ADS_SID_SDDL); 



objAce2 = new AccessControlEntryClass(); 
objAce2.Trustee = (objSIdHex).ToString(); 
objAce2.AccessMask = (int)ActiveDs.ADS_RIGHTS_ENUM.ADS_RIGHT_GENERIC_WRITE; 
objAce2.AceType = (int)ActiveDs.ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_DENIED; 
objAce2.AceFlags = (int)ActiveDs.ADS_ACEFLAG_ENUM.ADS_ACEFLAG_INHERIT_ACE | 1; 
objDAcl.AddAce(objAce2); 

objSecDes.DiscretionaryAcl = objDAcl; 

// Set permissions on the NTFS file system folder. 
objADsSec.SetSecurityDescriptor(objSecDes, "FILE://" + vPath); 

回答

1

你不显示objAce1

您需要订购拒绝ACE条目给ACE条目之前

尝试交换ACL中条目的顺序。

因此,DACL的ACE列表应该被适当地排序。标准(规范)排序是首先明确拒绝,然后明确允许,普通(组)拒绝和组允许。如果不使用规范有序,未预料到的允许或拒绝可能会出现

Understanding Windows File And Registry Permissions

+0

我没有使用objAce1,我评论说块,因此拒绝写之前,我需要做的,让阅读?? – 2012-07-16 08:50:51

+0

在拒绝之前,您需要做**没有**(至少不在同一个ACL中)。继承的条目不计算IIRC - 请参阅链接的文章) – sehe 2012-07-16 09:36:13