I want to run batch file with admin. So I put these code at the beginning of the batch file.
@echo on
Reg query "HKU\S-1-5-19\Environment" >nul 2>&1
if '%errorlevel%' NEQ '0' (
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 /f /q "%temp%\getadmin.vbs"
exit /B
:gotAdmin
Pushd "%~dp0"
But it didn't work.
I use "pause" to examine where is bug.
I found that when executing this line "%temp%\getadmin.vbs"
UAC will prompt.
If I directly execute C:\Users\User\AppData\Local\Temp\getadmin.vbs
in CMD.
UAC will prompt too.
But another stranger thing is if I run the code above on another computer,
it is totally fine. No UAC prompt.
I try the code from here also useless.
How to solve it?
Update
::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
:: see "https://stackoverflow.com/a/12264592/1016343" for description
::::::::::::::::::::::::::::::::::::::::::::
@echo on
CLS
ECHO.
ECHO =============================
ECHO Running Admin shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~dpnx0"
rem this works also from cmd shell, other than %~0
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
if '%cmdInvoke%'=='1' goto InvokeCmd
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
goto ExecElevation
:InvokeCmd
ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
:ExecElevation
"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
REM Run shell as admin (example) - put here code as you like
ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
cmd /k
I try the code from here
Just change echo off to echo on. No add any code.
Setting UAC to this. UAC Setting
execute the BAT file directly.
and it will stop at "%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
And then I open 0EgetPriv_ST.vbs
add ' at UAC.ShellExecute "C:\Windows\System32\cmd.exe", args, "", "runas", 1
like this
Set UAC = CreateObject("Shell.Application")
args = "ELEV "
For Each strArg in WScript.Arguments
args = args & strArg & " "
Next
args = "/c """ + "C:\Users\User\Desktop\ST.bat" + """ " + args
'UAC.ShellExecute "C:\Windows\System32\cmd.exe", args, "", "runas", 1
It can execute normally.
No UAC prompt.
Why UAC.ShellExecute "C:\Windows\System32\cmd.exe", args, "", "runas", 1 cause UAC prompt ?
And how to avoid it?