2012-06-13 15 views
66

Tak więc pisałem aplikację, która wymaga dostępu do rejestru. Nie dotknąłem żadnych ustawień kompilacji, chcąc sprawić, aby wszystko działało zanim dodałem inne elementy, takie jak opis lub imię.

Nieoczekiwanie pojawia się błąd, który nie zniknie. ClickOnce does not support the request execution level 'requireAdministrator'. Teraz nie dotknąłem ClickOnce w tej aplikacji. Wszystko, co zrobiłem, to plik manifestu żądający tych uprawnień.

Mój problem polega na tym, że ten błąd nie zniknie i nie mogę skompilować mojego programu. Wszelkie porady dotyczące tego, co robić? (Uwaga boczna: Już idę spać, więc sprawdzę to jutro po południu)."ClickOnce nie obsługuje poziomu wykonania żądania" requireAdministrator. ""

+4

Nienawidzę tu podawać oczywistości, ale * dodałeś manifest żądający uprawnień 'requireAdministrator' * i * ClickOnce zaczął narzekać, że nie obsługuje' requireAdministrator' *. Problem powinien być bardzo jasny. ClickOnce widzi potrzebę podniesienia poziomu w twoim manifeście (który staje się częścią twojej aplikacji). Nie jestem pewien, czego więcej tutaj potrzebujesz ... –

+2

@KenWhite: Nie jest jednak całkiem oczywiste ani logiczne, że wymóg administratora w połączeniu z kliknięciem raz uniemożliwi kompilowanie_ projektu, a nie tylko jego działanie - ale to robi. –

+0

@ 500-InternalServerError, logika powinna ci powiedzieć, że związek przyczynowo-skutkowy istnieje po prostu przez to, że dodanie "wymaga administratora" powoduje, że nie kompiluje się, ponieważ ma coś wspólnego z "wymaga administrowania nieobsługiwanego", IMO. :-) –

Odpowiedz

111

Edytuj: Ten komentarz daje również dobrą odpowiedź.

Kliknij raz pojawi się, aby włączyć po kliknięciu "Publikuj", czy chcesz, czy nie! Jeśli używasz "requireAdministrator", okazuje się, że nie możesz użyć ClickOnce, a zatem nie możesz "Opublikuj" swojego projektu.


oryginalny:

Okazuje się, że na karcie Zabezpieczenia "Włącz ustawienia zabezpieczeń ClickOnce" został sprawdzony. Chociaż tego nie sprawdziłem. W każdym razie odznaczenie tego zatrzymanego ClickOnce daje mi błędy. To zajęło trochę czasu, aby znaleźć ...

+2

Ah, myślałem, że to było oczywiste z komunikatu o błędzie, który otrzymałeś;) –

+2

Co mnie zdezorientowało to, że nie włączałem ClickOnce. – LMS

+0

Dobre pytanie i odpowiedź, pomogło mi, dzięki! – Moh

12

Jeśli kiedykolwiek użyć kreatora publikowania lub „Publish teraz”, kliknij pole wyboru jednokrotnego zostanie automatycznie wybrany ...

3

Spójrz w swoim app.Manifest plik, a zobaczysz to:

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

jest tam instrukcjami w komentarzach, ale po prostu usuwając „requireAdministrator” i wstawić to w to miejsce rozwiązał problem dla mnie:

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

OP mówi, że wymagają dostępu do rejestru w swojej aplikacji, więc nie jest to możliwe. – LeeCambl

+0

To nie jest rozwiązanie, gdy wymaga tego Twoja aplikacja ... – deadManN

2

Mam ten sam problem. Rozwiązuję go, odznaczając "Włącz ustawienia zabezpieczeń ClickOnce" Aby znaleźć tę opcję w programie Visual Studio Kliknij prawym przyciskiem myszy na swoim projekcie ==> właściwości ==> Wybierz Zabezpieczenia ==> Włącz zabezpieczenia ClickOnce ustawienia (Ta opcja była już zaznaczona, więc usunąłem zaznaczenie i mój problem został rozwiązany).

34

Wiem, że to stare pytanie, ale ja przyszedłem tutaj dwa lata później tak:

Można wyłączyć ClickOnce z karty Zabezpieczenia na properites projektu, aby pomóc ten problem; patrz poniżej:

enter image description here

-9

tylko

Imports System.security 

i U dostanie żadnego błędu i aplikacja zostanie uruchomiona jako admin

+1

Po prostu przypisanie odwołania do samego zestawu nie spowoduje wykonania żadnego kodu w większości przypadków. Bez dalszych wpisów nic nam to nie mówi. Ten wpis dotyczy wymagań związanych z edytowaniem rejestru administracyjnego, a konkretniej jego rozmieszczeniem za pomocą opcji Visual Studio Publish, która generuje zestaw ClickOnce. Wycofane z powodu braku jasności lub widocznej relewancji. –

5

wiem, że to jest stary, ale natknąłem się na niego patrzy dla odpowiedzi.W moim przypadku używam funkcji publikowania i muszę go nadal używać. Potrzebuję również dostępu do funkcji administratora. Z tego powodu żadna z powyższych odpowiedzi nie sprawdziła się u mnie.

Skończyłem na dodaniu metody na samym początku mojej aplikacji, która sprawdza, czy jest uruchamiana jako administrator, a jeśli nie jest, uruchom ponownie jako administrator. Aby to zrobić, musisz dodać następujące odniesienia.

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

Następnie należy umieścić to gdzieś, do której główna metoda ma wygodny dostęp. Używam WPF, więc dodałem go do MainWindow.xaml.cs, ale możesz dodać go na początku w kodzie. 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() 
{ 
    WindowsIdentity id = WindowsIdentity.GetCurrent(); 
    WindowsPrincipal principal = new WindowsPrincipal(id); 

    return principal.IsInRole(WindowsBuiltInRole.Administrator); 
} 

Na końcu, na początku programu, dodaj odniesienie do metody. 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!

+0

chociaż działa, tracisz punkt debugowania: | – deadManN

+0

@deadManN nie wiesz co masz na myśli. –

+0

uruchamia nową instancję, która po zdefiniowaniu nie przyłącza się do debuggera .. (wywołujesz nową wolną (nie dołączoną) instancję i zamykasz dołączoną do debuggera) – deadManN

1

Tę czynność można uzyskać, wybierając opcję "Włącz ustawienia bezpieczeństwa ClickOnce" (ponieważ nie można jej "odznaczyć" podczas publikowania, zgodnie z opisem), a następnie wybierając "Jest to aplikacja o częściowym zaufaniu". "Lokalny intranet" zostanie automatycznie wybrany z rozwijanego menu, co jest całkowicie poprawne.

Zapisz zmiany, opublikuj aplikację, gotowe narty. :-) Security Settings Snippet

1

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

EDIT: Ale jeśli wdrożyć w ten sposób, niektóre bloki AV-Software kodzie.

+0

Dlaczego? Wszystko jest w porządku z tym fragmentem i podpowiedzią, że AV może zablokować ten kod jest nawet poprawny. Wszędzie jakieś trolle. – Tzwenni

+0

Jeśli ktoś byłby tak uprzejmy i może uczciwie wyrównać mój post do zera, byłoby miło. thx – Tzwenni

+0

Pytanie dotyczy C#, więc zakładam, że dlatego wycofali się na – Lonefish

Powiązane problemy