2010-12-03 46 views
1

J'ai créé un programme d'installation à l'aide de wix, qui inclut des actions personnalisées nécessitant des droits d'administrateur.Non exécuté en cours d'élévation, bien que l'invite UAC soit acceptée (action personnalisée)

Pour le moment, ce programme d'installation ne fonctionne que lorsqu'il est exécuté par le compte administrateur buildin. Dans ce cas, aucune invite UAC n'est affichée.
Si le programme d'installation est exécuté par un autre membre du groupe d'administrateurs local, l'invite UAC s'affiche. Bien que j'autorise à faire des changements sur mon ordinateur, les fonctions d'api de Windows dans mes actions personnalisées renvoient des erreurs comme "manque de privilèges", ...

J'ai essayé de laisser les actions personnalisées s'exécuter différées, mais cela n'a pas aidé. Je n'ai plus d'idées, donc votre aide serait la bienvenue.

Cordialement Ralf

Répondre

1

Essayez d'exécuter les actions personnalisées avec le msidbCustomActionTypeNoImpersonate drapeau (mis Impersonate à "non"): http://msdn.microsoft.com/en-us/library/aa368069(VS.85).aspx

De cette façon, il sera exécuté sous le compte système local avec les privilèges . Veuillez noter que vos actions doivent être différées afin d'utiliser ce drapeau. Autant que je sache, le script d'installation est exécuté par le compte LocalSystem

1

Comme il semble (regardez http://msdn.microsoft.com/en-us/library/ms684190) plusieurs privilèges sont désactivés dans ce compte. Par exemple SE_BACKUP_NAME est DISABLED et celui-ci est nécessaire pour appeler LoadUserProfile.

J'ai déjà expérimenté avec la fonction API AdjustTokenPrivileges mais sans succès. Le compte LocalSystem possède-t-il TOKEN_ADJUST_PRIVILEGES? Je ne connais pas le privilège SE_XXXXXX_NAME associé.

Cordialement Ralf

1

La solution que j'ai découvert était je fusionné mon installateur avec un programme d'amorçage qui demandera si l'utilisateur UAC ne dispose pas de droits appropriés.

Si vous ne voulez pas utiliser cette approche, ce code pourrait vous aider.

ActionResult public static CheckPrivileges (session de session) {

 bool isadmin = false; 

     System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent(); 
     System.Security.Principal.WindowsPrincipal wp = new System.Security.Principal.WindowsPrincipal(wi); 

     if (wp.IsInRole("Administrators")) 
      isadmin = true; 
     else 
      isadmin = false; 

     if (isadmin) 
     { 
      return ActionResult.Success; 
     } 
     else 
     { 
      if (System.Environment.OSVersion.Version.Major >= 6) // Windows Vista or higher 
       MessageBox.Show("Administrator priveleges are required to install the application. Please right click the setup file and select 'Run as administrator'.", "Mesaage", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      else 
       MessageBox.Show("Administrator priveleges are required to install the application.", "Mesaage", MessageBoxButtons.OK, MessageBoxIcon.Error); 

      return ActionResult.Failure; 
     } 
    }