文件夹用户权限操作 http://topic.csdn.net/u/20091211/15/6001edbd-0765-42a6-ba77-e3f6791e5f82.html?73694原帖在那里能解决问题的送分2次哦 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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);很纳闷 俺的代码, 经测试OKBOOL 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;} 更全面的代码:#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 CPP太长了,不发了,日。LZ可以无视我的回复。 我测了一楼的代码,不会每次走到DeleteAce,是不是你传入的pUserSID和pACL有问题? CPP在哪 我想了解下! 好像跟我有点一样哦 应该不是传入的问题我NEW了个新的ACL 在重新拷贝的过程中 忽略了拷贝的顺序!这个问题 已经解决了 不过对xiaoc1026的CPP比较感兴趣 呵呵 好奇怪的问题,对窗口挂钩一次后,工具栏与菜单栏之间的分隔线就不见了。 who有语音识别方面的资料或者开源代码,可否推荐一下?谢谢 CList 做类成员变量时 求推荐一些网络编程书籍,及使用方法! ###菜鸟一问(简单问题)### 无窗口程序如何实现com组件的事件响应? 如何在vc中调用c文件中的函数? 简单的问题,谢谢! 翻译 很急!!鼠标拖动控件的方法!!! Win32 app 调用SendMessage抛出异常! VS2008 中为什么设置工具栏图标尺寸,会改变菜单栏的的大小
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);
很纳闷
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;
}
#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
LZ可以无视我的回复。
CPP在哪 我想了解下! 好像跟我有点一样哦
我NEW了个新的ACL 在重新拷贝的过程中 忽略了拷贝的顺序!
这个问题 已经解决了
不过对xiaoc1026的CPP比较感兴趣 呵呵