Próbuję napisać plik wsadowy, aby moi użytkownicy mogli uruchamiać się z ich komputerów z systemem Vista z UAC. Plik ponownie zapisuje plik hosts, więc musi być uruchamiany z uprawnieniami administratora. Muszę mieć możliwość wysłania im e-maila z linkiem do pliku .bat. Pożądanym zachowaniem jest to, że kiedy klikną plik prawym przyciskiem myszy i powiedzą Otwórz, otrzymają jedno z tych okien dialogowych UAC, które powodują, że ekran gaśnie i zmusza ich do odpowiedzi, czy chcą zezwolić aplikacji na działanie jako administrator. Zamiast tego widzą tylko komunikat „Odmowa dostępu” w oknie wiersza poleceń.
Czy można to zrobić inaczej?
Odpowiedzi:
Ten skrypt załatwia sprawę! Po prostu wklej go na górze pliku nietoperza. Jeśli chcesz przejrzeć wyniki swojego skryptu, dodaj polecenie „wstrzymaj” na dole pliku wsadowego.
AKTUALIZACJA: Ten skrypt jest teraz nieznacznie edytowany, aby obsługiwał argumenty wiersza poleceń i 64-bitowy system operacyjny.
Dziękuję Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadmin
źródło
Oto jedna linijka, której używałem:
Uwagi:
źródło
am_admin
if not "%1"=="am_admin" (powershell start -verb runas '%0' 'am_admin "%~1" "%~2"' & exit)
Parametry będą jeden powyżej miejsca, w którym były'am_admin %*'
do przekazania wszystkiego, nie działa dobrze z cudzysłowami i spacjami, chociaż: / Możesz użyćshift
wsadowo, aby usunąć pierwszy argument, naprawiając w ten sposób wszystkie argumenty z wyjątkiem%0
.cd /D %~dp0
poif not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
Oto mój kod! Wygląda na duży, ale składa się głównie z wierszy komentarzy (zaczynających się od: :).
Cechy:
Sprawdzanie zamapowanego folderu (ostrzega, jeśli administrator nie może uzyskać dostępu do zmapowanego dysku)
Może być używany jako biblioteka zewnętrzna (sprawdź mój post w tym temacie: https://stackoverflow.com/a/30417025/4932683 )
Po prostu dołącz to na końcu pliku wsadowego lub zapisz jako bibliotekę (sprawdź powyżej)
Przykład, jak go używać
źródło
&fc;: 2>nul
Wset "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
chyliło się ERRORLEVEL do 1. usunąłem ten kawałek i to działało idealnie. Używam systemu Windows 10 Home.fc;:
skoro to idzie: eof zaraz po? Nie jestem pewien, dlaczego to trochę spowodowało problem, ponieważ powinno zostać wykonane.echo/%TEMP%| findstr /C:"(" >nul
testy sprawdzają, czy(
w%temp%
zmiennej środowiskowej yout znajduje się znak , i powinny uruchamiać tylko część po&&
jeśli dodatnia.(
Jednak to dziwne, dlaczego wynik testu jest pozytywny.Innym podejściem jest
i wtedy
Denis
[Dodano później - tak, nie zauważyłem daty tego wątku.]
źródło
Rozwiązanie Bena Gripki powoduje nieskończone pętle. Jego partia działa tak (pseudokod):
Jak widać, powoduje to nieskończoną pętlę, jeśli VBS nie zażąda uprawnień administratora.
Jednak nieskończona pętla może wystąpić, chociaż pomyślnie zażądano uprawnień administratora.
Sprawdzanie w pliku wsadowym Bena Gripki jest po prostu podatne na błędy. Bawiłem się tą partią i zauważyłem, że uprawnienia administratora są dostępne, chociaż sprawdzenie się nie powiodło. Co ciekawe, sprawdzenie działało zgodnie z oczekiwaniami, jeśli uruchomiłem plik wsadowy z eksploratora Windows, ale tak się nie stało, gdy uruchomiłem go z mojego IDE.
Dlatego sugeruję użycie dwóch oddzielnych plików wsadowych. Pierwsza generuje VBS, który wywołuje drugi plik wsadowy:
Drugi, o nazwie „my_commands.bat” i znajdujący się w tym samym katalogu co pierwszy, zawiera Twoje aktualne polecenia:
Powoduje to brak nieskończonych pętli, a także usuwa podatne na błędy sprawdzanie uprawnień administratora.
źródło
Inne rozwiązanie PowerShell ...
Nie chodzi o uruchamianie skryptu wsadowego jako administrator, ale raczej o podniesienie poziomu innego programu z partii ...
Mam plik wsadowy „wrapper” dla exe. Mają tę samą „nazwę pliku głównego”, ale alternatywne rozszerzenia. Jestem w stanie uruchomić exe jako admin i ustawić katalog roboczy na katalog zawierający skrypt, z następującym wywołaniem PowerShell w jednym wierszu :
Więcej informacji
Istnieje również cała masa dodatkowych
Start-Process
opcji, które możesz zastosować! Sprawdź: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6Zauważ, że używam
@
przedrostka. To odpowiednik@echo off
dla jednej linii. Używam%~n0
tutaj, aby uzyskać "nazwę główną" skryptu wsadowego, a następnie konkatenuję,.exe
aby wskazać przyległy plik binarny. Użycie narzędzia%~dp0
zapewnia pełną ścieżkę do katalogu, w którym znajduje się partia. I, oczywiście, parametr zapewnia elewację .-Verb RunAs
źródło
Wiem, że to nie jest rozwiązanie dla OP, ale ponieważ jestem pewien, że jest tu wiele innych przypadków użycia, pomyślałem, że podzielę się nimi.
Miałem problemy ze wszystkimi przykładami kodu w tych odpowiedziach, ale potem znalazłem: http://www.robotronic.de/runasspcEn.html
Nie tylko pozwala Ci działać jako administrator, ale także sprawdza plik, aby upewnić się, że nie został zmodyfikowany i bezpiecznie przechowuje potrzebne informacje. Przyznaję, że nie jest to najbardziej oczywiste narzędzie do zrozumienia, jak go używać, ale dla tych z nas, którzy piszą kod, powinno być wystarczająco proste.
źródło
@echo off
ititle
może pojawić się przed tym kodem:Wiele innych odpowiedzi to przesada, jeśli nie musisz się martwić o następujące kwestie:
cd %~dp0
zmieni się na katalog zawierający plik wsadowy)źródło
Powyższe działa na moim systemie Windows 10 w wersji 1903
źródło
Ponieważ mam problemy z tym, że ten skrypt wyświetla nowy wiersz polecenia i uruchamia się ponownie, w nieskończonej pętli (przy użyciu Win 7 Pro), sugeruję wypróbowanie innego podejścia: Jak mogę automatycznie podwyższyć mój plik wsadowy, aby żądał od Prawa administratora UAC, jeśli są wymagane?
Uważaj, musisz dodać to na końcu skryptu, jak stwierdzono w edycji, abyś wrócił do katalogu skryptów po podniesieniu uprawnień: cd / d% ~ dp0
źródło
Na podstawie postu toster-cx i innych interesujących postów na tej stronie uzyskałem wgląd w konfigurację i rozwiązanie mojego problemu. Miałem podobny problem, gdy chciałem, aby narzędzie Oczyszczanie dysku działało co tydzień dwa razy w poniedziałek i czwartek w porze lunchu (powiedzmy o godzinie 14). Wymagało to jednak wyższych praw.
Udostępnianie pliku wsadowego, który może pomóc innym początkującym, takim jak ja -
Wielkie dzięki za to forum i Rems POST tutaj [ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-script ] [1]
Jego post pomógł w skonfigurowaniu opcjonalnego argumentu podczas planowania zadania.
źródło
Istnieje również zapytanie FSUTIL z tego postu, które jest również powiązane z ss64.com i zawiera następujący kod:
Tak długo, jak FSUTIL jest w pobliżu, jest to niezawodna alternatywa.
źródło
Nie możesz zażądać uprawnień administratora z pliku wsadowego, ale możesz napisać skrypt hosta skryptów systemu Windows w% temp% i uruchomić go (a to z kolei spowoduje wykonanie wsadu jako administrator). Chcesz wywołać metodę ShellExecute w powłoce. Obiekt aplikacji z "runas" jako czasownikiem
źródło
Użyj,
mshta
aby wyświetlić monit o uprawnienia administratora:Lub używając PowerShell:
źródło
użyj polecenia runas. Ale nie sądzę, aby można było łatwo wysłać plik .bat.
źródło
runas
Komenda nie może być użyty do wywołania elewację.