“ClickOnce tidak mendukung tingkat eksekusi permintaan 'requireAdministrator.'”

95

Jadi saya menulis aplikasi yang membutuhkan akses ke registri. Saya belum menyentuh pengaturan build apa pun, ingin membuatnya berfungsi sebelum saya menambahkan sentuhan lain, seperti deskripsi atau nama.

Tiba-tiba, saya mendapatkan kesalahan yang tidak kunjung hilang. ClickOnce does not support the request execution level 'requireAdministrator'.Sekarang, saya belum menyentuh ClickOnce di aplikasi ini. Yang telah saya lakukan hanyalah menyertakan file manifes yang meminta izin ini.

Masalah saya sekarang adalah bahwa kesalahan ini tidak akan hilang, dan saya tidak dapat mengkompilasi program saya. Ada saran tentang apa yang harus dilakukan? (Catatan tambahan: Saya akan pergi tidur, jadi saya akan memeriksanya besok siang).

LMS
sumber
4
Saya benci untuk menyatakan yang sudah jelas di sini, tetapi Anda menambahkan requireAdministratorizin yang meminta manifes dan ClickOnce mulai mengeluh bahwa itu tidak mendukungrequireAdministrator . Masalahnya harus sangat jelas. ClickOnce melihat kebutuhan akan elevasi di manifes Anda (yang menjadi bagian dari aplikasi Anda). Saya tidak yakin apa lagi yang Anda butuhkan di sini ...
Ken White
4
@KenWite: Namun, mungkin tidak sepenuhnya jelas atau logis bahwa persyaratan admin dalam kombinasi dengan klik sekali mencegah Anda untuk menyusun proyek, tidak hanya menjalankannya - tetapi juga melakukannya.
500 - Kesalahan Server Internal
@ 500-InternalServerError, logika harus memberi tahu Anda bahwa hubungan kausal ada hanya dengan fakta bahwa menambahkan "memerlukan Admin" menyebabkannya tidak dapat dikompilasi karena ada hubungannya dengan "memerlukan Admin tidak didukung", IMO. :-)
Ken White
1
Masalahnya bukan karena saya ingin menggunakan ClickOnce dan izin administrator, masalahnya adalah saya ingin menggunakan izin administrator, dan telah mengkompilasinya sebelumnya (sekitar 10 kali) dengan mereka, tetapi kali ini ClickOnce mengatakan itu tidak kompatibel.
LMS
10
@KenW masalah tidak sejelas yang Anda sarankan. Masalahnya terjadi ketika Anda mengklik tombol "terbitkan" (setidaknya itu untuk saya). Saya menambahkan manifes dan memilih "requireAdministrator", setelah itu program bekerja dengan sempurna. Hanya ketika saya mengklik publikasikan saya mulai mendapatkan kesalahan ini, dan tidak dapat menghapusnya, sampai saya masuk ke pengaturan dan menonaktifkan "ClickOnce". Jadi solusinya bukanlah bahwa "requireAdministrator" tidak didukung, tetapi "ClickOnce" tidak dapat diaktifkan, dan Anda tidak dapat mengklik "Publikasikan" jika Anda telah menetapkan "memerlukanAdministrator".
Gavin Coates

Jawaban:

148

Sunting: Komentar ini memberikan jawaban yang bagus juga.

Klik sekali muncul untuk mengaktifkan setiap kali Anda mengklik "Publikasikan", apakah Anda menginginkannya atau tidak! Jika Anda menggunakan "requireAdministrator" maka tampaknya Anda tidak dapat menggunakan ClickOnce, dan karena itu tidak dapat "Publikasikan" proyek Anda.


Asli:

Ternyata di bawah tab Security, "Enable ClickOnce security settings" dicentang. Meskipun saya tidak memeriksanya. Bagaimanapun, menghapus centang yang menghentikan ClickOnce memberi saya kesalahan. Butuh beberapa saat untuk menemukan ...

LMS
sumber
3
Ah, saya pikir itu sudah jelas dari pesan kesalahan yang Anda dapatkan;)
500 - Kesalahan Server Internal
3
Yang membuat saya bingung adalah saya tidak mengaktifkan ClickOnce.
LMS
Pertanyaan dan jawaban yang bagus, membantu saya, Terima kasih!
Moh
29
Klik sekali muncul untuk mengaktifkan setiap kali Anda mengklik "Publikasikan", apakah Anda menginginkannya atau tidak! Jika Anda menggunakan "requireAdministrator" maka tampaknya Anda tidak dapat menggunakan ClickOnce, dan karena itu tidak dapat "Publikasikan" proyek Anda.
Gavin Coates
1
Apa yang dikatakan @GavinCoates benar. Alasannya adalah bahwa aplikasi ClickOnce selalu diinstal per pengguna di AppDatafoldernya. Elevasi hak istimewa akan menyebabkan peralihan konteks pengguna di mana aplikasi ClickOnce bahkan tidak diinstal.
bertl
44

Saya tahu ini pertanyaan lama tetapi saya datang ke sini dua tahun kemudian jadi:

Anda dapat menonaktifkan ClicKOnce dari tab Keamanan di properti proyek untuk membantu masalah tersebut; Lihat di bawah:

masukkan deskripsi gambar di sini

t_plusplus
sumber
3
Dan ketika Anda akan mempublikasikan aplikasi Anda, kotak centang ini akan dicentang lagi.
dikkini
@dikkini, tepatnya! bagaimana cara menonaktifkannya, ada yang punya jawaban?
katafagan
@saidfagan tidak ada jawaban atau solusi untuk kasus ini. Saya menggunakan ULMerge util untuk menggabungkan file exe dan dll.
dikkini
Ini berfungsi untuk saya, tidak masalah jika saya harus menonaktifkan kotak centang sepanjang waktu
Profesor Zoom
18

Jika Anda pernah menggunakan wizard penerbitan, atau 'Publikasikan Sekarang', kotak centang klik sekali dipilih secara otomatis ...

Victor Rosu
sumber
16

Saya tahu ini sudah tua tetapi saya sengaja menemukannya untuk mencari jawaban. Dalam kasus saya, saya menggunakan fungsi terbitkan dan saya harus tetap menggunakannya. Saya juga membutuhkan akses ke kemampuan admin. Jadi karena alasan itu, tidak ada jawaban di atas yang berhasil untuk saya.

Saya akhirnya menambahkan metode ke awal aplikasi saya yang memeriksa apakah itu dijalankan sebagai administrator dan jika tidak, luncurkan kembali sendiri sebagai admin. Untuk melakukan ini, Anda perlu menambahkan referensi berikut.

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

Kemudian Anda harus meletakkan ini di suatu tempat yang dapat diakses oleh metode utama Anda. Saya menggunakan WPF jadi saya menambahkannya ke MainWindow.xaml.cs tetapi Anda dapat menambahkannya di mana saja di awal kode Anda. Ingatlah untuk menambahkan "statis" ke metode ini jika Anda membutuhkannya.

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;
    }
}

Terakhir, di awal program Anda, tambahkan referensi ke metode tersebut. Dalam kasus saya, saya menambahkannya ke MainWindow tetapi menambahkannya ke pekerjaan Utama juga.

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

Semoga ini membantu!

Tyler C
sumber
itu memulai sebuah instance baru, yang oleh define tidak melampirkan ke debugger .. (Anda memanggil instance gratis baru (tidak terpasang), dan menutup yang terpasang ke debugger)
deadManN
1
@deadManN sangat benar. Saya mengatasinya karena saya tidak membutuhkan debugger pada saat saya sampai pada titik itu tetapi saya kira Anda dapat menjalankan VS sebagai admin dan kemudian program akan diluncurkan dalam mode admin juga. melewatkan restart. Saya akan mengujinya untuk memastikan.
Tyler C
1
Bagi siapa pun yang tersandung pada hal ini, hal di atas sebenarnya berhasil.
Tyler C
>> Nama 'Aplikasi' tidak ada dalam konteks saat ini. error
vee
Kode ini hanya memulai proses baru tetapi aplikasi saya adalah konsol sehingga argumen dibiarkan kosong.
vee
5

Tindakan ini dapat dilakukan dengan memilih "Aktifkan pengaturan keamanan ClickOnce" (karena tidak dapat "tidak dicentang" selama Publikasikan, seperti yang dinyatakan) dan kemudian dengan memilih "Ini adalah aplikasi kepercayaan parsial". "Intranet Lokal" akan secara otomatis dipilih di menu drop-down yang sangat bagus.

Simpan perubahan Anda, Publikasikan aplikasi, selesai-ski. :-)Cuplikan Setelan Keamanan

CodeBreaker
sumber
2

Lihatlah di file app.Manifest Anda dan Anda akan melihat ini:

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

Ada petunjuk di sana di komentar, tetapi hanya menghapus "requireAdministrator" dan memasukkan ini di tempatnya memecahkan masalah bagi saya:

 <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
Brian
sumber
2
OP mengatakan mereka membutuhkan akses ke registri dalam aplikasi mereka, jadi ini bukan pilihan.
LeeCambl
requireAdministratorhak istimewa diperlukan untuk menulis ke registri, jadi ini akan menjadi persyaratan.
SkiSharp
ClickOnce tidak mendukung tingkat eksekusi permintaanasInvoke
SkiSharp
2

Saya memiliki masalah yang sama saya menyelesaikannya dengan menghapus centang pada " Aktifkan pengaturan keamanan ClickOnce" Untuk Menemukan opsi ini di Visual Studio Klik Kanan pada Proyek Anda ==> properti ==> Pilih Keamanan ==> Aktifkan pengaturan keamanan ClickOnce (Opsi ini adalah sudah diperiksa jadi saya hapus centangnya dan masalah saya teratasi).

Ragnar
sumber
2

Berikut adalah potongan kode untuk 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"})

EDIT: Tetapi jika Anda menerapkan dengan cara ini, beberapa AV-Software memblokir kode Anda.

Tzwenni
sumber
1

Bagi mereka yang menggunakan hapus centang "Aktifkan pengaturan keamanan ClickOnce" tidak dapat bekerja, untuk mencoba metode yang saya temukan.

Pertama, biarkan item app.manifest requestExecutionLevel Anda seperti ini:

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

Dan kemudian Anda mengedit file Program.cs Anda seperti ini:

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

merestrukturisasi metode utama seperti:

    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());
            }
        }

Ini berfungsi pada Windows 10 dan Visual Studio 2019!

malajisi
sumber
1

Bagi siapa pun yang mengalami ini, saya pikir saya akan berkontribusi apa yang akhirnya berhasil untuk saya.

Ya, opsi 'Enable ClickOnce security settings' secara otomatis diperiksa ulang, jika Anda tidak mencentangnya, saat Anda melakukan Build> Publish .

Bagi saya, saya tidak perlu 'Publikasikan' - ini adalah .exe sederhana dan portabel yang membuat Tugas Terjadwal untuk pengguna saya dan saya perlu memastikannya meningkat, bahkan saat masuk sebagai Administrator.

Jadi saya baru saja mengambil .exe terbaru saya dari \ bin \ Release dan itulah yang diterapkan di sistem klien saya.

Bekerja seperti yang diharapkan - yaitu ketika saya meletakkannya di sistem dengan UAC diaktifkan / pada pengaturan tertingginya, .exe memiliki 'perisai' di atasnya, dan ketika saya menjalankannya, bahkan ketika masuk sebagai Administrator, itu mengangkat dan saya mendapatkan prompt UAC.

Aplikasi penjadwal tugas kecil saya sekarang dapat membuat tugas tanpa mendapatkan kesalahan 'Access Denied' (yang sebelumnya, hanya dapat diselesaikan dengan mengklik kanan .exe dan mengklik Run as Administrator).

Samskara
sumber
1
Saya mengalami masalah yang sama persis, dan tidak ada jawaban di atas yang berhasil. Saya berharap mereka akan kembali mengaktifkan klik sekali pengaturan keamanan. Benar-benar diperlukan dan fitur yang bagus dalam banyak kasus, terutama untuk aplikasi yang dipublikasikan secara online, namun saya berharap ada opsi / solusi yang lebih baik hanya untuk publikasi berbasis lokal.
SkiSharp
-12

hanya

Imports System.security

dan U tidak akan mendapatkan error dan aplikasi Anda akan dijalankan sebagai admin

Aditya
sumber
1
Cukup menetapkan referensi ke sebuah assembly saja tidak akan mengeksekusi kode apa pun di sebagian besar kasus. Tanpa lebih banyak diposting, ini tidak memberi tahu kita apa-apa. Posting ini berkaitan dengan persyaratan pengeditan registri administratif dan lebih khusus lagi menyebarkan melalui opsi Visual Studio Publish yang menghasilkan rakitan ClickOnce. Tidak disukai karena kurangnya kejelasan, atau relevansi yang terlihat.
Anthony Mason
Ini ... ini tidak. Ini sama sekali tidak akan melakukan apa-apa kecuali meningkatkan jumlah baris Anda dengan 1. Merujuk rakitan tanpa referensi ke objek atau metode pemanggilan apa pun dalam rakitan itu tidak akan melakukan apa pun. Seperti komentar sebelumnya.
SkiSharp