任务计划程序执行PowerShell脚本时Get-ChildItem访问远程目录失败
任务计划执行PowerShell远程日志检查脚本故障解决
核心问题分析
- NT-Authority\SYSTEM账户限制:该账户是本地系统账户,无法通过网络身份验证访问远程SMB共享(如
\\$computer\c$),跨机器身份不被目标系统认可。 - 内置Administrator账户非交互式会话限制:无人登录时,任务运行在会话0(非交互式会话),默认无持久化网络凭据,导致SMB共享访问失败。
具体解决方案
方案1:改用WMI/WinRM远程执行(推荐)
绕过SMB共享,直接在远程机器上执行文件操作,避免网络凭据问题。修改脚本关键逻辑如下:
$date = Get-Date -format dd.MM.yy $time = Get-Date -format HH:mm $fileout = @() $outputfile = "C:\Users\user\Desktop\logged_error.txt" $computers = 'pc1','pc2' $remoteLogDir = "C:\Program Files (x86)\Logcollector\diagnose" foreach ($computer in $computers){ # 远程获取最新日志文件 try { $latestLog = Invoke-Command -ComputerName $computer -ScriptBlock { Get-ChildItem -Path $using:remoteLogDir -Include "SUITE_*" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 } -ErrorAction Stop if ($latestLog) { # 远程读取日志最后14行 $logContent = Invoke-Command -ComputerName $computer -ScriptBlock { Get-Content -Path $using:latestLog.FullName -Tail 14 } -ErrorAction Stop # 检查错误 if ($logContent | Select-String -Pattern "WARNING","ERROR") { $fileout += "$computer 在 $date $time 时,日志最后14行包含错误/警告" } else { $fileout += "$computer 在 $date $time 时,日志最后14行无错误/警告" } } else { $fileout += "$computer 未找到匹配的SUITE_*日志文件" } } catch { $fileout += "$computer 远程执行失败:$($_.Exception.Message)" } # LOG 2 和 LOG 3 同理修改 } $fileout | Out-File -FilePath $outputfile -Encoding ascii
前置配置:
- 远程机器启用WinRM:以管理员身份运行
winrm quickconfig - 确保执行任务的账户(SYSTEM或管理员)加入远程机器的
Remote Management Users本地组
方案2:持久化内置Administrator的网络凭据
若必须使用SMB共享,在有人登录时为目标机器添加持久化凭据:
- 以管理员身份打开命令提示符,执行:
cmdkey /add:pc1 /user:pc1\Administrator /pass:你的管理员密码 cmdkey /add:pc2 /user:pc2\Administrator /pass:你的管理员密码 - 验证凭据:执行
cmdkey /list确认已添加
注意:需定期更新凭据以应对密码过期,同时确保密码安全。
方案3:调整本地安全策略(适用于工作组环境)
- 打开本地组策略编辑器(
gpedit.msc) - 导航至计算机配置→Windows设置→安全设置→本地策略→安全选项
- 修改网络访问: 本地账户的共享和安全模型为
经典 - 本地用户以自己的身份验证 - 重启机器使策略生效
脚本健壮性优化建议
- 添加远程共享可用性检查:
if (-not (Test-Path "\\$computer\c$" -ErrorAction SilentlyContinue)) { $fileout += "$computer 无法访问远程共享目录" continue } - 增加日志文件空值判断:
$log = Get-ChildItem -Path "\\$computer\c$\Program Files (x86)\Logcollector\diagnose\*" -Include "SUITE_*" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if (-not $log) { $fileout += "$computer 未找到目标日志文件" continue }
内容的提问来源于stack exchange,提问作者Illya
相关产品推荐
相关产品推荐

