OS:Windows 7
环境:MFC做一个应用程序,点击按钮要删除注册表 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\FTDIBUS在访问权限处,OWNER RIGHTS是特殊访问权限,可以任意删除修改。
但是everyon是只读,所以我不能删除掉他。我要用什么方法才能删除掉这个注册表呢。
1.访问时,修改访问权限后,再删除?怎么修改访问权限呢?
2.访问时,修改访问者,让自己变成OWNER,再删除?请不吝赐教!
环境:MFC做一个应用程序,点击按钮要删除注册表 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\FTDIBUS在访问权限处,OWNER RIGHTS是特殊访问权限,可以任意删除修改。
但是everyon是只读,所以我不能删除掉他。我要用什么方法才能删除掉这个注册表呢。
1.访问时,修改访问权限后,再删除?怎么修改访问权限呢?
2.访问时,修改访问者,让自己变成OWNER,再删除?请不吝赐教!
解决方案 »
- MFC,我在建立单文档程序的时候,没有选择带滚动的视图?
- if (fClass & AFX_WND_REG)是什么意思
- PASSIVE_LEVEL == KeGetCurrentIrql() / UserMode == ExGetPreviousMode() 区别?
- 多文档时如何打开新的框架窗口时关闭之前的窗口啊?
- 如何通过点击listctrl中得一行之后获得显示相应得图片 !之后显示??
- MDI界面程序如何实现在子框中显示多个窗体界面?
- 本人替我们公司“重金”求构WIN2003多媒体服务器的防盗链软件。
- 关于基于对话框应用程序使用菜单的Setcheck()函数出现的问题
- 对话框的显示问题?
- 请大家给个建议
- 分享下自己的源代码(DirectShow),顺便请人帮忙看下程序的实现方式是否正确
- 要做一个下载工具,如何判断一些链接是可以下载文件的呢?比如:http://www.icxx.net/Pdf/Down/91C03D88362532DC7C173
然后以WRITE_DAC打开键,为自己添加一个DELETE允许的ace
然后就可以删
LPTSTR pObjectName, // object name
SE_OBJECT_TYPE ObjectType, // object type
SECURITY_INFORMATION SecurityInfo, // 消息类型
PSID *ppsidOwner, // 所有者的SID
PSID *ppsidGroup, // 以前的组 SID
PACL *ppDacl, // DACL
PACL *ppSacl, // SACL
PSECURITY_DESCRIPTOR *ppSecurityDescriptor // SD
);#include <windows.h>
#include <stdio.h>
#include <Aclapi.h>#pragma comment(lib,"Advapi32")int main()
{
LPSTR SamName = "MACHINE\\SAM\\SAM"; //要修改的SAM项路径
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)
return 0;
//创建一个ACE,允许Administrators组成员完全控制对象,并允许子对象继承此权限
ZeroMemory(&eia,sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(&eia,"Administrators",KEY_ALL_ACCESS,SET_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);
// 将新的ACE加入DACL
dRet = SetEntriesInAcl(1,&eia,pOldDacl,&pNewDacl);
if(dRet=ERROR_SUCCESS)
return 0;
// 更新SAM主键的DACL
dRet = SetNamedSecurityInfo(SamName,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);
if(dRet=ERROR_SUCCESS)
return 0;
//释放DACL和SID
if(pNewDacl)LocalFree(pNewDacl);
if(pSID)LocalFree(pSID);
return 0;
}以上程序用于修改SAM项的权限,赋于Administrators组成员完全控制权限
怎么不好用呢?还是访问不了啊。
LPSTR SamName = "HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\FTDIBUS";
我只把这个路径改一下就可以了把?还是要改其他地方。
这个错了吧
if(dRet=ERROR_SUCCESS)
应该是if(dRet!=ERROR_SUCCESS)吗?
// 提升权限 WindowsXP 下成功 其他OS没有试过
BOOL ConfigRight(TCHAR* szPath)
{
if (szPath == NULL)
{
return FALSE;
}
BOOL bRet = TRUE; SE_OBJECT_TYPE objectType;
PACL newDACL;
objectType = SE_REGISTRY_KEY; if (SetEntriesInAclW(0, NULL, NULL, &newDACL) != ERROR_SUCCESS)
{
return FALSE;
} DWORD dwRet = 0;
EXPLICIT_ACCESSW ea;
memset(&ea, 0, sizeof(EXPLICIT_ACCESS)); BuildExplicitAccessWithNameW(&ea, L"Everyone", GENERIC_ALL, SET_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT); if (SetEntriesInAclW(1, &ea, NULL, &newDACL) != ERROR_SUCCESS)
{
bRet = FALSE;
goto Clean_Up;
} if (SetNamedSecurityInfoW(szPath, objectType, DACL_SECURITY_INFORMATION, NULL, NULL, newDACL, NULL) != ERROR_SUCCESS)
{
bRet = FALSE;
goto Clean_Up;
}Clean_Up:
if (newDACL != NULL)
{
LocalFree((HLOCAL)newDACL);
} return bRet;
}
多谢回答,我的项目属性的的文字set,因为其他需要,从unicode改成了multi Byte 文字set。
编译就会出错。我就把SetNamedSecurityInfoW变成了SetNamedSecurityInfo。
这样可以吧,但是szPath应该怎么写呢,
我要删除的是:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\FTDIBUS\VID_0403+PID_6001+A600bKOyA
这个路径。要写成SYSTEM\\controlSet001\\Enum\\FTDIBUS\\VID_0403+PID_6001+A600bKOyA
吗?
这个路径。要写成MACHINE\\SYSTEM\\controlSet001\\Enum\\FTDIBUS\\VID_0403+PID_6001+A600bKOyA
dRet = SetNamedSecurityInfo(SamName,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);
if(dRet=ERROR_SUCCESS)
return 0;if里面的语句应该是if(dRet!=ERROR_SUCCESS)吧?
我改成!=了,但是SetNamedSecurityInfo不成功,前两个函数都成功。这是怎么回事啊
编程环境:MFC
为了其他需要,把Unicode改成了 multi byte文字。要修改注册表权限,以便删除注册表。
1.用了下面的代码,但是在SetNamedSecurityInfo处没有成功,弹出对话框"3".
但是用CString er;
er.Format("%d",ERROR_SUCCESS);
AfxMessageBox(er);
获取的值是0,用%s的话是null。
目标:也就是说,现在,只有Everyone下的读取选框是被选中的,怎样才能让full control选框也被选中啊。这样才能更改注册表是吧?
2.注册表的打开和删除放在下面的位置度不对?
求各位技术大牛,多多指教。
SubKey = "SYSTEM\\ControlSet001\\Enum\\FTDIBUS";
LPSTR SamName = "MACHINE\\SYSTEM\\ControlSet001\\Enum\\FTDIBUS"; //要修改的SAM项路径
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)
{AfxMessageBox("1");return 0;}
//创建一个ACE,允许Everyone组成员完全控制对象,并允许子对象继承此权限
ZeroMemory(&eia,sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(&eia,"Everyone",KEY_ALL_ACCESS,SET_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);
// 将新的ACE加入DACL
dRet = SetEntriesInAcl(1,&eia,pOldDacl,&pNewDacl);
if(dRet!=ERROR_SUCCESS)
{AfxMessageBox("2");return 0;}
// 更新SAM主键的DACL
dRet = SetNamedSecurityInfo(SamName,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);
if(dRet!=ERROR_SUCCESS)
{AfxMessageBox("3");return 0;} if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,SubKey,0,KEY_WRITE,&rKey)==ERROR_SUCCESS)//打开和删除放在这个地方对不对?
{
if( RegDeleteTree( HKEY_LOCAL_MACHINE, SubKey )==ERROR_SUCCESS) {
AfxMessageBox("删除成功");
RegCloseKey(rKey);
}
}
else
{
AfxMessageBox("不能打开文件");
} //释放DACL和SID
if(pNewDacl)LocalFree(pNewDacl);
if(pSID)LocalFree(pSID);
{AfxMessageBox("4");return 0;}