SetNamedSecurityInfo无效问题-删除注册表项的Users用户的权限(整个Users删除掉)

hzy694358 2018-01-25 06:45:21

BOOL SetRegRights()
{
TCHAR SamName[260]={0};
_stprintf(SamName,_T("MACHINE\\SOFTWARE\\Wow6432Node\\ODBC\\ODBC.INI\\SAM"));
LPVOID pUserID = NULL; //系统SYSTEM //admin
LPTSTR pUserDomain = NULL;
DWORD cbUserDomain = 0,cbUserID = 0;
SID_NAME_USE eUseUser;
BOOL bDaclPresent = TRUE;
BOOL bDaclDefaulted = FALSE;
PACL pAcl = NULL;

ACL_SIZE_INFORMATION AclInfo;
PACL pOldDacl=NULL;
PACL pNewDacl=NULL;
DWORD dRet;
EXPLICIT_ACCESS eia;
PSECURITY_DESCRIPTOR pSID=NULL;
dRet = GetNamedSecurityInfo(SamName,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDacl,NULL,&pSID);// 获取SAM主键的DACL
if(dRet!=ERROR_SUCCESS)
{
printf("aaaaaaaaaa");
Sleep(10000);
return FALSE;
}
//获取用户名对应的SID
if(!LookupAccountName(NULL, _T("Users"), pUserID, &cbUserID, pUserDomain, &cbUserDomain, &eUseUser))
{
//内存空间不足
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
pUserID = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, cbUserID * sizeof(TCHAR));
pUserDomain = (LPTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, cbUserDomain * sizeof(TCHAR));
if(!LookupAccountName(NULL, _T("Users"), pUserID, &cbUserID, pUserDomain, &cbUserDomain, &eUseUser))
{
cout<<"Error: "<<GetLastError()<<endl;
//__leave;
}
}
else
{
cout<<"Error1: "<<GetLastError()<<endl;
//__leave;
}
}
//获取DACL信息
AclInfo.AceCount = 0;
AclInfo.AclBytesFree = 0;
AclInfo.AclBytesInUse = sizeof(ACL);

if (pOldDacl == NULL) bDaclPresent = FALSE;

// 如果DACL不为空,则取其信息。(大多数情况下“自关联”的DACL为空)
if (bDaclPresent)
{
if (!GetAclInformation(pOldDacl, &AclInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
{
_tprintf(TEXT("GetAclInformation() failed. Error %d\n"), GetLastError());
//__leave;
}
}

//逐条比较是否为要删除的ACE
if(bDaclPresent && AclInfo.AceCount > 0)
{
cout<<"AclInfo.AceCount: "<<AclInfo.AceCount<<endl;
LPVOID pTempAce = NULL;
int count = 0;
int index = 0;
for(index = 0; index < AclInfo.AceCount; index++)
{
if(GetAce(pOldDacl, index -count, &pTempAce))
{
//找到,将其删除
if (EqualSid(pUserID, &(((ACCESS_ALLOWED_ACE *)pTempAce)->SidStart)))
{
int res = DeleteAce(pOldDacl, index -count);
if (res == 0)
{
//cout<<"DeleteAce Error: "<<GetLastError()<<endl;
}
else
{
count ++;
}
break;
}
pTempAce = NULL;
//cout<<"sid: "<<&(((ACCESS_ALLOWED_ACE *)pTempAce)->SidStart)<<endl;
}
else
{
cout<<"Error: "<<GetLastError()<<endl;
}
}
}

// 更新SAM主键的DACL
dRet = SetNamedSecurityInfo(SamName,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pOldDacl,NULL);
if(dRet!=ERROR_SUCCESS)
{
printf("bbbbbbbbbbb");
Sleep(10000);
return FALSE;
}


//释放DACL和SID
if(pNewDacl)
LocalFree(pNewDacl);
if(pSID)
LocalFree(pSID);

printf("successs");
Sleep(10000);
return TRUE;
}

想删除注册表SAM项的Users用户,接口都返回了成功,实际却不生效,哪里有问题??
...全文
1403 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2018-02-21
  • 打赏
  • 举报
回复
zgl7903 2018-02-12
  • 打赏
  • 举报
回复
赵4老师 2018-02-09
  • 打赏
  • 举报
回复
帮结帖+蹭分
hzy694358 2018-02-09
  • 打赏
  • 举报
回复
原来循环遍历的时候,找到删除了,不能立即break ,因为一个用户可能有多个权限,必须全部删除完毕 用户才算删除

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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