File batch dengan perintah untuk dijalankan sebagai administrator dan pengguna standar

9

Saya mencoba menulis file batch yang perlu menjalankan beberapa perintah menggunakan akun admin lokal (mulai / hentikan layanan) dan beberapa perintah menggunakan pengguna yang masuk (salin file dari direktori pengguna) dan saya menghadapi masalah. Saya sudah mencoba perintah berikut:

runa dengan / savecred

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

Saat menggunakan /savecredsaya tidak dimintai kata sandi. Sebagai gantinya, jendela prompt perintah akan berkedip sebentar dan menghilang. Saya tidak dapat memberi tahu apa yang ada di jendela ini. Layanan tidak dihentikan.

runa tanpa / savecred

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

Perintah-perintah ini meminta saya untuk kata sandi tetapi kemudian menunjukkan perilaku yang sama seperti perintah di atas - jendela prompt perintah muncul sebentar dan layanan tidak berhenti.

Idealnya saya ingin menyimpan kata sandi untuk sesi ini karena saya perlu menjalankan lebih banyak perintah dengan detail.

Apakah ini mungkin dan jika demikian, apa yang saya lakukan salah?

Stuart Leyland-Cole
sumber
tambahkan perintah "pause" di bagian akhir untuk menghentikannya dari penutupan
Martin
Saya sudah memiliki jeda di akhir file batch saya tetapi perintah meluncurkan prompt perintah lain - Saya tidak tahu bagaimana cara menghentikan menghilang itu.
Stuart Leyland-Cole
mencoba mengarahkan output ke file, dan melihat apakah ia mencetak sesuatu ke dalamnya: "runas / user: (nama PC) (nama pengguna admin)" net stop \ "(nama layanan) \" ">> log.txt"
Martin
Saya harus menjalankan perintah dengan opsi / savecred kalau tidak prompt untuk kata sandi muncul di file log. Jika saya menjalankan runas /user:(PC name)\(username) /savecred "net stop \"(service name)\"" >> log.txttidak ada output ke file log.
Stuart Leyland-Cole
Lihat halaman debug batch Rob van der Woude: robvanderwoude.com/battech_debugging.php . Yang paling penting, unduh LOGBATCH.BAT, dan jalankan seperti itu: LOGBATCH.BAT yourbatch.bat any_parameters_your_batch_needsdan itu akan membuat file log yang berisi setiap perintah / tindakan yang dilakukan oleh yourbatch.batBiarkan kami tahu apa yang Anda lihat di sana.
JSanchez

Jawaban:

12

Anda dapat menambahkan berikut ini ke skrip Anda dan itu akan memaksanya untuk menjalankan yang ditinggikan. Tidak perlu mengunduh apa pun.

:: 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"
:--------------------------------------
pengguna325534
sumber
Semua ini dilakukan Requesting administrative privileges...untuk mencetak ke layar sampai habis.
The Muffin Man
@ Pria Muffin. Tambahkan perintah Anda di akhir file batch dan itu akan menjalankannya setelah elevasi.
Pelms
1
metode ini sangat bagus. tidak memerlukan dependensi tambahan (seperti psexec).
William
Masuk ke loop tanpa batas dengan skrip itu ...
JackTheKnife
0

pisahkan file batch Anda menjadi dua. Bagian yang ingin Anda jalankan sebagai paste admincmd ke system32. Bagian yang ingin Anda jalankan dalam cmd normal tempel di folder biasa, & dari sini panggil file batch kedua yang ada system32. Dengan cara ini bagian kedua selalu berjalan di admincmd. Saya sudah mencobanya & ini bekerja untuk saya.

sudhi
sumber
0

Jika Anda tidak keberatan dengan perangkat lunak pihak ketiga, Anda dapat mencoba menjalankannya sebagai kata sandi runasspc. Ini akan menyimpan kata sandi Anda ke file terenkripsi. Kata sandi tidak perlu diekspos dalam file batch.

Matahari
sumber
0

Perintah "Runas" tidak akan "sudo" perintah Anda.

Untuk melakukan ini dari file batch, Anda perlu "meninggikan" perintah yang Anda hasilkan. Unduh skrip Tinggikan Powertoy.

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

Luncurkan perintah Anda sebagai:

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

atau

runas /user:(PC name)\(admin username) /savecred "elevate sc stop \"(service name)\""
surfasb
sumber
Saya telah mencoba 3 perintah berikut: 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"dan masing-masing kembali kesalahan ini: runas ERROR: Tidak dapat menjalankan - elevate.cmd berhenti bersih alfrescoTomcat -2147467259: error Unspecified
Stuart Leyland-Cole
File batch 3 baris yang akan menjalankan perintah elevated: github.com/kasajian/pseudo
zumalifeguard
0

Apa yang saya gunakan adalah kode berikut:

::#################################################################################################################################
:: 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

Tunda setelah @echo Anda off dan komentar.

Aksioma Kelima
sumber
0

Jawaban yang disederhanakan (tambahan untuk user325534) jika Anda hanya perlu mulai bekerja di beberapa direktori dengan akses yang lengkap:

@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"
lietus
sumber
0

Kode ini memungkinkan cmd untuk meminta kata sandi pengguna. Pengguna harus mengetikkan kata sandi mereka dan kemudian executable.batakan dijalankan sebagai administrator

main.bat

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

executable.bat

all code that runs as administrator
jfraber
sumber