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日志。

posted @ 2010-08-10 21:36  江苏瑞步科技  阅读(3010)  评论(0编辑  收藏  举报