求高手将一段c++builder代码转成delphi

jxsbb 2008-08-19 03:53:08
这是在c++builder研究上的一段代码,可我不懂c++builder,请高手转一下!谢谢了!
文章地址:
http://www.ccrun.com/article.asp?i=563&d=tshoza

原文如下:

本文转自csdn,原作:MEFULEU (新手上路)
http://expert.csdn.net/Expert/topic/2194/2194594.xml?temp=.952038

在2k系统操作注册表时,发现某些健必须要有权限问题;
察看各位大大的贴,可惜没有一个合适的结果;
有人说:可以提高使用者权限;但是事实上好像不是很好用;
经过艰苦.艰苦.艰艰苦苦;终于在msdn上找到了一些好动动;
不敢独享,(哎,我可不想某人,好东西藏到自己都忘了的地方)
整理出来一些对某些人有用的东西:嘿嘿,代码如下:
严重建议:大家都把好东西往上贴吧!!!!!!

欢迎来信探讨: lanren_me@etang.com

//开始重新配置使用注册表的权限----------

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
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=563&d=tshoza


//合并结构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);
...全文
150 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ibican 2009-08-22
  • 打赏
  • 举报
回复
Mark
网络的一棵草 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jxsbb 的回复:]
up

[/Quote]

一直都没法找到合适的这个,谢谢大侠了,呵呵
jxsbb 2008-08-24
  • 打赏
  • 举报
回复
结贴了,代码运行有点问题,不过问题解决了!
柯本 2008-08-21
  • 打赏
  • 举报
回复
试试:

uses aclapi,AccCtrl;
...
var
lpObjectName:LPTSTR;
OldDACL,NewDACL:PACL ; //uses aclapi
ObjectType:SE_OBJECT_TYPE ; //uses AccCtrl
SD:PSECURITY_DESCRIPTOR;
ea: EXPLICIT_ACCESS;
label Cleanup;
begin
lpObjectName := 'MACHINE\\SYSTEM\\ControlSet001\\Enum\\Root';

// ObjectType :=SE_REGISTRY_KEY;

//建立一个空的ACL;
if SetEntriesInAcl(0, nil, nil, OldDACL)<>ERROR_SUCCESS then
exit;

if (SetEntriesInAcl(0, nil, nil, NewDACL)<>ERROR_SUCCESS) then
exit;

//获取现有的ACL列表到OldDACL
if GetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
nil, nil,
OldDACL,
nil, SD) <> ERROR_SUCCESS then
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
// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=563&d=tshoza


//合并结构ea和OldDACL的权限列表到新的NewDACL
if SetEntriesInAcl(1, @ea, nil, NewDACL) <> ERROR_SUCCESS then
goto Cleanup;

//把新的ACL写入到指定的键
SetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
nil, nil,
NewDACL,
nil);


///////开始操作注册表//////////
//..........
//////////

//恢复注册表的权限;

BuildExplicitAccessWithName(@ea,
'Everyone', // name of trustee
GENERIC_READ, // type of access
SET_ACCESS, // access mode
NO_INHERITANCE); //让自健继承他的权限; inheritance mode

if SetEntriesInAcl(1, @ea, nil, OldDACL) <> ERROR_SUCCESS then
goto Cleanup;

//把旧的ACL写入到指定的键
SetNamedSecurityInfo(lpObjectName, ObjectType,
DACL_SECURITY_INFORMATION,
nil, nil,
OldDACL,
nil);

//释放指针
Cleanup:
if SD <> nil then
LocalFree(HLOCAL (SD));
if NewDACL <> nil then
LocalFree(HLOCAL (NewDACL));
if OldDACL <> nil then
LocalFree(HLOCAL( OldDACL));

jxsbb 2008-08-21
  • 打赏
  • 举报
回复
up
jxsbb 2008-08-21
  • 打赏
  • 举报
回复
我试试看能行不,谢谢!
jxsbb 2008-08-19
  • 打赏
  • 举报
回复
up

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧