2009-05-28 21 views
3

IIS 6.0 génère des valeurs eTag au format "hash: changenumber". Le changenumber monte à chaque réinitialisation des services Internet (IIS), votre eTag n'est donc valide que pour la durée de vie de votre processus IIS. Redémarrer, le nombre augmente, hash: changenumber! = Hash: changenumber + 1. Ce qui est possible en utilisant Metabase Explorer, un utilitaire .NET pour éditer la métabase ou en éditant le fichier XML lorsque les services IIS sont arrêtés.Suppression par programme du suffixe etag (changement de numéro) de la métabase IIS6

Je veux faire cela par programme, avec le serveur en cours d'exécution, comme je peux définir toutes les autres propriétés de la métabase avec ADSI ou WMI. Pour celui-ci, cela ne semble pas possible, car la propriété (qui n'est appelée en interne que MD_ETAG_CHANGENUMBER) ne semble pas avoir de nom de propriété correspondant.

Voici un exemple du problème dans VBScript:

set obj=GetObject("IIS://localhost/W3svc") 
WScript.Echo "Log type: " & obj.LogType 
WScript.Echo "Change number: " & obj.MD_ETAG_CHANGENUMBER 

La sortie:

Log type: 1 
etag.vbs(3, 1) Microsoft VBScript runtime error: Object doesn't support this property or method: 'obj.MD_ETAG_CHANGENUMBER' 

Je veux être en mesure de mettre cette valeur en C#. Si vous n'avez pas arrêté IIS, en définissant la valeur dans le XML et en la redémarrant, existe-t-il une méthode pour définir cette valeur par programme?

Ma meilleure pensée est (ab) en utilisant le IISMbLib.dll fourni avec Metabase Explorer, donc si quelqu'un a l'expérience de l'utiliser, j'aimerais l'entendre.

Références:

Répondre

1

Ma meilleure pensée était assez bon. Voici une solution qui dépend de IISMbLib.dll de l'explorateur de métabase dans le Kit de ressources IIS 6.0.

 Metabase metabase = new Metabase(); 
     metabase.OpenLocalMachine(); 

     IKey key = metabase.GetKeyFromPath("/LM/W3SVC/"); 
     if (key.ContainsRecord(2039) == IISConfig.ValueExistOptions.Explicit) { 
      Record r = key.GetRecord(2039); 
      r.Data = Convert.ToUInt32(0); 
      key.SetRecord(r); 
     } else { 
      Record r = new Record(); 
      r.Data = Convert.ToUInt32(0); 
      r.DataType = Record.DataTypes.DWORD; 
      r.Identifier = 2039; 
      r.ChangeAttribute(Record.AttributeList.Inherit, true); 
      key.SetRecord(r); 
     } 
2

CRB, merci pour la grande solution, je ne pouvais pas trouver une alternative (bien que je l'ai déjà ajouté mes propres propriétés de métabase personnalisées au schéma IIS 6 par des scripts difficiles ADSI, qui sont utilisés par une coutume ISAPI)

Voici une version PowerShell de votre solution. Il suppose que l'assembly MB Explorer a été copié localement.

$myPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path) 

Import-Module "$myPath\IISMbLib.dll" 

$etagValue = 12345 
$metabase = New-Object IISConfig.Metabase 
$metabase.OpenLocalMachine() 

$key = $metabase.GetKeyFromPath("/LM/W3SVC") 

if ($key.ContainsRecord(2039) -eq [IISConfig.ValueExistOptions]::Explicit) 
{ 
    $record = $key.GetRecord(2039) 
    Write-Host "Existing ETag value found:", $record.Data.ToString() 
} 
else 
{ 
    Write-Host "Creating new value..." 
    $record = New-Object IISConfig.Record 
    $record.DataType = [IISConfig.Record+DataTypes]::DWORD 
    $record.Identifier = 2039 
    $record.ChangeAttribute([IISConfig.Record+AttributeList]::Inherit, $true) 
} 
$record.Data = [System.Convert]::ToUInt32($etagValue) 
Write-Host "New ETag value:", $record.Data.ToString() 
$key.SetRecord($record)