2013-02-18 14 views
6

मैं प्रोग्रामेटिक रूप से फ़ोल्डर के लिए फ़ाइल अनुमति बनाने की जांच कैसे करूं? फ़ाइल अनुमति संशोधित करें? फ़ाइल अनुमति हटाएं?
GetNamedSecurityInfo लौटाता है कि मैं C:\Program Files में लिख सकता हूं लेकिन यूएसी का कहना है कि Access Denied (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; 
+7

* अनुमति प्राप्त करने के लिए माफी मांगना आसान है * –

+1

'प्रोग्राम फ़ाइलें' के लिए क्षमा की आवश्यकता नहीं है। वर्चुअल स्टोर में विंडोज़ लिखने वाली फाइल। – barbaris

+1

के लिए क्या? अगर आपके पास एक जीयूआई है जहां आप उस जानकारी को प्रदर्शित करना चाहते हैं, तो आपको यह पता लगाना होगा कि क्या आपके पास अनुमति है, आपके पास कोई विकल्प नहीं है; यदि आपको वास्तव में * लिखना * कुछ चाहिए, तो कुछ भी कोशिश नहीं कर रहा है: एक अस्थायी फ़ाइल बनाएं और फिर इसे हटा दें। मुझे संदेह है कि कुछ भी वास्तव में भरोसेमंद है, संकेत: कौन सा विश्वसनीय रूप से कह सकता है कि यदि आपके पास सर्वर सॉफ़्टवेयर सांबा है, तो मैप किए गए नेटवर्क ड्राइव पर लेखन पहुंच है? कॉन्फ़िगरेशन फ़ाइलों तक पूर्ण पहुंच के साथ भी यह मुश्किल हो सकता है! –

उत्तर

9

मैं इसके लिए NT Utilities उपयोग किया गया है।

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; 

के लिए चेक modify अनुमति:

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

मेरी सेटअप परियोजना से Win2K/XP/Vista/7

उदाहरण के साथ मेरे लिए बहुत अच्छी तरह से काम मेरे उत्तर के बारे में एक नोट: उपर्युक्त कोड उत्तर देता है ओपी प्रश्न:

मैं कैसे प्रोग्राम के रूप में अनुमतियाँ

संशोधित जाँच करते हैं लेकिन, अगर तुम सब करने की जरूरत है, जांच है कि आपके आवेदन एक निर्देशिका में लिखने के लिए सक्षम किया जा रहा है , मैं करूंगा है इस तरह के एसीएल समाधान के लिए जाएं, और वास्तव में इसे एक temp फ़ाइल लिखने का प्रयास करें, ताकि मैं 100% सुनिश्चित कर सकूं कि मैं इसे लिख सकता हूं।

मैं अपने सेटअप प्रक्रिया जहां मैं कुछ निर्देशिकाओं के लिए modify अनुमति प्रदान करने की आवश्यकता है के भाग के रूप इस कोड का उपयोग, इसलिए इस कोड है, तो उस निर्देशिका पहले से ही इन अनुमति नहीं है की जाँच करने के लिए किया जाता है - यही कारण है कि तुलना में एक बहुत अलग परिदृश्य हो सकता है आपका अपना।

इस मुद्दे के बारे में कुछ विचार विमर्श कर रहे हैं:

तो आप अपने वास्तविक परिदृश्य के अनुसार अपने समाधान का चयन करने की जरूरत है।

संबंधित मुद्दे

 संबंधित मुद्दे