Plik wsadowy z poleceniami do uruchomienia jako administrator i użytkownik standardowy


9

Próbuję napisać plik wsadowy, który musi uruchamiać niektóre polecenia przy użyciu lokalnego konta administratora (uruchomienie / zatrzymanie usługi), a niektóre polecenia przy użyciu zalogowanego użytkownika (kopiowanie plików z katalogu użytkownika) i mam problemy. Próbowałem następujących poleceń:

runy z / savecred

runas /user:(PC name)\(admin username) /savecred "net stop \"(service name)\""
runas /user:(PC name)\(admin username) /savecred "sc stop \"(service name)\""

Podczas korzystania /savecrednie pojawia się monit o hasło. Zamiast tego okno wiersza polecenia krótko miga i znika. Nie jestem w stanie powiedzieć, co jest w tym oknie. Usługa nie została zatrzymana.

runy bez / savecred

runas /user:(PC name)\(admin username) "net stop \"(service name)\""
runas /user:(PC name)\(admin username) "sc stop \"(service name)\""

Te polecenia pytają mnie o hasło, ale następnie zachowują się tak samo jak powyższe polecenia - na krótko pojawia się okno wiersza poleceń i usługa nie jest zatrzymywana.

Idealnie chciałbym zapisać hasło do sesji, ponieważ będę musiał uruchomić więcej poleceń ze szczegółami.

Czy to możliwe, a jeśli tak, to co robię źle?


dodaj polecenie „pauza” na końcu, aby zatrzymać je od zamknięcia
Martin

Mam już przerwę na końcu pliku wsadowego, ale polecenia uruchamiają inny wiersz polecenia - nie wiem, jak zatrzymać to znikanie.
Stuart Leyland-Cole

spróbuj skierować wyjście do pliku i sprawdź, czy coś do niego wydrukuje: „runas / user: (nazwa komputera) (admin nazwa użytkownika)„ net stop \ ”(nazwa usługi) \” „>> log.txt”
Martin

Muszę uruchomić polecenie z opcją / savecred, w przeciwnym razie monit o podanie hasła pojawi się w pliku dziennika. Po uruchomieniu runas /user:(PC name)\(username) /savecred "net stop \"(service name)\"" >> log.txtnic nie jest wyprowadzane do pliku dziennika.
Stuart Leyland-Cole

Sprawdź stronę debugowania partii Roba van der Woude'a : robvanderwoude.com/battech_debugging.php . Co najważniejsze, pobierz plik LOGBATCH.BAT i uruchom go w ten sposób: LOGBATCH.BAT yourbatch.bat any_parameters_your_batch_needsutworzy plik dziennika zawierający każdą komendę / akcję wykonaną przez yourbatch.batDaj nam znać, co tam widzisz.
JSanchez

Odpowiedzi:


12

Możesz dodać do skryptu następujące elementy, a to zmusi go do uruchomienia na podwyższonym poziomie. Nie musisz niczego pobierać.

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

Wszystko to polega na drukowaniu Requesting administrative privileges...na ekranie, aż upłynie limit czasu.
The Muffin Man

@ The Muffin Man. Dodaj swoje polecenia na końcu pliku wsadowego, a wykona je po podniesieniu.
pelms

1
ta metoda jest doskonała. nie wymaga żadnych dodatkowych zależności (takich jak psexec).
William,


0

podziel plik wsadowy na dwa. Część, którą chcesz uruchomić jako admincmd wklej do systemu32. Część, którą chcesz uruchomić w normalnym cmd, wklej ją do zwykłego folderu i stąd wywołaj drugi plik wsadowy, który jest system32. W ten sposób druga część zawsze działa w admincmd. Próbowałem i to działa dla mnie.


0

Jeśli nie przeszkadza ci oprogramowanie innych firm, możesz spróbować uruchomić jako hasło runasspc. Zapisze twoje hasło w zaszyfrowanym pliku. Hasło nie musi być ujawniane w pliku wsadowym.


0

Polecenie „Runas” nie spowoduje „sudo” polecenia.

Aby to zrobić z pliku wsadowego, musisz „podnieść” komendy, które spawnujesz. Pobierz skrypty Elevate Powertoy.

http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx

Uruchom polecenia jako:

runas /user:(PC name)\(admin username) /savecred "elevate.cmd net stop \"(service name)\""

lub

runas /user:(PC name)\(admin username) /savecred "elevate sc stop \"(service name)\""

Próbowałem 3 następujące polecenia: runas /user:$PcName\$Username /savecred "elevate.cmd sc stop \"$ServiceName\"", runas /user:$PcName\$Username /savecred "elevate.cmd net stop \"$ServiceName\"", runas /user:$PcName\$Username /savecred "elevate.cmd net stop $ServiceName"a każda z nich zwraca ten błąd: RUNAS błąd: Nie można uruchomić - elevate.cmd net stop alfrescoTomcat -2147467259: Nieokreślony błąd
Stuart Leyland-Cole

3-liniowy plik wsadowy, który uruchomi polecenie podniesione: github.com/kasajian/pseudo
zumalifeguard

0

Używam następującego kodu:

::#################################################################################################################################
:: Elevate this script                                                                                                            #
::#################################################################################################################################

(
    :: Check Admin rights and create VBS Script to elevate
    >nul fsutil 2>&1 || (

        :: Very little red console
        mode con cols=80 lines=3 
        color cf

        :: Message
        title Please wait...
        echo.
        echo                         Requesting elevated shell...

        :: Create VBS script
        echo Set UAC = CreateObject^("Shell.Application"^)>"%TEMP%\elevate.vbs"
        echo UAC.ShellExecute "%~f0", "%TEMP%\elevate.vbs", "", "runas", 1 >>"%TEMP%\elevate.vbs"
        if exist "%TEMP%\elevate.vbs" start /b >nul cscript /nologo "%TEMP%\elevate.vbs" 2>&1
        exit /b
    )

    :: Delete elevation script if exist
    if exist "%~1" >nul del /f "%~1" 2>&1
)

pushd "%~dp0"

.... your code ....

popd

Odłóż go po wyłączeniu @echo i uwagach.


0

Uproszczona odpowiedź (dodatek do user325534), jeśli musisz rozpocząć pracę w jakimś katalogu z dostępem wstępu:

@echo off

set MyWorkDir=D:\dev\

echo Requesting administrative privileges...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd", "/C start /D %MyWorkDir% cmd", "", "runas", 1 >> "%temp%\getadmin.vbs"

"%temp%\getadmin.vbs"

0

Ten kod pozwala cmd zapytać o hasło użytkownika. Użytkownik musi wpisać swoje hasło, a następnie executable.batzostanie uruchomiony jako administrator

main.bat

@echo off
color 1f
Title Main
Goto start
:Start
runas /user:%username% executable.bat
pause

plik wykonywalny

all code that runs as administrator

0

Podzieliłem swój kod na dwie części

  • taki, który wymagał uprawnień administratora.

zmiana nazwy pliku wykonywalnego zainstalowanego w plikach programu

  • druga część, która się rozpoczęła i zabiła, zawierała plik wykonywalny.

uruchomienie go podniesione sprawiło, że program był bezużyteczny, ponieważ inne rzeczy, na których polegał, nie zostały podniesione

utworzył skrót do pliku nietoperza wymagającego podniesienia uprawnień i zaznaczył „uruchom jako administrator” we właściwościach. użyłem skrótu w innym pliku.

CONS

  • każdy skrót otwiera nowe okno cmd
  • Zakładam, że wymagana jest dodatkowa praca, jeśli obie części są od siebie zależne

Poszedłem do takich długości, że plik wykonywalny działał automatycznie pomimo wyłączenia automatycznego uruchamiania w jego ustawieniach, a msconfig również ustawił obsługę na ręczną. To był mój ostatni wysiłek, żeby to się zachowało.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.