2013-07-24 29 views
5

Đây là mã của tôi đang cố gắng chạy cmd.exe với quản trị viên. Tuy nhiên, tôi nhận được yêu cầu hoạt động đòi hỏi độ cao. nếu tôi chạy cmd.exe với "Chạy như quản trị" thông qua cửa sổ của tôi, nó hoạt động, tuy nhiên, thông qua vb, nó không. Đây là mã của tôi.Chạy cmd.exe với admin priviliges

Try 
     Dim process As New Process() 
     process.StartInfo.FileName = "cmd.exe " 
     process.StartInfo.Verb = "runas" 
     process.StartInfo.UseShellExecute = False 
     process.StartInfo.RedirectStandardInput = True 
     process.StartInfo.RedirectStandardOutput = True 
     process.StartInfo.RedirectStandardError = True 
     process.StartInfo.CreateNoWindow = True 

     process.Start() 
     process.StandardInput.WriteLine("route add 8.31.99.141 mask 255.255.255.255 " & cmdorder) 
     process.StandardInput.WriteLine("exit") 
     Dim input As String = process.StandardOutput.ReadToEnd 
     process.Close() 
     Dim regex As Regex = New Regex("(ok)+", RegexOptions.IgnoreCase) ' wa requested 
     ' txtLog.AppendText(input) 
     Return regex.IsMatch(input) 

Cảm ơn.

+0

tham số 'runas' làm cho quá trình này yêu cầu sự cho phép để leo thang đặc quyền. Đó là hành vi hoàn toàn chính xác. Hãy thử sử dụng 'psexec' từ các công cụ quản trị. –

Trả lời

10

Bạn không thể đạt được những gì bạn muốn.

Bạn thể sử dụng Process.Start() để khởi động một quá trình nâng cao, nhưng chỉ nếu bạn UseShellExecute = true:

Dim process As New Process() 
process.StartInfo.FileName = "cmd.exe " 
process.StartInfo.Verb = "runas" 
process.StartInfo.UseShellExecute = True 
process.Start() 

Lý do là bởi vì bạn phải sử dụng ShellExecute nếu bạn muốn khởi động một quá trình nâng cao. Chỉ ShellExecute biết cách nâng cao.

Nếu bạn chỉ định UseShellExecute = False thì CreateProcess được sử dụng thay vì ShellExecute. CreateProcess không biết cách nâng cao. Tại sao? From the AppCompat guy:

Vâng, CreateProcess thực sự thấp trong các lớp. Bạn có thể làm gì mà không có khả năng tạo ra một quy trình? Không phải là một toàn bộ rất nhiều. Tuy nhiên, độ cao là một câu chuyện khác. Nó đòi hỏi một chuyến đi đến dịch vụ nâng cao ứng dụng. Điều này sau đó gọi vào approved.exe, mà phải biết cách đọc chính sách nhóm và, nếu cần thiết, chuyển sang màn hình bảo mật và bật mở cửa sổ và yêu cầu người dùng cho phép/thông tin xác thực, v.v. Chúng tôi thậm chí không cần lấy tất cả các tính năng này, chúng ta hãy lấy hộp thoại.

Bây giờ, để tạo quy trình yêu cầu độ cao, thông thường bạn chỉ cần chuyển đổi API. Vỏ nằm trong một lớp cao hơn nhiều, và do đó có thể mất một sự phụ thuộc vào độ cao. Vì vậy, bạn chỉ cần trao đổi cuộc gọi của bạn sang CreateProcess với một cuộc gọi đến ShellExecute.

Vì vậy, giải thích cách bạn có thể nâng cao cmd, nhưng một khi bạn làm: bạn không được phép chuyển hướng đầu ra hoặc ẩn cửa sổ; as only CreateProcess can do that:

Chuyển hướng I/O và ẩn cửa sổ chỉ có thể hoạt động nếu quá trình được tạo bởi CreateProcess().

Cách nào lâu để nói rằng anh chàng này đã yêu cầu same question over here; nhưng không có sự phẫn nộ khi có ai đó đóng câu hỏi của bạn.

Lưu ý: Mọi mã được phát hành vào miền công cộng. Không yêu cầu ghi nhận tác giả.

+0

'process.StartInfo.RedirectStandardOutput = True' là cần thiết để đọc đầu ra. Nhưng có vẻ như nó không thể được thiết lập với 'UseShellExecute'. Vui lòng cung cấp giải pháp nếu có. – Ammar

0

Đặt làm đối tượng và sau đó đặt để khởi động yêu cầu quản trị viên riêng tư trong điều application.object.settings.

Các vấn đề liên quan