在2k系統操作注冊表時,發現某些健必須要有權限問題;
察看各位大大的貼,可惜沒有一個合適的結果;
有人說:可以提高使用者權限;但是事實上好像不是很好用;
經過艱苦.艱苦.艱艱苦苦;終於在msdn上找到了一些好動動;
不敢獨享,(哎,我可不想某人,好東西藏到自己都忘了的地方)
整理出來一些對某些人有用的東西:嘿嘿,代碼如下:
嚴重建議:大家都把好東西往上貼吧!!!!!!
歡迎來信探討: [email protected]
//開始重新配置使用注冊表的權限------------------------------------------------
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);