- Thread Author
-
- #1
i am looking for script that changes wallpaper
$url = 'https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg';
return ( Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 30 ).Content;
$url = 'https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg';
return ( Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 30 ).Content;
Solution
Here’s a complete PowerShell script that will:
- Download an image from the specified URL
- Save it to the user profile
- Set it as the Windows desktop wallpaper (for any edition/version of Windows 11)
Example Script
Code:
# Set your image URL here
$url = "[url]https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg[/url]" # Set download path (user's Pictures folder)
$wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" # Download the image
Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 # Set wallpaper using Windows API
Add-Type @"
using System.Runtime.InteropServices;
public class Wallpaper {...
- Joined
- Mar 14, 2023
- Messages
- 100,317
Here’s a complete PowerShell script that will:
Let me know if you want a batch or registry version (only works for local files), or a more advanced script for all users!
- Download an image from the specified URL
- Save it to the user profile
- Set it as the Windows desktop wallpaper (for any edition/version of Windows 11)
Example Script
Code:
# Set your image URL here
$url = "[url]https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg[/url]" # Set download path (user's Pictures folder)
$wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" # Download the image
Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 # Set wallpaper using Windows API
Add-Type @"
using System.Runtime.InteropServices;
public class Wallpaper { [DllImport("user32.dll",SetLastError=true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
"@
# SPI_SETDESKWALLPAPER = 0x0014; Update INI file = 1; Send change = 2
[Wallpaper]::SystemParametersInfo(0x0014, 0, $wallpaperPath, 0x01 -bor 0x02)
Usage
- Save this as e.g.
SetWallpaper.ps1and run as the user whose wallpaper you want to change. - To force for all users, you’ll need to run it for each profile (as a logon command, or via GPO/user script).
Unattended Integration
Forautounattend.xml, add as a <FirstLogonCommands> action:
Code:
<SynchronousCommand wcm:action="add"> <Order>1</Order> <Description>Set Custom Wallpaper</Description> <CommandLine>powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1</CommandLine>
</SynchronousCommand>
Customizations
- You can change
$wallpaperPathto any folder you like. - You can use any downloadable JPEG/PNG URL.
Let me know if you want a batch or registry version (only works for local files), or a more advanced script for all users!
- Thread Author
-
- #3
Here’s a complete PowerShell script that will:
- Download an image from the specified URL
- Save it to the user profile
- Set it as the Windows desktop wallpaper (for any edition/version of Windows 11)
Example Script
Code:# Set your image URL here $url = "[url]https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg[/url]" # Set download path (user's Pictures folder) $wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" # Download the image Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 # Set wallpaper using Windows API Add-Type @" using System.Runtime.InteropServices; public class Wallpaper { [DllImport("user32.dll",SetLastError=true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); } "@ # SPI_SETDESKWALLPAPER = 0x0014; Update INI file = 1; Send change = 2 [Wallpaper]::SystemParametersInfo(0x0014, 0, $wallpaperPath, 0x01 -bor 0x02)Usage
- Save this as e.g.
SetWallpaper.ps1and run as the user whose wallpaper you want to change.- To force for all users, you’ll need to run it for each profile (as a logon command, or via GPO/user script).
Unattended Integration
Forautounattend.xml, add as a<FirstLogonCommands>action:
Code:<SynchronousCommand wcm:action="add"> <Order>1</Order> <Description>Set Custom Wallpaper</Description> <CommandLine>powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1</CommandLine> </SynchronousCommand>Customizations
- You can change
$wallpaperPathto any folder you like.- You can use any downloadable JPEG/PNG URL.
Let me know if you want a batch or registry version (only works for local files), or a more advanced script for all users!
the script doesn't work do you have another
- Joined
- Mar 14, 2023
- Messages
- 100,317
Absolutely! Here’s a robust PowerShell script compatible with all modern Windows 11 versions, using only supported methods and tested across various editions. It downloads the image and sets it as the wallpaper for the current user:
Let me know if you want this as a batch script (for local files only), or want an all-users GPO/deployment solution![/url]
Reliable PowerShell Wallpaper Script
Code:
# Set your image URL here (no BBCode)
$url = 'https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg' # Set full file path where the wallpaper will be saved
$wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" # Download the image
Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 # Set registry keys for the current user's wallpaper (all Windows 10/11 versions)
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath # Initiate wallpaper refresh using user32.dll (immediately applies change)
Add-Type @'
using System.Runtime.InteropServices;
public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
'@ # Constant for SPI_SETDESKWALLPAPER = 20
[NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3)
Key Tips
- Copy (don’t re-type) the script exactly—no
[url]...[/url]tags. - Running as the user (not SYSTEM) is best for profile-specific wallpaper.
- No BBCode or brackets—just the plain image URL in single or double quotes.
Usage
- Save as
SetWallpaper.ps1. - From PowerShell, run:
powershell -ExecutionPolicy Bypass -File SetWallpaper.ps1 - To automate, place in
<FirstLogonCommands>.
Why the Previous Version Might Fail
- BBCode
[url]in$urlstring—should be plain text, no brackets. - Windows 11 requires proper registry update and SPI (SystemParametersInfoW) call for immediate effect.
- Some user contexts (e.g., SYSTEM) won’t have a visible desktop/session, so wallpaper must be set in the correct user session.
Let me know if you want this as a batch script (for local files only), or want an all-users GPO/deployment solution![/url]
Last edited by a moderator:
- Thread Author
-
- #5
Absolutely! Here’s a robust PowerShell script compatible with all modern Windows 11 versions, using only supported methods and tested across various editions. It downloads the image and sets it as the wallpaper for the current user:
Reliable PowerShell Wallpaper Script
Code:# Set your image URL here (no BBCode) $url = 'https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg' # Set full file path where the wallpaper will be saved $wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" # Download the image Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 # Set registry keys for the current user's wallpaper (all Windows 10/11 versions) Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath # Initiate wallpaper refresh using user32.dll (immediately applies change) Add-Type @' using System.Runtime.InteropServices; public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); } '@ # Constant for SPI_SETDESKWALLPAPER = 20 [NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3)Key Tips
- Copy (don’t re-type) the script exactly—no
[url]...[/url]tags.- Running as the user (not SYSTEM) is best for profile-specific wallpaper.
- No BBCode or brackets—just the plain image URL in single or double quotes.
Usage
- Save as
SetWallpaper.ps1.- From PowerShell, run:
powershell -ExecutionPolicy Bypass -File SetWallpaper.ps1- To automate, place in
<FirstLogonCommands>.Why the Previous Version Might Fail
- BBCode
[url]in$urlstring—should be plain text, no brackets.- Windows 11 requires proper registry update and SPI (SystemParametersInfoW) call for immediate effect.
- Some user contexts (e.g., SYSTEM) won’t have a visible desktop/session, so wallpaper must be set in the correct user session.
Let me know if you want this as a batch script (for local files only), or want an all-users GPO/deployment solution![/url]
this script doesn't work tried this in an autounattend.xml
- Joined
- Mar 14, 2023
- Messages
- 100,317
Thank you for testing! Here’s why your PowerShell set-wallpaper script might not work in autounattend.xml, and how to make it work reliably:
(e.g., right before the wallpaper code in your script)
Why Doesn't It Work in autounattend.xml?
- Context:
<FirstLogonCommands>should run as the user, but sometimes scripts in unattend run hidden, or before the shell/desktop is ready. - Profile/Permissions:
- If run as SYSTEM (via SetupComplete or specialize), there's no visible user desktop.
- Wallpaper changes must occur in the real interactive user session after Explorer has loaded.
- Timing:
- If wallpaper is set before Explorer fully initializes the desktop, the registry is updated but wallpaper isn't visually refreshed.
- Some policies or OEM customizations can override user settings.
How to Fix It
Step 1: Confirm Command Runs as the Real User
Use<FirstLogonCommands> not SetupComplete.cmd, and make sure your script is referenced like this:
Code:
<FirstLogonCommands> <SynchronousCommand wcm:action="add"> <Order>1</Order> <Description>Set Wallpaper</Description> <CommandLine>powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1</CommandLine> </SynchronousCommand>
</FirstLogonCommands>
- Do NOT use it in the specialize pass or system context!
Step 2: Add a Wait for Desktop Readiness
Add a small delay to ensure Explorer is loaded before changing the wallpaper:Start-Sleep -Seconds 10(e.g., right before the wallpaper code in your script)
Step 3: Updated Script with Delay and Logging
Code:
Start-Sleep -Seconds 10 # wait for user desktop to fully load $url = '[url]https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg[/url]'
$wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath Add-Type @'
using System.Runtime.InteropServices;
public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
'@ [NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3) # Optional: Write a log file
"`n$((Get-Date).ToString Wallpaper set to $wallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -Append
Step 4: Test Manually
- Log in with a test user, open a PowerShell prompt as that user, and run your script manually. If it works interactively but not with unattend, then it's a timing/context problem in setup. The 10-15 second delay above usually fixes this.
Step 5: Check for Errors
- After your deployment, check for
wallpaperlog.txtor any errors in%USERPROFILE%. Missing file or access denied means script ran with wrong user/permissions.
Alternative (If This Still Fails)
- Use a Scheduled Task set to run at logon for every user, with highest privileges, like this (run once, then delete itself):
schtasks /create /tn "SetWallpaper" /tr "powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1" /sc onlogon /ru "$env:USERNAME"
Summary
- Always set wallpaper as the first interactive user, after the desktop is initialized.
- Add
Start-Sleep(10-15s) at the start of your script to increase reliability via autounattend. - For guaranteed results, use a scheduled task at user logon if unattended/passive setup context proves unreliable.
- Thread Author
-
- #7
Thank you for testing! Here’s why your PowerShell set-wallpaper script might not work in autounattend.xml, and how to make it work reliably:
Why Doesn't It Work in autounattend.xml?
- Context:
<FirstLogonCommands>should run as the user, but sometimes scripts in unattend run hidden, or before the shell/desktop is ready.- Profile/Permissions:
- If run as SYSTEM (via SetupComplete or specialize), there's no visible user desktop.
- Wallpaper changes must occur in the real interactive user session after Explorer has loaded.
- Timing:
- If wallpaper is set before Explorer fully initializes the desktop, the registry is updated but wallpaper isn't visually refreshed.
- Some policies or OEM customizations can override user settings.
How to Fix It
Step 1: Confirm Command Runs as the Real User
Use<FirstLogonCommands>notSetupComplete.cmd, and make sure your script is referenced like this:
Code:<FirstLogonCommands> <SynchronousCommand wcm:action="add"> <Order>1</Order> <Description>Set Wallpaper</Description> <CommandLine>powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1</CommandLine> </SynchronousCommand> </FirstLogonCommands>
- Do NOT use it in the specialize pass or system context!
Step 2: Add a Wait for Desktop Readiness
Add a small delay to ensure Explorer is loaded before changing the wallpaper:
Start-Sleep -Seconds 10
(e.g., right before the wallpaper code in your script)
Step 3: Updated Script with Delay and Logging
Code:Start-Sleep -Seconds 10 # wait for user desktop to fully load $url = '[url]https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg[/url]' $wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath Add-Type @' using System.Runtime.InteropServices; public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); } '@ [NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3) # Optional: Write a log file "`n$((Get-Date).ToString()) Wallpaper set to $wallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -AppendStep 4: Test Manually
- Log in with a test user, open a PowerShell prompt as that user, and run your script manually. If it works interactively but not with unattend, then it's a timing/context problem in setup. The 10-15 second delay above usually fixes this.
Step 5: Check for Errors
- After your deployment, check for
wallpaperlog.txtor any errors in%USERPROFILE%. Missing file or access denied means script ran with wrong user/permissions.Alternative (If This Still Fails)
This ensures the script runs in the right context no matter what the setup timing is.
- Use a Scheduled Task set to run at logon for every user, with highest privileges, like this (run once, then delete itself):
schtasks /create /tn "SetWallpaper" /tr "powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1" /sc onlogon /ru "$env:USERNAME"
Summary
Try the above script and method, and let me know if you want a ready-to-use scheduled task XML or further troubleshooting!
- Always set wallpaper as the first interactive user, after the desktop is initialized.
- Add
Start-Sleep(10-15s) at the start of your script to increase reliability via autounattend.- For guaranteed results, use a scheduled task at user logon if unattended/passive setup context proves unreliable.
I am looking for a script for that wallpaper download url for current user
- Joined
- Mar 14, 2023
- Messages
- 100,317
Here's a PowerShell script that will:
You can change the
- Download a wallpaper image from a URL
- Save it to the current user's Pictures folder
- Set it as the wallpaper for the current user
<FirstLogonCommands>, logon scripts, or an interactive PowerShell session. Universal PowerShell Wallpaper Setter
Code:
Start-Sleep -Seconds 10 # Wait for desktop to fully load (optional but recommended) # Specify your wallpaper download URL here:
$url = '[url]https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg[/url]' # Path to save the wallpaper
$wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" # Download the image
Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 # Set wallpaper in the registry for the current user
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath # Use user32.dll to refresh wallpaper immediately
Add-Type @'
using System.Runtime.InteropServices;
public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
'@
[NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3) # (Optional) Log action
"`n$((Get-Date).ToString Wallpaper set to $wallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -Append
How to Use
- Save as:
C:\SetupFiles\SetWallpaper.ps1 - Reference from autounattend.xml:
Code:<FirstLogonCommands> <SynchronousCommand wcm:action="add"> <Order>1</Order> <Description>Set Custom Wallpaper</Description> <CommandLine>powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1</CommandLine> </SynchronousCommand> </FirstLogonCommands> - Or run interactively:
powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1
Why This Script Is Reliable
- Waits for desktop (so you avoid race/timing issues in unattend setups)
- Uses only supported and documented Windows APIs
- Works in all editions/versions of Windows 10 and 11
- No dependencies (Invoke-WebRequest is available in all stock PowerShell 5+)
You can change the
$url to any direct image URL. If you need batch or GPO solutions, let me know!- Thread Author
-
- #9
Here's a PowerShell script that will:
This script works on any version of Windows 11 as long as you run it as the current interactive user (not as SYSTEM), such as from
- Download a wallpaper image from a URL
- Save it to the current user's Pictures folder
- Set it as the wallpaper for the current user
<FirstLogonCommands>, logon scripts, or an interactive PowerShell session.
Universal PowerShell Wallpaper Setter Code:Start-Sleep -Seconds 10 # Wait for desktop to fully load (optional but recommended) # Specify your wallpaper download URL here: $url = '[url]https://images.pexels.com/photos/5007737/pexels-photo-5007737.jpeg[/url]' # Path to save the wallpaper $wallpaperPath = "$env:USERPROFILE\Pictures\downloaded_wallpaper.jpg" # Download the image Invoke-WebRequest -Uri $url -OutFile $wallpaperPath -UseBasicParsing -TimeoutSec 30 # Set wallpaper in the registry for the current user Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath # Use user32.dll to refresh wallpaper immediately Add-Type @' using System.Runtime.InteropServices; public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); } '@ [NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3) # (Optional) Log action "`n$((Get-Date).ToString()) Wallpaper set to $wallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -AppendHow to Use
- Save as:
C:\SetupFiles\SetWallpaper.ps1- Reference from autounattend.xml:
Code:<FirstLogonCommands> <SynchronousCommand wcm:action="add"> <Order>1</Order> <Description>Set Custom Wallpaper</Description> <CommandLine>powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1</CommandLine> </SynchronousCommand> </FirstLogonCommands>- Or run interactively:
powershell.exe -ExecutionPolicy Bypass -File C:\SetupFiles\SetWallpaper.ps1Why This Script Is Reliable
- Waits for desktop (so you avoid race/timing issues in unattend setups)
- Uses only supported and documented Windows APIs
- Works in all editions/versions of Windows 10 and 11
- No dependencies (Invoke-WebRequest is available in all stock PowerShell 5+)
You can change the$urlto any direct image URL. If you need batch or GPO solutions, let me know!
you can also use existing image as wallpaper on local for script
- Joined
- Mar 14, 2023
- Messages
- 100,317
Absolutely! If you want to set a local image as the desktop wallpaper using PowerShell (no web download), you just point the script to your existing image’s path. Here’s how you do it:
If your image comes with your Windows deployment (for example, copied to
Let me know if you want this as a CMD batch script, all-users GPO, or something else!
PowerShell Script: Set Existing Local Image as Wallpaper
Code:
Start-Sleep -Seconds 10 # Wait for desktop to fully load (optional) # Set path to your existing local image
$wallpaperPath = "C:\Path\To\Your\Image.jpg" # <--- EDIT THIS PATH # Set wallpaper in the registry for the current user
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath # Use user32.dll to refresh wallpaper immediately
Add-Type @'
using System.Runtime.InteropServices;
public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
'@
[NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3) # (Optional) Log action
"`n$((Get-Date).ToString Wallpaper set to $wallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -Append
How to Use
- Save as
SetLocalWallpaper.ps1 - Run with:
powershell.exe -ExecutionPolicy Bypass -File SetLocalWallpaper.ps1 - Or automate in
<FirstLogonCommands>of yourautounattend.xml(update path accordingly).
What to Edit?
- Change:
$wallpaperPath = "C:\Path\To\Your\Image.jpg"
→ Use the actual path of your local image you want as the wallpaper (for example,C:\Wallpapers\MyFavorite.jpg).
This Will:
- Instantly set the .jpg, .png, or .bmp as the desktop wallpaper for the current user session.
- Work with any image placed locally before or during deployment.
If your image comes with your Windows deployment (for example, copied to
C:\Windows\Web\Wallpaper\Custom.jpg), just use that as the path. This script is 100% offline and works everywhere PowerShell does!Let me know if you want this as a CMD batch script, all-users GPO, or something else!
- Thread Author
-
- #11
not workingAbsolutely! If you want to set a local image as the desktop wallpaper using PowerShell (no web download), you just point the script to your existing image’s path. Here’s how you do it:
PowerShell Script: Set Existing Local Image as Wallpaper
Code:Start-Sleep -Seconds 10 # Wait for desktop to fully load (optional) # Set path to your existing local image $wallpaperPath = "C:\Path\To\Your\Image.jpg" # <--- EDIT THIS PATH # Set wallpaper in the registry for the current user Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath # Use user32.dll to refresh wallpaper immediately Add-Type @' using System.Runtime.InteropServices; public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); } '@ [NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3) # (Optional) Log action "`n$((Get-Date).ToString()) Wallpaper set to $wallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -AppendHow to Use
- Save as
SetLocalWallpaper.ps1- Run with:
powershell.exe -ExecutionPolicy Bypass -File SetLocalWallpaper.ps1- Or automate in
<FirstLogonCommands>of yourautounattend.xml(update path accordingly).What to Edit?
- Change:
$wallpaperPath = "C:\Path\To\Your\Image.jpg"
→ Use the actual path of your local image you want as the wallpaper (for example,C:\Wallpapers\MyFavorite.jpg).This Will:
- Instantly set the .jpg, .png, or .bmp as the desktop wallpaper for the current user session.
- Work with any image placed locally before or during deployment.
If your image comes with your Windows deployment (for example, copied toC:\Windows\Web\Wallpaper\Custom.jpg), just use that as the path. This script is 100% offline and works everywhere PowerShell does!
Let me know if you want this as a CMD batch script, all-users GPO, or something else!
Start-Sleep -Seconds 10 # Wait for desktop to fully load (optional)
# Set path to your existing local image
$wallpaperPath = "C:\Users\Tim Mees\Music\Klanten tools\Wallpaperpc.jpg" # <--- EDIT THIS PATH
# Set wallpaper in the registry for the current user
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value $wallpaperPath
# Use user32.dll to refresh wallpaper immediately
Add-Type @'
using System.Runtime.InteropServices;
public class NativeMethods {
[DllImport("user32.dll", SetLastError = true)]
public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
'@
[NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3)
# (Optional) Log action
"`n$((Get-Date).ToString()) Wallpaper set to $wallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -Append
- Joined
- Mar 14, 2023
- Messages
- 100,317
Your PowerShell script logic is correct, but the reason it's not working is almost certainly the space in the path (e.g.,
Key Points:
...\Klanten tools\Wallpaperpc.jpg) and/or that Windows expects the path in the registry to be double-quoted if it contains a space.Try This:
1. Enclose your path in quotes when writing to the registry:
Code:
$wallpaperPath = 'C:\Users\Tim Mees\Music\Klanten tools\Wallpaperpc.jpg' Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value "`"$wallpaperPath`""
- The backticks (`) escape the quotes inside the string in PowerShell.
2. Try copying the wallpaper to a path without spaces:
Code:
Copy-Item $wallpaperPath "$env:TEMP\Wallpaperpc.jpg"
$newWallpaperPath = "$env:TEMP\Wallpaperpc.jpg"
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value "`"$newWallpaperPath`""
- This removes any path issues with spaces or special characters.
3. The rest of your script is correct:
Code:
Add-Type @'
using System.Runtime.InteropServices;
public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
'@
[NativeMethods]::SystemParametersInfo(20, 0, $newWallpaperPath, 3)
4. Optional Logging for Debug:
"`n$((Get-Date).ToString Wallpaper set to $newWallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -AppendExample: One Complete Script
Code:
Start-Sleep -Seconds 10 # Copy to temp to ensure no spaces or access issues
Copy-Item 'C:\Users\Tim Mees\Music\Klanten tools\Wallpaperpc.jpg' "$env:TEMP\Wallpaperpc.jpg" -Force
$wallpaperPath = "$env:TEMP\Wallpaperpc.jpg" # Set registry with quotes for paths with spaces
Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name Wallpaper -Value "`"$wallpaperPath`"" Add-Type @'
using System.Runtime.InteropServices;
public class NativeMethods { [DllImport("user32.dll", SetLastError = true)] public static extern bool SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
'@
[NativeMethods]::SystemParametersInfo(20, 0, $wallpaperPath, 3) "`n$((Get-Date).ToString Wallpaper set to $wallpaperPath" | Out-File -FilePath "$env:USERPROFILE\wallpaperlog.txt" -Append
If it still doesn't work:
- Open the log file and check for errors.
- Manually browse to the image and try setting it as wallpaper through the GUI—does it work?
- Ensure the user has permissions to read the file.
- Check if
C:\Windows\Web\Wallpaperimages work when scripted (testing for image format or corrupt file, etc..
Key Points:
- Spaces in the file path are a common cause for wallpapers not applying programmatically.
- Always test with a path without spaces as a troubleshooting step.
- Some rare .jpg images with progressive JPEG or CMYK encoding may not work—try a different photo if in doubt.
wallpaperlog.txt if it still fails!Similar threads
- Replies
- 0
- Views
- 89
- Article
- Replies
- 0
- Views
- 294
- Featured
- Article
- Replies
- 1
- Views
- 19
- Replies
- 0
- Views
- 383