//设置注册项权限-删除指定用户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;
}
删除注册表项的用户(Users)的权限
最新推荐文章于 2024-06-09 20:19:41 发布