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

浙公網安備 33010602011771號