2011-05-10 22 views
44

que tienen un pequeño script que realiza el proceso de construir e instalar en Windows para un repositorio Bazaar Estoy gestión. Estoy tratando de ejecutar la secuencia de comandos con privilegios administrativos elevados desde dentro de el shell de Windows (cmd.exe) - como si hubiera hecho clic derecho y elegido Ejecutar como administrador, pero sin usar ningún método eso requiere el uso de la interfaz gráfica.¿Cómo se ejecuta un comando como administrador desde la línea de comandos de Windows?

Respuesta

31

Un híbrido de lotes/WSH es capaz de llamar a ShellExecute para mostrar el diálogo de elevación de UAC ...

@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 
+1

¿Podría, por favor, @Anders, decirme cuáles son los requisitos para que funcione este script? a) Versión de Windows, b) Visual Basic o .NET instalado, c) Java instalado. A simple vista, me parece que no hay más que un Windows corriendo, pero no estoy seguro. Gracias. –

+1

@SopalajodeArrierez: El verbo runas se agregó en Win2000 y se agregó cscript.exe en Win98/IE4 IIRC. – Anders

+0

Gracias, @Anders. Por favor, una pregunta menor: estoy tratando de usar su script con mi propio programa (llamando a un archivo * .lnk * que ejecuta un .exe de shell de Windows), y no puedo configurar mi ** icono ** preferido, como siempre hacer con cualquier archivo .lnk. Esto es: el icono se asigna a .lnk, pero durante la ejecución (después de aceptar el aviso de UAC), la ventana en ejecución tiene el icono * CMD * habitual. ¿Hay una manera de resolver esto? –

2

Examinar para C:\windows\System32 y haga clic derecho en cmd.exe y ejecutar como administrador. Funcionó para mí en Windows 7.

Si está intentando ejecutar un script con privilegios elevados, podría hacer lo mismo para el archivo de script o usar la ejecución del planificador como una opción de usuario diferente para ejecutar el script.

+0

Esto es genial, pero no es algo que pueda hacer desde dentro de la línea de comandos, por ejemplo, desde un script de instalación. La única intervención del usuario que se debería requerir es confirmar la elevación, similar a cuando instala cualquier programa en Windows 6/7. – jpaugh

40

Todo lo que tiene que hacer es utilizar el comando runas a ejecutar el programa como administrador (con una advertencia).

runas /user:Administrator "cmdName parameters" 

En mi caso, esto era

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

Tenga en cuenta que debe utilizar comillas, de lo contrario el comando runas va a engullir la opción de cambiar a cmd.

También tenga en cuenta que la cáscara administrativa (cmd.exe) se pone en marcha en el directorio C: \ Windows \ System32. Esto no es lo que quería, pero fue bastante fácil pasar la ruta actual a mi instalador y hacer referencia a ella usando una ruta absoluta.

La advertencia para usar runas de esta manera es esto: La cuenta administrativa debe estar habilitada, que no es la predeterminada en Windows 7 o Vista. Sin embargo, here es un gran tutorial sobre cómo habilitarlo, de tres maneras diferentes:

Yo mismo le permitió abriendo Herramientas administrativas, Directiva de seguridad local, a continuación, navegar a Directivas locales \ Opciones de seguridad y cambiando el valor de los Cuentas: Estado de la cuenta administrativa directiva en habilitado, que no es ninguna de las tres maneras que se muestran en el enlace.

Una forma aún más fácil:

C:> net user Administrator /active:yes 
+1

¿Hay alguna forma de ejecutar como un usuario diferente (que tiene derechos de administrador) en lugar de como el Administrador? Esto es muy importante para nosotros con las computadoras de trabajo ... – Urchin

+0

Me lo imagino. Pruébalo y mira si funciona. Pero, IDK qué permisos específicos el usuario necesitaría para ejecutar un comando en particular, o para obtener el "estado de administrador" en general. – jpaugh

+1

Esto funciona, pero no es completamente similar a Linux. He notado hipo durante su uso. También al principio hay aproximadamente una pausa de 5 segundos antes de que se ejecute el comando. Úselo a su propia discreción. –

2

que habría creado un acceso directo, ya sea a CMD o para lo que desee ejecutar, a continuación, establezca las propiedades del acceso directo a requerir de administración, y luego ejecutar el acceso directo desde su archivo por lotes No he probado para confirmar que respetará las propiedades, pero creo que es más elegante y no requiere activar la cuenta de administrador.

también si lo hace como una tarea programada (que se puede configurar desde el código) no es una opción para ejecutar la elevó allí.

+1

Bueno, mi objetivo es hacerlo completamente desde la línea de comandos. No puedo esperar que todos los que usan mi instalador sigan este proceso antes de ejecutar mi instalador. – jpaugh

+0

@Kate - En realidad tenía la misma idea que tú y estaba intentando esto hoy en un servidor de win2012, pero desafortunadamente no funciona. El símbolo del sistema aún se ejecuta sin derechos de administrador, incluso si configura el acceso directo como "ejecutar como administrador". Esto es cuando trato de usar el atajo a través del Programador de tareas. El Programador de tareas debe hacer algo bajo las coberturas para evitar que se ejecute como administrador, no estoy seguro. – dcp

43

Pulse el botón de inicio.En la búsqueda de tipo caja "cmd", a continuación, pulse Ctrl + Shift +Introduzca

+0

no es lo que se consultó, pero de todos modos, ¡es bueno saber este atajo! - Gracias – exxecc

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

Para una demostración: "ruta con espacios" auto-elevating.bat arg2 3 4 "otro argumento a largo "

Y esta es otra versión que no requiere la creación de un archivo temporal.

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

La segunda versión es realmente increíble. Mira ese embellecer '' 'cscript" auto-elevating.bat? .wsf "' '' parte. – Rockallite

+1

El texto sin formato '' '.bat''' y XML' '' .wsh''' el contenido de mezcla también es maravilloso. – Rockallite

+0

¿Qué es el SID de 'find '' S-1-16-12288 ''? No aparece cuando uso 'whoami/groups'. – lit

1

simple tubo de truco, ||, con algunas .vbs utilizados en la parte superior de su lote. Saldrá de forma regular y se reiniciará como administrador.

@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 

También del /Q los temp.vbs cuando se hace uso de ella.

+2

¡Esto es perverso! ¿Te importaría explicar esa línea un poco más en profundidad? – jpaugh

2

Aunque el código @amr ali's fue genial, tuve una instancia en la que mi archivo bat contenía >< signos, y se bloqueó en ellos por alguna razón.

yo encontramos este lugar. Simplemente póngalo todo antes de su código, y funciona perfectamente.

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" 
:-------------------------------------- 
Cuestiones relacionadas