Program Zamanlanmış Görev olarak düzgün çalışmıyor


12

Durum

Bazı dosyaları hazırlar, bir program ( .exe) yürütür ve sonra söz konusu dosyaları siler bir toplu iş komut dosyası var .

Bu görev saatlik olarak çalışmalıdır, bu yüzden Zamanlanmış Görevler kullanarak bunu yapılandırmaya çalışıyorum. Sorun, daha önce bahsedilen program görevden (ne .batkomut dosyası aracılığıyla ne de .exedoğrudan çağırırken ) çağrıldığında düzgün çalışmadığı , ancak günlüklerde herhangi bir uyarı veya hata iletisi almıyorum olmasıdır.

Kurmak

Görev, tüm ayrıcalıkların düzgün ayarlandığı bir Windows Hizmet Hesabı olarak çalışacak şekilde yapılandırılmıştır. RDP üzerinden oturum açmak için bu hesabı kullanırken, doğrudan .batve .exesorunsuz bir şekilde çalıştırabilirim , ancak yine de görev hiçbir şey yapmıyor gibi görünüyor. Program her zaman bir dosyayı değiştirdiği ve zaman damgasında değiştirilen görev yoluyla değişmediği için bu kolayca gözlemlenir .

Zamanlanmış görev günlüklerinde, bir işlem başlatmak, çıkmak, vb. İçin görev için bilgi iletileri 111alıyorum. ", bu tamamen alakasız AFAIK). Uygulama günlüklerinde kesinlikle hiçbir şey almıyorum.

Şüphelendiğim sorun bu

Program, GUI'ye ihtiyaç duyulmamasına rağmen hiçbir etkileşim gerektirmediğinden ve operasyonlardan sonra kendini kapattığından, bir çeşit açılış ekranını (aslında normal bir pencere) ortaya çıkaran eski bir canavarlıktır. Pencere yaklaşık 2 saniye boyunca görünür.

Bir GUI için bu gereksinimin görev başarısızlıkla ilgili bir şey olduğundan şüpheleniyorum, ancak emin değilim. Görevin altında çalıştığı kullanıcıyla (RDP aracılığıyla) oturum açtığımda, zamanlanan görevi başlattığımda pencere görüntülenmiyor.


GUI hakkında düzenleme

Ana pencere (kullanarak ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden) olmadan programı başlatan çok küçük bir C # yürütülebilir yaptım . Bu şekilde bile, zamanlanan görev yine de programı doğru bir şekilde başlatmayı başaramaz, ancak dönüş kodu şimdi 0.


Güncelleme

Görevi "kullanıcının oturum açmış olup olmadığını çalıştır" diyecek şekilde yapılandırdığımda ve run with highest privilegesseçeneğin işareti kaldırıldığında hata değeri olur 2147943859.


Sorun gidermek için ne yapabilirim?

İşletim Sistemi = Windows Server 2008 R2 SP1

Daha fazla bilgi gerekiyorsa, lütfen yorumlarda bana bildirin.


Komut dosyanız ve "program" seçenek veya parametre gibi herhangi bir girdi alıyor mu? Toplu iş yerine PowerShell kullanmayı denediniz mi? Bir .exekomut dosyasının içindeki parametrelerle bir "program" başlatırken , girdinin argüman olarak düzgün şekilde sağlanması gerekir.
slybloty

1
Zamanlayıcıyı farklı bir programla denediniz mi? Sadece bir programı farklı bir programla değiştirin ve hangi sonuçları elde ettiğinizi görün.
slybloty

2
@ out-null Görev zamanlayıcısının programın çalışmasını bitirdiğini bilmek için pencereyi kullandığını düşünmüyorum, pencereyle ne yaparsa yapsın, işlemi beklemelidir. Ancak program, açılış ekranını oluşturmak için belirli bir şey aramaya çalışırsa (diyelim ki görev çubuğu diyelim) ve bulamıyorsa (ayrı bir masaüstü / pencere istasyonunda çalıştığı için), o zaman durur ...
Ale

1
TAMAM. LocalSystem hesabı altında çalıştırmayı denediniz mi? Ayrıca, Sysinternals'ın Process Monitor ile işlem başlatma olayını izlemeyi denediniz mi?
Şanslı Luke

1
@BradBouchard Cevabınız bu özel durumda OP sorusunu çözmeyebilir olsa da, geçerli bir cevaptır ve gelecekte SF ziyaretçileri için yararlı olabilir ve bu nedenle silmemenizi tavsiye ederim.
Reinstate Monica

Yanıtlar:


6

Sorununuzun görevi çalıştırmak için kullanılan hesabın izinleriyle veya görevi çalıştırmaya çalışırken hesabın bağlamıyla ilgili olduğuna inanıyorum .

Konsol Oturumu Gereksinimi Testi

.EXE'nizinConsole bilgisayarda (Oturum 0 olarak da bilinir) bilgisayarda çalıştırılması mümkündür . Bunu test etmek için:

  1. Görevi yalnızca kullanıcı oturum açtığında Çalışacak şekilde yapılandırın ve gelecekte 2 dakikalık bir görev başlangıç ​​zamanı belirtin
  2. Makinede görevi çalıştırmak için kullanılan kullanıcı hesabıyla oturum açın (tercihen konsol oturumunda fiziksel olarak konsolda bulunarak veya konsola erişim sağlayan bir uzaktan erişim programı kullanarak oturum açın. Konsol oturumu, bir Komut İstemi çalıştırmasından QWINSTA, SESSIONNAMEsütunu gözlemleyin ve >göstergenin yanında olduğunu doğrulayın, consolebaşka bir deyişle şu şekilde görünmelidir >console)
  3. Görevin çalışmasını bekleyin

Görev düzgün çalışırsa SCHTASKS.EXE, /ITparametreyi kullanarak görevi zamanlamayı deneyin . Bunu yapmazsanız, bilgisayarı servis kullanıcı hesabınız olarak otomatik olarak oturum açacak ve görevi bir başlangıç ​​programı olarak çalıştıracak şekilde yapılandırmaktan başka seçeneğiniz olmayabilir.

İzinleri Kontrol Et

Ayrıca, daha önce de önerdiğim gibi, görevi yürütmek için kullanılan hesaba düzgün bir şekilde izin verildiğini doğrulamak için aşağıdakileri kontrol edin:

  1. Hesaba toplu iş olarak oturum açma kullanıcı hakkı verin (Yerel Grup İlkesinde bulunur Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments)
  2. Görevin en yüksek ayrıcalıklarla çalışacak şekilde yapılandırıldığını onaylayın
  3. Kullanıcının etkileşim kurması gereken tüm klasörler ve dosyalar için tam NTFS izinlerine sahip olduğunu doğrulayın. Varsayımlarda bulunmayın; bunun yerine bu tür dosya konumlarına gidip Effective Permissionsdosyanın / klasörün Özellikler sekmesindeki sekmeyi kullanarak onaylayın .Security > Advanced

Kontrol edilecek / denenecek ek şeyler

  • Görev, ağ kaynaklarına erişim gerektiriyor mu? Kullanıcı hesabıyla oturum açtığınızda eşlenen sürücüler gibi şeyler bulunabilir , ancak sunucunun yapılandırmasına bağlı olarak Görev Zamanlayıcı'dan yürütüldüğünde kullanıcı hesabı bağlamında bulunmayabilir.
  • Toplu iş dosyanıza bir miktar günlük kaydı ekleyin. Yürüttüğü her satırdan sonra, bir günlük dosyasına bazı çıktılar yazmasını sağlayın, böylece nerede sıkıştığını bilirsiniz. Örneğin:

    @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"
    
  • Senin çalıştırmayı deneyin .exe ile STARTörneğin,START "myTitle" "C:\full\path\to\my.EXE"


2

Başka birine yardımcı olması durumunda eski bir gönderiye yanıt veriyorum. Aynı sorunu yaşadım. Olay günlüğü, programın normal olarak tamamlandığını söyledi, ancak ilk kod satırı bile günlüğe benim için yazmayacaktı. Sonunda Görev Zamanlayıcı'da "Başla" seçeneği oldu. Geçerli dizindeyken programın komut satırından iyi çalıştığı aklıma geldi. Aynı dizinde manifest dosyaları ve diğer bağımlılıklar var. Dolayısıyla, planlanan işe EXE ile aynı dizinde başlamasını söylerseniz, olumlu sonuçlar alabilirsiniz. Benim için çözüm buydu.


Bu, yapılandırma dosyaları ile Visual Studio'da geliştirilen özel bir konsol uygulamasını çalıştırmak için bir çözümdü.
billfredtom

1

belki bu sana yardımcı olur?

/programming/6939548/a-workaround-for-the-fact-that-a-scheduled-task-in-windows-requires-a-user-to-be

Benzer bir sorun yaşadık ve tek çözümünüz, sunucuda otomatik oturum açma özel bir hesap açmamızdı. Yani görev zaten loged kullanıcı altında koştu bizim .exe iyi çalıştı ...

bunun çok hoş bir çözüm olmadığını biliyorum ama bizim için işe yarayan tek şey buydu. Bunun sizin için işe yarayıp yaramadığını bilmiyorum ... (Ama bu çalışma ile kullanıcı gerçekten her zaman giriş yapmış olup olmadığını kontrol etmek zorundasınız ...)


Altında çalıştığı kullanıcı etkin bir şekilde oturum açtığında (RDP aracılığıyla) görev benim için düzgün çalışmıyor. Hizmet hesabını RDP ile oturum açmak, görevi manuel olarak başlatmak için kullanıyorum ve bir pencere görünmüyor.
MarioDS

2
"En yüksek ayrıcalıklarla çalıştır" seçeneğinin işaretini kaldırdınız mı? Bu seçeneği işaretlediğinizde, hakların bir açıklaması (UAC) olacağını ve kullanıcı oturum açmış olsa bile bir pencere görmeyeceğinizi düşünüyorum (pencere olmadan ayrı bir oturumda çağrılacak ve başarısız olacaktır). Ayrıca, "->" için Windows Server 2003, Windows XP veya Windows 2000 için yapılandırılmış "seçeneğini seçmeye çalışın.
frupfrup

Bu fark yok gibi görünüyor, ben şimdi "kullanıcı oturum açmış olup olmadığını çalıştırın" ayarlamak dışında "Hata kodu 2147943859 alıyorum. Ben sadece" için yapılandırıldı "ya Windows Vista/Windows Server 2008ya ayarlayabilirsiniz Windows 7/Windows Server 2008 R2. Fark etmiyor gibi görünüyor.
MarioDS

tamam. son bir test: "Kolay görev oluştur" yerine "yeni görev oluştur" ile yeni bir görev oluşturun (hangi metnin gerçekten gösterildiğini bilmiyorum - sunucularım almanca - ama umarım ne demek istediğimi biliyorsun.) ve sonra "Windows Server 2003, ..." seçebilirsiniz düşünüyorum. ve sonra pls diğer seçeneklerle bir kez daha deneyin ...
frupfrup

1

Müşterilerimizin sunucularını çalıştıran şirketin adamları bir GUI programının zamanlanmış görevler yoluyla hiçbir şekilde yürütülmeyeceğini söylediler.

Görev planlama özelliklerine sahip bir izleme sistemi kullanırlar. Bunu bununla kurdular ve işe yarıyor gibi görünüyor.

Maalesef burada daha fazla öneri değerlendirme şansı bulamadım, ama yine de yardım etmeye çalıştığın için teşekkürler. Umarım gelecekte başkalarına yardımcı olabilir, ki kesinlikle öyle olacağını düşünüyorum.


1

Windows 2008 R2 sunucusundaki görev zamanlayıcısını kullanarak eski VB6 programını başlatmaya çalışıyordum. Uygulama, toplu iş dosyası aracılığıyla veya bir kısayola tıklayarak exe'den çalışır, ancak görev zamanlayıcıdan çalışmaz. C: \ program files (x86) dizinindeki uygulamalar klasöründe saklanan uygulamanın yapılandırma dosyalarının c: \ programdata üzerindeki uygulama klasörüne kopyalandığını gördüm. zamanlayıcı çalıştı. cmd.exe dosyasının yapılandırmayı görev zamanlayıcısı tarafından kullanılandan farklı bir konumdan uyguladığı anlaşılıyor. Uygulamanızda yapılandırma dosyaları varsa, bunları c: \ programdata \ application klasörüne taşımayı deneyebilirsiniz.


0

Komut dosyanızda veya programınızda eşlenmiş ağ sürücülerine mi başvuruyorsunuz ? Bir süre önce planlanan görevimin çalışmayacağı benzer bir sorun yaşadım ve nedenini bulamadım. Yolları UNC yollarına değiştirmek benim için çözdü.

Değişim T:\Apps\MyProgram.exeiçin\\MyServer\MyShare\Apps\MyProgram.exe


Hayır, program yerel C:sürücüde.
MarioDS

0

Görevi "Kullanıcının oturum açmış olup olmadığını çalıştır" diyecek şekilde yapılandırdığımda ve en yüksek ayrıcalıklarla çalıştır seçeneğinin işareti kaldırıldığında, hata değeri 2147943859 olur.

2147943859 Hex'e dönüştürülen 800705b3, Google'a hızlı bir yolculuk bana "Bilgisayarda kurulum programı başlatılamadı. Bu işlem etkileşimli bir pencere istasyonu gerektiriyor" anlamına geliyor.

Şimdi, PSEXEC (Sysinternals'dan) kullanmadan etkileşimli çalışmasına neden olmanın bir yolu olabilir, ancak PSEXEC aracılığıyla nasıl yapacağımı zaten bildiğim için kullanacağım budur.

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

Bu nedenle, her şeyi psexec.exe -i (ve yükseltmeniz gerekiyorsa -h) ile başa çıkmak için eyleminizi değiştirin ve çalışması gerekir.

Bunu Windows Server 2008 R2 SP1'de 'eylemimde' aşağıdakilerle denedim:

c:\windows\system32\cmd.exe

ve sonra parametreler:

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

Görevi el ile çalıştırdığımda (zamanlama olmadığından) geçerli oturumumda çalışan bir not defteri alıyorum.


0

Belki bu sorunun cevabı başka birisinin bu konuyu okumasına yardımcı olacaktır?

/programming/32589381/

Özet: , Windows 2012 Zamanlanmış Görevler do not dahil doğru ortam değişkenleri bkz PATHgörev olarak çalışacak şekilde ayarlanmıştır hesap için.

Yukarıdakileri çalışmadan önce bunları uzun bir süre okudum. (Bu da OP'nin sorusuyla aynı soruna yol açan kendi sorunumdu.)

Bunu (nihayet!) Bir kez öğrendikten sonra, (stackoverflow cevabına göre) test etmek, olduğunu görmek ve etrafında çalışmak oldukça kolaydır ....

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.