Power Shell : Group Nesting

Ответить
M.K
Новичок
Сообщения: 9
Зарегистрирован: 04 дек 2014 16:52

Power Shell : Group Nesting

Сообщение M.K » 27 окт 2015 13:24

Код: Выделить всё

# у нас в конторе возможны только 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


Ответить

Вернуться в «Powershell»