我已经安排了每两小时运行一次的任务,使用以下命令行操作:
- 程序:
mshta
- 参数:
vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'X:\Path\To\Custom\powershellScript.ps1'"""""", 0 : window.close")
每隔两个小时,我得到的不是运行任务,而是:
在 Defender 历史记录中:
我不想停止 Windows Defender,因为这样做可能会带来安全隐患。有没有办法在 Defender 中添加排除以忽略任务?。
我尝试添加脚本路径、文件夹mshta.exe
和powershell.exe
排除项以及ps1
文件类型。但都不起作用。
顺便说一句,Defender 不会删除任务或应该运行的脚本,只是停止其运行。
澄清:
它必须在后台运行,任务运行时不应弹出任何窗口,如果用户登录,它必须与用户一起运行,我不想存储密码/使用其他用户帐户或最高权限运行。
该脚本必须以登录用户的身份执行。其目的是将登录用户的壁纸更改为下载的壁纸(
$picturePath
变量)。摘录:
$registryPropertyPath = "HKCU:\Control Panel\Desktop\"
$registryPropertyName = "Wallpaper"
$wallpaperProperty = (Get-ItemProperty -Path $registryPropertyPath -Name $registryPropertyName).WallPaper
if ($wallpaperProperty -ne $picturePath) {
Set-ItemProperty -Path $registryPropertyPath -Name $registryPropertyName -Value $picturePath
for ($i = 0; $i -lt 20; $i++) {
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True
}
}
答案1
至于这个...
我的脚本调用 RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True 来更新壁纸,必须在用户登录时执行,否则将不起作用
您正在尝试使用远程用户上下文在本地用户上下文中运行。这一直是 Windows 安全边界。因此,这不是 PowerShell 问题。
由于违反了 Windows 安全边界,PowerShell 本身不会允许这种做法。
此外,与您尝试的方法相比,还有其他方法可以做到这一点。
如果您确实需要这样做,首先,在企业中,这就是 GPO 的用途。有些企业出于某种原因无法使用 GPO。因此,他们尝试了这种方法,但没有成功,因为它不是为此设计的。
因此,如果您需要使用远程本地用户上下文,那么您需要使用 3rdP 选项,如此处讨论的 SysInternals PSExec...
如何在 Windows 中为远程登录用户运行程序
您可以使用 PsExec 执行此操作,请确保具有为其运行应用程序的正确权限。psexec \computer -u user -i -d command
-u 表示用户,-i 使其可交互,以便用户可以看到它,-d 确保命令不会等待
“superuser.com/questions/176249/how-to-run-a-program-for-a-remotely-logged-in-user-in-windows”
... 或 AutoIT。
您还可以创建一个本机.ps1 脚本,执行类似这样的操作......
cp "image.jpg" \\<IP>\C$
$RemoteReg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('Users', "<IP>")
$WallPaper= $RemoteReg.OpenSubKey("S-1-5-21-780093305-1579027723-3042286928-500\Control Panel\Desktop",$True)
$WallPaper.SetValue("Wallpaper","C:\image.jpg")
...并将其设置为用户的 RunOnce 选项(注册表)。
您可以创建一次性计划任务,在用户登录时或一天中的其他时间运行一次。
因此,退一步考虑一下其他选择,而不是阻碍这项并非真正旨在帮助您实现目标的努力。
答案2
再次强调,如上所述,如果您这样做,这只是一种病毒类型的操作,应该被阻止。
正如@HackSlash 所说,这是正确的方法。
当您说 Windows 弹出时,这是因为您正在启动一个新 shell,并且该 shell 必须启动并显示为活动状态。您只需添加 WindowStyle 属性 -minimize 或 -hidden 开关即可减少这种情况。
PowerShell[.exe] [-命令 { - | [-args ] | [] } ] [-EncodedCommand ] [-ExecutionPolicy ] [-文件 []] [-输入格式 {文本 | XML}] [-Mta] [-NoExit] [-NoLogo] [-NonInteractive] [-NoProfile] [-输出格式 {文本 | XML}] [-PSConsoleFile | -Version ] [-Sta] [-WindowStyle ]
PowerShell[.exe] -帮助| -? | /?
-WindowStyle
设置会话的窗口样式。有效值为正常、最小化、最大化和隐藏。
或者这种方法,因为即使是上面的窗口仍然会瞬间闪烁。
如何隐藏 PowerShell 提示符
http://jeffwouters.nl/index.php/2015/09/howto-hide-a-powershell-prompt
或者这个
巧妙的 PowerShell 技巧:完全无需窗口即可运行
静态 void Main(string[] args) { var powershell = PowerShell.Create(); powershell.AddScript(@" Get-ChildItem -Path c:\temp | out-file c:\temp\shh.txt "); var handler = powershell.BeginInvoke(); while (!handler.IsCompleted) Thread.Sleep(200); powershell.EndInvoke(handler); powershell.Dispose(); }
https://workingsysadmin.com/sneaky-powershell-trick-run-completely-without-a-window
答案3
检测事件源自您使用不安全的方法调用 PowerShell。不要使用 Wscript 调用 Powershell,只有病毒才会这样做。;-D
尝试使用这种方法调用你的脚本:
- 程序:
powershell.exe
- 参数:
-ExecutionPolicy Bypass -NoLogo -NonInteractive -WindowStyle Hidden X:\Path\To\Custom\powershellScript.ps1