无法将带权限文件夹复制到新NAS共享的PowerShell问题求助
问题:Windows Server 2019下新NAS共享的ACL权限迁移失败
我编写了一个修改网络文件夹ACL的PowerShell脚本,此前在本地驱动器和旧网络共享上运行正常。迁移至Windows Server 2019并使用新NAS共享后,Set-Acl命令执行失败,暂未明确原因。
相同代码可在本地目录正常创建和修改文件夹,我尝试先在本地创建文件夹并为AD组分配ReadandExecute、Write权限,再迁移至NAS共享,但仍失败。
已尝试的操作
- 本地目录内移动文件夹,AD组权限可保留:
Move-Item -Path D:\pathsimulation\non_prod\testfolder -Destination D:\Temp -Force - 移动至NAS时,AD组权限被移除:
Move-Item -Path D:\pathsimulation\non_prod\testfolder -Destination T:\somefolders\in_data\non_prod -Force - 使用Robocopy复制,文件夹被跳过且无错误日志:
$sourcePath = "D:\pathsimulation\non_prod\testfolder" $destinationPath = "T:\somefolders\in_data\non_prod" Robocopy.exe $sourcePath $destinationPath /E /COPYALL /DCOPY:DAT /LOG+:D:\RobocopyLog.txt - 使用Xcopy复制到NAS提示权限不足,复制到本地无权限错误但未移动文件:
复制到NAS的命令及错误:xcopy D:\pathsimulation\non_prod\testfolder T:\somefolders\in_data\non_prod /O /X /E /H /K
本地Xcopy命令:0 File(s) copied xcopy : File creation error - A required privilege is not held by the client. At line:1 char:1 + xcopy D:\pathsimulation\non_prod\t... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (File creation e... by the client.:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError Unable to create directory - T:\somefolders\in_data\non_prodxcopy "D:\pathsimulation\non_prod\testfolder" "D:\Temp" /X /H /E /V0 File(s) copied
可行解决方案建议
1. 排查NAS权限基础配置
- 确认NAS共享的共享权限和NTFS权限:执行脚本的账户需在目标路径拥有修改或完全控制权限,尤其是创建子文件夹和修改ACL的权限。新NAS可能默认权限更严格,比如共享权限仅开放读取。
- 验证账户特权:执行脚本的账户需拥有
SeSecurityPrivilege(管理ACL必备),可通过whoami /priv命令查看是否启用该特权。
2. 优化Move-Item的权限保留逻辑
- 使用PowerShell的
-PreserveAuthorization参数强制保留权限(需PowerShell 5.1及以上版本):Move-Item -Path D:\pathsimulation\non_prod\testfolder -Destination T:\somefolders\in_data\non_prod -Force -PreserveAuthorization - 改用UNC路径替代映射驱动器:避免映射驱动器的权限上下文差异,直接访问NAS共享:
Move-Item -Path D:\pathsimulation\non_prod\testfolder -Destination \\NAS-Server\somefolders\in_data\non_prod -Force -PreserveAuthorization
3. 修复Robocopy的执行问题
- 检查目标路径父目录权限:确保
T:\somefolders\in_data存在且执行账户有写入权限,Robocopy需要父目录权限来创建目标子文件夹。 - 添加重试和详细日志参数:排查跳过原因,增加网络容错性:
$sourcePath = "D:\pathsimulation\non_prod\testfolder" $destinationPath = "T:\somefolders\in_data\non_prod" Robocopy.exe $sourcePath $destinationPath /E /COPYALL /DCOPY:DAT /LOG+:D:\RobocopyLog.txt /R:3 /W:5 /V - 拆分复制与ACL设置:如果NAS不支持完整权限复制,先复制文件和结构,再单独应用ACL:
# 复制文件夹与文件 Robocopy.exe $sourcePath $destinationPath /E /COPY:DAT /DCOPY:DAT /LOG+:D:\RobocopyLog.txt # 提取本地ACL并应用到NAS $acl = Get-Acl -Path $sourcePath Set-Acl -Path $destinationPath -AclObject $acl
4. 解决Xcopy的权限缺失问题
- 以管理员身份运行PowerShell:Xcopy需要
SeRestorePrivilege和SeBackupPrivilege,管理员账户默认拥有这些特权。 - 检查目标路径的继承权限:确保
T:\somefolders\in_data的权限已正确继承到子文件夹,或直接给执行账户分配该路径的创建权限。
5. 直接在NAS上设置ACL
- 跳过本地迁移,直接在NAS路径创建文件夹并应用ACL,验证
Set-Acl是否能在NAS上正常运行:# 在NAS创建目标文件夹 New-Item -Path T:\somefolders\in_data\non_prod\testfolder -ItemType Directory -Force # 获取本地测试文件夹的ACL $acl = Get-Acl -Path D:\pathsimulation\non_prod\testfolder # 应用到NAS文件夹 Set-Acl -Path T:\somefolders\in_data\non_prod\testfolder -AclObject $acl - 开启PowerShell调试日志:如果
Set-Acl仍失败,查看详细错误信息定位原因:
若日志提示NAS不支持NTFS ACL,说明该NAS可能仅支持共享权限,需改用NAS自带的权限管理工具配置AD组权限。Set-PSDebug -Trace 2 Set-Acl -Path T:\somefolders\in_data\non_prod\testfolder -AclObject $acl
内容的提问来源于stack exchange,提问作者Eleandro
相关产品推荐
相关产品推荐

