8

Я пытаюсь написать командный файл, который должен запускать некоторые команды с использованием учетной записи локального администратора (запуск / остановка службы) и некоторые команды с использованием вошедшего в систему пользователя (копирование файлов из каталога пользователя), и у меня возникают проблемы. Я пробовал следующие команды:

Руны с /savecred

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

При использовании /savecred мне не предлагается пароль. Вместо этого окно командной строки кратковременно вспыхивает и исчезает. Я не могу сказать, что находится в этом окне. Служба не остановлена.

Руны без /savecred

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

Эти команды запрашивают у меня пароль, но затем демонстрируют то же поведение, что и вышеперечисленные команды: на короткое время появляется окно командной строки, и служба не останавливается.

В идеале я хотел бы сохранить пароль для сеанса, так как мне нужно будет запускать больше команд с подробностями.

Возможно ли это и если да, что я делаю не так?

7 ответов7

11

Вы можете добавить следующее в ваш скрипт, и он будет работать с повышенными правами. Не нужно ничего скачивать.

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

Если вы не возражаете против стороннего программного обеспечения, вы можете попробовать запустить как пароль runasspc. Это сохранит ваш пароль в зашифрованный файл. Пароль не должен быть выставлен в командном файле.

0

Упрощенный ответ (дополнение к user325534), если вам нужно только начать работать в каком-то каталоге с расширенным доступом:

@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

Команда "Runas" не будет "sudo" вашей командой.

Чтобы сделать это из командного файла, вам нужно "поднять" команды, которые вы порождаете. Загрузите скрипты Elevate Powertoy.

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

Запустите ваши команды как:

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

или же

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

Этот код позволяет cmd запрашивать пароль пользователя. Пользователь должен ввести свой пароль, а затем executable.bat будет запущен от имени администратора.

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
0

Я использую следующий код:

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

Поместите это после своего @echo off и замечаний.

0

разделите ваш пакетный файл на две части. Часть, которую вы хотите запустить как admincmd, вставьте в system32. Часть, которую вы хотите запустить в обычном cmd, вставьте ее в обычную папку, и отсюда вызовите второй пакетный файл, который там есть system32. Таким образом, вторая часть всегда выполняется в admincmd. Я попробовал это, и это работает для меня.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .