用于编辑主机文件的批处理文件不间断地继续运行

时间:2013-06-06 08:33:57

标签: batch-file

@Echo off
:: Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
:: If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
Echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
Echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
Echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
Exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( Del "%temp%\getadmin.vbs" )
Pushd "%CD%"
CD /D "%~dp0"
C:\Windows\System32\notepad.exe C:\Windows\System32\drivers\etc\hosts

我正在使用上面的批处理文件来编辑主机文件。在Windows 7中,默认情况下UAC提示不会到来。所以我用了这个。 但是,当用户没有管理员权限来编辑主机文件时,它会持续运行if循环并停止我们需要注销或重新启动系统的过程。

所以任何人都可以建议批处理文件中的任何更改,以便它只运行一次或两次,如果没有获得管理员权限,那么就退出。

谢谢 Sibasundar

2 个答案:

答案 0 :(得分:1)

在脚本中添加一个参数,让它知道它是否是自我调用的。如果脚本是自我调用的并且没有admin privs,那么退出。

@echo off
setlocal EnableExtensions

set "VBS=%Temp%\getadmin.vbs"

:: Check for permissions
>nul 2>&1 "%SystemRoot%\System32\cacls.exe" "%SystemRoot%\System32\config\system"
if "%ErrorLevel%"=="0" goto gotAdmin
if /i "%~1"=="Self" exit /b 1
goto UACPrompt


:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%VBS%"
echo UAC.ShellExecute "%~s0", "Self %*", "", "runas", 1 >> "%VBS%"
echo Requesting administrative privileges...
"%VBS%"
exit /b 1


:gotAdmin
shift
if exist "%VBS%" del "%VBS%"
pushd "%CD%"
cd /d "%~dp0"
"%SystemRoot%\System32\notepad.exe" "%SystemRoot%\System32\drivers\etc\hosts"
popd
endlocal

更新

@echo off
setlocal EnableExtensions

set "ExitCode=0"
set "VBS=%Temp%\getadmin.vbs"

:: Check for permissions
>nul 2>&1 "%SystemRoot%\System32\cacls.exe" "%SystemRoot%\System32\config\system"
if "%ErrorLevel%"=="0" goto gotAdmin
if /i "%~1"=="Self" goto ElevateFail
goto UACPrompt


:ElevateFail
set "ExitCode=1"
echo Error: Administrator privileges are required.
pause>nul
goto End


:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%VBS%"
echo UAC.ShellExecute "%~s0", "Self %*", "", "runas", 1 >> "%VBS%"
echo Requesting administrative privileges...
"%VBS%"
goto End


:gotAdmin
shift
if exist "%VBS%" del "%VBS%"
pushd "%CD%"
cd /d "%~dp0"
"%SystemRoot%\System32\notepad.exe" "%SystemRoot%\System32\drivers\etc\hosts"
popd


:End
endlocal & exit /b %ExitCode%

答案 1 :(得分:0)

使用代码末尾的:PAUSE

@Echo off
:: Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
:: If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
Echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
Echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
Echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
Exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( Del "%temp%\getadmin.vbs" )
Pushd "%CD%"
CD /D "%~dp0"
C:\Windows\System32\notepad.exe C:\Windows\System32\drivers\etc\hosts
:PAUSE