Program nie działa poprawnie jako zaplanowane zadanie

12

Sytuacja

Mam skrypt wsadowy, który przygotowuje niektóre pliki, wykonuje program ( .exe), a następnie usuwa te pliki.

To zadanie powinno być uruchamiane co godzinę, więc próbuję je skonfigurować za pomocą Zaplanowanych zadań. Problem polega na tym, że poprzednio wspomniany program nie działa poprawnie, gdy jest wywoływany z zadania (ani przez .batskrypt, ani podczas .exebezpośredniego wywoływania ), ale nie otrzymuję żadnych ostrzeżeń ani komunikatów o błędach w dziennikach.

Ustawiać

Zadanie jest skonfigurowane do działania jako konto usługi systemu Windows, które ma poprawnie ustawione wszystkie uprawnienia. Używając tego konta do logowania przez RDP, mogę wykonać .bati .exebezpośrednio bez problemów, ale wydaje się, że zadanie nic nie robi. Można to łatwo zaobserwować, ponieważ program zawsze modyfikuje plik, a zmodyfikowany znacznik czasu nie zmienia się w zadaniu.

W dziennikach zaplanowanych zadań otrzymuję komunikaty informacyjne dotyczące zadania rozpoczynającego, kończącego proces itp. „Kod wyniku” jest jednak taki 111(próbowałem to zrobić bez powodzenia w Google, jedyne skojarzenie, jakie otrzymałem, to „nazwa pliku jest za długa) ”, co jest po prostu zupełnie nieistotne AFAIK). W dziennikach aplikacji nie otrzymuję absolutnie nic.

Podejrzewam, że problem

Program jest starą potwornością, która odradza jakiś ekran powitalny (w rzeczywistości jest to normalne okno), mimo że GUI nie jest potrzebne, ponieważ nie wymaga interakcji i zamyka się po operacjach. Okno pojawi się na około 2 sekundy.

Podejrzewam, że to wymaganie dotyczące GUI ma coś wspólnego z niepowodzeniem zadania, ale nie jestem pewien. Kiedy loguję się do użytkownika, na którym działa zadanie (przez RDP), po uruchomieniu zaplanowanego zadania nie pojawia się żadne okno.


Edytuj informacje o GUI

Zbudowałem bardzo mały plik wykonywalny C #, który uruchamia program bez głównego okna (za pomocą ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden). Nawet w ten sposób zaplanowane zadanie nadal nie uruchamia się poprawnie, ale kod powrotu jest teraz 0.


Aktualizacja

Gdy konfiguruję zadanie, aby powiedzieć „uruchom bez względu na to, czy użytkownik jest zalogowany”, a run with highest privilegesopcja nie jest zaznaczona , wartością błędu jest 2147943859.


Co mogę zrobić, aby rozwiązać problem?

System operacyjny = Windows Server 2008 R2 SP1

Jeśli potrzebujesz więcej informacji, daj mi znać w komentarzach.

MarioDS
źródło
Czy twój skrypt i „program” przyjmują jakieś dane wejściowe, takie jak opcje lub parametry? Czy próbowałeś używać programu PowerShell zamiast partii? Podczas uruchamiania .exe„programu” z parametrami ze skryptu, dane wejściowe muszą być poprawnie podane jako argument.
slybloty
1
Czy próbowałeś harmonogramu z innym programem? Po prostu zamień jeden program na inny i zobacz, jakie wyniki uzyskasz.
slybloty
2
@ out-null Nie sądzę, że harmonogram zadań korzysta z okna, aby wiedzieć, kiedy program się zakończy, powinien poczekać na proces, cokolwiek zrobi z oknami. Ale jeśli program spróbuje poszukać czegoś konkretnego, aby utworzyć ekran powitalny (powiedzmy pasek zadań) i nie uda się go znaleźć (ponieważ działa na osobnym pulpicie / stacji okien), być może zatrzyma się ...
Ale,
1
DOBRZE. Czy próbowałeś uruchomić go na koncie LocalSystem? Czy próbowałeś również monitorować zdarzenie uruchamiania procesu za pomocą Monitora procesów firmy Sysinternals?
Lucky Luke
1
@BradBouchard Nawet jeśli twoja odpowiedź może nie rozwiązać pytania PO w tym konkretnym przypadku, jest to poprawna odpowiedź i może być przydatna dla przyszłych odwiedzających SF, dlatego zachęcam cię, abyś jej nie usuwał.
Mówię: Przywróć Monikę

Odpowiedzi:

6

Uważam, że Twój problem dotyczy uprawnień konta używanych do uruchomienia zadania lub kontekstu konta istniejącego podczas próby uruchomienia zadania.

Przetestuj wymagania dotyczące sesji konsoli

Możliwe, że Twój plik .EXE musi być uruchomiony w Consolesesji (aka Sesja 0) na komputerze. Aby to sprawdzić:

  1. Skonfiguruj zadanie do uruchamiania tylko wtedy, gdy użytkownik jest zalogowany i określ czas rozpoczęcia zadania na 2 minuty w przyszłości
  2. Zaloguj się do komputera przy użyciu tego samego konta użytkownika, które zostało użyte do uruchomienia zadania (najlepiej zaloguj się do sesji konsoli, fizycznie będąc w konsoli lub używając programu dostępu zdalnego, który daje dostęp do konsoli. Aby potwierdzić, że używasz sesja konsoli, po uruchomieniu wiersza polecenia QWINSTAobserwuj SESSIONNAMEkolumnę i potwierdź, że >wskaźnik znajduje się obok console, innymi słowy powinien wyglądać jak >console)
  3. Poczekaj na uruchomienie zadania

Jeśli zadanie działa poprawnie, spróbuj zaplanować zadanie przy SCHTASKS.EXEużyciu /ITparametru. W przeciwnym razie możesz nie mieć innego wyjścia, niż skonfigurować komputer tak, aby automatycznie logował się jako konto użytkownika usługi i uruchamiał zadanie jako program startowy.

Sprawdź uprawnienia

Ponadto, jak już zasugerowałem, sprawdź następujące elementy, aby potwierdzić, że konto użyte do uruchomienia zadania ma odpowiednie uprawnienia:

  1. Przyznaj konto Logowanie jako zadanie użytkownika wsadowego (znalezione w lokalnych zasadach grupy na Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments)
  2. Upewnij się, że zadanie zostało skonfigurowane do uruchamiania z najwyższymi uprawnieniami
  3. Potwierdź, że użytkownik ma pełne uprawnienia NTFS do wszystkich folderów i plików, z którymi musi współdziałać. Nie rób żadnych założeń; zamiast potwierdzić, przechodząc do tych lokalizacji plików i korzystania z Effective Permissionskarty w pliku / folderu na właściwości wSecurity > Advanced

Dodatkowe rzeczy do sprawdzenia / wypróbowania

  • Czy zadanie wymaga dostępu do dostępu do zasobów sieciowych? Rzeczy takie jak zamapowane dyski mogą być obecne podczas logowania za pomocą konta użytkownika, ale w zależności od konfiguracji serwera mogą nie występować w kontekście konta użytkownika po uruchomieniu z Harmonogramu zadań.
  • Dodaj rejestrowanie do pliku wsadowego. Po każdym wierszu, który wykonuje, zapisz jakieś dane wyjściowe do pliku dziennika, abyś wiedział, gdzie się zacina. Na przykład:

    @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"
    
  • Spróbuj uruchomić swój .EXE z START, na przykładSTART "myTitle" "C:\full\path\to\my.EXE"

Mówię: Przywróć Monikę
źródło
2

Odpowiadam na stary post na wypadek, gdyby pomógł komuś innemu. Miałem ten sam problem. Dziennik zdarzeń powiedział, że program zakończył się normalnie, ale nawet pierwszy wiersz kodu nie zapisałby dla mnie dziennika. Skończyło się to na opcji „Rozpocznij w” w Harmonogramie zadań. Przyszło mi do głowy, że program działał poprawnie z wiersza poleceń, gdy byłem w bieżącym katalogu. W tym samym katalogu znajdują się pliki manifestu i inne zależności. Jeśli więc powiesz zaplanowanemu zadaniu, aby uruchomiło się w tym samym katalogu co plik EXE, możesz uzyskać korzystne wyniki. To było dla mnie rozwiązanie.

Rob Wilson
źródło
To było rozwiązanie do uruchamiania niestandardowej aplikacji konsoli opracowanej w Visual Studio z obsługą plików konfiguracyjnych.
billfredtom
1

może to ci pomaga?

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

Mieliśmy podobny problem i jedynym rozwiązaniem było założenie specjalnego konta na serwerze z autologinem. Więc jeśli zadanie działało pod zalogowanym już użytkownikiem, nasz plik .exe działał dobrze ...

wiem, że to nie jest bardzo miłe rozwiązanie, ale dla nas było to jedyne, co zadziałało. nie wiem, czy to działa dla ciebie ... (Ale przy tej pracy musisz sprawdzić, czy użytkownik jest cały czas zalogowany ...)

frupfrup
źródło
To zadanie nawet nie działa poprawnie, gdy użytkownik, pod którym działa, jest skutecznie zalogowany (przez RDP). Korzystam z konta usługi, aby zalogować się przez RDP, ręcznie uruchomić zadanie i nie widzę okna.
MarioDS
2
Czy odznaczyłeś opcję „Uruchom z najwyższymi uprawnieniami”? Myślę, że po zaznaczeniu tej opcji nastąpi ewolucja praw (UAC) i nie zobaczysz okna, nawet gdy użytkownik jest zalogowany (zostanie wywołany w oddzielnej sesji bez okna i zakończy się niepowodzeniem). Spróbuj także wybrać opcję „skonfigurowano dla” -> „Windows Server 2003, Windows XP lub Windows 2000”.
frupfrup
Wydaje się, że nie ma to żadnej różnicy, z wyjątkiem sytuacji, gdy teraz ustawiam „Uruchom bez względu na to, czy użytkownik jest zalogowany”. Otrzymuję kod błędu 2147943859. Mogę tylko ustawić „Skonfigurowany dla” na jeden Windows Vista/Windows Server 2008lub Windows 7/Windows Server 2008 R2. Wydaje się, że nie ma znaczenia.
MarioDS,
dobrze. ostatni test: Utwórz nowe zadanie za pomocą „utwórz nowe zadanie” zamiast „utwórz łatwe zadanie” (nie wiem, który tekst jest naprawdę wyświetlany - moje serwery są po niemiecku - ale mam nadzieję, że wiesz, co mam na myśli). myślę, że możesz wybrać „Windows Server 2003, ...”. a następnie proszę ponownie spróbować z innymi opcjami ...
frupfrup
1

Faceci z firmy, która obsługuje serwery naszych klientów, powiedzieli, że program GUI nie uruchomi się w żaden sposób według zaplanowanych zadań.

Korzystają z systemu monitorowania, który ma również funkcje planowania zadań. Skonfigurowali to przez to i wydaje się, że działa.

Przepraszam, że nie miałem okazji ocenić tutaj więcej sugestii, ale dzięki za próbę i tak pomocy. Mam nadzieję, że może pomóc innym w przyszłości, co, jak sądzę, na pewno pomoże.

MarioDS
źródło
1

Próbowałem uruchomić stary program VB6 przy użyciu programu do planowania zadań na serwerze z systemem Windows 2008 R2. Aplikacja działałaby z exe, poprzez plik wsadowy lub klikając skrót, ale nie uruchamiałaby się z harmonogramu zadań. Odkryłem, że kiedy pliki konfiguracyjne aplikacji, które były przechowywane w folderze aplikacji w katalogu C: \ program files (x86), zostały skopiowane do folderu aplikacji na c: \ programdata. harmonogram działał. wygląda na to, że cmd.exe stosuje konfigurację z innej lokalizacji niż ta używana przez harmonogram zadań. Jeśli aplikacja ma pliki konfiguracyjne, możesz spróbować przenieść je do folderu c: \ programdata \ application.

Kasa
źródło
0

Czy odwołujesz się do mapowanych dysków sieciowych w skrypcie lub programie? Przez jakiś czas miałem podobny problem, w którym moje zaplanowane zadanie nie działało i nie mogłem zrozumieć, dlaczego. Zmiana ścieżki (ścieżek) na ścieżki UNC rozwiązała to dla mnie.

Zmień T:\Apps\MyProgram.exena\\MyServer\MyShare\Apps\MyProgram.exe

AdamsTips
źródło
Nie, program znajduje się na C:dysku lokalnym .
MarioDS,
0

Kiedy konfiguruję zadanie, aby powiedzieć „uruchom bez względu na to, czy użytkownik jest zalogowany”, a opcja uruchamiania z najwyższymi uprawnieniami nie jest zaznaczona, wartość błędu wynosi 2147943859.

2147943859 przekonwertowany na Hex to 800705b3, co według krótkiej podróży do Google oznacza „Nie można uruchomić programu instalacyjnego na komputerze. Ta operacja wymaga interaktywnej stacji okien”.

Teraz może być jakiś sposób, aby uruchomić go interaktywnie bez użycia PSEXEC (z Sysinternals), ale ponieważ już wiem, jak to zrobić za pomocą PSEXEC, tego właśnie użyłbym.

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

Dlatego zmień swoje działanie, aby dodać wszystko za pomocą psexec.exe -i (i -h, jeśli potrzebujesz go podwyższyć) i powinno działać.

Próbowałem tego na Windows Server 2008 R2 SP1 z następującymi elementami w mojej „akcji”:

c:\windows\system32\cmd.exe

a następnie parametry:

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

Po ręcznym uruchomieniu zadania (ponieważ nie mam jego harmonogramu) w bieżącej sesji pojawia się notatnik z podwyższonym poziomem uprawnień.

Mark Allen
źródło
0

Może odpowiedź na to pytanie pomoże komuś innemu przeczytać ten wątek?

/programming/32589381/

Podsumowanie: Zaplanowane zadania systemu Windows 2012 nie zawierają poprawnych zmiennych środowiskowych, w tym PATHkonta, dla którego zadanie ma być uruchamiane.

Przeczytałem to wszystko dość długo, zanim zrozumiałem powyższe. (Co było moim własnym problemem prowadzącym do tego samego, co pytanie PO).

Gdy już to wiesz (w końcu!), Możesz łatwo to sprawdzić (zgodnie z odpowiedzią dotyczącą przepełnienia stosu), zobaczyć, jak to się dzieje i obejść ...

MikeBeaton
źródło