[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 23:15:09 EDT 2021


Buenas, lo primero gracias por contestar.

En efecto estoy ya bastante confundido ya que creo que de todo lo que 
ley al final se me lio todo.

Bien además creo que no he sabido explicarme quizás consecuencia de mi 
lio. A ver si lo consigo hiendo al grano.

Bien NVDA carga correctamente y mi complemento también.

El problema viene cuando tengo que llamar desde el complemento cargado 
por NVDA a CMD.EXE.

Bien tengo claro que una vez que usamos 
ctypes.windll.shell32.ShellExecuteW cuando llamo a CMD.EXE es como si lo 
llamara desde el ejecutar de Windows, por lo tanto puede ser llamado 
desde cualquier parte.

Pues si ejecuto lo siguiente en Python de 64 bits todo funciona correcto:

ctypes.windll.shell32.ShellExecuteW(

None,

'runas',

'cmd.exe',

'/c'+'sfc /scannow'+'&pause',

10)

Bien al ejecutar lo anterior eleva privilegios y ejecuta el escaneo de 
integridad.

Mi problema viene que si la misma línea es ejecutada desde el 
complemento de NVDA que usa Python 32 bits me eleva la petición pero me 
da el siguiente mensaje al ejecutarse:

Protección de recursos de Windows no pudo iniciar el servicio de reparación.

Presione una tecla para continuar . . .

Bien en la consola donde me muestra eso en el titulo me pone que se 
llamó a cmd.exe desde:

C:\Windows\SysWOW64\cmd.exe

Bien si la misma línea compruebo desde Python 32 pero ahora directamente 
desde el interprete no desde el que lleva NVDA me da exactamente lo mismo.

Bien a partir de ahí es cuando empecé a liarme con los distintos 
directorios de sistema system32, SysWOW64 Y SysNative.

Y empecé a hacer pruebas apuntando directamente a llamar a cmd desde 
esos directorios.

Bien pues el problema es ese si NVDA fuese una aplicación de 64 bits me 
ejecutaría sin problema la llamada para hacer el diagnostico de sistema, 
pero al ser de 32 bits me encuentro que no me deja.

Bien con otros comandos que no necesitan de subir privilegios por 
ejemplo un simple:

Dir c:/s/p

No hay problemas pero si en aquellos que tengo que subir privilegios y 
no entiendo exactamente el por qué.

Bien como dije es un lanzador el cual el usuario a través de una 
interface podrá crearse sus atajos y guardarlos, el que quiera hacer un 
simple listado de directorios no tendrá problema. Pero el que realmente 
quiera ejecutar herramientas del sistema tipo sfc o DISM y tener su 
línea de comandos guardada esto que estoy intentando no le funcionara.

Por lo que estoy apunto de descartarlo pero me parecía una opción a 
añadir muy útil por el tiempo que puede ahorrar a alguien que use muchos 
comandos y poderlos tener a una sola combinación de tecla.

Espero haber explicado ahora un poco mejor mi problema, como comento 
estoy tan liado que ya ni eso se.

De nuevo muchas gracias.

Un cordial saludo

El 07/05/2021 a las 2:07, Chema Cortes escribió:
>
> El jue, 6 may 2021 a las 20:18, Héctor J. Benítez Corredera 
> (<facturasxebolax en gmail.com <mailto:facturasxebolax en gmail.com>>) escribió:
>
>     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")
>
>
>
> Esta parte la ejecuta python, que es de 64 bits. No necesita emular 
> nada, por lo que siempre accede a "system32".
>
> Creo que estás confundido con el funcionamiento de las aplicaciones 32 
> bits en win 64 bits. Todas las aplicaciones están programadas para 
> acceder a system32, sean de 32 ó 64 bits. Es el sistema operativo 
> quien deriva luego las aplicaciones de 32 bits a sysWOW64 de forma 
> transparente. SysNative sería un truco para que las aplicaciones de 32 
> bits accedan a las DLLs de 64 bits que de verdad se encuentran en 
> system32. Ni python ni cmd.exe se ejecutan en modo 32 bits; es NVDA la 
> que entra en modo emulación 32 bits cuando es ejecutada por una CPU x64.
>
> Dicho esto, no entiendo qué problema tienes para ejecutar NVDA. A 
> todos los efectos, se debería comportar como una aplicación de 64 bits 
> normal
> ¿Da algún error o no funciona como se espera?
>
>
>
> -- 
> Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales": 
> https://blog.ch3m4.org <https://blog.ch3m4.org>
> Buscador Python Hispano: http://busca.ch3m4.org 
> <https://blog.ch3m4.org/pages/busqueda-python-es/>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://mail.python.org/pipermail/python-es/attachments/20210507/77ef6191/attachment.html>


Más información sobre la lista de distribución Python-es