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

Delphi 如何以编程方式检查修改权限?,delphi,file-permissions,uac,Delphi,File Permissions,Uac,如何以编程方式检查文件夹的“创建文件”权限? 修改文件权限?删除文件权限? GetNamedSecurityInfo返回我可以写入C:\Program Files但UAC说访问被拒绝(5) 如何有效地确定访问权限 我的代码: function GetAccessRights(const FileName: String; ObjectType: SE_OBJECT_TYPE; var Access: Cardinal): Cardinal; var SecDesc: PSECURITY

如何以编程方式检查文件夹的“创建文件”权限? 修改文件权限?删除文件权限?
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;
函数GetAccessRights(常量文件名:String;ObjectType:SE_OBJECT_TYPE;
var访问:Cardinal):Cardinal;
变量
SecDesc:PSECURITY\u描述符;
pDacl:PACL;
受托人:受托人;
开始
结果:=GetNamedSecurityInfo(PChar(文件名),ObjectType,
DACL_安全信息,无,无,@pDacl,无,SecDesc);
如果错误\成功=结果,则
开始
//如果对象具有不受限制的访问权限,则pDacl可能为空
如果pDacl为零,则
开始
相信你
开始
pMultipleTruste:=零;
MultipleTrusteOperation:=无多个受托人;
TrusteeForm:=受托人\为\名;
TrusteeType:=受托人\未知;
ptstrName:=“当前用户”;
结束;
结果:=GetEffectiveRightsFromAcl(pDacl^,受信任方,访问);
结束
其他的
开始
访问:=$FFFFFFFF;
结果:=错误\成功;
结束;
如果SecDesc为零,则
LocalFree(基数(SecDesc));
结束;
结束;
我一直在使用它。使用Win2K/XP/Vista/7对我来说效果非常好

我的安装项目示例:

检查
修改
权限:

Result := CheckAccessToFile($001301BF, 'C:\foo', 'BUILTIN\Users');

关于我答案的说明:以上代码回答了OP问题:

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

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

我使用此代码作为安装过程的一部分,我需要为某些目录授予
modify
权限,因此此代码用于检查该目录是否还没有这些权限-这可能与您的情况非常不同

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


因此,您需要根据实际情况选择解决方案。

请求宽恕比获得许可更容易。
程序文件不需要宽恕。
。Windows在虚拟存储中写入文件。为什么?如果你有一个GUI,你想在其中显示这些信息,那么你需要找出你是否有权限,你没有选择;如果你真的需要写一些东西,没有什么比尝试更好的了:创建一个临时文件,然后删除它。我怀疑其他任何东西是否真正可靠,提示:当服务器软件是Samba时,谁能可靠地说您是否在映射的网络驱动器上有写访问权限?即使完全访问配置文件,也可能很棘手@barbaris UAC虚拟化在您包含带有适当信任信息部分的清单后将被禁用。您可以在任务管理器中查看应用程序是否是UAC虚拟化的,在流程视图中有一个自定义列。这里的所有血淋淋的细节:至于您的需求,您几乎肯定希望
requestedExecutionLevel
中的
asInvoker
Result := CheckAccessToFile($001301BF, 'C:\foo', 'BUILTIN\Users');