Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.09.2017
Сообщений: 14

Скрипт по формированию уровней доступа для сетевых путей

07.09.2017, 17:28. Показов 1573. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть скрипт, который формирует по заданому пути файл в котором есть назначенные уровни доступа (прямые или если группа AD, то еще и состав объектов в группе). Работает он красиво, но есть необходимость дополнить его:

1) Работать со списком сетевых путей, то есть будет документ .txt, в котором вложен последовательно список сетевых путей;
2) Результат выгрузки всех путей нужно указать в один файл .csv так же последовательно.

Можете подсказать какими способами можно изящно дополнить скрипт?

PowerShell
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
$Folder = '\\path'
$DataFile = 'c:\Temp\AccessList.csv'
 
Set-Content -Value 'Path;AccessRights;AccessType;Scope;Inherited;Name;CanonicalName;PostalCode;City;Department' -Path $DataFile -Encoding UTF8
 
$domain = (Get-ADDomain).name.ToUpper()
$DomainSample1 = $domain + '\\'
$DomainSample2 = $domain + '\'
 
$Folder_ACL = Get-Acl -Path $Folder
 
$Access_List = $Folder_ACL.Access | ?{ $_.IdentityReference -match $DomainSample1}
 
foreach ($Access in $Access_List)
{
 
#
# начало разбора разрешений
#
 
$Rights = $Access.FileSystemRights.ToString()
$IFlag = $Access.InheritanceFlags.ToString()
$PFlag = $Access.PropagationFlags.ToString()
 
# тип доступа
 
$AccessType = $Access.AccessControlType.ToString()
 
# назначенные права доступа
 
if (($Rights -eq "ReadAndExecute, Synchronize") -and ($IFlag -eq 'ContainerInherit, ObjectInherit')) {$AccessRights = "Read"}
elseif (($Rights -eq "ReadAndExecute, Synchronize") -and ($IFlag -notlike '*ObjectInherit*')) {$AccessRights = "ViewOnly"}
elseif ($Rights -eq "Modify, Synchronize") {$AccessRights = "ReadWrite"}
elseif ($Rights -eq "FullControl") {$AccessRights = "Full"}
else {$AccessRights = $Rights}
 
# Наследование
 
if ($Access.IsInherited) {$Inherited = 'Наследованы'}
else {$Inherited = 'Заданы явно'}
 
# Область действия разрешений
 
if ($IFlag -eq 'None' -and $PFlag -eq 'None') {$Scope = "Только для этой папки"}
if ($IFlag -eq 'ContainerInherit, ObjectInherit' -and $PFlag -eq 'None') {$Scope = "Для этой папки, её подпапок и файлов"}
if ($IFlag -eq 'ContainerInherit, ObjectInherit' -and $PFlag -eq 'InheritOnly') {$Scope = "Только для подпапок и файлов"}
if ($IFlag -eq 'ContainerInherit' -and $PFlag -eq 'None') {$Scope = "Для этой папки и её подпапок"}
if ($IFlag -eq 'ObjectInherit' -and $PFlag -eq 'None') {$Scope = "Для этой папки и её файлов"}
if ($IFlag -eq 'ContainerInherit' -and $PFlag -eq 'InheritOnly') {$Scope = "Только для подпапок"}
if ($IFlag -eq 'ObjectInherit' -and $PFlag -eq 'InheritOnly') {$Scope = "Только для файлов"}
 
#
# конец разбора разрешений
#
 
$name = $Access.IdentityReference.Value.ToString().Replace($DomainSample2,'')
 
$ADObject = Get-ADObject -Filter{SamAccountName -eq $name}
$AccessData = $Folder,$AccessRights,$AccessType,$Scope,$Inherited -join ';'
 
if ($ADObject.ObjectClass -eq 'group')
    {
    $ADGroup = Get-ADGroup -Identity $ADObject.DistinguishedName -Properties *
    $data = $AccessData,$ADGroup.Name,$ADGroup.CanonicalName -join ';'
    }
if ($ADObject.ObjectClass -eq 'user')
    {
    $ADUser = Get-ADUser -Identity $ADObject.DistinguishedName -Properties *
    $data = $AccessData,`
            $ADUser.DisplayName,`
            $ADUser.CanonicalName,`
            $ADUser.PostalCode,`
            $ADUser.City,`
            $ADUser.Department `
            -join ';'
    }
    
Add-Content -Value $data -Path $DataFile -Encoding UTF8
 
if ($ADObject.ObjectClass -eq 'group')
    {
    $Inherited = $Inherited + ', через группу ' + $ADGroup.Name
    $AccessData = $Folder,$AccessRights,$AccessType,$Scope,$Inherited -join ';'
    foreach ($GroupMember in (Get-ADGroupMember -Identity $ADGroup.DistinguishedName -Recursive | ? objectClass -eq user))
        {
        $ADUser = Get-ADUser -Identity $GroupMember.DistinguishedName -Properties *
        $data = $AccessData,`
                $ADUser.DisplayName,`
                $ADUser.CanonicalName,`
                $ADUser.PostalCode,`
                $ADUser.City,`
                $ADUser.Department `
                -join ';'
        Add-Content -Value $data -Path $DataFile -Encoding UTF8
        }
    }
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2017, 17:28
Ответы с готовыми решениями:

Скрипт для сбора путей неиспользуемых фотографий и их удаление
Нужен рабочий скрипт для сравнивания путей файлов изображений на wordpress. 1)Скрипт должен обращаться в базу в базу mysql, и данные...

Скрипт для включение/отключения сетевых адаптеров
Добрый день! Поясню ситуацию: есть роутер, который использует немалое количество людей. Основная нагрузка идет на беспроводной канал...

ZXV10 H108L как точка доступа wi-fi для ethrnet провайдера (имеется 2 сетевых карты)
В общем-то весь вопрос практически и состоит в названии темы. Есть ADSL модем ZXV10 H108L, есть подключенное к компу ethernet соединение...

3
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
07.09.2017, 18:15
Лучший ответ Сообщение было отмечено n ilchenko как решение

Решение

Цитата Сообщение от n ilchenko Посмотреть сообщение
1) Работать со списком сетевых путей, то есть будет документ .txt, в котором вложен последовательно список сетевых путей;
2) Результат выгрузки всех путей нужно указать в один файл .csv так же последовательно.
Set-Content - выносите в начало, а остальной скрипт оборачиваете в foreach в котором $Folder перебирает пути из C:\Temp\folders.txt

Кликните здесь для просмотра всего текста
PowerShell
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Set-Content -Value 'Path;AccessRights;AccessType;Scope;Inherited;Name;CanonicalName;PostalCode;City;Department' -Path $DataFile -Encoding UTF8
 
foreach ($Folder in Get-Content C:\Temp\folders.txt)
{
 
$DataFile = 'c:\Temp\AccessList.csv'
 
$domain = (Get-ADDomain).name.ToUpper()
$DomainSample1 = $domain + '\\'
$DomainSample2 = $domain + '\'
 
$Folder_ACL = Get-Acl -Path $Folder
 
$Access_List = $Folder_ACL.Access | ?{ $_.IdentityReference -match $DomainSample1}
 
foreach ($Access in $Access_List)
{
 
#
# начало разбора разрешений
#
 
$Rights = $Access.FileSystemRights.ToString()
$IFlag = $Access.InheritanceFlags.ToString()
$PFlag = $Access.PropagationFlags.ToString()
 
# тип доступа
 
$AccessType = $Access.AccessControlType.ToString()
 
# назначенные права доступа
 
if (($Rights -eq "ReadAndExecute, Synchronize") -and ($IFlag -eq 'ContainerInherit, ObjectInherit')) {$AccessRights = "Read"}
elseif (($Rights -eq "ReadAndExecute, Synchronize") -and ($IFlag -notlike '*ObjectInherit*')) {$AccessRights = "ViewOnly"}
elseif ($Rights -eq "Modify, Synchronize") {$AccessRights = "ReadWrite"}
elseif ($Rights -eq "FullControl") {$AccessRights = "Full"}
else {$AccessRights = $Rights}
 
# Наследование
 
if ($Access.IsInherited) {$Inherited = 'Наследованы'}
else {$Inherited = 'Заданы явно'}
 
# Область действия разрешений
 
if ($IFlag -eq 'None' -and $PFlag -eq 'None') {$Scope = "Только для этой папки"}
if ($IFlag -eq 'ContainerInherit, ObjectInherit' -and $PFlag -eq 'None') {$Scope = "Для этой папки, её подпапок и файлов"}
if ($IFlag -eq 'ContainerInherit, ObjectInherit' -and $PFlag -eq 'InheritOnly') {$Scope = "Только для подпапок и файлов"}
if ($IFlag -eq 'ContainerInherit' -and $PFlag -eq 'None') {$Scope = "Для этой папки и её подпапок"}
if ($IFlag -eq 'ObjectInherit' -and $PFlag -eq 'None') {$Scope = "Для этой папки и её файлов"}
if ($IFlag -eq 'ContainerInherit' -and $PFlag -eq 'InheritOnly') {$Scope = "Только для подпапок"}
if ($IFlag -eq 'ObjectInherit' -and $PFlag -eq 'InheritOnly') {$Scope = "Только для файлов"}
 
#
# конец разбора разрешений
#
 
$name = $Access.IdentityReference.Value.ToString().Replace($DomainSample2,'')
 
$ADObject = Get-ADObject -Filter{SamAccountName -eq $name}
$AccessData = $Folder,$AccessRights,$AccessType,$Scope,$Inherited -join ';'
 
if ($ADObject.ObjectClass -eq 'group')
    {
    $ADGroup = Get-ADGroup -Identity $ADObject.DistinguishedName -Properties *
    $data = $AccessData,$ADGroup.Name,$ADGroup.CanonicalName -join ';'
    }
if ($ADObject.ObjectClass -eq 'user')
    {
    $ADUser = Get-ADUser -Identity $ADObject.DistinguishedName -Properties *
    $data = $AccessData,`
            $ADUser.DisplayName,`
            $ADUser.CanonicalName,`
            $ADUser.PostalCode,`
            $ADUser.City,`
            $ADUser.Department `
            -join ';'
    }
    
Add-Content -Value $data -Path $DataFile -Encoding UTF8
 
if ($ADObject.ObjectClass -eq 'group')
    {
    $Inherited = $Inherited + ', через группу ' + $ADGroup.Name
    $AccessData = $Folder,$AccessRights,$AccessType,$Scope,$Inherited -join ';'
    foreach ($GroupMember in (Get-ADGroupMember -Identity $ADGroup.DistinguishedName -Recursive | ? objectClass -eq user))
        {
        $ADUser = Get-ADUser -Identity $GroupMember.DistinguishedName -Properties *
        $data = $AccessData,`
                $ADUser.DisplayName,`
                $ADUser.CanonicalName,`
                $ADUser.PostalCode,`
                $ADUser.City,`
                $ADUser.Department `
                -join ';'
        Add-Content -Value $data -Path $DataFile -Encoding UTF8
        }
    }
 
}
 
}
1
0 / 0 / 0
Регистрация: 07.09.2017
Сообщений: 14
08.09.2017, 10:05  [ТС]
Спасибо!

Работает, помогли.
0
 Аватар для mutaborio
1 / 1 / 0
Регистрация: 06.10.2017
Сообщений: 39
25.10.2017, 17:40
Цитата Сообщение от n ilchenko Посмотреть сообщение
Работает он красиво
В какой версии PS?

Полезно, а если наоборот:
имеется файл (например .csv) с перечнем DNS имен серверов, в сценарий передается ФИО пользователя (если найдено более 1 предлагается выбор по имени УЗ), результат - перечень путей, куда пользователь имеет доступ (какой) явно или в составе группы (AD или локальной).

Пока не пытался, но интересно в 2.0 реализуемо?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2017, 17:40
Помогаю со студенческими работами здесь

Несовместимость уровней доступа метода и параметра
class Edition { protected string name; protected DateTime date; protected int amount; ...

Настройка уровней доступа к таблице access
Доброго времени суток. Если такой вопрос: не могу найти способ для организациии уровней доступа к таблице, которая вложена в форму. Все,...

Windows XP нет доступа к сети, нет доступа к Norton антивирус, сетевых служб нет
Отключился Инет, попробовал загрузить сетевые подключения - нет ни одной иконки. Загрузился с Ubuntu проверил clamav (базы обновлены)...

Форма авторизации с распределением уровней доступа и хранением логина и пароля в БД Access
Всем здрасте, только учусь работать с платформой, и вот возник вопрос, подскажите в каком направлении копать и если можно, как это грамотно...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru