为何任务计划程序运行PowerShell脚本时权限与直接运行不同?
问题背景与现象
在Windows Server 2012上实现从服务器A到服务器B的定期自动备份,编写的PowerShell脚本具备以下功能:
- 筛选A:\files中最新修改的文件复制到B:\backup
- 通过主脚本的
-mode参数切换,按日/周/月/年分类存储备份文件 - 自动清理备份目录,保留指定数量的最新副本
脚本右键直接运行PowerShell时完全正常,但通过任务计划程序执行时,在Test-Path步骤出现访问服务器B的文件权限错误。
已尝试的排查操作
- 直接从任务计划程序运行PowerShell、通过批处理调用脚本
- 确认任务已勾选“以最高权限运行”,且使用与直接运行相同的有权限账户
- 添加
cd命令确保执行路径一致 - 验证脚本通过任务计划程序运行时具备管理员权限,但问题仍未解决
相关脚本代码
备份模板脚本(bu_template.ps1)
#-----------------------SET SOURCE AND DESTINATION FOLDERS HERE------------------------------------------- param([string]$src, [string]$dest, [int]$nb=10) #do not modify below this line #-------------------------------- DO NOT MODIFY BELOW THIS LINE ------------------------------------------------ function create-item ($path){ try{ $testpath=Test-Path -Path $path If ($testpath){ "destination "+$path+" exists" } Else{ If($path.split("\")[-1] -like "*.*"){ New-Item -Path $path -ItemType File } Else{ New-Item -Path $path -ItemType Directory } } } catch{ "access error : "+$PSItem | Out-File -FilePath $logFile -Append } } try { $logFile="back-up_log.txt" .\log_init.ps1 $logFile "New back-up job" } catch{ "log init error : "+$PSItem | Out-File -FilePath $logFile -Append } try { create-item -path $dest | Out-File -FilePath $logFile -Append Get-ChildItem -Path $src -File | Sort-Object -Descending -Property LastWriteTime | Select-Object -First $nb | Copy-Item -Destination $dest -Recurse -PassThru | Out-File -FilePath $logFile -Append } catch[System.IO.IOException]{ "access error : "+$PSItem | Out-File -FilePath $logFile -Append } catch{ "back-up error : "+$PSItem | Out-File -FilePath $logFile -Append }
主脚本(bu_task.ps1)
#-----------------------SET SOURCE AND DESTINATION FOLDERS HERE------------------------------------------- param( [string]$mode=" ", [string]$src="A:\files", [string]$dest="B:\backup", [int]$nb=12 ) #-------------------------------- DO NOT MODIFY BELOW THIS LINE ------------------------------------------------ #log init $logFile="regular_bu_log.txt" .\log_init.ps1 $logFile "Full backup job" #mode selection switch ($mode){ D {$dest=$dest+"\daily" #clean src folder .\clean-up.ps1 -src $src -nb $nb } W {$dest=$dest+"\weekly"} M {$dest=$dest+"\monthly"} Y {$dest=$dest+"\yearly"} default{ $dest=$dest+"\default" $mode+" - no mode selected" | Out-File -FilePath $logFile -Append } } #back-up job .\bu_template.ps1 -src $src -dest $dest -nb 1 #clean bu folder .\clean-up.ps1 -src $dest -nb $nb
权限验证代码
$id = [System.Security.Principal.WindowsIdentity]::GetCurrent() $p = New-Object System.Security.Principal.WindowsPrincipal($id) if ($p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) log "I am an admin"
核心疑问
使用相同账户时,任务计划程序运行脚本与直接运行的权限有何差异?
内容的提问来源于stack exchange,提问作者Dalassos
相关产品推荐
相关产品推荐

