首页/系统/Windows 运维速查/提供程序与 PSDrive
PowerShell 基础66 条

提供程序与 PSDrive

统一提供程序模型访问注册表、证书、环境变量等:Get-PSDrive 列出,定位到 HKLM: 后可用相同 cmdlet 操作。

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

提供程序与 PSDrive 是什么

PowerShell 用「提供程序」把注册表、证书存储、环境变量等异构数据源包装成类似磁盘的结构,再用 PSDrive 挂成 HKLM:、Cert:、Env: 这样的盘符。好处是同一套命令通吃:Get-ChildItem 既能列目录,也能列注册表子键和证书。理解这一层,很多「为什么注册表要用 Get-ItemProperty」的疑惑就自然解开了。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7
查看Get-PSDrive 列出可用盘符,Get-PSProvider 列出提供程序能力
内置盘符FileSystem、HKLM:、HKCU:、Cert:、Env:、Variable、Alias、Function、WSMan
通用命令Get-ChildItem、Get-Item、Get-ItemProperty、Set-ItemProperty、New-Item、Test-Path、Set-Location
注册表值键(Key)用 Get-ChildItem 展开,值(Value)用 Get-ItemProperty 读取
自定义盘符New-PSDrive -Name -PSProvider -Root,文件系统可加 -Persist 生成映射盘

典型使用场景

  • 注册表巡检:按提供程序递归查子键与值,替代手动逐层点开
  • 证书盘点:列出本机或当前用户的证书,筛选即将到期或用于代码签名的证书
  • 环境变量核对:在 Env: 盘符下枚举变量,排查部署脚本依赖的变量是否齐全
  • 统一盘点脚本:用同一套遍历逻辑处理文件、注册表、证书三类目标
  • 临时映射:为网络共享创建带凭据的临时 PSDrive,用完移除

常用示例

常用示例
Get-PSDrive                                          # 列出当前所有盘符与剩余空间
Get-PSProvider                                       # 查看已注册的提供程序
Get-ChildItem HKCU:\Software | Select-Object -First 5 # 列注册表子键
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name ProductName   # 读值
Set-ItemProperty 'HKCU:\Software\MyApp' -Name Mode -Value prod    # 改值(先备份)
Get-ChildItem Cert:\LocalMachine\My | Select-Object Subject, NotAfter    # 列证书
Get-ChildItem Cert:\LocalMachine\Root -CodeSigningCert                   # 带提供程序专有参数筛选
Get-ChildItem Env: | Where-Object Name -like 'HTTP*'                     # 查环境变量
New-PSDrive -Name T -PSProvider FileSystem -Root \\SRV01\share -Persist  # 临时映射网络盘

常用盘符对照

盘符背后数据源取值要点
C: 等文件系统本地或网络文件支持 -Recurse、-Filter,与传统文件操作一致
HKLM: / HKCU:注册表键子键当目录、值用 Get-ItemProperty 读取(含默认值)
Cert:证书存储分 LocalMachine 与 CurrentUser,支持 -CodeSigningCert 等专有参数
Env:环境变量直接当作字符串变量集合,可读写
Alias: / Function:会话内的别名与函数用于查看当前会话定义了哪些快捷命令
注册表的「键」像目录,「值」像文件内容但不是文件:读取用 Get-ItemProperty,默认值(未命名值)用 (Get-Item 键).GetValue('') 取。直接 Get-Content 一个注册表路径会报错。
64 位系统上 32 位程序看到的是 HKLM\SOFTWARE\WOW6432Node 分支,PowerShell 里读写要与目标程序的位数对齐,否则出现「明明改了却没生效」。

跨提供程序遍历与容错

跨提供程序遍历与容错
Get-ChildItem HKCU:\Software -Recurse -ErrorAction SilentlyContinue | Select-Object -First 20  # 递归时忽略权限错误
Get-ChildItem HKLM:\SOFTWARE -Recurse -Depth 2                          # 限制深度,避免漫长遍历
Get-ChildItem Cert:\LocalMachine\My | Where-Object NotAfter -lt (Get-Date).AddDays(30)   # 30 天内到期
Get-ChildItem Env: | Sort-Object Name | Format-Table Name, Value         # 环境变量排序输出
Remove-Item 在注册表提供程序下会真的删除键与子键树,且没有回收站。批量删除前先导出备份(reg export 或先复制整个分支),并确认目标分支没有被系统或软件引用。

易错点

  • 对注册表使用 Get-Content 读值:注册表值不是文件,必须用 Get-ItemProperty,否则报路径错误
  • 忘记 32/64 位视图差异(WOW6432Node),改了配置却对运行中的程序毫无影响
  • 对整个 HKLM 或 Cert: 递归遍历:耗时长且大量权限报错,应先加 -Depth 或 -ErrorAction SilentlyContinue
  • 用 Remove-Item 清理注册表键:直接删除、无回收站,删错分支可能导致软件甚至系统无法启动
  • 把 New-PSDrive 创建的盘符当成永久映射:未加 -Persist 时只在当前会话有效,新会话里就消失了

数据来源与参考

  • Microsoft Learn:about_Providers

相关工具

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