Batch file với các lệnh để chạy như quản trị viên và người dùng chuẩn


9

Tôi đang thử viết một tệp bó cần chạy một số lệnh bằng tài khoản quản trị viên cục bộ (bắt đầu / dừng dịch vụ) và một số lệnh sử dụng người dùng đã đăng nhập (sao chép tệp từ thư mục người dùng) và tôi gặp phải sự cố. Tôi đã thử các lệnh sau:

runas với / savecred

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

Khi sử dụng /savecredtôi không được nhắc nhập mật khẩu. Thay vào đó, một cửa sổ nhắc lệnh nhanh chóng nhấp nháy và biến mất. Tôi không thể nói những gì trong cửa sổ này. Dịch vụ không dừng lại.

runas mà không / savecred

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

Các lệnh này sẽ nhắc tôi nhập mật khẩu nhưng sau đó thể hiện hành vi tương tự như các lệnh trên - một cửa sổ nhắc lệnh bật lên nhanh chóng và dịch vụ không bị dừng.

Lý tưởng nhất là tôi muốn lưu mật khẩu cho phiên vì tôi sẽ cần chạy nhiều lệnh hơn với các chi tiết.

Điều này có thể không và nếu vậy, tôi đang làm gì sai?


thêm lệnh "tạm dừng" ở cuối để dừng lệnh cfrom đóng
Martin

Tôi đã có một khoảng dừng ở cuối tệp bó của mình nhưng các lệnh đang khởi chạy một dấu nhắc lệnh khác - Tôi không biết làm thế nào để ngăn chặn sự biến mất đó.
Stuart Leyland-Cole

hãy thử chuyển trực tiếp ra một tệp và xem nó có in gì đó không: "runas / user: (tên PC) (tên người dùng quản trị)" net stop \ "(tên dịch vụ) \" ">> log.txt"
Martin

Tôi phải chạy lệnh với tùy chọn / savecred nếu không lời nhắc cho mật khẩu xuất hiện trong tệp nhật ký. Nếu tôi chạy runas /user:(PC name)\(username) /savecred "net stop \"(service name)\"" >> log.txtkhông có gì là đầu ra cho tệp nhật ký.
Stuart Leyland-Cole

Kiểm tra trang gỡ lỗi hàng loạt của Rob van der Woude: robvanderwoude.com/battech_debugging.php . Quan trọng nhất, tải xuống LOGBATCH.BAT và chạy nó như vậy: LOGBATCH.BAT yourbatch.bat any_parameters_your_batch_needsvà nó sẽ tạo một tệp nhật ký chứa mọi lệnh / hành động được thực hiện bởi yourbatch.batHãy cho chúng tôi biết những gì bạn thấy ở đó.
JSanchez

Câu trả lời:


12

Bạn có thể thêm đoạn mã sau vào tập lệnh của mình và nó sẽ buộc nó chạy ở mức cao. Không cần phải tải xuống bất cứ điều gì.

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

Tất cả điều này không được in Requesting administrative privileges...ra màn hình cho đến khi hết thời gian.
Người đàn ông Muffin

@ Người đàn ông Muffin. Thêm các lệnh của bạn vào cuối tệp bó và nó sẽ thực thi chúng sau khi nâng.
xương chậu

1
phương pháp này là tuyệt vời. nó không yêu cầu phụ thuộc thêm (như psexec).
William

Bước vào một vòng lặp vô tận với kịch bản đó ...
JackTheKnife

0

chia tập tin lô của bạn thành hai. Phần bạn muốn chạy dưới dạng admincmd dán vào system32. Phần bạn muốn chạy trong cmd bình thường dán nó vào thư mục thông thường, và từ đây gọi tệp bó thứ hai có system32. Bằng cách này, phần thứ hai luôn luôn chạy trong admincmd. Tôi đã thử nó và nó hoạt động với tôi.


0

Nếu bạn không quan tâm đến phần mềm của bên thứ ba, bạn có thể thử chạy dưới dạng mật khẩu runasspc. Nó sẽ lưu mật khẩu của bạn vào một tập tin được mã hóa. Mật khẩu không cần phải được tiết lộ trong tập tin lô.


0

Lệnh "Runas" sẽ không "sudo" lệnh của bạn.

Để thực hiện việc này từ một tệp bó, bạn cần "nâng cao" các lệnh bạn đang sinh ra. Tải về tập lệnh Nâng cao Powertoy.

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

Khởi chạy các lệnh của bạn dưới dạng:

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

hoặc là

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

Tôi đã thử 3 lệnh sau: 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"và mỗi người trong số họ trả về lỗi này: runas LỖI: Không thể chạy - net stop elevate.cmd alfrescoTomcat -2147467259: Lỗi Unspecified
Stuart Leyland-Cole

Tệp bó 3 dòng sẽ chạy lệnh nâng cao: github.com/kasajian/pseudo
zumalifeguard

0

Những gì tôi sử dụng là mã sau đây:

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

Đặt nó sau khi @echo của bạn tắt và nhận xét.


0

Câu trả lời đơn giản (thêm vào user325534) nếu bạn chỉ cần bắt đầu làm việc trong một số thư mục có quyền truy cập tối ưu:

@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

Mã này cho phép cmd yêu cầu mật khẩu người dùng. Người dùng phải nhập mật khẩu của họ và sau đó executable.batsẽ được chạy với tư cách quản trị viên

chính

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

thực thi.bat

all code that runs as administrator
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.