Próbuję zainstalować usługę za pomocą InstallUtil.exe, ale została wywołana za pośrednictwem Process.Start
. Oto kod:
ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);
gdzie m_strInstallUtil
jest w pełni kwalifikowaną ścieżką i plikiem exe do „InstallUtil.exe” oraz strExePath
w pełni kwalifikowaną ścieżką / nazwą do mojej usługi.
Uruchamianie składni wiersza poleceń z wiersza polecenia z podwyższonym poziomem uprawnień działa; uruchamianie z mojej aplikacji (przy użyciu powyższego kodu) nie działa. Zakładam, że mam do czynienia z problemem podniesienia uprawnień procesu, więc jak uruchomić proces w stanie podwyższonym? Czy muszę na to patrzeć ShellExecute
?
To wszystko w systemie Windows Vista. Uruchamiam proces w debugerze VS2008 z uprawnieniami administratora.
Próbowałem też ustawić, startInfo.Verb = "runas";
ale to nie rozwiązało problemu.
źródło
startInfo.UseShellExecute = true;
opróczstartInfo.Verb = "runas";
tego działało dobrze dla mnie.Odpowiedzi:
Możesz wskazać, że nowy proces powinien być uruchamiany z podwyższonymi uprawnieniami, ustawiając właściwość Verb obiektu startInfo na „runas” w następujący sposób:
Spowoduje to, że system Windows będzie zachowywał się tak, jakby proces został uruchomiony z Eksploratora za pomocą polecenia menu „Uruchom jako administrator”.
Oznacza to, że pojawi się monit UAC i będzie musiał zostać potwierdzony przez użytkownika: jeśli jest to niepożądane (na przykład, ponieważ mogłoby się to zdarzyć w środku długiego procesu), musisz uruchomić cały proces hosta z podwyższone uprawnienia przez tworzenie i osadzanie manifestu aplikacji (UAC), aby wymagać poziomu wykonania `` najwyższego dostępnego '': spowoduje to wyświetlenie monitu UAC zaraz po uruchomieniu aplikacji i spowoduje, że wszystkie procesy podrzędne będą działać z podwyższonymi uprawnieniami bez dodatkowych monitów .
Edycja: Widzę, że właśnie zredagowałeś swoje pytanie, stwierdzając, że „runy” nie działają dla Ciebie. To naprawdę dziwne, tak jak powinno (i robi dla mnie w kilku aplikacjach produkcyjnych). Jednak wymaganie, aby proces nadrzędny działał z podwyższonymi prawami poprzez osadzenie manifestu, zdecydowanie powinno działać.
źródło
startInfo.ShellExecute=true
aby to zadziałało ... również nie byłem w stanie zmusić tej metody do pracy z plikami wykonywalnymi, które znajdują się w udziale sieciowym (przed uruchomieniem muszę je skopiować do lokalnego katalogu tymczasowego). ..Ten kod łączy powyższe wszystko razem i ponownie uruchamia bieżącą aplikację wpf z uprawnieniami administratora:
Aktualizacja: preferowany jest manifest aplikacji:
Kliknij prawym przyciskiem myszy projekt w programie Visual Studio, dodaj, nowy plik manifestu aplikacji, zmień plik, aby ustawić wymagany administrator, jak pokazano powyżej.
Problem z oryginalnym sposobem: jeśli umieścisz kod restartu w app.xaml.cs przy uruchomieniu, nadal może on na krótko uruchomić okno główne, mimo że wywołano polecenie Shutdown. Moje główne okno wybuchło, jeśli init app.xaml.cs nie został uruchomiony iw pewnych warunkach wyścigowych to zrobił.
źródło
string[] args
do procesu odrodzenia.Zgodnie z artykułem Chris Corio: Naucz swoje aplikacje dobrze grać z kontrolą konta użytkownika systemu Windows Vista, MSDN Magazine, styczeń 2007 ,
ShellExecute
sprawdza tylko osadzony manifest i monituje użytkownika o podniesienie uprawnień w razie potrzeby, podczas gdyCreateProcess
inne interfejsy API nie. Mam nadzieję, że to pomoże.Zobacz też: ten sam artykuł co .chm .
źródło
To zrobi bez UAC - nie ma potrzeby rozpoczynania nowego procesu. Jeśli uruchomiony użytkownik jest członkiem grupy administratorów, jak w moim przypadku.
źródło
Aby podnieść stan, należy użyć funkcji podszywania się.
Po zakończeniu nie zapomnij cofnąć podszywanego kontekstu.
źródło