Мне нужно запустить пакетный файл, который должен зарегистрировать DLL. Регистрация DLL не удается, потому что пакетный файл не запускает командную строку от имени "администратора".
Есть ли способ запустить "командную строку" от имени администратора через пакетный файл.
Окружение: Win7/Vista
Этот скрипт делает трюк! Просто вставьте его в верхней части вашего файла летучая мышь. Если вы хотите просмотреть результат выполнения скрипта, добавить на "паузу" и команды в нижней части вашего пакетного файла.
Этот сценарий сейчас немного отредактировал, чтобы поддержать аргументы командной строки.
@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"
::--------------------------------------
::ENTER YOUR CODE BELOW:
Возможно, вам придется сначала использовать другой пакетный файл, чтобы запустить второй с правами администратора.
В первом используйте
runas /noprofile /user:mymachine\administrator yourbatchfile.bat
При дальнейшем использовании вы должны уметь набирать пароль в подсказке. Вы не можете ввести пароль, так как эта функция была заблокирована по соображениям безопасности.
Возможно, вам больше повезет с psexec.
(Это основано на ответе @DarkXphenomenon's, который, к сожалению, имел некоторые проблемы).
Вы должны заключить свой код в эту обертку:
if _%1_==_payload_ goto :payload
:getadmin
echo %~nx0: elevating self
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:payload
echo %~nx0: running payload with parameters:
echo %*
echo ---------------------------------------------------
cd /d %2
shift
shift
rem put your code here
rem e.g.: perl myscript.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
goto :eof
Это заставляет пакетный файл запускаться от имени привилегированного пользователя. Это добавляет два параметра к привилегированному коду:
слово payload
, чтобы указать, что это вызов полезной нагрузки, т.е. уже повышенного уровня. В противном случае
он бы просто открывал новые процессы снова и снова.
путь к директории, где был вызван основной скрипт. Из-за того, что Windows всегда запускает повышенный cmd.exe в "%windir%\system32", нет простого способа узнать, какой первоначальный путь (и сохранить возможность копировать ваш скрипт без не трогая код)
Примечание: К сожалению, по какой-то причине shift
не работает для %*
, поэтому если вам нужно
передать фактические аргументы, вам придется прибегнуть к уродливой нотации, которую я использовал
в примере (%1 %2 %3 %4 %5 %6 %7 %8 %9
), что также приводит к ограничению на
максимум 9 аргументов
Пресс <и>сочетание клавиш Ctrl</роз>+<и>сдвиг</КБД> и дважды щелкните ярлык для запуска с повышенными привилегиями процесса.
Работы из меню Пуск, а также.
Это работает для меня в Windows 7 на 10 с параметрами, а также начнется приложение или файл из любого места(включая браузер), а также доступ к файлу из любого места,заменить (пакетный скрипт здесь якорь) с вашим кодом ,это решение может помочь :)
@echo off
call :isAdmin
if %errorlevel% == 0 (
goto :run
) else (
echo Requesting administrative privileges...
goto :UACPrompt
)
exit /b
:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b
:run
<YOUR BATCH SCRIPT HERE>
exit /b
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B`
Чтобы предотвратить сценарий от ошибки, если файл скрипта находится на не системном диске (C:) и в папке с пробелами.
Batch_Script_Run_As_Admin.УМК
@echo off
if _%1_==_payload_ goto :payload
:getadmin
echo %~nx0: elevating self
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:payload
::ENTER YOUR CODE BELOW::
::END OF YOUR CODE::
echo.
echo...Script Complete....
echo.
pause
Вы можете использовать ярлык, который ссылается на пакетный файл. Просто зайдите в свойства ярлыка и выберите расширенные параметры, затем "Запуск от имени администратора".
Затем просто сделайте пакетный файл скрытым и запустите ярлык.
Таким образом, вы даже можете установить свой собственный значок для ярлыка.
Как user2549366 говорил "Вы можете использовать ярлык который ссылается на пакетный файл." но в свойствах-и GT;вкладка совместимость ярлыка, Запуск от имени администратора может быть отключен.
Так что вместо этого вы просто щелкните правой кнопкой мыши на вашу "файл.бат - ярлык" Тогда иди ->Свойства->В разделе -&ярлык ГТ; Дополнительно и там вы можете нажать Запуск от имени администратора. После этого можно запускать ярлык.
Может, что-то вроде этого:
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
)
Здесь's более простой вариант по сути один и тот же файл.
@echo off
break off
title C:\Windows\system32\cmd.exe
cls
:cmd
set /p cmd=C:\Enter Command:
%cmd%
echo.
goto cmd
Сделать текст в блокноте или любом текстовом редакторе на ваш выбор. Открыть блокнот, написать этот краткий команда "УМК.ехе" без цитату и сохранить ее в качестве УМК.летучая мышь.
Кнопкой Мыши cmd.летучей мыши и выбрать "и запуск от имени администратора" по.
это может быть решение, я сделал что-то подобное, но это не похоже на работу например, если необходимая функция требует прав администратора, он должен попросить вас перезапустить его в качестве администратора.
@echo off
mkdir C:\Users\cmdfolder
if echo=="Access is denied." (goto :1A) else (goto :A4)
:A1
cls
color 0d
echo restart this program as administator
:A4
pause