batch file - Arranque híbrido y ejecución automática de VBS como administrador
batch-file vbscript (1)
Recibo un extraño error " Referencia de entidad sin terminación " en un lote híbrido y VBS, que emerge el cuadro de diálogo "Ejecutar como administrador" de UAC usando una adaptación de este código, y luego procede a descomprimir un archivo en una carpeta en la unidad del sistema. El híbrido está estructurado de manera similar a lo sugerido aquí , y cambiarlo no es deseable.
Intentó agregar bloques CDATA VBS sin éxito. Reestructurar el lote a reemplazar : la función GetAdminRights con la misma sección dentro no ayuda. Alguna idea, ¿qué pasa aquí?
<!-- : Begin batch script
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set vbs="%temp%/_.vbs" & set "dir=C:/Unzip"
set "file=%USERPROFILE%/Downloads/archive.zip/"
call :GetAdminRights
cscript //nologo "%~f0?.wsf" //job:UNZ "%dir%" "%file%"
exit /b
:GetAdminRights
REM --> Check for permissions
IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%/SysWOW64/cacls.exe" "%SYSTEMROOT%/SysWOW64/config/system"
) ELSE (>nul 2>&1 "%SYSTEMROOT%/system32/cacls.exe" "%SYSTEMROOT%/system32/config/system")
REM --> If error flag set, user don''t have admin permissions
if ''%errorlevel%'' NEQ ''0'' (echo Requesting administrative privileges...
) else (set "adm=1")
if not defined adm (set params = %*:"=""
cscript //nologo "%~f0?.wsf" //job:ADM %~s0 !params!
) else (pushd "%CD%" & CD /D "%~dp0")
exit /b
----- Begin wsf script --->
<package>
<job id="ADM"><script language="VBScript">
<![CDATA[
Set UAC = CreateObject("Shell.Application")
UAC.ShellExecute "cmd.exe", "/c ""wscript.Arguments(0)"" wscript.Arguments(1)", "", "runas", 1
]]>
</script></job>
<job id="UNZ"><script language="VBScript">
<![CDATA[
set fso = CreateObject("Scripting.FileSystemObject")
If NOT fso.FolderExists(wscript.Arguments(0)) Then
fso.CreateFolder(wscript.Arguments(0))
End If
set objShell = CreateObject("Shell.Application")
set FilesInZip = objShell.NameSpace(wscript.Arguments(1)).items
objShell.NameSpace(wscript.Arguments(0)).CopyHere(FilesInZip)
set fso = Nothing
set objShell = Nothing
]]>
</script></job>
</package>
::Error
/test.bat?.wsf(44, 12) Windows Script Host: Unterminated entity reference - matching '';'' not found
Este script fijo funciona bien. Representa un ejemplo de script híbrido, que puede elevar a un usuario a los derechos de administrador durante la duración de la sesión de Cmd, y permite ejecutar otras tareas de usuario agregadas como trabajos de VBS. Los caracteres <> deben evitarse en segmentos de lotes del híbrido, ya que se identifican como ignorados por las secciones de lotes WSF.
<!-- : Begin batch script
@echo off
setlocal EnableExtensions EnableDelayedExpansion
CD /D "%~dp0"
set "dir=%temp%/Unzip" & set "file=%USERPROFILE%/Downloads/archive.zip"
if not "%1"=="ADR" (call :GetAdminRights
if defined adm cscript //nologo "%~f0?.wsf" //job:ADM "/c" "%~sf0" "ADR" )
echo/ & >nul 2>&1 net file && (echo "!errorlevel!" Got admin rights & echo/) ^
|| (echo "!errorlevel!" No admin rights & goto :end)
:: add your code here
echo Performing admin tasks & echo/
cscript //nologo "%~f0?.wsf" //job:UNZ "%dir%" "%file%"
if !errorlevel! equ 0 echo All tasks completed.
:end
timeout /t 5 >nul
exit /b
:GetAdminRights
REM Check for permissions
echo/ & >nul 2>&1 net session && (echo "!errorlevel!" Got admin rights) ^
|| (echo "!errorlevel!" No admin rights) & echo/
REM If error flag set, user don''t have admin permissions
if ''!errorlevel!'' NEQ ''0'' (set "adm=0" & echo Requesting admin rights...)
exit /b
----- Begin wsf script --->
<package>
<job id="ADM"><script language="VBScript">
Set UAC = CreateObject("Shell.Application")
args = ""
For Each strArg in WScript.Arguments
args = args & strArg & " "
Next
UAC.ShellExecute "cmd.exe", args, "", "runas", 1
</script></job>
<job id="UNZ"><script language="VBScript">
set fso = CreateObject("Scripting.FileSystemObject")
If NOT fso.FolderExists(wscript.Arguments(0)) Then
fso.CreateFolder(wscript.Arguments(0))
End If
set objShell = CreateObject("Shell.Application")
set FilesInZip = objShell.NameSpace(wscript.Arguments(1)).items
objShell.NameSpace(wscript.Arguments(0)).CopyHere(FilesInZip)
set fso = Nothing
set objShell = Nothing
</script></job>
</package>