OS:Windows 7
环境:MFC做一个应用程序,点击按钮要删除注册表 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Enum\FTDIBUS在访问权限处,OWNER RIGHTS是特殊访问权限,可以任意删除修改。
但是everyon是只读,所以我不能删除掉他。我要用什么方法才能删除掉这个注册表呢。
1.访问时,修改访问权限后,再删除?怎么修改访问权限呢?
2.访问时,修改访问者,让自己变成OWNER,再删除?请不吝赐教!

解决方案 »

  1.   

    先获得take ownership特权,然后用WRITE_OWNER打开键,修改所有者为自己
    然后以WRITE_DAC打开键,为自己添加一个DELETE允许的ace
    然后就可以删
      

  2.   

    DWORD GetNamedSecurityInfo(
    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组成员完全控制权限
      

  3.   


    怎么不好用呢?还是访问不了啊。
    LPSTR SamName = "HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\FTDIBUS"; 
    我只把这个路径改一下就可以了把?还是要改其他地方。
    这个错了吧
    if(dRet=ERROR_SUCCESS)
    应该是if(dRet!=ERROR_SUCCESS)吗?
      

  4.   


    // 提升权限 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;
    }
      

  5.   


    多谢回答,我的项目属性的的文字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
    吗?
      

  6.   

    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\FTDIBUS\VID_0403+PID_6001+A600bKOyA
    这个路径。要写成MACHINE\\SYSTEM\\controlSet001\\Enum\\FTDIBUS\\VID_0403+PID_6001+A600bKOyA
      

  7.   

    应该是这样MACHINE\\SYSTEM\\controlSet001\\Enum\\FTDIBUS\\VID_0403+PID_6001+A600bKOyA
      

  8.   


    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不成功,前两个函数都成功。这是怎么回事啊
      

  9.   

    OS:Windows7
    编程环境: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;}