2013-05-03 18 views
5

Her saat başı bir veritabanı içe aktarma işlemi yürüten bir Windows zamanlanmış görevi var, ancak kullanıcıların bir düğmeyi kullanarak program dışı bırakmasını istiyorum bir ASP.net panosu (Windows Server 2003'te IIS6'da çalışır). mükemmel kod arkasındaWindows Zamanlanmış Görevini ASP.net'den Çalıştırma

aşağıdaki işleri ...

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

... uygulama havuzu kimliği Yerel Sistemi (ideal değil!) olarak ayarlanmış ama sadece. Ağ Hizmeti olarak bırakırsam, görev başlamıyor. Yani muhtemelen bir izin sorunu.

ASP.net, uygulamayı Yerel Sistem olarak çalıştırmadan sunucudaki zamanlanmış bir görevi başlatabilir mi? Değilse, hangi iyi alternatifler var?

Güncelleme: kimse üzerine SO biliyorsa, ben bu yüzden (bir denetim günlüğü olarak iki katına) bir veritabanı tablosuna benim web uygulama yazma isteklerini olma fikirle gidip ikinci bir görev oluşturma olacaktır mümkün değildir tahmin Bu masayı sorgulamak ve ana görevi başlatmak için.

+0

Neden bu görevin web sunucunuzda arayacağını sormuyorsunuz? Neden görevi yürütmek istiyorsun, görevin hedefi değil? – Kousha

+0

İyi soru. 1 Belirli bir kullanıcı olarak çalıştırmaya ihtiyacım var ve 2 Saat zamanlanmış görevle aynı anda çalıştırılmamalı, Windows Zamanlayıcısı görev el ile başlatılmışsa uygun şekilde başlamıyor. Yine de bu, ayrıntılı olarak araştırdığım bir seçenek değil. – Chris

cevap

1

Pencerelerde yönetici kullanıcısına ihtiyacınız var. Bu kod Görevi çağırmak için yardımcı olacaktır:

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

SİSTEM Hesabı olarak çalıştırmak gerekiyor sizin uygulaması bu argümanları kullanabiliyorsanız:

/RU adı ve/RP Şifre parametreleri varsa Şu anda oturum açmış olan kullanıcı ile eşleşecek, görev etkileşimli olarak çalışacaktır ( ön alanında görünür).

Sistem hesabı için,/RU kullanıcı adı "", "NT AUTHORITY \ SYSTEM" veya "SYSTEM" olarak yazılabilir, bir Şifre gerekli değildir. Sistem hesabının yerel makineye tam erişimi vardır, ancak Ağ üzerindeki diğer makineler (veya eşlenmiş sürücüler) üzerinde herhangi bir izni yoktur.

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

+0

ProcessStartInfo.Password bir dizge değil, bir SecureString türüdür ve bu nedenle bu kod derlenmez. – Dan

1

Güncelleme belirli bir olayı kapalı tetiklemek için görev zamanlama. Ardından, web sitenizin butona tıklandığında bu olayı günlüğe kaydetmesini sağlayın - böylece planlanmış görevinizi başlatın.

Ör: Kaynağını oluşturma beri, benim program için bir olay günlüğü kaynağı oluşturmak benim yükleyici olarak gerektirir idari ayrıcalıkları

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

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

Sonra uygulamada, ben ne zaman bir olay günlüğü girişi oluşturmak düğmesine tıklandı.
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) 
    { 
     ... 
    } 
} 

Ve olay kaydedilir zaman MyOtherApp açmaya hazırlanıyor görev zamanlayıcı. Event viewer

+0

gibi çizelgeleme hizmetlerini kullanmaktır, uygun yazma izinleri için "kayıt defteri değişikliği gerektirir". – highwingers

+1

? Benimki yok. Eğer log.source = ".NET Runtime" ayarını yaparsanız, iyi olacaksınız. Her ne kadar uygulama adımı belirledim, çünkü yükleyicimi uygulamayı bir Olay Günlüğü kaynağı olarak eklemek üzere kurdum. İstersen bir kod gönderirim. – basher

+0

evet haklısın. Sadece denedim ve işe yaradı. Ancak yeni bir kaynak nasıl oluşturulacağını bilmek istiyorum ... bazı kodları yazabilirsiniz. – highwingers

0

Quartz.NET gibi bir 3. parti zamanlayıcı hizmetini kullanarak başka bir olasılık bir köprü olarak bir yardımcı, Windows hizmetini yazmaya etmektir bir seçenek değildir, ve değişen izinleri (her durumda iyi bir fikir değil) izin verilmediği halde değilse ASP.NET uygulaması ve Windows scheduler arasında. Bir DB görevlerin listesini saklamak istiyorum ve olayların bir dizi böyle bir şey olacaktır: Eğer ASP.NET GUI, bir görevi çalıştırmak gerektiğinde

  1. bu görev için DB bayrağı set
  2. Yardımcı servisler, DB'yi belirli aralıklarla kontrol etmek için programda çalışır - bayrağı görür, görevi başlatır, bayrağı sıfırlar. Orada

Oh ve konum orada kütüphaneleri (örn http://taskscheduler.codeplex.com/ ve diğerleri) bu sarma Pencere Görev Zamanlayıcı doğrudan onlara yürütmek zorunda, ama kalmamak ziyade güzel yönetilen bir şekilde.