 |
|
Список польвотелей с правами к общей папке.
Здравствуйте.
Нужно создать файл в котором будет перечислины польвотели и права к общей папке.
Пользователи в домене.
Есть скрипт, который выводит список групп к папкам и который их раскрывает.
Как их объединить : )
Вот скипт, который выводит права групп:
Код:
$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 ";"
|
список шар с разрешениями:
Код:
Get-SmbShare | Get-SmbShareAccess
список всех пользователей доменной группы:
Код:
Get-ADGroupMember группа -Recursive
|
Хочу сделать универсальный скрипт, чтобы он сам подставлял домен, сам находил все шары и отчёт сохранял в тут же папку, где лежит скрипт
Вот
Код:
$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.
© OSzone.net 2001-