batch-file vbscript admin hybrid

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>