Wie kann eine geplante Aufgabe von Windows Defender ausgeschlossen werden?

354
Hex

Ich habe eine Aufgabe geplant, die alle zwei Stunden mit der folgenden Befehlszeilenaktion ausgeführt werden sollte:

  • Programm: mshta
  • Argumente: vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'X:\Path\To\Custom\powershellScript.ps1'"""""", 0 : window.close")

Alle zwei Stunden, anstatt die Aufgabe auszuführen, bekomme ich:

Found some malware Windows Defender is removing it

und in der Geschichte des Verteidigers:

Detected item Trojan:Win32/Powerssere.G

Ich möchte Windows Defender nicht stoppen, da dies möglicherweise Auswirkungen auf die Sicherheit hat. Gibt es eine Möglichkeit, in Defender einen Ausschluss hinzuzufügen, um die Aufgabe zu ignorieren? .

Ich habe versucht, sowohl Skriptpfad, Ordner mshta.exeund powershell.exeAusschlüsse als auch ps1Dateitypen hinzuzufügen . Nichts funktioniert.

Im Übrigen entfernt Defender die Aufgabe oder das Skript nicht, das ausgeführt werden soll, sondern stoppt nur die Ausführung.

Klarstellung :

  • Es muss im Hintergrund ausgeführt werden, es sollte kein Fenster beim Ausführen der Aufgabe angezeigt werden. Es muss mit dem Benutzer ausgeführt werden, wenn er angemeldet ist. Ich möchte kein Kennwort speichern / mit einem anderen Benutzerkonto oder höchsten Berechtigungen ausführen.

  • Das Skript muss als angemeldeter Benutzer ausgeführt werden. Es dient dazu, das Hintergrundbild für den eingeloggten Benutzer in ein heruntergeladenes ( $picturePathvariables) zu ändern . Auszug:

 $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 } } 
4
# 1 Das Ignorieren des Skript-Hosts und der Powershell ist eine wirklich schreckliche Idee. Dies sind sehr häufige Bedrohungsvektoren, die gescannt werden müssen. HackSlash vor 3 Jahren 0
# 2 Warum verwenden Sie Wscript, um Powershell anzurufen? Warum führen Sie Ihr Skript nicht einfach über Task Sched aus? Das sollte das Erkennungsproblem beheben. HackSlash vor 3 Jahren 1
@HackSlash, da das Fenster normalerweise alle zwei Stunden ausgeführt wird. Dies ist eine Desktop-Maschine, ich möchte es nicht, es sollte vollständig im Hintergrund laufen. Hex vor 3 Jahren 0
Das Skript muss als angemeldeter Benutzer ausgeführt werden (_Run nur, wenn der Benutzer angemeldet ist_). Hex vor 3 Jahren 0
..so führt Ihre Task eine HTA aus, auf der ein VBScript ausgeführt wird, auf dem PowerShell ausgeführt wird, auf der rundll32 ausgeführt wird, um eine Funktion aufzurufen, die nicht einmal für den Aufruf von rundll32 gedacht ist. Seien Sie nicht überrascht, wenn andere Programme dies als verdächtig empfinden. grawity vor 3 Jahren 1
Aber haben Sie zuerst einmal versucht, 1) VBScript über `wscript 'statt über MSHTA auszuführen? 2) Vermeiden Sie die PowerShell-Ebene und machen Sie alles über VBScript? Es kann auch Registry lesen und schreiben. grawity vor 3 Jahren 1

3 Antworten auf die Frage

3
postanote

Wie bereits erwähnt, handelt es sich hierbei lediglich um eine Virusaktion und sollte blockiert werden.

Wie @HackSlash anmerkt, ist dies der richtige Weg.

Wenn Sie aus diesem Grund ein Windows-Pop-Out sagen, und es sollte, weil Sie eine neue Shell starten und die Shell starten und als aktiv anzeigen muss. Sie können einfach die WindowStyle-Eigenschaft -minimize oder -hidden hinzufügen, um dies zu verringern.

https://docs.microsoft.com/de-de/powershell/scripting/core-powershell/console/powershell.exe-command-line-help?view=powershell-6

PowerShell [.exe] [-Befehl {- | [-args] | []}] [-EncodedCommand] [-ExecutionPolicy] [-File []] [-InputFormat ] [-Mta] [-NoExit] [-NoLogo] [-NonInteractive] [-NoProfile] [-OutputFormat ] [-PSConsoleFile | -Version] [-Sta] [-WindowStyle]

PowerShell [.exe] -Hilfe | -? | /?

-WindowStyle

Legt den Fensterstil für die Sitzung fest. Gültige Werte sind Normal, Minimiert, Maximiert und Ausgeblendet.

Oder dieser Ansatz, da auch das obere Fenster noch kurzzeitig aufleuchten wird.

So blenden Sie eine PowerShell-Eingabeaufforderung aus

http://jeffwouters.nl/index.php/2015/09/howto-hide-a-powershell-prompt

Oder dieses

Hinterlistiger PowerShell-Trick: Führen Sie vollständig ohne Fenster aus

static void Main (string [] args)

https://workingsysadmin.com/sneaky-powershell-trick-run-completly-ohne-a-

Ich weiß, dass dies der richtige Weg ist. In meinem Task-Scheduler habe ich viele Skripts auf diese Weise geplant, aber sie können im Hintergrund ausgeführt werden (weil sie z. B. etwas herunterladen, komprimieren und speichern). Das kann nicht. Siehe meine Klarstellung im ursprünglichen Beitrag. Hex vor 3 Jahren 0
_Sie können einfach die WindowStyle-Eigenschaft -minimize oder -hidden hinzufügen, um das zu verringern._. Nein. Wie Sie geschrieben haben, springt es immer noch für ein paar Millisekunden heraus. Ich habe das schon mal probiert. Die andere Lösung funktioniert auch nicht - das Fenster springt immer noch heraus, die zweite ist C #, mit der ich mich nicht wirklich beschäftigen möchte. Hex vor 3 Jahren 1
1
HackSlash

Das Erkennungsereignis wird dadurch verursacht, dass Sie eine unsichere Methode zum Aufrufen von PowerShell verwenden. Verwenden Sie kein Wscript, um Powershell aufzurufen, das würde nur ein Virus tun. ;-D

Versuchen Sie diese Methode, um Ihr Skript aufzurufen:

  • Programm: powershell.exe
  • Argumente: -ExecutionPolicy Bypass -NoLogo -NonInteractive -WindowStyle Hidden X:\Path\To\Custom\powershellScript.ps1
Ja, ich kenne diese Methode, aber das Fenster springt heraus. Siehe meine Klarstellung im ursprünglichen Beitrag. Hex vor 3 Jahren 0
Führen Sie es als einen anderen Benutzer aus und lassen Sie es laufen, wenn es nicht angemeldet ist. Dadurch wird verhindert, dass es unter Ihrem aktuellen Benutzerkontext ausgeführt wird. HackSlash vor 3 Jahren 0
Mein Skript ruft `RUNDLL32.EXE USER32.DLL, UpdatePerUserSystemParameters 1, True 'zum Aktualisieren des Hintergrunds auf, das ausgeführt werden muss, wenn der Benutzer angemeldet ist, sonst funktioniert es nicht. Hex vor 3 Jahren 1
Fügen Sie "-NoLogo -NonInteractive -WindowStyle Hidden" hinzu. HackSlash vor 3 Jahren 0
0
postanote

Was das angeht ...

Mein Skript ruft RUNDLL32.EXE USER32.DLL, UpdatePerUserSystemParameters 1, True auf, um das Hintergrundbild zu aktualisieren, das ausgeführt werden muss, wenn der Benutzer angemeldet ist. Andernfalls funktioniert es nicht

Sie versuchen, einen Remote-Benutzerkontext zu verwenden, um ihn in einem lokalen Benutzerkontext auszuführen. Dies ist eine Windows-Sicherheitsgrenze. Also kein PowerShell-Problem.

PowerShell lässt dies aufgrund dieser Verletzung der Windows-Sicherheitsgrenzen nicht nativ zu.

Es gibt auch andere Möglichkeiten, dies zu tun als die Methode, die Sie versuchen.

Wenn Sie dies in einem Unternehmen wirklich tun müssen, sind dies die GPOs. Es gibt Schläuche, die GPO aus irgendeinem Grund nicht verwenden können. Also versuchen sie diesen Ansatz und es funktioniert nicht, weil es nicht dafür gedacht ist.

Wenn Sie also einen entfernten lokalen Benutzerkontext verwenden müssen, müssen Sie eine 3rdP-Option wie SysInternals PSExec wie hier beschrieben verwenden.

Ausführen eines Programms für einen remote angemeldeten Benutzer in Windows

Sie können dies mit PsExec tun. Stellen Sie sicher, dass Sie über die erforderlichen Berechtigungen zum Ausführen von Anwendungen für ihn verfügen. psexec \ computer -u Benutzer -i -d Befehl

-u bedeutet Benutzer, -i macht es interaktiv, sodass der Benutzer es sieht, -d stellt sicher, dass der Befehl nicht wartet

"superuser.com/questions/176249/wie-nach-run-a -programm-für-remotely-logged-in-user-in-windows '

... oder AutoIT.

Sie könnten auch ein natives .ps1-Skript erstellen und so etwas tun ...

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") 

... und setzen Sie es als RunOnce-Option (Registry) für den Benutzer.

Sie können eine einmalige geplante Task erstellen, die einmalig bei der Anmeldung für den Benutzer oder zu einem anderen Zeitpunkt am Tag ausgeführt wird.

Treten Sie also ein wenig zurück und denken Sie über andere Möglichkeiten nach, diese Anstrengung zu stoppen, die wirklich nicht dazu gedacht ist, Sie dahin zu bringen, wo Sie hin wollen.