2008-09-25 34 views
114

Tôi đang cố cài đặt dịch vụ bằng InstallUtil.exe nhưng được gọi thông qua Process.Start. Dưới đây là các mã:Đặc quyền quy trình nâng cao có lập trình?

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath); 
System.Diagnostics.Process.Start (startInfo); 

nơi m_strInstallUtil là đầy đủ đường dẫn và exe để "InstallUtil.exe" và strExePath là đầy đủ đường dẫn/tên để dịch vụ của tôi.

Chạy cú pháp dòng lệnh từ lời nhắc lệnh nâng cao hoạt động; chạy từ ứng dụng của tôi (sử dụng mã trên) thì không. Tôi cho rằng tôi đang xử lý một số vấn đề về độ cao của quy trình, vậy làm cách nào tôi có thể chạy quy trình của mình ở trạng thái nâng cao? Tôi có cần phải xem ShellExecute cho điều này không?

Đây là tất cả trên Windows Vista. Tôi đang chạy quá trình trong trình sửa lỗi VS2008 nâng lên đặc quyền quản trị.

Tôi cũng đã thử đặt startInfo.Verb = "runas"; nhưng dường như không giải quyết được sự cố.

Trả lời

138

Bạn có thể chỉ ra quy trình mới nên bắt đầu với quyền cao bằng cách thiết lập thuộc tính của đối tượng StartInfo của bạn Động từ để 'runas', như sau:

startInfo.Verb = "runas"; 

Điều này sẽ làm cho Windows hoạt động như nếu quá trình đã được bắt đầu từ Explorer với lệnh "Run as Administrator".

Điều này có nghĩa là lời nhắc UAC sẽ xuất hiện và sẽ cần được người dùng thừa nhận: nếu điều này là không mong muốn (ví dụ vì điều này xảy ra ở giữa quá trình dài), bạn cần chạy toàn bộ quy trình lưu trữ có quyền nâng cao theo mức Create and Embed an Application Manifest (UAC) để yêu cầu cấp độ thực thi 'cao nhất có thể': điều này sẽ khiến lời nhắc UAC xuất hiện ngay khi ứng dụng của bạn bắt đầu và khiến tất cả các tiến trình con chạy với quyền cao mà không cần nhắc thêm.

Chỉnh sửa: Tôi thấy bạn vừa chỉnh sửa câu hỏi của mình để tuyên bố rằng "runas" không hoạt động cho bạn. Đó là thực sự kỳ lạ, vì nó nên (và không cho tôi trong một số ứng dụng sản xuất). Việc yêu cầu quy trình gốc để chạy với quyền nâng cao bằng cách nhúng tệp kê khai chắc chắn sẽ hoạt động.

+6

"runas" không hoạt động đối với tôi. Có thể là nó chỉ hoạt động với UAC tắt? –

+0

Nó đã giúp tôi, tôi tự hỏi, nếu điều này làm việc cho tất cả các hệ điều hành windows? –

+1

Điều này dường như không hoạt động trên Windows 8. Làm việc tốt trên các phiên bản trước. – Despertar

1

Bạn nên sử dụng Mạo danh để nâng cao trạng thái.

WindowsIdentity identity = new WindowsIdentity(accessToken); 
WindowsImpersonationContext context = identity.Impersonate(); 

Đừng quên hoàn tác ngữ cảnh mạo danh khi bạn hoàn tất.

+21

Bạn chưa nói cách nhận accessToken. LogonUser sẽ cung cấp bối cảnh an ninh bị hạn chế của người dùng khi UAC được kích hoạt. – cwa

19

Theo this article, chỉ ShellExecute kiểm tra tệp kê khai được nhúng và nhắc người dùng nâng cao nếu cần, còn CreateProcess và các API khác thì không. Hy vọng nó giúp.

+1

Cảm ơn, đây là cách duy nhất tôi có nó hoạt động. –

+2

liên kết hiện không có sẵn –

+0

@ M.Kumaran nếu bạn thấy liên kết đã chết, hãy chỉnh sửa chúng bằng cách sử dụng https://web.archive.org –

5
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")] 

Thao tác này sẽ thực hiện mà không cần UAC - không cần bắt đầu quá trình mới. Nếu người dùng đang chạy là memeber của nhóm Admin như trường hợp của tôi.

+0

Sử dụng mã này Tôi nhận được lỗi quyền: "Yêu cầu quyền đối với tổ chức bảo mật không thành công.":( – Leonardo

+0

Có lẽ" Nếu người dùng đang chạy là người quản trị "* – hB0

+1

thú vị - điều này có thể xảy ra với bất kỳ phương pháp nào, không chỉ là một phương pháp hành động (tôi thậm chí đã thử nó trên phương pháp được xác định trong trang ASPX) –

34

Mã này đặt trên tất cả cùng nhau và khởi động lại ứng dụng hiện tại WPF với privs admin:

if (IsAdministrator() == false) 
{ 
    // Restart program and run as admin 
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; 
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName); 
    startInfo.Verb = "runas"; 
    System.Diagnostics.Process.Start(startInfo); 
    Application.Current.Shutdown(); 
    return; 
} 

private static bool IsAdministrator() 
{ 
    WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(identity); 
    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 


// To run as admin, alter exe manifest file after building. 
// Or create shortcut with "as admin" checked. 
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas". 
// Or an elevate vbs script can launch programs as admin. 
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass) 

Cập nhật: Ứng dụng cách biểu hiện được ưa thích:

dự án Nhấp chuột phải vào hình ảnh studio, thêm, tệp kê khai ứng dụng mới, thay đổi tệp để bạn có requireAdministrator được đặt như được hiển thị ở trên.

Một vấn đề với cách ban đầu: Nếu bạn đặt mã khởi động lại trong app.xaml.cs OnStartup, nó vẫn có thể khởi động cửa sổ chính ngay cả khi Shutdown được gọi. Cửa sổ chính của tôi bị hỏng nếu app.xaml.cs init không chạy và trong một số điều kiện chủng tộc nhất định, nó sẽ làm điều này.

+0

Xem bên dưới để cải thiện. – JCCyC

+0

requireAdministrator đã không làm việc trong trường hợp của tôi.Vì vậy, tôi đã phải làm theo cách của bạn.Điều này giải quyết vấn đề của tôi cảm ơn bạn.Nhưng tôi đã phải đặt đơn Instance ứng dụng để sai. – chris

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