web-dev-qa-db-ja.com

PowerShellでレジストリハイブ(NTUSER.DAT)をエクスポートする方法

Samsung Print Driversによって引き起こされるレジストリの肥大化の問題を解決するには、PowerShellでユーザーの移動プロファイルNTUSER.DATレジストリハイブをエクスポートする方法を見つける必要があります。 NTUSER.DATレジストリハイブの読み込みとエクスポートはREGEDITで機能しますが、これまでのところ、PowerShellでこれを行う方法は見つかりませんでした。

私が取り組んでいるPowerShellスクリプトは、リモートレジストリハイブの読み込み、キーの削除、およびアンロードを行うことができます。これは、RegistryHiveファイルから空き領域/空き領域を削除する方法を提供しません。 REGEDITでこれを手動で行うと、150,000KBを超える肥大化したNTUSER.DATファイルを取得し、それらを新しいNTUSER_Clean.DATレジストリハイブとして780KBまでエクスポートすることができました(設定が比較的少ないユーザーの場合) 。

PowerShellサンプルコード:

Write-Host "Attempting to load the User Roaming Profile Registry Hive (NTUSER.DAT)."
#Write-Host $strRemoteLocation
reg load "HKU\$strKeyName" $strRemoteLocation
Write-Host $strLine

Write-Host "Attempting to clean the Registry Hive of Samsung SSPrint Keys."
Clean_Key $strKeyName "spd__"
Clean_Key $strKeyName "spe__"
Clean_Key $strKeyName "ssp6m"
Write-Host $strLine

# Export Registry Hive to NTUSER_Clean.DAT
Write-Host "This section would export the Registry Hive to a new file."
Write-Host "At this point I'm not sure how to do this."
Write-Host $strLine

# Unload the Registry Hive
Write-Host "Attempting to unload the Registry Hive."
[gc]::collect()
start-sleep -s 3
reg unload "HKU\$strKeyName"

これまでのところ、reg(reg.exe)を使用してレジストリハイブファイルとしてエクスポートする方法を見つけていません。 "reg EXPORT"引数は、私が知る限り、.regファイルのみを生成します。

3
Arachnid

「レジストリエクスポート」の使用は、レジストリハイブのエクスポートに使用するものではありません。私は気づいていませんでしたが、「reg save」オプションを使用すると、NTUSER.DATなどのRegistryHiveファイルを実際に保存できます。

Reg.exeオプションに関するMicrosoftの記事を見つけ、「regsave」を使用してテストしました: http://technet.Microsoft.com/en-us/library/cc742108.aspx

Reg saveが使用されているPowerShellコード:

Write-Host "Attempting to load the User Roaming Profile Registry Hive (NTUSER.DAT)."
#Write-Host $strRemoteLocation
reg load "HKU\$strKeyName" "$strRemoteHiveSourcePath\NTUSER.DAT"
Write-Host $strLine

Write-Host "Attempting to clean the Registry Hive of Samsung SSPrint Keys."
Clean_Key $strKeyName "spd__"
Clean_Key $strKeyName "spe__"
Clean_Key $strKeyName "ssp6m"
Write-Host $strLine

# Export Registry Hive to NTUSER_Clean.DAT
Write-Host "Attempt to save a new version of the Registry Hive."
reg save "HKU\$strKeyName" "$strRemoteHiveSourcePath\NTUSER_Clean.DAT"
Write-Host $strLine

# Unload the Registry Hive
Write-Host "Attempting to unload the Registry Hive."
[gc]::collect()
start-sleep -s 3
reg unload "HKU\$strKeyName"
Write-Host $strLine

# Verify that the NTUSER_Clean.DAT is found.
# If found rename NTUSER.DAT to NTUSER_OLD.DAT and then rename NTUSER_Clean.DAT to NTUSER.DAT
# Clean up NTUSER_OLD.DAT once verified that the new NTUSER.DAT is in place.
if (Test-Path "$strRemoteHiveSourcePath\NTUSER_Clean.DAT") {
    Write-Host "The Exported Registry Hive (NTUSER_Clean.DAT) was found."
    Write-Host $strLine

    Write-Host "Renaming the compacted NTUSER.DAT file to NTUSER_OLD.DAT."
    Rename-Item "$strRemoteHiveSourcePath\NTUSER.DAT" "NTUSER_OLD.DAT"

    Write-Host "Renaming the compacted NTUSER_Clean.DAT file to NTUSER.DAT."
    Rename-Item "$strRemoteHiveSourcePath\NTUSER_Clean.DAT" "NTUSER.DAT"

    # Verify we actually have a NTUSER.DAT file before removing the OLD version.
    if (Test-Path "$strRemoteHiveSourcePath\NTUSER.DAT") {
        Write-Host "Deleting the original NTUSER_OLD.DAT"
        Remove-Item "$strRemoteHiveSourcePath\NTUSER_OLD.DAT"
    }

}else {
   Write-Host "The Exported Registry Hive was NOT found."
   Write-Host "The NTUSER.DAT was NOT compacted."
} 
Write-Host $strLine
2
Arachnid