远程凭据传递是什么
远程执行需要凭据对象,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 文件 | 中 | 同机同用户的自动化 |
| 计划任务存储凭据 | 中高 | 定时任务 |
| 托管服务账户 | 高 | 服务与任务长期运行 |
| 明文写在脚本里 | 极低 | 任何场景都不应使用 |
凭据文件只能在同一台机器的同一用户上下文中解密:换用户或换机器都会失败。这个限制既是安全边界,也是排障时最常见的疑问来源。
把凭据文件放在共享目录、或给目录开了网络共享,等于把加密保护的边界拆掉——能读到文件的攻击者只要以同一用户身份登录就能解密。