2013-05-03 17 views
5

Mam zaplanowane zadanie systemu Windows, które uruchamia proces importowania bazy danych co godzinę, ale chciałbym, aby użytkownicy mogli go wyłączyć poza harmonogramem, naciskając przycisk pulpit ASP.net (uruchomiony w IIS6 na Windows Server 2003).Uruchamianie zadania Zaplanowane w systemie Windows z programu ASP.net

Poniższe działa idealnie w code-za ...

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(); 

... ale tylko wtedy, gdy tożsamość puli aplikacji jest ustawiony na system lokalny (nie idealne!). Jeśli zostawiam go jako usługę sieciową, zadanie się nie rozpocznie. Jest to przypuszczalnie problem z uprawnieniami.

Czy istnieje sposób, aby program ASP.net mógł uruchomić zaplanowane zadanie na serwerze bez uruchamiania aplikacji jako system lokalny? Jeśli nie, jakie są dobre alternatywy?

Aktualizacja: jeśli nikt na SO wie, myślę, że nie jest możliwe, więc pójdę z moim pomysłem posiadania mojej aplikacji sieci web żądania zapisu do tabeli bazy danych (podwojenie jako dzienniku kontroli) oraz stworzenie drugiego zadania sondować ten stół i rozpocząć główne zadanie.

+0

Dlaczego nie wywołujesz tego, co to zadanie wywoła w Twojej aplikacji internetowej? Dlaczego chcesz uruchomić zadanie, a nie cel zadania? – Kousha

+0

Dobre pytanie. 1 Potrzebuję, aby zadanie działało jako określony użytkownik, i 2 To nie może działać w tym samym czasie, co zaplanowane na godzinę zadanie, do którego Windows Scheduler wygodnie się nie uruchamia, jeśli zadanie zostało uruchomione ręcznie. Nie jest to jednak opcja, którą zbadałem bardzo szczegółowo. – Chris

Odpowiedz

1

Potrzebujesz użytkownika administratora w systemie Windows. Ten kod pozwoli Ci zadzwonić zadanie:

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(); 

Jeśli aplikacja musi działać jako konto systemowe można użyć tego argumenty:

Jeżeli parametry/RU nazwa użytkownika i/RP Hasło pasuje do aktualnie zalogowanego użytkownika , zadanie uruchomi się interaktywnie (widoczne na pierwszym planie na ).

Dla konta systemowego/RU nazwa użytkownika może być zapisana jako "", "NT AUTORYZACJA \ SYSTEM" lub "SYSTEM", hasło nie jest wymagane. Konto systemu ma pełny dostęp do komputera lokalnego, ale nie ma uprawnień dla innych komputerów (lub mapowanych dysków) w sieci.

Źródło: http://ss64.com/nt/schtasks.html

+0

ProcessStartInfo.Password jest typem SecureString, a nie ciągiem, dlatego ten kod nie jest kompilowany. – Dan

1

zaktualizować swoje zadanie harmonogram wywołać określone zdarzenie. Następnie poproś witrynę internetową o rejestrację tego zdarzenia po kliknięciu przycisku - rozpoczynając zaplanowane zadanie.

Ex: W moim instalatora utworzyć źródło dziennika zdarzeń dla mojego programu, ponieważ tworząc źródło wymaga uprawnień administratora (you can also use the command line to create the source)

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

Wtedy w mojej aplikacji, utworzyć wpis w dzienniku zdarzeń, gdy przycisk jest kliknięty.

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) 
    { 
     ... 
    } 
} 

I ustawić harmonogram zadań, aby otworzyć MyOtherApp gdy zdarzenie jest rejestrowane. Event viewer

+0

jego "wymagałoby zmiany rejestru" dla poprawnych uprawnień do zapisu. – highwingers

+1

? Mój nie. Jeśli ustawisz log.source = "Środowisko wykonawcze .NET", wszystko będzie dobrze. Mimo to ustawiłem go na nazwę mojej aplikacji, ponieważ skonfigurowałem instalator, aby dodać aplikację jako źródło dziennika zdarzeń. Wezwę trochę kodu, jeśli chcesz. – basher

+0

Tak, masz rację. Po prostu wypróbowałem i zadziałało. Chciałbym jednak wiedzieć, jak stworzyć nowe źródło ... napisać jakiś kod. – highwingers

0

przypadku korzystania z 3rd usługi planującego firm, takie jak Quartz.NET nie jest opcją, a zmiany uprawnień jest niedozwolone albo (nie jest to dobry pomysł, w każdym razie) inną możliwością jest napisać pomocnika usługi Windows jako pomost między aplikacją ASP.NET a programem planującym system Windows. byś listę zadań przechowywać w DB i sekwencja zdarzeń będzie coś takiego:

  1. Kiedy trzeba uruchomić zadanie, z ASP.NET GUI ustawić flagę w DB dla tego zadania
  2. Usługa pomocnicza działa zgodnie z harmonogramem, aby sprawdzić bazę danych w określonych odstępach czasu - wyświetla flagę, uruchamia zadanie, resetuje flagę.

No i tam jesteś biblioteki tam (np http://taskscheduler.codeplex.com/ i inne), które owijają Okno Harmonogram zadań, więc nie trzeba wykonywać je bezpośrednio, ale raczej w ładnym zarządzany.