none
[PowerShell] нужна помощь с чужим скриптом для обработки NTFS-разрешений RRS feed

  • Вопрос

  • здравствуйте. скрипт достался мне по наследству от предыдущего администратора, он уже год не работает и связи с ним нет. сам я пауэршеллом пока не владею, никто из коллег тоже. скрипт делает следующее:

    читает указанный контейнер с пользователями из АД, для каждой учетной записи вычитывает поле "выводимое имя" (не знаю, как в английской версии называется), создает в заданном каталоге папку с таким именем и задает для него указанные разрешения NTFS. еще внутри этой папки скрипт создает скрытый файл sid с не понятным мне числовым содержимым.

    вот он:

    $HomeDir_base = "e:\Usersspace"
    $Backup_base = "e:\Usersspace_old"
    $OU = "LDAP://OU=Office,OU=Employees,OU=UserAccounts,DC=ourDomain,DC=ru"
    $User_Lists = New-Object System.Collections.ArrayList
    $HomeDir_Lists = New-Object System.Collections.ArrayList
    function GetM($LD){
    	$LD = [ADSI]$LD
    	$LD.psbase.children | ForEach {
    		if($_.userAccountControl)
    		{
    			if([Convert]::ToInt32($_.userAccountControl.Value) -band 2){}
    			else
    			{
    				$ob = new-object psobject
    				$temp = $ob | Add-Member NoteProperty NAME $_.Name
    				$temp = $ob | Add-Member NoteProperty SID $_.objectSid.ToString()
    				$temp = $ob | Add-Member NoteProperty SAM $_.samaccountname.ToString()
    				$temp = $User_Lists.Add($ob)
    			}
    		}
    		else
    		{
    			GetM($_.psbase.Path)
    		}
    	}
    }
    GetM($OU)
    Get-ChildItem -Name $HomeDir_base | ForEach {
    	$dn = $_
    	$fn = $HomeDir_base + "\" +$dn
    	$fnsid = $fn + "\sid"
    	$_tmp = ""
    	If (Test-Path $fnsid)
    	{
    		$sid = Get-Content $fnsid
    		$User_Lists | ForEach {
    			if ($_.SID -eq $sid)
    			{		
    				$_tmp=$_
    			}
    		}
    		if ($_tmp -eq ""){}
    		else
    		{
    			$User_Lists.Remove($_tmp)
    			$_tmp=""
    		}
    	}
    }
    $inheritCO = [system.security.accesscontrol.InheritanceFlags]"ContainerInherit, ObjectInherit"
    $propagationIO = [system.security.accesscontrol.PropagationFlags]"InheritOnly"
    $PropagationN = [system.security.accesscontrol.PropagationFlags]"None"
    $User_Lists | ForEach {
    	$fn = $HomeDir_base + "\" + $_.NAME
    	$SID = $_.SID
    	$SAM = $_.SAM
    	New-Item $fn -Type Directory
    	$fnsid = $fn + "\sid"
    	New-Item $fnsid -Type File
    	set-itemproperty $fnsid -name attributes -value ([System.IO.FileAttributes]::Hidden)
    	Set-Content -Path $fnsid -Value $SID
    	$ACL = Get-Acl $fnsid
    	$ACL.SetAccessRuleProtection($True, $false)
    	($ACL).Access | foreach {$ACL.PurgeAccessRules($_.IdentityReference)}
    	$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule ("CORP\Domain Admins", "FullControl", "Allow")
    	$ACL.SetAccessRule($AccessRule)
    	$ACL | Set-Acl $fnsid
    }

    для каталога, в котором лежат папки пользователей, создана шара со следующими разрешениями:

     все - изменить, чтение

     администраторы домена - полный доступ

    на уровне прав NTFS у этой папки такие разрешения:

     администраторы домена - полный доступ

     пользователи домена - разрешено все, кроме смены разрешений и смены владельца

     пользователи компании - то же самое, что выше, кроме удаления папки и ее содержимого (это не встроенная группа, в нее входят группы отдельных департаментов. есть ощущение, что эта группа полностью совпадает с пользователями домена по содержанию)

    все разрешения выданы для этой папки, ее подпапок и файлов и наследование разрешений везде включено.

    передо мной поставили задачу: сделать так, чтобы каждый пользователь имел разрешения на чтение-запись-удаление в своей папке и только чтение во всех остальных, при этом разрешения нигде менять не мог.

    пожалуйста, помогите отредактировать этот скрипт нужным образом. я пытался делать текущего пользователя владельцем, но это наверное лишнее, и я все равно не понял, в которой переменной он хранится. спасибо за внимание.


    23 марта 2012 г. 9:45

Ответы

  • >передо мной поставили задачу: сделать так, чтобы каждый пользователь имел разрешения на чтение-запись-удаление в своей папке и только чтение во всех остальных, при этом разрешения нигде менять не мог.

    А может быть расcмотреть альтернативный вариант решения задачи:

    1) создать корневую папку с особыми разрешениями (за основу взять http://support.microsoft.com/kb/274443, внеся необходимые измения)

    2) папки для пользователей создавать динамически логон скриптом, состоящим из одной строки, создающей паку пользователя.


    my blog: http://shserg.ru/

    • Предложено в качестве ответа KazunEditor 25 марта 2012 г. 22:32
    • Помечено в качестве ответа KazunEditor 29 марта 2012 г. 18:09
    25 марта 2012 г. 7:14