我需要在COMMONAPPDATA内创建一个目录(如果它不存在),该目录具有该计算机的每个用户的完全权限(每个人都可以读取或写入该目录)。我正在寻找原生的简单代码在Delphi中执行此操作,而不使用第三部分库或组件。
答案 0 :(得分:10)
@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.
答案 1 :(得分:3)
我希望我能评论并问“为什么?”。
可执行文件必须以管理员模式运行(因此大多数用户都会看到提升提示)
为什么不使用APPDATA或LOCALAPPDATA文件夹或公共共享?
以下是类似问题的链接: Delphi 2009 classes / components to read/write file permissions