2013-02-18 34 views
6

Làm cách nào để kiểm tra tính năng tạo tệp cho thư mục theo chương trình? Sửa đổi quyền đối với tệp? Xóa quyền đối với tệp?
GetNamedSecurityInfo trả lại rằng tôi có thể viết thành C:\Program Files nhưng UAC cho biết Access Denied (5)
Làm cách nào để xác định quyền truy cập có hiệu quả?Làm cách nào để kiểm tra các quyền sửa đổi theo chương trình?

mã của tôi:

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; 
+7

* Thật dễ dàng để yêu cầu sự tha thứ hơn là xin phép * –

+1

Không cần phải tha thứ cho 'Program Files'. Windows ghi tệp trong Cửa hàng ảo. – barbaris

+1

Để làm gì? Nếu bạn có một GUI nơi bạn muốn hiển thị thông tin đó, thì bạn cần tìm hiểu xem bạn có quyền không, bạn không có lựa chọn nào; Nếu bạn cần phải thực sự * viết * một cái gì đó, không có gì đập cố gắng: tạo một tập tin tạm thời và sau đó xóa nó. Tôi nghi ngờ bất cứ điều gì khác là thực sự đáng tin cậy, gợi ý: những người có thể đáng tin cậy nói nếu bạn có quyền truy cập viết trên một ổ đĩa mạng được ánh xạ, khi phần mềm máy chủ là Samba? Ngay cả khi có quyền truy cập đầy đủ vào các tệp cấu hình, nó có thể khó khăn! –

Trả lời

9

tôi đã được sử dụng NT Utilities cho việc này. Làm việc rất tốt cho tôi với Win2K/XP/Vista/7

Ví dụ từ dự án thiết lập của tôi:

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; 

Kiểm tra modify phép:

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

Lưu ý về câu trả lời của tôi: Đoạn mã trên trả lời OP câu hỏi:

Làm thế nào để lập trình rà soát sửa đổi điều khoản

Nhưng, nếu tất cả các bạn cần phải làm, là séc rằng ứng dụng của bạn là việc có thể viết vào một thư mục, tôi sẽ không phải đi cho loại giải pháp ACL, và thực sự cố gắng để viết một tập tin tạm thời với nó, vì vậy mà tôi là 100% chắc chắn tôi có thể viết cho nó.

Tôi sử dụng mã này như một phần trong quá trình thiết lập của mình, trong đó tôi cần cấp quyền cho một số thư mục, vì vậy mã này được sử dụng để kiểm tra xem thư mục đó chưa có các quyền này hay không - Đó có thể là một trường hợp rất khác của bạn.

Có một vài cuộc thảo luận về vấn đề này:

Vì vậy, bạn cần phải lựa chọn giải pháp của bạn theo kịch bản thực tế của bạn.