[英]how to perform direct syscall under Windows 7 X64 SP1 (x64 mode)?
[英]Open Command Window in Windows x64 mode
我有一个安装在 x64 中的应用程序。 我想在 x64 命令提示符下执行这个 EXE。
情况1:
如果我以管理员身份手动打开命令提示符( Start->Type, cmd.exe->Right click->Run as Administrator
),那么 EXE 工作正常。 我在 cmd 窗口中使用SET
命令获得有关环境变量的以下规范:
CommonProgramFiles=c:\Program Files\Common Files
CommonProgramFiles(x86)=c:\Program Files (x86)\Common Files
CommonProgramW6432=c:\Program Files\Common Files
PROCESSOR_ARCHITECTURE=AMD64
案例2:
如果我使用提升为管理员权限的脚本文件打开命令窗口,则找不到 EXE。 我使用SET
命令获得环境变量的以下值:
CommonProgramFiles=c:\Program Files (x86)\Common Files
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
ProgramFiles=c:\Program Files (x86)
ProgramFiles(x86)=c:\Program Files (x86)
winSysFolder=System32
问题:我必须使用Case 2 。 我认为ProgramFiles
路径的差异可能是我的 EXE 在第二种情况下不起作用的原因。 如何在脚本中指定它应该在 x64 命令提示符下执行?
PS:我的主要问题的链接是here 。
看起来您正在使用 32 位可执行文件以提升的权限运行批处理文件。 在这种情况下,批处理文件使用%SystemRoot%\\SysWOW64
32 位cmd.exe
执行,请参阅 Microsoft 文章:
由于批处理文件已经以提升的权限执行,只需要在 64 位 Windows 上由 64 位cmd.exe
处理,这里有几行确保批处理文件由 64 位 Windows 命令处理器执行在 64 位 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
将您的主要批次代码放在标签下方:Maincode
。
如果批处理文件在完全不存在环境变量ProgramFiles(x86)
32 位 Windows 上运行,则第一个IF条件跳转到主批处理代码。
仅在 64 位 Windows 上执行的第二个IF条件如果找不到文件%SystemRoot%\\Sysnative\\cmd.exe
则跳转到主批处理代码,因为批处理文件已由 64 位cmd.exe
。
Sysnative
不是目录。 它是一个特殊的别名,仅当 32 位环境在 64 位 Windows 上处于活动状态时才存在。 出于这个原因,例如只能使用条件if exist %SystemRoot%\\Sysnative\\*
来检查任何文件的存在,而不可以使用条件if exist %SystemRoot%\\Sysnative
来检查目录是否存在因为Sysnative
不是目录。
要了解使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
cmd /?
echo /?
goto /?
if /?
pause /?
set /?
最简单的方法是使用 SysNative 路径。 这是您的 RunAsAdmin.cmd 的修改版本(最初发布在这里: 如何自动提升我的批处理文件,以便它在需要时从 UAC 管理员权限请求? )这样做:
::::::::::::::::::::::::::::::::::::::::::::
:: 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.