Powershell为当前登录用户更改Windows 10上的壁纸

Posted

技术标签:

【中文标题】Powershell为当前登录用户更改Windows 10上的壁纸【英文标题】:Powershell change wallpaper on windows 10 for current logged on user 【发布时间】:2021-02-20 03:56:51 【问题描述】:

我遇到了一个要解决的挑战,就是要在办公室里找点乐子。因此,我尝试设置一个带有 Windows Server 2012 R2 和客户端 Windows 10 的 VM 实验室来进行测试。

我面临的挑战:

Windows 10 在设置时并不总是刷新壁纸,使用 psexec 使用命令:

rundll32.exe user32.dll, UpdatePerUserSystemParameters, 1, true

这似乎是由于 rundll32.exe 或 user32.dll 的限制,不知道为什么。

我必须使用我创建的新主题,将其复制到客户端并使用 psexec 加载它以立即将其呈现给用户,而无需注销或重新启动。尽管有时它只是不起作用,或者只是使背景变黑,就像当我多次运行脚本时它会完全删除墙纸一样,以确保即使我运行了多少次它也能正常工作。请记住,此脚本取决于客户端是否在线,这意味着 DNS 工作正常,您也可以 ping 主机。

如何确保墙纸始终处于刷新状态且正常工作? - 有没有更好的方法可以找到,然后请告诉我,因为我试图在互联网上搜索,但找不到任何像我迄今为止通过 powershell 在 Windows 10 上所做的那样好的方法。

我目前正在使用的脚本如下:

在此处下载源代码:

将 this 保存为 ChangeDesktopBackgroundRemotely.ps1 -- 您运行的主脚本 将this 保存为服务器上“C:\tmp”中的newtheme.theme 将this 保存为服务器上“C:\tmp”中的refreshbg.ps1 将FCK.jpg 保存为服务器上“C:\tmp”中的 FCK.jpg 将aalborg.jpg 保存为 aalborg.jpg 在您服务器上的“C:\tmp”中

【问题讨论】:

当您可以在GPO 中执行此操作时,为什么还要编写此脚本? @postanote - 是的,确实如此,但由于我在办公室运行它,我无法访问 GPO,所以我使用 psexec 来解决这个问题,我可以看到它正在运行执行此操作时在另一台 PC 上使用 powershell 脚本,因此它可以工作 - 但无论我运行脚本多少次,壁纸的意图总是会改变,但它只是没有。它要么移除了bagground,要么移除了其他bagground。我正在我的 VM 实验室中使用 windows 10 和 windows server 2012 R2 测试 atm,所以它应该能够在没有 GPO 的情况下工作,这就是整个想法。 【参考方案1】:

编辑2

备注此功能适用于允许用户自定义环境的应用程序。

结束编辑2


编辑

通过使用 PsExec,您可以在目标计算机上的不同桌面中启动程序。这是一个安全的事情。没有人可以与已登录的用户混淆。

您正在更改隐形桌面的壁纸。

正如我所说,使用任务计划程序 仅在用户登录时运行

结束编辑


只有一种支持的墙纸更换方式。

Public Declare Unicode Function SystemParametersInfoW Lib "user32" (ByVal uAction As Integer, ByVal uParam As Integer, ByVal lpvParam As String, ByVal fuWinIni As Integer) As Integer
Public Const SPI_SETDESKWALLPAPER = 20
Public Const SPIF_SENDWININICHANGE = &H2
Public Const SPIF_UPDATEINIFILE = &H1

Ret = SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, FName, SPIF_SENDWININICHANGE + SPIF_UPDATEINIFILE)

见https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfow

另请参阅https://docs.microsoft.com/en-au/windows-server/administration/windows-commands/rundll32,它说 “Rundll32 只能从明确编写为由 Rundll32 调用的 DLL 调用函数”

必须这样写

 void CALLBACK
 EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); 

在编程中,我们编写合同代码,即规范。所以你唯一会搜索的地方是https://docs.microsoft.com。

【讨论】:

如何将其放入 powershell 脚本中? :)。看起来您在这里使用的功能与我在我发布的 powershell 脚本中使用的功能相同:将此pastebin.com/5YhaeTfT 保存为服务器上“C:\tmp”中的 refreshbg.ps1。但我也不是在寻找“支持”的方式,我只是在寻找一种每次都可以在 Windows 10 上运行的方式 :-) 我只是在寻找一种每次都可以在 Windows 10 上运行的方式,这将是受支持的方式。您的答案在 Powershell 帮助中。见devblogs.microsoft.com/scripting/… 好的,如果您要编辑 powershell 脚本以实施您建议的解决方案 - 您会怎么做? - 像这样 ? pastebin.com/cpzZr0T7 我不是 powershell 程序员,它是一种可憎的语言。这是使用另一种内置 Windows 语言的方法winsourcecode.blogspot.com/2019/06/changewallpaper.html @user14122392,[仅支持一种更改壁纸的方式。]。这不是真的。几十年来,这一直是通过 GPO 实现的,doing it via PowerShell script 已经被很好地覆盖了很长时间。 “可憎”的感觉,是一种对任何语言都可以采取的立场; 4 多年后,我看到了我的份额。恕我直言 PS 不是其中之一。

以上是关于Powershell为当前登录用户更改Windows 10上的壁纸的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ssms 中更改用户通过 powershell 连接到数据库引擎的权限?

脚本powershell后当前用户的弹出消息

更改 Powershell 会话的当前文化,特定于 v3.0+

如何在 Windows PowerShell 中获取当前用户名?

怎么用BAT或者powershell获取主机名和登录用户保存到TXT文件中,或者用其他啥方式?

window脚本代码不执行下一步