¿Cómo puedo auto-eleve mi archivo de proceso por lotes, de manera que las solicitudes de UAC derechos de administrador si es necesario?

Quiero que mi archivo por lotes para ejecutar únicamente elevados. Si no es elevado, proporcionan una opción para el usuario de relanzar el lote como elevada.

Estoy escribiendo un archivo por lotes para establecer una variable del sistema, copiar los dos archivos a un Archivos de Programa la ubicación y el inicio de un instalador del controlador. Si un Windows 7/Windows Vista de usuario (UAC habilitado e incluso si son de administración local) se ejecuta sin el botón derecho y seleccionando «Ejecutar como Administrador», que tendrá ‘Acceso Denegado’ copiar los dos archivos y la escritura de la variable de sistema.

Me gustaría usar un comando para reiniciar automáticamente el lote elevada como si el usuario es un administrador. De lo contrario, si no es un administrador, quiero decir que ellos necesitan privilegios de administrador para ejecutar el archivo por lotes. Estoy usando xcopy para copiar los archivos y REG ADD a escribir la variable de sistema. Estoy usando los comandos para lidiar con Windows máquinas con XP. He encontrado preguntas similares sobre este tema, pero nada de lo que se ocupa el relanzamiento de un archivo por lotes como elevada.

  • Echa un vistazo a lo que he publicado, no hay necesidad de ninguna herramienta externa, el script comprueba automáticamente los derechos de administrador y se eleva automáticamente a sí mismo si es necesario.
  • Por favor, considere si Matt respuesta sería la marcada uno? Parece así que para mí.
  • posibles duplicados de Cómo solicitar acceso de Administrador en el interior de un lote de archivos
  • Por favor considere el nuevo Windows 10 sugerencias en la sección de comentarios de la secuencia de comandos por lotes que he publicado.
  • Desde cmd: @powershell Start-Process cmd -Verb runas. Desde Powershell acaba de soltar @powershell. Esto inicia cmd con privilegios elevados.
  • O probar windows puro forma, el uso de schtasks: stackoverflow.com/questions/19098101/…

InformationsquelleAutor PDixon724 | 2011-08-12

10 Kommentare

  1. 19

    Usted puede tener la secuencia de comandos se llama a sí mismo con psexec‘s -h opción para ejecutar elevados.

    No estoy seguro de cómo se podría detectar si ya está en ejecución como la elevación o no… tal vez lo vuelva a intentar con elevados permanentes sólo si hay un error de Acceso Denegado?

    O, simplemente puede tener los comandos para el xcopy y reg.exe siempre se puede ejecutar con psexec -h, pero sería molesto para el usuario final si se necesita introducir su contraseña cada vez (o insegura de si incluye la contraseña en el script)…

    • Gracias por la respuesta. Por desgracia, creo que no puedo usar cualquier cosa fuera de stock Windows Vista/7 herramientas porque esto se va a clientes fuera de mi oficina. No creo que legalmente se puede distribuir PSExec.
    • Sí, creo que tienes razón acerca de que-a pesar de que PSExec es ahora una herramienta de Microsoft (ya que compró el Sysinternals chicos!) el EULA prohíbe la distribución 🙁
    • Creo que mis opciones son bastante limitadas. Si supiera cómo el código en VB, yo podría hacer un exe con un admin de manifiesto, pero yo ni siquiera sé por dónde empezar. Creo que voy a advertir al comienzo de los lotes para que se ejecute como admin si está ejecutando Windows Vista/7. Gracias a todos.
    • Otra herramienta de 3 ª parte que puede ser redistribuido libremente y fáciles de integrar y aprender es AutoIt; esta página, demuestra cómo la secuencia de comandos de solicitudes privilegios elevados.
    • Gracias ewall. Parece que puede redistribuir AutoIt. Voy a ir por ese camino. Gracias de nuevo por la ayuda!
    • psexec -h no funciona: ‘no se Podía instalar PSEXESVC servicio: Acceso denegado.’. Usted necesita tener los derechos de administrador para ejecutar psexec.

  2. 302

    Hay una manera fácil sin la necesidad de utilizar una herramienta externa – funciona muy bien con Windows 7, 8, 8.1 y 10 y es compatible hacia atrás demasiado (Windows XP no tiene ningún UAC, por lo tanto la elevación no es necesario – en ese caso, el script solo procede).

    Echa un vistazo a este código (me inspiré en el código NIronwolf publicado en el hilo Archivo por Lotes – «Acceso Denegado» En Windows 7?), pero he mejorado en mi versión no hay ningún directorio creado y eliminado a la comprobación de privilegios de administrador):

    ::::::::::::::::::::::::::::::::::::::::::::
    :: Elevate.cmd - Version 4
    :: Automatically check & get admin rights
    :: see "https://stackoverflow.com/a/12264592/1016343" for description
    ::::::::::::::::::::::::::::::::::::::::::::
     @echo off
     CLS
     ECHO.
     ECHO =============================
     ECHO Running Admin shell
     ECHO =============================
    
    :init
     setlocal DisableDelayedExpansion
     set cmdInvoke=1
     set winSysFolder=System32
     set "batchPath=%~0"
     for %%k in (%0) do set batchName=%%~nk
     set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
     setlocal EnableDelayedExpansion
    
    :checkPrivileges
      NET FILE 1>NUL 2>NUL
      if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
    
    :getPrivileges
      if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
      ECHO.
      ECHO **************************************
      ECHO Invoking UAC for Privilege Escalation
      ECHO **************************************
    
      ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
      ECHO args = "ELEV " >> "%vbsGetPrivileges%"
      ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
      ECHO args = args ^& strArg ^& " "  >> "%vbsGetPrivileges%"
      ECHO Next >> "%vbsGetPrivileges%"
    
      if '%cmdInvoke%'=='1' goto InvokeCmd 
    
      ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
      goto ExecElevation
    
    :InvokeCmd
      ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
      ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
    
    :ExecElevation
     "%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
     exit /B
    
    :gotPrivileges
     setlocal & cd /d %~dp0
     if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)
    
     ::::::::::::::::::::::::::::
     ::START
     ::::::::::::::::::::::::::::
     REM Run shell as admin (example) - put here code as you like
     ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
     cmd /k

    La secuencia de comandos toma ventaja del hecho de que NET FILE requiere privilegios de administrador y devuelve errorlevel 1 si usted no lo tiene. La elevación se logra mediante la creación de una secuencia de comandos que se re-inicia el archivo de proceso por lotes para obtener privilegios. Esto hace que Windows se presente el cuadro de diálogo de UAC y le pide la cuenta de administrador y la contraseña.

    Lo he probado con Windows 7, 8, 8.1, 10 y con Windows XP funciona bien para todos.
    La ventaja es que, después de que el punto de inicio puede colocar cualquier cosa que requiere privilegios de administrador del sistema, por ejemplo, si usted tiene la intención de volver a instalar y volver a ejecutar un servicio de Windows para propósitos de depuración (que se supone que mypackage.msi es un servicio de paquete de instalación):

    msiexec /passive /x mypackage.msi
    msiexec /passive /i mypackage.msi
    net start myservice

    Sin este privilegio elevación de secuencia de comandos, UAC pido que tres veces por su administrador de usuario y contraseña, y ahora se le pide sólo una vez al principio, y sólo si es necesario.


    Si la secuencia de comandos sólo se debe mostrar un mensaje de error y la salida si no hay privilegios de administrador en lugar de auto-elevación, esto es aún más simple: Usted puede lograr esto mediante la adición de la siguiente al principio del script:

    @ECHO OFF & CLS & ECHO.
    NET FILE 1>NUL 2>NUL & IF ERRORLEVEL 1 (ECHO You must right-click and select &
      ECHO "RUN AS ADMINISTRATOR"  to run this batch. Exiting... & ECHO. &
      PAUSE & EXIT /D)
    REM ... proceed here with admin rights ...

    De esta manera, el usuario tiene que hacer clic derecho y seleccionar «Ejecutar como administrador». El script va a continuar después de la REM declaración si detecta un uso de derechos de administrador, de lo contrario la salida de un error. Si no requiere el PAUSE, quite la.
    Importante: NET FILE [...] EXIT /D) debe estar en la misma línea. Se muestra aquí en varias líneas para una mejor legibilidad!


    En algunas máquinas, me he encontrado con problemas, que se resuelven en la nueva versión anterior ya. Fue debido a diferentes comilla doble manipulación, y el otro problema era debido al hecho de que la UAC fue deshabilitado (nivel más bajo) en un Windows 7 de la máquina, por lo tanto la secuencia de comandos se llama a sí misma una y otra vez.

    Me he fijado esta ahora quitando las comillas en el camino y volver a agregar más tarde, y he añadido un parámetro adicional que se agrega cuando el script se re-inicia con la elevación de los derechos.

    De quitar las comillas dobles por los siguientes (los detalles se encuentran aquí):

    setlocal DisableDelayedExpansion
    set "batchPath=%~0"
    setlocal EnableDelayedExpansion

    A continuación puede acceder a la ruta de acceso mediante !batchPath!. No contiene comillas dobles, por lo que es seguro decir "!batchPath!" más adelante en la secuencia de comandos.

    La línea

    if '%1'=='ELEV' (shift & goto gotPrivileges)

    comprueba si el guión ya ha sido llamado por el VBScript secuencia de comandos para elevar los derechos, por lo tanto evitando infinitas repeticiones. Se elimina el parámetro mediante shift.


    Actualización:

    • Para evitar que tengan que registrarse en la .vbs extensión en Windows 10, he sustituido la línea

      "%temp%\OEgetPrivileges.vbs"

      "%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"

      en la secuencia de comandos anterior; también se agrega cd /d %~dp0 como sugerido por Stephen (aparte de respuesta) y por Tomáš Zato (comentario) para establecer la secuencia de comandos de directorio como predeterminado.

    • Ahora, el script honores parámetros de línea de comandos se ha pasado. Gracias a jxmallet, TanisDLJ y Peter Mortensen para las observaciones y de las inspiraciones.

    • Según Artjom B. la sugerencia, he analizado y han sustituido a los SHIFT por SHIFT /1, que conserva el nombre de archivo para el %0 parámetro

    • Añadido del "%temp%\OEgetPrivileges_%batchName%.vbs" a la :gotPrivileges sección para limpiar (como mlt sugerido). Añadido %batchName% para evitar el impacto, si usted ejecutar diferentes lotes en paralelo. Tenga en cuenta que usted necesita para utilizar for a ser capaz de tomar ventaja de las avanzadas funciones de cadena, tales como %%~nk, que extrae solo el nombre de archivo.

    • Optimizado de la estructura de guiones, mejoras (añade la variable vbsGetPrivileges que ahora se hace referencia a todas partes, lo que permite cambiar la ruta de acceso o nombre de el archivo fácilmente, sólo eliminar .vbs archivo si por lotes necesarios para ser elevado)

    • En algunos casos, una llamada diferente de la sintaxis se requiere para la elevación. Si el script no funciona, compruebe los siguientes parámetros:

      set cmdInvoke=0

      set winSysFolder=System32

      Cambiar el 1er parámetro para set cmdInvoke=1 y comprobar si ya se soluciona el problema. Se añade cmd.exe a la secuencia de comandos de la realización de la elevación.

      O intentar cambiar el 2do parámetro para winSysFolder=Sysnative, esto podría ayudar (pero en la mayoría de los casos no se requiere) en sistemas de 64 bits. (ADBailey ha informado de este). «Sysnative» sólo es necesario para el lanzamiento de aplicaciones de 64 bits de 32-bits de host de secuencias de comandos (por ejemplo, una compilación de Visual Studio proceso o secuencia de comandos de la invocación desde otra aplicación de 32 bits).

    • Para hacerla más clara de cómo los parámetros son interpretados, estoy mostrando ahora como P1=value1 P2=value2 ... P9=value9. Esto es especialmente útil si usted necesita para incluir parámetros como rutas de acceso entre comillas dobles, por ejemplo,"C:\Program Files".

    Enlaces útiles:

    • Gran respuesta, aunque lo que me sorprende es ligeramente que usted tiene que hacer todo eso para hacer algo que es claramente necesario en algunos casos.
    • De hecho, un comando como ELEVAR es claramente falta en el por lotes de Windows idioma.
    • Tal vez es más fácil con powershell que parece ser el aprobado de secuencias de comandos lanaguge para cosas más complejas, pero nunca me molesté en aprender tan lejos 🙁
    • La sintaxis de powershell es completamente diferente (verbo-sustantivo de la sintaxis), pero le permite a la llamada .NET asambleas fácilmente. Pero es un poco más difícil de manejar (firma de los scripts, etc).
    • Sería trabajar en Windows Server 2012 ?
    • Yo no lo he probado con Windows Server 2012 explícitamente, pero funciona con Windows 7 y 8, por lo que tienden a decir que sí. Sin embargo, para estar seguro de que usted debe probarlo antes de usarlo. Pero en un Servidor, que normalmente se ejecutan secuencias de comandos sin la interacción del usuario y por lo tanto se podría programar para que se ejecute con adecuado nivel de derechos de usuario y no necesitan/quieren UAC confirmación porque iba a detener la ejecución de la tarea programada hasta que un administrador tipos en las credenciales de usuario.
    • Mi powershell método: stackoverflow.com/a/25756858/821878 No es tan bonito como un «ELEVAR» el comando, pero no se necesita un temporal *.vbs.
    • Esto vale para todas las soluciones propuestas aquí: no funciona cuando la secuencia de comandos tiene espacios en su nombre y llamarlo desde el símbolo del sistema
    • No me pregunta por qué te gustaría tener espacios en el nombre – trate de usar el guión bajo (_) en lugar de espacios o utilizar comillas dobles ( «» ) alrededor de ruta+nombre del archivo por lotes.
    • Ya he cambiado el nombre de la (el legado) archivo bat, pero gracias por la info de todos modos
    • Es posible que desee agregar cd %~dp0 antes de que su propio código. De lo contrario, vas a encontrar que su directorio de trabajo es algo así como C:\Windows\System32. Imagina que tu script accidentalmente cambia algo hay
    • Zato: Sí, eso es correcto. Tenga en cuenta que Esteban ya ha sugirió. Tome una mirada en el fragmento de código que él ha provisto.
    • Esto no parece funcionar con Windows 10. Lo hizo bien su trabajo dentro de 7 y 8/8.1, pero no 10. Parece colgar en algún lugar después de la línea 9.
    • He verificado. Funciona con WIndows 10 así, pero probablemente no se dio cuenta de que Windows diálogo que aparece, por primera vez, diciendo: «¿Cómo abrir este archivo?» – seleccione «Basado en Microsoft Windows Script Host», tickmark «Siempre uso esta Aplicación para abrir .vbs archivos» y haga clic en ACEPTAR. La próxima vez (y cada vez subsiguiente) el lote funciona bien como lo hizo en Win7/8.
    • El diálogo se mencionó antes, hace lo mismo como si a usted le escriba ftype VBSFile="%SystemRoot%\System32\WScript.exe" "%1" %* y, a continuación, assoc .vbs=VBSFile en una consola del administrador de la ventana. Se registra el .vbs extensión que se ejecute con Windows Script Host – al parecer Windows 10 no tiene esta asociación ya por defecto, de modo que usted tiene que hacerlo una vez.
    • Otra forma de Windows 10 usuarios – si usted no desea cambiar el valor predeterminado de registro de .vbs extensiones como se mencionó anteriormente, usted puede reemplazar la línea "%temp%\OEgetPrivileges.vbs" en el guión de "%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs", que también funcionó muy bien para mí.
    • El .vbs extensión tiene su asociación correcta. Wow, esto es extraño. Me pulsar la tecla de retorno después de la novena línea se imprime y funcionó muy bien. Me pregunto lo que me dijo «sí» a? Quizás no tenía WSH después de todo
    • ¿Has probado la versión actualizada de la secuencia de comandos me ofreció ayer? Se debe ejecutar sin importar la .vbs extensión de registro.
    • Acaba de agregar el código modificado, funciona muy bien!
    • Hola! Me estoy poniendo en el cuadro de diálogo «Este archivo no tiene un programa asociado para realizar esta acción» que viene de la línea donde OEgetPrivileges.vbs es ejecutado. No he modificado el script. El vbs es creado y es ejecutado a través de WScript. Alguna idea? El Uso De Windows 7.
    • Yo sólo he probado la actualización de la secuencia de comandos con Windows 7/64 poco, y en mi PC funciona bien. Compruebe si %SystemRoot%\System32\WScript.exe de su equipo instalado, a continuación, comprobar mis consejos que me dio antes a VitaminYes (en relación con el registro a través de ftype y assoc). Tal vez usted tiene que instalar/activar Windows Scripting Host, que sería inusual porque se sale de la caja en Windows 7 normalmente.
    • He encontrado que el mensaje no es de ejecución de vb script, pero desde que se ejecuta el archivo por lotes a través de la UAC desde dentro del script vbs. Se trata de la línea: UAC.ShellExecute "C:\Users\Me\Documents\script.bat", "ELEV", "", "runas", 1. También tengo alguna extraña Windows al parecer, porque NET FILE no da una excepción(sí, lo he comprobado yo no soy admin. He tenido que modificar la verificación para utilizar el comando mkdir prohibidos directorio en su lugar.
    • El script necesita ser guardado como .cmd, por ejemplo,elevate.cmd. También puede ser que la instalación de Windows tiene problemas y necesita una actualización (nueva instalación) – he probado el lote en varios PCs y no se encontraron errores como usted la describe. Intenta con un colega del PC para saber. No puedo dar soporte en la instalación de Windows.
    • Matt: el problema fue con La directiva de grupo(o lo que sea, yo no soy un experto en windows) en la compañía de la máquina. Se ejecuta en windows limpia obras.
    • Gracias por dejarme saber. Sí, es posible que algunas funciones están bloqueadas a través de las políticas de una empresa PC. Un PC limpio o instalación VM es siempre una buena idea para la comparación. @NeplatnyUdaj
    • Puede comprobar si hay algo de verdad detrás de este rechazó editar en su respuesta?
    • B.: Sí, había un problema, pero un poco diferente. No quitar la SHIFT es la solución, pero añadiendo un /1 parámetro para la SHIFT de comandos (consulte la lista actualizada). Debería funcionar bien ahora. Gracias por traer a mi atención!
    • Es allí una manera de limpiar %TEMP% y eliminar OEgetPrivileges.vbs a la terminación?
    • Pensé acerca de eso también, hay varios problemas: Uno es que el archivo está bloqueado hasta que se termina el lote, la otra es que si se inicia un segundo admin lote va a interferir a menos que se crea un único nombre temporal. Sí es posible, pero complica las cosas. @mlt
    • Pues ya lo tenemos privilegios de administrador en algún momento, tal vez, es posible que vale la pena considerar la adición de un registro de RunOnce entrada en HKCU colmena para eliminar la secuencia de comandos en el siguiente inicio de sesión.
    • He añadido una limpieza de la secuencia de comandos, era más fácil de lo esperado. Gracias por la sugerencia!
    • es allí una manera de no tener una ventana de símbolo del sistema para pedir UAC continuar o cancelar? Plan para ejecutar esta en uDeploy o cáscara que se necesita para ejecutar de forma automática sin ningún tipo de sistema y la interacción requisito.
    • Sí – este «símbolo del sistema» viene de Windows directamente. En el panel de control de Windows, escriba «UAC» en el campo de búsqueda y presione entrar. A continuación, abra «Cambio de Control de Cuentas de Usuario configuración» haciendo doble clic sobre él y confirmando con una cuenta de administrador. Abre un cuadro de diálogo donde usted puede arrastrar el control deslizante a «no notificarme Nunca». Confirmar con «OK», reinicie su PC y el diálogo debería desaparecer si usted ha iniciado sesión con una privilegiada (admin) de la cuenta. Pero la nota no se recomienda esta configuración, ya que disminuye la seguridad.
    • Hey, gracias por los scripts, funciona muy bien si puedo ejecutar un archivo bat(digamos A. bat), con los códigos. Pero cuando trato de incluir A. bat en B. bat y ejecutar B. bat, luego de la UAC solicitará pero aún no lo consigues derecho de administración en este caso. Estoy usando la llamada «de A. bat» para incluir las secuencias de comandos.
    • De administración de los derechos sólo existen en el contexto de la elevación de la secuencia de comandos. Si entiendo bien, usted necesita los derechos de admin en B.bat, pero desea usar A.bat sólo para elevar B.bat. Si ese es el caso, llame a B.bat después de la ::Start sección de A.bat (es decir, hacerlo de la manera opuesta).
    • Gracias por los comentarios. Sí, necesito el derecho de administrador en el B. bat y quiero que el usuario haga doble clic para ejecutar B. bat en primera. En B. bat, que incluye la A. bat que tiene sus códigos. Aquí están mis códigos en B. bat: <code>llamada A. bat::, a continuación, llamar a mis códigos personalizados</código de> por Lo tanto, como A. bat es una biblioteca y quiero B. bat parece simple. Pero esto no funciona para mí.
    • En este caso, la única manera que veo es incluir la elevación de la secuencia de comandos en el B. bat, y el código que ha escrito debe ser anexado. O usted puede colocar la elevación en el B. bat y llame a la biblioteca y su código de allí con dos llamadas, es decir, de la llamada A. bat y C. bat (sólo el simple código) de B. bat.
    • Gracias Matt! Tal vez es como usted dijo, sale solo, dentro de un contexto de elevación de la secuencia de comandos. Puedo imaginar otra solución para esto. Gracias de nuevo.
    • Si el parámetro contiene espacios, se pone dividido entre variables, por lo que f.e. «te st» será únicamente accesible por %1 y %2. Cualquier idea sobre cómo resolver esto?
    • no importa, yo solía stackoverflow.com/a/30590134/3706972 que es el trabajo con los espacios en los parámetros.
    • Según mis pruebas, las comillas dobles se pasa a través de, es decir, si se especifica Elevate.cmd "1st param" "2nd param" "3rd param" se pasan de esta manera durante la elevación como %1%3. Si se omiten las comillas dobles, que luego son interpretadas como 1st param 2nd param 3rd param, que es %1%6 lugar.
    • Gracias por esto! Tuve alguna dificultad en el uso de ella para iniciar una aplicación de 64 bits desde un host de 32 bits (parte de una secuencia de comandos de compilación; Windows se redirija a «Archivos de Programa» a «Archivos de Programa (x86)»). Para resolver, he sustituido %SystemRoot%\System32\WScript.exe con %SystemRoot%\Sysnative\WScript.exe para forzar el uso de 64 bits WScript.
    • Eres bienvenido. Sin embargo, me preguntaba acerca de «Sysnative» – en mi 64 bits de Windows no es sólo C:\Windows\System32 y C:\Windows\SysWow64, pero no C:\Windows\Sysnative. En ambas rutas de acceso usted puede encontrar Wscript.exe.
    • Ah, SysNative no es un «real» del directorio, sólo un rasgo de la Sistema de Archivos Redirector que Windows utiliza para aplicaciones de 32 bits en Windows de 64 bits. En tales casos, las solicitudes para c:\Windows\System32 son redirigidos a c:\Windows\SysWow64, mientras que solicitar c:\Windows\Sysnative es una manera de decir «sí, soy una aplicación de 32 bits que es consciente de que el sistema operativo de 64 bits y realmente quiero el correcto System32». Usted puede probar esto mediante la ejecución de c:\Windows\SysWow64\cmd.exe (32-bit) y el listado de los directorios.
    • P. S. un intercambio directo para Sysnative es sólo bueno, si su (Elevar.cmd) de secuencia de comandos se ejecuta siempre en un host de 32 bits: en un host de 64 bits, Sysnative no será encontrado. Si usted quiere que sea flexible a cualquiera (como yo terminé haciendo), es necesario añadir un rápido «si existe» la condición para cambiar entre Sysnative y System32. Es un nicho de problema y, probablemente, demasiado exigente para editar tu respuesta, pero me imaginé que la información sería útil si alguien más lo tuvieron en cuenta.
    • Gracias por la explicación, muy útil! Creo que la forma más práctica es guardar una versión de 64 bits de elevar la secuencia de comandos, como Elevate64.cmd para 64 bits, y Elevate.cmd para 32 bits. La razón es que un script de este tipo tendría más dependencias de 64 bits de código y muchas, SI fuera a complicar las cosas …
    • Me han proporcionado una nueva versión de la secuencia de comandos, que incluye un parámetro para System32 … esto debería hacer la vida más fácil para usted. También, me di cuenta de que en algunos sistemas de 2º cambio era necesario, consulte la Actualizaciones de la sección en la respuesta.
    • Gran trabajo. Yo, personalmente, terminó alejándose de su guión un poco en el final para satisfacer mis necesidades y hacer, en mi caso, realmente necesita una secuencia de comandos que puede elevar a una nueva aplicación de 64 bits cuando se ejecuta desde la línea de 32-bits o 64-bits de host, pero estoy seguro de que el extra de flexibilidad, ayudar a otras personas. No hay obligación, pero su respuesta daría más claridad si se indica explícitamente que «Sysnative» es sólo para el lanzamiento de aplicaciones de 64 bits de 32-bits de host de secuencias de comandos (por ejemplo, una compilación de Visual Studio proceso o secuencia de comandos de la invocación desde otra aplicación de 32 bits).
    • Gracias, he añadido una explicación a la respuesta.
    • El Elevate.cmd script termina con cmd /k. ¿De esta forma se crea un nuevo proceso de shell y permanecer allí?
    • Sí, ese es el propósito – para mostrar la consola de administración después de la elevación (para la demostración). Si usted no necesita una consola de administración (debido a que usted sólo desea ejecutar el script elevado) quitar cmd /k.
    • ¿Cuál es el propósito de pushd . no se ve muy útil, sin un correspondiente popd. También tiene la cd /D a bordo, tal y como yo entiendo la explicación aquí: Pushd – cambiar el directorio/carpeta | Windows CMD | SS64.com …y mis observaciones personales
    • establece el directorio actual al directorio de secuencia de comandos. El /d parámetro es necesario para asegurarse de que la unidad también se cambia si es necesario, no sólo la ruta de acceso. El comando pushd ., posiblemente, puede ser eliminado, lo que era desde el principio del desarrollo. Si usted (o alguien que ya eliminado y probado puede confirmar, me lo puede quitar.
    • Sí, ya sé que el /d opción para cd, pero desde que estoy usando una combinación de pushd (que implícitamente se hace cd /d — que es, de hecho, el propósito del parámetro) y popd, no necesito el extra cd /d. En tu caso, te sugiero que acaba de quitar el sentido & pushd .
    • Gracias por la sugerencia, he optimizado el script y se retira el pushd.
    • Eres bienvenido, pero… ¿Cómo fue exactamente lo que usted «optimizar» un 0 en un 1? – Estoy un poco confundido. (Por CIERTO: hubo también un error de la izquierda de mi última edición que me fijo ahora.)
    • A la derecha 🙂 , que no tiene nada que ver con eso. Leer los comentarios en mi respuesta (sobre «sintaxis de llamada»), no me han explicado el parámetro. Funciona mejor en mis máquinas con el 1, así que he cambiado el parámetro así. Algunos podrían utilizar el 0 en su PC en función de su entorno empresarial.
    • Veo, gracias por la explicación más detallada.
    • ¿Por qué es «exit /B» se requiere? Si me ejecuta el lote desde el símbolo del sistema, parece que no siga «:gotPrivileges» hasta que me REM esa línea. Cuando se inicia el lote desde el explorador por simple doble clic, funciona bien con el «exit /B» habilitado.
    • Para obtener privilegios elevados, la secuencia de comandos por lotes necesita invocar a sí mismo (una subrutina no sería suficiente para que el UAC para ser activados). El comando Exit /b se asegura de que sólo los llamados instancia sale correctamente después de que el mecanismo de elevación se invoca.

  3. 32

    Como jcoder y Matt se mencionó, PowerShell hecho que sea fácil, y que incluso podría ser incorporado en la secuencia de comandos por lotes sin crear un nuevo script.

    He modificado Matt guión:

    :checkPrivileges 
    NET FILE 1>NUL 2>NUL
    if '%errorlevel%' == '0' ( goto gotPrivileges 
    ) else ( powershell "saps -filepath %0 -verb runas" >nul 2>&1)
    exit /b 
    

    No hay ninguna necesidad de que el :getPrivileges etiqueta.

    • Tienes razón, si PowerShell está instalado, usted puede utilizar para ejecutar el archivo por lotes con la elevación (gracias por el fragmento de código!). Y sí, la etiqueta no es necesario. Gracias por los consejos, vale la pena un +1 … 🙂
    • Cuando se invoca desde cmd Powershell.exe no tiene verbo-runas opción. También existe, si usted ya está en PowerShell.
    • Me gusta mucho esta solución, funciona muy bien para mí. En Windows 8.1 me hizo requieren el :gotPrivileges etiqueta para que funcione.
    • Me estoy pegando un problema si este archivo de proceso por lotes es remoto en una ruta de acceso UNC.
  4. 27

    Estoy usando Matt excelente respuesta, pero yo veo una diferencia entre mi Windows 7 y Windows 8 sistemas cuando se ejecuta elevado de secuencias de comandos.

    Una vez que el script es elevado en Windows 8, el directorio actual se establece en C:\Windows\system32. Afortunadamente, hay una solución fácil por cambiar el directorio a la ruta de acceso de la secuencia de comandos actual:

    cd /d %~dp0
    

    Nota: el Uso de cd /d para asegurarse de letra de unidad es también cambió.

    Para probar esto, usted puede copiar el siguiente script. Se ejecuta normalmente en la versión para ver el resultado de la misma. Ejecutar como Admin y ver la diferencia en Windows 8:

    @echo off
    echo Current path is %cd%
    echo Changing directory to the path of the current script
    cd %~dp0
    echo Current path is %cd%
    pause
    
    • Buena sugerencia, Stephen. De manera que el script debe terminar con cd %~dp0 para conservar su ruta de acceso actual (supongo que esto funciona en Win7, por lo que el mismo comando se puede utilizar, aunque sólo sea necesario para Win8+). +1 para esto!
    • De esta nota se requiere también en mi sistema que ejecuta Windows 7.
    • o uso pushd %~dp0 lugar… ¿por qué? porque popd
  5. 24

    Yo lo hago de esta manera:

    NET SESSION
    IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE
    GOTO ADMINTASKS
    
    :ELEVATE
    CD /d %~dp0
    MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();"
    EXIT
    
    :ADMINTASKS
    (Do whatever you need to do here)
    EXIT
    

    De esta manera es muy sencillo y sólo uso windows por defecto de los comandos.
    Es genial, si usted necesita para redistribuir el lote de archivos.

    CD /d %~dp0 Establece el directorio actual al directorio actual del archivo (si no lo está ya, independientemente de la unidad que contiene el archivo, gracias a la /d opción).

    %~nx0 Devuelve el actual nombre de archivo con extensión (Si no se incluye la extensión y hay un archivo exe con el mismo nombre en la carpeta que se llame el archivo exe).

    Hay muchas respuestas en este post ni siquiera sé si mi respuesta va a ser visto.

    De todos modos, me parece que este modo más simple que las otras soluciones propuestas en las otras respuestas, espero que ayude a alguien.

    • cd %~dp0 no funcionará en unidades de Red, utilice pushd %~dp0 lugar.
    • Me encanta la sencillez de esta respuesta. Y por último, una razón para el uso de Jscript!
    • La magia! Muchas gracias.
    • ¿Sabe usted la /d opción de la CD comando? (Por CIERTO: usted tiene un sabroso piano foto en el perfil)
    • Usted puede encontrar documentación sobre el CD de comandos aquí (así como otros comandos): technet.microsoft.com/en-us/library/bb490875.aspx El /d comando cambia la unidad actual (o ruta de acceso completa) el que esté trabajando. Es prácticamente el mismo que utilizando explícitamente no /d al parecer.
    • Ya sé que esto, sólo quiero enfatizar Stavm comentario. Usted tiene un «actual» directorio de trabajo en cada unidad: el cd comando no cambia la unidad (incluso si se incluyen explícitamente la unidad al comienzo de la ruta), mientras que escribir la letra de unidad plus colon hace. La opción /d incluye este cambio de la unidad actual.
    • Ah ok. Es que usted ha mencionado mi foto de perfil, yo pensaba que usted me hubiera preguntado jaja
    • Tal vez la adición de la /d interruptor iba a hacer que tu respuesta sea aplicable también a los scripts comenzó a partir de tarjetas de memoria y todas las otras unidades de la unidad del sistema. (acerca de la imagen de perfil: estoy tocando el piano y mirando este teclado es más divertido que mirar en mi teclado de la computadora.)
    • He escrito una respuesta enorme sólo para darse cuenta de que mal entendido… yo se lo que quieres decir ahora. Voy a editar para incluir el /d. Gracias pal 🙂 (P. S.: el Pianista aquí también!)
    • Traté de Stavm comentario, y pushd no estaba ayudando mucho. ¿Qué es la sustitución de las MSHTA línea del archivo de proceso por lotes (que me coloca entre pushd %~dp0% y popd) con estas 3 líneas: SET DPZERO=%~dp0% y SET NXZERO=%~nx0% y (el resto de esta, a través de las comillas, es una línea larga) MSHTA "javascript: var oShellApp = new ActiveXObject('Shell.Application'); var oWSH = new ActiveXObject('WScript.Shell'); oShellApp.ShellExecute('CMD', '/C ' + oWSH.Environment("Process")("DPZERO") + oWSH.Environment("Process")("NXZERO"), '', 'runas', 1);close();"
    • (Mi anterior comentario, probablemente, sólo funciona para las rutas sin espacios. De lo contrario, comillas escapar es probable que sea necesario.)
    • Esto funciona muy bien, pero podría ser una buena idea para mover el cd de comandos para el inicio (esto asegura que la ruta de acceso también está disponible a la elevación de los script – de lo contrario, la elevada script se ejecuta desde system32). Usted también debe redirigir el comando net para nul a ocultar la salida: net session >nul 2>&1
    • Divertido, pero Windows Defender detecta como un troyano y lo pone en cuarentena en el lanzamiento…

  6. 22

    Matt tiene una gran respuesta, pero se despoja de los argumentos pasados al script. Aquí está mi modificación que mantiene a los argumentos. También he incorporado Esteban revisión por el directorio de trabajo problema en Windows 8.

    @ECHO OFF
    setlocal EnableDelayedExpansion
    
    NET FILE 1>NUL 2>NUL
    if '%errorlevel%' == '0' ( goto START ) else ( goto getPrivileges ) 
    
    :getPrivileges
    if '%1'=='ELEV' ( goto START )
    
    set "batchPath=%~f0"
    set "batchArgs=ELEV"
    
    ::Add quotes to the batch path, if needed
    set "script=%0"
    set script=%script:"=%
    IF '%0'=='!script!' ( GOTO PathQuotesDone )
        set "batchPath=""%batchPath%"""
    :PathQuotesDone
    
    ::Add quotes to the arguments, if needed.
    :ArgLoop
    IF '%1'=='' ( GOTO EndArgLoop ) else ( GOTO AddArg )
        :AddArg
        set "arg=%1"
        set arg=%arg:"=%
        IF '%1'=='!arg!' ( GOTO NoQuotes )
            set "batchArgs=%batchArgs% "%1""
            GOTO QuotesDone
            :NoQuotes
            set "batchArgs=%batchArgs% %1"
        :QuotesDone
        shift
        GOTO ArgLoop
    :EndArgLoop
    
    ::Create and run the vb script to elevate the batch file
    ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
    ECHO UAC.ShellExecute "cmd", "/c ""!batchPath! !batchArgs!""", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
    "%temp%\OEgetPrivileges.vbs" 
    exit /B
    
    :START
    ::Remove the elevation tag and set the correct working directory
    IF '%1'=='ELEV' ( shift /1 )
    cd /d %~dp0
    
    ::Do your adminy thing here...
    
    • Esta es una respuesta útil. Sin embargo, en ECHO UAC.ShellExecute.... línea, "batchArgs!" no se expandirá variable. Uso "!batchArgs!". Mi edición fue rechazada, por lo que puedo comentar.
    • bien visto! No estoy seguro de por qué su edición fue rechazado debido a que fue sin duda un error y su corrección funciona. Hizo el cambio a mí mismo y probado en Win 8.1. Ahora encontrar todos los scripts donde puedo usar este código….
    • La secuencia de comandos se rompió cuando con base en los argumentos, como test.bat "a thing" o "test script.bat" arg1 arg2. Todos los fijos ahora.
    • Me las arreglé para romper (debido a mi culpa: la ejecución de la secuencia de comandos de la unidad de red asignada, desde el admin y el usuario normal no tienen la misma asignación). Aún: ¿hay una manera de ver la salida? Para mí, yo tenía que encontrar la .vbs y el cambio de la /c a a /K y, a continuación, vio manualmente.
    • Todo bien en Win 7 SP1 – ¡gracias!
    • Trabajó como un encanto! Gracias, buen señor.

  7. 17

    Puedo usar PowerShell para re-lanzar el script elevados si no lo es. Poner estas líneas en la parte superior de la secuencia de comandos.

    net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c %~fnx0 %*'"
    goto :eof
    :run
    :: TODO: Put code here that needs elevation
    

    He copiado la red ‘nombre’ método de @Matt respuesta. Su respuesta es mucho mejor documentado y tiene mensajes de error y similares. Este tiene la ventaja de que PowerShell ya está instalado y disponible en Windows 7. No temporales VBScript (*.vbs) archivos, y usted no tiene que descargar herramientas.

    Este método debería funcionar, sin cualquier configuración o instalación, siempre y cuando la ejecución de PowerShell con permisos no están bloqueados.

    • cuando se proporciona una lista de espacios separados argumentos rodeado por comillas para obtener tratado como uno más, el /c %~fnx0 %*' parte parece dejar en manos de cada parte, además de los primeros. Por ejemplo, de test.bat "arg1 arg2 arg3" sólo arg1 es pasado hacia adelante
    • Parece que no importa qué, el Inicio de Proceso elimina todas las comillas dobles en el argumentlist..
    • A mí me funciona! Lo estoy usando para netsh int set int %wifiname% Enable/Disable.
    • Yo tenía el mismo problema que Nicolas Mommaerts arriba. No entiendo por qué funciona (la mejor solución), pero la siguiente funciona como debe (nota todas las comillas al final): net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
    • Otro problema (inconveniente) es que detiene la secuencia de comandos (espera a que el usuario de entrada) si a servidor el servicio no se está ejecutando (yo lo tengo desactivado por motivos de seguridad). Yo usuallly prueba para admin perms tratando de escribir en el HOSTS la ubicación del archivo, pero es quizás mejor para invocar el comando de powershell -Verbo runas, en lugar de confiar en habilitado servicios de windows o intentar archivo escribe.
    • para sus citas de revisión. Yo no puedo arrojar alguna luz sobre por qué funciona bien (parece que no coinciden para mí!) pero su versión golpes fuera de la «%* » a partir de la original. Intencional? Este es supuestamente diseñados para relanzar la secuencia de comandos con los mismos parámetros que el original de la invocación. Por comillas alrededor del nombre de secuencia de comandos (por lo que puede contener espacios), el siguiente parece funcionar: ""%~fnx0"""" %*'". Si hay citas en el otro parámetros, están siendo despojados.

  8. 13

    Para algunos de los programas de ajuste de la super secreto __COMPAT_LAYER variable de entorno RunAsInvoker funcionará.Marque esta :

    set "__COMPAT_LAYER=RunAsInvoker"
    start regedit.exe
    

    Aunque como esta no habrá UAC preguntar al usuario seguirá sin permisos de administrador.

  9. 5

    I pega esto en el comienzo de la secuencia de comandos:

    :: BatchGotAdmin
    :-------------------------------------
    REM  --> Check for permissions
    >nul 2>&1 "%SYSTEMROOT%\system32\icacls.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 args = "" >> "%temp%\getadmin.vbs"
        echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
        echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
        echo Next >> "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", args, "", "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"
    :--------------------------------------
    
    • Me gusta la arg en el procesamiento de la secuencia de comandos. Pero nota que cacls está en desuso en Windows 7 y versiones más recientes de windows.
    • El cambio de calcs a icalcs funciona muy bien.
    • Fsutil dirty es aún mejor
    • ¿Sabe usted que la línea pushd "%CD%" guarda el directorio de trabajo actual y los cambios en el directorio de trabajo actual?
  10. -4

    Siguiente solución está limpio y funciona a la perfección.

    1. Descarga Elevar el archivo zip de https://www.winability.com/download/Elevate.zip

    2. Cremallera en el interior usted debe encontrar dos archivos: Elevate.exe y Elevate64.exe. (El último es un nativo de 64-bits compilación, si usted requiere que, a pesar de los regulares de la versión de 32 bits, Elevate.exe, debería funcionar bien con la versión de 32 – y las versiones de 64 bits de Windows)

    3. Copiar el archivo Elevate.exe en una carpeta donde Windows siempre se puede encontrar (como los de C:/Windows). O mejor puede copiar en la misma carpeta donde usted está planeando para mantener su archivo bat.

    4. A utilizar en un archivo de proceso por lotes, simplemente escriba el comando que desea ejecutar como administrador con el elevar comando como este:

     elevate net start service ...
    
    • Que comando sólo se abre una dialogwindow lo que pregunta al usuario si este comando se permite ser ejecutado. Así que usted no puede utilizar este comando en un fichero batch lo que se debe ejecutar SIN interacción con el usuario.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea