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

Выгрузка списка доступа к сетевой папке

24.04.2018, 10:30. Показов 21813. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте.
Надо выгрузить список пользователей к сетевым папкам.
В интернетах нашёл скрипт, но только показывает группы.
Как его можно доделать, что он показывал пользователей ?
Спасибо.
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
$good = @()
$bad = @()
 
Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach {
    $name = $_.DNSHostName
echo $_
    try {
        $shares = Get-WmiObject Win32_Share -ComputerName $name -ErrorAction Stop
        foreach($good in $shares){
  $folder =  $good | select name
  $folder_des =  $good | select Description
   if (($folder_des.Description -ne "Удаленный IPC") -and($folder_des.Description -ne "Printer Drivers") -and($folder_des.Description -ne "Remote IPC") -and($folder_des.Description -notlike "*Logon server share*") -and ($folder_des.Description -ne "Драйверы принтеров") -and ($folder_des.Description -ne "Remote Admin") -and ($folder_des.Description -ne "Default share") -and ($folder_des.Description -ne "Удаленный Admin") -and ($folder_des.Description -ne "Стандартный общий ресурс")) {
   $folder_name="\\"+$name+"\"+$folder.name
   echo $folder_name
   
 
# Задаем путь к корневой папке
$RootPath = $folder_name
 
# Определяем полный путь к папке с запущенным скриптом
$ScriptPath = $MyInvocation.MyCommand.Definition | `
split-path -parent
# Определяем имя запущенного скрипта
$ScriptName = $MyInvocation.MyCommand.Name
# Вырезаем ".ps1" из имени скрипта
$ScriptName = $ScriptName.Replace(".ps1","")
# Задаем полный путь log-файла
$LogPath = $ScriptPath + "\" + $ScriptName + ".log"
 
# Запрашиваем текущее точное время
$dt = get-date -Format "yyyy-MM-d_HH-mm-ss"
# Задаем путь csv-файла
$CsvPath = $ScriptPath + "\" + $folder.name + " (" + $dt + `
")" + ".csv"
 
# Функция записи в лог передаваемой строки $str
Function Write-Log ($str) {
  # Запрашиваем текущее точное время
  $dt = get-date -Format "d.MM.yyyy HH:mm:ss"
  # Формируем строку с текущим временем
  $str = "[" + $dt + "]" + " " + $str
  # Пишем строку в лог
  $str | Out-File -FilePath $LogPath -Append -Encoding UTF8
}
 
# Если корневая папка не существует
try {Test-Path $RootPath -ErrorAction Stop
# Запрашиваем атрибуты корневой папки
$dir = Get-Item $RootPath | select FullName, CreationTime, `
LastAccessTime, LastWriteTime
# Запрашиваем списки доступа корневой папки
$acls = Get-Acl $RootPath | select -expand access | `
where {$_.IdentityReference -notmatch "BUILTIN|NT AUTHORITY|`
EVERYONE|CREATOR OWNER|ВЛАДЕЛЕЦ"}
 
# Создаем новый PSObject, "суммирующий" свойства $dir и $acl
$Obj = new-object PSObject
$Obj | add-member -membertype NoteProperty -name `
"FullName" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"CreationTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"LastAccessTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"LastWriteTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"FileSystemRights" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"AccessControlType" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"IdentityReference" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"IsInherited" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"InheritanceFlags" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"PropagationFlags" -Value ""
# Функция "склеивания" свойств объектов папки $dir и
# списков доступа к папке $acl в новом объекте PSObject - $Obj
Function Init-Obj ($dir, $acl) {
  # Задаем свойства $Obj значениями свойств $dir
  $Obj.FullName = $dir.FullName
  $Obj.CreationTime = $dir.CreationTime.ToString()
  $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
  $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
  # Задаем свойства $Obj значениями списка доступа $acl
  $Obj.FileSystemRights = $acl.FileSystemRights
  $Obj.AccessControlType = $acl.AccessControlType
  $Obj.IdentityReference = $acl.IdentityReference.Value
  $Obj.IsInherited = $acl.IsInherited
  $Obj.InheritanceFlags = $acl.InheritanceFlags
  $Obj.PropagationFlags = $acl.PropagationFlags
}
 
# Перебираем все списки доступа корневой папки $dir
foreach ($acl in $acls) {
  # Задаем значения $Obj из свойств $dir и $acl
  Init-Obj $dir $acl
  # Записываем полученные значения в csv-файл
  $Obj | Export-csv $CsvPath -Append -Encoding utf8 `
  -Force -NoTypeInformation -Delimiter ";"
}
# Рекурсивная функция перебора дерева подкаталогов
# корневой папки $dir
Function Recur ($dir) {
  # Находим подкаталоги в корневой папке
  $childs = Get-ChildItem $dir.FullName -Directory
  # Перебираем подкаталоги
  foreach ($child in $childs) {
    # Поиск ненаследованных прав доступа папки $child
    $acls = Get-Acl $child.FullName | select -expand access | `
    where {($_.IdentityReference -notmatch "BUILTIN|NT AUTHORITY|`
    EVERYONE|CREATOR OWNER|ВЛАДЕЛЕЦ") -and ($_.IsInherited `
    -eq $false)}
    # Если есть ненаследованные права доступа
    if ($acls.count -ne 0) {
      # Перебираем списки доступа к папке $child
      foreach ($acl in $acls) {
        # Формируем $Obj из свойств $child и $acl
        Init-Obj $child $acl
        # Записываем полученные значения в csv-файл
        $Obj | Export-csv $CsvPath -Append -Encoding utf8 -Force `
        -NoTypeInformation -Delimiter ";"
      }
    }
    # Если у подкаталога есть дочерние директории
    if ($child.GetDirectories().Count -ne 0) {
      # Падаем в рекурсию, перебирая дочерние директории
      Recur $child
    }
  }
}
 
# Перебор дерева подкаталогов корневой папки $dir
Recur $dir
   } catch {
  # Выводим на экран сообщение с ошибкой
  Write-Host $RootPath
  Write-Host "Указан неверный путь к папке!"
  Write-Host
  # Записываем сообщение с ошибкой в лог
  Write-Log $RootPath
  Write-Log "Указан неверный путь к папке!"
  # И прерываем скрипт
 
}
   }
  }
    }
    catch {
        $Bad += New-Object PsObject -Property @{
            "Name" = $Name
            "Exception" = "$_"
        }
    }
 
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2018, 10:30
Ответы с готовыми решениями:

Выгрузка списка пользователей сетевой папки и их атрибутов из AD
День добрый, форумчане. Подскажите, реально ли сделать такую выгрузку в формате (.xls или .csv)??? Есть сетевая папка в...

Нет доступа к сетевой папке сервера
Привет, помогите пожалуйста. На работе есть сеть с доменом, у некоторых на компах xp у некоторых 7-ка. Есть сервер Windows server 2003...

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

23
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
24.04.2018, 14:28
Лучший ответ Сообщение было отмечено Joey как решение

Решение

Цитата Сообщение от beren43 Посмотреть сообщение
Как его можно доделать, что он показывал пользователей ?
Если в этом скрипте заменить строки с 111 по 114 на:

PowerShell
1
$acls = Get-Acl $child.FullName | select -expand access | where {$_.IsInherited -eq $false}
и с 52 по 54 на:

PowerShell
1
$acls = Get-Acl $RootPath | select -expand access
тогда будут учитываться все имеющиеся разрешения.
3
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
24.04.2018, 14:35  [ТС]
Огромное спасибо.
Display name пользователей, чтобы показывал нельзя сделать так ?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
24.04.2018, 15:14
Цитата Сообщение от beren43 Посмотреть сообщение
Display name пользователей, чтобы показывал нельзя сделать так ?
Можно, но не так просто, как кажется.

Из IdentityReference мы получаем в лучшем случае SamAccountName (если объект удаётся найти) или же просто SID.

А далее - сначала нужно понять доменный это объект или локальный. Если локальный выяснить группа это или пользователь...

Вот небольшая демонстрация:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$path = "C:\Temp\test.txt"
$AD_Domain = (Get-ADDomain).name
 
cls
foreach ($acl in (Get-Acl $path).Access)
{
 
$domain,$SamAccountName = $acl.IdentityReference.Value -Split '\\'
 
if ($domain -eq $AD_Domain)
{
    $Object = Get-ADObject -Filter {SamAccountName -eq $SamAccountName}
    $Object.Name
}
else
{
    if    ($Object = Get-LocalUser $SamAccountName -EA SilentlyContinue)   {$Object.FullName}
    elseif ($Object = Get-LocalGroup $SamAccountName -EA SilentlyContinue) {$Object.Name}
    else {$acl.IdentityReference.Value}
 
}
 
}
0
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
25.04.2018, 14:19  [ТС]
Странно сейчас хочу выполнить первоначальный код
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
good = @()
$bad = @()
 
Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach {
    $name = $_.DNSHostName
echo $_
    try {
        $shares = Get-WmiObject Win32_Share -ComputerName $name -ErrorAction Stop
        foreach($good in $shares){
  $folder =  $good | select name
  $folder_des =  $good | select Description
   if (($folder_des.Description -ne "Удаленный IPC") -and($folder_des.Description -ne "Printer Drivers") -and($folder_des.Description -ne "Remote IPC") -and($folder_des.Description -notlike "*Logon server share*") -and ($folder_des.Description -ne "Драйверы принтеров") -and ($folder_des.Description -ne "Remote Admin") -and ($folder_des.Description -ne "Default share") -and ($folder_des.Description -ne "Удаленный Admin") -and ($folder_des.Description -ne "Стандартный общий ресурс")) {
   $folder_name="\\"+$name+"\"+$folder.name
   echo $folder_name
   
 
# Задаем путь к корневой папке
$RootPath = $folder_name
 
# Определяем полный путь к папке с запущенным скриптом
$ScriptPath = $MyInvocation.MyCommand.Definition | `
split-path -parent
# Определяем имя запущенного скрипта
$ScriptName = $MyInvocation.MyCommand.Name
# Вырезаем ".ps1" из имени скрипта
$ScriptName = $ScriptName.Replace(".ps1","")
# Задаем полный путь log-файла
$LogPath = $ScriptPath + "\" + $ScriptName + ".log"
 
# Запрашиваем текущее точное время
$dt = get-date -Format "yyyy-MM-d_HH-mm-ss"
# Задаем путь csv-файла
$CsvPath = $ScriptPath + "\" + $folder.name + " (" + $dt + `
")" + ".csv"
 
# Функция записи в лог передаваемой строки $str
Function Write-Log ($str) {
  # Запрашиваем текущее точное время
  $dt = get-date -Format "d.MM.yyyy HH:mm:ss"
  # Формируем строку с текущим временем
  $str = "[" + $dt + "]" + " " + $str
  # Пишем строку в лог
  $str | Out-File -FilePath $LogPath -Append -Encoding UTF8
}
 
# Если корневая папка не существует
try {Test-Path $RootPath -ErrorAction Stop
# Запрашиваем атрибуты корневой папки
$dir = Get-Item $RootPath | select FullName, CreationTime, `
LastAccessTime, LastWriteTime
# Запрашиваем списки доступа корневой папки
$acls = Get-Acl $RootPath | select -expand access | `
where {$_.IdentityReference -notmatch "BUILTIN|NT AUTHORITY|`
EVERYONE|CREATOR OWNER|ВЛАДЕЛЕЦ"}
 
# Создаем новый PSObject, "суммирующий" свойства $dir и $acl
$Obj = new-object PSObject
$Obj | add-member -membertype NoteProperty -name `
"FullName" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"CreationTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"LastAccessTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"LastWriteTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"FileSystemRights" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"AccessControlType" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"IdentityReference" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"IsInherited" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"InheritanceFlags" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"PropagationFlags" -Value ""
# Функция "склеивания" свойств объектов папки $dir и
# списков доступа к папке $acl в новом объекте PSObject - $Obj
Function Init-Obj ($dir, $acl) {
  # Задаем свойства $Obj значениями свойств $dir
  $Obj.FullName = $dir.FullName
  $Obj.CreationTime = $dir.CreationTime.ToString()
  $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
  $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
  # Задаем свойства $Obj значениями списка доступа $acl
  $Obj.FileSystemRights = $acl.FileSystemRights
  $Obj.AccessControlType = $acl.AccessControlType
  $Obj.IdentityReference = $acl.IdentityReference.Value
  $Obj.IsInherited = $acl.IsInherited
  $Obj.InheritanceFlags = $acl.InheritanceFlags
  $Obj.PropagationFlags = $acl.PropagationFlags
}
 
# Перебираем все списки доступа корневой папки $dir
foreach ($acl in $acls) {
  # Задаем значения $Obj из свойств $dir и $acl
  Init-Obj $dir $acl
  # Записываем полученные значения в csv-файл
  $Obj | Export-csv $CsvPath -Append -Encoding utf8 `
  -Force -NoTypeInformation -Delimiter ";"
}
# Рекурсивная функция перебора дерева подкаталогов
# корневой папки $dir
Function Recur ($dir) {
  # Находим подкаталоги в корневой папке
  $childs = Get-ChildItem $dir.FullName -Directory
  # Перебираем подкаталоги
  foreach ($child in $childs) {
    # Поиск ненаследованных прав доступа папки $child
    $acls = Get-Acl $child.FullName | select -expand access | `
    where {($_.IdentityReference -notmatch "BUILTIN|NT AUTHORITY|`
    EVERYONE|CREATOR OWNER|ВЛАДЕЛЕЦ") -and ($_.IsInherited `
    -eq $false)}
    # Если есть ненаследованные права доступа
    if ($acls.count -ne 0) {
      # Перебираем списки доступа к папке $child
      foreach ($acl in $acls) {
        # Формируем $Obj из свойств $child и $acl
        Init-Obj $child $acl
        # Записываем полученные значения в csv-файл
        $Obj | Export-csv $CsvPath -Append -Encoding utf8 -Force `
        -NoTypeInformation -Delimiter ";"
      }
    }
    # Если у подкаталога есть дочерние директории
    if ($child.GetDirectories().Count -ne 0) {
      # Падаем в рекурсию, перебирая дочерние директории
      Recur $child
    }
  }
}
 
# Перебор дерева подкаталогов корневой папки $dir
Recur $dir
   } catch {
  # Выводим на экран сообщение с ошибкой
  Write-Host $RootPath
  Write-Host "Указан неверный путь к папке!"
  Write-Host
  # Записываем сообщение с ошибкой в лог
  Write-Log $RootPath
  Write-Log "Указан неверный путь к папке!"
  # И прерываем скрипт
 
}
   }
  }
    }
    catch {
        $Bad += New-Object PsObject -Property @{
            "Name" = $Name
            "Exception" = "$_"
        }
    }
 
 
}
Но появляется ошибка:
Code
1
2
3
4
5
6
7
Get-ADComputer : Имя "Get-ADComputer" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильнос
ть написания имени, а также наличие и правильность пути, после чего повторите попытку.
D:\Rights.ps1:4 знак:1
+ Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach  ...
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-ADComputer:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
В чём может быть проблема ?
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.04.2018, 14:26
Цитата Сообщение от beren43 Посмотреть сообщение
Имя "Get-ADComputer" не распознано как имя командлета, функции, файла сценария или выполняемой программы
Необходимо установить AD оснастку для PS - "Модуль Active Directory для Windows PowerShell", а затем её вызвать:

PowerShell
1
Import-Module -Name ActiveDirectory
1
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
25.04.2018, 14:40  [ТС]
Исправил как советовал KDE77, за что ему огромное спасибо.
Но всё равно показывает группы владельцев.
А хотелось бы , что показывал членов этих групп.

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
$good = @()
$bad = @()
 
Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach {
    $name = $_.DNSHostName
echo $_
    try {
        $shares = Get-WmiObject Win32_Share -ComputerName $name -ErrorAction Stop
        foreach($good in $shares){
  $folder =  $good | select name
  $folder_des =  $good | select Description
   if (($folder_des.Description -ne "Удаленный IPC") -and($folder_des.Description -ne "Printer Drivers") -and($folder_des.Description -ne "Remote IPC") -and($folder_des.Description -notlike "*Logon server share*") -and ($folder_des.Description -ne "Драйверы принтеров") -and ($folder_des.Description -ne "Remote Admin") -and ($folder_des.Description -ne "Default share") -and ($folder_des.Description -ne "Удаленный Admin") -and ($folder_des.Description -ne "Стандартный общий ресурс")) {
   $folder_name="\\"+$name+"\"+$folder.name
   echo $folder_name
   
 
# Задаем путь к корневой папке
$RootPath = $folder_name
 
# Определяем полный путь к папке с запущенным скриптом
$ScriptPath = $MyInvocation.MyCommand.Definition | `
split-path -parent
# Определяем имя запущенного скрипта
$ScriptName = $MyInvocation.MyCommand.Name
# Вырезаем ".ps1" из имени скрипта
$ScriptName = $ScriptName.Replace(".ps1","")
# Задаем полный путь log-файла
$LogPath = $ScriptPath + "\" + $ScriptName + ".log"
 
# Запрашиваем текущее точное время
$dt = get-date -Format "yyyy-MM-d_HH-mm-ss"
# Задаем путь csv-файла
$CsvPath = $ScriptPath + "\" + $folder.name + " (" + $dt + `
")" + ".csv"
 
# Функция записи в лог передаваемой строки $str
Function Write-Log ($str) {
  # Запрашиваем текущее точное время
  $dt = get-date -Format "d.MM.yyyy HH:mm:ss"
  # Формируем строку с текущим временем
  $str = "[" + $dt + "]" + " " + $str
  # Пишем строку в лог
  $str | Out-File -FilePath $LogPath -Append -Encoding UTF8
}
 
# Если корневая папка не существует
try {Test-Path $RootPath -ErrorAction Stop
# Запрашиваем атрибуты корневой папки
$dir = Get-Item $RootPath | select FullName, CreationTime, `
LastAccessTime, LastWriteTime
# Запрашиваем списки доступа корневой папки
$acls = Get-Acl $RootPath | select -expand access
 
# Создаем новый PSObject, "суммирующий" свойства $dir и $acl
$Obj = new-object PSObject
$Obj | add-member -membertype NoteProperty -name `
"FullName" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"CreationTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"LastAccessTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"LastWriteTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"FileSystemRights" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"AccessControlType" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"IdentityReference" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"IsInherited" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"InheritanceFlags" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"PropagationFlags" -Value ""
# Функция "склеивания" свойств объектов папки $dir и
# списков доступа к папке $acl в новом объекте PSObject - $Obj
Function Init-Obj ($dir, $acl) {
  # Задаем свойства $Obj значениями свойств $dir
  $Obj.FullName = $dir.FullName
  $Obj.CreationTime = $dir.CreationTime.ToString()
  $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
  $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
  # Задаем свойства $Obj значениями списка доступа $acl
  $Obj.FileSystemRights = $acl.FileSystemRights
  $Obj.AccessControlType = $acl.AccessControlType
  $Obj.IdentityReference = $acl.IdentityReference.Value
  $Obj.IsInherited = $acl.IsInherited
  $Obj.InheritanceFlags = $acl.InheritanceFlags
  $Obj.PropagationFlags = $acl.PropagationFlags
}
 
# Перебираем все списки доступа корневой папки $dir
foreach ($acl in $acls) {
  # Задаем значения $Obj из свойств $dir и $acl
  Init-Obj $dir $acl
  # Записываем полученные значения в csv-файл
  $Obj | Export-csv $CsvPath -Append -Encoding utf8 `
  -Force -NoTypeInformation -Delimiter ";"
}
# Рекурсивная функция перебора дерева подкаталогов
# корневой папки $dir
Function Recur ($dir) {
  # Находим подкаталоги в корневой папке
  $childs = Get-ChildItem $dir.FullName -Directory
  # Перебираем подкаталоги
  foreach ($child in $childs) {
    # Поиск ненаследованных прав доступа папки $child
  $acls = Get-Acl $child.FullName | select -expand access | where {$_.IsInherited -eq $false}
    # Если есть ненаследованные права доступа
    if ($acls.count -ne 0) {
      # Перебираем списки доступа к папке $child
      foreach ($acl in $acls) {
        # Формируем $Obj из свойств $child и $acl
        Init-Obj $child $acl
        # Записываем полученные значения в csv-файл
        $Obj | Export-csv $CsvPath -Append -Encoding utf8 -Force `
        -NoTypeInformation -Delimiter ";"
      }
    }
    # Если у подкаталога есть дочерние директории
    if ($child.GetDirectories().Count -ne 0) {
      # Падаем в рекурсию, перебирая дочерние директории
      Recur $child
    }
  }
}
 
# Перебор дерева подкаталогов корневой папки $dir
Recur $dir
   } catch {
  # Выводим на экран сообщение с ошибкой
  Write-Host $RootPath
  Write-Host "Указан неверный путь к папке!"
  Write-Host
  # Записываем сообщение с ошибкой в лог
  Write-Log $RootPath
  Write-Log "Указан неверный путь к папке!"
  # И прерываем скрипт
 
}
   }
  }
    }
    catch {
        $Bad += New-Object PsObject -Property @{
            "Name" = $Name
            "Exception" = "$_"
        }
    }
 
 
}
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.04.2018, 15:04
Цитата Сообщение от beren43 Посмотреть сообщение
Но всё равно показывает группы владельцев.
А хотелось бы , что показывал членов этих групп.
Я думал, что у вас изначальный скрипт не показывал группы, которым предоставлен доступ.

Так вам надо ещё и состав групп разворачивать? Если да, то о каких группах идёт речь - доменные или локальные?
1
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
25.04.2018, 15:07  [ТС]
Да, если можно, состав групп разворачивал.
Группы доменные.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
25.04.2018, 16:57
Лучший ответ Сообщение было отмечено Joey как решение

Решение

Цитата Сообщение от beren43 Посмотреть сообщение
Да, если можно, состав групп разворачивал.
Группы доменные.
Тогда добавляете Get-ADGroupMember и делаете примерно так:

Кликните здесь для просмотра всего текста
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
$RootPath = "\\server\share"
$AD_Domain = (Get-ADDomain).name
 
function New-Obj ($dir, $Obj, $name)
{
 
    $Obj = New-Object PSObject -Property @{
        "FullName" = "";
        "CreationTime" = "";
        "LastAccessTime" = "";
        "LastWriteTime" = "";
        "FileSystemRights" = "";
        "AccessControlType" = "";
        "IdentityReference" = "";
        "IsInherited" = "";
        "InheritanceFlags" = "";
    "PropagationFlags" = ""
    }
    
    $Obj.FullName = $dir.FullName
    $Obj.CreationTime = $dir.CreationTime.ToString()
    $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
    $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
 
    $Obj.FileSystemRights = $acl.FileSystemRights
    $Obj.AccessControlType = $acl.AccessControlType
    $Obj.IdentityReference = $name
    $Obj.IsInherited = $acl.IsInherited
    $Obj.InheritanceFlags = $acl.InheritanceFlags
    $Obj.PropagationFlags = $acl.PropagationFlags
    return $Obj
}
 
$list = @()
 
cls
foreach ($dir in Get-ChildItem $RootPath -Directory -Recurse)
{
 
 
foreach ($acl in (Get-Acl $dir.FullName).Access | ? IsInherited -EQ $false)
{
 
    $domain,$SamAccountName = $acl.IdentityReference.Value -Split '\\'
 
    if ($domain -eq $AD_Domain)
    {
        $Object = Get-ADObject -Filter {SamAccountName -eq $SamAccountName}
    
        if ($Object.ObjectClass -eq 'group')
        {
            foreach ($user in (Get-ADGroupMember $Object -Recursive).Name)
            {
                $list += New-Obj -dir $dir -acl $acl -name $user | select *
            }
        }
        else
        {
            $list += New-Obj -dir $dir -acl $acl -name $Object.Name | select *
        }
    }
 
}
 
 
}
 
$list | ft -a
$list | Export-csv $CsvPath -Append -Encoding utf8 -Force -NoTypeInformation -Delimiter ";"
1
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
26.04.2018, 16:20  [ТС]
Пока так.
Но как сделать так, чтобы он в одном файле и разворачивал группы и писал какие права к какой папке ?
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
$good = @()
$bad = @()
 
Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach {
    $name = $_.DNSHostName
echo $_
    try {
        $shares = Get-WmiObject Win32_Share -ComputerName $name -ErrorAction Stop
        foreach($good in $shares){
  $folder =  $good | select name
  $folder_des =  $good | select Description
   if (($folder_des.Description -ne "Удаленный IPC") -and($folder_des.Description -ne "Printer Drivers") -and($folder_des.Description -ne "Remote IPC") -and($folder_des.Description -notlike "*Logon server share*") -and ($folder_des.Description -ne "Драйверы принтеров") -and ($folder_des.Description -ne "Remote Admin") -and ($folder_des.Description -ne "Default share") -and ($folder_des.Description -ne "Удаленный Admin") -and ($folder_des.Description -ne "Стандартный общий ресурс")) {
   $folder_name="\\"+$name+"\"+$folder.name
   echo $folder_name
   
 
# Задаем путь к корневой папке
$RootPath = $folder_name
$AD_Domain = (Get-ADDomain).name
 
function New-Obj ($dir, $Obj, $name)
{
 
    $Obj = New-Object PSObject -Property @{
        "FullName" = "";
        "CreationTime" = "";
        "LastAccessTime" = "";
        "LastWriteTime" = "";
        "FileSystemRights" = "";
        "AccessControlType" = "";
        "IdentityReference" = "";
        "IsInherited" = "";
        "InheritanceFlags" = "";
    "PropagationFlags" = ""
    }
    
    $Obj.FullName = $dir.FullName
    $Obj.CreationTime = $dir.CreationTime.ToString()
    $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
    $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
 
    $Obj.FileSystemRights = $acl.FileSystemRights
    $Obj.AccessControlType = $acl.AccessControlType
    $Obj.IdentityReference = $name
    $Obj.IsInherited = $acl.IsInherited
    $Obj.InheritanceFlags = $acl.InheritanceFlags
    $Obj.PropagationFlags = $acl.PropagationFlags
    return $Obj
}
 
$list = @()
 
cls
foreach ($dir in Get-ChildItem $RootPath -Directory -Recurse)
{
 
 
foreach ($acl in (Get-Acl $dir.FullName).Access | ? IsInherited -EQ $false)
{
 
    $domain,$SamAccountName = $acl.IdentityReference.Value -Split '\\'
 
    if ($domain -eq $AD_Domain)
    {
        $Object = Get-ADObject -Filter {SamAccountName -eq $SamAccountName}
    
        if ($Object.ObjectClass -eq 'group')
        {
            foreach ($user in (Get-ADGroupMember $Object -Recursive).Name)
            {
                $list += New-Obj -dir $dir -acl $acl -name $user | select *
            }
        }
        else
        {
            $list += New-Obj -dir $dir -acl $acl -name $Object.Name | select *
        }
    }
 
}
 
 
}
 
# Определяем полный путь к папке с запущенным скриптом
$ScriptPath = $MyInvocation.MyCommand.Definition | `
split-path -parent
# Определяем имя запущенного скрипта
$ScriptName = $MyInvocation.MyCommand.Name
# Вырезаем ".ps1" из имени скрипта
$ScriptName = $ScriptName.Replace(".ps1","")
# Задаем полный путь log-файла
$LogPath = $ScriptPath + "\" + $ScriptName + ".log"
 
# Запрашиваем текущее точное время
$dt = get-date -Format "yyyy-MM-d_HH-mm-ss"
# Задаем путь csv-файла
$CsvPath = $ScriptPath + "\" + $folder.name + " (" + $dt + `
")" + ".csv"
 
# Функция записи в лог передаваемой строки $str
Function Write-Log ($str) {
  # Запрашиваем текущее точное время
  $dt = get-date -Format "d.MM.yyyy HH:mm:ss"
  # Формируем строку с текущим временем
  $str = "[" + $dt + "]" + " " + $str
  # Пишем строку в лог
  $str | Out-File -FilePath $LogPath -Append -Encoding UTF8
}
 
# Если корневая папка не существует
try {Test-Path $RootPath -ErrorAction Stop
# Запрашиваем атрибуты корневой папки
$dir = Get-Item $RootPath | select FullName, CreationTime, `
LastAccessTime, LastWriteTime
# Запрашиваем списки доступа корневой папки
$acls = Get-Acl $RootPath | select -expand access
 
# Создаем новый PSObject, "суммирующий" свойства $dir и $acl
$Obj = new-object PSObject
$Obj | add-member -membertype NoteProperty -name `
"FullName" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"CreationTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"LastAccessTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"LastWriteTime" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"FileSystemRights" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"AccessControlType" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"IdentityReference" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"IsInherited" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"InheritanceFlags" -Value ""
$Obj | add-member -membertype NoteProperty -name `
"PropagationFlags" -Value ""
# Функция "склеивания" свойств объектов папки $dir и
# списков доступа к папке $acl в новом объекте PSObject - $Obj
Function Init-Obj ($dir, $acl) {
  # Задаем свойства $Obj значениями свойств $dir
  $Obj.FullName = $dir.FullName
  $Obj.CreationTime = $dir.CreationTime.ToString()
  $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
  $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
  # Задаем свойства $Obj значениями списка доступа $acl
  $Obj.FileSystemRights = $acl.FileSystemRights
  $Obj.AccessControlType = $acl.AccessControlType
  $Obj.IdentityReference = $acl.IdentityReference.Value
  $Obj.IsInherited = $acl.IsInherited
  $Obj.InheritanceFlags = $acl.InheritanceFlags
  $Obj.PropagationFlags = $acl.PropagationFlags
}
 
# Перебираем все списки доступа корневой папки $dir
foreach ($acl in $acls) {
  # Задаем значения $Obj из свойств $dir и $acl
  Init-Obj $dir $acl
  # Записываем полученные значения в csv-файл
  $Obj | Export-csv $CsvPath -Append -Encoding utf8 `
  -Force -NoTypeInformation -Delimiter ";"
}
# Рекурсивная функция перебора дерева подкаталогов
# корневой папки $dir
Function Recur ($dir) {
  # Находим подкаталоги в корневой папке
  $childs = Get-ChildItem $dir.FullName -Directory
  # Перебираем подкаталоги
  foreach ($child in $childs) {
    # Поиск ненаследованных прав доступа папки $child
  $acls = Get-Acl $child.FullName | select -expand access | where {$_.IsInherited -eq $false}
    # Если есть ненаследованные права доступа
    if ($acls.count -ne 0) {
      # Перебираем списки доступа к папке $child
      foreach ($acl in $acls) {
        # Формируем $Obj из свойств $child и $acl
        Init-Obj $child $acl
        # Записываем полученные значения в csv-файл
        $Obj | Export-csv $CsvPath -Append -Encoding utf8 -Force `
        -NoTypeInformation -Delimiter ";"
      }
    }
    # Если у подкаталога есть дочерние директории
    if ($child.GetDirectories().Count -ne 0) {
      # Падаем в рекурсию, перебирая дочерние директории
      Recur $child
    }
  }
}
 
# Перебор дерева подкаталогов корневой папки $dir
Recur $dir
   } catch {
  # Выводим на экран сообщение с ошибкой
  Write-Host $RootPath
  Write-Host "Указан неверный путь к папке!"
  Write-Host
  # Записываем сообщение с ошибкой в лог
  Write-Log $RootPath
  Write-Log "Указан неверный путь к папке!"
  # И прерываем скрипт
 
}
   }
  }
    }
    catch {
        $Bad += New-Object PsObject -Property @{
            "Name" = $Name
            "Exception" = "$_"
        }
    }
 
 
}
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
26.04.2018, 16:38
Цитата Сообщение от beren43 Посмотреть сообщение
Но как сделать так, чтобы он в одном файле и разворачивал группы и писал какие права к какой папке ?
В ответе #10 я показал рабочий пример на основе вашего скрипта, который всё это и делает - для всех найденных в указанной сетевой шаре подпапок со снятым наследованием.
1
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
28.04.2018, 09:44  [ТС]
Если так
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
$good = @()
$bad = @()
 
Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach {
    $name = $_.DNSHostName
echo $_
    try {
        $shares = Get-WmiObject Win32_Share -ComputerName $name -ErrorAction Stop
        foreach($good in $shares){
  $folder =  $good | select name
  $folder_des =  $good | select Description
   if (($folder_des.Description -ne "Удаленный IPC") -and($folder_des.Description -ne "Printer Drivers") -and($folder_des.Description -ne "Remote IPC") -and($folder_des.Description -notlike "*Logon server share*") -and ($folder_des.Description -ne "Драйверы принтеров") -and ($folder_des.Description -ne "Remote Admin") -and ($folder_des.Description -ne "Default share") -and ($folder_des.Description -ne "Удаленный Admin") -and ($folder_des.Description -ne "Стандартный общий ресурс")) {
   $folder_name="\\"+$name+"\"+$folder.name
   echo $folder_name
   
 
# Задаем путь к корневой папке
$RootPath = $folder_name
$AD_Domain = (Get-ADDomain).name
 
function New-Obj ($dir, $Obj, $name)
{
 
    $Obj = New-Object PSObject -Property @{
        "FullName" = "";
        "CreationTime" = "";
        "LastAccessTime" = "";
        "LastWriteTime" = "";
        "FileSystemRights" = "";
        "AccessControlType" = "";
        "IdentityReference" = "";
        "IsInherited" = "";
        "InheritanceFlags" = "";
    "PropagationFlags" = ""
    }
    
    $Obj.FullName = $dir.FullName
    $Obj.CreationTime = $dir.CreationTime.ToString()
    $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
    $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
 
    $Obj.FileSystemRights = $acl.FileSystemRights
    $Obj.AccessControlType = $acl.AccessControlType
    $Obj.IdentityReference = $name
    $Obj.IsInherited = $acl.IsInherited
    $Obj.InheritanceFlags = $acl.InheritanceFlags
    $Obj.PropagationFlags = $acl.PropagationFlags
    return $Obj
}
 
$list = @()
 
cls
foreach ($dir in Get-ChildItem $RootPath -Directory -Recurse)
{
 
 
foreach ($acl in (Get-Acl $dir.FullName).Access | ? IsInherited -EQ $false)
{
 
    $domain,$SamAccountName = $acl.IdentityReference.Value -Split '\\'
 
    if ($domain -eq $AD_Domain)
    {
        $Object = Get-ADObject -Filter {SamAccountName -eq $SamAccountName}
    
        if ($Object.ObjectClass -eq 'group')
        {
            foreach ($user in (Get-ADGroupMember $Object -Recursive).Name)
            {
                $list += New-Obj -dir $dir -acl $acl -name $user | select *
            }
        }
        else
        {
            $list += New-Obj -dir $dir -acl $acl -name $Object.Name | select *
        }
    }
 
}
 
 
}
 
$list | ft -a
$list | Export-csv $CsvPath -Append -Encoding utf8 -Force -NoTypeInformation -Delimiter ";"
То пишет ошибку
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
At D:\Rirght28042017.ps1:12 char:488
+ ... бщий ресурс")) {
+                    ~
Missing closing '}' in statement block.
At D:\Rirght28042017.ps1:9 char:34
+         foreach($good in $shares){
+                                  ~
Missing closing '}' in statement block.
At D:\Rirght28042017.ps1:7 char:9
+     try {
+         ~
Missing closing '}' in statement block.
At D:\Rirght28042017.ps1:86 char:92
+ ...  -Delimiter ";"
+                    ~
The Try statement is missing its Catch or Finally block.
At D:\Rirght28042017.ps1:4 char:81
+ ... rue} | Foreach {
+                    ~
Missing closing '}' in statement block.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndCurlyBrace
0
30.04.2018, 22:37
 Комментарий модератора 
beren43, используйте галочку под редактором сообщений Отключить смайлы в тексте
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
03.05.2018, 13:30
Цитата Сообщение от beren43 Посмотреть сообщение
Если так ... То пишет ошибку
В скрипте из #13 вы потеряли ~5 закрывающих фигурных скобок и catch блок...
1
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
03.05.2018, 15:28  [ТС]
После исправления

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
$good = @()
$bad = @()
 
Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach {
    $name = $_.DNSHostName
echo $_
    try {
        $shares = Get-WmiObject Win32_Share -ComputerName $name -ErrorAction Stop
        foreach($good in $shares){
  $folder =  $good | select name
  $folder_des =  $good | select Description
   if (($folder_des.Description -ne "Удаленный IPC") -and($folder_des.Description -ne "Printer Drivers") -and($folder_des.Description -ne "Remote IPC") -and($folder_des.Description -notlike "*Logon server share*") -and ($folder_des.Description -ne "Драйверы принтеров") -and ($folder_des.Description -ne "Remote Admin") -and ($folder_des.Description -ne "Default share") -and ($folder_des.Description -ne "Удаленный Admin") -and ($folder_des.Description -ne "Стандартный общий ресурс")) {
   $folder_name="\\"+$name+"\"+$folder.name
   echo $folder_name
   
 
# Задаем путь к корневой папке
$RootPath = $folder_name
$AD_Domain = (Get-ADDomain).name
 
function New-Obj ($dir, $Obj, $name)
{
 
    $Obj = New-Object PSObject -Property @{
        "FullName" = "";
        "CreationTime" = "";
        "LastAccessTime" = "";
        "LastWriteTime" = "";
        "FileSystemRights" = "";
        "AccessControlType" = "";
        "IdentityReference" = "";
        "IsInherited" = "";
        "InheritanceFlags" = "";
    "PropagationFlags" = ""
    }
    
    $Obj.FullName = $dir.FullName
    $Obj.CreationTime = $dir.CreationTime.ToString()
    $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
    $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
 
    $Obj.FileSystemRights = $acl.FileSystemRights
    $Obj.AccessControlType = $acl.AccessControlType
    $Obj.IdentityReference = $name
    $Obj.IsInherited = $acl.IsInherited
    $Obj.InheritanceFlags = $acl.InheritanceFlags
    $Obj.PropagationFlags = $acl.PropagationFlags
    return $Obj
}
 
$list = @()
 
cls
foreach ($dir in Get-ChildItem $RootPath -Directory -Recurse)
{
 
 
foreach ($acl in (Get-Acl $dir.FullName).Access | ? IsInherited -EQ $false)
{
 
    $domain,$SamAccountName = $acl.IdentityReference.Value -Split '\\'
 
    if ($domain -eq $AD_Domain)
    {
        $Object = Get-ADObject -Filter {SamAccountName -eq $SamAccountName}
    
        if ($Object.ObjectClass -eq 'group')
        {
            foreach ($user in (Get-ADGroupMember $Object -Recursive).Name)
            {
                $list += New-Obj -dir $dir -acl $acl -name $user | select *
            }
        }
        else
        {
            $list += New-Obj -dir $dir -acl $acl -name $Object.Name | select *
        }
    }
 
}
  catch {
        $Bad += New-Object PsObject -Property @{
            "Name" = $Name
            "Exception" = "$_
 
 
    }
    }
 
 
}
 
$list | ft -a
$list | Export-csv $CsvPath -Append -Encoding utf8 -Force -NoTypeInformation -Delimiter ";"
Такие ошибки
Code
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
At S:\ИТ\Rirght03052018.ps1:94 char:91
+ ... n -Delimiter ";"
+                    ~
The string is missing the terminator: ".
At S:\ИТ\Rirght03052018.ps1:94 char:92
+ ...  -Delimiter ";"
+                    ~
Missing '=' operator after key in hash literal.
At S:\ИТ\Rirght03052018.ps1:94 char:92
+ ...  -Delimiter ";"
+                    ~
The hash literal was incomplete.
At S:\ИТ\Rirght03052018.ps1:81 char:9
+   catch {
+         ~
Missing closing '}' in statement block.
At S:\ИТ\Rirght03052018.ps1:55 char:1
+ {
+ ~
Missing closing '}' in statement block.
At S:\ИТ\Rirght03052018.ps1:12 char:488
+ ... бщий ресурс")) {
+                    ~
Missing closing '}' in statement block.
At S:\ИТ\Rirght03052018.ps1:9 char:34
+         foreach($good in $shares){
+                                  ~
Missing closing '}' in statement block.
At S:\ИТ\Rirght03052018.ps1:7 char:9
+     try {
+         ~
Missing closing '}' in statement block.
At S:\ИТ\Rirght03052018.ps1:94 char:92
+ ...  -Delimiter ";"
+                    ~
The Try statement is missing its Catch or Finally block.
At S:\ИТ\Rirght03052018.ps1:4 char:81
+ ... rue} | Foreach {
+                    ~
Missing closing '}' in statement block.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
03.05.2018, 16:21
Цитата Сообщение от beren43 Посмотреть сообщение
После исправления
Вместо необходимых исправлений, ошибок в синтаксисе стало ещё больше:

Code
1
2
3
4
5
6
7
8
9
10
The string is missing the terminator: "
Missing '=' operator after key in hash literal.
The hash literal was incomplete.
Missing closing '}' in statement block.
Missing closing '}' in statement block.
Missing closing '}' in statement block.
Missing closing '}' in statement block.
Missing closing '}' in statement block.
The Try statement is missing its Catch or Finally block.
Missing closing '}' in statement block.
0
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
03.05.2018, 16:31  [ТС]
Исправлено так:

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
$good = @()
$bad = @()
 
Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach {
    $name = $_.DNSHostName
echo $_
    try {
        $shares = Get-WmiObject Win32_Share -ComputerName $name -ErrorAction Stop
        foreach($good in $shares){
  $folder =  $good | select name
  $folder_des =  $good | select Description
   if (($folder_des.Description -ne "Удаленный IPC") -and($folder_des.Description -ne "Printer Drivers") -and($folder_des.Description -ne "Remote IPC") -and($folder_des.Description -notlike "*Logon server share*") -and ($folder_des.Description -ne "Драйверы принтеров") -and ($folder_des.Description -ne "Remote Admin") -and ($folder_des.Description -ne "Default share") -and ($folder_des.Description -ne "Удаленный Admin") -and ($folder_des.Description -ne "Стандартный общий ресурс")) {
   $folder_name="\\"+$name+"\"+$folder.name
   echo $folder_name
                          }
                          }
 
# Задаем путь к корневой папке
$RootPath = $folder_name
$AD_Domain = (Get-ADDomain).name
 
function New-Obj ($dir, $Obj, $name)
{
 
    $Obj = New-Object PSObject -Property @{
        "FullName" = "";
        "CreationTime" = "";
        "LastAccessTime" = "";
        "LastWriteTime" = "";
        "FileSystemRights" = "";
        "AccessControlType" = "";
        "IdentityReference" = "";
        "IsInherited" = "";
        "InheritanceFlags" = "";
    "PropagationFlags" = ""
    }
    
    $Obj.FullName = $dir.FullName
    $Obj.CreationTime = $dir.CreationTime.ToString()
    $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
    $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
 
    $Obj.FileSystemRights = $acl.FileSystemRights
    $Obj.AccessControlType = $acl.AccessControlType
    $Obj.IdentityReference = $name
    $Obj.IsInherited = $acl.IsInherited
    $Obj.InheritanceFlags = $acl.InheritanceFlags
    $Obj.PropagationFlags = $acl.PropagationFlags
    return $Obj
}
 
$list = @()
 
cls
foreach ($dir in Get-ChildItem $RootPath -Directory -Recurse)
{
 
 
foreach ($acl in (Get-Acl $dir.FullName).Access | ? IsInherited -EQ $false)
{
 
    $domain,$SamAccountName = $acl.IdentityReference.Value -Split '\\'
 
    if ($domain -eq $AD_Domain)
    {
        $Object = Get-ADObject -Filter {SamAccountName -eq $SamAccountName}
    
        if ($Object.ObjectClass -eq 'group')
        {
            foreach ($user in (Get-ADGroupMember $Object -Recursive).Name)
            {
                $list += New-Obj -dir $dir -acl $acl -name $user | select *
            }
        }
        else
        {
            $list += New-Obj -dir $dir -acl $acl -name $Object.Name | select *
        }
    }
 
}
  catch {
        $Bad += New-Object PsObject -Property @{
            "Name" = $Name
            "Exception" = "$_"
 
 
    }
    }
 
 
}
 
$list | ft -a
$list | Export-csv $CsvPath -Append -Encoding utf8 -Force -NoTypeInformation -Delimiter ";"


Ошибки

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
S:\ИТ\Rirght03052018.ps1:7 знак:9
+     try {
+         ~
Отсутствует закрывающий знак ''}'' в блоке операторов.
S:\ИТ\Rirght03052018.ps1:95 знак:92
+ ...  -Delimiter ";"
+                    ~
В операторе Try отсутствует блок Catch или блок Finally.
S:\ИТ\Rirght03052018.ps1:4 знак:81
+ ... rue} | Foreach {
+                    ~
Отсутствует закрывающий знак ''}'' в блоке операторов.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndCurlyBrace
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
03.05.2018, 16:52
Цитата Сообщение от beren43 Посмотреть сообщение
Ошибки
Отсутствует закрывающий знак ''}'' в блоке операторов.
Откройте ваш скрипт в PowerShell ISE и ещё до выполнения увидите недостающие скобки, кавычки, запятые и т.п. Например, незакрытая скобка будет подчёркнута красной волнистой линией ~

Здесь вам могут помочь советом по решению какой либо задачи, а искать недостающие скобки среди сотни строчек желающих мало.
1
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 59
03.05.2018, 17:07  [ТС]
При запуске ошибок не выводит.
Но создаёт пустой файл SYSVOL

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
103
104
105
106
107
108
109
110
111
112
113
114
$good = @()
$bad = @()
 
Get-ADComputer -Filter {DNSHostName -like '*' -and Enabled -eq $True} | Foreach {
    $name = $_.DNSHostName
echo $_
    try {
        $shares = Get-WmiObject Win32_Share -ComputerName $name -ErrorAction Stop
        foreach($good in $shares){
  $folder =  $good | select name
  $folder_des =  $good | select Description
   if (($folder_des.Description -ne "Удаленный IPC") -and($folder_des.Description -ne "Printer Drivers") -and($folder_des.Description -ne "Remote IPC") -and($folder_des.Description -notlike "*Logon server share*") -and ($folder_des.Description -ne "Драйверы принтеров") -and ($folder_des.Description -ne "Remote Admin") -and ($folder_des.Description -ne "Default share") -and ($folder_des.Description -ne "Удаленный Admin") -and ($folder_des.Description -ne "Стандартный общий ресурс")) {
   $folder_name="\\"+$name+"\"+$folder.name
   echo $folder_name
                          }
                          }
                          }
    catch {
    $Bad += New-Object PsObject -Property @{
            "Name" = $Name
            "Exception" = "$_"
 
 
    }
    }
    }                      
 
# Задаем путь к корневой папке
$RootPath = $folder_name
$AD_Domain = (Get-ADDomain).name
 
function New-Obj ($dir, $Obj, $name)
{
 
    $Obj = New-Object PSObject -Property @{
        "FullName" = "";
        "CreationTime" = "";
        "LastAccessTime" = "";
        "LastWriteTime" = "";
        "FileSystemRights" = "";
        "AccessControlType" = "";
        "IdentityReference" = "";
        "IsInherited" = "";
        "InheritanceFlags" = "";
    "PropagationFlags" = ""
    }
    
    $Obj.FullName = $dir.FullName
    $Obj.CreationTime = $dir.CreationTime.ToString()
    $Obj.LastAccessTime = $dir.LastAccessTime.ToString()
    $Obj.LastWriteTime = $dir.LastWriteTime.ToString()
 
    $Obj.FileSystemRights = $acl.FileSystemRights
    $Obj.AccessControlType = $acl.AccessControlType
    $Obj.IdentityReference = $name
    $Obj.IsInherited = $acl.IsInherited
    $Obj.InheritanceFlags = $acl.InheritanceFlags
    $Obj.PropagationFlags = $acl.PropagationFlags
    return $Obj
}
 
$list = @()
 
cls
foreach ($dir in Get-ChildItem $RootPath -Directory -Recurse)
{
 
 
foreach ($acl in (Get-Acl $dir.FullName).Access | ? IsInherited -EQ $false)
{
 
    $domain,$SamAccountName = $acl.IdentityReference.Value -Split '\\'
 
    if ($domain -eq $AD_Domain)
    {
        $Object = Get-ADObject -Filter {SamAccountName -eq $SamAccountName}
    
        if ($Object.ObjectClass -eq 'group')
        {
            foreach ($user in (Get-ADGroupMember $Object -Recursive).Name)
            {
                $list += New-Obj -dir $dir -acl $acl -name $user | select *
            }
        }
        else
        {
            $list += New-Obj -dir $dir -acl $acl -name $Object.Name | select *
        }
    }
    }
 
}
  
# Определяем полный путь к папке с запущенным скриптом
$ScriptPath = $MyInvocation.MyCommand.Definition | `
split-path -parent
# Определяем имя запущенного скрипта
$ScriptName = $MyInvocation.MyCommand.Name
# Вырезаем ".ps1" из имени скрипта
$ScriptName = $ScriptName.Replace(".ps1","")
# Задаем полный путь log-файла
$LogPath = $ScriptPath + "\" + $ScriptName + ".log"
 
# Запрашиваем текущее точное время
$dt = get-date -Format "yyyy-MM-d_HH-mm-ss"
# Задаем путь csv-файла
$CsvPath = $ScriptPath + "\" + $folder.name + " (" + $dt + `
")" + ".csv"
 
 
 
 
$list | ft -a
$list | Export-csv $CsvPath -Append -Encoding utf8 -Force -NoTypeInformation -Delimiter ";"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2018, 17:07
Помогаю со студенческими работами здесь

Нет доступа к сетевой папке по сетевому имени компьютера
Доброго всем времени суток. У меня такая проблема когда пытаюсь открыть сетевую папку на другом компьютере пишет не найден сетевой путь....

Пароль к сетевой папке
Добрый день! В локальной сети есть 3 компьютера. На первом (сервер) находятся сетевые папки. Со второго я могу подключится. Ранее...

Всплывающее сообщение при обращении к сетевой папке
В домене на сетевом ресурсе расшаренные папки с документами, в одной из них неутвержденные. Можно ли на клиентских ПК при открытии такой...

Запуск программы под администратором с доступом к сетевой папке
Здравствуйте. Уже обращался на форум с этой темой. Решил уйти от планировщика задач в сторону .bat. Использую такой батник: @echo off ...

Фильтрация прав доступа к папкам и их выгрузка
Здравствуйте. Возникла такая проблема: есть АД, в ней много пользователей, у них настроены политики безопасности; есть сетевая шара,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru