Как исключить запланированное задание из Защитника Windows?

565
Hex

У меня есть запланированное задание, которое должно запускаться каждые два часа со следующим действием командной строки:

  • Программа: mshta
  • Аргументы: vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'X:\Path\To\Custom\powershellScript.ps1'"""""", 0 : window.close")

Каждые два часа вместо запуска задачи я получаю:

Found some malware Windows Defender is removing it

и в истории Защитника:

Detected item Trojan:Win32/Powerssere.G

Я не хочу останавливать Защитника Windows из-за возможных последствий для безопасности. Есть ли способ добавить исключение в Defender, чтобы игнорировать задачу? ,

Я попытался добавить путь к сценарию, папку mshta.exeи powershell.exeисключения, а также ps1к типам файлов. Ничего не работает

Кстати, Защитник не удаляет задачу или скрипт, который должен быть запущен, просто останавливает его выполнение.

Пояснение :

  • Он должен быть запущен в фоновом режиме, ни одно окно не должно появляться при запуске задачи, его нужно запускать с пользователем, если он вошел в систему, я не хочу хранить пароль / запускать с другой учетной записью пользователя или самыми высокими привилегиями.

  • Сценарий должен быть выполнен как зарегистрированный пользователь. Цель этого состоит в том, чтобы изменить обои для вошедшего в систему пользователя на загруженные ( $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 } } 
4
# 1 Игнорирование хоста скрипта и powershell - действительно ужасная идея. Это очень распространенные векторы угроз, которые необходимо сканировать. HackSlash 5 лет назад 0
# 2 Почему вы используете Wscript для вызова powershell? Почему бы просто не запустить свой скрипт из Task Sched? Это должно исправить проблему обнаружения. HackSlash 5 лет назад 1
@HackSlash, потому что его запуск обычно заставляет окно появляться каждые два часа. Это настольный компьютер, я не хочу, он должен работать полностью в фоновом режиме. Hex 5 лет назад 0
Сценарий должен быть запущен как вошедший в систему пользователь (_Run только когда пользователь вошел в систему_). Hex 5 лет назад 0
... так ваша задача запускает HTA, который запускает VBScript, который запускает PowerShell, который запускает rundll32 для вызова функции, даже не предназначенной для вызова из rundll32? Не удивляйтесь, если другие программы сочтут это подозрительным. grawity 5 лет назад 1
Но для начала вы пробовали 1) запустить VBScript через `wscript`, а не через MSHTA? 2) избегать слоя PowerShell и делать все через VBScript? Он также может читать и записывать реестр. grawity 5 лет назад 1

3 ответа на вопрос

3
postanote

Опять же, как уже отмечалось, если вы делаете это, это просто действие типа вируса и должно быть заблокировано.

Как отмечает @HackSlash, это правильный способ сделать это.

Когда вы говорите, что Windows появляется из-за этого, и это должно произойти, потому что вы запускаете новую оболочку, а оболочка должна запускаться и показываться как активная. Вы можете просто добавить свойство WindowStyle -minimize или -hidden, чтобы уменьшить это.

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

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

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

-WindowStyle

Устанавливает стиль окна для сеанса. Допустимые значения: Normal, Minimized, Maximized и Hidden.

Или этот подход, так как даже вышеупомянутое окно все еще будет мигать.

Как скрыть приглашение PowerShell

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

Или этот

Подлый PowerShell Trick: полностью без окна

static void Main (string [] args)

https://workingsysadmin.com/sneaky-powershell-trick-run-completely-without-a-window

Я знаю, что это правильный способ сделать это, в моем планировщике задач у меня есть много сценариев, запланированных таким образом, но они могут выполняться в фоновом режиме (потому что, например, они просто загружают, сжимают и сохраняют что-то). Это не может Смотрите мои разъяснения в оригинальном посте. Hex 5 лет назад 0
Вы можете просто добавить свойство WindowStyle -minimize или -hidden, чтобы уменьшить это. Нет. Как вы написали, он все еще высовывается на несколько миллисекунд. Я пробовал это раньше. Другое решение также не работает - окно все еще выскакивает, второе - C #, с которым я не хочу беспокоиться. Hex 5 лет назад 1
1
HackSlash

Событие обнаружения происходит из-за использования небезопасного метода для вызова PowerShell. Не используйте Wscript для вызова Powershell, это может сделать только вирус. ;-D

Попробуйте этот метод вызова вашего скрипта:

  • Программа: powershell.exe
  • Аргументы: -ExecutionPolicy Bypass -NoLogo -NonInteractive -WindowStyle Hidden X:\Path\To\Custom\powershellScript.ps1
Да, я знаю об этом методе, но это заставляет окно выскакивать. Смотрите мои разъяснения в оригинальном посте. Hex 5 лет назад 0
Запустите его от имени другого пользователя и дайте ему возможность работать, когда вы не вошли в систему. Это предотвратит его запуск в контексте вашего текущего пользователя. HackSlash 5 лет назад 0
Мой скрипт вызывает `RUNDLL32.EXE USER32.DLL, UpdatePerUserSystemParameters 1, True` для обновления обоев, которые должны выполняться при входе пользователя в систему, иначе не будет работать. Hex 5 лет назад 1
Давайте добавим "-NoLogo -NonInteractive -WindowStyle Hidden" HackSlash 5 лет назад 0
0
postanote

Что касается этого ...

Мой сценарий вызывает RUNDLL32.EXE USER32.DLL, UpdatePerUserSystemParameters 1, True для обновления обоев, которые должны выполняться при входе пользователя в систему, иначе не будет работать

Вы пытаетесь использовать удаленный пользовательский контекст, чтобы работать в локальном пользовательском контексте. Это граница безопасности Windows, так было всегда. Так что проблема не в PowerShell.

Из-за этого нарушения границы безопасности Windows PowerShell не допускает этого.

Кроме того, есть другие способы сделать это против метода, который вы пытаетесь.

Если вам действительно нужно сделать это, во-первых, на предприятии, для этого и нужны GPO. Есть шланги, которые не могут использовать GPO по любой причине. Итак, они пытаются этот подход, и он не работает, потому что он не предназначен для.

Итак, если вам нужно использовать удаленный локальный пользовательский контекст, то вам нужно использовать опцию 3rdP, например SysInternals PSExec, как обсуждалось здесь ...

Как запустить программу для удаленно вошедшего в систему пользователя в Windows

Вы можете сделать это с PsExec, убедитесь, что у вас есть права на запуск приложений для него. Команда psexec \ computer -u user -i -d

-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 (Registry) для пользователя.

Вы можете создать запланированную задачу, которая будет выполняться один раз при входе в систему для пользователя или другой точки дня.

Итак, отступите немного назад и подумайте о других возможностях, вместо того, чтобы затормозить это усилие, которое действительно не предназначено для того, чтобы вы оказались там, где вы пытаетесь пойти.