文件夹用户权限操作

时间:2021-04-22 09:39:03
http://topic.csdn.net/u/20091211/15/6001edbd-0765-42a6-ba77-e3f6791e5f82.html?73694
原帖在那里
能解决问题的送分2次哦

12 个解决方案

#1



for (CurrentAceIndex = 0; 
CurrentAceIndex < AclInfo.AceCount;
CurrentAceIndex++) 
{
if (!GetAce(pACL, CurrentAceIndex, &pTempAce)) 
{
_tprintf(TEXT("GetAce()failed. Error %d\n"),CurrentAceIndex);
__leave;
}
if (EqualSid(pUserSID,&(((ACCESS_ALLOWED_ACE *)pTempAce)->SidStart)))
{
DeleteAce(pACL,CurrentAceIndex);
}
else
{
AddAce(pNewACL, ACL_REVISION, MAXDWORD, pTempAce,
((PACE_HEADER) pTempAce)->AceSize);
continue;
  }
}


这样写的话 不管传什么参数的用户名进去都执行了DeleteAce(pACL,CurrentAceIndex);
很纳闷。。。

#2


up

#3


唉 怎么没人关注下文件夹权限的编程呢?

#4


帮你顶起,好像如果其中一个该用户的所属组在拥有权限,
并且在前面你禁止的前面还是一样拥有访问的权限

#5


俺的代码, 经测试OK


BOOL NAcl::DeleteAceByUser(PACL pAcl, BYTE bAceType, CHAR *pUserName)
{
CHAR szUserName[128];
DWORD dwSize;
int i;
LPVOID pAce;
BOOL bRetVal;
ACL_SIZE_INFORMATION AclSizeInfo; 
ACE_HEADER * pAceHeader;
PSID pSid;

pSid = NSys::GetUserSID(pUserName);
if(pSid == NULL)
{
return FALSE;
}

GetAclInformation(pAcl, &AclSizeInfo, sizeof(AclSizeInfo), AclSizeInformation); 

for(i=0; i<AclSizeInfo.AceCount; i++) 
{
bRetVal = GetAce(pAcl, i, &pAce);
if(bRetVal == FALSE)
return FALSE;

pAceHeader = (ACE_HEADER *)pAce;

ACCESS_ALLOWED_ACE * pAllowedAce; 
ACCESS_DENIED_ACE * pDeniedAce; 
SYSTEM_AUDIT_ACE * pSysAuditAce;

if(bAceType != pAceHeader->AceType && bAceType != 0xFF)
continue;

switch(pAceHeader->AceType)
{
case ACCESS_ALLOWED_ACE_TYPE:
pAllowedAce = (ACCESS_ALLOWED_ACE *)pAce;
bRetVal = EqualSid(pSid, (PSID) &pAllowedAce->SidStart);
if(bRetVal)
                DeleteAce(pAcl, i);
break;
case ACCESS_DENIED_ACE_TYPE:
pDeniedAce = (ACCESS_DENIED_ACE *)pAce;
bRetVal = EqualSid(pSid, (PSID) &pDeniedAce->SidStart);
if(bRetVal)
DeleteAce(pAcl, i);
break;
case SYSTEM_AUDIT_ACE_TYPE:
pSysAuditAce = (SYSTEM_AUDIT_ACE *)pAce;
bRetVal = EqualSid(pSid, (PSID) &pSysAuditAce->SidStart);
if(bRetVal)
DeleteAce(pAcl, i);
break;

default:
assert(0);
}

}

free(pSid);
return TRUE;
}


#6


更全面的代码:

#ifndef __FILE_MGR_HEADER__
#define __FILE_MGR_HEADER__

#include <Windows.h>
#include <vector>
#include <string>
#include <map>
using namespace std;

// CFileAccessMgr
// 文件(夹)权限管理类
// 实现功能:获取指定文件(夹)用户权限、分配指定文件(夹)用户权限、文件(夹)之间拷贝用户权限

class CFileAccessMgr
{
public:
CFileAccessMgr(void);
~CFileAccessMgr(void);

public:
// 从现存文件中获取文件权限信息
BOOL GetAccountMask(LPCTSTR lpSrcPathFile, map<CString, DWORD>& mapAccountMask);

// 分配权限
BOOL AssignPathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask, unsigned int uAccessAction);

// 拷贝权限
BOOL CopyPathFileAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, unsigned int uAccessType);

BOOL ExportFileAccess(LPCTSTR lpSrcPathFile ,LPCTSTR lpDestPathFile);

// 获取错误信息
string GetErrorMsg();

// 获取错误代码
DWORD GetErrorCode();

protected:
// 添加指定帐户权限
BOOL AddOneAccess(LPCTSTR lpPathFile, LPCTSTR lpAccount, unsigned long ulAccessMask);

// 拷贝指定帐户权限
BOOL CopyOneAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, LPCTSTR lpAccount, unsigned long ulAccessMask, unsigned int uAccessType);

// 分配一次权限
BOOL AssignOnePathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask);

//获取文件(目录)的用户权限列表
BOOL GetFileOrPathRights(LPCTSTR lpszFileName);

//将文件权限导入成员MAP
void PushMaskAccessToMap(LPTSTR lpAccountName, DWORD dwAccessMask);

//保存用户权限
map<CString,DWORD> m_mapUserMask;

public:

//授权标志
enum {
ACCESS_ACTION_ROOTONLY = 0, //只授权根目录/文件
ACCESS_ACTION_ROOTEXCLUDED = 1, //只授权根目录下的文件和子目录
ACCESS_ACTION_ROOTINCLUDED = 2 //同时授权根目录/文件,子目录和子文件
};

//目标类型
enum{
ACCESS_TYPE_FILE = 0, //文件
ACCESS_TYPE_FOLDER = 1 //目录
};

static const int ACL_BUFFER_SIZE = 1024; //ACL缓冲区大小
static const int SID_BUFFER_SIZE = 100; //SID缓冲区大小
static const int DOMAIN_BUFFER_SIZE = 80; //DOMAIN缓冲区大小
static const int USERNAME_BUFFER_SIZE = 256; //USERNAME缓冲区大小
static const int MAX_USERS_NUMBER = 20; //可设置的帐户个数
static const int MAX_MSG_BUFFER_SIZE = 1024; //错误信息缓冲区大小

protected:
SECURITY_ATTRIBUTES m_sa; //安全属性
SECURITY_DESCRIPTOR m_sd; //安全描述
BYTE aclBuffer[1024]; //ACL缓冲区
PACL m_lpACL ; //ACL
BYTE sidBuffer[100]; //SID缓冲区
PSID m_lpSID; //SID
TCHAR m_szErrorMsg[MAX_MSG_BUFFER_SIZE + 1]; //错误信息
TCHAR m_szOperation[100 + 1]; //操作信息
DWORD m_dwErrorCode; //错误代码

};


#endif

#7


CPP太长了,不发了,日。
LZ可以无视我的回复。

#8


我测了一楼的代码,不会每次走到DeleteAce,是不是你传入的pUserSID和pACL有问题?

#9


引用 6 楼 xiaoc1026 的回复:
更全面的代码:
C/C++ code
#ifndef __FILE_MGR_HEADER__#define __FILE_MGR_HEADER__

#include<Windows.h>
#include<vector>
#include<string>
#include<map>usingnamespace std;// CFileAccessMgr// 文件(夹)权限管理类// 实现功能:获取指定文件(夹)用户权限、分配指定文件(夹)用户权限、文件(夹)之间拷贝用户权限class CFileAccessMgr
{public:
    CFileAccessMgr(void);~CFileAccessMgr(void);public:// 从现存文件中获取文件权限信息    BOOL GetAccountMask(LPCTSTR lpSrcPathFile, map<CString, DWORD>& mapAccountMask);// 分配权限    BOOL AssignPathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask, unsignedint uAccessAction);// 拷贝权限    BOOL CopyPathFileAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, unsignedint uAccessType);

    BOOL ExportFileAccess(LPCTSTR lpSrcPathFile ,LPCTSTR lpDestPathFile);// 获取错误信息string GetErrorMsg();// 获取错误代码    DWORD GetErrorCode();protected:// 添加指定帐户权限    BOOL AddOneAccess(LPCTSTR lpPathFile, LPCTSTR lpAccount, unsignedlong ulAccessMask);// 拷贝指定帐户权限    BOOL CopyOneAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, LPCTSTR lpAccount, unsignedlong ulAccessMask, unsignedint uAccessType);// 分配一次权限    BOOL AssignOnePathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask);//获取文件(目录)的用户权限列表    BOOL GetFileOrPathRights(LPCTSTR lpszFileName);//将文件权限导入成员MAPvoid PushMaskAccessToMap(LPTSTR lpAccountName, DWORD dwAccessMask);//保存用户权限    map<CString,DWORD> m_mapUserMask;public://授权标志enum {
        ACCESS_ACTION_ROOTONLY=0,//只授权根目录/文件        ACCESS_ACTION_ROOTEXCLUDED=1,//只授权根目录下的文件和子目录        ACCESS_ACTION_ROOTINCLUDED=2//同时授权根目录/文件,子目录和子文件    };//目标类型enum{
        ACCESS_TYPE_FILE=0,//文件        ACCESS_TYPE_FOLDER=1//目录    };staticconstint ACL_BUFFER_SIZE=1024;//ACL缓冲区大小staticconstint SID_BUFFER_SIZE=100;//SID缓冲区大小staticconstint DOMAIN_BUFFER_SIZE=80;//DOMAIN缓冲区大小staticconstint USERNAME_BUFFER_SIZE=256;//USERNAME缓冲区大小staticconstint MAX_USERS_NUMBER=20;//可设置的帐户个数staticconstint MAX_MSG_BUFFER_SIZE=1024;//错误信息缓冲区大小protected:
    SECURITY_ATTRIBUTES        m_sa;//安全属性    SECURITY_DESCRIPTOR        m_sd;//安全描述    BYTE                    aclBuffer[1024];//ACL缓冲区    PACL                    m_lpACL    ;//ACL    BYTE                    sidBuffer[100];//SID缓冲区    PSID                    m_lpSID;//SID    TCHAR                    m_szErrorMsg[MAX_MSG_BUFFER_SIZE+1];//错误信息    TCHAR                    m_szOperation[100+1];//操作信息    DWORD                    m_dwErrorCode;//错误代码
};#endif


CPP在哪 我想了解下! 好像跟我有点一样哦 

#10


引用 8 楼 togoblime 的回复:
我测了一楼的代码,不会每次走到DeleteAce,是不是你传入的pUserSID和pACL有问题?

应该不是传入的问题
我NEW了个新的ACL 在重新拷贝的过程中 忽略了拷贝的顺序!
这个问题 已经解决了 
不过对xiaoc1026的CPP比较感兴趣  呵呵

#11


............................

#12


看看楼主的问题解决没?

#1



for (CurrentAceIndex = 0; 
CurrentAceIndex < AclInfo.AceCount;
CurrentAceIndex++) 
{
if (!GetAce(pACL, CurrentAceIndex, &pTempAce)) 
{
_tprintf(TEXT("GetAce()failed. Error %d\n"),CurrentAceIndex);
__leave;
}
if (EqualSid(pUserSID,&(((ACCESS_ALLOWED_ACE *)pTempAce)->SidStart)))
{
DeleteAce(pACL,CurrentAceIndex);
}
else
{
AddAce(pNewACL, ACL_REVISION, MAXDWORD, pTempAce,
((PACE_HEADER) pTempAce)->AceSize);
continue;
  }
}


这样写的话 不管传什么参数的用户名进去都执行了DeleteAce(pACL,CurrentAceIndex);
很纳闷。。。

#2


up

#3


唉 怎么没人关注下文件夹权限的编程呢?

#4


帮你顶起,好像如果其中一个该用户的所属组在拥有权限,
并且在前面你禁止的前面还是一样拥有访问的权限

#5


俺的代码, 经测试OK


BOOL NAcl::DeleteAceByUser(PACL pAcl, BYTE bAceType, CHAR *pUserName)
{
CHAR szUserName[128];
DWORD dwSize;
int i;
LPVOID pAce;
BOOL bRetVal;
ACL_SIZE_INFORMATION AclSizeInfo; 
ACE_HEADER * pAceHeader;
PSID pSid;

pSid = NSys::GetUserSID(pUserName);
if(pSid == NULL)
{
return FALSE;
}

GetAclInformation(pAcl, &AclSizeInfo, sizeof(AclSizeInfo), AclSizeInformation); 

for(i=0; i<AclSizeInfo.AceCount; i++) 
{
bRetVal = GetAce(pAcl, i, &pAce);
if(bRetVal == FALSE)
return FALSE;

pAceHeader = (ACE_HEADER *)pAce;

ACCESS_ALLOWED_ACE * pAllowedAce; 
ACCESS_DENIED_ACE * pDeniedAce; 
SYSTEM_AUDIT_ACE * pSysAuditAce;

if(bAceType != pAceHeader->AceType && bAceType != 0xFF)
continue;

switch(pAceHeader->AceType)
{
case ACCESS_ALLOWED_ACE_TYPE:
pAllowedAce = (ACCESS_ALLOWED_ACE *)pAce;
bRetVal = EqualSid(pSid, (PSID) &pAllowedAce->SidStart);
if(bRetVal)
                DeleteAce(pAcl, i);
break;
case ACCESS_DENIED_ACE_TYPE:
pDeniedAce = (ACCESS_DENIED_ACE *)pAce;
bRetVal = EqualSid(pSid, (PSID) &pDeniedAce->SidStart);
if(bRetVal)
DeleteAce(pAcl, i);
break;
case SYSTEM_AUDIT_ACE_TYPE:
pSysAuditAce = (SYSTEM_AUDIT_ACE *)pAce;
bRetVal = EqualSid(pSid, (PSID) &pSysAuditAce->SidStart);
if(bRetVal)
DeleteAce(pAcl, i);
break;

default:
assert(0);
}

}

free(pSid);
return TRUE;
}


#6


更全面的代码:

#ifndef __FILE_MGR_HEADER__
#define __FILE_MGR_HEADER__

#include <Windows.h>
#include <vector>
#include <string>
#include <map>
using namespace std;

// CFileAccessMgr
// 文件(夹)权限管理类
// 实现功能:获取指定文件(夹)用户权限、分配指定文件(夹)用户权限、文件(夹)之间拷贝用户权限

class CFileAccessMgr
{
public:
CFileAccessMgr(void);
~CFileAccessMgr(void);

public:
// 从现存文件中获取文件权限信息
BOOL GetAccountMask(LPCTSTR lpSrcPathFile, map<CString, DWORD>& mapAccountMask);

// 分配权限
BOOL AssignPathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask, unsigned int uAccessAction);

// 拷贝权限
BOOL CopyPathFileAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, unsigned int uAccessType);

BOOL ExportFileAccess(LPCTSTR lpSrcPathFile ,LPCTSTR lpDestPathFile);

// 获取错误信息
string GetErrorMsg();

// 获取错误代码
DWORD GetErrorCode();

protected:
// 添加指定帐户权限
BOOL AddOneAccess(LPCTSTR lpPathFile, LPCTSTR lpAccount, unsigned long ulAccessMask);

// 拷贝指定帐户权限
BOOL CopyOneAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, LPCTSTR lpAccount, unsigned long ulAccessMask, unsigned int uAccessType);

// 分配一次权限
BOOL AssignOnePathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask);

//获取文件(目录)的用户权限列表
BOOL GetFileOrPathRights(LPCTSTR lpszFileName);

//将文件权限导入成员MAP
void PushMaskAccessToMap(LPTSTR lpAccountName, DWORD dwAccessMask);

//保存用户权限
map<CString,DWORD> m_mapUserMask;

public:

//授权标志
enum {
ACCESS_ACTION_ROOTONLY = 0, //只授权根目录/文件
ACCESS_ACTION_ROOTEXCLUDED = 1, //只授权根目录下的文件和子目录
ACCESS_ACTION_ROOTINCLUDED = 2 //同时授权根目录/文件,子目录和子文件
};

//目标类型
enum{
ACCESS_TYPE_FILE = 0, //文件
ACCESS_TYPE_FOLDER = 1 //目录
};

static const int ACL_BUFFER_SIZE = 1024; //ACL缓冲区大小
static const int SID_BUFFER_SIZE = 100; //SID缓冲区大小
static const int DOMAIN_BUFFER_SIZE = 80; //DOMAIN缓冲区大小
static const int USERNAME_BUFFER_SIZE = 256; //USERNAME缓冲区大小
static const int MAX_USERS_NUMBER = 20; //可设置的帐户个数
static const int MAX_MSG_BUFFER_SIZE = 1024; //错误信息缓冲区大小

protected:
SECURITY_ATTRIBUTES m_sa; //安全属性
SECURITY_DESCRIPTOR m_sd; //安全描述
BYTE aclBuffer[1024]; //ACL缓冲区
PACL m_lpACL ; //ACL
BYTE sidBuffer[100]; //SID缓冲区
PSID m_lpSID; //SID
TCHAR m_szErrorMsg[MAX_MSG_BUFFER_SIZE + 1]; //错误信息
TCHAR m_szOperation[100 + 1]; //操作信息
DWORD m_dwErrorCode; //错误代码

};


#endif

#7


CPP太长了,不发了,日。
LZ可以无视我的回复。

#8


我测了一楼的代码,不会每次走到DeleteAce,是不是你传入的pUserSID和pACL有问题?

#9


引用 6 楼 xiaoc1026 的回复:
更全面的代码:
C/C++ code
#ifndef __FILE_MGR_HEADER__#define __FILE_MGR_HEADER__

#include<Windows.h>
#include<vector>
#include<string>
#include<map>usingnamespace std;// CFileAccessMgr// 文件(夹)权限管理类// 实现功能:获取指定文件(夹)用户权限、分配指定文件(夹)用户权限、文件(夹)之间拷贝用户权限class CFileAccessMgr
{public:
    CFileAccessMgr(void);~CFileAccessMgr(void);public:// 从现存文件中获取文件权限信息    BOOL GetAccountMask(LPCTSTR lpSrcPathFile, map<CString, DWORD>& mapAccountMask);// 分配权限    BOOL AssignPathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask, unsignedint uAccessAction);// 拷贝权限    BOOL CopyPathFileAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, unsignedint uAccessType);

    BOOL ExportFileAccess(LPCTSTR lpSrcPathFile ,LPCTSTR lpDestPathFile);// 获取错误信息string GetErrorMsg();// 获取错误代码    DWORD GetErrorCode();protected:// 添加指定帐户权限    BOOL AddOneAccess(LPCTSTR lpPathFile, LPCTSTR lpAccount, unsignedlong ulAccessMask);// 拷贝指定帐户权限    BOOL CopyOneAccess(LPCTSTR lpDstPathFile, LPCTSTR lpSrcPathFile, LPCTSTR lpAccount, unsignedlong ulAccessMask, unsignedint uAccessType);// 分配一次权限    BOOL AssignOnePathFileAccess(LPCTSTR lpPathFile, map<string, DWORD> mapAccountMask);//获取文件(目录)的用户权限列表    BOOL GetFileOrPathRights(LPCTSTR lpszFileName);//将文件权限导入成员MAPvoid PushMaskAccessToMap(LPTSTR lpAccountName, DWORD dwAccessMask);//保存用户权限    map<CString,DWORD> m_mapUserMask;public://授权标志enum {
        ACCESS_ACTION_ROOTONLY=0,//只授权根目录/文件        ACCESS_ACTION_ROOTEXCLUDED=1,//只授权根目录下的文件和子目录        ACCESS_ACTION_ROOTINCLUDED=2//同时授权根目录/文件,子目录和子文件    };//目标类型enum{
        ACCESS_TYPE_FILE=0,//文件        ACCESS_TYPE_FOLDER=1//目录    };staticconstint ACL_BUFFER_SIZE=1024;//ACL缓冲区大小staticconstint SID_BUFFER_SIZE=100;//SID缓冲区大小staticconstint DOMAIN_BUFFER_SIZE=80;//DOMAIN缓冲区大小staticconstint USERNAME_BUFFER_SIZE=256;//USERNAME缓冲区大小staticconstint MAX_USERS_NUMBER=20;//可设置的帐户个数staticconstint MAX_MSG_BUFFER_SIZE=1024;//错误信息缓冲区大小protected:
    SECURITY_ATTRIBUTES        m_sa;//安全属性    SECURITY_DESCRIPTOR        m_sd;//安全描述    BYTE                    aclBuffer[1024];//ACL缓冲区    PACL                    m_lpACL    ;//ACL    BYTE                    sidBuffer[100];//SID缓冲区    PSID                    m_lpSID;//SID    TCHAR                    m_szErrorMsg[MAX_MSG_BUFFER_SIZE+1];//错误信息    TCHAR                    m_szOperation[100+1];//操作信息    DWORD                    m_dwErrorCode;//错误代码
};#endif


CPP在哪 我想了解下! 好像跟我有点一样哦 

#10


引用 8 楼 togoblime 的回复:
我测了一楼的代码,不会每次走到DeleteAce,是不是你传入的pUserSID和pACL有问题?

应该不是传入的问题
我NEW了个新的ACL 在重新拷贝的过程中 忽略了拷贝的顺序!
这个问题 已经解决了 
不过对xiaoc1026的CPP比较感兴趣  呵呵

#11


............................

#12


看看楼主的问题解决没?