Programaticamente remoção sufixo etag (número de modificação) a partir da metabase IIS 6

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

Pergunta

O IIS 6.0 gera valores eTag no formato de "haxixe: ChangeNumber". O ChangeNumber sobe cada vez que o IIS redefine, assim que sua eTag é válido apenas para a vida do seu IIS processo. Restart, o número sobe, de hash: ChangeNumber = Hash:. ChangeNumber + 1

A correção para isso é para codificar o ChangeNumber, que é possível utilizar o metabase Explorer, um utilitário NET para editar a metabase, ou editando o arquivo XML quando o IIS serviços são interrompidos.

Eu quero fazer isso por meio de programação, com o servidor em execução, como posso definir todas as outras propriedades da metabase, quer com ADSI ou WMI. Para este não parece ser possível, como a propriedade (que é referido apenas internamente como MD_ETAG_CHANGENUMBER) não parece ter um nome propriedade correspondente.

Aqui está um exemplo do problema em VBScript:

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

A saída:

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

Eu quero ser capaz de definir esse valor em C #. Curto de parar IIS, definindo o valor no XML, e iniciá-lo novamente, existe um método de definir este valor programaticamente?

O meu melhor pensamento é (ab) usando o IISMbLib.dll que vem com Metabase Explorer, por isso, se alguém tem experiência com isso, eu adoraria ouvi-lo.

Referências:

Foi útil?

Solução 2

O meu melhor pensamento foi muito bom. Aqui está uma solução, que depende IISMbLib.dll do Metabase Explorer no 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);
        }

Outras dicas

crb, graças à grande solução, eu era incapaz de encontrar uma alternativa (embora eu tenha adicionado anteriormente minhas próprias propriedades da metabase personalizado para o 6 esquema IIS através de alguns scripts ADSI complicado, que são usados ??por um ISAPI personalizado)

Aqui está uma versão powershell de sua solução. Ele assume MB Explorador de montagem copiados localmente para ele.

$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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top