PowerShell 2.0 实践(五)管理Windows注册表
上一次我们对Windows进程进行了简单的管理操作,涉及到获取本地及远程进程,开始、结束进程等操作。最后练习了改变进程的优先级等重要操作,在实际的工作过程中,还是很常用的。本次我们来深入窥探一下Windows的配置核心:注册表。注册表保存了Windows系统诸多的配置信息,如安装软件的位置,每种文件类型的默认打开程序,系统启动时执行的程序等,其重要性不言而喻。
警告,对注册表的操作须十分小心,在编辑之前请先备份。
本系列所有脚本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中测试通过。
1、PowerShell中涉及到注册表相关的命令有如下一些:
Get-Item | Get-ItemProperty |
Set-Item | Set-ItemProperty |
New-Item | New-ItemProperty |
Copy-Item | Copy-ItemProperty |
Rename—Item | Rename-ItemProperty |
Remove-Item | Remove-ItemProperty |
Clear-Item | Clear-ItemProperty |
其中第一列的命令在操作文件系统时我们就已经在使用了,现在它们被赋予了新的意义,对注册表项进行管理。那么第二列的作用是什么呢?它们负责管理注册表项下面的值:
即 *-Item管理"文件夹",*-ItemProperty管理"文件"。这里我使用的是Registry Workshop,一款功能强大的注册表编辑软件,支持Windows 7及64位,可以在这里下载试用版。
2、PowerShell提供了多种"驱动器"实体:
Get-PSDrive
执行结果:
不同于传统的Windows磁盘驱动器,这里的PSDrive是广义的驱动器,包含了文件系统、别名、证书、环境变量、注册表、变量等。其中关于注册表的有两个:HKCU和HKLM,而Windows注册表项一共有5个:
那么能不能用PowerShell也操作其他三个呢?答案是肯定的,可以先转到注册表的根部:
Set-Location -Path Microsoft.PowerShell.Core\Registry::
Get-ChildItem –Recurse
运行结果:
Microsoft.PowerShell.Core\Registry:: 是一个特殊的路径,表示注册表的根路径。有了根路径,就已随意转到一个注册表路径了:
Push-Location HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
Pop-Location
我们经常在别的驱动器中进行操作(如文件系统),这是突然需要访问注册表,则可以使用Push-Location暂时转到注册表的驱动器,操作完成后使用Pop-Location回到原来的驱动器。这是一种推荐做法,可以方便的在不同驱动器之间切换。
3、读取注册表。
Push-Location HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
Get-ItemProperty OptionalComponents
运行结果:
可以看到,返回了对应注册表项下的值的信息:
4、写入注册表。
在指定位置新建一个注册表项:
Pop-Location
New-Item -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run -Name "PS" –Force
运行结果:
在注册表中可以看到创建的这个项:
下面创建一个值:
给 Windows添加一个启动项:VS2010,添加启动项这种操作是众多中小软件的一贯做法,往往出现在安装向导的最后一步:)
New-ItemProperty -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run -Name "VS2010" -Value "E:\Dotnet\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" -PropertyType string –Force
运行结果:
在msconfig中也可以看到添加的启动项:
其中-PropertyType的值必须是下列枚举值之一:
PropertyType 值 | 含义 |
Binary | 二进制数据 |
DWord | 一个有效的 UInt32 数字 |
ExpandString | 一个可以包含动态扩展的环境变量的字符串 |
MultiString | 多行字符串 |
String | 任何字符串值 |
QWord | 8 字节二进制数据 |
不要真的添加VS2010启动项,否则每次开机会让你崩溃:)
5、更改注册表的值。
Set-Item -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\PS -Value "PSV2" -Force -PassThru
Set-ItemProperty -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run -Name "VS2010" -Value "E:\" –PassThru
运行结果:
6、清空注册表的值。
Clear-Item -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\PS
Clear-ItemProperty -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run -Name "VS2010" –PassThru
运行结果:
7、删除注册表项。
Remove-Item -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\PS -Force
Remove-ItemProperty -Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run -Name "VS2010"
运行结果:
8、远程管理注册表。
借助于.NET类库,可以用PowerShell远程管理注册表。
如图所示,虚拟机的IP为:192.168.200.132:
$MachineName = '192.168.200.132'
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $MachineName)
#以编辑模式打开注册表键
$regKey = $reg.OpenSubKey("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion", $true)
$regkey.GetValueNames()
运行结果:
注意:$true表示以编辑模式打开远程注册表,忽略该参数或设置为$false则会以只读模式打开。
远程修改注册表:
$MachineName = '192.168.200.132'
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $MachineName)
#以编辑模式打开注册表键
$regKey = $reg.OpenSubKey("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run", $true)
$regkey.GetValueNames()
$regKey.CreateSubKey("VS2010")
运行结果:
注意,远程修改注册表需要将远程计算机上的【Remote Registry】服务启动,否则会遇到错误:
小结:
本次对Windows注册表做了一番测试,重在理解"项"、"值"的概念,这样才会用正确的方法来管理注册表。此外,同样可以远程管理注册表,可以看到,在PowerShell 2.0发布后,远程管理被提到了核心高度,后续篇章我们会看到更多的命令添加了远程管理功能。下一次将练习管理Windows日志。