Trước khi tôi bị bắn hạ, tôi biết cách lên lịch tác vụ, khởi động lại dịch vụ bằng powershell hoặc cung cấp cho tài khoản không phải quản trị viên các đặc quyền để khởi động lại dịch vụ. Đó không phải là vấn đề. Tuy nhiên, vấn đề là sự kết hợp của cả ba nhiệm vụ này.
Tôi có một dịch vụ windows cần xử lý tệp trên thư mục mạng. Do đó, nó đăng nhập bằng "tài khoản dịch vụ" thực sự chỉ là một tài khoản miền thông thường. Tài khoản miền này không phải là quản trị viên nhưng có quyền truy cập vào thư mục nói trên. Dịch vụ này hoạt động tốt và hoạt động tốt.
Tuy nhiên, đôi khi có một lỗi trong một trong các tệp ngăn các tệp khác bị xử lý. Thông thường phải mất một thời gian để ai đó chú ý và có một số tồn đọng.
Vì vậy, tôi đã tạo một tập lệnh giám sát trong powershell để thăm dò thư mục mạng cho các tệp sai này. Nếu chúng được tìm thấy, các tệp sẽ được chuyển đến một thư mục tạm thời để xem xét và dịch vụ cần phải được khởi động lại.
Tôi đã cho các đặc quyền tài khoản dịch vụ thông qua chính sách nhóm để bắt đầu và dừng dịch vụ.
Khi tôi đăng nhập vào máy chủ bằng tài khoản dịch vụ, tôi có thể khởi động lại dịch vụ theo cách thủ công bằng cách sử dụng Dịch vụ MMC. Tôi cũng có thể thực thi tập lệnh powershell và nó thực hiện chính xác những gì nó phải làm: thăm dò thư mục, di chuyển các tập tin và khởi động lại dịch vụ. Tuyệt quá!
Trong giai đoạn tiếp theo, tôi đã tạo một tác vụ theo lịch trình chạy cứ sau 10 phút. Tác vụ sử dụng cùng một tài khoản dịch vụ như dịch vụ để thực thi tập lệnh powershell. Hộp "thực thi với các đặc quyền cao nhất" được chọn. Giống như tôi đã nói, tập lệnh powershell cần truy cập vào ổ đĩa mạng, vì vậy tôi không thể chạy nó với tư cách là quản trị viên máy chủ cục bộ và tôi không muốn sử dụng thông tin quản trị viên tên miền cho một nhiệm vụ như thế này. (Tôi cố gắng thực hiện nguyên tắc đặc quyền tối thiểu nhất có thể.)
Tôi đã cấp cho tài khoản dịch vụ quyền "đăng nhập theo đợt" trên máy chủ cục bộ bằng MMC Chính sách bảo mật cục bộ.
Bây giờ là phần mà tôi không thể tìm ra: Tại thời điểm đã lên lịch, các tác vụ theo lịch trình sẽ hoàn thành thành công và tập lệnh powershell đang được thực thi. Kịch bản thăm dò thư mục và các tệp lỗi được di chuyển. Điều duy nhất không hoạt động là khởi động lại dịch vụ ...?! Một lần nữa, chạy tập lệnh theo cách thủ công khi cùng một người dùng hoạt động hoàn hảo.
Tôi không thấy nhiều trong trình xem sự kiện, nhưng việc đăng nhập vào tập lệnh của tôi cho biết lỗi này:
TerminatingError (Dừng dịch vụ): "Không thể mở Trình quản lý kiểm soát dịch vụ trên máy tính '.'. Hoạt động này có thể yêu cầu các đặc quyền khác."
Các lệnh tôi sử dụng để khởi động lại dịch vụ là:
Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
(Tôi đang sử dụng máy chủ windows 2012 R2 và powershell phiên bản 4 trên Miền 2008 R2.)
Cập nhật: Cả hai tôi đã thử thiết lập quyền dịch vụ cho người dùng bằng subinacl (như được mô tả ở đây ) và đặt chuỗi SDDL theo cách thủ công (như được mô tả ở đây ), vì vậy các cờ điều khiển của tôi trông như thế này (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1- X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Tôi cũng đã thử đặt các đặc quyền trên dịch vụ thành Kiểm soát hoàn toàn trong GPO. Không ai trong số này giải quyết vấn đề cả. Nó phải là một vấn đề với các đặc quyền ở đâu đó mà tôi vẫn đang xem xét, bởi vì khi tôi lên lịch tác vụ với tài khoản miền là quản trị viên cục bộ trên máy chủ, nó hoạt động rất tốt.
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
thay vì Stop-Service
CmdLet? Câu trả lời này và Dịch vụ bắt đầu dường như không thể truy cập từ xa theo câu trả lời này: Không thể sử dụng Get-Service mật vụ trên máy tính từ xa và thông báo lỗi của bạn có thể liên quan đến việc cố gắng kết nối với "localhost" từ xa. ' (<== đó là một dấu chấm ở đó.)