判断文件夹是否可写,权限问题

 

#include <bitset>
#include <windows.h> 

BOOL IsDirectoryWrite(TCHAR* filePath)
{
 SECURITY_INFORMATION  securityInfo =  DACL_SECURITY_INFORMATION;
 SECURITY_DESCRIPTOR*  pSecurityDes;
 DWORD needBuffer;
 
 //获取需要的内存大小
 GetFileSecurity(filePath, securityInfo, NULL, 0, &needBuffer);
 pSecurityDes = new SECURITY_DESCRIPTOR[needBuffer];

 GetFileSecurity(filePath, securityInfo, pSecurityDes, needBuffer, &needBuffer);

 //ACL变量,安全信息链表指针
 PACL  pACL = NULL;
 BOOL DaclPresent;
 BOOL DaclDefault;
 GetSecurityDescriptorDacl(pSecurityDes, &DaclPresent, &pACL, &DaclDefault);

 //获取ACl所有信息
 ACL_SIZE_INFORMATION AclInfo;
 AclInfo.AceCount = 0;
 AclInfo.AclBytesFree = 0;
 AclInfo.AclBytesInUse = sizeof(ACL);

 GetAclInformation(pACL, &AclInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation);

 //每个ACE信息
 LPVOID pTempAce = NULL;
 BYTE nAceType;
 if(DaclPresent && AclInfo.AceCount)
 {
  for (int i = 0; i < AclInfo.AceCount; i++)
  {
   GetAce(pACL, i, &pTempAce);
   nAceType = ((ACCESS_ALLOWED_ACE*)pTempAce)->Header.AceType;
   //表示当前安全权限里有拒绝的
   if (nAceType == ACCESS_DENIED_ACE_TYPE)
   {

    bitset<32> bitAccessMask (((ACCESS_ALLOWED_ACE*)pTempAce)->Mask);
    //表示当前文件夹不能写,也就是创建文件什么的
    //"FILE_WRITE_DATA" "FILE_APPEND_DATA""FILE_WRITE_EA""FILE_WRITE_ATTRIBUTES"
    if (bitAccessMask[1] == TRUE && bitAccessMask[2] == TRUE &&
     bitAccessMask[4] == TRUE && bitAccessMask[8] == TRUE)
    { 
     if (pSecurityDes)
     {
      delete [] pSecurityDes;
     }
     return FALSE;
    }
   }
  }
  if (pSecurityDes)
  {
   delete [] pSecurityDes;
  }
  return TRUE;
 }
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值