删除注册表项的用户(Users)的权限

//设置注册项权限-删除指定用户Users
BOOL SetRegRights()  
{  
	TCHAR  szError[4096] = {0};
	TCHAR SamName[260]={0};
	BOOL bSuccessed = FALSE;
	_stprintf(SamName,_T("MACHINE\\SOFTWARE\\Wow6432Node\\ODBC\\ODBC.INI\\SAMT"));
	LPVOID					pUserID = NULL;							
	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 pSD=NULL;  

	//以下为直接删除Users用户
	try
	{
		dRet = GetNamedSecurityInfo(SamName,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDacl,NULL,&pSD);// 获取SAM主键的DACL   
		if(dRet!=ERROR_SUCCESS)  
		{
			_stprintf(szError, _T("GetNamedSecurityInfo fail:%s"),GetLastError());
			throw LONG(__LINE__);
		}

		//获取用户名对应的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))
				{
					_stprintf(szError, _T("LookupAccountName fail1:%s"),GetLastError());
					throw LONG(__LINE__);
				}
			}
			else
			{
				_stprintf(szError, _T("LookupAccountName fail2:%s"),GetLastError());
				throw LONG(__LINE__);
			}
		}	

		//获取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)) 
			{
				_stprintf(szError, _T("GetAclInformation fail:%s"),GetLastError());
				throw LONG(__LINE__);
			}
		}

		//逐条比较是否为要删除的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 ++;
						}
					}
					pTempAce = NULL;
					//cout<<"sid:  "<<&(((ACCESS_ALLOWED_ACE *)pTempAce)->SidStart)<<endl;
				}
				else
				{
					_stprintf(szError, _T("GetAclInformation fail:%s"),GetLastError());
					throw LONG(__LINE__);
				}
			}

			if(index == AclInfo.AceCount)
			{
				_stprintf(szError, _T("%s没有可移除的权限\n"),SamName);
				cout<<"AclInfo: "<<szError<<endl;
			}
		}
	
		// 更新SAM主键的DACL    PROTECTED_DACL_SECURITY_INFORMATION:取消继承
		dRet = SetNamedSecurityInfo(SamName,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION|PROTECTED_DACL_SECURITY_INFORMATION,NULL,NULL,pOldDacl,NULL);  
		if(dRet!=ERROR_SUCCESS)  
		{
			_stprintf(szError, _T("SetNamedSecurityInfo fail:%s"),GetLastError());
			throw LONG(__LINE__);
		}
		bSuccessed = TRUE;
	}
	catch(LONG &Line)
	{
		Log(TEXT("c:\\IISLog.txt"), _bstr_t(__FILE__),Line, szError, NULL, NULL);
	}

	if(pUserID) HeapFree(GetProcessHeap(), 0, pUserID);
	if(pUserDomain) HeapFree(GetProcessHeap(), 0, pUserDomain);
	if(pOldDacl) LocalFree(pOldDacl);  
	if(pNewDacl) LocalFree(pNewDacl);  
	if(pSD) LocalFree(pSD);  

	return bSuccessed;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值