it-swarm.com.de

Wie führen Sie einen Befehl als Administrator über die Windows-Befehlszeile aus?

Ich habe ein kleines Skript, das den Build- und Installationsprozess unter Windows für ein Bazaar -Repository ausführt, das ich verwalte. Ich versuche, das Skript mit erhöhten Administratorrechten von innerhalb der Windows-Shell (cmd.exe) auszuführen - genau so, als hätte ich recht -geklickt und gewählt Als Administrator ausführen , jedoch ohne eine Methode zu verwenden, die die Verwendung der grafischen Oberfläche erfordert.

55
jpaugh

Ein Batch/WSH-Hybrid kann ShellExecute aufrufen, um den UAC-Erhöhungsdialog anzuzeigen ...

@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
    cscript //E:JScript //nologo "%~f0"
    @goto :EOF
)
echo.Performing admin tasks...
REM call foo.exe
@goto :EOF
@end @ELSE
ShA=new ActiveXObject("Shell.Application")
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+"\"","","runas",5);
@end
38
Anders

Drücken Sie die Starttaste. Geben Sie im Suchfeld "cmd" ein und drücken Sie dann Ctrl+Shift+Enter

57
slashdottir

Sie müssen lediglich den Befehl runas verwenden, um Ihr Programm als Administrator auszuführen (mit einer Einschränkung).

runas /user:Administrator "cmdName parameters"

In meinem Fall war dies

runas /user:Administator "cmd.exe /C %CD%\installer.cmd %CD%"

Beachten Sie, dass Sie Anführungszeichen verwenden müssen, da sonst der Befehl runas die Option switch auf cmd verschlingt.

Beachten Sie außerdem, dass die Verwaltungsshell (cmd.exe) im Ordner C:\Windows\System32 gestartet wird. Dies ist nicht das, was ich wollte, aber es war einfach genug, den aktuellen Pfad an meinen Installer zu übergeben und ihn unter Verwendung eines absoluten Pfads zu referenzieren.

Vorsichtsmaßnahme: Aktivieren Sie das Administratorkonto

Wenn Sie Runas auf diese Weise verwenden, muss das Administratorkonto aktiviert sein. Dies ist unter Windows 7 oder Vista nicht die Standardeinstellung. Allerdings ist hier ein großartiges Tutorial, wie man es auf drei verschiedene Arten aktiviert:

Ich selbst habe es dann durch Öffnen von Verwaltungstools , Lokale Sicherheitsrichtlinie aktiviert Navigieren Sie zu Lokale Richtlinien\Sicherheitsoptionen , und ändern Sie den Wert der Konten : Status des Administratorkontos Richtlinie auf Aktiviert, dies ist keine der drei im Link gezeigten Möglichkeiten.

Noch einfacher:

C:> Net User Administrator /active:yes
56
jpaugh
:: ------- Self-elevating.bat --------------------------------------
@whoami /groups | find "S-1-16-12288" > nul && goto :admin
set "ELEVATE_CMDLINE=cd /d "%~dp0" & call "%~f0" %*"
findstr "^:::" "%~sf0">temp.vbs
cscript //nologo temp.vbs & del temp.vbs & exit /b

::: 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"
: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
cmd /k

Für eine Demo: self-elevating.bat "Pfad mit Leerzeichen" arg2 3 4 "ein weiteres langes Argument"

Und dies ist eine andere Version, für die keine temporäre Datei erstellt werden muss.

<!-- : --- Self-Elevating Batch Script ---------------------------
@whoami /groups | find "S-1-16-12288" > nul && goto :admin
set "ELEVATE_CMDLINE=cd /d "%~dp0" & 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
cmd /k
10
Amr Ali

Ich würde eine Verknüpfung einrichten, entweder zu CMD oder zu dem, was Sie ausführen möchten, und dann die Eigenschaften der Verknüpfung so festlegen, dass Administrator erforderlich ist, und dann die Verknüpfung aus Ihrer Batchdatei ausführen. Ich habe nicht getestet, um zu bestätigen, dass die Eigenschaften berücksichtigt werden, aber ich denke, es ist eleganter und erfordert keine Aktivierung des Administratorkontos.

Auch wenn Sie es als geplante Aufgabe ausführen (die über Code eingerichtet werden kann), besteht die Möglichkeit, sie dort mit erhöhten Rechten auszuführen.

2
Kate Gregory

Einfacher Pfeifentrick, ||, wobei einige .vbs oben in Ihrem Stapel verwendet werden. Es wird normal beendet und als Administrator neu gestartet.

@AT>NUL||echo set Shell=CreateObject("Shell.Application"):Shell.ShellExecute "%~dpnx0",,"%CD%", "runas", 1:set Shell=nothing>%~n0.vbs&start %~n0.vbs /realtime& timeout 1 /NOBREAK>nul& del /Q %~n0.vbs&cls&exit

Es ist auch del /Q die temp.vbs, wenn es damit fertig ist.

2
strance

Obwohl @ amr ALi's Code großartig war, hatte ich eine Instanz, in der meine Fledermausdatei >< - Zeichen enthielt und sie aus irgendeinem Grund verschluckte.

Ich habe das stattdessen gefunden. Stellen Sie einfach alles vor Ihren Code, und es funktioniert perfekt.

REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /B
:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
2
Kapanther

Suchen Sie nach C:\windows\System32 und rechtsklick auf cmd.exe und als Administrator ausführen. Arbeitete für mich unter Windows 7.

Wenn Sie versuchen, ein Skript mit erhöhten Rechten auszuführen, können Sie dasselbe für die Skriptdatei tun oder die Ausführung des Schedulers als andere Benutzeroption verwenden, um das Skript auszuführen.

0
Rasika