Frage

IIS 6.0 ETAG Werte im Format erzeugt "hash: Change". Die Change geht jedes Mal IIS setzt, also Ihre ETAG nur gültig für die gesamte Lebensdauer des IIS-Prozess ist. Neu starten, Nummer nach oben geht, Hash: Change = hash:. Change + 1

das Update für dieses ist zu hart Code der Change , was möglich ist, unter Verwendung von die Metabase Explorer, ein .NET-Programm, um die Metabasis für die Bearbeitung oder durch die XML-Datei bearbeiten, wenn die IIS-Dienste beendet werden.

Das möchte ich programmatisch zu tun, mit dem Server läuft, wie ich alle anderen Metabasiseigenschaften entweder mit ADSI oder WMI einstellen. Für diese es scheint nicht möglich zu sein, da das Eigentum (die nur intern als MD_ETAG_CHANGENUMBER bezeichnet wird) scheinen keine passenden Eigenschaftsnamen zu haben.

Hier ist ein Beispiel für das Problem in VBScript:

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

Der Ausgang:

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

Ich möchte in der Lage sein, diesen Wert in C # zu setzen. Short von IIS anzuhalten, um den Wert in der XML-Einstellung und starten wieder, gibt es eine Methode, um diesen Wert zu setzen programmatisch?

Mein bester Gedanke ist (ab) die IISMbLib.dll verwenden, die mit Metabase Explorer kommt, also wenn jemand Erfahrung mit dieser hat, würde ich gerne hören.

Referenzen:

War es hilfreich?

Lösung 2

Mein bester Gedanke war ziemlich gut. Hier ist eine Lösung, die aus dem Metabase Explorer in dem IIS 6.0 Resource Kit auf IISMbLib.dll abhängig ist.

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

Andere Tipps

CRB, danke für die große Lösung, ich war nicht in der Lage, eine Alternative zu finden (obwohl ich vorher meine eigenen benutzerdefinierten Metabasiseigenschaften zum IIS 6-Schema durch einig kniffligen ADSI Scripting hinzugefügt, die von einem benutzerdefinierten ISAPI verwendet werden)

Hier ist eine Powershell-Version Ihrer Lösung. Es wird davon ausgegangen MB Explorer Montage vor Ort kopiert.

$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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top