gpt4 book ai didi

delphi - 如何以编程方式检查修改权限?

转载 作者:行者123 更新时间:2023-12-03 14:58:49 27 4
gpt4 key购买 nike

如何以编程方式检查文件夹的创建文件权限?修改文件权限?删除文件权限?
GetNamedSecurityInfo 返回我可以写入 C:\Program Files 但 UAC 说访问被拒绝 (5)
如何有效确定访问权限?

我的代码:

function GetAccessRights(const FileName: String; ObjectType: SE_OBJECT_TYPE; 
var Access: Cardinal): Cardinal;
var
SecDesc: PSECURITY_DESCRIPTOR;
pDacl: PACL;
Trusteee: TRUSTEE_;
begin
result := GetNamedSecurityInfo(PChar(FileName), ObjectType,
DACL_SECURITY_INFORMATION, nil, nil, @pDacl, nil, SecDesc);
if ERROR_SUCCESS = result then
begin
// the pDacl may be NULL if the object has unrestricted access
if pDacl <> nil then
begin
with Trusteee do
begin
pMultipleTrustee := nil;
MultipleTrusteeOperation := NO_MULTIPLE_TRUSTEE;
TrusteeForm := TRUSTEE_IS_NAME;
TrusteeType := TRUSTEE_IS_UNKNOWN;
ptstrName := 'CURRENT_USER';
end;
result := GetEffectiveRightsFromAcl(pDacl^, Trusteee, Access);
end
else
begin
Access := $FFFFFFFF;
result := ERROR_SUCCESS;
end;
if SecDesc <> nil then
LocalFree(Cardinal(SecDesc));
end;
end;

最佳答案

我一直在使用NT Utilities为了这。对于我来说,Win2K/XP/Vista/7 工作得很好

我的安装项目示例:

uses unitNTSecurity;

function CheckAccessToFile(DesiredAccess: DWORD; const FileOrDirName: string; ObjectName: string): Boolean;
var
fo: TNTFileObject;
acl: TAccessControlList;
ace: TAccessControlElement;
name: string;
i: integer;
begin
Result := False;
if FileExists(FileOrDirName) or DirectoryExists(FileOrDirName) then
begin
fo := TNTFileObject.Create(FileOrDirName);
acl := TAccessControlList.Create;
try
fo.GetDiscretionaryAccessList(acl);
for i := 0 to acl.ElementCount - 1 do
begin
ace := acl.Element[i];
name := ace.Name; // format is: BUILTIN\Users
if (CompareText(ObjectName, name) = 0) and
(ace.Type_ = aeAccessAllowed) and
(DesiredAccess = ace.Mask) then
begin
Result := True;
Break;
end;
end;
finally
fo.Free;
acl.Free;
end;
end;
end;

检查修改权限:

Result := CheckAccessToFile($001301BF, 'C:\foo', 'BUILTIN\Users');
<小时/>

关于我的答案的注释:上面的代码回答了OP问题:

How do I programmatically check modify permissions

但是,如果您需要做的只是检查您的应用程序是否能够写入目录,那么我不会采用这种 ACL 解决方案,并实际上尝试向其写入临时文件,以便我 100% 确定可以写入它。

我使用此代码作为我的设置过程的一部分,其中我需要授予某些目录的修改权限,因此此代码用于检查该目录是否尚未具有这些权限 - 这可能与您的情况截然不同。

关于这个问题有一些讨论:

所以您需要根据自己的实际场景选择适合的解决方案。

关于delphi - 如何以编程方式检查修改权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14938570/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com