Pregunta

¿Cómo puede mi vbscript detectar si se está ejecutando o no en un contexto elevado de UAC? ??

No tengo ningún problema para detectar al usuario y para ver si el usuario está dentro del grupo de administradores. Pero esto todavía no responde a la pregunta de si el proceso ha elevado los privs o no, cuando se ejecuta bajo Vista o Windows 2008. Tenga en cuenta que solo necesito detectar este estado; no intente elevar o (err ..) de-elevar.

¿Fue útil?

Solución

El método que finalmente decidí depende del hecho de que Vista y Windows 2008 tienen la utilidad whoami.exe y detectan el nivel de integridad del usuario que posee el proceso. Un par de capturas de pantalla ayudan aquí:

Otros consejos

Aquí está mi solución más corta:

Function IsElevated
    IsElevated = CreateObject("WScript.Shell").Run("cmd.exe /c ""whoami /groups|findstr S-1-16-12288""", 0, true) = 0
End function 

Esta función es independiente y no mostrará ninguna ventana de consola parpadeante cuando se ejecute.

La solución que estoy publicando es un VBScripts listos para producción que aprovechan a whoami para encontrar esta información. Una cosa interesante de ellos es que funcionan con XP (para obtener información que está disponible en XP) si coloca una copia de la versión del Kit de recursos de whoami.exe junto al script (o en la carpeta system32 de cada máquina).

CSI_IsSession.vbs contiene una única función que puede decirle casi todo lo que desee para saber sobre UAC o la sesión actual bajo la cual se ejecuta el script.

VBScriptUACKit.vbs (que utiliza CSI_IsSession.vbs) le permite solicitar selectivamente UAC en un guión relanzándose. Ha sido diseñado y depurado para funcionar en muchos escenarios de ejecución.

Ambos scripts contienen código de ejemplo que muestra cómo usar el código del script central.

un poco más corto en WSH Jscript

function isElevated(){
    var strCaption  = "";
    for (var enumItems=new Enumerator(GetObject("winmgmts:\\\\.\\root\\CIMV2").ExecQuery("Select * from Win32_OperatingSystem")); !enumItems.atEnd(); enumItems.moveNext()) {
        strCaption  +=  enumItems.item().Caption;
    }
    if(/Vista|2008|Windows\s7|Windows\s8/.test(strCaption)){
        return (new ActiveXObject("WScript.Shell").run('cmd.exe /c "whoami /groups|findstr S-1-16-12288"', 0, true)) == 0;
    }else{return true}
}    

WScript.Echo(isElevated());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top