Czy istnieje polecenie, które może podnieść Wiersz polecenia na miejscu?

61

W systemach * nix możesz uzyskać powłokę root:

$ su # or 'sudo -s'
#

Powłoka root jest spawnowana w tym samym terminalu.

Usiłuję znaleźć coś, co robi podobną, lokalną elewację w wierszu polecenia systemu Windows. Innymi słowy, nie powinno się odradzać nowego okna ani wyświetlać monitów UAC. Do tej pory byłem w stanie wykonać zaplanowane zadanie, które omija UAC, ale podwyższone okno wiersza polecenia nie pojawia się na swoim miejscu.

Czy istnieje podobne polecenie dla systemu Windows, które wykonuje elewację lokalną bez odradzania nowego okna?

user2064000
źródło
31
zwróć uwagę, że su / sudo -s faktycznie również uruchamia nowy proces powłoki. Po prostu podwyższone procesy są podłączone do tego samego terminala, więc wyglądają, jakby były podniesione w miejscu.
Lie Ryan,
„nie powinno się odradzać nowego okna ani wyświetlać monitów UAC”. Mówisz tylko, że nie powinno to wymagać interakcji graficznej? Lub nie chcesz zostać poproszony w ogóle ? Na przykład sudoczasami monituje o hasło, ale robi to za pomocą interfejsu tekstowego. Zastanawiam się, jak radzą sobie z tym serwery Nano (które, jak sądzę, nawet domyślnie nie oferują GUI dla pulpitu zdalnego).
jpmc26
2
@ jpmc26 Interakcja w interfejsie tekstowym jest w porządku.
user2064000 17.04.17
@ jpmc26 Zastanawiam się, czy serwer Nano ma nawet UAC. Biorąc pod uwagę, że jest zoptymalizowany pod kątem pojemników, nie wydaje się bardzo przydatny. Został również wyłączony w wersjach Server Core, IIRC. Jeśli włączyłeś to przypadkowo, masz cały stos kłopotów :)
Luaan
2
@ user2064000 Monit UAC jest (przynajmniej domyślnie dla plików binarnych innych niż Windows) uruchamiany na Bezpiecznym pulpicie, a nie na bieżącym pulpicie użytkownika. Oprócz tego, że jest nieco denerwujący, ma to na celu zapobieganie innym procesom zakłócającym monit UAC. Ponadto, jeśli wymagane jest uwierzytelnienie, musi to być na Bezpiecznym pulpicie, a niektórzy administratorzy mogą również wymagać sekwencji Ctrl-Alt-Del, aby udowodnić, że Windows przyjmuje hasło, a nie inny proces podszywania się pod monit o hasło. Tak więc wpisanie hasła w oknie cmd prawdopodobnie nie poleciałoby z perspektywy bezpieczeństwa Microsoft.
Calchas 18.04.17

Odpowiedzi:

65

TL; DR - jedyną opcją jest odrodzenie innego procesu. (Nowa cmd.exe.) W przypadku wiersza polecenia uruchomienie nowej instancji za pomocą tokena dostępu, który ma wyższe uprawnienia , zawsze spowoduje utworzenie nowego okna .


Nie można przyznać dodatkowych uprawnień już działającemu procesowi.

Gdy użytkownik z uprawnieniami administracyjnymi loguje się na komputerze z systemem Windows z włączoną kontrolą konta użytkownika (UAC), tworzone są dwa oddzielne tokeny dostępu :

  1. Jeden z pełnym dostępem administratora i
  2. Drugi „token filtrowany” ze standardowym dostępem użytkownika

W momencie tworzenia procesu (np. CMD.EXE) Jest mu przypisywany jeden z tych dwóch tokenów dostępu . Jeśli proces jest uruchamiany jako „podniesiony” jako Administrator, używany jest niefiltrowany token dostępu. Jeśli procesowi nie przyznano uprawnień administratora, używany jest odfiltrowany standardowy token użytkownika.

Po utworzeniu procesu nie można zastąpić tokena dostępu . 1 W tym wątku MSDN Application Security dla Windows Desktop plakat przedstawiający się jako członek zespołu jądra systemu Windows stwierdza:

Jądro NT nigdy nie miało na celu umożliwienia przełączania tokenów po uruchomieniu procesu. Wynika to z faktu, że uchwyty itp. Mogły zostać otwarte w starym kontekście bezpieczeństwa, operacje inflight mogą wykorzystywać niespójne konteksty bezpieczeństwa itp. W związku z tym zazwyczaj nie ma sensu przełączać tokena procesu po jego rozpoczęciu. Nie było to jednak egzekwowane do Visty . [nacisk kopalni] (źródło dzięki do @Ben N )

Uwaga: Kontrola konta użytkownika została wprowadzona wraz z wydaniem systemu Windows Vista .

Ta odpowiedź superużytkownika przytacza dwa dodatkowe źródła potwierdzające to samo:

Dlatego po prostu nie można podnieść wiersza polecenia ani żadnego innego procesu w miejscu. Jedyną opcją jest odrodzenie innego procesu z nowym tokenem dostępu (w razie potrzeby może to być kolejna instancja oryginalnego procesu). W przypadku wiersza polecenia uruchomienie nowej instancji z tokenem dostępu, który ma wyższe uprawnienia, zawsze spowoduje utworzenie nowego okna, a jeśli w systemie zostaną włączone monity UAC, zostaną one również uruchomione.


1 Możesz dostosować uprawnienia w istniejącym tokenie dostępu za pomocą funkcji AdjustTokenPrivileges , ale zgodnie z MSDN :

Funkcja AdjustTokenPrivileges nie może dodawać nowych uprawnień do tokena dostępu. Może jedynie włączać i wyłączać istniejące uprawnienia tokena.

Twisty impersonator
źródło
19

Chociaż jestem entuzjastycznym użytkownikiem TCC-LE, istnieje rozwiązanie, które nie wymaga żadnych nowych programów: -

  • Zacznij cmdjako administrator.
  • To powinno cię zacząć %SystemRoot%\system32\- jeśli nie, cdtam.
  • copy cmd.exe cmdadmin.exe(lub dowolną wybraną przez Ciebie nazwę, np. su.exe).
  • Teraz uruchom Eksploratora i znajdź cmdadmin.exe.
  • Kliknij prawym przyciskiem myszy i wybierz Właściwości .
  • Na karcie Zgodność wybierz opcję uruchom jako administrator (lub ustaw dla wszystkich użytkowników).

Teraz cmdadminjest twój sulub sudo: możesz go uruchomić bez parametrów, aby dać ci powłokę z uprawnieniami administracyjnymi, lub możesz go uruchomić, /caby wykonać pojedyncze polecenie w tym trybie. W zależności od twoich zasad możesz zostać poproszony o potwierdzenie.

Zauważ, że to zawsze otworzy nowe okno (podobnie jak rozwiązanie TCC start /elevated ...): oczekuje się tego w przypadku aplikacji GUI, ale w przypadku programu wiersza polecenia możesz użyć /kzamiast tego /c, aby dać ci szansę zobaczyć wynik ; lub możesz uruchomić za pomocą pliku wsadowego ( sudo.cmdbyć może?), który łączy & pausesię z końcem łańcucha uruchamiania.

W obu przypadkach nie jest to to samo, co sulub sudo, ale jest najbliżej. Dzięki ręcznemu ustawieniu układu okien nowe okno można utworzyć bezpośrednio pod nim i przylegać do oryginału.

AFH
źródło
Jest to prawdopodobnie najbliższe zachowaniu PO sudo, z zastrzeżeniem, że nadal trzeba radzić sobie z pojawieniem się nowego okna / procesu. Chociaż prawdopodobnie nie jest to najlepszy pomysł z punktu widzenia bezpieczeństwa, wyłączenie wszystkich monitów UAC wyeliminuje konieczność reagowania na monity UAC po uruchomieniu podwyższonego procesu.
Twisty Impersonator
@Twisty - Dzięki za komentarz. Wiedziałem o konsekwencjach dla bezpieczeństwa, ale nie są one gorsze niż pierwotne założenie, że konto zezwala na uruchamianie jako administrator . Każdy, kto go wdroży, decyduje, czy chce otrzymywać ciągłe przypomnienia przy każdym wywołaniu.
AFH
2
Nie wspominałem o implikacjach bezpieczeństwa dla twojej korzyści, ale raczej dla innych czytelników. Nie zgodzę się jednak, że wyłączenie monitów UAC nie jest gorsze niż uruchomienie jako administrator. Monity UAC mogą uniemożliwić użytkownikowi zalogowanemu jako administrator przyznanie niechcianych uprawnień administracyjnych do procesu. Bez podpowiedzi użytkownik traci tę okazję.
Twisty Impersonator
@Twisty - Właśnie tak. Moja odpowiedź pochodziła z podobnych motywów. Dzięki jeszcze raz.
AFH
1
zamiast kopiować cmd.exe, utwórz do niego dowiązanie symboliczne. W ten sposób, jeśli system Windows zaktualizuje go i usunie błędy bezpieczeństwa, nie uruchomisz starej wersjimklink cmdadmin.exe cmd.exe
Josef
10

Czy istnieje polecenie, które może podnieść Wiersz polecenia na miejscu?

Istnieje raczej niewygodny sposób:

powershell -Command "Start-Process 'cmd.exe' -Verb runAs"

Były lepsze sposoby, ale Microsoft je zamknął. Oczywiście zawsze możesz podwinąć rękawy i napisać własny skrypt odpowiadający sudokodowi źródłowemu, który ci dałem.

Innymi słowy, nie powinno się odradzać nowego okna ani wyświetlać monitów UAC.

Bluźnierstwo! Spal go na stosie! ;) Żart na bok, nie. Nie ma Byłby to błąd i luka w zabezpieczeniach. Microsoft dołożył wyraźnych starań, aby proces podwyższony i standardowy miały jak najmniej wspólnego.

Inteligentne dzieciaki, które myślą o dwóch zapleczach (jednym standardowym i jednym podwyższonym) i jednym graficznym interfejsie dla obu, powinny przeczytać o izolacji sesji 0 .


źródło
2

Czy istnieje podobne polecenie dla systemu Windows, które wykonuje elewację lokalną bez odradzania nowego okna?

Nie ma wbudowanego takiego polecenia. Chociaż tego nie udowodniłem, wierzę w to, ponieważ widziałem wiele sposobów korzystania z dodatkowego oprogramowania / kodu w celu obejścia tego problemu.

Innymi słowy, nie powinno się odradzać nowego okna ani wyświetlać monitów UAC.

Zapomnij o tym. Absolutnie o tym zapomnij. Jest to sprzeczne z projektem UAC. Jeśli dasz sobie radę, przełamujesz podstawowy proces bezpieczeństwa. Spodziewaj się, że Twoje rozwiązanie przebije się przez łatę po tym, jak Microsoft się dowie i naprawi, bez względu na proces, który możesz zrobić, aby obejść ten problem.

Rozwiązaniem pozwalającym uniknąć monitów UAC jest na początek wysoka wysokość. UAC nie powinien ci przeszkadzać, jeśli masz wystarczające uprawnienia. Jeśli zaczniesz od niższego poziomu (co jest często zalecane ze względów bezpieczeństwa), a następnie spróbujesz zrobić coś wymagającego wyższego poziomu, spodziewaj się interakcji UAC.

TOOGAM
źródło
Monity UAC można już ominąć przy zaplanowanym zadaniu; Szukam czegoś, co wykonuje elewację lokalną zamiast odradzania nowego okna wiersza polecenia.
user2064000 16.04.17
Jeśli to zrobisz, czy naprawdę możesz skonfigurować Zaplanowane Zadanie bez spełnienia wymagań UAC? Jeśli chodzi o spawnowanie, mówię, że nie oczekuję tego, ponieważ zauważyłem, że wszystkie wznoszące się rozwiązania, które do tej pory widziałem, wymagały rozpoczęcia nowego procesu. Wydaje mi się, że podniesienie poziomu technicznego bez uruchamiania nowego procesu może być wykonane, ponieważ programy instalacyjne mogą poprosić o UAC po ich uruchomieniu, ale nie przypominam sobie, że widziałem łatwo dostępne rozwiązania, które można łatwo zaimportować do pliku wsadowego.
TOOGAM
W rzeczy samej; Zaplanowane zadania całkowicie pokonują UAC. Po podniesieniu uprawnień można przejść do SYSTEMU za pośrednictwem usług, a następnie użyć zamiennego tokena w oryginalnym procesie cmd.exe.
Joshua
Istnieje nieco oficjalny skrypt PowerToy, który wykonuje podstawową pracę; możesz wpisać, elevate cmdaby otworzyć nowe okno wiersza polecenia z poleceniem UAC (strona zawiera również polecenia menu kontekstowego!). Lub, oczywiście, możesz po prostu Ctrl + Shift + kliknąć ikonę paska zadań dowolnego istniejącego okna wiersza polecenia, aby zrobić to samo - najczęściej tak robię. (Wiem, że nie jest to, o co poprosił OP, ale to, o co poprosił OP, jest blokowane przez projekt.)
Miral
2

To, czego chcesz, jest niemożliwe w systemie Windows, ponieważ nie obsługuje tej koncepcji. Musisz rozpocząć nowy proces z wyższymi uprawnieniami .

Używam nircmd do podniesienia procesów z linii poleceń. Twoje polecenie byłobynircmdc elevate cmd

magicandre1981
źródło
2

Widziałem to pytanie i wpadłem na proste rozwiązanie. Jest to małe narzędzie o nazwie rsudo, które uruchamia eskalowane polecenia ze zwykłego okna CMD.

Uwaga: pojawi się monit UAC . Ukrywanie tego nie jest możliwe, tak właśnie zaprojektowano UAC.

Usage:
  rsudo.exe "[command]"

Pobierz [Pobierz nie działa, wkrótce się zaktualizuje]

Uwaga: polecenia są uruchamiane w nowym oknie. Jeśli chcesz wyświetlić dane wyjściowe, uruchomrsudo.exe "pause && [command]"

rahuldottech
źródło
Nie musi tak być rsudo.exe "[command] && pause"?
@fleet Nie, pausenajpierw uruchamia się błąd
rahuldottech 18.04.17
Rahul, dzięki! Czy jest jakaś szansa na kod źródłowy? ;) (A może po prostu szukałem niewłaściwego miejsca na twojej stronie.)
cxw 18.04.17
@cwz pewnie! Zmienię go, gdy wrócę do domu i dodam wpis na blogu: D
rahuldottech
0

Ten jest dziwny.

Możesz spróbować zrobić ssh na swoim komputerze, który używałby tego samego istniejącego terminala, ale w rzeczywistości byłby zupełnie inny.

Będzie działać, ale prawdopodobnie nie jest to, czego chcesz.

Inni mogą jednak uznać to za przydatne.

Pradyoth Shandilya
źródło
-1

Wypróbuj wiersz polecenia JPSOFT Take Command TCC / LE. Występuje w wersjach 32- i 64-bitowych i jest bezpłatny, chyba że potrzebujesz większej funkcjonalności.

Wejdź na https://jpsoft.com/ i kliknij Pobrane i wybierz, co chcesz.

TCC / LE ma START / ELEVATED, który uruchamia program z podwyższonymi uprawnieniami administratora. (Tylko Windows Vista lub nowszy).

David Grainger
źródło
1
Jak to się ma do pytania?
user2064000 16.04.17
@DavidGrainger okazuje się, że przełącznik / podwyższony poziom nadal nie pozwala mi ominąć UAC i dokonać podniesienia w miejscu (szczegóły znajdują się w pytaniu). Czy coś brakuje?
user2064000 16.04.17
Jest to zamiennik wiersza polecenia systemu Windows. Ponadto uruchomienie podwyższone nie różni się niczym od uruchomienia wbudowanego wiersza polecenia podniesionego.
Twisty Impersonator
Jedynym sposobem może być zmiana ustawień UAC na „Nigdy nie powiadamiaj”. Gdy pojawi się powiadomienie UAC, kliknij link „Pokaż więcej szczegółów”, a następnie wybierz link „Pokaż, kiedy to powiadomienie powinno się pojawić”. Wybierz ustawienie, które działa. Możesz chcieć to zmienić po zakończeniu, aby złapać niechciane działania. można tego dokonać w ustawieniach systemu Windows.
David Grainger
TCC / LE robi też wiele innych rzeczy. Próbowałem z ustawieniem UAC ustawionym na „nigdy”, a następnie użyłem „Start / Elevated / PGM” C: \ Program Files \ IrfanView \ i_view64.exe „/ thumbs”, aby otworzyć program Elevated.
David Grainger