Chương trình không chạy đúng như Nhiệm vụ theo lịch trình


12

Tình hình

Tôi có một tập lệnh bó chuẩn bị một số tệp, thực thi chương trình ( .exe) và sau đó xóa các tệp đã nói.

Tác vụ này sẽ chạy hàng giờ, vì vậy tôi đang cố gắng định cấu hình này bằng Tác vụ theo lịch. Vấn đề là chương trình được đề cập trước đó không chạy đúng khi được gọi từ tác vụ (không thông qua .battập lệnh, cũng như khi gọi .exetrực tiếp), nhưng tôi không nhận được bất kỳ thông báo cảnh báo hoặc lỗi nào trong nhật ký.

Thiết lập

Tác vụ được định cấu hình để chạy dưới dạng Tài khoản dịch vụ Windows có tất cả các đặc quyền được đặt đúng. Khi sử dụng tài khoản này để đăng nhập qua RDP, tôi có thể thực thi trực tiếp .bat.exekhông gặp sự cố, nhưng nhiệm vụ dường như không làm gì cả. Điều này dễ dàng được quan sát bởi vì chương trình luôn sửa đổi một tệp và sửa đổi trên dấu thời gian không thay đổi thông qua tác vụ.

Trong nhật ký tác vụ theo lịch trình, tôi nhận được thông báo thông tin cho tác vụ bắt đầu quá trình, thoát, v.v. Tuy nhiên, "mã kết quả" là 111(đã cố gắng với Google điều này mà không gặp may, liên kết duy nhất tôi nhận được là "tên tệp quá dài ", Đó là AFAIK hoàn toàn không liên quan). Trong nhật ký ứng dụng, tôi hoàn toàn không nhận được gì.

Điều tôi nghi ngờ là vấn đề

Chương trình này là một quái vật cũ tạo ra một loại màn hình giật gân (thực ra là một cửa sổ bình thường), mặc dù GUI không cần thiết vì nó không yêu cầu tương tác và tự đóng lại sau khi hoạt động. Cửa sổ xuất hiện trong khoảng 2 giây.

Tôi nghi ngờ rằng yêu cầu này đối với GUI có liên quan đến nhiệm vụ thất bại, nhưng tôi không chắc chắn. Khi tôi đăng nhập với người dùng mà tác vụ chạy bên dưới (thông qua RDP), không có cửa sổ nào xuất hiện khi tôi bắt đầu tác vụ theo lịch trình.


Chỉnh sửa về GUI

Tôi đã xây dựng một chương trình thực thi C # rất nhỏ để khởi chạy chương trình mà không cần cửa sổ chính (sử dụng ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden). Ngay cả theo cách này, tác vụ theo lịch trình vẫn không thành công để khởi chạy chương trình một cách chính xác, nhưng mã trả về là ngay bây giờ 0.


Cập nhật

Khi tôi định cấu hình tác vụ để nói "chạy cho dù người dùng có đăng nhập hay không" và run with highest privilegestùy chọn này không được chọn , giá trị lỗi là 2147943859.


Tôi có thể làm gì để khắc phục sự cố?

HĐH = Windows Server 2008 R2 SP1

Nếu cần thêm thông tin, xin vui lòng cho tôi biết trong các ý kiến.


Tập lệnh và "chương trình" của bạn có nhận bất kỳ đầu vào nào, như các tùy chọn hoặc tham số không? Bạn đã thử sử dụng PowerShell thay vì hàng loạt chưa? Khi bắt đầu một .exe"chương trình" với các tham số từ trong tập lệnh, đầu vào phải được cung cấp đúng làm đối số.
slybloty

1
Bạn đã thử lên lịch với một chương trình khác chưa? Chỉ cần thay thế một chương trình bằng một chương trình khác và xem kết quả bạn nhận được.
slybloty

2
@ out-null Tôi không nghĩ rằng trình lập lịch tác vụ sử dụng cửa sổ để biết khi nào chương trình chạy xong, nó sẽ đợi quá trình, bất kể nó làm gì với windows. Nhưng nếu chương trình cố gắng tìm kiếm thứ gì đó cụ thể để tạo màn hình giật gân của nó (giả sử thanh tác vụ) và không tìm thấy nó (vì nó chạy trên một máy tính để bàn / cửa sổ riêng biệt), thì có thể nó dừng lại ...
Ale

1
ĐỒNG Ý. Bạn đã thử chạy nó dưới tài khoản LocalSystem chưa? Ngoài ra, bạn đã thử theo dõi sự kiện khởi chạy quy trình với Process Monitor từ Sysiternals chưa?
Lucky Luke

1
@BradBouchard Mặc dù câu trả lời của bạn có thể không giải quyết được câu hỏi Ops trong này trường hợp cụ thể, đó là một câu trả lời hợp lệ và có thể hữu ích cho du khách trong tương lai để SF, và do đó tôi muốn khuyến khích các bạn không xóa nó.
Tôi nói Phục hồi Monica

Câu trả lời:


6

Tôi tin rằng vấn đề của bạn liên quan đến quyền của tài khoản đang được sử dụng để chạy tác vụ hoặc bối cảnh của tài khoản tồn tại khi cố gắng chạy tác vụ.

Kiểm tra yêu cầu phiên giao diện điều khiển

Có thể .EXE của bạn phải được chạy trong Consolephiên (còn gọi là Phiên 0) trên máy tính. Để kiểm tra điều này:

  1. Định cấu hình tác vụ để Chỉ chạy khi người dùng đăng nhập và chỉ định thời gian bắt đầu tác vụ là 2 phút trong tương lai
  2. Đăng nhập vào máy có cùng tài khoản người dùng được sử dụng để chạy tác vụ (tốt nhất là đăng nhập vào phiên giao diện điều khiển, bằng cách vật lý ở bàn điều khiển hoặc sử dụng chương trình truy cập từ xa cho phép truy cập vào bàn điều khiển. Để xác nhận bạn đang sử dụng phiên giao diện điều khiển, từ lệnh Prompt chạy QWINSTA, quan sát SESSIONNAMEcột và xác nhận >chỉ báo ở bên cạnh console, nói cách khác, nó sẽ xuất hiện dưới dạng >console)
  3. Đợi nhiệm vụ chạy

Nếu tác vụ chạy chính xác, hãy thử lập lịch tác vụ bằng SCHTASKS.EXEcách sử dụng /ITtham số. Không có điều đó, bạn có thể không có lựa chọn nào khác ngoài việc cấu hình máy tính để tự động đăng nhập như tài khoản người dùng dịch vụ của bạn và chạy tác vụ như một chương trình khởi động.

Kiểm tra quyền

Ngoài ra, như tôi đã đề xuất, hãy kiểm tra các mục sau để xác nhận tài khoản được sử dụng để chạy tác vụ được cho phép đúng cách:

  1. Cấp cho tài khoản Đăng nhập dưới dạng quyền người dùng công việc hàng loạt (Tìm thấy trong Chính sách nhóm cục bộ tại Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments)
  2. Xác nhận tác vụ được cấu hình để Chạy với các đặc quyền cao nhất
  3. Xác nhận người dùng có quyền NTFS đầy đủ cho tất cả các thư mục & tệp mà nó phải tương tác. Không giả định; thay vào đó xác nhận bằng cách điều hướng đến các vị trí tệp như vậy và sử dụng Effective Permissionstab trong Thuộc tính của tệp / thư mục tạiSecurity > Advanced

Những điều bổ sung để kiểm tra / thử

  • Có nhiệm vụ yêu cầu truy cập để truy cập vào tài nguyên mạng? Những thứ như ổ đĩa được ánh xạ có thể xuất hiện khi bạn đăng nhập bằng tài khoản người dùng, nhưng tùy thuộc vào cấu hình của máy chủ có thể không có trong ngữ cảnh của tài khoản người dùng khi được thực thi từ Trình lập lịch tác vụ.
  • Thêm một số đăng nhập vào tập tin hàng loạt của bạn. Sau mỗi dòng nó thực thi, yêu cầu nó ghi một số đầu ra vào một tệp nhật ký để bạn biết nó bị kẹt ở đâu. Ví dụ:

    @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"
    
  • Hãy thử chạy .EXE của bạn với START, ví dụSTART "myTitle" "C:\full\path\to\my.EXE"


2

Tôi đang trả lời một bài viết cũ trong trường hợp nó giúp người khác. Tôi gặp vấn đề tương tự. Nhật ký sự kiện cho biết chương trình đã hoàn thành bình thường, nhưng thậm chí dòng mã đầu tiên sẽ không ghi vào nhật ký cho tôi. Cuối cùng, nó là tùy chọn "Bắt đầu trong" trong Trình lập lịch tác vụ. Nó xảy ra với tôi rằng chương trình chạy tốt từ dòng lệnh khi tôi đang ở trong thư mục hiện tại. Có các tệp kê khai và các phụ thuộc khác trong cùng một thư mục. Vì vậy, nếu bạn bảo công việc được lên lịch bắt đầu trong cùng thư mục với EXE, bạn có thể nhận được kết quả thuận lợi. Đó là giải pháp cho tôi.


Đây là giải pháp để chạy ứng dụng bảng điều khiển tùy chỉnh được phát triển trong Visual Studio với các tệp cấu hình hỗ trợ.
billfredtom

1

có lẽ điều này giúp bạn?

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

Chúng tôi đã có một vấn đề tương tự và giải pháp duy nhất của bạn là chúng tôi đã tạo một tài khoản đặc biệt trên máy chủ với autologin. Vì vậy, nếu tác vụ chạy dưới người dùng đã đăng nhập, .exe của chúng tôi hoạt động tốt ...

Tôi biết đây không phải là một giải pháp hay nhưng đối với chúng tôi, đó là điều duy nhất có hiệu quả. Tôi không biết điều này có hiệu quả với bạn không ... (Nhưng với công việc này, bạn phải kiểm tra xem người dùng có thực sự đăng nhập mọi lúc không ...)


Tác vụ thậm chí không chạy chính xác cho tôi khi người dùng mà nó chạy được đăng nhập hiệu quả (thông qua RDP). Tôi sử dụng tài khoản dịch vụ để đăng nhập thông qua RDP, bắt đầu tác vụ theo cách thủ công và tôi không thấy cửa sổ xuất hiện.
MarioDS

2
Bạn đã bỏ chọn tùy chọn "chạy với đặc quyền cao nhất" chưa? Tôi nghĩ rằng khi bạn đã kiểm tra tùy chọn này, sẽ xảy ra hiện tượng mất quyền (UAC) và bạn sẽ không thấy cửa sổ ngay cả khi người dùng đăng nhập (sẽ được gọi trong một phiên riêng không có cửa sổ và sẽ thất bại). Đồng thời thử chọn tùy chọn "được định cấu hình" -> "Windows Server 2003, Windows XP hoặc Windows 2000".
frupfrup

Điều đó dường như không có sự khác biệt, ngoại trừ khi tôi đặt "chạy cho dù người dùng đã đăng nhập hay chưa" Tôi nhận được mã lỗi 2147943859. Tôi chỉ có thể đặt "Định cấu hình cho" thành Windows Vista/Windows Server 2008hoặc Windows 7/Windows Server 2008 R2. Nó dường như không làm cho sự khác biệt.
MarioDS

đồng ý. Thử nghiệm cuối cùng: Tạo một nhiệm vụ mới với "tạo nhiệm vụ mới" thay vì "tạo nhiệm vụ dễ dàng" (tôi không biết văn bản nào thực sự được hiển thị - máy chủ của tôi là tiếng Đức - nhưng tôi hy vọng bạn biết ý tôi là gì.) tôi nghĩ bạn có thể chọn "windows Server 2003, ...". và sau đó vui lòng thử lại một lần nữa với các tùy chọn khác ...
frupfrup

1

Những người trong công ty điều hành các máy chủ của khách hàng của chúng tôi nói rằng một chương trình GUI sẽ không chạy qua các tác vụ theo lịch trình theo bất kỳ cách nào.

Họ sử dụng một hệ thống giám sát cũng có các tính năng lập lịch tác vụ. Họ đã thiết lập nó thông qua đó và nó dường như hoạt động.

Xin lỗi vì tôi không có cơ hội đánh giá thêm các đề xuất ở đây, nhưng cảm ơn vì đã cố gắng giúp đỡ. Tôi hy vọng rằng nó có thể giúp đỡ những người khác trong tương lai, mà tôi nghĩ nó chắc chắn sẽ làm được.


1

Tôi đã cố gắng khởi động và chương trình VB6 cũ bằng cách sử dụng bộ lập lịch tác vụ trên máy chủ Windows 2008 R2. Ứng dụng sẽ chạy từ exe, thông qua tệp bó hoặc nhấp vào phím tắt, nhưng sẽ không chạy từ bộ lập lịch tác vụ. Tôi thấy rằng khi các tệp cấu hình cho ứng dụng, được lưu trữ trong thư mục ứng dụng trong thư mục C: \ program files (x86) đã được sao chép vào thư mục ứng dụng trên c: \ programdata. người lập lịch làm việc có vẻ như cmd.exe áp dụng cấu hình từ một vị trí khác với vị trí được sử dụng bởi bộ lập lịch tác vụ. Nếu ứng dụng của bạn có tệp cấu hình, bạn có thể thử di chuyển chúng vào thư mục ứng dụng c: \ programdata \.


0

Bạn đang tham khảo bất kỳ ổ đĩa mạng được ánh xạ trong tập lệnh hoặc chương trình của bạn? Tôi đã gặp vấn đề tương tự một thời gian trước khi nhiệm vụ theo lịch trình của tôi sẽ không chạy và tôi không thể hiểu tại sao. Thay đổi (các) đường dẫn thành đường dẫn UNC đã giải quyết nó cho tôi.

Thay đổi T:\Apps\MyProgram.exethành\\MyServer\MyShare\Apps\MyProgram.exe


Không, chương trình là trên C:ổ đĩa địa phương .
MarioDS

0

Khi tôi định cấu hình tác vụ để nói "chạy cho dù người dùng có đăng nhập hay không" và tùy chọn chạy với đặc quyền cao nhất không được chọn, giá trị lỗi là 2147943859.

2147943859 được chuyển đổi thành Hex là 800705b3, một chuyến đi nhanh tới Google cho tôi biết có nghĩa là "Không thể bắt đầu chương trình cài đặt trên máy tính. Thao tác này yêu cầu trạm cửa sổ tương tác."

Bây giờ, có thể có một số cách để làm cho nó chạy tương tác mà không cần sử dụng PSEXEC (từ Sysiternals) nhưng vì tôi đã biết cách thực hiện thông qua PSEXEC đó là những gì tôi sử dụng.

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

Do đó, thay đổi hành động của bạn để trả trước mọi thứ với psexec.exe -i (và -h nếu bạn cần nâng cao) và nó nên hoạt động.

Tôi đã thử điều này trên Windows Server 2008 R2 SP1 với 'hành động' sau đây:

c:\windows\system32\cmd.exe

và sau đó là các tham số:

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

Khi tôi tự chạy tác vụ (vì tôi không có lịch trình), tôi nhận được một notepad nâng cao đang chạy trong phiên hiện tại của mình.


0

Có lẽ câu trả lời cho câu hỏi này sẽ giúp người khác đọc chủ đề này?

/programming/32589381/

Tóm tắt: Các tác vụ theo lịch trình của Windows 2012 không thấy các biến môi trường chính xác, bao gồm PATH, đối với tài khoản mà tác vụ được đặt để chạy dưới dạng.

Tôi đã đọc qua tất cả điều này khá lâu trước khi tôi làm việc ở trên. (Đó là vấn đề của riêng tôi dẫn đến câu hỏi của OP.)

Một khi bạn (cuối cùng!) Biết điều này, khá dễ dàng để kiểm tra nó (theo câu trả lời stackoverflow), xem nó xảy ra và làm việc xung quanh nó ....

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.