好用 转:删除,修改注册表中需要设置权限的项
源地址: http://xue23.blog.163.com/blog/static/97934420068383532200/
作者博客:http://xue23.blog.163.com/
#include <Aclapi.h>#include <shlwapi.h>BOOL DeleteHardwareKey(void){ LPTSTR lpObjectName; SE_OBJECT_TYPE ObjectType;
PACL OldDACL,NewDACL;
PSECURITY_DESCRIPTOR SD;
EXPLICIT_ACCESS ea;
lpObjectName = "MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\Usb\\Vid_1106&Pid_0100";
ObjectType =SE_REGISTRY_KEY;
if (SetEntriesInAcl(0, NULL, NULL, &OldDACL)!=ERROR_SUCCESS)
return FALSE;
if (SetEntriesInAcl(0, NULL, NULL, &NewDACL)!=ERROR_SUCCESS)
return FALSE;
if(GetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL,
&OldDACL,
NULL, &SD) != ERROR_SUCCESS)
printf("指定的键不存在!");
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
if(SetEntriesInAcl(1, &ea, NULL, &NewDACL) != ERROR_SUCCESS)
goto Cleanup;
SetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL,
NewDACL, NULL);
SHDeleteKey(HKEY_LOCAL_MACHINE,_T("SYSTEM\\CurrentControlSet\\Enum\\Usb\\Vid_1106&Pid_0100"));
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;
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);
return TRUE;
}
注意:
lpObjectName = "MACHINE\\SYSTEM\\CurrentControlSet\\Enum\\Usb\\Vid_1106&Pid_0100";
和
SHDeleteKey(HKEY_LOCAL_MACHINE,_T("SYSTEM\\CurrentControlSet\\Enum\\Usb\\Vid_1106&Pid_0100"));
的区别