2011-12-31 15 views
5

Tôi cố gắng để chạy một lệnh cmd với đoạn mã sau:Run quá trình nâng

ProcessStartInfo cmd = new ProcessStartInfo("cmd.exe"); 
cmd.RedirectStandardInput = true; 
cmd.RedirectStandardOutput = true; 
cmd.RedirectStandardError = true; 
cmd.UseShellExecute = false; 
cmd.CreateNoWindow = true; 
cmd.WindowStyle = ProcessWindowStyle.Hidden; 
Process exec = Process.Start(cmd); 
exec.StandardInput.WriteLine("sc create \"BaliService\" binPath= \"{0}\\BaliService.exe\"", Directory.GetCurrentDirectory()); 

Lệnh này đòi hỏi privelages admin, nếu tôi chạy cmd as administrator và gõ lệnh nó hoạt động hoàn hảo nhưng không phải khi tôi chạy ứng dụng này là quản trị viên. Tôi đã thêm

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

đến một file manifest mà nhắc uac mỗi lần tôi mở exe.

Tôi đã thấy nhiều câu hỏi về điều này và tất cả dường như đề xuất bất kỳ quy trình nào chạy dưới ứng dụng được nâng cao sẽ có cùng quyền nhưng điều này không hiệu quả đối với tôi.

Tôi đã thử cmd.Verb = "runas"; nhưng không có súc sắc.

+0

Hãy thử thay đổi 'cmd.UseShellExecute' để 'true' và giữ' cái động từ runas'. – keyboardP

+0

Chỉ cần thử nó nhưng có lỗi này 'Các đối tượng quá trình phải có thuộc tính UseShellExecute đặt thành false để chuyển hướng IO streams.' Cảm ơn. –

+4

Đó là nơi buck dừng lại, bạn không thể có cả hai cách. UAC ngăn chặn một quá trình không liên quan từ hi-jacking các khả năng của một nâng cao. Cách duy nhất bạn có thể chuyển hướng là nâng cao bản thân trước. –

Trả lời

13

Bạn cần phải thiết lập UseShellExecute để true cho Verb để được tôn trọng và nó phải được thiết lập để 'false' để chuyển hướng đầu ra tiêu chuẩn. Bạn không thể làm cả hai.

Tôi khá chắc chắn Windows cũng sẽ không cho phép bạn chuyển hướng đầu vào/đầu ra/lỗi chuẩn qua ranh giới bảo mật quản trị/không phải quản trị viên. Bạn sẽ phải tìm một cách khác để lấy đầu ra từ chương trình đang chạy với tư cách quản trị viên.

tôi không đọc bài viết này, nhưng điều này có thể cung cấp cho bạn thêm thông tin: http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

+0

Tôi thử sử dụng UseShellExecute = false; Verb = "runas"; RedirectStandardInput = true; Tên miền = du [0]; UserName = UserAdministrator; Mật khẩu = SecureStringHelper.ToSecureString (pwd); LoadUserProfile = true; Và sử dụng requestedExecutionLevel trong tệp kê khai. Nếu tôi sử dụng UseShellExecute = true; Tôi nhận được lỗi Đối tượng Process phải có thuộc tính UseShellExecute được đặt thành false để bắt đầu quá trình với tư cách người dùng. – Kiquenet

+0

Mẫu đầy đủ cách khác nhau để có được kết quả đầu ra từ chương trình đang chạy dưới dạng quản trị viên? – Kiquenet

2

Bạn đã thử gán thông tin đăng nhập quản trị cho đối tượng ProcessStartInfo của mình chưa?

SecureString password = new SecureString(); 
password.AppendChar('p'); 
password.AppendChar('w'); 
cmd.UserName = "admin"; 
cmd.Password = password; 
+0

Tôi không thể làm điều này vì tôi cần UAC để nhắc cho họ vì nó sẽ được sử dụng trên nhiều máy tính, cảm ơn. –

+0

Được rồi, có ý nghĩa. Bạn có thể cho tôi biết lý do tại sao bạn đang tạo ra một quá trình lệnh và chỉ đạo nó để thực hiện "sc" thay vì sau đó chạy lệnh "sc" trực tiếp? – Abbas

+0

Tôi đang cố gắng chạy lệnh sc thông qua một nút trên một winform như người dùng sẽ không biết làm thế nào để sử dụng sc, chỉ để làm cho nó dễ dàng cho họ để sử dụng chương trình. –