批处理文件UAC提示中按no后删除文件

问题描述 投票:0回答:1

我有一个包含文件和批处理的 SFX zip,解压后会自动启动。该批处理首先尝试使用下面的获取管理代码提升该批处理的权限。

效果很好,已经用了很长时间了。但现在我需要它来做一些额外的事情。

SFX 在执行时将文件缓存在 C:\Windows\Temp 中。有些文件内容敏感,在批处理文件过程的其余部分中用于设置安装、复制文件等。在批处理文件结束时,这些文件将被删除。

但是,我突然意识到,如果用户在 UAC 提示符下按“否”,则批处理不会运行,因此文件仍保留在缓存中!

我决定尝试在用户按“否”后在管理代码中插入文件删除。 但因为那部分是 Windows shell,我看不到一种方法来捕获他们按下了“否”。

"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
DEL file1.txt
DEL file2.txt
DEL file3.txt
exit /b

"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
 exit /b
 DEL file1.txt
 DEL file2.txt
 DEL file3.txt

经过很长时间尝试在不同的地方添加额外的线路,我几乎在出口 /b 之前和之后尝试它们。但是,如果您按“是”,它仍然会删除文件。

我还尝试删除退出/b,以便它继续运行管理代码并触发删除,因为没有获得管理权限,我预计ELEV最终不会解决,所以尝试了这个。

"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1
    DEL file1.txt
    DEL file2.txt
    DEL file3.txt
)

我知道有些人可能会评论说,即使可以做到这一点,中途取消批次也会将文件留在那里。是的,但至少这是一件事,我需要看看我现在是否可以做到这一点。

最终,如果用户按否,我需要管理代码不立即关闭,这样它就可以删除缓存中的 3 个文件,然后关闭。 我以为这很容易,但几个小时后我需要再次请教专家。感谢您提前提供任何建议。

:getadmin
::------------------------------------------------------------------------------------------------------
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableExtensions 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
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)
::------------------------------------------------------------------------------------------------------
batch-file cmd uac
1个回答
0
投票

@echo off
if "%1" equ "elev" goto elev
if exist %temp%\iselevated.tmp del %temp%\iselevated.tmp >nul
mshta vbscript:Close(CreateObject("Shell.Application").ShellExecute("cmd.exe","/c"+Space(1)+"call"+Space(1)+"""%~f0"""+Space(1)+"elev","","runas",1))
timeout /nobreak 1 >nul
if exist %temp%\iselevated.tmp (
echo User clicked Yes on the UAC prompt!
echo There is an elevated process running!
echo Aborting Cleanup...
pause
exit /b
)
echo User clicked No on the UAC prompt!
echo No new elevated process was spawned!
echo Attempting to clear cached files...
rem DEL file1.txt
rem DEL file2.txt
rem DEL file3.txt
pause
exit /b 
:elev
icacls "%~f0" /setintegritylevel HIGH >nul
cd /d "%~dp0"
if not exist "%~dp0" exit /b
echo. > %temp%\iselevated.tmp
echo Running elevated
rem change "runas",1 to "runas",0 to make the window invisible
rem (admincode goes here)
rem ???
rem DEL file1.txt
rem DEL file2.txt
rem DEL file3.txt
pause
exit /b

© www.soinside.com 2019 - 2024. All rights reserved.