none
создание ntfs шары на основе organization unit RRS feed

  • Вопрос

  • Приветствую коллеги. Есть задумка автоматизировать создание шары для домена. Раньше все файлы располагались на др ресурсе. Сейчас есть большой organization unit с подгруппами, где на самом нижнем уровне есть 2 группы (папки) - пользователи и компьютеры. Такая своеобразная иерархия по месторасположению и подразделениям в AD. На этом же серваке есть корень шары с правами всем на чтение и изменение. Теперь нужно сделать кучу подпапок и сделать им соответствующие ntfs разрешения - каждое подразделение может просматривать и изменять файлы только в своей папке. Вручную столько кликов мышкой осилю только дня за 2 :)  Кто-нибудь делал подобное? Нашел powershell-for-creating-secure-user  но там список пользователей берется из файла а не из AD.
    18 июля 2013 г. 7:54

Ответы

  • # Корень
    $folder = "C:\Обмен"
    
    $gsr = @()
    $grw = @()
    
    # Получим все районы
    $r = Get-ADOrganizationalUnit -Filter * -SearchBase "ou=main,dc=fire37,dc=ru" -SearchScope OneLevel
    
    # Создадим районы
    $r | Foreach {
    	$f = Join-Path $folder $_.Name
    	if(!(Test-Path $f)) {
    		md $f | Out-Null
    	}
    }
    
    # Создадим службы
    $grs = $r | Foreach {
    	$n = $_.Name
    	Get-ADOrganizationalUnit -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel | Foreach {
    		$f = Join-Path $folder "$n\$($_.name)"
    		if(!(Test-Path $f)) {
    			md $f 
    		}
    	}
    }
    
    # Создадим группы и добавим пользователей
    $r | Foreach {
    	$n  = $_.Name
    	# Получим службы в OU
    	Get-ADOrganizationalUnit -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel | Foreach {
    		$users = Get-ADUser -Filter * -SearchBase $_.DistinguishedName
    		# Создадим группу RW_Отдел_Служба
    		$nw = "RW_$n`_$($_.name)"
    		$gw = New-ADGroup -Name $nw -GroupCategory Security -GroupScope Global -PassThru
    		Add-ADGroupMember -Identity $gw -Members $users 
    		# Создадим группу RW_Отдел_Служба
    		$nr = "R_$n`_$($_.name)"
    		$gr = New-ADGroup -Name $nr -GroupCategory Security -GroupScope Global -PassThru
    		Add-ADGroupMember -Identity $gr -Members $users 
    		
    		$gsr += $gr.name
    		$grw += $gw.name
    	}
    }
    
    # Назначим права
    $grs | Group Name | Foreach {
    	if($_.Count -gt 1) {
    		$_.Group | Foreach {
    			$gr = "RW_$($_.Parent.Name)_$($_.Name)"
    			$acl = Get-Acl $_.FullName
    			if($grw -eq $gr) {
    				$acl.SetAccessRuleProtection($true,$false)
    				$rule = New-Object Security.AccessControl.FileSystemAccessRule($gr,"Read,Write","ContainerInherit, ObjectInherit","None","Allow")
    				$acl.AddAccessRule($rule)
    			}
    			if($gsr -match "_$($_.Name)$") {
    				$gsr -match "_$($_.Name)$" -notmatch "R_$($_.Parent.Name)_" | Foreach {
    					$rule = New-Object Security.AccessControl.FileSystemAccessRule($_,"Read","ContainerInherit, ObjectInherit","None","Allow")
    					$acl.AddAccessRule($rule)
    				}
    			}	
    			$acl | Set-Acl $_.FullName
    		}
    	}
    	else {
    		$f = $_.Group
    		$gr = "RW_$($f.Parent.Name)_$($f.Name)"
    		if($grw -eq $gr) {
    			$acl = Get-Acl $f.FullName
    			$acl.SetAccessRuleProtection($true,$false)
    			$rule = New-Object Security.AccessControl.FileSystemAccessRule($gr,"Read,Write","ContainerInherit, ObjectInherit","None","Allow")
    			$acl.AddAccessRule($rule)
    			$acl | Set-Acl $f.FullName
    		}	
    	}
    }
    

    • Помечено в качестве ответа kosmich74 19 июля 2013 г. 17:52
    19 июля 2013 г. 9:53
    Отвечающий

Все ответы

  • Нарисуйте структуру, а то плохо понятно.

    1) А зачем добавлять пользователей, в чем проблема создать группу безопасности?

    2) Так шару создать или назначить ntfs разрешения ?

    18 июля 2013 г. 8:06
    Отвечающий
  • структура OU начиная с корня: main -> район (17 шт)  -> служба (по 15 в каждом, одних и тех же во всех районах за редким исключением) -> пользователи. Такой же структуры надо создать шару: Обмен -> Название района(17 папок) -> название службы (15 папок). Необходимо чтобы пользователи каждой службы имели права на чтение\запись в своей папке своего района и только на чтение в одноименной папке другого района, остальные папки даже просматривать нельзя. Шару создать делов не много - она есть, всем пользователям данного OU назначил smb права на чтение и запись. А вот как с помощью powershell всем папкам ntfs разрешения изменить на те что требуются...
    18 июля 2013 г. 14:27
  • # Корень
    $folder = "C:\Обмен"
    
    $gsr = @()
    $grw = @()
    
    # Получим все районы
    $r = Get-ADOrganizationalUnit -Filter * -SearchBase "ou=main,dc=fire37,dc=ru" -SearchScope OneLevel
    
    # Создадим районы
    $r | Foreach {
    	$f = Join-Path $folder $_.Name
    	if(!(Test-Path $f)) {
    		md $f | Out-Null
    	}
    }
    
    # Создадим службы
    $grs = $r | Foreach {
    	$n = $_.Name
    	Get-ADOrganizationalUnit -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel | Foreach {
    		$f = Join-Path $folder "$n\$($_.name)"
    		if(!(Test-Path $f)) {
    			md $f 
    		}
    	}
    }
    
    # Создадим группы и добавим пользователей
    $r | Foreach {
    	$n  = $_.Name
    	# Получим службы в OU
    	Get-ADOrganizationalUnit -Filter * -SearchBase $_.DistinguishedName -SearchScope OneLevel | Foreach {
    		$users = Get-ADUser -Filter * -SearchBase $_.DistinguishedName
    		# Создадим группу RW_Отдел_Служба
    		$nw = "RW_$n`_$($_.name)"
    		$gw = New-ADGroup -Name $nw -GroupCategory Security -GroupScope Global -PassThru
    		Add-ADGroupMember -Identity $gw -Members $users 
    		# Создадим группу RW_Отдел_Служба
    		$nr = "R_$n`_$($_.name)"
    		$gr = New-ADGroup -Name $nr -GroupCategory Security -GroupScope Global -PassThru
    		Add-ADGroupMember -Identity $gr -Members $users 
    		
    		$gsr += $gr.name
    		$grw += $gw.name
    	}
    }
    
    # Назначим права
    $grs | Group Name | Foreach {
    	if($_.Count -gt 1) {
    		$_.Group | Foreach {
    			$gr = "RW_$($_.Parent.Name)_$($_.Name)"
    			$acl = Get-Acl $_.FullName
    			if($grw -eq $gr) {
    				$acl.SetAccessRuleProtection($true,$false)
    				$rule = New-Object Security.AccessControl.FileSystemAccessRule($gr,"Read,Write","ContainerInherit, ObjectInherit","None","Allow")
    				$acl.AddAccessRule($rule)
    			}
    			if($gsr -match "_$($_.Name)$") {
    				$gsr -match "_$($_.Name)$" -notmatch "R_$($_.Parent.Name)_" | Foreach {
    					$rule = New-Object Security.AccessControl.FileSystemAccessRule($_,"Read","ContainerInherit, ObjectInherit","None","Allow")
    					$acl.AddAccessRule($rule)
    				}
    			}	
    			$acl | Set-Acl $_.FullName
    		}
    	}
    	else {
    		$f = $_.Group
    		$gr = "RW_$($f.Parent.Name)_$($f.Name)"
    		if($grw -eq $gr) {
    			$acl = Get-Acl $f.FullName
    			$acl.SetAccessRuleProtection($true,$false)
    			$rule = New-Object Security.AccessControl.FileSystemAccessRule($gr,"Read,Write","ContainerInherit, ObjectInherit","None","Allow")
    			$acl.AddAccessRule($rule)
    			$acl | Set-Acl $f.FullName
    		}	
    	}
    }
    

    • Помечено в качестве ответа kosmich74 19 июля 2013 г. 17:52
    19 июля 2013 г. 9:53
    Отвечающий
  • Огромное спасибо. Отличный код - буду учиться.
    19 июля 2013 г. 17:52