la suppression par programmation suffixe ETAG (numéro de changement) à partir de la métabase IIS 6

StackOverflow https://stackoverflow.com/questions/922472

Question

IIS 6.0 génère des valeurs eTag dans le format de "hachage: changenumber". Le changenumber monte à chaque fois que IIS remet à zéro, de sorte que votre eTag est uniquement valable pour la durée de vie de votre processus IIS. Redémarrage, le nombre monte, hachage: changenumber = hachage. Changenumber + 1

Le correctif pour cela est de coder en dur changenumber, ce qui est possible à l'aide l'Metabase Explorer, un utilitaire .NET pour éditer le métabase, ou en éditant le fichier XML lorsque les services IIS sont arrêtés.

Je veux faire ce programme, avec le fonctionnement du serveur, comme je peux définir toutes les autres propriétés de la métabase avec soit ADSI ou WMI. Pour celui-ci, il ne semble pas être possible, comme la propriété (qui est seulement à l'interne appelée MD_ETAG_CHANGENUMBER) ne semble pas avoir un 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 #. À court d'arrêter IIS, réglage de la valeur dans le fichier XML, et à partir de nouveau, est-il une méthode de définition de cette valeur programatically?

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

Références:

Était-ce utile?

La solution 2

Ma meilleure pensée était assez bonne. Voici une solution qui dépend de IISMbLib.dll du Metabase Explorer dans IIS 6.0 Resource Kit.

        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);
        }

Autres conseils

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 un ISAPI personnalisé)

Voici une version powershell de votre solution. Il suppose MB assemblage copié localement Explorateur lui.

$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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top