Прогрессивное удаление суффикса etag (номер изменения) из метабазы ​​IIS6 - PullRequest
3 голосов
/ 28 мая 2009

IIS 6.0 генерирует значения eTag в формате «hash: changenumber». Номер изменения увеличивается каждый раз при сбросе IIS, поэтому ваш eTag действителен только в течение всего срока службы IIS. Перезагрузка, число увеличивается, хэш: номер изменения! = Хэш: номер изменения + 1.

Исправление для этого заключается в жестком коде измененного номера , что возможно с помощью Metabase Explorer, утилиты .NET для редактирования метабазы ​​или путем редактирования файла XML, когда службы IIS остановлены .

Я хочу сделать это программно, с работающим сервером, как я могу установить все остальные свойства метабазы ​​с помощью ADSI или WMI. Для этого это не представляется возможным, так как свойство (которое только внутренне упоминается как MD_ETAG_CHANGENUMBER), похоже, не имеет соответствующего имени свойства.

Вот пример проблемы в VBScript:

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

Выход:

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

Я хочу иметь возможность установить это значение в C #. Если не считать остановки IIS, установки значения в XML и повторного его запуска, существует ли способ установки этого значения программно?

Моя лучшая мысль - (ab) использовать IISMbLib.dll, которая поставляется с Metabase Explorer, поэтому, если у кого-то есть опыт использования этого, я хотел бы услышать это.

Ссылки:

Ответы [ 2 ]

2 голосов
/ 20 апреля 2012

crb, спасибо за отличное решение, мне не удалось найти альтернативу (хотя ранее я добавлял свои собственные настраиваемые свойства метабазы ​​в схему IIS 6 через некоторые хитрые сценарии ADSI, которые используются пользовательским ISAPI)

Вот версия вашего решения для PowerShell. Предполагается, что сборка MB Explorer скопирована в него локально.

$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)
1 голос
/ 28 мая 2009

Моя лучшая мысль была довольно хорошей. Вот решение, которое зависит от IISMbLib.dll из обозревателя метабазы ​​в комплекте ресурсов 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);
        }
...