首页  编辑  

调整注册表权限

Tags: /超级猛料/Registry.注册表和INI/   Date Created:

如何调整中注册表权限?

在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);

}

来自: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

另外,Jedei说最恨作弊的人,不是说我吧?看看我的已答问题,那题是作弊来得?我有两

个DFW帐号是不对,我只是为了有一个delphibbs的域名而已, 如下

http://dragonpc_???.delphibbs.com => Error !!!

http://dragonpc.delphibbs.com