¿Cuál es la mejor manera de poner en marcha un subproceso como un usuario diferente en Python en Windows? Preferiblemente XP y más, pero si solo funciona en Vista y 7, puedo vivir con eso también.como usuario diferente en Windows
Respuesta
No estoy seguro de si se puede hacer esto con las bibliotecas estándar de Python. Sin embargo, el paquete pywin32 tiene una función win32process.CreateProcessAsUser que puede ser lo que necesita.
¿Hay alguna manera de leer stdout de eso? –
No veo una forma de capturar stdout/err. Cualquier ayuda con eso sería agradable. – wesm
Se puede crear un proceso de Python como el usuario de destino, tiene que ejecutar el proceso de pitón subproceso, y la entrada estándar hacia adelante/hacia fuera/err al proceso pitón "maestro", a través de conexión de tubo o algo por el estilo. – pixelbrei
Otra opción es a popen no el proceso deseado, pero runas ...
comando. Tenga en cuenta que el servicio Run As
debe estar habilitado y ejecutándose.
que terminaron aumentando subproceso:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import subprocess
import win32con
import win32process
import win32security
from subprocess import *
__all__ = ["Popen","PIPE", "STDOUT", "call", "check_call",
"CalledProcessError", "CREATE_NEW_CONSOLE", "LoginSTARTUPINFO",
"STARTUPINFO"]
class LoginSTARTUPINFO(object):
"""
Special STARTUPINFO instance that carries login credentials. When a
LoginSTARTUPINFO instance is used with Popen, the process will be executed
with the credentials used to instantiate the class.
If an existing vanilla STARTUPINFO instance needs to be converted, it
can be supplied as the last parameter when instantiating LoginSTARTUPINFO.
The LoginSTARTUPINFO cannot be used with the regular subprocess module.
>>> import subprocesswin32 as subprocess
>>> sysuser = LoginSTARTUPINFO("username", "pswd123", "machine")
>>> stdout, stderr = subprocess.Popen("cmd.exe", stdout=subprocess.PIPE,
... startupinfo=sysuser).communicate()
"""
def __init__(self, username, domain, password, startupinfo=None):
m_startupinfo = win32process.STARTUPINFO()
# Creates an actual win32 STARTUPINFO class using the attributes
# of whatever STARTUPINFO-like object we are passed.
for attr in dir(startupinfo):
if not(attr.startswith("_") or attr not in dir(m_startupinfo)):
setattr(m_startupinfo, attr, getattr(startupinfo, attr))
# Login credentials
self.credentials = (username, domain, password)
# Proper win32 STARTUPINFO representation for CreateProcess
self.win32startupinfo = m_startupinfo
def CreateProcess(*args):
startupinfo = args[-1]
# If we are passed a LoginSTARTUPINFO, that means we need to use
# CreateProcessAsUser instead of the CreateProcess in subprocess
if isinstance(startupinfo, LoginSTARTUPINFO):
# Gets the actual win32 STARTUPINFO object from LoginSTARTUPINFO
win32startupinfo = startupinfo.win32startupinfo
mkprocargs = args[:-1] + (win32startupinfo,)
login, domain, password = startupinfo.credentials
# Get a user handle from the credentials
userhandle = win32security.LogonUser(login, domain, password,
win32con.LOGON32_LOGON_INTERACTIVE,
win32con.LOGON32_PROVIDER_DEFAULT)
try:
# Return the pipes from CreateProcessAsUser
return win32process.CreateProcessAsUser(userhandle, *mkprocargs)
finally:
# Close the userhandle before throwing whatever error arises
userhandle.Close()
return win32process.CreateProcess(*args)
# Overrides the CreateProcess module of subprocess with ours. CreateProcess
# will automatically act like the original CreateProcess when it is not passed
# a LoginSTARTUPINFO object.
STARTUPINFO = subprocess.STARTUPINFO = win32process.STARTUPINFO
subprocess._subprocess.CreateProcess = CreateProcess
El siguiente código lanza cmd.exe
como usuario username
:
>>> import subprocesswin32 as subprocess
>>> sysuser = LoginSTARTUPINFO("username", "pswd123", "machine")
>>> stdout, stderr = subprocess.Popen("cmd.exe", stdout=subprocess.PIPE,
... startupinfo=sysuser).communicate()
Esto fue editado en la pregunta por el OP - movido a una respuesta CW. –
el enlace es 404 – jfs
- 1. Ejecutándose en ejecución como un usuario diferente
- 2. Ejecutar como usuario diferente en FreeBSD
- 3. mysql iniciando sesión como usuario diferente
- 4. ¿Cómo hacer svn commit como usuario diferente?
- 5. Ejecutar código como un usuario diferente (C#)
- 6. Ejecución de pruebas como un usuario diferente en Visual Studio
- 7. Ejecutar nuevo proceso como usuario diferente en vb.net
- 8. Inicie sesión como un usuario diferente al utilizar la Autenticación de Windows integrada
- 9. Usar Process.Start() para iniciar un proceso como un usuario diferente dentro de un servicio de Windows
- 10. ¿Implementar como usuario de Jenkins o permitir que Jenkins se ejecute como un usuario diferente?
- 11. ¿Cómo se confirma el código como un usuario diferente?
- 12. Ejecución de comandos UNIX como usuario diferente, desde Java
- 13. Iniciar un proceso .Net como un usuario diferente
- 14. ¿Qué usuario ejecutan los scripts Python como en Windows?
- 15. ¿Qué usuario está ejecutando Apache como en Windows?
- 16. comando de una sola línea para ejecutarse como un usuario diferente en Windows 7 que contiene una contraseña también
- 17. tiempo Python formato diferente en Windows
- 18. ¿Cómo establecer variables de entorno de usuario en Windows Server 2008 R2 como un usuario normal?
- 19. ¿Problema de permisos al iniciar la aplicación .NET del servicio .NET como un usuario diferente?
- 20. ¿Qué tiene de diferente el comando CMake configure_file en Windows?
- 21. ¿Cómo ejecuto un comando como un usuario diferente de un cronjob raíz?
- 22. ¿Cómo puedo tener archivos de escritura MySQL como un usuario diferente?
- 23. ¿Cómo ejecuto nohup como un usuario diferente sin generar dos procesos?
- 24. ¿Hay algo como inotify en Windows?
- 25. Carpeta diferente como subcarpeta del sitio web
- 26. Ejecución de ColdFusion como usuario específico
- 27. filesystemwatcher como servicio de Windows?
- 28. IIS7: Configuración Autenticación integrada de Windows como en IIS6
- 29. ¿Es posible que IE8 represente CSS de manera diferente en Windows 7 frente a Windows XP?
- 30. Cómo iniciar sesión como usuario en p4
Moví la respuesta Publicado por @EricPruitt a una respuesta CW. Si desea publicarlo usted mismo, vuelva a publicar la respuesta por su cuenta, haga clic aquí y borrará la respuesta CW. –