2016-07-29 3 views
-1

아래의 일괄 처리 하이브리드 스크립트는 상승 된 권한이 필요한 일부 작업을 실행하기 전에 관리자 권한을 자동으로 호출하는 것을 목표로합니다. UAC 프롬프트는 팝업되지만 사용자 선택에 상관없이 관리자 권한은 부여되지 않습니다.Window의 ShellExecute 함수가 WSF 스크립트 인수를 허용 할 수 있습니까?

Window의 ShellExecute 함수가 WSF 인수 나 다른 확장 가능한 매개 변수를 받아 들일 수 있는지 궁금합니다. 이 경우 배치 파일 이름. 가능한 경우 다른 방법을 사용하여 구조 조정없이 스크립트를 변경해야합니다.

<!-- : Begin batch script 
@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
CD /D "%~dp0" & echo "%*" 
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 "%~nx0") 
>nul 2>&1 net file && (echo/ & echo "!errorlevel!") ||^
(echo/ & echo "!errorlevel!" & goto :end) 

:: add your code here 
echo Performing admin tasks 
echo Hello >C:\test.txt 

:end 
timeout 5 
exit /b 

:GetAdminRights 
REM Check for permissions 
>nul 2>&1 net file 
REM If error flag set, user don't have admin permissions 
if '!errorlevel!' NEQ '0' (echo Requesting administrative privileges... 
    set "adm=0" 
    echo/ & echo "!errorlevel!" "%~nx0" "%~dp0" & echo/) 
exit /b 

----- Begin wsf script ---> 
<package> 
    <job id="ADM"><script language="VBScript"> 
     Set UAC = CreateObject("Shell.Application") 
     WScript.Echo wscript.Arguments(0) 
     UAC.ShellExecute "cmd.exe", "/c ""wscript.Arguments(0)"" ADR", "", "runas", 1 
    </script></job> 
</package> 

:: Error in UAC Prompt (shown in details. Can't expand batch name correctly.) 
Program location: "C:\Windows\System32\cmd.exe /c "wscript.Arguments(0)" ADR 
+0

왜 스크립트에 관리자 권한이 필요합니까? –

+0

@Bill_Stewart 필자는 질문을 편집하여 그러한 요구 사항의 예를 제시했습니다. 그러나 필자는 작업을 수행 할 수있는 "가능한"방법을 찾기보다는 ShellExecute 제한 사항을 익히는 데 더 관심이 있습니다. :) – sambul35

+0

관리자 권한이 필요한 이유가 어디 있는지 알 수 없습니다. "사용자 작업을 실행하기 전에"라고 말하면됩니다. 어떤 작업을합니까? (사용자 작업에는 관리자 권한이 필요하지 않습니다.) –

답변

0

예, 가능합니다. 트릭은 관리자 모드에서 Cmd를 다시 시작하는 데 필요한 모든 Cmd.exe 인수를 cscript 호출로 제출하고 배치의 WSF 섹션에서 올바르게 읽는 것입니다.

<!-- : Begin batch script 
@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
CD /D "%~dp0" & echo "%*" 
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 Hello >C:\tst.txt 

:end 
timeout /t 5 >nul 
exit /b 

:GetAdminRights 
REM Check for permissions 
echo/ & >nul 2>&1 net session && (echo Got admin rights)^
|| (echo No admin rights) & echo/ 
REM If error flag set, user don't have admin permissions 
if '!errorlevel!' NEQ '0' (echo Requesting admin rights... 
    set "adm=0" & echo/ & echo "!errorlevel!" "%~nx0" "%~dp0" & echo/) 
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 
     WScript.Echo args 
     UAC.ShellExecute "cmd.exe", args, "", "runas", 1 
    </script></job> 
</package>