域内数据库服务器通过PowerShell向工作组备份服务器传文件权限问题求助
解决方案:域内服务器向工作组备份服务器自动传输文件
一、权限配置修正
- 放弃仅依赖
Everyone权限,在备份服务器上创建本地专用备份账户(例如Backup_Svc):- 打开计算机管理 → 本地用户和组 → 用户,新建用户,设置强密码并勾选“密码永不过期”。
- 对目标共享文件夹配置双重权限:
- 共享权限:添加该本地账户,授予「完全控制」权限。
- NTFS权限:添加该本地账户,授予「读取」「写入」「修改」权限(按需调整,至少保证写入权限)。
- 关闭备份服务器的「密码保护共享」(控制面板 → 网络和共享中心 → 高级共享设置),避免工作组访问时的额外验证拦截。
二、PowerShell脚本实现
1. 预先生成加密密码文件(仅需执行一次)
在域内数据库服务器上,以运行脚本的域账户执行以下命令,生成加密的密码文件(仅当前域账户可解密):
# 替换为备份服务器本地账户的密码 $password = "BackupSvc@123" | ConvertTo-SecureString -AsPlainText -Force $password | ConvertFrom-SecureString | Out-File "C:\Scripts\BackupPass.txt"
2. 自动传输脚本
创建BackupTransfer.ps1脚本,内容如下:
# 配置参数 $sourcePath = "D:\DB_Backups\*.bak" # 数据库备份文件路径,支持通配符 $backupServerShare = "\\BackupServerIP\BackupShare" # 替换为备份服务器的IP/主机名和共享名 $localAccount = "BackupServerName\Backup_Svc" # 替换为备份服务器主机名和本地账户名 $passFile = "C:\Scripts\BackupPass.txt" # 读取加密密码并创建凭据 $securePass = Get-Content $passFile | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PSCredential ($localAccount, $securePass) # 执行文件传输 try { # 临时映射共享驱动器(可选,也可直接用UNC路径复制) New-PSDrive -Name Z -PSProvider FileSystem -Root $backupServerShare -Credential $credential -ErrorAction Stop Copy-Item -Path $sourcePath -Destination "Z:\" -Force -ErrorAction Stop Remove-PSDrive -Name Z -ErrorAction Stop Write-Host "文件传输完成" } catch { Write-Error "传输失败: $_" exit 1 }
注:如果不需要映射驱动器,可直接用
Copy-Item -Path $sourcePath -Destination $backupServerShare -Credential $credential -Force
三、自动化集成(任务计划程序)
- 在域内数据库服务器上打开「任务计划程序」,创建基本任务:
- 触发器:选择合适的触发条件(例如“备份完成后”或定时执行)。
- 操作:选择「启动程序」,程序/脚本填写
powershell.exe,添加参数:-ExecutionPolicy Bypass -File "C:\Scripts\BackupTransfer.ps1" - 设置:勾选「不管用户是否登录都要运行」,勾选「使用最高权限运行」。
- 运行账户:选择具有数据库备份文件读取权限的域账户。
四、常见问题排查
- 确认VLAN之间的防火墙已开放SMB端口(TCP 445、UDP 137-138),否则无法访问共享。
- 备份服务器需开启「网络发现」和「文件和打印机共享」(高级共享设置中启用)。
- 测试时可手动运行脚本,查看错误提示定位问题(例如权限不足、网络不通)。
内容的提问来源于stack exchange,提问作者Maarten Heymans
相关产品推荐
相关产品推荐

