获取注册表某一键值的权限

lxwyk 2004-11-09 08:26:25
各位大虾,请问如何获取注册表某一键值对于不同用户组的权限,谢谢了。
...全文
446 3 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
luke5678 2004-11-10
  • 打赏
  • 举报
回复
来自:DragonPC_??? 时间:2002-1-19 11:19:00 ID:869662

Project JEDI Code Library (JCL)
ftp://delphi-jedi.org/Code_Library/Release_1_11/JCL.zip

Project JEDI ACLAPI, ACLUI头文件
(JwaAclUI.pas, JwaAclApi.pas) - ftp://delphi-jedi.org/api/Win32API.zip

JCL 中有一个JclSecurity.pas unit,有一个函数叫做AllowRegKeyForEveryone就是干这个
事情的,我调试通过

function AllowRegKeyForEveryone(Key: HKEY; Path: string): Boolean;
var
WidePath: PWideChar;
Len: Integer;
begin
case Key of
HKEY_LOCAL_MACHINE:
Path := 'MACHINE\' + Path;
HKEY_CURRENT_USER:
Path := 'CURRENT_USER\' + Path;
HKEY_CLASSES_ROOT:
Path := 'CLASSES_ROOT\' + Path;
HKEY_USERS:
Path := 'USERS\' + Path;
end;
Len := (Length(Path)+1)*SizeOf(WideChar);
GetMem(WidePath,Len);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(Path), -1, WidePath, Len);
Result := SetNamedSecurityInfoW(WidePath, SE_REGISTRY_KEY,
DACL_SECURITY_INFORMATION, nil, nil, nil, nil) = ERROR_SUCCESS;
FreeMem(WidePath);
end;

SetNamedSecurityInfo函数设置特定securable object的security descriptor, 是Access Control API,
在下载的Jed Object Pascal API Library里面声明了,给你这个函数对不起你,我跟你谈
谈我花了一晚上了解的冬冬吧。

SID(Security identifiers) 是一个可变记录体, 用于Windows NT的安全模型,它的主
要功能是定义安全对象(identify security subjects, 泛指包含了security descriptor的
对象, 用户进程, 注册表, 文件等等这些冬冬), 一方面SID是一个通用而强大的系统权限控
制方式,另一方面,SID太TMD的复杂了。

SID的主要功能
- 获取用户、用户组可以使用到的对象(securable object)
- 获得访问特别的对象的权限,Access Control List(ACL)就是干这个冬冬的,
ACL由Access Control Entries(ACE)组成,ACE就是由SID和Access Flags
共同标记的记录机构。
- 等等等等(我都懒得仔细看下去)

SID通常以字符串的形式保存,比如EVERYONE用户的SID通常为('S-1-1-0'), 它可能存
储在文件里面, 也可能存储在注册表(比如HKEY_USERS下面的键名), 甚至通过文件夹的名字
(看看Windows回收站RECYCLER的子目录)来保存。所以,一般情况下面(什么是特殊情况我也
没有搞明白), 我们使用字符串访问SID, Windows API提供了函数用于SID和String之间相互
转换的函数(LookupAccountSid, LookupAccountName), 下面是一些常用的SID字符串标记

Everyone S-1-1-0
NT Authority S-1-5
Dialup S-1-5-1
Network S-1-5-2
Batch S-1-5-3
Interactive S-1-5-4
Service S-1-5-6
AnonymousLogon S-1-5-7 (aka null logon session)
Proxy S-1-5-8
ServerLogon S-1-5-9 (aka domain controller account)
Self S-1-5-10 (self RID)
Authenticated User S-1-5-11 (Authenticated user somewhere)
Restricted Code S-1-5-12 (Running restricted code)
Terminal Server S-1-5-13 (Running on Terminal Server)
Remote Logon S-1-5-14 (Remote Interactive Logon)
(Logon IDs) S-1-5-5-X-Y
(NT non-unique IDs) S-1-5-0x15-...
(Built-in domain) s-1-5-0x20

这些定义并不一定是标准, 比如俄文版Windows 2000就会有所区别, 也许中文版也会有
些不同(我用的是英文版Win2000, 完全一样)

当用户登陆进入Windows NT/2000/XP系统, 正确输入用户名和密码, 成功的话, 系统创
建一个Access token, 而这个用户运行的每个进程都自动制作一个Access token的副本,
Access token包括SID信息用以指明用户是那个用户和隶属于那个用户组, Access token也
包含了用户或用户组的privileges list(特权列表), 当用户进程需要使用系统对象的时候,
系统通过进程的SID判断进程隶属于那个用户, 当用户需要执行一些系统任务的时候, 系统
通过进程的privileges来判断, 比如执行关机ExitWindows函数. 看到这里, 兄弟应该明白
NT下的关机程序和NT下的注册表处理程序是两个完全不同的概念了吧, 关机是添加privileges
特权, 注册表作为一个系统对象, 需要的是修改security descriptor.

Sv-COM VCL Component
http://www.aldyn.ru/

SAM-Solution NTSet VCL Component
http://www.sam-solutions.net/

Registry Key Security and Access Rights
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/regapi_9zoz.asp

Security Identifiers (SIDs)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/security_identifiers_sids_.asp

Access Tokens
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/access_tokens.asp

Security Descriptors
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/security_descriptors.asp

Securable Objects
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/securable_objects.asp


//以上资料仅供参考
luke5678 2004-11-10
  • 打赏
  • 举报
回复
最简单的方法:
打开注册表,不能写的项的权限付给当前用户。

复杂一点嘛...

转帖:

如何调整中注册表权限?

在NT/XP/2000下,注册表中有些键即时使用Administrators登录,也没有办法读取下面的数据,例如:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum,默认是无法读取的,碰到这种情况,我们一个方面可以利用regedt32来设置注册表的权限,但是对于用户来说可能不熟悉注册表的操作,那么我们的程序应该能够自动处理,怎么做呢?

注意:下面的这些函数和讨论其中一个重要依据就是必须以Administrators登录才可以。
来自:chenzhd 时间:2002-1-16 15:18:00 ID:862280

采用SDK 函数:

#include "RegPermission.h"

说明:输入参数为所要设置权限的键值:
用VC++做成动态库的形式,然后在DELPHI中调用.
本函数已经过测试,验证.
若有问题,给我回EMAIL.

#include "RegPermission.h"

void WINAPI SetRegPermission(char *KeyStr)
{
// TODO: Add your control notification handler code here
HKEY hKey = 0;
SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
PSID pInteractiveSid = NULL;
PSID pAdministratorsSid = NULL;
SECURITY_DESCRIPTOR sd;
PACL pDacl = NULL;
DWORD dwAclSize;
LONG lRetCode;
BOOL bRet;
//char KeyStr[200];

//strcpy(KeyStr,"SOFTWARE\\LEGEND\\test");

lRetCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT(KeyStr),
0,
WRITE_DAC,
&hKey);
//open key
/*lRetCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\LEGEND\\test"),
0,
WRITE_DAC,
&hKey);*/
//
// prepare a Sid representing any Interactively logged-on user
//
bRet = AllocateAndInitializeSid(
&sia,
1,
SECURITY_INTERACTIVE_RID,
0, 0, 0, 0, 0, 0, 0,
&pInteractiveSid
);

//
// preprate a Sid representing the well-known admin group
//
bRet = AllocateAndInitializeSid(
&sia,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdministratorsSid
);

//
// compute size of new acl
//
dwAclSize = sizeof(ACL) +
2 * ( sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) ) +
GetLengthSid(pInteractiveSid) +
GetLengthSid(pAdministratorsSid) ;

//
// allocate storage for Acl
//
pDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize);

bRet = InitializeAcl(pDacl, dwAclSize, ACL_REVISION);

//
// grant the Interactive Sid KEY_READ access to the perf key
//
bRet = AddAccessAllowedAce(
pDacl,
ACL_REVISION,
KEY_ALL_ACCESS,
pInteractiveSid
);
/*bRet = AddAccessAllowedAce(
pDacl,
ACL_REVISION,
samDesired,
pInteractiveSid
);*/

//
// grant the Administrators Sid KEY_ALL_ACCESS access to the perf key
//
bRet = AddAccessAllowedAce(
pDacl,
ACL_REVISION,
KEY_ALL_ACCESS,
pAdministratorsSid
);

bRet = InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);

bRet = SetSecurityDescriptorDacl(&sd, TRUE, pDacl, FALSE);

//
// apply the security descriptor to the registry key
//
lRetCode = RegSetKeySecurity(
hKey,
(SECURITY_INFORMATION)DACL_SECURITY_INFORMATION,
&sd
);

//clean up
RegCloseKey(hKey);
RegCloseKey(HKEY_LOCAL_MACHINE);

//
// free allocated resources
//
if(pDacl != NULL)
HeapFree(GetProcessHeap(), 0, pDacl);

if(pInteractiveSid != NULL)
FreeSid(pInteractiveSid);

if(pAdministratorsSid != NULL)
FreeSid(pAdministratorsSid);
}

zwb666 2004-11-09
  • 打赏
  • 举报
回复
ding
发帖
Windows SDK/API

1177

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
帖子事件
创建了帖子
2004-11-09 08:26
社区公告
暂无公告