社区
Windows SDK/API
帖子详情
获取注册表某一键值的权限
lxwyk
2004-11-09 08:26:25
各位大虾,请问如何获取注册表某一键值对于不同用户组的权限,谢谢了。
...全文
472
3
打赏
收藏
获取注册表某一键值的权限
各位大虾,请问如何获取注册表某一键值对于不同用户组的权限,谢谢了。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
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
注册表
一键清空
VC源码,教你这样用MFC来完成对
注册表
的操作
sql2000一键
获取
权限
Win10 Win8 Win7
sql一键
获取
电脑
权限
一键
获取
win7管理员
权限
的软件
可以支持在win7下开启管理员
权限
,做一些高
权限
的事,比如删掉不能删的东西,不用时可关闭。
一键
获取
TrustedInstaller
权限
一键
获取
TrustedInstaller
权限
。win7、8、10所需管理员
权限
,导入
注册表
获得。超级
权限
,无所不能。
adsl拨号宽带密码本地
获取
工具(一键宽带密码
获取
) v1.0 绿色版.zip
adsl拨号宽带密码本地
获取
工具,
获取
本机的adsl宽带拨号密码!忘记宽带拨号密码就可以使用本软件,一键
获取
本机宽带密码,快捷、高效、安全。
Windows SDK/API
1,183
社区成员
22,328
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章