Arhn - архитектура программирования

Как я могу узнать из скрипта .bat- (или .ps1-), был ли он запущен планировщиком задач?

Мне действительно интересно, поскольку вопрос сформулирован, но мне нужен механизм для временного отключения запланированного запуска (на нескольких серверах с общим диском), но при этом иметь возможность запускать его в интерактивном режиме (если сценарий может быть сделано, чтобы сказать, запущено ли оно из планировщика задач или нет). Внешний флаг (наличие файла) казался простым способом сделать это.

Первым вариантом было использование «% SESSIONNAME%», который кажется пустым при запуске из планировщика, хотя это также имеет место при запуске из powershell (с Start-Process, который может быть вариантом для разрешенного использования при отключении).

РЕДАКТИРОВАТЬ: второй вариант с использованием команды whoami cmd кажется более многообещающим, он сообщает, что пользователь принадлежит к группе NT AUTHORITY\BATCH при запуске из планировщика задач (но не при интерактивном запуске). Могу ли я выстрелить себе в ногу, используя это - можно ли добавить пользователя в эту группу «навсегда» за моей спиной?

Мы на Windows Server 2012 R2. Решение PowerShell было бы интересным, так как, вероятно, можно было бы использовать оболочку (или даже модифицировать/переписать с .bat на .ps1).


  • Заставить запланированную версию передать летучей мыши /sched командную строку? 09.12.2014
  • Спасибо, вы имеете в виду аргумент командной строки? Почти обман ;-) 09.12.2014
  • Конечно, мне кажется приемлемым подходом 09.12.2014
  • Конечно (и спасибо), я вполне мог бы это сделать, но я бы предпочел, чтобы эта логика была скрыта в сценарии. Если это разумно выполнимо, это может пригодиться для других сценариев. 09.12.2014
  • Класс .Net [System.Security.Principal.WindowsIdentity] имеет несколько интересных свойств. [System.Security.Principal.WindowsIdentity]::GetCurrent().Name даст мне учетную запись пользователя, которая в данном случае будет (или может быть сделана) конкретной учетной записью. Хотя все равно обманывают. 12.12.2014

Ответы:


1

Per @Alex K.: передача отдельного аргумента, чтобы сигнализировать о том, что мы работаем в запланированном контексте, работает нормально. Простые, надежные методы, которые не требуют от вас каких-либо знаний о сторонних компонентах — в моем понимании мы называем это «победами», а не «обманами».

Если вы действительно хотите, вы можете проверить, что вы буквально спрашиваете — если мы работаем из планировщика заданий — проверив свойства нашего родительского процесса. Из PowerShell это вполне выполнимо, не знаю о старых пакетных файлах:

$parentpid = (gwmi "win32_process where (ProcessId = $pid)").parentprocessid
$parentname = (gwmi "win32_process where (ProcessId = $parentpid)").name
if ($parentname -eq 'taskeng.exe') {
    "I think this is Task Scheduler, or maybe something else a hacker named taskeng.exe, who knows?"
} else {
    "This is not Task Scheduler. Probably."
}

Конечно, это может сломаться, если однажды MS переименует процесс, или если вы захотите использовать что-то другое, кроме TS, для автоматического запуска сценария, или даже если сценарий вызывает другой процесс, который, в свою очередь, вызывает сценарий.

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

15.12.2014
  • Здорово! Насчет выигрышей/читов полностью согласен - это был чит только как ответ на вопрос, а не как надежный способ решения проблемы. 17.12.2014
  • Архивное примечание: этот метод, к сожалению, получает не «taskeng.exe» в качестве родителя, а «svchost.exe», который, вероятно, еще менее полезен, чем taskeng. Однако он отличает запускаемый пользователем запуск от запланированного. (спасибо @Jeroen, для рассматриваемой проблемы я буду придерживаться подхода с отдельным аргументом, хотя я хотел изучить стек вызовов с проверкой.) 08.01.2015
  • @perostb: я тестировал это в Windows 7 с запланированной пользователем задачей, где родительским процессом является taskeng.exe. Но, как я уже упоминал, это довольно хрупко, потому что нет никакой гарантии, что это так. 08.01.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..