代码之家  ›  专栏  ›  技术社区  ›  Lawrence Barsanti

如何检查用户是否具有使用windows api访问文件的权限

  •  1
  • Lawrence Barsanti  · 技术社区  · 16 年前

    我正试图为windows编写一个简单的函数来回答以下问题。


    哪里
    R是(泛型读、泛型写、泛型执行)的某种组合

    我编写的代码如下所示。应用程序调用显示的第一个UserHasPermission。

    我的问题有两个:
    1.有更好的方法吗?

    function UserHasPermission(APermission: Longword; out HasPermission: Boolean; AFileName: WideString; AUserName: String; ADomainName: String): Boolean;
        var
          SID: PSID;
          ACL: PACL;
        begin
          SID := nil;
          ACL := nil;
          try
            Result := GetUserSID(SID, AUserNAme, ADomainName);
            Result := Result and GetFileDACL(AFileName, ACL);
            Result := Result and UserHasPermission(APermission, HasPermission, ACL, SID);
          finally
            Dispose(SID);
          end;
        end;
    
        function UserHasPermission(APermission: Longword; out HasPermission: Boolean; AACL: PACL; AUserSID: PSID): Boolean;
        var
          T: TRUSTEE;
          Rights: ACCESS_MASK;
        begin
          BuildTrusteeWithSid(@T, AUserSID);
          Result := GetEffectiveRightsFromAcl(AACL, @T, @Rights) = ERROR_SUCCESS;
          HasPermission := (Rights and APermission) = APermission;
        end;
    
        function GetUserSID(out ASID: PSID; AUserName: WideString; const ADomainName: WideString): Boolean;
        var
          NSID, NDomain: Longword;
          Use: SID_NAME_USE;
          DomainName: WideString;
        begin
          Result := False;
          if Length(AUserName) > 0 then
            begin
              if Length(ADomainName) > 0 then
                AUserName := ADomainName + '\' + AUserName;
    
              // determine memory requirements
              NSID := 0;
              NDomain := 0;
              LookupAccountNameW(nil, PWideChar(AUserName), nil, NSID, nil, NDomain, Use);
    
              // allocate memory
              GetMem(ASID, NSID);
              SetLength(DomainName, NDomain);
    
              Result := LookupAccountNameW(nil, PWideChar(AUserName), ASID, NSID, PWideChar(DomainName), NDomain, Use);
            end;
        end;
    
        function GetFileDACL(AFileName: WideString; out AACL: PACL): Boolean;
        var
          SD: PSecurityDescriptor;
          NSD, NNeeded: Longword;
          Present, Defualted: Longbool;
        begin
          GetFileSecurityW(PWideChar(AFileName), DACL_SECURITY_INFORMATION, nil, 0, NNeeded);
          GetMem(SD, NNeeded);
          try
            NSD := NNeeded;
            Result := GetFileSecurityW(PWideChar(AFileName), DACL_SECURITY_INFORMATION, SD, NSD, NNeeded);
            Result := Result and GetSecurityDescriptorDacl(SD, Present, AACL, Defualted);
            Result := Result and Present;
          finally
            Dispose(SD);
          end;
        end;
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Richard    16 年前

    GetEffectiveRightsFromAcl对于我测试的所有用户/文件组合都是相同的($001200A9)。

    这一切都取决于ACL,例如,如果每个人都被授予完全控制权,那么任何使用都将拥有完全控制权。

    GetEffectiveRightsFromAcl )去做这项繁重的工作。

    建议:创建非常特定的ACL来测试代码( SDDL 使这更容易),从一个不授予的开始,然后是一个只包含不同用户的。