¿Sabes cómo si eres el usuario administrativo de un sistema y puedes hacer clic derecho en decir, un script por lotes y ejecutarlo como Administrador sin ingresar la contraseña de administrador?
Me pregunto cómo hacer esto con un script de PowerShell. No quiero tener que ingresar mi contraseña; Solo quiero imitar el método del botón derecho Ejecutar como administrador .
Todo lo que leí hasta ahora requiere que proporciones la contraseña de administrador.
powershell
administrator
virutas
fuente
fuente
gsudo
. Un sudo de código abierto gratuito para Windows que permite ejecutar como administrador desde la línea de comandos. Aparecerá una ventana emergente UAC.Respuestas:
Si la consola actual no está elevada y la operación que está intentando realizar requiere privilegios elevados, puede iniciar PowerShell con la Run as administratoropción:
fuente
start-process -verb runAs "<cmd>" -argumentlist "<args1> <args2>"
;)Win
+X
Como se discutió aquíAquí hay una adición a la sugerencia de Shay Levi (solo agregue estas líneas al comienzo de un guión):
Esto da como resultado que el script actual se pase a un nuevo proceso de PowerShell en modo Administrador (si el Usuario actual tiene acceso al modo Administrador y el script no se inicia como Administrador).
fuente
if (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)))
if
declaración y coloquethrow
dentro del bloque then.if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
[Security.Principal.WindowsBuiltInRole]::Administrator)
) debería preferirse al argumento de cadena"Administrator"
- Encontré entornos reforzados de seguridad con roles incorporados renombradosScript de PowerShell autoelevante
Windows 8.1 / PowerShell 4.0 +
Una línea :)
fuente
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" `"$args`"" -Verb RunAs; exit }
Benjamin Armstrong publicó un excelente artículo sobre scripts de PowerShell de elevación automática . Hay algunos problemas menores con su código; A continuación se incluye una versión modificada basada en las correcciones sugeridas en el comentario.
Básicamente obtiene la identidad asociada con el proceso actual, comprueba si es un administrador y, si no lo es, crea un nuevo proceso de PowerShell con privilegios de administrador y finaliza el proceso anterior.
fuente
$newProcess = new-object System.Diagnostics.ProcessStartInfo “cmd.exe” $newProcess.Arguments = ‘/c ‘ + [System.Environment]::GetCommandLineArgs() $newProcess.WorkingDirectory = [environment]::CurrentDirectory
Puede crear un archivo por lotes (
*.bat
) que ejecuta su script de PowerShell con privilegios administrativos cuando se hace doble clic. De esta manera, no necesita cambiar nada en su script de PowerShell . Para hacer esto, cree un archivo por lotes con el mismo nombre y ubicación de su script de PowerShell y luego coloque el siguiente contenido:¡Eso es!
Aquí está la explicación:
Suponiendo que su script de PowerShell esté en la ruta
C:\Temp\ScriptTest.ps1
, su archivo por lotes debe tener la rutaC:\Temp\ScriptTest.bat
. Cuando alguien ejecuta este archivo por lotes, se producirán los siguientes pasos:El cmd ejecutará el comando
Se abrirá una nueva sesión de PowerShell y se ejecutará el siguiente comando:
Se abrirá otra nueva sesión de PowerShell con privilegios administrativos en la
system32
carpeta y se le pasarán los siguientes argumentos:El siguiente comando se ejecutará con privilegios administrativos:
Una vez que la ruta de la secuencia de comandos y los argumentos de nombre están entre comillas dobles, pueden contener espacios o comillas simples (
'
).La carpeta actual cambiará de
system32
aC:\Temp
yScriptTest.ps1
se ejecutará el script . Una vez que-NoExit
se pasó el parámetro , la ventana no se cerrará, incluso si su script de PowerShell arroja alguna excepción.fuente
sudo
comando y configurando el usuario que utiliza para el proceso automatizadoNOPASSWD: ALL
en elsudoers
archivo .Aquí hay un fragmento de elevación automática para los scripts de Powershell que conserva el directorio de trabajo :
Preservar el directorio de trabajo es importante para los scripts que realizan operaciones relativas a la ruta. Casi todas las otras respuestas no conservan esta ruta, lo que puede causar errores inesperados en el resto del script.
Si prefiere no usar un script / fragmento autoelevante y, en cambio, solo desea una manera fácil de iniciar un script como administrador (por ejemplo, desde el menú contextual del Explorador), vea mi otra respuesta aquí: https: // stackoverflow .com / a / 57033941/2441655
fuente
Utilizando
#Requires -RunAsAdministrator
no ha sido declarado, todavía. Parece estar allí solo desde PowerShell 4.0.
http://technet.microsoft.com/en-us/library/hh847765.aspx
Para mí, esta parece ser una buena manera de hacerlo, pero todavía no estoy seguro de la experiencia de campo. Los tiempos de ejecución de PowerShell 3.0 probablemente ignoren esto o, lo que es peor, den un error.
Cuando el script se ejecuta como no administrador, se produce el siguiente error:
fuente
Parameter RunAsAdministrator requires an argument
. @akauppi No estoy convencido de que siempre estén pensando.Puede agregar fácilmente algunas entradas de registro para obtener un menú contextual "Ejecutar como administrador" para los
.ps1
archivos:(actualizado a un script más simple de @Shay)
Básicamente al
HKCR:\Microsoft.PowershellScript.1\Shell\runas\command
establecer el valor predeterminado para invocar el script usando Powershell.fuente
(default)
?"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit -command "& '%1'"
El código publicado por Jonathan y Shay Levy no funcionó para mí.
Encuentre el código de trabajo a continuación:
fuente
Debe volver a ejecutar el script con privilegios administrativos y verificar si el script se inició en ese modo. A continuación, he escrito un script que tiene dos funciones: DoElevatedOperations y DoStandardOperations . Debe colocar su código que requiere derechos de administrador en el primero y las operaciones estándar en el segundo. La variable IsRunAsAdmin se usa para identificar el modo administrador.
Mi código es un extracto simplificado del script de Microsoft que se genera automáticamente cuando crea un paquete de aplicaciones para las aplicaciones de la Tienda Windows.
fuente
Agregando mis 2 centavos. Mi versión simple basada en la sesión de red que funciona todo el tiempo hasta ahora en Windows 7 / Windows 10. ¿Por qué complicarlo más?
simplemente agregue a la parte superior de la secuencia de comandos y se ejecutará como administrador.
fuente
if (!(net session 2>&1 | Out-Null)) { ...
@ycomp... } else { echo "your message" }
.cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
, puede establecerlo enbypass
Perobypass
puede ser peligroso. ConfigurarloAllSigned
Este comportamiento es por diseño. Hay varias capas de seguridad, ya que Microsoft realmente no quería que los archivos .ps1 fueran el último virus de correo electrónico. Algunas personas consideran que esto es contrario a la noción de automatización de tareas, lo cual es justo. El modelo de seguridad de Vista + es "des-automatizar" las cosas, haciendo que el usuario las apruebe.
Sin embargo, sospecho que si inicia powershell en sí mismo como elevado, debería poder ejecutar archivos por lotes sin solicitar la contraseña nuevamente hasta que cierre powershell.
fuente
También puede forzar que la aplicación se abra como administrador, si tiene una cuenta de administrador, por supuesto.
Localice el archivo, haga clic con el botón derecho> propiedades> Acceso directo> Avanzado y marque Ejecutar como administrador
Luego haga clic en Aceptar.
fuente
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
es donde reside el acceso directo de PowerShell. También sigue yendo a una ubicación diferente para invocar el 'exe' real (%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
).Dado que PowerShell está controlado por el perfil de usuario cuando se trata de permisos; si su nombre de usuario / perfil tiene los permisos para hacer algo, entonces bajo ese perfil, en PowerShell generalmente también podrá hacerlo. Dicho esto, tendría sentido que altere el acceso directo ubicado debajo de su perfil de usuario, por ejemplo,
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
,.Haga clic derecho y haga clic en propiedades. Haga clic en el botón "Avanzado" debajo de la pestaña "Acceso directo" ubicada justo debajo del campo de texto "Comentarios" adyacente a la derecha de otros dos botones, "Abrir ubicación de archivo" y "Cambiar icono", respectivamente.
Marque la casilla de verificación que dice "Ejecutar como administrador". Haga clic OK, luego Applyy OK. Una vez más, haga clic derecho en el icono etiquetado 'Windows PowerShell' ubicado en
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
y seleccione "Anclar al menú Inicio / Barra de tareas".Ahora, cada vez que haga clic en ese icono, invocará el UAC para escalar. Después de seleccionar 'SÍ', notará que la consola de PowerShell se abre y se etiquetará como "Administrador" en la parte superior de la pantalla.
Para ir un paso más allá ... puede hacer clic con el botón derecho en el mismo acceso directo de icono en la ubicación de su perfil de Windows PowerShell y asignar un acceso directo de teclado que hará exactamente lo mismo que si hiciera clic en el icono agregado recientemente. Entonces, donde dice "Atajo de teclado", coloque una combinación de tecla / teclado como: Ctrl+ Alt+ P P(para PowerShell) . Haga clic ApplyyOK .
Ahora todo lo que tiene que hacer es presionar la combinación de botones que asignó y verá que se invoca UAC, y después de seleccionar 'SÍ' verá aparecer una consola PowerShell y se mostrará "Administrador" en la barra de título.
fuente
He encontrado una manera de hacer esto ...
Cree un archivo por lotes para abrir su script:
Luego cree un acceso directo, en su escritorio, por ejemplo (haga clic con el botón derecho en Nuevo -> Acceso directo ).
Luego pegue esto en la ubicación:
Cuando abra por primera vez, deberá ingresar su contraseña una vez. Esto lo guardará en el administrador de credenciales de Windows.
Después de esto, debería poder ejecutarse como administrador sin tener que ingresar un nombre de usuario o contraseña de administrador.
fuente
El problema con las respuestas de @pgk y @Andrew Odri es cuando tienes parámetros de script, especialmente cuando son obligatorios. Puede resolver este problema utilizando el siguiente enfoque:
Así es como sería el código si el script tuviera los parámetros obligatorios ComputerName y Port :
fuente
Algunas de las respuestas aquí están cerca, pero un poco más de trabajo de lo necesario.
Cree un acceso directo a su script y configúrelo para "Ejecutar como administrador":
Properties...
Target
de<script-path>
apowershell <script-path>
Run as administrator
fuente
Otra solución más simple es que también puede hacer clic derecho en "C: \ Windows \ System32 \ cmd.exe" y elegir "Ejecutar como administrador", luego puede ejecutar cualquier aplicación como administrador sin proporcionar ninguna contraseña.
fuente
Estoy usando la solución a continuación. Maneja stdout / stderr mediante la función de transcripción y pasa el código de salida correctamente al proceso padre. Necesita ajustar la ruta de transcripción / nombre de archivo.
fuente
Aquí se explica cómo ejecutar un comando powershell elevado y recopilar su formulario de salida dentro de un archivo por lotes de Windows en un solo comando (es decir, no escribir un script de PowerShell ps1).
Como se ve arriba, primero lanzo un PowerShell con un mensaje elevado y luego le pido que inicie otro PowerShell (Sub Shell) para ejecutar el comando.
fuente
Además de la respuesta de Shay Levy, siga la configuración a continuación (solo una vez)
PATH
carpetas, por ejemplo. Carpeta Windows \ System32Después de la configuración:
powershell Start-Process powershell -Verb runAs <ps1_file>
Ahora puede ejecutar todo en una sola línea de comando. Lo anterior funciona en Windows 8 Basic de 64 bits.
fuente
La forma más confiable que he encontrado es envolverlo en un archivo .bat de elevación automática:
El .bat comprueba si ya eres administrador y relanza el script como Administrador si es necesario. También evita que se abran ventanas "cmd" extrañas con el cuarto parámetro de
ShellExecute()
set to0
.fuente
EXIT
aGOTO :EOF
ay eliminé el segundo. Además, secd %~dp0
debecd /d %~dp0
Y colocar el primer comando después de@echo off
. De esta manera, tampoco necesita la ruta absoluta de la.ps1
, simplemente colóquela en la misma carpeta que la.bat
. Si necesita ver el resultado, cambie el cuarto parámetro a1
.mshta
comando?cmd
proceso de llamada , de modo que eso no lo "arregle", pero me alegra que haya podido modificarlo según sus necesidades.cmd
(no lo hice). Pero con respecto a los otros cambios, creo que son correcciones porque mi versión funcionaría para ambos mientras que la suya no lo hace para mí, es decir, la mía es más general (aborde el escenario de diferentes unidades). De todos modos, un enfoque muy inteligente.No he visto mi propia forma de hacerlo antes, así que prueba esto. Es mucho más fácil de seguir y tiene una huella mucho más pequeña:
De manera muy simple, si la sesión actual de Powershell se llamó con privilegios de administrador, el conocido SID del grupo de administradores aparecerá en los grupos cuando tome la identidad actual. Incluso si la cuenta es miembro de ese grupo, el SID no aparecerá a menos que el proceso se invoque con credenciales elevadas.
Casi todas estas respuestas son una variación del método inmensamente popular de Ben Armstrong de Microsoft sobre cómo lograrlo sin comprender realmente lo que realmente está haciendo y cómo emular la misma rutina.
fuente
Para agregar la salida del comando a un nombre de archivo de texto que incluye la fecha actual, puede hacer algo como esto:
fuente
Esta es una aclaración ...
La credencial PowerShell RUNAS / SAVECRED "no es segura", la probó y agrega la identidad de administrador y la contraseña en el caché de credenciales y se puede usar en cualquier otro lugar. Si ha hecho esto, le sugiero que verifique y elimine la entrada.
Revise su programa o código porque la política de Microsoft es que no puede mezclar código de usuario y administrador en el mismo blob de código sin el UAC (el punto de entrada) para ejecutar el programa como administrador. Esto sería sudo (lo mismo) en Linux.
El UAC tiene 3 tipos, no ver, un aviso o un punto de entrada generado en el manifiesto del programa. No eleva el programa, por lo que si no hay UAC y necesita administrador, fallará. Sin embargo, el UAC como requisito de administrador es bueno, evita la ejecución de código sin autenticación y evita que el escenario de códigos mixtos se ejecute a nivel de usuario.
fuente
Resulta que fue demasiado fácil. Todo lo que tiene que hacer es ejecutar un cmd como administrador. Luego escriba
explorer.exe
y presione enter. Eso abre el Explorador de Windows . Ahora haga clic derecho en el script de PowerShell que desea ejecutar, elija "Ejecutar con PowerShell", que lo ejecutará en PowerShell en modo administrador.Es posible que le pida que habilite la política para ejecutarse, escriba Y y presione enter. Ahora el script se ejecutará en PowerShell como administrador. En caso de que se ejecute todo en rojo, eso significa que su política aún no entró en vigencia. Luego intente nuevamente y debería funcionar bien.
fuente