无法以管理员身份运行

时间:2017-01-05 09:43:35

标签: windows batch-file cmd

我必须执行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.

2 个答案:

答案 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似乎是适合你的节目。

供参考: NSIS - Could not write updated PATH to HKLM