【问题标题】:Can Window's ShellExecute function accept WSF script arguments?Window 的 ShellExecute 函数可以接受 WSF 脚本参数吗?
【发布时间】:2016-07-29 14:52:19
【问题描述】:

下面的批处理混合脚本旨在在运行某些需要提升权限的任务之前自动调用管理员权限。它确实会弹出 UAC 提示,但无论用户选择如何,都不会授予管理员权限。

我想知道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

【问题讨论】:

  • 为什么你的脚本需要管理员权限?
  • @Bill_Stewart 我编辑了这个问题以举例说明这种要求。但是,我更感兴趣的是学习 ShellExecute 的限制,而不是找到“任何”可能的方式来完成任务。 :)
  • 我看不出你在哪里说你为什么需要管理员权限。你只是说“在运行一些用户任务之前”。什么任务? (用户任务不需要管理员权限。)
  • @Bill_Stewart 我编辑了文本。管理任务的示例 IMO 对我的问题不是必不可少的,但我在代码中给出了一个示例,例如将文件保存到 C: 驱动器。现在您能否直接回答有关 ShellExecute 功能限制的问题。 :)
  • 我建议不要使用批处理/WSF,而是使用 PowerShell。

标签: batch-file shellexecute hybrid wsh


【解决方案1】:

是的,可以。诀窍是在 cscript 调用中提交以管理员模式重新启动 Cmd 所需的所有 Cmd.exe 参数,并在批处理的 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>  

【讨论】:

    【解决方案2】:

    这是一个批处理脚本“Elevate.bat”,以管理员身份执行任何传入参数字符串的命令。 如果命令包含特殊字符,请使用 '^' 对其进行转义。 例如:

    Elevate whoami /groups ^| find "S-1-16-12288"`
    

    提升.bat:

        <!-- : --- Self-Elevating Batch Script ---------------------------
        @whoami /groups | find "S-1-16-12288" > nul && goto :admin
        @set "ELEVATE_CMDLINE=cd /d "%cd%" & call "%~f0" %*"
        @cscript //nologo "%~f0?.wsf" //job:Elevate & exit /b
    
        -->
        <job id="Elevate"><script language="VBScript">
          Set objShell = CreateObject("Shell.Application")
          Set objWshShell = WScript.CreateObject("WScript.Shell")
          Set objWshProcessEnv = objWshShell.Environment("PROCESS")
          strCommandLine = Trim(objWshProcessEnv("ELEVATE_CMDLINE"))
          objShell.ShellExecute "cmd", "/c " & strCommandLine, "", "runas"
        </script></job>
        :admin -----------------------------------------------------------
    
        @echo off
        echo Running as elevated user.
        echo Script file : %~f0
        echo Arguments   : %*
        echo Working dir : %cd%
        echo.
        :: administrator commands here
        :: e.g., run shell as admin
        %*
        pause
    

    我用它来创建这样的符号链接:

    Elevate.bat mklink /d common g:\PerforceData\devel\common
    Elevate.bat mklink build.xml g:\PerforceData\devel\build.xml
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2012-03-08
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多