在2k系统操作注册表时,发现某些健必须要有权限问题; 察看各位大大的贴,可惜没有一个合适的结果; 有人说:可以提高使用者权限;但是事实上好像不是很好用; 经过艰苦.艰苦.艰艰苦苦;终于在msdn上找到了一些好动动; 不敢独享,(哎,我可不想某人,好东西藏到自己都忘了的地方) 整理出来一些对某些人有用的东西:嘿嘿,代码如下: 严重建议:大家都把好东西往上贴吧!!!!!!
欢迎来信探讨: lanren_me@etang.com
//开始重新配置使用注册表的权限------------------------------------------------
LPTSTR lpObjectName; SE_OBJECT_TYPE ObjectType; //#include <aclapi.h>
PACL OldDACL,NewDACL; PSECURITY_DESCRIPTOR SD; EXPLICIT_ACCESS ea;
lpObjectName = "MACHINE\\SYSTEM\\ControlSet001\\Enum\\Root";
ObjectType =SE_REGISTRY_KEY;
//建立一个空的ACL; if (SetEntriesInAcl(0, NULL, NULL, &OldDACL)!=ERROR_SUCCESS) return;
if (SetEntriesInAcl(0, NULL, NULL, &NewDACL)!=ERROR_SUCCESS) return;
//获取现有的ACL列表到OldDACL if(GetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, &OldDACL, NULL, &SD) != ERROR_SUCCESS) Application->MessageBox("指定的键不存在!","提示",MB_OK);
//设置用户名"Everyone"对指定的键有所有操作权到结构ea ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(&ea, "Everyone", // name of trustee GENERIC_ALL, // type of access SET_ACCESS, // access mode SUB_CONTAINERS_AND_OBJECTS_INHERIT); //让自健继承他的权限; inheritance mode
//合并结构ea和OldDACL的权限列表到新的NewDACL if(SetEntriesInAcl(1, &ea, NULL, &NewDACL) != ERROR_SUCCESS) goto Cleanup;
//把新的ACL写入到指定的键 SetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, NewDACL, NULL);
///////开始操作注册表////////////////////////////////////////////////////////// //................................................... ////////////////////////////////////////////////////////////////////////////
//恢复注册表的权限;
BuildExplicitAccessWithName(&ea, "Everyone", // name of trustee GENERIC_READ, // type of access SET_ACCESS, // access mode NO_INHERITANCE); //让自健继承他的权限; inheritance mode
if(SetEntriesInAcl(1, &ea, NULL, &OldDACL) != ERROR_SUCCESS) goto Cleanup;
//把旧的ACL写入到指定的键 SetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, OldDACL, NULL);
//释放指针 Cleanup: if(SD != NULL) LocalFree((HLOCAL) SD); if(NewDACL != NULL) LocalFree((HLOCAL) NewDACL); if(OldDACL != NULL) LocalFree((HLOCAL) OldDACL);
|