修改目录、文件的所有者 系统 win server2003修改目录、文件的所有者如何实现??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果磁盘的格式是NTFS之类的,可以考虑一下权限设置 是ntfs,我是要编程实现的 BOOL NAcl::SetFileOwner(CHAR *pFilePath, CHAR *pUserName){ BOOL bRetVal; bRetVal = SetObjSecurityInfo(pFilePath, SE_FILE_OBJECT, pUserName, GRANT_ACCESS, GENERIC_ALL); return TRUE;}BOOL NAcl::SetObjSecurityInfo(CHAR *pObjName, SE_OBJECT_TYPE nType, CHAR *pUserName, ACCESS_MODE dwMode, DWORD dwAcsPermis){ DWORD dwRetVal; PACL pAcl; PACL pNewAcl; CHAR szUserName[128]; DWORD dwSize; PSECURITY_DESCRIPTOR pSecDesp; EXPLICIT_ACCESSA ExpAcs; if(pObjName == NULL) return FALSE; if(pUserName == NULL) { dwSize = sizeof(szUserName); GetUserNameA(szUserName, &dwSize); pUserName = szUserName; } dwRetVal = GetNamedSecurityInfoA(pObjName, nType, DACL_SECURITY_INFORMATION, NULL, NULL, &pAcl, NULL, &pSecDesp); if(dwRetVal != 0) return FALSE; if(dwMode != GRANT_ACCESS) { DeleteAceByMode(pAcl, DENY_ACCESS); } BuildExplicitAccessWithNameA(&ExpAcs, pUserName, dwAcsPermis, dwMode, OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE); dwRetVal = SetEntriesInAclA(1, &ExpAcs, pAcl, &pNewAcl); if(dwRetVal != 0) { if(pSecDesp) LocalFree(pSecDesp); return FALSE; } dwRetVal = SetNamedSecurityInfoA(pObjName, nType, DACL_SECURITY_INFORMATION, NULL, NULL, pNewAcl, NULL); if(pNewAcl) LocalFree(pNewAcl); if(pSecDesp) LocalFree(pSecDesp); if(dwRetVal != 0) return FALSE; return TRUE;} BOOL SetObjSecurityOwer(CHAR *pObjName, CHAR *pUserName){ DWORD dwRetVal; PACL pAcl; CHAR szUserName[128]; DWORD dwSize; PSECURITY_DESCRIPTOR pSecDesp; EXPLICIT_ACCESSA ExpAcs; if(pObjName == NULL) return FALSE; if(pUserName == NULL) { dwSize = sizeof(szUserName); GetUserNameA(szUserName, &dwSize); pUserName = szUserName; } dwRetVal = GetNamedSecurityInfoA(pObjName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pAcl, NULL, &pSecDesp); if(dwRetVal != 0) return FALSE; PSID pUSid = NSys::GetUserSID(pUserName); BYTE bzsdAbsFileSDData[1024]; PSECURITY_DESCRIPTOR psdAbsFileSD = (PSECURITY_DESCRIPTOR)bzsdAbsFileSDData; BYTE bzaclDaclData[1024]; PACL paclDacl = (PACL)&bzaclDaclData; BOOL bDaclPresent; BOOL bDaclDefaulted; BOOL bOwnerDefaulted; InitializeSecurityDescriptor(psdAbsFileSD, SECURITY_DESCRIPTOR_REVISION); GetSecurityDescriptorDacl(pSecDesp, &bDaclPresent, &paclDacl, &bDaclDefaulted); SetSecurityDescriptorSacl(psdAbsFileSD, bDaclPresent, paclDacl, bDaclDefaulted);// GetSecurityDescriptorOwner(pSecDesp, ); SetSecurityDescriptorOwner(psdAbsFileSD, pUSid, FALSE); SetFileSecurity(pObjName, (SECURITY_INFORMATION)OWNER_SECURITY_INFORMATION, psdAbsFileSD); if(pUSid) free(pUSid); if(pSecDesp) LocalFree(pSecDesp); return TRUE;} PSID pUSid = NSys::GetUserSID(pUserName);这个函数是什么呢?还有我7楼的问题能帮忙解答下吗?还有 NSys::GetUserSID 从用户名得到SID 的一个函数权限函数对文件, 目录都可以的, 不会作用子目录, 需要自己遍历PSID NSys::GetUserSID(CHAR *pUserName){ CHAR szUserName[128]; DWORD dwSize; PSID pSid = NULL; CHAR szDomainName[128]; DWORD dwDomainSize; SID_NAME_USE pNameUse; if(pUserName == NULL) { dwSize = sizeof(szUserName); GetUserNameA(szUserName, &dwSize); pUserName = szUserName; } dwDomainSize = sizeof(szDomainName); pSid = NULL; dwSize = 0; LookupAccountNameA(NULL, pUserName, pSid, &dwSize, szDomainName, &dwDomainSize, &pNameUse); if(dwSize == 0) { return FALSE; } pSid = (PSID)malloc(dwSize); LookupAccountNameA(NULL, pUserName, pSid, &dwSize, szDomainName, &dwDomainSize, &pNameUse); return pSid;} 发现存在一个问题,有一个目录,将所有者从test改为Administrators时正确但是从Administrators 改为test时SetFileSecurity函数返回0,调用失败这个是怎么回事呢? 补充一下:如果手动将所有者从Administrators 改为test是可以的 这个叫什么图? 在一个大工程里,怎么查找某个*.hpp是否在被当前文件include? 一个控制条里怎么加入一个Tree和一个List 如何停止、启动Win2000自带的一些服务,如传真服务等? 如何查找一个对话框的owner窗口? 新手开始学习数据库,学ORACLE好还是Sql Server好???(UP有分) 用vc如何开发输入法? 基于对话框的程序中,主对话框如何能始终在所有窗口的最上面? unicode 是什么 如何从驱动中单独提取出某个功能 怎么在MFC多文档运行后显示一个png格式的图片? 求助!!如何提取listbox的所有内容?
我是要编程实现的
BOOL NAcl::SetFileOwner(CHAR *pFilePath, CHAR *pUserName)
{
BOOL bRetVal; bRetVal = SetObjSecurityInfo(pFilePath, SE_FILE_OBJECT, pUserName, GRANT_ACCESS, GENERIC_ALL); return TRUE;
}BOOL NAcl::SetObjSecurityInfo(CHAR *pObjName, SE_OBJECT_TYPE nType,
CHAR *pUserName, ACCESS_MODE dwMode, DWORD dwAcsPermis)
{
DWORD dwRetVal;
PACL pAcl;
PACL pNewAcl;
CHAR szUserName[128];
DWORD dwSize; PSECURITY_DESCRIPTOR pSecDesp;
EXPLICIT_ACCESSA ExpAcs; if(pObjName == NULL)
return FALSE; if(pUserName == NULL)
{
dwSize = sizeof(szUserName);
GetUserNameA(szUserName, &dwSize);
pUserName = szUserName;
} dwRetVal = GetNamedSecurityInfoA(pObjName, nType, DACL_SECURITY_INFORMATION, NULL,
NULL, &pAcl, NULL, &pSecDesp);
if(dwRetVal != 0)
return FALSE; if(dwMode != GRANT_ACCESS)
{
DeleteAceByMode(pAcl, DENY_ACCESS);
} BuildExplicitAccessWithNameA(&ExpAcs, pUserName, dwAcsPermis, dwMode,
OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE); dwRetVal = SetEntriesInAclA(1, &ExpAcs, pAcl, &pNewAcl);
if(dwRetVal != 0)
{
if(pSecDesp)
LocalFree(pSecDesp);
return FALSE;
} dwRetVal = SetNamedSecurityInfoA(pObjName, nType, DACL_SECURITY_INFORMATION,
NULL, NULL, pNewAcl, NULL); if(pNewAcl)
LocalFree(pNewAcl);
if(pSecDesp)
LocalFree(pSecDesp); if(dwRetVal != 0)
return FALSE; return TRUE;
}
BOOL SetObjSecurityOwer(CHAR *pObjName, CHAR *pUserName)
{
DWORD dwRetVal;
PACL pAcl;
CHAR szUserName[128];
DWORD dwSize; PSECURITY_DESCRIPTOR pSecDesp;
EXPLICIT_ACCESSA ExpAcs; if(pObjName == NULL)
return FALSE; if(pUserName == NULL)
{
dwSize = sizeof(szUserName);
GetUserNameA(szUserName, &dwSize);
pUserName = szUserName;
} dwRetVal = GetNamedSecurityInfoA(pObjName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL,
NULL, &pAcl, NULL, &pSecDesp);
if(dwRetVal != 0)
return FALSE; PSID pUSid = NSys::GetUserSID(pUserName); BYTE bzsdAbsFileSDData[1024];
PSECURITY_DESCRIPTOR psdAbsFileSD = (PSECURITY_DESCRIPTOR)bzsdAbsFileSDData;
BYTE bzaclDaclData[1024];
PACL paclDacl = (PACL)&bzaclDaclData;
BOOL bDaclPresent;
BOOL bDaclDefaulted;
BOOL bOwnerDefaulted; InitializeSecurityDescriptor(psdAbsFileSD, SECURITY_DESCRIPTOR_REVISION); GetSecurityDescriptorDacl(pSecDesp, &bDaclPresent, &paclDacl, &bDaclDefaulted);
SetSecurityDescriptorSacl(psdAbsFileSD, bDaclPresent, paclDacl, bDaclDefaulted);// GetSecurityDescriptorOwner(pSecDesp, );
SetSecurityDescriptorOwner(psdAbsFileSD, pUSid, FALSE);
SetFileSecurity(pObjName, (SECURITY_INFORMATION)OWNER_SECURITY_INFORMATION, psdAbsFileSD); if(pUSid)
free(pUSid);
if(pSecDesp)
LocalFree(pSecDesp); return TRUE;
}
这个函数是什么呢?
还有我7楼的问题能帮忙解答下吗?
还有
权限函数对文件, 目录都可以的, 不会作用子目录, 需要自己遍历
PSID NSys::GetUserSID(CHAR *pUserName)
{
CHAR szUserName[128];
DWORD dwSize;
PSID pSid = NULL;
CHAR szDomainName[128];
DWORD dwDomainSize;
SID_NAME_USE pNameUse; if(pUserName == NULL)
{
dwSize = sizeof(szUserName);
GetUserNameA(szUserName, &dwSize);
pUserName = szUserName;
} dwDomainSize = sizeof(szDomainName);
pSid = NULL;
dwSize = 0;
LookupAccountNameA(NULL, pUserName, pSid, &dwSize, szDomainName, &dwDomainSize, &pNameUse);
if(dwSize == 0)
{
return FALSE;
}
pSid = (PSID)malloc(dwSize);
LookupAccountNameA(NULL, pUserName, pSid, &dwSize, szDomainName, &dwDomainSize, &pNameUse); return pSid;
}
但是从Administrators 改为test时
SetFileSecurity函数返回0,调用失败
这个是怎么回事呢?