Chcę, aby mój plik wsadowy był uruchamiany tylko z podwyższonym poziomem uprawnień. Jeśli nie jest podniesiony, podaj opcję ponownego uruchomienia partii jako podniesiony.
Piszę plik wsadowy, aby ustawić zmienną systemową, skopiować dwa pliki do lokalizacji Program Files i uruchomić instalator sterownika. Jeśli użytkownik systemu Windows 7 / Windows Vista ( włączony UAC i nawet jeśli jest lokalnym administratorem) uruchomi go bez kliknięcia prawym przyciskiem myszy i wybrania opcji „Uruchom jako administrator”, otrzyma polecenie „Odmowa dostępu” kopiujące dwa pliki i zapisujące zmienną systemową .
Chciałbym użyć polecenia, aby automatycznie ponownie uruchomić pakiet z podwyższonym poziomem uprawnień, jeśli użytkownik jest w rzeczywistości administratorem. W przeciwnym razie, jeśli nie są administratorem, chcę im powiedzieć, że potrzebują uprawnień administratora, aby uruchomić plik wsadowy. Używam xcopy do kopiowania plików i REG ADD do zapisywania zmiennej systemowej. Używam tych poleceń, aby radzić sobie z możliwymi komputerami z Windows XP. Znalazłem podobne pytania na ten temat, ale nic nie dotyczy ponownego uruchomienia pliku wsadowego jako podniesionego.
źródło
@powershell Start-Process cmd -Verb runas
. Z Powershell po prostu upuść@powershell
. To zaczyna cmd z podwyższonymi prawami.Odpowiedzi:
Możesz mieć wywołanie skryptu z opcją psexec ,
-h
aby uruchomić na podwyższonym poziomie.Nie jestem pewien, jak byś wykrył, czy już działa z podwyższonym poziomem uprawnień, czy nie ... może spróbuj ponownie z podwyższonym poziomem perms tylko wtedy, gdy występuje błąd odmowy dostępu?
Lub możesz po prostu mieć komendy
xcopy
ireg.exe
zawsze je uruchamiaćpsexec -h
, ale dla użytkownika końcowego byłoby denerwujące, gdyby za każdym razem musieli wprowadzać swoje hasło (lub niepewne, jeśli podałeś hasło w skrypcie) ...źródło
psexec -h
nie działa: „Nie można zainstalować usługi PSEXESVC: Odmowa dostępu.”. Musisz mieć już uprawnienia administratora, aby uruchomić psexec.Istnieje prosty sposób bez potrzeby korzystania z zewnętrznego narzędzia - działa dobrze z Windows 7, 8, 8.1 i 10 i jest również kompatybilny wstecz (Windows XP nie ma UAC, więc podniesienie nie jest potrzebne - w tym jeśli skrypt po prostu działa).
Sprawdź ten kod (zainspirował mnie kod NIronwolf opublikowany w wątku Plik wsadowy - „Odmowa dostępu” w systemie Windows 7? ), Ale go poprawiłem - w mojej wersji nie ma żadnego katalogu utworzonego i usuniętego do sprawdź uprawnienia administratora):
Skrypt wykorzystuje fakt, że
NET FILE
wymaga uprawnień administratora i zwracaerrorlevel 1
jeśli go nie masz. Podniesienie uprawnień odbywa się poprzez utworzenie skryptu, który ponownie uruchamia plik wsadowy w celu uzyskania uprawnień. Powoduje to, że system Windows wyświetla okno dialogowe UAC i prosi o podanie konta administratora i hasła.Przetestowałem to z Windows 7, 8, 8.1, 10 i Windows XP - działa dobrze dla wszystkich. Zaletą jest to, że po punkcie początkowym możesz umieścić wszystko, co wymaga uprawnień administratora systemu, na przykład, jeśli zamierzasz ponownie zainstalować i ponownie uruchomić usługę Windows w celu debugowania (zakładając, że mypackage.msi jest pakietem instalatora usług) :
Bez tego skryptu podnoszącego uprawnienia UAC trzykrotnie prosi o podanie administratora i hasła - teraz na początku jest tylko raz i tylko w razie potrzeby.
Jeśli skrypt wymaga tylko wyświetlenia komunikatu o błędzie i wyjścia, jeśli nie ma żadnych uprawnień administratora zamiast automatycznego podnoszenia, jest to jeszcze prostsze: Możesz to osiągnąć, dodając następujące elementy na początku skryptu:
W ten sposób użytkownik musi kliknąć prawym przyciskiem myszy i wybrać „Uruchom jako administrator” . Skrypt będzie działał po
REM
instrukcji, jeśli wykryje prawa administratora, w przeciwnym razie wyjdzie z błędem. Jeśli nie potrzebujeszPAUSE
, po prostu usuń go. Ważne:NET FILE [...] EXIT /D)
musi znajdować się w tej samej linii. Jest wyświetlany tutaj w wielu wierszach dla lepszej czytelności!Na niektórych maszynach napotkałem problemy, które zostały już rozwiązane w nowej wersji powyżej. Jeden z nich był spowodowany inną obsługą podwójnego cytowania, a drugi był związany z faktem, że UAC został wyłączony (ustawiony na najniższy poziom) na komputerze z systemem Windows 7, stąd skrypt ciągle się wywołuje.
Naprawiłem to teraz, usuwając cytaty ze ścieżki i dodając je później, i dodałem dodatkowy parametr, który jest dodawany, gdy skrypt uruchamia się ponownie z podwyższonymi uprawnieniami.
Podwójne cudzysłowy są usuwane przez (szczegóły są tutaj ):
Następnie możesz uzyskać dostęp do ścieżki za pomocą
!batchPath!
. Nie zawiera podwójnych cudzysłowów, więc można bezpiecznie powiedzieć"!batchPath!"
później w skrypcie.Linia
sprawdza, czy skrypt został już wywołany przez skrypt VBScript w celu podniesienia uprawnień, dzięki czemu unika się niekończących się rekurencji. Usuwa parametr za pomocą
shift
.Aktualizacja:
Aby uniknąć konieczności zarejestrowania
.vbs
rozszerzenie w systemie Windows 10 , I zastąpiły linię"%temp%\OEgetPrivileges.vbs"
przez
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
w skrypcie powyżej; również dodane,
cd /d %~dp0
jak sugerują Stephen (osobna odpowiedź) i Tomáš Zato (komentarz), aby ustawić domyślny katalog skryptów.Teraz skrypt honoruje przekazane mu parametry wiersza poleceń. Dzięki jxmallet, TanisDLJ i Peterowi Mortensenowi za spostrzeżenia i inspiracje.
Zgodnie ze wskazówkami Artjoma B. przeanalizowałem go i zastąpiłem
SHIFT
nimSHIFT /1
, co zachowuje nazwę pliku dla%0
parametruDodano
del "%temp%\OEgetPrivileges_%batchName%.vbs"
do:gotPrivileges
sekcji, aby wyczyścić (jak sugeruje mlt ). Dodano,%batchName%
aby uniknąć wpływu, jeśli uruchomisz różne partie równolegle. Pamiętaj, że musisz go użyć,for
aby móc korzystać z zaawansowanych funkcji łańcuchowych, takich jak%%~nk
, które wyodrębniają tylko nazwę pliku.Zoptymalizowana struktura skryptu, ulepszenia (dodana zmienna, do
vbsGetPrivileges
której teraz można się odwoływać wszędzie, umożliwiająca łatwą zmianę ścieżki lub nazwy pliku, usuwanie.vbs
pliku tylko w przypadku konieczności podniesienia partii)W niektórych przypadkach do podniesienia wymagana była inna składnia wywołania. Jeśli skrypt nie działa, sprawdź następujące parametry:
set cmdInvoke=0
set winSysFolder=System32
Zmień pierwszy parametr na
set cmdInvoke=1
i sprawdź, czy to już rozwiązuje problem. Dodaniecmd.exe
do skryptu wykonującego elewację.Lub spróbuj zmienić drugi parametr na
winSysFolder=Sysnative
, może to pomóc (ale w większości przypadków nie jest wymagane) w systemach 64-bitowych. (ADBailey to zgłosił). „Sysnative” jest wymagany tylko do uruchamiania 64-bitowych aplikacji z 32-bitowego hosta skryptów (np. Proces kompilacji Visual Studio lub wywołanie skryptu z innej aplikacji 32-bitowej).Aby wyjaśnić, w jaki sposób interpretowane są parametry, wyświetlam to teraz
P1=value1 P2=value2 ... P9=value9
. Jest to szczególnie przydatne, jeśli chcesz zawrzeć parametry takie jak ścieżki w podwójnych cudzysłowach, np"C:\Program Files"
.Jeśli chcesz debugować skrypt VBS, możesz dodać
//X
parametr do WScript.exe jako pierwszy parametr, zgodnie z sugestią tutaj (jest on opisany dla CScript.exe, ale działa również dla WScript.exe).Przydatne linki:
Cytaty („) , Bang (!) , Caret (^) , Ampersand (&) , Inne znaki specjalne
źródło
Jak wspomnieli jcoder i Matt, PowerShell ułatwił to, a nawet można go było osadzić w skrypcie wsadowym bez tworzenia nowego skryptu.
Zmodyfikowałem skrypt Matta:
źródło
WorkingDirectory
Start-Process
runas
Korzystam z doskonałej odpowiedzi Matta, ale widzę różnicę między moimi systemami Windows 7 i Windows 8 podczas uruchamiania podwyższonych skryptów.
Po podniesieniu skryptu w systemie Windows 8 bieżący katalog jest ustawiony na
C:\Windows\system32
. Na szczęście można łatwo obejść ten problem, zmieniając bieżący katalog na ścieżkę bieżącego skryptu:Uwaga: Użyj,
cd /d
aby upewnić się, że litera dysku również została zmieniona.Aby to przetestować, możesz skopiować następujące skrypty. Uruchom normalnie w dowolnej wersji, aby zobaczyć ten sam wynik. Uruchom jako administrator i zobacz różnicę w systemie Windows 8:
źródło
cd %~dp0
aby zachować swoją bieżącą ścieżkę (zakładam, że działa to również w Win7, więc można użyć tego samego polecenia, chociaż jest ono potrzebne tylko w Win8 +). +1 za to!pushd %~dp0
zamiast ... dlaczego? ponieważpopd
Robię to w ten sposób:
W ten sposób jest to proste i używaj tylko domyślnych poleceń systemu Windows. Świetnie, jeśli musisz ponownie rozpowszechnić plik wsadowy.
CD /d %~dp0
Ustawia bieżący katalog na bieżący katalog pliku (jeśli nie jest, niezależnie od dysku, w którym znajduje się plik, dzięki/d
opcji).%~nx0
Zwraca bieżącą nazwę pliku z rozszerzeniem (jeśli nie dodasz rozszerzenia i w folderze znajduje się plik exe o tej samej nazwie, wywoła plik exe).W tym poście jest tyle odpowiedzi, że nawet nie wiem, czy moja odpowiedź zostanie wyświetlona.
W każdym razie uważam, że ten sposób jest prostszy niż inne rozwiązania zaproponowane w innych odpowiedziach, mam nadzieję, że to komuś pomoże.
źródło
/d
. Dziękuję kolego :) (PS: Pianista też tutaj!)cd
polecenia na początek (zapewnia to, że ścieżka jest również dostępna dla skryptu z podwyższonym poziomem uprawnień - w przeciwnym razie skrypt z podwyższonym poziomem uprawnień uruchamia się po prostu z systemu32). Powinieneś także przekierować polecenie net do nul, aby ukryć jego dane wyjściowe:net session >nul 2>&1
Matt ma świetną odpowiedź, ale usuwa wszelkie argumenty przekazane do skryptu. Oto moja modyfikacja, która przechowuje argumenty. Włączyłem również poprawkę Stephena dotyczącą problemu z katalogiem roboczym w systemie Windows 8.
źródło
ECHO UAC.ShellExecute....
zgodnie z kolejnością"batchArgs!"
nie rozwija zmiennej. Zastosowanie"!batchArgs!"
. Moja edycja została odrzucona, więc komentuję.test.bat "a thing"
lub"test script.bat" arg1 arg2
. Wszystko naprawione teraz.Korzystam z programu PowerShell, aby ponownie uruchomić skrypt z podwyższonym poziomem uprawnień, jeśli nie jest. Umieść te linie na samym początku skryptu.
Skopiowałem metodę „net name” z odpowiedzi @ Matta. Jego odpowiedź jest znacznie lepiej udokumentowana i zawiera komunikaty o błędach itp. Ta ma tę zaletę, że PowerShell jest już zainstalowany i dostępny w systemie Windows 7 i nowszych. Brak tymczasowych plików VBScript (* .vbs) i nie trzeba pobierać narzędzi.
Ta metoda powinna działać bez jakiejkolwiek konfiguracji lub konfiguracji, o ile uprawnienia do wykonywania programu PowerShell nie są zablokowane.
źródło
/c %~fnx0 %*'
część wydaje się pozostawiać każdą część oprócz pierwszej. Np.test.bat "arg1 arg2 arg3"
Tylko arg1 jest przekazywany do przodunetsh int set int %wifiname% Enable/Disable
.net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
W przypadku niektórych programów ustawianie super tajnej
__COMPAT_LAYER
zmiennej środowiskowej naRunAsInvoker
działanie. Sprawdź to:Chociaż w ten sposób nie pojawi się monit UAC, użytkownik będzie kontynuował bez uprawnień administratora.
źródło
regedit
. Po prostu ominął uac.Wkleiłem to na początku skryptu:
źródło
cacls
jest przestarzałe w systemie Windows 7 i nowszych wersjach systemu Windows.pushd "%CD%"
zapisuje bieżący katalog roboczy i przechodzi do bieżącego katalogu roboczego?Pisałem
gsudo
, dla okien : który jest wysunięty w bieżącej konsoli (bez przełączania kontekstu w nowym oknie), z pamięci podręcznej poświadczeń (zmniejszony wyskakujące okienka UAC), a także podnosi poleceń PowerShell .sudo
Pozwala na podniesienie poleceń wymagających uprawnień administratora lub całej partii, jeśli chcesz. Po prostu przygotuj się
gsudo
przed wszystkim, co musi być podniesione.Przykładowy plik wsadowy, który podnosi się za pomocą gsudo:
EDYCJA: Nowa wersja jednoliniowa, która działa z dowolnym językiem Windows i pozwala uniknąć problemów z Whoami :
Alternatywa (wersja oryginalna):
Zainstalować:
choco install gsudo
scoop install gsudo
Zobacz gsudo w akcji:
źródło
.Net Framework 4.6
. Na szczęściechoco install dotnet4.6.2
przyniosło trudne do zdobycia zależności. Następniegsudo config Prompt "$p# "
naprawiono problem zConHost
wyświetlaniem niewłaściwego monitu (znaki sekwencji ucieczki zamiast czerwonego ostrza). @RockPaperLizardChociaż nie dotyczy bezpośrednio tego pytania, ponieważ potrzebuje pewnych informacji dla użytkownika, Google przyniósł mnie tutaj, gdy chciałem uruchomić mój plik .bat z poziomu harmonogramu zadań.
Najprostszym podejściem było utworzenie skrótu do pliku .bat, ponieważ dla skrótu można ustawić
Run as administrator
bezpośrednio z właściwości zaawansowanych.Uruchomienie skrótu z harmonogramu zadań powoduje podniesienie pliku .bat.
źródło
Korzystanie z PowerShell.
Jeśli plik cmd jest długi, używam pierwszego, aby wymagać podniesienia, a następnie wywołuję ten, który wykonuje właściwą pracę.
Jeśli skrypt jest prostym poleceniem, wszystko może zmieścić się w jednym pliku cmd. Nie zapomnij podać ścieżki do plików skryptów.
Szablon:
Przykład 1:
Przykład 2:
źródło
Spróbuj tego:
Jeśli potrzebujesz informacji o tym pliku wsadowym, uruchom fragment kodu HTML / JS / CSS:
źródło
Poniższe rozwiązanie jest czyste i działa idealnie.
Pobierz plik zip Elevate ze strony https://www.winability.com/download/Elevate.zip
Wewnątrz zip powinny znajdować się dwa pliki: Elevate.exe i Elevate64.exe. (Ta ostatnia jest natywną kompilacją 64-bitową, jeśli jej potrzebujesz, chociaż zwykła wersja 32-bitowa, Elevate.exe powinna działać poprawnie zarówno w 32-bitowej, jak i 64-bitowej wersji systemu Windows)
Skopiuj plik Elevate.exe do folderu, w którym system Windows zawsze może go znaleźć (na przykład C: / Windows). Lub lepiej możesz skopiować w tym samym folderze, w którym planujesz przechowywać plik nietoperza.
Aby użyć go w pliku wsadowym, po prostu wstaw polecenie, które chcesz wykonać jako administrator, za pomocą polecenia Elevate:
źródło