您的位置:首页 > 运维架构 > Shell

PowerShell 2.0 实践(五)管理Windows注册表

2013-05-14 15:59 429 查看
上一次我们对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-PathMicrosoft.PowerShell.Core\Registry::Get-ChildItem–Recurse运行结果:

Microsoft.PowerShell.Core\Registry:: 是一个特殊的路径,表示注册表的根路径。有了根路径,就已随意转到一个注册表路径了:Push-Location HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunPop-Location我们经常在别的驱动器中进行操作(如文件系统),这是突然需要访问注册表,则可以使用Push-Location暂时转到注册表的驱动器,操作完成后使用Pop-Location回到原来的驱动器。这是一种推荐做法,可以方便的在不同驱动器之间切换。
3、读取注册表。Push-Location HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunGet-ItemPropertyOptionalComponents运行结果:

可以看到,返回了对应注册表项下的值的信息:


4、写入注册表。在指定位置新建一个注册表项:Pop-LocationNew-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"-PropertyTypestring–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-PathHKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run-Name"VS2010"–PassThru运行结果:






7、删除注册表项。Remove-Item-Path HKLM:SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\PS-Force
Remove-ItemProperty-PathHKLM: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日志。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: