Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/117: Рейтинг темы: голосов - 117, средняя оценка - 4.85
1 / 1 / 3
Регистрация: 07.10.2011
Сообщений: 56
.NET 4.x

Проверка прав доступа к папке

04.04.2012, 16:13. Показов 21656. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи. Необходимо в указаном пути перебрать папки на доступ к ней юзера.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string abc;
 
            Console.WriteLine("Введите диска");
            abc = Console.ReadLine();
            string drive = abc + @":\";
        
            DirectoryInfo dir = new DirectoryInfo(drive); //тут я получил директорию где лежат папки
            DirectoryInfo[] alldir = dir.GetDirectories();//получил все директории на диске
 
string nameuser = WindowsIdentity.GetCurrent().Name;
            FileSystemAccessRule acr = new FileSystemAccessRule(nameuser, FileSystemRights.Write, AccessControlType.Allow);
            foreach (DirectoryInfo name in alldir) //перебираем все папки в директории
            {
                
                DirectorySecurity ds = name.GetAccessControl(AccessControlSections.Access);//получаем права папок
А вот как сравнить, что пользователь имеет доступ на запись в директорию.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2012, 16:13
Ответы с готовыми решениями:

Проверка прав доступа к папке (диску).
Меня интересует такой вопрос, как можно проверить возможно ли создать файл в папке. Можно конечно попробовать создать файл и в случае...

Назначение папке прав доступа для всех
Доброе время суток, написал програму и теперь написал к ней установщик. Инсталятор запускается с правами администратора, все работает без...

Настройка прав доступа к папке на сервере
Господа помоги со скриптами При создании счетчика на ASP - счетчик пишет в папку с тестовым файлом count.txt - как настроить права...

6
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.04.2012, 16:35
GetAccessControl у DirectoryInfo.
0
1 / 1 / 3
Регистрация: 07.10.2011
Сообщений: 56
05.04.2012, 15:37  [ТС]
C#
1
2
3
4
5
6
7
8
9
foreach (DirectoryInfo name in alldir) //перебираем все папки в директории
            {
                
                DirectorySecurity ds = name.GetAccessControl();
                
                foreach (FileSystemAccessRule ar in ds.GetAccessRules(true, true, typeof(NTAccount)))
                {
                    Console.WriteLine("{0},  - {1}, -  {2} - {3}", name.Name, ar.IdentityReference, ar.IsInherited, ar.AccessControlType);
                }
показывает все группы, как же сделать чтоб проверяла пользователя запустившего программу?

Добавлено через 4 часа 33 минуты
немного продвинулся
C#
1
WindowsIdentity wi = WindowsIdentity.GetCurrent();// получил текущего пользователя
C#
1
FileSystemAccessRule fas = new FileSystemAccessRule(wi.Name, FileSystemRights.ReadData, AccessControlType.Allow);// создаем права доступа к файлу
C#
1
2
3
4
5
6
7
8
9
10
foreach (DirectoryInfo name in alldir) //перебираем все папки в директории
            {
                
                DirectorySecurity ds = name.GetAccessControl();
                FileSecurity mmv = ds.GetAccessRules(true, true, typeof(NTAccount));
                {
                    Console.WriteLine("Пользователю {0}, разрешено писать в папку {1}", wi.Name, name.Name);
                }
 
            }
Вот ни как не догоню, как потом сравнить, есть доступ или нет. Помогите пожалуйста.
0
1 / 1 / 3
Регистрация: 07.10.2011
Сообщений: 56
09.04.2012, 17:27  [ТС]
Переписал пока вот так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WindowsIdentity wi = WindowsIdentity.GetCurrent();
            FileSystemAccessRule fs = new FileSystemAccessRule(wi.Name, FileSystemRights.ReadData, AccessControlType.Allow);  
            foreach (DirectoryInfo name in alldir) //перебираем все папки в директории
            {
                DirectorySecurity ds = name.GetAccessControl(AccessControlSections.Access);
                foreach (FileSystemAccessRule ar in ds.GetAccessRules(true, true, typeof(NTAccount)))
                {
                    if (ar == fs)
                    {
                        Console.WriteLine("Доступ к папке {0} для пользователя - {1} разрешен", name.Name, wi.Name);
                    }
                    else
                        Console.WriteLine("Доступ к папке {0} для пользователя - {1} запрещен", name.Name, wi.Name);
                }
Ошибок студия не дает. Но результат не тот. Неужели ни кому не нужно было проверять доступ к папке?
0
251 / 163 / 14
Регистрация: 10.03.2012
Сообщений: 544
09.04.2012, 22:31
Замените строку в последнем коде
C#
1
if (ar == fs)
на
C#
1
if (ar.FileSystemRights == fs.FileSystemRights)
Я нарыл это в MSDN, за работоспособность не отвечаю. Ссылка на перечислимый тип FileSystemRights:
http://msdn.microsoft.com/en-u... ights.aspx
0
1 / 1 / 3
Регистрация: 07.10.2011
Сообщений: 56
11.04.2012, 16:10  [ТС]
Сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DirectoryInfo dir = new DirectoryInfo(drive); //получаем букву диска
            DirectoryInfo[] alldir = dir.GetDirectories();//получаем директории в корне на диске
            WindowsIdentity wi = WindowsIdentity.GetCurrent();
            string NTAacc = wi.Name;
            Console.WriteLine("Юзер - {0}", NTAacc);
            foreach (DirectoryInfo name in alldir) //перебираем все папки в директории
            {
                Console.WriteLine("1");
                DirectorySecurity ds = name.GetAccessControl(AccessControlSections.All);
                Console.WriteLine("2");
                AuthorizationRuleCollection rules = ds.GetAccessRules(true, true, typeof(NTAccount));
                Console.WriteLine("3");
                foreach (AuthorizationRule rl in rules)
                {
                    Console.WriteLine("4");
                    if (rl.IdentityReference.Value.Equals(NTAacc, StringComparison.CurrentCultureIgnoreCase))
                    {
                        Console.WriteLine("5");
                        if ((((FileSystemAccessRule)rl).FileSystemRights & FileSystemRights.WriteData) > 0)
                        {
                            Console.WriteLine("Доступ к папке {0} для пользователя - {1} разрешен", name.Name, NTAacc);
                        }
                        else
                            Console.WriteLine("Доступ к папке {0} для пользователя - {1} запрещен", name.Name, NTAacc);
                    }
                    else
                        Console.WriteLine("6");
Собственно почемуто после if (rl.IdentityReference.Value.Equals(NTAac c, StringComparison.CurrentCultureIgnoreCas e)) код не обрабатывается и переходит на else Console.WriteLine("6");

Добавлено через 19 часов 26 минут
Ошибку нашел. Код такой
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 foreach (DirectoryInfo name in alldir) //перебираем все папки в директории
            {
                DirectorySecurity ds = name.GetAccessControl(AccessControlSections.Access);
                AuthorizationRuleCollection rules = ds.GetAccessRules(true, true, typeof(NTAccount));
                foreach (AuthorizationRule rl in rules)
                {
                    if (!rl.IdentityReference.Value.Equals(NTAacc, StringComparison.CurrentCultureIgnoreCase))
                    {
                        if ((((FileSystemAccessRule)rl).FileSystemRights & FileSystemRights.WriteData) > 0)
                        {
                            Console.WriteLine("Доступ к папке {0} для пользователя - {1} разрешен", name.Name, NTAacc);
                        }
                        else
                            Console.WriteLine("Доступ к папке {0} для пользователя - {1} запрещен", name.Name, NTAacc);
                    }
                    else
                        Console.WriteLine("6");
Теперь все срабатывает. Только проблема с правами. Если указать диск для перебора папок, то программа пишет, что ни в одну папку моя учетка не имеет прав. А на диске д, наоборот ко всем. Хотя папка System Volume Information я ее не могу даже открыть, так как прав нет, не то что записать туда данные. Подскажите что с кодом не так?

Добавлено через 4 часа 24 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
string drive = abc + @":\";
            DirectoryInfo dir = new DirectoryInfo(drive);
            DirectoryInfo[] alldir = dir.GetDirectories();
            WindowsIdentity wi = WindowsIdentity.GetCurrent();
            foreach (DirectoryInfo name in alldir)
            {
                DirectorySecurity ds = name.GetAccessControl(AccessControlSections.Access);
                AuthorizationRuleCollection rules = ds.GetAccessRules(true, true, typeof(SecurityIdentifier));
                foreach (FileSystemAccessRule rl in rules)
                {
                    SecurityIdentifier sid = (SecurityIdentifier)rl.IdentityReference;
                    if (((rl.FileSystemRights & FileSystemRights.WriteData) == FileSystemRights.WriteData))
                    {
                        if ((sid.IsAccountSid() && wi.User == sid) ||
                            (!sid.IsAccountSid() && wi.Groups.Contains(sid)))
                        {
                            if (rl.AccessControlType == AccessControlType.Allow)
                            {
                                Console.WriteLine("Доступ к папке {0} для пользователя - {1} разрешен", name.Name, wi.Name);
                            }
                            else
                            {
                                Console.WriteLine("Доступ к папке {0} для пользователя - {1} запрещен", name.Name, wi.Name);
                            }
                        }
                    }
                }
            }
            Console.ReadLine();
Нашел решение здесь
0
 Аватар для SKIER
12 / 11 / 5
Регистрация: 04.07.2009
Сообщений: 357
12.05.2012, 08:30
я тоже щас голову ломаю над этим

допустимые права (запись, чтение, удаление и т.п.) для текущего пользователя

http://stackoverflow.com/quest... le-entries моожжет тут что то полезное найдете?......
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2012, 08:30
Помогаю со студенческими работами здесь

Подскажите как реализовать проверку прав доступа к папке
Делаю небольшой файловый менеджер, и когда захожу в папку, к которой нед доступа, прога вылетает. Помогите пожалуйста реализовать...

Проверка прав и атрибутов доступа к файлу, установка их
Товарищи, вопрос таков: Имеется програмка, считывающая данные с одной папки и генерирующая в другую. Нужно перед операцией чтения...

Нет прав доступа к сетевой папке
Два компьютера с windows xp sp3 в локалке На одном компьютере расшарено 2 папки. С другого компьютера должен быть доступ к обоим...

Скрипт для назначения прав доступа к папке
Дорогие друзья , есть задача есть группа пользователей D и P, нужно для первой группы задать права на папку чтение выполнение но без...

Журнал изменений прав доступа к общей папке
Мальчишки привет! :) Тут возникла такая проблемка, у меня дома с соседями общая сетка под Windows 7. И я вдруг обнаружила, что одна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru