代码中一开始的 几个 USES 单元,可能是多余的。

unit ShareRestrictedSD;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Shlobj, ActiveX, Dialogs,Shellapi; ///////////////////
//如果这家伙起作用,那么它的作者是jiangsheng(C++);
//如果这家伙一点用没有,那我不知道它的作者
//以上为 jiangsheng 的声明.
//使用方法.
//var
// SharedSD:TShareRestrictedSD; //创建一个工具类.
// try
// SharedSD:=TShareRestrictedSD.Create;
// FMappingHandle :=
// CreateFileMapping(
// $FFFFFFFF, {to virtual memory}
// SharedSD.GetSA, //获得一个超级用户安全对象.
// page_readwrite,
// ,
// FSize,
// pchar(FNameToCreate));
// finally
// if (SharedSD <> nil) then
// begin
// FreeAndNil(SharedSD); //一定要记得释放
// end;
// end;
//修改:Flying Wang 和 爱吃猪头肉
/////////////////// const
SECURITY_NULL_SID_AUTHORITY = $;
SECURITY_WORLD_SID_AUTHORITY = $;
SECURITY_LOCAL_SID_AUTHORITY = $;
SECURITY_CREATOR_SID_AUTHORITY = $;
SECURITY_NT_AUTHORITY = $; ACL_REVISION = $; SECURITY_NULL_RID = $;
SECURITY_LOCAL_RID = $;
SECURITY_WORLD_RID = $;
SECURITY_CREATOR_OWNER_RID = $;
SECURITY_DIALUP_RID = $;
SECURITY_CREATOR_GROUP_RID = $;
SECURITY_NETWORK_RID = $;
SECURITY_BATCH_RID = $;
SECURITY_INTERACTIVE_RID = $;
SECURITY_LOGON_IDS_RID = $;
SECURITY_SERVICE_RID = $;
SECURITY_LOCAL_SYSTEM_RID =$;
SECURITY_BUILTIN_DOMAIN_RID =$; HEAP_NO_SERIALIZE = $;
HEAP_GROWABLE = $;
HEAP_GENERATE_EXCEPTIONS = $;
HEAP_ZERO_MEMORY = $;
HEAP_REALLOC_IN_PLACE_ONLY =$;
HEAP_TAG_SHIFT =$;
HEAP_TAIL_CHECKING_ENABLED =$;
HEAP_FREE_CHECKING_ENABLED =$;
HEAP_DISABLE_COALESCE_ON_FREE =$;
HEAP_MAXIMUM_TAG =$0FFF;
HEAP_PSEUDO_TAG_FLAG =$;
HEAP_CREATE_ALIGN_ =$;
HEAP_CREATE_ENABLE_TRACING =$; type PACE_HEADER = ^TACE_HEADER;
_ACE_HEADER = record
AceType:Byte;
AceFlags:Byte;
AceSize:Word;
end;
TACE_HEADER = _ACE_HEADER;
ACE_HEADER = _ACE_HEADER; // ACCESS_MASK = DWORD; PACCESS_ALLOWED_ACE = ^TACCESS_ALLOWED_ACE;
_ACCESS_ALLOWED_ACE = record
Header:TACE_HEADER;
Mask:ACCESS_MASK;
SidStart:DWORD;
end;
TACCESS_ALLOWED_ACE = _ACCESS_ALLOWED_ACE;
ACCESS_ALLOWED_ACE = _ACCESS_ALLOWED_ACE; TShareRestrictedSD =class(TObject)
private
{ Private-Deklarationen }
ptr:Pointer;
sa:TSecurityAttributes;
sd:TSecurityDescriptor;
protected
{ Protected-Deklarationen }
public
{ Public-Deklarationen }
Constructor Create;
Destructor Destroy; override;
function GetSA:PSecurityAttributes;
published
{ Published-Deklarationen }
end; implementation Const
DefSubAuthorityCount = ; Function BuildRestrictedSD(pSD: PSecurityDescriptor): Pointer;
var
dwAclLength: DWORD;
psideveryone: PSID;
pDACL: PACL;
bResult: Boolean;
pACE: PACCESS_ALLOWED_ACE;
siaWorld: TSIDIdentifierAuthority;
si: SECURITY_INFORMATION;
begin
Result := nil;
psideveryone := nil;
pDACL := nil;
bResult := False;
pACE := nil;
FillMemory(@siaWorld,Sizeof(siaWorld),SECURITY_NULL_SID_AUTHORITY);
siaWorld.Value[]:=SECURITY_WORLD_SID_AUTHORITY;
si := DACL_SECURITY_INFORMATION;
try
// initialize the security descriptor
if (not InitializeSecurityDescriptor(pSD,
SECURITY_DESCRIPTOR_REVISION)) then
begin
//InitializeSecurityDescriptor() failed;
exit;
end;
// obtain a sid for the Authenticated Users Group
if (not AllocateAndInitializeSid(siaWorld,
DefSubAuthorityCount,
SECURITY_WORLD_RID,
SECURITY_NULL_RID,
SECURITY_NULL_RID,
SECURITY_NULL_RID,
SECURITY_NULL_RID,
SECURITY_NULL_RID,
SECURITY_NULL_RID,
SECURITY_NULL_RID,
psidEveryone)) then
begin
//AllocateAndInitializeSid() failed;
exit;
end;
// NOTE:
//
// The Authenticated Users group includes all user accounts that
// have been successfully authenticated by the system. If access
// must be restricted to a specific user or group other than
// Authenticated Users, the SID can be constructed using the
// LookupAccountSid() API based on a user or group name. // calculate the DACL length
dwAclLength := sizeof(ACL)
// add space for Authenticated Users group ACE
+ sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD)
+ GetLengthSid(psidEveryone);
// allocate memory for the DACL
pDACL := PACL(HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY,
dwAclLength));
if (pDACL = nil) then
begin
//HeapAlloc() failed;
exit;
end;
// initialize the DACL
if (not InitializeAcl(pDACL^, dwAclLength, ACL_REVISION)) then
begin
//InitializeAcl() failed
exit;
end;
// add the Authenticated Users group ACE to the DACL with
// GENERIC_READ, GENERIC_WRITE, and GENERIC_EXECUTE access
if (not AddAccessAllowedAce(pDACL^, ACL_REVISION,
GENERIC_ALL,
psidEveryone)) then
begin
//AddAccessAllowedAce() failed;
exit;
end;
// set the DACL in the security descriptor
if (not SetSecurityDescriptorDacl(pSD, TRUE, pDACL, FALSE)) then
begin
//SetSecurityDescriptorDacl() failed;
exit;
end;
bResult := True;
finally
if (psidEveryone <> nil) then
begin
FreeSid(psidEveryone);
end;
if (not bResult) then
begin
if (pDACL <> nil) then
begin
HeapFree(GetProcessHeap, , pDACL);
end;
pDACL := nil;
end;
end;
Result := pDACL;
end; //The following function frees memory allocated in the
// BuildRestrictedSD() function
procedure FreeRestrictedSD(ptr: Pointer);
begin
if (ptr <> nil) then
begin
HeapFree(GetProcessHeap, , ptr);
end;
end; Constructor TShareRestrictedSD.Create;
begin
ptr := nil;
sa.nLength := Sizeof(sa);
sa.lpSecurityDescriptor := @Sd;
sa.bInheritHandle := False;
// build a restricted security descriptor
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
ptr := BuildRestrictedSD(@sd);
if (ptr = nil) then
begin
Raise Exception.Create('BuildRestrictedSD failed');
end;
end;
end; Destructor TShareRestrictedSD.Destroy;
begin
if (ptr <> nil) then
begin
FreeRestrictedSD(ptr);
end;
end; function TShareRestrictedSD.GetSA:PSecurityAttributes;
begin
if (ptr <> nil) then
begin
Result := @Sa;
end
else
begin
Result := nil;
end;
end; end.

很久以前写的一个 ShareRestrictedSD 类的更多相关文章

  1. 用C#写的一个OA类的APP, ios、Android都能跑,有源代码

    这是一个用C#写的OA类APP,功能包含请假.报销.部门管理.签到.IM.文件上传等功能 话不多说,先看视频 视频地址:http://v.youku.com/v_show/id_XMzUwMjQ1Mz ...

  2. 收集C#常用类:自己写的一个DBHelper类

    随着学的东西越来越多,一点点的完善吧! using System; using System.Collections.Generic; using System.Linq; using System. ...

  3. 写的一个HttpClient类

    package com.ca.test.cainterface.common.util.http; import com.ca.test.cainterface.common.util.data.Da ...

  4. 使用代码向一个普通的类注入Spring的实例

    转载请在页首注明作者与原文地址 一:应用场景 什么是普通的类,就是没有@Controller,@Service,@Repository,@Component等注解修饰的类,同时xml文件中,也没有相应 ...

  5. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  6. 我写的一个ExcelHelper通用类,可用于读取或生成数据

    读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...

  7. 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成

    写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...

  8. 编程写一个方法时,注意方法中传参数的数量最好不要超过5个,超过5个怎么办?可以用struct或class,或一个字典类

    图  1 一.从图1发现了什么问题呢? 答案:1.参数传的的太多了:2.另外注释也没写好. 说明:一个方法中,传参数的数量最好不要超过5个. 应该采用:struct或class,或一个字典类都行.其中 ...

  9. 封装一个帮助类来写文件到android外置存储器上

    项目地址:点击打开 项目简介:写文件到android外置存储器的一个帮助类,和它的demo程序 它是如何工作的呢? 1.创建 AppExternalFileWriter 对象并传递context(上下 ...

随机推荐

  1. React简谈

    这段时间学习了react.js,在此做个总结. react.js在优势上我认为是两个大点,第一是性能,作者从dom操作实际出发,通过虚拟dom(这里虚拟dom实际上是以jsx格式的语法来预先构建dom ...

  2. Thinking Of Matrix

    http://blog.163.com/bzm_square/blog/static/9355546320129582254842/ PS: 一种有关于矩阵的思维方法.....WiKi 向量空间,不定 ...

  3. openwrt的配置

    1,参考:http://www.cnblogs.com/gnuhpc/archive/2013/08/31/3293643.html(此人的博客还是挺不错的) http://www.cnblogs.c ...

  4. ios调用百度地图定位遇到的奇葩问题

    app项目过程中需要用到百度地图,然后网上可以查资料看官网文档,最后弄了好几天还是不行,找了各位前辈帮忙虽然解决了,但是把代码拷贝到我的项目时又无法定位了,最后查看了下原因是info配置出了问题,不是 ...

  5. 高性能Server---Reactor模型

    原文地址:http://www.ivaneye.com/2016/07/23/iomodel.html 无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮 ...

  6. reset 单个文件 回退

    git将单个文件恢复到历史版本的正确方法如下: git reset commit_id 文件路径 git checkout -- 文件路径

  7. python学习道路(day5note)(列表生成式,生成器,装饰器,常用模块)

    生成列表的方式 data = [1,2,3]  需求   每个数字加上1 # data = ( x*2 for x in range(5)) print(data)   列表生成式 后面的I赋予加1操 ...

  8. java基础总结——基础语法2(语句)

    1.1.       判断语句(if语句) 1.1.1. If语句的三种格式: 1.1.2. if语句特点: 每一种格式都是单条语句(单条不是单行,单条是一个整体). 第二种格式与三元运算符的区别:三 ...

  9. TID大会学习心得之敏捷软件架构-微服务

    敏捷微服务构建 王威: TW咨询师.架构转型教练.敏捷技术教练 敏捷的目标 敏捷的目标是提升效率?降低成本?减员增效? 敏捷:关注价值.快速反馈.快速响应.其的目标是提升响应力,响应力的提升不一定会提 ...

  10. 如何编写自己的Arduino库?

    一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了.一直想搞清楚,以便编写自己的库文件.于是研究一下午,下面是一些总结. Arduino工程的初步认识 一.目录规范 当你 ...