โปรแกรมทำงานไม่ถูกต้องตามภารกิจที่กำหนดไว้


12

สถานการณ์

ฉันมีสคริปต์แบทช์ที่เตรียมไฟล์บางไฟล์รันโปรแกรม ( .exe) แล้วลบไฟล์ที่กล่าว

งานนี้ควรทำงานทุกชั่วโมงดังนั้นฉันจึงพยายามกำหนดค่านี้โดยใช้งานที่กำหนดเวลาไว้ ปัญหาคือโปรแกรมที่กล่าวถึงก่อนหน้านี้ทำงานไม่ถูกต้องเมื่อเรียกใช้จากงาน (ไม่ผ่าน.batสคริปต์หรือเมื่อโทร.exeโดยตรง) แต่ฉันไม่ได้รับคำเตือนหรือข้อความแสดงข้อผิดพลาดในบันทึก

ติดตั้ง

งานได้รับการกำหนดค่าให้ทำงานเป็นบัญชีบริการ Windows ที่มีการตั้งค่าสิทธิ์ทั้งหมดอย่างถูกต้อง เมื่อใช้บัญชีนี้เพื่อเข้าสู่ระบบผ่าน RDP ฉันสามารถดำเนินการ.batและ.exeโดยตรงโดยไม่มีปัญหา แต่ก็ยังมีงานที่ดูเหมือนจะไม่ทำอะไรเลย สิ่งนี้สามารถสังเกตได้ง่ายเนื่องจากโปรแกรมจะทำการปรับเปลี่ยนไฟล์เสมอและการแก้ไขในการประทับเวลาจะไม่เปลี่ยนแปลงไปตามภารกิจ

ในบันทึกภารกิจที่กำหนดเวลาไว้ฉันจะได้รับข้อความข้อมูลสำหรับงานที่เริ่มต้นกระบวนการออก ฯลฯ อย่างไรก็ตาม "รหัสผลลัพธ์" คือ111(พยายามที่จะใช้ Google โดยไม่มีโชคการเชื่อมโยงเดียวที่ฉันได้รับคือ "ชื่อไฟล์ยาวเกินไป "ซึ่งเป็น AFAIK ที่ไม่เกี่ยวข้องอย่างสมบูรณ์) ในบันทึกของแอปพลิเคชันฉันไม่ได้รับสิ่งใดเลย

สิ่งที่ฉันสงสัยว่าเป็นปัญหา

โปรแกรมนี้เป็นสิ่งที่น่ารังเกียจอย่างยิ่งที่วางไข่หน้าจอสแปลบางส่วน (จริงๆแล้วมันเป็นหน้าต่างปกติ) แม้ว่าจะไม่จำเป็นต้องใช้ GUI เพราะมันไม่ต้องการการโต้ตอบและปิดตัวเองหลังจากการทำงาน หน้าต่างจะปรากฏขึ้นประมาณ 2 วินาที

ฉันสงสัยว่าข้อกำหนดนี้สำหรับ GUI มีส่วนเกี่ยวข้องกับงานที่ล้มเหลว แต่ฉันไม่แน่ใจ เมื่อฉันเข้าสู่ระบบด้วยผู้ใช้ที่งานภายใต้ (ผ่าน RDP) ไม่มีหน้าต่างปรากฏขึ้นเมื่อฉันเริ่มงานที่กำหนด


แก้ไขเกี่ยวกับ GUI

ฉันได้สร้างโปรแกรมปฏิบัติการ C # ขนาดเล็กมากซึ่งเปิดตัวโปรแกรมโดยไม่มีหน้าต่างหลัก (โดยใช้ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden) แม้วิธีนี้งานที่กำหนดยังไม่ประสบความสำเร็จในการเปิดตัวโปรแกรมอย่างถูกต้อง 0แต่รหัสการส่งคืนอยู่ในขณะนี้


ปรับปรุง

เมื่อฉันกำหนดค่างานที่จะพูดว่า "การทำงานไม่ว่าจะเป็นผู้ใช้ที่ลงทะเบียนหรือไม่" และrun with highest privilegesตัวเลือกที่ไม่ จำกัด , 2147943859ค่าความผิดพลาดคือ


ฉันจะแก้ไขปัญหาได้อย่างไร

OS = Windows Server 2008 R2 SP1

หากต้องการข้อมูลเพิ่มเติมโปรดแจ้งให้เราทราบในความคิดเห็น


สคริปต์และ "โปรแกรม" ของคุณป้อนข้อมูลใด ๆ เช่นตัวเลือกหรือพารามิเตอร์หรือไม่ คุณลองใช้ PowerShell แทนที่จะเป็นชุดหรือไม่? เมื่อเริ่มต้น.exe"โปรแกรม" ด้วยพารามิเตอร์จากภายในสคริปต์อินพุตจะต้องมีการจัดเตรียมอย่างเหมาะสมเป็นอาร์กิวเมนต์
slybloty

1
คุณลองใช้ตัวกำหนดตารางเวลาด้วยโปรแกรมอื่นหรือไม่? เพียงแค่แทนที่โปรแกรมหนึ่งด้วยโปรแกรมอื่นแล้วดูผลลัพธ์ที่คุณได้รับ
slybloty

2
@ out-null ฉันไม่คิดว่า task scheduler ใช้หน้าต่างรู้เมื่อโปรแกรมทำงานเสร็จมันควรรอให้โพรเซสทำงานกับ windows แต่ถ้าโปรแกรมพยายามค้นหาบางอย่างที่เฉพาะเจาะจงเพื่อสร้างหน้าจอเริ่มต้น (สมมติว่าแถบงาน) และล้มเหลวในการค้นหา (เพราะทำงานบนเดสก์ท็อป / สถานีหน้าต่างแยกต่างหาก) อาจเป็นได้ว่ามันหยุด ...
Ale

1
ตกลง. คุณลองใช้งานภายใต้บัญชี LocalSystem หรือไม่ คุณเคยลองติดตามการเปิดตัวกระบวนการด้วย Process Monitor จาก Sysinternals หรือไม่?
ลัคกี้ลุค

1
@BradBouchard แม้ว่าคำตอบของคุณไม่อาจแก้คำถามตรวจการณ์ในนี้กรณีเฉพาะก็เป็นคำตอบที่ถูกต้องและอาจจะมีประโยชน์สำหรับผู้เข้าชมในอนาคตที่จะ SF และผมจึงขอแนะนำให้คุณไม่ได้ที่จะลบมัน
ฉันพูดว่า Reinstate Monica

คำตอบ:


6

ฉันเชื่อว่าปัญหาของคุณเกี่ยวข้องกับสิทธิ์ของบัญชีที่จะใช้ในการทำงานหรือบริบทของบัญชีตามที่มีอยู่เมื่อพยายามเรียกใช้งาน

ทดสอบข้อกำหนดของเซสชันคอนโซล

เป็นไปได้ว่า. EXEของคุณจะต้องทำงานในConsoleเซสชัน (หรือที่รู้จักในเซสชัน 0) บนคอมพิวเตอร์ เพื่อทดสอบสิ่งนี้:

  1. กำหนดค่าภารกิจเป็นRun เฉพาะเมื่อผู้ใช้เข้าสู่ระบบและระบุเวลาเริ่มงาน 2 นาทีในอนาคต
  2. เข้าสู่ระบบด้วยบัญชีผู้ใช้เดียวกันกับที่ใช้ในการเรียกใช้งาน (โดยเฉพาะอย่างยิ่งเข้าสู่ระบบในเซสชันของคอนโซลโดยอยู่ที่คอนโซลหรือใช้โปรแกรมการเข้าถึงระยะไกลที่ให้การเข้าถึงคอนโซลเพื่อยืนยันว่าคุณกำลังใช้ เซสชันคอนโซลจากการเรียกใช้พร้อมรับคำสั่งQWINSTAสังเกตSESSIONNAMEคอลัมน์และยืนยัน>ตัวบ่งชี้ที่อยู่ถัดจากconsoleในคำอื่น ๆ ที่มันควรจะปรากฏเป็น>console)
  3. รอให้งานรัน

หากงานรันอย่างถูกต้องลองกำหนดเวลางานSCHTASKS.EXEโดยใช้/ITพารามิเตอร์ ความล้มเหลวนั้นคุณอาจไม่มีทางเลือกนอกจากกำหนดค่าคอมพิวเตอร์ให้เข้าสู่ระบบโดยอัตโนมัติในฐานะบัญชีผู้ใช้บริการของคุณและเรียกใช้งานเป็นโปรแกรมเริ่มต้น

ตรวจสอบการอนุญาต

นอกจากนี้ตามที่ฉันแนะนำไปแล้วให้ตรวจสอบสิ่งต่อไปนี้เพื่อยืนยันบัญชีที่ใช้ในการทำงานได้รับอนุญาตอย่างถูกต้อง:

  1. ให้บัญชีเข้าสู่ระบบในฐานะผู้ใช้งานแบทช์ขวา (พบในนโยบายกลุ่มท้องถิ่นที่Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments)
  2. ยืนยันว่างานได้รับการกำหนดค่าให้เรียกใช้ด้วยสิทธิ์พิเศษสูงสุด
  3. ยืนยันว่าผู้ใช้มีสิทธิ์ NTFS เต็มรูปแบบสำหรับโฟลเดอร์และไฟล์ทั้งหมดที่ต้องมีการโต้ตอบ อย่าตั้งสมมติฐาน; แทนที่จะยืนยันโดยไปที่ตำแหน่งไฟล์ดังกล่าวและใช้Effective Permissionsแท็บในคุณสมบัติของไฟล์ / โฟลเดอร์ที่Security > Advanced

สิ่งเพิ่มเติมเพื่อตรวจสอบ / ลอง

  • ภารกิจต้องการการเข้าถึงเพื่อเข้าถึงทรัพยากรเครือข่ายหรือไม่? สิ่งต่าง ๆ เช่นไดรฟ์ที่แมปอาจปรากฏขึ้นเมื่อคุณเข้าสู่ระบบด้วยบัญชีผู้ใช้ แต่ขึ้นอยู่กับการกำหนดค่าเซิร์ฟเวอร์อาจไม่ปรากฏในบริบทของบัญชีผู้ใช้เมื่อดำเนินการจาก Task Scheduler
  • เพิ่มการบันทึกบางอย่างลงในไฟล์แบทช์ของคุณ หลังจากทุกบรรทัดที่เรียกใช้งานให้เขียนเอาต์พุตไปยังล็อกไฟล์เพื่อให้คุณรู้ว่ามันค้างที่ไหน ตัวอย่างเช่น:

    @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"
    
  • ลองใช้. EXEของคุณด้วยSTARTเช่นSTART "myTitle" "C:\full\path\to\my.EXE"


2

ฉันตอบกลับโพสต์เก่าในกรณีที่ช่วยคนอื่น ฉันมีปัญหาเดียวกัน บันทึกเหตุการณ์กล่าวว่าโปรแกรมดำเนินการตามปกติ แต่ไม่มีแม้แต่บรรทัดแรกของรหัสที่จะเขียนลงในบันทึกของฉัน มันกลายเป็นตัวเลือก "เริ่มต้น" ใน Task Scheduler มันเกิดขึ้นกับฉันว่าโปรแกรมทำงานได้ดีจากบรรทัดคำสั่งเมื่อฉันอยู่ในไดเรกทอรีปัจจุบัน มีไฟล์รายการและการอ้างอิงอื่น ๆ ในไดเรกทอรีเดียวกัน ดังนั้นหากคุณบอกให้งานที่กำหนดเวลาไว้เริ่มต้นในไดเรกทอรีเดียวกับ EXE คุณอาจได้รับผลลัพธ์ที่น่าพอใจ มันเป็นทางออกสำหรับฉัน


นี่เป็นทางออกสำหรับการเรียกใช้แอปคอนโซลแบบกำหนดเองที่พัฒนาใน Visual Studio พร้อมไฟล์รองรับ
billfredtom

1

บางทีนี่อาจช่วยคุณได้?

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

เรามีปัญหาที่คล้ายกันและวิธีแก้ปัญหาเดียวของคุณคือเราได้สร้างบัญชีพิเศษบนเซิร์ฟเวอร์ที่มีระบบอัตโนมัติ ดังนั้นหากงานวิ่งภายใต้ผู้ใช้ที่เข้าสู่ระบบแล้ว. exe ของเราทำงานได้ดี ...

ฉันรู้ว่านี่ไม่ใช่ทางออกที่ดีมาก แต่สำหรับเรามันเป็นสิ่งเดียวที่ทำงานได้ ฉันไม่ทราบว่าสิ่งนี้เหมาะกับคุณหรือไม่ (แต่ด้วยวิธีการนี้คุณต้องตรวจสอบว่าผู้ใช้ลงชื่อเข้าใช้ตลอดเวลาหรือไม่ ... )


งานไม่ได้ทำงานอย่างถูกต้องสำหรับฉันเมื่อผู้ใช้ที่ทำงานภายใต้ถูกล็อกออนอย่างมีประสิทธิภาพ (ผ่าน RDP) ฉันใช้บัญชีบริการเพื่อเข้าสู่ระบบผ่าน RDP เริ่มงานด้วยตนเองและฉันไม่เห็นหน้าต่างปรากฏขึ้น
MarioDS

2
คุณยกเลิกการเลือกตัวเลือก "ทำงานด้วยสิทธิพิเศษสูงสุด" หรือไม่? ฉันคิดว่าเมื่อคุณตรวจสอบตัวเลือกนี้จะมีการยกระดับสิทธิ์ (UAC) และคุณจะไม่เห็นหน้าต่างแม้ว่าผู้ใช้จะเข้าสู่ระบบ (จะถูกเรียกในเซสชันแยกต่างหากโดยไม่มีหน้าต่างและจะล้มเหลว) ลองเลือกตัวเลือก "configure for" -> "Windows Server 2003, Windows XP หรือ Windows 2000"
frupfrup

ที่ดูเหมือนว่าจะทำให้ไม่แตกต่างกันยกเว้นเมื่อตอนนี้ผมตั้ง "ทำงานไม่ว่าผู้ใช้จะเข้าสู่ระบบหรือไม่" ฉันได้รับรหัสข้อผิดพลาด 2147943859. ฉันสามารถตั้งค่าเพียง "การกำหนดค่าสำหรับ" อย่างใดอย่างหนึ่งหรือWindows Vista/Windows Server 2008 Windows 7/Windows Server 2008 R2ดูเหมือนว่าจะไม่สร้างความแตกต่าง
MarioDS

ตกลง. การทดสอบครั้งสุดท้ายหนึ่งครั้ง: สร้างงานใหม่ด้วย "สร้างงานใหม่" แทน "สร้างงานง่าย" (ฉันไม่ทราบว่าข้อความใดที่แสดงจริง - เซิร์ฟเวอร์ของฉันเป็นภาษาเยอรมัน - แต่ฉันหวังว่าคุณจะรู้ว่าฉันหมายถึงอะไร) ฉันคิดว่าคุณสามารถเลือก "windows Server 2003, ... " จากนั้นโปรดลองอีกครั้งโดยใช้ตัวเลือกอื่น ๆ ...
frupfrup

1

คนของ บริษัท ที่ดูแลเซิร์ฟเวอร์ของลูกค้าของเรากล่าวว่าโปรแกรม GUI จะไม่ทำงานผ่านงานที่กำหนดไว้ไม่ว่าในกรณีใด ๆ

พวกเขาใช้ระบบการตรวจสอบที่มีคุณสมบัติการจัดตารางงาน พวกเขาตั้งค่าผ่านสิ่งนั้นและดูเหมือนว่าจะใช้งานได้

ขออภัยที่ฉันไม่ได้รับโอกาสในการประเมินคำแนะนำเพิ่มเติมที่นี่ แต่ขอบคุณที่พยายามช่วยเหลือ ฉันหวังว่ามันจะช่วยคนอื่นในอนาคตซึ่งฉันคิดว่ามันจะเป็นอย่างแน่นอน


1

ฉันพยายามเริ่มต้นและโปรแกรม VB6 เก่าโดยใช้ task scheduler บนเซิร์ฟเวอร์ Windows 2008 R2 แอปพลิเคชันจะเรียกใช้จาก exe ผ่านไฟล์แบตช์หรือคลิกที่ทางลัด แต่จะไม่เรียกใช้จากตัวกำหนดเวลางาน ฉันพบว่าเมื่อไฟล์การกำหนดค่าสำหรับแอปพลิเคชันซึ่งเก็บไว้ในโฟลเดอร์แอปพลิเคชันในไดเรกทอรี C: \ program files (x86) ถูกคัดลอกไปยังโฟลเดอร์แอปพลิเคชันใน c: \ programdata กำหนดการทำงาน ปรากฏว่า cmd.exe ใช้การกำหนดค่าจากตำแหน่งอื่นกับที่ใช้โดยตัวกำหนดเวลางาน หากแอปพลิเคชันของคุณมีไฟล์กำหนดค่าคุณสามารถลองย้ายไปยังโฟลเดอร์ c: \ programdata \ application


0

คุณอ้างอิงไดรฟ์เครือข่ายที่แมปไว้ในสคริปต์หรือโปรแกรมของคุณหรือไม่? ฉันมีปัญหาที่คล้ายกันในขณะที่งานที่กำหนดเวลาของฉันไม่ทำงานและฉันไม่สามารถหาสาเหตุได้ การเปลี่ยนเส้นทางเป็นเส้นทาง UNC แก้ให้ฉัน

เปลี่ยนT:\Apps\MyProgram.exeเป็น\\MyServer\MyShare\Apps\MyProgram.exe


ไม่โปรแกรมอยู่บนC:ไดรฟ์ในเครื่อง
MarioDS

0

เมื่อฉันกำหนดค่างานให้พูดว่า "เรียกใช้ว่าผู้ใช้เข้าสู่ระบบหรือไม่" และตัวเลือกการเรียกใช้ที่มีสิทธิ์สูงสุดจะไม่ถูกตรวจสอบค่าความผิดพลาดคือ 2147943859

2147943859 แปลงเป็น Hex คือ 800705b3 ซึ่งการเดินทางอย่างรวดเร็วไปยัง Google บอกฉันว่า "ไม่สามารถเริ่มโปรแกรมการติดตั้งบนคอมพิวเตอร์การดำเนินการนี้ต้องใช้สถานีหน้าต่างแบบโต้ตอบ"

ตอนนี้อาจมีวิธีที่จะทำให้มันทำงานแบบโต้ตอบโดยไม่ต้องใช้ PSEXEC (จาก Sysinternals) แต่เนื่องจากฉันรู้แล้วว่าจะทำอย่างไรผ่าน PSEXEC นั่นคือสิ่งที่ฉันใช้

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

ดังนั้นให้เปลี่ยนการกระทำของคุณเพื่อเพิ่มทุกอย่างด้วย psexec.exe -i (และ -h หากคุณต้องการยกระดับ) และควรจะใช้งานได้

ฉันได้ลองทำสิ่งนี้ใน Windows Server 2008 R2 SP1 โดยใช้สิ่งต่อไปนี้ใน 'การกระทำ' ของฉัน:

c:\windows\system32\cmd.exe

แล้วพารามิเตอร์:

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

เมื่อฉันเรียกใช้งานด้วยตนเอง (เนื่องจากฉันไม่มีตาราง) ฉันได้รับแผ่นจดบันทึกที่ยกระดับในเซสชันปัจจุบันของฉัน


0

บางทีคำตอบของคำถามนี้จะช่วยให้คนอื่นอ่านกระทู้นี้?

/programming/32589381/

สรุป:งานที่กำหนดเวลาไว้ใน Windows 2012 ไม่เห็นตัวแปรสภาพแวดล้อมที่ถูกต้องรวมถึงPATHบัญชีที่งานถูกตั้งค่าให้ทำงาน

ฉันอ่านทั้งหมดนี้ค่อนข้างนานก่อนที่ฉันจะทำงานข้างต้น (ซึ่งเป็นปัญหาของฉันเองที่นำไปสู่คำถามเดียวกันกับ OP)

เมื่อคุณ (สุดท้าย!) รู้สิ่งนี้มันค่อนข้างง่ายที่จะทดสอบ (ตามคำตอบของ stackoverflow) ดูว่ามันเกิดขึ้นและหลีกเลี่ยงมัน ....

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.