[Python-es] Problemas con entornos Windows de 32 bits y 64 bits y elevar un CMD con privilegios de Administrador.
Héctor J. Benítez Corredera
facturasxebolax en gmail.com
Jue Mayo 6 14:18:02 EDT 2021
Buenas, me gustaría hacer una consulta a ver si me sacáis del lio que llevo.
Bien estoy haciendo un complemento para una aplicación de accesibilidad
la cual es un lector de pantalla exactamente NVDA.
https://github.com/nvaccess/nvda <https://github.com/nvaccess/nvda>
Bien dicho lector permite hacer complementos en Python usando librerías
internas del propio lector referidas a accesibilidad y otras que lleva
por ejemplo wxpython pudiendo hacer interfaces graficas.
Cuando el lector se carga, carga los complementos que están en Python
sin compilar ni nada.
Bien NVDA es una aplicación de 32 bits por lo que cuando carga los
complementos se cargan en 32 bits.
Ahora viene mi problema, mi complemento pretende ser un launcher rápido
de funciones ya sea poder lanzar rápidamente una aplicación portable o
instalable, un lanzador de comandos CMD y PowerShell.
Mi problema viene con CMD y con comandos que necesiten ser elevados con
privilegios de Administrador.
Bien e modificado a mis necesidades la respuesta 2 de aquí:
https://stackoverflow.com/questions/41896638/how-to-run-a-script-with-elevated-privilege-on-windows
Bien pego un código el cual estoy usando para pruebas y luego termino de
explicar.
import ctypes
import os
def ejecutaAdmin(aplicacion, parametros=False):
try:
if parametros == False:
ctypes.windll.shell32.ShellExecuteW(
None,
'runas',
aplicacion,
None,
None,
10)
else:
ctypes.windll.shell32.ShellExecuteW(
None,
'runas',
aplicacion,
parametros,
None,
10)
except:
print("Error")
winpath = os.path.join(os.environ['SystemRoot'], "SysNative", "cmd.exe")
# Esta es la que debería funcionar en 32 bits
#winpath = os.path.join(os.environ['SystemRoot'], "system32", "cmd.exe")
Esta es la que funciona en 64 bits pero no en 32 bits
#winpath = os.path.join(os.environ['SystemRoot'], "SysWOW64", "cmd.exe")
No funciona
ejecutaAdmin(winpath, "/c" + "sfc /scannow" + "&pause")
Bien si quiero ejecutar el comando de cmd sfc /scannow en un Windows de
64 bits pero llamado desde una aplicación de 32 bits y con privilegios
elevados ya que el comando lo requiere no hay manera.
E leído sobre el directorio virtual SysNative pero por más que apunto a
él tampoco funciona.
Bien creo entender y seguramente sea mal que no es posible ejecutar un
comando que implica arreglar problemas de un entorno de 64 bits desde un
cmd de 32.
Pero mi problema es si deseara ejecutar otros comandos directamente con
privilegios.
Bien como habéis podido comprobar estoy liado por completo, a ver si me
podéis echar algo de luz.
Muchísimas gracias y perdón por el tostón.
Cordiales saludos
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://mail.python.org/pipermail/python-es/attachments/20210506/ce602d51/attachment.html>
Más información sobre la lista de distribución Python-es