[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