“ClickOnce không hỗ trợ mức thực thi yêu cầu 'requestAdministrator.'"


93

Vì vậy, tôi đã viết một ứng dụng yêu cầu quyền truy cập vào sổ đăng ký. Tôi chưa chạm vào bất kỳ cài đặt bản dựng nào, muốn mọi thứ hoạt động trước khi tôi thêm các lần chạm khác, chẳng hạn như mô tả hoặc tên.

Ngoài màu xanh, tôi nhận được một lỗi sẽ không biến mất. ClickOnce does not support the request execution level 'requireAdministrator'.Bây giờ, tôi chưa chạm vào ClickOnce trong ứng dụng này. Tất cả những gì tôi đã làm là bao gồm một tệp kê khai yêu cầu các quyền này.

Vấn đề của tôi bây giờ là lỗi này sẽ không biến mất và tôi không thể biên dịch chương trình của mình. Bất kỳ lời khuyên về những gì phải làm? (Ghi chú bên lề: Tôi chuẩn bị đi ngủ, vì vậy tôi sẽ kiểm tra chiều nay vào ngày mai).


4
Tôi ghét phải nói rõ ràng ở đây, nhưng bạn đã thêm một tệp kê khai yêu cầu requireAdministratorquyềnClickOnce bắt đầu phàn nàn rằng nó không hỗ trợrequireAdministrator . Vấn đề phải cực kỳ rõ ràng. ClickOnce nhận thấy nhu cầu nâng cao trong tệp kê khai của bạn (trở thành một phần của ứng dụng của bạn). Tôi không chắc chắn những gì bạn càng cần ở đây ...
Ken trắng

4
@KenWhite: Tuy nhiên, có lẽ không hoàn toàn rõ ràng và cũng không hợp lý khi yêu cầu quản trị kết hợp với nhấp chuột một lần ngăn cản bạn biên dịch dự án, không chỉ chạy nó - mà còn.
500 - Lỗi máy chủ nội bộ

@ 500-InternalServerError, logic sẽ cho bạn biết rằng mối quan hệ nhân quả tồn tại chỉ đơn giản là việc thêm "yêu cầu Quản trị viên" khiến nó không thể biên dịch vì điều gì đó liên quan đến "yêu cầu Quản trị viên không được hỗ trợ", IMO. :-)
Ken White

1
Vấn đề không phải là tôi muốn sử dụng ClickOnce và quyền quản trị viên, vấn đề là tôi muốn sử dụng quyền quản trị viên, và đã biên dịch trước đó (khoảng 10 lần) với họ, nhưng lần này ClickOnce nói rằng nó không tương thích.
LMS

10
@KenWhite vấn đề không rõ ràng như bạn đề xuất. Sự cố xảy ra khi bạn nhấp vào nút "xuất bản" (ít nhất nó đã làm cho tôi). Tôi đã thêm tệp kê khai và chọn "requestAdministrator", sau đó chương trình hoạt động hoàn hảo. Chỉ khi tôi nhấp vào xuất bản, tôi mới bắt đầu gặp lỗi này và không thể xóa nó, cho đến khi tôi vào cài đặt và tắt "ClickOnce". Vì vậy, giải pháp không phải là "requestAdministrator" không được hỗ trợ, mà là "ClickOnce" không thể được kích hoạt và bạn không thể nhấp vào "Xuất bản" nếu bạn đã đặt "requestAdministrator".
Gavin Coates

Câu trả lời:


147

Chỉnh sửa: Nhận xét này cũng đưa ra một câu trả lời tốt.

Nhấp một lần xuất hiện để kích hoạt bất cứ khi nào bạn nhấp vào "Xuất bản", cho dù bạn có muốn hay không! Nếu bạn đang sử dụng "requestAdministrator" thì có vẻ như bạn không thể sử dụng ClickOnce và do đó không thể "Xuất bản" dự án của bạn.


Nguyên:

Hóa ra trong tab Bảo mật, "Bật cài đặt bảo mật ClickOnce" đã được chọn. Mặc dù tôi đã không kiểm tra nó. Dù sao, việc bỏ chọn đã dừng ClickOnce gây ra lỗi cho tôi. Phải mất một lúc để tìm ...


3
Ah, tôi nghĩ đó là rõ ràng từ các thông báo lỗi bạn có;)
500 - Internal Server Error

3
Điều khiến tôi bối rối là tôi đã không bật ClickOnce.
LMS

Câu hỏi và câu trả lời tốt, nó đã giúp tôi, Cảm ơn!
Moh

29
Nhấp một lần xuất hiện để bật bất cứ khi nào bạn nhấp vào "Xuất bản", cho dù bạn có muốn hay không! Nếu bạn đang sử dụng "requestAdministrator" thì có vẻ như bạn không thể sử dụng ClickOnce và do đó không thể "Xuất bản" dự án của bạn.
Gavin Coates

1
Những gì @GavinCoates nói là chính xác. Lý do là các ứng dụng ClickOnce luôn được cài đặt cho mỗi người dùng trong AppDatathư mục của nó . Nâng cao đặc quyền sẽ gây ra chuyển đổi bối cảnh người dùng, nơi ứng dụng ClickOnce thậm chí không được cài đặt.
bertl

43

Tôi biết đây là một câu hỏi cũ nhưng tôi đã đến đây hai năm sau vì vậy:

Bạn có thể vô hiệu hóa ClicKOnce từ tab Bảo mật trên phần mềm dự án để giải quyết vấn đề; xem bên dưới:

nhập mô tả hình ảnh ở đây


3
Và khi bạn xuất bản ứng dụng của mình, hộp kiểm này sẽ được kiểm tra lại.
dikkini

@dikkini, chính xác! làm thế nào để vô hiệu hóa nó, bất cứ ai có một câu trả lời?
saidfagan

@saidfagan không có câu trả lời hoặc giải pháp cho trường hợp này. Tôi sử dụng ULMerge để kết hợp các tệp exe và dll.
dikkini

18

Nếu bạn đã từng sử dụng trình hướng dẫn xuất bản hoặc 'Xuất bản ngay', hộp kiểm nhấp một lần sẽ tự động được chọn ...


16

Tôi biết điều này là cũ nhưng tôi tình cờ xem qua nó để tìm câu trả lời. Trong trường hợp của tôi, tôi đang sử dụng chức năng xuất bản và tôi cần tiếp tục sử dụng nó. Tôi cũng cần quyền truy cập vào khả năng quản trị viên. Vì vậy, vì lý do đó, không có câu trả lời nào ở trên phù hợp với tôi.

Tôi đã thêm một phương thức vào đầu ứng dụng của mình để kiểm tra xem nó có đang được chạy với tư cách quản trị viên hay không và nếu không, hãy khởi chạy lại chính nó với tư cách quản trị viên. Để làm điều này, bạn cần thêm các tài liệu tham khảo sau.

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;

Sau đó, bạn sẽ cần đặt nó ở nơi nào đó mà phương thức chính của bạn có thể truy cập thuận tiện. Tôi đang sử dụng WPF vì vậy tôi đã thêm nó vào MainWindow.xaml.cs nhưng bạn có thể thêm nó vào bất kỳ đâu sớm trong mã của mình. Chỉ cần nhớ thêm "static" vào các phương thức này nếu bạn cần.

private void AdminRelauncher()
{
    if (!IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
            Application.Current.Shutdown();
        }
        catch(Exception ex)
        {
            Console.WriteLine("This program must be run as an administrator! \n\n" + ex.ToString());
        }
    }
}

private bool IsRunAsAdmin()
{
    try
    {
        WindowsIdentity id = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(id);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (Exception)
    {
        return false;
    }
}

Cuối cùng, khi bắt đầu chương trình của bạn, hãy thêm một tham chiếu đến phương thức. Trong trường hợp của tôi, tôi đã thêm nó vào MainWindow nhưng cũng thêm nó vào Main hoạt động.

public MainWindow()
{
    InitializeComponent();
    AdminRelauncher(); //This is the only important line here, add it to a place it gets run early on.
}

Hi vọng điêu nay co ich!


nó bắt đầu một trường hợp mới, mà theo định nghĩa không gắn với các chương trình gỡ rối .. (bạn kêu gọi tự do tự do) Ví dụ (mới, và gần một trong những thuộc debugger)
deadManN

1
@deadManN rất đúng. Tôi đã giải quyết vấn đề này vì tôi không cần trình gỡ lỗi vào thời điểm đó nhưng tôi cho rằng bạn có thể chạy VS với tư cách quản trị viên và sau đó chương trình cũng sẽ được khởi chạy ở chế độ quản trị viên. bỏ qua khởi động lại. Tôi sẽ kiểm tra điều đó để chắc chắn.
Tyler C

1
Đối với bất kỳ ai tình cờ gặp phải điều này, những điều trên thực tế hoạt động.
Tyler C

>> Tên 'Ứng dụng' không tồn tại trong ngữ cảnh hiện tại. error
vee

Mã này chỉ bắt đầu quy trình mới nhưng ứng dụng của tôi là bảng điều khiển nên các đối số chỉ để trống.
vee

5

Bạn có thể thực hiện hành động này bằng cách chọn "Bật cài đặt bảo mật ClickOnce" (vì không thể "bỏ chọn" nó trong quá trình Xuất bản, như đã nêu) và sau đó bằng cách chọn "Đây là ứng dụng tin cậy một phần". "Local Intranet" sẽ tự động được chọn trong menu thả xuống, điều này hoàn toàn ổn.

Lưu các thay đổi của bạn, Xuất bản ứng dụng, ván trượt đã hoàn thành. :-)Đoạn mã cài đặt bảo mật


2

Hãy xem trong tệp app.Manifest của bạn và bạn sẽ thấy điều này:

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

Có hướng dẫn ở đó trong các nhận xét, nhưng chỉ cần xóa "requestAdministrator" và chèn nó vào là đã giải quyết được vấn đề cho tôi:

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

2
OP cho biết họ yêu cầu quyền truy cập vào sổ đăng ký trong ứng dụng của họ, vì vậy đây không phải là một tùy chọn.
LeeCambl

requireAdministratorđặc quyền được yêu cầu để ghi vào sổ đăng ký, vì vậy đây sẽ là một yêu cầu.
SkiSharp

ClickOnce không hỗ trợ mức thực thi yêu cầuasInvoke
SkiSharp

2

Tôi gặp vấn đề tương tự. Tôi giải quyết nó bằng cách bỏ chọn " Bật cài đặt bảo mật ClickOnce" Để Tìm tùy chọn này trong Visual Studio Nhấp chuột phải vào Dự án của bạn ==> thuộc tính ==> Chọn Bảo mật ==> Bật cài đặt bảo mật ClickOnce (Tùy chọn này là đã được chọn nên tôi đã bỏ chọn và sự cố của tôi được giải quyết).


2

Đây là đoạn mã cho VB.NET

If Not New WindowsPrincipal(WindowsIdentity.GetCurrent).IsInRole(WindowsBuiltInRole.Administrator) Then
            Process.Start(New ProcessStartInfo With { _
                                                     .UseShellExecute = True, _
                                                     .WorkingDirectory = Environment.CurrentDirectory, _
                                                     .FileName = Assembly.GetEntryAssembly.CodeBase, _
                                                     .Verb = "runas"})

CHỈNH SỬA: Nhưng nếu bạn triển khai theo cách này, một số Phần mềm AV sẽ chặn mã của bạn.


1

Đối với những người sử dụng bỏ chọn "Bật cài đặt bảo mật ClickOnce" không thể hoạt động, để thử phương pháp tôi tìm thấy.

Đầu tiên, để nguyên mục app.manifest requestExecutionLevel của bạn như sau:

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

Và sau đó bạn chỉnh sửa tệp Program.cs của mình như sau:

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Principal;
using System.Windows.Forms;

cấu trúc lại phương thức chính như:

    static void Main()
        {
            var wi = WindowsIdentity.GetCurrent();
            var wp = new WindowsPrincipal(wi);

            bool runAsAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator);

            if (!runAsAdmin)
            {
                // It is not possible to launch a ClickOnce app as administrator directly,
                // so instead we launch the app as administrator in a new process.
                var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);

                // The following properties run the new process as administrator
                processInfo.UseShellExecute = true;
                processInfo.Verb = "runas";

                // Start the new process
                try
                {
                    Process.Start(processInfo);
                }
                catch (Exception)
                {
                    // The user did not allow the application to run as administrator
                    MessageBox.Show("Sorry, but I don't seem to be able to start " + 
                       "this program with administrator rights!");
                }

                // Shut down the current process
                Application.Exit();
            }
            else
            {
                // We are running as administrator
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

Nó hoạt động trên Windows 10 và Visual Studio 2019!


1

Đối với bất kỳ ai gặp phải vấn đề này, tôi nghĩ rằng tôi sẽ đóng góp những gì cuối cùng đã làm việc cho tôi.

Đúng vậy, tùy chọn 'Bật cài đặt bảo mật ClickOnce' sẽ tự động được kiểm tra lại, nếu bạn bỏ chọn, khi bạn thực hiện Xây dựng> Xuất bản .

Đối với tôi, tôi không cần phải 'Xuất bản' - đó là một .exe di động, đơn giản tạo Công việc theo lịch trình cho người dùng của tôi và tôi cần đảm bảo rằng nó đã được nâng cao, ngay cả khi đăng nhập với tư cách là Quản trị viên.

Vì vậy, tôi vừa lấy .exe mới nhất của mình từ \ bin \ Release và đó là những gì được triển khai trên hệ thống của khách hàng của tôi.

Hoạt động như mong đợi - tức là khi tôi đặt nó trên hệ thống được bật / UAC / ở cài đặt cao nhất của nó, .exe có 'lá chắn' trên đó và khi tôi chạy nó, ngay cả khi đăng nhập với tư cách Quản trị viên, nó nâng cao và tôi nhận được lời nhắc UAC.

Ứng dụng lập lịch tác vụ nhỏ của tôi hiện có thể tạo tác vụ mà không gặp lỗi 'Truy cập bị Từ chối' (lỗi này trước đây, chỉ có thể được khắc phục bằng cách nhấp chuột phải vào .exe và nhấp vào Chạy với tư cách Quản trị viên).


Tôi đã gặp vấn đề chính xác này và không có câu trả lời nào ở trên hoạt động. Tôi ước họ sẽ hoạt động lại khi nhấp vào cài đặt bảo mật. Hoàn toàn cần thiết và là một tính năng tốt trong hầu hết các trường hợp, đặc biệt là đối với các ứng dụng được xuất bản trực tuyến, tuy nhiên, tôi ước có một lựa chọn / hoạt động tốt hơn chỉ dành cho các ấn phẩm dựa trên địa phương.
SkiSharp

-12

chỉ

Imports System.security

và U sẽ không gặp lỗi và ứng dụng của bạn sẽ được chạy với tư cách quản trị viên


1
Chỉ chỉ định một tham chiếu đến một assembly sẽ không thực thi bất kỳ mã nào trong hầu hết mọi trường hợp. Nếu không được đăng thêm, điều này không cho chúng ta biết gì. Bài đăng này liên quan đến yêu cầu chỉnh sửa sổ đăng ký quản trị và triển khai cụ thể hơn thông qua tùy chọn Visual Studio Publish tạo ra một hội đồng ClickOnce. Bị phản đối vì thiếu sự rõ ràng hoặc tụt hạng rõ ràng.
Anthony Mason

Đây ... đây là một không. Điều này sẽ hoàn toàn không làm gì ngoại trừ việc tăng số dòng của bạn lên 1. Tham chiếu đến một assembly mà không có tham chiếu đến bất kỳ đối tượng hoặc phương thức gọi nào trong assembly đó sẽ hoàn toàn không làm gì cả. Giống như nhận xét trước đó đã nêu.
SkiSharp
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.