2010-01-22 7 views
0

J'écris une configuration basée sur Wix pour une application Web et souhaite définir des autorisations sur les dossiers qu'elle installe afin que IIS puisse y accéder. Les numéros IIS 6 et 7 utilisent respectivement IIS_WPG et IIS_USRS et IIS 5 utilise IUSR_COMPUTER NAME. Toutefois, si l'utilisateur a modifié son nom d'ordinateur, la définition des autorisations à l'aide du nom de l'ordinateur actuel échoue.Détermination de l'utilisateur IIS pour IIS 5

Existe-t-il un moyen de déterminer par programme le compte d'utilisateur utilisé par IIS 5 plutôt que de supposer qu'il sera IUSR_COMPUTERNAME?

+0

Je suppose que vous installez toujours cette application dans le site Web par défaut (site IIS n ° 1)? – Kev

Répondre

0

que je fais comme ça (ne prétend pas offrir la meilleure solution pratique) - qui est une autorité de certification immédiate qui définit les propriétés que vous pouvez utiliser plus tard:

[CustomAction] 
    public static ActionResult SetIUSRAccountNameAction(Session session) 
    { 
    ActionResult actionResult = ActionResult.Failure; 
    DirectoryEntry iisAdmin = new DirectoryEntry("IIS://localhost/W3SVC"); 
    if (iisAdmin != null) 
    { 
     string iusrName = (string)iisAdmin.Properties["AnonymousUserName"][0]; 
     if (!string.IsNullOrEmpty(iusrName)) 
     { 
      session["IUSR_USERNAME"] = iusrName; 

      string iusrDomain = GetAccountDomain(iusrName, session); 
      if (!string.IsNullOrEmpty(iusrDomain)) 
      { 
       session["IUSR_DOMAIN"] = iusrDomain; 
      } 

      actionResult = ActionResult.Success; 
     } 
    } 

    return actionResult; 
    } 

où la méthode GetAccountDomain est définie comme ceci:

static string GetAccountDomain(string accountName, Session session) 
    { 
    SelectQuery query = new SelectQuery("Win32_UserAccount", string.Format("Name='{0}'", accountName), new string[] { "Domain" }); 
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
    try 
    { 
     foreach (ManagementObject account in searcher.Get()) 
     { 
      return (string)account["Domain"]; 
     } 
    } 
    catch (Exception ex) 
    { 
     session.Log("Failed to get a domain for the user {0}: {1}", accountName, ex.Message); 
    } 

    return null; 
    } 

Espérons que cela aide.

+0

Merci beaucoup pour votre aide, cela semble vraiment utile. Je suis temporairement passé à un projet différent pendant quelques semaines, donc je ne peux pas le vérifier, mais je le ferai dès que possible. Merci encore Paul – Votive