Можно ли автоматически запускать командный файл от имени администратора

48

Мне интересно, можно ли автоматически открывать командный файл как администратор, когда вы дважды щелкаете на командном файле, потому что команды должны выполняться с правами администратора.

Примечание: я уже знаю о решении щелкнуть правой кнопкой мыши по файлу и щелкнуть по нему Run As Administrator, но это не автоматическое решение.

Antp
источник
Я смог заставить это работать на меня: stackoverflow.com/a/13811519/27928
Rohit
2
Как два автоматических щелчка левой кнопкой мыши более автоматичны, чем один щелчок левой и правой кнопкой мыши?
jiggunjer

Ответы:

44

Да, вы можете запустить командный файл с правами администратора. К сожалению, вы не можете сделать это непосредственно из командного файла самостоятельно. Вам нужно сначала создать ярлык этого командного файла и изменить свойства для этого ярлыка, чтобы эта работа работала.

Чтобы создать ярлык, есть много способов, но самый простой и быстрый способ - использовать опцию Отправить в контекстном меню.

Right click batch file > Send to > Desktop (create shortcut)

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

  1. Щелкните правой кнопкой мыши по ярлыку, который вы только что создали (он должен быть на рабочем столе или там, где вы его отправили)
  2. На вкладке «Ярлык» нажмите кнопку «Дополнительно ...».
  3. Установите флажок «Запуск от имени администратора» и нажмите кнопку «ОК», чтобы открыть как модальное окно, так и главное окно свойств.
  4. Запустите ярлык, дважды щелкнув по нему, и командный файл должен запускаться от имени администратора.
10100111001
источник
1
Вы всегда можете заставить командный файл вызывать ярлык, и у ярлыка должен быть параметр, чтобы не вызывать ярлык. Вы должны вставить что-то вроде if "%~1" == "" start %USERPROFILE%\Desktop\Shortcut.lnk && GOTO :EOFниже @echo offи сделать ссылку на ярлык program.bat aвместо просто program.bat.
trlkly
2
Ифеди пишет: «Принятый ответ [этот от Tech1337] действительно работает. Но я обнаружил, что в Windows 7 мне приходилось терпеть диалог UAC каждый раз, когда нажимали на ярлык». <- Хотя кто-то еще говорит, что это работает без UAC
barlop
Для меня ярлык не запускается в текущем каталоге при двойном щелчке, хотя .bat работает. Даже при заполненном ярлыке «Начать с:» на ярлыке. Поэтому убедитесь, что в вашем .bat указаны полные пути к файлам.
Роб Мошер
29

Как написано в ответе Бена Грипки на другой вопрос:

REM --add the following to the top of your bat file--


@echo off

:: 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"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

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

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
user399109
источник
Да, я нашел это и использую это в настоящее время. В любом случае спасибо!
Antp
По сути то, что я искал. Надеялся, что есть способ сделать это без использования VB?
шеф-повар фараон
@ChefPharaoh это создает консоль с повышенными правами для запуска командного файла. Вы можете сделать то же самое с помощью скрипта powershell.
jiggunjer
Это был лучший ответ для меня.
kasperhj
4

Принятый ответ действительно работает. Но я обнаружил, что в Windows 7 мне приходилось терпеть диалог UAC при каждом нажатии на ярлык. Это ИМХО значительно отвлекает от «автоматически» в этом вопросе!

Затем я обнаружил, что в моей собственной ситуации рассматриваемый .batфайл должен запускаться планировщиком задач. В этом случае, проверяя Run with highest privilegesопцию на Generalвкладке задачи, приятно позаботится о проблеме. Затем .batон запускается от имени администратора без каких-либо хлопот.

PS: я не понимал, что я не могу загрузить изображения в этом ответе, потому что у меня сейчас есть симпатичный маленький скриншот! Или я могу?

Ифеди Оконкво
источник
2
Если вы добавите ссылки на изображения, кто-то вставит их для вас.
Ramhound
@Ramhound. Добавить ссылки на изображения? Изображение на моем рабочем столе, а не где-то в Интернете. Или, конечно, я что-то упустил?
Ифеди Оконкво,
Да; Вы загружаете их; Вы просто не можете вставить скриншоты в свой ответ.
Ramhound
Либо этой кнопки загрузки там не было, либо я вчера был полуслепым! Я уверен, что это был последний. Во всяком случае, я очень хорошо завершил загрузку файла, и мне сказали, что мне нужно 10 повторений для публикации изображений. Спасибо хоть.
Ифеди Оконкво,
Вы все равно можете разместить ссылку в ответе.
Ramhound
4

в Windows 7

  1. Создать ярлык для этого командного файла

  2. Щелкните правой кнопкой мыши файл ярлыка

  3. Нажмите кнопку продвижения, чтобы найти флажок для запуска от имени администратора

Проверьте скриншот ниже

Скриншот

fedmich
источник
1
Ваше высказывание совпадает с принятым ответом.
Antp
Да, я просто хотел создать простой список со скриншотом для всех, кто спешит.
Федмих
3
Если кто-то спешит, я сомневаюсь, что они прокрутят до конца ответ. Спасибо в любом случае
Antp
3

Вы можете использовать мой скрипт Batch_Admin для автоматического повышения уровня администратора для использования в любом типе собственного скрипта Batch, или BAT или .CMD. Эта функция обеспечивает работу в стандартной среде со стандартными инструментами и одинаково в разных системах Windows. Он использует несколько стандартных и встроенных команд Windows. Не используйте другие внешние скрипты. Его можно использовать для вызова любой программы от имени администратора, а не только для пакетных скриптов. Достаточно создать небольшой скрипт, который затем вызывает программу, требующую разрешения Administartor. Поместите это в любую папку поиска PATH (из% PATH%).

Чтобы использовать его, вы просто вставляете следующую строку (в точности как) в родительский пакетный скрипт, который должен запускаться от имени администратора. Лучше всего это сделать в верхней части нашего родительского скрипта, и лучше всего сначала, который далее будет вызываться через CALL, некоторые подпрограммы (см. Подробное объяснение ниже).

net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

Это может быть вставлено в любые дочерние сценарии, вызываемые синтаксисом CALL. Для отображения сообщения, пока оно еще не имеет прав администратора, например, за 5 секунд до вызова Batch_Admin установите переменную «ShowAdminInfo» на количество секунд

SET ShowAdminInfo=5
net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

Итак, как это работает:

• Вызывает UAC.ShellExecute через VBScript для получения пользовательских разрешений.

• Пакетный запуск скрипта, или BAT или CMD

• Вызывающий скрипт может иметь длинные пространства имен, включенные в вызов в кавычках

• Отдайте все параметры вызова основного сценария, переданного из командной строки, как если бы не было передачи вызова, и начните что-либо с нуля, также со специальными символами, такими как восклицательные знаки (!) И процент (%), а также с круглыми скобками ()

• Содержит местоположение главного сценария, если вызов произошел в каталоге, где этот сценарий является главным.

• Вспомогательный выводит сообщение, если мы установили перед собой переменную «ShowAdminInfo», например. на 5 секунд, что может помешать немедленному переходу прав Администратора с предоставлением дополнительной информации и возможностью обоснованного решения. Примеры настроек, которые должны быть установлены: SET ShowAdminInfo = 5 По умолчанию, поскольку эта переменная не определена, она не отображается.

• Сценарий также вызывает в системном поисковом пути% PATH% и из сетевого ресурса, например: \ Computer \ share \ test.bat

• Предотвращает недоразумения при записи необходимых вспомогательных файлов, когда скрипт вызывает несколько Batch_Admin практически одновременно. Используется случайное число от 1 до 100

• Но лучше всего использовать его на родительском скрипте. Переход к правам администратора всегда требует, чтобы вы снова запускали сценарий полностью, в новом окне, в новой среде, без обращения к переменным, которые были предварительно установлены в нашем сценарии, и значения этих переменных не передавались затем для вызова в качестве администратора , Просто скрипт будет выполнен снова.

Ниже полный скрипт Batch_Admin. Расширенная информация об этом есть на моем сайте.

Скопируйте следующий текст в Блокнот и сохраните его на диск как: Batch_Admin.bat

@echo off
if "%~1"=="" (echo *** Batch_Admin ***&echo.&echo Automatically get admin rights for another Batch. See info inside.&TIMEOUT /T 30>nul&goto:eof)

::  A D M I N I S T R A T O R   - Automatically get admin rights for script batch. Paste this on top:    net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*
::                                Also keep Batch directory localisation and then set variable:   PATH_BAT
::                                if earlier variable "ShowAdminInfo" is empty (not defined) then no info, else showing info with number of seconds
::
::                                Elaboration:  Artur Zgadzaj
setlocal
setlocal DisableDelayedExpansion

SET "Localy="
if exist "%~1"      SET "Localy=YES"
if exist "%~1.BAT"  SET "Localy=YES"
if exist "%~1.CMD"  SET "Localy=YES"
if defined Localy   FOR %%I IN ("%~1") DO SET "PATH_BAT=%%~dI%%~pI"

 SET P1=%~1
 SET Parameters=%*
 SET Parameters=%Parameters:!=^^!%
setlocal EnableDelayedExpansion
 SET Parameters=!Parameters:%P1%=!
 SET Parameters=!Parameters:%%=%%%%!
setlocal DisableDelayedExpansion
 SET Parameters=%Parameters:~3%

net session >nul 2>nul&if not errorlevel 1  goto Administrator_OK

if not defined ShowAdminInfo   goto skip_message_Administrator
echo.
echo Script:  %~1
echo.
echo *****************************************************************
echo ***    R U N N I N G     A S     A D M I N I S T R A T O R    ***
echo *****************************************************************
echo.
echo Call up just as the Administrator. You can make a shortcut to the script and set:
echo.
echo          shortcut ^> Advanced ^> Running as Administrator
echo.
echo     Alternatively run once "As Administrator"
echo     or in the Schedule tasks with highest privileges
echo.
echo Cancel Ctrl-C or wait for launch  %ShowAdminInfo%  seconds ...
TIMEOUT /T %ShowAdminInfo% > nul

:skip_message_Administrator
MD %TEMP% 2> nul
SET /A $Admin$=%RANDOM% * 100 / 32768 + 1

SET "Percent="
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul
echo %Parameters% > "%TEMP%\$Admin_%$Admin$%_Test.bat"
if not exist "%TEMP%\$Admin_%$Admin$%_Test.bat"  SET Percent=^"
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul

echo @SET "PATH_BAT=%PATH_BAT%"               > "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
echo @SET "BatchFullName=%BatchFullName%"    >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
if defined Localy  (echo @CD /D "%PATH_BAT%" >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat")
echo @"%~1" %Parameters% %Percent% >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"

echo SET UAC = CreateObject^("Shell.Application"^)                                   > "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
echo UAC.ShellExecute "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat", "", "", "runas", 1 >> "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
"%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
endlocal
exit /B

:Administrator_OK
"%~1" %Parameters%
goto:eof
REM *** A D M I N I S T R A T O R  - Automatically get admin rights  (The End)  ***
Артур Згадзай
источник
Я думаю, что это похоже или идентично приведенному выше ответу: superuser.com/a/852877/375935
jiggunjer
1

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

runas /savecred /user:(domain)\(admin user) "(file path to exe,bat,whatever)"
Brapapple
источник
1
@echo off        
:: 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  
chkdsk

Это также работает ИСТОЧНИК: https://social.technet.microsoft.com/Forums/windows/en-US/bc8a4561-d97e-4339-9b1c-9b90e54a7f92/request-elevation-inside-cmdbatch-file

Хосе Морено Сервантес
источник
Можете ли вы объяснить свое решение?
Scai
1
Другая версия superuser.com/a/852877/375935
jiggunjer
0

Вы можете использовать утилиту командной строки elevate. (ссылка для скачивания - https://drive.google.com/open?id=0Bz7qe_olclTwVGZLUklFMHNxQ00 )

Usage: Elevate [-?|-wait|-k] prog [args]
-?    - Shows this help
-wait - Waits until prog terminates
-k    - Starts the the %COMSPEC% environment variable value and
                executes prog in it (CMD.EXE, 4NT.EXE, etc.)
prog  - The program to execute
args  - Optional command line arguments to prog
T.Todua
источник
Разве это не вызывает панораму UAC?
Antp
это воспитывает ... однако, это лучше, чем ничего (видя "доступ запрещен" ..)
T.Todua
Не совсем «автоматический», правда, это
Antp
0

Это пример запуска летучей мыши от имени администратора. Меня устраивает.

Это выглядит так:

if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else (
  echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
)
:eof
start Cmd /k "netsh wlan show profile"
pause </

cls
Color 0A
@echo off
echo.
cls
set/p ProfileName=Type the name of the current Wifi signal? 
echo.
start Cmd /k "netsh wlan show profile name=%ProfileName% key=clear"
pause </
exit
pause
JoshMoreNo
источник
Добро пожаловать в Супер пользователя! Хотя это может дать ответ на вопрос, было бы лучше, если бы вы могли объяснить, почему это так.
DavidPostill
Еще один вариант superuser.com/a/852877/375935
jiggunjer