Гибридный пакетный и автозапуск VBS от имени администратора

Я получаю странную ошибку «Незавершенная ссылка на объект» в гибридном пакете и VBS, которая вызывает всплывающее диалоговое окно UAC «Запуск от имени администратора» с использованием адаптации этот код, а затем продолжит распаковку файла в папку на системном диске. Гибрид структурирован так же, как предложенный использование-a/38600712#38600712">здесь, и менять его нежелательно.

Безуспешно пытался добавить блоки CDATA VBS. Реструктуризация пакета для замены функции :GetAdminRights тем же разделом внутри нее не помогает. Есть идеи, что здесь не так?

<!-- : 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

person sambul35    schedule 27.07.2016    source источник
comment
Не пишите так Франкенскрипт. Это боль в тылу, чтобы поддерживать и отлаживать. Если возможно, придерживайтесь одного языка, в противном случае пишите разные сценарии и вызывайте один из другого.   -  person Ansgar Wiechers    schedule 28.07.2016
comment
Удивительно, но пакетные гибриды довольно популярный. :)   -  person sambul35    schedule 28.07.2016
comment
Популярность не делает их хорошей идеей. Как бы я ни ценил опыт и знания Дэна в целом, в этом конкретном вопросе я категорически не согласен. Подумайте на минуту о бедном парне, который унаследовал это от вас и столкнулся с решением либо сохранить, либо переписать его.   -  person Ansgar Wiechers    schedule 28.07.2016
comment
Вы можете быть правы с этой точки зрения, но почему это будет сложнее поддерживать по сравнению с двумя сценариями? Требуется одинаковое знание обоих языков сценариев. :) Кроме того, это просто вызов для ТАК веселых.   -  person sambul35    schedule 28.07.2016
comment
Кроме того, это может быть весьма полезно для новичков, которые не собираются их поддерживать.   -  person sambul35    schedule 28.07.2016


Ответы (1)


Этот фиксированный скрипт работает хорошо. Он представляет собой пример гибридного сценария, который может повысить права пользователя до прав администратора на время сеанса Cmd и позволяет запускать другие пользовательские задачи, добавленные как задания VBS. Символов ‹ > следует избегать в пакетных сегментах гибрида, поскольку они указывают на то, что они игнорируются пакетными сегментами 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>  
person sambul35    schedule 01.08.2016