Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Список польвотелей с правами к общей папке.

Ответить
Настройки темы
PowerShell - [решено] Список польвотелей с правами к общей папке.

Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить 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
   
 
# Задаем путь к корневой папке
$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
Благодарности: 824

Профиль | Отправить PM | Цитировать


список шар с разрешениями:
Код: Выделить весь код
Get-SmbShare | Get-SmbShareAccess
список всех пользователей доменной группы:
Код: Выделить весь код
Get-ADGroupMember группа -Recursive

Отправлено: 10:27, 26-04-2018 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить 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 ";"
Но этот скрипт создаёт пустой файл SYSVOl.

Может кто подскажет.

Отправлено: 10:04, 04-05-2018 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Список польвотелей с правами к общей папке.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход