Програма не працює належним чином, як заплановане завдання


12

Ситуація

У мене є пакетний сценарій, який готує деякі файли, виконує програму ( .exe), а потім видаляє вказані файли.

Це завдання має виконуватися щогодини, тому я намагаюся налаштувати це за допомогою запланованих завдань. Проблема полягає в тому, що згадана раніше програма не працює належним чином при виклику із завдання (ні через .batскрипт, ні при .exeбезпосередньому виклику ), але я не отримую жодних попереджень або повідомлень про помилки в журналах.

Налаштування

Завдання налаштовано на запуск облікового запису служби Windows, який має всі привілеї, встановлені належним чином. Під час використання цього облікового запису для входу через RDP, я можу виконати функцію .batта .exeбезпосередньо без проблем, але все одно, здається, завдання нічого не робить. Це легко помітити, оскільки програма завжди модифікує файл, а змінена на часовій позначці не змінюється через завдання.

У запланованих журналах завдань я отримую інформаційні повідомлення для завдання, починаючи процес, закриваючи і т. Д. "Код результату", однак, є 111(спробував Google це без удачі. Єдина асоціація, яку я отримую - це "назва файлу задовга ", що просто абсолютно не має значення для AFAIK). У журналах додатків я не отримую абсолютно нічого.

Я підозрюю, що це проблема

Програма - це давня жахливість, яка породжує якийсь екран сплеску (це насправді нормальне вікно), хоча графічний інтерфейс не потрібен, оскільки він не потребує взаємодії і закривається після операцій. Вікно з’являється приблизно на 2 секунди.

Я підозрюю, що ця вимога до GUI має щось спільне з тим, що завдання не виконане, але я не впевнений. Коли я входжу з користувачем, під яким виконується завдання (через RDP), під час запуску запланованого завдання не з'являється вікна.


Редагувати про GUI

Я створив дуже маленький виконуваний файл C #, який запускає програму без головного вікна (використовуючи ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden). Навіть таким чином заплановане завдання все-таки не вдається запустити програму належним чином, але код повернення зараз є 0.


Оновлення

Коли я налаштовую завдання сказати "запустити, чи користувач увійшов чи ні", а run with highest privilegesпараметр не встановлено , значення помилки є 2147943859.


Що я можу зробити для усунення несправностей?

ОС = Windows Server 2008 R2 SP1

Якщо вам потрібна додаткова інформація, будь ласка, повідомте мене про це у коментарях.


Чи приймають ваш сценарій та "програма" будь-які дані, як параметри чи параметри? Ви намагалися використовувати PowerShell замість пакетної? Запускаючи .exe"програму" з параметрами всередині сценарію, введення має бути належним чином подано як аргумент.
slybloty

1
Ви спробували планувальник з іншою програмою? Просто замініть одну програму на іншу та подивіться, які результати ви отримаєте.
slybloty

2
@ out-null Я не думаю, що планувальник завдань використовує вікно, щоб знати, коли програма закінчиться, він повинен чекати процесу, що б там не було з Windows. Але якщо програма намагається шукати щось конкретне, щоб створити свій екран сплеску (скажімо, панель завдань) і не зможе його знайти (оскільки він працює на окремій робочій станції / віконній станції), можливо, це зупиняється ...
Але

1
ГАРАЗД. Ви спробували запустити його в обліковому записі LocalSystem? Також ви спробували відстежувати подію запуску процесу за допомогою Monitor Monitor від Sysinternals?
Lucky Luke

1
@BradBouchard Незважаючи на те, що ваша відповідь може не вирішити питання щодо ОП в даному конкретному випадку, вона є коректною відповіддю і може бути корисною для майбутніх відвідувачів ДФ, і тому я б рекомендував не видаляти її.
Я кажу, відновіть Моніку

Відповіді:


6

Я вважаю, що ваша проблема пов'язана з дозволами облікового запису, який використовується для виконання завдання, або з контекстом облікового запису, який існує при спробі виконання завдання.

Тест на вимогу сеансу консолі

Можливо, ваш .EXE потрібно запустити в Consoleсеансі (він же сесія 0) на комп'ютері. Щоб перевірити це:

  1. Налаштуйте завдання для запуску лише тоді, коли користувач увійшов у систему та вкажіть час початку завдання 2 хвилини
  2. Увійдіть на машину з тим самим обліковим записом користувача, який використовується для виконання завдання (бажано, увійдіть на сеанс консолі, фізично перебуваючи на консолі або використовуючи програму віддаленого доступу, яка надає доступ до консолі. Щоб підтвердити, ви використовуєте на консольному сеансі, запустивши командний рядок QWINSTA, спостерігайте за SESSIONNAMEстовпцем та переконайтесь, що >індикатор знаходиться поруч console, іншими словами він має відображатися як >console)
  3. Дочекайтеся виконання завдання

Якщо завдання виконується правильно, спробуйте запланувати його за SCHTASKS.EXEдопомогою /ITпараметра. Якщо цього не зробити, можливо, у вас не залишиться іншого вибору, як налаштувати комп'ютер для автоматичного входу в систему як обліковий запис користувача служби та запустити завдання в якості програми запуску.

Перевірте дозволи

Крім того, як я вже запропонував, перевірте наступне, щоб підтвердити належний доступ до облікового запису, який використовується для виконання завдання:

  1. Надайте обліковий запис Логін як право користувача пакетної роботи (знайдено в локальній груповій політиці на Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments)
  2. Переконайтесь, що завдання налаштовано на Виконати з найвищими правами
  3. Переконайтеся, що користувач має повні дозволи NTFS для всіх папок і файлів, з якими він повинен взаємодіяти. Не допускайте припущень; натомість підтвердіть, перейшовши до таких файлових місць та скориставшись Effective Permissionsвкладкою у Властивості файлу / папки наSecurity > Advanced

Додаткові речі для перевірки / спробу

  • Чи вимагає завдання доступ до доступу до мережевих ресурсів? Такі речі, як зіставлені накопичувачі, можуть бути присутнім під час входу з обліковим записом користувача, але залежно від конфігурації сервера може не бути присутнім у контексті облікового запису користувача, коли виконується з Планувальника завдань.
  • Додайте трохи журналів у свій пакетний файл. Після кожного рядка, який він виконує, запропонуйте йому записати деякий вихід у файл журналу, щоб ви знали, де він застряє. Наприклад:

    @echo off
    echo Line 1 >> "C:\MyLog.txt"
    "C:\My Folder\myOldProgram.exe"
    echo Line 2 >> "C:\MyLog.txt"
    DEL somefile.dat
    echo Line 3 >> "C:\MyLog.txt"
    
  • Спробуйте запустити свій .EXE з START, наприклад ,START "myTitle" "C:\full\path\to\my.EXE"


2

Я відповідаю на стару публікацію, якщо вона допомагає комусь іншому. У мене було те саме питання. Журнал подій сказав, що програма завершується нормально, але навіть перший рядок коду не запише в журнал. Це в кінцевому підсумку було варіантом "Почати в" у Планувальнику завдань. Мені прийшло в голову, що програма працювала нормально з командного рядка, коли я був у поточному каталозі. У одному каталозі є файли маніфесту та інші залежності. Отже, якщо ви скажете заплановану роботу почати в тому ж каталозі, що і EXE, ви можете отримати сприятливі результати. Це було рішення для мене.


Це було рішенням для запуску користувальницької програми консолі, розробленої у Visual Studio з підтримуючими конфігураційними файлами.
billfredtom

1

можливо, це вам допомагає?

/programming/6939548/a-workaround-for-the-fact-that-a-scheduled-task-in-windows-requires-a-user-to-be

У нас була подібна проблема, і ваше єдине рішення полягало в тому, що ми зробили спеціальний обліковий запис на сервері з автологіном. Тож якщо завдання виконувалося під уже зареєстрованим у користувачеві, наш .exe добре працював ...

я знаю, що це не дуже приємне рішення, але для нас це було єдине, що працювало. я не знаю, чи працює це для вас ... (Але при цій роботі ви повинні перевірити, чи дійсно користувач увійшов у систему весь час ...)


Завдання для мене навіть не працює належним чином, коли користувач, під яким він працює, фактично увійшов (через RDP). Я використовую обліковий запис служби для входу через RDP, запускаю завдання вручну, і я не бачу вікна.
MarioDS

2
Ви не перевірили варіант "запустити з найвищими привілеями"? Я думаю, що коли ви перевірили цю опцію, відбудеться евеляція прав (UAC), і ви не побачите вікна, навіть коли користувач увійде в систему (буде викликано в окремий сеанс без вікна і вийде з ладу). Спробуйте також вибрати опцію "налаштовано для" -> "Windows Server 2003, Windows XP або Windows 2000".
frupfrup

Це, мабуть, не має ніякої різниці, за винятком випадків, коли я встановив "запустити, чи користувач увійшов чи ні", я отримую код помилки 2147943859. Я можу встановити "Конфігурований для" лише на Windows Vista/Windows Server 2008або Windows 7/Windows Server 2008 R2. Здається, це не має ніякого значення.
MarioDS

гаразд. останній тест: Створіть нове завдання за допомогою "створити нове завдання" замість "створити легке завдання" (я не знаю, який текст дійсно показаний - мої сервери німецькі - але я сподіваюся, ви знаєте, що я маю на увазі.), а потім Я думаю, ви можете вибрати "Windows Server 2003, ...". а потім, будь ласка, спробуйте ще раз з іншими параметрами ...
frupfrup

1

Хлопці компанії, яка управляє серверами наших клієнтів, сказали, що програма GUI ні в якому разі не працюватиме через заплановані завдання.

Вони використовують систему моніторингу, яка також має функції планування завдань. Вони встановили це через це, і, здається, це працює.

Вибачте, що я не отримав можливості оцінити більше пропозицій тут, але дякую за те, що намагаєтесь допомогти. Я сподіваюся, що це може допомогти іншим у майбутньому, що, я думаю, це, безумовно, буде.


1

Я намагався запустити і стару програму VB6 за допомогою планувальника завдань на сервері Windows 2008 R2. Додаток запускається з exe, через пакетний файл або натискання на ярлик, але не запускається з планувальника завдань. Я виявив, що файли конфігурації програми, які зберігалися в папці програм у каталозі C: ​​\ program files (x86), були скопійовані у папку програми на c: \ programdata. планувальник працював. виявляється, що cmd.exe застосовує конфігурацію з іншого місця до того, яке використовується планувальником завдань. Якщо у вашій програмі є конфігураційні файли, ви можете спробувати перемістити їх у папку c: \ programdata \ application.


0

Ви посилаєтесь на будь-які відображені мережеві диски у вашому сценарії чи програмі? У мене був певний час назад, коли моє заплановане завдання не запускалося, і я не міг зрозуміти, чому. Зміна шляху (ів) до шляхів UNC вирішила це для мене.

Змінити T:\Apps\MyProgram.exeна\\MyServer\MyShare\Apps\MyProgram.exe


Ні, програма на локальному C:диску.
MarioDS

0

Коли я налаштовую завдання сказати "запустити, чи користувач увійшов чи ні", і запустити параметр запуск з найвищими привілеями, значення помилки - 2147943859.

2147943859 перетворений в Hex - це 800705b3, що швидка поїздка в Google говорить мені, що "Не вдалося запустити інсталяційну програму на комп'ютері. Для цієї операції потрібна інтерактивна віконна станція."

Тепер, можливо, є якийсь спосіб змусити його працювати в інтерактивному режимі, не використовуючи PSEXEC (від Sysinternals), але оскільки я вже знаю, як це зробити за допомогою PSEXEC, це те, що я б використовував.

PSExec: http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Тому змініть свою дію, щоб передбачити все за допомогою psexec.exe -i (і -h, якщо вам це потрібно піднятим), і це повинно працювати.

Я спробував це на Windows Server 2008 R2 SP1 із наступним моїм "дії":

c:\windows\system32\cmd.exe

а потім параметри:

/c psexec.exe -h -i notepad.exe

Коли я виконую завдання вручну (оскільки у мене його немає в розкладі), я отримую підвищений блокнот, що працює в моєму поточному сеансі.


0

Може відповідь на це питання допоможе комусь, хто читає цю тему?

/programming/32589381/

Підсумок: Заплановані завдання Windows 2012 не бачать правильних змінних середовищ, у тому числі PATHдля облікового запису, для якого встановлено завдання.

Я прочитав усе це досить довго, перш ніж опрацювати вищесказане. (Що було моєю власною проблемою, що призвело до того ж, що і питання щодо ОП.)

Як тільки ви (нарешті!) Знаєте це, це досить легко перевірити на це (відповідно до відповіді stackoverflow), побачити, як це відбувається, і попрацювати над цим ....

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.