PowerShell 修复 Robocopy的权限问题

最近豆子公司在转移文件服务器,大概有80T的文件需要传送到云端。豆子直接使用了robocopy进行拷贝。因为历史原因,有些文件夹的权限设置比较奇葩,导致豆子的账户也没有权限去访问,这样的结果就是Robocopy里面可能会有几十百甚至上千个文件夹因为权限问题而无法拷贝。

robocopy 命令例子

robocopy c:\source  d:\destination /E /w:30 /r:3 /log+:"c:\temp\log.txt" /xf .*

那么如果解决这个问题呢?豆子的思路是获取robocopy的日志文件,通过正则提取其中失败的路径,然后通过脚本重新夺取管理员权限,然后重新赋予NTFS的权限。

比如说,下面的robocopy 日志,报错信息如下所示

  New Dir          0\\syd02\Track\.TemporaryItems\folders.1138144168\Cleanup At Startup\.BAH.FftCc2017/11/12 08:58:18 ERROR 5 (0x00000005) Scanning Source Directory \\syd02\Track\.TemporaryItems\folders.1138144168\Cleanup At Startup\.BAH.FftCc\Altitude Business Card VisualsAccess is denied.
Waiting 180 seconds... Retrying...
2017/11/12 09:01:18 ERROR 5 (0x00000005) Scanning Source Directory \\syd02\Track\.TemporaryItems\folders.1138144168\Cleanup At Startup\.BAH.FftCc\Altitude Business Card VisualsAccess is denied.
ERROR: RETRY LIMIT EXCEEDED.

提取路径的PowerShell脚本如下:

#Read robocopy log files
$contents=gc C:\temp\tracktransfer.txt -raw
#Regular Expression Pattern
$patt=‘(\\\\syd02.*\n)Access is denied‘
[email protected]()
#Distract the path of broken folders
$contents | select-string -Pattern $patt -AllMatches | 
foreach {
$result+=$_.matches.groups | Where-Object {$_.name -eq 1}| select -ExpandProperty value
}

#remove duplicated record and blank lines
$result |sort -Unique | foreach {$_.trimend()} | where{$_ -ne ""} | set-content c:\temp\list.txt

生成的文本文件如下所示:

list.txt

\\syd02\Track\CLIENTS\WESTPAC\Westpac Cards\1_Acquisition\FY 17\Q1 Campaigns\WBCCAR7498 Q1.1 Campaign\PRODUCTION\\syd02\Track\.TemporaryItems\folders.1138144168\Cleanup At Startup\.BAH.FftCc\Altitude Business Card Visuals\\syd02\Track\CLIENTS\WESTPAC\Westpac Cards\1_Acquisition\FY 17\Q1 Campaigns\WBCCAR7487 Q1 OOH - Low Rate\CREATIVE\\syd02\Track\.TemporaryItems\folders.1138144168\Cleanup At Startup\.BAH.cj82c\Westpac Brand assets\\syd02\Track\CLIENTS\WESTPAC\Westpac Cards\2_Lifecycle\WBCCAR7602 Additional Cardholder\COPY\\syd02\Track\CLIENTS\WESTPAC\Westpac Cards\2_Lifecycle\WBCCAR7602 Additional Cardholder\PRODUCTION\\syd02\Track\CLIENTS\WESTPAC\Westpac CRM\Business\3. COMPLETE\2016\WBCCRM7595_Q4 SME Relationship email\CREATIVE\FINAL\Individual modules\Modules Half Width\\syd02\Track\CLIENTS\WESTPAC\Westpac Cards\1_Acquisition\FY 17\Q2 Campaigns\WBCCAR7516 Microsite Optimisation\FINANCE\\syd02\Track\CLIENTS\WESTPAC\Westpac Cards\1_Acquisition\FY 17\Q1 Campaigns\WBCCAR7487 Q1 OOH - Low Rate\FINANCE\

因为最近在复习Python,顺手又用Python写了一个同样的功能,效果是一样的

fp=open(‘c:/temp/tracktransfer.txt‘)
fp2=open(‘c:/temp/list.txt‘,‘w‘)
contents=fp.read()
pat=r‘(\\\\syd02.*\n)Access is denied‘
ret=re.findall(pat,contents)
ret=set(ret)
for item in ret:
    print(item)
    fp2.write(item)
print("total number is %d"%len(ret))
fp.close()
fp2.close()

-----------------------

然后接下来是重头戏,如何重新夺取权限和赋值?

PowerShell自带的Get-ACL和Set-ACL命令,以及DOS命令 takeown我都试过,老实说,不太好使,后来很幸运地在网上发现了一个第三方的模块 NTFSSecurity,里面的函数完全实现了我需要的功能。

下载地址:

https://gallery.technet.microsoft.com/scriptcenter/1abd77a5-9c0b-4a2b-acef-90dbb2b84e85#content

下载之后,直接解压到对应的Powershell模块路径,然后重启PowerShell ISE就可以自动加载了。

下面是后半截代码,修改目标目录及其子目录文件的所有者和访问权限

$a = Get-Content "C:\temp\list.txt"
#For each folder and subfolders, setup the ownership and NTFS permissions
foreach ($i in $a)
{
    if(test-path $i)
  {
        write-host Taking ownership of Directory $i -fore Green 
        get-item $i | Set-NTFSOwner -Account ‘omnicom\group Australia it access‘
        get-item $i | add-ntfsaccess -account ‘omnicom\group Australia it access‘ -AccessRights FullControl
        get-item $i | Add-NTFSAccess -Account ‘omnicom\sydney track all staff‘ -AccessRights modify
 
        $items = @()
        $items = $null
        $path = $null
        #if need to setup all subfolders, we can use -recusrse in the following cmdlet.
        $items = get-childitem $i -force
        foreach($item in $items)
            {
                $path = $item.FullName
                Write-Host ...Adding AdminGroup to $path -Fore Green
                Get-Item -force $path | Set-NTFSOwner -Account ‘omnicom\group Australia it access‘
                get-item $i | Add-NTFSAccess -account ‘omnicom\group Australia it access‘ -AccessRights FullControl
                get-item $i | Add-NTFSAccess -Account ‘omnicom\sydney track all staff‘ -AccessRights modify
            }
   }
}

最后的效果是

这样子,如果RoboCopy出了什么权限方面的问题,我通过这个脚本就可以很容易的解决了,一次不行,修复之后再跑一次Robocopy很快就可以把丢失的文件拷贝回来了~

时间: 2025-01-17 08:53:38

PowerShell 修复 Robocopy的权限问题的相关文章

强制PowerShell脚本以管理员权限运行

param( $a, $b ) #region 关键代码:强迫以管理员权限运行 $currentWi = [Security.Principal.WindowsIdentity]::GetCurrent() $currentWp = [Security.Principal.WindowsPrincipal]$currentWi if( -not $currentWp.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))

使用PowerShell修复信任关系(原创)

使用PowerShell修复信任关系 在培训过程中,好多学员都会问一个问题就是当加入域环境的客户端脱域了怎么办? 简单分析一下原因: 1.     可能因为在同一网络上存在同名的另一台计算机. 2.     如果一台域中计算机长时间不使用域账户登录,而策略中又有相应的Kerberos票据策略. 3.     还有一种可能,是计算机的时间和域制器的时间相差超过五分钟,也会造成无法登录到域的. 如何解决呢? 很多人都会进行退域,然后重新加入域.这样确实可以解决问题,但如果受影响的计算机数量有多台,必

水平权限漏洞的修复方案

水平权限漏洞一般出现在一个用户对象关联多个其他对象(订单.地址等).并且要实现对关联对象的CRUD的时候.开发容易习惯性的在生成CRUD表单(或AJAX请求)的时候根据认证过的用户身份来找出其有权限的被操作对象id,提供入口,然后让用户提交请求,并根据这个id来操作相关对象.在处理CRUD请求时,往往默认只有有权限的用户才能得到入口,进而才能操作相关对象,因此就不再校验权限了.可悲剧的是大多数对象的ID都被设置为自增整型,所以攻击者只要对相关id加1.减1.直至遍历,就可以操作其他用户所关联的对

Powershell管理系列(三十五)PowerShell操作之以管理员权限运行脚本

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 场景:Win10或者是非管理员权限运行命令行的时候,提示无权限,如下图 我们可以右键Powershell,以管理员权限运行,或者是计划任务设置为以管理员权限运行,其实我们有更加高效的办法,可以直接提权运行脚本,如下图,输入用户名和密码, Invoke-Command -ScriptBlock {ipconfig /register

bat 与 PowerShell 的结合使用

目录 前言 一.bat 做数字比较 二.使用 PowerShell 比较 三.其他调用 PowerShell 场景 前言 背景: 前前段时间,做文件操作处理时,有这么一个场景: window 下需要对某固定目录下的文件及其他文件进行拷贝操作, 至目标对象 外置存储设备(U盘或移动硬盘),且需要一定大小的存储量. 问题: 其主要问题不在文件拷贝操作,而是对外置存储设备的处理(主要是对磁盘大小的判断,也就是数字的比较).首先批处理的数字有一定范围,其次超出范围的比较情况还有不同. 解决: 其一则是正

管理SQL Server AlwaysOn(1)——基础维护

本文属于管理SQL Server AlwaysOn系列文章 前言: 前面系列已经介绍了SQL Server AlwaysOn的知识点.安装演示及注意事项等.但是这并不是终点,更多的反而是起点.就像不能生了孩子就不管,你还得养(管理).作为DBA,更多的工作内容恰恰就是管理AlwaysOn.所以这里单独列出一个系列介绍SQL Server AlwaysOn的管理.本系列沿用从0开始部署基础的AlwaysOn 的环境. 在这个系列中,准备讲述以下内容: 管理SQL Server AlwaysOn(1

Windows8和MacOS10.9双系统安装及Mac常用软件安装--联想E49A

前提 本篇内容所描述的内容只适合联想E49A笔记本,经过本篇的内容之后,对于Mac OS 10.9的使用达到正常工作使用的标准,完美度肯定达不到苹果本. 结果如下:显卡.网卡(RTL8168).声卡.电池都正常驱动了:无线网卡(RTL8192ce).U盘没有正常驱动. Windows8的安装,比较简单,前帖也有简要说明:http://blog.csdn.net/puma_dong/article/details/17316731 安装Mac前,要进入BIOS,把显卡改成集成显卡. 磁盘分区 使用

黑苹果-IOS学习的开始

九个月之前,由于学习ios,而自己又囊中羞涩,于是便一脚跨入了装黑苹果的这个坑!!! 深知安装黑苹果的不易,在这里写一下关于我的Thinkpad E430c安装黑苹果教程(Mac版本:Yosemite 10.10.4),希望能够帮助有需要的朋友. 首先贴上我的电脑配置报表: ---------------------------------------------------------------------[ 概览 ]-------------------------------------

Oracle备忘录

数据库管理员主要职责: 每个Oracle数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库可能需要多个dba分担不同的管理职责.那么一个数据库管理员的主要工作是什么呢? 安装升级Oracle数据库 建库,表空间,表,视图,索引... 制定并实施备份和修复计划 数据库权限管理,调优,故障排除 对于高级dba,要求参与项目开发,会编写sql语句,存储过程,触发器,规则,约束,包 --显示当前数据库的全称 select * from global_