首页/系统/Windows 运维速查/远程执行中的凭据传递

远程执行中的凭据传递

-Credential 传凭据对象(Get-Credential / 安全字符串);脚本中禁止明文密码,用凭据文件(Import-Clixml)要配合 DPAPI 加密与权限保护。

Windows 运维速查系统更新于 2026-10-13

远程凭据传递是什么

远程执行需要凭据对象,PowerShell 用 PSCredential 承载用户名与加密后的口令,通过 -Credential 参数传给远程命令。凭据绝对不能明文写在脚本里:交互场景用 Get-Credential 现输入,自动化场景用 Export-Clixml 保存凭据文件(由 DPAPI 加密,只有同一用户在同一台机器上能读)。这是远程运维中最容易出错也最容易出安全事故的一环。

基本信息

适用平台PowerShell 5.1 / 7.x;Windows 与跨平台差异明显
创建方式Get-Credential;[PSCredential]::new($user, $secureString)
持久化Export-Clixml 保存、Import-Clixml 读取
加密机制DPAPI 绑定当前用户与机器(仅 Windows)
安全边界凭据文件放到共享盘等于公开密码
替代方案托管服务账户、计划任务的存储凭据、证书认证

典型使用场景

  • 跨域或跨网段执行命令,需要用目标域身份认证
  • 定时巡检脚本在夜里运行,需要无人值守的凭据
  • 临时以管理员身份执行一次性操作
  • 测试不同账号的权限差异,验证授权是否符合预期
  • 把凭据从交互输入改造成可复用的脚本参数

常用示例

常用示例
$cred = Get-Credential                                   # 交互输入,不落盘
Invoke-Command -ComputerName srv01 -Credential $cred -ScriptBlock { hostname }
Get-Credential | Export-Clixml C:\secure\cred.xml        # 保存(DPAPI 绑定当前用户)
$cred2 = Import-Clixml C:\secure\cred.xml                # 读取
icacls C:\secure /inheritance:r /grant "$env:USERNAME:(OI)(CI)F"   # 收紧目录权限
Get-SmbShare | Where-Object Path -like 'C:\secure*'      # 确认该目录没有被共享出去
$sec = ConvertTo-SecureString 'p@ss' -AsPlainText -Force  # 反面示例:明文,禁止在正式脚本使用

凭据方案对比

方案安全程度适用场景
Get-Credential 交互高人工执行的一次性操作
Export-Clixml 文件中同机同用户的自动化
计划任务存储凭据中高定时任务
托管服务账户高服务与任务长期运行
明文写在脚本里极低任何场景都不应使用
凭据文件只能在同一台机器的同一用户上下文中解密:换用户或换机器都会失败。这个限制既是安全边界,也是排障时最常见的疑问来源。
把凭据文件放在共享目录、或给目录开了网络共享,等于把加密保护的边界拆掉——能读到文件的攻击者只要以同一用户身份登录就能解密。

易错点

  • 把明文口令写进脚本并纳入版本库,等于长期公开凭据,属于审计红线
  • 凭据文件权限过宽或所在目录被共享,加密的保护形同虚设
  • 换机器或换运行账户后脚本报解密失败,误以为是口令错,实际是 DPAPI 边界
  • 在管理员以外的会话里反复调 -Credential,多次失败后触发目标账号锁定

数据来源与参考

  • Microsoft Learn:PSCredential
  • Microsoft Learn:Export-Clixml 安全性

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌