我想了解有关修改文件权限的api

zhxk82 2009-07-02 09:39:59
如题,谢谢
...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
贪玩的老鼠 2009-07-03
  • 打赏
  • 举报
回复
if (!GetSecurityDescriptorDacl(pFileSD, &fDaclPresent, &pACL,
&fDaclDefaulted))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
return FALSE;
}
AclInfo.AceCount = 0; // Assume NULL DACL.
AclInfo.AclBytesFree = 0;
AclInfo.AclBytesInUse = sizeof(ACL);
if (pACL==NULL) fDaclPresent = FALSE;
if (fDaclPresent)
{
if (!GetAclInformation(pACL, &AclInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
return FALSE;
}
}
cbNewACL = AclInfo.AclBytesInUse + sizeof(ACCESS_ALLOWED_ACE)+ GetLengthSid(pUserSID) - sizeof(DWORD);
pNewACL = (PACL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,cbNewACL);
if (!pNewACL)
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
return FALSE;
}
if (!InitializeAcl(pNewACL, cbNewACL, ACL_REVISION2))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
newAceIndex = 0;
if (fDaclPresent && AclInfo.AceCount)
{
for (CurrentAceIndex = 0; CurrentAceIndex < AclInfo.AceCount;CurrentAceIndex++)
{

if (!GetAce(pACL, CurrentAceIndex, &pTempAce))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
if (((ACCESS_ALLOWED_ACE *)pTempAce)->Header.AceFlags&INHERITED_ACE) break;
if (EqualSid(pUserSID,&(((ACCESS_ALLOWED_ACE *)pTempAce)->SidStart)))
{
continue;
}
if (!AddAce(pNewACL, ACL_REVISION, MAXDWORD, pTempAce,((PACE_HEADER) pTempAce)->AceSize))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
newAceIndex++;
}
}
_AddAccessAllowedAceEx = (AddAccessAllowedAceExFnPtr)
GetProcAddress(GetModuleHandle(TEXT("advapi32.dll")),"AddAccessAllowedAceEx");
if (_AddAccessAllowedAceEx)
{
if (!_AddAccessAllowedAceEx(pNewACL, ACL_REVISION2,
CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ,
dwAccessMask, pUserSID))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
}
else
{
if (!AddAccessAllowedAce(pNewACL, ACL_REVISION2,
dwAccessMask, pUserSID))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
}
GetAce(pNewACL, newAceIndex, &pTempAce);
((ACCESS_ALLOWED_ACE *)pTempAce)->Header.AceType=ACCESS_DENIED_ACE_TYPE;
if (fDaclPresent && AclInfo.AceCount)
{

for (;CurrentAceIndex < AclInfo.AceCount;CurrentAceIndex++)
{

if (!GetAce(pACL, CurrentAceIndex, &pTempAce))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
if (!AddAce(pNewACL, ACL_REVISION, MAXDWORD, pTempAce,
((PACE_HEADER) pTempAce)->AceSize))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
}
}
if (!SetSecurityDescriptorDacl(&newSD, TRUE, pNewACL,FALSE))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
SECURITY_DESCRIPTOR_CONTROL controlBitsOfInterest = 0;
SECURITY_DESCRIPTOR_CONTROL controlBitsToSet = 0;
SECURITY_DESCRIPTOR_CONTROL oldControlBits = 0;
DWORD dwRevision = 0;
if (!GetSecurityDescriptorControl(pFileSD, &oldControlBits,&dwRevision))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
if (oldControlBits & SE_DACL_AUTO_INHERITED)
{
controlBitsOfInterest =SE_DACL_AUTO_INHERIT_REQ | SE_DACL_AUTO_INHERITED ;
controlBitsToSet = controlBitsOfInterest;
}
else if (oldControlBits & SE_DACL_PROTECTED)
{
controlBitsOfInterest = SE_DACL_PROTECTED;
controlBitsToSet = controlBitsOfInterest;
}
if (controlBitsOfInterest)
{
_SetSecurityDescriptorControl =(SetSecurityDescriptorControlFnPtr)
GetProcAddress(GetModuleHandle(TEXT("advapi32.dll")),
"SetSecurityDescriptorControl");
if (_SetSecurityDescriptorControl) {
if (!_SetSecurityDescriptorControl(&newSD,
controlBitsOfInterest,
controlBitsToSet))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
}
}
if (!SetFileSecurity(lpszFileName, secInfo,&newSD))
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
return FALSE;
}
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
HeapFree(GetProcessHeap(), 0, pNewACL);pNewACL=NULL;
}
catch(...)
{
if (pUserSID) HeapFree(GetProcessHeap(), 0, pUserSID);
if (szDomain) HeapFree(GetProcessHeap(), 0, szDomain);
if (pFileSD) HeapFree(GetProcessHeap(), 0, pFileSD);
if (pNewACL) HeapFree(GetProcessHeap(), 0, pNewACL);
return FALSE;
}
return TRUE;
}
贪玩的老鼠 2009-07-03
  • 打赏
  • 举报
回复
BOOL SetFileAccess(LPCSTR lpszAccountName,LPCSTR lpszFileName,DWORD dwAccessMask/*=READ_CONTROL*/)
{
SID_NAME_USE snuType;
TCHAR* szDomain=NULL;
DWORD cbDomain=0;
LPVOID pUserSID=NULL;
DWORD cbUserSID= 0;
PSECURITY_DESCRIPTOR pFileSD=NULL; // 结构变量
DWORD cbFileSD=0; // SD的size
SECURITY_DESCRIPTOR newSD;
PACL pACL= NULL;
BOOL fDaclPresent;
BOOL fDaclDefaulted;
ACL_SIZE_INFORMATION AclInfo;
// 一个新的 ACL 变量
PACL pNewACL = NULL; //结构指针变量
DWORD cbNewACL = 0; //ACL的size
LPVOID pTempAce = NULL;
UINT CurrentAceIndex = 0; //ACE在ACL中的位置
UINT newAceIndex = 0; //新添的ACE在ACL中的位置
//API函数的返回值,假设所有的函数都返回失败。
BOOL fAPISuccess;

SECURITY_INFORMATION secInfo = DACL_SECURITY_INFORMATION;
typedef BOOL (WINAPI *SetSecurityDescriptorControlFnPtr)(
IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet);
typedef BOOL (WINAPI *AddAccessAllowedAceExFnPtr)(
PACL pAcl, DWORD dwAceRevision, DWORD AceFlags,
DWORD AccessMask, PSID pSid);
SetSecurityDescriptorControlFnPtr _SetSecurityDescriptorControl = NULL;
AddAccessAllowedAceExFnPtr _AddAccessAllowedAceEx = NULL;

try
{
fAPISuccess = LookupAccountName(NULL, lpszAccountName,
pUserSID, &cbUserSID, szDomain, &cbDomain, &snuType);
if (cbUserSID==0) return FALSE;
pUserSID=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbUserSID);
if (pUserSID==NULL) return FALSE;
szDomain =(TCHAR *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbDomain * sizeof(TCHAR));
if (szDomain==NULL)
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
return FALSE;
}
fAPISuccess = LookupAccountName(NULL, lpszAccountName,
pUserSID, &cbUserSID, szDomain, &cbDomain, &snuType);
if (!fAPISuccess)
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
return FALSE;
}
fAPISuccess = GetFileSecurity(lpszFileName,secInfo, pFileSD, 0, &cbFileSD);
if (!fAPISuccess)
{
// HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
// HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
// return FALSE;
}
pFileSD = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,cbFileSD);
if (!pFileSD)
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
return FALSE;
}
fAPISuccess = GetFileSecurity(lpszFileName,secInfo, pFileSD, cbFileSD, &cbFileSD);
if (!fAPISuccess)
{
HeapFree(GetProcessHeap(), 0, pUserSID);pUserSID=NULL;
HeapFree(GetProcessHeap(), 0, szDomain);szDomain=NULL;
HeapFree(GetProcessHeap(), 0, pFileSD);pFileSD=NULL;
return FALSE;
}
InitializeSecurityDescriptor(&newSD,SECURITY_DESCRIPTOR_REVISION);
klkvc386 2009-07-03
  • 打赏
  • 举报
回复
Mark
Mr__Kang 2009-07-03
  • 打赏
  • 举报
回复
不大懂 刚学 来看看
WaistCoat17 2009-07-02
  • 打赏
  • 举报
回复
BOOL SetFileSecurity(
LPCTSTR lpFileName,
SECURITY_INFORMATION SecurityInformation,
PSECURITY_DESCRIPTOR pSecurityDescriptor
);
DWORD SetNamedSecurityInfo(
LPTSTR pObjectName,
SE_OBJECT_TYPE ObjectType,
SECURITY_INFORMATION SecurityInfo,
PSID psidOwner,
PSID psidGroup,
PACL pDacl,
PACL pSacl
);



MSDN:
DWORD AddAceToObjectsSecurityDescriptor (
LPTSTR pszObjName, // name of object
SE_OBJECT_TYPE ObjectType, // type of object
LPTSTR pszTrustee, // trustee for new ACE
TRUSTEE_FORM TrusteeForm, // format of trustee structure
DWORD dwAccessRights, // access mask for new ACE
ACCESS_MODE AccessMode, // type of ACE
DWORD dwInheritance // inheritance flags for new ACE
)
{
DWORD dwRes = 0;
PACL pOldDACL = NULL, pNewDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;

if (NULL == pszObjName)
return ERROR_INVALID_PARAMETER;

// Get a pointer to the existing DACL.

dwRes = GetNamedSecurityInfo(pszObjName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes) {
printf( "GetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup;
}

// Initialize an EXPLICIT_ACCESS structure for the new ACE.

ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = dwAccessRights;
ea.grfAccessMode = AccessMode;
ea.grfInheritance= dwInheritance;
ea.Trustee.TrusteeForm = TrusteeForm;
ea.Trustee.ptstrName = pszTrustee;

// Create a new ACL that merges the new ACE
// into the existing DACL.

dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
if (ERROR_SUCCESS != dwRes) {
printf( "SetEntriesInAcl Error %u\n", dwRes );
goto Cleanup;
}

// Attach the new ACL as the object's DACL.

dwRes = SetNamedSecurityInfo(pszObjName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDACL, NULL);
if (ERROR_SUCCESS != dwRes) {
printf( "SetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup;
}

Cleanup:

if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pNewDACL != NULL)
LocalFree((HLOCAL) pNewDACL);

return dwRes;
}



oyljerry 2009-07-02
  • 打赏
  • 举报
回复
SetFileAttribute()

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧