プログラムによるメタベース IIS6 からの etag サフィックス (変更番号) の削除
質問
IIS 6.0 は、「hash:changenumber」の形式で eTag 値を生成します。IIS がリセットされるたびに変更番号が増加するため、eTag は IIS プロセスの存続期間中のみ有効です。再起動すると数値が上がり、ハッシュ:変更番号 != ハッシュ:変更番号+1。
これを修正するには、変更番号をハードコーディングします。, これは、メタベースを編集するための .NET ユーティリティである Metabase Explorer を使用するか、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 に値を設定して、再度開始する以外に、この値をプログラムで設定する方法はありますか?
私の最善の考えは、Metabase Explorer に付属の IISMbLib.dll を使用することです。そのため、これを使用した経験がある人がいたら、ぜひ教えていただきたいです。
参考文献:
解決 2
私の最高の考えはかなり良かったです。ここではIIS 6.0リソースキットのメタベースエクスプローラーからIISMbLib.dllに依存ソリューションは、です。
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);
}
他のヒント
CRB、優れたソリューションのためのおかげで、私は(私は以前にカスタムISAPIで使用されるいくつかのトリッキーなADSIスクリプトを介して、IIS 6スキーマに独自のカスタムメタベースプロパティを追加したが)代替手段を見つけることができませんでしたP>
ここでは、ソリューションの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)