Làm cách nào để buộc ứng dụng .NET của tôi chạy với tư cách quản trị viên?


876

Khi chương trình của tôi được cài đặt trên máy khách, làm cách nào để buộc chương trình của tôi chạy với tư cách quản trị viên trên Windows 7?


3
Bên cạnh những gì Binary Worrier đã viết, bạn có thể muốn viết một số mã để kiểm tra nếu bạn có quyền quản trị viên .. (đó có phải là những gì bạn đang yêu cầu không?)
lexu

39
Mặc dù vậy, tôi sẽ không xem nhẹ nhiệm vụ này, bạn nên xác minh xem nó thực sự cần gì cho quản trị viên và xem liệu bạn có thể làm việc xung quanh nó không. Không có khách hàng sẽ hài lòng khi chạy một ứng dụng trong chế độ quản trị viên mọi lúc. Rất nhiều khách hàng lớn hơn thậm chí sẽ không xem xét một ứng dụng như vậy và nếu thử nghiệm logo quan trọng với bạn, nó sẽ không vượt qua như thế.
Alex

2
Alex là rất nhiều điểm. Nếu có thể, chỉ nâng cao khi cần thiết, nếu không, Chính sách nhóm, UAC và một số biến khác sẽ được sử dụng. Ít nhất, với UAC, người dùng sẽ phải ủy quyền cho mỗi lần chạy thay vì chỉ khi một hành động người dùng cụ thể được thực hiện.
Anthony Mason

Cách chính xác là nhúng một tệp kê khai vào ứng dụng của bạn.
Elmue

Câu trả lời:


1145

Bạn sẽ muốn sửa đổi bảng kê khai được nhúng trong chương trình. Điều này hoạt động trên Visual Studio 2008 trở lên: Project + Thêm mục mới, chọn "Tệp kê khai ứng dụng". Thay đổi thành <requestedExecutionLevel>phần thành:

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

Người dùng nhận được lời nhắc UAC khi họ khởi động chương trình. Sử dụng một cách khôn ngoan; sự kiên nhẫn của họ có thể bị hao mòn nhanh chóng.


33
Nếu bạn gặp lỗi ClickOnce khi cố gắng biên dịch, hãy xem câu trả lời sau: stackoverflow.com/questions/11023998/ Kẻ
SSS

17
Dự án của bạn cũng phải được thiết lập để sử dụng bảng kê khai ứng dụng - trong Thuộc tính dự án, kiểm tra tab "Ứng dụng" và đảm bảo "Bản kê khai:" bên dưới 'Tài nguyên "được đặt thành app.manifest (hoặc bất cứ điều gì bạn đặt tên. tệp kê khai).
Victor Chelaru

7
Tôi đã phải tải lại dự án trước khi VS sẽ nhắc tôi khởi động lại trong chế độ quản trị viên.
Jon

3
@Alejandro - Có, UAC có thể bị vô hiệu hóa, nhưng khi đó, ứng dụng sẽ tự động chạy với tư cách quản trị viên (giả sử người dùng của bạn có quyền quản trị viên), vì vô hiệu hóa UAC có nghĩa là mọi thứ chạy ở đặc quyền cao nhất mà người dùng được phép. Nó giống như phàn nàn rằng nếu bạn cài đặt một khóa lạ mắt trên cửa, nó sẽ không hoạt động nếu cửa được gỡ bỏ.
Erik Funkenbusch

4
@ErikFunkenbusch Nó sẽ không "tự động chạy với tư cách quản trị viên", nó sẽ chạy dưới sự cho phép thông thường của người dùng (quản trị viên nếu người dùng là quản trị viên hoặc tiêu chuẩn nếu người dùng là tiêu chuẩn). Dựa vào trường hợp cụ thể đó, ngay cả khi đó là mặc định, là những chương trình tốt sẽ tránh được như bệnh dịch hạch. Theo sự tương tự của bạn, khóa ưa thích là tốt và tất cả, nhưng phần mềm được thiết kế đúng phải dự đoán trường hợp toàn bộ cửa bị loại bỏ, ngay cả khi đó là một sự cố hiếm gặp.
Alejandro

155

Thêm một requestedExecutionLevelyếu tố vào bảng kê khai của bạn chỉ là một nửa trận chiến; bạn phải nhớ rằng UAC có thể bị tắt. Nếu đúng như vậy, bạn phải thực hiện kiểm tra theo cách cũ của trường và đưa ra hộp thoại báo lỗi nếu người dùng không phải là quản trị viên
(gọi IsInRole(WindowsBuiltInRole.Administrator)theo chủ đề của bạn CurrentPrincipal).


22
Bạn cũng có thể sử dụng <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> cũng
Đánh dấu Kram

18
@MarkKram: Cao nhất có thể làm gì với điều này? Câu hỏi đặt ra là khoảng buộc admin, highestAvailable là ít hạn chế hơn requireAdministrator và sẽ cho phép người dùng không phải quản trị bắt đầu ứng dụng un-nâng lên không có UAC nhắc nhở, quản trị viên chỉ sẽ nhận được nhắc nhở ...
Anders


Tôi không nhớ các chi tiết chính xác nữa nhưng tôi nghĩ điều này phụ thuộc vào ý của bạn khi bị vô hiệu hóa. Đặt "thanh trượt UAC" xuống tận cùng không giống như vô hiệu hóa UAC (ngoại trừ trên Vista). Nếu UAC bị vô hiệu hóa hoàn toàn, toàn bộ cơ chế mức toàn vẹn sẽ bị tắt và chỉ có tính năng runas.exe cổ điển từ 2000 / XP. Kiểm tra vai trò quản trị xử lý trường hợp runas.exe.
Anders

1
Tôi đã đặt EnableLUA thành 0 trên Server 2008 R2 và tự xóa mình khỏi nhóm Quản trị viên, đã khởi động lại và bây giờ, một exe chỉ định level = "Yêu cầu quản trị viên" chạy mà không cần bất kỳ lời nhắc nào
Tal Aloni

87

Các bước chi tiết như sau.

  1. Thêm tệp kê khai ứng dụng vào giải pháp
  2. Thay đổi cài đặt ứng dụng thành "app.manifest"
  3. Cập nhật thẻ của "RequestExecutLevel" thành requestAd Administrator.

Thêm tệp trong Giải pháp

Chọn tệp kê khai ứng dụng

Chọn tùy chọn kê khai

Cập nhật tệp kê khai

Lưu ý rằng sử dụng mã này, bạn cần tắt cài đặt bảo mật của ClickOnce, để thực hiện việc này, hãy vào bên trong Thuộc tính -> Bảo mật -> Bảo mật ClickOnce


New Item...không phải là một tùy chọn trong dự án Dịch vụ cài đặt của tôi. Làm thế nào tôi có thể thêm về bảng kê khai ứng dụng? Tôi có thể thêm nó vào dự án chính của mình nhưng không phải là trình cài đặt.
HackSlash

61

Tôi đã triển khai một số mã để thực hiện thủ công:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}

45
Điều này chỉ phát hiện nếu bối cảnh đang chạy với tư cách Quản trị viên, nó không cho phép ứng dụng chạy với tư cách Quản trị viên theo yêu cầu của OP
Matt Wilko

5
Tôi không nghĩ có bất kỳ cách lập trình nào để buộc một ứng dụng nâng cao khả năng của chính nó. Nếu có, đó sẽ là rủi ro bảo mật, phải không?
Mark Richman

6
Mặc dù giải pháp của bạn là tốt nhưng câu hỏi là khác nhau. ;)
Yash

xem phiên bản được cấu trúc lại của phương pháp này tại đây stackoverflow.com/a/50186997 (chủ quan)
Hakan Fıstık

Điều này không trả lời câu hỏi!
Elmue


19

Trong khi làm việc trên Visual Studio 2008, nhấp chuột phải Project -> Add New Itemvà sau đó chọn Application Manifest File.

Trong tệp kê khai, bạn sẽ tìm thấy thẻ requestedExecutionLevelvà bạn có thể đặt cấp độ thành ba giá trị:

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

HOẶC LÀ

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

HOẶC LÀ

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

Để đặt ứng dụng của bạn chạy với tư cách quản trị viên, bạn phải chọn ứng dụng ở giữa.


Những công việc này. Tuy nhiên, nó đã làm cho một cửa sổ cmd trống xuất hiện khi chạy ứng dụng CMD (sử dụng ứng dụng c # cmd để chạy một số exe trong nền).
WM

13

Theo

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

bạn sẽ muốn thêm một bảng kê khai ứng dụng nếu bạn chưa có hoặc không biết cách thêm. Vì một số dự án không tự động thêm một tệp kê khai riêng biệt, trước tiên hãy chuyển đến thuộc tính dự án, điều hướng đến tab Ứng dụng và kiểm tra để đảm bảo dự án của bạn không loại trừ tệp kê khai ở cuối vòi.

  • Tiếp theo, nhấp chuột phải vào dự án
  • Thêm mục mới
  • Cuối cùng, tìm và nhấp vào Tệp kê khai ứng dụng

12

Trong Visual Studio 2010, nhấp chuột phải vào tên dự án của bạn. Nhấn "Xem cài đặt Windows", thao tác này sẽ tạo và mở một tệp có tên "app.manifest". Trong tệp này thay thế "asInvoker" bằng "Yêu cầu quản trị viên" như được giải thích trong các phần nhận xét trong tệp.


6
Câu trả lời này là về VB.NET :-), không phải VS 2010 nói chung. Câu trả lời "Thêm mục mới" là về C #. Trong C ++, bạn có thể làm điều đó trong cài đặt dự án.
Philm

12

Một cách khác để làm điều này, chỉ trong mã, là phát hiện nếu quá trình đang chạy với tư cách quản trị viên như trong câu trả lời của @NG. . Và sau đó mở ứng dụng một lần nữa và đóng cái hiện tại.

Tôi sử dụng mã này khi một ứng dụng chỉ cần đặc quyền của quản trị viên khi chạy trong một số điều kiện nhất định, chẳng hạn như khi cài đặt chính nó như một dịch vụ. Vì vậy, nó không cần phải chạy như quản trị viên mọi lúc như các câu trả lời khác cũng buộc nó.

Lưu ý trong đoạn mã dưới đây NeedsToRunAsAdminlà một phương pháp phát hiện nếu trong các điều kiện hiện tại, đặc quyền quản trị viên được yêu cầu. Nếu điều này trả về falsemã sẽ không tự nâng cao. Đây là một lợi thế lớn của phương pháp này so với các phương pháp khác.

Mặc dù mã này có những ưu điểm đã nêu ở trên, nhưng nó cần phải tự khởi chạy lại như một quy trình mới không phải lúc nào cũng như bạn muốn.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

1
+1 cho cách tiếp cận chỉ mã. Lưu ý rằng bạn cần kích hoạt UAC để có cơ hội khởi chạy mọi thứ với runastư cách quản trị viên từ người dùng không phải quản trị viên, nếu không, nó sẽ mở âm thầm với quyền người dùng hiện tại (được kiểm tra trên windows 7 64 bit). Theo như tôi có thể nói điều duy nhất bạn có thể làm với UAC bị vô hiệu hóa và quyền quản trị viên bị thiếu là dừng thực thi trong một thời điểm thích hợp.
thực sự là

9

Bạn có thể tạo tệp kê khai bằng Cài đặt bảo mật ClickOnce, sau đó tắt nó:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

Sau khi bạn nhấp vào nó, một tệp sẽ được tạo trong thư mục thuộc tính của Project có tên app.manifest sau khi được tạo, bạn có thể bỏ Enable ClickOnce Security Settingschọn tùy chọn

Mở tệp đó và thay đổi dòng này:

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

đến:

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

Điều này sẽ làm cho chương trình yêu cầu quyền quản trị viên.


7

Đây là phiên bản đơn giản hóa của câu trả lời này , ở trên bởi @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

1
Điều này không trả lời câu hỏi!
Elmue

@Elmue hợp lý hơn khi thêm nhận xét của bạn vào câu trả lời ban đầu mà tôi vừa tái cấu trúc, bạn có thể tìm thấy một liên kết đến câu trả lời đó trong tôi.
Hakan Fıstık

-3

Nhấp chuột phải vào tệp thực thi của bạn, đi đến Thuộc tính> Tương thích và chọn hộp 'Chạy chương trình này với tư cách quản trị viên'.

Nếu bạn muốn chạy nó với tư cách quản trị viên cho tất cả người dùng, hãy thực hiện tương tự trong 'thay đổi cài đặt cho tất cả người dùng'.


4
Điều này không trả lời câu hỏi. "Khi chương trình của tôi được cài đặt trên máy khách", không phải "tôi phải làm thế nào".
Joe

Xin lỗi vì không rõ ràng. Khi chương trình của bạn được cài đặt, hãy thay đổi cài đặt này trong các thuộc tính thực thi của bạn (chương trình chính của bạn, không phải trình cài đặt). Anh ta muốn buộc chương trình của mình chạy với tư cách quản trị viên.
SlickJayD

2
Tốt hơn hết là đặt yêu cầu quản trị viên trong tệp kê khai. Tôi tranh luận rằng nó trả lời câu hỏi, nhưng chỉ vừa đủ.
BradleyDotNET

3
@Joe Để công bằng, câu trả lời được chấp nhận không trả lời câu hỏi OP vì yêu cầu bạn phải cài đặt lại ứng dụng exe. Đó không phải là một giải pháp cho "Khi chương trình của tôi được cài đặt". Nếu bất cứ điều gì câu trả lời bị bỏ qua này chính xác hơn câu trả lời được chấp nhận, vì vậy tôi không hiểu tại sao câu trả lời đó có hơn 400 phiếu bầu.
NickG

Trên thực tế, nó trả lời cả hai câu hỏi một cách hoàn hảo. Không có nhiều cơ hội để thay đổi bảng kê khai sau khi cài đặt và các chương trình không nên cố gắng nâng cao quyền của họ sau khi chạy - trong nhiều môi trường - đó là một cách tốt để được gọi là phần mềm độc hại. Trong hầu hết các công ty - câu trả lời này là tốt nhất bởi vì nó đặt trách nhiệm cho người dùng và quyền của họ. Tôi viết rất nhiều mã mà tôi không thể "nhìn thấy" hoặc chạy khi nó đang được sản xuất. Cố gắng không khéo léo hơn mối quan tâm bảo mật của riêng bạn.
jinzai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.