프로그램 적으로 ETAG 접미사 (변경 번호)를 제거하여 MENABASE IIS6
문제
IIS 6.0은 "HASH : Changenumber"형식으로 ETAG 값을 생성합니다. IIS가 재설정 될 때마다 Changenumber가 증가하므로 ETAG는 IIS 프로세스의 수명에만 유효합니다. 다시 시작, 숫자가 올라가고, 해시 : Changenumber! = Hash : Changenumber+1.
이에 대한 수정은 Changenumber를 하드 코드하는 것입니다, 메타베이션 탐색기, 메타베이스를 편집하기위한 .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을 사용하는 것입니다. 누군가 이것을 사용한 경험이 있다면 듣고 싶습니다.
참조 :
해결책 2
내 최선의 생각은 꽤 좋았습니다. 다음은 IIS 6.0 리소스 키트의 Metabase Explorer의 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, 훌륭한 솔루션에 감사드립니다. 대안을 찾을 수 없었습니다 (이전에 Custom Isapi가 사용하는 까다로운 ADSI 스크립팅을 통해 IIS 6 스키마에 자신의 사용자 정의 대사 속성을 추가했습니다).
다음은 솔루션의 PowerShell 버전입니다. MB Explorer Assembly가 로컬로 복사 한 것으로 가정합니다.
$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)