Tôi đang sử dụng dịch vụ Windows bên thứ ba xử lý một số tác vụ tự động bằng cách chạy tập lệnh và thực thi bằng cách sử dụng CreateProcessAsUser(). Tôi đang chạy vào các vấn đề trên Windows Server 2008 do UAC và cách độ cao LUA được xử lý thông qua các API.bắt đầu quá trình nâng cấp UAC từ dịch vụ không tương tác (win32/.net/powershell)
Dịch vụ chạy dưới dạng LocalSystem và không bật "Tương tác với máy tính để bàn". Các tiến trình đang được chạy như người dùng trong nhóm quản trị viên, nhưng không phải là tài khoản quản trị viên (được miễn khỏi nhiều hạn chế UAC). Tất cả các cài đặt mặc định của UAC đều được áp dụng.
Tôi có thể chuyển các lệnh tùy ý hoặc mã powerhell cho dịch vụ, nhưng dường như tôi không thể 'thoát' khỏi quy trình không nâng cao, không tương tác bị dịch vụ khởi động.
Điểm mấu chốt của vấn đề có vẻ là tùy chọn API (công khai) duy nhất để bắt đầu quá trình nâng cao là ShellExecute() với động từ 'runas', nhưng tôi có thể nói rằng không thể gọi từ một dịch vụ không tương tác hoặc bạn gặp lỗi như "Thao tác này yêu cầu một trạm cửa sổ tương tác".
Cách giải quyết duy nhất mà tôi đã tìm thấy được đề cập ở đây: http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
Trong Vista, chính thức ghi nhận cách để nâng cao một quá trình chỉ sử dụng API vỏ ShellExecute (Ex) (không CreateProcess hoặc CreateProcessAsUser). Vì vậy, ứng dụng của bạn phải gọi ShellExecute (Ex) để khởi chạy trình trợ giúp được nâng lên để gọi cho SendInput. Hơn nữa, do phiên 0 cách ly, dịch vụ chỉ có thể sử dụng CreateProcessAsUser hoặc CreateProcessWithLogonW (không thể sử dụng ShellExecute (Ex)) để chỉ định máy tính để bàn tương tác.
..Tôi nghĩ rằng không có cách nào trực tiếp để sinh ra một quy trình nâng cao từ dịch vụ cửa sổ. Chúng tôi chỉ có thể sử dụng lần đầu tiên CreateProcessAsUser hoặc CreateProcessWithLogonW để sinh ra một quy trình không được nâng lên vào người dùng phiên (máy tính để bàn tương tác). Sau đó, trong quy trình không nâng cao, nó có thể sử dụng ShellExecute (Ex) để sinh ra một quy trình nâng cao cho nhiệm vụ thực sự.
Để làm điều này từ mã .net/PowerShell, có vẻ như tôi sẽ phải làm một số P công phu/Gọi công cụ để gọi CreateProcessAsUser hoặc CreateProcessWithLogonW kể từ Net System.Diagnostics.ProcessStartInfo không có một tương đương với lpDesktop mà tôi có thể đặt thành "winsta0 \ default". Và tôi không rõ liệu LocalSystem có quyền gọi CreateProcessAsUser hoặc CreateProcessWithLogonW hay không.
Tôi cũng nhìn http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx và Process.Start with different credentials with UAC on
Dựa trên tất cả những gì, tôi đạt kết luận rằng không có cách nào đơn giản để làm điều này. Tui bỏ lỡ điều gì vậy? Điều này thực sự không có vẻ như nó nên được khó khăn như vậy. Có vẻ như UAC không bao giờ được thiết kế để xử lý các trường hợp sử dụng phi tương tác.
Và nếu bất kỳ người nào Microsoft cuối cùng đọc được điều này, tôi nhận thấy cách ShellExecute xử lý nội bộ độ cao bằng cách gọi đến Dịch vụ thông tin ứng dụng (AIS). Tại sao không phải là cùng một cuộc gọi đến AIS có sẵn thông qua một số Win32 hoặc .NET API? http://msdn.microsoft.com/en-us/library/bb756945.aspx
Xin lỗi đã chạy một chút thời gian. Cảm ơn mọi ý tưởng.
Thay vào đó, hãy nói rằng Server Core không hỗ trợ UAC. Dường như để xác nhận đánh giá của tôi. http://blogs.technet.com/server_core/archive/2009/01/19/user-account-control-uac-and-server-core.aspx –
Xem bài đăng của tôi ở đây, giải thích cách, đặc biệt nhìn vào LinkedToken phần: http://brianbondy.com/blog/id/100/understanding-windows-at-a-deeper-level-sessions-window-stations-and-desktops –