2013-05-03 2 views
5

나는 데이터베이스 가져 오기 프로세스를 1 시간마다 실행하는 Windows 예약 된 작업을 가지고 있습니다. 사용자가 매 시간마다 버튼을 눌러 일정을 벗어나서 실행할 수있게하고 싶습니다. ASP.net 대시 보드 (Windows Server 2003의 IIS6에서 실행) 완벽하게 코드 숨김에서ASP.net에서 Windows 예약 된 작업 실행

다음 작품 ...

var proc = new Process 
      { 
       StartInfo = 
        { 
         UseShellExecute = false, 
         FileName = @"C:\Windows\System32\schtasks.exe", 
         Arguments = "/run /tn Loader", 
         RedirectStandardError = true, 
         RedirectStandardOutput = true, 
         CreateNoWindow = true 
        } 
      }; 
proc.Start(); 
proc.WaitForExit(); 

... 응용 프로그램 풀 ID는 로컬 시스템 (이상적이지!)로 설정되어 있지만 경우에만 가능합니다. 네트워크 서비스로두면 작업이 시작되지 않습니다. 아마도 권한 문제 일 것입니다.

응용 프로그램을 로컬 시스템으로 실행하지 않고 ASP.net이 서버에서 예약 된 작업을 시작할 수있는 방법이 있습니까? 그렇지 않다면 어떤 좋은 대안이 있습니까?

업데이트 : 아무도에 SO 알고 있다면, 나는 내가 (감사 로그로 두 배) 데이터베이스 테이블에 내 웹 응용 프로그램의 쓰기 요청을 갖는 내 아이디어 가서 두 번째 작업을 생성 할 수 없습니다 추측 그 테이블을 폴링하고 주요 작업을 시작할 수 있습니다.

+0

왜이 태스크가 webapp에서 호출 할 것인지를 호출하지 않는 이유는 무엇입니까? 태스크의 대상이 아닌 태스크를 실행하려는 이유는 무엇입니까? – Kousha

+0

좋은 질문입니다. 1 특정 사용자로 실행해야하는 작업이 필요합니다. 2 매시간 예약 된 작업과 동시에 실행하면 안됩니다. 작업이 수동으로 시작된 경우 Windows Scheduler가 편리하게 시작하지 않습니다. 이 옵션은 제가 자세히 다뤘던 옵션은 아닙니다. – Chris

답변

1

Windows에서는 관리자 사용자가 필요합니다. 이 코드는 작업을 호출하는 데 도움이 될 것입니다 :

var proc = new Process 
      { 
       StartInfo = 
        { 
         UseShellExecute = false, 
         FileName = @"C:\Windows\System32\schtasks.exe", 
         Arguments = "/run /tn Loader", 
         UserName = "myAdminUser", //NEW 
         Password = "Pass", //NEW 
         RedirectStandardError = true, 
         RedirectStandardOutput = true, 
         CreateNoWindow = true 
        } 
      }; 
proc.Start(); 
proc.WaitForExit(); 

시스템 계정으로 실행해야 당신의 응용 프로그램이 인수를 사용할 수있는 경우 :

은/RU 아이디/RP 암호 매개 변수의 경우를 현재 로그인 사용자와 일치하면 작업이 대화식으로 실행됩니다 ( 전경에서 볼 수 있음).

시스템 계정의 경우/RU 사용자 이름은 "", "NT AUTHORITY \ SYSTEM"또는 "SYSTEM"으로 쓸 수 있지만 암호는 필요하지 않습니다. 시스템 계정에는 로컬 컴퓨터에 대한 모든 권한이 있지만 네트워크상의 다른 모든 컴퓨터 (또는 매핑 된 드라이브)에 대한 사용 권한은 없습니다.

출처 : http://ss64.com/nt/schtasks.html

+0

ProcessStartInfo.Password는 보안 문자열 유형이며 문자열이 아니므로이 코드는 컴파일되지 않습니다. – Dan

1

업데이트 특정 이벤트를 트리거 일정 작업. 그런 다음 버튼을 클릭하면 웹 사이트에 이벤트가 기록되므로 예약 된 작업이 시작됩니다.

예 : 나는 소스를 생성하기 때문에, 내 프로그램에 대한 이벤트 로그 소스를 만들 내 설치에 필요한 관리 권한

if (EventLog.SourceExists("MyApp")) 
    { 
     EventLog.CreateEventSource("MyApp", "Application"); 
    } 

(you can also use the command line to create the source)

그런 다음 내 응용 프로그램에서 나는 때 이벤트 로그 항목을 생성 버튼이 클릭됩니다.

private void btnOpenOtherApp_Click (object sender, EventArgs e) 
{ 
    try 
    { 
     var log = new EventLog 
     { 
      Source = "MyApp" 
     }; 
     log.WriteEntry("Start MyOtherApp", EventLogEntryType.Information, 1337); 
    } 
    catch (Exception ex) 
    { 
     ... 
    } 
} 

이벤트 스케줄러는 이벤트가 기록 될 때 MyOtherApp를 열도록 설정합니다. Event viewer

+0

과 같은 스케줄링 서비스를 사용하여 적절한 쓰기 권한을 얻기 위해 "레지스트리 변경이 필요합니다"를 사용하는 것입니다. – highwingers

+1

? 내 것이 아닙니다. log.source = ".NET Runtime"을 설정하면 문제가 없습니다. 응용 프로그램을 이벤트 로그 원본으로 추가하도록 설치 프로그램을 설정했기 때문에이를 응용 프로그램 이름으로 설정했습니다. 원하는 경우 코드를 게시합니다. – basher

+0

네가 맞아. 방금 해봤는데 효과가 있었다. 그러나 나는 새로운 소스를 만드는 방법을 알고 싶습니다 ... 몇 가지 코드를 게시하십시오. – highwingers

0

Quartz.NET와 같은 제 3 자 스케줄러 서비스를 사용하는 또 다른 가능성은 다리 헬퍼 Windows 서비스를 작성하는 옵션이 아니며, 변경 권한 (모든 경우에 좋은 생각) 중 하나를 허용하지 않는 경우 ASP.NET 응용 프로그램과 Windows 스케줄러 사이. 당신은 DB에서 작업 목록을 저장하는 것 및 이벤트의 순서는 다음과 같이 될 것이다 : 당신은 ASP.NET GUI에서 작업을 실행해야하는 경우

  1. 는 해당 작업에 대한 DB에 플래그를 설정
  2. 헬퍼 서비스는 지정된 간격으로 DB를 확인하기 위해 일정에 따라 실행됩니다. 플래그를보고 작업을 시작하고 플래그를 재설정합니다. 이

아, 그리고있는 거 밖에 라이브러리 (예를 들어, http://taskscheduler.codeplex.com/ 등)이 랩 윈도우 작업 스케줄러, 당신은 직접 실행해야하지만하지 않아도 오히려 좋은 관리 방법이다.