sghpunk
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Здравствуйте! ) Поиском вроде похожих тем не нашел. Есть задача скопировать рекурсивно файлы из одного каталога в другой с датой не позже 01-01-2007 и скопировать права доступа, но скопировать права доступа нужно не просто, а удалив из них права записи и оставив только на чтение. Выбрал для этой задачи ПаверШелл, получился такой скрипт: Код: #Исключения #$ex_files = "*.cmd,*.bat,*.txt" #Размер $size = 0 #Кол-во $count = 0 # каталог, откуда копируем #$InitialFolder = "d:\vol1\DISK_N\M_INF" $InitialFolder = "d:\temp" #$InitialFolder = "c:\WINDOWS" # каталог, куда копируем $TargetFolder = "d:\xxx" #$TargetFolder = "o:\disk_n" # контрольная дата (копируем файлы с датой создания раньше этой) $ControlDate = "2007-01-01" #Подключим сетевой диск net use o: /delete /yes net use o: \\io\old_fs #Поставим на папку все родительские нследуемые права $ACL = Get-Acl -Path $InitialFolder $If = Get-Item -Path $InitialFolder #Перебираем и явно указываем все наследуемые права, иначе не применятся $ACR = $ACL.GetAccessRules($True, $True, [System.Security.Principal.NTAccount]) $ACL = New-Object System.Security.AccessControl.DirectorySecurity for ($i = 0 ; $i -lt $ACR.Count ; $i++ ) { if (($ACR[$i].IdentityReference.ToString() -ne "BUILTIN\Администраторы") -and ($ACR[$i].IdentityReference.ToString() -ne "NT AUTHORITY\SYSTEM")) { $rule=new-object System.Security.AccessControl.FileSystemAccessRule($ACR[$i].IdentityReference.ToString(),"ReadAndExecute","Allow") } else { $rule = $ACR[$i] } $ACL.AddAccessRule($rule) } #Сменим владельца в применяемых правах иначе права не применяются $no = New-Object System.Security.Principal.NTAccount("Администраторы") $ACL.SetOwner($no) Set-Acl $TargetFolder $ACL #exit #while ($If.FullName -ne $If.Root.FullName) { # $ACLP = Get-Acl -Path $If.Parent.FullName # $If = Get-Item -Path $If.Parent.FullName #} Get-ChildItem -Force -path $InitialFolder -recurse -Exclude $ex_files | Where-Object -FilterScript {($_.LastWriteTime -lt $ControlDate)} | ForEach-Object -Process { $Tpath = $_.DirectoryName.Remove(0,$InitialFolder.Length) #Проверим существование пути, если нет, то создадим if (!(Test-Path -Path $TargetFolder$Tpath)) { New-Item -Path $TargetFolder$Tpath -ItemType directory -ErrorAction SilentlyContinue #Если папка создалась, то ставим на неё права if ($?) { $ACL = Get-Acl -Path $_.DirectoryName #Перебираем и явно указываем все наследуемые права, иначе не применятся $ACR = $ACL.GetAccessRules($True, $True, [System.Security.Principal.NTAccount]) for ($i = 0 ; $i -lt $ACR.Count ; $i++ ) { if (($ACR[$i].IdentityReference.ToString() -ne "BUILTIN\Администраторы") -and ($ACR[$i].IdentityReference.ToString() -ne "NT AUTHORITY\SYSTEM")) { $rule=new-object System.Security.AccessControl.FileSystemAccessRule($ACR[$i].IdentityReference.ToString(),"ReadAndExecute","Allow") } else { $rule = $ACR[$i] } $ACL.AddAccessRule($rule) } #Сменим владельца в применяемых правах иначе права не применяются $ACL.SetOwner($no) Set-Acl $TargetFolder$Tpath $ACL } else { echo $Error[0] > Copy_err.log } } $Name = $_.Name Copy-Item $_.FullName -Force -Destination $TargetFolder$Tpath\$Name #Если файл скопировался, то ставим на него права if ($?) { $ACL = Get-Acl -Path $_.FullName #Перебираем и явно указываем все наследуемые права, иначе не применятся $ACR = $ACL.GetAccessRules($True, $True, [System.Security.Principal.NTAccount]) for ($i = 0 ; $i -lt $ACR.Count ; $i++ ) { if (($ACR[$i].IdentityReference.ToString() -ne "BUILTIN\Администраторы") -and ($ACR[$i].IdentityReference.ToString() -ne "NT AUTHORITY\SYSTEM")) { $rule=new-object System.Security.AccessControl.FileSystemAccessRule($ACR[$i].IdentityReference.ToString(),"ReadAndExecute","Allow") } else { $rule = $ACR[$i] } $ACL.AddAccessRule($rule) } #Сменим владельца в применяемых правах иначе права не применяются $ACL.SetOwner($no) Set-Acl $TargetFolder$Tpath\$Name $ACL } else { echo $Error[0] > Copy_err.log } } | Вопрос в чём, я когда копирую права, то приходится копировать права на каждый файл и задавть их явно, хотя в источнике они все наследуются от директорий, как это сделать красивее? да и вобще, кажется я там много вещей делаю не через то место ... Вот исключения тоже не срабатывают... Спасибо ) |