2013-05-03 9 views
5

Ho un'attività pianificata di Windows che esegue un processo di importazione del database ogni ora, ma mi piacerebbe che gli utenti fossero in grado di espellerlo fuori programma premendo un pulsante in un dashboard di ASP.net (eseguito in IIS6 su Windows Server 2003).Esecuzione di un'attività pianificata di Windows da ASP.net

I seguenti funziona perfettamente in code-behind ...

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

... ma solo se l'identità del pool di applicazioni è impostata su Sistema locale (non è l'ideale!). Se lo lascio come servizio di rete, l'attività non viene avviata. Quindi è presumibilmente un problema di autorizzazioni.

C'è un modo in cui ASP.net può avviare un'attività pianificata sul server senza eseguire l'applicazione come sistema locale? Se no, quali buone alternative ci sono?

Aggiornamento: se nessuno sa su SO, credo che non è possibile, così io andrò con la mia idea di avere la mia applicazione web le richieste di scrittura a una tabella di database (raddoppio come un registro di controllo) e la creazione di una seconda attività per sondare quel tavolo e dare il via al compito principale.

+0

Perché non stai chiamando ciò che questa attività chiamerà nella tua webapp? Perché vuoi eseguire l'attività, non la destinazione dell'attività? – Kousha

+0

Buona domanda. 1 Ho bisogno che l'attività venga eseguita come utente specifico e 2 Non deve essere eseguita contemporaneamente all'attività schedulata oraria, che Windows Scheduler non avvia in modo conveniente se l'attività è stata avviata manualmente. Questa non è un'opzione che ho esplorato in molti dettagli, però. – Chris

risposta

1

È necessario un utente amministratore in Windows. Questo codice vi aiuterà a chiamare il compito:

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

Se l'applicazione deve essere eseguito come account di sistema si può usare questa argomenti:

Se i/nome utente RU e/RP parametri password corrisponde all'attuale utente registrato , l'attività verrà eseguita in modo interattivo (visibile nel primo piano ).

Per l'account di sistema, il nome utente/RU può essere scritto come "", "NT AUTHORITY \ SYSTEM" o "SYSTEM", non è richiesta una password. L'account sistema ha accesso completo al computer locale ma non dispone di autorizzazioni su nessun altro computer (o unità mappate) attraverso la rete.

Fonte: http://ss64.com/nt/schtasks.html

+0

ProcessStartInfo.Password è un tipo SecureString e non una stringa, pertanto questo codice non viene compilato. – Dan

1

aggiornare il compito programma per innescare un evento specifico. Quindi fare in modo che il sito Web registri quell'evento quando viene fatto clic sul pulsante, quindi avvia l'attività pianificata.

Es: Nel mio programma di installazione creo una fonte registro eventi per il mio programma, dal momento che la creazione dell'origine richiede privilegi amministrativi (you can also use the command line to create the source)

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

Poi nella mia richiesta, ho creare una voce del registro eventi quando il il pulsante viene cliccato.

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

E l'utilità di pianificazione impostata per aprire MyOtherApp quando viene registrato l'evento. Event viewer

+0

il suo "richiederebbe una modifica del registro" per le corrette autorizzazioni di scrittura. – highwingers

+1

? Il mio no. Se si imposta log.source = ".NET Runtime", si andrà bene. Sebbene, l'ho impostato sul nome della mia applicazione, perché ho configurato il mio programma di installazione per aggiungere l'applicazione come sorgente del registro eventi. Pubblicherò del codice, se vuoi. – basher

+0

sì hai ragione. Ho appena provato e ha funzionato. Comunque mi piacerebbe sapere come creare una nuova fonte ... pubblica del codice. – highwingers

0

Se si utilizza un terzo servizio di pianificazione parti come Quartz.NET non è un'opzione, e le autorizzazioni che cambiano non è consentito né (non una buona idea, in ogni caso) Un'altra possibilità è quella di scrivere un servizio di Windows di supporto come un ponte tra l'applicazione ASP.NET e l'utilità di pianificazione di Windows. Si potrebbe memorizzare elenco di attività in un DB e una sequenza di eventi sarebbe qualcosa di simile:

  1. Quando è necessario eseguire un compito, da ASP.NET GUI si imposta la bandiera nel DB per quell'attività
  2. Il servizio di supporto viene eseguito nei tempi previsti per controllare il DB a intervalli specificati: visualizza il flag, avvia l'attività, reimposta il flag.

Oh, e non ci sei librerie là fuori (ad esempio http://taskscheduler.codeplex.com/ e altri) che avvolgono finestra Utilità di pianificazione, quindi non c'è bisogno di eseguire direttamente, ma piuttosto in un modo gestito bello.

Problemi correlati