I have an application which is installed in x64. I want to execute this EXE in x64 command prompt.
CASE 1:
If I open the command prompt man
It looks like you are using a 32-bit executable to run the batch file with elevated privileges. In this case the batch file is executed with 32-bit cmd.exe
in %SystemRoot%\SysWOW64
, see the Microsoft articles:
As the batch file is already executed with elevated privileges and just needs to be processed by 64-bit cmd.exe
on 64-bit Windows, here are the few lines to make sure that the batch file is executed by 64-bit Windows command processor on 64-bit Windows.
@echo off
if "%ProgramFiles(x86)%" == "" goto MainCode
if not exist %SystemRoot%\Sysnative\cmd.exe goto MainCode
%SystemRoot%\Sysnative\cmd.exe /C "%~f0" %*
goto :EOF
:MainCode
set Program
pause
Put your main batch code below the label :Maincode
.
The first IF condition jumps to main batch code if the batch file is running on 32-bit Windows where the environment variable ProgramFiles(x86)
does not exist at all.
The second IF condition only executed on 64-bit Windows jumps to main batch code if it cannot find the file %SystemRoot%\Sysnative\cmd.exe
because the batch file is processed already by 64-bit cmd.exe
.
Sysnative
is not a directory. It is a special alias which exists only when 32-bit environment is active on 64-bit Windows. For that reason it is only possible to use, for example, the condition if exist %SystemRoot%\Sysnative\*
to check for existence of any file, but not the condition if exist %SystemRoot%\Sysnative
to check for existence of the directory because of Sysnative
is not a directory.
For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.
cmd /?
echo /?
goto /?
if /?
pause /?
set /?
The simplest way is to use the SysNative path. Here is a modified version of your RunAsAdmin.cmd (which was originally posted here: How can I auto-elevate my batch file, so that it requests from UAC administrator rights if required?) that does that:
::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
::::::::::::::::::::::::::::::::::::::::::::
@echo off
CLS
ECHO.
ECHO =============================
ECHO Running Admin shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set cmdInvoke=0
set winSysFolder=System32
IF EXIST %SystemRoot%\SysNative\cmd.exe set winSysFolder=SysNative
set "batchPath=%~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 & pushd .
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
ewfmgr c: -enable
pause
cmd /k