Microsoft Developer Network > 포럼 홈 > Visual C# General > Enumerate file permissions
질문하기질문하기
 

답변됨Enumerate file permissions

  • 2007년 1월 10일 수요일 오전 11:37Sei_ 사용자 메달사용자 메달사용자 메달사용자 메달사용자 메달
     

    Hello,

    First, I hope that I wrote my question in the right forum... If not, sorry by advance.  

    Well, I am searching for a way to list all members autorized to access a specific file or folder on the network. The application to create will have to be available for any user : meaning, for the moment, that I cannot use any admin account.

    My question is : do you know if such application can be developped in .Net ? C# ?

    If yes, could you please help me by indicating me the classes to use ? (I am not expert in this language, but I think that I can try to do something !)

    Thank you by advance.

    Sei.

답변

  • 2007년 1월 10일 수요일 오후 4:59TaylorMichaelLMVP, 중재자사용자 메달사용자 메달사용자 메달사용자 메달사용자 메달
     답변됨

    As of v2 you can use the security subsystem to enumerate the access rights of any securable object.  Firstly you'll need to get the file access rules.  Then  you can enumerate through them.  Here's some sample code that dumps the access rights of a file (folders work the same way but with different classes)

    static void Main ( string[] args )
    {
      
    FileSecurity sec = File.GetAccessControl(@"c:\temp");

      
    AuthorizationRuleCollection rules = sec.GetAccessRules(true, true, typeof(SecurityIdentifier));
      
    foreach (FileSystemAccessRule rule in rules)
       {
         
    NTAccount account = rule.IdentityReference.Translate(typeof(NTAccount)) as NTAccount;
         
    Console.Write("{0}: ", account.Value);

         
    if (rule.AccessControlType == AccessControlType.Deny)
            
    Console.Write("Denied ");
         
    Console.Write("{0}", rule.FileSystemRights);

         
    if (rule.IsInherited)
            
    Console.WriteLine(" (Inherited)");
         
    else
            
    Console.WriteLine(" (Explicit)");
       };
    }

    Michael Taylor - 1/10/07
    http://p3net.mvps.org

     

모든 응답

  • 2007년 1월 10일 수요일 오후 4:59TaylorMichaelLMVP, 중재자사용자 메달사용자 메달사용자 메달사용자 메달사용자 메달
     답변됨

    As of v2 you can use the security subsystem to enumerate the access rights of any securable object.  Firstly you'll need to get the file access rules.  Then  you can enumerate through them.  Here's some sample code that dumps the access rights of a file (folders work the same way but with different classes)

    static void Main ( string[] args )
    {
      
    FileSecurity sec = File.GetAccessControl(@"c:\temp");

      
    AuthorizationRuleCollection rules = sec.GetAccessRules(true, true, typeof(SecurityIdentifier));
      
    foreach (FileSystemAccessRule rule in rules)
       {
         
    NTAccount account = rule.IdentityReference.Translate(typeof(NTAccount)) as NTAccount;
         
    Console.Write("{0}: ", account.Value);

         
    if (rule.AccessControlType == AccessControlType.Deny)
            
    Console.Write("Denied ");
         
    Console.Write("{0}", rule.FileSystemRights);

         
    if (rule.IsInherited)
            
    Console.WriteLine(" (Inherited)");
         
    else
            
    Console.WriteLine(" (Explicit)");
       };
    }

    Michael Taylor - 1/10/07
    http://p3net.mvps.org

     

  • 2007년 11월 16일 금요일 오후 5:26it68 사용자 메달사용자 메달사용자 메달사용자 메달사용자 메달
     

    This example does not cover situation when "rule.IdentityReference.Translate(typeof(NTAccount)) as NTAccount" throws an exception because SID can not be translated to NTAccount. This situation is very common when file share is exposed by a system that is not part of NT domain and uses CIFS or other type of file sharing.

     

    I found no ways so far to query if current application will have particular FileSystemRights permission on specific file.

     

    Is it achievable in C#?

     

    Igor Touzov 11/16/2007