0 / 0 / 0
Регистрация: 07.09.2017
Сообщений: 14
1

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

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

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

Есть скрипт, который формирует по заданому пути файл в котором есть назначенные уровни доступа (прямые или если группа 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2017, 17:28
Ответы с готовыми решениями:

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

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

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

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

3
1885 / 1107 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
07.09.2017, 18:15 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
Спасибо!

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

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

Пока не пытался, но интересно в 2.0 реализуемо?
0
25.10.2017, 17:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2017, 17:40
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru