2009-05-28 9 views
3

IIS 6.0は、 "hash:changenumber"の形式でeTag値を生成します。変更番号はIISがリセットされるたびに上がるため、eTagはIISプロセスの有効期間中のみ有効です。再起動、数値の上昇、ハッシュ:changenumber!=ハッシュ:changenumber + 1。メタベースからetagサフィックス(変更番号)をプログラムで削除するIIS6

The fix for this is to hard-code the changenumberメタベースを編集するためのMetabase Explorer、.NETユーティリティ、またはIISサービスが停止したときにXMLファイルを編集することで可能です。

サーバーを実行しながら、これをプログラムで実行する必要があります。他のすべてのメタベースプロパティを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)Metabase Explorerに付属のIISMbLib.dllを使用しているので、誰かがこれを使用している経験があれば、それを聞いてみたいです。

参考文献:

答えて

1

私の最高の考えはかなり良かったです。ここでは、IIS 6.0リソースキットのメタベースエクスプローラからIISMbLib.dllに依存するソリューションがあります。私は以前にカスタムで使用されるいくつかのトリッキーなADSIスクリプトを介して、IIS 6スキーマへの独自のカスタムメタベースプロパティを追加したものの

 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は、優れたソリューションのためのおかげで、私は(代替を見つけることができませんでした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) 
関連する問題