Jak zmusić mój program do uruchomienia jako administrator w systemie Windows 7 po zainstalowaniu mojego programu na komputerze klienckim ?
Jak zmusić mój program do uruchomienia jako administrator w systemie Windows 7 po zainstalowaniu mojego programu na komputerze klienckim ?
Odpowiedzi:
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.
Dodanie requestedExecutionLevel
elementu 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
).
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
jako dobrze
IsInRole
mówi Anders.
Szczegółowe kroki są następujące.
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.
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;
}
Możesz osadzić plik manifestu w pliku EXE, co spowoduje, że system Windows (7 lub nowszy) będzie zawsze uruchamiał program jako administrator.
Więcej informacji można znaleźć w kroku 6: Tworzenie i osadzanie manifestu aplikacji (UAC) (MSDN).
Podczas pracy nad programem Visual Studio 2008 kliknij prawym przyciskiem myszy, Project -> Add New Item
a następnie wybierz Application Manifest File
.
W pliku manifestu znajdziesz znacznik requestedExecutionLevel
i 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ą.
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.
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.
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 NeedsToRunAsAdmin
to metoda wykrywająca, czy w obecnych warunkach wymagane są uprawnienia administratora. Jeśli to zwróci, false
kod 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);
}
runas
kontrolę 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.
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 Settings
opcję
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.
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;
}
}
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”.