原帖在那里
能解决问题的送分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可以无视我的回复。
LZ可以无视我的回复。
#8
我测了一楼的代码,不会每次走到DeleteAce,是不是你传入的pUserSID和pACL有问题?
#9
CPP在哪 我想了解下! 好像跟我有点一样哦
#10
应该不是传入的问题
我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可以无视我的回复。
LZ可以无视我的回复。
#8
我测了一楼的代码,不会每次走到DeleteAce,是不是你传入的pUserSID和pACL有问题?
#9
CPP在哪 我想了解下! 好像跟我有点一样哦
#10
应该不是传入的问题
我NEW了个新的ACL 在重新拷贝的过程中 忽略了拷贝的顺序!
这个问题 已经解决了
不过对xiaoc1026的CPP比较感兴趣 呵呵
#11
............................
#12
看看楼主的问题解决没?