如何删除HKEY_CLASSES_ROOT\CLSID中子项?

smartdj1 2011-03-14 09:38:45
WIN7中这个注册表分支中的子项只有TrustedInstaller有完全控制权限,程序没法删除子项,手动操作只有先更改子项的所有者然后更改所有者的权限这个办法可以删除子项,但是如何使用VC来实现?从网络上看到很多提权的程序都没作用。
小弟跪求了。
...全文
1196 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存取
注册表修改大全 作者:Sunny 编辑:Sunny 编辑日期:2002年12月17日 23:11分 :http://www.sunny.com/WinME : sunny@elong.com ★ 更改关闭应用程序时出现“等待”对话框的时间 有时应用程序因某种原因,会没有响应,当我们按下CTRL+ALT+DEL来结束应用程序时,系统要等一段时间才能结束任务,我们可以修改注册表来减少这段时间。 打开注册表,找到主键:“HKEY_CURRENT_USER\Control Panel\desktop”,在右侧窗口新建一“字符串值”,将其命名为“WaitToKillAppTimeOut”。双击“WaitToKillAppTimeOut,然后在“编辑字符串”对话框的“键值”框中输入5000(单位为ms,缺省值为20000ms,即20秒),为了缩短系统关闭应用的等待时间,您可以将此等待时间降低为20000ms以下,如10000ms、15000ms等。 ★ 启动时给自己个欢迎窗口 打开注册表,找到主键: “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Winlogon”,在右边窗口新建两个字符串,“LegalNoticeCaption”和“LegalNoticeText”。 “LegalNoticeCaption”是指弹出窗口的标题,修改它的值。在这里自己可以随便起个名字如“我的计算机”。 "LegalNoticeText",是指你想在登录对话框中显示的文字,如改为“祝你今天工作愉快!”这样,以后启动电脑时会自动弹出这个欢迎框。 ★ 设定口令的最小长度 通常登陆口令可以设置为空。为了安全起见,可以设定口令的最小长度,以防止口令被破解。 打开注册表编辑器,找到主键: “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Polices\ Network”键下。 在右侧窗口中新建二进制键值“MinPwdLen”,值为设定的口令的最小长度,默认值为0,表示口令可以为空。如设为“3”,则口令最小长度为3。 ★使Windows口令必须为数字和字母 设定口令为字母和数字,可以增加别人破你的口令的难度,如果口令长度足够长,则很难破解。打开注册表,找到: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Network分支,在右窗格内新建一个DWORD值为“AlphanumPwds”,修改“AlphanumPwds”键值,在出现的对话框中的“键值”框内输入1。 ★ 防止匿名用户登录 WINDOWS的本身的登陆窗口安全性很差,在不知道口令的情况下可以轻易点“取消”或按“ESC”键轻松进入。修改注册表可以防止匿名用户登陆。 打开注册表,找到主键: “HKEY_LOCAL_MACHINE\Network\Logon”,新建DWORD值,名为“MustBeValidated”,键值为“1”;再重新启动机器后,你会发现通过点击Cancel按钮进Windows的办法已经不灵了。(如果自己都进不去了,可以以安全模式进入,然后将其值改为0。) ★禁用注册表编辑器Regedit 通过修改注册表,可以控制整个机器,可以禁止修改注册表,防止别人破坏HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System,如果你发现“Policies”下面没有“System”,则在它下面新建一个主键,名字就是“"System”,然后在右侧窗口中新建一个DWORD,名字取为“DisableRegistryTools”,修改它的值为“1”,以后,别人、甚至是你都无法再用regedit.exe 啦,如果要恢复的话,用记事本建立一个REG.REG文件,保存后双击即可导入注册表 REGEDIT 4 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System] "DisableRegistryTools"=dword:00000000 。 ★禁用口令缓存 打开注册表,找到主键: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Ne

3,882

社区成员

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

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