সি # টেস্টের ব্যবহারকারীর যদি কোনও ফোল্ডারে লেখার অ্যাক্সেস থাকে


187

আমাকে পরীক্ষার প্রয়োজন যদি কোনও ব্যবহারকারী এটির চেষ্টা করার আগে কোনও ফোল্ডারে লিখতে পারে কিনা।

আমি নিম্নলিখিত পদ্ধতিটি (সি # 2.0 তে) প্রয়োগ করেছি যা ডিরেক্টরি.গেটঅ্যাক্সেস কন্ট্রোল () পদ্ধতি ব্যবহার করে ফোল্ডারের জন্য সুরক্ষা অনুমতিগুলি পুনরুদ্ধার করার চেষ্টা করে ।

private bool hasWriteAccessToFolder(string folderPath)
{
    try
    {
        // Attempt to get a list of security permissions from the folder. 
        // This will raise an exception if the path is read only or do not have access to view the permissions. 
        System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
        return true;
    }
    catch (UnauthorizedAccessException)
    {
        return false;
    }
}

যখন আমি গুগল করছিলাম যে লেখার অ্যাক্সেসের জন্য কীভাবে পরীক্ষা করতে হয় এটির মতো কিছুই সামনে আসে নি এবং উইন্ডোতে আসলে অনুমতিগুলি পরীক্ষা করা খুব জটিল মনে হয়েছিল। আমি উদ্বিগ্ন যে আমি জিনিসগুলি অতি-সরলকরণ করছি এবং এই পদ্ধতিটি শক্ত নয়, যদিও এটি কার্যকর বলে মনে হচ্ছে।

আমার ব্যবহারকারীর পরীক্ষা করার জন্য যদি বর্তমান ব্যবহারকারীর লেখার অ্যাক্সেস সঠিকভাবে কাজ করে?


13
অনুমতিগুলি দেখার অ্যাক্সেস না থাকা কি আসলেই এটিতে লেখার অনুমতি না দেওয়ার মতো?
deed02392

উত্তর:


60

এটি সি # তে ফোল্ডার অ্যাক্সেসের জন্য যাচাই করার জন্য একটি সঠিক বৈধ উপায়। এটি নীচে পড়ার একমাত্র জায়গা হ'ল যদি আপনাকে এইটিকে দৃ a় লুপে কল করতে হয় যেখানে ব্যতিক্রমের ওভারহেড কোনও সমস্যা হতে পারে।

অনুরূপ অন্যান্য প্রশ্ন আগে জিজ্ঞাসা করা হয়েছে ।


1
মজাজনকভাবে যথেষ্ট আমার অন্য একটি ট্যাবে অন্য প্রশ্নগুলির ওপেন ছিল কিন্তু ডিরেক্টরীসিকিউরিটি সম্পর্কে উত্তরটি দেখেনি, আমাকে কেবল উত্তর গৃহীত নয় ;-)
ক্রিস বি

আপনি যখন উইন্ডোজে দীর্ঘ পথ ব্যবহার করেন তখনও তা নেমে যাবে না?
আলেকজান্দ্রু

11
এটি আপনাকে লেখার অনুমতি আছে কিনা তা জানায় না, কেবলমাত্র সেই ফোল্ডারে আপনি অনুমতি দেখতে পারেন কিনা তা আপনাকে জানাবে it এছাড়াও আপনি লিখতে সক্ষম হতে পারবেন তবে অনুমতিগুলি সন্ধান করতে সক্ষম হবেন না।
এলোমেলোভাবে

65

আমি প্রশংসা করি যে এই পোস্টের জন্য দিনের কিছুটা দেরি হয়েছে তবে আপনি কোডটি এই বিটটিকে দরকারী বলে মনে করতে পারেন।

string path = @"c:\temp";
string NtAccountName = @"MyDomain\MyUserOrGroup";

DirectoryInfo di = new DirectoryInfo(path);
DirectorySecurity acl = di.GetAccessControl(AccessControlSections.All);
AuthorizationRuleCollection rules = acl.GetAccessRules(true, true, typeof(NTAccount));

//Go through the rules returned from the DirectorySecurity
foreach (AuthorizationRule rule in rules)
{
    //If we find one that matches the identity we are looking for
    if (rule.IdentityReference.Value.Equals(NtAccountName,StringComparison.CurrentCultureIgnoreCase))
    {
        var filesystemAccessRule = (FileSystemAccessRule)rule;

        //Cast to a FileSystemAccessRule to check for access rights
        if ((filesystemAccessRule.FileSystemRights & FileSystemRights.WriteData)>0 && filesystemAccessRule.AccessControlType != AccessControlType.Deny)
        {
            Console.WriteLine(string.Format("{0} has write access to {1}", NtAccountName, path));
        }
        else
        {
            Console.WriteLine(string.Format("{0} does not have write access to {1}", NtAccountName, path));
        }
    }
}

Console.ReadLine();

এটি একটি কনসোল অ্যাপ্লিকেশনে ফেলে দিন এবং দেখুন এটি আপনার প্রয়োজন অনুসারে করে কিনা।


ঠিক লক্ষ্য! আমাকে অনেক সাহায্য করে!
স্মিভিকিপিডিয়া

আমি কলটিতে একটি ব্যতিক্রম GetAccessControlপেয়েছি তবে আমার সফ্টওয়্যারটি যে ডিরেক্টরিটি আমি দেখছি তাতে লিখতে সক্ষম সত্যই ..?
জন কেজ

@ জোনকেজ - আপনি কী ব্যতিক্রম পাচ্ছেন? প্রথম জিনিসটি যা মনে মনে আসে, তা হ'ল ব্যঙ্গাত্মকভাবে, একটি সুরক্ষা সমস্যা। আপনার অ্যাপ্লিকেশন হিসাবে যে অ্যাকাউন্টটি চলছে সেটির এসিএল তথ্য পাওয়ার অনুমতি রয়েছে?
ডানকান হাও

1
আপনি ফাইলসিস্টেমএ্যাকসেসরুল প্রকারের জন্য একটি চেক যুক্ত করতে হবে। যদি এটি অস্বীকার করার নিয়ম হয় তবে আপনি ভুলভাবে এটিকে লিখিতযোগ্য হিসাবে রিপোর্ট করবেন।
tdemay

2
আমি এটি ব্যবহার করার চেষ্টা করছি। অন্য একটি সমস্যা খুঁজে পেয়েছে। যদি অধিকারগুলি কেবলমাত্র গোষ্ঠীগুলিকে অর্পণ করা হয় এবং নির্দিষ্ট ব্যবহারকারী নয় তবে এটি ভুল লেখায় তাদের লেখার অ্যাক্সেস নেই report উদাহরণস্বরূপ, "
অনুমোদনপ্রাপ্ত

63
public bool IsDirectoryWritable(string dirPath, bool throwIfFails = false)
{
    try
    {
        using (FileStream fs = File.Create(
            Path.Combine(
                dirPath, 
                Path.GetRandomFileName()
            ), 
            1,
            FileOptions.DeleteOnClose)
        )
        { }
        return true;
    }
    catch
    {
        if (throwIfFails)
            throw;
        else
            return false;
    }
}

7
এই উত্তরটি কেবল অনুমতি লঙ্ঘন নয়, ফাইল লেখার চেষ্টা করার সময় যে সমস্ত ব্যতিক্রম ঘটতে পারে তা ধরবে।
ম্যাট এলেন

7
@ জিওয়াই, string tempFileName = Path.GetRandomFileName();স্পষ্টতই
আলেক্সি খোরোশিখ

3
@ ম্যাট, ব্যর্থতার কারণ নির্বিশেষে, "জিজ্ঞাসিত প্রশ্নের উত্তরটি হ'ল ডিরেক্টরি হ'ল" failure আপনি বরং " কেন আমি ডিরেক্টরিতে লিখতে পারি না " তার জবাব দিন । :)
আলেক্সি খোরোশিখ

1
আমি এই কোড সহ একটি মিথ্যা ইতিবাচক পেতে পারি। এক্সিকিউটিভ ব্যবহারকারীর সেই ফোল্ডারে লেখার কোনও অনুমতি না থাকা সত্ত্বেও ফাইল.ক্রিয়েট () ঠিক আছে (এবং শেষ বিকল্পটি পরিবর্তন করে একটি অস্থায়ী ফাইল ছেড়ে দেয়) runs সত্যিই অদ্ভুত - কেন আমি স্টাম্পড তা বের করার চেষ্টা করে এক ঘন্টা সময় কাটিয়েছি।
নিকজি

4
সমস্ত বিকল্প যা আমি নীচে চেষ্টা করেছি (এবং রেফারেন্সযুক্ত লিঙ্কগুলি) - এটি কেবলমাত্র নির্ভরযোগ্যভাবে কাজ করে।
টারমোপিকারো

23

আমি এগুলির বেশিরভাগ চেষ্টা করেছিলাম, তবে তারা একই কারণে সমস্ত মিথ্যা ধনাত্মক প্রতিক্রিয়া জানায় .. কোনও উপলভ্য অনুমতির জন্য ডিরেক্টরিটি পরীক্ষা করা যথেষ্ট নয়, আপনাকে পরীক্ষা করে দেখতে হবে যে লগ ইন করা ব্যবহারকারী কোনও গ্রুপের সদস্য যে অনুমতি নেই। এটি করার জন্য আপনি ব্যবহারকারীদের পরিচয় পেয়ে যাচাই করুন এবং এটি ফাইলসিসটেম্যাক্সেসরুল আইডেন্টিটি রেফারেন্স ধারণকারী কোনও গ্রুপের সদস্য কিনা তা পরীক্ষা করে দেখুন। আমি এটি পরীক্ষা করেছি, নির্দ্বিধায় কাজ করি ..

    /// <summary>
    /// Test a directory for create file access permissions
    /// </summary>
    /// <param name="DirectoryPath">Full path to directory </param>
    /// <param name="AccessRight">File System right tested</param>
    /// <returns>State [bool]</returns>
    public static bool DirectoryHasPermission(string DirectoryPath, FileSystemRights AccessRight)
    {
        if (string.IsNullOrEmpty(DirectoryPath)) return false;

        try
        {
            AuthorizationRuleCollection rules = Directory.GetAccessControl(DirectoryPath).GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
            WindowsIdentity identity = WindowsIdentity.GetCurrent();

            foreach (FileSystemAccessRule rule in rules)
            {
                if (identity.Groups.Contains(rule.IdentityReference))
                {
                    if ((AccessRight & rule.FileSystemRights) == AccessRight)
                    {
                        if (rule.AccessControlType == AccessControlType.Allow)
                            return true;
                    }
                }
            }
        }
        catch { }
        return false;
    }

ধন্যবাদ জন, আমি আপনার কোডটি ব্যবহারকারীর গোষ্ঠীটি আবার আইডেন্টিফাই রেফারেন্স চেক করার জন্য ব্যবহার না করা পর্যন্ত মিথ্যা ইতিবাচক পেয়েছি!
পল এল

1
পরিচয়ের জন্য আমাকে একটি অতিরিক্ত চেক যোগ করতে হয়েছিল wআপনার == বিধি.আডেন্টিটি রেফারেন্স হিসাবে আমি একজন ব্যবহারকারী যেমন অ্যাক্সেস দিয়েছি কিন্তু কোনও দলে নেই, যেমন পরিষেবার জন্য ডেডিকেটেড লোকাল অ্যাকাউন্ট
গ্রাইন্ডার 22

1
অ্যাক্সেস কন্ট্রোলটাইপ অস্বীকার অনুমারের চেয়ে বেশি অগ্রাধিকার নেয়, সুতরাং অ্যাক্সেস রাইটকে অস্বীকার করার মতো পুরোপুরি বিধিবিধানের পাশাপাশি পরীক্ষা করা উচিত, এবং অস্বীকারকারী প্রকারগুলি পরীক্ষা করার সময় এটি হওয়া উচিত (AccessRight & rule.FileSystemRights) > 0কারণ কোনও উপ-অ্যাক্সেস প্রকার অস্বীকার করা হয়েছে যার AccessRightঅর্থ আপনার সম্পূর্ণ নেই অ্যাক্সেস করুনAccessRight
টিজে রকফেলার 15

উপরে গ্রাইন্ডার 22 হিসাবে উল্লেখ করা হয়েছে, আমার পরিবর্তন হওয়া দরকার; যদি (পরিচয়.গ্রুপস.সামগ্রী (নিয়ম.আইডেন্টিটি রেফারেন্স)) থেকে যদি (পরিচয়.গ্রুপস.কন্টেনস (নিয়ম.আইডেন্টিটি রেফারেন্স) || পরিচয়.ওউন.একুয়ালস (নিয়ম.আইডেন্টিটি রেফারেন্স)) যেমন আমার ব্যবহারকারীর অ্যাক্সেস ছিল তবে ছিল না ' টির মধ্যে কোন গ্রুপ।
মুহাম্মাদ

13

উদাহরণস্বরূপ সমস্ত ব্যবহারকারীর জন্য (বিল্টিন \ ব্যবহারকারী), এই পদ্ধতিটি ভাল কাজ করে - উপভোগ করুন।

public static bool HasFolderWritePermission(string destDir)
{
   if(string.IsNullOrEmpty(destDir) || !Directory.Exists(destDir)) return false;
   try
   {
      DirectorySecurity security = Directory.GetAccessControl(destDir);
      SecurityIdentifier users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
      foreach(AuthorizationRule rule in security.GetAccessRules(true, true, typeof(SecurityIdentifier)))
      {
          if(rule.IdentityReference == users)
          {
             FileSystemAccessRule rights = ((FileSystemAccessRule)rule);
             if(rights.AccessControlType == AccessControlType.Allow)
             {
                    if(rights.FileSystemRights == (rights.FileSystemRights | FileSystemRights.Modify)) return true;
             }
          }
       }
       return false;
    }
    catch
    {
        return false;
    }
}

12

IMHO যদি আপনি কোনও ডিরেক্টরিতে লিখতে পারেন তবে পরীক্ষার একমাত্র 100% নির্ভরযোগ্য উপায় হ'ল আসলে এটি লিখতে হবে এবং শেষ পর্যন্ত ব্যতিক্রমগুলি ধরা catch


8

এটা চেষ্টা কর:

try
{
    DirectoryInfo di = new DirectoryInfo(path);
    DirectorySecurity acl = di.GetAccessControl();
    AuthorizationRuleCollection rules = acl.GetAccessRules(true, true, typeof(NTAccount));

    WindowsIdentity currentUser = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(currentUser);
    foreach (AuthorizationRule rule in rules)
    {
        FileSystemAccessRule fsAccessRule = rule as FileSystemAccessRule;
        if (fsAccessRule == null)
            continue;

        if ((fsAccessRule.FileSystemRights & FileSystemRights.WriteData) > 0)
        {
            NTAccount ntAccount = rule.IdentityReference as NTAccount;
            if (ntAccount == null)
            {
                continue;
            }

            if (principal.IsInRole(ntAccount.Value))
            {
                Console.WriteLine("Current user is in role of {0}, has write access", ntAccount.Value);
                continue;
            }
            Console.WriteLine("Current user is not in role of {0}, does not have write access", ntAccount.Value);                        
        }
    }
}
catch (UnauthorizedAccessException)
{
    Console.WriteLine("does not have write access");
}

যদি আমি ভুল না হয়ে থাকি তবে এটি খুব কাছাকাছি তবে বেশিরভাগ ক্ষেত্রে নেই - এটি যে সত্য fsAccessRule.AccessControlTypeহতে পারে তা উপেক্ষা করে AccessControlType.Deny
জোনাথন গিলবার্ট

এটি আমার উইন 7 ডে মেশিনে আমার জন্য কাজ করছিল তবে উইন 10 এ ব্যর্থ হয়েছে (পরীক্ষক এবং আমার নিজের পরীক্ষার জন্য উভয়)। এসএসডিএসের পরিবর্তন (নীচে দেখুন) এটি সংশোধন করার জন্য উপস্থিত হয়।
উইন্ডওয়া হয়েছে

6

আপনার কোড DirectorySecurityএকটি প্রদত্ত ডিরেক্টরি জন্য পেয়েছে এবং সঠিকভাবে একটি ব্যতিক্রম (সুরক্ষা তথ্য অ্যাক্সেস না করার কারণে) পরিচালনা করে। যাইহোক, আপনার নমুনায় আপনি কী অ্যাক্সেসের অনুমতি রয়েছে তা দেখতে আসলে ফিরে আসা বস্তুকে জিজ্ঞাসাবাদ করবেন না - এবং আমার মনে হয় আপনাকে এটি যুক্ত করা দরকার।


+1 - আমি এই সমস্যার মধ্যে পড়েছি যেখানে গেটএ্যাক্সেস কন্ট্রোল কল করার সময় একটি ব্যতিক্রম ছোঁড়া হয়নি তবুও একই ডিরেক্টরিতে লেখার চেষ্টা করার সময় আমি একটি অননুমোদিত ব্যতিক্রম পাই।
মেয়ো

6

এখানে সিএসবাএসের উত্তরের একটি পরিবর্তিত সংস্করণ দেওয়া আছে , যা অ্যাক্সেসের বিধি সুস্পষ্টভাবে অস্বীকার করে। ফাংশনটি একটি ডিরেক্টরিগুলির জন্য সমস্ত ফাইল-সিস্টেম অ্যাক্সেসরুলসগুলির মধ্য দিয়ে যায় এবং বর্তমান ব্যবহারকারী কোনও ডিরেক্টরিতে অ্যাক্সেস রয়েছে এমন কোনও ভূমিকায় আছে কিনা তা পরীক্ষা করে। যদি এই জাতীয় কোনও ভূমিকা খুঁজে পাওয়া যায় না বা ব্যবহারকারী অ্যাক্সেস প্রত্যাখ্যানের ভূমিকায় থাকে তবে ফাংশনটি মিথ্যা প্রত্যাবর্তন করে। পঠনের অধিকারগুলি পরীক্ষা করতে, ফাইলসিস্টেমরাইটগুলি পাস করুন function ফাংশনটি পড়ুন; লেখার অধিকারের জন্য, ফাইলসিস্টেমরাইটগুলি পাস করুন rite লেখুন। আপনি যদি স্বেচ্ছাসেবকের ব্যবহারকারীর অধিকারগুলি পরীক্ষা করতে চান এবং বর্তমানের না হয়ে থাকেন তবে, উইন্ডোজআইডেন্টিটি পছন্দসই উইন্ডোজআইডেন্টিটির পরিবর্তে বর্তমান ব্যবহারকারীর উইন্ডোজআইডেন্টিটির বিকল্প দিন। ব্যবহারকারী নিরাপদে ডিরেক্টরিটি ব্যবহার করতে পারেন কিনা তা নির্ধারণ করতে আমি এই জাতীয় ফাংশনগুলির উপর নির্ভর করার বিরুদ্ধেও পরামর্শ দেব। এই উত্তর কেন পুরোপুরি ব্যাখ্যা করে।

    public static bool UserHasDirectoryAccessRights(string path, FileSystemRights accessRights)
    {
        var isInRoleWithAccess = false;

        try
        {
            var di = new DirectoryInfo(path);
            var acl = di.GetAccessControl();
            var rules = acl.GetAccessRules(true, true, typeof(NTAccount));

            var currentUser = WindowsIdentity.GetCurrent();
            var principal = new WindowsPrincipal(currentUser);
            foreach (AuthorizationRule rule in rules)
            {
                var fsAccessRule = rule as FileSystemAccessRule;
                if (fsAccessRule == null)
                    continue;

                if ((fsAccessRule.FileSystemRights & accessRights) > 0)
                {
                    var ntAccount = rule.IdentityReference as NTAccount;
                    if (ntAccount == null)
                        continue;

                    if (principal.IsInRole(ntAccount.Value))
                    {
                        if (fsAccessRule.AccessControlType == AccessControlType.Deny)
                            return false;
                        isInRoleWithAccess = true;
                    }
                }
            }
        }
        catch (UnauthorizedAccessException)
        {
            return false;
        }
        return isInRoleWithAccess;
    }

উইন্ডোজ 10 এ সিসবার কোডটি ব্যর্থ হয়েছিল (তবে আমার উইন 7 টি ডিভাইসে জরিমানা)। উপরের সমস্যাটি সমাধান করার জন্য উপস্থিত হয়।
উইন্ডো হয়েছে

4

উপরের সমাধানগুলি ভাল তবে আমার জন্য, আমি এই কোডটিকে সহজ এবং কার্যক্ষম বলে মনে করি। কেবল একটি অস্থায়ী ফাইল তৈরি করুন। যদি ফাইলটি তৈরি করা হয় তবে এর গড় ব্যবহারকারীর লেখার অ্যাক্সেস রয়েছে।

        public static bool HasWritePermission(string tempfilepath)
        {
            try
            {
                System.IO.File.Create(tempfilepath + "temp.txt").Close();
                System.IO.File.Delete(tempfilepath + "temp.txt");
            }
            catch (System.UnauthorizedAccessException ex)
            {

                return false;
            }

            return true;
        }

3
নিস! তবে একটি বিষয় হ'ল ব্যবহারকারীর Createঅনুমতি থাকতে পারে তবে Deleteব্যবহারকারীর লেখার অনুমতি থাকলেও এই ক্ষেত্রে এটি মিথ্যা ফিরে আসবে না
ক্রিস বি

কোডিংয়ের জন্য সর্বাধিক সুবিধাজনক উত্তর :) আমি কেবল এটি ব্যবহার করি তবে যাইহোক, যখন বড় সমবর্তী অনুরোধগুলি থাকে তখন এতগুলি পড়ার / লেখার ফলে পারফরম্যান্সের গতি কমে যেতে পারে সুতরাং সেই ক্ষেত্রে আপনি অন্যান্য উত্তরে প্রদত্ত অ্যাক্সেসকন্ট্রোল পদ্ধতি ব্যবহার করতে পারেন।
vis2006

1
Path.Combineপরিবর্তে যেমন ব্যবহার করুন Path.Combine(tempfilepath, "temp.txt")
17মেগান

3

ডিরেক্টরিটিতে রাইটিং অ্যাক্সেস রয়েছে কিনা তা পরীক্ষা করতে আপনি কোড ব্লক অনুসরণ করে চেষ্টা করতে পারেন। এটি ফাইলসিস্টেমএ্যাক্সেসরুল পরীক্ষা করে।

string directoryPath = "C:\\XYZ"; //folderBrowserDialog.SelectedPath;
bool isWriteAccess = false;
try
{
    AuthorizationRuleCollection collection =
        Directory.GetAccessControl(directoryPath)
            .GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
    foreach (FileSystemAccessRule rule in collection)
    {
        if (rule.AccessControlType == AccessControlType.Allow)
        {
            isWriteAccess = true;
            break;
        }
    }
}
catch (UnauthorizedAccessException ex)
{
    isWriteAccess = false;
}
catch (Exception ex)
{
    isWriteAccess = false;
}
if (!isWriteAccess)
{
    //handle notifications 
}

2

আপনার কোডে আপনার একটি সম্ভাব্য রেসের শর্ত রয়েছে - আপনি যখন চেক করবেন তখন যদি ব্যবহারকারীটির ফোল্ডারে লেখার অনুমতি থাকে তবে ব্যবহারকারী প্রকৃতপক্ষে ফোল্ডারে লেখার আগে এই অনুমতিটি প্রত্যাহার করে নেওয়া হবে কি? এই লেখাটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে যা আপনাকে ধরতে হবে এবং পরিচালনা করতে হবে। সুতরাং প্রাথমিক চেকটি অর্থহীন। আপনি পাশাপাশি লিখতে পারেন এবং কোনও ব্যতিক্রম পরিচালনা করতে পারেন। এটি আপনার পরিস্থিতির জন্য আদর্শ প্যাটার্ন।



1

কেবল প্রশ্নযুক্ত ফাইলটি অ্যাক্সেস করার চেষ্টা করা যথেষ্ট নয়। প্রোগ্রামটি চলমান ব্যবহারকারীর অনুমতি নিয়ে পরীক্ষাটি চলবে - যা আপনার বিরুদ্ধে পরীক্ষার জন্য ব্যবহারকারীর অনুমতিগুলি অগত্যা নয়।


0

আমি অ্যাশের সাথে একমত, এটা ঠিক করা উচিত। বিকল্পভাবে আপনি ঘোষণামূলক সিএএস ব্যবহার করতে পারেন এবং যদি তাদের অ্যাক্সেস না থাকে তবে প্রোগ্রামটি প্রথমে চালানো থেকে বিরত রাখতে পারেন।

আমি বিশ্বাস করি যে আমি যা শুনেছি তার থেকে সিএএস ৪.০-তে কয়েকটি সিএএস বৈশিষ্ট্য উপস্থিত নাও থাকতে পারে, নিশ্চিত না যে এটি কোনও সমস্যা হতে পারে কি না।


0

গ্রহণযোগ্য উত্তরে প্রস্তাবিত অনুসারে উইন্ডোজ on এ ব্যতিক্রম করতে আমি getAccessControl () পেতে পারি না।

আমি এসডিএস এর উত্তরের বিভিন্নতা ব্যবহার করে শেষ করেছি :

        try
        {
            bool writeable = false;
            WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            DirectorySecurity security = Directory.GetAccessControl(pstrPath);
            AuthorizationRuleCollection authRules = security.GetAccessRules(true, true, typeof(SecurityIdentifier));

            foreach (FileSystemAccessRule accessRule in authRules)
            {

                if (principal.IsInRole(accessRule.IdentityReference as SecurityIdentifier))
                {
                    if ((FileSystemRights.WriteData & accessRule.FileSystemRights) == FileSystemRights.WriteData)
                    {
                        if (accessRule.AccessControlType == AccessControlType.Allow)
                        {
                            writeable = true;
                        }
                        else if (accessRule.AccessControlType == AccessControlType.Deny)
                        {
                            //Deny usually overrides any Allow
                            return false;
                        }

                    } 
                }
            }
            return writeable;
        }
        catch (UnauthorizedAccessException)
        {
            return false;
        }

আশাকরি এটা সাহায্য করবে.


0

আমি একই সমস্যার মুখোমুখি হয়েছি: আমি যদি কোনও নির্দিষ্ট ডিরেক্টরিতে পড়তে / লিখতে পারি তবে কীভাবে যাচাই করা যায়। আমি এর সহজ সমাধানটি শেষ করেছিলাম ... আসলে এটি পরীক্ষা করে দেখুন। এখানে আমার কার্যকর যদিও কার্যকর সমাধান।

 class Program
{

    /// <summary>
    /// Tests if can read files and if any are present
    /// </summary>
    /// <param name="dirPath"></param>
    /// <returns></returns>
    private genericResponse check_canRead(string dirPath)
    {
        try
        {
            IEnumerable<string> files = Directory.EnumerateFiles(dirPath);
            if (files.Count().Equals(0))
                return new genericResponse() { status = true, idMsg = genericResponseType.NothingToRead };

            return new genericResponse() { status = true, idMsg = genericResponseType.OK };
        }
        catch (DirectoryNotFoundException ex)
        {

            return new genericResponse() { status = false, idMsg = genericResponseType.ItemNotFound };

        }
        catch (UnauthorizedAccessException ex)
        {

            return new genericResponse() { status = false, idMsg = genericResponseType.CannotRead };

        }

    }

    /// <summary>
    /// Tests if can wirte both files or Directory
    /// </summary>
    /// <param name="dirPath"></param>
    /// <returns></returns>
    private genericResponse check_canWrite(string dirPath)
    {

        try
        {
            string testDir = "__TESTDIR__";
            Directory.CreateDirectory(string.Join("/", dirPath, testDir));

            Directory.Delete(string.Join("/", dirPath, testDir));


            string testFile = "__TESTFILE__.txt";
            try
            {
                TextWriter tw = new StreamWriter(string.Join("/", dirPath, testFile), false);
                tw.WriteLine(testFile);
                tw.Close();
                File.Delete(string.Join("/", dirPath, testFile));

                return new genericResponse() { status = true, idMsg = genericResponseType.OK };
            }
            catch (UnauthorizedAccessException ex)
            {

                return new genericResponse() { status = false, idMsg = genericResponseType.CannotWriteFile };

            }


        }
        catch (UnauthorizedAccessException ex)
        {

            return new genericResponse() { status = false, idMsg = genericResponseType.CannotWriteDir };

        }
    }


}

public class genericResponse
{

    public bool status { get; set; }
    public genericResponseType idMsg { get; set; }
    public string msg { get; set; }

}

public enum genericResponseType
{

    NothingToRead = 1,
    OK = 0,
    CannotRead = -1,
    CannotWriteDir = -2,
    CannotWriteFile = -3,
    ItemNotFound = -4

}

আশা করি এটা সাহায্য করবে !


0

এখানে বেশিরভাগ উত্তর লেখার অ্যাক্সেসের জন্য পরীক্ষা করে না। এটি কেবল ব্যবহারকারী / গোষ্ঠী 'পড়ার অনুমতি' (ফাইল / ডিরেক্টরিটির এসিই তালিকাটি পড়ুন) কিনা তা পরীক্ষা করে দেখুন।

এছাড়াও এসিইর মাধ্যমে পুনরাবৃত্তি করা এবং এটি সুরক্ষা পরিচয়কারীটির সাথে মেলে কিনা তা যাচাই করা কার্যকর হয় না কারণ ব্যবহারকারী কোনও গোষ্ঠীর সদস্য হতে পারেন যা থেকে তিনি সুবিধা পেতে / হারাতে পারেন। এর চেয়ে খারাপটি হল নেস্টেড গ্রুপগুলি।

আমি জানি এটি একটি পুরানো থ্রেড তবে এখন যে কেউই তার জন্য আরও ভাল উপায়।

প্রদত্ত ব্যবহারকারীর পড়ার অনুমতি সুবিধাগুলি হ'ল, কেউ কার্যকর অ্যাক্সেস পরীক্ষা করতে Authz API ব্যবহার করতে পারেন।

https://docs.microsoft.com/en-us/windows/win32/secauthz/using-authz-api

https://docs.microsoft.com/en-us/windows/win32/secauthz/checking-access-with-authz-api

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.