Jak zmusić moją aplikację .NET do działania jako administrator?


875

Jak zmusić mój program do uruchomienia jako administrator w systemie Windows 7 po zainstalowaniu mojego programu na komputerze klienckim ?


3
Oprócz tego, co napisał Binary Worrier, możesz napisać kod do przetestowania, jeśli masz uprawnienia administratora .. (czy o to prosisz?)
leksu

38
Nie podjąłbym się jednak tego zadania lekceważąco, powinieneś zweryfikować, do czego tak naprawdę potrzebuje administratora i sprawdzić, czy możesz go obejść. Żaden klient nie będzie zadowolony z ciągłego uruchamiania aplikacji w trybie administratora. Wielu większych klientów nawet nie rozważy takiej aplikacji, a jeśli testowanie logo ma dla Ciebie znaczenie, nie przejdzie tak.
Alex

2
Alex ma bardzo rację. Jeśli to możliwe, zwiększaj tylko w razie potrzeby, w przeciwnym razie wchodzą w grę zasady grupy, UAC i wiele innych zmiennych. Przynajmniej w przypadku UAC użytkownik musiałby autoryzować się przy każdym uruchomieniu, a nie tylko wtedy, gdy wykonywane jest określone działanie użytkownika.
Anthony Mason

Prawidłowym sposobem jest osadzenie pliku manifestu w aplikacji.
Elmue

Odpowiedzi:


1144

Będziesz chciał zmodyfikować manifest, który zostanie osadzony w programie. Działa to w Visual Studio 2008 i nowszych wersjach: Projekt + Dodaj nowy element, wybierz „Plik manifestu aplikacji”. Zmień <requestedExecutionLevel>element na:

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

Użytkownik otrzymuje monit UAC po uruchomieniu programu. Używaj mądrze; ich cierpliwość szybko się wyczerpuje.


33
Jeśli podczas próby kompilacji wystąpi błąd ClickOnce, zapoznaj się z odpowiedzią: stackoverflow.com/questions/11023998/…
SSS

17
Twój projekt musi być skonfigurowany do korzystania z manifestu aplikacji - we właściwościach projektu sprawdź zakładkę „Aplikacja” i upewnij się, że „Manifest:” w „Zasobach” jest ustawiony na app.manifest (lub jakkolwiek to nazwałeś. plik manifestu)
Victor Chelaru,

7
Musiałem ponownie załadować projekt, zanim VS poprosi mnie o ponowne uruchomienie w trybie administratora.
Jon

3
@Alejandro - Tak, UAC można wyłączyć, ale w takim przypadku aplikacja będzie automatycznie działać jako administrator (zakładając, że użytkownik ma uprawnienia administratora), ponieważ wyłączenie UAC oznacza, że ​​wszystko działa z najwyższymi uprawnieniami, które użytkownik jest dozwolony. To trochę jak narzekanie, że jeśli zainstalujesz fantazyjny zamek na drzwiach, to nie zadziała, jeśli drzwi zostaną usunięte.
Erik Funkenbusch

4
@ErikFunkenbusch Nie będzie „automatycznie działał jako administrator”, będzie działał z normalnymi uprawnieniami użytkownika (admin, jeśli użytkownik jest adminem lub standard, jeśli użytkownik jest standardem). Opierając się na tym konkretnym przypadku, nawet jeśli jest on domyślny, dobre programy unikną jak zarazy. Zgodnie z twoją analogią fantazyjny zamek jest ładny, ale właściwie zaprojektowane oprogramowanie musi przewidywać, że całe drzwi zostaną usunięte, nawet jeśli jest to rzadkie zjawisko.
Alejandro,

154

Dodanie requestedExecutionLevelelementu do manifestu to tylko połowa sukcesu; musisz pamiętać, że UAC można wyłączyć. Jeśli tak, musisz wykonać sprawdzenie starej szkoły i wyświetlić okno dialogowe błędu, jeśli użytkownik nie jest administratorem
(zadzwoń IsInRole(WindowsBuiltInRole.Administrator)do wątku CurrentPrincipal).


22
Można również użyć <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> jako dobrze
Markowi Kram

18
@MarkKram: Co ma z tym wspólnego najwyższa dostępność? Pytanie dotyczy wymuszenia administratora, najwyższy Dostępny jest mniej restrykcyjny niż wymagaAdministrator i pozwoli użytkownikowi niebędącemu administratorem uruchamiać aplikację bez podniesienia uprawnień bez monitu UAC, tylko administratorzy otrzymają monit ...
Anders


Nie pamiętam już dokładnych szczegółów, ale myślę, że to zależy od tego, co masz na myśli przez określenie niepełnosprawny. Przesunięcie suwaka UAC na sam dół nie jest tym samym, co wyłączenie UAC (z wyjątkiem systemu Vista). Jeśli funkcja UAC jest całkowicie wyłączona, cały mechanizm poziomu integralności jest wyłączony i dostępna jest tylko klasyczna funkcja runas.exe z 2000 / XP. Kontrola roli administratora obsługuje przypadek runas.exe.
Anders,

1
Ustawiłem EnableLUA na 0 na Server 2008 R2 i usunąłem się z grupy Administrators, ponownie uruchomiłem, a teraz plik exe, który określa poziom = „wymagaAdministratora” działa bez żadnego monitu
Tal Aloni

86

Szczegółowe kroki są następujące.

  1. Dodaj plik manifestu aplikacji do rozwiązania
  2. Zmień ustawienie aplikacji na „app.manifest”
  3. Zaktualizuj tag „RequestExecutionLevel”, aby wymagać administratora.

Dodawanie pliku w roztworze

Wybierz Plik manifestu aplikacji

Wybierz opcję manifestu

Zaktualizuj plik manifestu

Zauważ, że używając tego kodu musisz wyłączyć ustawienia bezpieczeństwa ClickOnce, w tym celu przejdź do Właściwości -> Bezpieczeństwo -> Bezpieczeństwo ClickOnce


New Item...nie jest opcją w moim projekcie usługi instalatora. Jak mogę przejść do dodawania manifestu aplikacji? Mogę dodać go do mojego głównego projektu, ale nie jest to instalator.
HackSlash

61

Zaimplementowałem trochę kodu, aby zrobić to ręcznie:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}

45
Wykrywa to tylko, czy kontekst działa jako Administrator, nie przewiduje działania aplikacji jako Administrator zgodnie z żądaniem OP
Matt Wilko

5
Nie sądzę, że istnieje jakiś programowy sposób, aby zmusić aplikację do podniesienia własnych permsów. Gdyby tak było, byłoby to całkiem ryzyko dla bezpieczeństwa, nie?
Mark Richman

6
Chociaż twoje rozwiązanie jest dobre, ale pytanie było inne. ;)
Yash

zobacz poprawioną wersję tej metody tutaj stackoverflow.com/a/50186997 (subiektywnie)
Hakan Fıstık

To nie odpowiada na pytanie!
Elmue


19

Podczas pracy nad programem Visual Studio 2008 kliknij prawym przyciskiem myszy, Project -> Add New Itema następnie wybierz Application Manifest File.

W pliku manifestu znajdziesz znacznik requestedExecutionLeveli możesz ustawić poziom na trzy wartości:

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

LUB

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

LUB

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

Aby ustawić aplikację do uruchamiania jako administrator, musisz wybrać środkową.


To działa. Jednak sprawiło, że pojawiło się puste okno cmd podczas uruchamiania aplikacji CMD (użycie aplikacji c # cmd do uruchomienia niektórych plików exe w tle).
WM

13

Zgodnie z

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

będziesz chciał dodać manifest aplikacji, jeśli jeszcze go nie masz lub nie wiesz, jak go dodać. Ponieważ niektóre projekty nie dodają automatycznie osobnego pliku manifestu, najpierw przejdź do właściwości projektu, przejdź do karty Aplikacja i sprawdź, czy projekt nie wyklucza manifestu na dole kranu.

  • Następnie kliknij prawym przyciskiem myszy projekt
  • Dodaj nową pozycję
  • Na koniec znajdź i kliknij Plik manifestu aplikacji

12

W Visual Studio 2010 kliknij prawym przyciskiem myszy nazwę swojego projektu. Naciśnij „Wyświetl ustawienia systemu Windows”, to wygeneruje i otworzy plik o nazwie „app.manifest”. W tym pliku zamień „asInvoker” na „wymaganyAdministrator”, jak wyjaśniono w komentarzach w pliku.


6
Ta odpowiedź dotyczy VB.NET :-), a nie ogólnie VS 2010. Odpowiedzi „Dodaj nowy element” dotyczą C #. W C ++ możesz to zrobić w ustawieniach projektu.
Philm,

12

Innym sposobem na zrobienie tego, tylko w kodzie, jest wykrycie, czy proces działa jako administrator, jak w odpowiedzi @NG. . A następnie otwórz aplikację ponownie i zamknij bieżącą.

Używam tego kodu, gdy aplikacja potrzebuje tylko uprawnień administratora, gdy jest uruchamiana pod pewnymi warunkami, na przykład podczas instalowania się jako usługa. Nie musi więc cały czas działać jako administrator, tak jak wymuszają to inne odpowiedzi.

Uwaga w poniższym kodzie NeedsToRunAsAdminto metoda wykrywająca, czy w obecnych warunkach wymagane są uprawnienia administratora. Jeśli to zwróci, falsekod się nie podniesie. Jest to główna zaleta tego podejścia w porównaniu z innymi.

Chociaż ten kod ma wyżej wymienione zalety, musi zostać ponownie uruchomiony jako nowy proces, który nie zawsze jest tym, czego chcesz.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

1
+1 za podejście tylko do kodu. Pamiętaj, że musisz mieć włączoną runaskontrolę konta użytkownika, aby mieć możliwość uruchomienia czegokolwiek jako administrator od użytkownika niebędącego administratorem, w przeciwnym razie otworzy się cicho z bieżącymi uprawnieniami użytkownika (zaznaczone w systemie Windows 7 64-bitowym). O ile mogę powiedzieć, jedyne, co możesz zrobić z wyłączonym UAC i brak prawa administratora, to zatrzymać wykonywanie w odpowiednim momencie.
naprawde

9

Możesz utworzyć manifest za pomocą ustawień zabezpieczeń ClickOnce, a następnie wyłączyć go:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

Po kliknięciu zostanie utworzony plik w folderze właściwości projektu o nazwie app.manifest. Po jego utworzeniu możesz odznaczyć Enable ClickOnce Security Settingsopcję

Otwórz ten plik i zmień ten wiersz:

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

do:

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

Spowoduje to, że program będzie wymagał uprawnień administratora.


7

To jest uproszczona wersja tej odpowiedzi , powyżej autorstwa @NG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

1
To nie odpowiada na pytanie!
Elmue,

@Elmue bardziej logiczne jest dodawanie komentarza do pierwotnej odpowiedzi, którą właśnie odnowiłem, możesz znaleźć link do tej odpowiedzi w mojej.
Hakan Fıstık

-3

Kliknij plik wykonywalny prawym przyciskiem myszy, przejdź do Właściwości> Zgodność i zaznacz pole „Uruchom ten program jako administrator”.

Jeśli chcesz uruchomić go jako administrator dla wszystkich użytkowników, zrób to samo w „zmień ustawienia dla wszystkich użytkowników”.


4
To nie odpowiada na pytanie. „Gdy mój program zostanie zainstalowany na komputerze klienckim”, nie „jak to zrobić”.
Joe

Przepraszam, że jestem niejasny. Po zainstalowaniu programu zmień to ustawienie we właściwościach pliku wykonywalnego (program główny, a nie instalator). On chce zmusić swój program do działania jako administrator.
SlickJayD

2
Lepiej ustawić wymaganie administratora w manifeście. Twierdziłbym, że to odpowiedź na pytanie, ale ledwo.
BradleyDotNET

3
@ Joe Szczerze mówiąc, zaakceptowana odpowiedź nie odpowiada na pytanie PO, ponieważ wymaga ponownej instalacji exe aplikacji. To nie jest rozwiązanie dla „Po zainstalowaniu mojego programu”. Jeśli cokolwiek, ta odrzucona odpowiedź jest bardziej poprawna niż odpowiedź zaakceptowana, więc nie rozumiem, dlaczego ta odpowiedź ma ponad 400 głosów.
NickG

W rzeczywistości doskonale odpowiada na oba pytania. Niewielkie szanse na zmianę manifestu po zainstalowaniu, a programy nie powinny próbować podnieść swoich uprawnień po uruchomieniu - w wielu środowiskach - jest to dobra ścieżka do nazwania złośliwym oprogramowaniem. W większości firm - ta odpowiedź jest najlepsza, ponieważ nakłada na użytkownika ciężar i uprawnienia. Piszę dużo kodu, którego nie mogę „zobaczyć” ani uruchomić, gdy jest już produkowany. Staraj się nie być mądrzejszym niż własne obawy dotyczące bezpieczeństwa.
jinzai,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.