Код: Выделить всё
# у нас в конторе возможны только LDAP запросы к контроллеру , потому пришлось так выкручиваться.
# скрипт позволяет составить табличку влоежности гр ., уровень вложенности , родителя и раставить права для каждой группы.
#
############
$path='d:\temp\test' # исследуемая папка
$result_folder="D:\tmp\" # куда будет выложен результат
#часть доменного суффикса по которому будут выдергиваться доменные группы, а не локальные гр на папке
$domain_suff='contora'
############
############
############
############
############
############
$timestamp = Get-Date -UFormat %d%m%Y
$objADSI = [adsi]””
$domain = $objADSI.distinguishedname
$sec_user=""
$sec_table=@()
$finall_t=@()
$i=0
$level=0
$t2=""
$perm=""
$separator="\\"
$ACL_RO=""
$ACL_Modify=""
$ACL_FC=""
$status=""
#получаем секурити принципалов
$name = (get-Item $path).name
$next_turn = ((Get-Acl $path).Access | Select-Object -ExpandProperty IdentityReference | select -ExpandProperty Value | where {$_ -match $domain_suff} ) -creplace '^[^\\]*\\', ''
#$Compiled = @()
$Compiled = ""
$ACL = Get-Acl $path #.fullname
$List = $ACL.access | Select IdentityReference,FileSystemRights
$acl_roi = $List | where {$_.FileSystemRights -eq "ReadAndExecute, Synchronize"} | select -ExpandProperty IdentityReference | where {$_ -match $domain_suff } | select -ExpandProperty value
if ( $acl_roi -eq $null ) { $ACL_RO = "empty" } else { $ACL_RO = $acl_roi }# -creplace '^[^\\]*\\',''
$acl_fci = $List | where {$_.FileSystemRights -eq "FullControl"} | select -ExpandProperty IdentityReference | where {$_ -match $domain_suff } | select -ExpandProperty value
if ( $acl_fci -eq $null ) { $ACL_FC = "empty" } else { $ACL_FC = $acl_fci }
$acl_moi = $List | where {$_.FileSystemRights -eq "Modify, Synchronize"} | select -ExpandProperty IdentityReference | where {$_ -match $domain_suff } | select -ExpandProperty value
if ( $acl_moi -eq $null ) { $ACL_Modify = "empty" } else { $ACL_Modify = $acl_moi }
do {
#для каждого сек-принципала
$sec_table=@()
$sec_t1=@()
#
$level++ # ровень вложенности
foreach ($t in $next_turn)# | Where-Object {$t -ne $null}) #{ $sec_ADName| get-member | Select-Object -ExpandProperty }
{ #перебор всех сек-принципалов для всех сек-принципалов за искл null
$sec_ADPath =([ADSISearcher]"name=$t").FindAll() | Select-Object -ExpandProperty Path # делаем лдап запрос с фильтром по name для получения лдап пути
$status = ([adsi] $sec_ADPath).objectClass | where {$_ -eq "group"} # проверяем этот объект является ли группой
if ( $status -eq "group" ) { $status="group" } else { $status="user" }
$sec = ([adsi] $sec_ADPath)
$sec_AccName = ([adsi] $sec_adpath).name
foreach ( $acl_r in $ACL_RO ) {
if ( ($ACL_R).tostring() -match $sec_AccName ) { $perm = "RO" }
}
foreach ( $acl_f in $ACL_FC ) {
if ( ($ACL_f).tostring() -match $sec_AccName ) { $perm = "FC" }
}
foreach ( $acl_m in $ACL_Modify ) {
if ( ($ACL_m).tostring() -match $sec_AccName ) { $perm = "Mo" }
}
if ( $perm -eq "RO" ) { $ACL_RO += $sec_AccName }
if ( $perm -eq "FC" ) { $ACL_FC += $sec_AccName }
if ( $perm -eq "Mo" ) { $ACL_Modify += $sec_AccName }
if ( $status -eq "group" ) { $status = "group"
foreach ( $child in $sec.member )
{ # для каждого участника группы
$i=++$i
$sec_adsi = ([adsi] "LDAP://$child").samaccountname
if ( $child -eq $null ) { $sec_adsi = "Empty" }
$status = ([adsi] "LDAP://$child").objectClass | where {$_ -eq "group"} #определяем группа он или нет
if ( $status -eq "group" ) { $status="group" } else { $status="user" }
$sec_t1 = New-Object PSOBject # составляем таблицу
$sec_t1 | Add-Member -Type NoteProperty -Name ID -Value $i # ИД
$sec_t1 | Add-Member -Type NoteProperty -Name Level -Value $level # уровень вложения
$sec_t1 | Add-Member -Type NoteProperty -Name Parent -Value $sec_AccName.tostring() # пишем родителя
$sec_t1 | Add-Member -Type NoteProperty -Name Child -Value $sec_adsi.tostring() # влоежнного в родителя
$sec_t1 | Add-Member -Type NoteProperty -Name status -Value $status.tostring() # группа это или пользователь
$sec_t1 | Add-Member -Type NoteProperty -Name Permission -Value $perm.tostring() # права на папке
$sec_table += $sec_t1
$status = ""
} #
}
if ( $status -eq "user" )
{
$i=++$i
#$sec_adsi = "same"
#$sec_AccName = "on folder"
if ( $sec_AccName -eq $null) { $sec_AccName = $path }
#if ( $sec_adsi -eq $null) { $sec_adsi = "same" }
#$sec_adsi = ([adsi] "LDAP://$sec").name
#$status = ([adsi] "LDAP://$child").objectClass | where {$_ -eq "group"} #определяем группа он или нет
#if ($status -eq "group") {$status="group"} else {$status="user"}
$sec_t1 = New-Object PSOBject # составляем таблицу
$sec_t1 | Add-Member -Type NoteProperty -Name ID -Value $i # ИД
$sec_t1 | Add-Member -Type NoteProperty -Name Level -Value $level # уровень вложения
$sec_t1 | Add-Member -Type NoteProperty -Name Parent -Value $sec_AccName.tostring() # пишем родителя
$sec_t1 | Add-Member -Type NoteProperty -Name Child -Value $sec_AccName.tostring() ### влоежнного в родителя
$sec_t1 | Add-Member -Type NoteProperty -Name status -Value $status.tostring() # группа это или пользователь
$sec_t1 | Add-Member -Type NoteProperty -Name Permission -Value $perm.tostring() # права на папке
$sec_table += $sec_t1
$status = ""
}
} # перебор всех принципалов
$next_turn = $sec_table | Where {$_.status -eq "group"} | Select-Object -ExpandProperty Child # вытаскиваем из временной таблицы полученной на каждом сек принципале, вложенные группы и подаем им опять на прохождение
$finall_t = $finall_t + $sec_table + "`n" # финальная таблица
}
while ($next_turn.count -gt $null ) # выполняем перебор пока не пройдем все группы
$msg = "group nesting on folder: " + $path + " by date: " + $timestamp + "`n"
$msg | Out-File $result_folder\gr_nest_sorting-$name$timestamp.txt
$finall_t | sort Child | ft -AutoSize >> $result_folder\gr_nest_sorting-$name$timestamp.txt