Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Список польвотелей с правами к общей папке. (http://forum.oszone.net/showthread.php?t=334510)

Beren 25-04-2018 17:33 2810720

Список польвотелей с правами к общей папке.
 
Здравствуйте.
Нужно создать файл в котором будет перечислины польвотели и права к общей папке.
Пользователи в домене.
Есть скрипт, который выводит список групп к папкам и который их раскрывает.
Как их объединить : )
Вот скипт, который выводит права групп:
Код:

$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 ";"


Busla 26-04-2018 10:27 2810830

список шар с разрешениями:
Код:

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

Get-ADGroupMember группа -Recursive

Beren 04-05-2018 10:04 2812025

Хочу сделать универсальный скрипт, чтобы он сам подставлял домен, сам находил все шары и отчёт сохранял в тут же папку, где лежит скрипт
Вот
Код:

$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.

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


Время: 22:08.

Время: 22:08.
© OSzone.net 2001-