如何使用Delphi在运行时创建具有所有用户的完全权限的目录?
发布时间:2020-12-15 04:13:09 所属栏目:大数据 来源:网络整理
导读:我需要在COMMONAPPDATA内创建一个目录(如果它不存在),该目录具有该计算机的每个用户的完全权限(每个人都可以读取或写入该目录).我正在寻找原生的简单代码在Delphi中执行此操作,而不使用第三部分库或组件. 解决方法 @WarmBooter,您可以使用 CreateDirectory功
我需要在COMMONAPPDATA内创建一个目录(如果它不存在),该目录具有该计算机的每个用户的完全权限(每个人都可以读取或写入该目录).我正在寻找原生的简单代码在Delphi中执行此操作,而不使用第三部分库或组件.
解决方法
@WarmBooter,您可以使用
CreateDirectory功能来完成此任务.
看这个例子: program Project645; {$APPTYPE CONSOLE} uses AccCtrl,AclApi,Windows,SysUtils; type PTrusteeW = ^TTrusteeW; TTrusteeW = record pMultipleTrustee: PTrusteeW; MultipleTrusteeOperation: DWORD; { MULTIPLE_TRUSTEE_OPERATION } TrusteeForm: DWORD; { TRUSTEE_FORM } TrusteeType: DWORD; { TRUSTEE_TYPE } ptstrName: PWideChar; end; TExplicitAccessW = record grfAccessPermissions: DWORD; grfAccessMode: DWORD; { ACCESS_MODE } grfInheritance: DWORD; Trustee: TTrusteeW; end; Function CreateDirectoryFullAccess(NewDirectory:String) :Boolean; var SecurityAttributes : TSecurityAttributes; SecurityDescriptor : PSecurityDescriptor; ExplicitAccess : array[0..0] of TExplicitAccessW; easize : integer; pACL : Windows.PACL; begin ExplicitAccess[0].grfAccessPermissions:= STANDARD_RIGHTS_ALL or SPECIFIC_RIGHTS_ALL; ExplicitAccess[0].grfAccessMode:=Ord(SET_ACCESS); ExplicitAccess[0].grfInheritance:=SUB_CONTAINERS_AND_OBJECTS_INHERIT; ExplicitAccess[0].Trustee.TrusteeForm:=Ord(TRUSTEE_IS_NAME); ExplicitAccess[0].Trustee.TrusteeType:=Ord(TRUSTEE_IS_USER); ExplicitAccess[0].Trustee.ptstrName:='Everyone';//Access for all users SetEntriesinAclW(1,@ExplicitAccess,nil,pACL);//creates a new access control list //SecurityDescriptor:= AllocMem(Sizeof(SECURITY_DESCRIPTOR_MIN_LENGTH)); SecurityDescriptor:= AllocMem(SECURITY_DESCRIPTOR_MIN_LENGTH); InitializeSecurityDescriptor(SecurityDescriptor,SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(SecurityDescriptor,true,pacl,false);//sets information in a discretionary access control list (DACL). FillChar(SecurityAttributes,sizeof(SECURITY_ATTRIBUTES),#0); SecurityAttributes.nLength:=sizeof(SECURITY_ATTRIBUTES); SecurityAttributes.lpSecurityDescriptor:=SecurityDescriptor; SecurityAttributes.bInheritHandle:=false; CreateDirectory(PChar(NewDirectory),@SecurityAttributes); Result:=GetLastError=0;// if all ok,GetLastError = 0 end; begin if CreateDirectoryFullAccess('C:MyNewDir') then Writeln('Ok') else Writeln('Failed'); Readln; end. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |