Làm cách nào tôi có thể tìm ra đường dẫn đến hình ảnh máy tính để bàn hiện tại, cho Windows 8


10

Gần đây đã nâng cấp lên Windows 8, tập lệnh của tôi để lấy lại hình nền của máy tính để bàn hiện tại đã bị hỏng.

Đối với Windows 7, làm cách nào tôi có thể tìm ra đường dẫn đến hình ảnh máy tính để bàn hiện tại? , điều này làm việc tuyệt vời. Tuy nhiên, khóa đăng ký đó luôn chứa

C:\Windows\web\wallpaper\Windows\img0.jpg

Khóa đăng ký mới được sử dụng cho Windows 8 là gì?

Tôi đã tìm thấy hai giải pháp khả thi.

Đầu tiên, khóa này chứa những gì trông giống như một đường dẫn được mã hóa Base64:

HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers\Images\ID2

Và sau đó là "tệp thuộc tính chủ đề tùy chỉnh" cũng chứa phần "[SlideShow]" trông giống Base64:

C:\Users\Scott\AppData\Local\Microsoft\Windows\Themes\Custom.theme

Tôi quan tâm đến các mục đăng ký được mã hóa cơ sở dường như (nhưng dường như không). Tại sao Microsoft sẽ mã hóa chúng như vậy? Những gì để đạt được từ việc che giấu thông tin cơ bản đó?
Synetech

Câu trả lời:


10

Hai khóa đăng ký bên dưới đều lưu trữ đường dẫn gốc của hình nền hiện tại:

HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache
HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache_000

Chúng ở định dạng Unicode, khi giải mã được điều đó, người ta sẽ có đường dẫn đầy đủ đến hình nền hiện tại.


2
Chỉ cần làm rõ cho bất kỳ ai gặp rắc rối với điều này: giá trị chứa dữ liệu không phải chuỗi trong 24 byte đầu tiên và dữ liệu còn lại là chuỗi Unicode được mã hóa, kết thúc bằng null (\ 0). Chúc mừng phân tích.
Nathan Taylor

Trong powershell, nó [System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)]), giả sử $byteschứa giá trị của khóa
NextInLine

2
quyền hạn twoliner đầy đủ:$bytes=(New-Object -ComObject WScript.Shell).RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache_000"); $path=([System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)]) -split "\0")[0]
Mark Harvestiston

3
  1. Chuyển đến Lệnh chạy Windows (WinLogo + R)
  2. Nhập vào:% AppData%
  3. Trong thư mục 'Chuyển vùng', đi tới 'Microsoft', sau đó 'Windwows', sau đó 'Chủ đề' và cuối cùng là 'Bộ nhớ đệm'
  4. Sao chép tập tin hình nền.

Điều này rất đơn giản và nhanh chóng. Tôi lấy tập tin, thay đổi phần mở rộng thành .jpg và nó ở đó.
valsidalv

2

Kiểm tra HKEY_CURRENT_USER\Control Panel\Desktop\Wallpapergiá trị REG_SZ (chuỗi). Điều này sẽ cho bạn thấy đường dẫn đến TranscodingWallapers.jpg hiện đang được sử dụng.


Cảm ơn bạn! Điều đó chỉ cho tôi đến vị trí đăng ký chính xác ít nhất. Tôi không chỉ muốn hình nền hiện tại mà đường dẫn đến tệp gốc (như Window 7 đã làm), đó là trong mục TranscodingImageCache.
Scott Bennett-McLeish


2

Trong Windows 8 và 8.1 (và, theo báo cáo, 10), nếu bạn đã đặt hình nền của mình từ Windows Picture Viewer (bằng cách mở một hình ảnh trong Trình xem và nhấp vào "Đặt làm hình nền máy tính" trong menu ngữ cảnh), vị trí của nó sẽ là

%AppData%\Roaming\Microsoft\Windows Photo Viewer\Windows Photo Viewer Wallpaper.jpg

1

Trong tình huống của tôi, tôi có một thư mục hình ảnh khổng lồ mà hình nền của tôi quay vòng. Tôi cảm thấy nhàm chán với một số sau một lúc và muốn xóa chúng hoặc đôi khi tôi chỉ tự hỏi tên hình ảnh là gì bởi vì nó có thể có mô tả của hình ảnh.

Tôi đã xây dựng 2 tập lệnh dựa trên phản hồi ở trên - một để có đường dẫn hình ảnh hiện tại và một để xóa nó. Chỉ thử nghiệm điều này trên Windows 10.

Nhận đường dẫn hình ảnh (getwallapers.ps1)

$bytes=(New-Object -ComObject WScript.Shell).RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache")
$wallpaperpath=[System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)])
$wallpaperpath=$wallpaperpath.substring(0, $wallpaperpath.IndexOf("jpg", 0, $wallpaperpath.Length)+3)
write-output $wallpaperpath
Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');

Xóa hình ảnh (deletewallapers.ps1)

$bytes=(New-Object -ComObject WScript.Shell).RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\TranscodedImageCache")
$wallpaperpath=[System.Text.Encoding]::Unicode.GetString($bytes[24..($bytes.length-1)])
$wallpaperpath=$wallpaperpath.substring(0, $wallpaperpath.IndexOf("jpg", 0, $wallpaperpath.Length)+3)
write-output $wallpaperpath
Write-Host -NoNewLine 'Delete the file (y=yes)?'
$KeyOption = 'Y','N'
while ($KeyOption -notcontains $KeyPress.Character) {
 $KeyPress = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
 if($KeyPress.Character -eq 'y') { Remove-Item $wallpaperpath }
}
Write-Host
[Environment]::Exit(0)

1
  1. Tới C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\Themes.
  2. Tạo một bản sao của TranscodedWallpaper
  3. Đổi tên bản sao thành <NAME>.JPG

Đã thử nghiệm trên Windows 10

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.