在非管理员控制台中保存以管理员权限启动的Windows应用程序的标准输出。
在非管理员控制台中保存以管理员权限启动的Windows应用程序的标准输出。
我希望我的批处理文件只能以提升权限的方式运行。如果没有提升权限,则为用户提供重新以提升权限运行批处理的选项。\n我正在编写一个批处理文件,用于设置系统变量,将两个文件复制到Program Files位置,并启动驱动程序安装程序。如果一个Windows 7/Windows Vista用户(即使他们是本地管理员,启用了UAC)在没有右键单击并选择“以管理员身份运行”的情况下运行它,他们将得到“访问被拒绝”的错误,在复制这两个文件和写入系统变量时。\n我希望使用一个命令来自动以提升权限的方式重新启动批处理,如果用户确实是管理员的话。否则,如果他们不是管理员,我希望告诉他们需要管理员权限才能运行此批处理文件。我使用xcopy命令来复制文件,使用REG ADD命令来写入系统变量。我使用这些命令来处理可能的Windows XP机器。我在这个问题上找到了类似的问题,但没有处理重新以提升权限方式运行批处理文件的方法。
问题的原因是在Windows应用程序中启动具有管理员权限的非管理员控制台时,无法保存标准输出。解决方法是使用以下批处理脚本:
NET SESSION IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE GOTO ADMINTASKS :ELEVATE CD /d %~dp0 MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();" EXIT :ADMINTASKS (Do whatever you need to do here) EXIT
这种方法简单,并且只使用Windows默认命令。如果需要重新分发批处理文件,则非常适用。
`CD /d %~dp0`将当前目录设置为文件所在的目录(如果尚未设置,不管文件所在的驱动器是什么,都要使用`/d`选项)。
`%~nx0`返回带有扩展名的当前文件名(如果不包括扩展名,并且文件夹中有相同名称的exe文件,则会调用该exe)。
文章如下:
在Windows应用程序中启动具有管理员权限的非管理员控制台时,无法保存标准输出。为了解决这个问题,可以使用以下批处理脚本:
NET SESSION IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE GOTO ADMINTASKS :ELEVATE CD /d %~dp0 MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();" EXIT :ADMINTASKS (Do whatever you need to do here) EXIT
这个方法非常简单,并且只使用Windows默认命令。如果需要重新分发批处理文件,这种方法非常适用。
`CD /d %~dp0`命令将当前目录设置为文件所在目录(如果尚未设置,不管文件所在的驱动器是什么,都要使用`/d`选项)。
`%~nx0`命令返回带有扩展名的当前文件名(如果不包括扩展名,并且文件夹中有相同名称的exe文件,则会调用该exe)。
这种方法的简洁性使得它比其他答案中提出的解决方案更易于理解和实现。希望这对某些人有所帮助。
需要注意的是,在网络驱动器上,`cd %~dp0`命令可能无法正常工作,可以使用`pushd %~dp0`命令替代。
在这个的问题中,还提到了一些关于`CD`命令的相关知识。`/d`选项可以更改当前工作的驱动器或路径,但是如果不显式使用`/d`选项,`cd`命令不会更改驱动器(即使在路径开头明确包含驱动器),而直接输入驱动器号加冒号会更改驱动器。
此外,还提到了使用Jscript的好处,以及一些关于`CD`命令和其他命令的文档链接。
总之,以上是关于如何在具有管理员权限的非管理员控制台中保存标准输出的问题的原因和解决方法的整理。这种方法简单且易于使用,适用于重新分发批处理文件。希望这篇文章对您有所帮助!
问题的原因是在非管理员控制台中启动具有管理员权限的 Windows 应用程序时,无法保存标准输出(stdout)。解决方法是使用 PowerShell 脚本在批处理脚本中嵌入命令来实现。
原始的批处理脚本中,通过检查权限来确定是否以管理员身份运行,并使用 PowerShell 脚本重新运行当前脚本以获取管理员权限。然后,将传递的参数作为工作目录,并执行实际的工作。
代码示例中的修改版批处理脚本首先检查权限,如果权限不是管理员,则使用 PowerShell 的 Start-Process 命令以管理员权限重新运行当前脚本。然后,改变工作目录为传递的参数,并执行实际的工作。
这种解决方法使用 PowerShell 脚本作为桥梁来实现以管理员权限运行批处理脚本,并在其中保存标准输出。这样可以解决在非管理员控制台中运行具有管理员权限的应用程序时无法保存 stdout 的问题。
(Save stdout from win application launched with admin rights in non admin console)这个问题的出现的原因以及解决方法 [/apcode] 这段代码通过使用`NET FILE`命令来检查是否具有管理员权限,如果没有则重新启动批处理脚本以获得权限。在重新启动时,Windows会弹出UAC对话框,要求输入管理员账户和密码。 这个解决方法在Windows 7、8、8.1、10和11上都经过测试,适用于所有这些操作系统。 使用这个批处理脚本后,你可以在开始点之后放置任何需要系统管理员权限的内容,例如,如果你打算重新安装和重新运行Windows服务以进行调试目的(假设`mypackage.msi`是一个服务安装程序包): msiexec /passive /i mypackage.msi net start myservice
问题原因:在Windows应用程序中以管理员权限启动的情况下,无法将stdout保存在非管理员控制台中。
解决方法:使用以下代码可以解决这个问题:
::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
::::::::::::::::::::::::::::::::::::::::::::
off
CLS
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~dpnx0"
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
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
msiexec /passive /x mypackage.msi
如果不需要自动提升权限,而是希望在没有管理员权限时显示错误消息并退出,可以在脚本开头添加以下内容:
OFF & CLS & ECHO.
NET FILE 1>NUL 2>NUL & IF ERRORLEVEL 1 (ECHO You must right-click and select & ECHO "RUN AS ADMINISTRATOR" to run this batch. Exiting... & ECHO. & PAUSE & EXIT /D)
REM ... proceed here with admin rights ...
这样,用户需要右键单击并选择“以管理员身份运行”来运行批处理脚本。如果检测到管理员权限,则会继续执行脚本,否则将显示错误消息并退出。如果不需要`PAUSE`命令,可以将其删除。
这个解决方法在Windows上工作良好,并且已经在多台计算机上进行了测试。如果遇到问题,可以尝试以下解决方法:
- 检查Windows的UAC设置,确保它设置为适当的级别。
- 确保你的Windows安装未被修改或禁用必要的组件。
- 尝试在不同的Windows操作系统版本上运行脚本,以确定问题是否与特定的操作系统版本有关。
总之,这个解决方法提供了一种在非管理员控制台中以管理员权限运行Windows应用程序的方式,并且经过了广泛的测试和验证。