|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Список польвотелей с правами к общей папке. |
|
PowerShell - [решено] Список польвотелей с правами к общей папке.
|
Новый участник Сообщения: 21 |
Здравствуйте.
Нужно создать файл в котором будет перечислины польвотели и права к общей папке. Пользователи в домене. Есть скрипт, который выводит список групп к папкам и который их раскрывает. Как их объединить : ) Вот скипт, который выводит права групп: $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" = "$_" } } } $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 ";" |
|
Отправлено: 17:33, 25-04-2018 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать |
Отправлено: 10:27, 26-04-2018 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 21
|
Профиль | Отправить PM | Цитировать Хочу сделать универсальный скрипт, чтобы он сам подставлял домен, сам находил все шары и отчёт сохранял в тут же папку, где лежит скрипт
Вот $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 ";" Может кто подскажет. |
Отправлено: 10:04, 04-05-2018 | #3 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
2012 R2 - [решено] Настройка общей папки с правами после чужого администрирования | trembach.denis | Windows Server 2012/2012 R2 | 6 | 03-07-2017 21:04 | |
2012 R2 - Работа с правами доступа к общей папке | EncryptedBilly | Windows Server 2012/2012 R2 | 2 | 31-01-2017 15:15 | |
V. 2010 - Доступ удаленной общей папке. | Ilya S | Microsoft Exchange Server | 0 | 14-11-2011 23:45 | |
Доступ - Доступ к общей папке | _Gans_ | Microsoft Windows 7 | 2 | 06-05-2010 05:18 | |
Проблемы с доступом к общей папке | Sergey Timofeev | Microsoft Windows NT/2000/2003 | 8 | 14-11-2003 13:43 |
|