Mam aplikację, która jest generalnie instalatorem. Pobiera pliki, rejestruje biblioteki. Do rejestracji COMa wymagane są uprawnienia administratorskie. Do całej reszty - absolutnie nie. Wręcz użytkownik nie powinien uruchamiać aplikacji jako administrator, ponieważ nie będzie widział np. zmapowanych dysków (będzie je widział np. w konsoli administratora).
Oczywiście inaczej jest na systemach bez UAC. Tam jak użytkownik jest admin, to jest admin cały czas. Natomiast gdy użytkownik nie jest adminem, to musi poprosić admina o uruchomienie tylko tej części rejestrującej COMa, a pozostała część powinna się instalować na uprawnieniach użytkownika.
Skrótowo działanie instalatora:
Jeśli COM jest już zainstalowany, nie ma potrzeby podnoszenia uprawnień, instalacja idzie sobie dalej. Gdy nie ma uprawnień, próbuje uruchomić nowy proces z podniesionymi uprawnieniami. Nowy proces TYLKO rejestruje COMa. Jeśli się nie uda, to komunikat wołający administratora. Administrator uruchamia instalator z parametrem mówiącym, że to admin odpala, dzięki czemu instalator wie, że ma tylko zarejestrować COMa.
Ok, a teraz co mi nie działa:
Widnows 7, UAC włączone, użytkownik jest w grupie admimnistratorów.
Uruchamiam instalator normalnie (nie jako administrator), ten sprawdza uprawnienia, braknie mu, więc odpala nowy proces z parametrem i "runas". Nowy proces sprawdza czy ma uprawnienia administratorskie - i niestety nie ma, zwraca kod -1 :(
Dostaję komunikat, choć mam uprawnienia...
W manifeście:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
Uruchomienie nowego procesu:
Process proc = new Process
{
StartInfo =
{
FileName = Process.GetCurrentProcess().Modules[0].FileName,
Arguments = "admin_install",
Verb = "runas",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
}
};
proc.Start();
proc.WaitForExit();
Sprawdzenie, czy admin:
<code class="c#">
public static bool IsUserInAdministratorsGroup()
{
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;
}