Pisałem więc aplikację, która wymaga dostępu do rejestru. Nie dotknąłem żadnych ustawień kompilacji, chcąc, aby rzecz działała, zanim dodałem inne elementy, takie jak opis lub nazwa.
Niespodziewanie wyskakuje mi błąd, który nie znika. ClickOnce does not support the request execution level 'requireAdministrator'.
Teraz nie dotknąłem ClickOnce w tej aplikacji. Wszystko, co zrobiłem, to załączyć plik manifestu z prośbą o te uprawnienia.
Mój problem polega na tym, że ten błąd nie zniknie i nie mogę skompilować programu. Jakieś rady, co robić? (Na marginesie: idę spać, więc sprawdzę jutro po południu).
95
requireAdministrator
tutaj tego, co oczywiste, ale dodałeś manifest z prośbą o uprawnienia, a ClickOnce zaczął narzekać, że nie obsługujerequireAdministrator
. Problem powinien być bardzo jasny. ClickOnce widzi potrzebę podniesienia uprawnień w Twoim manifeście (który staje się częścią Twojej aplikacji). Nie jestem pewien, czego więcej tutaj potrzebujesz ...Odpowiedzi:
Edycja: ten komentarz również daje dobrą odpowiedź.
Oryginał:
Okazuje się, że w zakładce Zabezpieczenia zaznaczono opcję „Włącz ustawienia zabezpieczeń ClickOnce”. Chociaż tego nie sprawdziłem. W każdym razie, odznaczenie tego zatrzymało ClickOnce, powodując błędy. Trochę czasu zajęło znalezienie ...
źródło
AppData
folderze. Podniesienie uprawnień spowodowałoby zmianę kontekstu użytkownika, w którym aplikacja ClickOnce nie jest nawet zainstalowana.Wiem, że to stare pytanie, ale przyjechałem tu dwa lata później, więc:
Aby pomóc w rozwiązaniu problemu, możesz wyłączyć ClicKOnce z zakładki Bezpieczeństwo we właściwościach projektu; patrz poniżej:
źródło
Jeśli kiedykolwiek użyjesz kreatora publikowania lub opcji „Opublikuj teraz”, pole wyboru jednorazowego kliknięcia zostanie automatycznie zaznaczone ...
źródło
Wiem, że to stare, ale natknąłem się na to, szukając odpowiedzi. W moim przypadku używam funkcji publikowania i muszę jej nadal używać. Potrzebuję też dostępu do funkcji administratora. Z tego powodu żadna z powyższych odpowiedzi nie zadziałała.
Skończyło się na dodaniu metody na samym początku mojej aplikacji, która sprawdza, czy jest uruchomiona jako administrator, a jeśli nie, ponownie uruchom się jako administrator. Aby to zrobić, potrzebujesz następujących odniesień.
using System; using System.Diagnostics; using System.Reflection; using System.Security.Principal;
Następnie musisz umieścić to w miejscu, do którego Twoja główna metoda ma wygodny dostęp. Używam WPF, więc dodałem go do MainWindow.xaml.cs, ale możesz dodać go w dowolnym miejscu na początku kodu. Pamiętaj tylko, aby dodać „statyczne” do tych metod, jeśli tego potrzebujesz.
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; } }
Na koniec dodaj odniesienie do metody na początku programu. W moim przypadku dodałem go do MainWindow, ale dodanie go do Main też działa.
public MainWindow() { InitializeComponent(); AdminRelauncher(); //This is the only important line here, add it to a place it gets run early on. }
Mam nadzieję że to pomoże!
źródło
Tę czynność można wykonać, wybierając opcję „Włącz ustawienia zabezpieczeń ClickOnce” (ponieważ nie można jej „usunąć zaznaczenia” podczas publikowania, jak wspomniano), a następnie wybierając opcję „To jest częściowo zaufana aplikacja”. „Lokalny intranet” zostanie automatycznie wybrany z rozwijanego menu, co jest w porządku.
Zapisz zmiany, opublikuj aplikację, gotowe narty. :-)
źródło
Spójrz na swoją aplikację. Plik Manifest, a zobaczysz to:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
W komentarzach są instrukcje, ale samo usunięcie „requireAdministrator” i wstawienie tego w to miejsce rozwiązało problem:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
źródło
requireAdministrator
wymagane jest uprawnienie do zapisu w rejestrze, więc byłby to wymóg.asInvoke
Mam ten sam problem i rozwiązuję go, usuwając zaznaczenie opcji „ Włącz ustawienia zabezpieczeń ClickOnce”. Aby znaleźć tę opcję w programie Visual Studio, kliknij prawym przyciskiem myszy projekt ==> właściwości ==> Wybierz zabezpieczenia ==> Włącz ustawienia zabezpieczeń ClickOnce (ta opcja była już zaznaczone, więc odznaczyłem to i mój problem został rozwiązany).
źródło
Oto fragment kodu dla 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"})
EDYCJA: Ale jeśli wdrażasz w ten sposób, niektóre oprogramowanie AV blokuje twój kod.
źródło
Dla tych, którzy używają odznacz „Włącz ustawienia zabezpieczeń ClickOnce”, nie mogą działać, aby wypróbować metodę, którą znalazłem.
Najpierw pozostaw element app.manifest requiredExecutionLevel bez zmian:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
Następnie edytuj plik Program.cs w ten sposób:
using System; using System.Diagnostics; using System.Reflection; using System.Security.Principal; using System.Windows.Forms;
restrukturyzuj główną metodę, taką jak:
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()); } }
Działa na Windows 10 i Visual Studio 2019!
źródło
Pomyślałem, że każdemu, kto na to wpadł, oddam to, co w końcu zadziałało.
Tak, opcja `` Włącz ustawienia zabezpieczeń ClickOnce '' zostanie automatycznie ponownie zaznaczona, jeśli ją odznaczysz, kiedy zrobisz Kompiluj> Publikuj .
Nie muszę „publikować” - to prosty, przenośny plik .exe, który tworzy zaplanowane zadania dla moich użytkowników i musiałem upewnić się, że jest podniesiony, nawet gdy jestem zalogowany jako administrator.
Więc właśnie pobrałem mój najnowszy plik .exe z \ bin \ Release i właśnie to zostaje wdrożone w systemach moich klientów.
Działał zgodnie z oczekiwaniami - tj. Kiedy umieszczam go w systemie z włączonym UAC / przy najwyższym ustawieniu, plik .exe ma na sobie `` osłonę '', a kiedy go uruchamiam, nawet gdy jestem zalogowany jako Administrator, podnosi się i pojawia się monit UAC.
Moja mała aplikacja do planowania zadań może teraz tworzyć zadanie bez wyświetlania błędu „Odmowa dostępu” (który wcześniej można było obejść tylko przez kliknięcie prawym przyciskiem myszy pliku .exe i kliknięcie Uruchom jako administrator).
źródło
właśnie
a U nie pojawi się żaden błąd, a Twoja aplikacja będzie działać jako administrator
źródło