| 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
 }
 
 }
 
 | 
 Вопрос в чём, я когда копирую права, то приходится копировать права на каждый файл и задавть их явно, хотя в источнике они все наследуются от директорий, как это сделать красивее? да и вобще, кажется я там много вещей делаю не через то место ... Вот исключения тоже не срабатывают...
 Спасибо )
 |