Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Registry Editor (regedit.exe) và tiện ích dòng lệnh reg.exe không phải là các công cụ duy nhất để truy cập và quản lý registry trong Windows. PowerShell cung cấp nhiều công cụ cho quản trị viên tương tác với registry. Sử dụng PowerShell, bạn có thể tạo, sửa, xóa khóa/tham số registry, tìm kiếm giá trị và kết nối registry trên máy tính từ xa.

Điều hướng Windows Registry như hệ thống file với PowerShell

Làm việc với registry trong PowerShell tương tự như làm việc với file thường trên ổ cục bộ. Khác biệt chính là trong khái niệm này, khóa registry tương tự file, và tham số registry là thuộc tính của các file này.

Hiển thị danh sách ổ đĩa có sẵn trên máy tính:

get-psdrive
PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Lưu ý trong các ổ đĩa (có gán ký tự ổ) có các thiết bị đặc biệt truy cập qua Registry provider – HKCU (HKEY_CURRENT_USER) và HKLM (HKEY_LOCAL_MACHINE). Bạn có thể duyệt cây registry giống như điều hướng ổ đĩa. HKLM:\ và HKCU:\ dùng để truy cập hive registry cụ thể.

cd HKLM:\
Dir -ErrorAction SilentlyContinue
PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Vậy bạn có thể truy cập khóa registry và tham số của chúng dùng cùng các cmdlet PowerShell dùng quản lý file và thư mục.

Để tham chiếu khóa registry, dùng cmdlet với xxx-Item:

  • Get-Item – lấy khóa registry
  • New-Item — tạo khóa registry mới
  • Remove-Item – xóa khóa registry

Tham số registry coi như thuộc tính của khóa registry (tương tự thuộc tính file/thư mục). Cmdlet xxx-ItemProperty dùng quản lý tham số registry:

  • Get-ItemProperty – lấy giá trị tham số registry
  • Set-ItemProperty – thay đổi giá trị tham số registry
  • New-ItemProperty – tạo tham số registry
  • Rename-ItemProperty – đổi tên tham số
  • Remove-ItemProperty — xóa tham số registry

Bạn có thể điều hướng đến khóa registry cụ thể (ví dụ khóa chịu trách nhiệm cài đặt cập nhật driver tự động) bằng một trong hai lệnh:

cd HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
hoặc
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching

Lấy giá trị tham số Registry qua PowerShell

Lưu ý các tham số lưu trong khóa registry không phải đối tượng lồng nhau, mà là thuộc tính của khóa registry cụ thể. Do đó bất kỳ khóa registry nào cũng có thể có nhiều tham số.

Liệt kê nội dung khóa registry hiện tại bằng lệnh:

dir

Hoặc

Get-ChildItem

Lệnh hiển thị thông tin về khóa registry lồng nhau và thuộc tính của chúng. Nhưng không hiển thị thông tin về tham số SearchOrderConfig, là thuộc tính của khóa hiện tại.

Dùng cmdlet Get-Item để lấy tham số của khóa registry:

Get-Item .
Hoặc
Get-Item –Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching

Như bạn thấy, khóa DriverSearching chỉ có một tham số – SearchOrderConfig với giá trị 1.

PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Để lấy giá trị tham số khóa registry, dùng cmdlet Get-ItemProperty.

$DriverUpdate = Get-ItemProperty –Path ‘HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching’
$DriverUpdate.SearchOrderConfig
PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Chúng ta thấy giá trị tham số SearchOrderConfig là 1.

Thay đổi giá trị Registry với PowerShell

Để thay đổi giá trị tham số reg SearchOrderConfig, dùng cmdlet Set-ItemProperty:

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig -Value 0

Kiểm tra xem giá trị tham số đã thay đổi:

Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig
PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Cách tạo khóa Registry hoặc tham số mới với PowerShell?

Để tạo khóa registry mới, dùng lệnh New-Item. Tạo khóa mới tên NewKey:

$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
New-Item –Path $HKCU_Desktop –Name NewKey

Bây giờ tạo tham số mới trong khóa registry mới. Giả sử cần tạo tham số chuỗi loại REG_SZ tên SuperParamString giá trị filetmp1.txt:

New-ItemProperty -Path $HKCU_Desktop\NewKey -Name "SuperParamString" -Value ”filetmp1.txt” -PropertyType "String"

Bạn có thể dùng các kiểu dữ liệu sau cho tham số registry:

  • String (REG_SZ)
  • ExpandString (REG_EXPAND_SZ)
  • MultiString (REG_MULTI_SZ)
  • Binary (REG_BINARY)
  • DWord (REG_DWORD)
  • Qword (REG_QWORD)
  • Unknown (kiểu dữ liệu registry không hỗ trợ)
PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Cách kiểm tra khóa registry có tồn tại?

Nếu cần kiểm tra khóa registry cụ thể có tồn tại, dùng cmdlet Test-Path:

Test-Path 'HKCU:\Control Panel\Desktop\NewKey'

Script PowerShell sau kiểm tra xem giá trị registry cụ thể có tồn tại không, nếu không thì tạo nó.

regkey='HKCU:\Control Panel\Desktop\NewKey'
$regparam='testparameter'
if (Get-ItemProperty -Path $regkey -Name $regparam -ErrorAction Ignore)
{ write-host 'The registry entry already exist' }
else
{ New-ItemProperty -Path $regkey -Name $regparam -Value ”woshub_test” -PropertyType "String" }

Dùng cmdlet Copy-Item, bạn có thể copy entry từ khóa registry này sang khóa khác:

$source='HKLM:\SOFTWARE\7-zip\'
$dest = 'HKLM:\SOFTWARE\backup'
Copy-Item -Path $source -Destination $dest -Recurse

Nếu muốn copy mọi thứ, kể cả subkey, thêm switch –Recurse.

Xóa khóa Registry hoặc tham số

Lệnh Remove-ItemProperty dùng để xóa tham số trong khóa registry. Xóa tham số SuperParamString tạo trước đó:

$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
Remove-ItemProperty –Path $HKCU_Desktop\NewKey –Name "SuperParamString"

Bạn có thể xóa toàn bộ khóa registry cùng toàn bộ nội dung:

Remove-Item –Path $HKCU_Desktop\NewKey –Recurse

Lưu ý. –Recurse switch chỉ ra tất cả subkey phải xóa đệ quy.

Để xóa tất cả item trong khóa reg (nhưng không xóa chính khóa):

Remove-Item –Path $HKCU_Desktop\NewKey\* –Recurse

Cách đổi tên khóa Registry hoặc tham số?

Bạn có thể đổi tên tham số registry bằng lệnh:

Rename-ItemProperty –path ‘HKCU:\Control Panel\Desktop\NewKey’ –name "SuperParamString" –newname “OldParamString”

Cùng cách đó, bạn có thể đổi tên khóa registry:

Rename-Item -path 'HKCU:\Control Panel\Desktop\NewKey' OldKey

Tìm kiếm Registry theo từ khóa dùng PowerShell

PowerShell cho phép tìm kiếm registry. Lệnh sau tìm trong HKCU:\Control Panel\Desktop các tham số có tên chứa *dpi* key.

$Path = (Get-ItemProperty ‘HKCU:\Control Panel\Desktop’)
$Path.PSObject.Properties | ForEach-Object {
If($_.Name -like '*dpi*'){
Write-Host $_.Name ' = ' $_.Value
}
}

Để tìm khóa registry với tên cụ thể:

Get-ChildItem -path HKLM:\ -recurse -ErrorAction SilentlyContinue | Where-Object {$_.Name -like "*woshub*"}

Thiết lập quyền khóa Registry với PowerShell

Bạn có thể lấy quyền khóa registry hiện tại dùng cmdlet Get-ACL (cmdlet Get-ACL cũng cho phép quản lý quyền NTFS trên file và thư mục).

$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
$rights.Access.IdentityReference
PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Trong ví dụ sau, chúng ta sẽ sửa ACL trong khóa registry này để cấp quyền ghi cho nhóm Users tích hợp sẵn.

Lấy quyền hiện tại:

$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'

Chỉ định user hoặc nhóm muốn cấp quyền:

$idRef = [System.Security.Principal.NTAccount]"BuiltIn\Users"

Chọn mức quyền truy cập:

$regRights = [System.Security.AccessControl.RegistryRights]::WriteKey

Thiết lập cài đặt kế thừa quyền:

$inhFlags = [System.Security.AccessControl.InheritanceFlags]::None
$prFlags = [System.Security.AccessControl.PropagationFlags]::None

Loại truy cập (Allow/Deny):

$acType = [System.Security.AccessControl.AccessControlType]::Allow

Tạo quy tắc truy cập:

$rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType)

Thêm quy tắc mới vào ACL hiện tại:

$rights.AddAccessRule($rule)

Áp dụng quyền mới cho khóa registry:

$rights | Set-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'

Kiểm tra nhóm mới xuất hiện trong ACL của khóa registry.

PowerShell: Lấy, sửa, tạo và xóa khóa Registry hoặc tham số

Lấy giá trị Registry từ máy tính từ xa qua PowerShell

PowerShell cho phép truy cập registry của máy tính từ xa. Bạn có thể kết nối máy tính từ xa dùng WinRM (Invoke-Command hoặc Enter-PSSession). Để lấy giá trị tham số registry từ máy tính từ xa:

Invoke-Command –ComputerName srv-fs1 –ScriptBlock {Get-ItemProperty -Path 'HKLM:\System\Setup' -Name WorkingDirectory}

Hoặc dùng kết nối registry từ xa (dịch vụ RemoteRegistry phải được bật)

$Server = "lon-fs1"
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server)
$RegKey= $Reg.OpenSubKey("System\Setup")
$RegValue = $RegKey.GetValue("WorkingDirectory")

Mẹo: Nếu bạn phải tạo/sửa tham số registry cụ thể trên nhiều máy tính domain, dễ hơn dùng tính năng GPO.

Vậy chúng ta đã xem qua các ví dụ điển hình dùng PowerShell truy cập và quản lý entry registry Windows. Bạn có thể dùng chúng trong script tự động hóa.