Re[3]: Эффективные права
От: Аноним  
Дата: 07.07.09 04:55
Оценка:
Вот так вроде как получается то, что надо

    class NetDirectorySecurity : NativeObjectSecurity
    {
        public NetDirectorySecurity(string ResName, AccessControlSections IncludeSections)
            : base(true, ResourceType.LMShare, ResName, IncludeSections)
        {
        }

        private static FileSystemRights RightsFromAccessMask(int accessMask)
        {
            return (FileSystemRights)accessMask;
        }

        public sealed override AccessRule AccessRuleFactory(IdentityReference identityReference, int accessMask, 
            bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
        {
            return new FileSystemAccessRule(identityReference, RightsFromAccessMask(accessMask), inheritanceFlags, propagationFlags, type);
        }

        public sealed override AuditRule AuditRuleFactory(IdentityReference identityReference, int accessMask, 
            bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AuditFlags flags)
        {
            return new FileSystemAuditRule(identityReference, RightsFromAccessMask(accessMask), inheritanceFlags, propagationFlags, flags);
        }

        public override Type AccessRightType { get { return typeof(FileSystemRights); } }
        public override Type AccessRuleType { get {return typeof(FileSystemAccessRule); } }
        public override Type AuditRuleType { get  { return typeof(FileSystemAuditRule); } }
    }

// Программа

            string NetDirName = @"\\ServerName\ShareName";

            AuthorizationRuleCollection Rules = null;
            try
            {                
                NetDirectorySecurity NDS = new NetDirectorySecurity(NetDirName, AccessControlSections.Access);
                Rules = NDS.GetAccessRules(true, true, typeof(SecurityIdentifier));
            }
            catch(UnauthorizedAccessException E)
            {
                Console.WriteLine("Exception: {0}\n", E.Message);
            }
            catch(Exception E)
            {
                Console.WriteLine("Exception: {0}\nMessage: {1}\n", E.GetType().Name, E.Message);
            }

            if (Rules != null)
            {
                Console.WriteLine("OK");
                foreach (FileSystemAccessRule AR in Rules)
                {
                    IdentityReference IR = AR.IdentityReference;
                    IdentityReference Account = IR.Translate(typeof(NTAccount));
                    Console.WriteLine(IR.Value);
                    Console.WriteLine(Account.Value + "\n");
                    IR = null;
                    Account = null;
               }
           }


Но ввиду полного отсутсвия опыта в NET, я не знаю, насколько это правильно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.