2010-11-16 36 views
1

Note: Cette question peut également être trouvée sur le WiX mailing list.Comment vérifier l'existence d'un site Web IIS 7 via WiX 3.5?

Je dois être en mesure de vérifier l'existence d'un site Web IIS7 basé sur la description du site. Si le site Web n'existe pas, je dois annuler l'installation. Si le site existe, je veux continuer l'installation. Je dois également pouvoir sauvegarder l'identifiant du site Web afin de pouvoir l'utiliser lors d'une désinstallation.

Pour le débogage, j'ai codé en dur la description du site. Je ne vois aucune indication qu'une vérification pour le site Web est faite dans le fichier journal MSI. Voici le code que je utilise:

<iis:WebSite Id="IISWEBSITE" Description="Default Web Site" SiteId="*"> 
     <iis:WebAddress Id="IisWebAddress" Port="1"/> 
</iis:WebSite> 

<Condition Message="Website [IISWEBSITE] not found."> 
     <![CDATA[IISWEBSITE]]> 
</Condition> 

En utilisant ORCA je peux voir que les tables IIsWebAddress et IIsWebSite sont ajoutés au MSI. Les valeurs sont les suivantes:

IIsWebsite

WEB:   IISWEBSITE 
Description: Default Web Site 
KeyAddress: IisWebAddress 
Id:   -1 

IIsWebAddress

Address: IisWebAddress 
Web_: IISWEBSITE 
Port: 1 
Secure: 0 

Avec le code ci-dessus, l'installation est interrompue avec le message d'erreur "Site introuvable". Il semble que IISWEBSITE ne soit jamais défini. Cependant, je sais que "Site Web par défaut" existe. Je sais qu'il me manque quelque chose, mais quoi?

Comment puis-je effectuer une vérification simple de l'existence d'un site Web dans IIS 7?

Répondre

0

J'ai aussi eu le même problème.

J'ai écrit une action personnalisée pour vérifier la version d'IIS à partir du registre.

Sur la base de la valeur de Registre créer un répertoire virtuel

0

j'ai écrit une action personnalisée dans le Javascript pour le faire. Si vous supposez IIS7, alors vous pouvez utiliser l'outil appcmd.exe, et juste l'invoquer depuis Javascript pour obtenir la liste des sites. En théorie, c'est assez simple à faire. Mais en pratique, il y a un tas de cerceaux dont vous avez besoin.

Voici ce que je suis venu avec:

function RunAppCmd(command, deleteOutput) { 
    var shell = new ActiveXObject("WScript.Shell"), 
     fso = new ActiveXObject("Scripting.FileSystemObject"), 
     tmpdir = fso.GetSpecialFolder(SpecialFolders.TemporaryFolder), 
     tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName()), 
     windir = fso.GetSpecialFolder(SpecialFolders.WindowsFolder), 
     appcmd = fso.BuildPath(windir,"system32\\inetsrv\\appcmd.exe") + " " + command, 
     rc; 

    deleteOutput = deleteOutput || false; 

    LogMessage("shell.Run("+appcmd+")"); 

    // use cmd.exe to redirect the output 
    rc = shell.Run("%comspec% /c " + appcmd + "> " + tmpFileName, WindowStyle.Hidden, true); 
    LogMessage("shell.Run rc = " + rc); 

    if (deleteOutput) { 
     fso.DeleteFile(tmpFileName); 
    } 
    return { 
     rc : rc, 
     outputfile : (deleteOutput) ? null : tmpFileName 
    }; 
} 



// GetWebSites_Appcmd() 
// 
// Gets website info using Appcmd.exe, only on IIS7+ . 
// 
// The return value is an array of JS objects, one per site. 
// 
function GetWebSites_Appcmd() { 
    var r, fso, textStream, sites, oneLine, record, 
     ParseOneLine = function(oneLine) { 
      // split the string: capture quoted strings, or a string surrounded 
      // by parens, or lastly, tokens separated by spaces, 
      var tokens = oneLine.match(/"[^"]+"|\(.+\)|[^ ]+/g), 
       // split the 3rd string: it is a set of properties separated by colons 
       props = tokens[2].slice(1,-1), 
       t2 = props.match(/\w+:.+?(?=,\w+:|$)/g), 
       bindingsString = t2[1], 

       ix1 = bindingsString.indexOf(':'), 
       t3 = bindingsString.substring(ix1+1).split(','), 
       L1 = t3.length, 
       bindings = {}, i, split, obj, p2; 

      for (i=0; i<L1; i++) { 
       split = t3[i].split('/'); 
       obj = {}; 
       if (split[0] == "net.tcp") { 
        p2 = split[1].split(':'); 
        obj.port = p2[0]; 
       } 
       else if (split[0] == "net.pipe") { 
        p2 = split[1].split(':'); 
        obj.other = p2[0]; 
       } 
       else if (split[0] == "http") { 
        p2 = split[1].split(':'); 
        obj.ip = p2[0]; 
        if (p2[1]) { 
         obj.port = p2[1]; 
        } 
        obj.hostname = ""; 
       } 
       else { 
        p2 = split[1].split(':'); 
        obj.hostname = p2[0]; 
        if (p2[1]) { 
         obj.port = p2[1]; 
        } 
       } 
       bindings[split[0]] = obj; 
      } 

      // return the object describing the website 
      return { 
       id   : t2[0].split(':')[1], 
       name  : "W3SVC/" + t2[0].split(':')[1], 
       description : tokens[1].slice(1,-1), 
       bindings : bindings, 
       state  : t2[2].split(':')[1] // started or not 
      }; 
     }; 

    LogMessage("GetWebSites_Appcmd() ENTER"); 

    r = RunAppCmd("list sites"); 
    if (r.rc !== 0) { 
     // 0x80004005 == E_FAIL 
     throw new Exception("ApplicationException", "exec appcmd.exe returned nonzero rc ("+r.rc+")", 0x80004005); 
    } 

    fso = new ActiveXObject("Scripting.FileSystemObject"); 
    textStream = fso.OpenTextFile(r.outputfile, OpenMode.ForReading); 
    sites = []; 

    // Read from the file and parse the results. 
    while (!textStream.AtEndOfStream) { 
     oneLine = textStream.ReadLine(); 
     record = ParseOneLine(oneLine); 
     LogMessage(" site: " + record.name); 
     sites.push(record); 
    } 
    textStream.Close(); 
    fso.DeleteFile(r.outputfile); 

    LogMessage("GetWebSites_Appcmd() EXIT"); 

    return sites; 
}