"ClickOnce, 'requireAdministrator' isteğini yürütme düzeyini desteklemiyor.”


96

Ben de kayıt defterine erişim gerektiren bir uygulama yazıyordum. Bir açıklama veya ad gibi diğer dokunuşları eklemeden önce herhangi bir yapı ayarına dokunmadım.

Birdenbire, ortadan kalkmayacak bir hata alıyorum. ClickOnce does not support the request execution level 'requireAdministrator'.Şimdi, bu uygulamada ClickOnce'a dokunmamıştım. Yaptığım tek şey, bu izinleri isteyen bir bildirim dosyası eklemekti.

Şu andaki sorunum bu hatanın ortadan kalkmaması ve programımı derleyememem. Ne yapılacağına dair herhangi bir tavsiye? (Yan not: Yatmak üzereyim, bu yüzden bunu yarın öğleden sonra kontrol edeceğim).


4
Burada bariz olanı belirtmekten nefret ediyorum, ancak izin isteyen bir bildirim ekledinizrequireAdministrator ve ClickOnce desteklemediğinden şikayet etmeye başladırequireAdministrator . Sorun son derece açık olmalı. ClickOnce, bildiriminizde (uygulamanızın bir parçası haline gelen) yükseltme ihtiyacını görüyor. Burada daha fazla neye ihtiyacın olduğundan emin değilim ...
Ken White

4
@KenWhite: Bununla birlikte, bir kez tıklamayla birlikte yönetici gereksiniminin projeyi sadece çalıştırmayı değil , derlemenizi engellemesi belki de tamamen açık ve mantıklı değil - ama yapıyor.
500 - Dahili Sunucu Hatası

@ 500-InternalServerError, mantık, nedensel bir ilişkinin, sadece "Yönetici gerektirir" eklemesinin, IMO ile ilgili bir şey nedeniyle derlenmemesine neden olması gerçeğiyle olduğunu söylemelidir. :-)
Ken White

1
Sorun, ClickOnce ve yönetici izinlerini kullanmak istemem değil, sorun şu ki yönetici izinlerini kullanmak istiyorum ve daha önce onlarla (yaklaşık 10 kez) derlemiştim, ancak bu sefer ClickOnce bunun uyumsuz olduğunu söylüyor.
LMS

10
@KenWhite sorun önerdiğiniz kadar net değil. Sorun, "yayınla" düğmesine tıkladığınızda ortaya çıkıyor (en azından benim için yaptı). Manifest'i ekledim ve "requireAdministrator" ı seçtim, ardından program kusursuz bir şekilde çalıştı. Yalnızca yayınla düğmesine tıkladığımda bu hatayı almaya başladım ve ayarlara gidip "ClickOnce" özelliğini devre dışı bırakana kadar düzeltemedim. Dolayısıyla çözüm, "requireAdministrator" desteklenmez, ancak bu "ClickOnce" etkinleştirilemez ve "requireAdministrator" ayarınız varsa "Yayınla" yı tıklayamazsınız.
Gavin Coates

Yanıtlar:


150

Düzenleme: Bu yorum da iyi bir cevap veriyor.

İsteseniz de istemeseniz de, "Yayınla" yı her tıkladığınızda etkinleştirmek için bir kez tıklayın görünür! "RequireAdministrator" kullanıyorsanız, ClickOnce kullanamayacağınız ve bu nedenle projenizi "Yayınlayamayacağınız" anlaşılır.


Orijinal:

Güvenlik sekmesinin altında "ClickOnce güvenlik ayarlarını etkinleştir" seçeneğinin işaretlenmiş olduğu ortaya çıktı. Kontrol etmemiş olsam bile. Her neyse, ClickOnce'ın bana hata vermesini durduran işareti kaldırıldı. Bulmak biraz zaman aldı ...


3
Ah, bunun aldığınız hata mesajından açıkça anlaşıldığını düşündüm;)
500 - Dahili Sunucu Hatası

3
Kafamı karıştıran şey, ClickOnce'ı etkinleştirmemiş olmamdı.
LMS

Güzel soru ve cevap, bana yardımcı oldu, teşekkürler!
Moh

29
İsteseniz de istemeseniz de, "Yayınla" yı her tıkladığınızda etkinleştirmek için bir kez tıklayın görünür! "RequireAdministrator" kullanıyorsanız, ClickOnce kullanamayacağınız ve bu nedenle projenizi "Yayınlayamayacağınız" anlaşılır.
Gavin Coates

1
@GavinCoates'in söylediği doğru. Bunun nedeni, ClickOnce uygulamalarının her zaman kendi AppDataklasöründe kullanıcı başına yüklenmesidir . Ayrıcalık yükseltmesi, ClickOnce uygulamasının yüklenmediği kullanıcı bağlamında bir değişime neden olabilir.
bertl

44

Bunun eski bir soru olduğunu biliyorum ama buraya iki yıl sonra geldim.

Soruna yardımcı olması için ClicKOnce'u proje özelliklerinde Güvenlik sekmesinden devre dışı bırakabilirsiniz; aşağıya bakınız:

görüntü açıklamasını buraya girin


3
Ve uygulamanızı yayınlayacağınız zaman bu onay kutusu tekrar işaretlenecektir.
dikkini

@dikkini, aynen öyle! nasıl devre dışı bırakılır, kimsenin bir cevabı var mı?
saidfagan

@saidfagan bu dava için bir cevap veya çözüm yok. Exe ve dll dosyalarını birleştirmek için ULMerge kullanıyorum.
dikkini

Bu benim için işe yarıyor, onay kutusunu her zaman devre dışı bırakmam gerekip gerekmediği önemli değil
Profesör Zoom

18

Yayınlama sihirbazını veya "Şimdi Yayınla" yı kullanırsanız, bir kez tıkla onay kutusu otomatik olarak seçilir ...


16

Bunun eski olduğunu biliyorum ama cevapları ararken tökezledim. Benim durumumda, yayınlama işlevini kullanıyorum ve kullanmaya devam etmem gerekiyor. Ayrıca yönetici yeteneklerine erişime ihtiyacım var. Bu nedenle, yukarıdaki cevapların hiçbiri benim için işe yaramadı.

Uygulamamın en başına, yönetici olarak çalıştırılıp çalıştırılmadığını kontrol eden ve çalışmıyorsa, kendisini yönetici olarak yeniden başlatan bir yöntem ekledim. Bunu yapmak için, aşağıdaki referansların eklenmesi gerekir.

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

O zaman bunu ana yönteminizin kullanışlı erişime sahip olduğu bir yere koymanız gerekecek. WPF kullanıyorum, bu yüzden onu MainWindow.xaml.cs'ye ekledim, ancak kodunuzun başlarında istediğiniz yere ekleyebilirsiniz. İhtiyaç duymanız durumunda bu yöntemlere "statik" eklemeyi unutmayı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;
    }
}

Son olarak, programınızın başlangıcında yönteme bir referans ekleyin. Benim durumumda MainWindow'a ekledim ama Main'e de ekledim.

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

Bu yardımcı olur umarım!


tanımla hata ayıklayıcıya
eklenmeyen

1
@deadManN çok doğru. Bu noktaya geldiğimde hata ayıklayıcıya ihtiyacım olmadığından, bunun üstesinden geldim ama sanırım VS'yi yönetici olarak çalıştırabilirsin ve sonra program da yönetici modunda başlatılır. yeniden başlatma atlanıyor. Emin olmak için bunu test edeceğim.
Tyler C

1
Buna tökezleyen biri için, aslında yukarıdakiler işe yarıyor.
Tyler C

>> 'Uygulama' adı mevcut bağlamda mevcut değil. hata
vee

Bu kod yalnızca yeni bir işlem başlatıyor ancak uygulamam konsol olduğundan bağımsız değişkenler boş bırakılıyor.
vee

5

Bu eylem, "ClickOnce güvenlik ayarlarını etkinleştir" seçilerek (belirtildiği gibi bir Yayınlama sırasında "işaretlenemeyeceğinden") ve ardından "Bu kısmi bir güven uygulaması" seçilerek gerçekleştirilebilir. Açılır menüde "Yerel İntranet" otomatik olarak seçilecektir, bu tamamen iyidir.

Değişikliklerinizi kaydedin, uygulamayı yayınlayın, yapılan kayaklar. :-)Güvenlik Ayarları Snippet'i


2

Uygulamanıza bir göz atın. Manifest dosyası ve şunu göreceksiniz:

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

Yorumlarda talimatlar var, ancak sadece "requireAdministrator" u silmek ve bunu eklemek benim için sorunu çözdü:

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

2
OP, uygulamalarındaki kayıt defterine erişmeleri gerektiğini söylüyor, bu nedenle bu bir seçenek değil.
LeeCambl

requireAdministratorkayıt defterine yazmak için ayrıcalık gereklidir, bu nedenle bu bir gereklilik olacaktır.
SkiSharp

ClickOnce, istek yürütme düzeyini desteklemiyorasInvoke
SkiSharp

2

Ben "işaretini kaldırarak aynı Sorunun s ı gidermek buna sahip ClickOnce güvenlik ayarlarını etkinleştir" Visual Studio Hakkı bu seçeneği bulmak için sizin tıklayın > Projesi ==> özellikler ==> Seç Güvenlik == ClickOnce güvenlik ayarlarını etkinleştirme (Bu seçenek oldu Zaten kontrol edildi, bu yüzden işaretini kaldırdım ve sorunum çözüldü).


2

İşte VB.NET için kod parçacığı

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"})

DÜZENLEME: Ancak bu şekilde konuşlandırırsanız, bazı AV Yazılımları kodunuzu engeller.


2

Bulduğum yöntemi denemek için "ClickOnce güvenlik ayarlarını etkinleştir" seçeneğinin işaretini kaldıranlar için işe yaramaz.

Önce app.manifest requiredExecutionLevel öğenizi olduğu gibi bırakın:

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

Ve sonra Program.cs dosyanızı şu şekilde düzenlersiniz:

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

ana yöntemi şöyle yeniden yapılandırın:

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

Windows 10 ve Visual Studio 2019'da çalışır!


1

Bununla karşılaşan herkes için, benim için işe yarayan şeye katkıda bulunacağımı düşündüm.

Evet, 'ClickOnce güvenlik ayarlarını etkinleştir' seçeneği, Oluştur> Yayınla'yı yaptığınızda işaretini kaldırırsanız otomatik olarak yeniden kontrol edilir .

Benim için 'Yayınlamaya' ihtiyacım yok - bu, kullanıcılarım için Zamanlanmış Görevler oluşturan basit, taşınabilir bir .exe ve Yönetici olarak oturum açtığımda bile yükseltilmesini sağlamam gerekiyordu.

Bu yüzden en son .exe'mi \ bin \ Release'den aldım ve müşterilerimin sistemlerinde dağıtılan şey bu.

Beklendiği gibi çalıştı - yani, onu UAC etkin / en yüksek ayarında bir sisteme koyduğumda, .exe üzerinde 'kalkan' var ve onu çalıştırdığımda, Yönetici olarak oturum açtığımda bile, yükseliyor ve UAC istemini alıyorum.

Benim küçük görev zamanlayıcı uygulamam artık bir 'Erişim Engellendi' hatası almadan görevi oluşturabiliyor (bu daha önce yalnızca .exe'ye sağ tıklayıp Yönetici Olarak Çalıştır'a tıklayarak çözülebilirdi).


1
Aynı sorunu yaşadım ve yukarıdaki cevapların hiçbiri işe yaramadı. Keşke bir kez güvenlik ayarlarında tekrar çalışsalar. Kesinlikle gerekli ve çoğu durumda, özellikle çevrimiçi yayınlanan uygulamalar için iyi bir özellik, ancak keşke yalnızca yerel tabanlı yayınlar için daha iyi bir seçenek / çalışma olsaydı.
SkiSharp

-12

sadece

Imports System.security

ve U hata almaz ve uygulamanız yönetici olarak çalıştırılır


1
Yalnızca bir montaja yalnızca bir referans atamak, çoğu durumda herhangi bir kodu çalıştırmayacaktır. Daha fazla gönderi olmadan, bu bize hiçbir şey anlatmaz. Bu gönderi, yönetimsel kayıt defteri düzenlemesinin ve daha özel olarak bir ClickOnce derlemesi oluşturan Visual Studio Publish seçeneği aracılığıyla dağıtmanın gerekliliği ile ilgilidir. Netlik eksikliği veya görünürdeki alaka düzeyi nedeniyle olumsuz oy verildi.
Anthony Mason

Bu ... bu bir hayır. Bu, satır sayınızı 1 artırmanın dışında kesinlikle hiçbir şey yapmaz. Herhangi bir nesneye referans vermeden bir derlemeye başvurmak veya bu derleme içindeki yöntemi çağırmak kesinlikle hiçbir şey yapmaz. Önceki yorumda belirtildiği gibi.
SkiSharp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.