1
uses
aclapi,AccCtrl;
2

3
var
4
lpObjectName:LPTSTR;
5
OldDACL,NewDACL:PACL ;
//
uses
aclapi
6
ObjectType:SE_OBJECT_TYPE ;
//
uses
AccCtrl
7
SD:PSECURITY_DESCRIPTOR;
8
ea: EXPLICIT_ACCESS;
9
label
Cleanup;
10
begin
11
lpObjectName :
=
'
MACHINE\\SYSTEM\\ControlSet001\\Enum\\Root
'
;
12
13
//
ObjectType :
=
SE_REGISTRY_KEY;
14
15
//
建立一个空的ACL;
16
if
SetEntriesInAcl(
0
,
nil
,
nil
, OldDACL)
<>
ERROR_SUCCESS
then
17
exit;
18
19
if
(SetEntriesInAcl(
0
,
nil
,
nil
, NewDACL)
<>
ERROR_SUCCESS)
then
20
exit;
21
22
//
获取现有的ACL列表到OldDACL
23
if
GetNamedSecurityInfo(lpObjectName, ObjectType,
24
DACL_SECURITY_INFORMATION,
25
nil
,
nil
,
26
OldDACL,
27
nil
, SD)
<>
ERROR_SUCCESS
then
28
Application.MessageBox(
'
指定的键不存在!
'
,
'
提示
'
,MB_OK);
29
30
//
设置用户名"Everyone"对指定的键有所有操作权到结构ea
31
ZeroMemory(@ea, sizeof(EXPLICIT_ACCESS));
32
33
BuildExplicitAccessWithName(@ea,
34
'
Everyone
'
,
//
name
of
trustee
35
GENERIC_ALL,
//
type
of
access
36
SET_ACCESS,
//
access mode
37
SUB_CONTAINERS_AND_OBJECTS_INHERIT);
//
让自健继承他的权限; inheritance mode
38
39
//
合并结构ea和OldDACL的权限列表到新的NewDACL
40
if
SetEntriesInAcl(
1
, @ea,
nil
, NewDACL)
<>
ERROR_SUCCESS
then
41
goto
Cleanup;
42
43
//
把新的ACL写入到指定的键
44
SetNamedSecurityInfo(lpObjectName, ObjectType,
45
DACL_SECURITY_INFORMATION,
46
nil
,
nil
,
47
NewDACL,
48
nil
);
49
50
51
///
开始操作注册表
//
52
//
恢复注册表的权限;
53
54
BuildExplicitAccessWithName(@ea,
55
'
Everyone
'
,
//
name
of
trustee
56
GENERIC_READ,
//
type
of
access
57
SET_ACCESS,
//
access mode
58
NO_INHERITANCE);
//
让自健继承他的权限; inheritance mode
59
60
if
SetEntriesInAcl(
1
, @ea,
nil
, OldDACL)
<>
ERROR_SUCCESS
then
61
goto
Cleanup;
62
63
//
把旧的ACL写入到指定的键
64
SetNamedSecurityInfo(lpObjectName, ObjectType,
65
DACL_SECURITY_INFORMATION,
66
nil
,
nil
,
67
OldDACL,
68
nil
);
69
70
//
释放指针
71
Cleanup:
72
if
SD
<>
nil
then
73
LocalFree(HLOCAL (SD));
74
if
NewDACL
<>
nil
then
75
LocalFree(HLOCAL (NewDACL));
76
if
OldDACL
<>
nil
then
77
LocalFree(HLOCAL( OldDACL));
78
以下为代码运行前后的对比图片.

2


3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

设置权限以前注册表的权限.
设置权限后未恢复的注册表权限