예약 된 작업으로 프로그램이 제대로 실행되지 않습니다


12

상태

일부 파일을 준비하고 프로그램을 실행 한 .exe다음 해당 파일을 삭제 하는 배치 스크립트가 있습니다.

이 작업은 매시간 실행되므로 예약 된 작업을 사용하여 구성하려고합니다. 문제는 이전에 언급 한 프로그램이 .bat스크립트 를 통해 또는 .exe직접 호출 할 때 작업에서 호출 할 때 제대로 실행되지 않지만 로그에 경고 또는 오류 메시지가 표시되지 않는다는 것입니다.

설정

작업은 모든 권한이 올바르게 설정된 Windows 서비스 계정으로 실행되도록 구성되어 있습니다. RDP를 통해 로그온이 계정을 사용하는 경우, 나는 실행할 수 .bat.exe직접 문제없이,하지만 여전히 작업은 아무것도 할 것으로 보인다. 프로그램은 항상 파일을 수정하고 수정 된 타임 스탬프는 작업을 통해 변경되지 않기 때문에 쉽게 확인할 수 있습니다 .

예약 된 작업 로그에 프로세스 시작, 종료 등의 작업에 대한 정보 메시지가 표시됩니다. 그러나 "결과 코드"는 111(Google에 행운없이 시도했지만, 유일한 연결은 "파일 이름이 너무 깁니다. ", 이는 완전히 관련이없는 AFAIK입니다). 응용 프로그램 로그에서 나는 아무것도 얻지 못합니다.

내가 의심하는 것은 문제

이 프로그램은 상호 작용이 필요하지 않고 작업 후 닫히기 때문에 GUI가 필요하지 않지만 일종의 스플래시 화면 (실제로는 일반 창임)을 생성하는 오래된 괴물입니다. 창이 약 2 초 동안 나타납니다.

GUI에 대한이 요구 사항이 작업 실패와 관련이 있다고 생각하지만 확실하지 않습니다. RDP를 통해 작업을 실행하는 사용자로 로그인하면 예약 된 작업을 시작할 때 창이 나타나지 않습니다.


GUI에 대한 편집

메인 창없이 (을 사용하여 ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden) 프로그램을 시작하는 매우 작은 C # 실행 파일을 작성했습니다 . 이 방법으로도 예약 된 작업이 여전히 프로그램을 올바르게 시작하지 못하지만 리턴 코드는 이제 0입니다.


최신 정보

"사용자의 로그온 여부에 관계없이 실행하도록"태스크를 구성하고 run with highest privileges옵션 의 선택을 취소 하면 오류 값은 2147943859입니다.


문제를 해결하려면 어떻게해야합니까?

OS = Windows Server 2008 R2 SP1

더 많은 정보가 필요하면 의견에 알려주십시오.


스크립트와 "프로그램"이 옵션이나 매개 변수와 같은 입력을 받습니까? 배치 대신 PowerShell을 사용해 보셨습니까? .exe스크립트 내에서 매개 변수를 사용 하여 "프로그램"을 시작할 때 입력을 인수로 올바르게 제공해야합니다.
slybloty

1
다른 프로그램으로 스케줄러를 사용해 보셨습니까? 한 프로그램을 다른 프로그램으로 바꾸면 어떤 결과가 나오는지 알 수 있습니다.
교활한

2
@ out-null 작업 스케줄러가 창을 사용하여 프로그램 실행이 완료 된 시점을 알지 못한다고 생각합니다 .Windows와 관계없이 프로세스를 기다려야합니다. 그러나 프로그램이 스플래시 화면을 생성하기 위해 특정 작업을 찾으려고 시도하고 (작업 표시 줄을 말합시다) 별도의 데스크탑 / 창 스테이션에서 실행하기 때문에 그것을 찾지 못하면 ... 중지 될 수 있습니다 ...
Ale

1
확인. LocalSystem 계정으로 실행 해 보셨습니까? 또한 Sysinternals의 Process Monitor를 사용하여 프로세스 시작 이벤트를 모니터링하려고 했습니까?
Lucky Luke

1
@BradBouchard 귀하의 답변 이이 특정한 경우 OPs 질문을 해결하지 못할 수도 있지만 , 이는 유효한 답변이며 향후 SF 방문자에게 유용 할 수 있으므로 삭제하지 않는 것이 좋습니다.
나는

답변:


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 를 실행하십시오.STARTSTART "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) 사용자가 로그인 한 경우에도 창이 표시되지 않습니다 (창없이 별도의 세션에서 호출되어 실패 함). 또한 "configured for"-> "Windows Server 2003, Windows XP 또는 Windows 2000"옵션을 선택하십시오.
frupfrup

그게 내가 지금은 내가에만 설정 중 하나로 "를 구성"할 수 오류 코드 2147943859. 얻을 "사용자가 로그온 여부 실행"로 설정 한 경우를 제외하고, 아무 차이가없는 것 Windows Vista/Windows Server 2008또는 Windows 7/Windows Server 2008 R2. 차이가없는 것 같습니다.
MarioDS

확인. 마지막 테스트 : "쉬운 작업 만들기"대신 "새 작업 만들기"를 사용하여 새 작업을 만듭니다 (어떤 텍스트가 실제로 표시되는지 알 수 없습니다-내 서버는 독일어입니다.하지만 의미하는 바를 알기를 바랍니다). "windows Server 2003, ..."을 선택할 수 있다고 생각합니다. 그리고 pls는 다른 옵션으로 다시 한 번 시도합니다 ...
frupfrup

1

고객의 서버를 운영하는 회사 직원들은 GUI 프로그램이 예정된 작업을 통해 어떤 방식으로도 실행되지 않을 것이라고 말했다.

또한 작업 예약 기능이있는 모니터링 시스템을 사용합니다. 그들은 그것을 통해 그것을 설정했고 작동하는 것처럼 보입니다.

더 많은 제안을 평가할 기회를 얻지 못해서 죄송하지만 어쨌든 도와 주셔서 감사합니다. 앞으로 다른 사람들에게 도움이 되길 바랍니다.


1

Windows 2008 R2 서버에서 작업 스케줄러를 사용하여 이전 VB6 프로그램을 시작하려고했습니다. 응용 프로그램은 배치 파일을 통해 또는 바로 가기를 클릭하여 exe에서 실행되지만 작업 스케줄러에서는 실행되지 않습니다. C : \ program files (x86) 디렉토리의 applications 폴더에 저장된 응용 프로그램의 구성 파일이 c : \ programdata의 응용 프로그램 폴더로 복사 된 것을 발견했습니다. 스케줄러가 작동했습니다. cmd.exe는 다른 위치에서 작업 스케줄러가 사용하는 구성을 적용하는 것으로 보입니다. 응용 프로그램에 구성 파일이 있으면 c : \ programdata \ application 폴더로 이동해보십시오.


0

스크립트 나 프로그램에서 매핑 된 네트워크 드라이브 를 참조하고 있습니까? 예약 된 작업이 실행되지 않는 비슷한 문제가 있었으며 그 이유를 알 수 없었습니다. 경로를 UNC 경로로 변경하면 해결되었습니다.

변경 T:\Apps\MyProgram.exe\\MyServer\MyShare\Apps\MyProgram.exe


아니요, 프로그램이 로컬 C:드라이브에 있습니다.
MarioDS

0

"사용자 로그온 여부에 관계없이 실행"이라고 작업을 구성하고 가장 높은 권한으로 실행 옵션을 선택 취소하면 오류 값은 2147943859입니다.

2147943859 16 진수로 변환 된 800705b3은 Google로 빠르게 이동하면 "컴퓨터에서 설치 프로그램을 시작할 수 없습니다.이 작업에는 대화식 윈도우 스테이션이 필요합니다."라는 의미입니다.

이제 Sysinternals의 PSEXEC를 사용하지 않고 대화식으로 실행할 수있는 방법이있을 수 있지만 PSEXEC를 통해 어떻게 사용하는지 이미 알고 있기 때문에 사용합니다.

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

따라서 psexec.exe -i (및 -h가 필요한 경우 -h)로 모든 것을 앞에 추가하도록 조치를 변경하면 작동해야합니다.

Windows Server 2008 R2 SP1에서 '작업'에 다음과 같이 시도했습니다.

c:\windows\system32\cmd.exe

그런 다음 매개 변수 :

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

작업을 수동으로 실행하면 (예약이 없기 때문에) 현재 세션에서 높은 메모장이 실행됩니다.


0

아마도이 질문에 대한 대답은 다른 사람 이이 스레드를 읽는 데 도움이됩니까?

/programming/32589381/

요약 : Windows 2012 예약 된 작업 에는 작업이 실행되도록 설정된 계정에 대한 올바른 환경 변수 가 표시 되지 않습니다PATH .

나는 위의 문제를 해결하기 전에이 모든 것을 아주 오랫동안 읽었습니다. (OP의 질문과 같은 내 문제는 무엇입니까?)

일단 (마침내!)이 사실을 알면 (스택 오버플로 답변에 따라) 테스트하고, 발생하는 것을보고, 해결하는 것이 매우 쉽습니다 ....

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.