إزالة برمجيا لاحقة ETAG (رقم التغيير) من قاعدة تعريف IIS6

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

سؤال

IIS 6.0 يولد قيم ETAG بتنسيق "Hash: ChangeNumber". يرتفع التغيير في كل مرة يعيد فيها IIS، لذلك فإن eTag صالحة فقط لمدى عمر عملية IIS الخاصة بك. إعادة التشغيل، يرتفع عدد، التجزئة: ChangeNumber! = Hash: ChangeNumber + 1.

الإصلاح لهذا هو الشديد رمز ChangEnumber, ، ما هو ممكن باستخدام Explorer Metabase، أداة مساعدة .NET لتحرير قاعدة التعريف، أو عن طريق تحرير ملف XML عند إيقاف خدمات IIS.

أريد أن أفعل هذا برمجيا، مع تشغيل الخادم، كما يمكنني تعيين جميع خصائص قاعدة التعريف الأخرى مع إما ADSI أو WMI. لهذا الغرض، لا يبدو أنه ممكن، حيث لا يبدو أن العقار (الذي يشار إليه داخليا فقط باسم MD_ETAG_CHANGEN TRUE) لاسم خاصية مطابقة.

إليك مثال على المشكلة في 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 التي تأتي مع مستكشف التعريف، لذلك إذا كان أي شخص لديه خبرة في استخدام هذا، فأنا أحب أن أسمعها.

مراجع:

هل كانت مفيدة؟

المحلول 2

أفضل فكرتي كانت جيدة جدا. فيما يلي حلا، مما يعتمد على iismblib.dll من Explorer Metabase في مجموعة موارد 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);
        }

نصائح أخرى

CRB، شكرا للحل العظيم، لم أتمكن من العثور على بديل (على الرغم من أنني قمت مسبقا بإضافة خصائص قاعدة تعريف مخصصة الخاصة بي إلى مخطط IIS 6 من خلال بعض البرمجة النصية ADSI صعبة، والتي يتم استخدامها بواسطة ISAPI مخصص)

فيما يلي إصدار PowerShell من الحل الخاص بك. يفترض أن جمعية مستكشف MB نسخ محليا إليها.

$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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top