2016-07-29 29 views
-1

Das nachfolgende Stapelhybrid-Skript zielt darauf ab, Administratorrechte automatisch aufzurufen, bevor bestimmte Aufgaben ausgeführt werden, für die erhöhte Rechte erforderlich sind. Es öffnet die UAC-Eingabeaufforderung, aber unabhängig von der Benutzerauswahl werden keine Administratorrechte gewährt.Kann die ShellExecute-Funktion von Can Window WSF-Skriptargumente akzeptieren?

Ich frage mich, ob ShellExecute Funktion darin verwendeten die Fenster können WSF Argumente oder andere dehnbare Parameter akzeptieren? In diesem Fall ist es der Batch-Dateiname. Wenn es möglich ist, wie sollte das Skript dafür geändert werden, ohne eine andere Methode zu verwenden?

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

Warum benötigt Ihr Skript Administratorrechte? –

+0

@Bill_Stewart Ich habe die Frage bearbeitet, um ein Beispiel für eine solche Anforderung zu geben. Ich bin jedoch mehr daran interessiert, ShellExecute-Einschränkungen zu lernen, als "irgendeinen" möglichen Weg zu finden, um die Aufgabe zu erfüllen. :) – sambul35

+0

Ich sehe nicht, wo Sie sagen, warum Sie Administratorrechte benötigen. Sie sagen nur "vor dem Ausführen einiger Benutzeraufgaben". Welche Aufgaben? (Benutzeraufgaben sollten keine Administratorrechte erfordern.) –

Antwort

0

Ja, kann es. Der Trick besteht darin, im cscript-Aufruf alle Cmd.exe-Argumente einzureichen, die erforderlich sind, um Cmd im Administratormodus neu zu starten, und sie im WSF-Abschnitt des Stapels ordnungsgemäß zu lesen.

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