我必须执行ewfmgr.exe
,只有在以管理员身份打开命令窗口时才能执行。{/ p>
如果我转到Start
- > type cmd.exe
- > Right click
- > Run as Administrator
,则会显示以下Comand提示窗口。在这个窗口中,如果我写ewfmgr.exe
(我必须执行的EXE文件),那么执行该命令没有任何问题。
image http://imageshack.com/a/img922/9500/k0subw.png
我的要求:我的要求是通过脚本文件(RunasAdmin.cmd
文件)执行命令,此 脚本文件将通过NSIS安装程序执行< / EM>
因为ewfmgr.exe
只能用Admin执行,所以我必须升级我的脚本才能获得管理员权限。为此,我有以下脚本:
获取管理员权限的脚本: "(RunasAdmin.cmd)"
::::::::::::::::::::::::::::::::::::::::::::
:: 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
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
问题:如果我只是双击它就执行脚本(RunasAdmin.cmd
),脚本就会执行并完成任务而不会出现任何错误。但是,如果我通过我的NSIS安装程序(RunasAdmin.cmd
)执行脚本(EWFMGR_Run.exe
),那么我会收到ewfmgr is not recognised as an internal or external command
NSIS安装人员代码: (EWFMGR_Run.exe)
OutFile "EWFMGR_Run.exe"
section
ExecWait "D:\Disk\RunasAdmin.cmd"
sectionEnd
运行脚本(RunasAdmin.cmd
)后,NSIS安装程序打开的命令窗口如下:
image http://imageshack.com/a/img924/8846/vZnI70.png
Queston:两个命令窗口都以Admin身份打开,并且位于同一个工作目录中。但是NSIS安装程序如何打开窗口却无法找到ewfmgr.exe
?
UPDATE-1:基本上问题出在NSIS安装程序打开的CMD窗口中。即使我使用C:\Windows\System32
手动移至路径cd /D C:\Windows\System32
并尝试执行ewfmgr.exe
(该路径中可用),CMD也无法识别它。
参考文献:提升为管理员的脚本文件取自马特的答案given here.
答案 0 :(得分:0)
尝试修改 RunasAdmin.cmd 以使用 Sysnative 而不是 System32 :
set winSysFolder=Sysnative
我猜测 EWFMGR_Run.exe 正在启动32位cmd窗口,并且Windows强制 c:\ windows \ syswow64 覆盖您尝试覆盖设置winSysFolder = System32
根据此article,您应该使用 Sysnative 虚拟文件夹。
'Sysnative'文件夹
如上所述,只能在文件夹路径中插入“\ System32”,无法从32位应用程序访问64位 System32 文件夹。如果您尝试,系统会自动重定向到 SysWOW64 文件夹。但是可以使用另一个文件夹名称: Sysnative 。
Sysnative是一个虚拟文件夹,一个特殊的别名,可用于从32位应用程序或脚本访问64位 System32 文件夹。例如,如果您在应用程序的源代码中指定此文件夹路径:
<强> C:\的Windows \ Sysnative 强>
实际使用了以下文件夹路径:
<强> C:\ Windows \ System32下强>
答案 1 :(得分:0)
我想指出NSIS处理UAC和提升权利的具体方式。
如果您的NSIS安装程序需要运行具有提升权限的任何内容,则必须在NSIS脚本中指明如下:
RequestExecutionLevel admin
执行此操作后,当您启动安装程序时,它会弹出UAC提示符,并且在运行需要提升权限的外部脚本或程序时不会遇到任何问题。
这几乎符合Mofi的答案#5 - 我仍然发布这个,因为我认为它归结为需要知道。 NSIS似乎是适合你的节目。