如何删除HKEY_CLASSES_ROOT\CLSID中子项?

smartdj1 2011-03-14 09:38:45
WIN7中这个注册表分支中的子项只有TrustedInstaller有完全控制权限,程序没法删除子项,手动操作只有先更改子项的所有者然后更改所有者的权限这个办法可以删除子项,但是如何使用VC来实现?从网络上看到很多提权的程序都没作用。
小弟跪求了。
...全文
1206 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Defonds 2011-03-25
  • 打赏
  • 举报
回复
权限不足?
Lactoferrin 2011-03-24
  • 打赏
  • 举报
回复
ribonucleic_acid@126.com
smartdj1 2011-03-24
  • 打赏
  • 举报
回复
能给我你的联系方式吗?smart.dj@163.com我再去试试。
Lactoferrin 2011-03-19
  • 打赏
  • 举报
回复
如果你要改写dacl,应该使用take ownership特权,先用WRITE_OWNER打开键,改写要删除的键的所有者为自己的账户,然后使用WRITE_DAC打开键,修改dacl,添加自己的账户的DELETE权限,然后再删除
Lactoferrin 2011-03-19
  • 打赏
  • 举报
回复
你搞错我的意思
smartdj1 2011-03-19
  • 打赏
  • 举报
回复
现在创建子项成功了。可是删除却还没有解决。
smartdj1 2011-03-19
  • 打赏
  • 举报
回复
这是我写的代码
// 更新SAM主键的DACL
dwRet = SetNamedSecurityInfo(SamName.GetBuffer(), SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDacl, NULL);
返回值为5拒绝访问
没解决啊
smartdj1 2011-03-19
  • 打赏
  • 举报
回复
BOOL TakeRegOwnership()
{
DWORD dwRet;
CString SamName = _T("CLASSES_ROOT\\CLSID\\{0010668C-0801-4DA6-A4A4-826522B6D28F}");
PSECURITY_DESCRIPTOR pSD = NULL;
PACL pOldDacl = NULL;
PACL pNewDacl = NULL;
EXPLICIT_ACCESS ea;
HKEY hKey = NULL;
BOOL result = TRUE;

// 获取SAM主键的DACL
dwRet = GetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDacl, NULL, &pSD);
if (dwRet != ERROR_SUCCESS)
{
goto FreeAndExit;
}

// 创建一个ACE,允许Everyone完全控制对象,并允许子对象继承此权限
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(&ea, _T("Everyone"), KEY_ALL_ACCESS, SET_ACCESS,
SUB_CONTAINERS_AND_OBJECTS_INHERIT);

for (int i = 0; i < 100; i++)
{
if (!DeleteAce(pOldDacl, i))
{
int errorCode = GetLastError();
}
}
// 将新的ACE加入DACL
dwRet = SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl);
if (dwRet != ERROR_SUCCESS)
{
goto FreeAndExit;
}

// 更新SAM主键的DACL
dwRet = SetNamedSecurityInfo(SamName.GetBuffer(), SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDacl, NULL);
if (dwRet != ERROR_SUCCESS)
{
goto FreeAndExit;
}

result = TRUE;

FreeAndExit:
if (hKey) RegCloseKey(hKey);
if (pNewDacl) LocalFree(pNewDacl);

if (pSD) LocalFree(pSD);
return result;
}
// CAutoFitDlg 消息处理程序

BOOL EnablePrivilege(HANDLE hToken,CString szPrivName)
{

TOKEN_PRIVILEGES tkp;

LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限

return( (GetLastError()==ERROR_SUCCESS) );

}

HKEY key;
DWORD dwDisposition;

HANDLE hToken;


if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
{

if( EnablePrivilege(hToken,SE_BACKUP_NAME) )

if( EnablePrivilege(hToken,SE_RESTORE_NAME) )

if( TakeRegOwnership() )
MessageBox(_T("1"));
int a=::RegCreateKeyEx(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Classes\\CLSID\\{0010668C-0801-4DA6-A4A4-826522B6D28F}\\cool"), 0, NULL,
REG_OPTION_BACKUP_RESTORE, KEY_ALL_ACCESS , NULL, &key,
&dwDisposition);

if ( a != ERROR_SUCCESS )
return FALSE;

//if (!m_bLazyWrite) ::RegFlushKey(hKey);
::RegCloseKey(key);
}
yiyefangzhou24 2011-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lactoferrin 的回复:]
首先要以管理员身份运行程序,然后启用take ownership特权即可更改所有者

如果启用了还原特权,就可以在RegCreateKeyEx中传人REG_OPTION_BACKUP_RESTORE绕过dacl获得KEY_WRITE存取
[/Quote]这人是大牛,你试试看,操作系统的高级权限一般正常编写比较难获得
bdmh 2011-03-15
  • 打赏
  • 举报
回复
先提权试试
Lactoferrin 2011-03-15
  • 打赏
  • 举报
回复
首先要以管理员身份运行程序,然后启用take ownership特权即可更改所有者

如果启用了还原特权,就可以在RegCreateKeyEx中传人REG_OPTION_BACKUP_RESTORE绕过dacl获得KEY_WRITE存取

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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