2012-01-04 14 views
11

Soy bastante nuevo con NSIS. Estoy tratando de solicitar permisos de administrador para ejecutar el instalador, ya que se entromete un poco con los registros. Mi problema con "RequestExecutionLevel" y "MULTIUSER_EXECUTIONLEVEL" es que ambos bloquean absolutamente a cualquier usuario que no sea administrador para que no abra el instalador, incluso cuando selecciona "Ejecutar como administrador" en el menú contextual. He intentado utilizar el DLL de RunAs, pero no he encontrado un solo hilo en cuanto a qué poner en la variable $ command pasada a la función "RunAsW".¿Cómo solicitas permisos de administrador usando NSIS?

Aquí es mi (bastante hackeado-up) código:

 StrCpy $0 0 
    StrCpy $1 "" 
    System::Call 'RunAs::GetAdministrators(w r1, *i .r0) i .r2 ? u' 
    System::Alloc 64 
    Pop $4 
    StrCpy $4 $2 
    StrCpy $5 "" 
    loop: 
      IntCmp $0 0 endloop 
      System::Call '*$4(w .r3)' 
      StrCpy $5 "$5|$3" 
    endloop: 
    System::Free $4 ; we free the memory used by the array 
    StrCpy $5 "$5" "" 1 
    !insertmacro MUI_INSTALLOPTIONS_WRITE "Settings.ini" "Field 1" "ListItems" $5 
    !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings.ini" 
    !insertmacro MUI_INSTALLOPTIONS_READ $1 "UserPass" "Field 1" "State" 
    !insertmacro MUI_INSTALLOPTIONS_READ $2 "Settings.ini" "Field 2" "State" 
    StrCpy $3 "%%LOGONSERVER%%" 
    StrCpy $3 0 
    StrCpy $4 0 
    System::Call 'RunAs::RunAsW(w r1, w r2, w r3, *w .r4) i .r0 ? u' 
    MessageBox MB_OK $0 
    IntCmp $0 1 success 
    Quit 
    success: 
    !insertmacro MUI_LANGDLL_DISPLAY 

Una gran parte de ella es la conjetura y ensayo y error. (Por cierto, también intenté ejecutar un bucle para obtener todos los administradores, pero parece que el archivo DLL solo estaba destinado a máquinas de 32 bits, así que ...).

De todos modos, mi pregunta es:

¿Alguien sabe de una manera (usando "RunAs" o de otra manera) para abrir un cuadro de diálogo que solicita nombre de usuario y contraseña, comprobar las credenciales y continuar con la instalación sólo si se echa un vistazo ?

Además, sé que hay una manera de configurar un instalador para que tenga el bonito icono de escudo que le permite a los usuarios saber que se solicitará permiso de administrador. ¿Alguien sabe cómo hacer eso?

Cualquier ayuda sería muy apreciada, ya que esto es lo único que actualmente impide la implementación de mi aplicación.

+0

¿Cuál es el punto de "System :: Alloc 64 " tira el puntero después de la explosión y la memoria. NSIS siempre es de 32 bits, por lo que su comentario sobre el ciclo tiene poco sentido ... – Anders

+0

"ambos bloquean absolutamente cualquier usuario que no sea administrador para abrir el instalador, incluso cuando selecciona" Ejecutar como administrador "en el menú contextual" Esto no ¡suena bien! ¿Cuál es su versión de Windows y la configuración de UAC? – Anders

+0

La variable de comando $ es lo que desea ejecutar, "calc.exe", etc. – Anders

Respuesta

22
Outfile RequireAdmin.exe 
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on) 

!include LogicLib.nsh 

Function .onInit 
UserInfo::GetAccountType 
pop $0 
${If} $0 != "admin" ;Require admin rights on NT4+ 
    MessageBox mb_iconstop "Administrator rights required!" 
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED 
    Quit 
${EndIf} 
FunctionEnd 

Page InstFile 

Section 
SectionEnd 

es el código básico que suelo recomendar para asegurarme de que el instalador se ejecuta como administrador.

En mi humilde opinión, no tiene sentido pedir credenciales en una página personalizada a menos que solo partes del proceso de instalación requieran acceso de administrador y la otra parte requiera acceso al perfil de los usuarios. Si este es su caso, entonces debería echar un vistazo a la UAC plug-in (Es un poco complicado de usar y hace que sea imposible para el archivo exe para obtener el icono de superposición escudo)

no creo que los RunAs plug-in funciona correctamente en Vista + cuando UAC está encendido, por lo que tratar de hacer que funcione podría ser un callejón sin salida ...

El recommended way para obtener el escudo es solicitar la elevación en el manifiesto de manifiesto, RequestExecutionLevel admin hace eso. Si no usa RequestExecutionLevel en su secuencia de comandos, su instalador podría ser detectado como un instalador heredado y también obtendrá la capa superpuesta del escudo.

En Windows Vista, si un archivo ejecutable requiere elevación para poner en marcha, a continuación, el icono del ejecutable debe ser "sellado" con un icono de escudo para indicar este hecho. El manifiesto de la aplicación del ejecutable debe marcar "requireAdministrator" para designar el ejecutable que requiere un token de acceso administrativo completo . La superposición del icono del escudo también será colocada automáticamente en ejecutables que se considera que requieren elevación según la heurística de detección del instalador. Por ejemplo, un archivo llamado setup.exe recibirá automáticamente una superposición de icono de escudo , incluso si el ejecutable no tiene un manifiesto de aplicación incrustado.

+1

Thnx Anders. Volvió a solo RequestExecutionLevel sin RunAs y lo resolvió moviendo "RequestExecutionLevel admin" a la parte superior de la página. Ahora Windows solicita automáticamente el inicio de sesión de administrador ... –

+0

Esta publicación fue útil para mí. Gracias, Anders. –

Cuestiones relacionadas