为PowerShell脚本添加凭据远程获取文件修改日期遇报错求助
问题分析与解决方案
原脚本的核心错误
Get-ChildItem的-Credential参数不支持UNC共享路径(即\\Server\Share格式),PowerShell的文件系统提供程序无法通过该参数传递凭据来验证SMB共享访问,这是报错的主要原因。- 循环内每次调用
Get-Credential会重复弹出输入框,不仅效率低,也不符合无交互需求。
实现无交互执行的正确步骤
1. 预先加密存储凭据(仅需执行一次)
先运行以下命令生成加密的凭据文件,密码会以当前用户权限加密存储,只有你在同一台机器上才能解密使用:
$cred = Get-Credential $cred | Export-Clixml -Path "C:\temp\remoteCred.xml"
2. 修改后的完整脚本
Set-ExecutionPolicy Unrestricted -Force -Scope CurrentUser $ServerName = Get-Content "c:\temp\devices.txt" # 加载预先存储的加密凭据 $Credential = Import-Clixml -Path "C:\temp\remoteCred.xml" $Output = foreach ($Server in $ServerName) { if (Test-Connection -ComputerName $Server -Count 1 -Quiet) { try { # 用cmdkey添加SMB共享的凭据映射,这是Windows远程共享认证的正确方式 cmdkey /add:$Server /user:$Credential.UserName /pass:$($Credential.GetNetworkCredential().Password) # 获取文件信息 $file = Get-ChildItem -Path "\\$Server\c$\ProgramData\sync\data.xml" -ErrorAction Stop # 构造结构化输出(按需调整字段) [PSCustomObject]@{ 服务器名称 = $Server 文件路径 = $file.FullName 最后修改时间 = $file.LastWriteTime } } catch { # 记录错误信息 [PSCustomObject]@{ 服务器名称 = $Server 错误信息 = $_.Exception.Message } } finally { # 清理凭据映射(可选,若不需要保留可删除) cmdkey /delete:$Server } } else { [PSCustomObject]@{ 服务器名称 = $Server 错误信息 = "无法ping通服务器" } } } # 导出为CSV(比Out-File更适合结构化数据) $Output | Export-Csv -Path "c:\temp\dataxml.csv" -NoTypeInformation -Encoding UTF8
关键说明
- 使用
cmdkey命令管理SMB凭据:这是Windows系统访问远程共享的标准方式,绕过了PowerShell文件系统提供程序的限制。 - 加密存储凭据:
Export-Clixml生成的文件是加密的,避免明文存储密码带来的安全风险。 - 结构化输出:用
PSCustomObject定义输出字段,导出为CSV后更易读取和分析。 - 错误处理:通过
try/catch捕获访问失败的情况,避免脚本中断,同时记录错误原因。
内容的提问来源于stack exchange,提问作者Gonzo
相关产品推荐
相关产品推荐

